aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/alpha/Kconfig1
-rw-r--r--arch/alpha/lib/csum_partial_copy.c5
-rw-r--r--arch/alpha/mm/fault.c7
-rw-r--r--arch/alpha/oprofile/common.c22
-rw-r--r--arch/arc/Kconfig1
-rw-r--r--arch/arc/boot/.gitignore1
-rw-r--r--arch/arc/include/asm/cache.h2
-rw-r--r--arch/arc/include/asm/delay.h5
-rw-r--r--arch/arc/include/asm/entry.h24
-rw-r--r--arch/arc/include/asm/io.h4
-rw-r--r--arch/arc/include/asm/irqflags.h7
-rw-r--r--arch/arc/include/asm/mmu.h11
-rw-r--r--arch/arc/include/asm/mmu_context.h161
-rw-r--r--arch/arc/include/asm/pgtable.h61
-rw-r--r--arch/arc/include/asm/ptrace.h36
-rw-r--r--arch/arc/include/asm/sections.h1
-rw-r--r--arch/arc/include/asm/spinlock_types.h6
-rw-r--r--arch/arc/kernel/.gitignore1
-rw-r--r--arch/arc/kernel/devtree.c6
-rw-r--r--arch/arc/kernel/entry.S66
-rw-r--r--arch/arc/kernel/head.S5
-rw-r--r--arch/arc/kernel/irq.c1
-rw-r--r--arch/arc/kernel/setup.c5
-rw-r--r--arch/arc/kernel/unaligned.c26
-rw-r--r--arch/arc/mm/cache_arc700.c8
-rw-r--r--arch/arc/mm/fault.c11
-rw-r--r--arch/arc/mm/init.c5
-rw-r--r--arch/arc/mm/tlb.c174
-rw-r--r--arch/arc/mm/tlbex.S205
-rw-r--r--arch/arm/Kconfig129
-rw-r--r--arch/arm/Kconfig.debug583
-rw-r--r--arch/arm/Makefile1
-rw-r--r--arch/arm/boot/compressed/head-shmobile.S43
-rw-r--r--arch/arm/boot/dts/Makefile44
-rw-r--r--arch/arm/boot/dts/am335x-bone-common.dtsi262
-rw-r--r--arch/arm/boot/dts/am335x-bone.dts227
-rw-r--r--arch/arm/boot/dts/am335x-boneblack.dts17
-rw-r--r--arch/arm/boot/dts/am335x-evm.dts29
-rw-r--r--arch/arm/boot/dts/am335x-evmsk.dts19
-rw-r--r--arch/arm/boot/dts/am33xx.dtsi143
-rw-r--r--arch/arm/boot/dts/armada-370-db.dts5
-rw-r--r--arch/arm/boot/dts/armada-370-mirabox.dts37
-rw-r--r--arch/arm/boot/dts/armada-370-netgear-rn102.dts179
-rw-r--r--arch/arm/boot/dts/armada-370-rd.dts37
-rw-r--r--arch/arm/boot/dts/armada-370-xp.dtsi113
-rw-r--r--arch/arm/boot/dts/armada-370.dtsi123
-rw-r--r--arch/arm/boot/dts/armada-xp-axpwifiap.dts164
-rw-r--r--arch/arm/boot/dts/armada-xp-db.dts131
-rw-r--r--arch/arm/boot/dts/armada-xp-gp.dts107
-rw-r--r--arch/arm/boot/dts/armada-xp-mv78230.dtsi228
-rw-r--r--arch/arm/boot/dts/armada-xp-mv78260.dtsi269
-rw-r--r--arch/arm/boot/dts/armada-xp-mv78460.dtsi417
-rw-r--r--arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts88
-rw-r--r--arch/arm/boot/dts/armada-xp.dtsi11
-rw-r--r--arch/arm/boot/dts/at91rm9200.dtsi1
-rw-r--r--arch/arm/boot/dts/at91rm9200_pqfp.dtsi17
-rw-r--r--arch/arm/boot/dts/at91sam9260.dtsi1
-rw-r--r--arch/arm/boot/dts/at91sam9n12.dtsi20
-rw-r--r--arch/arm/boot/dts/at91sam9n12ek.dts18
-rw-r--r--arch/arm/boot/dts/at91sam9x5.dtsi3
-rw-r--r--arch/arm/boot/dts/at91sam9x5ek.dtsi24
-rw-r--r--arch/arm/boot/dts/atlas6.dtsi6
-rw-r--r--arch/arm/boot/dts/bcm11351-brt.dts8
-rw-r--r--arch/arm/boot/dts/bcm11351.dtsi33
-rw-r--r--arch/arm/boot/dts/bcm28155-ap.dts45
-rw-r--r--arch/arm/boot/dts/ccu8540.dts41
-rw-r--r--arch/arm/boot/dts/da850-evm.dts11
-rw-r--r--arch/arm/boot/dts/da850.dtsi46
-rw-r--r--arch/arm/boot/dts/dove-cubox.dts37
-rw-r--r--arch/arm/boot/dts/dove-d2plug.dts69
-rw-r--r--arch/arm/boot/dts/dove.dtsi285
-rw-r--r--arch/arm/boot/dts/emev2-kzm9d-reference.dts57
-rw-r--r--arch/arm/boot/dts/emev2-kzm9d.dts2
-rw-r--r--arch/arm/boot/dts/emev2.dtsi65
-rw-r--r--arch/arm/boot/dts/exynos4.dtsi124
-rw-r--r--arch/arm/boot/dts/exynos4210-pinctrl.dtsi23
-rw-r--r--arch/arm/boot/dts/exynos4210-trats.dts100
-rw-r--r--arch/arm/boot/dts/exynos4210.dtsi32
-rw-r--r--arch/arm/boot/dts/exynos4412-origen.dts5
-rw-r--r--arch/arm/boot/dts/exynos4412-trats2.dts579
-rw-r--r--arch/arm/boot/dts/exynos4x12-pinctrl.dtsi61
-rw-r--r--arch/arm/boot/dts/exynos4x12.dtsi105
-rw-r--r--arch/arm/boot/dts/exynos5.dtsi21
-rw-r--r--arch/arm/boot/dts/exynos5250-arndale.dts105
-rw-r--r--arch/arm/boot/dts/exynos5250-smdk5250.dts32
-rw-r--r--arch/arm/boot/dts/exynos5250-snow.dts4
-rw-r--r--arch/arm/boot/dts/exynos5250.dtsi75
-rw-r--r--arch/arm/boot/dts/exynos5420-pinctrl.dtsi7
-rw-r--r--arch/arm/boot/dts/exynos5420-smdk5420.dts31
-rw-r--r--arch/arm/boot/dts/exynos5420.dtsi94
-rw-r--r--arch/arm/boot/dts/exynos5440.dtsi31
-rw-r--r--arch/arm/boot/dts/imx23-evk.dts15
-rw-r--r--arch/arm/boot/dts/imx23-olinuxino.dts4
-rw-r--r--arch/arm/boot/dts/imx23.dtsi17
-rw-r--r--arch/arm/boot/dts/imx25.dtsi35
-rw-r--r--arch/arm/boot/dts/imx27-apf27dev.dts5
-rw-r--r--arch/arm/boot/dts/imx27-phytec-phycard-s-rdk.dts93
-rw-r--r--arch/arm/boot/dts/imx27-phytec-phycard-s-som.dts44
-rw-r--r--arch/arm/boot/dts/imx27-phytec-phycore-rdk.dts13
-rw-r--r--arch/arm/boot/dts/imx27-phytec-phycore-som.dts125
-rw-r--r--arch/arm/boot/dts/imx27.dtsi126
-rw-r--r--arch/arm/boot/dts/imx28-cfa10036.dts7
-rw-r--r--arch/arm/boot/dts/imx28-cfa10037.dts19
-rw-r--r--arch/arm/boot/dts/imx28-cfa10049.dts73
-rw-r--r--arch/arm/boot/dts/imx28-cfa10055.dts38
-rw-r--r--arch/arm/boot/dts/imx28-cfa10056.dts119
-rw-r--r--arch/arm/boot/dts/imx28-cfa10057.dts23
-rw-r--r--arch/arm/boot/dts/imx28-cfa10058.dts141
-rw-r--r--arch/arm/boot/dts/imx28-evk.dts1
-rw-r--r--arch/arm/boot/dts/imx28-m28evk.dts13
-rw-r--r--arch/arm/boot/dts/imx28.dtsi143
-rw-r--r--arch/arm/boot/dts/imx31.dtsi17
-rw-r--r--arch/arm/boot/dts/imx51-apf51.dts4
-rw-r--r--arch/arm/boot/dts/imx51-babbage.dts5
-rw-r--r--arch/arm/boot/dts/imx51.dtsi634
-rw-r--r--arch/arm/boot/dts/imx53-qsb.dts18
-rw-r--r--arch/arm/boot/dts/imx53.dtsi56
-rw-r--r--arch/arm/boot/dts/imx6dl-pinfunc.h2138
-rw-r--r--arch/arm/boot/dts/imx6dl-sabreauto.dts22
-rw-r--r--arch/arm/boot/dts/imx6dl-sabresd.dts19
-rw-r--r--arch/arm/boot/dts/imx6dl-wandboard.dts24
-rw-r--r--arch/arm/boot/dts/imx6dl.dtsi254
-rw-r--r--arch/arm/boot/dts/imx6q-arm2.dts14
-rw-r--r--arch/arm/boot/dts/imx6q-phytec-pfla02.dtsi112
-rw-r--r--arch/arm/boot/dts/imx6q-pinfunc.h2050
-rw-r--r--arch/arm/boot/dts/imx6q-sabreauto.dts22
-rw-r--r--arch/arm/boot/dts/imx6q-sabrelite.dts22
-rw-r--r--arch/arm/boot/dts/imx6q-sabresd.dts19
-rw-r--r--arch/arm/boot/dts/imx6q-wandboard.dts26
-rw-r--r--arch/arm/boot/dts/imx6q.dtsi393
-rw-r--r--arch/arm/boot/dts/imx6qdl-sabreauto.dtsi22
-rw-r--r--arch/arm/boot/dts/imx6qdl-sabresd.dtsi92
-rw-r--r--arch/arm/boot/dts/imx6qdl-wandboard.dtsi137
-rw-r--r--arch/arm/boot/dts/imx6qdl.dtsi770
-rw-r--r--arch/arm/boot/dts/imx6sl.dtsi35
-rw-r--r--arch/arm/boot/dts/keystone.dts29
-rw-r--r--arch/arm/boot/dts/kirkwood-6281.dtsi66
-rw-r--r--arch/arm/boot/dts/kirkwood-6282.dtsi102
-rw-r--r--arch/arm/boot/dts/kirkwood-cloudbox.dts20
-rw-r--r--arch/arm/boot/dts/kirkwood-db-88f6281.dts7
-rw-r--r--arch/arm/boot/dts/kirkwood-db-88f6282.dts7
-rw-r--r--arch/arm/boot/dts/kirkwood-db.dtsi22
-rw-r--r--arch/arm/boot/dts/kirkwood-dns320.dts2
-rw-r--r--arch/arm/boot/dts/kirkwood-dns325.dts2
-rw-r--r--arch/arm/boot/dts/kirkwood-dnskw.dtsi20
-rw-r--r--arch/arm/boot/dts/kirkwood-dockstar.dts21
-rw-r--r--arch/arm/boot/dts/kirkwood-dreamplug.dts32
-rw-r--r--arch/arm/boot/dts/kirkwood-goflexnet.dts20
-rw-r--r--arch/arm/boot/dts/kirkwood-guruplug-server-plus.dts34
-rw-r--r--arch/arm/boot/dts/kirkwood-ib62x0.dts20
-rw-r--r--arch/arm/boot/dts/kirkwood-iconnect.dts39
-rw-r--r--arch/arm/boot/dts/kirkwood-iomega_ix2_200.dts28
-rw-r--r--arch/arm/boot/dts/kirkwood-is2.dts4
-rw-r--r--arch/arm/boot/dts/kirkwood-km_kirkwood.dts20
-rw-r--r--arch/arm/boot/dts/kirkwood-lschlv2.dts2
-rw-r--r--arch/arm/boot/dts/kirkwood-lsxhl.dts2
-rw-r--r--arch/arm/boot/dts/kirkwood-lsxl.dtsi32
-rw-r--r--arch/arm/boot/dts/kirkwood-mplcec4.dts50
-rw-r--r--arch/arm/boot/dts/kirkwood-mv88f6281gtw-ge.dts125
-rw-r--r--arch/arm/boot/dts/kirkwood-netgear_readynas_duo_v2.dts59
-rw-r--r--arch/arm/boot/dts/kirkwood-ns2-common.dtsi20
-rw-r--r--arch/arm/boot/dts/kirkwood-ns2.dts4
-rw-r--r--arch/arm/boot/dts/kirkwood-ns2lite.dts4
-rw-r--r--arch/arm/boot/dts/kirkwood-ns2max.dts4
-rw-r--r--arch/arm/boot/dts/kirkwood-ns2mini.dts4
-rw-r--r--arch/arm/boot/dts/kirkwood-nsa310-common.dtsi107
-rw-r--r--arch/arm/boot/dts/kirkwood-nsa310.dts111
-rw-r--r--arch/arm/boot/dts/kirkwood-nsa310a.dts165
-rw-r--r--arch/arm/boot/dts/kirkwood-openblocks_a6.dts20
-rw-r--r--arch/arm/boot/dts/kirkwood-sheevaplug-common.dtsi20
-rw-r--r--arch/arm/boot/dts/kirkwood-sheevaplug-esata.dts2
-rw-r--r--arch/arm/boot/dts/kirkwood-sheevaplug.dts2
-rw-r--r--arch/arm/boot/dts/kirkwood-topkick.dts20
-rw-r--r--arch/arm/boot/dts/kirkwood-ts219-6281.dts10
-rw-r--r--arch/arm/boot/dts/kirkwood-ts219-6282.dts29
-rw-r--r--arch/arm/boot/dts/kirkwood-ts219.dtsi31
-rw-r--r--arch/arm/boot/dts/kirkwood.dtsi102
-rw-r--r--arch/arm/boot/dts/msm8660-surf.dts2
-rw-r--r--arch/arm/boot/dts/msm8960-cdp.dts2
-rw-r--r--arch/arm/boot/dts/omap3-beagle-xm.dts2
-rw-r--r--arch/arm/boot/dts/omap3-igep.dtsi14
-rw-r--r--arch/arm/boot/dts/omap4-panda-common.dtsi46
-rw-r--r--arch/arm/boot/dts/omap4-sdp.dts39
-rw-r--r--arch/arm/boot/dts/omap5.dtsi9
-rw-r--r--arch/arm/boot/dts/orion5x-lacie-ethernet-disk-mini-v2.dts17
-rw-r--r--arch/arm/boot/dts/orion5x.dtsi34
-rw-r--r--arch/arm/boot/dts/pxa3xx.dtsi11
-rw-r--r--arch/arm/boot/dts/r8a73a4-ape6evm-reference.dts65
-rw-r--r--arch/arm/boot/dts/r8a73a4-ape6evm.dts24
-rw-r--r--arch/arm/boot/dts/r8a73a4.dtsi133
-rw-r--r--arch/arm/boot/dts/r8a7740-armadillo800eva-reference.dts36
-rw-r--r--arch/arm/boot/dts/r8a7740-armadillo800eva.dts2
-rw-r--r--arch/arm/boot/dts/r8a7740.dtsi20
-rw-r--r--arch/arm/boot/dts/r8a7778-bockw-reference.dts32
-rw-r--r--arch/arm/boot/dts/r8a7778-bockw.dts2
-rw-r--r--arch/arm/boot/dts/r8a7778.dtsi66
-rw-r--r--arch/arm/boot/dts/r8a7779-marzen-reference.dts51
-rw-r--r--arch/arm/boot/dts/r8a7779-marzen.dts27
-rw-r--r--arch/arm/boot/dts/r8a7779.dtsi98
-rw-r--r--arch/arm/boot/dts/r8a7790-lager-reference.dts45
-rw-r--r--arch/arm/boot/dts/r8a7790-lager.dts2
-rw-r--r--arch/arm/boot/dts/r8a7790.dtsi132
-rw-r--r--arch/arm/boot/dts/sama5d3.dtsi24
-rw-r--r--arch/arm/boot/dts/sama5d3xcm.dtsi2
-rw-r--r--arch/arm/boot/dts/sama5d3xmb.dtsi8
-rw-r--r--arch/arm/boot/dts/sh7372.dtsi8
-rw-r--r--arch/arm/boot/dts/sh73a0-kzm9g-reference.dts92
-rw-r--r--arch/arm/boot/dts/sh73a0-kzm9g.dts2
-rw-r--r--arch/arm/boot/dts/sh73a0.dtsi14
-rw-r--r--arch/arm/boot/dts/skeleton64.dtsi2
-rw-r--r--arch/arm/boot/dts/socfpga.dtsi8
-rw-r--r--arch/arm/boot/dts/ste-ccu8540-pinctrl.dtsi196
-rw-r--r--arch/arm/boot/dts/ste-ccu8540.dts86
-rw-r--r--arch/arm/boot/dts/ste-ccu9540.dts (renamed from arch/arm/boot/dts/ccu9540.dts)2
-rw-r--r--arch/arm/boot/dts/ste-dbx5x0.dtsi (renamed from arch/arm/boot/dts/dbx5x0.dtsi)30
-rw-r--r--arch/arm/boot/dts/ste-href.dtsi (renamed from arch/arm/boot/dts/href.dtsi)2
-rw-r--r--arch/arm/boot/dts/ste-hrefprev60.dts (renamed from arch/arm/boot/dts/hrefprev60.dts)6
-rw-r--r--arch/arm/boot/dts/ste-hrefv60plus.dts (renamed from arch/arm/boot/dts/hrefv60plus.dts)6
-rw-r--r--arch/arm/boot/dts/ste-nomadik-pinctrl.dtsi95
-rw-r--r--arch/arm/boot/dts/ste-nomadik-stn8815.dtsi42
-rw-r--r--arch/arm/boot/dts/ste-snowball.dts (renamed from arch/arm/boot/dts/snowball.dts)44
-rw-r--r--arch/arm/boot/dts/ste-stuib.dtsi (renamed from arch/arm/boot/dts/stuib.dtsi)0
-rw-r--r--arch/arm/boot/dts/sun4i-a10-a1000.dts101
-rw-r--r--arch/arm/boot/dts/sun4i-a10-cubieboard.dts6
-rw-r--r--arch/arm/boot/dts/sun4i-a10-hackberry.dts2
-rw-r--r--arch/arm/boot/dts/sun4i-a10-mini-xplus.dts2
-rw-r--r--arch/arm/boot/dts/sun4i-a10.dtsi3
-rw-r--r--arch/arm/boot/dts/sun5i-a10s-olinuxino-micro.dts27
-rw-r--r--arch/arm/boot/dts/sun5i-a10s.dtsi93
-rw-r--r--arch/arm/boot/dts/sun5i-a13-olinuxino.dts2
-rw-r--r--arch/arm/boot/dts/sun5i-a13.dtsi3
-rw-r--r--arch/arm/boot/dts/sun6i-a31-colombus.dts32
-rw-r--r--arch/arm/boot/dts/sun6i-a31.dtsi299
-rw-r--r--arch/arm/boot/dts/sun7i-a20-cubieboard2.dts68
-rw-r--r--arch/arm/boot/dts/sun7i-a20-olinuxino-micro.dts76
-rw-r--r--arch/arm/boot/dts/sun7i-a20.dtsi338
-rw-r--r--arch/arm/boot/dts/tegra114-dalmore.dts237
-rw-r--r--arch/arm/boot/dts/tegra114-pluto.dts33
-rw-r--r--arch/arm/boot/dts/tegra114.dtsi62
-rw-r--r--arch/arm/boot/dts/tegra20-colibri-512.dtsi2
-rw-r--r--arch/arm/boot/dts/tegra20-harmony.dts22
-rw-r--r--arch/arm/boot/dts/tegra20-paz00.dts2
-rw-r--r--arch/arm/boot/dts/tegra20-seaboard.dts5
-rw-r--r--arch/arm/boot/dts/tegra20-tamonten.dtsi19
-rw-r--r--arch/arm/boot/dts/tegra20-tec.dts8
-rw-r--r--arch/arm/boot/dts/tegra20-trimslice.dts33
-rw-r--r--arch/arm/boot/dts/tegra20-ventana.dts2
-rw-r--r--arch/arm/boot/dts/tegra20-whistler.dts4
-rw-r--r--arch/arm/boot/dts/tegra20.dtsi83
-rw-r--r--arch/arm/boot/dts/tegra30-beaver.dts64
-rw-r--r--arch/arm/boot/dts/tegra30-cardhu.dtsi64
-rw-r--r--arch/arm/boot/dts/tegra30.dtsi156
-rw-r--r--arch/arm/boot/dts/u9540.dts72
-rw-r--r--arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts31
-rw-r--r--arch/arm/boot/dts/vf610-twr.dts7
-rw-r--r--arch/arm/boot/dts/wm8850-w70v2.dts3
-rw-r--r--arch/arm/boot/dts/zynq-7000.dtsi4
-rw-r--r--arch/arm/common/edma.c17
-rw-r--r--arch/arm/common/mcpm_head.S2
-rw-r--r--arch/arm/common/timer-sp.c3
-rw-r--r--arch/arm/common/vlock.S4
-rw-r--r--arch/arm/configs/ag5evm_defconfig83
-rw-r--r--arch/arm/configs/ape6evm_defconfig6
-rw-r--r--arch/arm/configs/at91_dt_defconfig4
-rw-r--r--arch/arm/configs/bcm_defconfig13
-rw-r--r--arch/arm/configs/bockw_defconfig7
-rw-r--r--arch/arm/configs/dove_defconfig4
-rw-r--r--arch/arm/configs/exynos4_defconfig68
-rw-r--r--arch/arm/configs/imx_v4_v5_defconfig19
-rw-r--r--arch/arm/configs/imx_v6_v7_defconfig51
-rw-r--r--arch/arm/configs/keystone_defconfig1
-rw-r--r--arch/arm/configs/kirkwood_defconfig51
-rw-r--r--arch/arm/configs/lager_defconfig (renamed from arch/arm/configs/kota2_defconfig)111
-rw-r--r--arch/arm/configs/marzen_defconfig8
-rw-r--r--arch/arm/configs/multi_v7_defconfig2
-rw-r--r--arch/arm/configs/mvebu_defconfig2
-rw-r--r--arch/arm/configs/mxs_defconfig19
-rw-r--r--arch/arm/configs/omap2plus_defconfig14
-rw-r--r--arch/arm/configs/tegra_defconfig10
-rw-r--r--arch/arm/include/asm/arch_timer.h14
-rw-r--r--arch/arm/include/asm/assembler.h4
-rw-r--r--arch/arm/include/asm/barrier.h32
-rw-r--r--arch/arm/include/asm/cacheflush.h5
-rw-r--r--arch/arm/include/asm/dma-contiguous.h3
-rw-r--r--arch/arm/include/asm/elf.h2
-rw-r--r--arch/arm/include/asm/hardware/debug-8250.S29
-rw-r--r--arch/arm/include/asm/kvm_mmu.h2
-rw-r--r--arch/arm/include/asm/localtimer.h34
-rw-r--r--arch/arm/include/asm/mach/arch.h6
-rw-r--r--arch/arm/include/asm/mach/pci.h4
-rw-r--r--arch/arm/include/asm/memblock.h3
-rw-r--r--arch/arm/include/asm/module.h2
-rw-r--r--arch/arm/include/asm/neon.h36
-rw-r--r--arch/arm/include/asm/outercache.h4
-rw-r--r--arch/arm/include/asm/pgtable.h2
-rw-r--r--arch/arm/include/asm/prom.h4
-rw-r--r--arch/arm/include/asm/spinlock.h2
-rw-r--r--arch/arm/include/asm/switch_to.h10
-rw-r--r--arch/arm/include/asm/thread_info.h11
-rw-r--r--arch/arm/include/asm/tlbflush.h181
-rw-r--r--arch/arm/include/asm/types.h40
-rw-r--r--arch/arm/include/asm/v7m.h12
-rw-r--r--arch/arm/include/asm/xor.h73
-rw-r--r--arch/arm/include/debug/8250.S54
-rw-r--r--arch/arm/include/debug/8250_32.S27
-rw-r--r--arch/arm/include/debug/bcm2835.S22
-rw-r--r--arch/arm/include/debug/cns3xxx.S19
-rw-r--r--arch/arm/include/debug/highbank.S17
-rw-r--r--arch/arm/include/debug/keystone.S43
-rw-r--r--arch/arm/include/debug/msm.S (renamed from arch/arm/mach-msm/include/mach/debug-macro.S)32
-rw-r--r--arch/arm/include/debug/mvebu.S30
-rw-r--r--arch/arm/include/debug/mxs.S27
-rw-r--r--arch/arm/include/debug/nomadik.S20
-rw-r--r--arch/arm/include/debug/nspire.S28
-rw-r--r--arch/arm/include/debug/picoxcell.S19
-rw-r--r--arch/arm/include/debug/pl01x.S (renamed from arch/arm/include/asm/hardware/debug-pl01x.S)9
-rw-r--r--arch/arm/include/debug/pxa.S33
-rw-r--r--arch/arm/include/debug/rockchip.S42
-rw-r--r--arch/arm/include/debug/socfpga.S21
-rw-r--r--arch/arm/include/debug/sunxi.S27
-rw-r--r--arch/arm/include/debug/tegra.S29
-rw-r--r--arch/arm/include/debug/u300.S18
-rw-r--r--arch/arm/include/debug/ux500.S2
-rw-r--r--arch/arm/include/debug/vexpress.S48
-rw-r--r--arch/arm/kernel/Makefile2
-rw-r--r--arch/arm/kernel/atags.h5
-rw-r--r--arch/arm/kernel/atags_parse.c6
-rw-r--r--arch/arm/kernel/bios32.c21
-rw-r--r--arch/arm/kernel/devtree.c11
-rw-r--r--arch/arm/kernel/entry-common.S4
-rw-r--r--arch/arm/kernel/module.c8
-rw-r--r--arch/arm/kernel/perf_event_cpu.c3
-rw-r--r--arch/arm/kernel/setup.c21
-rw-r--r--arch/arm/kernel/smp.c100
-rw-r--r--arch/arm/kernel/smp_tlb.c10
-rw-r--r--arch/arm/kernel/smp_twd.c64
-rw-r--r--arch/arm/kernel/topology.c61
-rw-r--r--arch/arm/kernel/traps.c66
-rw-r--r--arch/arm/kernel/v7m.c19
-rw-r--r--arch/arm/kvm/arm.c4
-rw-r--r--arch/arm/kvm/init.S2
-rw-r--r--arch/arm/kvm/interrupts.S12
-rw-r--r--arch/arm/kvm/mmu.c1
-rw-r--r--arch/arm/kvm/reset.c2
-rw-r--r--arch/arm/kvm/trace.h7
-rw-r--r--arch/arm/lib/Makefile6
-rw-r--r--arch/arm/lib/xor-neon.c46
-rw-r--r--arch/arm/mach-at91/board-dt-sama5.c17
-rw-r--r--arch/arm/mach-at91/board-snapper9260.c2
-rw-r--r--arch/arm/mach-at91/include/mach/at91_adc.h16
-rw-r--r--arch/arm/mach-at91/include/mach/hardware.h1
-rw-r--r--arch/arm/mach-at91/include/mach/sama5d3.h8
-rw-r--r--arch/arm/mach-at91/include/mach/uncompress.h13
-rw-r--r--arch/arm/mach-bcm/Kconfig1
-rw-r--r--arch/arm/mach-bcm/Makefile4
-rw-r--r--arch/arm/mach-bcm/bcm_kona_smc.c12
-rw-r--r--arch/arm/mach-bcm/bcm_kona_smc.h2
-rw-r--r--arch/arm/mach-bcm/board_bcm281xx.c (renamed from arch/arm/mach-bcm/board_bcm.c)30
-rw-r--r--arch/arm/mach-bcm/kona.c65
-rw-r--r--arch/arm/mach-bcm/kona.h17
-rw-r--r--arch/arm/mach-clps711x/Kconfig3
-rw-r--r--arch/arm/mach-clps711x/Makefile1
-rw-r--r--arch/arm/mach-clps711x/board-autcpu12.c6
-rw-r--r--arch/arm/mach-clps711x/board-edb7211.c17
-rw-r--r--arch/arm/mach-clps711x/board-fortunet.c85
-rw-r--r--arch/arm/mach-clps711x/devices.c2
-rw-r--r--arch/arm/mach-davinci/board-da830-evm.c6
-rw-r--r--arch/arm/mach-davinci/board-da850-evm.c14
-rw-r--r--arch/arm/mach-davinci/board-dm355-evm.c6
-rw-r--r--arch/arm/mach-davinci/board-dm355-leopard.c6
-rw-r--r--arch/arm/mach-davinci/board-dm365-evm.c6
-rw-r--r--arch/arm/mach-davinci/board-dm644x-evm.c6
-rw-r--r--arch/arm/mach-davinci/board-dm646x-evm.c6
-rw-r--r--arch/arm/mach-davinci/board-mityomapl138.c6
-rw-r--r--arch/arm/mach-davinci/board-neuros-osd2.c6
-rw-r--r--arch/arm/mach-davinci/board-omapl138-hawk.c6
-rw-r--r--arch/arm/mach-davinci/board-sffsdr.c6
-rw-r--r--arch/arm/mach-davinci/cpuidle.c2
-rw-r--r--arch/arm/mach-davinci/da830.c8
-rw-r--r--arch/arm/mach-davinci/da850.c8
-rw-r--r--arch/arm/mach-davinci/da8xx-dt.c14
-rw-r--r--arch/arm/mach-davinci/davinci.h5
-rw-r--r--arch/arm/mach-davinci/devices-da8xx.c59
-rw-r--r--arch/arm/mach-davinci/devices-tnetv107x.c39
-rw-r--r--arch/arm/mach-davinci/dm355.c51
-rw-r--r--arch/arm/mach-davinci/dm365.c40
-rw-r--r--arch/arm/mach-davinci/dm644x.c54
-rw-r--r--arch/arm/mach-davinci/dm646x.c54
-rw-r--r--arch/arm/mach-davinci/include/mach/common.h1
-rw-r--r--arch/arm/mach-davinci/include/mach/da8xx.h2
-rw-r--r--arch/arm/mach-davinci/include/mach/debug-macro.S65
-rw-r--r--arch/arm/mach-davinci/include/mach/serial.h10
-rw-r--r--arch/arm/mach-davinci/include/mach/tnetv107x.h3
-rw-r--r--arch/arm/mach-davinci/serial.c54
-rw-r--r--arch/arm/mach-davinci/tnetv107x.c8
-rw-r--r--arch/arm/mach-dove/Kconfig2
-rw-r--r--arch/arm/mach-dove/Makefile4
-rw-r--r--arch/arm/mach-dove/board-dt.c30
-rw-r--r--arch/arm/mach-dove/common.c72
-rw-r--r--arch/arm/mach-dove/include/mach/debug-macro.S19
-rw-r--r--arch/arm/mach-dove/mpp.c2
-rw-r--r--arch/arm/mach-ebsa110/include/mach/debug-macro.S22
-rw-r--r--arch/arm/mach-ep93xx/Kconfig14
-rw-r--r--arch/arm/mach-ep93xx/core.c2
-rw-r--r--arch/arm/mach-ep93xx/include/mach/debug-macro.S21
-rw-r--r--arch/arm/mach-ep93xx/include/mach/uncompress.h14
-rw-r--r--arch/arm/mach-ep93xx/vision_ep9307.c59
-rw-r--r--arch/arm/mach-exynos/Kconfig7
-rw-r--r--arch/arm/mach-exynos/common.h43
-rw-r--r--arch/arm/mach-exynos/cpuidle.c3
-rw-r--r--arch/arm/mach-footbridge/include/mach/debug-macro.S15
-rw-r--r--arch/arm/mach-gemini/include/mach/debug-macro.S21
-rw-r--r--arch/arm/mach-highbank/Kconfig8
-rw-r--r--arch/arm/mach-highbank/highbank.c20
-rw-r--r--arch/arm/mach-imx/Kconfig5
-rw-r--r--arch/arm/mach-imx/Makefile3
-rw-r--r--arch/arm/mach-imx/anatop.c4
-rw-r--r--arch/arm/mach-imx/clk-fixup-div.c129
-rw-r--r--arch/arm/mach-imx/clk-fixup-mux.c108
-rw-r--r--arch/arm/mach-imx/clk-imx27.c2
-rw-r--r--arch/arm/mach-imx/clk-imx51-imx53.c7
-rw-r--r--arch/arm/mach-imx/clk-imx6q.c57
-rw-r--r--arch/arm/mach-imx/clk-imx6sl.c20
-rw-r--r--arch/arm/mach-imx/clk-pllv3.c15
-rw-r--r--arch/arm/mach-imx/clk.c26
-rw-r--r--arch/arm/mach-imx/clk.h15
-rw-r--r--arch/arm/mach-imx/common.h13
-rw-r--r--arch/arm/mach-imx/mach-imx27_visstrim_m10.c2
-rw-r--r--arch/arm/mach-imx/mach-imx6q.c183
-rw-r--r--arch/arm/mach-imx/mach-imx6sl.c3
-rw-r--r--arch/arm/mach-imx/mach-mxt_td60.c2
-rw-r--r--arch/arm/mach-imx/mm-imx25.c17
-rw-r--r--arch/arm/mach-imx/mm-imx5.c18
-rw-r--r--arch/arm/mach-imx/pm-imx5.c7
-rw-r--r--arch/arm/mach-imx/system.c44
-rw-r--r--arch/arm/mach-integrator/include/mach/debug-macro.S20
-rw-r--r--arch/arm/mach-iop13xx/include/mach/debug-macro.S24
-rw-r--r--arch/arm/mach-iop32x/include/mach/debug-macro.S21
-rw-r--r--arch/arm/mach-iop33x/include/mach/debug-macro.S22
-rw-r--r--arch/arm/mach-ixp4xx/include/mach/debug-macro.S26
-rw-r--r--arch/arm/mach-keystone/Kconfig1
-rw-r--r--arch/arm/mach-keystone/platsmp.c1
-rw-r--r--arch/arm/mach-keystone/smc.S5
-rw-r--r--arch/arm/mach-kirkwood/Kconfig243
-rw-r--r--arch/arm/mach-kirkwood/Makefile36
-rw-r--r--arch/arm/mach-kirkwood/board-db88f628x-bp.c24
-rw-r--r--arch/arm/mach-kirkwood/board-dnskw.c43
-rw-r--r--arch/arm/mach-kirkwood/board-dockstar.c32
-rw-r--r--arch/arm/mach-kirkwood/board-dreamplug.c35
-rw-r--r--arch/arm/mach-kirkwood/board-dt.c118
-rw-r--r--arch/arm/mach-kirkwood/board-goflexnet.c34
-rw-r--r--arch/arm/mach-kirkwood/board-guruplug.c33
-rw-r--r--arch/arm/mach-kirkwood/board-ib62x0.c29
-rw-r--r--arch/arm/mach-kirkwood/board-iconnect.c24
-rw-r--r--arch/arm/mach-kirkwood/board-iomega_ix2_200.c34
-rw-r--r--arch/arm/mach-kirkwood/board-km_kirkwood.c44
-rw-r--r--arch/arm/mach-kirkwood/board-lsxl.c36
-rw-r--r--arch/arm/mach-kirkwood/board-mplcec4.c35
-rw-r--r--arch/arm/mach-kirkwood/board-mv88f6281gtw_ge.c50
-rw-r--r--arch/arm/mach-kirkwood/board-ns2.c35
-rw-r--r--arch/arm/mach-kirkwood/board-openblocks_a6.c26
-rw-r--r--arch/arm/mach-kirkwood/board-readynas.c27
-rw-r--r--arch/arm/mach-kirkwood/board-sheevaplug.c27
-rw-r--r--arch/arm/mach-kirkwood/board-ts219.c40
-rw-r--r--arch/arm/mach-kirkwood/board-usi_topkick.c29
-rw-r--r--arch/arm/mach-kirkwood/common.c50
-rw-r--r--arch/arm/mach-kirkwood/common.h115
-rw-r--r--arch/arm/mach-kirkwood/dockstar-setup.c111
-rw-r--r--arch/arm/mach-kirkwood/guruplug-setup.c133
-rw-r--r--arch/arm/mach-kirkwood/include/mach/debug-macro.S19
-rw-r--r--arch/arm/mach-kirkwood/mv88f6281gtw_ge-setup.c172
-rw-r--r--arch/arm/mach-kirkwood/netspace_v2-setup.c293
-rw-r--r--arch/arm/mach-kirkwood/openrd-setup.c3
-rw-r--r--arch/arm/mach-kirkwood/pcie.c40
-rw-r--r--arch/arm/mach-kirkwood/rd88f6281-setup.c4
-rw-r--r--arch/arm/mach-kirkwood/sheevaplug-setup.c161
-rw-r--r--arch/arm/mach-ks8695/board-acs5k.c2
-rw-r--r--arch/arm/mach-lpc32xx/include/mach/debug-macro.S29
-rw-r--r--arch/arm/mach-mmp/Makefile2
-rw-r--r--arch/arm/mach-mmp/common.h1
-rw-r--r--arch/arm/mach-mmp/include/mach/entry-macro.S26
-rw-r--r--arch/arm/mach-mmp/include/mach/pxa168.h1
-rw-r--r--arch/arm/mach-mmp/include/mach/pxa910.h1
-rw-r--r--arch/arm/mach-mmp/irq.c463
-rw-r--r--arch/arm/mach-mmp/mmp-dt.c8
-rw-r--r--arch/arm/mach-mmp/mmp2-dt.c8
-rw-r--r--arch/arm/mach-mmp/mmp2.c6
-rw-r--r--arch/arm/mach-mmp/pxa910.c7
-rw-r--r--arch/arm/mach-mmp/ttc_dkb.c2
-rw-r--r--arch/arm/mach-msm/Makefile9
-rw-r--r--arch/arm/mach-msm/board-dt-8660.c4
-rw-r--r--arch/arm/mach-msm/board-dt-8960.c3
-rw-r--r--arch/arm/mach-msm/board-halibut.c1
-rw-r--r--arch/arm/mach-msm/board-mahimahi.c2
-rw-r--r--arch/arm/mach-msm/board-msm7x30.c1
-rw-r--r--arch/arm/mach-msm/board-qsd8x50.c1
-rw-r--r--arch/arm/mach-msm/board-sapphire.c2
-rw-r--r--arch/arm/mach-msm/board-trout.c1
-rw-r--r--arch/arm/mach-msm/board-trout.h2
-rw-r--r--arch/arm/mach-msm/common.h18
-rw-r--r--arch/arm/mach-msm/devices-iommu.c912
-rw-r--r--arch/arm/mach-msm/devices-msm7x00.c6
-rw-r--r--arch/arm/mach-msm/devices-msm7x30.c4
-rw-r--r--arch/arm/mach-msm/devices-qsd8x50.c8
-rw-r--r--arch/arm/mach-msm/include/mach/board.h38
-rw-r--r--arch/arm/mach-msm/include/mach/iommu.h120
-rw-r--r--arch/arm/mach-msm/include/mach/iommu_hw-8xxx.h1865
-rw-r--r--arch/arm/mach-msm/include/mach/msm_iomap-8960.h46
-rw-r--r--arch/arm/mach-msm/include/mach/msm_iomap-8x60.h53
-rw-r--r--arch/arm/mach-msm/include/mach/msm_iomap.h17
-rw-r--r--arch/arm/mach-msm/include/mach/uncompress.h63
-rw-r--r--arch/arm/mach-msm/io.c67
-rw-r--r--arch/arm/mach-msm/timer.c141
-rw-r--r--arch/arm/mach-mv78xx0/include/mach/debug-macro.S19
-rw-r--r--arch/arm/mach-mv78xx0/pcie.c23
-rw-r--r--arch/arm/mach-mvebu/armada-370-xp.c38
-rw-r--r--arch/arm/mach-mvebu/platsmp.c95
-rw-r--r--arch/arm/mach-mxs/mach-mxs.c62
-rw-r--r--arch/arm/mach-mxs/pm.c1
-rw-r--r--arch/arm/mach-nomadik/Kconfig1
-rw-r--r--arch/arm/mach-omap1/include/mach/soc.h1
-rw-r--r--arch/arm/mach-omap2/Kconfig17
-rw-r--r--arch/arm/mach-omap2/Makefile10
-rw-r--r--arch/arm/mach-omap2/am33xx-restart.c4
-rw-r--r--arch/arm/mach-omap2/board-2430sdp.c57
-rw-r--r--arch/arm/mach-omap2/board-3430sdp.c83
-rw-r--r--arch/arm/mach-omap2/board-am3517crane.c2
-rw-r--r--arch/arm/mach-omap2/board-am3517evm.c115
-rw-r--r--arch/arm/mach-omap2/board-cm-t35.c100
-rw-r--r--arch/arm/mach-omap2/board-devkit8000.c96
-rw-r--r--arch/arm/mach-omap2/board-generic.c19
-rw-r--r--arch/arm/mach-omap2/board-h4.c48
-rw-r--r--arch/arm/mach-omap2/board-igep0020.c36
-rw-r--r--arch/arm/mach-omap2/board-ldp.c68
-rw-r--r--arch/arm/mach-omap2/board-omap3beagle.c60
-rw-r--r--arch/arm/mach-omap2/board-omap3evm.c91
-rw-r--r--arch/arm/mach-omap2/board-omap3pandora.c50
-rw-r--r--arch/arm/mach-omap2/board-omap3stalker.c61
-rw-r--r--arch/arm/mach-omap2/board-overo.c160
-rw-r--r--arch/arm/mach-omap2/board-rx51-peripherals.c12
-rw-r--r--arch/arm/mach-omap2/board-rx51-video.c35
-rw-r--r--arch/arm/mach-omap2/board-zoom-display.c30
-rw-r--r--arch/arm/mach-omap2/cclock33xx_data.c5
-rw-r--r--arch/arm/mach-omap2/cclock44xx_data.c22
-rw-r--r--arch/arm/mach-omap2/clockdomain.h1
-rw-r--r--arch/arm/mach-omap2/clockdomains7xx_data.c740
-rw-r--r--arch/arm/mach-omap2/cm-regbits-24xx.h318
-rw-r--r--arch/arm/mach-omap2/cm-regbits-33xx.h749
-rw-r--r--arch/arm/mach-omap2/cm-regbits-34xx.h632
-rw-r--r--arch/arm/mach-omap2/cm-regbits-44xx.h1558
-rw-r--r--arch/arm/mach-omap2/cm-regbits-54xx.h1633
-rw-r--r--arch/arm/mach-omap2/cm-regbits-7xx.h51
-rw-r--r--arch/arm/mach-omap2/cm1_7xx.h324
-rw-r--r--arch/arm/mach-omap2/cm2_7xx.h513
-rw-r--r--arch/arm/mach-omap2/common.h1
-rw-r--r--arch/arm/mach-omap2/cpuidle44xx.c2
-rw-r--r--arch/arm/mach-omap2/devices.c42
-rw-r--r--arch/arm/mach-omap2/display.c4
-rw-r--r--arch/arm/mach-omap2/dss-common.c244
-rw-r--r--arch/arm/mach-omap2/dss-common.h2
-rw-r--r--arch/arm/mach-omap2/gpmc.c6
-rw-r--r--arch/arm/mach-omap2/i2c.c2
-rw-r--r--arch/arm/mach-omap2/id.c4
-rw-r--r--arch/arm/mach-omap2/io.c25
-rw-r--r--arch/arm/mach-omap2/mux34xx.c2
-rw-r--r--arch/arm/mach-omap2/omap-smp.c2
-rw-r--r--arch/arm/mach-omap2/omap54xx.h4
-rw-r--r--arch/arm/mach-omap2/omap_device.c2
-rw-r--r--arch/arm/mach-omap2/omap_hwmod.c6
-rw-r--r--arch/arm/mach-omap2/omap_hwmod.h1
-rw-r--r--arch/arm/mach-omap2/omap_hwmod_33xx_data.c69
-rw-r--r--arch/arm/mach-omap2/omap_hwmod_54xx_data.c43
-rw-r--r--arch/arm/mach-omap2/omap_hwmod_7xx_data.c2724
-rw-r--r--arch/arm/mach-omap2/powerdomain.h1
-rw-r--r--arch/arm/mach-omap2/powerdomains3xxx_data.c8
-rw-r--r--arch/arm/mach-omap2/powerdomains54xx_data.c1
-rw-r--r--arch/arm/mach-omap2/powerdomains7xx_data.c454
-rw-r--r--arch/arm/mach-omap2/prcm-common.h1
-rw-r--r--arch/arm/mach-omap2/prcm44xx.h5
-rw-r--r--arch/arm/mach-omap2/prcm_mpu7xx.h78
-rw-r--r--arch/arm/mach-omap2/prm-regbits-24xx.h247
-rw-r--r--arch/arm/mach-omap2/prm-regbits-33xx.h307
-rw-r--r--arch/arm/mach-omap2/prm-regbits-34xx.h481
-rw-r--r--arch/arm/mach-omap2/prm-regbits-44xx.h2226
-rw-r--r--arch/arm/mach-omap2/prm-regbits-54xx.h2701
-rw-r--r--arch/arm/mach-omap2/prm44xx.c12
-rw-r--r--arch/arm/mach-omap2/prm7xx.h678
-rw-r--r--arch/arm/mach-omap2/prminst44xx.c20
-rw-r--r--arch/arm/mach-omap2/soc.h17
-rw-r--r--arch/arm/mach-omap2/timer.c11
-rw-r--r--arch/arm/mach-omap2/usb-host.c10
-rw-r--r--arch/arm/mach-orion5x/common.c36
-rw-r--r--arch/arm/mach-orion5x/common.h17
-rw-r--r--arch/arm/mach-orion5x/d2net-setup.c6
-rw-r--r--arch/arm/mach-orion5x/db88f5281-setup.c24
-rw-r--r--arch/arm/mach-orion5x/dns323-setup.c6
-rw-r--r--arch/arm/mach-orion5x/edmini_v2-setup.c17
-rw-r--r--arch/arm/mach-orion5x/include/mach/debug-macro.S21
-rw-r--r--arch/arm/mach-orion5x/kurobox_pro-setup.c12
-rw-r--r--arch/arm/mach-orion5x/ls-chl-setup.c6
-rw-r--r--arch/arm/mach-orion5x/ls_hgl-setup.c6
-rw-r--r--arch/arm/mach-orion5x/lsmini-setup.c6
-rw-r--r--arch/arm/mach-orion5x/mss2-setup.c6
-rw-r--r--arch/arm/mach-orion5x/mv2120-setup.c6
-rw-r--r--arch/arm/mach-orion5x/net2big-setup.c6
-rw-r--r--arch/arm/mach-orion5x/pci.c9
-rw-r--r--arch/arm/mach-orion5x/rd88f5181l-fxo-setup.c6
-rw-r--r--arch/arm/mach-orion5x/rd88f5181l-ge-setup.c6
-rw-r--r--arch/arm/mach-orion5x/rd88f5182-setup.c13
-rw-r--r--arch/arm/mach-orion5x/terastation_pro2-setup.c6
-rw-r--r--arch/arm/mach-orion5x/ts209-setup.c6
-rw-r--r--arch/arm/mach-orion5x/ts409-setup.c6
-rw-r--r--arch/arm/mach-orion5x/wnr854t-setup.c6
-rw-r--r--arch/arm/mach-orion5x/wrt350n-v2-setup.c6
-rw-r--r--arch/arm/mach-prima2/common.c2
-rw-r--r--arch/arm/mach-prima2/pm.c21
-rw-r--r--arch/arm/mach-pxa/cm-x300.c2
-rw-r--r--arch/arm/mach-pxa/em-x270.c2
-rw-r--r--arch/arm/mach-pxa/icontrol.c3
-rw-r--r--arch/arm/mach-pxa/pcm990-baseboard.c2
-rw-r--r--arch/arm/mach-pxa/pxa-dt.c2
-rw-r--r--arch/arm/mach-pxa/spitz.c2
-rw-r--r--arch/arm/mach-pxa/zeus.c48
-rw-r--r--arch/arm/mach-pxa/zylonite_pxa300.c2
-rw-r--r--arch/arm/mach-realview/Kconfig8
-rw-r--r--arch/arm/mach-realview/include/mach/debug-macro.S29
-rw-r--r--arch/arm/mach-rpc/include/mach/debug-macro.S23
-rw-r--r--arch/arm/mach-s3c24xx/Kconfig6
-rw-r--r--arch/arm/mach-s3c24xx/clock-s3c2410.c1
-rw-r--r--arch/arm/mach-s3c24xx/clock-s3c2412.c1
-rw-r--r--arch/arm/mach-s3c24xx/clock-s3c2416.c2
-rw-r--r--arch/arm/mach-s3c24xx/clock-s3c2443.c2
-rw-r--r--arch/arm/mach-s3c24xx/common.c27
-rw-r--r--arch/arm/mach-s3c24xx/include/mach/map.h2
-rw-r--r--arch/arm/mach-s3c24xx/mach-h1940.c4
-rw-r--r--arch/arm/mach-s3c24xx/mach-rx1950.c5
-rw-r--r--arch/arm/mach-s3c64xx/Kconfig2
-rw-r--r--arch/arm/mach-s3c64xx/clock.c2
-rw-r--r--arch/arm/mach-s3c64xx/common.c32
-rw-r--r--arch/arm/mach-s3c64xx/include/mach/irqs.h8
-rw-r--r--arch/arm/mach-s3c64xx/include/mach/map.h1
-rw-r--r--arch/arm/mach-s3c64xx/irq-pm.c2
-rw-r--r--arch/arm/mach-s3c64xx/mach-crag6410.c6
-rw-r--r--arch/arm/mach-s3c64xx/mach-hmt.c4
-rw-r--r--arch/arm/mach-s3c64xx/mach-smartq.c4
-rw-r--r--arch/arm/mach-s3c64xx/mach-smdk6410.c5
-rw-r--r--arch/arm/mach-s5p64x0/Kconfig2
-rw-r--r--arch/arm/mach-s5p64x0/clock-s5p6440.c2
-rw-r--r--arch/arm/mach-s5p64x0/clock-s5p6450.c2
-rw-r--r--arch/arm/mach-s5p64x0/common.c27
-rw-r--r--arch/arm/mach-s5p64x0/include/mach/irqs.h2
-rw-r--r--arch/arm/mach-s5p64x0/include/mach/map.h1
-rw-r--r--arch/arm/mach-s5p64x0/mach-smdk6440.c5
-rw-r--r--arch/arm/mach-s5p64x0/mach-smdk6450.c5
-rw-r--r--arch/arm/mach-s5p64x0/pm.c3
-rw-r--r--arch/arm/mach-s5pc100/Kconfig1
-rw-r--r--arch/arm/mach-s5pc100/clock.c2
-rw-r--r--arch/arm/mach-s5pc100/common.c28
-rw-r--r--arch/arm/mach-s5pc100/include/mach/irqs.h2
-rw-r--r--arch/arm/mach-s5pc100/include/mach/map.h1
-rw-r--r--arch/arm/mach-s5pc100/mach-smdkc100.c5
-rw-r--r--arch/arm/mach-s5pv210/Kconfig1
-rw-r--r--arch/arm/mach-s5pv210/clock.c1
-rw-r--r--arch/arm/mach-s5pv210/common.c28
-rw-r--r--arch/arm/mach-s5pv210/include/mach/irqs.h2
-rw-r--r--arch/arm/mach-s5pv210/include/mach/map.h1
-rw-r--r--arch/arm/mach-s5pv210/mach-smdkv210.c5
-rw-r--r--arch/arm/mach-s5pv210/pm.c10
-rw-r--r--arch/arm/mach-sa1100/collie.c2
-rw-r--r--arch/arm/mach-shmobile/Kconfig119
-rw-r--r--arch/arm/mach-shmobile/Makefile53
-rw-r--r--arch/arm/mach-shmobile/Makefile.boot6
-rw-r--r--arch/arm/mach-shmobile/board-ag5evm.c672
-rw-r--r--arch/arm/mach-shmobile/board-ape6evm-reference.c63
-rw-r--r--arch/arm/mach-shmobile/board-ape6evm.c149
-rw-r--r--arch/arm/mach-shmobile/board-armadillo800eva-reference.c23
-rw-r--r--arch/arm/mach-shmobile/board-armadillo800eva.c68
-rw-r--r--arch/arm/mach-shmobile/board-bockw-reference.c61
-rw-r--r--arch/arm/mach-shmobile/board-bockw.c91
-rw-r--r--arch/arm/mach-shmobile/board-kota2.c553
-rw-r--r--arch/arm/mach-shmobile/board-kzm9d-reference.c47
-rw-r--r--arch/arm/mach-shmobile/board-kzm9d.c4
-rw-r--r--arch/arm/mach-shmobile/board-kzm9g-reference.c50
-rw-r--r--arch/arm/mach-shmobile/board-kzm9g.c16
-rw-r--r--arch/arm/mach-shmobile/board-lager-reference.c45
-rw-r--r--arch/arm/mach-shmobile/board-lager.c62
-rw-r--r--arch/arm/mach-shmobile/board-mackerel.c34
-rw-r--r--arch/arm/mach-shmobile/board-marzen-reference.c29
-rw-r--r--arch/arm/mach-shmobile/board-marzen.c80
-rw-r--r--arch/arm/mach-shmobile/clock-emev2.c20
-rw-r--r--arch/arm/mach-shmobile/clock-r8a73a4.c199
-rw-r--r--arch/arm/mach-shmobile/clock-r8a7740.c3
-rw-r--r--arch/arm/mach-shmobile/clock-r8a7778.c5
-rw-r--r--arch/arm/mach-shmobile/clock-r8a7779.c10
-rw-r--r--arch/arm/mach-shmobile/clock-r8a7790.c27
-rw-r--r--arch/arm/mach-shmobile/clock-sh73a0.c14
-rw-r--r--arch/arm/mach-shmobile/headsmp-scu.S4
-rw-r--r--arch/arm/mach-shmobile/headsmp.S55
-rw-r--r--arch/arm/mach-shmobile/include/mach/common.h10
-rw-r--r--arch/arm/mach-shmobile/include/mach/dma.h1
-rw-r--r--arch/arm/mach-shmobile/include/mach/emev2.h4
-rw-r--r--arch/arm/mach-shmobile/include/mach/hardware.h4
-rw-r--r--arch/arm/mach-shmobile/include/mach/r8a73a4.h2
-rw-r--r--arch/arm/mach-shmobile/include/mach/r8a7740.h3
-rw-r--r--arch/arm/mach-shmobile/include/mach/r8a7778.h13
-rw-r--r--arch/arm/mach-shmobile/include/mach/r8a7779.h6
-rw-r--r--arch/arm/mach-shmobile/include/mach/r8a7790.h5
-rw-r--r--arch/arm/mach-shmobile/include/mach/sh73a0.h373
-rw-r--r--arch/arm/mach-shmobile/include/mach/zboot.h2
-rw-r--r--arch/arm/mach-shmobile/intc-r8a7740.c68
-rw-r--r--arch/arm/mach-shmobile/intc-r8a7779.c131
-rw-r--r--arch/arm/mach-shmobile/platsmp-scu.c81
-rw-r--r--arch/arm/mach-shmobile/platsmp.c18
-rw-r--r--arch/arm/mach-shmobile/setup-emev2.c382
-rw-r--r--arch/arm/mach-shmobile/setup-r8a73a4.c42
-rw-r--r--arch/arm/mach-shmobile/setup-r8a7740.c59
-rw-r--r--arch/arm/mach-shmobile/setup-r8a7778.c165
-rw-r--r--arch/arm/mach-shmobile/setup-r8a7779.c142
-rw-r--r--arch/arm/mach-shmobile/setup-r8a7790.c121
-rw-r--r--arch/arm/mach-shmobile/setup-sh7372.c8
-rw-r--r--arch/arm/mach-shmobile/setup-sh73a0.c35
-rw-r--r--arch/arm/mach-shmobile/sleep-sh7372.S2
-rw-r--r--arch/arm/mach-shmobile/smp-emev2.c37
-rw-r--r--arch/arm/mach-shmobile/smp-r8a7779.c70
-rw-r--r--arch/arm/mach-shmobile/smp-sh73a0.c72
-rw-r--r--arch/arm/mach-shmobile/timer.c4
-rw-r--r--arch/arm/mach-spear/Kconfig2
-rw-r--r--arch/arm/mach-spear/include/mach/debug-macro.S36
-rw-r--r--arch/arm/mach-spear/include/mach/spear.h2
-rw-r--r--arch/arm/mach-sunxi/Kconfig2
-rw-r--r--arch/arm/mach-sunxi/Makefile.boot1
-rw-r--r--arch/arm/mach-sunxi/sunxi.c45
-rw-r--r--arch/arm/mach-tegra/Kconfig30
-rw-r--r--arch/arm/mach-tegra/Makefile6
-rw-r--r--arch/arm/mach-tegra/board-harmony-pcie.c89
-rw-r--r--arch/arm/mach-tegra/board.h8
-rw-r--r--arch/arm/mach-tegra/common.h1
-rw-r--r--arch/arm/mach-tegra/cpuidle-tegra114.c51
-rw-r--r--arch/arm/mach-tegra/cpuidle-tegra20.c12
-rw-r--r--arch/arm/mach-tegra/cpuidle.c10
-rw-r--r--arch/arm/mach-tegra/cpuidle.h1
-rw-r--r--arch/arm/mach-tegra/flowctrl.c2
-rw-r--r--arch/arm/mach-tegra/flowctrl.h9
-rw-r--r--arch/arm/mach-tegra/headsmp.S3
-rw-r--r--arch/arm/mach-tegra/hotplug.c13
-rw-r--r--arch/arm/mach-tegra/iomap.h11
-rw-r--r--arch/arm/mach-tegra/irq.c40
-rw-r--r--arch/arm/mach-tegra/pcie.c886
-rw-r--r--arch/arm/mach-tegra/platsmp.c1
-rw-r--r--arch/arm/mach-tegra/pm-tegra20.c34
-rw-r--r--arch/arm/mach-tegra/pm-tegra30.c34
-rw-r--r--arch/arm/mach-tegra/pm.c148
-rw-r--r--arch/arm/mach-tegra/pm.h12
-rw-r--r--arch/arm/mach-tegra/pmc.c53
-rw-r--r--arch/arm/mach-tegra/pmc.h3
-rw-r--r--arch/arm/mach-tegra/reset-handler.S21
-rw-r--r--arch/arm/mach-tegra/reset.c2
-rw-r--r--arch/arm/mach-tegra/reset.h4
-rw-r--r--arch/arm/mach-tegra/sleep-tegra20.S297
-rw-r--r--arch/arm/mach-tegra/sleep-tegra30.S616
-rw-r--r--arch/arm/mach-tegra/sleep.S37
-rw-r--r--arch/arm/mach-tegra/sleep.h14
-rw-r--r--arch/arm/mach-tegra/tegra.c62
-rw-r--r--arch/arm/mach-u300/Kconfig10
-rw-r--r--arch/arm/mach-ux500/Kconfig2
-rw-r--r--arch/arm/mach-ux500/Makefile1
-rw-r--r--arch/arm/mach-ux500/board-mop500-audio.c1
-rw-r--r--arch/arm/mach-ux500/board-mop500-pins.c1
-rw-r--r--arch/arm/mach-ux500/board-mop500.c38
-rw-r--r--arch/arm/mach-ux500/cache-l2x0.c1
-rw-r--r--arch/arm/mach-ux500/cpu-db8500.c13
-rw-r--r--arch/arm/mach-ux500/cpu.c8
-rw-r--r--arch/arm/mach-ux500/cpuidle.c128
-rw-r--r--arch/arm/mach-ux500/devices-db8500.c1
-rw-r--r--arch/arm/mach-ux500/headsmp.S2
-rw-r--r--arch/arm/mach-ux500/pins-db8500.h746
-rw-r--r--arch/arm/mach-ux500/setup.h3
-rw-r--r--arch/arm/mach-versatile/include/mach/debug-macro.S21
-rw-r--r--arch/arm/mach-versatile/include/mach/platform.h2
-rw-r--r--arch/arm/mach-versatile/pci.c47
-rw-r--r--arch/arm/mach-vexpress/Kconfig10
-rw-r--r--arch/arm/mach-vexpress/Makefile3
-rw-r--r--arch/arm/mach-vexpress/dcscb.c66
-rw-r--r--arch/arm/mach-vexpress/spc.c180
-rw-r--r--arch/arm/mach-vexpress/spc.h24
-rw-r--r--arch/arm/mach-vexpress/tc2_pm.c354
-rw-r--r--arch/arm/mach-zynq/Kconfig2
-rw-r--r--arch/arm/mach-zynq/hotplug.c55
-rw-r--r--arch/arm/mach-zynq/slcr.c45
-rw-r--r--arch/arm/mm/cache-l2x0.c12
-rw-r--r--arch/arm/mm/cache-v7.S4
-rw-r--r--arch/arm/mm/context.c7
-rw-r--r--arch/arm/mm/dma-mapping.c7
-rw-r--r--arch/arm/mm/fault.c23
-rw-r--r--arch/arm/mm/hugetlbpage.c46
-rw-r--r--arch/arm/mm/init.c12
-rw-r--r--arch/arm/mm/mmu.c4
-rw-r--r--arch/arm/mm/nommu.c2
-rw-r--r--arch/arm/mm/proc-feroceon.S26
-rw-r--r--arch/arm/mm/proc-v7.S16
-rw-r--r--arch/arm/mm/tlb-v7.S8
-rw-r--r--arch/arm/plat-omap/Kconfig2
-rw-r--r--arch/arm/plat-omap/dma.c1
-rw-r--r--arch/arm/plat-orion/irq.c2
-rw-r--r--arch/arm/plat-pxa/ssp.c179
-rw-r--r--arch/arm/plat-samsung/Kconfig14
-rw-r--r--arch/arm/plat-samsung/Makefile3
-rw-r--r--arch/arm/plat-samsung/dev-backlight.c61
-rw-r--r--arch/arm/plat-samsung/devs.c42
-rw-r--r--arch/arm/plat-samsung/include/plat/clock.h4
-rw-r--r--arch/arm/plat-samsung/include/plat/devs.h1
-rw-r--r--arch/arm/plat-samsung/include/plat/irq-vic-timer.h13
-rw-r--r--arch/arm/plat-samsung/include/plat/irqs.h9
-rw-r--r--arch/arm/plat-samsung/include/plat/pwm-clock.h81
-rw-r--r--arch/arm/plat-samsung/include/plat/pwm-core.h22
-rw-r--r--arch/arm/plat-samsung/include/plat/regs-timer.h124
-rw-r--r--arch/arm/plat-samsung/include/plat/samsung-time.h23
-rw-r--r--arch/arm/plat-samsung/include/plat/sdhci.h38
-rw-r--r--arch/arm/plat-samsung/irq-vic-timer.c98
-rw-r--r--arch/arm/plat-samsung/pwm-clock.c474
-rw-r--r--arch/arm/plat-samsung/s3c-dma-ops.c13
-rw-r--r--arch/arm/plat-samsung/s5p-irq.c4
-rw-r--r--arch/arm/plat-samsung/samsung-time.c394
-rw-r--r--arch/arm/vfp/vfphw.S5
-rw-r--r--arch/arm/vfp/vfpmodule.c69
-rw-r--r--arch/arm64/Kconfig4
-rw-r--r--arch/arm64/include/asm/arch_timer.h23
-rw-r--r--arch/arm64/include/asm/elf.h3
-rw-r--r--arch/arm64/include/asm/hwcap.h2
-rw-r--r--arch/arm64/include/asm/neon.h14
-rw-r--r--arch/arm64/include/asm/pgtable-2level-types.h2
-rw-r--r--arch/arm64/include/asm/pgtable-3level-types.h2
-rw-r--r--arch/arm64/include/asm/pgtable-hwdef.h1
-rw-r--r--arch/arm64/kernel/entry.S3
-rw-r--r--arch/arm64/kernel/fpsimd.c28
-rw-r--r--arch/arm64/kernel/head.S8
-rw-r--r--arch/arm64/kernel/perf_event.c7
-rw-r--r--arch/arm64/kernel/process.c21
-rw-r--r--arch/arm64/kernel/setup.c10
-rw-r--r--arch/arm64/kernel/smp.c6
-rw-r--r--arch/arm64/kernel/vmlinux.lds.S3
-rw-r--r--arch/arm64/mm/fault.c33
-rw-r--r--arch/arm64/mm/hugetlbpage.c5
-rw-r--r--arch/arm64/mm/init.c3
-rw-r--r--arch/arm64/mm/mmu.c23
-rw-r--r--arch/arm64/mm/proc.S6
-rw-r--r--arch/avr32/Kconfig1
-rw-r--r--arch/avr32/mach-at32ap/at32ap700x.c3
-rw-r--r--arch/avr32/mm/fault.c4
-rw-r--r--arch/avr32/oprofile/op_model_avr32.c17
-rw-r--r--arch/blackfin/Kconfig1
-rw-r--r--arch/blackfin/boot/.gitignore1
-rw-r--r--arch/blackfin/include/asm/scb.h21
-rw-r--r--arch/blackfin/kernel/setup.c6
-rw-r--r--arch/blackfin/mach-bf609/Kconfig1655
-rw-r--r--arch/blackfin/mach-bf609/Makefile1
-rw-r--r--arch/blackfin/mach-bf609/boards/ezkit.c91
-rw-r--r--arch/blackfin/mach-bf609/clock.c17
-rw-r--r--arch/blackfin/mach-bf609/include/mach/defBF60x_base.h10
-rw-r--r--arch/blackfin/mach-bf609/scb.c363
-rw-r--r--arch/blackfin/mach-common/Makefile1
-rw-r--r--arch/blackfin/mach-common/scb-init.c53
-rw-r--r--arch/c6x/Kconfig1
-rw-r--r--arch/c6x/kernel/devicetree.c8
-rw-r--r--arch/cris/Kconfig82
-rw-r--r--arch/cris/arch-v10/drivers/Kconfig70
-rw-r--r--arch/cris/arch-v10/drivers/Makefile2
-rw-r--r--arch/cris/arch-v32/drivers/Kconfig394
-rw-r--r--arch/cris/arch-v32/mach-a3/Kconfig4
-rw-r--r--arch/cris/include/asm/processor.h1
-rw-r--r--arch/cris/include/uapi/asm/kvm_para.h1
-rw-r--r--arch/cris/mm/fault.c6
-rw-r--r--arch/frv/Kconfig1
-rw-r--r--arch/frv/mb93090-mb00/pci-vdk.c2
-rw-r--r--arch/frv/mm/fault.c10
-rw-r--r--arch/h8300/Kconfig1
-rw-r--r--arch/hexagon/Kconfig1
-rw-r--r--arch/hexagon/mm/vm_fault.c6
-rw-r--r--arch/ia64/Kconfig9
-rw-r--r--arch/ia64/include/asm/Kbuild1
-rw-r--r--arch/ia64/include/asm/bitops.h8
-rw-r--r--arch/ia64/include/asm/dmi.h2
-rw-r--r--arch/ia64/include/asm/spinlock.h5
-rw-r--r--arch/ia64/kvm/kvm-ia64.c4
-rw-r--r--arch/ia64/mm/fault.c6
-rw-r--r--arch/ia64/mm/hugetlbpage.c5
-rw-r--r--arch/m32r/Kconfig1
-rw-r--r--arch/m32r/mm/fault.c10
-rw-r--r--arch/m68k/Kconfig3
-rw-r--r--arch/m68k/Kconfig.machine134
-rw-r--r--arch/m68k/amiga/platform.c2
-rw-r--r--arch/m68k/emu/natfeat.c14
-rw-r--r--arch/m68k/emu/nfblock.c4
-rw-r--r--arch/m68k/emu/nfcon.c8
-rw-r--r--arch/m68k/emu/nfeth.c7
-rw-r--r--arch/m68k/include/asm/io_no.h1
-rw-r--r--arch/m68k/include/asm/irqflags.h6
-rw-r--r--arch/m68k/include/asm/page.h3
-rw-r--r--arch/m68k/include/asm/page_mm.h3
-rw-r--r--arch/m68k/kernel/setup_no.c2
-rw-r--r--arch/m68k/kernel/signal.c8
-rw-r--r--arch/m68k/kernel/time.c2
-rw-r--r--arch/m68k/mm/fault.c2
-rw-r--r--arch/m68k/platform/68000/m68328.c3
-rw-r--r--arch/m68k/platform/68000/m68EZ328.c3
-rw-r--r--arch/m68k/platform/68000/m68VZ328.c9
-rw-r--r--arch/m68k/platform/68360/commproc.c3
-rw-r--r--arch/m68k/platform/68360/config.c3
-rw-r--r--arch/m68k/platform/coldfire/pci.c1
-rw-r--r--arch/m68k/q40/config.c2
-rw-r--r--arch/metag/Kconfig1
-rw-r--r--arch/metag/Kconfig.soc2
-rw-r--r--arch/metag/boot/dts/tz1090.dtsi67
-rw-r--r--arch/metag/mm/fault.c6
-rw-r--r--arch/metag/mm/hugetlbpage.c5
-rw-r--r--arch/metag/mm/init.c5
-rw-r--r--arch/microblaze/Kconfig2
-rw-r--r--arch/microblaze/Makefile3
-rw-r--r--arch/microblaze/boot/Makefile7
-rw-r--r--arch/microblaze/include/asm/prom.h3
-rw-r--r--arch/microblaze/include/asm/selfmod.h24
-rw-r--r--arch/microblaze/kernel/Makefile2
-rw-r--r--arch/microblaze/kernel/cpu/cpuinfo.c2
-rw-r--r--arch/microblaze/kernel/intc.c85
-rw-r--r--arch/microblaze/kernel/irq.c10
-rw-r--r--arch/microblaze/kernel/prom.c8
-rw-r--r--arch/microblaze/kernel/reset.c6
-rw-r--r--arch/microblaze/kernel/selfmod.c81
-rw-r--r--arch/microblaze/kernel/setup.c10
-rw-r--r--arch/microblaze/kernel/timer.c186
-rw-r--r--arch/microblaze/mm/fault.c7
-rw-r--r--arch/microblaze/pci/pci-common.c106
-rw-r--r--arch/microblaze/platform/Kconfig.platform22
-rw-r--r--arch/mips/Kconfig28
-rw-r--r--arch/mips/Makefile37
-rw-r--r--arch/mips/alchemy/common/usb.c3
-rw-r--r--arch/mips/ath79/clock.c258
-rw-r--r--arch/mips/ath79/common.h2
-rw-r--r--arch/mips/ath79/dev-common.c10
-rw-r--r--arch/mips/ath79/setup.c23
-rw-r--r--arch/mips/bcm63xx/cpu.c4
-rw-r--r--arch/mips/bcm63xx/nvram.c11
-rw-r--r--arch/mips/boot/.gitignore1
-rw-r--r--arch/mips/boot/Makefile15
-rw-r--r--arch/mips/boot/compressed/Makefile2
l---------arch/mips/boot/dts/include/dt-bindings1
-rw-r--r--arch/mips/cavium-octeon/csrc-octeon.c1
-rw-r--r--arch/mips/cavium-octeon/octeon-irq.c2
-rw-r--r--arch/mips/cavium-octeon/setup.c28
-rw-r--r--arch/mips/cavium-octeon/smp.c4
-rw-r--r--arch/mips/configs/xway_defconfig159
-rw-r--r--arch/mips/dec/ioasic-irq.c8
-rw-r--r--arch/mips/dec/prom/init.c1
-rw-r--r--arch/mips/dec/time.c27
-rw-r--r--arch/mips/include/asm/Kbuild13
-rw-r--r--arch/mips/include/asm/bmips.h55
-rw-r--r--arch/mips/include/asm/cpu-features.h8
-rw-r--r--arch/mips/include/asm/cpu-info.h1
-rw-r--r--arch/mips/include/asm/cpu-type.h203
-rw-r--r--arch/mips/include/asm/cpu.h44
-rw-r--r--arch/mips/include/asm/cputime.h6
-rw-r--r--arch/mips/include/asm/current.h1
-rw-r--r--arch/mips/include/asm/dec/ioasic.h4
-rw-r--r--arch/mips/include/asm/emergency-restart.h6
-rw-r--r--arch/mips/include/asm/local64.h1
-rw-r--r--arch/mips/include/asm/mach-ath79/cpu-feature-overrides.h2
-rw-r--r--arch/mips/include/asm/mach-au1x00/au1000.h4
-rw-r--r--arch/mips/include/asm/mach-bcm63xx/bcm63xx_nvram.h2
-rw-r--r--arch/mips/include/asm/mach-cavium-octeon/gpio.h21
-rw-r--r--arch/mips/include/asm/mach-ip22/cpu-feature-overrides.h2
-rw-r--r--arch/mips/include/asm/mach-ip27/cpu-feature-overrides.h2
-rw-r--r--arch/mips/include/asm/mach-ip28/cpu-feature-overrides.h2
-rw-r--r--arch/mips/include/asm/mach-lantiq/falcon/cpu-feature-overrides.h58
-rw-r--r--arch/mips/include/asm/mach-ralink/mt7620.h40
-rw-r--r--arch/mips/include/asm/mach-ralink/mt7620/cpu-feature-overrides.h57
-rw-r--r--arch/mips/include/asm/mipsregs.h7
-rw-r--r--arch/mips/include/asm/mutex.h9
-rw-r--r--arch/mips/include/asm/netlogic/xlp-hal/bridge.h4
-rw-r--r--arch/mips/include/asm/netlogic/xlp-hal/iomap.h10
-rw-r--r--arch/mips/include/asm/netlogic/xlp-hal/pic.h5
-rw-r--r--arch/mips/include/asm/netlogic/xlp-hal/sys.h31
-rw-r--r--arch/mips/include/asm/netlogic/xlp-hal/xlp.h17
-rw-r--r--arch/mips/include/asm/netlogic/xlr/pic.h2
-rw-r--r--arch/mips/include/asm/octeon/octeon.h2
-rw-r--r--arch/mips/include/asm/parport.h1
-rw-r--r--arch/mips/include/asm/pci.h17
-rw-r--r--arch/mips/include/asm/percpu.h6
-rw-r--r--arch/mips/include/asm/scatterlist.h6
-rw-r--r--arch/mips/include/asm/sections.h6
-rw-r--r--arch/mips/include/asm/segment.h6
-rw-r--r--arch/mips/include/asm/serial.h1
-rw-r--r--arch/mips/include/asm/timex.h33
-rw-r--r--arch/mips/include/asm/ucontext.h1
-rw-r--r--arch/mips/include/asm/vga.h3
-rw-r--r--arch/mips/include/asm/xor.h1
-rw-r--r--arch/mips/include/uapi/asm/Kbuild5
-rw-r--r--arch/mips/include/uapi/asm/auxvec.h4
-rw-r--r--arch/mips/include/uapi/asm/ipcbuf.h1
-rw-r--r--arch/mips/kernel/cpu-probe.c70
-rw-r--r--arch/mips/kernel/csrc-ioasic.c14
-rw-r--r--arch/mips/kernel/idle.c4
-rw-r--r--arch/mips/kernel/mcount.S2
-rw-r--r--arch/mips/kernel/prom.c3
-rw-r--r--arch/mips/kernel/relocate_kernel.S6
-rw-r--r--arch/mips/kernel/setup.c99
-rw-r--r--arch/mips/kernel/smp-cmp.c13
-rw-r--r--arch/mips/kernel/time.c11
-rw-r--r--arch/mips/kernel/traps.c3
-rw-r--r--arch/mips/kernel/vmlinux.lds.S1
-rw-r--r--arch/mips/kernel/vpe.c17
-rw-r--r--arch/mips/kvm/kvm_locore.S969
-rw-r--r--arch/mips/kvm/kvm_mips.c4
-rw-r--r--arch/mips/lantiq/falcon/sysctrl.c5
-rw-r--r--arch/mips/lantiq/xway/Makefile2
-rw-r--r--arch/mips/lantiq/xway/dcdc.c63
-rw-r--r--arch/mips/lasat/image/Makefile6
-rw-r--r--arch/mips/loongson/common/Makefile3
-rw-r--r--arch/mips/math-emu/cp1emu.c27
-rw-r--r--arch/mips/mm/c-octeon.c20
-rw-r--r--arch/mips/mm/c-r4k.c48
-rw-r--r--arch/mips/mm/dma-default.c29
-rw-r--r--arch/mips/mm/fault.c8
-rw-r--r--arch/mips/mm/gup.c3
-rw-r--r--arch/mips/mm/hugetlbpage.c5
-rw-r--r--arch/mips/mm/init.c1
-rw-r--r--arch/mips/mm/page.c1
-rw-r--r--arch/mips/mm/sc-mips.c3
-rw-r--r--arch/mips/mm/tlb-funcs.S2
-rw-r--r--arch/mips/mm/tlb-r4k.c1
-rw-r--r--arch/mips/mm/tlbex.c3
-rw-r--r--arch/mips/mti-malta/malta-time.c5
-rw-r--r--arch/mips/mti-sead3/sead3-time.c3
-rw-r--r--arch/mips/netlogic/Kconfig9
-rw-r--r--arch/mips/netlogic/common/smp.c4
-rw-r--r--arch/mips/netlogic/common/time.c3
-rw-r--r--arch/mips/netlogic/dts/Makefile1
-rw-r--r--arch/mips/netlogic/dts/xlp_evp.dts9
-rw-r--r--arch/mips/netlogic/dts/xlp_fvp.dts118
-rw-r--r--arch/mips/netlogic/dts/xlp_svp.dts9
-rw-r--r--arch/mips/netlogic/xlp/Makefile1
-rw-r--r--arch/mips/netlogic/xlp/dt.c8
-rw-r--r--arch/mips/netlogic/xlp/nlm_hal.c237
-rw-r--r--arch/mips/netlogic/xlp/setup.c50
-rw-r--r--arch/mips/netlogic/xlp/usb-init-xlp2.c218
-rw-r--r--arch/mips/netlogic/xlp/usb-init.c6
-rw-r--r--arch/mips/netlogic/xlp/wakeup.c10
-rw-r--r--arch/mips/netlogic/xlr/fmn-config.c3
-rw-r--r--arch/mips/oprofile/common.c21
-rw-r--r--arch/mips/pci/Makefile1
-rw-r--r--arch/mips/pci/pci-bcm1480.c1
-rw-r--r--arch/mips/pci/pci-octeon.c9
-rw-r--r--arch/mips/pci/pci-rt3883.c636
-rw-r--r--arch/mips/pci/pci.c1
-rw-r--r--arch/mips/powertv/Kconfig9
-rw-r--r--arch/mips/powertv/asic/asic_devices.c12
-rw-r--r--arch/mips/powertv/init.c4
-rw-r--r--arch/mips/powertv/reset.c12
-rw-r--r--arch/mips/ralink/Kconfig10
-rw-r--r--arch/mips/ralink/Makefile4
-rw-r--r--arch/mips/ralink/Platform1
-rw-r--r--arch/mips/ralink/cevt-rt3352.c145
-rw-r--r--arch/mips/ralink/clk.c1
-rw-r--r--arch/mips/ralink/common.h2
-rw-r--r--arch/mips/ralink/mt7620.c205
-rw-r--r--arch/mips/ralink/of.c3
-rw-r--r--arch/mips/ralink/reset.c62
-rw-r--r--arch/mips/ralink/timer.c185
-rw-r--r--arch/mips/sibyte/bcm1480/setup.c3
-rw-r--r--arch/mips/sibyte/sb1250/setup.c3
-rw-r--r--arch/mips/sni/a20r.c1
-rw-r--r--arch/mips/sni/setup.c3
-rw-r--r--arch/mips/txx9/generic/setup.c2
-rw-r--r--arch/mn10300/Kconfig1
-rw-r--r--arch/mn10300/kernel/entry.S6
-rw-r--r--arch/mn10300/mm/fault.c2
-rw-r--r--arch/openrisc/Kconfig1
-rw-r--r--arch/openrisc/include/asm/prom.h3
-rw-r--r--arch/openrisc/kernel/prom.c8
-rw-r--r--arch/openrisc/mm/fault.c1
-rw-r--r--arch/parisc/Kconfig1
-rw-r--r--arch/parisc/kernel/signal.c2
-rw-r--r--arch/parisc/mm/fault.c7
-rw-r--r--arch/powerpc/Kconfig29
-rw-r--r--arch/powerpc/Makefile18
-rw-r--r--arch/powerpc/boot/.gitignore1
-rw-r--r--arch/powerpc/boot/Makefile4
-rw-r--r--arch/powerpc/boot/dts/ac14xx.dts2
-rw-r--r--arch/powerpc/boot/dts/b4420qds.dts2
-rw-r--r--arch/powerpc/boot/dts/b4860qds.dts2
-rw-r--r--arch/powerpc/boot/dts/b4qds.dtsi (renamed from arch/powerpc/boot/dts/b4qds.dts)0
-rw-r--r--arch/powerpc/boot/dts/c293pcie.dts223
-rw-r--r--arch/powerpc/boot/dts/fsl/b4si-post.dtsi2
-rw-r--r--arch/powerpc/boot/dts/fsl/c293si-post.dtsi193
-rw-r--r--arch/powerpc/boot/dts/fsl/c293si-pre.dtsi63
-rw-r--r--arch/powerpc/boot/dts/fsl/qoriq-mpic4.3.dtsi149
-rw-r--r--arch/powerpc/boot/dts/fsl/qoriq-sec6.0-0.dtsi56
-rw-r--r--arch/powerpc/boot/dts/fsl/t4240si-post.dtsi2
l---------arch/powerpc/boot/dts/include/dt-bindings1
-rw-r--r--arch/powerpc/boot/dts/mpc5121ads.dts2
-rw-r--r--arch/powerpc/boot/dts/p1020rdb-pd.dts280
-rw-r--r--arch/powerpc/boot/dts/p1023rdb.dts234
-rw-r--r--arch/powerpc/boot/dts/pdm360ng.dts2
-rw-r--r--arch/powerpc/boot/epapr-wrapper.c9
-rw-r--r--arch/powerpc/boot/epapr.c4
-rw-r--r--arch/powerpc/boot/of.c16
-rw-r--r--arch/powerpc/boot/ppc_asm.h3
-rw-r--r--arch/powerpc/boot/util.S10
-rwxr-xr-xarch/powerpc/boot/wrapper9
-rw-r--r--arch/powerpc/configs/85xx/p1023_defconfig (renamed from arch/powerpc/configs/85xx/p1023rds_defconfig)25
-rw-r--r--arch/powerpc/configs/corenet32_smp_defconfig1
-rw-r--r--arch/powerpc/configs/corenet64_smp_defconfig3
-rw-r--r--arch/powerpc/configs/mpc83xx_defconfig1
-rw-r--r--arch/powerpc/configs/mpc85xx_defconfig2
-rw-r--r--arch/powerpc/configs/mpc85xx_smp_defconfig2
-rw-r--r--arch/powerpc/include/asm/Kbuild1
-rw-r--r--arch/powerpc/include/asm/asm-compat.h9
-rw-r--r--arch/powerpc/include/asm/btext.h1
-rw-r--r--arch/powerpc/include/asm/cacheflush.h8
-rw-r--r--arch/powerpc/include/asm/cputable.h9
-rw-r--r--arch/powerpc/include/asm/device.h3
-rw-r--r--arch/powerpc/include/asm/emulated_ops.h2
-rw-r--r--arch/powerpc/include/asm/epapr_hcalls.h6
-rw-r--r--arch/powerpc/include/asm/exception-64s.h35
-rw-r--r--arch/powerpc/include/asm/fsl_pamu_stash.h39
-rw-r--r--arch/powerpc/include/asm/io.h33
-rw-r--r--arch/powerpc/include/asm/irq.h4
-rw-r--r--arch/powerpc/include/asm/irqflags.h7
-rw-r--r--arch/powerpc/include/asm/kvm_book3s.h38
-rw-r--r--arch/powerpc/include/asm/kvm_book3s_64.h4
-rw-r--r--arch/powerpc/include/asm/kvm_host.h14
-rw-r--r--arch/powerpc/include/asm/kvm_ppc.h25
-rw-r--r--arch/powerpc/include/asm/lppaca.h68
-rw-r--r--arch/powerpc/include/asm/mpc5121.h18
-rw-r--r--arch/powerpc/include/asm/mpc85xx.h92
-rw-r--r--arch/powerpc/include/asm/mpic.h7
-rw-r--r--arch/powerpc/include/asm/opal.h27
-rw-r--r--arch/powerpc/include/asm/paca.h11
-rw-r--r--arch/powerpc/include/asm/page.h10
-rw-r--r--arch/powerpc/include/asm/pci-bridge.h2
-rw-r--r--arch/powerpc/include/asm/pci.h5
-rw-r--r--arch/powerpc/include/asm/perf_event_fsl_emb.h2
-rw-r--r--arch/powerpc/include/asm/perf_event_server.h4
-rw-r--r--arch/powerpc/include/asm/plpar_wrappers.h (renamed from arch/powerpc/platforms/pseries/plpar_wrappers.h)30
-rw-r--r--arch/powerpc/include/asm/ppc-opcode.h47
-rw-r--r--arch/powerpc/include/asm/ppc_asm.h22
-rw-r--r--arch/powerpc/include/asm/processor.h4
-rw-r--r--arch/powerpc/include/asm/prom.h10
-rw-r--r--arch/powerpc/include/asm/reg.h29
-rw-r--r--arch/powerpc/include/asm/reg_booke.h8
-rw-r--r--arch/powerpc/include/asm/reg_fsl_emb.h24
-rw-r--r--arch/powerpc/include/asm/rtas.h8
-rw-r--r--arch/powerpc/include/asm/smp.h3
-rw-r--r--arch/powerpc/include/asm/spinlock.h6
-rw-r--r--arch/powerpc/include/asm/switch_to.h11
-rw-r--r--arch/powerpc/include/asm/timex.h4
-rw-r--r--arch/powerpc/include/asm/topology.h1
-rw-r--r--arch/powerpc/include/asm/udbg.h9
-rw-r--r--arch/powerpc/include/uapi/asm/elf.h21
-rw-r--r--arch/powerpc/kernel/Makefile5
-rw-r--r--arch/powerpc/kernel/align.c14
-rw-r--r--arch/powerpc/kernel/asm-offsets.c4
-rw-r--r--arch/powerpc/kernel/btext.c254
-rw-r--r--arch/powerpc/kernel/cacheinfo.c12
-rw-r--r--arch/powerpc/kernel/cpu_setup_fsl_booke.S2
-rw-r--r--arch/powerpc/kernel/cputable.c2
-rw-r--r--arch/powerpc/kernel/entry_64.S46
-rw-r--r--arch/powerpc/kernel/epapr_paravirt.c28
-rw-r--r--arch/powerpc/kernel/exceptions-64e.S4
-rw-r--r--arch/powerpc/kernel/exceptions-64s.S39
-rw-r--r--arch/powerpc/kernel/head_40x.S8
-rw-r--r--arch/powerpc/kernel/head_44x.S10
-rw-r--r--arch/powerpc/kernel/head_64.S1
-rw-r--r--arch/powerpc/kernel/head_8xx.S4
-rw-r--r--arch/powerpc/kernel/head_fsl_booke.S10
-rw-r--r--arch/powerpc/kernel/io-workarounds.c19
-rw-r--r--arch/powerpc/kernel/io.c3
-rw-r--r--arch/powerpc/kernel/iommu.c2
-rw-r--r--arch/powerpc/kernel/irq.c100
-rw-r--r--arch/powerpc/kernel/legacy_serial.c62
-rw-r--r--arch/powerpc/kernel/misc_32.S28
-rw-r--r--arch/powerpc/kernel/misc_64.S60
-rw-r--r--arch/powerpc/kernel/paca.c10
-rw-r--r--arch/powerpc/kernel/pci-common.c21
-rw-r--r--arch/powerpc/kernel/pci_64.c4
-rw-r--r--arch/powerpc/kernel/pci_dn.c20
-rw-r--r--arch/powerpc/kernel/pci_of_scan.c23
-rw-r--r--arch/powerpc/kernel/ppc_ksyms.c3
-rw-r--r--arch/powerpc/kernel/process.c5
-rw-r--r--arch/powerpc/kernel/prom.c133
-rw-r--r--arch/powerpc/kernel/prom_init.c293
-rw-r--r--arch/powerpc/kernel/prom_init_check.sh3
-rw-r--r--arch/powerpc/kernel/prom_parse.c17
-rw-r--r--arch/powerpc/kernel/rtas.c66
-rw-r--r--arch/powerpc/kernel/setup-common.c13
-rw-r--r--arch/powerpc/kernel/setup_32.c4
-rw-r--r--arch/powerpc/kernel/setup_64.c40
-rw-r--r--arch/powerpc/kernel/signal_32.c9
-rw-r--r--arch/powerpc/kernel/signal_64.c18
-rw-r--r--arch/powerpc/kernel/smp.c157
-rw-r--r--arch/powerpc/kernel/softemu8xx.c199
-rw-r--r--arch/powerpc/kernel/swsusp_asm64.S45
-rw-r--r--arch/powerpc/kernel/swsusp_booke.S8
-rw-r--r--arch/powerpc/kernel/time.c20
-rw-r--r--arch/powerpc/kernel/tm.S4
-rw-r--r--arch/powerpc/kernel/traps.c111
-rw-r--r--arch/powerpc/kernel/udbg_16550.c370
-rw-r--r--arch/powerpc/kernel/vdso32/gettimeofday.S6
-rw-r--r--arch/powerpc/kernel/vio.c33
-rw-r--r--arch/powerpc/kvm/Kconfig1
-rw-r--r--arch/powerpc/kvm/Makefile1
-rw-r--r--arch/powerpc/kvm/book3s_64_mmu.c150
-rw-r--r--arch/powerpc/kvm/book3s_64_mmu_hv.c42
-rw-r--r--arch/powerpc/kvm/book3s_64_slb.S4
-rw-r--r--arch/powerpc/kvm/book3s_64_vio.c2
-rw-r--r--arch/powerpc/kvm/book3s_emulate.c2
-rw-r--r--arch/powerpc/kvm/book3s_hv.c38
-rw-r--r--arch/powerpc/kvm/book3s_hv_builtin.c246
-rw-r--r--arch/powerpc/kvm/book3s_hv_cma.c240
-rw-r--r--arch/powerpc/kvm/book3s_hv_cma.h27
-rw-r--r--arch/powerpc/kvm/book3s_hv_rm_mmu.c143
-rw-r--r--arch/powerpc/kvm/book3s_hv_rmhandlers.S14
-rw-r--r--arch/powerpc/kvm/book3s_interrupts.S14
-rw-r--r--arch/powerpc/kvm/book3s_pr.c35
-rw-r--r--arch/powerpc/kvm/book3s_xics.c1
-rw-r--r--arch/powerpc/kvm/booke.c6
-rw-r--r--arch/powerpc/kvm/emulate.c45
-rw-r--r--arch/powerpc/kvm/powerpc.c26
-rw-r--r--arch/powerpc/lib/locks.c4
-rw-r--r--arch/powerpc/lib/sstep.c11
-rw-r--r--arch/powerpc/math-emu/Makefile24
-rw-r--r--arch/powerpc/math-emu/math.c89
-rw-r--r--arch/powerpc/mm/fault.c26
-rw-r--r--arch/powerpc/mm/gup.c37
-rw-r--r--arch/powerpc/mm/hash_utils_64.c2
-rw-r--r--arch/powerpc/mm/hugetlbpage.c10
-rw-r--r--arch/powerpc/mm/init_32.c2
-rw-r--r--arch/powerpc/mm/mem.c2
-rw-r--r--arch/powerpc/mm/numa.c102
-rw-r--r--arch/powerpc/mm/slb.c9
-rw-r--r--arch/powerpc/mm/subpage-prot.c4
-rw-r--r--arch/powerpc/oprofile/common.c28
-rw-r--r--arch/powerpc/oprofile/op_model_fsl_emb.c30
-rw-r--r--arch/powerpc/perf/Makefile2
-rw-r--r--arch/powerpc/perf/core-book3s.c2
-rw-r--r--arch/powerpc/perf/core-fsl-emb.c30
-rw-r--r--arch/powerpc/perf/e6500-pmu.c121
-rw-r--r--arch/powerpc/perf/power7-events-list.h548
-rw-r--r--arch/powerpc/perf/power7-pmu.c148
-rw-r--r--arch/powerpc/platforms/44x/warp.c1
-rw-r--r--arch/powerpc/platforms/52xx/mpc52xx_pic.c3
-rw-r--r--arch/powerpc/platforms/85xx/Kconfig10
-rw-r--r--arch/powerpc/platforms/85xx/Makefile1
-rw-r--r--arch/powerpc/platforms/85xx/c293pcie.c75
-rw-r--r--arch/powerpc/platforms/85xx/corenet_ds.c6
-rw-r--r--arch/powerpc/platforms/85xx/mpc85xx_rdb.c22
-rw-r--r--arch/powerpc/platforms/85xx/p1023_rds.c24
-rw-r--r--arch/powerpc/platforms/85xx/smp.c26
-rw-r--r--arch/powerpc/platforms/Kconfig7
-rw-r--r--arch/powerpc/platforms/Kconfig.cputype13
-rw-r--r--arch/powerpc/platforms/cell/iommu.c2
-rw-r--r--arch/powerpc/platforms/cell/smp.c15
-rw-r--r--arch/powerpc/platforms/cell/spufs/inode.c8
-rw-r--r--arch/powerpc/platforms/powernv/Kconfig2
-rw-r--r--arch/powerpc/platforms/powernv/Makefile2
-rw-r--r--arch/powerpc/platforms/powernv/eeh-ioda.c22
-rw-r--r--arch/powerpc/platforms/powernv/opal-lpc.c203
-rw-r--r--arch/powerpc/platforms/powernv/opal-wrappers.S5
-rw-r--r--arch/powerpc/platforms/powernv/opal.c18
-rw-r--r--arch/powerpc/platforms/powernv/pci-ioda.c47
-rw-r--r--arch/powerpc/platforms/powernv/powernv.h2
-rw-r--r--arch/powerpc/platforms/powernv/setup.c17
-rw-r--r--arch/powerpc/platforms/powernv/smp.c18
-rw-r--r--arch/powerpc/platforms/ps3/time.c2
-rw-r--r--arch/powerpc/platforms/pseries/Makefile1
-rw-r--r--arch/powerpc/platforms/pseries/cmm.c3
-rw-r--r--arch/powerpc/platforms/pseries/dlpar.c67
-rw-r--r--arch/powerpc/platforms/pseries/dtl.c5
-rw-r--r--arch/powerpc/platforms/pseries/hotplug-cpu.c7
-rw-r--r--arch/powerpc/platforms/pseries/hvconsole.c19
-rw-r--r--arch/powerpc/platforms/pseries/iommu.c11
-rw-r--r--arch/powerpc/platforms/pseries/kexec.c2
-rw-r--r--arch/powerpc/platforms/pseries/lpar.c12
-rw-r--r--arch/powerpc/platforms/pseries/lparcfg.c (renamed from arch/powerpc/kernel/lparcfg.c)36
-rw-r--r--arch/powerpc/platforms/pseries/mobility.c45
-rw-r--r--arch/powerpc/platforms/pseries/nvram.c112
-rw-r--r--arch/powerpc/platforms/pseries/processor_idle.c12
-rw-r--r--arch/powerpc/platforms/pseries/pseries.h5
-rw-r--r--arch/powerpc/platforms/pseries/pseries_energy.c4
-rw-r--r--arch/powerpc/platforms/pseries/setup.c37
-rw-r--r--arch/powerpc/platforms/pseries/smp.c46
-rw-r--r--arch/powerpc/platforms/wsp/wsp.h1
-rw-r--r--arch/powerpc/sysdev/fsl_msi.c137
-rw-r--r--arch/powerpc/sysdev/fsl_msi.h10
-rw-r--r--arch/powerpc/sysdev/fsl_pci.c184
-rw-r--r--arch/powerpc/sysdev/fsl_pci.h11
-rw-r--r--arch/powerpc/sysdev/rtc_cmos_setup.c2
-rw-r--r--arch/powerpc/sysdev/xics/icp-native.c2
-rw-r--r--arch/powerpc/sysdev/xics/xics-common.c10
-rw-r--r--arch/powerpc/xmon/xmon.c31
-rw-r--r--arch/s390/Kconfig20
-rw-r--r--arch/s390/defconfig39
-rw-r--r--arch/s390/hypfs/hypfs.h13
-rw-r--r--arch/s390/hypfs/hypfs_dbfs.c2
-rw-r--r--arch/s390/hypfs/hypfs_diag.c50
-rw-r--r--arch/s390/hypfs/hypfs_vm.c65
-rw-r--r--arch/s390/hypfs/inode.c36
-rw-r--r--arch/s390/include/asm/airq.h67
-rw-r--r--arch/s390/include/asm/bitops.h12
-rw-r--r--arch/s390/include/asm/cio.h1
-rw-r--r--arch/s390/include/asm/cputime.h3
-rw-r--r--arch/s390/include/asm/hardirq.h5
-rw-r--r--arch/s390/include/asm/hugetlb.h135
-rw-r--r--arch/s390/include/asm/hw_irq.h17
-rw-r--r--arch/s390/include/asm/irq.h49
-rw-r--r--arch/s390/include/asm/kprobes.h4
-rw-r--r--arch/s390/include/asm/kvm_host.h8
-rw-r--r--arch/s390/include/asm/mmu.h2
-rw-r--r--arch/s390/include/asm/mmu_context.h22
-rw-r--r--arch/s390/include/asm/page.h19
-rw-r--r--arch/s390/include/asm/pci.h58
-rw-r--r--arch/s390/include/asm/pci_insn.h12
-rw-r--r--arch/s390/include/asm/pci_io.h10
-rw-r--r--arch/s390/include/asm/pgtable.h648
-rw-r--r--arch/s390/include/asm/processor.h2
-rw-r--r--arch/s390/include/asm/sclp.h1
-rw-r--r--arch/s390/include/asm/serial.h6
-rw-r--r--arch/s390/include/asm/switch_to.h9
-rw-r--r--arch/s390/include/asm/tlb.h3
-rw-r--r--arch/s390/include/asm/tlbflush.h6
-rw-r--r--arch/s390/include/asm/vtime.h7
-rw-r--r--arch/s390/kernel/compat_linux.c9
-rw-r--r--arch/s390/kernel/compat_signal.c10
-rw-r--r--arch/s390/kernel/crash_dump.c219
-rw-r--r--arch/s390/kernel/dumpstack.c20
-rw-r--r--arch/s390/kernel/entry.S16
-rw-r--r--arch/s390/kernel/entry.h18
-rw-r--r--arch/s390/kernel/entry64.S11
-rw-r--r--arch/s390/kernel/ftrace.c5
-rw-r--r--arch/s390/kernel/irq.c235
-rw-r--r--arch/s390/kernel/kprobes.c165
-rw-r--r--arch/s390/kernel/machine_kexec.c2
-rw-r--r--arch/s390/kernel/nmi.c5
-rw-r--r--arch/s390/kernel/perf_cpum_cf.c4
-rw-r--r--arch/s390/kernel/perf_event.c5
-rw-r--r--arch/s390/kernel/process.c1
-rw-r--r--arch/s390/kernel/ptrace.c8
-rw-r--r--arch/s390/kernel/runtime_instr.c4
-rw-r--r--arch/s390/kernel/smp.c2
-rw-r--r--arch/s390/kernel/suspend.c12
-rw-r--r--arch/s390/kernel/swsusp_asm64.S7
-rw-r--r--arch/s390/kernel/time.c1
-rw-r--r--arch/s390/kernel/vdso.c6
-rw-r--r--arch/s390/kernel/vtime.c1
-rw-r--r--arch/s390/kvm/diag.c17
-rw-r--r--arch/s390/kvm/gaccess.h12
-rw-r--r--arch/s390/kvm/kvm-s390.c27
-rw-r--r--arch/s390/kvm/kvm-s390.h10
-rw-r--r--arch/s390/kvm/priv.c32
-rw-r--r--arch/s390/lib/delay.c2
-rw-r--r--arch/s390/lib/uaccess_pt.c16
-rw-r--r--arch/s390/mm/dump_pagetables.c18
-rw-r--r--arch/s390/mm/fault.c4
-rw-r--r--arch/s390/mm/gup.c6
-rw-r--r--arch/s390/mm/hugetlbpage.c129
-rw-r--r--arch/s390/mm/maccess.c1
-rw-r--r--arch/s390/mm/pageattr.c2
-rw-r--r--arch/s390/mm/pgtable.c272
-rw-r--r--arch/s390/mm/vmem.c15
-rw-r--r--arch/s390/net/bpf_jit_comp.c2
-rw-r--r--arch/s390/oprofile/hwsampler.c6
-rw-r--r--arch/s390/oprofile/init.c35
-rw-r--r--arch/s390/pci/Makefile2
-rw-r--r--arch/s390/pci/pci.c575
-rw-r--r--arch/s390/pci/pci_clp.c146
-rw-r--r--arch/s390/pci/pci_dma.c16
-rw-r--r--arch/s390/pci/pci_event.c2
-rw-r--r--arch/s390/pci/pci_insn.c18
-rw-r--r--arch/s390/pci/pci_msi.c142
-rw-r--r--arch/s390/pci/pci_sysfs.c27
-rw-r--r--arch/score/Kconfig1
-rw-r--r--arch/score/mm/fault.c13
-rw-r--r--arch/sh/Kconfig7
-rw-r--r--arch/sh/boards/board-espt.c1
-rw-r--r--arch/sh/boards/board-sh7757lcr.c4
-rw-r--r--arch/sh/boards/mach-ecovec24/setup.c127
-rw-r--r--arch/sh/boards/mach-kfr2r09/lcd_wqvga.c48
-rw-r--r--arch/sh/boards/mach-kfr2r09/setup.c19
-rw-r--r--arch/sh/boards/mach-se/7724/setup.c3
-rw-r--r--arch/sh/boards/mach-sh7763rdp/setup.c1
-rw-r--r--arch/sh/drivers/pci/pci.c1
-rw-r--r--arch/sh/include/mach-kfr2r09/mach/kfr2r09.h2
-rw-r--r--arch/sh/kernel/cpu/sh2/setup-sh7619.c11
-rw-r--r--arch/sh/kernel/cpu/shmobile/cpuidle.c4
-rw-r--r--arch/sh/mm/fault.c9
-rw-r--r--arch/sh/mm/hugetlbpage.c5
-rw-r--r--arch/sparc/Kconfig2
-rw-r--r--arch/sparc/include/asm/switch_to_64.h4
-rw-r--r--arch/sparc/kernel/cpumap.c1
-rw-r--r--arch/sparc/kernel/entry.S2
-rw-r--r--arch/sparc/kernel/kgdb_64.c4
-rw-r--r--arch/sparc/kernel/ktlb.S3
-rw-r--r--arch/sparc/kernel/ptrace_64.c4
-rw-r--r--arch/sparc/kernel/setup_64.c12
-rw-r--r--arch/sparc/kernel/sys_sparc32.c12
-rw-r--r--arch/sparc/kernel/syscalls.S12
-rw-r--r--arch/sparc/kernel/trampoline_64.S2
-rw-r--r--arch/sparc/lib/ksyms.c9
-rw-r--r--arch/sparc/mm/fault_32.c12
-rw-r--r--arch/sparc/mm/fault_64.c6
-rw-r--r--arch/sparc/mm/hugetlbpage.c5
-rw-r--r--arch/tile/Kconfig35
-rw-r--r--arch/tile/Kconfig.debug14
-rw-r--r--arch/tile/Makefile4
-rw-r--r--arch/tile/configs/tilegx_defconfig241
-rw-r--r--arch/tile/configs/tilepro_defconfig87
-rw-r--r--arch/tile/gxio/Kconfig5
-rw-r--r--arch/tile/gxio/Makefile1
-rw-r--r--arch/tile/gxio/iorpc_mpipe.c114
-rw-r--r--arch/tile/gxio/iorpc_mpipe_info.c29
-rw-r--r--arch/tile/gxio/iorpc_trio.c49
-rw-r--r--arch/tile/gxio/iorpc_uart.c77
-rw-r--r--arch/tile/gxio/iorpc_usb_host.c8
-rw-r--r--arch/tile/gxio/mpipe.c43
-rw-r--r--arch/tile/gxio/uart.c87
-rw-r--r--arch/tile/gxio/usb_host.c8
-rw-r--r--arch/tile/include/arch/mpipe.h24
-rw-r--r--arch/tile/include/arch/mpipe_constants.h6
-rw-r--r--arch/tile/include/arch/mpipe_shm.h54
-rw-r--r--arch/tile/include/arch/trio.h39
-rw-r--r--arch/tile/include/arch/trio_constants.h10
-rw-r--r--arch/tile/include/arch/uart.h300
-rw-r--r--arch/tile/include/arch/uart_def.h120
-rw-r--r--arch/tile/include/asm/Kbuild3
-rw-r--r--arch/tile/include/asm/atomic.h52
-rw-r--r--arch/tile/include/asm/atomic_32.h102
-rw-r--r--arch/tile/include/asm/atomic_64.h42
-rw-r--r--arch/tile/include/asm/barrier.h4
-rw-r--r--arch/tile/include/asm/bitops.h41
-rw-r--r--arch/tile/include/asm/bitops_32.h2
-rw-r--r--arch/tile/include/asm/bitops_64.h8
-rw-r--r--arch/tile/include/asm/cache.h13
-rw-r--r--arch/tile/include/asm/cacheflush.h44
-rw-r--r--arch/tile/include/asm/cmpxchg.h93
-rw-r--r--arch/tile/include/asm/device.h5
-rw-r--r--arch/tile/include/asm/dma-mapping.h27
-rw-r--r--arch/tile/include/asm/elf.h10
-rw-r--r--arch/tile/include/asm/fixmap.h8
-rw-r--r--arch/tile/include/asm/ftrace.h22
-rw-r--r--arch/tile/include/asm/futex.h1
-rw-r--r--arch/tile/include/asm/homecache.h11
-rw-r--r--arch/tile/include/asm/io.h132
-rw-r--r--arch/tile/include/asm/irqflags.h21
-rw-r--r--arch/tile/include/asm/kdebug.h (renamed from arch/tile/include/asm/hw_irq.h)18
-rw-r--r--arch/tile/include/asm/kgdb.h71
-rw-r--r--arch/tile/include/asm/kprobes.h79
-rw-r--r--arch/tile/include/asm/mmu.h1
-rw-r--r--arch/tile/include/asm/mmu_context.h2
-rw-r--r--arch/tile/include/asm/mmzone.h2
-rw-r--r--arch/tile/include/asm/page.h60
-rw-r--r--arch/tile/include/asm/pci.h22
-rw-r--r--arch/tile/include/asm/pgtable_32.h16
-rw-r--r--arch/tile/include/asm/pgtable_64.h31
-rw-r--r--arch/tile/include/asm/processor.h84
-rw-r--r--arch/tile/include/asm/ptrace.h6
-rw-r--r--arch/tile/include/asm/sections.h8
-rw-r--r--arch/tile/include/asm/setup.h3
-rw-r--r--arch/tile/include/asm/smp.h2
-rw-r--r--arch/tile/include/asm/spinlock_64.h4
-rw-r--r--arch/tile/include/asm/string.h2
-rw-r--r--arch/tile/include/asm/thread_info.h6
-rw-r--r--arch/tile/include/asm/topology.h3
-rw-r--r--arch/tile/include/asm/traps.h13
-rw-r--r--arch/tile/include/asm/uaccess.h37
-rw-r--r--arch/tile/include/asm/unaligned.h14
-rw-r--r--arch/tile/include/asm/vdso.h49
-rw-r--r--arch/tile/include/gxio/iorpc_mpipe.h62
-rw-r--r--arch/tile/include/gxio/iorpc_mpipe_info.h14
-rw-r--r--arch/tile/include/gxio/iorpc_trio.h31
-rw-r--r--arch/tile/include/gxio/iorpc_uart.h40
-rw-r--r--arch/tile/include/gxio/iorpc_usb_host.h8
-rw-r--r--arch/tile/include/gxio/mpipe.h143
-rw-r--r--arch/tile/include/gxio/uart.h105
-rw-r--r--arch/tile/include/gxio/usb_host.h8
-rw-r--r--arch/tile/include/hv/drv_mpipe_intf.h3
-rw-r--r--arch/tile/include/hv/drv_trio_intf.h8
-rw-r--r--arch/tile/include/hv/drv_uart_intf.h33
-rw-r--r--arch/tile/include/hv/hypervisor.h61
-rw-r--r--arch/tile/include/uapi/arch/Kbuild1
-rw-r--r--arch/tile/include/uapi/arch/chip.h4
-rw-r--r--arch/tile/include/uapi/arch/chip_tile64.h258
-rw-r--r--arch/tile/include/uapi/arch/opcode_tilegx.h1
-rw-r--r--arch/tile/include/uapi/arch/opcode_tilepro.h1
-rw-r--r--arch/tile/include/uapi/arch/spr_def_32.h2
-rw-r--r--arch/tile/include/uapi/asm/auxvec.h3
-rw-r--r--arch/tile/include/uapi/asm/cachectl.h4
-rw-r--r--arch/tile/kernel/Makefile16
-rw-r--r--arch/tile/kernel/asm-offsets.c52
-rw-r--r--arch/tile/kernel/compat.c2
-rw-r--r--arch/tile/kernel/compat_signal.c3
-rw-r--r--arch/tile/kernel/early_printk.c47
-rw-r--r--arch/tile/kernel/entry.S16
-rw-r--r--arch/tile/kernel/ftrace.c246
-rw-r--r--arch/tile/kernel/futex_64.S55
-rw-r--r--arch/tile/kernel/hardwall.c28
-rw-r--r--arch/tile/kernel/head_32.S17
-rw-r--r--arch/tile/kernel/head_64.S46
-rw-r--r--arch/tile/kernel/hvglue.S74
-rw-r--r--arch/tile/kernel/hvglue.lds59
-rw-r--r--arch/tile/kernel/hvglue_trace.c266
-rw-r--r--arch/tile/kernel/intvec_32.S114
-rw-r--r--arch/tile/kernel/intvec_64.S305
-rw-r--r--arch/tile/kernel/irq.c8
-rw-r--r--arch/tile/kernel/kgdb.c499
-rw-r--r--arch/tile/kernel/kprobes.c528
-rw-r--r--arch/tile/kernel/mcount_64.S224
-rw-r--r--arch/tile/kernel/pci-dma.c74
-rw-r--r--arch/tile/kernel/pci.c33
-rw-r--r--arch/tile/kernel/pci_gx.c736
-rw-r--r--arch/tile/kernel/proc.c2
-rw-r--r--arch/tile/kernel/process.c116
-rw-r--r--arch/tile/kernel/ptrace.c19
-rw-r--r--arch/tile/kernel/reboot.c2
-rw-r--r--arch/tile/kernel/regs_32.S4
-rw-r--r--arch/tile/kernel/regs_64.S4
-rw-r--r--arch/tile/kernel/relocate_kernel_32.S27
-rw-r--r--arch/tile/kernel/relocate_kernel_64.S11
-rw-r--r--arch/tile/kernel/setup.c165
-rw-r--r--arch/tile/kernel/signal.c3
-rw-r--r--arch/tile/kernel/single_step.c118
-rw-r--r--arch/tile/kernel/smp.c22
-rw-r--r--arch/tile/kernel/smpboot.c8
-rw-r--r--arch/tile/kernel/stack.c51
-rw-r--r--arch/tile/kernel/sys.c4
-rw-r--r--arch/tile/kernel/sysfs.c76
-rw-r--r--arch/tile/kernel/time.c37
-rw-r--r--arch/tile/kernel/tlb.c8
-rw-r--r--arch/tile/kernel/traps.c89
-rw-r--r--arch/tile/kernel/unaligned.c1609
-rw-r--r--arch/tile/kernel/vdso.c212
-rw-r--r--arch/tile/kernel/vdso/Makefile118
-rw-r--r--arch/tile/kernel/vdso/vdso.S28
-rw-r--r--arch/tile/kernel/vdso/vdso.lds.S87
-rw-r--r--arch/tile/kernel/vdso/vdso32.S28
-rw-r--r--arch/tile/kernel/vdso/vgettimeofday.c107
-rw-r--r--arch/tile/kernel/vdso/vrt_sigreturn.S30
-rw-r--r--arch/tile/kernel/vmlinux.lds.S31
-rw-r--r--arch/tile/lib/Makefile16
-rw-r--r--arch/tile/lib/atomic_32.c133
-rw-r--r--arch/tile/lib/atomic_asm_32.S1
-rw-r--r--arch/tile/lib/cacheflush.c16
-rw-r--r--arch/tile/lib/exports.c7
-rw-r--r--arch/tile/lib/memchr_64.c2
-rw-r--r--arch/tile/lib/memcpy_32.S63
-rw-r--r--arch/tile/lib/memcpy_64.c264
-rw-r--r--arch/tile/lib/memcpy_tile64.c276
-rw-r--r--arch/tile/lib/memcpy_user_64.c2
-rw-r--r--arch/tile/lib/memset_32.c110
-rw-r--r--arch/tile/lib/memset_64.c9
-rw-r--r--arch/tile/lib/strchr_32.c2
-rw-r--r--arch/tile/lib/strchr_64.c2
-rw-r--r--arch/tile/lib/string-endian.h13
-rw-r--r--arch/tile/lib/strlen_32.c2
-rw-r--r--arch/tile/lib/strnlen_32.c47
-rw-r--r--arch/tile/lib/strnlen_64.c48
-rw-r--r--arch/tile/lib/usercopy_32.S36
-rw-r--r--arch/tile/lib/usercopy_64.S36
-rw-r--r--arch/tile/mm/elf.c99
-rw-r--r--arch/tile/mm/fault.c150
-rw-r--r--arch/tile/mm/highmem.c2
-rw-r--r--arch/tile/mm/homecache.c39
-rw-r--r--arch/tile/mm/hugetlbpage.c43
-rw-r--r--arch/tile/mm/init.c100
-rw-r--r--arch/tile/mm/migrate_32.S4
-rw-r--r--arch/tile/mm/migrate_64.S4
-rw-r--r--arch/tile/mm/mmap.c24
-rw-r--r--arch/tile/mm/pgtable.c79
-rw-r--r--arch/um/Kconfig.common1
-rw-r--r--arch/um/defconfig2
-rw-r--r--arch/um/drivers/ubd.h1
-rw-r--r--arch/um/drivers/ubd_kern.c72
-rw-r--r--arch/um/drivers/ubd_user.c5
-rw-r--r--arch/um/include/shared/os.h3
-rw-r--r--arch/um/kernel/Makefile2
-rw-r--r--arch/um/kernel/irq.c4
-rw-r--r--arch/um/kernel/maccess.c24
-rw-r--r--arch/um/kernel/trap.c22
-rw-r--r--arch/um/os-Linux/aio.c5
-rw-r--r--arch/um/os-Linux/file.c9
-rw-r--r--arch/um/os-Linux/main.c2
-rw-r--r--arch/um/os-Linux/process.c53
-rw-r--r--arch/um/os-Linux/sigio.c2
-rw-r--r--arch/um/os-Linux/util.c10
-rw-r--r--arch/unicore32/Kconfig1
-rw-r--r--arch/unicore32/mm/fault.c22
-rw-r--r--arch/x86/Kconfig59
-rw-r--r--arch/x86/Makefile8
-rw-r--r--arch/x86/boot/boot.h1
-rw-r--r--arch/x86/boot/compressed/head_32.S31
-rw-r--r--arch/x86/boot/compressed/head_64.S1
-rw-r--r--arch/x86/boot/compressed/misc.c77
-rw-r--r--arch/x86/boot/printf.c2
-rw-r--r--arch/x86/crypto/Makefile2
-rw-r--r--arch/x86/crypto/camellia_glue.c64
-rw-r--r--arch/x86/crypto/crct10dif-pcl-asm_64.S643
-rw-r--r--arch/x86/crypto/crct10dif-pclmul_glue.c151
-rw-r--r--arch/x86/ia32/ia32_signal.c2
-rw-r--r--arch/x86/ia32/ia32entry.S2
-rw-r--r--arch/x86/include/asm/acpi.h2
-rw-r--r--arch/x86/include/asm/alternative.h14
-rw-r--r--arch/x86/include/asm/apic.h2
-rw-r--r--arch/x86/include/asm/asm.h6
-rw-r--r--arch/x86/include/asm/bitops.h46
-rw-r--r--arch/x86/include/asm/checksum_32.h22
-rw-r--r--arch/x86/include/asm/checksum_64.h2
-rw-r--r--arch/x86/include/asm/cpufeature.h17
-rw-r--r--arch/x86/include/asm/dma-contiguous.h1
-rw-r--r--arch/x86/include/asm/e820.h2
-rw-r--r--arch/x86/include/asm/hw_irq.h120
-rw-r--r--arch/x86/include/asm/hypervisor.h2
-rw-r--r--arch/x86/include/asm/irq.h2
-rw-r--r--arch/x86/include/asm/jump_label.h9
-rw-r--r--arch/x86/include/asm/kprobes.h10
-rw-r--r--arch/x86/include/asm/kvm_host.h14
-rw-r--r--arch/x86/include/asm/kvm_para.h24
-rw-r--r--arch/x86/include/asm/mce.h16
-rw-r--r--arch/x86/include/asm/mmu_context.h20
-rw-r--r--arch/x86/include/asm/mutex_64.h30
-rw-r--r--arch/x86/include/asm/page_32_types.h2
-rw-r--r--arch/x86/include/asm/page_64_types.h5
-rw-r--r--arch/x86/include/asm/page_types.h5
-rw-r--r--arch/x86/include/asm/paravirt_types.h3
-rw-r--r--arch/x86/include/asm/pci.h30
-rw-r--r--arch/x86/include/asm/pgtable.h37
-rw-r--r--arch/x86/include/asm/pgtable_types.h3
-rw-r--r--arch/x86/include/asm/processor.h34
-rw-r--r--arch/x86/include/asm/pvclock.h1
-rw-r--r--arch/x86/include/asm/setup.h8
-rw-r--r--arch/x86/include/asm/special_insns.h2
-rw-r--r--arch/x86/include/asm/spinlock.h5
-rw-r--r--arch/x86/include/asm/switch_to.h4
-rw-r--r--arch/x86/include/asm/sync_bitops.h24
-rw-r--r--arch/x86/include/asm/syscall.h3
-rw-r--r--arch/x86/include/asm/syscalls.h6
-rw-r--r--arch/x86/include/asm/sysfb.h98
-rw-r--r--arch/x86/include/asm/tlbflush.h37
-rw-r--r--arch/x86/include/asm/topology.h3
-rw-r--r--arch/x86/include/asm/traps.h6
-rw-r--r--arch/x86/include/asm/tsc.h1
-rw-r--r--arch/x86/include/asm/uaccess.h7
-rw-r--r--arch/x86/include/asm/vmx.h2
-rw-r--r--arch/x86/include/asm/vvar.h2
-rw-r--r--arch/x86/include/asm/xen/hypervisor.h16
-rw-r--r--arch/x86/include/asm/xor_avx.h4
-rw-r--r--arch/x86/include/uapi/asm/vmx.h6
-rw-r--r--arch/x86/kernel/Makefile3
-rw-r--r--arch/x86/kernel/acpi/boot.c25
-rw-r--r--arch/x86/kernel/alternative.c155
-rw-r--r--arch/x86/kernel/amd_nb.c13
-rw-r--r--arch/x86/kernel/apic/apic.c12
-rw-r--r--arch/x86/kernel/apic/io_apic.c14
-rw-r--r--arch/x86/kernel/apm_32.c2
-rw-r--r--arch/x86/kernel/cpu/amd.c4
-rw-r--r--arch/x86/kernel/cpu/common.c4
-rw-r--r--arch/x86/kernel/cpu/hypervisor.c15
-rw-r--r--arch/x86/kernel/cpu/mcheck/mce-internal.h3
-rw-r--r--arch/x86/kernel/cpu/mcheck/mce.c28
-rw-r--r--arch/x86/kernel/cpu/mcheck/mce_intel.c42
-rw-r--r--arch/x86/kernel/cpu/mshyperv.c13
-rw-r--r--arch/x86/kernel/cpu/mtrr/generic.c2
-rw-r--r--arch/x86/kernel/cpu/perf_event.c12
-rw-r--r--arch/x86/kernel/cpu/perf_event.h2
-rw-r--r--arch/x86/kernel/cpu/perf_event_amd.c3
-rw-r--r--arch/x86/kernel/cpu/perf_event_intel.c182
-rw-r--r--arch/x86/kernel/cpu/perf_event_intel_ds.c33
-rw-r--r--arch/x86/kernel/cpu/perf_event_intel_uncore.c268
-rw-r--r--arch/x86/kernel/cpu/perf_event_intel_uncore.h10
-rw-r--r--arch/x86/kernel/cpu/vmware.c8
-rw-r--r--arch/x86/kernel/crash.c4
-rw-r--r--arch/x86/kernel/devicetree.c3
-rw-r--r--arch/x86/kernel/e820.c5
-rw-r--r--arch/x86/kernel/early-quirks.c154
-rw-r--r--arch/x86/kernel/entry_32.S3
-rw-r--r--arch/x86/kernel/entry_64.S15
-rw-r--r--arch/x86/kernel/head32.c2
-rw-r--r--arch/x86/kernel/head64.c2
-rw-r--r--arch/x86/kernel/head_32.S2
-rw-r--r--arch/x86/kernel/irq.c8
-rw-r--r--arch/x86/kernel/irq_work.c4
-rw-r--r--arch/x86/kernel/jump_label.c84
-rw-r--r--arch/x86/kernel/kprobes/common.h5
-rw-r--r--arch/x86/kernel/kprobes/core.c4
-rw-r--r--arch/x86/kernel/kprobes/opt.c115
-rw-r--r--arch/x86/kernel/kvm.c6
-rw-r--r--arch/x86/kernel/paravirt.c9
-rw-r--r--arch/x86/kernel/process.c2
-rw-r--r--arch/x86/kernel/process_32.c2
-rw-r--r--arch/x86/kernel/process_64.c4
-rw-r--r--arch/x86/kernel/pvclock.c44
-rw-r--r--arch/x86/kernel/reboot.c18
-rw-r--r--arch/x86/kernel/setup.c27
-rw-r--r--arch/x86/kernel/signal.c12
-rw-r--r--arch/x86/kernel/smp.c12
-rw-r--r--arch/x86/kernel/smpboot.c3
-rw-r--r--arch/x86/kernel/syscall_32.c2
-rw-r--r--arch/x86/kernel/syscall_64.c5
-rw-r--r--arch/x86/kernel/sysfb.c74
-rw-r--r--arch/x86/kernel/sysfb_efi.c214
-rw-r--r--arch/x86/kernel/sysfb_simplefb.c95
-rw-r--r--arch/x86/kernel/tboot.c10
-rw-r--r--arch/x86/kernel/traps.c4
-rw-r--r--arch/x86/kernel/tsc.c6
-rw-r--r--arch/x86/kernel/x86_init.c24
-rw-r--r--arch/x86/kvm/cpuid.c3
-rw-r--r--arch/x86/kvm/emulate.c14
-rw-r--r--arch/x86/kvm/lapic.c38
-rw-r--r--arch/x86/kvm/mmu.c206
-rw-r--r--arch/x86/kvm/mmu.h2
-rw-r--r--arch/x86/kvm/paging_tmpl.h198
-rw-r--r--arch/x86/kvm/pmu.c25
-rw-r--r--arch/x86/kvm/vmx.c454
-rw-r--r--arch/x86/kvm/x86.c224
-rw-r--r--arch/x86/lguest/boot.c10
-rw-r--r--arch/x86/lib/csum-wrappers_64.c12
-rw-r--r--arch/x86/lib/usercopy_64.c2
-rw-r--r--arch/x86/lib/x86-opcode-map.txt42
-rw-r--r--arch/x86/mm/fault.c43
-rw-r--r--arch/x86/mm/hugetlbpage.c8
-rw-r--r--arch/x86/mm/init.c4
-rw-r--r--arch/x86/mm/ioremap.c5
-rw-r--r--arch/x86/mm/srat.c11
-rw-r--r--arch/x86/mm/tlb.c14
-rw-r--r--arch/x86/oprofile/nmi_int.c18
-rw-r--r--arch/x86/oprofile/op_model_amd.c24
-rw-r--r--arch/x86/pci/acpi.c9
-rw-r--r--arch/x86/pci/i386.c4
-rw-r--r--arch/x86/pci/mmconfig-shared.c7
-rw-r--r--arch/x86/pci/mrst.c41
-rw-r--r--arch/x86/platform/efi/efi.c11
-rw-r--r--arch/x86/platform/mrst/mrst.c2
-rw-r--r--arch/x86/power/cpu.c8
-rw-r--r--arch/x86/power/hibernate_64.c12
-rw-r--r--arch/x86/tools/gen-insn-attr-x86.awk4
-rw-r--r--arch/x86/um/os-Linux/prctl.c2
-rw-r--r--arch/x86/vdso/vclock_gettime.c16
-rw-r--r--arch/x86/xen/enlighten.c9
-rw-r--r--arch/x86/xen/xen-ops.h16
-rw-r--r--arch/xtensa/Kconfig1
-rw-r--r--arch/xtensa/Makefile4
-rw-r--r--arch/xtensa/boot/Makefile2
-rw-r--r--arch/xtensa/configs/common_defconfig1
-rw-r--r--arch/xtensa/configs/iss_defconfig1
-rw-r--r--arch/xtensa/configs/s6105_defconfig1
-rw-r--r--arch/xtensa/include/asm/regs.h1
-rw-r--r--arch/xtensa/include/asm/timex.h6
-rw-r--r--arch/xtensa/kernel/align.S5
-rw-r--r--arch/xtensa/kernel/coprocessor.S9
-rw-r--r--arch/xtensa/kernel/entry.S387
-rw-r--r--arch/xtensa/kernel/setup.c7
-rw-r--r--arch/xtensa/kernel/time.c8
-rw-r--r--arch/xtensa/kernel/vectors.S250
-rw-r--r--arch/xtensa/kernel/xtensa_ksyms.c1
-rw-r--r--arch/xtensa/mm/fault.c2
1762 files changed, 53979 insertions, 43524 deletions
diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig
index 082d9b4b5472..35a300d4a9fb 100644
--- a/arch/alpha/Kconfig
+++ b/arch/alpha/Kconfig
@@ -7,7 +7,6 @@ config ALPHA
7 select HAVE_PCSPKR_PLATFORM 7 select HAVE_PCSPKR_PLATFORM
8 select HAVE_PERF_EVENTS 8 select HAVE_PERF_EVENTS
9 select HAVE_DMA_ATTRS 9 select HAVE_DMA_ATTRS
10 select HAVE_GENERIC_HARDIRQS
11 select VIRT_TO_BUS 10 select VIRT_TO_BUS
12 select GENERIC_IRQ_PROBE 11 select GENERIC_IRQ_PROBE
13 select AUTO_IRQ_AFFINITY if SMP 12 select AUTO_IRQ_AFFINITY if SMP
diff --git a/arch/alpha/lib/csum_partial_copy.c b/arch/alpha/lib/csum_partial_copy.c
index 40736da9bea8..ffb19b7da999 100644
--- a/arch/alpha/lib/csum_partial_copy.c
+++ b/arch/alpha/lib/csum_partial_copy.c
@@ -338,6 +338,11 @@ csum_partial_copy_from_user(const void __user *src, void *dst, int len,
338 unsigned long doff = 7 & (unsigned long) dst; 338 unsigned long doff = 7 & (unsigned long) dst;
339 339
340 if (len) { 340 if (len) {
341 if (!access_ok(VERIFY_READ, src, len)) {
342 *errp = -EFAULT;
343 memset(dst, 0, len);
344 return sum;
345 }
341 if (!doff) { 346 if (!doff) {
342 if (!soff) 347 if (!soff)
343 checksum = csum_partial_cfu_aligned( 348 checksum = csum_partial_cfu_aligned(
diff --git a/arch/alpha/mm/fault.c b/arch/alpha/mm/fault.c
index 0c4132dd3507..98838a05ba6d 100644
--- a/arch/alpha/mm/fault.c
+++ b/arch/alpha/mm/fault.c
@@ -89,8 +89,7 @@ do_page_fault(unsigned long address, unsigned long mmcsr,
89 const struct exception_table_entry *fixup; 89 const struct exception_table_entry *fixup;
90 int fault, si_code = SEGV_MAPERR; 90 int fault, si_code = SEGV_MAPERR;
91 siginfo_t info; 91 siginfo_t info;
92 unsigned int flags = (FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE | 92 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
93 (cause > 0 ? FAULT_FLAG_WRITE : 0));
94 93
95 /* As of EV6, a load into $31/$f31 is a prefetch, and never faults 94 /* As of EV6, a load into $31/$f31 is a prefetch, and never faults
96 (or is suppressed by the PALcode). Support that for older CPUs 95 (or is suppressed by the PALcode). Support that for older CPUs
@@ -115,7 +114,8 @@ do_page_fault(unsigned long address, unsigned long mmcsr,
115 if (address >= TASK_SIZE) 114 if (address >= TASK_SIZE)
116 goto vmalloc_fault; 115 goto vmalloc_fault;
117#endif 116#endif
118 117 if (user_mode(regs))
118 flags |= FAULT_FLAG_USER;
119retry: 119retry:
120 down_read(&mm->mmap_sem); 120 down_read(&mm->mmap_sem);
121 vma = find_vma(mm, address); 121 vma = find_vma(mm, address);
@@ -142,6 +142,7 @@ retry:
142 } else { 142 } else {
143 if (!(vma->vm_flags & VM_WRITE)) 143 if (!(vma->vm_flags & VM_WRITE))
144 goto bad_area; 144 goto bad_area;
145 flags |= FAULT_FLAG_WRITE;
145 } 146 }
146 147
147 /* If for any reason at all we couldn't handle the fault, 148 /* If for any reason at all we couldn't handle the fault,
diff --git a/arch/alpha/oprofile/common.c b/arch/alpha/oprofile/common.c
index b8ce18f485d3..310a4ce1dccc 100644
--- a/arch/alpha/oprofile/common.c
+++ b/arch/alpha/oprofile/common.c
@@ -106,7 +106,7 @@ op_axp_stop(void)
106} 106}
107 107
108static int 108static int
109op_axp_create_files(struct super_block *sb, struct dentry *root) 109op_axp_create_files(struct dentry *root)
110{ 110{
111 int i; 111 int i;
112 112
@@ -115,23 +115,23 @@ op_axp_create_files(struct super_block *sb, struct dentry *root)
115 char buf[4]; 115 char buf[4];
116 116
117 snprintf(buf, sizeof buf, "%d", i); 117 snprintf(buf, sizeof buf, "%d", i);
118 dir = oprofilefs_mkdir(sb, root, buf); 118 dir = oprofilefs_mkdir(root, buf);
119 119
120 oprofilefs_create_ulong(sb, dir, "enabled", &ctr[i].enabled); 120 oprofilefs_create_ulong(dir, "enabled", &ctr[i].enabled);
121 oprofilefs_create_ulong(sb, dir, "event", &ctr[i].event); 121 oprofilefs_create_ulong(dir, "event", &ctr[i].event);
122 oprofilefs_create_ulong(sb, dir, "count", &ctr[i].count); 122 oprofilefs_create_ulong(dir, "count", &ctr[i].count);
123 /* Dummies. */ 123 /* Dummies. */
124 oprofilefs_create_ulong(sb, dir, "kernel", &ctr[i].kernel); 124 oprofilefs_create_ulong(dir, "kernel", &ctr[i].kernel);
125 oprofilefs_create_ulong(sb, dir, "user", &ctr[i].user); 125 oprofilefs_create_ulong(dir, "user", &ctr[i].user);
126 oprofilefs_create_ulong(sb, dir, "unit_mask", &ctr[i].unit_mask); 126 oprofilefs_create_ulong(dir, "unit_mask", &ctr[i].unit_mask);
127 } 127 }
128 128
129 if (model->can_set_proc_mode) { 129 if (model->can_set_proc_mode) {
130 oprofilefs_create_ulong(sb, root, "enable_pal", 130 oprofilefs_create_ulong(root, "enable_pal",
131 &sys.enable_pal); 131 &sys.enable_pal);
132 oprofilefs_create_ulong(sb, root, "enable_kernel", 132 oprofilefs_create_ulong(root, "enable_kernel",
133 &sys.enable_kernel); 133 &sys.enable_kernel);
134 oprofilefs_create_ulong(sb, root, "enable_user", 134 oprofilefs_create_ulong(root, "enable_user",
135 &sys.enable_user); 135 &sys.enable_user);
136 } 136 }
137 137
diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig
index 68fcbb2d59e2..91dbb2757afd 100644
--- a/arch/arc/Kconfig
+++ b/arch/arc/Kconfig
@@ -20,7 +20,6 @@ config ARC
20 select GENERIC_SMP_IDLE_THREAD 20 select GENERIC_SMP_IDLE_THREAD
21 select HAVE_ARCH_KGDB 21 select HAVE_ARCH_KGDB
22 select HAVE_ARCH_TRACEHOOK 22 select HAVE_ARCH_TRACEHOOK
23 select HAVE_GENERIC_HARDIRQS
24 select HAVE_IOREMAP_PROT 23 select HAVE_IOREMAP_PROT
25 select HAVE_KPROBES 24 select HAVE_KPROBES
26 select HAVE_KRETPROBES 25 select HAVE_KRETPROBES
diff --git a/arch/arc/boot/.gitignore b/arch/arc/boot/.gitignore
new file mode 100644
index 000000000000..5d65b54bf17a
--- /dev/null
+++ b/arch/arc/boot/.gitignore
@@ -0,0 +1 @@
*.dtb*
diff --git a/arch/arc/include/asm/cache.h b/arch/arc/include/asm/cache.h
index 5802849a6cae..e4abdaac6f9f 100644
--- a/arch/arc/include/asm/cache.h
+++ b/arch/arc/include/asm/cache.h
@@ -57,7 +57,7 @@
57 57
58extern void arc_cache_init(void); 58extern void arc_cache_init(void);
59extern char *arc_cache_mumbojumbo(int cpu_id, char *buf, int len); 59extern char *arc_cache_mumbojumbo(int cpu_id, char *buf, int len);
60extern void __init read_decode_cache_bcr(void); 60extern void read_decode_cache_bcr(void);
61 61
62#endif /* !__ASSEMBLY__ */ 62#endif /* !__ASSEMBLY__ */
63 63
diff --git a/arch/arc/include/asm/delay.h b/arch/arc/include/asm/delay.h
index 442ce5d0f709..43de30256981 100644
--- a/arch/arc/include/asm/delay.h
+++ b/arch/arc/include/asm/delay.h
@@ -53,11 +53,10 @@ static inline void __udelay(unsigned long usecs)
53{ 53{
54 unsigned long loops; 54 unsigned long loops;
55 55
56 /* (long long) cast ensures 64 bit MPY - real or emulated 56 /* (u64) cast ensures 64 bit MPY - real or emulated
57 * HZ * 4295 is pre-evaluated by gcc - hence only 2 mpy ops 57 * HZ * 4295 is pre-evaluated by gcc - hence only 2 mpy ops
58 */ 58 */
59 loops = ((long long)(usecs * 4295 * HZ) * 59 loops = ((u64) usecs * 4295 * HZ * loops_per_jiffy) >> 32;
60 (long long)(loops_per_jiffy)) >> 32;
61 60
62 __delay(loops); 61 __delay(loops);
63} 62}
diff --git a/arch/arc/include/asm/entry.h b/arch/arc/include/asm/entry.h
index df57611652e5..884081099f80 100644
--- a/arch/arc/include/asm/entry.h
+++ b/arch/arc/include/asm/entry.h
@@ -365,7 +365,7 @@
365 * it to memory (non-SMP case) or SCRATCH0 Aux Reg (SMP). 365 * it to memory (non-SMP case) or SCRATCH0 Aux Reg (SMP).
366 * 366 *
367 * Before saving the full regfile - this reg is restored back, only 367 * Before saving the full regfile - this reg is restored back, only
368 * to be saved again on kernel mode stack, as part of ptregs. 368 * to be saved again on kernel mode stack, as part of pt_regs.
369 *-------------------------------------------------------------*/ 369 *-------------------------------------------------------------*/
370.macro EXCPN_PROLOG_FREEUP_REG reg 370.macro EXCPN_PROLOG_FREEUP_REG reg
371#ifdef CONFIG_SMP 371#ifdef CONFIG_SMP
@@ -384,6 +384,28 @@
384.endm 384.endm
385 385
386/*-------------------------------------------------------------- 386/*--------------------------------------------------------------
387 * Exception Entry prologue
388 * -Switches stack to K mode (if not already)
389 * -Saves the register file
390 *
391 * After this it is safe to call the "C" handlers
392 *-------------------------------------------------------------*/
393.macro EXCEPTION_PROLOGUE
394
395 /* Need at least 1 reg to code the early exception prologue */
396 EXCPN_PROLOG_FREEUP_REG r9
397
398 /* U/K mode at time of exception (stack not switched if already K) */
399 lr r9, [erstatus]
400
401 /* ARC700 doesn't provide auto-stack switching */
402 SWITCH_TO_KERNEL_STK
403
404 /* save the regfile */
405 SAVE_ALL_SYS
406.endm
407
408/*--------------------------------------------------------------
387 * Save all registers used by Exceptions (TLB Miss, Prot-V, Mem err etc) 409 * Save all registers used by Exceptions (TLB Miss, Prot-V, Mem err etc)
388 * Requires SP to be already switched to kernel mode Stack 410 * Requires SP to be already switched to kernel mode Stack
389 * sp points to the next free element on the stack at exit of this macro. 411 * sp points to the next free element on the stack at exit of this macro.
diff --git a/arch/arc/include/asm/io.h b/arch/arc/include/asm/io.h
index 473424d7528b..334ce7017a18 100644
--- a/arch/arc/include/asm/io.h
+++ b/arch/arc/include/asm/io.h
@@ -100,6 +100,10 @@ static inline void __raw_writel(u32 w, volatile void __iomem *addr)
100 100
101} 101}
102 102
103#define readb_relaxed readb
104#define readw_relaxed readw
105#define readl_relaxed readl
106
103#include <asm-generic/io.h> 107#include <asm-generic/io.h>
104 108
105#endif /* _ASM_ARC_IO_H */ 109#endif /* _ASM_ARC_IO_H */
diff --git a/arch/arc/include/asm/irqflags.h b/arch/arc/include/asm/irqflags.h
index d99f79bcf865..b68b53f458d1 100644
--- a/arch/arc/include/asm/irqflags.h
+++ b/arch/arc/include/asm/irqflags.h
@@ -157,13 +157,6 @@ static inline void arch_unmask_irq(unsigned int irq)
157 flag \scratch 157 flag \scratch
158.endm 158.endm
159 159
160.macro IRQ_DISABLE_SAVE scratch, save
161 lr \scratch, [status32]
162 mov \save, \scratch /* Make a copy */
163 bic \scratch, \scratch, (STATUS_E1_MASK | STATUS_E2_MASK)
164 flag \scratch
165.endm
166
167.macro IRQ_ENABLE scratch 160.macro IRQ_ENABLE scratch
168 lr \scratch, [status32] 161 lr \scratch, [status32]
169 or \scratch, \scratch, (STATUS_E1_MASK | STATUS_E2_MASK) 162 or \scratch, \scratch, (STATUS_E1_MASK | STATUS_E2_MASK)
diff --git a/arch/arc/include/asm/mmu.h b/arch/arc/include/asm/mmu.h
index 7c03fe61759c..c2663b32866b 100644
--- a/arch/arc/include/asm/mmu.h
+++ b/arch/arc/include/asm/mmu.h
@@ -32,6 +32,8 @@
32/* Error code if probe fails */ 32/* Error code if probe fails */
33#define TLB_LKUP_ERR 0x80000000 33#define TLB_LKUP_ERR 0x80000000
34 34
35#define TLB_DUP_ERR (TLB_LKUP_ERR | 0x00000001)
36
35/* TLB Commands */ 37/* TLB Commands */
36#define TLBWrite 0x1 38#define TLBWrite 0x1
37#define TLBRead 0x2 39#define TLBRead 0x2
@@ -46,21 +48,18 @@
46#ifndef __ASSEMBLY__ 48#ifndef __ASSEMBLY__
47 49
48typedef struct { 50typedef struct {
49 unsigned long asid; /* Pvt Addr-Space ID for mm */ 51 unsigned long asid; /* 8 bit MMU PID + Generation cycle */
50#ifdef CONFIG_ARC_TLB_DBG
51 struct task_struct *tsk;
52#endif
53} mm_context_t; 52} mm_context_t;
54 53
55#ifdef CONFIG_ARC_DBG_TLB_PARANOIA 54#ifdef CONFIG_ARC_DBG_TLB_PARANOIA
56void tlb_paranoid_check(unsigned int pid_sw, unsigned long address); 55void tlb_paranoid_check(unsigned int mm_asid, unsigned long address);
57#else 56#else
58#define tlb_paranoid_check(a, b) 57#define tlb_paranoid_check(a, b)
59#endif 58#endif
60 59
61void arc_mmu_init(void); 60void arc_mmu_init(void);
62extern char *arc_mmu_mumbojumbo(int cpu_id, char *buf, int len); 61extern char *arc_mmu_mumbojumbo(int cpu_id, char *buf, int len);
63void __init read_decode_mmu_bcr(void); 62void read_decode_mmu_bcr(void);
64 63
65#endif /* !__ASSEMBLY__ */ 64#endif /* !__ASSEMBLY__ */
66 65
diff --git a/arch/arc/include/asm/mmu_context.h b/arch/arc/include/asm/mmu_context.h
index 0d71fb11b57c..43a1b51bb8cc 100644
--- a/arch/arc/include/asm/mmu_context.h
+++ b/arch/arc/include/asm/mmu_context.h
@@ -34,95 +34,65 @@
34 * When it reaches max 255, the allocation cycle starts afresh by flushing 34 * When it reaches max 255, the allocation cycle starts afresh by flushing
35 * the entire TLB and wrapping ASID back to zero. 35 * the entire TLB and wrapping ASID back to zero.
36 * 36 *
37 * For book-keeping, Linux uses a couple of data-structures: 37 * A new allocation cycle, post rollover, could potentially reassign an ASID
38 * -mm_struct has an @asid field to keep a note of task's ASID (needed at the 38 * to a different task. Thus the rule is to refresh the ASID in a new cycle.
39 * time of say switch_mm( ) 39 * The 32 bit @asid_cache (and mm->asid) have 8 bits MMU PID and rest 24 bits
40 * -An array of mm structs @asid_mm_map[] for asid->mm the reverse mapping, 40 * serve as cycle/generation indicator and natural 32 bit unsigned math
41 * given an ASID, finding the mm struct associated. 41 * automagically increments the generation when lower 8 bits rollover.
42 *
43 * The round-robin allocation algorithm allows for ASID stealing.
44 * If asid tracker is at "x-1", a new req will allocate "x", even if "x" was
45 * already assigned to another (switched-out) task. Obviously the prev owner
46 * is marked with an invalid ASID to make it request for a new ASID when it
47 * gets scheduled next time. However its TLB entries (with ASID "x") could
48 * exist, which must be cleared before the same ASID is used by the new owner.
49 * Flushing them would be plausible but costly solution. Instead we force a
50 * allocation policy quirk, which ensures that a stolen ASID won't have any
51 * TLB entries associates, alleviating the need to flush.
52 * The quirk essentially is not allowing ASID allocated in prev cycle
53 * to be used past a roll-over in the next cycle.
54 * When this happens (i.e. task ASID > asid tracker), task needs to refresh
55 * its ASID, aligning it to current value of tracker. If the task doesn't get
56 * scheduled past a roll-over, hence its ASID is not yet realigned with
57 * tracker, such ASID is anyways safely reusable because it is
58 * gauranteed that TLB entries with that ASID wont exist.
59 */ 42 */
60 43
61#define FIRST_ASID 0 44#define MM_CTXT_ASID_MASK 0x000000ff /* MMU PID reg :8 bit PID */
62#define MAX_ASID 255 /* 8 bit PID field in PID Aux reg */ 45#define MM_CTXT_CYCLE_MASK (~MM_CTXT_ASID_MASK)
63#define NO_ASID (MAX_ASID + 1) /* ASID Not alloc to mmu ctxt */ 46
64#define NUM_ASID ((MAX_ASID - FIRST_ASID) + 1) 47#define MM_CTXT_FIRST_CYCLE (MM_CTXT_ASID_MASK + 1)
48#define MM_CTXT_NO_ASID 0UL
65 49
66/* ASID to mm struct mapping */ 50#define hw_pid(mm) (mm->context.asid & MM_CTXT_ASID_MASK)
67extern struct mm_struct *asid_mm_map[NUM_ASID + 1];
68 51
69extern int asid_cache; 52extern unsigned int asid_cache;
70 53
71/* 54/*
72 * Assign a new ASID to task. If the task already has an ASID, it is 55 * Get a new ASID if task doesn't have a valid one (unalloc or from prev cycle)
73 * relinquished. 56 * Also set the MMU PID register to existing/updated ASID
74 */ 57 */
75static inline void get_new_mmu_context(struct mm_struct *mm) 58static inline void get_new_mmu_context(struct mm_struct *mm)
76{ 59{
77 struct mm_struct *prev_owner;
78 unsigned long flags; 60 unsigned long flags;
79 61
80 local_irq_save(flags); 62 local_irq_save(flags);
81 63
82 /* 64 /*
83 * Relinquish the currently owned ASID (if any). 65 * Move to new ASID if it was not from current alloc-cycle/generation.
84 * Doing unconditionally saves a cmp-n-branch; for already unused 66 * This is done by ensuring that the generation bits in both mm->ASID
85 * ASID slot, the value was/remains NULL 67 * and cpu's ASID counter are exactly same.
68 *
69 * Note: Callers needing new ASID unconditionally, independent of
70 * generation, e.g. local_flush_tlb_mm() for forking parent,
71 * first need to destroy the context, setting it to invalid
72 * value.
86 */ 73 */
87 asid_mm_map[mm->context.asid] = (struct mm_struct *)NULL; 74 if (!((mm->context.asid ^ asid_cache) & MM_CTXT_CYCLE_MASK))
75 goto set_hw;
76
77 /* move to new ASID and handle rollover */
78 if (unlikely(!(++asid_cache & MM_CTXT_ASID_MASK))) {
88 79
89 /* move to new ASID */
90 if (++asid_cache > MAX_ASID) { /* ASID roll-over */
91 asid_cache = FIRST_ASID;
92 flush_tlb_all(); 80 flush_tlb_all();
93 }
94 81
95 /* 82 /*
96 * Is next ASID already owned by some-one else (we are stealing it). 83 * Above checke for rollover of 8 bit ASID in 32 bit container.
97 * If so, let the orig owner be aware of this, so when it runs, it 84 * If the container itself wrapped around, set it to a non zero
98 * asks for a brand new ASID. This would only happen for a long-lived 85 * "generation" to distinguish from no context
99 * task with ASID from prev allocation cycle (before ASID roll-over). 86 */
100 * 87 if (!asid_cache)
101 * This might look wrong - if we are re-using some other task's ASID, 88 asid_cache = MM_CTXT_FIRST_CYCLE;
102 * won't we use it's stale TLB entries too. Actually switch_mm( ) takes 89 }
103 * care of such a case: it ensures that task with ASID from prev alloc
104 * cycle, when scheduled will refresh it's ASID: see switch_mm( ) below
105 * The stealing scenario described here will only happen if that task
106 * didn't get a chance to refresh it's ASID - implying stale entries
107 * won't exist.
108 */
109 prev_owner = asid_mm_map[asid_cache];
110 if (prev_owner)
111 prev_owner->context.asid = NO_ASID;
112 90
113 /* Assign new ASID to tsk */ 91 /* Assign new ASID to tsk */
114 asid_mm_map[asid_cache] = mm;
115 mm->context.asid = asid_cache; 92 mm->context.asid = asid_cache;
116 93
117#ifdef CONFIG_ARC_TLB_DBG 94set_hw:
118 pr_info("ARC_TLB_DBG: NewMM=0x%x OldMM=0x%x task_struct=0x%x Task: %s," 95 write_aux_reg(ARC_REG_PID, hw_pid(mm) | MMU_ENABLE);
119 " pid:%u, assigned asid:%lu\n",
120 (unsigned int)mm, (unsigned int)prev_owner,
121 (unsigned int)(mm->context.tsk), (mm->context.tsk)->comm,
122 (mm->context.tsk)->pid, mm->context.asid);
123#endif
124
125 write_aux_reg(ARC_REG_PID, asid_cache | MMU_ENABLE);
126 96
127 local_irq_restore(flags); 97 local_irq_restore(flags);
128} 98}
@@ -134,10 +104,7 @@ static inline void get_new_mmu_context(struct mm_struct *mm)
134static inline int 104static inline int
135init_new_context(struct task_struct *tsk, struct mm_struct *mm) 105init_new_context(struct task_struct *tsk, struct mm_struct *mm)
136{ 106{
137 mm->context.asid = NO_ASID; 107 mm->context.asid = MM_CTXT_NO_ASID;
138#ifdef CONFIG_ARC_TLB_DBG
139 mm->context.tsk = tsk;
140#endif
141 return 0; 108 return 0;
142} 109}
143 110
@@ -152,40 +119,21 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
152 write_aux_reg(ARC_REG_SCRATCH_DATA0, next->pgd); 119 write_aux_reg(ARC_REG_SCRATCH_DATA0, next->pgd);
153#endif 120#endif
154 121
155 /* 122 get_new_mmu_context(next);
156 * Get a new ASID if task doesn't have a valid one. Possible when
157 * -task never had an ASID (fresh after fork)
158 * -it's ASID was stolen - past an ASID roll-over.
159 * -There's a third obscure scenario (if this task is running for the
160 * first time afer an ASID rollover), where despite having a valid
161 * ASID, we force a get for new ASID - see comments at top.
162 *
163 * Both the non-alloc scenario and first-use-after-rollover can be
164 * detected using the single condition below: NO_ASID = 256
165 * while asid_cache is always a valid ASID value (0-255).
166 */
167 if (next->context.asid > asid_cache) {
168 get_new_mmu_context(next);
169 } else {
170 /*
171 * XXX: This will never happen given the chks above
172 * BUG_ON(next->context.asid > MAX_ASID);
173 */
174 write_aux_reg(ARC_REG_PID, next->context.asid | MMU_ENABLE);
175 }
176
177} 123}
178 124
125/*
126 * Called at the time of execve() to get a new ASID
127 * Note the subtlety here: get_new_mmu_context() behaves differently here
128 * vs. in switch_mm(). Here it always returns a new ASID, because mm has
129 * an unallocated "initial" value, while in latter, it moves to a new ASID,
130 * only if it was unallocated
131 */
132#define activate_mm(prev, next) switch_mm(prev, next, NULL)
133
179static inline void destroy_context(struct mm_struct *mm) 134static inline void destroy_context(struct mm_struct *mm)
180{ 135{
181 unsigned long flags; 136 mm->context.asid = MM_CTXT_NO_ASID;
182
183 local_irq_save(flags);
184
185 asid_mm_map[mm->context.asid] = NULL;
186 mm->context.asid = NO_ASID;
187
188 local_irq_restore(flags);
189} 137}
190 138
191/* it seemed that deactivate_mm( ) is a reasonable place to do book-keeping 139/* it seemed that deactivate_mm( ) is a reasonable place to do book-keeping
@@ -197,17 +145,6 @@ static inline void destroy_context(struct mm_struct *mm)
197 */ 145 */
198#define deactivate_mm(tsk, mm) do { } while (0) 146#define deactivate_mm(tsk, mm) do { } while (0)
199 147
200static inline void activate_mm(struct mm_struct *prev, struct mm_struct *next)
201{
202#ifndef CONFIG_SMP
203 write_aux_reg(ARC_REG_SCRATCH_DATA0, next->pgd);
204#endif
205
206 /* Unconditionally get a new ASID */
207 get_new_mmu_context(next);
208
209}
210
211#define enter_lazy_tlb(mm, tsk) 148#define enter_lazy_tlb(mm, tsk)
212 149
213#endif /* __ASM_ARC_MMU_CONTEXT_H */ 150#endif /* __ASM_ARC_MMU_CONTEXT_H */
diff --git a/arch/arc/include/asm/pgtable.h b/arch/arc/include/asm/pgtable.h
index 4749a0eee1cf..6b0b7f7ef783 100644
--- a/arch/arc/include/asm/pgtable.h
+++ b/arch/arc/include/asm/pgtable.h
@@ -57,43 +57,31 @@
57 57
58#define _PAGE_ACCESSED (1<<1) /* Page is accessed (S) */ 58#define _PAGE_ACCESSED (1<<1) /* Page is accessed (S) */
59#define _PAGE_CACHEABLE (1<<2) /* Page is cached (H) */ 59#define _PAGE_CACHEABLE (1<<2) /* Page is cached (H) */
60#define _PAGE_U_EXECUTE (1<<3) /* Page has user execute perm (H) */ 60#define _PAGE_EXECUTE (1<<3) /* Page has user execute perm (H) */
61#define _PAGE_U_WRITE (1<<4) /* Page has user write perm (H) */ 61#define _PAGE_WRITE (1<<4) /* Page has user write perm (H) */
62#define _PAGE_U_READ (1<<5) /* Page has user read perm (H) */ 62#define _PAGE_READ (1<<5) /* Page has user read perm (H) */
63#define _PAGE_K_EXECUTE (1<<6) /* Page has kernel execute perm (H) */ 63#define _PAGE_MODIFIED (1<<6) /* Page modified (dirty) (S) */
64#define _PAGE_K_WRITE (1<<7) /* Page has kernel write perm (H) */ 64#define _PAGE_FILE (1<<7) /* page cache/ swap (S) */
65#define _PAGE_K_READ (1<<8) /* Page has kernel perm (H) */ 65#define _PAGE_GLOBAL (1<<8) /* Page is global (H) */
66#define _PAGE_GLOBAL (1<<9) /* Page is global (H) */ 66#define _PAGE_PRESENT (1<<10) /* TLB entry is valid (H) */
67#define _PAGE_MODIFIED (1<<10) /* Page modified (dirty) (S) */
68#define _PAGE_FILE (1<<10) /* page cache/ swap (S) */
69#define _PAGE_PRESENT (1<<11) /* TLB entry is valid (H) */
70 67
71#else 68#else /* MMU v3 onwards */
72 69
73/* PD1 */
74#define _PAGE_CACHEABLE (1<<0) /* Page is cached (H) */ 70#define _PAGE_CACHEABLE (1<<0) /* Page is cached (H) */
75#define _PAGE_U_EXECUTE (1<<1) /* Page has user execute perm (H) */ 71#define _PAGE_EXECUTE (1<<1) /* Page has user execute perm (H) */
76#define _PAGE_U_WRITE (1<<2) /* Page has user write perm (H) */ 72#define _PAGE_WRITE (1<<2) /* Page has user write perm (H) */
77#define _PAGE_U_READ (1<<3) /* Page has user read perm (H) */ 73#define _PAGE_READ (1<<3) /* Page has user read perm (H) */
78#define _PAGE_K_EXECUTE (1<<4) /* Page has kernel execute perm (H) */ 74#define _PAGE_ACCESSED (1<<4) /* Page is accessed (S) */
79#define _PAGE_K_WRITE (1<<5) /* Page has kernel write perm (H) */ 75#define _PAGE_MODIFIED (1<<5) /* Page modified (dirty) (S) */
80#define _PAGE_K_READ (1<<6) /* Page has kernel perm (H) */ 76#define _PAGE_FILE (1<<6) /* page cache/ swap (S) */
81#define _PAGE_ACCESSED (1<<7) /* Page is accessed (S) */
82
83/* PD0 */
84#define _PAGE_GLOBAL (1<<8) /* Page is global (H) */ 77#define _PAGE_GLOBAL (1<<8) /* Page is global (H) */
85#define _PAGE_PRESENT (1<<9) /* TLB entry is valid (H) */ 78#define _PAGE_PRESENT (1<<9) /* TLB entry is valid (H) */
86#define _PAGE_SHARED_CODE (1<<10) /* Shared Code page with cmn vaddr 79#define _PAGE_SHARED_CODE (1<<11) /* Shared Code page with cmn vaddr
87 usable for shared TLB entries (H) */ 80 usable for shared TLB entries (H) */
88
89#define _PAGE_MODIFIED (1<<11) /* Page modified (dirty) (S) */
90#define _PAGE_FILE (1<<12) /* page cache/ swap (S) */
91
92#define _PAGE_SHARED_CODE_H (1<<31) /* Hardware counterpart of above */
93#endif 81#endif
94 82
95/* Kernel allowed all permissions for all pages */ 83/* vmalloc permissions */
96#define _K_PAGE_PERMS (_PAGE_K_EXECUTE | _PAGE_K_WRITE | _PAGE_K_READ | \ 84#define _K_PAGE_PERMS (_PAGE_EXECUTE | _PAGE_WRITE | _PAGE_READ | \
97 _PAGE_GLOBAL | _PAGE_PRESENT) 85 _PAGE_GLOBAL | _PAGE_PRESENT)
98 86
99#ifdef CONFIG_ARC_CACHE_PAGES 87#ifdef CONFIG_ARC_CACHE_PAGES
@@ -109,10 +97,6 @@
109 */ 97 */
110#define ___DEF (_PAGE_PRESENT | _PAGE_DEF_CACHEABLE) 98#define ___DEF (_PAGE_PRESENT | _PAGE_DEF_CACHEABLE)
111 99
112#define _PAGE_READ (_PAGE_U_READ | _PAGE_K_READ)
113#define _PAGE_WRITE (_PAGE_U_WRITE | _PAGE_K_WRITE)
114#define _PAGE_EXECUTE (_PAGE_U_EXECUTE | _PAGE_K_EXECUTE)
115
116/* Set of bits not changed in pte_modify */ 100/* Set of bits not changed in pte_modify */
117#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_MODIFIED) 101#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_MODIFIED)
118 102
@@ -126,8 +110,8 @@
126 110
127#define PAGE_SHARED PAGE_U_W_R 111#define PAGE_SHARED PAGE_U_W_R
128 112
129/* While kernel runs out of unstrslated space, vmalloc/modules use a chunk of 113/* While kernel runs out of unstranslated space, vmalloc/modules use a chunk of
130 * kernel vaddr space - visible in all addr spaces, but kernel mode only 114 * user vaddr space - visible in all addr spaces, but kernel mode only
131 * Thus Global, all-kernel-access, no-user-access, cached 115 * Thus Global, all-kernel-access, no-user-access, cached
132 */ 116 */
133#define PAGE_KERNEL __pgprot(_K_PAGE_PERMS | _PAGE_DEF_CACHEABLE) 117#define PAGE_KERNEL __pgprot(_K_PAGE_PERMS | _PAGE_DEF_CACHEABLE)
@@ -136,10 +120,9 @@
136#define PAGE_KERNEL_NO_CACHE __pgprot(_K_PAGE_PERMS) 120#define PAGE_KERNEL_NO_CACHE __pgprot(_K_PAGE_PERMS)
137 121
138/* Masks for actual TLB "PD"s */ 122/* Masks for actual TLB "PD"s */
139#define PTE_BITS_IN_PD0 (_PAGE_GLOBAL | _PAGE_PRESENT) 123#define PTE_BITS_IN_PD0 (_PAGE_GLOBAL | _PAGE_PRESENT)
140#define PTE_BITS_IN_PD1 (PAGE_MASK | _PAGE_CACHEABLE | \ 124#define PTE_BITS_RWX (_PAGE_EXECUTE | _PAGE_WRITE | _PAGE_READ)
141 _PAGE_U_EXECUTE | _PAGE_U_WRITE | _PAGE_U_READ | \ 125#define PTE_BITS_NON_RWX_IN_PD1 (PAGE_MASK | _PAGE_CACHEABLE)
142 _PAGE_K_EXECUTE | _PAGE_K_WRITE | _PAGE_K_READ)
143 126
144/************************************************************************** 127/**************************************************************************
145 * Mapping of vm_flags (Generic VM) to PTE flags (arch specific) 128 * Mapping of vm_flags (Generic VM) to PTE flags (arch specific)
diff --git a/arch/arc/include/asm/ptrace.h b/arch/arc/include/asm/ptrace.h
index c9938e7a7dbd..1bfeec2c0558 100644
--- a/arch/arc/include/asm/ptrace.h
+++ b/arch/arc/include/asm/ptrace.h
@@ -20,27 +20,17 @@ struct pt_regs {
20 20
21 /* Real registers */ 21 /* Real registers */
22 long bta; /* bta_l1, bta_l2, erbta */ 22 long bta; /* bta_l1, bta_l2, erbta */
23 long lp_start; 23
24 long lp_end; 24 long lp_start, lp_end, lp_count;
25 long lp_count; 25
26 long status32; /* status32_l1, status32_l2, erstatus */ 26 long status32; /* status32_l1, status32_l2, erstatus */
27 long ret; /* ilink1, ilink2 or eret */ 27 long ret; /* ilink1, ilink2 or eret */
28 long blink; 28 long blink;
29 long fp; 29 long fp;
30 long r26; /* gp */ 30 long r26; /* gp */
31 long r12; 31
32 long r11; 32 long r12, r11, r10, r9, r8, r7, r6, r5, r4, r3, r2, r1, r0;
33 long r10; 33
34 long r9;
35 long r8;
36 long r7;
37 long r6;
38 long r5;
39 long r4;
40 long r3;
41 long r2;
42 long r1;
43 long r0;
44 long sp; /* user/kernel sp depending on where we came from */ 34 long sp; /* user/kernel sp depending on where we came from */
45 long orig_r0; 35 long orig_r0;
46 36
@@ -70,19 +60,7 @@ struct pt_regs {
70/* Callee saved registers - need to be saved only when you are scheduled out */ 60/* Callee saved registers - need to be saved only when you are scheduled out */
71 61
72struct callee_regs { 62struct callee_regs {
73 long r25; 63 long r25, r24, r23, r22, r21, r20, r19, r18, r17, r16, r15, r14, r13;
74 long r24;
75 long r23;
76 long r22;
77 long r21;
78 long r20;
79 long r19;
80 long r18;
81 long r17;
82 long r16;
83 long r15;
84 long r14;
85 long r13;
86}; 64};
87 65
88#define instruction_pointer(regs) ((regs)->ret) 66#define instruction_pointer(regs) ((regs)->ret)
diff --git a/arch/arc/include/asm/sections.h b/arch/arc/include/asm/sections.h
index 6fc1159dfefe..764f1e3ba752 100644
--- a/arch/arc/include/asm/sections.h
+++ b/arch/arc/include/asm/sections.h
@@ -11,7 +11,6 @@
11 11
12#include <asm-generic/sections.h> 12#include <asm-generic/sections.h>
13 13
14extern char _int_vec_base_lds[];
15extern char __arc_dccm_base[]; 14extern char __arc_dccm_base[];
16extern char __dtb_start[]; 15extern char __dtb_start[];
17 16
diff --git a/arch/arc/include/asm/spinlock_types.h b/arch/arc/include/asm/spinlock_types.h
index 8276bfd61704..662627ced4f2 100644
--- a/arch/arc/include/asm/spinlock_types.h
+++ b/arch/arc/include/asm/spinlock_types.h
@@ -20,9 +20,9 @@ typedef struct {
20#define __ARCH_SPIN_LOCK_LOCKED { __ARCH_SPIN_LOCK_LOCKED__ } 20#define __ARCH_SPIN_LOCK_LOCKED { __ARCH_SPIN_LOCK_LOCKED__ }
21 21
22/* 22/*
23 * Unlocked: 0x01_00_00_00 23 * Unlocked : 0x0100_0000
24 * Read lock(s): 0x00_FF_00_00 to say 0x01 24 * Read lock(s) : 0x00FF_FFFF to 0x01 (Multiple Readers decrement it)
25 * Write lock: 0x0, but only possible if prior value "unlocked" 0x0100_0000 25 * Write lock : 0x0, but only if prior value is "unlocked" 0x0100_0000
26 */ 26 */
27typedef struct { 27typedef struct {
28 volatile unsigned int counter; 28 volatile unsigned int counter;
diff --git a/arch/arc/kernel/.gitignore b/arch/arc/kernel/.gitignore
new file mode 100644
index 000000000000..c5f676c3c224
--- /dev/null
+++ b/arch/arc/kernel/.gitignore
@@ -0,0 +1 @@
vmlinux.lds
diff --git a/arch/arc/kernel/devtree.c b/arch/arc/kernel/devtree.c
index bdee3a812052..2340af0e1d6f 100644
--- a/arch/arc/kernel/devtree.c
+++ b/arch/arc/kernel/devtree.c
@@ -18,12 +18,6 @@
18#include <asm/clk.h> 18#include <asm/clk.h>
19#include <asm/mach_desc.h> 19#include <asm/mach_desc.h>
20 20
21/* called from unflatten_device_tree() to bootstrap devicetree itself */
22void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align)
23{
24 return __va(memblock_alloc(size, align));
25}
26
27/** 21/**
28 * setup_machine_fdt - Machine setup when an dtb was passed to the kernel 22 * setup_machine_fdt - Machine setup when an dtb was passed to the kernel
29 * @dt: virtual address pointer to dt blob 23 * @dt: virtual address pointer to dt blob
diff --git a/arch/arc/kernel/entry.S b/arch/arc/kernel/entry.S
index 1d7165156e17..b908dde8a331 100644
--- a/arch/arc/kernel/entry.S
+++ b/arch/arc/kernel/entry.S
@@ -267,12 +267,7 @@ ARC_EXIT handle_interrupt_level1
267 267
268ARC_ENTRY instr_service 268ARC_ENTRY instr_service
269 269
270 EXCPN_PROLOG_FREEUP_REG r9 270 EXCEPTION_PROLOGUE
271
272 lr r9, [erstatus]
273
274 SWITCH_TO_KERNEL_STK
275 SAVE_ALL_SYS
276 271
277 lr r0, [efa] 272 lr r0, [efa]
278 mov r1, sp 273 mov r1, sp
@@ -289,15 +284,13 @@ ARC_EXIT instr_service
289 284
290ARC_ENTRY mem_service 285ARC_ENTRY mem_service
291 286
292 EXCPN_PROLOG_FREEUP_REG r9 287 EXCEPTION_PROLOGUE
293
294 lr r9, [erstatus]
295
296 SWITCH_TO_KERNEL_STK
297 SAVE_ALL_SYS
298 288
299 lr r0, [efa] 289 lr r0, [efa]
300 mov r1, sp 290 mov r1, sp
291
292 FAKE_RET_FROM_EXCPN r9
293
301 bl do_memory_error 294 bl do_memory_error
302 b ret_from_exception 295 b ret_from_exception
303ARC_EXIT mem_service 296ARC_EXIT mem_service
@@ -308,11 +301,7 @@ ARC_EXIT mem_service
308 301
309ARC_ENTRY EV_MachineCheck 302ARC_ENTRY EV_MachineCheck
310 303
311 EXCPN_PROLOG_FREEUP_REG r9 304 EXCEPTION_PROLOGUE
312 lr r9, [erstatus]
313
314 SWITCH_TO_KERNEL_STK
315 SAVE_ALL_SYS
316 305
317 lr r2, [ecr] 306 lr r2, [ecr]
318 lr r0, [efa] 307 lr r0, [efa]
@@ -342,13 +331,7 @@ ARC_EXIT EV_MachineCheck
342 331
343ARC_ENTRY EV_TLBProtV 332ARC_ENTRY EV_TLBProtV
344 333
345 EXCPN_PROLOG_FREEUP_REG r9 334 EXCEPTION_PROLOGUE
346
347 ;Which mode (user/kernel) was the system in when Exception occured
348 lr r9, [erstatus]
349
350 SWITCH_TO_KERNEL_STK
351 SAVE_ALL_SYS
352 335
353 ;---------(3) Save some more regs----------------- 336 ;---------(3) Save some more regs-----------------
354 ; vineetg: Mar 6th: Random Seg Fault issue #1 337 ; vineetg: Mar 6th: Random Seg Fault issue #1
@@ -406,12 +389,7 @@ ARC_EXIT EV_TLBProtV
406; --------------------------------------------- 389; ---------------------------------------------
407ARC_ENTRY EV_PrivilegeV 390ARC_ENTRY EV_PrivilegeV
408 391
409 EXCPN_PROLOG_FREEUP_REG r9 392 EXCEPTION_PROLOGUE
410
411 lr r9, [erstatus]
412
413 SWITCH_TO_KERNEL_STK
414 SAVE_ALL_SYS
415 393
416 lr r0, [efa] 394 lr r0, [efa]
417 mov r1, sp 395 mov r1, sp
@@ -427,14 +405,13 @@ ARC_EXIT EV_PrivilegeV
427; --------------------------------------------- 405; ---------------------------------------------
428ARC_ENTRY EV_Extension 406ARC_ENTRY EV_Extension
429 407
430 EXCPN_PROLOG_FREEUP_REG r9 408 EXCEPTION_PROLOGUE
431 lr r9, [erstatus]
432
433 SWITCH_TO_KERNEL_STK
434 SAVE_ALL_SYS
435 409
436 lr r0, [efa] 410 lr r0, [efa]
437 mov r1, sp 411 mov r1, sp
412
413 FAKE_RET_FROM_EXCPN r9
414
438 bl do_extension_fault 415 bl do_extension_fault
439 b ret_from_exception 416 b ret_from_exception
440ARC_EXIT EV_Extension 417ARC_EXIT EV_Extension
@@ -526,14 +503,7 @@ trap_with_param:
526 503
527ARC_ENTRY EV_Trap 504ARC_ENTRY EV_Trap
528 505
529 ; Need at least 1 reg to code the early exception prolog 506 EXCEPTION_PROLOGUE
530 EXCPN_PROLOG_FREEUP_REG r9
531
532 ;Which mode (user/kernel) was the system in when intr occured
533 lr r9, [erstatus]
534
535 SWITCH_TO_KERNEL_STK
536 SAVE_ALL_SYS
537 507
538 ;------- (4) What caused the Trap -------------- 508 ;------- (4) What caused the Trap --------------
539 lr r12, [ecr] 509 lr r12, [ecr]
@@ -642,6 +612,9 @@ resume_kernel_mode:
642 612
643#ifdef CONFIG_PREEMPT 613#ifdef CONFIG_PREEMPT
644 614
615 ; This is a must for preempt_schedule_irq()
616 IRQ_DISABLE r9
617
645 ; Can't preempt if preemption disabled 618 ; Can't preempt if preemption disabled
646 GET_CURR_THR_INFO_FROM_SP r10 619 GET_CURR_THR_INFO_FROM_SP r10
647 ld r8, [r10, THREAD_INFO_PREEMPT_COUNT] 620 ld r8, [r10, THREAD_INFO_PREEMPT_COUNT]
@@ -651,8 +624,6 @@ resume_kernel_mode:
651 ld r9, [r10, THREAD_INFO_FLAGS] 624 ld r9, [r10, THREAD_INFO_FLAGS]
652 bbit0 r9, TIF_NEED_RESCHED, restore_regs 625 bbit0 r9, TIF_NEED_RESCHED, restore_regs
653 626
654 IRQ_DISABLE r9
655
656 ; Invoke PREEMPTION 627 ; Invoke PREEMPTION
657 bl preempt_schedule_irq 628 bl preempt_schedule_irq
658 629
@@ -665,12 +636,11 @@ resume_kernel_mode:
665; 636;
666; Restore the saved sys context (common exit-path for EXCPN/IRQ/Trap) 637; Restore the saved sys context (common exit-path for EXCPN/IRQ/Trap)
667; IRQ shd definitely not happen between now and rtie 638; IRQ shd definitely not happen between now and rtie
639; All 2 entry points to here already disable interrupts
668 640
669restore_regs : 641restore_regs :
670 642
671 ; Disable Interrupts while restoring reg-file back 643 lr r10, [status32]
672 ; XXX can this be optimised out
673 IRQ_DISABLE_SAVE r9, r10 ;@r10 has prisitine (pre-disable) copy
674 644
675 ; Restore REG File. In case multiple Events outstanding, 645 ; Restore REG File. In case multiple Events outstanding,
676 ; use the same priorty as rtie: EXCPN, L2 IRQ, L1 IRQ, None 646 ; use the same priorty as rtie: EXCPN, L2 IRQ, L1 IRQ, None
diff --git a/arch/arc/kernel/head.S b/arch/arc/kernel/head.S
index 2a913f85a747..0f944f024513 100644
--- a/arch/arc/kernel/head.S
+++ b/arch/arc/kernel/head.S
@@ -34,6 +34,9 @@ stext:
34 ; IDENTITY Reg [ 3 2 1 0 ] 34 ; IDENTITY Reg [ 3 2 1 0 ]
35 ; (cpu-id) ^^^ => Zero for UP ARC700 35 ; (cpu-id) ^^^ => Zero for UP ARC700
36 ; => #Core-ID if SMP (Master 0) 36 ; => #Core-ID if SMP (Master 0)
37 ; Note that non-boot CPUs might not land here if halt-on-reset and
38 ; instead breath life from @first_lines_of_secondary, but we still
39 ; need to make sure only boot cpu takes this path.
37 GET_CPU_ID r5 40 GET_CPU_ID r5
38 cmp r5, 0 41 cmp r5, 0
39 jnz arc_platform_smp_wait_to_boot 42 jnz arc_platform_smp_wait_to_boot
@@ -98,6 +101,8 @@ stext:
98 101
99first_lines_of_secondary: 102first_lines_of_secondary:
100 103
104 sr @_int_vec_base_lds, [AUX_INTR_VEC_BASE]
105
101 ; setup per-cpu idle task as "current" on this CPU 106 ; setup per-cpu idle task as "current" on this CPU
102 ld r0, [@secondary_idle_tsk] 107 ld r0, [@secondary_idle_tsk]
103 SET_CURR_TASK_ON_CPU r0, r1 108 SET_CURR_TASK_ON_CPU r0, r1
diff --git a/arch/arc/kernel/irq.c b/arch/arc/kernel/irq.c
index 305b3f866aa7..5fc92455da36 100644
--- a/arch/arc/kernel/irq.c
+++ b/arch/arc/kernel/irq.c
@@ -24,7 +24,6 @@
24 * -Needed for each CPU (hence not foldable into init_IRQ) 24 * -Needed for each CPU (hence not foldable into init_IRQ)
25 * 25 *
26 * what it does ? 26 * what it does ?
27 * -setup Vector Table Base Reg - in case Linux not linked at 0x8000_0000
28 * -Disable all IRQs (on CPU side) 27 * -Disable all IRQs (on CPU side)
29 * -Optionally, setup the High priority Interrupts as Level 2 IRQs 28 * -Optionally, setup the High priority Interrupts as Level 2 IRQs
30 */ 29 */
diff --git a/arch/arc/kernel/setup.c b/arch/arc/kernel/setup.c
index 6b083454d039..2c68bc7e6a78 100644
--- a/arch/arc/kernel/setup.c
+++ b/arch/arc/kernel/setup.c
@@ -47,10 +47,7 @@ void read_arc_build_cfg_regs(void)
47 READ_BCR(AUX_IDENTITY, cpu->core); 47 READ_BCR(AUX_IDENTITY, cpu->core);
48 48
49 cpu->timers = read_aux_reg(ARC_REG_TIMERS_BCR); 49 cpu->timers = read_aux_reg(ARC_REG_TIMERS_BCR);
50
51 cpu->vec_base = read_aux_reg(AUX_INTR_VEC_BASE); 50 cpu->vec_base = read_aux_reg(AUX_INTR_VEC_BASE);
52 if (cpu->vec_base == 0)
53 cpu->vec_base = (unsigned int)_int_vec_base_lds;
54 51
55 READ_BCR(ARC_REG_D_UNCACH_BCR, uncached_space); 52 READ_BCR(ARC_REG_D_UNCACH_BCR, uncached_space);
56 cpu->uncached_base = uncached_space.start << 24; 53 cpu->uncached_base = uncached_space.start << 24;
@@ -357,8 +354,6 @@ void __init setup_arch(char **cmdline_p)
357 */ 354 */
358 root_mountflags &= ~MS_RDONLY; 355 root_mountflags &= ~MS_RDONLY;
359 356
360 console_verbose();
361
362#if defined(CONFIG_VT) && defined(CONFIG_DUMMY_CONSOLE) 357#if defined(CONFIG_VT) && defined(CONFIG_DUMMY_CONSOLE)
363 conswitchp = &dummy_con; 358 conswitchp = &dummy_con;
364#endif 359#endif
diff --git a/arch/arc/kernel/unaligned.c b/arch/arc/kernel/unaligned.c
index c0f832f595d3..28d170060747 100644
--- a/arch/arc/kernel/unaligned.c
+++ b/arch/arc/kernel/unaligned.c
@@ -16,6 +16,16 @@
16#include <linux/uaccess.h> 16#include <linux/uaccess.h>
17#include <asm/disasm.h> 17#include <asm/disasm.h>
18 18
19#ifdef CONFIG_CPU_BIG_ENDIAN
20#define BE 1
21#define FIRST_BYTE_16 "swap %1, %1\n swape %1, %1\n"
22#define FIRST_BYTE_32 "swape %1, %1\n"
23#else
24#define BE 0
25#define FIRST_BYTE_16
26#define FIRST_BYTE_32
27#endif
28
19#define __get8_unaligned_check(val, addr, err) \ 29#define __get8_unaligned_check(val, addr, err) \
20 __asm__( \ 30 __asm__( \
21 "1: ldb.ab %1, [%2, 1]\n" \ 31 "1: ldb.ab %1, [%2, 1]\n" \
@@ -36,9 +46,9 @@
36 do { \ 46 do { \
37 unsigned int err = 0, v, a = addr; \ 47 unsigned int err = 0, v, a = addr; \
38 __get8_unaligned_check(v, a, err); \ 48 __get8_unaligned_check(v, a, err); \
39 val = v ; \ 49 val = v << ((BE) ? 8 : 0); \
40 __get8_unaligned_check(v, a, err); \ 50 __get8_unaligned_check(v, a, err); \
41 val |= v << 8; \ 51 val |= v << ((BE) ? 0 : 8); \
42 if (err) \ 52 if (err) \
43 goto fault; \ 53 goto fault; \
44 } while (0) 54 } while (0)
@@ -47,13 +57,13 @@
47 do { \ 57 do { \
48 unsigned int err = 0, v, a = addr; \ 58 unsigned int err = 0, v, a = addr; \
49 __get8_unaligned_check(v, a, err); \ 59 __get8_unaligned_check(v, a, err); \
50 val = v << 0; \ 60 val = v << ((BE) ? 24 : 0); \
51 __get8_unaligned_check(v, a, err); \ 61 __get8_unaligned_check(v, a, err); \
52 val |= v << 8; \ 62 val |= v << ((BE) ? 16 : 8); \
53 __get8_unaligned_check(v, a, err); \ 63 __get8_unaligned_check(v, a, err); \
54 val |= v << 16; \ 64 val |= v << ((BE) ? 8 : 16); \
55 __get8_unaligned_check(v, a, err); \ 65 __get8_unaligned_check(v, a, err); \
56 val |= v << 24; \ 66 val |= v << ((BE) ? 0 : 24); \
57 if (err) \ 67 if (err) \
58 goto fault; \ 68 goto fault; \
59 } while (0) 69 } while (0)
@@ -63,6 +73,7 @@
63 unsigned int err = 0, v = val, a = addr;\ 73 unsigned int err = 0, v = val, a = addr;\
64 \ 74 \
65 __asm__( \ 75 __asm__( \
76 FIRST_BYTE_16 \
66 "1: stb.ab %1, [%2, 1]\n" \ 77 "1: stb.ab %1, [%2, 1]\n" \
67 " lsr %1, %1, 8\n" \ 78 " lsr %1, %1, 8\n" \
68 "2: stb %1, [%2]\n" \ 79 "2: stb %1, [%2]\n" \
@@ -87,8 +98,9 @@
87#define put32_unaligned_check(val, addr) \ 98#define put32_unaligned_check(val, addr) \
88 do { \ 99 do { \
89 unsigned int err = 0, v = val, a = addr;\ 100 unsigned int err = 0, v = val, a = addr;\
90 __asm__( \
91 \ 101 \
102 __asm__( \
103 FIRST_BYTE_32 \
92 "1: stb.ab %1, [%2, 1]\n" \ 104 "1: stb.ab %1, [%2, 1]\n" \
93 " lsr %1, %1, 8\n" \ 105 " lsr %1, %1, 8\n" \
94 "2: stb.ab %1, [%2, 1]\n" \ 106 "2: stb.ab %1, [%2, 1]\n" \
diff --git a/arch/arc/mm/cache_arc700.c b/arch/arc/mm/cache_arc700.c
index f415d851b765..5a1259cd948c 100644
--- a/arch/arc/mm/cache_arc700.c
+++ b/arch/arc/mm/cache_arc700.c
@@ -622,12 +622,12 @@ void flush_icache_range(unsigned long kstart, unsigned long kend)
622/* 622/*
623 * General purpose helper to make I and D cache lines consistent. 623 * General purpose helper to make I and D cache lines consistent.
624 * @paddr is phy addr of region 624 * @paddr is phy addr of region
625 * @vaddr is typically user or kernel vaddr (vmalloc) 625 * @vaddr is typically user vaddr (breakpoint) or kernel vaddr (vmalloc)
626 * Howver in one instance, flush_icache_range() by kprobe (for a breakpt in 626 * However in one instance, when called by kprobe (for a breakpt in
627 * builtin kernel code) @vaddr will be paddr only, meaning CDU operation will 627 * builtin kernel code) @vaddr will be paddr only, meaning CDU operation will
628 * use a paddr to index the cache (despite VIPT). This is fine since since a 628 * use a paddr to index the cache (despite VIPT). This is fine since since a
629 * built-in kernel page will not have any virtual mappings (not even kernel) 629 * builtin kernel page will not have any virtual mappings.
630 * kprobe on loadable module is different as it will have kvaddr. 630 * kprobe on loadable module will be kernel vaddr.
631 */ 631 */
632void __sync_icache_dcache(unsigned long paddr, unsigned long vaddr, int len) 632void __sync_icache_dcache(unsigned long paddr, unsigned long vaddr, int len)
633{ 633{
diff --git a/arch/arc/mm/fault.c b/arch/arc/mm/fault.c
index 0fd1f0d515ff..d63f3de0cd5b 100644
--- a/arch/arc/mm/fault.c
+++ b/arch/arc/mm/fault.c
@@ -60,8 +60,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long address)
60 siginfo_t info; 60 siginfo_t info;
61 int fault, ret; 61 int fault, ret;
62 int write = regs->ecr_cause & ECR_C_PROTV_STORE; /* ST/EX */ 62 int write = regs->ecr_cause & ECR_C_PROTV_STORE; /* ST/EX */
63 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE | 63 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
64 (write ? FAULT_FLAG_WRITE : 0);
65 64
66 /* 65 /*
67 * We fault-in kernel-space virtual memory on-demand. The 66 * We fault-in kernel-space virtual memory on-demand. The
@@ -89,6 +88,8 @@ void do_page_fault(struct pt_regs *regs, unsigned long address)
89 if (in_atomic() || !mm) 88 if (in_atomic() || !mm)
90 goto no_context; 89 goto no_context;
91 90
91 if (user_mode(regs))
92 flags |= FAULT_FLAG_USER;
92retry: 93retry:
93 down_read(&mm->mmap_sem); 94 down_read(&mm->mmap_sem);
94 vma = find_vma(mm, address); 95 vma = find_vma(mm, address);
@@ -117,12 +118,12 @@ good_area:
117 if (write) { 118 if (write) {
118 if (!(vma->vm_flags & VM_WRITE)) 119 if (!(vma->vm_flags & VM_WRITE))
119 goto bad_area; 120 goto bad_area;
121 flags |= FAULT_FLAG_WRITE;
120 } else { 122 } else {
121 if (!(vma->vm_flags & (VM_READ | VM_EXEC))) 123 if (!(vma->vm_flags & (VM_READ | VM_EXEC)))
122 goto bad_area; 124 goto bad_area;
123 } 125 }
124 126
125survive:
126 /* 127 /*
127 * If for any reason at all we couldn't handle the fault, 128 * If for any reason at all we couldn't handle the fault,
128 * make sure we exit gracefully rather than endlessly redo 129 * make sure we exit gracefully rather than endlessly redo
@@ -201,10 +202,6 @@ no_context:
201 die("Oops", regs, address); 202 die("Oops", regs, address);
202 203
203out_of_memory: 204out_of_memory:
204 if (is_global_init(tsk)) {
205 yield();
206 goto survive;
207 }
208 up_read(&mm->mmap_sem); 205 up_read(&mm->mmap_sem);
209 206
210 if (user_mode(regs)) { 207 if (user_mode(regs)) {
diff --git a/arch/arc/mm/init.c b/arch/arc/mm/init.c
index a08ce7185423..81279ec73a6a 100644
--- a/arch/arc/mm/init.c
+++ b/arch/arc/mm/init.c
@@ -127,9 +127,8 @@ void __init free_initrd_mem(unsigned long start, unsigned long end)
127#endif 127#endif
128 128
129#ifdef CONFIG_OF_FLATTREE 129#ifdef CONFIG_OF_FLATTREE
130void __init early_init_dt_setup_initrd_arch(unsigned long start, 130void __init early_init_dt_setup_initrd_arch(u64 start, u64 end)
131 unsigned long end)
132{ 131{
133 pr_err("%s(%lx, %lx)\n", __func__, start, end); 132 pr_err("%s(%llx, %llx)\n", __func__, start, end);
134} 133}
135#endif /* CONFIG_OF_FLATTREE */ 134#endif /* CONFIG_OF_FLATTREE */
diff --git a/arch/arc/mm/tlb.c b/arch/arc/mm/tlb.c
index 7957dc4e4d4a..71cb26df4255 100644
--- a/arch/arc/mm/tlb.c
+++ b/arch/arc/mm/tlb.c
@@ -52,6 +52,7 @@
52 */ 52 */
53 53
54#include <linux/module.h> 54#include <linux/module.h>
55#include <linux/bug.h>
55#include <asm/arcregs.h> 56#include <asm/arcregs.h>
56#include <asm/setup.h> 57#include <asm/setup.h>
57#include <asm/mmu_context.h> 58#include <asm/mmu_context.h>
@@ -99,48 +100,45 @@
99 100
100 101
101/* A copy of the ASID from the PID reg is kept in asid_cache */ 102/* A copy of the ASID from the PID reg is kept in asid_cache */
102int asid_cache = FIRST_ASID; 103unsigned int asid_cache = MM_CTXT_FIRST_CYCLE;
103
104/* ASID to mm struct mapping. We have one extra entry corresponding to
105 * NO_ASID to save us a compare when clearing the mm entry for old asid
106 * see get_new_mmu_context (asm-arc/mmu_context.h)
107 */
108struct mm_struct *asid_mm_map[NUM_ASID + 1];
109 104
110/* 105/*
111 * Utility Routine to erase a J-TLB entry 106 * Utility Routine to erase a J-TLB entry
112 * The procedure is to look it up in the MMU. If found, ERASE it by 107 * Caller needs to setup Index Reg (manually or via getIndex)
113 * issuing a TlbWrite CMD with PD0 = PD1 = 0
114 */ 108 */
115 109static inline void __tlb_entry_erase(void)
116static void __tlb_entry_erase(void)
117{ 110{
118 write_aux_reg(ARC_REG_TLBPD1, 0); 111 write_aux_reg(ARC_REG_TLBPD1, 0);
119 write_aux_reg(ARC_REG_TLBPD0, 0); 112 write_aux_reg(ARC_REG_TLBPD0, 0);
120 write_aux_reg(ARC_REG_TLBCOMMAND, TLBWrite); 113 write_aux_reg(ARC_REG_TLBCOMMAND, TLBWrite);
121} 114}
122 115
123static void tlb_entry_erase(unsigned int vaddr_n_asid) 116static inline unsigned int tlb_entry_lkup(unsigned long vaddr_n_asid)
124{ 117{
125 unsigned int idx; 118 unsigned int idx;
126 119
127 /* Locate the TLB entry for this vaddr + ASID */
128 write_aux_reg(ARC_REG_TLBPD0, vaddr_n_asid); 120 write_aux_reg(ARC_REG_TLBPD0, vaddr_n_asid);
121
129 write_aux_reg(ARC_REG_TLBCOMMAND, TLBProbe); 122 write_aux_reg(ARC_REG_TLBCOMMAND, TLBProbe);
130 idx = read_aux_reg(ARC_REG_TLBINDEX); 123 idx = read_aux_reg(ARC_REG_TLBINDEX);
131 124
125 return idx;
126}
127
128static void tlb_entry_erase(unsigned int vaddr_n_asid)
129{
130 unsigned int idx;
131
132 /* Locate the TLB entry for this vaddr + ASID */
133 idx = tlb_entry_lkup(vaddr_n_asid);
134
132 /* No error means entry found, zero it out */ 135 /* No error means entry found, zero it out */
133 if (likely(!(idx & TLB_LKUP_ERR))) { 136 if (likely(!(idx & TLB_LKUP_ERR))) {
134 __tlb_entry_erase(); 137 __tlb_entry_erase();
135 } else { /* Some sort of Error */ 138 } else {
136
137 /* Duplicate entry error */ 139 /* Duplicate entry error */
138 if (idx & 0x1) { 140 WARN(idx == TLB_DUP_ERR, "Probe returned Dup PD for %x\n",
139 /* TODO we need to handle this case too */ 141 vaddr_n_asid);
140 pr_emerg("unhandled Duplicate flush for %x\n",
141 vaddr_n_asid);
142 }
143 /* else entry not found so nothing to do */
144 } 142 }
145} 143}
146 144
@@ -159,7 +157,7 @@ static void utlb_invalidate(void)
159{ 157{
160#if (CONFIG_ARC_MMU_VER >= 2) 158#if (CONFIG_ARC_MMU_VER >= 2)
161 159
162#if (CONFIG_ARC_MMU_VER < 3) 160#if (CONFIG_ARC_MMU_VER == 2)
163 /* MMU v2 introduced the uTLB Flush command. 161 /* MMU v2 introduced the uTLB Flush command.
164 * There was however an obscure hardware bug, where uTLB flush would 162 * There was however an obscure hardware bug, where uTLB flush would
165 * fail when a prior probe for J-TLB (both totally unrelated) would 163 * fail when a prior probe for J-TLB (both totally unrelated) would
@@ -182,6 +180,36 @@ static void utlb_invalidate(void)
182 180
183} 181}
184 182
183static void tlb_entry_insert(unsigned int pd0, unsigned int pd1)
184{
185 unsigned int idx;
186
187 /*
188 * First verify if entry for this vaddr+ASID already exists
189 * This also sets up PD0 (vaddr, ASID..) for final commit
190 */
191 idx = tlb_entry_lkup(pd0);
192
193 /*
194 * If Not already present get a free slot from MMU.
195 * Otherwise, Probe would have located the entry and set INDEX Reg
196 * with existing location. This will cause Write CMD to over-write
197 * existing entry with new PD0 and PD1
198 */
199 if (likely(idx & TLB_LKUP_ERR))
200 write_aux_reg(ARC_REG_TLBCOMMAND, TLBGetIndex);
201
202 /* setup the other half of TLB entry (pfn, rwx..) */
203 write_aux_reg(ARC_REG_TLBPD1, pd1);
204
205 /*
206 * Commit the Entry to MMU
207 * It doesnt sound safe to use the TLBWriteNI cmd here
208 * which doesn't flush uTLBs. I'd rather be safe than sorry.
209 */
210 write_aux_reg(ARC_REG_TLBCOMMAND, TLBWrite);
211}
212
185/* 213/*
186 * Un-conditionally (without lookup) erase the entire MMU contents 214 * Un-conditionally (without lookup) erase the entire MMU contents
187 */ 215 */
@@ -224,13 +252,14 @@ noinline void local_flush_tlb_mm(struct mm_struct *mm)
224 return; 252 return;
225 253
226 /* 254 /*
227 * Workaround for Android weirdism: 255 * - Move to a new ASID, but only if the mm is still wired in
228 * A binder VMA could end up in a task such that vma->mm != tsk->mm 256 * (Android Binder ended up calling this for vma->mm != tsk->mm,
229 * old code would cause h/w - s/w ASID to get out of sync 257 * causing h/w - s/w ASID to get out of sync)
258 * - Also get_new_mmu_context() new implementation allocates a new
259 * ASID only if it is not allocated already - so unallocate first
230 */ 260 */
231 if (current->mm != mm) 261 destroy_context(mm);
232 destroy_context(mm); 262 if (current->mm == mm)
233 else
234 get_new_mmu_context(mm); 263 get_new_mmu_context(mm);
235} 264}
236 265
@@ -246,7 +275,6 @@ void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
246 unsigned long end) 275 unsigned long end)
247{ 276{
248 unsigned long flags; 277 unsigned long flags;
249 unsigned int asid;
250 278
251 /* If range @start to @end is more than 32 TLB entries deep, 279 /* If range @start to @end is more than 32 TLB entries deep,
252 * its better to move to a new ASID rather than searching for 280 * its better to move to a new ASID rather than searching for
@@ -268,11 +296,10 @@ void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
268 start &= PAGE_MASK; 296 start &= PAGE_MASK;
269 297
270 local_irq_save(flags); 298 local_irq_save(flags);
271 asid = vma->vm_mm->context.asid;
272 299
273 if (asid != NO_ASID) { 300 if (vma->vm_mm->context.asid != MM_CTXT_NO_ASID) {
274 while (start < end) { 301 while (start < end) {
275 tlb_entry_erase(start | (asid & 0xff)); 302 tlb_entry_erase(start | hw_pid(vma->vm_mm));
276 start += PAGE_SIZE; 303 start += PAGE_SIZE;
277 } 304 }
278 } 305 }
@@ -326,9 +353,8 @@ void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
326 */ 353 */
327 local_irq_save(flags); 354 local_irq_save(flags);
328 355
329 if (vma->vm_mm->context.asid != NO_ASID) { 356 if (vma->vm_mm->context.asid != MM_CTXT_NO_ASID) {
330 tlb_entry_erase((page & PAGE_MASK) | 357 tlb_entry_erase((page & PAGE_MASK) | hw_pid(vma->vm_mm));
331 (vma->vm_mm->context.asid & 0xff));
332 utlb_invalidate(); 358 utlb_invalidate();
333 } 359 }
334 360
@@ -341,8 +367,8 @@ void local_flush_tlb_page(struct vm_area_struct *vma, unsigned long page)
341void create_tlb(struct vm_area_struct *vma, unsigned long address, pte_t *ptep) 367void create_tlb(struct vm_area_struct *vma, unsigned long address, pte_t *ptep)
342{ 368{
343 unsigned long flags; 369 unsigned long flags;
344 unsigned int idx, asid_or_sasid; 370 unsigned int asid_or_sasid, rwx;
345 unsigned long pd0_flags; 371 unsigned long pd0, pd1;
346 372
347 /* 373 /*
348 * create_tlb() assumes that current->mm == vma->mm, since 374 * create_tlb() assumes that current->mm == vma->mm, since
@@ -381,40 +407,30 @@ void create_tlb(struct vm_area_struct *vma, unsigned long address, pte_t *ptep)
381 /* update this PTE credentials */ 407 /* update this PTE credentials */
382 pte_val(*ptep) |= (_PAGE_PRESENT | _PAGE_ACCESSED); 408 pte_val(*ptep) |= (_PAGE_PRESENT | _PAGE_ACCESSED);
383 409
384 /* Create HW TLB entry Flags (in PD0) from PTE Flags */ 410 /* Create HW TLB(PD0,PD1) from PTE */
385#if (CONFIG_ARC_MMU_VER <= 2)
386 pd0_flags = ((pte_val(*ptep) & PTE_BITS_IN_PD0) >> 1);
387#else
388 pd0_flags = ((pte_val(*ptep) & PTE_BITS_IN_PD0));
389#endif
390 411
391 /* ASID for this task */ 412 /* ASID for this task */
392 asid_or_sasid = read_aux_reg(ARC_REG_PID) & 0xff; 413 asid_or_sasid = read_aux_reg(ARC_REG_PID) & 0xff;
393 414
394 write_aux_reg(ARC_REG_TLBPD0, address | pd0_flags | asid_or_sasid); 415 pd0 = address | asid_or_sasid | (pte_val(*ptep) & PTE_BITS_IN_PD0);
395
396 /* Load remaining info in PD1 (Page Frame Addr and Kx/Kw/Kr Flags) */
397 write_aux_reg(ARC_REG_TLBPD1, (pte_val(*ptep) & PTE_BITS_IN_PD1));
398
399 /* First verify if entry for this vaddr+ASID already exists */
400 write_aux_reg(ARC_REG_TLBCOMMAND, TLBProbe);
401 idx = read_aux_reg(ARC_REG_TLBINDEX);
402 416
403 /* 417 /*
404 * If Not already present get a free slot from MMU. 418 * ARC MMU provides fully orthogonal access bits for K/U mode,
405 * Otherwise, Probe would have located the entry and set INDEX Reg 419 * however Linux only saves 1 set to save PTE real-estate
406 * with existing location. This will cause Write CMD to over-write 420 * Here we convert 3 PTE bits into 6 MMU bits:
407 * existing entry with new PD0 and PD1 421 * -Kernel only entries have Kr Kw Kx 0 0 0
422 * -User entries have mirrored K and U bits
408 */ 423 */
409 if (likely(idx & TLB_LKUP_ERR)) 424 rwx = pte_val(*ptep) & PTE_BITS_RWX;
410 write_aux_reg(ARC_REG_TLBCOMMAND, TLBGetIndex);
411 425
412 /* 426 if (pte_val(*ptep) & _PAGE_GLOBAL)
413 * Commit the Entry to MMU 427 rwx <<= 3; /* r w x => Kr Kw Kx 0 0 0 */
414 * It doesnt sound safe to use the TLBWriteNI cmd here 428 else
415 * which doesn't flush uTLBs. I'd rather be safe than sorry. 429 rwx |= (rwx << 3); /* r w x => Kr Kw Kx Ur Uw Ux */
416 */ 430
417 write_aux_reg(ARC_REG_TLBCOMMAND, TLBWrite); 431 pd1 = rwx | (pte_val(*ptep) & PTE_BITS_NON_RWX_IN_PD1);
432
433 tlb_entry_insert(pd0, pd1);
418 434
419 local_irq_restore(flags); 435 local_irq_restore(flags);
420} 436}
@@ -553,13 +569,6 @@ void arc_mmu_init(void)
553 if (mmu->pg_sz != PAGE_SIZE) 569 if (mmu->pg_sz != PAGE_SIZE)
554 panic("MMU pg size != PAGE_SIZE (%luk)\n", TO_KB(PAGE_SIZE)); 570 panic("MMU pg size != PAGE_SIZE (%luk)\n", TO_KB(PAGE_SIZE));
555 571
556 /*
557 * ASID mgmt data structures are compile time init
558 * asid_cache = FIRST_ASID and asid_mm_map[] all zeroes
559 */
560
561 local_flush_tlb_all();
562
563 /* Enable the MMU */ 572 /* Enable the MMU */
564 write_aux_reg(ARC_REG_PID, MMU_ENABLE); 573 write_aux_reg(ARC_REG_PID, MMU_ENABLE);
565 574
@@ -671,25 +680,28 @@ void do_tlb_overlap_fault(unsigned long cause, unsigned long address,
671 * Low Level ASM TLB handler calls this if it finds that HW and SW ASIDS 680 * Low Level ASM TLB handler calls this if it finds that HW and SW ASIDS
672 * don't match 681 * don't match
673 */ 682 */
674void print_asid_mismatch(int is_fast_path) 683void print_asid_mismatch(int mm_asid, int mmu_asid, int is_fast_path)
675{ 684{
676 int pid_sw, pid_hw;
677 pid_sw = current->active_mm->context.asid;
678 pid_hw = read_aux_reg(ARC_REG_PID) & 0xff;
679
680 pr_emerg("ASID Mismatch in %s Path Handler: sw-pid=0x%x hw-pid=0x%x\n", 685 pr_emerg("ASID Mismatch in %s Path Handler: sw-pid=0x%x hw-pid=0x%x\n",
681 is_fast_path ? "Fast" : "Slow", pid_sw, pid_hw); 686 is_fast_path ? "Fast" : "Slow", mm_asid, mmu_asid);
682 687
683 __asm__ __volatile__("flag 1"); 688 __asm__ __volatile__("flag 1");
684} 689}
685 690
686void tlb_paranoid_check(unsigned int pid_sw, unsigned long addr) 691void tlb_paranoid_check(unsigned int mm_asid, unsigned long addr)
687{ 692{
688 unsigned int pid_hw; 693 unsigned int mmu_asid;
689 694
690 pid_hw = read_aux_reg(ARC_REG_PID) & 0xff; 695 mmu_asid = read_aux_reg(ARC_REG_PID) & 0xff;
691 696
692 if (addr < 0x70000000 && ((pid_hw != pid_sw) || (pid_sw == NO_ASID))) 697 /*
693 print_asid_mismatch(0); 698 * At the time of a TLB miss/installation
699 * - HW version needs to match SW version
700 * - SW needs to have a valid ASID
701 */
702 if (addr < 0x70000000 &&
703 ((mm_asid == MM_CTXT_NO_ASID) ||
704 (mmu_asid != (mm_asid & MM_CTXT_ASID_MASK))))
705 print_asid_mismatch(mm_asid, mmu_asid, 0);
694} 706}
695#endif 707#endif
diff --git a/arch/arc/mm/tlbex.S b/arch/arc/mm/tlbex.S
index 5c5bb23001b0..cf7d7d9ad695 100644
--- a/arch/arc/mm/tlbex.S
+++ b/arch/arc/mm/tlbex.S
@@ -44,17 +44,36 @@
44#include <asm/arcregs.h> 44#include <asm/arcregs.h>
45#include <asm/cache.h> 45#include <asm/cache.h>
46#include <asm/processor.h> 46#include <asm/processor.h>
47#if (CONFIG_ARC_MMU_VER == 1)
48#include <asm/tlb-mmu1.h> 47#include <asm/tlb-mmu1.h>
49#endif
50 48
51;-------------------------------------------------------------------------- 49;-----------------------------------------------------------------
52; scratch memory to save the registers (r0-r3) used to code TLB refill Handler 50; ARC700 Exception Handling doesn't auto-switch stack and it only provides
53; For details refer to comments before TLBMISS_FREEUP_REGS below 51; ONE scratch AUX reg "ARC_REG_SCRATCH_DATA0"
52;
53; For Non-SMP, the scratch AUX reg is repurposed to cache task PGD, so a
54; "global" is used to free-up FIRST core reg to be able to code the rest of
55; exception prologue (IRQ auto-disabled on Exceptions, so it's IRQ-safe).
56; Since the Fast Path TLB Miss handler is coded with 4 regs, the remaining 3
57; need to be saved as well by extending the "global" to be 4 words. Hence
58; ".size ex_saved_reg1, 16"
59; [All of this dance is to avoid stack switching for each TLB Miss, since we
60; only need to save only a handful of regs, as opposed to complete reg file]
61;
62; For ARC700 SMP, the "global" obviously can't be used for free up the FIRST
63; core reg as it will not be SMP safe.
64; Thus scratch AUX reg is used (and no longer used to cache task PGD).
65; To save the rest of 3 regs - per cpu, the global is made "per-cpu".
66; Epilogue thus has to locate the "per-cpu" storage for regs.
67; To avoid cache line bouncing the per-cpu global is aligned/sized per
68; L1_CACHE_SHIFT, despite fundamentally needing to be 12 bytes only. Hence
69; ".size ex_saved_reg1, (CONFIG_NR_CPUS << L1_CACHE_SHIFT)"
70
71; As simple as that....
54;-------------------------------------------------------------------------- 72;--------------------------------------------------------------------------
55 73
74; scratch memory to save [r0-r3] used to code TLB refill Handler
56ARCFP_DATA ex_saved_reg1 75ARCFP_DATA ex_saved_reg1
57 .align 1 << L1_CACHE_SHIFT ; IMP: Must be Cache Line aligned 76 .align 1 << L1_CACHE_SHIFT
58 .type ex_saved_reg1, @object 77 .type ex_saved_reg1, @object
59#ifdef CONFIG_SMP 78#ifdef CONFIG_SMP
60 .size ex_saved_reg1, (CONFIG_NR_CPUS << L1_CACHE_SHIFT) 79 .size ex_saved_reg1, (CONFIG_NR_CPUS << L1_CACHE_SHIFT)
@@ -66,6 +85,44 @@ ex_saved_reg1:
66 .zero 16 85 .zero 16
67#endif 86#endif
68 87
88.macro TLBMISS_FREEUP_REGS
89#ifdef CONFIG_SMP
90 sr r0, [ARC_REG_SCRATCH_DATA0] ; freeup r0 to code with
91 GET_CPU_ID r0 ; get to per cpu scratch mem,
92 lsl r0, r0, L1_CACHE_SHIFT ; cache line wide per cpu
93 add r0, @ex_saved_reg1, r0
94#else
95 st r0, [@ex_saved_reg1]
96 mov_s r0, @ex_saved_reg1
97#endif
98 st_s r1, [r0, 4]
99 st_s r2, [r0, 8]
100 st_s r3, [r0, 12]
101
102 ; VERIFY if the ASID in MMU-PID Reg is same as
103 ; one in Linux data structures
104
105 tlb_paranoid_check_asm
106.endm
107
108.macro TLBMISS_RESTORE_REGS
109#ifdef CONFIG_SMP
110 GET_CPU_ID r0 ; get to per cpu scratch mem
111 lsl r0, r0, L1_CACHE_SHIFT ; each is cache line wide
112 add r0, @ex_saved_reg1, r0
113 ld_s r3, [r0,12]
114 ld_s r2, [r0, 8]
115 ld_s r1, [r0, 4]
116 lr r0, [ARC_REG_SCRATCH_DATA0]
117#else
118 mov_s r0, @ex_saved_reg1
119 ld_s r3, [r0,12]
120 ld_s r2, [r0, 8]
121 ld_s r1, [r0, 4]
122 ld_s r0, [r0]
123#endif
124.endm
125
69;============================================================================ 126;============================================================================
70; Troubleshooting Stuff 127; Troubleshooting Stuff
71;============================================================================ 128;============================================================================
@@ -76,34 +133,35 @@ ex_saved_reg1:
76; In bizzare scenrios SW and HW ASID can get out-of-sync which is trouble. 133; In bizzare scenrios SW and HW ASID can get out-of-sync which is trouble.
77; So we try to detect this in TLB Mis shandler 134; So we try to detect this in TLB Mis shandler
78 135
79 136.macro tlb_paranoid_check_asm
80.macro DBG_ASID_MISMATCH
81 137
82#ifdef CONFIG_ARC_DBG_TLB_PARANOIA 138#ifdef CONFIG_ARC_DBG_TLB_PARANOIA
83 139
84 ; make sure h/w ASID is same as s/w ASID
85
86 GET_CURR_TASK_ON_CPU r3 140 GET_CURR_TASK_ON_CPU r3
87 ld r0, [r3, TASK_ACT_MM] 141 ld r0, [r3, TASK_ACT_MM]
88 ld r0, [r0, MM_CTXT+MM_CTXT_ASID] 142 ld r0, [r0, MM_CTXT+MM_CTXT_ASID]
143 breq r0, 0, 55f ; Error if no ASID allocated
89 144
90 lr r1, [ARC_REG_PID] 145 lr r1, [ARC_REG_PID]
91 and r1, r1, 0xFF 146 and r1, r1, 0xFF
92 breq r1, r0, 5f
93 147
148 and r2, r0, 0xFF ; MMU PID bits only for comparison
149 breq r1, r2, 5f
150
15155:
94 ; Error if H/w and S/w ASID don't match, but NOT if in kernel mode 152 ; Error if H/w and S/w ASID don't match, but NOT if in kernel mode
95 lr r0, [erstatus] 153 lr r2, [erstatus]
96 bbit0 r0, STATUS_U_BIT, 5f 154 bbit0 r2, STATUS_U_BIT, 5f
97 155
98 ; We sure are in troubled waters, Flag the error, but to do so 156 ; We sure are in troubled waters, Flag the error, but to do so
99 ; need to switch to kernel mode stack to call error routine 157 ; need to switch to kernel mode stack to call error routine
100 GET_TSK_STACK_BASE r3, sp 158 GET_TSK_STACK_BASE r3, sp
101 159
102 ; Call printk to shoutout aloud 160 ; Call printk to shoutout aloud
103 mov r0, 1 161 mov r2, 1
104 j print_asid_mismatch 162 j print_asid_mismatch
105 163
1065: ; ASIDs match so proceed normally 1645: ; ASIDs match so proceed normally
107 nop 165 nop
108 166
109#endif 167#endif
@@ -161,13 +219,17 @@ ex_saved_reg1:
161; IN: r0 = PTE, r1 = ptr to PTE 219; IN: r0 = PTE, r1 = ptr to PTE
162 220
163.macro CONV_PTE_TO_TLB 221.macro CONV_PTE_TO_TLB
164 and r3, r0, PTE_BITS_IN_PD1 ; Extract permission flags+PFN from PTE 222 and r3, r0, PTE_BITS_RWX ; r w x
165 sr r3, [ARC_REG_TLBPD1] ; these go in PD1 223 lsl r2, r3, 3 ; r w x 0 0 0
224 and.f 0, r0, _PAGE_GLOBAL
225 or.z r2, r2, r3 ; r w x r w x
226
227 and r3, r0, PTE_BITS_NON_RWX_IN_PD1 ; Extract PFN+cache bits from PTE
228 or r3, r3, r2
229
230 sr r3, [ARC_REG_TLBPD1] ; these go in PD1
166 231
167 and r2, r0, PTE_BITS_IN_PD0 ; Extract other PTE flags: (V)alid, (G)lb 232 and r2, r0, PTE_BITS_IN_PD0 ; Extract other PTE flags: (V)alid, (G)lb
168#if (CONFIG_ARC_MMU_VER <= 2) /* Neednot be done with v3 onwards */
169 lsr r2, r2 ; shift PTE flags to match layout in PD0
170#endif
171 233
172 lr r3,[ARC_REG_TLBPD0] ; MMU prepares PD0 with vaddr and asid 234 lr r3,[ARC_REG_TLBPD0] ; MMU prepares PD0 with vaddr and asid
173 235
@@ -191,68 +253,6 @@ ex_saved_reg1:
191#endif 253#endif
192.endm 254.endm
193 255
194;-----------------------------------------------------------------
195; ARC700 Exception Handling doesn't auto-switch stack and it only provides
196; ONE scratch AUX reg "ARC_REG_SCRATCH_DATA0"
197;
198; For Non-SMP, the scratch AUX reg is repurposed to cache task PGD, so a
199; "global" is used to free-up FIRST core reg to be able to code the rest of
200; exception prologue (IRQ auto-disabled on Exceptions, so it's IRQ-safe).
201; Since the Fast Path TLB Miss handler is coded with 4 regs, the remaining 3
202; need to be saved as well by extending the "global" to be 4 words. Hence
203; ".size ex_saved_reg1, 16"
204; [All of this dance is to avoid stack switching for each TLB Miss, since we
205; only need to save only a handful of regs, as opposed to complete reg file]
206;
207; For ARC700 SMP, the "global" obviously can't be used for free up the FIRST
208; core reg as it will not be SMP safe.
209; Thus scratch AUX reg is used (and no longer used to cache task PGD).
210; To save the rest of 3 regs - per cpu, the global is made "per-cpu".
211; Epilogue thus has to locate the "per-cpu" storage for regs.
212; To avoid cache line bouncing the per-cpu global is aligned/sized per
213; L1_CACHE_SHIFT, despite fundamentally needing to be 12 bytes only. Hence
214; ".size ex_saved_reg1, (CONFIG_NR_CPUS << L1_CACHE_SHIFT)"
215
216; As simple as that....
217
218.macro TLBMISS_FREEUP_REGS
219#ifdef CONFIG_SMP
220 sr r0, [ARC_REG_SCRATCH_DATA0] ; freeup r0 to code with
221 GET_CPU_ID r0 ; get to per cpu scratch mem,
222 lsl r0, r0, L1_CACHE_SHIFT ; cache line wide per cpu
223 add r0, @ex_saved_reg1, r0
224#else
225 st r0, [@ex_saved_reg1]
226 mov_s r0, @ex_saved_reg1
227#endif
228 st_s r1, [r0, 4]
229 st_s r2, [r0, 8]
230 st_s r3, [r0, 12]
231
232 ; VERIFY if the ASID in MMU-PID Reg is same as
233 ; one in Linux data structures
234
235 DBG_ASID_MISMATCH
236.endm
237
238;-----------------------------------------------------------------
239.macro TLBMISS_RESTORE_REGS
240#ifdef CONFIG_SMP
241 GET_CPU_ID r0 ; get to per cpu scratch mem
242 lsl r0, r0, L1_CACHE_SHIFT ; each is cache line wide
243 add r0, @ex_saved_reg1, r0
244 ld_s r3, [r0,12]
245 ld_s r2, [r0, 8]
246 ld_s r1, [r0, 4]
247 lr r0, [ARC_REG_SCRATCH_DATA0]
248#else
249 mov_s r0, @ex_saved_reg1
250 ld_s r3, [r0,12]
251 ld_s r2, [r0, 8]
252 ld_s r1, [r0, 4]
253 ld_s r0, [r0]
254#endif
255.endm
256 256
257ARCFP_CODE ;Fast Path Code, candidate for ICCM 257ARCFP_CODE ;Fast Path Code, candidate for ICCM
258 258
@@ -277,8 +277,8 @@ ARC_ENTRY EV_TLBMissI
277 ;---------------------------------------------------------------- 277 ;----------------------------------------------------------------
278 ; VERIFY_PTE: Check if PTE permissions approp for executing code 278 ; VERIFY_PTE: Check if PTE permissions approp for executing code
279 cmp_s r2, VMALLOC_START 279 cmp_s r2, VMALLOC_START
280 mov.lo r2, (_PAGE_PRESENT | _PAGE_U_EXECUTE) 280 mov_s r2, (_PAGE_PRESENT | _PAGE_EXECUTE)
281 mov.hs r2, (_PAGE_PRESENT | _PAGE_K_EXECUTE) 281 or.hs r2, r2, _PAGE_GLOBAL
282 282
283 and r3, r0, r2 ; Mask out NON Flag bits from PTE 283 and r3, r0, r2 ; Mask out NON Flag bits from PTE
284 xor.f r3, r3, r2 ; check ( ( pte & flags_test ) == flags_test ) 284 xor.f r3, r3, r2 ; check ( ( pte & flags_test ) == flags_test )
@@ -317,26 +317,21 @@ ARC_ENTRY EV_TLBMissD
317 ;---------------------------------------------------------------- 317 ;----------------------------------------------------------------
318 ; VERIFY_PTE: Chk if PTE permissions approp for data access (R/W/R+W) 318 ; VERIFY_PTE: Chk if PTE permissions approp for data access (R/W/R+W)
319 319
320 mov_s r2, 0 320 cmp_s r2, VMALLOC_START
321 mov_s r2, _PAGE_PRESENT ; common bit for K/U PTE
322 or.hs r2, r2, _PAGE_GLOBAL ; kernel PTE only
323
324 ; Linux PTE [RWX] bits are semantically overloaded:
325 ; -If PAGE_GLOBAL set, they refer to kernel-only flags (vmalloc)
326 ; -Otherwise they are user-mode permissions, and those are exactly
327 ; same for kernel mode as well (e.g. copy_(to|from)_user)
328
321 lr r3, [ecr] 329 lr r3, [ecr]
322 btst_s r3, ECR_C_BIT_DTLB_LD_MISS ; Read Access 330 btst_s r3, ECR_C_BIT_DTLB_LD_MISS ; Read Access
323 or.nz r2, r2, _PAGE_U_READ ; chk for Read flag in PTE 331 or.nz r2, r2, _PAGE_READ ; chk for Read flag in PTE
324 btst_s r3, ECR_C_BIT_DTLB_ST_MISS ; Write Access 332 btst_s r3, ECR_C_BIT_DTLB_ST_MISS ; Write Access
325 or.nz r2, r2, _PAGE_U_WRITE ; chk for Write flag in PTE 333 or.nz r2, r2, _PAGE_WRITE ; chk for Write flag in PTE
326 ; Above laddering takes care of XCHG access 334 ; Above laddering takes care of XCHG access (both R and W)
327 ; which is both Read and Write
328
329 ; If kernel mode access, ; make _PAGE_xx flags as _PAGE_K_xx
330 ; For copy_(to|from)_user, despite exception taken in kernel mode,
331 ; this code is not hit, because EFA would still be the user mode
332 ; address (EFA < 0x6000_0000).
333 ; This code is for legit kernel mode faults, vmalloc specifically
334 ; (EFA: 0x7000_0000 to 0x7FFF_FFFF)
335
336 lr r3, [efa]
337 cmp r3, VMALLOC_START - 1 ; If kernel mode access
338 asl.hi r2, r2, 3 ; make _PAGE_xx flags as _PAGE_K_xx
339 or r2, r2, _PAGE_PRESENT ; Common flag for K/U mode
340 335
341 ; By now, r2 setup with all the Flags we need to check in PTE 336 ; By now, r2 setup with all the Flags we need to check in PTE
342 and r3, r0, r2 ; Mask out NON Flag bits from PTE 337 and r3, r0, r2 ; Mask out NON Flag bits from PTE
@@ -371,13 +366,7 @@ do_slow_path_pf:
371 366
372 ; Slow path TLB Miss handled as a regular ARC Exception 367 ; Slow path TLB Miss handled as a regular ARC Exception
373 ; (stack switching / save the complete reg-file). 368 ; (stack switching / save the complete reg-file).
374 ; That requires freeing up r9 369 EXCEPTION_PROLOGUE
375 EXCPN_PROLOG_FREEUP_REG r9
376
377 lr r9, [erstatus]
378
379 SWITCH_TO_KERNEL_STK
380 SAVE_ALL_SYS
381 370
382 ; ------- setup args for Linux Page fault Hanlder --------- 371 ; ------- setup args for Linux Page fault Hanlder ---------
383 mov_s r0, sp 372 mov_s r0, sp
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 43594d5116ef..3f7714d8d2d2 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -3,20 +3,21 @@ config ARM
3 default y 3 default y
4 select ARCH_BINFMT_ELF_RANDOMIZE_PIE 4 select ARCH_BINFMT_ELF_RANDOMIZE_PIE
5 select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE 5 select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
6 select ARCH_HAVE_CUSTOM_GPIO_H
7 select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST 6 select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
7 select ARCH_HAVE_CUSTOM_GPIO_H
8 select ARCH_WANT_IPC_PARSE_VERSION 8 select ARCH_WANT_IPC_PARSE_VERSION
9 select BUILDTIME_EXTABLE_SORT if MMU 9 select BUILDTIME_EXTABLE_SORT if MMU
10 select CLONE_BACKWARDS
10 select CPU_PM if (SUSPEND || CPU_IDLE) 11 select CPU_PM if (SUSPEND || CPU_IDLE)
11 select DCACHE_WORD_ACCESS if (CPU_V6 || CPU_V6K || CPU_V7) && !CPU_BIG_ENDIAN && MMU 12 select DCACHE_WORD_ACCESS if (CPU_V6 || CPU_V6K || CPU_V7) && !CPU_BIG_ENDIAN && MMU
12 select GENERIC_ATOMIC64 if (CPU_V7M || CPU_V6 || !CPU_32v6K || !AEABI) 13 select GENERIC_ATOMIC64 if (CPU_V7M || CPU_V6 || !CPU_32v6K || !AEABI)
13 select GENERIC_CLOCKEVENTS_BROADCAST if SMP 14 select GENERIC_CLOCKEVENTS_BROADCAST if SMP
15 select GENERIC_IDLE_POLL_SETUP
14 select GENERIC_IRQ_PROBE 16 select GENERIC_IRQ_PROBE
15 select GENERIC_IRQ_SHOW 17 select GENERIC_IRQ_SHOW
16 select GENERIC_PCI_IOMAP 18 select GENERIC_PCI_IOMAP
17 select GENERIC_SCHED_CLOCK 19 select GENERIC_SCHED_CLOCK
18 select GENERIC_SMP_IDLE_THREAD 20 select GENERIC_SMP_IDLE_THREAD
19 select GENERIC_IDLE_POLL_SETUP
20 select GENERIC_STRNCPY_FROM_USER 21 select GENERIC_STRNCPY_FROM_USER
21 select GENERIC_STRNLEN_USER 22 select GENERIC_STRNLEN_USER
22 select HARDIRQS_SW_RESEND 23 select HARDIRQS_SW_RESEND
@@ -25,6 +26,7 @@ config ARM
25 select HAVE_ARCH_SECCOMP_FILTER 26 select HAVE_ARCH_SECCOMP_FILTER
26 select HAVE_ARCH_TRACEHOOK 27 select HAVE_ARCH_TRACEHOOK
27 select HAVE_BPF_JIT 28 select HAVE_BPF_JIT
29 select HAVE_CONTEXT_TRACKING
28 select HAVE_C_RECORDMCOUNT 30 select HAVE_C_RECORDMCOUNT
29 select HAVE_DEBUG_KMEMLEAK 31 select HAVE_DEBUG_KMEMLEAK
30 select HAVE_DMA_API_DEBUG 32 select HAVE_DMA_API_DEBUG
@@ -35,7 +37,6 @@ config ARM
35 select HAVE_FUNCTION_GRAPH_TRACER if (!THUMB2_KERNEL) 37 select HAVE_FUNCTION_GRAPH_TRACER if (!THUMB2_KERNEL)
36 select HAVE_FUNCTION_TRACER if (!XIP_KERNEL) 38 select HAVE_FUNCTION_TRACER if (!XIP_KERNEL)
37 select HAVE_GENERIC_DMA_COHERENT 39 select HAVE_GENERIC_DMA_COHERENT
38 select HAVE_GENERIC_HARDIRQS
39 select HAVE_HW_BREAKPOINT if (PERF_EVENTS && (CPU_V6 || CPU_V6K || CPU_V7)) 40 select HAVE_HW_BREAKPOINT if (PERF_EVENTS && (CPU_V6 || CPU_V6K || CPU_V7))
40 select HAVE_IDE if PCI || ISA || PCMCIA 41 select HAVE_IDE if PCI || ISA || PCMCIA
41 select HAVE_IRQ_TIME_ACCOUNTING 42 select HAVE_IRQ_TIME_ACCOUNTING
@@ -47,21 +48,22 @@ config ARM
47 select HAVE_KPROBES if !XIP_KERNEL 48 select HAVE_KPROBES if !XIP_KERNEL
48 select HAVE_KRETPROBES if (HAVE_KPROBES) 49 select HAVE_KRETPROBES if (HAVE_KPROBES)
49 select HAVE_MEMBLOCK 50 select HAVE_MEMBLOCK
51 select HAVE_MOD_ARCH_SPECIFIC if ARM_UNWIND
50 select HAVE_OPROFILE if (HAVE_PERF_EVENTS) 52 select HAVE_OPROFILE if (HAVE_PERF_EVENTS)
51 select HAVE_PERF_EVENTS 53 select HAVE_PERF_EVENTS
52 select HAVE_REGS_AND_STACK_ACCESS_API 54 select HAVE_REGS_AND_STACK_ACCESS_API
53 select HAVE_SYSCALL_TRACEPOINTS 55 select HAVE_SYSCALL_TRACEPOINTS
54 select HAVE_UID16 56 select HAVE_UID16
57 select IRQ_FORCED_THREADING
55 select KTIME_SCALAR 58 select KTIME_SCALAR
59 select MODULES_USE_ELF_REL
60 select OLD_SIGACTION
61 select OLD_SIGSUSPEND3
56 select PERF_USE_VMALLOC 62 select PERF_USE_VMALLOC
57 select RTC_LIB 63 select RTC_LIB
58 select SYS_SUPPORTS_APM_EMULATION 64 select SYS_SUPPORTS_APM_EMULATION
59 select HAVE_MOD_ARCH_SPECIFIC if ARM_UNWIND 65 # Above selects are sorted alphabetically; please add new ones
60 select MODULES_USE_ELF_REL 66 # according to that. Thanks.
61 select CLONE_BACKWARDS
62 select OLD_SIGSUSPEND3
63 select OLD_SIGACTION
64 select HAVE_CONTEXT_TRACKING
65 help 67 help
66 The ARM series is a line of low-power-consumption RISC chip designs 68 The ARM series is a line of low-power-consumption RISC chip designs
67 licensed by ARM Ltd and targeted at embedded applications and 69 licensed by ARM Ltd and targeted at embedded applications and
@@ -385,8 +387,8 @@ config ARCH_GEMINI
385 bool "Cortina Systems Gemini" 387 bool "Cortina Systems Gemini"
386 select ARCH_REQUIRE_GPIOLIB 388 select ARCH_REQUIRE_GPIOLIB
387 select ARCH_USES_GETTIMEOFFSET 389 select ARCH_USES_GETTIMEOFFSET
388 select NEED_MACH_GPIO_H
389 select CPU_FA526 390 select CPU_FA526
391 select NEED_MACH_GPIO_H
390 help 392 help
391 Support for the Cortina Systems Gemini family SoCs 393 Support for the Cortina Systems Gemini family SoCs
392 394
@@ -441,7 +443,6 @@ config ARCH_NETX
441config ARCH_IOP13XX 443config ARCH_IOP13XX
442 bool "IOP13xx-based" 444 bool "IOP13xx-based"
443 depends on MMU 445 depends on MMU
444 select ARCH_SUPPORTS_MSI
445 select CPU_XSC3 446 select CPU_XSC3
446 select NEED_MACH_MEMORY_H 447 select NEED_MACH_MEMORY_H
447 select NEED_RET_TO_USER 448 select NEED_RET_TO_USER
@@ -487,8 +488,8 @@ config ARCH_IXP4XX
487 select GENERIC_CLOCKEVENTS 488 select GENERIC_CLOCKEVENTS
488 select MIGHT_HAVE_PCI 489 select MIGHT_HAVE_PCI
489 select NEED_MACH_IO_H 490 select NEED_MACH_IO_H
490 select USB_EHCI_BIG_ENDIAN_MMIO
491 select USB_EHCI_BIG_ENDIAN_DESC 491 select USB_EHCI_BIG_ENDIAN_DESC
492 select USB_EHCI_BIG_ENDIAN_MMIO
492 help 493 help
493 Support for Intel's IXP4XX (XScale) family of processors. 494 Support for Intel's IXP4XX (XScale) family of processors.
494 495
@@ -498,11 +499,11 @@ config ARCH_DOVE
498 select CPU_PJ4 499 select CPU_PJ4
499 select GENERIC_CLOCKEVENTS 500 select GENERIC_CLOCKEVENTS
500 select MIGHT_HAVE_PCI 501 select MIGHT_HAVE_PCI
502 select MVEBU_MBUS
501 select PINCTRL 503 select PINCTRL
502 select PINCTRL_DOVE 504 select PINCTRL_DOVE
503 select PLAT_ORION_LEGACY 505 select PLAT_ORION_LEGACY
504 select USB_ARCH_HAS_EHCI 506 select USB_ARCH_HAS_EHCI
505 select MVEBU_MBUS
506 help 507 help
507 Support for the Marvell Dove SoC 88AP510 508 Support for the Marvell Dove SoC 88AP510
508 509
@@ -512,12 +513,12 @@ config ARCH_KIRKWOOD
512 select ARCH_REQUIRE_GPIOLIB 513 select ARCH_REQUIRE_GPIOLIB
513 select CPU_FEROCEON 514 select CPU_FEROCEON
514 select GENERIC_CLOCKEVENTS 515 select GENERIC_CLOCKEVENTS
516 select MVEBU_MBUS
515 select PCI 517 select PCI
516 select PCI_QUIRKS 518 select PCI_QUIRKS
517 select PINCTRL 519 select PINCTRL
518 select PINCTRL_KIRKWOOD 520 select PINCTRL_KIRKWOOD
519 select PLAT_ORION_LEGACY 521 select PLAT_ORION_LEGACY
520 select MVEBU_MBUS
521 help 522 help
522 Support for the following Marvell Kirkwood series SoCs: 523 Support for the following Marvell Kirkwood series SoCs:
523 88F6180, 88F6192 and 88F6281. 524 88F6180, 88F6192 and 88F6281.
@@ -527,9 +528,9 @@ config ARCH_MV78XX0
527 select ARCH_REQUIRE_GPIOLIB 528 select ARCH_REQUIRE_GPIOLIB
528 select CPU_FEROCEON 529 select CPU_FEROCEON
529 select GENERIC_CLOCKEVENTS 530 select GENERIC_CLOCKEVENTS
531 select MVEBU_MBUS
530 select PCI 532 select PCI
531 select PLAT_ORION_LEGACY 533 select PLAT_ORION_LEGACY
532 select MVEBU_MBUS
533 help 534 help
534 Support for the following Marvell MV78xx0 series SoCs: 535 Support for the following Marvell MV78xx0 series SoCs:
535 MV781x0, MV782x0. 536 MV781x0, MV782x0.
@@ -540,9 +541,9 @@ config ARCH_ORION5X
540 select ARCH_REQUIRE_GPIOLIB 541 select ARCH_REQUIRE_GPIOLIB
541 select CPU_FEROCEON 542 select CPU_FEROCEON
542 select GENERIC_CLOCKEVENTS 543 select GENERIC_CLOCKEVENTS
544 select MVEBU_MBUS
543 select PCI 545 select PCI
544 select PLAT_ORION_LEGACY 546 select PLAT_ORION_LEGACY
545 select MVEBU_MBUS
546 help 547 help
547 Support for the following Marvell Orion 5x series SoCs: 548 Support for the following Marvell Orion 5x series SoCs:
548 Orion-1 (5181), Orion-VoIP (5181L), Orion-NAS (5182), 549 Orion-1 (5181), Orion-VoIP (5181L), Orion-NAS (5182),
@@ -557,6 +558,7 @@ config ARCH_MMP
557 select GENERIC_CLOCKEVENTS 558 select GENERIC_CLOCKEVENTS
558 select GPIO_PXA 559 select GPIO_PXA
559 select IRQ_DOMAIN 560 select IRQ_DOMAIN
561 select MULTI_IRQ_HANDLER
560 select NEED_MACH_GPIO_H 562 select NEED_MACH_GPIO_H
561 select PINCTRL 563 select PINCTRL
562 select PLAT_PXA 564 select PLAT_PXA
@@ -630,6 +632,7 @@ config ARCH_MSM
630 bool "Qualcomm MSM" 632 bool "Qualcomm MSM"
631 select ARCH_REQUIRE_GPIOLIB 633 select ARCH_REQUIRE_GPIOLIB
632 select CLKDEV_LOOKUP 634 select CLKDEV_LOOKUP
635 select CLKSRC_OF if OF
633 select COMMON_CLK 636 select COMMON_CLK
634 select GENERIC_CLOCKEVENTS 637 select GENERIC_CLOCKEVENTS
635 help 638 help
@@ -645,7 +648,7 @@ config ARCH_SHMOBILE
645 select CLKDEV_LOOKUP 648 select CLKDEV_LOOKUP
646 select GENERIC_CLOCKEVENTS 649 select GENERIC_CLOCKEVENTS
647 select HAVE_ARM_SCU if SMP 650 select HAVE_ARM_SCU if SMP
648 select HAVE_ARM_TWD if LOCAL_TIMERS 651 select HAVE_ARM_TWD if SMP
649 select HAVE_CLK 652 select HAVE_CLK
650 select HAVE_MACH_CLKDEV 653 select HAVE_MACH_CLKDEV
651 select HAVE_SMP 654 select HAVE_SMP
@@ -700,7 +703,7 @@ config ARCH_S3C24XX
700 select ARCH_HAS_CPUFREQ 703 select ARCH_HAS_CPUFREQ
701 select ARCH_REQUIRE_GPIOLIB 704 select ARCH_REQUIRE_GPIOLIB
702 select CLKDEV_LOOKUP 705 select CLKDEV_LOOKUP
703 select CLKSRC_MMIO 706 select CLKSRC_SAMSUNG_PWM
704 select GENERIC_CLOCKEVENTS 707 select GENERIC_CLOCKEVENTS
705 select GPIO_SAMSUNG 708 select GPIO_SAMSUNG
706 select HAVE_CLK 709 select HAVE_CLK
@@ -723,7 +726,7 @@ config ARCH_S3C64XX
723 select ARCH_REQUIRE_GPIOLIB 726 select ARCH_REQUIRE_GPIOLIB
724 select ARM_VIC 727 select ARM_VIC
725 select CLKDEV_LOOKUP 728 select CLKDEV_LOOKUP
726 select CLKSRC_MMIO 729 select CLKSRC_SAMSUNG_PWM
727 select CPU_V6 730 select CPU_V6
728 select GENERIC_CLOCKEVENTS 731 select GENERIC_CLOCKEVENTS
729 select GPIO_SAMSUNG 732 select GPIO_SAMSUNG
@@ -739,7 +742,6 @@ config ARCH_S3C64XX
739 select SAMSUNG_ATAGS 742 select SAMSUNG_ATAGS
740 select SAMSUNG_CLKSRC 743 select SAMSUNG_CLKSRC
741 select SAMSUNG_GPIOLIB_4BIT 744 select SAMSUNG_GPIOLIB_4BIT
742 select SAMSUNG_IRQ_VIC_TIMER
743 select SAMSUNG_WDT_RESET 745 select SAMSUNG_WDT_RESET
744 select USB_ARCH_HAS_OHCI 746 select USB_ARCH_HAS_OHCI
745 help 747 help
@@ -748,7 +750,7 @@ config ARCH_S3C64XX
748config ARCH_S5P64X0 750config ARCH_S5P64X0
749 bool "Samsung S5P6440 S5P6450" 751 bool "Samsung S5P6440 S5P6450"
750 select CLKDEV_LOOKUP 752 select CLKDEV_LOOKUP
751 select CLKSRC_MMIO 753 select CLKSRC_SAMSUNG_PWM
752 select CPU_V6 754 select CPU_V6
753 select GENERIC_CLOCKEVENTS 755 select GENERIC_CLOCKEVENTS
754 select GPIO_SAMSUNG 756 select GPIO_SAMSUNG
@@ -757,8 +759,8 @@ config ARCH_S5P64X0
757 select HAVE_S3C2410_WATCHDOG if WATCHDOG 759 select HAVE_S3C2410_WATCHDOG if WATCHDOG
758 select HAVE_S3C_RTC if RTC_CLASS 760 select HAVE_S3C_RTC if RTC_CLASS
759 select NEED_MACH_GPIO_H 761 select NEED_MACH_GPIO_H
760 select SAMSUNG_WDT_RESET
761 select SAMSUNG_ATAGS 762 select SAMSUNG_ATAGS
763 select SAMSUNG_WDT_RESET
762 help 764 help
763 Samsung S5P64X0 CPU based systems, such as the Samsung SMDK6440, 765 Samsung S5P64X0 CPU based systems, such as the Samsung SMDK6440,
764 SMDK6450. 766 SMDK6450.
@@ -767,7 +769,7 @@ config ARCH_S5PC100
767 bool "Samsung S5PC100" 769 bool "Samsung S5PC100"
768 select ARCH_REQUIRE_GPIOLIB 770 select ARCH_REQUIRE_GPIOLIB
769 select CLKDEV_LOOKUP 771 select CLKDEV_LOOKUP
770 select CLKSRC_MMIO 772 select CLKSRC_SAMSUNG_PWM
771 select CPU_V7 773 select CPU_V7
772 select GENERIC_CLOCKEVENTS 774 select GENERIC_CLOCKEVENTS
773 select GPIO_SAMSUNG 775 select GPIO_SAMSUNG
@@ -776,8 +778,8 @@ config ARCH_S5PC100
776 select HAVE_S3C2410_WATCHDOG if WATCHDOG 778 select HAVE_S3C2410_WATCHDOG if WATCHDOG
777 select HAVE_S3C_RTC if RTC_CLASS 779 select HAVE_S3C_RTC if RTC_CLASS
778 select NEED_MACH_GPIO_H 780 select NEED_MACH_GPIO_H
779 select SAMSUNG_WDT_RESET
780 select SAMSUNG_ATAGS 781 select SAMSUNG_ATAGS
782 select SAMSUNG_WDT_RESET
781 help 783 help
782 Samsung S5PC100 series based systems 784 Samsung S5PC100 series based systems
783 785
@@ -787,7 +789,7 @@ config ARCH_S5PV210
787 select ARCH_HAS_HOLES_MEMORYMODEL 789 select ARCH_HAS_HOLES_MEMORYMODEL
788 select ARCH_SPARSEMEM_ENABLE 790 select ARCH_SPARSEMEM_ENABLE
789 select CLKDEV_LOOKUP 791 select CLKDEV_LOOKUP
790 select CLKSRC_MMIO 792 select CLKSRC_SAMSUNG_PWM
791 select CPU_V7 793 select CPU_V7
792 select GENERIC_CLOCKEVENTS 794 select GENERIC_CLOCKEVENTS
793 select GPIO_SAMSUNG 795 select GPIO_SAMSUNG
@@ -1372,6 +1374,15 @@ config ARM_ERRATA_798181
1372 which sends an IPI to the CPUs that are running the same ASID 1374 which sends an IPI to the CPUs that are running the same ASID
1373 as the one being invalidated. 1375 as the one being invalidated.
1374 1376
1377config ARM_ERRATA_773022
1378 bool "ARM errata: incorrect instructions may be executed from loop buffer"
1379 depends on CPU_V7
1380 help
1381 This option enables the workaround for the 773022 Cortex-A15
1382 (up to r0p4) erratum. In certain rare sequences of code, the
1383 loop buffer may deliver incorrect instructions. This
1384 workaround disables the loop buffer to avoid the erratum.
1385
1375endmenu 1386endmenu
1376 1387
1377source "arch/arm/common/Kconfig" 1388source "arch/arm/common/Kconfig"
@@ -1584,23 +1595,13 @@ config ARM_PSCI
1584 0022A ("Power State Coordination Interface System Software on 1595 0022A ("Power State Coordination Interface System Software on
1585 ARM processors"). 1596 ARM processors").
1586 1597
1587config LOCAL_TIMERS
1588 bool "Use local timer interrupts"
1589 depends on SMP
1590 default y
1591 help
1592 Enable support for local timers on SMP platforms, rather then the
1593 legacy IPI broadcast method. Local timers allows the system
1594 accounting to be spread across the timer interval, preventing a
1595 "thundering herd" at every timer tick.
1596
1597# The GPIO number here must be sorted by descending number. In case of 1598# The GPIO number here must be sorted by descending number. In case of
1598# a multiplatform kernel, we just want the highest value required by the 1599# a multiplatform kernel, we just want the highest value required by the
1599# selected platforms. 1600# selected platforms.
1600config ARCH_NR_GPIO 1601config ARCH_NR_GPIO
1601 int 1602 int
1602 default 1024 if ARCH_SHMOBILE || ARCH_TEGRA 1603 default 1024 if ARCH_SHMOBILE || ARCH_TEGRA
1603 default 512 if ARCH_EXYNOS || ARCH_KEYSTONE || SOC_OMAP5 1604 default 512 if ARCH_EXYNOS || ARCH_KEYSTONE || SOC_OMAP5 || SOC_DRA7XX
1604 default 392 if ARCH_U8500 1605 default 392 if ARCH_U8500
1605 default 352 if ARCH_VT8500 1606 default 352 if ARCH_VT8500
1606 default 288 if ARCH_SUNXI 1607 default 288 if ARCH_SUNXI
@@ -1613,13 +1614,50 @@ config ARCH_NR_GPIO
1613 1614
1614source kernel/Kconfig.preempt 1615source kernel/Kconfig.preempt
1615 1616
1616config HZ 1617config HZ_FIXED
1617 int 1618 int
1618 default 200 if ARCH_EBSA110 || ARCH_S3C24XX || ARCH_S5P64X0 || \ 1619 default 200 if ARCH_EBSA110 || ARCH_S3C24XX || ARCH_S5P64X0 || \
1619 ARCH_S5PV210 || ARCH_EXYNOS4 1620 ARCH_S5PV210 || ARCH_EXYNOS4
1620 default AT91_TIMER_HZ if ARCH_AT91 1621 default AT91_TIMER_HZ if ARCH_AT91
1621 default SHMOBILE_TIMER_HZ if ARCH_SHMOBILE 1622 default SHMOBILE_TIMER_HZ if ARCH_SHMOBILE
1622 default 100 1623 default 0
1624
1625choice
1626 depends on HZ_FIXED = 0
1627 prompt "Timer frequency"
1628
1629config HZ_100
1630 bool "100 Hz"
1631
1632config HZ_200
1633 bool "200 Hz"
1634
1635config HZ_250
1636 bool "250 Hz"
1637
1638config HZ_300
1639 bool "300 Hz"
1640
1641config HZ_500
1642 bool "500 Hz"
1643
1644config HZ_1000
1645 bool "1000 Hz"
1646
1647endchoice
1648
1649config HZ
1650 int
1651 default HZ_FIXED if HZ_FIXED != 0
1652 default 100 if HZ_100
1653 default 200 if HZ_200
1654 default 250 if HZ_250
1655 default 300 if HZ_300
1656 default 500 if HZ_500
1657 default 1000
1658
1659config SCHED_HRTICK
1660 def_bool HIGH_RES_TIMERS
1623 1661
1624config SCHED_HRTICK 1662config SCHED_HRTICK
1625 def_bool HIGH_RES_TIMERS 1663 def_bool HIGH_RES_TIMERS
@@ -1756,6 +1794,9 @@ config HAVE_ARCH_TRANSPARENT_HUGEPAGE
1756 def_bool y 1794 def_bool y
1757 depends on ARM_LPAE 1795 depends on ARM_LPAE
1758 1796
1797config ARCH_WANT_GENERAL_HUGETLB
1798 def_bool y
1799
1759source "mm/Kconfig" 1800source "mm/Kconfig"
1760 1801
1761config FORCE_MAX_ZONEORDER 1802config FORCE_MAX_ZONEORDER
@@ -2064,8 +2105,7 @@ config KEXEC
2064 2105
2065 It is an ongoing process to be certain the hardware in a machine 2106 It is an ongoing process to be certain the hardware in a machine
2066 is properly shutdown, so do not be surprised if this code does not 2107 is properly shutdown, so do not be surprised if this code does not
2067 initially work for you. It may help to enable device hotplugging 2108 initially work for you.
2068 support.
2069 2109
2070config ATAGS_PROC 2110config ATAGS_PROC
2071 bool "Export atags in procfs" 2111 bool "Export atags in procfs"
@@ -2175,6 +2215,13 @@ config NEON
2175 Say Y to include support code for NEON, the ARMv7 Advanced SIMD 2215 Say Y to include support code for NEON, the ARMv7 Advanced SIMD
2176 Extension. 2216 Extension.
2177 2217
2218config KERNEL_MODE_NEON
2219 bool "Support for NEON in kernel mode"
2220 default n
2221 depends on NEON
2222 help
2223 Say Y to include support for NEON in kernel mode.
2224
2178endmenu 2225endmenu
2179 2226
2180menu "Userspace binary formats" 2227menu "Userspace binary formats"
@@ -2199,7 +2246,7 @@ source "kernel/power/Kconfig"
2199 2246
2200config ARCH_SUSPEND_POSSIBLE 2247config ARCH_SUSPEND_POSSIBLE
2201 depends on !ARCH_S5PC100 2248 depends on !ARCH_S5PC100
2202 depends on CPU_ARM920T || CPU_ARM926T || CPU_SA1100 || \ 2249 depends on CPU_ARM920T || CPU_ARM926T || CPU_FEROCEON || CPU_SA1100 || \
2203 CPU_V6 || CPU_V6K || CPU_V7 || CPU_XSC3 || CPU_XSCALE || CPU_MOHAWK 2250 CPU_V6 || CPU_V6K || CPU_V7 || CPU_XSC3 || CPU_XSCALE || CPU_MOHAWK
2204 def_bool y 2251 def_bool y
2205 2252
diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug
index 583f4a00ec32..9762c84b4198 100644
--- a/arch/arm/Kconfig.debug
+++ b/arch/arm/Kconfig.debug
@@ -92,6 +92,7 @@ choice
92 config DEBUG_BCM2835 92 config DEBUG_BCM2835
93 bool "Kernel low-level debugging on BCM2835 PL011 UART" 93 bool "Kernel low-level debugging on BCM2835 PL011 UART"
94 depends on ARCH_BCM2835 94 depends on ARCH_BCM2835
95 select DEBUG_UART_PL01X
95 96
96 config DEBUG_CLPS711X_UART1 97 config DEBUG_CLPS711X_UART1
97 bool "Kernel low-level debugging messages via UART1" 98 bool "Kernel low-level debugging messages via UART1"
@@ -110,6 +111,7 @@ choice
110 config DEBUG_CNS3XXX 111 config DEBUG_CNS3XXX
111 bool "Kernel Kernel low-level debugging on Cavium Networks CNS3xxx" 112 bool "Kernel Kernel low-level debugging on Cavium Networks CNS3xxx"
112 depends on ARCH_CNS3XXX 113 depends on ARCH_CNS3XXX
114 select DEBUG_UART_PL01X
113 help 115 help
114 Say Y here if you want the debug print routines to direct 116 Say Y here if you want the debug print routines to direct
115 their output to the CNS3xxx UART0. 117 their output to the CNS3xxx UART0.
@@ -117,6 +119,7 @@ choice
117 config DEBUG_DAVINCI_DA8XX_UART1 119 config DEBUG_DAVINCI_DA8XX_UART1
118 bool "Kernel low-level debugging on DaVinci DA8XX using UART1" 120 bool "Kernel low-level debugging on DaVinci DA8XX using UART1"
119 depends on ARCH_DAVINCI_DA8XX 121 depends on ARCH_DAVINCI_DA8XX
122 select DEBUG_UART_8250
120 help 123 help
121 Say Y here if you want the debug print routines to direct 124 Say Y here if you want the debug print routines to direct
122 their output to UART1 serial port on DaVinci DA8XX devices. 125 their output to UART1 serial port on DaVinci DA8XX devices.
@@ -124,6 +127,7 @@ choice
124 config DEBUG_DAVINCI_DA8XX_UART2 127 config DEBUG_DAVINCI_DA8XX_UART2
125 bool "Kernel low-level debugging on DaVinci DA8XX using UART2" 128 bool "Kernel low-level debugging on DaVinci DA8XX using UART2"
126 depends on ARCH_DAVINCI_DA8XX 129 depends on ARCH_DAVINCI_DA8XX
130 select DEBUG_UART_8250
127 help 131 help
128 Say Y here if you want the debug print routines to direct 132 Say Y here if you want the debug print routines to direct
129 their output to UART2 serial port on DaVinci DA8XX devices. 133 their output to UART2 serial port on DaVinci DA8XX devices.
@@ -131,6 +135,7 @@ choice
131 config DEBUG_DAVINCI_DMx_UART0 135 config DEBUG_DAVINCI_DMx_UART0
132 bool "Kernel low-level debugging on DaVinci DMx using UART0" 136 bool "Kernel low-level debugging on DaVinci DMx using UART0"
133 depends on ARCH_DAVINCI_DMx 137 depends on ARCH_DAVINCI_DMx
138 select DEBUG_UART_8250
134 help 139 help
135 Say Y here if you want the debug print routines to direct 140 Say Y here if you want the debug print routines to direct
136 their output to UART0 serial port on DaVinci DMx devices. 141 their output to UART0 serial port on DaVinci DMx devices.
@@ -138,6 +143,7 @@ choice
138 config DEBUG_DAVINCI_TNETV107X_UART1 143 config DEBUG_DAVINCI_TNETV107X_UART1
139 bool "Kernel low-level debugging on DaVinci TNETV107x using UART1" 144 bool "Kernel low-level debugging on DaVinci TNETV107x using UART1"
140 depends on ARCH_DAVINCI_TNETV107X 145 depends on ARCH_DAVINCI_TNETV107X
146 select DEBUG_UART_8250
141 help 147 help
142 Say Y here if you want the debug print routines to direct 148 Say Y here if you want the debug print routines to direct
143 their output to UART1 serial port on DaVinci TNETV107X 149 their output to UART1 serial port on DaVinci TNETV107X
@@ -174,9 +180,26 @@ choice
174 Say Y here if you want the debug print routines to direct 180 Say Y here if you want the debug print routines to direct
175 their output to the 8250 at PCI COM1. 181 their output to the 8250 at PCI COM1.
176 182
183 config DEBUG_HI3620_UART
184 bool "Hisilicon HI3620 Debug UART"
185 depends on ARCH_HI3xxx
186 select DEBUG_UART_PL01X
187 help
188 Say Y here if you want kernel low-level debugging support
189 on HI3620 UART.
190
191 config DEBUG_HI3716_UART
192 bool "Hisilicon Hi3716 Debug UART"
193 depends on ARCH_HI3xxx
194 select DEBUG_UART_PL01X
195 help
196 Say Y here if you want kernel low-level debugging support
197 on HI3716 UART.
198
177 config DEBUG_HIGHBANK_UART 199 config DEBUG_HIGHBANK_UART
178 bool "Kernel low-level debugging messages via Highbank UART" 200 bool "Kernel low-level debugging messages via Highbank UART"
179 depends on ARCH_HIGHBANK 201 depends on ARCH_HIGHBANK
202 select DEBUG_UART_PL01X
180 help 203 help
181 Say Y here if you want the debug print routines to direct 204 Say Y here if you want the debug print routines to direct
182 their output to the UART on Highbank based devices. 205 their output to the UART on Highbank based devices.
@@ -191,6 +214,7 @@ choice
191 config DEBUG_IMX23_UART 214 config DEBUG_IMX23_UART
192 bool "i.MX23 Debug UART" 215 bool "i.MX23 Debug UART"
193 depends on SOC_IMX23 216 depends on SOC_IMX23
217 select DEBUG_UART_PL01X
194 help 218 help
195 Say Y here if you want kernel low-level debugging support 219 Say Y here if you want kernel low-level debugging support
196 on i.MX23. 220 on i.MX23.
@@ -212,6 +236,7 @@ choice
212 config DEBUG_IMX28_UART 236 config DEBUG_IMX28_UART
213 bool "i.MX28 Debug UART" 237 bool "i.MX28 Debug UART"
214 depends on SOC_IMX28 238 depends on SOC_IMX28
239 select DEBUG_UART_PL01X
215 help 240 help
216 Say Y here if you want kernel low-level debugging support 241 Say Y here if you want kernel low-level debugging support
217 on i.MX28. 242 on i.MX28.
@@ -261,6 +286,7 @@ choice
261 config DEBUG_KEYSTONE_UART0 286 config DEBUG_KEYSTONE_UART0
262 bool "Kernel low-level debugging on KEYSTONE2 using UART0" 287 bool "Kernel low-level debugging on KEYSTONE2 using UART0"
263 depends on ARCH_KEYSTONE 288 depends on ARCH_KEYSTONE
289 select DEBUG_UART_8250
264 help 290 help
265 Say Y here if you want the debug print routines to direct 291 Say Y here if you want the debug print routines to direct
266 their output to UART0 serial port on KEYSTONE2 devices. 292 their output to UART0 serial port on KEYSTONE2 devices.
@@ -268,6 +294,7 @@ choice
268 config DEBUG_KEYSTONE_UART1 294 config DEBUG_KEYSTONE_UART1
269 bool "Kernel low-level debugging on KEYSTONE2 using UART1" 295 bool "Kernel low-level debugging on KEYSTONE2 using UART1"
270 depends on ARCH_KEYSTONE 296 depends on ARCH_KEYSTONE
297 select DEBUG_UART_8250
271 help 298 help
272 Say Y here if you want the debug print routines to direct 299 Say Y here if you want the debug print routines to direct
273 their output to UART1 serial port on KEYSTONE2 devices. 300 their output to UART1 serial port on KEYSTONE2 devices.
@@ -275,6 +302,7 @@ choice
275 config DEBUG_MMP_UART2 302 config DEBUG_MMP_UART2
276 bool "Kernel low-level debugging message via MMP UART2" 303 bool "Kernel low-level debugging message via MMP UART2"
277 depends on ARCH_MMP 304 depends on ARCH_MMP
305 select DEBUG_UART_8250
278 help 306 help
279 Say Y here if you want kernel low-level debugging support 307 Say Y here if you want kernel low-level debugging support
280 on MMP UART2. 308 on MMP UART2.
@@ -282,6 +310,7 @@ choice
282 config DEBUG_MMP_UART3 310 config DEBUG_MMP_UART3
283 bool "Kernel low-level debugging message via MMP UART3" 311 bool "Kernel low-level debugging message via MMP UART3"
284 depends on ARCH_MMP 312 depends on ARCH_MMP
313 select DEBUG_UART_8250
285 help 314 help
286 Say Y here if you want kernel low-level debugging support 315 Say Y here if you want kernel low-level debugging support
287 on MMP UART3. 316 on MMP UART3.
@@ -326,6 +355,7 @@ choice
326 config DEBUG_MVEBU_UART 355 config DEBUG_MVEBU_UART
327 bool "Kernel low-level debugging messages via MVEBU UART (old bootloaders)" 356 bool "Kernel low-level debugging messages via MVEBU UART (old bootloaders)"
328 depends on ARCH_MVEBU 357 depends on ARCH_MVEBU
358 select DEBUG_UART_8250
329 help 359 help
330 Say Y here if you want kernel low-level debugging support 360 Say Y here if you want kernel low-level debugging support
331 on MVEBU based platforms. 361 on MVEBU based platforms.
@@ -344,6 +374,7 @@ choice
344 config DEBUG_MVEBU_UART_ALTERNATE 374 config DEBUG_MVEBU_UART_ALTERNATE
345 bool "Kernel low-level debugging messages via MVEBU UART (new bootloaders)" 375 bool "Kernel low-level debugging messages via MVEBU UART (new bootloaders)"
346 depends on ARCH_MVEBU 376 depends on ARCH_MVEBU
377 select DEBUG_UART_8250
347 help 378 help
348 Say Y here if you want kernel low-level debugging support 379 Say Y here if you want kernel low-level debugging support
349 on MVEBU based platforms. 380 on MVEBU based platforms.
@@ -358,6 +389,7 @@ choice
358 config DEBUG_NOMADIK_UART 389 config DEBUG_NOMADIK_UART
359 bool "Kernel low-level debugging messages via NOMADIK UART" 390 bool "Kernel low-level debugging messages via NOMADIK UART"
360 depends on ARCH_NOMADIK 391 depends on ARCH_NOMADIK
392 select DEBUG_UART_PL01X
361 help 393 help
362 Say Y here if you want kernel low-level debugging support 394 Say Y here if you want kernel low-level debugging support
363 on NOMADIK based platforms. 395 on NOMADIK based platforms.
@@ -365,6 +397,7 @@ choice
365 config DEBUG_NSPIRE_CLASSIC_UART 397 config DEBUG_NSPIRE_CLASSIC_UART
366 bool "Kernel low-level debugging via TI-NSPIRE 8250 UART" 398 bool "Kernel low-level debugging via TI-NSPIRE 8250 UART"
367 depends on ARCH_NSPIRE 399 depends on ARCH_NSPIRE
400 select DEBUG_UART_8250
368 help 401 help
369 Say Y here if you want kernel low-level debugging support 402 Say Y here if you want kernel low-level debugging support
370 on TI-NSPIRE classic models. 403 on TI-NSPIRE classic models.
@@ -372,20 +405,82 @@ choice
372 config DEBUG_NSPIRE_CX_UART 405 config DEBUG_NSPIRE_CX_UART
373 bool "Kernel low-level debugging via TI-NSPIRE PL011 UART" 406 bool "Kernel low-level debugging via TI-NSPIRE PL011 UART"
374 depends on ARCH_NSPIRE 407 depends on ARCH_NSPIRE
408 select DEBUG_UART_PL01X
375 help 409 help
376 Say Y here if you want kernel low-level debugging support 410 Say Y here if you want kernel low-level debugging support
377 on TI-NSPIRE CX models. 411 on TI-NSPIRE CX models.
378 412
379 config DEBUG_OMAP2PLUS_UART 413 config DEBUG_OMAP2UART1
380 bool "Kernel low-level debugging messages via OMAP2PLUS UART" 414 bool "OMAP2/3/4 UART1 (omap2/3 sdp boards and some omap3 boards)"
381 depends on ARCH_OMAP2PLUS 415 depends on ARCH_OMAP2PLUS
416 select DEBUG_OMAP2PLUS_UART
382 help 417 help
383 Say Y here if you want kernel low-level debugging support 418 This covers at least h4, 2430sdp, 3430sdp, 3630sdp,
384 on OMAP2PLUS based platforms. 419 omap3 torpedo and 3530 lv som.
420
421 config DEBUG_OMAP2UART2
422 bool "Kernel low-level debugging messages via OMAP2/3/4 UART2"
423 depends on ARCH_OMAP2PLUS
424 select DEBUG_OMAP2PLUS_UART
425
426 config DEBUG_OMAP2UART3
427 bool "Kernel low-level debugging messages via OMAP2 UART3 (n8x0)"
428 depends on ARCH_OMAP2PLUS
429 select DEBUG_OMAP2PLUS_UART
430
431 config DEBUG_OMAP3UART3
432 bool "Kernel low-level debugging messages via OMAP3 UART3 (most omap3 boards)"
433 depends on ARCH_OMAP2PLUS
434 select DEBUG_OMAP2PLUS_UART
435 help
436 This covers at least cm_t3x, beagle, crane, devkit8000,
437 igep00x0, ldp, n900, n9(50), pandora, overo, touchbook,
438 and 3517evm.
439
440 config DEBUG_OMAP4UART3
441 bool "Kernel low-level debugging messages via OMAP4/5 UART3 (omap4 blaze, panda, omap5 sevm)"
442 depends on ARCH_OMAP2PLUS
443 select DEBUG_OMAP2PLUS_UART
444
445 config DEBUG_OMAP3UART4
446 bool "Kernel low-level debugging messages via OMAP36XX UART4"
447 depends on ARCH_OMAP2PLUS
448 select DEBUG_OMAP2PLUS_UART
449
450 config DEBUG_OMAP4UART4
451 bool "Kernel low-level debugging messages via OMAP4/5 UART4"
452 depends on ARCH_OMAP2PLUS
453 select DEBUG_OMAP2PLUS_UART
454
455 config DEBUG_TI81XXUART1
456 bool "Kernel low-level debugging messages via TI81XX UART1 (ti8148evm)"
457 depends on ARCH_OMAP2PLUS
458 select DEBUG_OMAP2PLUS_UART
459
460 config DEBUG_TI81XXUART2
461 bool "Kernel low-level debugging messages via TI81XX UART2"
462 depends on ARCH_OMAP2PLUS
463 select DEBUG_OMAP2PLUS_UART
464
465 config DEBUG_TI81XXUART3
466 bool "Kernel low-level debugging messages via TI81XX UART3 (ti8168evm)"
467 depends on ARCH_OMAP2PLUS
468 select DEBUG_OMAP2PLUS_UART
469
470 config DEBUG_AM33XXUART1
471 bool "Kernel low-level debugging messages via AM33XX UART1"
472 depends on ARCH_OMAP2PLUS
473 select DEBUG_OMAP2PLUS_UART
474
475 config DEBUG_ZOOM_UART
476 bool "Kernel low-level debugging messages via Zoom2/3 UART"
477 depends on ARCH_OMAP2PLUS
478 select DEBUG_OMAP2PLUS_UART
385 479
386 config DEBUG_PICOXCELL_UART 480 config DEBUG_PICOXCELL_UART
387 depends on ARCH_PICOXCELL 481 depends on ARCH_PICOXCELL
388 bool "Use PicoXcell UART for low-level debug" 482 bool "Use PicoXcell UART for low-level debug"
483 select DEBUG_UART_8250
389 help 484 help
390 Say Y here if you want kernel low-level debugging support 485 Say Y here if you want kernel low-level debugging support
391 on PicoXcell based platforms. 486 on PicoXcell based platforms.
@@ -393,6 +488,7 @@ choice
393 config DEBUG_PXA_UART1 488 config DEBUG_PXA_UART1
394 depends on ARCH_PXA 489 depends on ARCH_PXA
395 bool "Use PXA UART1 for low-level debug" 490 bool "Use PXA UART1 for low-level debug"
491 select DEBUG_UART_8250
396 help 492 help
397 Say Y here if you want kernel low-level debugging support 493 Say Y here if you want kernel low-level debugging support
398 on PXA UART1. 494 on PXA UART1.
@@ -400,6 +496,7 @@ choice
400 config DEBUG_REALVIEW_STD_PORT 496 config DEBUG_REALVIEW_STD_PORT
401 bool "RealView Default UART" 497 bool "RealView Default UART"
402 depends on ARCH_REALVIEW 498 depends on ARCH_REALVIEW
499 select DEBUG_UART_PL01X
403 help 500 help
404 Say Y here if you want the debug print routines to direct 501 Say Y here if you want the debug print routines to direct
405 their output to the serial port on RealView EB, PB11MP, PBA8 502 their output to the serial port on RealView EB, PB11MP, PBA8
@@ -408,14 +505,64 @@ choice
408 config DEBUG_REALVIEW_PB1176_PORT 505 config DEBUG_REALVIEW_PB1176_PORT
409 bool "RealView PB1176 UART" 506 bool "RealView PB1176 UART"
410 depends on MACH_REALVIEW_PB1176 507 depends on MACH_REALVIEW_PB1176
508 select DEBUG_UART_PL01X
411 help 509 help
412 Say Y here if you want the debug print routines to direct 510 Say Y here if you want the debug print routines to direct
413 their output to the standard serial port on the RealView 511 their output to the standard serial port on the RealView
414 PB1176 platform. 512 PB1176 platform.
415 513
416 config DEBUG_ROCKCHIP_UART 514 config DEBUG_RK29_UART0
417 bool "Kernel low-level debugging messages via Rockchip UART" 515 bool "Kernel low-level debugging messages via Rockchip RK29 UART0"
516 depends on ARCH_ROCKCHIP
517 select DEBUG_UART_8250
518 help
519 Say Y here if you want kernel low-level debugging support
520 on Rockchip based platforms.
521
522 config DEBUG_RK29_UART1
523 bool "Kernel low-level debugging messages via Rockchip RK29 UART1"
524 depends on ARCH_ROCKCHIP
525 select DEBUG_UART_8250
526 help
527 Say Y here if you want kernel low-level debugging support
528 on Rockchip based platforms.
529
530 config DEBUG_RK29_UART2
531 bool "Kernel low-level debugging messages via Rockchip RK29 UART2"
532 depends on ARCH_ROCKCHIP
533 select DEBUG_UART_8250
534 help
535 Say Y here if you want kernel low-level debugging support
536 on Rockchip based platforms.
537
538 config DEBUG_RK3X_UART0
539 bool "Kernel low-level debugging messages via Rockchip RK3X UART0"
540 depends on ARCH_ROCKCHIP
541 select DEBUG_UART_8250
542 help
543 Say Y here if you want kernel low-level debugging support
544 on Rockchip based platforms.
545
546 config DEBUG_RK3X_UART1
547 bool "Kernel low-level debugging messages via Rockchip RK3X UART1"
548 depends on ARCH_ROCKCHIP
549 select DEBUG_UART_8250
550 help
551 Say Y here if you want kernel low-level debugging support
552 on Rockchip based platforms.
553
554 config DEBUG_RK3X_UART2
555 bool "Kernel low-level debugging messages via Rockchip RK3X UART2"
556 depends on ARCH_ROCKCHIP
557 select DEBUG_UART_8250
558 help
559 Say Y here if you want kernel low-level debugging support
560 on Rockchip based platforms.
561
562 config DEBUG_RK3X_UART3
563 bool "Kernel low-level debugging messages via Rockchip RK3X UART3"
418 depends on ARCH_ROCKCHIP 564 depends on ARCH_ROCKCHIP
565 select DEBUG_UART_8250
419 help 566 help
420 Say Y here if you want kernel low-level debugging support 567 Say Y here if you want kernel low-level debugging support
421 on Rockchip based platforms. 568 on Rockchip based platforms.
@@ -471,6 +618,7 @@ choice
471 config DEBUG_SOCFPGA_UART 618 config DEBUG_SOCFPGA_UART
472 depends on ARCH_SOCFPGA 619 depends on ARCH_SOCFPGA
473 bool "Use SOCFPGA UART for low-level debug" 620 bool "Use SOCFPGA UART for low-level debug"
621 select DEBUG_UART_8250
474 help 622 help
475 Say Y here if you want kernel low-level debugging support 623 Say Y here if you want kernel low-level debugging support
476 on SOCFPGA based platforms. 624 on SOCFPGA based platforms.
@@ -478,6 +626,7 @@ choice
478 config DEBUG_SUNXI_UART0 626 config DEBUG_SUNXI_UART0
479 bool "Kernel low-level debugging messages via sunXi UART0" 627 bool "Kernel low-level debugging messages via sunXi UART0"
480 depends on ARCH_SUNXI 628 depends on ARCH_SUNXI
629 select DEBUG_UART_8250
481 help 630 help
482 Say Y here if you want kernel low-level debugging support 631 Say Y here if you want kernel low-level debugging support
483 on Allwinner A1X based platforms on the UART0. 632 on Allwinner A1X based platforms on the UART0.
@@ -485,13 +634,59 @@ choice
485 config DEBUG_SUNXI_UART1 634 config DEBUG_SUNXI_UART1
486 bool "Kernel low-level debugging messages via sunXi UART1" 635 bool "Kernel low-level debugging messages via sunXi UART1"
487 depends on ARCH_SUNXI 636 depends on ARCH_SUNXI
637 select DEBUG_UART_8250
488 help 638 help
489 Say Y here if you want kernel low-level debugging support 639 Say Y here if you want kernel low-level debugging support
490 on Allwinner A1X based platforms on the UART1. 640 on Allwinner A1X based platforms on the UART1.
491 641
492 config DEBUG_TEGRA_UART 642 config TEGRA_DEBUG_UART_AUTO_ODMDATA
643 bool "Kernel low-level debugging messages via Tegra UART via ODMDATA"
644 depends on ARCH_TEGRA
645 select DEBUG_TEGRA_UART
646 help
647 Automatically determines which UART to use for low-level
648 debug based on the ODMDATA value. This value is part of
649 the BCT, and is written to the boot memory device using
650 nvflash, or other flashing tool. When bits 19:18 are 3,
651 then bits 17:15 indicate which UART to use; 0/1/2/3/4
652 are UART A/B/C/D/E.
653
654 config TEGRA_DEBUG_UARTA
655 bool "Kernel low-level debugging messages via Tegra UART A"
656 depends on ARCH_TEGRA
657 select DEBUG_TEGRA_UART
658 help
659 Say Y here if you want kernel low-level debugging support
660 on Tegra based platforms.
661
662 config TEGRA_DEBUG_UARTB
663 bool "Kernel low-level debugging messages via Tegra UART B"
664 depends on ARCH_TEGRA
665 select DEBUG_TEGRA_UART
666 help
667 Say Y here if you want kernel low-level debugging support
668 on Tegra based platforms.
669
670 config TEGRA_DEBUG_UARTC
671 bool "Kernel low-level debugging messages via Tegra UART C"
672 depends on ARCH_TEGRA
673 select DEBUG_TEGRA_UART
674 help
675 Say Y here if you want kernel low-level debugging support
676 on Tegra based platforms.
677
678 config TEGRA_DEBUG_UARTD
679 bool "Kernel low-level debugging messages via Tegra UART D"
680 depends on ARCH_TEGRA
681 select DEBUG_TEGRA_UART
682 help
683 Say Y here if you want kernel low-level debugging support
684 on Tegra based platforms.
685
686 config TEGRA_DEBUG_UARTE
687 bool "Kernel low-level debugging messages via Tegra UART E"
493 depends on ARCH_TEGRA 688 depends on ARCH_TEGRA
494 bool "Use Tegra UART for low-level debug" 689 select DEBUG_TEGRA_UART
495 help 690 help
496 Say Y here if you want kernel low-level debugging support 691 Say Y here if you want kernel low-level debugging support
497 on Tegra based platforms. 692 on Tegra based platforms.
@@ -510,19 +705,32 @@ choice
510 Say Y here if you want the debug print routines to direct 705 Say Y here if you want the debug print routines to direct
511 their output to the uart1 port on SiRFmarco devices. 706 their output to the uart1 port on SiRFmarco devices.
512 707
513 config DEBUG_STI_UART 708 config STIH41X_DEBUG_ASC2
709 bool "Use StiH415/416 ASC2 UART for low-level debug"
710 depends on ARCH_STI
711 select DEBUG_STI_UART
712 help
713 Say Y here if you want kernel low-level debugging support
714 on STiH415/416 based platforms like b2000, which has
715 default UART wired up to ASC2.
716
717 If unsure, say N.
718
719 config STIH41X_DEBUG_SBC_ASC1
720 bool "Use StiH415/416 SBC ASC1 UART for low-level debug"
514 depends on ARCH_STI 721 depends on ARCH_STI
515 bool "Use StiH415/416 ASC for low-level debug" 722 select DEBUG_STI_UART
516 help 723 help
517 Say Y here if you want kernel low-level debugging support 724 Say Y here if you want kernel low-level debugging support
518 on StiH415/416 based platforms like B2000, B2020. 725 on STiH415/416 based platforms like b2020. which has
519 It support UART2 and SBC_UART1. 726 default UART wired up to SBC ASC1.
520 727
521 If unsure, say N. 728 If unsure, say N.
522 729
523 config DEBUG_U300_UART 730 config DEBUG_U300_UART
524 bool "Kernel low-level debugging messages via U300 UART0" 731 bool "Kernel low-level debugging messages via U300 UART0"
525 depends on ARCH_U300 732 depends on ARCH_U300
733 select DEBUG_UART_PL01X
526 help 734 help
527 Say Y here if you want the debug print routines to direct 735 Say Y here if you want the debug print routines to direct
528 their output to the uart port on U300 devices. 736 their output to the uart port on U300 devices.
@@ -548,6 +756,7 @@ choice
548 config DEBUG_VEXPRESS_UART0_CA9 756 config DEBUG_VEXPRESS_UART0_CA9
549 bool "Use PL011 UART0 at 0x10009000 (V2P-CA9 core tile)" 757 bool "Use PL011 UART0 at 0x10009000 (V2P-CA9 core tile)"
550 depends on ARCH_VEXPRESS 758 depends on ARCH_VEXPRESS
759 select DEBUG_UART_PL01X
551 help 760 help
552 This option selects UART0 at 0x10009000. Except for custom models, 761 This option selects UART0 at 0x10009000. Except for custom models,
553 this applies only to the V2P-CA9 tile. 762 this applies only to the V2P-CA9 tile.
@@ -555,6 +764,7 @@ choice
555 config DEBUG_VEXPRESS_UART0_RS1 764 config DEBUG_VEXPRESS_UART0_RS1
556 bool "Use PL011 UART0 at 0x1c090000 (RS1 complaint tiles)" 765 bool "Use PL011 UART0 at 0x1c090000 (RS1 complaint tiles)"
557 depends on ARCH_VEXPRESS 766 depends on ARCH_VEXPRESS
767 select DEBUG_UART_PL01X
558 help 768 help
559 This option selects UART0 at 0x1c090000. This applies to most 769 This option selects UART0 at 0x1c090000. This applies to most
560 of the tiles using the RS1 memory map, including all new A-class 770 of the tiles using the RS1 memory map, including all new A-class
@@ -563,6 +773,7 @@ choice
563 config DEBUG_VEXPRESS_UART0_CRX 773 config DEBUG_VEXPRESS_UART0_CRX
564 bool "Use PL011 UART0 at 0xb0090000 (Cortex-R compliant tiles)" 774 bool "Use PL011 UART0 at 0xb0090000 (Cortex-R compliant tiles)"
565 depends on ARCH_VEXPRESS && !MMU 775 depends on ARCH_VEXPRESS && !MMU
776 select DEBUG_UART_PL01X
566 help 777 help
567 This option selects UART0 at 0xb0090000. This is appropriate for 778 This option selects UART0 at 0xb0090000. This is appropriate for
568 Cortex-R series tiles and SMMs, such as Cortex-R5 and Cortex-R7 779 Cortex-R series tiles and SMMs, such as Cortex-R5 and Cortex-R7
@@ -579,7 +790,7 @@ choice
579 depends on !ARCH_MULTIPLATFORM 790 depends on !ARCH_MULTIPLATFORM
580 help 791 help
581 Say Y here if your platform doesn't provide a UART option 792 Say Y here if your platform doesn't provide a UART option
582 below. This relies on your platform choosing the right UART 793 above. This relies on your platform choosing the right UART
583 definition internally in order for low-level debugging to 794 definition internally in order for low-level debugging to
584 work. 795 work.
585 796
@@ -610,11 +821,41 @@ choice
610 For more details about semihosting, please see 821 For more details about semihosting, please see
611 chapter 8 of DUI0203I_rvct_developer_guide.pdf from ARM Ltd. 822 chapter 8 of DUI0203I_rvct_developer_guide.pdf from ARM Ltd.
612 823
824 config DEBUG_LL_UART_8250
825 bool "Kernel low-level debugging via 8250 UART"
826 help
827 Say Y here if you wish the debug print routes to direct
828 their output to an 8250 UART. You can use this option
829 to provide the parameters for the 8250 UART rather than
830 selecting one of the platform specific options above if
831 you know the parameters for the port.
832
833 This option is preferred over the platform specific
834 options; the platform specific options are deprecated
835 and will be soon removed.
836
837 config DEBUG_LL_UART_PL01X
838 bool "Kernel low-level debugging via ARM Ltd PL01x Primecell UART"
839 help
840 Say Y here if you wish the debug print routes to direct
841 their output to a PL01x Primecell UART. You can use
842 this option to provide the parameters for the UART
843 rather than selecting one of the platform specific
844 options above if you know the parameters for the port.
845
846 This option is preferred over the platform specific
847 options; the platform specific options are deprecated
848 and will be soon removed.
849
613endchoice 850endchoice
614 851
615config DEBUG_EXYNOS_UART 852config DEBUG_EXYNOS_UART
616 bool 853 bool
617 854
855config DEBUG_OMAP2PLUS_UART
856 bool
857 depends on ARCH_OMAP2PLUS
858
618config DEBUG_IMX_UART_PORT 859config DEBUG_IMX_UART_PORT
619 int "i.MX Debug UART Port Selection" if DEBUG_IMX1_UART || \ 860 int "i.MX Debug UART Port Selection" if DEBUG_IMX1_UART || \
620 DEBUG_IMX25_UART || \ 861 DEBUG_IMX25_UART || \
@@ -631,140 +872,19 @@ config DEBUG_IMX_UART_PORT
631 Choose UART port on which kernel low-level debug messages 872 Choose UART port on which kernel low-level debug messages
632 should be output. 873 should be output.
633 874
634choice 875config DEBUG_TEGRA_UART
635 prompt "Low-level debug console UART" 876 bool
636 depends on DEBUG_OMAP2PLUS_UART 877 depends on ARCH_TEGRA
637
638 config DEBUG_OMAP2UART1
639 bool "OMAP2/3/4 UART1 (omap2/3 sdp boards and some omap3 boards)"
640 help
641 This covers at least h4, 2430sdp, 3430sdp, 3630sdp,
642 omap3 torpedo and 3530 lv som.
643
644 config DEBUG_OMAP2UART2
645 bool "OMAP2/3/4 UART2"
646
647 config DEBUG_OMAP2UART3
648 bool "OMAP2 UART3 (n8x0)"
649
650 config DEBUG_OMAP3UART3
651 bool "OMAP3 UART3 (most omap3 boards)"
652 help
653 This covers at least cm_t3x, beagle, crane, devkit8000,
654 igep00x0, ldp, n900, n9(50), pandora, overo, touchbook,
655 and 3517evm.
656
657 config DEBUG_OMAP4UART3
658 bool "OMAP4/5 UART3 (omap4 blaze, panda, omap5 sevm)"
659
660 config DEBUG_OMAP3UART4
661 bool "OMAP36XX UART4"
662
663 config DEBUG_OMAP4UART4
664 bool "OMAP4/5 UART4"
665
666 config DEBUG_TI81XXUART1
667 bool "TI81XX UART1 (ti8148evm)"
668
669 config DEBUG_TI81XXUART2
670 bool "TI81XX UART2"
671
672 config DEBUG_TI81XXUART3
673 bool "TI81XX UART3 (ti8168evm)"
674
675 config DEBUG_AM33XXUART1
676 bool "AM33XX UART1"
677
678 config DEBUG_ZOOM_UART
679 bool "Zoom2/3 UART"
680endchoice
681
682choice
683 prompt "Low-level debug console UART"
684 depends on DEBUG_ROCKCHIP_UART
685
686 config DEBUG_RK29_UART0
687 bool "RK29 UART0"
688
689 config DEBUG_RK29_UART1
690 bool "RK29 UART1"
691
692 config DEBUG_RK29_UART2
693 bool "RK29 UART2"
694
695 config DEBUG_RK3X_UART0
696 bool "RK3X UART0"
697
698 config DEBUG_RK3X_UART1
699 bool "RK3X UART1"
700
701 config DEBUG_RK3X_UART2
702 bool "RK3X UART2"
703
704 config DEBUG_RK3X_UART3
705 bool "RK3X UART3"
706endchoice
707
708choice
709 prompt "Low-level debug console UART"
710 depends on DEBUG_LL && DEBUG_TEGRA_UART
711
712 config TEGRA_DEBUG_UART_AUTO_ODMDATA
713 bool "Via ODMDATA"
714 help
715 Automatically determines which UART to use for low-level debug based
716 on the ODMDATA value. This value is part of the BCT, and is written
717 to the boot memory device using nvflash, or other flashing tool.
718 When bits 19:18 are 3, then bits 17:15 indicate which UART to use;
719 0/1/2/3/4 are UART A/B/C/D/E.
720
721 config TEGRA_DEBUG_UARTA
722 bool "UART A"
723
724 config TEGRA_DEBUG_UARTB
725 bool "UART B"
726
727 config TEGRA_DEBUG_UARTC
728 bool "UART C"
729
730 config TEGRA_DEBUG_UARTD
731 bool "UART D"
732
733 config TEGRA_DEBUG_UARTE
734 bool "UART E"
735
736endchoice
737
738choice
739 prompt "Low-level debug console UART"
740 depends on DEBUG_LL && DEBUG_STI_UART
741
742 config STIH41X_DEBUG_ASC2
743 bool "ASC2 UART"
744 help
745 Say Y here if you want kernel low-level debugging support
746 on STiH415/416 based platforms like b2000, which has
747 default UART wired up to ASC2.
748
749 If unsure, say N.
750
751 config STIH41X_DEBUG_SBC_ASC1
752 bool "SBC ASC1 UART"
753 help
754 Say Y here if you want kernel low-level debugging support
755 on STiH415/416 based platforms like b2020. which has
756 default UART wired up to SBC ASC1.
757
758 If unsure, say N.
759 878
760endchoice 879config DEBUG_STI_UART
880 bool
881 depends on ARCH_STI
761 882
762config DEBUG_LL_INCLUDE 883config DEBUG_LL_INCLUDE
763 string 884 string
764 default "debug/bcm2835.S" if DEBUG_BCM2835 885 default "debug/8250.S" if DEBUG_LL_UART_8250 || DEBUG_UART_8250
765 default "debug/cns3xxx.S" if DEBUG_CNS3XXX 886 default "debug/pl01x.S" if DEBUG_LL_UART_PL01X || DEBUG_UART_PL01X
766 default "debug/exynos.S" if DEBUG_EXYNOS_UART 887 default "debug/exynos.S" if DEBUG_EXYNOS_UART
767 default "debug/highbank.S" if DEBUG_HIGHBANK_UART
768 default "debug/icedcc.S" if DEBUG_ICEDCC 888 default "debug/icedcc.S" if DEBUG_ICEDCC
769 default "debug/imx.S" if DEBUG_IMX1_UART || \ 889 default "debug/imx.S" if DEBUG_IMX1_UART || \
770 DEBUG_IMX25_UART || \ 890 DEBUG_IMX25_UART || \
@@ -775,38 +895,175 @@ config DEBUG_LL_INCLUDE
775 DEBUG_IMX53_UART ||\ 895 DEBUG_IMX53_UART ||\
776 DEBUG_IMX6Q_UART || \ 896 DEBUG_IMX6Q_UART || \
777 DEBUG_IMX6SL_UART 897 DEBUG_IMX6SL_UART
778 default "debug/keystone.S" if DEBUG_KEYSTONE_UART0 || \ 898 default "debug/msm.S" if DEBUG_MSM_UART1 || \
779 DEBUG_KEYSTONE_UART1 899 DEBUG_MSM_UART2 || \
780 default "debug/mvebu.S" if DEBUG_MVEBU_UART || \ 900 DEBUG_MSM_UART3 || \
781 DEBUG_MVEBU_UART_ALTERNATE 901 DEBUG_MSM8660_UART || \
782 default "debug/mxs.S" if DEBUG_IMX23_UART || DEBUG_IMX28_UART 902 DEBUG_MSM8960_UART
783 default "debug/nomadik.S" if DEBUG_NOMADIK_UART
784 default "debug/nspire.S" if DEBUG_NSPIRE_CX_UART || \
785 DEBUG_NSPIRE_CLASSIC_UART
786 default "debug/omap2plus.S" if DEBUG_OMAP2PLUS_UART 903 default "debug/omap2plus.S" if DEBUG_OMAP2PLUS_UART
787 default "debug/picoxcell.S" if DEBUG_PICOXCELL_UART
788 default "debug/pxa.S" if DEBUG_PXA_UART1 || DEBUG_MMP_UART2 || \
789 DEBUG_MMP_UART3
790 default "debug/rockchip.S" if DEBUG_ROCKCHIP_UART
791 default "debug/sirf.S" if DEBUG_SIRFPRIMA2_UART1 || DEBUG_SIRFMARCO_UART1 904 default "debug/sirf.S" if DEBUG_SIRFPRIMA2_UART1 || DEBUG_SIRFMARCO_UART1
792 default "debug/socfpga.S" if DEBUG_SOCFPGA_UART
793 default "debug/sti.S" if DEBUG_STI_UART 905 default "debug/sti.S" if DEBUG_STI_UART
794 default "debug/sunxi.S" if DEBUG_SUNXI_UART0 || DEBUG_SUNXI_UART1
795 default "debug/tegra.S" if DEBUG_TEGRA_UART 906 default "debug/tegra.S" if DEBUG_TEGRA_UART
796 default "debug/u300.S" if DEBUG_U300_UART
797 default "debug/ux500.S" if DEBUG_UX500_UART 907 default "debug/ux500.S" if DEBUG_UX500_UART
798 default "debug/vexpress.S" if DEBUG_VEXPRESS_UART0_DETECT || \ 908 default "debug/vexpress.S" if DEBUG_VEXPRESS_UART0_DETECT
799 DEBUG_VEXPRESS_UART0_CA9 || DEBUG_VEXPRESS_UART0_RS1 || \
800 DEBUG_VEXPRESS_UART0_CRX
801 default "debug/vt8500.S" if DEBUG_VT8500_UART0 909 default "debug/vt8500.S" if DEBUG_VT8500_UART0
802 default "debug/zynq.S" if DEBUG_ZYNQ_UART0 || DEBUG_ZYNQ_UART1 910 default "debug/zynq.S" if DEBUG_ZYNQ_UART0 || DEBUG_ZYNQ_UART1
803 default "mach/debug-macro.S" 911 default "mach/debug-macro.S"
804 912
913# Compatibility options for PL01x
914config DEBUG_UART_PL01X
915 def_bool ARCH_EP93XX || \
916 ARCH_INTEGRATOR || \
917 ARCH_SPEAR3XX || \
918 ARCH_SPEAR6XX || \
919 ARCH_SPEAR13XX || \
920 ARCH_VERSATILE
921
922# Compatibility options for 8250
923config DEBUG_UART_8250
924 def_bool ARCH_DOVE || ARCH_EBSA110 || \
925 (FOOTBRIDGE && !DEBUG_DC21285_PORT) || \
926 ARCH_GEMINI || ARCH_IOP13XX || ARCH_IOP32X || \
927 ARCH_IOP33X || ARCH_IXP4XX || ARCH_KIRKWOOD || \
928 ARCH_LPC32XX || ARCH_MV78XX0 || ARCH_ORION5X || ARCH_RPC
929
930config DEBUG_UART_PHYS
931 hex "Physical base address of debug UART"
932 default 0x01c20000 if DEBUG_DAVINCI_DMx_UART0
933 default 0x01c28000 if DEBUG_SUNXI_UART0
934 default 0x01c28400 if DEBUG_SUNXI_UART1
935 default 0x01d0c000 if DEBUG_DAVINCI_DA8XX_UART1
936 default 0x01d0d000 if DEBUG_DAVINCI_DA8XX_UART2
937 default 0x02530c00 if DEBUG_KEYSTONE_UART0
938 default 0x02531000 if DEBUG_KEYSTONE_UART1
939 default 0x03010fe0 if ARCH_RPC
940 default 0x08108300 if DEBUG_DAVINCI_TNETV107X_UART1
941 default 0x10009000 if DEBUG_REALVIEW_STD_PORT || DEBUG_CNS3XXX || \
942 DEBUG_VEXPRESS_UART0_CA9
943 default 0x1010c000 if DEBUG_REALVIEW_PB1176_PORT
944 default 0x10124000 if DEBUG_RK3X_UART0
945 default 0x10126000 if DEBUG_RK3X_UART1
946 default 0x101f1000 if ARCH_VERSATILE
947 default 0x101fb000 if DEBUG_NOMADIK_UART
948 default 0x16000000 if ARCH_INTEGRATOR
949 default 0x1c090000 if DEBUG_VEXPRESS_UART0_RS1
950 default 0x20060000 if DEBUG_RK29_UART0
951 default 0x20064000 if DEBUG_RK29_UART1 || DEBUG_RK3X_UART2
952 default 0x20068000 if DEBUG_RK29_UART2 || DEBUG_RK3X_UART3
953 default 0x20201000 if DEBUG_BCM2835
954 default 0x40090000 if ARCH_LPC32XX
955 default 0x40100000 if DEBUG_PXA_UART1
956 default 0x42000000 if ARCH_GEMINI
957 default 0x7c0003f8 if FOOTBRIDGE
958 default 0x80230000 if DEBUG_PICOXCELL_UART
959 default 0x80070000 if DEBUG_IMX23_UART
960 default 0x80074000 if DEBUG_IMX28_UART
961 default 0x808c0000 if ARCH_EP93XX
962 default 0x90020000 if DEBUG_NSPIRE_CLASSIC_UART || DEBUG_NSPIRE_CX_UART
963 default 0xb0090000 if DEBUG_VEXPRESS_UART0_CRX
964 default 0xc0013000 if DEBUG_U300_UART
965 default 0xc8000000 if ARCH_IXP4XX && !CPU_BIG_ENDIAN
966 default 0xc8000003 if ARCH_IXP4XX && CPU_BIG_ENDIAN
967 default 0xd0000000 if ARCH_SPEAR3XX || ARCH_SPEAR6XX
968 default 0xd0012000 if DEBUG_MVEBU_UART
969 default 0xd4017000 if DEBUG_MMP_UART2
970 default 0xd4018000 if DEBUG_MMP_UART3
971 default 0xe0000000 if ARCH_SPEAR13XX
972 default 0xf0000be0 if ARCH_EBSA110
973 default 0xf1012000 if DEBUG_MVEBU_UART_ALTERNATE
974 default 0xf1012000 if ARCH_DOVE || ARCH_KIRKWOOD || ARCH_MV78XX0 || \
975 ARCH_ORION5X
976 default 0xf8b00000 if DEBUG_HI3716_UART
977 default 0xfcb00000 if DEBUG_HI3620_UART
978 default 0xfe800000 if ARCH_IOP32X
979 default 0xffc02000 if DEBUG_SOCFPGA_UART
980 default 0xffd82340 if ARCH_IOP13XX
981 default 0xfff36000 if DEBUG_HIGHBANK_UART
982 default 0xfffff700 if ARCH_IOP33X
983 depends on DEBUG_LL_UART_8250 || DEBUG_LL_UART_PL01X || \
984 DEBUG_UART_8250 || DEBUG_UART_PL01X
985
986config DEBUG_UART_VIRT
987 hex "Virtual base address of debug UART"
988 default 0xe0010fe0 if ARCH_RPC
989 default 0xf0000be0 if ARCH_EBSA110
990 default 0xf0009000 if DEBUG_CNS3XXX
991 default 0xf01fb000 if DEBUG_NOMADIK_UART
992 default 0xf0201000 if DEBUG_BCM2835
993 default 0xf11f1000 if ARCH_VERSATILE
994 default 0xf1600000 if ARCH_INTEGRATOR
995 default 0xf1c28000 if DEBUG_SUNXI_UART0
996 default 0xf1c28400 if DEBUG_SUNXI_UART1
997 default 0xf2100000 if DEBUG_PXA_UART1
998 default 0xf4090000 if ARCH_LPC32XX
999 default 0xf4200000 if ARCH_GEMINI
1000 default 0xf8009000 if DEBUG_VEXPRESS_UART0_CA9
1001 default 0xf8090000 if DEBUG_VEXPRESS_UART0_RS1
1002 default 0xfb009000 if DEBUG_REALVIEW_STD_PORT
1003 default 0xfb10c000 if DEBUG_REALVIEW_PB1176_PORT
1004 default 0xfd000000 if ARCH_SPEAR3XX || ARCH_SPEAR6XX
1005 default 0xfd000000 if ARCH_SPEAR13XX
1006 default 0xfd012000 if ARCH_MV78XX0
1007 default 0xfde12000 if ARCH_DOVE
1008 default 0xfe012000 if ARCH_ORION5X
1009 default 0xfe017000 if DEBUG_MMP_UART2
1010 default 0xfe018000 if DEBUG_MMP_UART3
1011 default 0xfe100000 if DEBUG_IMX23_UART || DEBUG_IMX28_UART
1012 default 0xfe230000 if DEBUG_PICOXCELL_UART
1013 default 0xfe800000 if ARCH_IOP32X
1014 default 0xfeb00000 if DEBUG_HI3620_UART || DEBUG_HI3716_UART
1015 default 0xfeb24000 if DEBUG_RK3X_UART0
1016 default 0xfeb26000 if DEBUG_RK3X_UART1
1017 default 0xfeb30c00 if DEBUG_KEYSTONE_UART0
1018 default 0xfeb31000 if DEBUG_KEYSTONE_UART1
1019 default 0xfec12000 if DEBUG_MVEBU_UART || DEBUG_MVEBU_UART_ALTERNATE
1020 default 0xfed60000 if DEBUG_RK29_UART0
1021 default 0xfed64000 if DEBUG_RK29_UART1 || DEBUG_RK3X_UART2
1022 default 0xfed68000 if DEBUG_RK29_UART2 || DEBUG_RK3X_UART3
1023 default 0xfec02000 if DEBUG_SOCFPGA_UART
1024 default 0xfec20000 if DEBUG_DAVINCI_DMx_UART0
1025 default 0xfed0c000 if DEBUG_DAVINCI_DA8XX_UART1
1026 default 0xfed0d000 if DEBUG_DAVINCI_DA8XX_UART2
1027 default 0xfed12000 if ARCH_KIRKWOOD
1028 default 0xfedc0000 if ARCH_EP93XX
1029 default 0xfee003f8 if FOOTBRIDGE
1030 default 0xfee08300 if DEBUG_DAVINCI_TNETV107X_UART1
1031 default 0xfee20000 if DEBUG_NSPIRE_CLASSIC_UART || DEBUG_NSPIRE_CX_UART
1032 default 0xfef36000 if DEBUG_HIGHBANK_UART
1033 default 0xfee82340 if ARCH_IOP13XX
1034 default 0xfef00000 if ARCH_IXP4XX && !CPU_BIG_ENDIAN
1035 default 0xfef00003 if ARCH_IXP4XX && CPU_BIG_ENDIAN
1036 default 0xfefff700 if ARCH_IOP33X
1037 default 0xff003000 if DEBUG_U300_UART
1038 default DEBUG_UART_PHYS if !MMU
1039 depends on DEBUG_LL_UART_8250 || DEBUG_LL_UART_PL01X || \
1040 DEBUG_UART_8250 || DEBUG_UART_PL01X
1041
1042config DEBUG_UART_8250_SHIFT
1043 int "Register offset shift for the 8250 debug UART"
1044 depends on DEBUG_LL_UART_8250 || DEBUG_UART_8250
1045 default 0 if FOOTBRIDGE || ARCH_IOP32X
1046 default 2
1047
1048config DEBUG_UART_8250_WORD
1049 bool "Use 32-bit accesses for 8250 UART"
1050 depends on DEBUG_LL_UART_8250 || DEBUG_UART_8250
1051 depends on DEBUG_UART_8250_SHIFT >= 2
1052 default y if DEBUG_PICOXCELL_UART || DEBUG_SOCFPGA_UART || \
1053 ARCH_KEYSTONE || \
1054 DEBUG_DAVINCI_DMx_UART0 || DEBUG_DAVINCI_DA8XX_UART1 || \
1055 DEBUG_DAVINCI_DA8XX_UART2 || DEBUG_DAVINCI_TNETV107X_UART1
1056
1057config DEBUG_UART_8250_FLOW_CONTROL
1058 bool "Enable flow control for 8250 UART"
1059 depends on DEBUG_LL_UART_8250 || DEBUG_UART_8250
1060 default y if ARCH_EBSA110 || FOOTBRIDGE || ARCH_GEMINI || ARCH_RPC
1061
805config DEBUG_UNCOMPRESS 1062config DEBUG_UNCOMPRESS
806 bool 1063 bool
807 depends on ARCH_MULTIPLATFORM 1064 depends on ARCH_MULTIPLATFORM || ARCH_MSM
808 default y if DEBUG_LL && !DEBUG_OMAP2PLUS_UART && \ 1065 default y if DEBUG_LL && !DEBUG_OMAP2PLUS_UART && \
809 !DEBUG_TEGRA_UART 1066 (!DEBUG_TEGRA_UART || !ZBOOT_ROM)
810 help 1067 help
811 This option influences the normal decompressor output for 1068 This option influences the normal decompressor output for
812 multiplatform kernels. Normally, multiplatform kernels disable 1069 multiplatform kernels. Normally, multiplatform kernels disable
@@ -820,7 +1077,7 @@ config DEBUG_UNCOMPRESS
820 1077
821config UNCOMPRESS_INCLUDE 1078config UNCOMPRESS_INCLUDE
822 string 1079 string
823 default "debug/uncompress.h" if ARCH_MULTIPLATFORM 1080 default "debug/uncompress.h" if ARCH_MULTIPLATFORM || ARCH_MSM
824 default "mach/uncompress.h" 1081 default "mach/uncompress.h"
825 1082
826config EARLY_PRINTK 1083config EARLY_PRINTK
diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index 6fd2ceae305a..a37a50f575a2 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -190,6 +190,7 @@ machine-$(CONFIG_ARCH_S5PV210) += s5pv210
190machine-$(CONFIG_ARCH_SA1100) += sa1100 190machine-$(CONFIG_ARCH_SA1100) += sa1100
191machine-$(CONFIG_ARCH_SHARK) += shark 191machine-$(CONFIG_ARCH_SHARK) += shark
192machine-$(CONFIG_ARCH_SHMOBILE) += shmobile 192machine-$(CONFIG_ARCH_SHMOBILE) += shmobile
193machine-$(CONFIG_ARCH_SHMOBILE_MULTI) += shmobile
193machine-$(CONFIG_ARCH_SIRF) += prima2 194machine-$(CONFIG_ARCH_SIRF) += prima2
194machine-$(CONFIG_ARCH_SOCFPGA) += socfpga 195machine-$(CONFIG_ARCH_SOCFPGA) += socfpga
195machine-$(CONFIG_ARCH_STI) += sti 196machine-$(CONFIG_ARCH_STI) += sti
diff --git a/arch/arm/boot/compressed/head-shmobile.S b/arch/arm/boot/compressed/head-shmobile.S
index e2d636336b7c..e7f80928949c 100644
--- a/arch/arm/boot/compressed/head-shmobile.S
+++ b/arch/arm/boot/compressed/head-shmobile.S
@@ -55,12 +55,47 @@ __tmp_stack:
55__continue: 55__continue:
56#endif /* CONFIG_ZBOOT_ROM_MMC || CONFIG_ZBOOT_ROM_SH_MOBILE_SDHI */ 56#endif /* CONFIG_ZBOOT_ROM_MMC || CONFIG_ZBOOT_ROM_SH_MOBILE_SDHI */
57 57
58 /* Set board ID necessary for boot */ 58 adr r0, dtb_info
59 ldr r7, 1f @ Set machine type register 59 ldmia r0, {r1, r3, r4, r5, r7}
60 mov r8, #0 @ pass null pointer as atag 60
61 sub r0, r0, r1 @ calculate the delta offset
62 add r5, r5, r0 @ _edata
63
64 ldr lr, [r5, #0] @ check if valid DTB is present
65 cmp lr, r3
66 bne 0f
67
68 add r9, r7, #31 @ rounded up to a multiple
69 bic r9, r9, #31 @ ... of 32 bytes
70
71 add r6, r9, r5 @ copy from _edata
72 add r9, r9, r4 @ to MEMORY_START
73
741: ldmdb r6!, {r0 - r3, r10 - r12, lr}
75 cmp r6, r5
76 stmdb r9!, {r0 - r3, r10 - r12, lr}
77 bhi 1b
78
79 /* Success: Zero board ID, pointer to start of memory for atag/dtb */
80 mov r7, #0
81 mov r8, r4
61 b 2f 82 b 2f
62 83
631 : .long MACH_TYPE 84 .align 2
85dtb_info:
86 .word dtb_info
87#ifndef __ARMEB__
88 .word 0xedfe0dd0 @ sig is 0xd00dfeed big endian
89#else
90 .word 0xd00dfeed
91#endif
92 .word MEMORY_START
93 .word _edata
94 .word 0x4000 @ maximum DTB size
950:
96 /* Failure: Zero board ID, NULL atag/dtb */
97 mov r7, #0
98 mov r8, #0 @ pass null pointer as atag
642 : 992 :
65 100
66#endif /* CONFIG_ZBOOT_ROM */ 101#endif /* CONFIG_ZBOOT_ROM */
diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
index 641b3c9a7028..e95af3f5433b 100644
--- a/arch/arm/boot/dts/Makefile
+++ b/arch/arm/boot/dts/Makefile
@@ -42,24 +42,27 @@ dtb-$(CONFIG_ARCH_AT91) += sama5d34ek.dtb
42dtb-$(CONFIG_ARCH_AT91) += sama5d35ek.dtb 42dtb-$(CONFIG_ARCH_AT91) += sama5d35ek.dtb
43 43
44dtb-$(CONFIG_ARCH_BCM2835) += bcm2835-rpi-b.dtb 44dtb-$(CONFIG_ARCH_BCM2835) += bcm2835-rpi-b.dtb
45dtb-$(CONFIG_ARCH_BCM) += bcm11351-brt.dtb 45dtb-$(CONFIG_ARCH_BCM) += bcm11351-brt.dtb \
46 bcm28155-ap.dtb
46dtb-$(CONFIG_ARCH_DAVINCI) += da850-enbw-cmc.dtb \ 47dtb-$(CONFIG_ARCH_DAVINCI) += da850-enbw-cmc.dtb \
47 da850-evm.dtb 48 da850-evm.dtb
48dtb-$(CONFIG_ARCH_DOVE) += dove-cm-a510.dtb \ 49dtb-$(CONFIG_ARCH_DOVE) += dove-cm-a510.dtb \
49 dove-cubox.dtb \ 50 dove-cubox.dtb \
51 dove-d2plug.dtb \
50 dove-dove-db.dtb 52 dove-dove-db.dtb
51dtb-$(CONFIG_ARCH_EXYNOS) += exynos4210-origen.dtb \ 53dtb-$(CONFIG_ARCH_EXYNOS) += exynos4210-origen.dtb \
52 exynos4210-smdkv310.dtb \ 54 exynos4210-smdkv310.dtb \
53 exynos4210-trats.dtb \ 55 exynos4210-trats.dtb \
54 exynos4210-universal_c210.dtb \ 56 exynos4210-universal_c210.dtb \
55 exynos4412-odroidx.dtb \ 57 exynos4412-odroidx.dtb \
56 exynos4412-smdk4412.dtb \
57 exynos4412-origen.dtb \ 58 exynos4412-origen.dtb \
59 exynos4412-smdk4412.dtb \
60 exynos4412-trats2.dtb \
58 exynos5250-arndale.dtb \ 61 exynos5250-arndale.dtb \
59 exynos5440-sd5v1.dtb \
60 exynos5250-smdk5250.dtb \ 62 exynos5250-smdk5250.dtb \
61 exynos5250-snow.dtb \ 63 exynos5250-snow.dtb \
62 exynos5420-smdk5420.dtb \ 64 exynos5420-smdk5420.dtb \
65 exynos5440-sd5v1.dtb \
63 exynos5440-ssdk5440.dtb 66 exynos5440-ssdk5440.dtb
64dtb-$(CONFIG_ARCH_HIGHBANK) += highbank.dtb \ 67dtb-$(CONFIG_ARCH_HIGHBANK) += highbank.dtb \
65 ecx-2000.dtb 68 ecx-2000.dtb
@@ -83,12 +86,14 @@ dtb-$(CONFIG_ARCH_KIRKWOOD) += kirkwood-cloudbox.dtb \
83 kirkwood-lschlv2.dtb \ 86 kirkwood-lschlv2.dtb \
84 kirkwood-lsxhl.dtb \ 87 kirkwood-lsxhl.dtb \
85 kirkwood-mplcec4.dtb \ 88 kirkwood-mplcec4.dtb \
89 kirkwood-mv88f6281gtw-ge.dtb \
86 kirkwood-netgear_readynas_duo_v2.dtb \ 90 kirkwood-netgear_readynas_duo_v2.dtb \
87 kirkwood-ns2.dtb \ 91 kirkwood-ns2.dtb \
88 kirkwood-ns2lite.dtb \ 92 kirkwood-ns2lite.dtb \
89 kirkwood-ns2max.dtb \ 93 kirkwood-ns2max.dtb \
90 kirkwood-ns2mini.dtb \ 94 kirkwood-ns2mini.dtb \
91 kirkwood-nsa310.dtb \ 95 kirkwood-nsa310.dtb \
96 kirkwood-nsa310a.dtb \
92 kirkwood-sheevaplug.dtb \ 97 kirkwood-sheevaplug.dtb \
93 kirkwood-sheevaplug-esata.dtb \ 98 kirkwood-sheevaplug-esata.dtb \
94 kirkwood-topkick.dtb \ 99 kirkwood-topkick.dtb \
@@ -100,7 +105,9 @@ dtb-$(CONFIG_ARCH_MSM) += msm8660-surf.dtb \
100 msm8960-cdp.dtb 105 msm8960-cdp.dtb
101dtb-$(CONFIG_ARCH_MVEBU) += armada-370-db.dtb \ 106dtb-$(CONFIG_ARCH_MVEBU) += armada-370-db.dtb \
102 armada-370-mirabox.dtb \ 107 armada-370-mirabox.dtb \
108 armada-370-netgear-rn102.dtb \
103 armada-370-rd.dtb \ 109 armada-370-rd.dtb \
110 armada-xp-axpwifiap.dtb \
104 armada-xp-db.dtb \ 111 armada-xp-db.dtb \
105 armada-xp-gp.dtb \ 112 armada-xp-gp.dtb \
106 armada-xp-openblocks-ax3-4.dtb 113 armada-xp-openblocks-ax3-4.dtb
@@ -112,6 +119,8 @@ dtb-$(CONFIG_ARCH_MXC) += \
112 imx27-pdk.dtb \ 119 imx27-pdk.dtb \
113 imx27-phytec-phycore-som.dtb \ 120 imx27-phytec-phycore-som.dtb \
114 imx27-phytec-phycore-rdk.dtb \ 121 imx27-phytec-phycore-rdk.dtb \
122 imx27-phytec-phycard-s-som.dtb \
123 imx27-phytec-phycard-s-rdk.dtb \
115 imx31-bug.dtb \ 124 imx31-bug.dtb \
116 imx51-apf51.dtb \ 125 imx51-apf51.dtb \
117 imx51-apf51dev.dtb \ 126 imx51-apf51dev.dtb \
@@ -131,6 +140,7 @@ dtb-$(CONFIG_ARCH_MXC) += \
131 imx6q-sabrelite.dtb \ 140 imx6q-sabrelite.dtb \
132 imx6q-sabresd.dtb \ 141 imx6q-sabresd.dtb \
133 imx6q-sbc6x.dtb \ 142 imx6q-sbc6x.dtb \
143 imx6q-wandboard.dtb \
134 imx6sl-evk.dtb \ 144 imx6sl-evk.dtb \
135 vf610-twr.dtb 145 vf610-twr.dtb
136dtb-$(CONFIG_ARCH_MXS) += imx23-evk.dtb \ 146dtb-$(CONFIG_ARCH_MXS) += imx23-evk.dtb \
@@ -143,7 +153,9 @@ dtb-$(CONFIG_ARCH_MXS) += imx23-evk.dtb \
143 imx28-cfa10037.dtb \ 153 imx28-cfa10037.dtb \
144 imx28-cfa10049.dtb \ 154 imx28-cfa10049.dtb \
145 imx28-cfa10055.dtb \ 155 imx28-cfa10055.dtb \
156 imx28-cfa10056.dtb \
146 imx28-cfa10057.dtb \ 157 imx28-cfa10057.dtb \
158 imx28-cfa10058.dtb \
147 imx28-evk.dtb \ 159 imx28-evk.dtb \
148 imx28-m28evk.dtb \ 160 imx28-m28evk.dtb \
149 imx28-sps1.dtb \ 161 imx28-sps1.dtb \
@@ -171,27 +183,34 @@ dtb-$(CONFIG_ARCH_OMAP2PLUS) += omap2420-h4.dtb \
171 am335x-evm.dtb \ 183 am335x-evm.dtb \
172 am335x-evmsk.dtb \ 184 am335x-evmsk.dtb \
173 am335x-bone.dtb \ 185 am335x-bone.dtb \
186 am335x-boneblack.dtb \
174 am3517-evm.dtb \ 187 am3517-evm.dtb \
175 am3517_mt_ventoux.dtb \ 188 am3517_mt_ventoux.dtb \
176 am43x-epos-evm.dtb 189 am43x-epos-evm.dtb
177dtb-$(CONFIG_ARCH_ORION5X) += orion5x-lacie-ethernet-disk-mini-v2.dtb 190dtb-$(CONFIG_ARCH_ORION5X) += orion5x-lacie-ethernet-disk-mini-v2.dtb
178dtb-$(CONFIG_ARCH_PRIMA2) += prima2-evb.dtb 191dtb-$(CONFIG_ARCH_PRIMA2) += prima2-evb.dtb
179dtb-$(CONFIG_ARCH_U8500) += snowball.dtb \ 192dtb-$(CONFIG_ARCH_U8500) += ste-snowball.dtb \
180 hrefprev60.dtb \ 193 ste-hrefprev60.dtb \
181 hrefv60plus.dtb \ 194 ste-hrefv60plus.dtb \
182 ccu8540.dtb \ 195 ste-ccu8540.dtb \
183 ccu9540.dtb 196 ste-ccu9540.dtb
184dtb-$(CONFIG_ARCH_S3C24XX) += s3c2416-smdk2416.dtb 197dtb-$(CONFIG_ARCH_S3C24XX) += s3c2416-smdk2416.dtb
185dtb-$(CONFIG_ARCH_SHMOBILE) += emev2-kzm9d.dtb \ 198dtb-$(CONFIG_ARCH_SHMOBILE) += emev2-kzm9d.dtb \
199 emev2-kzm9d-reference.dtb \
186 r8a7740-armadillo800eva.dtb \ 200 r8a7740-armadillo800eva.dtb \
187 r8a7778-bockw.dtb \ 201 r8a7778-bockw.dtb \
202 r8a7778-bockw-reference.dtb \
188 r8a7740-armadillo800eva-reference.dtb \ 203 r8a7740-armadillo800eva-reference.dtb \
204 r8a7779-marzen.dtb \
189 r8a7779-marzen-reference.dtb \ 205 r8a7779-marzen-reference.dtb \
190 r8a7790-lager.dtb \ 206 r8a7790-lager.dtb \
207 r8a7790-lager-reference.dtb \
191 sh73a0-kzm9g.dtb \ 208 sh73a0-kzm9g.dtb \
192 sh73a0-kzm9g-reference.dtb \ 209 sh73a0-kzm9g-reference.dtb \
193 r8a73a4-ape6evm.dtb \ 210 r8a73a4-ape6evm.dtb \
211 r8a73a4-ape6evm-reference.dtb \
194 sh7372-mackerel.dtb 212 sh7372-mackerel.dtb
213dtb-$(CONFIG_ARCH_SHMOBILE_MULTI) += emev2-kzm9d-reference.dtb
195dtb-$(CONFIG_ARCH_SOCFPGA) += socfpga_cyclone5.dtb \ 214dtb-$(CONFIG_ARCH_SOCFPGA) += socfpga_cyclone5.dtb \
196 socfpga_vt.dtb 215 socfpga_vt.dtb
197dtb-$(CONFIG_ARCH_SPEAR13XX) += spear1310-evb.dtb \ 216dtb-$(CONFIG_ARCH_SPEAR13XX) += spear1310-evb.dtb \
@@ -206,11 +225,15 @@ dtb-$(CONFIG_ARCH_STI)+= stih415-b2000.dtb \
206 stih415-b2020.dtb \ 225 stih415-b2020.dtb \
207 stih416-b2020.dtb 226 stih416-b2020.dtb
208dtb-$(CONFIG_ARCH_SUNXI) += \ 227dtb-$(CONFIG_ARCH_SUNXI) += \
228 sun4i-a10-a1000.dtb \
209 sun4i-a10-cubieboard.dtb \ 229 sun4i-a10-cubieboard.dtb \
210 sun4i-a10-mini-xplus.dtb \ 230 sun4i-a10-mini-xplus.dtb \
211 sun4i-a10-hackberry.dtb \ 231 sun4i-a10-hackberry.dtb \
212 sun5i-a10s-olinuxino-micro.dtb \ 232 sun5i-a10s-olinuxino-micro.dtb \
213 sun5i-a13-olinuxino.dtb 233 sun5i-a13-olinuxino.dtb \
234 sun6i-a31-colombus.dtb \
235 sun7i-a20-cubieboard2.dtb \
236 sun7i-a20-olinuxino-micro.dtb
214dtb-$(CONFIG_ARCH_TEGRA) += tegra20-harmony.dtb \ 237dtb-$(CONFIG_ARCH_TEGRA) += tegra20-harmony.dtb \
215 tegra20-iris-512.dtb \ 238 tegra20-iris-512.dtb \
216 tegra20-medcom-wide.dtb \ 239 tegra20-medcom-wide.dtb \
@@ -224,8 +247,7 @@ dtb-$(CONFIG_ARCH_TEGRA) += tegra20-harmony.dtb \
224 tegra30-beaver.dtb \ 247 tegra30-beaver.dtb \
225 tegra30-cardhu-a02.dtb \ 248 tegra30-cardhu-a02.dtb \
226 tegra30-cardhu-a04.dtb \ 249 tegra30-cardhu-a04.dtb \
227 tegra114-dalmore.dtb \ 250 tegra114-dalmore.dtb
228 tegra114-pluto.dtb
229dtb-$(CONFIG_ARCH_VERSATILE) += versatile-ab.dtb \ 251dtb-$(CONFIG_ARCH_VERSATILE) += versatile-ab.dtb \
230 versatile-pb.dtb 252 versatile-pb.dtb
231dtb-$(CONFIG_ARCH_U300) += ste-u300.dtb 253dtb-$(CONFIG_ARCH_U300) += ste-u300.dtb
diff --git a/arch/arm/boot/dts/am335x-bone-common.dtsi b/arch/arm/boot/dts/am335x-bone-common.dtsi
new file mode 100644
index 000000000000..2f66deda9f5c
--- /dev/null
+++ b/arch/arm/boot/dts/am335x-bone-common.dtsi
@@ -0,0 +1,262 @@
1/*
2 * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
8
9/ {
10 model = "TI AM335x BeagleBone";
11 compatible = "ti,am335x-bone", "ti,am33xx";
12
13 cpus {
14 cpu@0 {
15 cpu0-supply = <&dcdc2_reg>;
16 };
17 };
18
19 memory {
20 device_type = "memory";
21 reg = <0x80000000 0x10000000>; /* 256 MB */
22 };
23
24 am33xx_pinmux: pinmux@44e10800 {
25 pinctrl-names = "default";
26 pinctrl-0 = <&clkout2_pin>;
27
28 user_leds_s0: user_leds_s0 {
29 pinctrl-single,pins = <
30 0x54 (PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* gpmc_a5.gpio1_21 */
31 0x58 (PIN_OUTPUT_PULLUP | MUX_MODE7) /* gpmc_a6.gpio1_22 */
32 0x5c (PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* gpmc_a7.gpio1_23 */
33 0x60 (PIN_OUTPUT_PULLUP | MUX_MODE7) /* gpmc_a8.gpio1_24 */
34 >;
35 };
36
37 i2c0_pins: pinmux_i2c0_pins {
38 pinctrl-single,pins = <
39 0x188 (PIN_INPUT_PULLUP | MUX_MODE0) /* i2c0_sda.i2c0_sda */
40 0x18c (PIN_INPUT_PULLUP | MUX_MODE0) /* i2c0_scl.i2c0_scl */
41 >;
42 };
43
44 uart0_pins: pinmux_uart0_pins {
45 pinctrl-single,pins = <
46 0x170 (PIN_INPUT_PULLUP | MUX_MODE0) /* uart0_rxd.uart0_rxd */
47 0x174 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* uart0_txd.uart0_txd */
48 >;
49 };
50
51 clkout2_pin: pinmux_clkout2_pin {
52 pinctrl-single,pins = <
53 0x1b4 (PIN_OUTPUT_PULLDOWN | MUX_MODE3) /* xdma_event_intr1.clkout2 */
54 >;
55 };
56
57 cpsw_default: cpsw_default {
58 pinctrl-single,pins = <
59 /* Slave 1 */
60 0x110 (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxerr.mii1_rxerr */
61 0x114 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txen.mii1_txen */
62 0x118 (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxdv.mii1_rxdv */
63 0x11c (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd3.mii1_txd3 */
64 0x120 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd2.mii1_txd2 */
65 0x124 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd1.mii1_txd1 */
66 0x128 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd0.mii1_txd0 */
67 0x12c (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_txclk.mii1_txclk */
68 0x130 (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxclk.mii1_rxclk */
69 0x134 (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxd3.mii1_rxd3 */
70 0x138 (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxd2.mii1_rxd2 */
71 0x13c (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxd1.mii1_rxd1 */
72 0x140 (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxd0.mii1_rxd0 */
73 >;
74 };
75
76 cpsw_sleep: cpsw_sleep {
77 pinctrl-single,pins = <
78 /* Slave 1 reset value */
79 0x110 (PIN_INPUT_PULLDOWN | MUX_MODE7)
80 0x114 (PIN_INPUT_PULLDOWN | MUX_MODE7)
81 0x118 (PIN_INPUT_PULLDOWN | MUX_MODE7)
82 0x11c (PIN_INPUT_PULLDOWN | MUX_MODE7)
83 0x120 (PIN_INPUT_PULLDOWN | MUX_MODE7)
84 0x124 (PIN_INPUT_PULLDOWN | MUX_MODE7)
85 0x128 (PIN_INPUT_PULLDOWN | MUX_MODE7)
86 0x12c (PIN_INPUT_PULLDOWN | MUX_MODE7)
87 0x130 (PIN_INPUT_PULLDOWN | MUX_MODE7)
88 0x134 (PIN_INPUT_PULLDOWN | MUX_MODE7)
89 0x138 (PIN_INPUT_PULLDOWN | MUX_MODE7)
90 0x13c (PIN_INPUT_PULLDOWN | MUX_MODE7)
91 0x140 (PIN_INPUT_PULLDOWN | MUX_MODE7)
92 >;
93 };
94
95 davinci_mdio_default: davinci_mdio_default {
96 pinctrl-single,pins = <
97 /* MDIO */
98 0x148 (PIN_INPUT_PULLUP | SLEWCTRL_FAST | MUX_MODE0) /* mdio_data.mdio_data */
99 0x14c (PIN_OUTPUT_PULLUP | MUX_MODE0) /* mdio_clk.mdio_clk */
100 >;
101 };
102
103 davinci_mdio_sleep: davinci_mdio_sleep {
104 pinctrl-single,pins = <
105 /* MDIO reset value */
106 0x148 (PIN_INPUT_PULLDOWN | MUX_MODE7)
107 0x14c (PIN_INPUT_PULLDOWN | MUX_MODE7)
108 >;
109 };
110 };
111
112 ocp {
113 uart0: serial@44e09000 {
114 pinctrl-names = "default";
115 pinctrl-0 = <&uart0_pins>;
116
117 status = "okay";
118 };
119
120 musb: usb@47400000 {
121 status = "okay";
122
123 control@44e10000 {
124 status = "okay";
125 };
126
127 usb-phy@47401300 {
128 status = "okay";
129 };
130
131 usb-phy@47401b00 {
132 status = "okay";
133 };
134
135 usb@47401000 {
136 status = "okay";
137 };
138
139 usb@47401800 {
140 status = "okay";
141 dr_mode = "host";
142 };
143
144 dma-controller@07402000 {
145 status = "okay";
146 };
147 };
148
149 i2c0: i2c@44e0b000 {
150 pinctrl-names = "default";
151 pinctrl-0 = <&i2c0_pins>;
152
153 status = "okay";
154 clock-frequency = <400000>;
155
156 tps: tps@24 {
157 reg = <0x24>;
158 };
159
160 };
161 };
162
163 leds {
164 pinctrl-names = "default";
165 pinctrl-0 = <&user_leds_s0>;
166
167 compatible = "gpio-leds";
168
169 led@2 {
170 label = "beaglebone:green:heartbeat";
171 gpios = <&gpio1 21 GPIO_ACTIVE_HIGH>;
172 linux,default-trigger = "heartbeat";
173 default-state = "off";
174 };
175
176 led@3 {
177 label = "beaglebone:green:mmc0";
178 gpios = <&gpio1 22 GPIO_ACTIVE_HIGH>;
179 linux,default-trigger = "mmc0";
180 default-state = "off";
181 };
182
183 led@4 {
184 label = "beaglebone:green:usr2";
185 gpios = <&gpio1 23 GPIO_ACTIVE_HIGH>;
186 default-state = "off";
187 };
188
189 led@5 {
190 label = "beaglebone:green:usr3";
191 gpios = <&gpio1 24 GPIO_ACTIVE_HIGH>;
192 default-state = "off";
193 };
194 };
195};
196
197/include/ "tps65217.dtsi"
198
199&tps {
200 regulators {
201 dcdc1_reg: regulator@0 {
202 regulator-always-on;
203 };
204
205 dcdc2_reg: regulator@1 {
206 /* VDD_MPU voltage limits 0.95V - 1.26V with +/-4% tolerance */
207 regulator-name = "vdd_mpu";
208 regulator-min-microvolt = <925000>;
209 regulator-max-microvolt = <1325000>;
210 regulator-boot-on;
211 regulator-always-on;
212 };
213
214 dcdc3_reg: regulator@2 {
215 /* VDD_CORE voltage limits 0.95V - 1.1V with +/-4% tolerance */
216 regulator-name = "vdd_core";
217 regulator-min-microvolt = <925000>;
218 regulator-max-microvolt = <1150000>;
219 regulator-boot-on;
220 regulator-always-on;
221 };
222
223 ldo1_reg: regulator@3 {
224 regulator-always-on;
225 };
226
227 ldo2_reg: regulator@4 {
228 regulator-always-on;
229 };
230
231 ldo3_reg: regulator@5 {
232 regulator-always-on;
233 };
234
235 ldo4_reg: regulator@6 {
236 regulator-always-on;
237 };
238 };
239};
240
241&cpsw_emac0 {
242 phy_id = <&davinci_mdio>, <0>;
243 phy-mode = "mii";
244};
245
246&cpsw_emac1 {
247 phy_id = <&davinci_mdio>, <1>;
248 phy-mode = "mii";
249};
250
251&mac {
252 pinctrl-names = "default", "sleep";
253 pinctrl-0 = <&cpsw_default>;
254 pinctrl-1 = <&cpsw_sleep>;
255
256};
257
258&davinci_mdio {
259 pinctrl-names = "default", "sleep";
260 pinctrl-0 = <&davinci_mdio_default>;
261 pinctrl-1 = <&davinci_mdio_sleep>;
262};
diff --git a/arch/arm/boot/dts/am335x-bone.dts b/arch/arm/boot/dts/am335x-bone.dts
index 444b4ede0d60..7993c489982c 100644
--- a/arch/arm/boot/dts/am335x-bone.dts
+++ b/arch/arm/boot/dts/am335x-bone.dts
@@ -8,229 +8,4 @@
8/dts-v1/; 8/dts-v1/;
9 9
10#include "am33xx.dtsi" 10#include "am33xx.dtsi"
11 11#include "am335x-bone-common.dtsi"
12/ {
13 model = "TI AM335x BeagleBone";
14 compatible = "ti,am335x-bone", "ti,am33xx";
15
16 cpus {
17 cpu@0 {
18 cpu0-supply = <&dcdc2_reg>;
19 };
20 };
21
22 memory {
23 device_type = "memory";
24 reg = <0x80000000 0x10000000>; /* 256 MB */
25 };
26
27 am33xx_pinmux: pinmux@44e10800 {
28 pinctrl-names = "default";
29 pinctrl-0 = <&clkout2_pin>;
30
31 user_leds_s0: user_leds_s0 {
32 pinctrl-single,pins = <
33 0x54 (PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* gpmc_a5.gpio1_21 */
34 0x58 (PIN_OUTPUT_PULLUP | MUX_MODE7) /* gpmc_a6.gpio1_22 */
35 0x5c (PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* gpmc_a7.gpio1_23 */
36 0x60 (PIN_OUTPUT_PULLUP | MUX_MODE7) /* gpmc_a8.gpio1_24 */
37 >;
38 };
39
40 i2c0_pins: pinmux_i2c0_pins {
41 pinctrl-single,pins = <
42 0x188 (PIN_INPUT_PULLUP | MUX_MODE0) /* i2c0_sda.i2c0_sda */
43 0x18c (PIN_INPUT_PULLUP | MUX_MODE0) /* i2c0_scl.i2c0_scl */
44 >;
45 };
46
47 uart0_pins: pinmux_uart0_pins {
48 pinctrl-single,pins = <
49 0x170 (PIN_INPUT_PULLUP | MUX_MODE0) /* uart0_rxd.uart0_rxd */
50 0x174 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* uart0_txd.uart0_txd */
51 >;
52 };
53
54 clkout2_pin: pinmux_clkout2_pin {
55 pinctrl-single,pins = <
56 0x1b4 (PIN_OUTPUT_PULLDOWN | MUX_MODE3) /* xdma_event_intr1.clkout2 */
57 >;
58 };
59
60 cpsw_default: cpsw_default {
61 pinctrl-single,pins = <
62 /* Slave 1 */
63 0x110 (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxerr.mii1_rxerr */
64 0x114 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txen.mii1_txen */
65 0x118 (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxdv.mii1_rxdv */
66 0x11c (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd3.mii1_txd3 */
67 0x120 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd2.mii1_txd2 */
68 0x124 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd1.mii1_txd1 */
69 0x128 (PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd0.mii1_txd0 */
70 0x12c (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_txclk.mii1_txclk */
71 0x130 (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxclk.mii1_rxclk */
72 0x134 (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxd3.mii1_rxd3 */
73 0x138 (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxd2.mii1_rxd2 */
74 0x13c (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxd1.mii1_rxd1 */
75 0x140 (PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxd0.mii1_rxd0 */
76 >;
77 };
78
79 cpsw_sleep: cpsw_sleep {
80 pinctrl-single,pins = <
81 /* Slave 1 reset value */
82 0x110 (PIN_INPUT_PULLDOWN | MUX_MODE7)
83 0x114 (PIN_INPUT_PULLDOWN | MUX_MODE7)
84 0x118 (PIN_INPUT_PULLDOWN | MUX_MODE7)
85 0x11c (PIN_INPUT_PULLDOWN | MUX_MODE7)
86 0x120 (PIN_INPUT_PULLDOWN | MUX_MODE7)
87 0x124 (PIN_INPUT_PULLDOWN | MUX_MODE7)
88 0x128 (PIN_INPUT_PULLDOWN | MUX_MODE7)
89 0x12c (PIN_INPUT_PULLDOWN | MUX_MODE7)
90 0x130 (PIN_INPUT_PULLDOWN | MUX_MODE7)
91 0x134 (PIN_INPUT_PULLDOWN | MUX_MODE7)
92 0x138 (PIN_INPUT_PULLDOWN | MUX_MODE7)
93 0x13c (PIN_INPUT_PULLDOWN | MUX_MODE7)
94 0x140 (PIN_INPUT_PULLDOWN | MUX_MODE7)
95 >;
96 };
97
98 davinci_mdio_default: davinci_mdio_default {
99 pinctrl-single,pins = <
100 /* MDIO */
101 0x148 (PIN_INPUT_PULLUP | SLEWCTRL_FAST | MUX_MODE0) /* mdio_data.mdio_data */
102 0x14c (PIN_OUTPUT_PULLUP | MUX_MODE0) /* mdio_clk.mdio_clk */
103 >;
104 };
105
106 davinci_mdio_sleep: davinci_mdio_sleep {
107 pinctrl-single,pins = <
108 /* MDIO reset value */
109 0x148 (PIN_INPUT_PULLDOWN | MUX_MODE7)
110 0x14c (PIN_INPUT_PULLDOWN | MUX_MODE7)
111 >;
112 };
113 };
114
115 ocp {
116 uart0: serial@44e09000 {
117 pinctrl-names = "default";
118 pinctrl-0 = <&uart0_pins>;
119
120 status = "okay";
121 };
122
123 i2c0: i2c@44e0b000 {
124 pinctrl-names = "default";
125 pinctrl-0 = <&i2c0_pins>;
126
127 status = "okay";
128 clock-frequency = <400000>;
129
130 tps: tps@24 {
131 reg = <0x24>;
132 };
133
134 };
135 };
136
137 leds {
138 pinctrl-names = "default";
139 pinctrl-0 = <&user_leds_s0>;
140
141 compatible = "gpio-leds";
142
143 led@2 {
144 label = "beaglebone:green:heartbeat";
145 gpios = <&gpio1 21 GPIO_ACTIVE_HIGH>;
146 linux,default-trigger = "heartbeat";
147 default-state = "off";
148 };
149
150 led@3 {
151 label = "beaglebone:green:mmc0";
152 gpios = <&gpio1 22 GPIO_ACTIVE_HIGH>;
153 linux,default-trigger = "mmc0";
154 default-state = "off";
155 };
156
157 led@4 {
158 label = "beaglebone:green:usr2";
159 gpios = <&gpio1 23 GPIO_ACTIVE_HIGH>;
160 default-state = "off";
161 };
162
163 led@5 {
164 label = "beaglebone:green:usr3";
165 gpios = <&gpio1 24 GPIO_ACTIVE_HIGH>;
166 default-state = "off";
167 };
168 };
169};
170
171/include/ "tps65217.dtsi"
172
173&tps {
174 regulators {
175 dcdc1_reg: regulator@0 {
176 regulator-always-on;
177 };
178
179 dcdc2_reg: regulator@1 {
180 /* VDD_MPU voltage limits 0.95V - 1.26V with +/-4% tolerance */
181 regulator-name = "vdd_mpu";
182 regulator-min-microvolt = <925000>;
183 regulator-max-microvolt = <1325000>;
184 regulator-boot-on;
185 regulator-always-on;
186 };
187
188 dcdc3_reg: regulator@2 {
189 /* VDD_CORE voltage limits 0.95V - 1.1V with +/-4% tolerance */
190 regulator-name = "vdd_core";
191 regulator-min-microvolt = <925000>;
192 regulator-max-microvolt = <1150000>;
193 regulator-boot-on;
194 regulator-always-on;
195 };
196
197 ldo1_reg: regulator@3 {
198 regulator-always-on;
199 };
200
201 ldo2_reg: regulator@4 {
202 regulator-always-on;
203 };
204
205 ldo3_reg: regulator@5 {
206 regulator-always-on;
207 };
208
209 ldo4_reg: regulator@6 {
210 regulator-always-on;
211 };
212 };
213};
214
215&cpsw_emac0 {
216 phy_id = <&davinci_mdio>, <0>;
217 phy-mode = "mii";
218};
219
220&cpsw_emac1 {
221 phy_id = <&davinci_mdio>, <1>;
222 phy-mode = "mii";
223};
224
225&mac {
226 pinctrl-names = "default", "sleep";
227 pinctrl-0 = <&cpsw_default>;
228 pinctrl-1 = <&cpsw_sleep>;
229
230};
231
232&davinci_mdio {
233 pinctrl-names = "default", "sleep";
234 pinctrl-0 = <&davinci_mdio_default>;
235 pinctrl-1 = <&davinci_mdio_sleep>;
236};
diff --git a/arch/arm/boot/dts/am335x-boneblack.dts b/arch/arm/boot/dts/am335x-boneblack.dts
new file mode 100644
index 000000000000..197cadf72d2c
--- /dev/null
+++ b/arch/arm/boot/dts/am335x-boneblack.dts
@@ -0,0 +1,17 @@
1/*
2 * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
8/dts-v1/;
9
10#include "am33xx.dtsi"
11#include "am335x-bone-common.dtsi"
12
13&ldo3_reg {
14 regulator-min-microvolt = <1800000>;
15 regulator-max-microvolt = <1800000>;
16 regulator-always-on;
17};
diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts
index 3aee1a43782d..e8ec8756e498 100644
--- a/arch/arm/boot/dts/am335x-evm.dts
+++ b/arch/arm/boot/dts/am335x-evm.dts
@@ -171,6 +171,35 @@
171 }; 171 };
172 }; 172 };
173 173
174 musb: usb@47400000 {
175 status = "okay";
176
177 control@44e10000 {
178 status = "okay";
179 };
180
181 usb-phy@47401300 {
182 status = "okay";
183 };
184
185 usb-phy@47401b00 {
186 status = "okay";
187 };
188
189 usb@47401000 {
190 status = "okay";
191 };
192
193 usb@47401800 {
194 status = "okay";
195 dr_mode = "host";
196 };
197
198 dma-controller@07402000 {
199 status = "okay";
200 };
201 };
202
174 i2c1: i2c@4802a000 { 203 i2c1: i2c@4802a000 {
175 pinctrl-names = "default"; 204 pinctrl-names = "default";
176 pinctrl-0 = <&i2c1_pins>; 205 pinctrl-0 = <&i2c1_pins>;
diff --git a/arch/arm/boot/dts/am335x-evmsk.dts b/arch/arm/boot/dts/am335x-evmsk.dts
index 0c8ad173d2b0..4f339fa91c57 100644
--- a/arch/arm/boot/dts/am335x-evmsk.dts
+++ b/arch/arm/boot/dts/am335x-evmsk.dts
@@ -14,6 +14,7 @@
14/dts-v1/; 14/dts-v1/;
15 15
16#include "am33xx.dtsi" 16#include "am33xx.dtsi"
17#include <dt-bindings/pwm/pwm.h>
17 18
18/ { 19/ {
19 model = "TI AM335x EVM-SK"; 20 model = "TI AM335x EVM-SK";
@@ -207,6 +208,22 @@
207 }; 208 };
208 }; 209 };
209 210
211 musb: usb@47400000 {
212 status = "okay";
213
214 control@44e10000 {
215 status = "okay";
216 };
217
218 usb-phy@47401300 {
219 status = "okay";
220 };
221
222 usb@47401000 {
223 status = "okay";
224 };
225 };
226
210 epwmss2: epwmss@48304000 { 227 epwmss2: epwmss@48304000 {
211 status = "okay"; 228 status = "okay";
212 229
@@ -298,7 +315,7 @@
298 315
299 backlight { 316 backlight {
300 compatible = "pwm-backlight"; 317 compatible = "pwm-backlight";
301 pwms = <&ecap2 0 50000 1>; 318 pwms = <&ecap2 0 50000 PWM_POLARITY_INVERTED>;
302 brightness-levels = <0 58 61 66 75 90 125 170 255>; 319 brightness-levels = <0 58 61 66 75 90 125 170 255>;
303 default-brightness-level = <8>; 320 default-brightness-level = <8>;
304 }; 321 };
diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi
index 38b446ba1ce1..f9c5da9c7fe1 100644
--- a/arch/arm/boot/dts/am33xx.dtsi
+++ b/arch/arm/boot/dts/am33xx.dtsi
@@ -26,6 +26,10 @@
26 serial5 = &uart5; 26 serial5 = &uart5;
27 d_can0 = &dcan0; 27 d_can0 = &dcan0;
28 d_can1 = &dcan1; 28 d_can1 = &dcan1;
29 usb0 = &usb0;
30 usb1 = &usb1;
31 phy0 = &usb0_phy;
32 phy1 = &usb1_phy;
29 }; 33 };
30 34
31 cpus { 35 cpus {
@@ -333,21 +337,132 @@
333 status = "disabled"; 337 status = "disabled";
334 }; 338 };
335 339
336 usb@47400000 { 340 usb: usb@47400000 {
337 compatible = "ti,musb-am33xx"; 341 compatible = "ti,am33xx-usb";
338 reg = <0x47400000 0x1000 /* usbss */ 342 reg = <0x47400000 0x1000>;
339 0x47401000 0x800 /* musb instance 0 */ 343 ranges;
340 0x47401800 0x800>; /* musb instance 1 */ 344 #address-cells = <1>;
341 interrupts = <17 /* usbss */ 345 #size-cells = <1>;
342 18 /* musb instance 0 */
343 19>; /* musb instance 1 */
344 multipoint = <1>;
345 num-eps = <16>;
346 ram-bits = <12>;
347 port0-mode = <3>;
348 port1-mode = <3>;
349 power = <250>;
350 ti,hwmods = "usb_otg_hs"; 346 ti,hwmods = "usb_otg_hs";
347 status = "disabled";
348
349 ctrl_mod: control@44e10000 {
350 compatible = "ti,am335x-usb-ctrl-module";
351 reg = <0x44e10620 0x10
352 0x44e10648 0x4>;
353 reg-names = "phy_ctrl", "wakeup";
354 status = "disabled";
355 };
356
357 usb0_phy: usb-phy@47401300 {
358 compatible = "ti,am335x-usb-phy";
359 reg = <0x47401300 0x100>;
360 reg-names = "phy";
361 status = "disabled";
362 ti,ctrl_mod = <&ctrl_mod>;
363 };
364
365 usb0: usb@47401000 {
366 compatible = "ti,musb-am33xx";
367 status = "disabled";
368 reg = <0x47401400 0x400
369 0x47401000 0x200>;
370 reg-names = "mc", "control";
371
372 interrupts = <18>;
373 interrupt-names = "mc";
374 dr_mode = "otg";
375 mentor,multipoint = <1>;
376 mentor,num-eps = <16>;
377 mentor,ram-bits = <12>;
378 mentor,power = <500>;
379 phys = <&usb0_phy>;
380
381 dmas = <&cppi41dma 0 0 &cppi41dma 1 0
382 &cppi41dma 2 0 &cppi41dma 3 0
383 &cppi41dma 4 0 &cppi41dma 5 0
384 &cppi41dma 6 0 &cppi41dma 7 0
385 &cppi41dma 8 0 &cppi41dma 9 0
386 &cppi41dma 10 0 &cppi41dma 11 0
387 &cppi41dma 12 0 &cppi41dma 13 0
388 &cppi41dma 14 0 &cppi41dma 0 1
389 &cppi41dma 1 1 &cppi41dma 2 1
390 &cppi41dma 3 1 &cppi41dma 4 1
391 &cppi41dma 5 1 &cppi41dma 6 1
392 &cppi41dma 7 1 &cppi41dma 8 1
393 &cppi41dma 9 1 &cppi41dma 10 1
394 &cppi41dma 11 1 &cppi41dma 12 1
395 &cppi41dma 13 1 &cppi41dma 14 1>;
396 dma-names =
397 "rx1", "rx2", "rx3", "rx4", "rx5", "rx6", "rx7",
398 "rx8", "rx9", "rx10", "rx11", "rx12", "rx13",
399 "rx14", "rx15",
400 "tx1", "tx2", "tx3", "tx4", "tx5", "tx6", "tx7",
401 "tx8", "tx9", "tx10", "tx11", "tx12", "tx13",
402 "tx14", "tx15";
403 };
404
405 usb1_phy: usb-phy@47401b00 {
406 compatible = "ti,am335x-usb-phy";
407 reg = <0x47401b00 0x100>;
408 reg-names = "phy";
409 status = "disabled";
410 ti,ctrl_mod = <&ctrl_mod>;
411 };
412
413 usb1: usb@47401800 {
414 compatible = "ti,musb-am33xx";
415 status = "disabled";
416 reg = <0x47401c00 0x400
417 0x47401800 0x200>;
418 reg-names = "mc", "control";
419 interrupts = <19>;
420 interrupt-names = "mc";
421 dr_mode = "otg";
422 mentor,multipoint = <1>;
423 mentor,num-eps = <16>;
424 mentor,ram-bits = <12>;
425 mentor,power = <500>;
426 phys = <&usb1_phy>;
427
428 dmas = <&cppi41dma 15 0 &cppi41dma 16 0
429 &cppi41dma 17 0 &cppi41dma 18 0
430 &cppi41dma 19 0 &cppi41dma 20 0
431 &cppi41dma 21 0 &cppi41dma 22 0
432 &cppi41dma 23 0 &cppi41dma 24 0
433 &cppi41dma 25 0 &cppi41dma 26 0
434 &cppi41dma 27 0 &cppi41dma 28 0
435 &cppi41dma 29 0 &cppi41dma 15 1
436 &cppi41dma 16 1 &cppi41dma 17 1
437 &cppi41dma 18 1 &cppi41dma 19 1
438 &cppi41dma 20 1 &cppi41dma 21 1
439 &cppi41dma 22 1 &cppi41dma 23 1
440 &cppi41dma 24 1 &cppi41dma 25 1
441 &cppi41dma 26 1 &cppi41dma 27 1
442 &cppi41dma 28 1 &cppi41dma 29 1>;
443 dma-names =
444 "rx1", "rx2", "rx3", "rx4", "rx5", "rx6", "rx7",
445 "rx8", "rx9", "rx10", "rx11", "rx12", "rx13",
446 "rx14", "rx15",
447 "tx1", "tx2", "tx3", "tx4", "tx5", "tx6", "tx7",
448 "tx8", "tx9", "tx10", "tx11", "tx12", "tx13",
449 "tx14", "tx15";
450 };
451
452 cppi41dma: dma-controller@07402000 {
453 compatible = "ti,am3359-cppi41";
454 reg = <0x47400000 0x1000
455 0x47402000 0x1000
456 0x47403000 0x1000
457 0x47404000 0x4000>;
458 reg-names = "glue", "controller", "scheduler", "queuemgr";
459 interrupts = <17>;
460 interrupt-names = "glue";
461 #dma-cells = <2>;
462 #dma-channels = <30>;
463 #dma-requests = <256>;
464 status = "disabled";
465 };
351 }; 466 };
352 467
353 epwmss0: epwmss@48300000 { 468 epwmss0: epwmss@48300000 {
diff --git a/arch/arm/boot/dts/armada-370-db.dts b/arch/arm/boot/dts/armada-370-db.dts
index beee1699d49e..90ce29dbe119 100644
--- a/arch/arm/boot/dts/armada-370-db.dts
+++ b/arch/arm/boot/dts/armada-370-db.dts
@@ -14,7 +14,7 @@
14 */ 14 */
15 15
16/dts-v1/; 16/dts-v1/;
17/include/ "armada-370.dtsi" 17#include "armada-370.dtsi"
18 18
19/ { 19/ {
20 model = "Marvell Armada 370 Evaluation Board"; 20 model = "Marvell Armada 370 Evaluation Board";
@@ -30,6 +30,9 @@
30 }; 30 };
31 31
32 soc { 32 soc {
33 ranges = <MBUS_ID(0xf0, 0x01) 0 0xd0000000 0x100000
34 MBUS_ID(0x01, 0xe0) 0 0xfff00000 0x100000>;
35
33 internal-regs { 36 internal-regs {
34 serial@12000 { 37 serial@12000 {
35 clock-frequency = <200000000>; 38 clock-frequency = <200000000>;
diff --git a/arch/arm/boot/dts/armada-370-mirabox.dts b/arch/arm/boot/dts/armada-370-mirabox.dts
index 45b107763e3b..2471d9da767b 100644
--- a/arch/arm/boot/dts/armada-370-mirabox.dts
+++ b/arch/arm/boot/dts/armada-370-mirabox.dts
@@ -9,7 +9,7 @@
9 */ 9 */
10 10
11/dts-v1/; 11/dts-v1/;
12/include/ "armada-370.dtsi" 12#include "armada-370.dtsi"
13 13
14/ { 14/ {
15 model = "Globalscale Mirabox"; 15 model = "Globalscale Mirabox";
@@ -25,6 +25,25 @@
25 }; 25 };
26 26
27 soc { 27 soc {
28 ranges = <MBUS_ID(0xf0, 0x01) 0 0xd0000000 0x100000
29 MBUS_ID(0x01, 0xe0) 0 0xfff00000 0x100000>;
30
31 pcie-controller {
32 status = "okay";
33
34 /* Internal mini-PCIe connector */
35 pcie@1,0 {
36 /* Port 0, Lane 0 */
37 status = "okay";
38 };
39
40 /* Connected on the PCB to a USB 3.0 XHCI controller */
41 pcie@2,0 {
42 /* Port 1, Lane 0 */
43 status = "okay";
44 };
45 };
46
28 internal-regs { 47 internal-regs {
29 serial@12000 { 48 serial@12000 {
30 clock-frequency = <200000000>; 49 clock-frequency = <200000000>;
@@ -120,22 +139,6 @@
120 reg = <0x25>; 139 reg = <0x25>;
121 }; 140 };
122 }; 141 };
123
124 pcie-controller {
125 status = "okay";
126
127 /* Internal mini-PCIe connector */
128 pcie@1,0 {
129 /* Port 0, Lane 0 */
130 status = "okay";
131 };
132
133 /* Connected on the PCB to a USB 3.0 XHCI controller */
134 pcie@2,0 {
135 /* Port 1, Lane 0 */
136 status = "okay";
137 };
138 };
139 }; 142 };
140 }; 143 };
141}; 144};
diff --git a/arch/arm/boot/dts/armada-370-netgear-rn102.dts b/arch/arm/boot/dts/armada-370-netgear-rn102.dts
new file mode 100644
index 000000000000..05e4485a8225
--- /dev/null
+++ b/arch/arm/boot/dts/armada-370-netgear-rn102.dts
@@ -0,0 +1,179 @@
1/*
2 * Device Tree file for NETGEAR ReadyNAS 102
3 *
4 * Copyright (C) 2013, Arnaud EBALARD <arno@natisbad.org>
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
10 */
11
12/dts-v1/;
13
14#include "armada-370.dtsi"
15
16/ {
17 model = "NETGEAR ReadyNAS 102";
18 compatible = "netgear,readynas-102", "marvell,armada370", "marvell,armada-370-xp";
19
20 chosen {
21 bootargs = "console=ttyS0,115200 earlyprintk";
22 };
23
24 memory {
25 device_type = "memory";
26 reg = <0x00000000 0x20000000>; /* 512 MB */
27 };
28
29 soc {
30 internal-regs {
31 serial@12000 {
32 clock-frequency = <200000000>;
33 status = "okay";
34 };
35
36 sata@a0000 {
37 nr-ports = <2>;
38 status = "okay";
39 };
40
41 pinctrl {
42 power_led_pin: power-led-pin {
43 marvell,pins = "mpp57";
44 marvell,function = "gpio";
45 };
46 sata1_led_pin: sata1-led-pin {
47 marvell,pins = "mpp15";
48 marvell,function = "gpio";
49 };
50
51 sata2_led_pin: sata2-led-pin {
52 marvell,pins = "mpp14";
53 marvell,function = "gpio";
54 };
55
56 backup_led_pin: backup-led-pin {
57 marvell,pins = "mpp56";
58 marvell,function = "gpio";
59 };
60 };
61
62 mdio {
63 phy0: ethernet-phy@0 {
64 reg = <0>;
65 };
66 };
67
68 ethernet@74000 {
69 status = "okay";
70 phy = <&phy0>;
71 phy-mode = "rgmii-id";
72 };
73
74 usb@50000 {
75 status = "okay";
76 };
77
78 i2c@11000 {
79 compatible = "marvell,mv64xxx-i2c";
80 clock-frequency = <100000>;
81 status = "okay";
82
83 g762: g762@3e {
84 compatible = "gmt,g762";
85 reg = <0x3e>;
86 clocks = <&g762_clk>; /* input clock */
87 fan_gear_mode = <0>;
88 fan_startv = <1>;
89 pwm_polarity = <0>;
90 };
91 };
92
93 pcie-controller {
94 status = "okay";
95
96 /* Connected to Marvell SATA controller */
97 pcie@1,0 {
98 /* Port 0, Lane 0 */
99 status = "okay";
100 };
101
102 /* Connected to FL1009 USB 3.0 controller */
103 pcie@2,0 {
104 /* Port 1, Lane 0 */
105 status = "okay";
106 };
107 };
108 };
109 };
110
111 clocks {
112 #address-cells = <1>;
113 #size-cells = <0>;
114
115 g762_clk: fixedclk {
116 compatible = "fixed-clock";
117 #clock-cells = <0>;
118 clock-frequency = <8192>;
119 };
120 };
121
122 gpio_leds {
123 compatible = "gpio-leds";
124 pinctrl-0 = < &power_led_pin
125 &sata1_led_pin
126 &sata2_led_pin
127 &backup_led_pin >;
128 pinctrl-names = "default";
129
130 blue_power_led {
131 label = "rn102:blue:pwr";
132 gpios = <&gpio1 25 1>; /* GPIO 57 Active Low */
133 linux,default-trigger = "heartbeat";
134 };
135
136 green_sata1_led {
137 label = "rn102:green:sata1";
138 gpios = <&gpio0 15 1>; /* GPIO 15 Active Low */
139 default-state = "on";
140 };
141
142 green_sata2_led {
143 label = "rn102:green:sata2";
144 gpios = <&gpio0 14 1>; /* GPIO 14 Active Low */
145 default-state = "on";
146 };
147
148 green_backup_led {
149 label = "rn102:green:backup";
150 gpios = <&gpio1 24 1>; /* GPIO 56 Active Low */
151 default-state = "on";
152 };
153 };
154
155 gpio_keys {
156 compatible = "gpio-keys";
157 #address-cells = <1>;
158 #size-cells = <0>;
159
160 button@1 {
161 label = "Power Button";
162 linux,code = <116>; /* KEY_POWER */
163 gpios = <&gpio1 30 1>;
164 };
165
166 button@2 {
167 label = "Reset Button";
168 linux,code = <0x198>; /* KEY_RESTART */
169 gpios = <&gpio0 6 1>;
170 };
171
172 button@3 {
173 label = "Backup Button";
174 linux,code = <133>; /* KEY_COPY */
175 gpios = <&gpio1 26 1>;
176 };
177 };
178
179};
diff --git a/arch/arm/boot/dts/armada-370-rd.dts b/arch/arm/boot/dts/armada-370-rd.dts
index a3a2fedb8726..f81810a59629 100644
--- a/arch/arm/boot/dts/armada-370-rd.dts
+++ b/arch/arm/boot/dts/armada-370-rd.dts
@@ -12,7 +12,7 @@
12 */ 12 */
13 13
14/dts-v1/; 14/dts-v1/;
15/include/ "armada-370.dtsi" 15#include "armada-370.dtsi"
16 16
17/ { 17/ {
18 model = "Marvell Armada 370 Reference Design"; 18 model = "Marvell Armada 370 Reference Design";
@@ -28,6 +28,25 @@
28 }; 28 };
29 29
30 soc { 30 soc {
31 ranges = <MBUS_ID(0xf0, 0x01) 0 0xd0000000 0x100000
32 MBUS_ID(0x01, 0xe0) 0 0xfff00000 0x100000>;
33
34 pcie-controller {
35 status = "okay";
36
37 /* Internal mini-PCIe connector */
38 pcie@1,0 {
39 /* Port 0, Lane 0 */
40 status = "okay";
41 };
42
43 /* Internal mini-PCIe connector */
44 pcie@2,0 {
45 /* Port 1, Lane 0 */
46 status = "okay";
47 };
48 };
49
31 internal-regs { 50 internal-regs {
32 serial@12000 { 51 serial@12000 {
33 clock-frequency = <200000000>; 52 clock-frequency = <200000000>;
@@ -85,22 +104,6 @@
85 gpios = <&gpio0 6 1>; 104 gpios = <&gpio0 6 1>;
86 }; 105 };
87 }; 106 };
88
89 pcie-controller {
90 status = "okay";
91
92 /* Internal mini-PCIe connector */
93 pcie@1,0 {
94 /* Port 0, Lane 0 */
95 status = "okay";
96 };
97
98 /* Internal mini-PCIe connector */
99 pcie@2,0 {
100 /* Port 1, Lane 0 */
101 status = "okay";
102 };
103 };
104 }; 107 };
105 }; 108 };
106 }; 109 };
diff --git a/arch/arm/boot/dts/armada-370-xp.dtsi b/arch/arm/boot/dts/armada-370-xp.dtsi
index 90b117624abb..1de2dae0fdae 100644
--- a/arch/arm/boot/dts/armada-370-xp.dtsi
+++ b/arch/arm/boot/dts/armada-370-xp.dtsi
@@ -18,6 +18,8 @@
18 18
19/include/ "skeleton64.dtsi" 19/include/ "skeleton64.dtsi"
20 20
21#define MBUS_ID(target,attributes) (((target) << 24) | ((attributes) << 16))
22
21/ { 23/ {
22 model = "Marvell Armada 370 and XP SoC"; 24 model = "Marvell Armada 370 and XP SoC";
23 compatible = "marvell,armada-370-xp"; 25 compatible = "marvell,armada-370-xp";
@@ -38,18 +40,73 @@
38 }; 40 };
39 41
40 soc { 42 soc {
41 #address-cells = <1>; 43 #address-cells = <2>;
42 #size-cells = <1>; 44 #size-cells = <1>;
43 compatible = "simple-bus"; 45 controller = <&mbusc>;
44 interrupt-parent = <&mpic>; 46 interrupt-parent = <&mpic>;
45 ranges = <0 0 0xd0000000 0x0100000 /* internal registers */ 47 pcie-mem-aperture = <0xe0000000 0x8000000>;
46 0xe0000000 0 0xe0000000 0x8100000 /* PCIe */>; 48 pcie-io-aperture = <0xe8000000 0x100000>;
49
50 devbus-bootcs {
51 compatible = "marvell,mvebu-devbus";
52 reg = <MBUS_ID(0xf0, 0x01) 0x10400 0x8>;
53 ranges = <0 MBUS_ID(0x01, 0x2f) 0 0xffffffff>;
54 #address-cells = <1>;
55 #size-cells = <1>;
56 clocks = <&coreclk 0>;
57 status = "disabled";
58 };
59
60 devbus-cs0 {
61 compatible = "marvell,mvebu-devbus";
62 reg = <MBUS_ID(0xf0, 0x01) 0x10408 0x8>;
63 ranges = <0 MBUS_ID(0x01, 0x3e) 0 0xffffffff>;
64 #address-cells = <1>;
65 #size-cells = <1>;
66 clocks = <&coreclk 0>;
67 status = "disabled";
68 };
69
70 devbus-cs1 {
71 compatible = "marvell,mvebu-devbus";
72 reg = <MBUS_ID(0xf0, 0x01) 0x10410 0x8>;
73 ranges = <0 MBUS_ID(0x01, 0x3d) 0 0xffffffff>;
74 #address-cells = <1>;
75 #size-cells = <1>;
76 clocks = <&coreclk 0>;
77 status = "disabled";
78 };
79
80 devbus-cs2 {
81 compatible = "marvell,mvebu-devbus";
82 reg = <MBUS_ID(0xf0, 0x01) 0x10418 0x8>;
83 ranges = <0 MBUS_ID(0x01, 0x3b) 0 0xffffffff>;
84 #address-cells = <1>;
85 #size-cells = <1>;
86 clocks = <&coreclk 0>;
87 status = "disabled";
88 };
89
90 devbus-cs3 {
91 compatible = "marvell,mvebu-devbus";
92 reg = <MBUS_ID(0xf0, 0x01) 0x10420 0x8>;
93 ranges = <0 MBUS_ID(0x01, 0x37) 0 0xffffffff>;
94 #address-cells = <1>;
95 #size-cells = <1>;
96 clocks = <&coreclk 0>;
97 status = "disabled";
98 };
47 99
48 internal-regs { 100 internal-regs {
49 compatible = "simple-bus"; 101 compatible = "simple-bus";
50 #address-cells = <1>; 102 #address-cells = <1>;
51 #size-cells = <1>; 103 #size-cells = <1>;
52 ranges; 104 ranges = <0 MBUS_ID(0xf0, 0x01) 0 0x100000>;
105
106 mbusc: mbus-controller@20000 {
107 compatible = "marvell,mbus-controller";
108 reg = <0x20000 0x100>, <0x20180 0x20>;
109 };
53 110
54 mpic: interrupt-controller@20000 { 111 mpic: interrupt-controller@20000 {
55 compatible = "marvell,mpic"; 112 compatible = "marvell,mpic";
@@ -81,10 +138,8 @@
81 }; 138 };
82 139
83 timer@20300 { 140 timer@20300 {
84 compatible = "marvell,armada-370-xp-timer";
85 reg = <0x20300 0x30>, <0x21040 0x30>; 141 reg = <0x20300 0x30>, <0x21040 0x30>;
86 interrupts = <37>, <38>, <39>, <40>, <5>, <6>; 142 interrupts = <37>, <38>, <39>, <40>, <5>, <6>;
87 clocks = <&coreclk 2>;
88 }; 143 };
89 144
90 sata@a0000 { 145 sata@a0000 {
@@ -195,50 +250,6 @@
195 status = "disabled"; 250 status = "disabled";
196 }; 251 };
197 252
198 devbus-bootcs@10400 {
199 compatible = "marvell,mvebu-devbus";
200 reg = <0x10400 0x8>;
201 #address-cells = <1>;
202 #size-cells = <1>;
203 clocks = <&coreclk 0>;
204 status = "disabled";
205 };
206
207 devbus-cs0@10408 {
208 compatible = "marvell,mvebu-devbus";
209 reg = <0x10408 0x8>;
210 #address-cells = <1>;
211 #size-cells = <1>;
212 clocks = <&coreclk 0>;
213 status = "disabled";
214 };
215
216 devbus-cs1@10410 {
217 compatible = "marvell,mvebu-devbus";
218 reg = <0x10410 0x8>;
219 #address-cells = <1>;
220 #size-cells = <1>;
221 clocks = <&coreclk 0>;
222 status = "disabled";
223 };
224
225 devbus-cs2@10418 {
226 compatible = "marvell,mvebu-devbus";
227 reg = <0x10418 0x8>;
228 #address-cells = <1>;
229 #size-cells = <1>;
230 clocks = <&coreclk 0>;
231 status = "disabled";
232 };
233
234 devbus-cs3@10420 {
235 compatible = "marvell,mvebu-devbus";
236 reg = <0x10420 0x8>;
237 #address-cells = <1>;
238 #size-cells = <1>;
239 clocks = <&coreclk 0>;
240 status = "disabled";
241 };
242 }; 253 };
243 }; 254 };
244 }; 255 };
diff --git a/arch/arm/boot/dts/armada-370.dtsi b/arch/arm/boot/dts/armada-370.dtsi
index fa3dfc6b4c6a..e134d7a90c9a 100644
--- a/arch/arm/boot/dts/armada-370.dtsi
+++ b/arch/arm/boot/dts/armada-370.dtsi
@@ -15,7 +15,7 @@
15 * common to all Armada SoCs. 15 * common to all Armada SoCs.
16 */ 16 */
17 17
18/include/ "armada-370-xp.dtsi" 18#include "armada-370-xp.dtsi"
19/include/ "skeleton.dtsi" 19/include/ "skeleton.dtsi"
20 20
21/ { 21/ {
@@ -29,8 +29,66 @@
29 }; 29 };
30 30
31 soc { 31 soc {
32 ranges = <0 0xd0000000 0x0100000 /* internal registers */ 32 compatible = "marvell,armada370-mbus", "simple-bus";
33 0xe0000000 0xe0000000 0x8100000 /* PCIe */>; 33
34 bootrom {
35 compatible = "marvell,bootrom";
36 reg = <MBUS_ID(0x01, 0xe0) 0 0x100000>;
37 };
38
39 pcie-controller {
40 compatible = "marvell,armada-370-pcie";
41 status = "disabled";
42 device_type = "pci";
43
44 #address-cells = <3>;
45 #size-cells = <2>;
46
47 bus-range = <0x00 0xff>;
48
49 ranges =
50 <0x82000000 0 0x40000 MBUS_ID(0xf0, 0x01) 0x40000 0 0x00002000
51 0x82000000 0 0x80000 MBUS_ID(0xf0, 0x01) 0x80000 0 0x00002000
52 0x82000000 0x1 0 MBUS_ID(0x04, 0xe8) 0 1 0 /* Port 0.0 MEM */
53 0x81000000 0x1 0 MBUS_ID(0x04, 0xe0) 0 1 0 /* Port 0.0 IO */
54 0x82000000 0x2 0 MBUS_ID(0x08, 0xe8) 0 1 0 /* Port 1.0 MEM */
55 0x81000000 0x2 0 MBUS_ID(0x08, 0xe0) 0 1 0 /* Port 1.0 IO */>;
56
57 pcie@1,0 {
58 device_type = "pci";
59 assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
60 reg = <0x0800 0 0 0 0>;
61 #address-cells = <3>;
62 #size-cells = <2>;
63 #interrupt-cells = <1>;
64 ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
65 0x81000000 0 0 0x81000000 0x1 0 1 0>;
66 interrupt-map-mask = <0 0 0 0>;
67 interrupt-map = <0 0 0 0 &mpic 58>;
68 marvell,pcie-port = <0>;
69 marvell,pcie-lane = <0>;
70 clocks = <&gateclk 5>;
71 status = "disabled";
72 };
73
74 pcie@2,0 {
75 device_type = "pci";
76 assigned-addresses = <0x82002800 0 0x80000 0 0x2000>;
77 reg = <0x1000 0 0 0 0>;
78 #address-cells = <3>;
79 #size-cells = <2>;
80 #interrupt-cells = <1>;
81 ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0
82 0x81000000 0 0 0x81000000 0x2 0 1 0>;
83 interrupt-map-mask = <0 0 0 0>;
84 interrupt-map = <0 0 0 0 &mpic 62>;
85 marvell,pcie-port = <1>;
86 marvell,pcie-lane = <0>;
87 clocks = <&gateclk 9>;
88 status = "disabled";
89 };
90 };
91
34 internal-regs { 92 internal-regs {
35 system-controller@18200 { 93 system-controller@18200 {
36 compatible = "marvell,armada-370-xp-system-controller"; 94 compatible = "marvell,armada-370-xp-system-controller";
@@ -78,7 +136,7 @@
78 gpio-controller; 136 gpio-controller;
79 #gpio-cells = <2>; 137 #gpio-cells = <2>;
80 interrupt-controller; 138 interrupt-controller;
81 #interrupts-cells = <2>; 139 #interrupt-cells = <2>;
82 interrupts = <82>, <83>, <84>, <85>; 140 interrupts = <82>, <83>, <84>, <85>;
83 }; 141 };
84 142
@@ -89,7 +147,7 @@
89 gpio-controller; 147 gpio-controller;
90 #gpio-cells = <2>; 148 #gpio-cells = <2>;
91 interrupt-controller; 149 interrupt-controller;
92 #interrupts-cells = <2>; 150 #interrupt-cells = <2>;
93 interrupts = <87>, <88>, <89>, <90>; 151 interrupts = <87>, <88>, <89>, <90>;
94 }; 152 };
95 153
@@ -100,10 +158,15 @@
100 gpio-controller; 158 gpio-controller;
101 #gpio-cells = <2>; 159 #gpio-cells = <2>;
102 interrupt-controller; 160 interrupt-controller;
103 #interrupts-cells = <2>; 161 #interrupt-cells = <2>;
104 interrupts = <91>; 162 interrupts = <91>;
105 }; 163 };
106 164
165 timer@20300 {
166 compatible = "marvell,armada-370-timer";
167 clocks = <&coreclk 2>;
168 };
169
107 coreclk: mvebu-sar@18230 { 170 coreclk: mvebu-sar@18230 {
108 compatible = "marvell,armada-370-core-clock"; 171 compatible = "marvell,armada-370-core-clock";
109 reg = <0x18230 0x08>; 172 reg = <0x18230 0x08>;
@@ -169,54 +232,6 @@
169 0x18304 0x4>; 232 0x18304 0x4>;
170 status = "okay"; 233 status = "okay";
171 }; 234 };
172
173 pcie-controller {
174 compatible = "marvell,armada-370-pcie";
175 status = "disabled";
176 device_type = "pci";
177
178 #address-cells = <3>;
179 #size-cells = <2>;
180
181 bus-range = <0x00 0xff>;
182
183 ranges = <0x82000000 0 0x40000 0x40000 0 0x00002000 /* Port 0.0 registers */
184 0x82000000 0 0x80000 0x80000 0 0x00002000 /* Port 1.0 registers */
185 0x82000000 0 0xe0000000 0xe0000000 0 0x08000000 /* non-prefetchable memory */
186 0x81000000 0 0 0xe8000000 0 0x00100000>; /* downstream I/O */
187
188 pcie@1,0 {
189 device_type = "pci";
190 assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
191 reg = <0x0800 0 0 0 0>;
192 #address-cells = <3>;
193 #size-cells = <2>;
194 #interrupt-cells = <1>;
195 ranges;
196 interrupt-map-mask = <0 0 0 0>;
197 interrupt-map = <0 0 0 0 &mpic 58>;
198 marvell,pcie-port = <0>;
199 marvell,pcie-lane = <0>;
200 clocks = <&gateclk 5>;
201 status = "disabled";
202 };
203
204 pcie@2,0 {
205 device_type = "pci";
206 assigned-addresses = <0x82002800 0 0x80000 0 0x2000>;
207 reg = <0x1000 0 0 0 0>;
208 #address-cells = <3>;
209 #size-cells = <2>;
210 #interrupt-cells = <1>;
211 ranges;
212 interrupt-map-mask = <0 0 0 0>;
213 interrupt-map = <0 0 0 0 &mpic 62>;
214 marvell,pcie-port = <1>;
215 marvell,pcie-lane = <0>;
216 clocks = <&gateclk 9>;
217 status = "disabled";
218 };
219 };
220 }; 235 };
221 }; 236 };
222}; 237};
diff --git a/arch/arm/boot/dts/armada-xp-axpwifiap.dts b/arch/arm/boot/dts/armada-xp-axpwifiap.dts
new file mode 100644
index 000000000000..c5fe57269f5a
--- /dev/null
+++ b/arch/arm/boot/dts/armada-xp-axpwifiap.dts
@@ -0,0 +1,164 @@
1/*
2 * Device Tree file for Marvell RD-AXPWiFiAP.
3 *
4 * Note: this board is shipped with a new generation boot loader that
5 * remaps internal registers at 0xf1000000. Therefore, if earlyprintk
6 * is used, the CONFIG_DEBUG_MVEBU_UART_ALTERNATE option should be
7 * used.
8 *
9 * Copyright (C) 2013 Marvell
10 *
11 * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
12 *
13 * This file is licensed under the terms of the GNU General Public
14 * License version 2. This program is licensed "as is" without any
15 * warranty of any kind, whether express or implied.
16 */
17
18/dts-v1/;
19#include "armada-xp-mv78230.dtsi"
20
21/ {
22 model = "Marvell RD-AXPWiFiAP";
23 compatible = "marvell,rd-axpwifiap", "marvell,armadaxp-mv78230", "marvell,armadaxp", "marvell,armada-370-xp";
24
25 chosen {
26 bootargs = "console=ttyS0,115200 earlyprintk";
27 };
28
29 memory {
30 device_type = "memory";
31 reg = <0x00000000 0x00000000 0x00000000 0x40000000>; /* 1GB */
32 };
33
34 soc {
35 ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xf1000000 0x100000
36 MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000>;
37
38 pcie-controller {
39 status = "okay";
40
41 /* First mini-PCIe port */
42 pcie@1,0 {
43 /* Port 0, Lane 0 */
44 status = "okay";
45 };
46
47 /* Second mini-PCIe port */
48 pcie@2,0 {
49 /* Port 0, Lane 1 */
50 status = "okay";
51 };
52
53 /* Renesas uPD720202 USB 3.0 controller */
54 pcie@3,0 {
55 /* Port 0, Lane 3 */
56 status = "okay";
57 };
58 };
59
60 internal-regs {
61 pinctrl {
62 pinctrl-0 = <&pmx_phy_int>;
63 pinctrl-names = "default";
64
65 pmx_ge0: pmx-ge0 {
66 marvell,pins = "mpp0", "mpp1", "mpp2", "mpp3",
67 "mpp4", "mpp5", "mpp6", "mpp7",
68 "mpp8", "mpp9", "mpp10", "mpp11";
69 marvell,function = "ge0";
70 };
71
72 pmx_ge1: pmx-ge1 {
73 marvell,pins = "mpp12", "mpp13", "mpp14", "mpp15",
74 "mpp16", "mpp17", "mpp18", "mpp19",
75 "mpp20", "mpp21", "mpp22", "mpp23";
76 marvell,function = "ge1";
77 };
78
79 pmx_keys: pmx-keys {
80 marvell,pins = "mpp33";
81 marvell,function = "gpio";
82 };
83
84 pmx_spi: pmx-spi {
85 marvell,pins = "mpp36", "mpp37", "mpp38", "mpp39";
86 marvell,function = "spi";
87 };
88
89 pmx_phy_int: pmx-phy-int {
90 marvell,pins = "mpp32";
91 marvell,function = "gpio";
92 };
93 };
94
95 serial@12000 {
96 clock-frequency = <250000000>;
97 status = "okay";
98 };
99
100 serial@12100 {
101 clock-frequency = <250000000>;
102 status = "okay";
103 };
104
105 sata@a0000 {
106 nr-ports = <1>;
107 status = "okay";
108 };
109
110 mdio {
111 phy0: ethernet-phy@0 {
112 reg = <0>;
113 };
114
115 phy1: ethernet-phy@1 {
116 reg = <1>;
117 };
118 };
119
120 ethernet@70000 {
121 pinctrl-0 = <&pmx_ge0>;
122 pinctrl-names = "default";
123 status = "okay";
124 phy = <&phy0>;
125 phy-mode = "rgmii-id";
126 };
127 ethernet@74000 {
128 pinctrl-0 = <&pmx_ge1>;
129 pinctrl-names = "default";
130 status = "okay";
131 phy = <&phy1>;
132 phy-mode = "rgmii-id";
133 };
134
135 spi0: spi@10600 {
136 status = "okay";
137 pinctrl-0 = <&pmx_spi>;
138 pinctrl-names = "default";
139
140 spi-flash@0 {
141 #address-cells = <1>;
142 #size-cells = <1>;
143 compatible = "n25q128a13";
144 reg = <0>; /* Chip select 0 */
145 spi-max-frequency = <108000000>;
146 };
147 };
148 };
149 };
150
151 gpio_keys {
152 compatible = "gpio-keys";
153 #address-cells = <1>;
154 #size-cells = <0>;
155 pinctrl-0 = <&pmx_keys>;
156 pinctrl-names = "default";
157
158 button@1 {
159 label = "Factory Reset Button";
160 linux,code = <141>; /* KEY_SETUP */
161 gpios = <&gpio1 1 1>;
162 };
163 };
164};
diff --git a/arch/arm/boot/dts/armada-xp-db.dts b/arch/arm/boot/dts/armada-xp-db.dts
index e28e68ff864d..bcf6d79a57ec 100644
--- a/arch/arm/boot/dts/armada-xp-db.dts
+++ b/arch/arm/boot/dts/armada-xp-db.dts
@@ -14,7 +14,7 @@
14 */ 14 */
15 15
16/dts-v1/; 16/dts-v1/;
17/include/ "armada-xp-mv78460.dtsi" 17#include "armada-xp-mv78460.dtsi"
18 18
19/ { 19/ {
20 model = "Marvell Armada XP Evaluation Board"; 20 model = "Marvell Armada XP Evaluation Board";
@@ -30,9 +30,70 @@
30 }; 30 };
31 31
32 soc { 32 soc {
33 ranges = <0 0 0xd0000000 0x100000 /* Internal registers 1MiB */ 33 ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000
34 0xe0000000 0 0xe0000000 0x8100000 /* PCIe */ 34 MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
35 0xf0000000 0 0xf0000000 0x1000000>; /* Device Bus, NOR 16MiB */ 35 MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x1000000>;
36
37 devbus-bootcs {
38 status = "okay";
39
40 /* Device Bus parameters are required */
41
42 /* Read parameters */
43 devbus,bus-width = <8>;
44 devbus,turn-off-ps = <60000>;
45 devbus,badr-skew-ps = <0>;
46 devbus,acc-first-ps = <124000>;
47 devbus,acc-next-ps = <248000>;
48 devbus,rd-setup-ps = <0>;
49 devbus,rd-hold-ps = <0>;
50
51 /* Write parameters */
52 devbus,sync-enable = <0>;
53 devbus,wr-high-ps = <60000>;
54 devbus,wr-low-ps = <60000>;
55 devbus,ale-wr-ps = <60000>;
56
57 /* NOR 16 MiB */
58 nor@0 {
59 compatible = "cfi-flash";
60 reg = <0 0x1000000>;
61 bank-width = <2>;
62 };
63 };
64
65 pcie-controller {
66 status = "okay";
67
68 /*
69 * All 6 slots are physically present as
70 * standard PCIe slots on the board.
71 */
72 pcie@1,0 {
73 /* Port 0, Lane 0 */
74 status = "okay";
75 };
76 pcie@2,0 {
77 /* Port 0, Lane 1 */
78 status = "okay";
79 };
80 pcie@3,0 {
81 /* Port 0, Lane 2 */
82 status = "okay";
83 };
84 pcie@4,0 {
85 /* Port 0, Lane 3 */
86 status = "okay";
87 };
88 pcie@9,0 {
89 /* Port 2, Lane 0 */
90 status = "okay";
91 };
92 pcie@10,0 {
93 /* Port 3, Lane 0 */
94 status = "okay";
95 };
96 };
36 97
37 internal-regs { 98 internal-regs {
38 serial@12000 { 99 serial@12000 {
@@ -127,68 +188,6 @@
127 spi-max-frequency = <20000000>; 188 spi-max-frequency = <20000000>;
128 }; 189 };
129 }; 190 };
130
131 pcie-controller {
132 status = "okay";
133
134 /*
135 * All 6 slots are physically present as
136 * standard PCIe slots on the board.
137 */
138 pcie@1,0 {
139 /* Port 0, Lane 0 */
140 status = "okay";
141 };
142 pcie@2,0 {
143 /* Port 0, Lane 1 */
144 status = "okay";
145 };
146 pcie@3,0 {
147 /* Port 0, Lane 2 */
148 status = "okay";
149 };
150 pcie@4,0 {
151 /* Port 0, Lane 3 */
152 status = "okay";
153 };
154 pcie@9,0 {
155 /* Port 2, Lane 0 */
156 status = "okay";
157 };
158 pcie@10,0 {
159 /* Port 3, Lane 0 */
160 status = "okay";
161 };
162 };
163
164 devbus-bootcs@10400 {
165 status = "okay";
166 ranges = <0 0xf0000000 0x1000000>;
167
168 /* Device Bus parameters are required */
169
170 /* Read parameters */
171 devbus,bus-width = <8>;
172 devbus,turn-off-ps = <60000>;
173 devbus,badr-skew-ps = <0>;
174 devbus,acc-first-ps = <124000>;
175 devbus,acc-next-ps = <248000>;
176 devbus,rd-setup-ps = <0>;
177 devbus,rd-hold-ps = <0>;
178
179 /* Write parameters */
180 devbus,sync-enable = <0>;
181 devbus,wr-high-ps = <60000>;
182 devbus,wr-low-ps = <60000>;
183 devbus,ale-wr-ps = <60000>;
184
185 /* NOR 16 MiB */
186 nor@0 {
187 compatible = "cfi-flash";
188 reg = <0 0x1000000>;
189 bank-width = <2>;
190 };
191 };
192 }; 191 };
193 }; 192 };
194}; 193};
diff --git a/arch/arm/boot/dts/armada-xp-gp.dts b/arch/arm/boot/dts/armada-xp-gp.dts
index c87b2de29c30..2298e4a910e2 100644
--- a/arch/arm/boot/dts/armada-xp-gp.dts
+++ b/arch/arm/boot/dts/armada-xp-gp.dts
@@ -14,7 +14,7 @@
14 */ 14 */
15 15
16/dts-v1/; 16/dts-v1/;
17/include/ "armada-xp-mv78460.dtsi" 17#include "armada-xp-mv78460.dtsi"
18 18
19/ { 19/ {
20 model = "Marvell Armada XP Development Board DB-MV784MP-GP"; 20 model = "Marvell Armada XP Development Board DB-MV784MP-GP";
@@ -39,9 +39,58 @@
39 }; 39 };
40 40
41 soc { 41 soc {
42 ranges = <0 0 0xd0000000 0x100000 /* Internal registers 1MiB */ 42 ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000
43 0xe0000000 0 0xe0000000 0x8100000 /* PCIe */ 43 MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
44 0xf0000000 0 0xf0000000 0x1000000 /* Device Bus, NOR 16MiB */>; 44 MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x1000000>;
45
46 devbus-bootcs {
47 status = "okay";
48
49 /* Device Bus parameters are required */
50
51 /* Read parameters */
52 devbus,bus-width = <8>;
53 devbus,turn-off-ps = <60000>;
54 devbus,badr-skew-ps = <0>;
55 devbus,acc-first-ps = <124000>;
56 devbus,acc-next-ps = <248000>;
57 devbus,rd-setup-ps = <0>;
58 devbus,rd-hold-ps = <0>;
59
60 /* Write parameters */
61 devbus,sync-enable = <0>;
62 devbus,wr-high-ps = <60000>;
63 devbus,wr-low-ps = <60000>;
64 devbus,ale-wr-ps = <60000>;
65
66 /* NOR 16 MiB */
67 nor@0 {
68 compatible = "cfi-flash";
69 reg = <0 0x1000000>;
70 bank-width = <2>;
71 };
72 };
73
74 pcie-controller {
75 status = "okay";
76
77 /*
78 * The 3 slots are physically present as
79 * standard PCIe slots on the board.
80 */
81 pcie@1,0 {
82 /* Port 0, Lane 0 */
83 status = "okay";
84 };
85 pcie@9,0 {
86 /* Port 2, Lane 0 */
87 status = "okay";
88 };
89 pcie@10,0 {
90 /* Port 3, Lane 0 */
91 status = "okay";
92 };
93 };
45 94
46 internal-regs { 95 internal-regs {
47 serial@12000 { 96 serial@12000 {
@@ -126,56 +175,6 @@
126 spi-max-frequency = <108000000>; 175 spi-max-frequency = <108000000>;
127 }; 176 };
128 }; 177 };
129
130 devbus-bootcs@10400 {
131 status = "okay";
132 ranges = <0 0xf0000000 0x1000000>; /* @addr 0xf000000, size 0x1000000 */
133
134 /* Device Bus parameters are required */
135
136 /* Read parameters */
137 devbus,bus-width = <8>;
138 devbus,turn-off-ps = <60000>;
139 devbus,badr-skew-ps = <0>;
140 devbus,acc-first-ps = <124000>;
141 devbus,acc-next-ps = <248000>;
142 devbus,rd-setup-ps = <0>;
143 devbus,rd-hold-ps = <0>;
144
145 /* Write parameters */
146 devbus,sync-enable = <0>;
147 devbus,wr-high-ps = <60000>;
148 devbus,wr-low-ps = <60000>;
149 devbus,ale-wr-ps = <60000>;
150
151 /* NOR 16 MiB */
152 nor@0 {
153 compatible = "cfi-flash";
154 reg = <0 0x1000000>;
155 bank-width = <2>;
156 };
157 };
158
159 pcie-controller {
160 status = "okay";
161
162 /*
163 * The 3 slots are physically present as
164 * standard PCIe slots on the board.
165 */
166 pcie@1,0 {
167 /* Port 0, Lane 0 */
168 status = "okay";
169 };
170 pcie@9,0 {
171 /* Port 2, Lane 0 */
172 status = "okay";
173 };
174 pcie@10,0 {
175 /* Port 3, Lane 0 */
176 status = "okay";
177 };
178 };
179 }; 178 };
180 }; 179 };
181}; 180};
diff --git a/arch/arm/boot/dts/armada-xp-mv78230.dtsi b/arch/arm/boot/dts/armada-xp-mv78230.dtsi
index f8eaa383e07f..0358a33cba48 100644
--- a/arch/arm/boot/dts/armada-xp-mv78230.dtsi
+++ b/arch/arm/boot/dts/armada-xp-mv78230.dtsi
@@ -13,7 +13,7 @@
13 * common to all Armada XP SoCs. 13 * common to all Armada XP SoCs.
14 */ 14 */
15 15
16/include/ "armada-xp.dtsi" 16#include "armada-xp.dtsi"
17 17
18/ { 18/ {
19 model = "Marvell Armada XP MV78230 SoC"; 19 model = "Marvell Armada XP MV78230 SoC";
@@ -44,6 +44,124 @@
44 }; 44 };
45 45
46 soc { 46 soc {
47 /*
48 * MV78230 has 2 PCIe units Gen2.0: One unit can be
49 * configured as x4 or quad x1 lanes. One unit is
50 * x4/x1.
51 */
52 pcie-controller {
53 compatible = "marvell,armada-xp-pcie";
54 status = "disabled";
55 device_type = "pci";
56
57 #address-cells = <3>;
58 #size-cells = <2>;
59
60 bus-range = <0x00 0xff>;
61
62 ranges =
63 <0x82000000 0 0x40000 MBUS_ID(0xf0, 0x01) 0x40000 0 0x00002000 /* Port 0.0 registers */
64 0x82000000 0 0x42000 MBUS_ID(0xf0, 0x01) 0x42000 0 0x00002000 /* Port 2.0 registers */
65 0x82000000 0 0x44000 MBUS_ID(0xf0, 0x01) 0x44000 0 0x00002000 /* Port 0.1 registers */
66 0x82000000 0 0x48000 MBUS_ID(0xf0, 0x01) 0x48000 0 0x00002000 /* Port 0.2 registers */
67 0x82000000 0 0x4c000 MBUS_ID(0xf0, 0x01) 0x4c000 0 0x00002000 /* Port 0.3 registers */
68 0x82000000 0x1 0 MBUS_ID(0x04, 0xe8) 0 1 0 /* Port 0.0 MEM */
69 0x81000000 0x1 0 MBUS_ID(0x04, 0xe0) 0 1 0 /* Port 0.0 IO */
70 0x82000000 0x2 0 MBUS_ID(0x04, 0xd8) 0 1 0 /* Port 0.1 MEM */
71 0x81000000 0x2 0 MBUS_ID(0x04, 0xd0) 0 1 0 /* Port 0.1 IO */
72 0x82000000 0x3 0 MBUS_ID(0x04, 0xb8) 0 1 0 /* Port 0.2 MEM */
73 0x81000000 0x3 0 MBUS_ID(0x04, 0xb0) 0 1 0 /* Port 0.2 IO */
74 0x82000000 0x4 0 MBUS_ID(0x04, 0x78) 0 1 0 /* Port 0.3 MEM */
75 0x81000000 0x4 0 MBUS_ID(0x04, 0x70) 0 1 0 /* Port 0.3 IO */
76 0x82000000 0x9 0 MBUS_ID(0x04, 0xf8) 0 1 0 /* Port 2.0 MEM */
77 0x81000000 0x9 0 MBUS_ID(0x04, 0xf0) 0 1 0 /* Port 2.0 IO */>;
78
79 pcie@1,0 {
80 device_type = "pci";
81 assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
82 reg = <0x0800 0 0 0 0>;
83 #address-cells = <3>;
84 #size-cells = <2>;
85 #interrupt-cells = <1>;
86 ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
87 0x81000000 0 0 0x81000000 0x1 0 1 0>;
88 interrupt-map-mask = <0 0 0 0>;
89 interrupt-map = <0 0 0 0 &mpic 58>;
90 marvell,pcie-port = <0>;
91 marvell,pcie-lane = <0>;
92 clocks = <&gateclk 5>;
93 status = "disabled";
94 };
95
96 pcie@2,0 {
97 device_type = "pci";
98 assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
99 reg = <0x1000 0 0 0 0>;
100 #address-cells = <3>;
101 #size-cells = <2>;
102 #interrupt-cells = <1>;
103 ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0
104 0x81000000 0 0 0x81000000 0x2 0 1 0>;
105 interrupt-map-mask = <0 0 0 0>;
106 interrupt-map = <0 0 0 0 &mpic 59>;
107 marvell,pcie-port = <0>;
108 marvell,pcie-lane = <1>;
109 clocks = <&gateclk 6>;
110 status = "disabled";
111 };
112
113 pcie@3,0 {
114 device_type = "pci";
115 assigned-addresses = <0x82000800 0 0x48000 0 0x2000>;
116 reg = <0x1800 0 0 0 0>;
117 #address-cells = <3>;
118 #size-cells = <2>;
119 #interrupt-cells = <1>;
120 ranges = <0x82000000 0 0 0x82000000 0x3 0 1 0
121 0x81000000 0 0 0x81000000 0x3 0 1 0>;
122 interrupt-map-mask = <0 0 0 0>;
123 interrupt-map = <0 0 0 0 &mpic 60>;
124 marvell,pcie-port = <0>;
125 marvell,pcie-lane = <2>;
126 clocks = <&gateclk 7>;
127 status = "disabled";
128 };
129
130 pcie@4,0 {
131 device_type = "pci";
132 assigned-addresses = <0x82000800 0 0x4c000 0 0x2000>;
133 reg = <0x2000 0 0 0 0>;
134 #address-cells = <3>;
135 #size-cells = <2>;
136 #interrupt-cells = <1>;
137 ranges = <0x82000000 0 0 0x82000000 0x4 0 1 0
138 0x81000000 0 0 0x81000000 0x4 0 1 0>;
139 interrupt-map-mask = <0 0 0 0>;
140 interrupt-map = <0 0 0 0 &mpic 61>;
141 marvell,pcie-port = <0>;
142 marvell,pcie-lane = <3>;
143 clocks = <&gateclk 8>;
144 status = "disabled";
145 };
146
147 pcie@9,0 {
148 device_type = "pci";
149 assigned-addresses = <0x82000800 0 0x42000 0 0x2000>;
150 reg = <0x4800 0 0 0 0>;
151 #address-cells = <3>;
152 #size-cells = <2>;
153 #interrupt-cells = <1>;
154 ranges = <0x82000000 0 0 0x82000000 0x9 0 1 0
155 0x81000000 0 0 0x81000000 0x9 0 1 0>;
156 interrupt-map-mask = <0 0 0 0>;
157 interrupt-map = <0 0 0 0 &mpic 99>;
158 marvell,pcie-port = <2>;
159 marvell,pcie-lane = <0>;
160 clocks = <&gateclk 26>;
161 status = "disabled";
162 };
163 };
164
47 internal-regs { 165 internal-regs {
48 pinctrl { 166 pinctrl {
49 compatible = "marvell,mv78230-pinctrl"; 167 compatible = "marvell,mv78230-pinctrl";
@@ -63,7 +181,7 @@
63 gpio-controller; 181 gpio-controller;
64 #gpio-cells = <2>; 182 #gpio-cells = <2>;
65 interrupt-controller; 183 interrupt-controller;
66 #interrupts-cells = <2>; 184 #interrupt-cells = <2>;
67 interrupts = <82>, <83>, <84>, <85>; 185 interrupts = <82>, <83>, <84>, <85>;
68 }; 186 };
69 187
@@ -74,113 +192,9 @@
74 gpio-controller; 192 gpio-controller;
75 #gpio-cells = <2>; 193 #gpio-cells = <2>;
76 interrupt-controller; 194 interrupt-controller;
77 #interrupts-cells = <2>; 195 #interrupt-cells = <2>;
78 interrupts = <87>, <88>, <89>; 196 interrupts = <87>, <88>, <89>;
79 }; 197 };
80
81 /*
82 * MV78230 has 2 PCIe units Gen2.0: One unit can be
83 * configured as x4 or quad x1 lanes. One unit is
84 * x4/x1.
85 */
86 pcie-controller {
87 compatible = "marvell,armada-xp-pcie";
88 status = "disabled";
89 device_type = "pci";
90
91#address-cells = <3>;
92#size-cells = <2>;
93
94 bus-range = <0x00 0xff>;
95
96 ranges = <0x82000000 0 0x40000 0x40000 0 0x00002000 /* Port 0.0 registers */
97 0x82000000 0 0x42000 0x42000 0 0x00002000 /* Port 2.0 registers */
98 0x82000000 0 0x44000 0x44000 0 0x00002000 /* Port 0.1 registers */
99 0x82000000 0 0x48000 0x48000 0 0x00002000 /* Port 0.2 registers */
100 0x82000000 0 0x4c000 0x4c000 0 0x00002000 /* Port 0.3 registers */
101 0x82000000 0 0xe0000000 0xe0000000 0 0x08000000 /* non-prefetchable memory */
102 0x81000000 0 0 0xe8000000 0 0x00100000>; /* downstream I/O */
103
104 pcie@1,0 {
105 device_type = "pci";
106 assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
107 reg = <0x0800 0 0 0 0>;
108 #address-cells = <3>;
109 #size-cells = <2>;
110 #interrupt-cells = <1>;
111 ranges;
112 interrupt-map-mask = <0 0 0 0>;
113 interrupt-map = <0 0 0 0 &mpic 58>;
114 marvell,pcie-port = <0>;
115 marvell,pcie-lane = <0>;
116 clocks = <&gateclk 5>;
117 status = "disabled";
118 };
119
120 pcie@2,0 {
121 device_type = "pci";
122 assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
123 reg = <0x1000 0 0 0 0>;
124 #address-cells = <3>;
125 #size-cells = <2>;
126 #interrupt-cells = <1>;
127 ranges;
128 interrupt-map-mask = <0 0 0 0>;
129 interrupt-map = <0 0 0 0 &mpic 59>;
130 marvell,pcie-port = <0>;
131 marvell,pcie-lane = <1>;
132 clocks = <&gateclk 6>;
133 status = "disabled";
134 };
135
136 pcie@3,0 {
137 device_type = "pci";
138 assigned-addresses = <0x82000800 0 0x48000 0 0x2000>;
139 reg = <0x1800 0 0 0 0>;
140 #address-cells = <3>;
141 #size-cells = <2>;
142 #interrupt-cells = <1>;
143 ranges;
144 interrupt-map-mask = <0 0 0 0>;
145 interrupt-map = <0 0 0 0 &mpic 60>;
146 marvell,pcie-port = <0>;
147 marvell,pcie-lane = <2>;
148 clocks = <&gateclk 7>;
149 status = "disabled";
150 };
151
152 pcie@4,0 {
153 device_type = "pci";
154 assigned-addresses = <0x82000800 0 0x4c000 0 0x2000>;
155 reg = <0x2000 0 0 0 0>;
156 #address-cells = <3>;
157 #size-cells = <2>;
158 #interrupt-cells = <1>;
159 ranges;
160 interrupt-map-mask = <0 0 0 0>;
161 interrupt-map = <0 0 0 0 &mpic 61>;
162 marvell,pcie-port = <0>;
163 marvell,pcie-lane = <3>;
164 clocks = <&gateclk 8>;
165 status = "disabled";
166 };
167
168 pcie@9,0 {
169 device_type = "pci";
170 assigned-addresses = <0x82000800 0 0x42000 0 0x2000>;
171 reg = <0x4800 0 0 0 0>;
172 #address-cells = <3>;
173 #size-cells = <2>;
174 #interrupt-cells = <1>;
175 ranges;
176 interrupt-map-mask = <0 0 0 0>;
177 interrupt-map = <0 0 0 0 &mpic 99>;
178 marvell,pcie-port = <2>;
179 marvell,pcie-lane = <0>;
180 clocks = <&gateclk 26>;
181 status = "disabled";
182 };
183 };
184 }; 198 };
185 }; 199 };
186}; 200};
diff --git a/arch/arm/boot/dts/armada-xp-mv78260.dtsi b/arch/arm/boot/dts/armada-xp-mv78260.dtsi
index 2d9335da210c..0e82c5062243 100644
--- a/arch/arm/boot/dts/armada-xp-mv78260.dtsi
+++ b/arch/arm/boot/dts/armada-xp-mv78260.dtsi
@@ -13,7 +13,7 @@
13 * common to all Armada XP SoCs. 13 * common to all Armada XP SoCs.
14 */ 14 */
15 15
16/include/ "armada-xp.dtsi" 16#include "armada-xp.dtsi"
17 17
18/ { 18/ {
19 model = "Marvell Armada XP MV78260 SoC"; 19 model = "Marvell Armada XP MV78260 SoC";
@@ -45,6 +45,145 @@
45 }; 45 };
46 46
47 soc { 47 soc {
48 /*
49 * MV78260 has 3 PCIe units Gen2.0: Two units can be
50 * configured as x4 or quad x1 lanes. One unit is
51 * x4/x1.
52 */
53 pcie-controller {
54 compatible = "marvell,armada-xp-pcie";
55 status = "disabled";
56 device_type = "pci";
57
58 #address-cells = <3>;
59 #size-cells = <2>;
60
61 bus-range = <0x00 0xff>;
62
63 ranges =
64 <0x82000000 0 0x40000 MBUS_ID(0xf0, 0x01) 0x40000 0 0x00002000 /* Port 0.0 registers */
65 0x82000000 0 0x42000 MBUS_ID(0xf0, 0x01) 0x42000 0 0x00002000 /* Port 2.0 registers */
66 0x82000000 0 0x44000 MBUS_ID(0xf0, 0x01) 0x44000 0 0x00002000 /* Port 0.1 registers */
67 0x82000000 0 0x48000 MBUS_ID(0xf0, 0x01) 0x48000 0 0x00002000 /* Port 0.2 registers */
68 0x82000000 0 0x4c000 MBUS_ID(0xf0, 0x01) 0x4c000 0 0x00002000 /* Port 0.3 registers */
69 0x82000000 0 0x80000 MBUS_ID(0xf0, 0x01) 0x80000 0 0x00002000 /* Port 1.0 registers */
70 0x82000000 0 0x82000 MBUS_ID(0xf0, 0x01) 0x82000 0 0x00002000 /* Port 3.0 registers */
71 0x82000000 0x1 0 MBUS_ID(0x04, 0xe8) 0 1 0 /* Port 0.0 MEM */
72 0x81000000 0x1 0 MBUS_ID(0x04, 0xe0) 0 1 0 /* Port 0.0 IO */
73 0x82000000 0x2 0 MBUS_ID(0x04, 0xd8) 0 1 0 /* Port 0.1 MEM */
74 0x81000000 0x2 0 MBUS_ID(0x04, 0xd0) 0 1 0 /* Port 0.1 IO */
75 0x82000000 0x3 0 MBUS_ID(0x04, 0xb8) 0 1 0 /* Port 0.2 MEM */
76 0x81000000 0x3 0 MBUS_ID(0x04, 0xb0) 0 1 0 /* Port 0.2 IO */
77 0x82000000 0x4 0 MBUS_ID(0x04, 0x78) 0 1 0 /* Port 0.3 MEM */
78 0x81000000 0x4 0 MBUS_ID(0x04, 0x70) 0 1 0 /* Port 0.3 IO */
79 0x82000000 0x9 0 MBUS_ID(0x08, 0xe8) 0 1 0 /* Port 1.0 MEM */
80 0x81000000 0x9 0 MBUS_ID(0x08, 0xe0) 0 1 0 /* Port 1.0 IO */
81 0x82000000 0xa 0 MBUS_ID(0x08, 0xf8) 0 1 0 /* Port 3.0 MEM */
82 0x81000000 0xa 0 MBUS_ID(0x08, 0xf0) 0 1 0 /* Port 3.0 IO */>;
83
84 pcie@1,0 {
85 device_type = "pci";
86 assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
87 reg = <0x0800 0 0 0 0>;
88 #address-cells = <3>;
89 #size-cells = <2>;
90 #interrupt-cells = <1>;
91 ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
92 0x81000000 0 0 0x81000000 0x1 0 1 0>;
93 interrupt-map-mask = <0 0 0 0>;
94 interrupt-map = <0 0 0 0 &mpic 58>;
95 marvell,pcie-port = <0>;
96 marvell,pcie-lane = <0>;
97 clocks = <&gateclk 5>;
98 status = "disabled";
99 };
100
101 pcie@2,0 {
102 device_type = "pci";
103 assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
104 reg = <0x1000 0 0 0 0>;
105 #address-cells = <3>;
106 #size-cells = <2>;
107 #interrupt-cells = <1>;
108 ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0
109 0x81000000 0 0 0x81000000 0x2 0 1 0>;
110 interrupt-map-mask = <0 0 0 0>;
111 interrupt-map = <0 0 0 0 &mpic 59>;
112 marvell,pcie-port = <0>;
113 marvell,pcie-lane = <1>;
114 clocks = <&gateclk 6>;
115 status = "disabled";
116 };
117
118 pcie@3,0 {
119 device_type = "pci";
120 assigned-addresses = <0x82000800 0 0x48000 0 0x2000>;
121 reg = <0x1800 0 0 0 0>;
122 #address-cells = <3>;
123 #size-cells = <2>;
124 #interrupt-cells = <1>;
125 ranges = <0x82000000 0 0 0x82000000 0x3 0 1 0
126 0x81000000 0 0 0x81000000 0x3 0 1 0>;
127 interrupt-map-mask = <0 0 0 0>;
128 interrupt-map = <0 0 0 0 &mpic 60>;
129 marvell,pcie-port = <0>;
130 marvell,pcie-lane = <2>;
131 clocks = <&gateclk 7>;
132 status = "disabled";
133 };
134
135 pcie@4,0 {
136 device_type = "pci";
137 assigned-addresses = <0x82000800 0 0x4c000 0 0x2000>;
138 reg = <0x2000 0 0 0 0>;
139 #address-cells = <3>;
140 #size-cells = <2>;
141 #interrupt-cells = <1>;
142 ranges = <0x82000000 0 0 0x82000000 0x4 0 1 0
143 0x81000000 0 0 0x81000000 0x4 0 1 0>;
144 interrupt-map-mask = <0 0 0 0>;
145 interrupt-map = <0 0 0 0 &mpic 61>;
146 marvell,pcie-port = <0>;
147 marvell,pcie-lane = <3>;
148 clocks = <&gateclk 8>;
149 status = "disabled";
150 };
151
152 pcie@9,0 {
153 device_type = "pci";
154 assigned-addresses = <0x82000800 0 0x42000 0 0x2000>;
155 reg = <0x4800 0 0 0 0>;
156 #address-cells = <3>;
157 #size-cells = <2>;
158 #interrupt-cells = <1>;
159 ranges = <0x82000000 0 0 0x82000000 0x9 0 1 0
160 0x81000000 0 0 0x81000000 0x9 0 1 0>;
161 interrupt-map-mask = <0 0 0 0>;
162 interrupt-map = <0 0 0 0 &mpic 99>;
163 marvell,pcie-port = <2>;
164 marvell,pcie-lane = <0>;
165 clocks = <&gateclk 26>;
166 status = "disabled";
167 };
168
169 pcie@10,0 {
170 device_type = "pci";
171 assigned-addresses = <0x82000800 0 0x82000 0 0x2000>;
172 reg = <0x5000 0 0 0 0>;
173 #address-cells = <3>;
174 #size-cells = <2>;
175 #interrupt-cells = <1>;
176 ranges = <0x82000000 0 0 0x82000000 0xa 0 1 0
177 0x81000000 0 0 0x81000000 0xa 0 1 0>;
178 interrupt-map-mask = <0 0 0 0>;
179 interrupt-map = <0 0 0 0 &mpic 103>;
180 marvell,pcie-port = <3>;
181 marvell,pcie-lane = <0>;
182 clocks = <&gateclk 27>;
183 status = "disabled";
184 };
185 };
186
48 internal-regs { 187 internal-regs {
49 pinctrl { 188 pinctrl {
50 compatible = "marvell,mv78260-pinctrl"; 189 compatible = "marvell,mv78260-pinctrl";
@@ -64,7 +203,7 @@
64 gpio-controller; 203 gpio-controller;
65 #gpio-cells = <2>; 204 #gpio-cells = <2>;
66 interrupt-controller; 205 interrupt-controller;
67 #interrupts-cells = <2>; 206 #interrupt-cells = <2>;
68 interrupts = <82>, <83>, <84>, <85>; 207 interrupts = <82>, <83>, <84>, <85>;
69 }; 208 };
70 209
@@ -75,7 +214,7 @@
75 gpio-controller; 214 gpio-controller;
76 #gpio-cells = <2>; 215 #gpio-cells = <2>;
77 interrupt-controller; 216 interrupt-controller;
78 #interrupts-cells = <2>; 217 #interrupt-cells = <2>;
79 interrupts = <87>, <88>, <89>, <90>; 218 interrupts = <87>, <88>, <89>, <90>;
80 }; 219 };
81 220
@@ -86,7 +225,7 @@
86 gpio-controller; 225 gpio-controller;
87 #gpio-cells = <2>; 226 #gpio-cells = <2>;
88 interrupt-controller; 227 interrupt-controller;
89 #interrupts-cells = <2>; 228 #interrupt-cells = <2>;
90 interrupts = <91>; 229 interrupts = <91>;
91 }; 230 };
92 231
@@ -97,128 +236,6 @@
97 clocks = <&gateclk 1>; 236 clocks = <&gateclk 1>;
98 status = "disabled"; 237 status = "disabled";
99 }; 238 };
100
101 /*
102 * MV78260 has 3 PCIe units Gen2.0: Two units can be
103 * configured as x4 or quad x1 lanes. One unit is
104 * x4/x1.
105 */
106 pcie-controller {
107 compatible = "marvell,armada-xp-pcie";
108 status = "disabled";
109 device_type = "pci";
110
111 #address-cells = <3>;
112 #size-cells = <2>;
113
114 bus-range = <0x00 0xff>;
115
116 ranges = <0x82000000 0 0x40000 0x40000 0 0x00002000 /* Port 0.0 registers */
117 0x82000000 0 0x42000 0x42000 0 0x00002000 /* Port 2.0 registers */
118 0x82000000 0 0x44000 0x44000 0 0x00002000 /* Port 0.1 registers */
119 0x82000000 0 0x48000 0x48000 0 0x00002000 /* Port 0.2 registers */
120 0x82000000 0 0x4c000 0x4c000 0 0x00002000 /* Port 0.3 registers */
121 0x82000000 0 0x80000 0x80000 0 0x00002000 /* Port 1.0 registers */
122 0x82000000 0 0x82000 0x82000 0 0x00002000 /* Port 3.0 registers */
123 0x82000000 0 0xe0000000 0xe0000000 0 0x08000000 /* non-prefetchable memory */
124 0x81000000 0 0 0xe8000000 0 0x00100000>; /* downstream I/O */
125
126 pcie@1,0 {
127 device_type = "pci";
128 assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
129 reg = <0x0800 0 0 0 0>;
130 #address-cells = <3>;
131 #size-cells = <2>;
132 #interrupt-cells = <1>;
133 ranges;
134 interrupt-map-mask = <0 0 0 0>;
135 interrupt-map = <0 0 0 0 &mpic 58>;
136 marvell,pcie-port = <0>;
137 marvell,pcie-lane = <0>;
138 clocks = <&gateclk 5>;
139 status = "disabled";
140 };
141
142 pcie@2,0 {
143 device_type = "pci";
144 assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
145 reg = <0x1000 0 0 0 0>;
146 #address-cells = <3>;
147 #size-cells = <2>;
148 #interrupt-cells = <1>;
149 ranges;
150 interrupt-map-mask = <0 0 0 0>;
151 interrupt-map = <0 0 0 0 &mpic 59>;
152 marvell,pcie-port = <0>;
153 marvell,pcie-lane = <1>;
154 clocks = <&gateclk 6>;
155 status = "disabled";
156 };
157
158 pcie@3,0 {
159 device_type = "pci";
160 assigned-addresses = <0x82000800 0 0x48000 0 0x2000>;
161 reg = <0x1800 0 0 0 0>;
162 #address-cells = <3>;
163 #size-cells = <2>;
164 #interrupt-cells = <1>;
165 ranges;
166 interrupt-map-mask = <0 0 0 0>;
167 interrupt-map = <0 0 0 0 &mpic 60>;
168 marvell,pcie-port = <0>;
169 marvell,pcie-lane = <2>;
170 clocks = <&gateclk 7>;
171 status = "disabled";
172 };
173
174 pcie@4,0 {
175 device_type = "pci";
176 assigned-addresses = <0x82000800 0 0x4c000 0 0x2000>;
177 reg = <0x2000 0 0 0 0>;
178 #address-cells = <3>;
179 #size-cells = <2>;
180 #interrupt-cells = <1>;
181 ranges;
182 interrupt-map-mask = <0 0 0 0>;
183 interrupt-map = <0 0 0 0 &mpic 61>;
184 marvell,pcie-port = <0>;
185 marvell,pcie-lane = <3>;
186 clocks = <&gateclk 8>;
187 status = "disabled";
188 };
189
190 pcie@9,0 {
191 device_type = "pci";
192 assigned-addresses = <0x82000800 0 0x42000 0 0x2000>;
193 reg = <0x4800 0 0 0 0>;
194 #address-cells = <3>;
195 #size-cells = <2>;
196 #interrupt-cells = <1>;
197 ranges;
198 interrupt-map-mask = <0 0 0 0>;
199 interrupt-map = <0 0 0 0 &mpic 99>;
200 marvell,pcie-port = <2>;
201 marvell,pcie-lane = <0>;
202 clocks = <&gateclk 26>;
203 status = "disabled";
204 };
205
206 pcie@10,0 {
207 device_type = "pci";
208 assigned-addresses = <0x82000800 0 0x82000 0 0x2000>;
209 reg = <0x5000 0 0 0 0>;
210 #address-cells = <3>;
211 #size-cells = <2>;
212 #interrupt-cells = <1>;
213 ranges;
214 interrupt-map-mask = <0 0 0 0>;
215 interrupt-map = <0 0 0 0 &mpic 103>;
216 marvell,pcie-port = <3>;
217 marvell,pcie-lane = <0>;
218 clocks = <&gateclk 27>;
219 status = "disabled";
220 };
221 };
222 }; 239 };
223 }; 240 };
224}; 241};
diff --git a/arch/arm/boot/dts/armada-xp-mv78460.dtsi b/arch/arm/boot/dts/armada-xp-mv78460.dtsi
index c7b1f4d5c1c7..e82c1b80af17 100644
--- a/arch/arm/boot/dts/armada-xp-mv78460.dtsi
+++ b/arch/arm/boot/dts/armada-xp-mv78460.dtsi
@@ -13,7 +13,7 @@
13 * common to all Armada XP SoCs. 13 * common to all Armada XP SoCs.
14 */ 14 */
15 15
16/include/ "armada-xp.dtsi" 16#include "armada-xp.dtsi"
17 17
18/ { 18/ {
19 model = "Marvell Armada XP MV78460 SoC"; 19 model = "Marvell Armada XP MV78460 SoC";
@@ -61,6 +61,227 @@
61 }; 61 };
62 62
63 soc { 63 soc {
64 /*
65 * MV78460 has 4 PCIe units Gen2.0: Two units can be
66 * configured as x4 or quad x1 lanes. Two units are
67 * x4/x1.
68 */
69 pcie-controller {
70 compatible = "marvell,armada-xp-pcie";
71 status = "disabled";
72 device_type = "pci";
73
74 #address-cells = <3>;
75 #size-cells = <2>;
76
77 bus-range = <0x00 0xff>;
78
79 ranges =
80 <0x82000000 0 0x40000 MBUS_ID(0xf0, 0x01) 0x40000 0 0x00002000 /* Port 0.0 registers */
81 0x82000000 0 0x42000 MBUS_ID(0xf0, 0x01) 0x42000 0 0x00002000 /* Port 2.0 registers */
82 0x82000000 0 0x44000 MBUS_ID(0xf0, 0x01) 0x44000 0 0x00002000 /* Port 0.1 registers */
83 0x82000000 0 0x48000 MBUS_ID(0xf0, 0x01) 0x48000 0 0x00002000 /* Port 0.2 registers */
84 0x82000000 0 0x4c000 MBUS_ID(0xf0, 0x01) 0x4c000 0 0x00002000 /* Port 0.3 registers */
85 0x82000000 0 0x80000 MBUS_ID(0xf0, 0x01) 0x80000 0 0x00002000 /* Port 1.0 registers */
86 0x82000000 0 0x82000 MBUS_ID(0xf0, 0x01) 0x82000 0 0x00002000 /* Port 3.0 registers */
87 0x82000000 0 0x84000 MBUS_ID(0xf0, 0x01) 0x84000 0 0x00002000 /* Port 1.1 registers */
88 0x82000000 0 0x88000 MBUS_ID(0xf0, 0x01) 0x88000 0 0x00002000 /* Port 1.2 registers */
89 0x82000000 0 0x8c000 MBUS_ID(0xf0, 0x01) 0x8c000 0 0x00002000 /* Port 1.3 registers */
90 0x82000000 0x1 0 MBUS_ID(0x04, 0xe8) 0 1 0 /* Port 0.0 MEM */
91 0x81000000 0x1 0 MBUS_ID(0x04, 0xe0) 0 1 0 /* Port 0.0 IO */
92 0x82000000 0x2 0 MBUS_ID(0x04, 0xd8) 0 1 0 /* Port 0.1 MEM */
93 0x81000000 0x2 0 MBUS_ID(0x04, 0xd0) 0 1 0 /* Port 0.1 IO */
94 0x82000000 0x3 0 MBUS_ID(0x04, 0xb8) 0 1 0 /* Port 0.2 MEM */
95 0x81000000 0x3 0 MBUS_ID(0x04, 0xb0) 0 1 0 /* Port 0.2 IO */
96 0x82000000 0x4 0 MBUS_ID(0x04, 0x78) 0 1 0 /* Port 0.3 MEM */
97 0x81000000 0x4 0 MBUS_ID(0x04, 0x70) 0 1 0 /* Port 0.3 IO */
98
99 0x82000000 0x5 0 MBUS_ID(0x08, 0xe8) 0 1 0 /* Port 1.0 MEM */
100 0x81000000 0x5 0 MBUS_ID(0x08, 0xe0) 0 1 0 /* Port 1.0 IO */
101 0x82000000 0x6 0 MBUS_ID(0x08, 0xd8) 0 1 0 /* Port 1.1 MEM */
102 0x81000000 0x6 0 MBUS_ID(0x08, 0xd0) 0 1 0 /* Port 1.1 IO */
103 0x82000000 0x7 0 MBUS_ID(0x08, 0xb8) 0 1 0 /* Port 1.2 MEM */
104 0x81000000 0x7 0 MBUS_ID(0x08, 0xb0) 0 1 0 /* Port 1.2 IO */
105 0x82000000 0x8 0 MBUS_ID(0x08, 0x78) 0 1 0 /* Port 1.3 MEM */
106 0x81000000 0x8 0 MBUS_ID(0x08, 0x70) 0 1 0 /* Port 1.3 IO */
107
108 0x82000000 0x9 0 MBUS_ID(0x04, 0xf8) 0 1 0 /* Port 2.0 MEM */
109 0x81000000 0x9 0 MBUS_ID(0x04, 0xf0) 0 1 0 /* Port 2.0 IO */
110
111 0x82000000 0xa 0 MBUS_ID(0x08, 0xf8) 0 1 0 /* Port 3.0 MEM */
112 0x81000000 0xa 0 MBUS_ID(0x08, 0xf0) 0 1 0 /* Port 3.0 IO */>;
113
114 pcie@1,0 {
115 device_type = "pci";
116 assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
117 reg = <0x0800 0 0 0 0>;
118 #address-cells = <3>;
119 #size-cells = <2>;
120 #interrupt-cells = <1>;
121 ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
122 0x81000000 0 0 0x81000000 0x1 0 1 0>;
123 interrupt-map-mask = <0 0 0 0>;
124 interrupt-map = <0 0 0 0 &mpic 58>;
125 marvell,pcie-port = <0>;
126 marvell,pcie-lane = <0>;
127 clocks = <&gateclk 5>;
128 status = "disabled";
129 };
130
131 pcie@2,0 {
132 device_type = "pci";
133 assigned-addresses = <0x82001000 0 0x44000 0 0x2000>;
134 reg = <0x1000 0 0 0 0>;
135 #address-cells = <3>;
136 #size-cells = <2>;
137 #interrupt-cells = <1>;
138 ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0
139 0x81000000 0 0 0x81000000 0x2 0 1 0>;
140 interrupt-map-mask = <0 0 0 0>;
141 interrupt-map = <0 0 0 0 &mpic 59>;
142 marvell,pcie-port = <0>;
143 marvell,pcie-lane = <1>;
144 clocks = <&gateclk 6>;
145 status = "disabled";
146 };
147
148 pcie@3,0 {
149 device_type = "pci";
150 assigned-addresses = <0x82001800 0 0x48000 0 0x2000>;
151 reg = <0x1800 0 0 0 0>;
152 #address-cells = <3>;
153 #size-cells = <2>;
154 #interrupt-cells = <1>;
155 ranges = <0x82000000 0 0 0x82000000 0x3 0 1 0
156 0x81000000 0 0 0x81000000 0x3 0 1 0>;
157 interrupt-map-mask = <0 0 0 0>;
158 interrupt-map = <0 0 0 0 &mpic 60>;
159 marvell,pcie-port = <0>;
160 marvell,pcie-lane = <2>;
161 clocks = <&gateclk 7>;
162 status = "disabled";
163 };
164
165 pcie@4,0 {
166 device_type = "pci";
167 assigned-addresses = <0x82002000 0 0x4c000 0 0x2000>;
168 reg = <0x2000 0 0 0 0>;
169 #address-cells = <3>;
170 #size-cells = <2>;
171 #interrupt-cells = <1>;
172 ranges = <0x82000000 0 0 0x82000000 0x4 0 1 0
173 0x81000000 0 0 0x81000000 0x4 0 1 0>;
174 interrupt-map-mask = <0 0 0 0>;
175 interrupt-map = <0 0 0 0 &mpic 61>;
176 marvell,pcie-port = <0>;
177 marvell,pcie-lane = <3>;
178 clocks = <&gateclk 8>;
179 status = "disabled";
180 };
181
182 pcie@5,0 {
183 device_type = "pci";
184 assigned-addresses = <0x82002800 0 0x80000 0 0x2000>;
185 reg = <0x2800 0 0 0 0>;
186 #address-cells = <3>;
187 #size-cells = <2>;
188 #interrupt-cells = <1>;
189 ranges = <0x82000000 0 0 0x82000000 0x5 0 1 0
190 0x81000000 0 0 0x81000000 0x5 0 1 0>;
191 interrupt-map-mask = <0 0 0 0>;
192 interrupt-map = <0 0 0 0 &mpic 62>;
193 marvell,pcie-port = <1>;
194 marvell,pcie-lane = <0>;
195 clocks = <&gateclk 9>;
196 status = "disabled";
197 };
198
199 pcie@6,0 {
200 device_type = "pci";
201 assigned-addresses = <0x82003000 0 0x84000 0 0x2000>;
202 reg = <0x3000 0 0 0 0>;
203 #address-cells = <3>;
204 #size-cells = <2>;
205 #interrupt-cells = <1>;
206 ranges = <0x82000000 0 0 0x82000000 0x6 0 1 0
207 0x81000000 0 0 0x81000000 0x6 0 1 0>;
208 interrupt-map-mask = <0 0 0 0>;
209 interrupt-map = <0 0 0 0 &mpic 63>;
210 marvell,pcie-port = <1>;
211 marvell,pcie-lane = <1>;
212 clocks = <&gateclk 10>;
213 status = "disabled";
214 };
215
216 pcie@7,0 {
217 device_type = "pci";
218 assigned-addresses = <0x82003800 0 0x88000 0 0x2000>;
219 reg = <0x3800 0 0 0 0>;
220 #address-cells = <3>;
221 #size-cells = <2>;
222 #interrupt-cells = <1>;
223 ranges = <0x82000000 0 0 0x82000000 0x7 0 1 0
224 0x81000000 0 0 0x81000000 0x7 0 1 0>;
225 interrupt-map-mask = <0 0 0 0>;
226 interrupt-map = <0 0 0 0 &mpic 64>;
227 marvell,pcie-port = <1>;
228 marvell,pcie-lane = <2>;
229 clocks = <&gateclk 11>;
230 status = "disabled";
231 };
232
233 pcie@8,0 {
234 device_type = "pci";
235 assigned-addresses = <0x82004000 0 0x8c000 0 0x2000>;
236 reg = <0x4000 0 0 0 0>;
237 #address-cells = <3>;
238 #size-cells = <2>;
239 #interrupt-cells = <1>;
240 ranges = <0x82000000 0 0 0x82000000 0x8 0 1 0
241 0x81000000 0 0 0x81000000 0x8 0 1 0>;
242 interrupt-map-mask = <0 0 0 0>;
243 interrupt-map = <0 0 0 0 &mpic 65>;
244 marvell,pcie-port = <1>;
245 marvell,pcie-lane = <3>;
246 clocks = <&gateclk 12>;
247 status = "disabled";
248 };
249
250 pcie@9,0 {
251 device_type = "pci";
252 assigned-addresses = <0x82004800 0 0x42000 0 0x2000>;
253 reg = <0x4800 0 0 0 0>;
254 #address-cells = <3>;
255 #size-cells = <2>;
256 #interrupt-cells = <1>;
257 ranges = <0x82000000 0 0 0x82000000 0x9 0 1 0
258 0x81000000 0 0 0x81000000 0x9 0 1 0>;
259 interrupt-map-mask = <0 0 0 0>;
260 interrupt-map = <0 0 0 0 &mpic 99>;
261 marvell,pcie-port = <2>;
262 marvell,pcie-lane = <0>;
263 clocks = <&gateclk 26>;
264 status = "disabled";
265 };
266
267 pcie@10,0 {
268 device_type = "pci";
269 assigned-addresses = <0x82005000 0 0x82000 0 0x2000>;
270 reg = <0x5000 0 0 0 0>;
271 #address-cells = <3>;
272 #size-cells = <2>;
273 #interrupt-cells = <1>;
274 ranges = <0x82000000 0 0 0x82000000 0xa 0 1 0
275 0x81000000 0 0 0x81000000 0xa 0 1 0>;
276 interrupt-map-mask = <0 0 0 0>;
277 interrupt-map = <0 0 0 0 &mpic 103>;
278 marvell,pcie-port = <3>;
279 marvell,pcie-lane = <0>;
280 clocks = <&gateclk 27>;
281 status = "disabled";
282 };
283 };
284
64 internal-regs { 285 internal-regs {
65 pinctrl { 286 pinctrl {
66 compatible = "marvell,mv78460-pinctrl"; 287 compatible = "marvell,mv78460-pinctrl";
@@ -80,7 +301,7 @@
80 gpio-controller; 301 gpio-controller;
81 #gpio-cells = <2>; 302 #gpio-cells = <2>;
82 interrupt-controller; 303 interrupt-controller;
83 #interrupts-cells = <2>; 304 #interrupt-cells = <2>;
84 interrupts = <82>, <83>, <84>, <85>; 305 interrupts = <82>, <83>, <84>, <85>;
85 }; 306 };
86 307
@@ -91,7 +312,7 @@
91 gpio-controller; 312 gpio-controller;
92 #gpio-cells = <2>; 313 #gpio-cells = <2>;
93 interrupt-controller; 314 interrupt-controller;
94 #interrupts-cells = <2>; 315 #interrupt-cells = <2>;
95 interrupts = <87>, <88>, <89>, <90>; 316 interrupts = <87>, <88>, <89>, <90>;
96 }; 317 };
97 318
@@ -102,7 +323,7 @@
102 gpio-controller; 323 gpio-controller;
103 #gpio-cells = <2>; 324 #gpio-cells = <2>;
104 interrupt-controller; 325 interrupt-controller;
105 #interrupts-cells = <2>; 326 #interrupt-cells = <2>;
106 interrupts = <91>; 327 interrupts = <91>;
107 }; 328 };
108 329
@@ -113,194 +334,6 @@
113 clocks = <&gateclk 1>; 334 clocks = <&gateclk 1>;
114 status = "disabled"; 335 status = "disabled";
115 }; 336 };
116
117 /*
118 * MV78460 has 4 PCIe units Gen2.0: Two units can be
119 * configured as x4 or quad x1 lanes. Two units are
120 * x4/x1.
121 */
122 pcie-controller {
123 compatible = "marvell,armada-xp-pcie";
124 status = "disabled";
125 device_type = "pci";
126
127 #address-cells = <3>;
128 #size-cells = <2>;
129
130 bus-range = <0x00 0xff>;
131
132 ranges = <0x82000000 0 0x40000 0x40000 0 0x00002000 /* Port 0.0 registers */
133 0x82000000 0 0x42000 0x42000 0 0x00002000 /* Port 2.0 registers */
134 0x82000000 0 0x44000 0x44000 0 0x00002000 /* Port 0.1 registers */
135 0x82000000 0 0x48000 0x48000 0 0x00002000 /* Port 0.2 registers */
136 0x82000000 0 0x4c000 0x4c000 0 0x00002000 /* Port 0.3 registers */
137 0x82000000 0 0x80000 0x80000 0 0x00002000 /* Port 1.0 registers */
138 0x82000000 0 0x82000 0x82000 0 0x00002000 /* Port 3.0 registers */
139 0x82000000 0 0x84000 0x84000 0 0x00002000 /* Port 1.1 registers */
140 0x82000000 0 0x88000 0x88000 0 0x00002000 /* Port 1.2 registers */
141 0x82000000 0 0x8c000 0x8c000 0 0x00002000 /* Port 1.3 registers */
142 0x82000000 0 0xe0000000 0xe0000000 0 0x08000000 /* non-prefetchable memory */
143 0x81000000 0 0 0xe8000000 0 0x00100000>; /* downstream I/O */
144
145 pcie@1,0 {
146 device_type = "pci";
147 assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
148 reg = <0x0800 0 0 0 0>;
149 #address-cells = <3>;
150 #size-cells = <2>;
151 #interrupt-cells = <1>;
152 ranges;
153 interrupt-map-mask = <0 0 0 0>;
154 interrupt-map = <0 0 0 0 &mpic 58>;
155 marvell,pcie-port = <0>;
156 marvell,pcie-lane = <0>;
157 clocks = <&gateclk 5>;
158 status = "disabled";
159 };
160
161 pcie@2,0 {
162 device_type = "pci";
163 assigned-addresses = <0x82001000 0 0x44000 0 0x2000>;
164 reg = <0x1000 0 0 0 0>;
165 #address-cells = <3>;
166 #size-cells = <2>;
167 #interrupt-cells = <1>;
168 ranges;
169 interrupt-map-mask = <0 0 0 0>;
170 interrupt-map = <0 0 0 0 &mpic 59>;
171 marvell,pcie-port = <0>;
172 marvell,pcie-lane = <1>;
173 clocks = <&gateclk 6>;
174 status = "disabled";
175 };
176
177 pcie@3,0 {
178 device_type = "pci";
179 assigned-addresses = <0x82001800 0 0x48000 0 0x2000>;
180 reg = <0x1800 0 0 0 0>;
181 #address-cells = <3>;
182 #size-cells = <2>;
183 #interrupt-cells = <1>;
184 ranges;
185 interrupt-map-mask = <0 0 0 0>;
186 interrupt-map = <0 0 0 0 &mpic 60>;
187 marvell,pcie-port = <0>;
188 marvell,pcie-lane = <2>;
189 clocks = <&gateclk 7>;
190 status = "disabled";
191 };
192
193 pcie@4,0 {
194 device_type = "pci";
195 assigned-addresses = <0x82002000 0 0x4c000 0 0x2000>;
196 reg = <0x2000 0 0 0 0>;
197 #address-cells = <3>;
198 #size-cells = <2>;
199 #interrupt-cells = <1>;
200 ranges;
201 interrupt-map-mask = <0 0 0 0>;
202 interrupt-map = <0 0 0 0 &mpic 61>;
203 marvell,pcie-port = <0>;
204 marvell,pcie-lane = <3>;
205 clocks = <&gateclk 8>;
206 status = "disabled";
207 };
208
209 pcie@5,0 {
210 device_type = "pci";
211 assigned-addresses = <0x82002800 0 0x80000 0 0x2000>;
212 reg = <0x2800 0 0 0 0>;
213 #address-cells = <3>;
214 #size-cells = <2>;
215 #interrupt-cells = <1>;
216 ranges;
217 interrupt-map-mask = <0 0 0 0>;
218 interrupt-map = <0 0 0 0 &mpic 62>;
219 marvell,pcie-port = <1>;
220 marvell,pcie-lane = <0>;
221 clocks = <&gateclk 9>;
222 status = "disabled";
223 };
224
225 pcie@6,0 {
226 device_type = "pci";
227 assigned-addresses = <0x82003000 0 0x84000 0 0x2000>;
228 reg = <0x3000 0 0 0 0>;
229 #address-cells = <3>;
230 #size-cells = <2>;
231 #interrupt-cells = <1>;
232 ranges;
233 interrupt-map-mask = <0 0 0 0>;
234 interrupt-map = <0 0 0 0 &mpic 63>;
235 marvell,pcie-port = <1>;
236 marvell,pcie-lane = <1>;
237 clocks = <&gateclk 10>;
238 status = "disabled";
239 };
240
241 pcie@7,0 {
242 device_type = "pci";
243 assigned-addresses = <0x82003800 0 0x88000 0 0x2000>;
244 reg = <0x3800 0 0 0 0>;
245 #address-cells = <3>;
246 #size-cells = <2>;
247 #interrupt-cells = <1>;
248 ranges;
249 interrupt-map-mask = <0 0 0 0>;
250 interrupt-map = <0 0 0 0 &mpic 64>;
251 marvell,pcie-port = <1>;
252 marvell,pcie-lane = <2>;
253 clocks = <&gateclk 11>;
254 status = "disabled";
255 };
256
257 pcie@8,0 {
258 device_type = "pci";
259 assigned-addresses = <0x82004000 0 0x8c000 0 0x2000>;
260 reg = <0x4000 0 0 0 0>;
261 #address-cells = <3>;
262 #size-cells = <2>;
263 #interrupt-cells = <1>;
264 ranges;
265 interrupt-map-mask = <0 0 0 0>;
266 interrupt-map = <0 0 0 0 &mpic 65>;
267 marvell,pcie-port = <1>;
268 marvell,pcie-lane = <3>;
269 clocks = <&gateclk 12>;
270 status = "disabled";
271 };
272 pcie@9,0 {
273 device_type = "pci";
274 assigned-addresses = <0x82004800 0 0x42000 0 0x2000>;
275 reg = <0x4800 0 0 0 0>;
276 #address-cells = <3>;
277 #size-cells = <2>;
278 #interrupt-cells = <1>;
279 ranges;
280 interrupt-map-mask = <0 0 0 0>;
281 interrupt-map = <0 0 0 0 &mpic 99>;
282 marvell,pcie-port = <2>;
283 marvell,pcie-lane = <0>;
284 clocks = <&gateclk 26>;
285 status = "disabled";
286 };
287
288 pcie@10,0 {
289 device_type = "pci";
290 assigned-addresses = <0x82005000 0 0x82000 0 0x2000>;
291 reg = <0x5000 0 0 0 0>;
292 #address-cells = <3>;
293 #size-cells = <2>;
294 #interrupt-cells = <1>;
295 ranges;
296 interrupt-map-mask = <0 0 0 0>;
297 interrupt-map = <0 0 0 0 &mpic 103>;
298 marvell,pcie-port = <3>;
299 marvell,pcie-lane = <0>;
300 clocks = <&gateclk 27>;
301 status = "disabled";
302 };
303 };
304 }; 337 };
305 }; 338 };
306}; 339};
diff --git a/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts b/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts
index 8f510458ea86..5695afcc04bf 100644
--- a/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts
+++ b/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts
@@ -11,7 +11,7 @@
11 */ 11 */
12 12
13/dts-v1/; 13/dts-v1/;
14/include/ "armada-xp-mv78260.dtsi" 14#include "armada-xp-mv78260.dtsi"
15 15
16/ { 16/ {
17 model = "PlatHome OpenBlocks AX3-4 board"; 17 model = "PlatHome OpenBlocks AX3-4 board";
@@ -27,9 +27,46 @@
27 }; 27 };
28 28
29 soc { 29 soc {
30 ranges = <0 0 0xd0000000 0x100000 /* Internal registers 1MiB */ 30 ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000
31 0xe0000000 0 0xe0000000 0x8100000 /* PCIe */ 31 MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
32 0xf0000000 0 0xf0000000 0x8000000 /* Device Bus, NOR 128MiB */>; 32 MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x8000000>;
33
34 devbus-bootcs {
35 status = "okay";
36
37 /* Device Bus parameters are required */
38
39 /* Read parameters */
40 devbus,bus-width = <8>;
41 devbus,turn-off-ps = <60000>;
42 devbus,badr-skew-ps = <0>;
43 devbus,acc-first-ps = <124000>;
44 devbus,acc-next-ps = <248000>;
45 devbus,rd-setup-ps = <0>;
46 devbus,rd-hold-ps = <0>;
47
48 /* Write parameters */
49 devbus,sync-enable = <0>;
50 devbus,wr-high-ps = <60000>;
51 devbus,wr-low-ps = <60000>;
52 devbus,ale-wr-ps = <60000>;
53
54 /* NOR 128 MiB */
55 nor@0 {
56 compatible = "cfi-flash";
57 reg = <0 0x8000000>;
58 bank-width = <2>;
59 };
60 };
61
62 pcie-controller {
63 status = "okay";
64 /* Internal mini-PCIe connector */
65 pcie@1,0 {
66 /* Port 0, Lane 0 */
67 status = "okay";
68 };
69 };
33 70
34 internal-regs { 71 internal-regs {
35 serial@12000 { 72 serial@12000 {
@@ -148,49 +185,6 @@
148 usb@51000 { 185 usb@51000 {
149 status = "okay"; 186 status = "okay";
150 }; 187 };
151
152 /* USB interface in the mini-PCIe connector */
153 usb@52000 {
154 status = "okay";
155 };
156
157 devbus-bootcs@10400 {
158 status = "okay";
159 ranges = <0 0xf0000000 0x8000000>; /* @addr 0xf000000, size 0x8000000 */
160
161 /* Device Bus parameters are required */
162
163 /* Read parameters */
164 devbus,bus-width = <8>;
165 devbus,turn-off-ps = <60000>;
166 devbus,badr-skew-ps = <0>;
167 devbus,acc-first-ps = <124000>;
168 devbus,acc-next-ps = <248000>;
169 devbus,rd-setup-ps = <0>;
170 devbus,rd-hold-ps = <0>;
171
172 /* Write parameters */
173 devbus,sync-enable = <0>;
174 devbus,wr-high-ps = <60000>;
175 devbus,wr-low-ps = <60000>;
176 devbus,ale-wr-ps = <60000>;
177
178 /* NOR 128 MiB */
179 nor@0 {
180 compatible = "cfi-flash";
181 reg = <0 0x8000000>;
182 bank-width = <2>;
183 };
184 };
185
186 pcie-controller {
187 status = "okay";
188 /* Internal mini-PCIe connector */
189 pcie@1,0 {
190 /* Port 0, Lane 0 */
191 status = "okay";
192 };
193 };
194 }; 188 };
195 }; 189 };
196}; 190};
diff --git a/arch/arm/boot/dts/armada-xp.dtsi b/arch/arm/boot/dts/armada-xp.dtsi
index 416eb9481844..def125c0eeaa 100644
--- a/arch/arm/boot/dts/armada-xp.dtsi
+++ b/arch/arm/boot/dts/armada-xp.dtsi
@@ -16,7 +16,7 @@
16 * common to all Armada SoCs. 16 * common to all Armada SoCs.
17 */ 17 */
18 18
19/include/ "armada-370-xp.dtsi" 19#include "armada-370-xp.dtsi"
20 20
21/ { 21/ {
22 model = "Marvell Armada XP family SoC"; 22 model = "Marvell Armada XP family SoC";
@@ -27,6 +27,13 @@
27 }; 27 };
28 28
29 soc { 29 soc {
30 compatible = "marvell,armadaxp-mbus", "simple-bus";
31
32 bootrom {
33 compatible = "marvell,bootrom";
34 reg = <MBUS_ID(0x01, 0x1d) 0 0x100000>;
35 };
36
30 internal-regs { 37 internal-regs {
31 L2: l2-cache { 38 L2: l2-cache {
32 compatible = "marvell,aurora-system-cache"; 39 compatible = "marvell,aurora-system-cache";
@@ -62,7 +69,7 @@
62 }; 69 };
63 70
64 timer@20300 { 71 timer@20300 {
65 marvell,timer-25Mhz; 72 compatible = "marvell,armada-xp-timer";
66 }; 73 };
67 74
68 coreclk: mvebu-sar@18230 { 75 coreclk: mvebu-sar@18230 {
diff --git a/arch/arm/boot/dts/at91rm9200.dtsi b/arch/arm/boot/dts/at91rm9200.dtsi
index 92b9e21389db..f77065506f1e 100644
--- a/arch/arm/boot/dts/at91rm9200.dtsi
+++ b/arch/arm/boot/dts/at91rm9200.dtsi
@@ -120,6 +120,7 @@
120 interrupts = <10 IRQ_TYPE_LEVEL_HIGH 0>; 120 interrupts = <10 IRQ_TYPE_LEVEL_HIGH 0>;
121 #address-cells = <1>; 121 #address-cells = <1>;
122 #size-cells = <0>; 122 #size-cells = <0>;
123 pinctrl-names = "default";
123 status = "disabled"; 124 status = "disabled";
124 }; 125 };
125 126
diff --git a/arch/arm/boot/dts/at91rm9200_pqfp.dtsi b/arch/arm/boot/dts/at91rm9200_pqfp.dtsi
new file mode 100644
index 000000000000..93ca66f80360
--- /dev/null
+++ b/arch/arm/boot/dts/at91rm9200_pqfp.dtsi
@@ -0,0 +1,17 @@
1/*
2 * at91rm9200_pqfp.dtsi - Device Tree Include file for AT91RM9200 PQFP family SoC
3 *
4 * Copyright (C) 2013 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
5 *
6 * Licensed under GPLv2 or later.
7 */
8
9#include "at91rm9200.dtsi"
10
11/ {
12 compatible = "atmel,at91rm9200-pqfp", "atmel,at91rm9200";
13};
14
15&pioD {
16 status = "disabled";
17};
diff --git a/arch/arm/boot/dts/at91sam9260.dtsi b/arch/arm/boot/dts/at91sam9260.dtsi
index c7ccbcbffb3e..56ee8282a7a8 100644
--- a/arch/arm/boot/dts/at91sam9260.dtsi
+++ b/arch/arm/boot/dts/at91sam9260.dtsi
@@ -572,6 +572,7 @@
572 interrupts = <9 IRQ_TYPE_LEVEL_HIGH 0>; 572 interrupts = <9 IRQ_TYPE_LEVEL_HIGH 0>;
573 #address-cells = <1>; 573 #address-cells = <1>;
574 #size-cells = <0>; 574 #size-cells = <0>;
575 pinctrl-names = "default";
575 status = "disabled"; 576 status = "disabled";
576 }; 577 };
577 578
diff --git a/arch/arm/boot/dts/at91sam9n12.dtsi b/arch/arm/boot/dts/at91sam9n12.dtsi
index bb7f564b3a55..9fb7ffd32af2 100644
--- a/arch/arm/boot/dts/at91sam9n12.dtsi
+++ b/arch/arm/boot/dts/at91sam9n12.dtsi
@@ -291,6 +291,22 @@
291 }; 291 };
292 }; 292 };
293 293
294 i2c0 {
295 pinctrl_i2c0: i2c0-0 {
296 atmel,pins =
297 <AT91_PIOA 30 AT91_PERIPH_A AT91_PINCTRL_NONE
298 AT91_PIOA 31 AT91_PERIPH_A AT91_PINCTRL_NONE>;
299 };
300 };
301
302 i2c1 {
303 pinctrl_i2c1: i2c1-0 {
304 atmel,pins =
305 <AT91_PIOC 0 AT91_PERIPH_C AT91_PINCTRL_NONE
306 AT91_PIOC 1 AT91_PERIPH_C AT91_PINCTRL_NONE>;
307 };
308 };
309
294 tcb0 { 310 tcb0 {
295 pinctrl_tcb0_tclk0: tcb0_tclk0-0 { 311 pinctrl_tcb0_tclk0: tcb0_tclk0-0 {
296 atmel,pins = <AT91_PIOA 24 AT91_PERIPH_A AT91_PINCTRL_NONE>; 312 atmel,pins = <AT91_PIOA 24 AT91_PERIPH_A AT91_PINCTRL_NONE>;
@@ -471,6 +487,8 @@
471 dma-names = "tx", "rx"; 487 dma-names = "tx", "rx";
472 #address-cells = <1>; 488 #address-cells = <1>;
473 #size-cells = <0>; 489 #size-cells = <0>;
490 pinctrl-names = "default";
491 pinctrl-0 = <&pinctrl_i2c0>;
474 status = "disabled"; 492 status = "disabled";
475 }; 493 };
476 494
@@ -483,6 +501,8 @@
483 dma-names = "tx", "rx"; 501 dma-names = "tx", "rx";
484 #address-cells = <1>; 502 #address-cells = <1>;
485 #size-cells = <0>; 503 #size-cells = <0>;
504 pinctrl-names = "default";
505 pinctrl-0 = <&pinctrl_i2c1>;
486 status = "disabled"; 506 status = "disabled";
487 }; 507 };
488 508
diff --git a/arch/arm/boot/dts/at91sam9n12ek.dts b/arch/arm/boot/dts/at91sam9n12ek.dts
index 3d77dbe406f4..27a9352b9d7a 100644
--- a/arch/arm/boot/dts/at91sam9n12ek.dts
+++ b/arch/arm/boot/dts/at91sam9n12ek.dts
@@ -40,6 +40,15 @@
40 40
41 i2c0: i2c@f8010000 { 41 i2c0: i2c@f8010000 {
42 status = "okay"; 42 status = "okay";
43
44 qt1070: keyboard@1b {
45 compatible = "qt1070";
46 reg = <0x1b>;
47 interrupt-parent = <&pioA>;
48 interrupts = <2 IRQ_TYPE_EDGE_FALLING>;
49 pinctrl-names = "default";
50 pinctrl-0 = <&pinctrl_qt1070_irq>;
51 };
43 }; 52 };
44 53
45 i2c1: i2c@f8014000 { 54 i2c1: i2c@f8014000 {
@@ -66,6 +75,13 @@
66 <AT91_PIOA 7 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>; /* PA7 gpio CD pin pull up and deglitch */ 75 <AT91_PIOA 7 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>; /* PA7 gpio CD pin pull up and deglitch */
67 }; 76 };
68 }; 77 };
78
79 qt1070 {
80 pinctrl_qt1070_irq: qt1070_irq {
81 atmel,pins =
82 <AT91_PIOA 2 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>;
83 };
84 };
69 }; 85 };
70 86
71 spi0: spi@f0000000 { 87 spi0: spi@f0000000 {
@@ -121,7 +137,7 @@
121 137
122 enter { 138 enter {
123 label = "Enter"; 139 label = "Enter";
124 gpios = <&pioB 4 GPIO_ACTIVE_LOW>; 140 gpios = <&pioB 3 GPIO_ACTIVE_LOW>;
125 linux,code = <28>; 141 linux,code = <28>;
126 gpio-key,wakeup; 142 gpio-key,wakeup;
127 }; 143 };
diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi
index 57d45f5bea09..cf78ac0b04b1 100644
--- a/arch/arm/boot/dts/at91sam9x5.dtsi
+++ b/arch/arm/boot/dts/at91sam9x5.dtsi
@@ -542,6 +542,9 @@
542 compatible = "atmel,at91sam9g45-ssc"; 542 compatible = "atmel,at91sam9g45-ssc";
543 reg = <0xf0010000 0x4000>; 543 reg = <0xf0010000 0x4000>;
544 interrupts = <28 IRQ_TYPE_LEVEL_HIGH 5>; 544 interrupts = <28 IRQ_TYPE_LEVEL_HIGH 5>;
545 dmas = <&dma0 1 AT91_DMA_CFG_PER_ID(13)>,
546 <&dma0 1 AT91_DMA_CFG_PER_ID(14)>;
547 dma-names = "tx", "rx";
545 pinctrl-names = "default"; 548 pinctrl-names = "default";
546 pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>; 549 pinctrl-0 = <&pinctrl_ssc0_tx &pinctrl_ssc0_rx>;
547 status = "disabled"; 550 status = "disabled";
diff --git a/arch/arm/boot/dts/at91sam9x5ek.dtsi b/arch/arm/boot/dts/at91sam9x5ek.dtsi
index 49e3c45818c2..3a9f6fa4a36a 100644
--- a/arch/arm/boot/dts/at91sam9x5ek.dtsi
+++ b/arch/arm/boot/dts/at91sam9x5ek.dtsi
@@ -59,6 +59,11 @@
59 59
60 i2c0: i2c@f8010000 { 60 i2c0: i2c@f8010000 {
61 status = "okay"; 61 status = "okay";
62
63 wm8731: wm8731@1a {
64 compatible = "wm8731";
65 reg = <0x1a>;
66 };
62 }; 67 };
63 68
64 pinctrl@fffff400 { 69 pinctrl@fffff400 {
@@ -90,6 +95,10 @@
90 watchdog@fffffe40 { 95 watchdog@fffffe40 {
91 status = "okay"; 96 status = "okay";
92 }; 97 };
98
99 ssc0: ssc@f0010000 {
100 status = "okay";
101 };
93 }; 102 };
94 103
95 usb0: ohci@00600000 { 104 usb0: ohci@00600000 {
@@ -105,4 +114,19 @@
105 status = "okay"; 114 status = "okay";
106 }; 115 };
107 }; 116 };
117
118 sound {
119 compatible = "atmel,sam9x5-wm8731-audio";
120
121 atmel,model = "wm8731 @ AT91SAM9X5EK";
122
123 atmel,audio-routing =
124 "Headphone Jack", "RHPOUT",
125 "Headphone Jack", "LHPOUT",
126 "LLINEIN", "Line In Jack",
127 "RLINEIN", "Line In Jack";
128
129 atmel,ssc-controller = <&ssc0>;
130 atmel,audio-codec = <&wm8731>;
131 };
108}; 132};
diff --git a/arch/arm/boot/dts/atlas6.dtsi b/arch/arm/boot/dts/atlas6.dtsi
index a0f2721ea583..8678e0c11119 100644
--- a/arch/arm/boot/dts/atlas6.dtsi
+++ b/arch/arm/boot/dts/atlas6.dtsi
@@ -329,6 +329,12 @@
329 sirf,function = "uart0"; 329 sirf,function = "uart0";
330 }; 330 };
331 }; 331 };
332 uart0_noflow_pins_a: uart0@1 {
333 uart {
334 sirf,pins = "uart0_nostreamctrlgrp";
335 sirf,function = "uart0_nostreamctrl";
336 };
337 };
332 uart1_pins_a: uart1@0 { 338 uart1_pins_a: uart1@0 {
333 uart { 339 uart {
334 sirf,pins = "uart1grp"; 340 sirf,pins = "uart1grp";
diff --git a/arch/arm/boot/dts/bcm11351-brt.dts b/arch/arm/boot/dts/bcm11351-brt.dts
index 67ec524098b5..9d36eb4e3c41 100644
--- a/arch/arm/boot/dts/bcm11351-brt.dts
+++ b/arch/arm/boot/dts/bcm11351-brt.dts
@@ -17,7 +17,7 @@
17 17
18/ { 18/ {
19 model = "BCM11351 BRT board"; 19 model = "BCM11351 BRT board";
20 compatible = "bcm,bcm11351-brt", "bcm,bcm11351"; 20 compatible = "brcm,bcm11351-brt", "brcm,bcm11351";
21 21
22 memory { 22 memory {
23 reg = <0x80000000 0x40000000>; /* 1 GB */ 23 reg = <0x80000000 0x40000000>; /* 1 GB */
@@ -27,18 +27,18 @@
27 status = "okay"; 27 status = "okay";
28 }; 28 };
29 29
30 sdio0: sdio@0x3f180000 { 30 sdio1: sdio@3f180000 {
31 max-frequency = <48000000>; 31 max-frequency = <48000000>;
32 status = "okay"; 32 status = "okay";
33 }; 33 };
34 34
35 sdio1: sdio@0x3f190000 { 35 sdio2: sdio@3f190000 {
36 non-removable; 36 non-removable;
37 max-frequency = <48000000>; 37 max-frequency = <48000000>;
38 status = "okay"; 38 status = "okay";
39 }; 39 };
40 40
41 sdio3: sdio@0x3f1b0000 { 41 sdio4: sdio@3f1b0000 {
42 max-frequency = <48000000>; 42 max-frequency = <48000000>;
43 status = "okay"; 43 status = "okay";
44 }; 44 };
diff --git a/arch/arm/boot/dts/bcm11351.dtsi b/arch/arm/boot/dts/bcm11351.dtsi
index c0cdf66f8964..05a5aabe3b2c 100644
--- a/arch/arm/boot/dts/bcm11351.dtsi
+++ b/arch/arm/boot/dts/bcm11351.dtsi
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright (C) 2012 Broadcom Corporation 2 * Copyright (C) 2012-2013 Broadcom Corporation
3 * 3 *
4 * This program is free software; you can redistribute it and/or 4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as 5 * modify it under the terms of the GNU General Public License as
@@ -18,7 +18,7 @@
18 18
19/ { 19/ {
20 model = "BCM11351 SoC"; 20 model = "BCM11351 SoC";
21 compatible = "bcm,bcm11351"; 21 compatible = "brcm,bcm11351";
22 interrupt-parent = <&gic>; 22 interrupt-parent = <&gic>;
23 23
24 chosen { 24 chosen {
@@ -35,12 +35,12 @@
35 }; 35 };
36 36
37 smc@0x3404c000 { 37 smc@0x3404c000 {
38 compatible = "bcm,bcm11351-smc", "bcm,kona-smc"; 38 compatible = "brcm,bcm11351-smc", "brcm,kona-smc";
39 reg = <0x3404c000 0x400>; /* 1 KiB in SRAM */ 39 reg = <0x3404c000 0x400>; /* 1 KiB in SRAM */
40 }; 40 };
41 41
42 uart@3e000000 { 42 uart@3e000000 {
43 compatible = "bcm,bcm11351-dw-apb-uart", "snps,dw-apb-uart"; 43 compatible = "brcm,bcm11351-dw-apb-uart", "snps,dw-apb-uart";
44 status = "disabled"; 44 status = "disabled";
45 reg = <0x3e000000 0x1000>; 45 reg = <0x3e000000 0x1000>;
46 clock-frequency = <13000000>; 46 clock-frequency = <13000000>;
@@ -50,42 +50,47 @@
50 }; 50 };
51 51
52 L2: l2-cache { 52 L2: l2-cache {
53 compatible = "bcm,bcm11351-a2-pl310-cache"; 53 compatible = "brcm,bcm11351-a2-pl310-cache";
54 reg = <0x3ff20000 0x1000>; 54 reg = <0x3ff20000 0x1000>;
55 cache-unified; 55 cache-unified;
56 cache-level = <2>; 56 cache-level = <2>;
57 }; 57 };
58 58
59 watchdog@35002f40 {
60 compatible = "brcm,bcm11351-wdt", "brcm,kona-wdt";
61 reg = <0x35002f40 0x6c>;
62 };
63
59 timer@35006000 { 64 timer@35006000 {
60 compatible = "bcm,kona-timer"; 65 compatible = "brcm,kona-timer";
61 reg = <0x35006000 0x1000>; 66 reg = <0x35006000 0x1000>;
62 interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>; 67 interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
63 clock-frequency = <32768>; 68 clock-frequency = <32768>;
64 }; 69 };
65 70
66 sdio0: sdio@0x3f180000 { 71 sdio1: sdio@3f180000 {
67 compatible = "bcm,kona-sdhci"; 72 compatible = "brcm,kona-sdhci";
68 reg = <0x3f180000 0x10000>; 73 reg = <0x3f180000 0x10000>;
69 interrupts = <0x0 77 0x4>; 74 interrupts = <0x0 77 0x4>;
70 status = "disabled"; 75 status = "disabled";
71 }; 76 };
72 77
73 sdio1: sdio@0x3f190000 { 78 sdio2: sdio@3f190000 {
74 compatible = "bcm,kona-sdhci"; 79 compatible = "brcm,kona-sdhci";
75 reg = <0x3f190000 0x10000>; 80 reg = <0x3f190000 0x10000>;
76 interrupts = <0x0 76 0x4>; 81 interrupts = <0x0 76 0x4>;
77 status = "disabled"; 82 status = "disabled";
78 }; 83 };
79 84
80 sdio2: sdio@0x3f1a0000 { 85 sdio3: sdio@3f1a0000 {
81 compatible = "bcm,kona-sdhci"; 86 compatible = "brcm,kona-sdhci";
82 reg = <0x3f1a0000 0x10000>; 87 reg = <0x3f1a0000 0x10000>;
83 interrupts = <0x0 74 0x4>; 88 interrupts = <0x0 74 0x4>;
84 status = "disabled"; 89 status = "disabled";
85 }; 90 };
86 91
87 sdio3: sdio@0x3f1b0000 { 92 sdio4: sdio@3f1b0000 {
88 compatible = "bcm,kona-sdhci"; 93 compatible = "brcm,kona-sdhci";
89 reg = <0x3f1b0000 0x10000>; 94 reg = <0x3f1b0000 0x10000>;
90 interrupts = <0x0 73 0x4>; 95 interrupts = <0x0 73 0x4>;
91 status = "disabled"; 96 status = "disabled";
diff --git a/arch/arm/boot/dts/bcm28155-ap.dts b/arch/arm/boot/dts/bcm28155-ap.dts
new file mode 100644
index 000000000000..96ae67a2f0d3
--- /dev/null
+++ b/arch/arm/boot/dts/bcm28155-ap.dts
@@ -0,0 +1,45 @@
1/*
2 * Copyright (C) 2013 Broadcom Corporation
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation version 2.
7 *
8 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
9 * kind, whether express or implied; without even the implied warranty
10 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 */
13
14/dts-v1/;
15
16#include "bcm11351.dtsi"
17
18/ {
19 model = "BCM28155 AP board";
20 compatible = "brcm,bcm28155-ap", "brcm,bcm11351";
21
22 memory {
23 reg = <0x80000000 0x40000000>; /* 1 GB */
24 };
25
26 uart@3e000000 {
27 status = "okay";
28 };
29
30 sdio1: sdio@3f180000 {
31 max-frequency = <48000000>;
32 status = "okay";
33 };
34
35 sdio2: sdio@3f190000 {
36 non-removable;
37 max-frequency = <48000000>;
38 status = "okay";
39 };
40
41 sdio4: sdio@3f1b0000 {
42 max-frequency = <48000000>;
43 status = "okay";
44 };
45};
diff --git a/arch/arm/boot/dts/ccu8540.dts b/arch/arm/boot/dts/ccu8540.dts
deleted file mode 100644
index 48ff03441f5a..000000000000
--- a/arch/arm/boot/dts/ccu8540.dts
+++ /dev/null
@@ -1,41 +0,0 @@
1/*
2 * Copyright 2013 ST-Ericsson AB
3 *
4 * The code contained herein is licensed under the GNU General Public
5 * License. You may obtain a copy of the GNU General Public License
6 * Version 2 or later at the following locations:
7 *
8 * http://www.opensource.org/licenses/gpl-license.html
9 * http://www.gnu.org/copyleft/gpl.html
10 */
11
12/dts-v1/;
13#include "dbx5x0.dtsi"
14
15/ {
16 model = "ST-Ericsson U8540 platform with Device Tree";
17 compatible = "st-ericsson,ccu8540", "st-ericsson,u8540";
18
19 memory@0 {
20 reg = <0x20000000 0x1f000000>, <0xc0000000 0x3f000000>;
21 };
22
23 soc {
24 prcmu@80157000 {
25 reg = <0x80157000 0x2000>, <0x801b0000 0x8000>, <0x801b8000 0x3000>;
26 reg-names = "prcmu", "prcmu-tcpm", "prcmu-tcdm";
27 };
28
29 uart@80120000 {
30 status = "okay";
31 };
32
33 uart@80121000 {
34 status = "okay";
35 };
36
37 uart@80007000 {
38 status = "okay";
39 };
40 };
41};
diff --git a/arch/arm/boot/dts/da850-evm.dts b/arch/arm/boot/dts/da850-evm.dts
index 5bce7cc55cf3..588ce58a2959 100644
--- a/arch/arm/boot/dts/da850-evm.dts
+++ b/arch/arm/boot/dts/da850-evm.dts
@@ -90,6 +90,17 @@
90 }; 90 };
91 }; 91 };
92 }; 92 };
93 mdio: mdio@1e24000 {
94 status = "okay";
95 pinctrl-names = "default";
96 pinctrl-0 = <&mdio_pins>;
97 bus_freq = <2200000>;
98 };
99 eth0: ethernet@1e20000 {
100 status = "okay";
101 pinctrl-names = "default";
102 pinctrl-0 = <&mii_pins>;
103 };
93 }; 104 };
94 nand_cs3@62000000 { 105 nand_cs3@62000000 {
95 status = "okay"; 106 status = "okay";
diff --git a/arch/arm/boot/dts/da850.dtsi b/arch/arm/boot/dts/da850.dtsi
index d70ba5504481..8d17346f9702 100644
--- a/arch/arm/boot/dts/da850.dtsi
+++ b/arch/arm/boot/dts/da850.dtsi
@@ -125,11 +125,33 @@
125 0x14 0x00000010 0x000000f0 125 0x14 0x00000010 0x000000f0
126 >; 126 >;
127 }; 127 };
128 mdio_pins: pinmux_mdio_pins {
129 pinctrl-single,bits = <
130 /* MDIO_CLK, MDIO_D */
131 0x10 0x00000088 0x000000ff
132 >;
133 };
134 mii_pins: pinmux_mii_pins {
135 pinctrl-single,bits = <
136 /*
137 * MII_TXEN, MII_TXCLK, MII_COL
138 * MII_TXD_3, MII_TXD_2, MII_TXD_1
139 * MII_TXD_0
140 */
141 0x8 0x88888880 0xfffffff0
142 /*
143 * MII_RXER, MII_CRS, MII_RXCLK
144 * MII_RXDV, MII_RXD_3, MII_RXD_2
145 * MII_RXD_1, MII_RXD_0
146 */
147 0xc 0x88888888 0xffffffff
148 >;
149 };
150
128 }; 151 };
129 serial0: serial@1c42000 { 152 serial0: serial@1c42000 {
130 compatible = "ns16550a"; 153 compatible = "ns16550a";
131 reg = <0x42000 0x100>; 154 reg = <0x42000 0x100>;
132 clock-frequency = <150000000>;
133 reg-shift = <2>; 155 reg-shift = <2>;
134 interrupts = <25>; 156 interrupts = <25>;
135 status = "disabled"; 157 status = "disabled";
@@ -137,7 +159,6 @@
137 serial1: serial@1d0c000 { 159 serial1: serial@1d0c000 {
138 compatible = "ns16550a"; 160 compatible = "ns16550a";
139 reg = <0x10c000 0x100>; 161 reg = <0x10c000 0x100>;
140 clock-frequency = <150000000>;
141 reg-shift = <2>; 162 reg-shift = <2>;
142 interrupts = <53>; 163 interrupts = <53>;
143 status = "disabled"; 164 status = "disabled";
@@ -145,7 +166,6 @@
145 serial2: serial@1d0d000 { 166 serial2: serial@1d0d000 {
146 compatible = "ns16550a"; 167 compatible = "ns16550a";
147 reg = <0x10d000 0x100>; 168 reg = <0x10d000 0x100>;
148 clock-frequency = <150000000>;
149 reg-shift = <2>; 169 reg-shift = <2>;
150 interrupts = <61>; 170 interrupts = <61>;
151 status = "disabled"; 171 status = "disabled";
@@ -216,6 +236,26 @@
216 interrupts = <56>; 236 interrupts = <56>;
217 status = "disabled"; 237 status = "disabled";
218 }; 238 };
239 mdio: mdio@1e24000 {
240 compatible = "ti,davinci_mdio";
241 #address-cells = <1>;
242 #size-cells = <0>;
243 reg = <0x224000 0x1000>;
244 };
245 eth0: ethernet@1e20000 {
246 compatible = "ti,davinci-dm6467-emac";
247 reg = <0x220000 0x4000>;
248 ti,davinci-ctrl-reg-offset = <0x3000>;
249 ti,davinci-ctrl-mod-reg-offset = <0x2000>;
250 ti,davinci-ctrl-ram-offset = <0>;
251 ti,davinci-ctrl-ram-size = <0x2000>;
252 local-mac-address = [ 00 00 00 00 00 00 ];
253 interrupts = <33
254 34
255 35
256 36
257 >;
258 };
219 }; 259 };
220 nand_cs3@62000000 { 260 nand_cs3@62000000 {
221 compatible = "ti,davinci-nand"; 261 compatible = "ti,davinci-nand";
diff --git a/arch/arm/boot/dts/dove-cubox.dts b/arch/arm/boot/dts/dove-cubox.dts
index 5cae2ab69762..022646ef4b38 100644
--- a/arch/arm/boot/dts/dove-cubox.dts
+++ b/arch/arm/boot/dts/dove-cubox.dts
@@ -42,6 +42,8 @@
42 regulator-always-on; 42 regulator-always-on;
43 regulator-boot-on; 43 regulator-boot-on;
44 gpio = <&gpio0 1 0>; 44 gpio = <&gpio0 1 0>;
45 pinctrl-0 = <&pmx_gpio_1>;
46 pinctrl-names = "default";
45 }; 47 };
46 }; 48 };
47 49
@@ -53,10 +55,24 @@
53 clock-frequency = <25000000>; 55 clock-frequency = <25000000>;
54 }; 56 };
55 }; 57 };
58
59 ir_recv: ir-receiver {
60 compatible = "gpio-ir-receiver";
61 gpios = <&gpio0 19 1>;
62 pinctrl-0 = <&pmx_gpio_19>;
63 pinctrl-names = "default";
64 };
56}; 65};
57 66
58&uart0 { status = "okay"; }; 67&uart0 { status = "okay"; };
59&sata0 { status = "okay"; }; 68&sata0 { status = "okay"; };
69&mdio { status = "okay"; };
70&eth { status = "okay"; };
71
72&ethphy {
73 compatible = "marvell,88e1310";
74 reg = <1>;
75};
60 76
61&i2c0 { 77&i2c0 {
62 status = "okay"; 78 status = "okay";
@@ -103,6 +119,7 @@
103 status = "okay"; 119 status = "okay";
104 /* sdio0 card detect is connected to wrong pin on CuBox */ 120 /* sdio0 card detect is connected to wrong pin on CuBox */
105 cd-gpios = <&gpio0 12 1>; 121 cd-gpios = <&gpio0 12 1>;
122 pinctrl-0 = <&pmx_sdio0 &pmx_gpio_12>;
106}; 123};
107 124
108&spi0 { 125&spi0 {
@@ -115,23 +132,3 @@
115 reg = <0>; 132 reg = <0>;
116 }; 133 };
117}; 134};
118
119&pinctrl {
120 pinctrl-0 = <&pmx_gpio_1 &pmx_gpio_12>;
121 pinctrl-names = "default";
122
123 pmx_gpio_1: pmx-gpio-1 {
124 marvell,pins = "mpp1";
125 marvell,function = "gpio";
126 };
127
128 pmx_gpio_12: pmx-gpio-12 {
129 marvell,pins = "mpp12";
130 marvell,function = "gpio";
131 };
132
133 pmx_gpio_18: pmx-gpio-18 {
134 marvell,pins = "mpp18";
135 marvell,function = "gpio";
136 };
137};
diff --git a/arch/arm/boot/dts/dove-d2plug.dts b/arch/arm/boot/dts/dove-d2plug.dts
new file mode 100644
index 000000000000..e2222ce94f2f
--- /dev/null
+++ b/arch/arm/boot/dts/dove-d2plug.dts
@@ -0,0 +1,69 @@
1/dts-v1/;
2
3/include/ "dove.dtsi"
4
5/ {
6 model = "Globalscale D2Plug";
7 compatible = "globalscale,d2plug", "marvell,dove";
8
9 memory {
10 device_type = "memory";
11 reg = <0x00000000 0x40000000>;
12 };
13
14 chosen {
15 bootargs = "console=ttyS0,115200n8 earlyprintk";
16 };
17
18 leds {
19 compatible = "gpio-leds";
20 pinctrl-0 = <&pmx_gpio_0 &pmx_gpio_1 &pmx_gpio_2>;
21 pinctrl-names = "default";
22
23 wlan-ap {
24 label = "wlan-ap";
25 gpios = <&gpio0 0 1>;
26 };
27
28 wlan-act {
29 label = "wlan-act";
30 gpios = <&gpio0 1 1>;
31 };
32
33 bluetooth-act {
34 label = "bt-act";
35 gpios = <&gpio0 2 1>;
36 };
37 };
38};
39
40&uart0 { status = "okay"; };
41&sata0 { status = "okay"; };
42&i2c0 { status = "okay"; };
43&mdio { status = "okay"; };
44&eth { status = "okay"; };
45
46/* Samsung M8G2F eMMC */
47&sdio0 {
48 status = "okay";
49 non-removable;
50 bus-width = <4>;
51};
52
53/* Marvell SD8787 WLAN/BT */
54&sdio1 {
55 status = "okay";
56 non-removable;
57 bus-width = <4>;
58};
59
60&spi0 {
61 status = "okay";
62
63 /* spi0.0: 4M Flash Macronix MX25L3205D */
64 spi-flash@0 {
65 compatible = "st,m25l3205d";
66 spi-max-frequency = <20000000>;
67 reg = <0>;
68 };
69};
diff --git a/arch/arm/boot/dts/dove.dtsi b/arch/arm/boot/dts/dove.dtsi
index 6cab46849cdb..cc279166646f 100644
--- a/arch/arm/boot/dts/dove.dtsi
+++ b/arch/arm/boot/dts/dove.dtsi
@@ -10,6 +10,23 @@
10 gpio2 = &gpio2; 10 gpio2 = &gpio2;
11 }; 11 };
12 12
13 cpus {
14 #address-cells = <1>;
15 #size-cells = <0>;
16
17 cpu0: cpu@0 {
18 compatible = "marvell,pj4a", "marvell,sheeva-v7";
19 device_type = "cpu";
20 next-level-cache = <&l2>;
21 reg = <0>;
22 };
23 };
24
25 l2: l2-cache {
26 compatible = "marvell,tauros2-cache";
27 marvell,tauros2-cache-features = <0>;
28 };
29
13 soc@f1000000 { 30 soc@f1000000 {
14 compatible = "simple-bus"; 31 compatible = "simple-bus";
15 #address-cells = <1>; 32 #address-cells = <1>;
@@ -25,16 +42,28 @@
25 0xf2100000 0xf2100000 0x0100000 /* PCIe0 I/O 1M */ 42 0xf2100000 0xf2100000 0x0100000 /* PCIe0 I/O 1M */
26 0xf8000000 0xf8000000 0x8000000>; /* BootROM 128M */ 43 0xf8000000 0xf8000000 0x8000000>; /* BootROM 128M */
27 44
28 l2: l2-cache { 45 timer: timer@20300 {
29 compatible = "marvell,tauros2-cache"; 46 compatible = "marvell,orion-timer";
30 marvell,tauros2-cache-features = <0>; 47 reg = <0x20300 0x20>;
48 interrupt-parent = <&bridge_intc>;
49 interrupts = <1>, <2>;
50 clocks = <&core_clk 0>;
31 }; 51 };
32 52
33 intc: interrupt-controller { 53 intc: main-interrupt-ctrl@20200 {
34 compatible = "marvell,orion-intc"; 54 compatible = "marvell,orion-intc";
35 interrupt-controller; 55 interrupt-controller;
36 #interrupt-cells = <1>; 56 #interrupt-cells = <1>;
37 reg = <0x20204 0x04>, <0x20214 0x04>; 57 reg = <0x20200 0x10>, <0x20210 0x10>;
58 };
59
60 bridge_intc: bridge-interrupt-ctrl@20110 {
61 compatible = "marvell,orion-bridge-intc";
62 interrupt-controller;
63 #interrupt-cells = <1>;
64 reg = <0x20110 0x8>;
65 interrupts = <0>;
66 marvell,#interrupts = <5>;
38 }; 67 };
39 68
40 core_clk: core-clocks@d0214 { 69 core_clk: core-clocks@d0214 {
@@ -43,14 +72,14 @@
43 #clock-cells = <1>; 72 #clock-cells = <1>;
44 }; 73 };
45 74
46 gate_clk: clock-gating-control@d0038 { 75 gate_clk: clock-gating-ctrl@d0038 {
47 compatible = "marvell,dove-gating-clock"; 76 compatible = "marvell,dove-gating-clock";
48 reg = <0xd0038 0x4>; 77 reg = <0xd0038 0x4>;
49 clocks = <&core_clk 0>; 78 clocks = <&core_clk 0>;
50 #clock-cells = <1>; 79 #clock-cells = <1>;
51 }; 80 };
52 81
53 thermal: thermal@d001c { 82 thermal: thermal-diode@d001c {
54 compatible = "marvell,dove-thermal"; 83 compatible = "marvell,dove-thermal";
55 reg = <0xd001c 0x0c>, <0xd005c 0x08>; 84 reg = <0xd001c 0x0c>, <0xd005c 0x08>;
56 }; 85 };
@@ -70,6 +99,8 @@
70 reg-shift = <2>; 99 reg-shift = <2>;
71 interrupts = <8>; 100 interrupts = <8>;
72 clocks = <&core_clk 0>; 101 clocks = <&core_clk 0>;
102 pinctrl-0 = <&pmx_uart1>;
103 pinctrl-names = "default";
73 status = "disabled"; 104 status = "disabled";
74 }; 105 };
75 106
@@ -91,7 +122,7 @@
91 status = "disabled"; 122 status = "disabled";
92 }; 123 };
93 124
94 gpio0: gpio@d0400 { 125 gpio0: gpio-ctrl@d0400 {
95 compatible = "marvell,orion-gpio"; 126 compatible = "marvell,orion-gpio";
96 #gpio-cells = <2>; 127 #gpio-cells = <2>;
97 gpio-controller; 128 gpio-controller;
@@ -102,7 +133,7 @@
102 interrupts = <12>, <13>, <14>, <60>; 133 interrupts = <12>, <13>, <14>, <60>;
103 }; 134 };
104 135
105 gpio1: gpio@d0420 { 136 gpio1: gpio-ctrl@d0420 {
106 compatible = "marvell,orion-gpio"; 137 compatible = "marvell,orion-gpio";
107 #gpio-cells = <2>; 138 #gpio-cells = <2>;
108 gpio-controller; 139 gpio-controller;
@@ -113,7 +144,7 @@
113 interrupts = <61>; 144 interrupts = <61>;
114 }; 145 };
115 146
116 gpio2: gpio@e8400 { 147 gpio2: gpio-ctrl@e8400 {
117 compatible = "marvell,orion-gpio"; 148 compatible = "marvell,orion-gpio";
118 #gpio-cells = <2>; 149 #gpio-cells = <2>;
119 gpio-controller; 150 gpio-controller;
@@ -121,13 +152,188 @@
121 ngpios = <8>; 152 ngpios = <8>;
122 }; 153 };
123 154
124 pinctrl: pinctrl@d0200 { 155 pinctrl: pin-ctrl@d0200 {
125 compatible = "marvell,dove-pinctrl"; 156 compatible = "marvell,dove-pinctrl";
126 reg = <0xd0200 0x10>; 157 reg = <0xd0200 0x10>;
127 clocks = <&gate_clk 22>; 158 clocks = <&gate_clk 22>;
159
160 pmx_gpio_0: pmx-gpio-0 {
161 marvell,pins = "mpp0";
162 marvell,function = "gpio";
163 };
164
165 pmx_gpio_1: pmx-gpio-1 {
166 marvell,pins = "mpp1";
167 marvell,function = "gpio";
168 };
169
170 pmx_gpio_2: pmx-gpio-2 {
171 marvell,pins = "mpp2";
172 marvell,function = "gpio";
173 };
174
175 pmx_gpio_3: pmx-gpio-3 {
176 marvell,pins = "mpp3";
177 marvell,function = "gpio";
178 };
179
180 pmx_gpio_4: pmx-gpio-4 {
181 marvell,pins = "mpp4";
182 marvell,function = "gpio";
183 };
184
185 pmx_gpio_5: pmx-gpio-5 {
186 marvell,pins = "mpp5";
187 marvell,function = "gpio";
188 };
189
190 pmx_gpio_6: pmx-gpio-6 {
191 marvell,pins = "mpp6";
192 marvell,function = "gpio";
193 };
194
195 pmx_gpio_7: pmx-gpio-7 {
196 marvell,pins = "mpp7";
197 marvell,function = "gpio";
198 };
199
200 pmx_gpio_8: pmx-gpio-8 {
201 marvell,pins = "mpp8";
202 marvell,function = "gpio";
203 };
204
205 pmx_gpio_9: pmx-gpio-9 {
206 marvell,pins = "mpp9";
207 marvell,function = "gpio";
208 };
209
210 pmx_gpio_10: pmx-gpio-10 {
211 marvell,pins = "mpp10";
212 marvell,function = "gpio";
213 };
214
215 pmx_gpio_11: pmx-gpio-11 {
216 marvell,pins = "mpp11";
217 marvell,function = "gpio";
218 };
219
220 pmx_gpio_12: pmx-gpio-12 {
221 marvell,pins = "mpp12";
222 marvell,function = "gpio";
223 };
224
225 pmx_gpio_13: pmx-gpio-13 {
226 marvell,pins = "mpp13";
227 marvell,function = "gpio";
228 };
229
230 pmx_gpio_14: pmx-gpio-14 {
231 marvell,pins = "mpp14";
232 marvell,function = "gpio";
233 };
234
235 pmx_gpio_15: pmx-gpio-15 {
236 marvell,pins = "mpp15";
237 marvell,function = "gpio";
238 };
239
240 pmx_gpio_16: pmx-gpio-16 {
241 marvell,pins = "mpp16";
242 marvell,function = "gpio";
243 };
244
245 pmx_gpio_17: pmx-gpio-17 {
246 marvell,pins = "mpp17";
247 marvell,function = "gpio";
248 };
249
250 pmx_gpio_18: pmx-gpio-18 {
251 marvell,pins = "mpp18";
252 marvell,function = "gpio";
253 };
254
255 pmx_gpio_19: pmx-gpio-19 {
256 marvell,pins = "mpp19";
257 marvell,function = "gpio";
258 };
259
260 pmx_gpio_20: pmx-gpio-20 {
261 marvell,pins = "mpp20";
262 marvell,function = "gpio";
263 };
264
265 pmx_gpio_21: pmx-gpio-21 {
266 marvell,pins = "mpp21";
267 marvell,function = "gpio";
268 };
269
270 pmx_camera: pmx-camera {
271 marvell,pins = "mpp_camera";
272 marvell,function = "camera";
273 };
274
275 pmx_camera_gpio: pmx-camera-gpio {
276 marvell,pins = "mpp_camera";
277 marvell,function = "gpio";
278 };
279
280 pmx_sdio0: pmx-sdio0 {
281 marvell,pins = "mpp_sdio0";
282 marvell,function = "sdio0";
283 };
284
285 pmx_sdio0_gpio: pmx-sdio0-gpio {
286 marvell,pins = "mpp_sdio0";
287 marvell,function = "gpio";
288 };
289
290 pmx_sdio1: pmx-sdio1 {
291 marvell,pins = "mpp_sdio1";
292 marvell,function = "sdio1";
293 };
294
295 pmx_sdio1_gpio: pmx-sdio1-gpio {
296 marvell,pins = "mpp_sdio1";
297 marvell,function = "gpio";
298 };
299
300 pmx_audio1_gpio: pmx-audio1-gpio {
301 marvell,pins = "mpp_audio1";
302 marvell,function = "gpio";
303 };
304
305 pmx_spi0: pmx-spi0 {
306 marvell,pins = "mpp_spi0";
307 marvell,function = "spi0";
308 };
309
310 pmx_spi0_gpio: pmx-spi0-gpio {
311 marvell,pins = "mpp_spi0";
312 marvell,function = "gpio";
313 };
314
315 pmx_uart1: pmx-uart1 {
316 marvell,pins = "mpp_uart1";
317 marvell,function = "uart1";
318 };
319
320 pmx_uart1_gpio: pmx-uart1-gpio {
321 marvell,pins = "mpp_uart1";
322 marvell,function = "gpio";
323 };
324
325 pmx_nand: pmx-nand {
326 marvell,pins = "mpp_nand";
327 marvell,function = "nand";
328 };
329
330 pmx_nand_gpo: pmx-nand-gpo {
331 marvell,pins = "mpp_nand";
332 marvell,function = "gpo";
333 };
128 }; 334 };
129 335
130 spi0: spi@10600 { 336 spi0: spi-ctrl@10600 {
131 compatible = "marvell,orion-spi"; 337 compatible = "marvell,orion-spi";
132 #address-cells = <1>; 338 #address-cells = <1>;
133 #size-cells = <0>; 339 #size-cells = <0>;
@@ -135,10 +341,12 @@
135 interrupts = <6>; 341 interrupts = <6>;
136 reg = <0x10600 0x28>; 342 reg = <0x10600 0x28>;
137 clocks = <&core_clk 0>; 343 clocks = <&core_clk 0>;
344 pinctrl-0 = <&pmx_spi0>;
345 pinctrl-names = "default";
138 status = "disabled"; 346 status = "disabled";
139 }; 347 };
140 348
141 spi1: spi@14600 { 349 spi1: spi-ctrl@14600 {
142 compatible = "marvell,orion-spi"; 350 compatible = "marvell,orion-spi";
143 #address-cells = <1>; 351 #address-cells = <1>;
144 #size-cells = <0>; 352 #size-cells = <0>;
@@ -149,7 +357,7 @@
149 status = "disabled"; 357 status = "disabled";
150 }; 358 };
151 359
152 i2c0: i2c@11000 { 360 i2c0: i2c-ctrl@11000 {
153 compatible = "marvell,mv64xxx-i2c"; 361 compatible = "marvell,mv64xxx-i2c";
154 reg = <0x11000 0x20>; 362 reg = <0x11000 0x20>;
155 #address-cells = <1>; 363 #address-cells = <1>;
@@ -177,23 +385,27 @@
177 status = "okay"; 385 status = "okay";
178 }; 386 };
179 387
180 sdio0: sdio@92000 { 388 sdio0: sdio-host@92000 {
181 compatible = "marvell,dove-sdhci"; 389 compatible = "marvell,dove-sdhci";
182 reg = <0x92000 0x100>; 390 reg = <0x92000 0x100>;
183 interrupts = <35>, <37>; 391 interrupts = <35>, <37>;
184 clocks = <&gate_clk 8>; 392 clocks = <&gate_clk 8>;
393 pinctrl-0 = <&pmx_sdio0>;
394 pinctrl-names = "default";
185 status = "disabled"; 395 status = "disabled";
186 }; 396 };
187 397
188 sdio1: sdio@90000 { 398 sdio1: sdio-host@90000 {
189 compatible = "marvell,dove-sdhci"; 399 compatible = "marvell,dove-sdhci";
190 reg = <0x90000 0x100>; 400 reg = <0x90000 0x100>;
191 interrupts = <36>, <38>; 401 interrupts = <36>, <38>;
192 clocks = <&gate_clk 9>; 402 clocks = <&gate_clk 9>;
403 pinctrl-0 = <&pmx_sdio1>;
404 pinctrl-names = "default";
193 status = "disabled"; 405 status = "disabled";
194 }; 406 };
195 407
196 sata0: sata@a0000 { 408 sata0: sata-host@a0000 {
197 compatible = "marvell,orion-sata"; 409 compatible = "marvell,orion-sata";
198 reg = <0xa0000 0x2400>; 410 reg = <0xa0000 0x2400>;
199 interrupts = <62>; 411 interrupts = <62>;
@@ -202,12 +414,12 @@
202 status = "disabled"; 414 status = "disabled";
203 }; 415 };
204 416
205 rtc@d8500 { 417 rtc: real-time-clock@d8500 {
206 compatible = "marvell,orion-rtc"; 418 compatible = "marvell,orion-rtc";
207 reg = <0xd8500 0x20>; 419 reg = <0xd8500 0x20>;
208 }; 420 };
209 421
210 crypto: crypto@30000 { 422 crypto: crypto-engine@30000 {
211 compatible = "marvell,orion-crypto"; 423 compatible = "marvell,orion-crypto";
212 reg = <0x30000 0x10000>, 424 reg = <0x30000 0x10000>,
213 <0xc8000000 0x800>; 425 <0xc8000000 0x800>;
@@ -258,5 +470,40 @@
258 dmacap,xor; 470 dmacap,xor;
259 }; 471 };
260 }; 472 };
473
474 mdio: mdio-bus@72004 {
475 compatible = "marvell,orion-mdio";
476 #address-cells = <1>;
477 #size-cells = <0>;
478 reg = <0x72004 0x84>;
479 interrupts = <30>;
480 clocks = <&gate_clk 2>;
481 status = "disabled";
482
483 ethphy: ethernet-phy {
484 device-type = "ethernet-phy";
485 /* set phy address in board file */
486 };
487 };
488
489 eth: ethernet-controller@72000 {
490 compatible = "marvell,orion-eth";
491 #address-cells = <1>;
492 #size-cells = <0>;
493 reg = <0x72000 0x4000>;
494 clocks = <&gate_clk 2>;
495 marvell,tx-checksum-limit = <1600>;
496 status = "disabled";
497
498 ethernet-port@0 {
499 device_type = "network";
500 compatible = "marvell,orion-eth-port";
501 reg = <0>;
502 interrupts = <29>;
503 /* overwrite MAC address in bootloader */
504 local-mac-address = [00 00 00 00 00 00];
505 phy-handle = <&ethphy>;
506 };
507 };
261 }; 508 };
262}; 509};
diff --git a/arch/arm/boot/dts/emev2-kzm9d-reference.dts b/arch/arm/boot/dts/emev2-kzm9d-reference.dts
new file mode 100644
index 000000000000..cceefda268b6
--- /dev/null
+++ b/arch/arm/boot/dts/emev2-kzm9d-reference.dts
@@ -0,0 +1,57 @@
1/*
2 * Device Tree Source for the KZM9D board
3 *
4 * Copyright (C) 2013 Renesas Solutions Corp.
5 *
6 * This file is licensed under the terms of the GNU General Public License
7 * version 2. This program is licensed "as is" without any warranty of any
8 * kind, whether express or implied.
9 */
10/dts-v1/;
11
12/include/ "emev2.dtsi"
13
14/ {
15 model = "EMEV2 KZM9D Board";
16 compatible = "renesas,kzm9d-reference", "renesas,emev2";
17
18 memory {
19 device_type = "memory";
20 reg = <0x40000000 0x8000000>;
21 };
22
23 chosen {
24 bootargs = "console=ttyS1,115200n81 ignore_loglevel root=/dev/nfs ip=dhcp";
25 };
26
27 reg_1p8v: regulator@0 {
28 compatible = "regulator-fixed";
29 regulator-name = "fixed-1.8V";
30 regulator-min-microvolt = <1800000>;
31 regulator-max-microvolt = <1800000>;
32 regulator-always-on;
33 regulator-boot-on;
34 };
35
36 reg_3p3v: regulator@1 {
37 compatible = "regulator-fixed";
38 regulator-name = "fixed-3.3V";
39 regulator-min-microvolt = <3300000>;
40 regulator-max-microvolt = <3300000>;
41 regulator-always-on;
42 regulator-boot-on;
43 };
44
45 lan9220@20000000 {
46 compatible = "smsc,lan9220", "smsc,lan9115";
47 reg = <0x20000000 0x10000>;
48 phy-mode = "mii";
49 interrupt-parent = <&gpio0>;
50 interrupts = <1 1>; /* active high */
51 reg-io-width = <4>;
52 smsc,irq-active-high;
53 smsc,irq-push-pull;
54 vddvario-supply = <&reg_1p8v>;
55 vdd33a-supply = <&reg_3p3v>;
56 };
57};
diff --git a/arch/arm/boot/dts/emev2-kzm9d.dts b/arch/arm/boot/dts/emev2-kzm9d.dts
index b9b3241f173b..f92e812fdd9f 100644
--- a/arch/arm/boot/dts/emev2-kzm9d.dts
+++ b/arch/arm/boot/dts/emev2-kzm9d.dts
@@ -21,6 +21,6 @@
21 }; 21 };
22 22
23 chosen { 23 chosen {
24 bootargs = "console=tty0 console=ttyS1,115200n81 earlyprintk=serial8250-em.1,115200n81 mem=128M@0x40000000 ignore_loglevel root=/dev/nfs ip=dhcp nfsroot=,rsize=4096,wsize=4096"; 24 bootargs = "console=ttyS1,115200n81 ignore_loglevel root=/dev/nfs ip=dhcp";
25 }; 25 };
26}; 26};
diff --git a/arch/arm/boot/dts/emev2.dtsi b/arch/arm/boot/dts/emev2.dtsi
index c8a8c08b48dd..9063a4434d6a 100644
--- a/arch/arm/boot/dts/emev2.dtsi
+++ b/arch/arm/boot/dts/emev2.dtsi
@@ -14,6 +14,14 @@
14 compatible = "renesas,emev2"; 14 compatible = "renesas,emev2";
15 interrupt-parent = <&gic>; 15 interrupt-parent = <&gic>;
16 16
17 aliases {
18 gpio0 = &gpio0;
19 gpio1 = &gpio1;
20 gpio2 = &gpio2;
21 gpio3 = &gpio3;
22 gpio4 = &gpio4;
23 };
24
17 cpus { 25 cpus {
18 #address-cells = <1>; 26 #address-cells = <1>;
19 #size-cells = <0>; 27 #size-cells = <0>;
@@ -38,6 +46,12 @@
38 <0xe0020000 0x0100>; 46 <0xe0020000 0x0100>;
39 }; 47 };
40 48
49 pmu {
50 compatible = "arm,cortex-a9-pmu";
51 interrupts = <0 120 4>,
52 <0 121 4>;
53 };
54
41 sti@e0180000 { 55 sti@e0180000 {
42 compatible = "renesas,em-sti"; 56 compatible = "renesas,em-sti";
43 reg = <0xe0180000 0x54>; 57 reg = <0xe0180000 0x54>;
@@ -67,4 +81,55 @@
67 reg = <0xe1050000 0x38>; 81 reg = <0xe1050000 0x38>;
68 interrupts = <0 11 0>; 82 interrupts = <0 11 0>;
69 }; 83 };
84
85 gpio0: gpio@e0050000 {
86 compatible = "renesas,em-gio";
87 reg = <0xe0050000 0x2c>, <0xe0050040 0x20>;
88 interrupts = <0 67 0>, <0 68 0>;
89 gpio-controller;
90 #gpio-cells = <2>;
91 ngpios = <32>;
92 interrupt-controller;
93 #interrupt-cells = <2>;
94 };
95 gpio1: gpio@e0050080 {
96 compatible = "renesas,em-gio";
97 reg = <0xe0050080 0x2c>, <0xe00500c0 0x20>;
98 interrupts = <0 69 0>, <0 70 0>;
99 gpio-controller;
100 #gpio-cells = <2>;
101 ngpios = <32>;
102 interrupt-controller;
103 #interrupt-cells = <2>;
104 };
105 gpio2: gpio@e0050100 {
106 compatible = "renesas,em-gio";
107 reg = <0xe0050100 0x2c>, <0xe0050140 0x20>;
108 interrupts = <0 71 0>, <0 72 0>;
109 gpio-controller;
110 #gpio-cells = <2>;
111 ngpios = <32>;
112 interrupt-controller;
113 #interrupt-cells = <2>;
114 };
115 gpio3: gpio@e0050180 {
116 compatible = "renesas,em-gio";
117 reg = <0xe0050180 0x2c>, <0xe00501c0 0x20>;
118 interrupts = <0 73 0>, <0 74 0>;
119 gpio-controller;
120 #gpio-cells = <2>;
121 ngpios = <32>;
122 interrupt-controller;
123 #interrupt-cells = <2>;
124 };
125 gpio4: gpio@e0050200 {
126 compatible = "renesas,em-gio";
127 reg = <0xe0050200 0x2c>, <0xe0050240 0x20>;
128 interrupts = <0 75 0>, <0 76 0>;
129 gpio-controller;
130 #gpio-cells = <2>;
131 ngpios = <31>;
132 interrupt-controller;
133 #interrupt-cells = <2>;
134 };
70}; 135};
diff --git a/arch/arm/boot/dts/exynos4.dtsi b/arch/arm/boot/dts/exynos4.dtsi
index 3f94fe8e3706..caadc0257342 100644
--- a/arch/arm/boot/dts/exynos4.dtsi
+++ b/arch/arm/boot/dts/exynos4.dtsi
@@ -36,6 +36,12 @@
36 i2c5 = &i2c_5; 36 i2c5 = &i2c_5;
37 i2c6 = &i2c_6; 37 i2c6 = &i2c_6;
38 i2c7 = &i2c_7; 38 i2c7 = &i2c_7;
39 csis0 = &csis_0;
40 csis1 = &csis_1;
41 fimc0 = &fimc_0;
42 fimc1 = &fimc_1;
43 fimc2 = &fimc_2;
44 fimc3 = &fimc_3;
39 }; 45 };
40 46
41 chipid@10000000 { 47 chipid@10000000 {
@@ -92,6 +98,88 @@
92 reg = <0x10010000 0x400>; 98 reg = <0x10010000 0x400>;
93 }; 99 };
94 100
101 camera {
102 compatible = "samsung,fimc", "simple-bus";
103 status = "disabled";
104 #address-cells = <1>;
105 #size-cells = <1>;
106 ranges;
107
108 clock_cam: clock-controller {
109 #clock-cells = <1>;
110 };
111
112 fimc_0: fimc@11800000 {
113 compatible = "samsung,exynos4210-fimc";
114 reg = <0x11800000 0x1000>;
115 interrupts = <0 84 0>;
116 clocks = <&clock 256>, <&clock 128>;
117 clock-names = "fimc", "sclk_fimc";
118 samsung,power-domain = <&pd_cam>;
119 samsung,sysreg = <&sys_reg>;
120 status = "disabled";
121 };
122
123 fimc_1: fimc@11810000 {
124 compatible = "samsung,exynos4210-fimc";
125 reg = <0x11810000 0x1000>;
126 interrupts = <0 85 0>;
127 clocks = <&clock 257>, <&clock 129>;
128 clock-names = "fimc", "sclk_fimc";
129 samsung,power-domain = <&pd_cam>;
130 samsung,sysreg = <&sys_reg>;
131 status = "disabled";
132 };
133
134 fimc_2: fimc@11820000 {
135 compatible = "samsung,exynos4210-fimc";
136 reg = <0x11820000 0x1000>;
137 interrupts = <0 86 0>;
138 clocks = <&clock 258>, <&clock 130>;
139 clock-names = "fimc", "sclk_fimc";
140 samsung,power-domain = <&pd_cam>;
141 samsung,sysreg = <&sys_reg>;
142 status = "disabled";
143 };
144
145 fimc_3: fimc@11830000 {
146 compatible = "samsung,exynos4210-fimc";
147 reg = <0x11830000 0x1000>;
148 interrupts = <0 87 0>;
149 clocks = <&clock 259>, <&clock 131>;
150 clock-names = "fimc", "sclk_fimc";
151 samsung,power-domain = <&pd_cam>;
152 samsung,sysreg = <&sys_reg>;
153 status = "disabled";
154 };
155
156 csis_0: csis@11880000 {
157 compatible = "samsung,exynos4210-csis";
158 reg = <0x11880000 0x4000>;
159 interrupts = <0 78 0>;
160 clocks = <&clock 260>, <&clock 134>;
161 clock-names = "csis", "sclk_csis";
162 bus-width = <4>;
163 samsung,power-domain = <&pd_cam>;
164 status = "disabled";
165 #address-cells = <1>;
166 #size-cells = <0>;
167 };
168
169 csis_1: csis@11890000 {
170 compatible = "samsung,exynos4210-csis";
171 reg = <0x11890000 0x4000>;
172 interrupts = <0 80 0>;
173 clocks = <&clock 261>, <&clock 135>;
174 clock-names = "csis", "sclk_csis";
175 bus-width = <2>;
176 samsung,power-domain = <&pd_cam>;
177 status = "disabled";
178 #address-cells = <1>;
179 #size-cells = <0>;
180 };
181 };
182
95 watchdog@10060000 { 183 watchdog@10060000 {
96 compatible = "samsung,s3c2410-wdt"; 184 compatible = "samsung,s3c2410-wdt";
97 reg = <0x10060000 0x100>; 185 reg = <0x10060000 0x100>;
@@ -155,13 +243,31 @@
155 status = "disabled"; 243 status = "disabled";
156 }; 244 };
157 245
246 ehci@12580000 {
247 compatible = "samsung,exynos4210-ehci";
248 reg = <0x12580000 0x100>;
249 interrupts = <0 70 0>;
250 clocks = <&clock 304>;
251 clock-names = "usbhost";
252 status = "disabled";
253 };
254
255 ohci@12590000 {
256 compatible = "samsung,exynos4210-ohci";
257 reg = <0x12590000 0x100>;
258 interrupts = <0 70 0>;
259 clocks = <&clock 304>;
260 clock-names = "usbhost";
261 status = "disabled";
262 };
263
158 mfc: codec@13400000 { 264 mfc: codec@13400000 {
159 compatible = "samsung,mfc-v5"; 265 compatible = "samsung,mfc-v5";
160 reg = <0x13400000 0x10000>; 266 reg = <0x13400000 0x10000>;
161 interrupts = <0 94 0>; 267 interrupts = <0 94 0>;
162 samsung,power-domain = <&pd_mfc>; 268 samsung,power-domain = <&pd_mfc>;
163 clocks = <&clock 170>, <&clock 273>; 269 clocks = <&clock 273>;
164 clock-names = "sclk_mfc", "mfc"; 270 clock-names = "mfc";
165 status = "disabled"; 271 status = "disabled";
166 }; 272 };
167 273
@@ -297,8 +403,8 @@
297 compatible = "samsung,exynos4210-spi"; 403 compatible = "samsung,exynos4210-spi";
298 reg = <0x13920000 0x100>; 404 reg = <0x13920000 0x100>;
299 interrupts = <0 66 0>; 405 interrupts = <0 66 0>;
300 tx-dma-channel = <&pdma0 7>; /* preliminary */ 406 dmas = <&pdma0 7>, <&pdma0 6>;
301 rx-dma-channel = <&pdma0 6>; /* preliminary */ 407 dma-names = "tx", "rx";
302 #address-cells = <1>; 408 #address-cells = <1>;
303 #size-cells = <0>; 409 #size-cells = <0>;
304 clocks = <&clock 327>, <&clock 159>; 410 clocks = <&clock 327>, <&clock 159>;
@@ -312,8 +418,8 @@
312 compatible = "samsung,exynos4210-spi"; 418 compatible = "samsung,exynos4210-spi";
313 reg = <0x13930000 0x100>; 419 reg = <0x13930000 0x100>;
314 interrupts = <0 67 0>; 420 interrupts = <0 67 0>;
315 tx-dma-channel = <&pdma1 7>; /* preliminary */ 421 dmas = <&pdma1 7>, <&pdma1 6>;
316 rx-dma-channel = <&pdma1 6>; /* preliminary */ 422 dma-names = "tx", "rx";
317 #address-cells = <1>; 423 #address-cells = <1>;
318 #size-cells = <0>; 424 #size-cells = <0>;
319 clocks = <&clock 328>, <&clock 160>; 425 clocks = <&clock 328>, <&clock 160>;
@@ -327,8 +433,8 @@
327 compatible = "samsung,exynos4210-spi"; 433 compatible = "samsung,exynos4210-spi";
328 reg = <0x13940000 0x100>; 434 reg = <0x13940000 0x100>;
329 interrupts = <0 68 0>; 435 interrupts = <0 68 0>;
330 tx-dma-channel = <&pdma0 9>; /* preliminary */ 436 dmas = <&pdma0 9>, <&pdma0 8>;
331 rx-dma-channel = <&pdma0 8>; /* preliminary */ 437 dma-names = "tx", "rx";
332 #address-cells = <1>; 438 #address-cells = <1>;
333 #size-cells = <0>; 439 #size-cells = <0>;
334 clocks = <&clock 329>, <&clock 161>; 440 clocks = <&clock 329>, <&clock 161>;
@@ -342,6 +448,8 @@
342 compatible = "samsung,exynos4210-pwm"; 448 compatible = "samsung,exynos4210-pwm";
343 reg = <0x139D0000 0x1000>; 449 reg = <0x139D0000 0x1000>;
344 interrupts = <0 37 0>, <0 38 0>, <0 39 0>, <0 40 0>, <0 41 0>; 450 interrupts = <0 37 0>, <0 38 0>, <0 39 0>, <0 40 0>, <0 41 0>;
451 clocks = <&clock 336>;
452 clock-names = "timers";
345 #pwm-cells = <2>; 453 #pwm-cells = <2>;
346 status = "disabled"; 454 status = "disabled";
347 }; 455 };
diff --git a/arch/arm/boot/dts/exynos4210-pinctrl.dtsi b/arch/arm/boot/dts/exynos4210-pinctrl.dtsi
index 553bceae8967..a7c212891674 100644
--- a/arch/arm/boot/dts/exynos4210-pinctrl.dtsi
+++ b/arch/arm/boot/dts/exynos4210-pinctrl.dtsi
@@ -797,6 +797,29 @@
797 samsung,pin-pud = <0>; 797 samsung,pin-pud = <0>;
798 samsung,pin-drv = <0>; 798 samsung,pin-drv = <0>;
799 }; 799 };
800
801 cam_port_a_io: cam-port-a-io {
802 samsung,pins = "gpj0-0", "gpj0-1", "gpj0-2", "gpj0-3",
803 "gpj0-4", "gpj0-5", "gpj0-6", "gpj0-7",
804 "gpj1-0", "gpj1-1", "gpj1-2", "gpj1-4";
805 samsung,pin-function = <2>;
806 samsung,pin-pud = <0>;
807 samsung,pin-drv = <0>;
808 };
809
810 cam_port_a_clk_active: cam-port-a-clk-active {
811 samsung,pins = "gpj1-3";
812 samsung,pin-function = <2>;
813 samsung,pin-pud = <0>;
814 samsung,pin-drv = <3>;
815 };
816
817 cam_port_a_clk_idle: cam-port-a-clk-idle {
818 samsung,pins = "gpj1-3";
819 samsung,pin-function = <0>;
820 samsung,pin-pud = <1>;
821 samsung,pin-drv = <0>;
822 };
800 }; 823 };
801 824
802 pinctrl@03860000 { 825 pinctrl@03860000 {
diff --git a/arch/arm/boot/dts/exynos4210-trats.dts b/arch/arm/boot/dts/exynos4210-trats.dts
index 94eebffe3044..1c164f234bcc 100644
--- a/arch/arm/boot/dts/exynos4210-trats.dts
+++ b/arch/arm/boot/dts/exynos4210-trats.dts
@@ -30,13 +30,62 @@
30 bootargs = "console=ttySAC2,115200N8 root=/dev/mmcblk0p5 rootwait earlyprintk panic=5"; 30 bootargs = "console=ttySAC2,115200N8 root=/dev/mmcblk0p5 rootwait earlyprintk panic=5";
31 }; 31 };
32 32
33 vemmc_reg: voltage-regulator@0 { 33 regulators {
34 compatible = "regulator-fixed"; 34 compatible = "simple-bus";
35 regulator-name = "VMEM_VDD_2.8V"; 35
36 regulator-min-microvolt = <2800000>; 36 vemmc_reg: regulator-0 {
37 regulator-max-microvolt = <2800000>; 37 compatible = "regulator-fixed";
38 gpio = <&gpk0 2 0>; 38 regulator-name = "VMEM_VDD_2.8V";
39 enable-active-high; 39 regulator-min-microvolt = <2800000>;
40 regulator-max-microvolt = <2800000>;
41 gpio = <&gpk0 2 0>;
42 enable-active-high;
43 };
44
45 tsp_reg: regulator-1 {
46 compatible = "regulator-fixed";
47 regulator-name = "TSP_FIXED_VOLTAGES";
48 regulator-min-microvolt = <2800000>;
49 regulator-max-microvolt = <2800000>;
50 gpio = <&gpl0 3 0>;
51 enable-active-high;
52 };
53
54 cam_af_28v_reg: regulator-2 {
55 compatible = "regulator-fixed";
56 regulator-name = "8M_AF_2.8V_EN";
57 regulator-min-microvolt = <2800000>;
58 regulator-max-microvolt = <2800000>;
59 gpio = <&gpk1 1 0>;
60 enable-active-high;
61 };
62
63 cam_io_en_reg: regulator-3 {
64 compatible = "regulator-fixed";
65 regulator-name = "CAM_IO_EN";
66 regulator-min-microvolt = <2800000>;
67 regulator-max-microvolt = <2800000>;
68 gpio = <&gpe2 1 0>;
69 enable-active-high;
70 };
71
72 cam_io_12v_reg: regulator-4 {
73 compatible = "regulator-fixed";
74 regulator-name = "8M_1.2V_EN";
75 regulator-min-microvolt = <1200000>;
76 regulator-max-microvolt = <1200000>;
77 gpio = <&gpe2 5 0>;
78 enable-active-high;
79 };
80
81 vt_core_15v_reg: regulator-5 {
82 compatible = "regulator-fixed";
83 regulator-name = "VT_CORE_1.5V";
84 regulator-min-microvolt = <1500000>;
85 regulator-max-microvolt = <1500000>;
86 gpio = <&gpe2 2 0>;
87 enable-active-high;
88 };
40 }; 89 };
41 90
42 sdhci_emmc: sdhci@12510000 { 91 sdhci_emmc: sdhci@12510000 {
@@ -97,15 +146,6 @@
97 }; 146 };
98 }; 147 };
99 148
100 tsp_reg: voltage-regulator {
101 compatible = "regulator-fixed";
102 regulator-name = "TSP_FIXED_VOLTAGES";
103 regulator-min-microvolt = <2800000>;
104 regulator-max-microvolt = <2800000>;
105 gpio = <&gpl0 3 0>;
106 enable-active-high;
107 };
108
109 i2c@13890000 { 149 i2c@13890000 {
110 samsung,i2c-sda-delay = <100>; 150 samsung,i2c-sda-delay = <100>;
111 samsung,i2c-slave-addr = <0x10>; 151 samsung,i2c-slave-addr = <0x10>;
@@ -218,6 +258,12 @@
218 regulator-always-on; 258 regulator-always-on;
219 }; 259 };
220 260
261 vtcam_reg: LDO12 {
262 regulator-name = "VT_CAM_1.8V";
263 regulator-min-microvolt = <1800000>;
264 regulator-max-microvolt = <1800000>;
265 };
266
221 vcclcd_reg: LDO13 { 267 vcclcd_reg: LDO13 {
222 regulator-name = "VCC_3.3V_LCD"; 268 regulator-name = "VCC_3.3V_LCD";
223 regulator-min-microvolt = <3300000>; 269 regulator-min-microvolt = <3300000>;
@@ -301,4 +347,26 @@
301 clock-frequency = <24000000>; 347 clock-frequency = <24000000>;
302 }; 348 };
303 }; 349 };
350
351 camera {
352 pinctrl-names = "default";
353 pinctrl-0 = <>;
354 status = "okay";
355
356 fimc_0: fimc@11800000 {
357 status = "okay";
358 };
359
360 fimc_1: fimc@11810000 {
361 status = "okay";
362 };
363
364 fimc_2: fimc@11820000 {
365 status = "okay";
366 };
367
368 fimc_3: fimc@11830000 {
369 status = "okay";
370 };
371 };
304}; 372};
diff --git a/arch/arm/boot/dts/exynos4210.dtsi b/arch/arm/boot/dts/exynos4210.dtsi
index b7f358a93bcb..057d6829d319 100644
--- a/arch/arm/boot/dts/exynos4210.dtsi
+++ b/arch/arm/boot/dts/exynos4210.dtsi
@@ -72,7 +72,7 @@
72 }; 72 };
73 }; 73 };
74 74
75 clock: clock-controller@0x10030000 { 75 clock: clock-controller@10030000 {
76 compatible = "samsung,exynos4210-clock"; 76 compatible = "samsung,exynos4210-clock";
77 reg = <0x10030000 0x20000>; 77 reg = <0x10030000 0x20000>;
78 #clock-cells = <1>; 78 #clock-cells = <1>;
@@ -125,4 +125,34 @@
125 clock-names = "sclk_fimg2d", "fimg2d"; 125 clock-names = "sclk_fimg2d", "fimg2d";
126 status = "disabled"; 126 status = "disabled";
127 }; 127 };
128
129 camera {
130 clocks = <&clock 132>, <&clock 133>, <&clock 351>, <&clock 352>;
131 clock-names = "sclk_cam0", "sclk_cam1", "pxl_async0", "pxl_async1";
132
133 fimc_0: fimc@11800000 {
134 samsung,pix-limits = <4224 8192 1920 4224>;
135 samsung,mainscaler-ext;
136 samsung,cam-if;
137 };
138
139 fimc_1: fimc@11810000 {
140 samsung,pix-limits = <4224 8192 1920 4224>;
141 samsung,mainscaler-ext;
142 samsung,cam-if;
143 };
144
145 fimc_2: fimc@11820000 {
146 samsung,pix-limits = <4224 8192 1920 4224>;
147 samsung,mainscaler-ext;
148 samsung,lcd-wb;
149 };
150
151 fimc_3: fimc@11830000 {
152 samsung,pix-limits = <1920 8192 1366 1920>;
153 samsung,rotators = <0>;
154 samsung,mainscaler-ext;
155 samsung,lcd-wb;
156 };
157 };
128}; 158};
diff --git a/arch/arm/boot/dts/exynos4412-origen.dts b/arch/arm/boot/dts/exynos4412-origen.dts
index 7993641cb32a..8768b03702e5 100644
--- a/arch/arm/boot/dts/exynos4412-origen.dts
+++ b/arch/arm/boot/dts/exynos4412-origen.dts
@@ -27,6 +27,11 @@
27 bootargs ="console=ttySAC2,115200"; 27 bootargs ="console=ttySAC2,115200";
28 }; 28 };
29 29
30 firmware@0203F000 {
31 compatible = "samsung,secure-firmware";
32 reg = <0x0203F000 0x1000>;
33 };
34
30 mmc_reg: voltage-regulator { 35 mmc_reg: voltage-regulator {
31 compatible = "regulator-fixed"; 36 compatible = "regulator-fixed";
32 regulator-name = "VMEM_VDD_2.8V"; 37 regulator-name = "VMEM_VDD_2.8V";
diff --git a/arch/arm/boot/dts/exynos4412-trats2.dts b/arch/arm/boot/dts/exynos4412-trats2.dts
new file mode 100644
index 000000000000..fb7b9ae5f399
--- /dev/null
+++ b/arch/arm/boot/dts/exynos4412-trats2.dts
@@ -0,0 +1,579 @@
1/*
2 * Samsung's Exynos4412 based Trats 2 board device tree source
3 *
4 * Copyright (c) 2013 Samsung Electronics Co., Ltd.
5 * http://www.samsung.com
6 *
7 * Device tree source file for Samsung's Trats 2 board which is based on
8 * Samsung's Exynos4412 SoC.
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13*/
14
15/dts-v1/;
16#include "exynos4412.dtsi"
17
18/ {
19 model = "Samsung Trats 2 based on Exynos4412";
20 compatible = "samsung,trats2", "samsung,exynos4412";
21
22 aliases {
23 i2c8 = &i2c_ak8975;
24 };
25
26 memory {
27 reg = <0x40000000 0x40000000>;
28 };
29
30 chosen {
31 bootargs = "console=ttySAC2,115200N8 root=/dev/mmcblk0p5 rootwait earlyprintk panic=5";
32 };
33
34 firmware@0204F000 {
35 compatible = "samsung,secure-firmware";
36 reg = <0x0204F000 0x1000>;
37 };
38
39 fixed-rate-clocks {
40 xxti {
41 compatible = "samsung,clock-xxti", "fixed-clock";
42 clock-frequency = <0>;
43 };
44
45 xusbxti {
46 compatible = "samsung,clock-xusbxti", "fixed-clock";
47 clock-frequency = <24000000>;
48 };
49 };
50
51 regulators {
52 compatible = "simple-bus";
53 #address-cells = <1>;
54 #size-cells = <0>;
55
56 vemmc_reg: regulator-0 {
57 compatible = "regulator-fixed";
58 regulator-name = "VMEM_VDD_2.8V";
59 regulator-min-microvolt = <2800000>;
60 regulator-max-microvolt = <2800000>;
61 gpio = <&gpk0 2 0>;
62 enable-active-high;
63 };
64
65 cam_io_reg: voltage-regulator-1 {
66 compatible = "regulator-fixed";
67 regulator-name = "CAM_SENSOR_A";
68 regulator-min-microvolt = <2800000>;
69 regulator-max-microvolt = <2800000>;
70 gpio = <&gpm0 2 0>;
71 enable-active-high;
72 };
73
74 /* More to come */
75 };
76
77 gpio-keys {
78 compatible = "gpio-keys";
79
80 key-down {
81 interrupt-parent = <&gpj1>;
82 interrupts = <2 0>;
83 gpios = <&gpj1 2 1>;
84 linux,code = <114>;
85 label = "volume down";
86 debounce-interval = <10>;
87 };
88
89 key-up {
90 interrupt-parent = <&gpj1>;
91 interrupts = <1 0>;
92 gpios = <&gpj1 1 1>;
93 linux,code = <115>;
94 label = "volume up";
95 debounce-interval = <10>;
96 };
97
98 key-power {
99 interrupt-parent = <&gpx2>;
100 interrupts = <7 0>;
101 gpios = <&gpx2 7 1>;
102 linux,code = <116>;
103 label = "power";
104 debounce-interval = <10>;
105 gpio-key,wakeup;
106 };
107 };
108
109 i2c@13890000 {
110 samsung,i2c-sda-delay = <100>;
111 samsung,i2c-slave-addr = <0x10>;
112 samsung,i2c-max-bus-freq = <400000>;
113 pinctrl-0 = <&i2c3_bus>;
114 pinctrl-names = "default";
115 status = "okay";
116
117 mms114-touchscreen@48 {
118 compatible = "melfas,mms114";
119 reg = <0x48>;
120 interrupt-parent = <&gpm2>;
121 interrupts = <3 2>;
122 x-size = <720>;
123 y-size = <1280>;
124 avdd-supply = <&ldo23_reg>;
125 vdd-supply = <&ldo24_reg>;
126 };
127 };
128
129 i2c@138D0000 {
130 samsung,i2c-sda-delay = <100>;
131 samsung,i2c-slave-addr = <0x10>;
132 samsung,i2c-max-bus-freq = <100000>;
133 pinctrl-0 = <&i2c7_bus>;
134 pinctrl-names = "default";
135 status = "okay";
136
137 max77686_pmic@09 {
138 compatible = "maxim,max77686";
139 interrupt-parent = <&gpx0>;
140 interrupts = <7 0>;
141 reg = <0x09>;
142
143 voltage-regulators {
144 ldo1_reg: ldo1 {
145 regulator-compatible = "LDO1";
146 regulator-name = "VALIVE_1.0V_AP";
147 regulator-min-microvolt = <1000000>;
148 regulator-max-microvolt = <1000000>;
149 regulator-always-on;
150 regulator-mem-on;
151 };
152
153 ldo2_reg: ldo2 {
154 regulator-compatible = "LDO2";
155 regulator-name = "VM1M2_1.2V_AP";
156 regulator-min-microvolt = <1200000>;
157 regulator-max-microvolt = <1200000>;
158 regulator-always-on;
159 regulator-mem-on;
160 };
161
162 ldo3_reg: ldo3 {
163 regulator-compatible = "LDO3";
164 regulator-name = "VCC_1.8V_AP";
165 regulator-min-microvolt = <1800000>;
166 regulator-max-microvolt = <1800000>;
167 regulator-always-on;
168 regulator-mem-on;
169 };
170
171 ldo4_reg: ldo4 {
172 regulator-compatible = "LDO4";
173 regulator-name = "VCC_2.8V_AP";
174 regulator-min-microvolt = <2800000>;
175 regulator-max-microvolt = <2800000>;
176 regulator-always-on;
177 regulator-mem-on;
178 };
179
180 ldo5_reg: ldo5 {
181 regulator-compatible = "LDO5";
182 regulator-name = "VCC_1.8V_IO";
183 regulator-min-microvolt = <1800000>;
184 regulator-max-microvolt = <1800000>;
185 regulator-always-on;
186 regulator-mem-on;
187 };
188
189 ldo6_reg: ldo6 {
190 regulator-compatible = "LDO6";
191 regulator-name = "VMPLL_1.0V_AP";
192 regulator-min-microvolt = <1000000>;
193 regulator-max-microvolt = <1000000>;
194 regulator-always-on;
195 regulator-mem-on;
196 };
197
198 ldo7_reg: ldo7 {
199 regulator-compatible = "LDO7";
200 regulator-name = "VPLL_1.0V_AP";
201 regulator-min-microvolt = <1000000>;
202 regulator-max-microvolt = <1000000>;
203 regulator-always-on;
204 regulator-mem-on;
205 };
206
207 ldo8_reg: ldo8 {
208 regulator-compatible = "LDO8";
209 regulator-name = "VMIPI_1.0V";
210 regulator-min-microvolt = <1000000>;
211 regulator-max-microvolt = <1000000>;
212 regulator-mem-off;
213 };
214
215 ldo9_reg: ldo9 {
216 regulator-compatible = "LDO9";
217 regulator-name = "CAM_ISP_MIPI_1.2V";
218 regulator-min-microvolt = <1200000>;
219 regulator-max-microvolt = <1200000>;
220 regulator-mem-idle;
221 };
222
223 ldo10_reg: ldo10 {
224 regulator-compatible = "LDO10";
225 regulator-name = "VMIPI_1.8V";
226 regulator-min-microvolt = <1800000>;
227 regulator-max-microvolt = <1800000>;
228 regulator-mem-off;
229 };
230
231 ldo11_reg: ldo11 {
232 regulator-compatible = "LDO11";
233 regulator-name = "VABB1_1.95V";
234 regulator-min-microvolt = <1950000>;
235 regulator-max-microvolt = <1950000>;
236 regulator-always-on;
237 regulator-mem-off;
238 };
239
240 ldo12_reg: ldo12 {
241 regulator-compatible = "LDO12";
242 regulator-name = "VUOTG_3.0V";
243 regulator-min-microvolt = <3000000>;
244 regulator-max-microvolt = <3000000>;
245 regulator-mem-off;
246 };
247
248 ldo13_reg: ldo13 {
249 regulator-compatible = "LDO13";
250 regulator-name = "NFC_AVDD_1.8V";
251 regulator-min-microvolt = <1800000>;
252 regulator-max-microvolt = <1800000>;
253 regulator-mem-idle;
254 };
255
256 ldo14_reg: ldo14 {
257 regulator-compatible = "LDO14";
258 regulator-name = "VABB2_1.95V";
259 regulator-min-microvolt = <1950000>;
260 regulator-max-microvolt = <1950000>;
261 regulator-always-on;
262 regulator-mem-off;
263 };
264
265 ldo15_reg: ldo15 {
266 regulator-compatible = "LDO15";
267 regulator-name = "VHSIC_1.0V";
268 regulator-min-microvolt = <1000000>;
269 regulator-max-microvolt = <1000000>;
270 regulator-mem-off;
271 };
272
273 ldo16_reg: ldo16 {
274 regulator-compatible = "LDO16";
275 regulator-name = "VHSIC_1.8V";
276 regulator-min-microvolt = <1800000>;
277 regulator-max-microvolt = <1800000>;
278 regulator-mem-off;
279 };
280
281 ldo17_reg: ldo17 {
282 regulator-compatible = "LDO17";
283 regulator-name = "CAM_SENSOR_CORE_1.2V";
284 regulator-min-microvolt = <1200000>;
285 regulator-max-microvolt = <1200000>;
286 regulator-mem-idle;
287 };
288
289 ldo18_reg: ldo18 {
290 regulator-compatible = "LDO18";
291 regulator-name = "CAM_ISP_SEN_IO_1.8V";
292 regulator-min-microvolt = <1800000>;
293 regulator-max-microvolt = <1800000>;
294 regulator-mem-idle;
295 };
296
297 ldo19_reg: ldo19 {
298 regulator-compatible = "LDO19";
299 regulator-name = "VT_CAM_1.8V";
300 regulator-min-microvolt = <1800000>;
301 regulator-max-microvolt = <1800000>;
302 regulator-mem-idle;
303 };
304
305 ldo20_reg: ldo20 {
306 regulator-compatible = "LDO20";
307 regulator-name = "VDDQ_PRE_1.8V";
308 regulator-min-microvolt = <1800000>;
309 regulator-max-microvolt = <1800000>;
310 regulator-mem-idle;
311 };
312
313 ldo21_reg: ldo21 {
314 regulator-compatible = "LDO21";
315 regulator-name = "VTF_2.8V";
316 regulator-min-microvolt = <2800000>;
317 regulator-max-microvolt = <2800000>;
318 regulator-mem-idle;
319 };
320
321 ldo22_reg: ldo22 {
322 regulator-compatible = "LDO22";
323 regulator-name = "VMEM_VDD_2.8V";
324 regulator-min-microvolt = <2800000>;
325 regulator-max-microvolt = <2800000>;
326 regulator-always-on;
327 regulator-mem-off;
328 };
329
330 ldo23_reg: ldo23 {
331 regulator-compatible = "LDO23";
332 regulator-name = "TSP_AVDD_3.3V";
333 regulator-min-microvolt = <3300000>;
334 regulator-max-microvolt = <3300000>;
335 regulator-mem-idle;
336 };
337
338 ldo24_reg: ldo24 {
339 regulator-compatible = "LDO24";
340 regulator-name = "TSP_VDD_1.8V";
341 regulator-min-microvolt = <1800000>;
342 regulator-max-microvolt = <1800000>;
343 regulator-mem-idle;
344 };
345
346 ldo25_reg: ldo25 {
347 regulator-compatible = "LDO25";
348 regulator-name = "LCD_VCC_3.3V";
349 regulator-min-microvolt = <2800000>;
350 regulator-max-microvolt = <2800000>;
351 regulator-mem-idle;
352 };
353
354 ldo26_reg: ldo26 {
355 regulator-compatible = "LDO26";
356 regulator-name = "MOTOR_VCC_3.0V";
357 regulator-min-microvolt = <3000000>;
358 regulator-max-microvolt = <3000000>;
359 regulator-mem-idle;
360 };
361
362 buck1_reg: buck1 {
363 regulator-compatible = "BUCK1";
364 regulator-name = "vdd_mif";
365 regulator-min-microvolt = <850000>;
366 regulator-max-microvolt = <1100000>;
367 regulator-always-on;
368 regulator-boot-on;
369 regulator-mem-off;
370 };
371
372 buck2_reg: buck2 {
373 regulator-compatible = "BUCK2";
374 regulator-name = "vdd_arm";
375 regulator-min-microvolt = <850000>;
376 regulator-max-microvolt = <1500000>;
377 regulator-always-on;
378 regulator-boot-on;
379 regulator-mem-off;
380 };
381
382 buck3_reg: buck3 {
383 regulator-compatible = "BUCK3";
384 regulator-name = "vdd_int";
385 regulator-min-microvolt = <850000>;
386 regulator-max-microvolt = <1150000>;
387 regulator-always-on;
388 regulator-boot-on;
389 regulator-mem-off;
390 };
391
392 buck4_reg: buck4 {
393 regulator-compatible = "BUCK4";
394 regulator-name = "vdd_g3d";
395 regulator-min-microvolt = <850000>;
396 regulator-max-microvolt = <1150000>;
397 regulator-boot-on;
398 regulator-mem-off;
399 };
400
401 buck5_reg: buck5 {
402 regulator-compatible = "BUCK5";
403 regulator-name = "VMEM_1.2V_AP";
404 regulator-min-microvolt = <1200000>;
405 regulator-max-microvolt = <1200000>;
406 regulator-always-on;
407 };
408
409 buck6_reg: buck6 {
410 regulator-compatible = "BUCK6";
411 regulator-name = "VCC_SUB_1.35V";
412 regulator-min-microvolt = <1350000>;
413 regulator-max-microvolt = <1350000>;
414 regulator-always-on;
415 };
416
417 buck7_reg: buck7 {
418 regulator-compatible = "BUCK7";
419 regulator-name = "VCC_SUB_2.0V";
420 regulator-min-microvolt = <2000000>;
421 regulator-max-microvolt = <2000000>;
422 regulator-always-on;
423 };
424
425 buck8_reg: buck8 {
426 regulator-compatible = "BUCK8";
427 regulator-name = "VMEM_VDDF_3.0V";
428 regulator-min-microvolt = <2850000>;
429 regulator-max-microvolt = <2850000>;
430 regulator-always-on;
431 regulator-mem-off;
432 };
433
434 buck9_reg: buck9 {
435 regulator-compatible = "BUCK9";
436 regulator-name = "CAM_ISP_CORE_1.2V";
437 regulator-min-microvolt = <1000000>;
438 regulator-max-microvolt = <1200000>;
439 regulator-mem-off;
440 };
441 };
442 };
443 };
444
445 sdhci@12510000 {
446 bus-width = <8>;
447 non-removable;
448 pinctrl-0 = <&sd0_clk &sd0_cmd &sd0_bus8>;
449 pinctrl-names = "default";
450 vmmc-supply = <&vemmc_reg>;
451 status = "okay";
452 };
453
454 serial@13800000 {
455 status = "okay";
456 };
457
458 serial@13810000 {
459 status = "okay";
460 };
461
462 serial@13820000 {
463 status = "okay";
464 };
465
466 serial@13830000 {
467 status = "okay";
468 };
469
470 i2c_ak8975: i2c-gpio-0 {
471 compatible = "i2c-gpio";
472 gpios = <&gpy2 4 0>, <&gpy2 5 0>;
473 i2c-gpio,delay-us = <2>;
474 #address-cells = <1>;
475 #size-cells = <0>;
476 status = "okay";
477
478 ak8975@0c {
479 compatible = "ak,ak8975";
480 reg = <0x0c>;
481 gpios = <&gpj0 7 0>;
482 };
483 };
484
485 spi_1: spi@13930000 {
486 pinctrl-names = "default";
487 pinctrl-0 = <&spi1_bus>;
488 status = "okay";
489
490 s5c73m3_spi: s5c73m3 {
491 compatible = "samsung,s5c73m3";
492 spi-max-frequency = <50000000>;
493 reg = <0>;
494 controller-data {
495 cs-gpio = <&gpb 5 0>;
496 samsung,spi-feedback-delay = <2>;
497 };
498 };
499 };
500
501 camera {
502 pinctrl-0 = <&cam_port_b_clk_active>;
503 pinctrl-names = "default";
504 status = "okay";
505
506 fimc_0: fimc@11800000 {
507 status = "okay";
508 };
509
510 fimc_1: fimc@11810000 {
511 status = "okay";
512 };
513
514 fimc_2: fimc@11820000 {
515 status = "okay";
516 };
517
518 fimc_3: fimc@11830000 {
519 status = "okay";
520 };
521
522 csis_1: csis@11890000 {
523 vddcore-supply = <&ldo8_reg>;
524 vddio-supply = <&ldo10_reg>;
525 clock-frequency = <160000000>;
526 status = "okay";
527
528 /* Camera D (4) MIPI CSI-2 (CSIS1) */
529 port@4 {
530 reg = <4>;
531 csis1_ep: endpoint {
532 remote-endpoint = <&is_s5k6a3_ep>;
533 data-lanes = <1>;
534 samsung,csis-hs-settle = <18>;
535 samsung,csis-wclk;
536 };
537 };
538 };
539
540 fimc_lite_0: fimc-lite@12390000 {
541 status = "okay";
542 };
543
544 fimc_lite_1: fimc-lite@123A0000 {
545 status = "okay";
546 };
547
548 fimc-is@12000000 {
549 pinctrl-0 = <&fimc_is_uart>;
550 pinctrl-names = "default";
551 status = "okay";
552
553 i2c1_isp: i2c-isp@12140000 {
554 pinctrl-0 = <&fimc_is_i2c1>;
555 pinctrl-names = "default";
556
557 s5k6a3@10 {
558 compatible = "samsung,s5k6a3";
559 reg = <0x10>;
560 svdda-supply = <&cam_io_reg>;
561 svddio-supply = <&ldo19_reg>;
562 clock-frequency = <24000000>;
563 /* CAM_B_CLKOUT */
564 clocks = <&clock_cam 1>;
565 clock-names = "mclk";
566 samsung,camclk-out = <1>;
567 gpios = <&gpm1 6 0>;
568
569 port {
570 is_s5k6a3_ep: endpoint {
571 remote-endpoint = <&csis1_ep>;
572 data-lanes = <1>;
573 };
574 };
575 };
576 };
577 };
578 };
579};
diff --git a/arch/arm/boot/dts/exynos4x12-pinctrl.dtsi b/arch/arm/boot/dts/exynos4x12-pinctrl.dtsi
index 704290f7c5c0..99b26df8dbc7 100644
--- a/arch/arm/boot/dts/exynos4x12-pinctrl.dtsi
+++ b/arch/arm/boot/dts/exynos4x12-pinctrl.dtsi
@@ -401,13 +401,26 @@
401 samsung,pin-drv = <0>; 401 samsung,pin-drv = <0>;
402 }; 402 };
403 403
404 cam_port_a: cam-port-a { 404 cam_port_a_io: cam-port-a-io {
405 samsung,pins = "gpj0-0", "gpj0-1", "gpj0-2", "gpj0-3", 405 samsung,pins = "gpj0-0", "gpj0-1", "gpj0-2", "gpj0-3",
406 "gpj0-4", "gpj0-5", "gpj0-6", "gpj0-7", 406 "gpj0-4", "gpj0-5", "gpj0-6", "gpj0-7",
407 "gpj1-0", "gpj1-1", "gpj1-2", "gpj1-3", 407 "gpj1-0", "gpj1-1", "gpj1-2", "gpj1-4";
408 "gpj1-4";
409 samsung,pin-function = <2>; 408 samsung,pin-function = <2>;
410 samsung,pin-pud = <3>; 409 samsung,pin-pud = <0>;
410 samsung,pin-drv = <0>;
411 };
412
413 cam_port_a_clk_active: cam-port-a-clk-active {
414 samsung,pins = "gpj1-3";
415 samsung,pin-function = <2>;
416 samsung,pin-pud = <0>;
417 samsung,pin-drv = <3>;
418 };
419
420 cam_port_a_clk_idle: cam-port-a-clk-idle {
421 samsung,pins = "gpj1-3";
422 samsung,pin-function = <0>;
423 samsung,pin-pud = <1>;
411 samsung,pin-drv = <0>; 424 samsung,pin-drv = <0>;
412 }; 425 };
413 }; 426 };
@@ -778,16 +791,29 @@
778 samsung,pin-drv = <3>; 791 samsung,pin-drv = <3>;
779 }; 792 };
780 793
781 cam_port_b: cam-port-b { 794 cam_port_b_io: cam-port-b-io {
782 samsung,pins = "gpm0-0", "gpm0-1", "gpm0-2", "gpm0-3", 795 samsung,pins = "gpm0-0", "gpm0-1", "gpm0-2", "gpm0-3",
783 "gpm0-4", "gpm0-5", "gpm0-6", "gpm0-7", 796 "gpm0-4", "gpm0-5", "gpm0-6", "gpm0-7",
784 "gpm1-0", "gpm1-1", "gpm2-0", "gpm2-1", 797 "gpm1-0", "gpm1-1", "gpm2-0", "gpm2-1";
785 "gpm2-2";
786 samsung,pin-function = <3>; 798 samsung,pin-function = <3>;
787 samsung,pin-pud = <3>; 799 samsung,pin-pud = <3>;
788 samsung,pin-drv = <0>; 800 samsung,pin-drv = <0>;
789 }; 801 };
790 802
803 cam_port_b_clk_active: cam-port-b-clk-active {
804 samsung,pins = "gpm2-2";
805 samsung,pin-function = <3>;
806 samsung,pin-pud = <0>;
807 samsung,pin-drv = <3>;
808 };
809
810 cam_port_b_clk_idle: cam-port-b-clk-idle {
811 samsung,pins = "gpm2-2";
812 samsung,pin-function = <0>;
813 samsung,pin-pud = <1>;
814 samsung,pin-drv = <0>;
815 };
816
791 eint0: ext-int0 { 817 eint0: ext-int0 {
792 samsung,pins = "gpx0-0"; 818 samsung,pins = "gpx0-0";
793 samsung,pin-function = <0xf>; 819 samsung,pin-function = <0xf>;
@@ -822,6 +848,27 @@
822 samsung,pin-pud = <0>; 848 samsung,pin-pud = <0>;
823 samsung,pin-drv = <0>; 849 samsung,pin-drv = <0>;
824 }; 850 };
851
852 fimc_is_i2c0: fimc-is-i2c0 {
853 samsung,pins = "gpm4-0", "gpm4-1";
854 samsung,pin-function = <2>;
855 samsung,pin-pud = <0>;
856 samsung,pin-drv = <0>;
857 };
858
859 fimc_is_i2c1: fimc-is-i2c1 {
860 samsung,pins = "gpm4-2", "gpm4-3";
861 samsung,pin-function = <2>;
862 samsung,pin-pud = <0>;
863 samsung,pin-drv = <0>;
864 };
865
866 fimc_is_uart: fimc-is-uart {
867 samsung,pins = "gpm3-5", "gpm3-7";
868 samsung,pin-function = <3>;
869 samsung,pin-pud = <0>;
870 samsung,pin-drv = <0>;
871 };
825 }; 872 };
826 873
827 pinctrl@03860000 { 874 pinctrl@03860000 {
diff --git a/arch/arm/boot/dts/exynos4x12.dtsi b/arch/arm/boot/dts/exynos4x12.dtsi
index 01da194ba329..ad531fe6ab95 100644
--- a/arch/arm/boot/dts/exynos4x12.dtsi
+++ b/arch/arm/boot/dts/exynos4x12.dtsi
@@ -26,9 +26,16 @@
26 pinctrl1 = &pinctrl_1; 26 pinctrl1 = &pinctrl_1;
27 pinctrl2 = &pinctrl_2; 27 pinctrl2 = &pinctrl_2;
28 pinctrl3 = &pinctrl_3; 28 pinctrl3 = &pinctrl_3;
29 fimc-lite0 = &fimc_lite_0;
30 fimc-lite1 = &fimc_lite_1;
29 }; 31 };
30 32
31 clock: clock-controller@0x10030000 { 33 pd_isp: isp-power-domain@10023CA0 {
34 compatible = "samsung,exynos4210-pd";
35 reg = <0x10023CA0 0x20>;
36 };
37
38 clock: clock-controller@10030000 {
32 compatible = "samsung,exynos4412-clock"; 39 compatible = "samsung,exynos4412-clock";
33 reg = <0x10030000 0x20000>; 40 reg = <0x10030000 0x20000>;
34 #clock-cells = <1>; 41 #clock-cells = <1>;
@@ -73,4 +80,100 @@
73 clock-names = "sclk_fimg2d", "fimg2d"; 80 clock-names = "sclk_fimg2d", "fimg2d";
74 status = "disabled"; 81 status = "disabled";
75 }; 82 };
83
84 camera {
85 clocks = <&clock 132>, <&clock 133>, <&clock 351>, <&clock 352>;
86 clock-names = "sclk_cam0", "sclk_cam1", "pxl_async0", "pxl_async1";
87
88 fimc_0: fimc@11800000 {
89 compatible = "samsung,exynos4212-fimc";
90 samsung,pix-limits = <4224 8192 1920 4224>;
91 samsung,mainscaler-ext;
92 samsung,isp-wb;
93 samsung,cam-if;
94 };
95
96 fimc_1: fimc@11810000 {
97 compatible = "samsung,exynos4212-fimc";
98 samsung,pix-limits = <4224 8192 1920 4224>;
99 samsung,mainscaler-ext;
100 samsung,isp-wb;
101 samsung,cam-if;
102 };
103
104 fimc_2: fimc@11820000 {
105 compatible = "samsung,exynos4212-fimc";
106 samsung,pix-limits = <4224 8192 1920 4224>;
107 samsung,mainscaler-ext;
108 samsung,isp-wb;
109 samsung,lcd-wb;
110 samsung,cam-if;
111 };
112
113 fimc_3: fimc@11830000 {
114 compatible = "samsung,exynos4212-fimc";
115 samsung,pix-limits = <1920 8192 1366 1920>;
116 samsung,rotators = <0>;
117 samsung,mainscaler-ext;
118 samsung,isp-wb;
119 samsung,lcd-wb;
120 };
121
122 fimc_lite_0: fimc-lite@12390000 {
123 compatible = "samsung,exynos4212-fimc-lite";
124 reg = <0x12390000 0x1000>;
125 interrupts = <0 105 0>;
126 samsung,power-domain = <&pd_isp>;
127 clocks = <&clock 353>;
128 clock-names = "flite";
129 status = "disabled";
130 };
131
132 fimc_lite_1: fimc-lite@123A0000 {
133 compatible = "samsung,exynos4212-fimc-lite";
134 reg = <0x123A0000 0x1000>;
135 interrupts = <0 106 0>;
136 samsung,power-domain = <&pd_isp>;
137 clocks = <&clock 354>;
138 clock-names = "flite";
139 status = "disabled";
140 };
141
142 fimc_is: fimc-is@12000000 {
143 compatible = "samsung,exynos4212-fimc-is", "simple-bus";
144 reg = <0x12000000 0x260000>;
145 interrupts = <0 90 0>, <0 95 0>;
146 samsung,power-domain = <&pd_isp>;
147 clocks = <&clock 353>, <&clock 354>, <&clock 355>,
148 <&clock 356>, <&clock 17>, <&clock 357>,
149 <&clock 358>, <&clock 359>, <&clock 360>,
150 <&clock 450>,<&clock 451>, <&clock 452>,
151 <&clock 453>, <&clock 176>, <&clock 13>,
152 <&clock 454>, <&clock 395>, <&clock 455>;
153 clock-names = "lite0", "lite1", "ppmuispx",
154 "ppmuispmx", "mpll", "isp",
155 "drc", "fd", "mcuisp",
156 "ispdiv0", "ispdiv1", "mcuispdiv0",
157 "mcuispdiv1", "uart", "aclk200",
158 "div_aclk200", "aclk400mcuisp",
159 "div_aclk400mcuisp";
160 #address-cells = <1>;
161 #size-cells = <1>;
162 ranges;
163 status = "disabled";
164
165 pmu {
166 reg = <0x10020000 0x3000>;
167 };
168
169 i2c1_isp: i2c-isp@12140000 {
170 compatible = "samsung,exynos4212-i2c-isp";
171 reg = <0x12140000 0x100>;
172 clocks = <&clock 370>;
173 clock-names = "i2c_isp";
174 #address-cells = <1>;
175 #size-cells = <0>;
176 };
177 };
178 };
76}; 179};
diff --git a/arch/arm/boot/dts/exynos5.dtsi b/arch/arm/boot/dts/exynos5.dtsi
index f65e124c04a6..074739d39e2d 100644
--- a/arch/arm/boot/dts/exynos5.dtsi
+++ b/arch/arm/boot/dts/exynos5.dtsi
@@ -95,7 +95,7 @@
95 interrupts = <0 54 0>; 95 interrupts = <0 54 0>;
96 }; 96 };
97 97
98 rtc { 98 rtc@101E0000 {
99 compatible = "samsung,s3c6410-rtc"; 99 compatible = "samsung,s3c6410-rtc";
100 reg = <0x101E0000 0x100>; 100 reg = <0x101E0000 0x100>;
101 interrupts = <0 43 0>, <0 44 0>; 101 interrupts = <0 43 0>, <0 44 0>;
@@ -108,4 +108,23 @@
108 interrupts = <0 42 0>; 108 interrupts = <0 42 0>;
109 status = "disabled"; 109 status = "disabled";
110 }; 110 };
111
112 fimd@14400000 {
113 compatible = "samsung,exynos5250-fimd";
114 interrupt-parent = <&combiner>;
115 reg = <0x14400000 0x40000>;
116 interrupt-names = "fifo", "vsync", "lcd_sys";
117 interrupts = <18 4>, <18 5>, <18 6>;
118 status = "disabled";
119 };
120
121 dp-controller@145B0000 {
122 compatible = "samsung,exynos5-dp";
123 reg = <0x145B0000 0x1000>;
124 interrupts = <10 3>;
125 interrupt-parent = <&combiner>;
126 #address-cells = <1>;
127 #size-cells = <0>;
128 status = "disabled";
129 };
111}; 130};
diff --git a/arch/arm/boot/dts/exynos5250-arndale.dts b/arch/arm/boot/dts/exynos5250-arndale.dts
index abc7272c7afd..cee55fa33731 100644
--- a/arch/arm/boot/dts/exynos5250-arndale.dts
+++ b/arch/arm/boot/dts/exynos5250-arndale.dts
@@ -11,6 +11,7 @@
11 11
12/dts-v1/; 12/dts-v1/;
13#include "exynos5250.dtsi" 13#include "exynos5250.dtsi"
14#include <dt-bindings/interrupt-controller/irq.h>
14 15
15/ { 16/ {
16 model = "Insignal Arndale evaluation board based on EXYNOS5250"; 17 model = "Insignal Arndale evaluation board based on EXYNOS5250";
@@ -37,6 +38,28 @@
37 s5m8767_pmic@66 { 38 s5m8767_pmic@66 {
38 compatible = "samsung,s5m8767-pmic"; 39 compatible = "samsung,s5m8767-pmic";
39 reg = <0x66>; 40 reg = <0x66>;
41 interrupt-parent = <&gpx3>;
42 interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
43
44 vinb1-supply = <&main_dc_reg>;
45 vinb2-supply = <&main_dc_reg>;
46 vinb3-supply = <&main_dc_reg>;
47 vinb4-supply = <&main_dc_reg>;
48 vinb5-supply = <&main_dc_reg>;
49 vinb6-supply = <&main_dc_reg>;
50 vinb7-supply = <&main_dc_reg>;
51 vinb8-supply = <&main_dc_reg>;
52 vinb9-supply = <&main_dc_reg>;
53
54 vinl1-supply = <&buck7_reg>;
55 vinl2-supply = <&buck7_reg>;
56 vinl3-supply = <&buck7_reg>;
57 vinl4-supply = <&main_dc_reg>;
58 vinl5-supply = <&main_dc_reg>;
59 vinl6-supply = <&main_dc_reg>;
60 vinl7-supply = <&main_dc_reg>;
61 vinl8-supply = <&buck8_reg>;
62 vinl9-supply = <&buck8_reg>;
40 63
41 s5m8767,pmic-buck2-dvs-voltage = <1300000>; 64 s5m8767,pmic-buck2-dvs-voltage = <1300000>;
42 s5m8767,pmic-buck3-dvs-voltage = <1100000>; 65 s5m8767,pmic-buck3-dvs-voltage = <1100000>;
@@ -276,6 +299,16 @@
276 op_mode = <1>; 299 op_mode = <1>;
277 }; 300 };
278 301
302 buck7_reg: BUCK7 {
303 regulator-name = "PVDD_BUCK7";
304 regulator-always-on;
305 };
306
307 buck8_reg: BUCK8 {
308 regulator-name = "PVDD_BUCK8";
309 regulator-always-on;
310 };
311
279 buck9_reg: BUCK9 { 312 buck9_reg: BUCK9 {
280 regulator-name = "VDD_33_OFF_EXT1"; 313 regulator-name = "VDD_33_OFF_EXT1";
281 regulator-min-microvolt = <750000>; 314 regulator-min-microvolt = <750000>;
@@ -295,7 +328,22 @@
295 }; 328 };
296 329
297 i2c@12C90000 { 330 i2c@12C90000 {
298 status = "disabled"; 331 wm1811a@1a {
332 compatible = "wlf,wm1811";
333 reg = <0x1a>;
334
335 AVDD2-supply = <&main_dc_reg>;
336 CPVDD-supply = <&main_dc_reg>;
337 DBVDD1-supply = <&main_dc_reg>;
338 DBVDD2-supply = <&main_dc_reg>;
339 DBVDD3-supply = <&main_dc_reg>;
340 LDO1VDD-supply = <&main_dc_reg>;
341 SPKVDD1-supply = <&main_dc_reg>;
342 SPKVDD2-supply = <&main_dc_reg>;
343
344 wlf,ldo1ena = <&gpb0 0 0>;
345 wlf,ldo2ena = <&gpb0 1 0>;
346 };
299 }; 347 };
300 348
301 i2c@12CA0000 { 349 i2c@12CA0000 {
@@ -429,18 +477,29 @@
429 vdd-supply = <&ldo8_reg>; 477 vdd-supply = <&ldo8_reg>;
430 }; 478 };
431 479
432 mmc_reg: voltage-regulator { 480 regulators {
433 compatible = "regulator-fixed"; 481 compatible = "simple-bus";
434 regulator-name = "VDD_33ON_2.8V"; 482 #address-cells = <1>;
435 regulator-min-microvolt = <2800000>; 483 #size-cells = <0>;
436 regulator-max-microvolt = <2800000>; 484
437 gpio = <&gpx1 1 1>; 485 main_dc_reg: fixedregulator@1 {
438 enable-active-high; 486 compatible = "regulator-fixed";
439 }; 487 regulator-name = "MAIN_DC";
488 };
440 489
441 reg_hdmi_en: fixedregulator@0 { 490 mmc_reg: voltage-regulator {
442 compatible = "regulator-fixed"; 491 compatible = "regulator-fixed";
443 regulator-name = "hdmi-en"; 492 regulator-name = "VDD_33ON_2.8V";
493 regulator-min-microvolt = <2800000>;
494 regulator-max-microvolt = <2800000>;
495 gpio = <&gpx1 1 1>;
496 enable-active-high;
497 };
498
499 reg_hdmi_en: fixedregulator@0 {
500 compatible = "regulator-fixed";
501 regulator-name = "hdmi-en";
502 };
444 }; 503 };
445 504
446 fixed-rate-clocks { 505 fixed-rate-clocks {
@@ -450,16 +509,18 @@
450 }; 509 };
451 }; 510 };
452 511
453 dp-controller { 512 dp-controller@145B0000 {
454 samsung,color-space = <0>; 513 samsung,color-space = <0>;
455 samsung,dynamic-range = <0>; 514 samsung,dynamic-range = <0>;
456 samsung,ycbcr-coeff = <0>; 515 samsung,ycbcr-coeff = <0>;
457 samsung,color-depth = <1>; 516 samsung,color-depth = <1>;
458 samsung,link-rate = <0x0a>; 517 samsung,link-rate = <0x0a>;
459 samsung,lane-count = <4>; 518 samsung,lane-count = <4>;
519 status = "okay";
460 }; 520 };
461 521
462 fimd: fimd@14400000 { 522 fimd: fimd@14400000 {
523 status = "okay";
463 display-timings { 524 display-timings {
464 native-mode = <&timing0>; 525 native-mode = <&timing0>;
465 timing0: timing@0 { 526 timing0: timing@0 {
@@ -477,7 +538,21 @@
477 }; 538 };
478 }; 539 };
479 540
480 rtc { 541 usb_hub_bus {
481 status = "okay"; 542 compatible = "simple-bus";
543 #address-cells = <1>;
544 #size-cells = <0>;
545
546 // SMSC USB3503 connected in hardware only mode as a PHY
547 usb_hub: usb_hub {
548 compatible = "smsc,usb3503a";
549
550 reset-gpios = <&gpx3 5 1>;
551 connect-gpios = <&gpd1 7 1>;
552 };
553 };
554
555 usb@12110000 {
556 usb-phy = <&usb2_phy>;
482 }; 557 };
483}; 558};
diff --git a/arch/arm/boot/dts/exynos5250-smdk5250.dts b/arch/arm/boot/dts/exynos5250-smdk5250.dts
index 49f18c24a576..2538b329f2ce 100644
--- a/arch/arm/boot/dts/exynos5250-smdk5250.dts
+++ b/arch/arm/boot/dts/exynos5250-smdk5250.dts
@@ -250,7 +250,7 @@
250 samsung,vbus-gpio = <&gpx2 6 0>; 250 samsung,vbus-gpio = <&gpx2 6 0>;
251 }; 251 };
252 252
253 dp-controller { 253 dp-controller@145B0000 {
254 samsung,color-space = <0>; 254 samsung,color-space = <0>;
255 samsung,dynamic-range = <0>; 255 samsung,dynamic-range = <0>;
256 samsung,ycbcr-coeff = <0>; 256 samsung,ycbcr-coeff = <0>;
@@ -260,21 +260,25 @@
260 260
261 pinctrl-names = "default"; 261 pinctrl-names = "default";
262 pinctrl-0 = <&dp_hpd>; 262 pinctrl-0 = <&dp_hpd>;
263 status = "okay";
263 }; 264 };
264 265
265 display-timings { 266 fimd@14400000 {
266 native-mode = <&timing0>; 267 status = "okay";
267 timing0: timing@0 { 268 display-timings {
268 /* 1280x800 */ 269 native-mode = <&timing0>;
269 clock-frequency = <50000>; 270 timing0: timing@0 {
270 hactive = <1280>; 271 /* 1280x800 */
271 vactive = <800>; 272 clock-frequency = <50000>;
272 hfront-porch = <4>; 273 hactive = <1280>;
273 hback-porch = <4>; 274 vactive = <800>;
274 hsync-len = <4>; 275 hfront-porch = <4>;
275 vback-porch = <4>; 276 hback-porch = <4>;
276 vfront-porch = <4>; 277 hsync-len = <4>;
277 vsync-len = <4>; 278 vback-porch = <4>;
279 vfront-porch = <4>;
280 vsync-len = <4>;
281 };
278 }; 282 };
279 }; 283 };
280 284
diff --git a/arch/arm/boot/dts/exynos5250-snow.dts b/arch/arm/boot/dts/exynos5250-snow.dts
index e79331dba12d..fd711e245e8d 100644
--- a/arch/arm/boot/dts/exynos5250-snow.dts
+++ b/arch/arm/boot/dts/exynos5250-snow.dts
@@ -171,10 +171,6 @@
171 }; 171 };
172 }; 172 };
173 173
174 rtc {
175 status = "okay";
176 };
177
178 /* 174 /*
179 * On Snow we've got SIP WiFi and so can keep drive strengths low to 175 * On Snow we've got SIP WiFi and so can keep drive strengths low to
180 * reduce EMI. 176 * reduce EMI.
diff --git a/arch/arm/boot/dts/exynos5250.dtsi b/arch/arm/boot/dts/exynos5250.dtsi
index ef57277fc38f..7d7cc777ff7b 100644
--- a/arch/arm/boot/dts/exynos5250.dtsi
+++ b/arch/arm/boot/dts/exynos5250.dtsi
@@ -68,17 +68,17 @@
68 }; 68 };
69 }; 69 };
70 70
71 pd_gsc: gsc-power-domain@0x10044000 { 71 pd_gsc: gsc-power-domain@10044000 {
72 compatible = "samsung,exynos4210-pd"; 72 compatible = "samsung,exynos4210-pd";
73 reg = <0x10044000 0x20>; 73 reg = <0x10044000 0x20>;
74 }; 74 };
75 75
76 pd_mfc: mfc-power-domain@0x10044040 { 76 pd_mfc: mfc-power-domain@10044040 {
77 compatible = "samsung,exynos4210-pd"; 77 compatible = "samsung,exynos4210-pd";
78 reg = <0x10044040 0x20>; 78 reg = <0x10044040 0x20>;
79 }; 79 };
80 80
81 clock: clock-controller@0x10010000 { 81 clock: clock-controller@10010000 {
82 compatible = "samsung,exynos5250-clock"; 82 compatible = "samsung,exynos5250-clock";
83 reg = <0x10010000 0x30000>; 83 reg = <0x10010000 0x30000>;
84 #clock-cells = <1>; 84 #clock-cells = <1>;
@@ -163,16 +163,27 @@
163 clock-names = "watchdog"; 163 clock-names = "watchdog";
164 }; 164 };
165 165
166 g2d@10850000 {
167 compatible = "samsung,exynos5250-g2d";
168 reg = <0x10850000 0x1000>;
169 interrupts = <0 91 0>;
170 clocks = <&clock 345>;
171 clock-names = "fimg2d";
172 };
173
166 codec@11000000 { 174 codec@11000000 {
167 compatible = "samsung,mfc-v6"; 175 compatible = "samsung,mfc-v6";
168 reg = <0x11000000 0x10000>; 176 reg = <0x11000000 0x10000>;
169 interrupts = <0 96 0>; 177 interrupts = <0 96 0>;
170 samsung,power-domain = <&pd_mfc>; 178 samsung,power-domain = <&pd_mfc>;
179 clocks = <&clock 266>;
180 clock-names = "mfc";
171 }; 181 };
172 182
173 rtc { 183 rtc@101E0000 {
174 clocks = <&clock 337>; 184 clocks = <&clock 337>;
175 clock-names = "rtc"; 185 clock-names = "rtc";
186 status = "okay";
176 }; 187 };
177 188
178 tmu@10060000 { 189 tmu@10060000 {
@@ -405,7 +416,7 @@
405 }; 416 };
406 417
407 i2s0: i2s@03830000 { 418 i2s0: i2s@03830000 {
408 compatible = "samsung,i2s-v5"; 419 compatible = "samsung,s5pv210-i2s";
409 reg = <0x03830000 0x100>; 420 reg = <0x03830000 0x100>;
410 dmas = <&pdma0 10 421 dmas = <&pdma0 10
411 &pdma0 9 422 &pdma0 9
@@ -415,16 +426,13 @@
415 <&clock_audss EXYNOS_I2S_BUS>, 426 <&clock_audss EXYNOS_I2S_BUS>,
416 <&clock_audss EXYNOS_SCLK_I2S>; 427 <&clock_audss EXYNOS_SCLK_I2S>;
417 clock-names = "iis", "i2s_opclk0", "i2s_opclk1"; 428 clock-names = "iis", "i2s_opclk0", "i2s_opclk1";
418 samsung,supports-6ch;
419 samsung,supports-rstclr;
420 samsung,supports-secdai;
421 samsung,idma-addr = <0x03000000>; 429 samsung,idma-addr = <0x03000000>;
422 pinctrl-names = "default"; 430 pinctrl-names = "default";
423 pinctrl-0 = <&i2s0_bus>; 431 pinctrl-0 = <&i2s0_bus>;
424 }; 432 };
425 433
426 i2s1: i2s@12D60000 { 434 i2s1: i2s@12D60000 {
427 compatible = "samsung,i2s-v5"; 435 compatible = "samsung,s3c6410-i2s";
428 reg = <0x12D60000 0x100>; 436 reg = <0x12D60000 0x100>;
429 dmas = <&pdma1 12 437 dmas = <&pdma1 12
430 &pdma1 11>; 438 &pdma1 11>;
@@ -436,7 +444,7 @@
436 }; 444 };
437 445
438 i2s2: i2s@12D70000 { 446 i2s2: i2s@12D70000 {
439 compatible = "samsung,i2s-v5"; 447 compatible = "samsung,s3c6410-i2s";
440 reg = <0x12D70000 0x100>; 448 reg = <0x12D70000 0x100>;
441 dmas = <&pdma0 12 449 dmas = <&pdma0 12
442 &pdma0 11>; 450 &pdma0 11>;
@@ -562,7 +570,7 @@
562 }; 570 };
563 }; 571 };
564 572
565 gsc_0: gsc@0x13e00000 { 573 gsc_0: gsc@13e00000 {
566 compatible = "samsung,exynos5-gsc"; 574 compatible = "samsung,exynos5-gsc";
567 reg = <0x13e00000 0x1000>; 575 reg = <0x13e00000 0x1000>;
568 interrupts = <0 85 0>; 576 interrupts = <0 85 0>;
@@ -571,7 +579,7 @@
571 clock-names = "gscl"; 579 clock-names = "gscl";
572 }; 580 };
573 581
574 gsc_1: gsc@0x13e10000 { 582 gsc_1: gsc@13e10000 {
575 compatible = "samsung,exynos5-gsc"; 583 compatible = "samsung,exynos5-gsc";
576 reg = <0x13e10000 0x1000>; 584 reg = <0x13e10000 0x1000>;
577 interrupts = <0 86 0>; 585 interrupts = <0 86 0>;
@@ -580,7 +588,7 @@
580 clock-names = "gscl"; 588 clock-names = "gscl";
581 }; 589 };
582 590
583 gsc_2: gsc@0x13e20000 { 591 gsc_2: gsc@13e20000 {
584 compatible = "samsung,exynos5-gsc"; 592 compatible = "samsung,exynos5-gsc";
585 reg = <0x13e20000 0x1000>; 593 reg = <0x13e20000 0x1000>;
586 interrupts = <0 87 0>; 594 interrupts = <0 87 0>;
@@ -589,7 +597,7 @@
589 clock-names = "gscl"; 597 clock-names = "gscl";
590 }; 598 };
591 599
592 gsc_3: gsc@0x13e30000 { 600 gsc_3: gsc@13e30000 {
593 compatible = "samsung,exynos5-gsc"; 601 compatible = "samsung,exynos5-gsc";
594 reg = <0x13e30000 0x1000>; 602 reg = <0x13e30000 0x1000>;
595 interrupts = <0 88 0>; 603 interrupts = <0 88 0>;
@@ -614,29 +622,32 @@
614 interrupts = <0 94 0>; 622 interrupts = <0 94 0>;
615 }; 623 };
616 624
617 dp-controller { 625 dp_phy: video-phy@10040720 {
618 compatible = "samsung,exynos5-dp"; 626 compatible = "samsung,exynos5250-dp-video-phy";
619 reg = <0x145b0000 0x1000>; 627 reg = <0x10040720 4>;
620 interrupts = <10 3>; 628 #phy-cells = <0>;
621 interrupt-parent = <&combiner>; 629 };
630
631 dp-controller@145B0000 {
622 clocks = <&clock 342>; 632 clocks = <&clock 342>;
623 clock-names = "dp"; 633 clock-names = "dp";
624 #address-cells = <1>; 634 phys = <&dp_phy>;
625 #size-cells = <0>; 635 phy-names = "dp";
626
627 dptx-phy {
628 reg = <0x10040720>;
629 samsung,enable-mask = <1>;
630 };
631 }; 636 };
632 637
633 fimd { 638 fimd@14400000 {
634 compatible = "samsung,exynos5250-fimd";
635 interrupt-parent = <&combiner>;
636 reg = <0x14400000 0x40000>;
637 interrupt-names = "fifo", "vsync", "lcd_sys";
638 interrupts = <18 4>, <18 5>, <18 6>;
639 clocks = <&clock 133>, <&clock 339>; 639 clocks = <&clock 133>, <&clock 339>;
640 clock-names = "sclk_fimd", "fimd"; 640 clock-names = "sclk_fimd", "fimd";
641 }; 641 };
642
643 adc: adc@12D10000 {
644 compatible = "samsung,exynos-adc-v1";
645 reg = <0x12D10000 0x100>, <0x10040718 0x4>;
646 interrupts = <0 106 0>;
647 clocks = <&clock 303>;
648 clock-names = "adc";
649 #io-channel-cells = <1>;
650 io-channel-ranges;
651 status = "disabled";
652 };
642}; 653};
diff --git a/arch/arm/boot/dts/exynos5420-pinctrl.dtsi b/arch/arm/boot/dts/exynos5420-pinctrl.dtsi
index 5848c425ae4d..e695aba5f73c 100644
--- a/arch/arm/boot/dts/exynos5420-pinctrl.dtsi
+++ b/arch/arm/boot/dts/exynos5420-pinctrl.dtsi
@@ -59,6 +59,13 @@
59 interrupt-controller; 59 interrupt-controller;
60 #interrupt-cells = <2>; 60 #interrupt-cells = <2>;
61 }; 61 };
62
63 dp_hpd: dp_hpd {
64 samsung,pins = "gpx0-7";
65 samsung,pin-function = <3>;
66 samsung,pin-pud = <0>;
67 samaung,pin-drv = <0>;
68 };
62 }; 69 };
63 70
64 pinctrl@13410000 { 71 pinctrl@13410000 {
diff --git a/arch/arm/boot/dts/exynos5420-smdk5420.dts b/arch/arm/boot/dts/exynos5420-smdk5420.dts
index 08607df6a180..bafba25ba7c2 100644
--- a/arch/arm/boot/dts/exynos5420-smdk5420.dts
+++ b/arch/arm/boot/dts/exynos5420-smdk5420.dts
@@ -30,4 +30,35 @@
30 clock-frequency = <24000000>; 30 clock-frequency = <24000000>;
31 }; 31 };
32 }; 32 };
33
34 dp-controller@145B0000 {
35 pinctrl-names = "default";
36 pinctrl-0 = <&dp_hpd>;
37 samsung,color-space = <0>;
38 samsung,dynamic-range = <0>;
39 samsung,ycbcr-coeff = <0>;
40 samsung,color-depth = <1>;
41 samsung,link-rate = <0x0a>;
42 samsung,lane-count = <4>;
43 status = "okay";
44 };
45
46 fimd@14400000 {
47 status = "okay";
48 display-timings {
49 native-mode = <&timing0>;
50 timing0: timing@0 {
51 clock-frequency = <50000>;
52 hactive = <2560>;
53 vactive = <1600>;
54 hfront-porch = <48>;
55 hback-porch = <80>;
56 hsync-len = <32>;
57 vback-porch = <16>;
58 vfront-porch = <8>;
59 vsync-len = <6>;
60 };
61 };
62 };
63
33}; 64};
diff --git a/arch/arm/boot/dts/exynos5420.dtsi b/arch/arm/boot/dts/exynos5420.dtsi
index 8c54c4b74f0e..d537cd704e19 100644
--- a/arch/arm/boot/dts/exynos5420.dtsi
+++ b/arch/arm/boot/dts/exynos5420.dtsi
@@ -14,7 +14,10 @@
14 */ 14 */
15 15
16#include "exynos5.dtsi" 16#include "exynos5.dtsi"
17/include/ "exynos5420-pinctrl.dtsi" 17#include "exynos5420-pinctrl.dtsi"
18
19#include <dt-bindings/clk/exynos-audss-clk.h>
20
18/ { 21/ {
19 compatible = "samsung,exynos5420"; 22 compatible = "samsung,exynos5420";
20 23
@@ -59,12 +62,28 @@
59 }; 62 };
60 }; 63 };
61 64
62 clock: clock-controller@0x10010000 { 65 clock: clock-controller@10010000 {
63 compatible = "samsung,exynos5420-clock"; 66 compatible = "samsung,exynos5420-clock";
64 reg = <0x10010000 0x30000>; 67 reg = <0x10010000 0x30000>;
65 #clock-cells = <1>; 68 #clock-cells = <1>;
66 }; 69 };
67 70
71 clock_audss: audss-clock-controller@3810000 {
72 compatible = "samsung,exynos5420-audss-clock";
73 reg = <0x03810000 0x0C>;
74 #clock-cells = <1>;
75 clocks = <&clock 148>;
76 clock-names = "sclk_audio";
77 };
78
79 codec@11000000 {
80 compatible = "samsung,mfc-v7";
81 reg = <0x11000000 0x10000>;
82 interrupts = <0 96 0>;
83 clocks = <&clock 401>;
84 clock-names = "mfc";
85 };
86
68 mct@101C0000 { 87 mct@101C0000 {
69 compatible = "samsung,exynos4210-mct"; 88 compatible = "samsung,exynos4210-mct";
70 reg = <0x101C0000 0x800>; 89 reg = <0x101C0000 0x800>;
@@ -90,6 +109,41 @@
90 }; 109 };
91 }; 110 };
92 111
112 gsc_pd: power-domain@10044000 {
113 compatible = "samsung,exynos4210-pd";
114 reg = <0x10044000 0x20>;
115 };
116
117 isp_pd: power-domain@10044020 {
118 compatible = "samsung,exynos4210-pd";
119 reg = <0x10044020 0x20>;
120 };
121
122 mfc_pd: power-domain@10044060 {
123 compatible = "samsung,exynos4210-pd";
124 reg = <0x10044060 0x20>;
125 };
126
127 disp_pd: power-domain@100440C0 {
128 compatible = "samsung,exynos4210-pd";
129 reg = <0x100440C0 0x20>;
130 };
131
132 mau_pd: power-domain@100440E0 {
133 compatible = "samsung,exynos4210-pd";
134 reg = <0x100440E0 0x20>;
135 };
136
137 g2d_pd: power-domain@10044100 {
138 compatible = "samsung,exynos4210-pd";
139 reg = <0x10044100 0x20>;
140 };
141
142 msc_pd: power-domain@10044120 {
143 compatible = "samsung,exynos4210-pd";
144 reg = <0x10044120 0x20>;
145 };
146
93 pinctrl_0: pinctrl@13400000 { 147 pinctrl_0: pinctrl@13400000 {
94 compatible = "samsung,exynos5420-pinctrl"; 148 compatible = "samsung,exynos5420-pinctrl";
95 reg = <0x13400000 0x1000>; 149 reg = <0x13400000 0x1000>;
@@ -126,6 +180,12 @@
126 interrupts = <0 47 0>; 180 interrupts = <0 47 0>;
127 }; 181 };
128 182
183 rtc@101E0000 {
184 clocks = <&clock 317>;
185 clock-names = "rtc";
186 status = "okay";
187 };
188
129 serial@12C00000 { 189 serial@12C00000 {
130 clocks = <&clock 257>, <&clock 128>; 190 clocks = <&clock 257>, <&clock 128>;
131 clock-names = "uart", "clk_uart_baud0"; 191 clock-names = "uart", "clk_uart_baud0";
@@ -145,4 +205,34 @@
145 clocks = <&clock 260>, <&clock 131>; 205 clocks = <&clock 260>, <&clock 131>;
146 clock-names = "uart", "clk_uart_baud0"; 206 clock-names = "uart", "clk_uart_baud0";
147 }; 207 };
208
209 dp_phy: video-phy@10040728 {
210 compatible = "samsung,exynos5250-dp-video-phy";
211 reg = <0x10040728 4>;
212 #phy-cells = <0>;
213 };
214
215 dp-controller@145B0000 {
216 clocks = <&clock 412>;
217 clock-names = "dp";
218 phys = <&dp_phy>;
219 phy-names = "dp";
220 };
221
222 fimd@14400000 {
223 samsung,power-domain = <&disp_pd>;
224 clocks = <&clock 147>, <&clock 421>;
225 clock-names = "sclk_fimd", "fimd";
226 };
227
228 adc: adc@12D10000 {
229 compatible = "samsung,exynos-adc-v2";
230 reg = <0x12D10000 0x100>, <0x10040720 0x4>;
231 interrupts = <0 106 0>;
232 clocks = <&clock 270>;
233 clock-names = "adc";
234 #io-channel-cells = <1>;
235 io-channel-ranges;
236 status = "disabled";
237 };
148}; 238};
diff --git a/arch/arm/boot/dts/exynos5440.dtsi b/arch/arm/boot/dts/exynos5440.dtsi
index ff7f5d855845..5d6cf4965d6e 100644
--- a/arch/arm/boot/dts/exynos5440.dtsi
+++ b/arch/arm/boot/dts/exynos5440.dtsi
@@ -18,9 +18,12 @@
18 18
19 aliases { 19 aliases {
20 spi0 = &spi_0; 20 spi0 = &spi_0;
21 tmuctrl0 = &tmuctrl_0;
22 tmuctrl1 = &tmuctrl_1;
23 tmuctrl2 = &tmuctrl_2;
21 }; 24 };
22 25
23 clock: clock-controller@0x160000 { 26 clock: clock-controller@160000 {
24 compatible = "samsung,exynos5440-clock"; 27 compatible = "samsung,exynos5440-clock";
25 reg = <0x160000 0x1000>; 28 reg = <0x160000 0x1000>;
26 #clock-cells = <1>; 29 #clock-cells = <1>;
@@ -207,6 +210,30 @@
207 clock-names = "rtc"; 210 clock-names = "rtc";
208 }; 211 };
209 212
213 tmuctrl_0: tmuctrl@160118 {
214 compatible = "samsung,exynos5440-tmu";
215 reg = <0x160118 0x230>, <0x160368 0x10>;
216 interrupts = <0 58 0>;
217 clocks = <&clock 21>;
218 clock-names = "tmu_apbif";
219 };
220
221 tmuctrl_1: tmuctrl@16011C {
222 compatible = "samsung,exynos5440-tmu";
223 reg = <0x16011C 0x230>, <0x160368 0x10>;
224 interrupts = <0 58 0>;
225 clocks = <&clock 21>;
226 clock-names = "tmu_apbif";
227 };
228
229 tmuctrl_2: tmuctrl@160120 {
230 compatible = "samsung,exynos5440-tmu";
231 reg = <0x160120 0x230>, <0x160368 0x10>;
232 interrupts = <0 58 0>;
233 clocks = <&clock 21>;
234 clock-names = "tmu_apbif";
235 };
236
210 sata@210000 { 237 sata@210000 {
211 compatible = "snps,exynos5440-ahci"; 238 compatible = "snps,exynos5440-ahci";
212 reg = <0x210000 0x10000>; 239 reg = <0x210000 0x10000>;
@@ -248,6 +275,7 @@
248 #interrupt-cells = <1>; 275 #interrupt-cells = <1>;
249 interrupt-map-mask = <0 0 0 0>; 276 interrupt-map-mask = <0 0 0 0>;
250 interrupt-map = <0x0 0 &gic 53>; 277 interrupt-map = <0x0 0 &gic 53>;
278 num-lanes = <4>;
251 }; 279 };
252 280
253 pcie@2a0000 { 281 pcie@2a0000 {
@@ -267,5 +295,6 @@
267 #interrupt-cells = <1>; 295 #interrupt-cells = <1>;
268 interrupt-map-mask = <0 0 0 0>; 296 interrupt-map-mask = <0 0 0 0>;
269 interrupt-map = <0x0 0 &gic 56>; 297 interrupt-map = <0x0 0 &gic 56>;
298 num-lanes = <4>;
270 }; 299 };
271}; 300};
diff --git a/arch/arm/boot/dts/imx23-evk.dts b/arch/arm/boot/dts/imx23-evk.dts
index da0588a04131..185c7c01102a 100644
--- a/arch/arm/boot/dts/imx23-evk.dts
+++ b/arch/arm/boot/dts/imx23-evk.dts
@@ -90,6 +90,11 @@
90 }; 90 };
91 91
92 apbx@80040000 { 92 apbx@80040000 {
93 lradc@80050000 {
94 status = "okay";
95 fsl,lradc-touchscreen-wires = <4>;
96 };
97
93 pwm: pwm@80064000 { 98 pwm: pwm@80064000 {
94 pinctrl-names = "default"; 99 pinctrl-names = "default";
95 pinctrl-0 = <&pwm2_pins_a>; 100 pinctrl-0 = <&pwm2_pins_a>;
@@ -107,6 +112,16 @@
107 pinctrl-0 = <&duart_pins_a>; 112 pinctrl-0 = <&duart_pins_a>;
108 status = "okay"; 113 status = "okay";
109 }; 114 };
115
116 usbphy0: usbphy@8007c000 {
117 status = "okay";
118 };
119 };
120 };
121
122 ahb@80080000 {
123 usb0: usb@80080000 {
124 status = "okay";
110 }; 125 };
111 }; 126 };
112 127
diff --git a/arch/arm/boot/dts/imx23-olinuxino.dts b/arch/arm/boot/dts/imx23-olinuxino.dts
index d107c4af321f..fc766ae12e24 100644
--- a/arch/arm/boot/dts/imx23-olinuxino.dts
+++ b/arch/arm/boot/dts/imx23-olinuxino.dts
@@ -69,6 +69,10 @@
69 }; 69 };
70 70
71 apbx@80040000 { 71 apbx@80040000 {
72 lradc@80050000 {
73 status = "okay";
74 };
75
72 duart: serial@80070000 { 76 duart: serial@80070000 {
73 pinctrl-names = "default"; 77 pinctrl-names = "default";
74 pinctrl-0 = <&duart_pins_a>; 78 pinctrl-0 = <&duart_pins_a>;
diff --git a/arch/arm/boot/dts/imx23.dtsi b/arch/arm/boot/dts/imx23.dtsi
index 587ceef81e45..28b5ce289662 100644
--- a/arch/arm/boot/dts/imx23.dtsi
+++ b/arch/arm/boot/dts/imx23.dtsi
@@ -20,6 +20,8 @@
20 gpio2 = &gpio2; 20 gpio2 = &gpio2;
21 serial0 = &auart0; 21 serial0 = &auart0;
22 serial1 = &auart1; 22 serial1 = &auart1;
23 spi0 = &ssp0;
24 spi1 = &ssp1;
23 }; 25 };
24 26
25 cpus { 27 cpus {
@@ -76,23 +78,21 @@
76 #size-cells = <1>; 78 #size-cells = <1>;
77 reg = <0x8000c000 0x2000>, <0x8000a000 0x2000>; 79 reg = <0x8000c000 0x2000>, <0x8000a000 0x2000>;
78 reg-names = "gpmi-nand", "bch"; 80 reg-names = "gpmi-nand", "bch";
79 interrupts = <13>, <56>; 81 interrupts = <56>;
80 interrupt-names = "gpmi-dma", "bch"; 82 interrupt-names = "bch";
81 clocks = <&clks 34>; 83 clocks = <&clks 34>;
82 clock-names = "gpmi_io"; 84 clock-names = "gpmi_io";
83 dmas = <&dma_apbh 4>; 85 dmas = <&dma_apbh 4>;
84 dma-names = "rx-tx"; 86 dma-names = "rx-tx";
85 fsl,gpmi-dma-channel = <4>;
86 status = "disabled"; 87 status = "disabled";
87 }; 88 };
88 89
89 ssp0: ssp@80010000 { 90 ssp0: ssp@80010000 {
90 reg = <0x80010000 0x2000>; 91 reg = <0x80010000 0x2000>;
91 interrupts = <15 14>; 92 interrupts = <15>;
92 clocks = <&clks 33>; 93 clocks = <&clks 33>;
93 dmas = <&dma_apbh 1>; 94 dmas = <&dma_apbh 1>;
94 dma-names = "rx-tx"; 95 dma-names = "rx-tx";
95 fsl,ssp-dma-channel = <1>;
96 status = "disabled"; 96 status = "disabled";
97 }; 97 };
98 98
@@ -366,11 +366,10 @@
366 366
367 ssp1: ssp@80034000 { 367 ssp1: ssp@80034000 {
368 reg = <0x80034000 0x2000>; 368 reg = <0x80034000 0x2000>;
369 interrupts = <2 20>; 369 interrupts = <2>;
370 clocks = <&clks 33>; 370 clocks = <&clks 33>;
371 dmas = <&dma_apbh 2>; 371 dmas = <&dma_apbh 2>;
372 dma-names = "rx-tx"; 372 dma-names = "rx-tx";
373 fsl,ssp-dma-channel = <2>;
374 status = "disabled"; 373 status = "disabled";
375 }; 374 };
376 375
@@ -472,7 +471,7 @@
472 auart0: serial@8006c000 { 471 auart0: serial@8006c000 {
473 compatible = "fsl,imx23-auart"; 472 compatible = "fsl,imx23-auart";
474 reg = <0x8006c000 0x2000>; 473 reg = <0x8006c000 0x2000>;
475 interrupts = <24 25 23>; 474 interrupts = <24>;
476 clocks = <&clks 32>; 475 clocks = <&clks 32>;
477 dmas = <&dma_apbx 6>, <&dma_apbx 7>; 476 dmas = <&dma_apbx 6>, <&dma_apbx 7>;
478 dma-names = "rx", "tx"; 477 dma-names = "rx", "tx";
@@ -482,7 +481,7 @@
482 auart1: serial@8006e000 { 481 auart1: serial@8006e000 {
483 compatible = "fsl,imx23-auart"; 482 compatible = "fsl,imx23-auart";
484 reg = <0x8006e000 0x2000>; 483 reg = <0x8006e000 0x2000>;
485 interrupts = <59 60 58>; 484 interrupts = <59>;
486 clocks = <&clks 32>; 485 clocks = <&clks 32>;
487 dmas = <&dma_apbx 8>, <&dma_apbx 9>; 486 dmas = <&dma_apbx 8>, <&dma_apbx 9>;
488 dma-names = "rx", "tx"; 487 dma-names = "rx", "tx";
diff --git a/arch/arm/boot/dts/imx25.dtsi b/arch/arm/boot/dts/imx25.dtsi
index 701153992c69..737ed5da8f71 100644
--- a/arch/arm/boot/dts/imx25.dtsi
+++ b/arch/arm/boot/dts/imx25.dtsi
@@ -13,19 +13,35 @@
13 13
14/ { 14/ {
15 aliases { 15 aliases {
16 gpio0 = &gpio1;
17 gpio1 = &gpio2;
18 gpio2 = &gpio3;
19 gpio3 = &gpio4;
20 i2c0 = &i2c1;
21 i2c1 = &i2c2;
22 i2c2 = &i2c3;
16 serial0 = &uart1; 23 serial0 = &uart1;
17 serial1 = &uart2; 24 serial1 = &uart2;
18 serial2 = &uart3; 25 serial2 = &uart3;
19 serial3 = &uart4; 26 serial3 = &uart4;
20 serial4 = &uart5; 27 serial4 = &uart5;
21 gpio0 = &gpio1; 28 spi0 = &spi1;
22 gpio1 = &gpio2; 29 spi1 = &spi2;
23 gpio2 = &gpio3; 30 spi2 = &spi3;
24 gpio3 = &gpio4;
25 usb0 = &usbotg; 31 usb0 = &usbotg;
26 usb1 = &usbhost1; 32 usb1 = &usbhost1;
27 }; 33 };
28 34
35 cpus {
36 #address-cells = <0>;
37 #size-cells = <0>;
38
39 cpu {
40 compatible = "arm,arm926ej-s";
41 device_type = "cpu";
42 };
43 };
44
29 asic: asic-interrupt-controller@68000000 { 45 asic: asic-interrupt-controller@68000000 {
30 compatible = "fsl,imx25-asic", "fsl,avic"; 46 compatible = "fsl,imx25-asic", "fsl,avic";
31 interrupt-controller; 47 interrupt-controller;
@@ -377,7 +393,8 @@
377 status = "disabled"; 393 status = "disabled";
378 }; 394 };
379 395
380 lcdc@53fbc000 { 396 lcdc: lcdc@53fbc000 {
397 compatible = "fsl,imx25-fb", "fsl,imx21-fb";
381 reg = <0x53fbc000 0x4000>; 398 reg = <0x53fbc000 0x4000>;
382 interrupts = <39>; 399 interrupts = <39>;
383 clocks = <&clks 103>, <&clks 66>, <&clks 49>; 400 clocks = <&clks 103>, <&clks 66>, <&clks 49>;
@@ -424,6 +441,7 @@
424 reg = <0x53fd4000 0x4000>; 441 reg = <0x53fd4000 0x4000>;
425 clocks = <&clks 112>, <&clks 68>; 442 clocks = <&clks 112>, <&clks 68>;
426 clock-names = "ipg", "ahb"; 443 clock-names = "ipg", "ahb";
444 #dma-cells = <3>;
427 interrupts = <34>; 445 interrupts = <34>;
428 }; 446 };
429 447
@@ -444,6 +462,13 @@
444 interrupts = <26>; 462 interrupts = <26>;
445 }; 463 };
446 464
465 iim: iim@53ff0000 {
466 compatible = "fsl,imx25-iim", "fsl,imx27-iim";
467 reg = <0x53ff0000 0x4000>;
468 interrupts = <19>;
469 clocks = <&clks 99>;
470 };
471
447 usbphy1: usbphy@1 { 472 usbphy1: usbphy@1 {
448 compatible = "nop-usbphy"; 473 compatible = "nop-usbphy";
449 status = "disabled"; 474 status = "disabled";
diff --git a/arch/arm/boot/dts/imx27-apf27dev.dts b/arch/arm/boot/dts/imx27-apf27dev.dts
index 66b8e1c1b0be..2a377ca1881a 100644
--- a/arch/arm/boot/dts/imx27-apf27dev.dts
+++ b/arch/arm/boot/dts/imx27-apf27dev.dts
@@ -53,6 +53,11 @@
53&i2c1 { 53&i2c1 {
54 clock-frequency = <400000>; 54 clock-frequency = <400000>;
55 status = "okay"; 55 status = "okay";
56
57 rtc@68 {
58 compatible = "dallas,ds1374";
59 reg = <0x68>;
60 };
56}; 61};
57 62
58&i2c2 { 63&i2c2 {
diff --git a/arch/arm/boot/dts/imx27-phytec-phycard-s-rdk.dts b/arch/arm/boot/dts/imx27-phytec-phycard-s-rdk.dts
new file mode 100644
index 000000000000..5a31c776513f
--- /dev/null
+++ b/arch/arm/boot/dts/imx27-phytec-phycard-s-rdk.dts
@@ -0,0 +1,93 @@
1/*
2 * Copyright 2012 Markus Pargmann, Pengutronix
3 *
4 * The code contained herein is licensed under the GNU General Public
5 * License. You may obtain a copy of the GNU General Public License
6 * Version 2 or later at the following locations:
7 *
8 * http://www.opensource.org/licenses/gpl-license.html
9 * http://www.gnu.org/copyleft/gpl.html
10 */
11
12#include "imx27-phytec-phycard-s-som.dts"
13
14/ {
15 model = "Phytec pca100 rapid development kit";
16 compatible = "phytec,imx27-pca100-rdk", "phytec,imx27-pca100", "fsl,imx27";
17
18 display: display {
19 model = "Primeview-PD050VL1";
20 native-mode = <&timing0>;
21 bits-per-pixel = <16>; /* non-standard but required */
22 fsl,pcr = <0xf0c88080>; /* non-standard but required */
23 display-timings {
24 timing0: 640x480 {
25 hactive = <640>;
26 vactive = <480>;
27 hback-porch = <112>;
28 hfront-porch = <36>;
29 hsync-len = <32>;
30 vback-porch = <33>;
31 vfront-porch = <33>;
32 vsync-len = <2>;
33 clock-frequency = <25000000>;
34 };
35 };
36 };
37
38 regulators {
39 compatible = "simple-bus";
40
41 reg_3v3: 3v3 {
42 compatible = "regulator-fixed";
43 regulator-name = "3V3";
44 regulator-min-microvolt = <3300000>;
45 regulator-max-microvolt = <3300000>;
46 regulator-always-on;
47 };
48 };
49};
50
51&fb {
52 display = <&display>;
53 status = "okay";
54};
55
56&i2c1 {
57 status = "okay";
58
59 rtc@51 {
60 compatible = "nxp,pcf8563";
61 reg = <0x51>;
62 };
63
64 adc@64 {
65 compatible = "maxim,max1037";
66 vcc-supply = <&reg_3v3>;
67 reg = <0x64>;
68 };
69};
70
71&owire {
72 status = "okay";
73};
74
75&sdhci2 {
76 cd-gpios = <&gpio3 29 0>;
77 status = "okay";
78};
79
80&uart1 {
81 fsl,uart-has-rtscts;
82 status = "okay";
83};
84
85&uart2 {
86 fsl,uart-has-rtscts;
87 status = "okay";
88};
89
90&uart3 {
91 fsl,uart-has-rtscts;
92 status = "okay";
93};
diff --git a/arch/arm/boot/dts/imx27-phytec-phycard-s-som.dts b/arch/arm/boot/dts/imx27-phytec-phycard-s-som.dts
new file mode 100644
index 000000000000..c8d57d1d0743
--- /dev/null
+++ b/arch/arm/boot/dts/imx27-phytec-phycard-s-som.dts
@@ -0,0 +1,44 @@
1/*
2 * Copyright 2012 Sascha Hauer, Uwe Kleine-König, Steffen Trumtrar
3 * and Markus Pargmann, Pengutronix
4 *
5 * The code contained herein is licensed under the GNU General Public
6 * License. You may obtain a copy of the GNU General Public License
7 * Version 2 or later at the following locations:
8 *
9 * http://www.opensource.org/licenses/gpl-license.html
10 * http://www.gnu.org/copyleft/gpl.html
11 */
12
13/dts-v1/;
14#include "imx27.dtsi"
15
16/ {
17 model = "Phytec pca100";
18 compatible = "phytec,imx27-pca100", "fsl,imx27";
19
20 memory {
21 reg = <0xa0000000 0x08000000>; /* 128MB */
22 };
23};
24
25&cspi1 {
26 fsl,spi-num-chipselects = <2>;
27 cs-gpios = <&gpio4 28 0>,
28 <&gpio4 27 0>;
29 status = "okay";
30};
31
32&fec {
33 status = "okay";
34};
35
36&i2c2 {
37 status = "okay";
38
39 at24@52 {
40 compatible = "at,24c32";
41 pagesize = <32>;
42 reg = <0x52>;
43 };
44};
diff --git a/arch/arm/boot/dts/imx27-phytec-phycore-rdk.dts b/arch/arm/boot/dts/imx27-phytec-phycore-rdk.dts
index e7ed9786920a..0fc6551786c6 100644
--- a/arch/arm/boot/dts/imx27-phytec-phycore-rdk.dts
+++ b/arch/arm/boot/dts/imx27-phytec-phycore-rdk.dts
@@ -35,3 +35,16 @@
35 fsl,uart-has-rtscts; 35 fsl,uart-has-rtscts;
36 status = "okay"; 36 status = "okay";
37}; 37};
38
39&weim {
40 can@d4000000 {
41 compatible = "nxp,sja1000";
42 reg = <4 0x00000000 0x00000100>;
43 interrupt-parent = <&gpio5>;
44 interrupts = <19 0x2>;
45 nxp,external-clock-frequency = <16000000>;
46 nxp,tx-output-config = <0x16>;
47 nxp,no-comparator-bypass;
48 fsl,weim-cs-timing = <0x0000dcf6 0x444a0301 0x44443302>;
49 };
50};
diff --git a/arch/arm/boot/dts/imx27-phytec-phycore-som.dts b/arch/arm/boot/dts/imx27-phytec-phycore-som.dts
index f0105651869d..4ec402c38945 100644
--- a/arch/arm/boot/dts/imx27-phytec-phycore-som.dts
+++ b/arch/arm/boot/dts/imx27-phytec-phycore-som.dts
@@ -17,49 +17,22 @@
17 compatible = "phytec,imx27-pcm038", "fsl,imx27"; 17 compatible = "phytec,imx27-pcm038", "fsl,imx27";
18 18
19 memory { 19 memory {
20 reg = <0x0 0x0>; 20 reg = <0xa0000000 0x08000000>;
21 }; 21 };
22};
22 23
23 soc { 24&audmux {
24 aipi@10000000 { /* aipi1 */ 25 status = "okay";
25 serial@1000a000 {
26 status = "okay";
27 };
28
29 i2c@1001d000 {
30 clock-frequency = <400000>;
31 status = "okay";
32 at24@52 {
33 compatible = "at,24c32";
34 pagesize = <32>;
35 reg = <0x52>;
36 };
37 pcf8563@51 {
38 compatible = "nxp,pcf8563";
39 reg = <0x51>;
40 };
41 lm75@4a {
42 compatible = "national,lm75";
43 reg = <0x4a>;
44 };
45 };
46 };
47 26
48 aipi@10020000 { /* aipi2 */ 27 /* SSI0 <=> PINS_4 (MC13783 Audio) */
49 ethernet@1002b000 { 28 ssi0 {
50 phy-reset-gpios = <&gpio3 30 0>; 29 fsl,audmux-port = <0>;
51 status = "okay"; 30 fsl,port-config = <0xcb205000>;
52 };
53 };
54 }; 31 };
55 32
56 nor_flash@c0000000 { 33 pins4 {
57 compatible = "cfi-flash"; 34 fsl,audmux-port = <2>;
58 bank-width = <2>; 35 fsl,port-config = <0x00001000>;
59 reg = <0xc0000000 0x02000000>;
60 linux,mtd-name = "physmap-flash.0";
61 #address-cells = <1>;
62 #size-cells = <1>;
63 }; 36 };
64}; 37};
65 38
@@ -80,28 +53,16 @@
80 fsl,mc13xxx-uses-rtc; 53 fsl,mc13xxx-uses-rtc;
81 54
82 regulators { 55 regulators {
83 sw1a_reg: sw1a { 56 /* SW1A and SW1B joined operation */
57 sw1_reg: sw1a {
84 regulator-min-microvolt = <1200000>; 58 regulator-min-microvolt = <1200000>;
85 regulator-max-microvolt = <1200000>; 59 regulator-max-microvolt = <1520000>;
86 regulator-always-on; 60 regulator-always-on;
87 regulator-boot-on; 61 regulator-boot-on;
88 }; 62 };
89 63
90 sw1b_reg: sw1b { 64 /* SW2A and SW2B joined operation */
91 regulator-min-microvolt = <1200000>; 65 sw2_reg: sw2a {
92 regulator-max-microvolt = <1200000>;
93 regulator-always-on;
94 regulator-boot-on;
95 };
96
97 sw2a_reg: sw2a {
98 regulator-min-microvolt = <1800000>;
99 regulator-max-microvolt = <1800000>;
100 regulator-always-on;
101 regulator-boot-on;
102 };
103
104 sw2b_reg: sw2b {
105 regulator-min-microvolt = <1800000>; 66 regulator-min-microvolt = <1800000>;
106 regulator-max-microvolt = <1800000>; 67 regulator-max-microvolt = <1800000>;
107 regulator-always-on; 68 regulator-always-on;
@@ -172,8 +133,62 @@
172 }; 133 };
173}; 134};
174 135
136&fec {
137 phy-reset-gpios = <&gpio3 30 0>;
138 status = "okay";
139};
140
141&i2c2 {
142 clock-frequency = <400000>;
143 status = "okay";
144
145 at24@52 {
146 compatible = "at,24c32";
147 pagesize = <32>;
148 reg = <0x52>;
149 };
150
151 pcf8563@51 {
152 compatible = "nxp,pcf8563";
153 reg = <0x51>;
154 };
155
156 lm75@4a {
157 compatible = "national,lm75";
158 reg = <0x4a>;
159 };
160};
161
175&nfc { 162&nfc {
176 nand-bus-width = <8>; 163 nand-bus-width = <8>;
177 nand-ecc-mode = "hw"; 164 nand-ecc-mode = "hw";
178 status = "okay"; 165 status = "okay";
179}; 166};
167
168&uart1 {
169 status = "okay";
170};
171
172&weim {
173 status = "okay";
174
175 nor: nor@c0000000 {
176 compatible = "cfi-flash";
177 reg = <0 0x00000000 0x02000000>;
178 bank-width = <2>;
179 linux,mtd-name = "physmap-flash.0";
180 fsl,weim-cs-timing = <0x22c2cf00 0x75000d01 0x00000900>;
181 #address-cells = <1>;
182 #size-cells = <1>;
183 };
184
185 sram: sram@c8000000 {
186 compatible = "mtd-ram";
187 reg = <1 0x00000000 0x00800000>;
188 bank-width = <2>;
189 linux,mtd-name = "mtd-ram.0";
190 fsl,weim-cs-timing = <0x0000d843 0x22252521 0x22220a00>;
191 #address-cells = <1>;
192 #size-cells = <1>;
193 };
194};
diff --git a/arch/arm/boot/dts/imx27.dtsi b/arch/arm/boot/dts/imx27.dtsi
index 0695264ddf1b..b7a1c6d950b9 100644
--- a/arch/arm/boot/dts/imx27.dtsi
+++ b/arch/arm/boot/dts/imx27.dtsi
@@ -13,25 +13,27 @@
13 13
14/ { 14/ {
15 aliases { 15 aliases {
16 serial0 = &uart1;
17 serial1 = &uart2;
18 serial2 = &uart3;
19 serial3 = &uart4;
20 serial4 = &uart5;
21 serial5 = &uart6;
22 gpio0 = &gpio1; 16 gpio0 = &gpio1;
23 gpio1 = &gpio2; 17 gpio1 = &gpio2;
24 gpio2 = &gpio3; 18 gpio2 = &gpio3;
25 gpio3 = &gpio4; 19 gpio3 = &gpio4;
26 gpio4 = &gpio5; 20 gpio4 = &gpio5;
27 gpio5 = &gpio6; 21 gpio5 = &gpio6;
22 i2c0 = &i2c1;
23 i2c1 = &i2c2;
24 serial0 = &uart1;
25 serial1 = &uart2;
26 serial2 = &uart3;
27 serial3 = &uart4;
28 serial4 = &uart5;
29 serial5 = &uart6;
28 spi0 = &cspi1; 30 spi0 = &cspi1;
29 spi1 = &cspi2; 31 spi1 = &cspi2;
30 spi2 = &cspi3; 32 spi2 = &cspi3;
31 }; 33 };
32 34
33 avic: avic-interrupt-controller@e0000000 { 35 aitc: aitc-interrupt-controller@e0000000 {
34 compatible = "fsl,imx27-avic", "fsl,avic"; 36 compatible = "fsl,imx27-aitc", "fsl,avic";
35 interrupt-controller; 37 interrupt-controller;
36 #interrupt-cells = <1>; 38 #interrupt-cells = <1>;
37 reg = <0x10040000 0x1000>; 39 reg = <0x10040000 0x1000>;
@@ -47,11 +49,29 @@
47 }; 49 };
48 }; 50 };
49 51
52 cpus {
53 #size-cells = <0>;
54 #address-cells = <1>;
55
56 cpu: cpu@0 {
57 device_type = "cpu";
58 compatible = "arm,arm926ej-s";
59 operating-points = <
60 /* kHz uV */
61 266000 1300000
62 399000 1450000
63 >;
64 clock-latency = <62500>;
65 clocks = <&clks 18>;
66 voltage-tolerance = <5>;
67 };
68 };
69
50 soc { 70 soc {
51 #address-cells = <1>; 71 #address-cells = <1>;
52 #size-cells = <1>; 72 #size-cells = <1>;
53 compatible = "simple-bus"; 73 compatible = "simple-bus";
54 interrupt-parent = <&avic>; 74 interrupt-parent = <&aitc>;
55 ranges; 75 ranges;
56 76
57 aipi@10000000 { /* AIPI1 */ 77 aipi@10000000 { /* AIPI1 */
@@ -75,7 +95,7 @@
75 compatible = "fsl,imx27-wdt", "fsl,imx21-wdt"; 95 compatible = "fsl,imx27-wdt", "fsl,imx21-wdt";
76 reg = <0x10002000 0x1000>; 96 reg = <0x10002000 0x1000>;
77 interrupts = <27>; 97 interrupts = <27>;
78 clocks = <&clks 0>; 98 clocks = <&clks 74>;
79 }; 99 };
80 100
81 gpt1: timer@10003000 { 101 gpt1: timer@10003000 {
@@ -102,7 +122,7 @@
102 clock-names = "ipg", "per"; 122 clock-names = "ipg", "per";
103 }; 123 };
104 124
105 pwm0: pwm@10006000 { 125 pwm: pwm@10006000 {
106 compatible = "fsl,imx27-pwm"; 126 compatible = "fsl,imx27-pwm";
107 reg = <0x10006000 0x1000>; 127 reg = <0x10006000 0x1000>;
108 interrupts = <23>; 128 interrupts = <23>;
@@ -110,6 +130,21 @@
110 clock-names = "ipg", "per"; 130 clock-names = "ipg", "per";
111 }; 131 };
112 132
133 kpp: kpp@10008000 {
134 compatible = "fsl,imx27-kpp", "fsl,imx21-kpp";
135 reg = <0x10008000 0x1000>;
136 interrupts = <21>;
137 clocks = <&clks 37>;
138 status = "disabled";
139 };
140
141 owire: owire@10009000 {
142 compatible = "fsl,imx27-owire", "fsl,imx21-owire";
143 reg = <0x10009000 0x1000>;
144 clocks = <&clks 35>;
145 status = "disabled";
146 };
147
113 uart1: serial@1000a000 { 148 uart1: serial@1000a000 {
114 compatible = "fsl,imx27-uart", "fsl,imx21-uart"; 149 compatible = "fsl,imx27-uart", "fsl,imx21-uart";
115 reg = <0x1000a000 0x1000>; 150 reg = <0x1000a000 0x1000>;
@@ -152,7 +187,7 @@
152 compatible = "fsl,imx27-cspi"; 187 compatible = "fsl,imx27-cspi";
153 reg = <0x1000e000 0x1000>; 188 reg = <0x1000e000 0x1000>;
154 interrupts = <16>; 189 interrupts = <16>;
155 clocks = <&clks 53>, <&clks 53>; 190 clocks = <&clks 53>, <&clks 60>;
156 clock-names = "ipg", "per"; 191 clock-names = "ipg", "per";
157 status = "disabled"; 192 status = "disabled";
158 }; 193 };
@@ -163,7 +198,7 @@
163 compatible = "fsl,imx27-cspi"; 198 compatible = "fsl,imx27-cspi";
164 reg = <0x1000f000 0x1000>; 199 reg = <0x1000f000 0x1000>;
165 interrupts = <15>; 200 interrupts = <15>;
166 clocks = <&clks 52>, <&clks 52>; 201 clocks = <&clks 52>, <&clks 60>;
167 clock-names = "ipg", "per"; 202 clock-names = "ipg", "per";
168 status = "disabled"; 203 status = "disabled";
169 }; 204 };
@@ -260,13 +295,21 @@
260 #interrupt-cells = <2>; 295 #interrupt-cells = <2>;
261 }; 296 };
262 297
298 audmux: audmux@10016000 {
299 compatible = "fsl,imx27-audmux", "fsl,imx21-audmux";
300 reg = <0x10016000 0x1000>;
301 clocks = <&clks 0>;
302 clock-names = "audmux";
303 status = "disabled";
304 };
305
263 cspi3: cspi@10017000 { 306 cspi3: cspi@10017000 {
264 #address-cells = <1>; 307 #address-cells = <1>;
265 #size-cells = <0>; 308 #size-cells = <0>;
266 compatible = "fsl,imx27-cspi"; 309 compatible = "fsl,imx27-cspi";
267 reg = <0x10017000 0x1000>; 310 reg = <0x10017000 0x1000>;
268 interrupts = <6>; 311 interrupts = <6>;
269 clocks = <&clks 51>, <&clks 51>; 312 clocks = <&clks 51>, <&clks 60>;
270 clock-names = "ipg", "per"; 313 clock-names = "ipg", "per";
271 status = "disabled"; 314 status = "disabled";
272 }; 315 };
@@ -342,6 +385,15 @@
342 reg = <0x10020000 0x20000>; 385 reg = <0x10020000 0x20000>;
343 ranges; 386 ranges;
344 387
388 fb: fb@10021000 {
389 compatible = "fsl,imx27-fb", "fsl,imx21-fb";
390 interrupts = <61>;
391 reg = <0x10021000 0x1000>;
392 clocks = <&clks 36>, <&clks 65>, <&clks 59>;
393 clock-names = "ipg", "ahb", "per";
394 status = "disabled";
395 };
396
345 coda: coda@10023000 { 397 coda: coda@10023000 {
346 compatible = "fsl,imx27-vpu"; 398 compatible = "fsl,imx27-vpu";
347 reg = <0x10023000 0x0200>; 399 reg = <0x10023000 0x0200>;
@@ -351,27 +403,37 @@
351 iram = <&iram>; 403 iram = <&iram>;
352 }; 404 };
353 405
406 sahara2: sahara@10025000 {
407 compatible = "fsl,imx27-sahara";
408 reg = <0x10025000 0x1000>;
409 interrupts = <59>;
410 clocks = <&clks 32>, <&clks 64>;
411 clock-names = "ipg", "ahb";
412 };
413
354 clks: ccm@10027000{ 414 clks: ccm@10027000{
355 compatible = "fsl,imx27-ccm"; 415 compatible = "fsl,imx27-ccm";
356 reg = <0x10027000 0x1000>; 416 reg = <0x10027000 0x1000>;
357 #clock-cells = <1>; 417 #clock-cells = <1>;
358 }; 418 };
359 419
420 iim: iim@10028000 {
421 compatible = "fsl,imx27-iim";
422 reg = <0x10028000 0x1000>;
423 interrupts = <62>;
424 clocks = <&clks 38>;
425 };
426
360 fec: ethernet@1002b000 { 427 fec: ethernet@1002b000 {
361 compatible = "fsl,imx27-fec"; 428 compatible = "fsl,imx27-fec";
362 reg = <0x1002b000 0x4000>; 429 reg = <0x1002b000 0x4000>;
363 interrupts = <50>; 430 interrupts = <50>;
364 clocks = <&clks 48>, <&clks 67>, <&clks 0>; 431 clocks = <&clks 48>, <&clks 67>;
365 clock-names = "ipg", "ahb", "ptp"; 432 clock-names = "ipg", "ahb";
366 status = "disabled"; 433 status = "disabled";
367 }; 434 };
368 }; 435 };
369 436
370 iram: iram@ffff4c00 {
371 compatible = "mmio-sram";
372 reg = <0xffff4c00 0xb400>;
373 };
374
375 nfc: nand@d8000000 { 437 nfc: nand@d8000000 {
376 #address-cells = <1>; 438 #address-cells = <1>;
377 #size-cells = <1>; 439 #size-cells = <1>;
@@ -381,5 +443,27 @@
381 clocks = <&clks 54>; 443 clocks = <&clks 54>;
382 status = "disabled"; 444 status = "disabled";
383 }; 445 };
446
447 weim: weim@d8002000 {
448 #address-cells = <2>;
449 #size-cells = <1>;
450 compatible = "fsl,imx27-weim";
451 reg = <0xd8002000 0x1000>;
452 clocks = <&clks 0>;
453 ranges = <
454 0 0 0xc0000000 0x08000000
455 1 0 0xc8000000 0x08000000
456 2 0 0xd0000000 0x02000000
457 3 0 0xd2000000 0x02000000
458 4 0 0xd4000000 0x02000000
459 5 0 0xd6000000 0x02000000
460 >;
461 status = "disabled";
462 };
463
464 iram: iram@ffff4c00 {
465 compatible = "mmio-sram";
466 reg = <0xffff4c00 0xb400>;
467 };
384 }; 468 };
385}; 469};
diff --git a/arch/arm/boot/dts/imx28-cfa10036.dts b/arch/arm/boot/dts/imx28-cfa10036.dts
index 94c4476972c3..1ec8c94bbac9 100644
--- a/arch/arm/boot/dts/imx28-cfa10036.dts
+++ b/arch/arm/boot/dts/imx28-cfa10036.dts
@@ -23,10 +23,7 @@
23 apb@80000000 { 23 apb@80000000 {
24 apbh@80000000 { 24 apbh@80000000 {
25 pinctrl@80018000 { 25 pinctrl@80018000 {
26 pinctrl-names = "default"; 26 ssd1306_cfa10036: ssd1306-10036@0 {
27 pinctrl-0 = <&hog_pins_cfa10036>;
28
29 hog_pins_cfa10036: hog-10036@0 {
30 reg = <0>; 27 reg = <0>;
31 fsl,pinmux-ids = < 28 fsl,pinmux-ids = <
32 0x2073 /* MX28_PAD_SSP0_D7__GPIO_2_7 */ 29 0x2073 /* MX28_PAD_SSP0_D7__GPIO_2_7 */
@@ -83,6 +80,8 @@
83 80
84 ssd1306: oled@3c { 81 ssd1306: oled@3c {
85 compatible = "solomon,ssd1306fb-i2c"; 82 compatible = "solomon,ssd1306fb-i2c";
83 pinctrl-names = "default";
84 pinctrl-0 = <&ssd1306_cfa10036>;
86 reg = <0x3c>; 85 reg = <0x3c>;
87 reset-gpios = <&gpio2 7 0>; 86 reset-gpios = <&gpio2 7 0>;
88 solomon,height = <32>; 87 solomon,height = <32>;
diff --git a/arch/arm/boot/dts/imx28-cfa10037.dts b/arch/arm/boot/dts/imx28-cfa10037.dts
index c2ef3a3d655e..182b99fe35f3 100644
--- a/arch/arm/boot/dts/imx28-cfa10037.dts
+++ b/arch/arm/boot/dts/imx28-cfa10037.dts
@@ -22,13 +22,19 @@
22 apb@80000000 { 22 apb@80000000 {
23 apbh@80000000 { 23 apbh@80000000 {
24 pinctrl@80018000 { 24 pinctrl@80018000 {
25 pinctrl-names = "default", "default"; 25 usb_pins_cfa10037: usb-10037@0 {
26 pinctrl-1 = <&hog_pins_cfa10037>;
27
28 hog_pins_cfa10037: hog-10037@0 {
29 reg = <0>; 26 reg = <0>;
30 fsl,pinmux-ids = < 27 fsl,pinmux-ids = <
31 0x0073 /* MX28_PAD_GPMI_D7__GPIO_0_7 */ 28 0x0073 /* MX28_PAD_GPMI_D7__GPIO_0_7 */
29 >;
30 fsl,drive-strength = <0>;
31 fsl,voltage = <1>;
32 fsl,pull-up = <0>;
33 };
34
35 mac0_pins_cfa10037: mac0-10037@0 {
36 reg = <0>;
37 fsl,pinmux-ids = <
32 0x2153 /* MX28_PAD_SSP2_D5__GPIO_2_21 */ 38 0x2153 /* MX28_PAD_SSP2_D5__GPIO_2_21 */
33 >; 39 >;
34 fsl,drive-strength = <0>; 40 fsl,drive-strength = <0>;
@@ -56,7 +62,8 @@
56 mac0: ethernet@800f0000 { 62 mac0: ethernet@800f0000 {
57 phy-mode = "rmii"; 63 phy-mode = "rmii";
58 pinctrl-names = "default"; 64 pinctrl-names = "default";
59 pinctrl-0 = <&mac0_pins_a>; 65 pinctrl-0 = <&mac0_pins_a
66 &mac0_pins_cfa10037>;
60 phy-reset-gpios = <&gpio2 21 0>; 67 phy-reset-gpios = <&gpio2 21 0>;
61 phy-reset-duration = <100>; 68 phy-reset-duration = <100>;
62 status = "okay"; 69 status = "okay";
@@ -68,6 +75,8 @@
68 75
69 reg_usb1_vbus: usb1_vbus { 76 reg_usb1_vbus: usb1_vbus {
70 compatible = "regulator-fixed"; 77 compatible = "regulator-fixed";
78 pinctrl-names = "default";
79 pinctrl-0 = <&usb_pins_cfa10037>;
71 regulator-name = "usb1_vbus"; 80 regulator-name = "usb1_vbus";
72 regulator-min-microvolt = <5000000>; 81 regulator-min-microvolt = <5000000>;
73 regulator-max-microvolt = <5000000>; 82 regulator-max-microvolt = <5000000>;
diff --git a/arch/arm/boot/dts/imx28-cfa10049.dts b/arch/arm/boot/dts/imx28-cfa10049.dts
index 04b2f769ffbd..06e4cfaf7dd2 100644
--- a/arch/arm/boot/dts/imx28-cfa10049.dts
+++ b/arch/arm/boot/dts/imx28-cfa10049.dts
@@ -22,32 +22,62 @@
22 apb@80000000 { 22 apb@80000000 {
23 apbh@80000000 { 23 apbh@80000000 {
24 pinctrl@80018000 { 24 pinctrl@80018000 {
25 pinctrl-names = "default", "default"; 25 usb_pins_cfa10049: usb-10049@0 {
26 pinctrl-1 = <&hog_pins_cfa10049
27 &hog_pins_cfa10049_pullup>;
28
29 hog_pins_cfa10049: hog-10049@0 {
30 reg = <0>; 26 reg = <0>;
31 fsl,pinmux-ids = < 27 fsl,pinmux-ids = <
32 0x0073 /* MX28_PAD_GPMI_D7__GPIO_0_7 */ 28 0x0073 /* MX28_PAD_GPMI_D7__GPIO_0_7 */
29 >;
30 fsl,drive-strength = <0>;
31 fsl,voltage = <1>;
32 fsl,pull-up = <0>;
33 };
34
35 i2cmux_pins_cfa10049: i2cmux-10049@0 {
36 reg = <0>;
37 fsl,pinmux-ids = <
33 0x1163 /* MX28_PAD_LCD_D22__GPIO_1_22 */ 38 0x1163 /* MX28_PAD_LCD_D22__GPIO_1_22 */
34 0x1173 /* MX28_PAD_LCD_D22__GPIO_1_23 */ 39 0x1173 /* MX28_PAD_LCD_D22__GPIO_1_23 */
40 >;
41 fsl,drive-strength = <0>;
42 fsl,voltage = <1>;
43 fsl,pull-up = <0>;
44 };
45
46 mac0_pins_cfa10049: mac0-10049@0 {
47 reg = <0>;
48 fsl,pinmux-ids = <
35 0x2153 /* MX28_PAD_SSP2_D5__GPIO_2_21 */ 49 0x2153 /* MX28_PAD_SSP2_D5__GPIO_2_21 */
36 0x3053 /* MX28_PAD_AUART1_TX__GPIO_3_5 */
37 >; 50 >;
38 fsl,drive-strength = <0>; 51 fsl,drive-strength = <0>;
39 fsl,voltage = <1>; 52 fsl,voltage = <1>;
40 fsl,pull-up = <0>; 53 fsl,pull-up = <0>;
41 }; 54 };
42 55
43 hog_pins_cfa10049_pullup: hog-10049-pullup@0 { 56 pca_pins_cfa10049: pca-10049@0 {
44 reg = <0>; 57 reg = <0>;
45 fsl,pinmux-ids = < 58 fsl,pinmux-ids = <
46 0x2133 /* MX28_PAD_SSP2_D3__GPIO_2_19 */ 59 0x2133 /* MX28_PAD_SSP2_D3__GPIO_2_19 */
60 >;
61 fsl,drive-strength = <0>;
62 fsl,voltage = <1>;
63 fsl,pull-up = <1>;
64 };
65
66 rotary_pins_cfa10049: rotary-10049@0 {
67 reg = <0>;
68 fsl,pinmux-ids = <
47 0x3183 /* MX28_PAD_I2C0_SCL__GPIO_3_24 */ 69 0x3183 /* MX28_PAD_I2C0_SCL__GPIO_3_24 */
48 0x3193 /* MX28_PAD_I2C0_SDA__GPIO_3_25 */ 70 0x3193 /* MX28_PAD_I2C0_SDA__GPIO_3_25 */
71 >;
72 fsl,drive-strength = <0>;
73 fsl,voltage = <1>;
74 fsl,pull-up = <1>;
75 };
76
77 rotary_btn_pins_cfa10049: rotary-btn-10049@0 {
78 reg = <0>;
79 fsl,pinmux-ids = <
49 0x31a3 /* MX28_PAD_SAIF_SDATA0__GPIO_3_26 */ 80 0x31a3 /* MX28_PAD_SAIF_SDATA0__GPIO_3_26 */
50 0x31e3 /* MX28_PAD_LCD_RESET__GPIO_3_30 */
51 >; 81 >;
52 fsl,drive-strength = <0>; 82 fsl,drive-strength = <0>;
53 fsl,voltage = <1>; 83 fsl,voltage = <1>;
@@ -60,6 +90,7 @@
60 0x2103 /* MX28_PAD_SSP2_SCK__GPIO_2_16 */ 90 0x2103 /* MX28_PAD_SSP2_SCK__GPIO_2_16 */
61 0x2113 /* MX28_PAD_SSP2_CMD__GPIO_2_17 */ 91 0x2113 /* MX28_PAD_SSP2_CMD__GPIO_2_17 */
62 0x2123 /* MX28_PAD_SSP2_D0__GPIO_2_18 */ 92 0x2123 /* MX28_PAD_SSP2_D0__GPIO_2_18 */
93 0x3053 /* MX28_PAD_AUART1_TX__GPIO_3_5 */
63 >; 94 >;
64 fsl,drive-strength = <1>; 95 fsl,drive-strength = <1>;
65 fsl,voltage = <1>; 96 fsl,voltage = <1>;
@@ -120,6 +151,16 @@
120 fsl,pull-up = <0>; 151 fsl,pull-up = <0>;
121 }; 152 };
122 153
154 lcdif_pins_cfa10049_pullup: lcdif-10049-pullup@0 {
155 reg = <0>;
156 fsl,pinmux-ids = <
157 0x31e3 /* MX28_PAD_LCD_RESET__GPIO_3_30 */
158 >;
159 fsl,drive-strength = <0>;
160 fsl,voltage = <1>;
161 fsl,pull-up = <1>;
162 };
163
123 w1_gpio_pins: w1-gpio@0 { 164 w1_gpio_pins: w1-gpio@0 {
124 reg = <0>; 165 reg = <0>;
125 fsl,pinmux-ids = < 166 fsl,pinmux-ids = <
@@ -134,7 +175,8 @@
134 lcdif@80030000 { 175 lcdif@80030000 {
135 pinctrl-names = "default"; 176 pinctrl-names = "default";
136 pinctrl-0 = <&lcdif_18bit_pins_cfa10049 177 pinctrl-0 = <&lcdif_18bit_pins_cfa10049
137 &lcdif_pins_cfa10049>; 178 &lcdif_pins_cfa10049
179 &lcdif_pins_cfa10049_pullup>;
138 display = <&display>; 180 display = <&display>;
139 status = "okay"; 181 status = "okay";
140 182
@@ -181,6 +223,8 @@
181 compatible = "i2c-mux-gpio"; 223 compatible = "i2c-mux-gpio";
182 #address-cells = <1>; 224 #address-cells = <1>;
183 #size-cells = <0>; 225 #size-cells = <0>;
226 pinctrl-names = "default";
227 pinctrl-0 = <&i2cmux_pins_cfa10049>;
184 mux-gpios = <&gpio1 22 0 &gpio1 23 0>; 228 mux-gpios = <&gpio1 22 0 &gpio1 23 0>;
185 i2c-parent = <&i2c1>; 229 i2c-parent = <&i2c1>;
186 230
@@ -203,6 +247,8 @@
203 247
204 pca9555: pca9555@20 { 248 pca9555: pca9555@20 {
205 compatible = "nxp,pca9555"; 249 compatible = "nxp,pca9555";
250 pinctrl-names = "default";
251 pinctrl-0 = <&pca_pins_cfa10049>;
206 interrupt-parent = <&gpio2>; 252 interrupt-parent = <&gpio2>;
207 interrupts = <19 0x2>; 253 interrupts = <19 0x2>;
208 gpio-controller; 254 gpio-controller;
@@ -239,6 +285,8 @@
239 285
240 reg_usb1_vbus: usb1_vbus { 286 reg_usb1_vbus: usb1_vbus {
241 compatible = "regulator-fixed"; 287 compatible = "regulator-fixed";
288 pinctrl-names = "default";
289 pinctrl-0 = <&usb_pins_cfa10049>;
242 regulator-name = "usb1_vbus"; 290 regulator-name = "usb1_vbus";
243 regulator-min-microvolt = <5000000>; 291 regulator-min-microvolt = <5000000>;
244 regulator-max-microvolt = <5000000>; 292 regulator-max-microvolt = <5000000>;
@@ -250,7 +298,8 @@
250 mac0: ethernet@800f0000 { 298 mac0: ethernet@800f0000 {
251 phy-mode = "rmii"; 299 phy-mode = "rmii";
252 pinctrl-names = "default"; 300 pinctrl-names = "default";
253 pinctrl-0 = <&mac0_pins_a>; 301 pinctrl-0 = <&mac0_pins_a
302 &mac0_pins_cfa10049>;
254 phy-reset-gpios = <&gpio2 21 0>; 303 phy-reset-gpios = <&gpio2 21 0>;
255 phy-reset-duration = <100>; 304 phy-reset-duration = <100>;
256 status = "okay"; 305 status = "okay";
@@ -320,6 +369,8 @@
320 369
321 gpio_keys { 370 gpio_keys {
322 compatible = "gpio-keys"; 371 compatible = "gpio-keys";
372 pinctrl-names = "default";
373 pinctrl-0 = <&rotary_btn_pins_cfa10049>;
323 #address-cells = <1>; 374 #address-cells = <1>;
324 #size-cells = <0>; 375 #size-cells = <0>;
325 376
@@ -333,6 +384,8 @@
333 384
334 rotary { 385 rotary {
335 compatible = "rotary-encoder"; 386 compatible = "rotary-encoder";
387 pinctrl-names = "default";
388 pinctrl-0 = <&rotary_pins_cfa10049>;
336 gpios = <&gpio3 24 1>, <&gpio3 25 1>; 389 gpios = <&gpio3 24 1>, <&gpio3 25 1>;
337 linux,axis = <1>; /* REL_Y */ 390 linux,axis = <1>; /* REL_Y */
338 rotary-encoder,relative-axis; 391 rotary-encoder,relative-axis;
diff --git a/arch/arm/boot/dts/imx28-cfa10055.dts b/arch/arm/boot/dts/imx28-cfa10055.dts
index 158111244122..171bcbe1ec4b 100644
--- a/arch/arm/boot/dts/imx28-cfa10055.dts
+++ b/arch/arm/boot/dts/imx28-cfa10055.dts
@@ -23,36 +23,13 @@
23 apb@80000000 { 23 apb@80000000 {
24 apbh@80000000 { 24 apbh@80000000 {
25 pinctrl@80018000 { 25 pinctrl@80018000 {
26 pinctrl-names = "default", "default";
27 pinctrl-1 = <&hog_pins_cfa10055
28 &hog_pins_cfa10055_pullup>;
29
30 hog_pins_cfa10055: hog-10055@0 {
31 reg = <0>;
32 fsl,pinmux-ids = <
33 0x3053 /* MX28_PAD_AUART1_TX__GPIO_3_5 */
34 >;
35 fsl,drive-strength = <0>;
36 fsl,voltage = <1>;
37 fsl,pull-up = <0>;
38 };
39
40 hog_pins_cfa10055_pullup: hog-10055-pullup@0 {
41 reg = <0>;
42 fsl,pinmux-ids = <
43 0x31e3 /* MX28_PAD_LCD_RESET__GPIO_3_30 */
44 >;
45 fsl,drive-strength = <0>;
46 fsl,voltage = <1>;
47 fsl,pull-up = <1>;
48 };
49
50 spi2_pins_cfa10055: spi2-cfa10055@0 { 26 spi2_pins_cfa10055: spi2-cfa10055@0 {
51 reg = <0>; 27 reg = <0>;
52 fsl,pinmux-ids = < 28 fsl,pinmux-ids = <
53 0x2103 /* MX28_PAD_SSP2_SCK__GPIO_2_16 */ 29 0x2103 /* MX28_PAD_SSP2_SCK__GPIO_2_16 */
54 0x2113 /* MX28_PAD_SSP2_CMD__GPIO_2_17 */ 30 0x2113 /* MX28_PAD_SSP2_CMD__GPIO_2_17 */
55 0x2123 /* MX28_PAD_SSP2_D0__GPIO_2_18 */ 31 0x2123 /* MX28_PAD_SSP2_D0__GPIO_2_18 */
32 0x3053 /* MX28_PAD_AUART1_TX__GPIO_3_5 */
56 >; 33 >;
57 fsl,drive-strength = <1>; 34 fsl,drive-strength = <1>;
58 fsl,voltage = <1>; 35 fsl,voltage = <1>;
@@ -98,12 +75,23 @@
98 fsl,voltage = <1>; 75 fsl,voltage = <1>;
99 fsl,pull-up = <0>; 76 fsl,pull-up = <0>;
100 }; 77 };
78
79 lcdif_pins_cfa10055_pullup: lcdif-10055-pullup@0 {
80 reg = <0>;
81 fsl,pinmux-ids = <
82 0x31e3 /* MX28_PAD_LCD_RESET__GPIO_3_30 */
83 >;
84 fsl,drive-strength = <0>;
85 fsl,voltage = <1>;
86 fsl,pull-up = <1>;
87 };
101 }; 88 };
102 89
103 lcdif@80030000 { 90 lcdif@80030000 {
104 pinctrl-names = "default"; 91 pinctrl-names = "default";
105 pinctrl-0 = <&lcdif_18bit_pins_cfa10055 92 pinctrl-0 = <&lcdif_18bit_pins_cfa10055
106 &lcdif_pins_cfa10055>; 93 &lcdif_pins_cfa10055
94 &lcdif_pins_cfa10055_pullup>;
107 display = <&display>; 95 display = <&display>;
108 status = "okay"; 96 status = "okay";
109 97
diff --git a/arch/arm/boot/dts/imx28-cfa10056.dts b/arch/arm/boot/dts/imx28-cfa10056.dts
new file mode 100644
index 000000000000..b45dd0e4ee57
--- /dev/null
+++ b/arch/arm/boot/dts/imx28-cfa10056.dts
@@ -0,0 +1,119 @@
1/*
2 * Copyright 2013 Free Electrons
3 *
4 * The code contained herein is licensed under the GNU General Public
5 * License. You may obtain a copy of the GNU General Public License
6 * Version 2 or later at the following locations:
7 *
8 * http://www.opensource.org/licenses/gpl-license.html
9 * http://www.gnu.org/copyleft/gpl.html
10 */
11
12/*
13 * The CFA-10055 is an expansion board for the CFA-10036 module and
14 * CFA-10037, thus we need to include the CFA-10037 DTS.
15 */
16/include/ "imx28-cfa10037.dts"
17
18/ {
19 model = "Crystalfontz CFA-10056 Board";
20 compatible = "crystalfontz,cfa10056", "crystalfontz,cfa10037", "crystalfontz,cfa10036", "fsl,imx28";
21
22 apb@80000000 {
23 apbh@80000000 {
24 pinctrl@80018000 {
25 spi2_pins_cfa10056: spi2-cfa10056@0 {
26 reg = <0>;
27 fsl,pinmux-ids = <
28 0x2103 /* MX28_PAD_SSP2_SCK__GPIO_2_16 */
29 0x2113 /* MX28_PAD_SSP2_CMD__GPIO_2_17 */
30 0x2123 /* MX28_PAD_SSP2_D0__GPIO_2_18 */
31 0x3053 /* MX28_PAD_AUART1_TX__GPIO_3_5 */
32 >;
33 fsl,drive-strength = <1>;
34 fsl,voltage = <1>;
35 fsl,pull-up = <1>;
36 };
37
38 lcdif_pins_cfa10056: lcdif-10056@0 {
39 reg = <0>;
40 fsl,pinmux-ids = <
41 0x1181 /* MX28_PAD_LCD_RD_E__LCD_VSYNC */
42 0x1191 /* MX28_PAD_LCD_WR_RWN__LCD_HSYNC */
43 0x11a1 /* MX28_PAD_LCD_RS__LCD_DOTCLK */
44 0x11b1 /* MX28_PAD_LCD_CS__LCD_ENABLE */
45 >;
46 fsl,drive-strength = <0>;
47 fsl,voltage = <1>;
48 fsl,pull-up = <0>;
49 };
50
51 lcdif_pins_cfa10056_pullup: lcdif-10056-pullup@0 {
52 reg = <0>;
53 fsl,pinmux-ids = <
54 0x31e3 /* MX28_PAD_LCD_RESET__GPIO_3_30 */
55 >;
56 fsl,drive-strength = <0>;
57 fsl,voltage = <1>;
58 fsl,pull-up = <1>;
59 };
60 };
61
62 lcdif@80030000 {
63 pinctrl-names = "default";
64 pinctrl-0 = <&lcdif_24bit_pins_a
65 &lcdif_pins_cfa10056
66 &lcdif_pins_cfa10056_pullup >;
67 display = <&display>;
68 status = "okay";
69
70 display: display {
71 bits-per-pixel = <32>;
72 bus-width = <24>;
73
74 display-timings {
75 native-mode = <&timing0>;
76 timing0: timing0 {
77 clock-frequency = <32000000>;
78 hactive = <480>;
79 vactive = <800>;
80 hback-porch = <2>;
81 hfront-porch = <2>;
82 vback-porch = <2>;
83 vfront-porch = <2>;
84 hsync-len = <5>;
85 vsync-len = <5>;
86 hsync-active = <0>;
87 vsync-active = <0>;
88 de-active = <1>;
89 pixelclk-active = <1>;
90 };
91 };
92 };
93 };
94 };
95 };
96
97 spi2 {
98 compatible = "spi-gpio";
99 pinctrl-names = "default";
100 pinctrl-0 = <&spi2_pins_cfa10056>;
101 status = "okay";
102 gpio-sck = <&gpio2 16 0>;
103 gpio-mosi = <&gpio2 17 0>;
104 gpio-miso = <&gpio2 18 0>;
105 cs-gpios = <&gpio3 5 0>;
106 num-chipselects = <1>;
107 #address-cells = <1>;
108 #size-cells = <0>;
109
110 hx8369: hx8369@0 {
111 compatible = "himax,hx8369a", "himax,hx8369";
112 reg = <0>;
113 spi-max-frequency = <100000>;
114 spi-cpol;
115 spi-cpha;
116 gpios-reset = <&gpio3 30 0>;
117 };
118 };
119};
diff --git a/arch/arm/boot/dts/imx28-cfa10057.dts b/arch/arm/boot/dts/imx28-cfa10057.dts
index 2da713cdb42a..0333c0532f28 100644
--- a/arch/arm/boot/dts/imx28-cfa10057.dts
+++ b/arch/arm/boot/dts/imx28-cfa10057.dts
@@ -23,35 +23,16 @@
23 apb@80000000 { 23 apb@80000000 {
24 apbh@80000000 { 24 apbh@80000000 {
25 pinctrl@80018000 { 25 pinctrl@80018000 {
26 pinctrl-names = "default", "default"; 26 usb_pins_cfa10057: usb-10057@0 {
27 pinctrl-1 = <&hog_pins_cfa10057
28 &hog_pins_cfa10057_pullup>;
29
30 hog_pins_cfa10057: hog-10057@0 {
31 reg = <0>; 27 reg = <0>;
32 fsl,pinmux-ids = < 28 fsl,pinmux-ids = <
33 0x0073 /* MX28_PAD_GPMI_D7__GPIO_0_7 */ 29 0x0073 /* MX28_PAD_GPMI_D7__GPIO_0_7 */
34 0x3053 /* MX28_PAD_AUART1_TX__GPIO_3_5 */
35 >; 30 >;
36 fsl,drive-strength = <0>; 31 fsl,drive-strength = <0>;
37 fsl,voltage = <1>; 32 fsl,voltage = <1>;
38 fsl,pull-up = <0>; 33 fsl,pull-up = <0>;
39 }; 34 };
40 35
41 hog_pins_cfa10057_pullup: hog-10057-pullup@0 {
42 reg = <0>;
43 fsl,pinmux-ids = <
44 0x2133 /* MX28_PAD_SSP2_D3__GPIO_2_19 */
45 0x3183 /* MX28_PAD_I2C0_SCL__GPIO_3_24 */
46 0x3193 /* MX28_PAD_I2C0_SDA__GPIO_3_25 */
47 0x31a3 /* MX28_PAD_SAIF_SDATA0__GPIO_3_26 */
48 0x31e3 /* MX28_PAD_LCD_RESET__GPIO_3_30 */
49 >;
50 fsl,drive-strength = <0>;
51 fsl,voltage = <1>;
52 fsl,pull-up = <1>;
53 };
54
55 lcdif_18bit_pins_cfa10057: lcdif-18bit@0 { 36 lcdif_18bit_pins_cfa10057: lcdif-18bit@0 {
56 reg = <0>; 37 reg = <0>;
57 fsl,pinmux-ids = < 38 fsl,pinmux-ids = <
@@ -164,6 +145,8 @@
164 145
165 reg_usb1_vbus: usb1_vbus { 146 reg_usb1_vbus: usb1_vbus {
166 compatible = "regulator-fixed"; 147 compatible = "regulator-fixed";
148 pinctrl-names = "default";
149 pinctrl-0 = <&usb_pins_cfa10057>;
167 regulator-name = "usb1_vbus"; 150 regulator-name = "usb1_vbus";
168 regulator-min-microvolt = <5000000>; 151 regulator-min-microvolt = <5000000>;
169 regulator-max-microvolt = <5000000>; 152 regulator-max-microvolt = <5000000>;
diff --git a/arch/arm/boot/dts/imx28-cfa10058.dts b/arch/arm/boot/dts/imx28-cfa10058.dts
new file mode 100644
index 000000000000..64c64c55a82a
--- /dev/null
+++ b/arch/arm/boot/dts/imx28-cfa10058.dts
@@ -0,0 +1,141 @@
1/*
2 * Copyright 2013 Crystalfontz America, Inc.
3 * Copyright 2013 Free Electrons
4 *
5 * The code contained herein is licensed under the GNU General Public
6 * License. You may obtain a copy of the GNU General Public License
7 * Version 2 or later at the following locations:
8 *
9 * http://www.opensource.org/licenses/gpl-license.html
10 * http://www.gnu.org/copyleft/gpl.html
11 */
12
13/*
14 * The CFA-10058 is an expansion board for the CFA-10036 module, thus we
15 * need to include the CFA-10036 DTS.
16 */
17/include/ "imx28-cfa10036.dts"
18
19/ {
20 model = "Crystalfontz CFA-10058 Board";
21 compatible = "crystalfontz,cfa10058", "crystalfontz,cfa10036", "fsl,imx28";
22
23 apb@80000000 {
24 apbh@80000000 {
25 pinctrl@80018000 {
26 usb_pins_cfa10058: usb-10058@0 {
27 reg = <0>;
28 fsl,pinmux-ids = <
29 0x0073 /* MX28_PAD_GPMI_D7__GPIO_0_7 */
30 >;
31 fsl,drive-strength = <0>;
32 fsl,voltage = <1>;
33 fsl,pull-up = <0>;
34 };
35
36 lcdif_pins_cfa10058: lcdif-10058@0 {
37 reg = <0>;
38 fsl,pinmux-ids = <
39 0x1181 /* MX28_PAD_LCD_RD_E__LCD_VSYNC */
40 0x1191 /* MX28_PAD_LCD_WR_RWN__LCD_HSYNC */
41 0x11a1 /* MX28_PAD_LCD_RS__LCD_DOTCLK */
42 0x11b1 /* MX28_PAD_LCD_CS__LCD_ENABLE */
43 >;
44 fsl,drive-strength = <0>;
45 fsl,voltage = <1>;
46 fsl,pull-up = <0>;
47 };
48 };
49
50 lcdif@80030000 {
51 pinctrl-names = "default";
52 pinctrl-0 = <&lcdif_24bit_pins_a
53 &lcdif_pins_cfa10058>;
54 display = <&display>;
55 status = "okay";
56
57 display: display {
58 bits-per-pixel = <32>;
59 bus-width = <24>;
60
61 display-timings {
62 native-mode = <&timing0>;
63 timing0: timing0 {
64 clock-frequency = <30000000>;
65 hactive = <800>;
66 vactive = <480>;
67 hback-porch = <40>;
68 hfront-porch = <40>;
69 vback-porch = <13>;
70 vfront-porch = <29>;
71 hsync-len = <8>;
72 vsync-len = <8>;
73 hsync-active = <0>;
74 vsync-active = <0>;
75 de-active = <1>;
76 pixelclk-active = <1>;
77 };
78 };
79 };
80 };
81 };
82
83 apbx@80040000 {
84 lradc@80050000 {
85 fsl,lradc-touchscreen-wires = <4>;
86 status = "okay";
87 };
88
89 pwm: pwm@80064000 {
90 pinctrl-names = "default";
91 pinctrl-0 = <&pwm3_pins_b>;
92 status = "okay";
93 };
94
95 usbphy1: usbphy@8007e000 {
96 status = "okay";
97 };
98 };
99 };
100
101 ahb@80080000 {
102 usb1: usb@80090000 {
103 vbus-supply = <&reg_usb1_vbus>;
104 pinctrl-0 = <&usbphy1_pins_a>;
105 pinctrl-names = "default";
106 status = "okay";
107 };
108 };
109
110 regulators {
111 compatible = "simple-bus";
112
113 reg_usb1_vbus: usb1_vbus {
114 pinctrl-names = "default";
115 pinctrl-0 = <&usb_pins_cfa10058>;
116 compatible = "regulator-fixed";
117 regulator-name = "usb1_vbus";
118 regulator-min-microvolt = <5000000>;
119 regulator-max-microvolt = <5000000>;
120 gpio = <&gpio0 7 1>;
121 };
122 };
123
124 ahb@80080000 {
125 mac0: ethernet@800f0000 {
126 phy-mode = "rmii";
127 pinctrl-names = "default";
128 pinctrl-0 = <&mac0_pins_a>;
129 phy-reset-gpios = <&gpio2 21 0>;
130 phy-reset-duration = <100>;
131 status = "okay";
132 };
133 };
134
135 backlight {
136 compatible = "pwm-backlight";
137 pwms = <&pwm 3 5000000>;
138 brightness-levels = <0 4 8 16 32 64 128 255>;
139 default-brightness-level = <6>;
140 };
141};
diff --git a/arch/arm/boot/dts/imx28-evk.dts b/arch/arm/boot/dts/imx28-evk.dts
index e035f4664b97..15715d921d14 100644
--- a/arch/arm/boot/dts/imx28-evk.dts
+++ b/arch/arm/boot/dts/imx28-evk.dts
@@ -220,6 +220,7 @@
220 auart0: serial@8006a000 { 220 auart0: serial@8006a000 {
221 pinctrl-names = "default"; 221 pinctrl-names = "default";
222 pinctrl-0 = <&auart0_pins_a>; 222 pinctrl-0 = <&auart0_pins_a>;
223 fsl,uart-has-rtscts;
223 status = "okay"; 224 status = "okay";
224 }; 225 };
225 226
diff --git a/arch/arm/boot/dts/imx28-m28evk.dts b/arch/arm/boot/dts/imx28-m28evk.dts
index 44d9da57736e..0d322a2bebaf 100644
--- a/arch/arm/boot/dts/imx28-m28evk.dts
+++ b/arch/arm/boot/dts/imx28-m28evk.dts
@@ -235,6 +235,12 @@
235 pinctrl-0 = <&auart2_2pins_b>; 235 pinctrl-0 = <&auart2_2pins_b>;
236 status = "okay"; 236 status = "okay";
237 }; 237 };
238
239 pwm: pwm@80064000 {
240 pinctrl-names = "default";
241 pinctrl-0 = <&pwm4_pins_a>;
242 status = "okay";
243 };
238 }; 244 };
239 }; 245 };
240 246
@@ -270,6 +276,13 @@
270 }; 276 };
271 }; 277 };
272 278
279 backlight {
280 compatible = "pwm-backlight";
281 pwms = <&pwm 4 5000000>;
282 brightness-levels = <0 4 8 16 32 64 128 255>;
283 default-brightness-level = <6>;
284 };
285
273 regulators { 286 regulators {
274 compatible = "simple-bus"; 287 compatible = "simple-bus";
275 288
diff --git a/arch/arm/boot/dts/imx28.dtsi b/arch/arm/boot/dts/imx28.dtsi
index 9524a0571281..7363fded95ee 100644
--- a/arch/arm/boot/dts/imx28.dtsi
+++ b/arch/arm/boot/dts/imx28.dtsi
@@ -15,6 +15,8 @@
15 interrupt-parent = <&icoll>; 15 interrupt-parent = <&icoll>;
16 16
17 aliases { 17 aliases {
18 ethernet0 = &mac0;
19 ethernet1 = &mac1;
18 gpio0 = &gpio0; 20 gpio0 = &gpio0;
19 gpio1 = &gpio1; 21 gpio1 = &gpio1;
20 gpio2 = &gpio2; 22 gpio2 = &gpio2;
@@ -27,8 +29,8 @@
27 serial2 = &auart2; 29 serial2 = &auart2;
28 serial3 = &auart3; 30 serial3 = &auart3;
29 serial4 = &auart4; 31 serial4 = &auart4;
30 ethernet0 = &mac0; 32 spi0 = &ssp1;
31 ethernet1 = &mac1; 33 spi1 = &ssp2;
32 }; 34 };
33 35
34 cpus { 36 cpus {
@@ -62,9 +64,9 @@
62 reg = <0x80000000 0x2000>; 64 reg = <0x80000000 0x2000>;
63 }; 65 };
64 66
65 hsadc@80002000 { 67 hsadc: hsadc@80002000 {
66 reg = <0x80002000 0x2000>; 68 reg = <0x80002000 0x2000>;
67 interrupts = <13 87>; 69 interrupts = <13>;
68 dmas = <&dma_apbh 12>; 70 dmas = <&dma_apbh 12>;
69 dma-names = "rx"; 71 dma-names = "rx";
70 status = "disabled"; 72 status = "disabled";
@@ -86,25 +88,24 @@
86 clocks = <&clks 25>; 88 clocks = <&clks 25>;
87 }; 89 };
88 90
89 perfmon@80006000 { 91 perfmon: perfmon@80006000 {
90 reg = <0x80006000 0x800>; 92 reg = <0x80006000 0x800>;
91 interrupts = <27>; 93 interrupts = <27>;
92 status = "disabled"; 94 status = "disabled";
93 }; 95 };
94 96
95 gpmi-nand@8000c000 { 97 gpmi: gpmi-nand@8000c000 {
96 compatible = "fsl,imx28-gpmi-nand"; 98 compatible = "fsl,imx28-gpmi-nand";
97 #address-cells = <1>; 99 #address-cells = <1>;
98 #size-cells = <1>; 100 #size-cells = <1>;
99 reg = <0x8000c000 0x2000>, <0x8000a000 0x2000>; 101 reg = <0x8000c000 0x2000>, <0x8000a000 0x2000>;
100 reg-names = "gpmi-nand", "bch"; 102 reg-names = "gpmi-nand", "bch";
101 interrupts = <88>, <41>; 103 interrupts = <41>;
102 interrupt-names = "gpmi-dma", "bch"; 104 interrupt-names = "bch";
103 clocks = <&clks 50>; 105 clocks = <&clks 50>;
104 clock-names = "gpmi_io"; 106 clock-names = "gpmi_io";
105 dmas = <&dma_apbh 4>; 107 dmas = <&dma_apbh 4>;
106 dma-names = "rx-tx"; 108 dma-names = "rx-tx";
107 fsl,gpmi-dma-channel = <4>;
108 status = "disabled"; 109 status = "disabled";
109 }; 110 };
110 111
@@ -112,11 +113,10 @@
112 #address-cells = <1>; 113 #address-cells = <1>;
113 #size-cells = <0>; 114 #size-cells = <0>;
114 reg = <0x80010000 0x2000>; 115 reg = <0x80010000 0x2000>;
115 interrupts = <96 82>; 116 interrupts = <96>;
116 clocks = <&clks 46>; 117 clocks = <&clks 46>;
117 dmas = <&dma_apbh 0>; 118 dmas = <&dma_apbh 0>;
118 dma-names = "rx-tx"; 119 dma-names = "rx-tx";
119 fsl,ssp-dma-channel = <0>;
120 status = "disabled"; 120 status = "disabled";
121 }; 121 };
122 122
@@ -124,11 +124,10 @@
124 #address-cells = <1>; 124 #address-cells = <1>;
125 #size-cells = <0>; 125 #size-cells = <0>;
126 reg = <0x80012000 0x2000>; 126 reg = <0x80012000 0x2000>;
127 interrupts = <97 83>; 127 interrupts = <97>;
128 clocks = <&clks 47>; 128 clocks = <&clks 47>;
129 dmas = <&dma_apbh 1>; 129 dmas = <&dma_apbh 1>;
130 dma-names = "rx-tx"; 130 dma-names = "rx-tx";
131 fsl,ssp-dma-channel = <1>;
132 status = "disabled"; 131 status = "disabled";
133 }; 132 };
134 133
@@ -136,11 +135,10 @@
136 #address-cells = <1>; 135 #address-cells = <1>;
137 #size-cells = <0>; 136 #size-cells = <0>;
138 reg = <0x80014000 0x2000>; 137 reg = <0x80014000 0x2000>;
139 interrupts = <98 84>; 138 interrupts = <98>;
140 clocks = <&clks 48>; 139 clocks = <&clks 48>;
141 dmas = <&dma_apbh 2>; 140 dmas = <&dma_apbh 2>;
142 dma-names = "rx-tx"; 141 dma-names = "rx-tx";
143 fsl,ssp-dma-channel = <2>;
144 status = "disabled"; 142 status = "disabled";
145 }; 143 };
146 144
@@ -148,15 +146,14 @@
148 #address-cells = <1>; 146 #address-cells = <1>;
149 #size-cells = <0>; 147 #size-cells = <0>;
150 reg = <0x80016000 0x2000>; 148 reg = <0x80016000 0x2000>;
151 interrupts = <99 85>; 149 interrupts = <99>;
152 clocks = <&clks 49>; 150 clocks = <&clks 49>;
153 dmas = <&dma_apbh 3>; 151 dmas = <&dma_apbh 3>;
154 dma-names = "rx-tx"; 152 dma-names = "rx-tx";
155 fsl,ssp-dma-channel = <3>;
156 status = "disabled"; 153 status = "disabled";
157 }; 154 };
158 155
159 pinctrl@80018000 { 156 pinctrl: pinctrl@80018000 {
160 #address-cells = <1>; 157 #address-cells = <1>;
161 #size-cells = <0>; 158 #size-cells = <0>;
162 compatible = "fsl,imx28-pinctrl", "simple-bus"; 159 compatible = "fsl,imx28-pinctrl", "simple-bus";
@@ -521,6 +518,18 @@
521 fsl,pull-up = <1>; 518 fsl,pull-up = <1>;
522 }; 519 };
523 520
521 saif0_pins_b: saif0@1 {
522 reg = <1>;
523 fsl,pinmux-ids = <
524 0x3150 /* MX28_PAD_SAIF0_LRCLK__SAIF0_LRCLK */
525 0x3160 /* MX28_PAD_SAIF0_BITCLK__SAIF0_BITCLK */
526 0x3170 /* MX28_PAD_SAIF0_SDATA0__SAIF0_SDATA0 */
527 >;
528 fsl,drive-strength = <2>;
529 fsl,voltage = <1>;
530 fsl,pull-up = <1>;
531 };
532
524 saif1_pins_a: saif1@0 { 533 saif1_pins_a: saif1@0 {
525 reg = <0>; 534 reg = <0>;
526 fsl,pinmux-ids = < 535 fsl,pinmux-ids = <
@@ -639,6 +648,19 @@
639 fsl,pull-up = <0>; 648 fsl,pull-up = <0>;
640 }; 649 };
641 650
651 lcdif_sync_pins_a: lcdif-sync@0 {
652 reg = <0>;
653 fsl,pinmux-ids = <
654 0x11a1 /* MX28_PAD_LCD_RS__LCD_DOTCLK */
655 0x11b1 /* MX28_PAD_LCD_CS__LCD_ENABLE */
656 0x1181 /* MX28_PAD_LCD_RD_E__LCD_VSYNC */
657 0x1191 /* MX28_PAD_LCD_WR_RWN__LCD_HSYNC */
658 >;
659 fsl,drive-strength = <0>;
660 fsl,voltage = <1>;
661 fsl,pull-up = <0>;
662 };
663
642 can0_pins_a: can0@0 { 664 can0_pins_a: can0@0 {
643 reg = <0>; 665 reg = <0>;
644 fsl,pinmux-ids = < 666 fsl,pinmux-ids = <
@@ -674,6 +696,21 @@
674 fsl,pull-up = <1>; 696 fsl,pull-up = <1>;
675 }; 697 };
676 698
699 spi3_pins_a: spi3@0 {
700 reg = <0>;
701 fsl,pinmux-ids = <
702 0x3082 /* MX28_PAD_AUART2_RX__SSP3_D4 */
703 0x3092 /* MX28_PAD_AUART2_TX__SSP3_D5 */
704 0x2180 /* MX28_PAD_SSP3_SCK__SSP3_SCK */
705 0x2190 /* MX28_PAD_SSP3_MOSI__SSP3_CMD */
706 0x21A0 /* MX28_PAD_SSP3_MISO__SSP3_D0 */
707 0x21B0 /* MX28_PAD_SSP3_SS0__SSP3_D3 */
708 >;
709 fsl,drive-strength = <1>;
710 fsl,voltage = <1>;
711 fsl,pull-up = <0>;
712 };
713
677 usbphy0_pins_a: usbphy0@0 { 714 usbphy0_pins_a: usbphy0@0 {
678 reg = <0>; 715 reg = <0>;
679 fsl,pinmux-ids = < 716 fsl,pinmux-ids = <
@@ -705,14 +742,14 @@
705 }; 742 };
706 }; 743 };
707 744
708 digctl@8001c000 { 745 digctl: digctl@8001c000 {
709 compatible = "fsl,imx28-digctl", "fsl,imx23-digctl"; 746 compatible = "fsl,imx28-digctl", "fsl,imx23-digctl";
710 reg = <0x8001c000 0x2000>; 747 reg = <0x8001c000 0x2000>;
711 interrupts = <89>; 748 interrupts = <89>;
712 status = "disabled"; 749 status = "disabled";
713 }; 750 };
714 751
715 etm@80022000 { 752 etm: etm@80022000 {
716 reg = <0x80022000 0x2000>; 753 reg = <0x80022000 0x2000>;
717 status = "disabled"; 754 status = "disabled";
718 }; 755 };
@@ -733,19 +770,19 @@
733 clocks = <&clks 26>; 770 clocks = <&clks 26>;
734 }; 771 };
735 772
736 dcp@80028000 { 773 dcp: dcp@80028000 {
737 reg = <0x80028000 0x2000>; 774 reg = <0x80028000 0x2000>;
738 interrupts = <52 53 54>; 775 interrupts = <52 53 54>;
739 compatible = "fsl-dcp"; 776 compatible = "fsl-dcp";
740 }; 777 };
741 778
742 pxp@8002a000 { 779 pxp: pxp@8002a000 {
743 reg = <0x8002a000 0x2000>; 780 reg = <0x8002a000 0x2000>;
744 interrupts = <39>; 781 interrupts = <39>;
745 status = "disabled"; 782 status = "disabled";
746 }; 783 };
747 784
748 ocotp@8002c000 { 785 ocotp: ocotp@8002c000 {
749 compatible = "fsl,ocotp"; 786 compatible = "fsl,ocotp";
750 reg = <0x8002c000 0x2000>; 787 reg = <0x8002c000 0x2000>;
751 status = "disabled"; 788 status = "disabled";
@@ -756,10 +793,10 @@
756 status = "disabled"; 793 status = "disabled";
757 }; 794 };
758 795
759 lcdif@80030000 { 796 lcdif: lcdif@80030000 {
760 compatible = "fsl,imx28-lcdif"; 797 compatible = "fsl,imx28-lcdif";
761 reg = <0x80030000 0x2000>; 798 reg = <0x80030000 0x2000>;
762 interrupts = <38 86>; 799 interrupts = <38>;
763 clocks = <&clks 55>; 800 clocks = <&clks 55>;
764 dmas = <&dma_apbh 13>; 801 dmas = <&dma_apbh 13>;
765 dma-names = "rx"; 802 dma-names = "rx";
@@ -784,41 +821,41 @@
784 status = "disabled"; 821 status = "disabled";
785 }; 822 };
786 823
787 simdbg@8003c000 { 824 simdbg: simdbg@8003c000 {
788 reg = <0x8003c000 0x200>; 825 reg = <0x8003c000 0x200>;
789 status = "disabled"; 826 status = "disabled";
790 }; 827 };
791 828
792 simgpmisel@8003c200 { 829 simgpmisel: simgpmisel@8003c200 {
793 reg = <0x8003c200 0x100>; 830 reg = <0x8003c200 0x100>;
794 status = "disabled"; 831 status = "disabled";
795 }; 832 };
796 833
797 simsspsel@8003c300 { 834 simsspsel: simsspsel@8003c300 {
798 reg = <0x8003c300 0x100>; 835 reg = <0x8003c300 0x100>;
799 status = "disabled"; 836 status = "disabled";
800 }; 837 };
801 838
802 simmemsel@8003c400 { 839 simmemsel: simmemsel@8003c400 {
803 reg = <0x8003c400 0x100>; 840 reg = <0x8003c400 0x100>;
804 status = "disabled"; 841 status = "disabled";
805 }; 842 };
806 843
807 gpiomon@8003c500 { 844 gpiomon: gpiomon@8003c500 {
808 reg = <0x8003c500 0x100>; 845 reg = <0x8003c500 0x100>;
809 status = "disabled"; 846 status = "disabled";
810 }; 847 };
811 848
812 simenet@8003c700 { 849 simenet: simenet@8003c700 {
813 reg = <0x8003c700 0x100>; 850 reg = <0x8003c700 0x100>;
814 status = "disabled"; 851 status = "disabled";
815 }; 852 };
816 853
817 armjtag@8003c800 { 854 armjtag: armjtag@8003c800 {
818 reg = <0x8003c800 0x100>; 855 reg = <0x8003c800 0x100>;
819 status = "disabled"; 856 status = "disabled";
820 }; 857 };
821 }; 858 };
822 859
823 apbx@80040000 { 860 apbx@80040000 {
824 compatible = "simple-bus"; 861 compatible = "simple-bus";
@@ -836,16 +873,15 @@
836 saif0: saif@80042000 { 873 saif0: saif@80042000 {
837 compatible = "fsl,imx28-saif"; 874 compatible = "fsl,imx28-saif";
838 reg = <0x80042000 0x2000>; 875 reg = <0x80042000 0x2000>;
839 interrupts = <59 80>; 876 interrupts = <59>;
840 #clock-cells = <0>; 877 #clock-cells = <0>;
841 clocks = <&clks 53>; 878 clocks = <&clks 53>;
842 dmas = <&dma_apbx 4>; 879 dmas = <&dma_apbx 4>;
843 dma-names = "rx-tx"; 880 dma-names = "rx-tx";
844 fsl,saif-dma-channel = <4>;
845 status = "disabled"; 881 status = "disabled";
846 }; 882 };
847 883
848 power@80044000 { 884 power: power@80044000 {
849 reg = <0x80044000 0x2000>; 885 reg = <0x80044000 0x2000>;
850 status = "disabled"; 886 status = "disabled";
851 }; 887 };
@@ -853,15 +889,14 @@
853 saif1: saif@80046000 { 889 saif1: saif@80046000 {
854 compatible = "fsl,imx28-saif"; 890 compatible = "fsl,imx28-saif";
855 reg = <0x80046000 0x2000>; 891 reg = <0x80046000 0x2000>;
856 interrupts = <58 81>; 892 interrupts = <58>;
857 clocks = <&clks 54>; 893 clocks = <&clks 54>;
858 dmas = <&dma_apbx 5>; 894 dmas = <&dma_apbx 5>;
859 dma-names = "rx-tx"; 895 dma-names = "rx-tx";
860 fsl,saif-dma-channel = <5>;
861 status = "disabled"; 896 status = "disabled";
862 }; 897 };
863 898
864 lradc@80050000 { 899 lradc: lradc@80050000 {
865 compatible = "fsl,imx28-lradc"; 900 compatible = "fsl,imx28-lradc";
866 reg = <0x80050000 0x2000>; 901 reg = <0x80050000 0x2000>;
867 interrupts = <10 14 15 16 17 18 19 902 interrupts = <10 14 15 16 17 18 19
@@ -869,15 +904,15 @@
869 status = "disabled"; 904 status = "disabled";
870 }; 905 };
871 906
872 spdif@80054000 { 907 spdif: spdif@80054000 {
873 reg = <0x80054000 0x2000>; 908 reg = <0x80054000 0x2000>;
874 interrupts = <45 66>; 909 interrupts = <45>;
875 dmas = <&dma_apbx 2>; 910 dmas = <&dma_apbx 2>;
876 dma-names = "tx"; 911 dma-names = "tx";
877 status = "disabled"; 912 status = "disabled";
878 }; 913 };
879 914
880 rtc@80056000 { 915 mxs_rtc: rtc@80056000 {
881 compatible = "fsl,imx28-rtc", "fsl,stmp3xxx-rtc"; 916 compatible = "fsl,imx28-rtc", "fsl,stmp3xxx-rtc";
882 reg = <0x80056000 0x2000>; 917 reg = <0x80056000 0x2000>;
883 interrupts = <29>; 918 interrupts = <29>;
@@ -888,11 +923,10 @@
888 #size-cells = <0>; 923 #size-cells = <0>;
889 compatible = "fsl,imx28-i2c"; 924 compatible = "fsl,imx28-i2c";
890 reg = <0x80058000 0x2000>; 925 reg = <0x80058000 0x2000>;
891 interrupts = <111 68>; 926 interrupts = <111>;
892 clock-frequency = <100000>; 927 clock-frequency = <100000>;
893 dmas = <&dma_apbx 6>; 928 dmas = <&dma_apbx 6>;
894 dma-names = "rx-tx"; 929 dma-names = "rx-tx";
895 fsl,i2c-dma-channel = <6>;
896 status = "disabled"; 930 status = "disabled";
897 }; 931 };
898 932
@@ -901,11 +935,10 @@
901 #size-cells = <0>; 935 #size-cells = <0>;
902 compatible = "fsl,imx28-i2c"; 936 compatible = "fsl,imx28-i2c";
903 reg = <0x8005a000 0x2000>; 937 reg = <0x8005a000 0x2000>;
904 interrupts = <110 69>; 938 interrupts = <110>;
905 clock-frequency = <100000>; 939 clock-frequency = <100000>;
906 dmas = <&dma_apbx 7>; 940 dmas = <&dma_apbx 7>;
907 dma-names = "rx-tx"; 941 dma-names = "rx-tx";
908 fsl,i2c-dma-channel = <7>;
909 status = "disabled"; 942 status = "disabled";
910 }; 943 };
911 944
@@ -918,7 +951,7 @@
918 status = "disabled"; 951 status = "disabled";
919 }; 952 };
920 953
921 timrot@80068000 { 954 timer: timrot@80068000 {
922 compatible = "fsl,imx28-timrot", "fsl,timrot"; 955 compatible = "fsl,imx28-timrot", "fsl,timrot";
923 reg = <0x80068000 0x2000>; 956 reg = <0x80068000 0x2000>;
924 interrupts = <48 49 50 51>; 957 interrupts = <48 49 50 51>;
@@ -928,10 +961,9 @@
928 auart0: serial@8006a000 { 961 auart0: serial@8006a000 {
929 compatible = "fsl,imx28-auart", "fsl,imx23-auart"; 962 compatible = "fsl,imx28-auart", "fsl,imx23-auart";
930 reg = <0x8006a000 0x2000>; 963 reg = <0x8006a000 0x2000>;
931 interrupts = <112 70 71>; 964 interrupts = <112>;
932 dmas = <&dma_apbx 8>, <&dma_apbx 9>; 965 dmas = <&dma_apbx 8>, <&dma_apbx 9>;
933 dma-names = "rx", "tx"; 966 dma-names = "rx", "tx";
934 fsl,auart-dma-channel = <8 9>;
935 clocks = <&clks 45>; 967 clocks = <&clks 45>;
936 status = "disabled"; 968 status = "disabled";
937 }; 969 };
@@ -939,7 +971,7 @@
939 auart1: serial@8006c000 { 971 auart1: serial@8006c000 {
940 compatible = "fsl,imx28-auart", "fsl,imx23-auart"; 972 compatible = "fsl,imx28-auart", "fsl,imx23-auart";
941 reg = <0x8006c000 0x2000>; 973 reg = <0x8006c000 0x2000>;
942 interrupts = <113 72 73>; 974 interrupts = <113>;
943 dmas = <&dma_apbx 10>, <&dma_apbx 11>; 975 dmas = <&dma_apbx 10>, <&dma_apbx 11>;
944 dma-names = "rx", "tx"; 976 dma-names = "rx", "tx";
945 clocks = <&clks 45>; 977 clocks = <&clks 45>;
@@ -949,7 +981,7 @@
949 auart2: serial@8006e000 { 981 auart2: serial@8006e000 {
950 compatible = "fsl,imx28-auart", "fsl,imx23-auart"; 982 compatible = "fsl,imx28-auart", "fsl,imx23-auart";
951 reg = <0x8006e000 0x2000>; 983 reg = <0x8006e000 0x2000>;
952 interrupts = <114 74 75>; 984 interrupts = <114>;
953 dmas = <&dma_apbx 12>, <&dma_apbx 13>; 985 dmas = <&dma_apbx 12>, <&dma_apbx 13>;
954 dma-names = "rx", "tx"; 986 dma-names = "rx", "tx";
955 clocks = <&clks 45>; 987 clocks = <&clks 45>;
@@ -959,7 +991,7 @@
959 auart3: serial@80070000 { 991 auart3: serial@80070000 {
960 compatible = "fsl,imx28-auart", "fsl,imx23-auart"; 992 compatible = "fsl,imx28-auart", "fsl,imx23-auart";
961 reg = <0x80070000 0x2000>; 993 reg = <0x80070000 0x2000>;
962 interrupts = <115 76 77>; 994 interrupts = <115>;
963 dmas = <&dma_apbx 14>, <&dma_apbx 15>; 995 dmas = <&dma_apbx 14>, <&dma_apbx 15>;
964 dma-names = "rx", "tx"; 996 dma-names = "rx", "tx";
965 clocks = <&clks 45>; 997 clocks = <&clks 45>;
@@ -969,7 +1001,7 @@
969 auart4: serial@80072000 { 1001 auart4: serial@80072000 {
970 compatible = "fsl,imx28-auart", "fsl,imx23-auart"; 1002 compatible = "fsl,imx28-auart", "fsl,imx23-auart";
971 reg = <0x80072000 0x2000>; 1003 reg = <0x80072000 0x2000>;
972 interrupts = <116 78 79>; 1004 interrupts = <116>;
973 dmas = <&dma_apbx 0>, <&dma_apbx 1>; 1005 dmas = <&dma_apbx 0>, <&dma_apbx 1>;
974 dma-names = "rx", "tx"; 1006 dma-names = "rx", "tx";
975 clocks = <&clks 45>; 1007 clocks = <&clks 45>;
@@ -1026,7 +1058,7 @@
1026 status = "disabled"; 1058 status = "disabled";
1027 }; 1059 };
1028 1060
1029 dflpt@800c0000 { 1061 dflpt: dflpt@800c0000 {
1030 reg = <0x800c0000 0x10000>; 1062 reg = <0x800c0000 0x10000>;
1031 status = "disabled"; 1063 status = "disabled";
1032 }; 1064 };
@@ -1049,10 +1081,9 @@
1049 status = "disabled"; 1081 status = "disabled";
1050 }; 1082 };
1051 1083
1052 switch@800f8000 { 1084 etn_switch: switch@800f8000 {
1053 reg = <0x800f8000 0x8000>; 1085 reg = <0x800f8000 0x8000>;
1054 status = "disabled"; 1086 status = "disabled";
1055 }; 1087 };
1056
1057 }; 1088 };
1058}; 1089};
diff --git a/arch/arm/boot/dts/imx31.dtsi b/arch/arm/boot/dts/imx31.dtsi
index c5449257ad9a..c34f82581248 100644
--- a/arch/arm/boot/dts/imx31.dtsi
+++ b/arch/arm/boot/dts/imx31.dtsi
@@ -20,6 +20,16 @@
20 serial4 = &uart5; 20 serial4 = &uart5;
21 }; 21 };
22 22
23 cpus {
24 #address-cells = <0>;
25 #size-cells = <0>;
26
27 cpu {
28 compatible = "arm,arm1136";
29 device_type = "cpu";
30 };
31 };
32
23 avic: avic-interrupt-controller@60000000 { 33 avic: avic-interrupt-controller@60000000 {
24 compatible = "fsl,imx31-avic", "fsl,avic"; 34 compatible = "fsl,imx31-avic", "fsl,avic";
25 interrupt-controller; 35 interrupt-controller;
@@ -94,6 +104,13 @@
94 status = "disabled"; 104 status = "disabled";
95 }; 105 };
96 106
107 iim: iim@5001c000 {
108 compatible = "fsl,imx31-iim", "fsl,imx27-iim";
109 reg = <0x5001c000 0x1000>;
110 interrupts = <19>;
111 clocks = <&clks 25>;
112 };
113
97 clks: ccm@53f80000{ 114 clks: ccm@53f80000{
98 compatible = "fsl,imx31-ccm"; 115 compatible = "fsl,imx31-ccm";
99 reg = <0x53f80000 0x4000>; 116 reg = <0x53f80000 0x4000>;
diff --git a/arch/arm/boot/dts/imx51-apf51.dts b/arch/arm/boot/dts/imx51-apf51.dts
index 8f7f9ac0b989..b3606993f2e8 100644
--- a/arch/arm/boot/dts/imx51-apf51.dts
+++ b/arch/arm/boot/dts/imx51-apf51.dts
@@ -26,10 +26,6 @@
26 }; 26 };
27 27
28 clocks { 28 clocks {
29 ckih1 {
30 clock-frequency = <0>;
31 };
32
33 osc { 29 osc {
34 clock-frequency = <33554432>; 30 clock-frequency = <33554432>;
35 }; 31 };
diff --git a/arch/arm/boot/dts/imx51-babbage.dts b/arch/arm/boot/dts/imx51-babbage.dts
index ad3471ca17c7..1d337d99ecd5 100644
--- a/arch/arm/boot/dts/imx51-babbage.dts
+++ b/arch/arm/boot/dts/imx51-babbage.dts
@@ -63,6 +63,10 @@
63 }; 63 };
64 64
65 clocks { 65 clocks {
66 ckih1 {
67 clock-frequency = <22579200>;
68 };
69
66 clk_26M: codec_clock { 70 clk_26M: codec_clock {
67 compatible = "fixed-clock"; 71 compatible = "fixed-clock";
68 reg=<0>; 72 reg=<0>;
@@ -108,6 +112,7 @@
108 #size-cells = <0>; 112 #size-cells = <0>;
109 compatible = "fsl,mc13892"; 113 compatible = "fsl,mc13892";
110 spi-max-frequency = <6000000>; 114 spi-max-frequency = <6000000>;
115 spi-cs-high;
111 reg = <0>; 116 reg = <0>;
112 interrupt-parent = <&gpio1>; 117 interrupt-parent = <&gpio1>;
113 interrupts = <8 0x4>; 118 interrupts = <8 0x4>;
diff --git a/arch/arm/boot/dts/imx51.dtsi b/arch/arm/boot/dts/imx51.dtsi
index 25764b505a61..54cee6517902 100644
--- a/arch/arm/boot/dts/imx51.dtsi
+++ b/arch/arm/boot/dts/imx51.dtsi
@@ -15,13 +15,18 @@
15 15
16/ { 16/ {
17 aliases { 17 aliases {
18 serial0 = &uart1;
19 serial1 = &uart2;
20 serial2 = &uart3;
21 gpio0 = &gpio1; 18 gpio0 = &gpio1;
22 gpio1 = &gpio2; 19 gpio1 = &gpio2;
23 gpio2 = &gpio3; 20 gpio2 = &gpio3;
24 gpio3 = &gpio4; 21 gpio3 = &gpio4;
22 i2c0 = &i2c1;
23 i2c1 = &i2c2;
24 serial0 = &uart1;
25 serial1 = &uart2;
26 serial2 = &uart3;
27 spi0 = &ecspi1;
28 spi1 = &ecspi2;
29 spi2 = &cspi;
25 }; 30 };
26 31
27 tzic: tz-interrupt-controller@e0000000 { 32 tzic: tz-interrupt-controller@e0000000 {
@@ -42,7 +47,7 @@
42 47
43 ckih1 { 48 ckih1 {
44 compatible = "fsl,imx-ckih1", "fixed-clock"; 49 compatible = "fsl,imx-ckih1", "fixed-clock";
45 clock-frequency = <22579200>; 50 clock-frequency = <0>;
46 }; 51 };
47 52
48 ckih2 { 53 ckih2 {
@@ -149,6 +154,9 @@
149 reg = <0x70014000 0x4000>; 154 reg = <0x70014000 0x4000>;
150 interrupts = <30>; 155 interrupts = <30>;
151 clocks = <&clks 49>; 156 clocks = <&clks 49>;
157 dmas = <&sdma 24 1 0>,
158 <&sdma 25 1 0>;
159 dma-names = "rx", "tx";
152 fsl,fifo-depth = <15>; 160 fsl,fifo-depth = <15>;
153 fsl,ssi-dma-events = <25 24 23 22>; /* TX0 RX0 TX1 RX1 */ 161 fsl,ssi-dma-events = <25 24 23 22>; /* TX0 RX0 TX1 RX1 */
154 status = "disabled"; 162 status = "disabled";
@@ -300,275 +308,6 @@
300 iomuxc: iomuxc@73fa8000 { 308 iomuxc: iomuxc@73fa8000 {
301 compatible = "fsl,imx51-iomuxc"; 309 compatible = "fsl,imx51-iomuxc";
302 reg = <0x73fa8000 0x4000>; 310 reg = <0x73fa8000 0x4000>;
303
304 audmux {
305 pinctrl_audmux_1: audmuxgrp-1 {
306 fsl,pins = <
307 MX51_PAD_AUD3_BB_TXD__AUD3_TXD 0x80000000
308 MX51_PAD_AUD3_BB_RXD__AUD3_RXD 0x80000000
309 MX51_PAD_AUD3_BB_CK__AUD3_TXC 0x80000000
310 MX51_PAD_AUD3_BB_FS__AUD3_TXFS 0x80000000
311 >;
312 };
313 };
314
315 fec {
316 pinctrl_fec_1: fecgrp-1 {
317 fsl,pins = <
318 MX51_PAD_EIM_EB2__FEC_MDIO 0x80000000
319 MX51_PAD_EIM_EB3__FEC_RDATA1 0x80000000
320 MX51_PAD_EIM_CS2__FEC_RDATA2 0x80000000
321 MX51_PAD_EIM_CS3__FEC_RDATA3 0x80000000
322 MX51_PAD_EIM_CS4__FEC_RX_ER 0x80000000
323 MX51_PAD_EIM_CS5__FEC_CRS 0x80000000
324 MX51_PAD_NANDF_RB2__FEC_COL 0x80000000
325 MX51_PAD_NANDF_RB3__FEC_RX_CLK 0x80000000
326 MX51_PAD_NANDF_D9__FEC_RDATA0 0x80000000
327 MX51_PAD_NANDF_D8__FEC_TDATA0 0x80000000
328 MX51_PAD_NANDF_CS2__FEC_TX_ER 0x80000000
329 MX51_PAD_NANDF_CS3__FEC_MDC 0x80000000
330 MX51_PAD_NANDF_CS4__FEC_TDATA1 0x80000000
331 MX51_PAD_NANDF_CS5__FEC_TDATA2 0x80000000
332 MX51_PAD_NANDF_CS6__FEC_TDATA3 0x80000000
333 MX51_PAD_NANDF_CS7__FEC_TX_EN 0x80000000
334 MX51_PAD_NANDF_RDY_INT__FEC_TX_CLK 0x80000000
335 >;
336 };
337
338 pinctrl_fec_2: fecgrp-2 {
339 fsl,pins = <
340 MX51_PAD_DI_GP3__FEC_TX_ER 0x80000000
341 MX51_PAD_DI2_PIN4__FEC_CRS 0x80000000
342 MX51_PAD_DI2_PIN2__FEC_MDC 0x80000000
343 MX51_PAD_DI2_PIN3__FEC_MDIO 0x80000000
344 MX51_PAD_DI2_DISP_CLK__FEC_RDATA1 0x80000000
345 MX51_PAD_DI_GP4__FEC_RDATA2 0x80000000
346 MX51_PAD_DISP2_DAT0__FEC_RDATA3 0x80000000
347 MX51_PAD_DISP2_DAT1__FEC_RX_ER 0x80000000
348 MX51_PAD_DISP2_DAT6__FEC_TDATA1 0x80000000
349 MX51_PAD_DISP2_DAT7__FEC_TDATA2 0x80000000
350 MX51_PAD_DISP2_DAT8__FEC_TDATA3 0x80000000
351 MX51_PAD_DISP2_DAT9__FEC_TX_EN 0x80000000
352 MX51_PAD_DISP2_DAT10__FEC_COL 0x80000000
353 MX51_PAD_DISP2_DAT11__FEC_RX_CLK 0x80000000
354 MX51_PAD_DISP2_DAT12__FEC_RX_DV 0x80000000
355 MX51_PAD_DISP2_DAT13__FEC_TX_CLK 0x80000000
356 MX51_PAD_DISP2_DAT14__FEC_RDATA0 0x80000000
357 MX51_PAD_DISP2_DAT15__FEC_TDATA0 0x80000000
358 >;
359 };
360 };
361
362 ecspi1 {
363 pinctrl_ecspi1_1: ecspi1grp-1 {
364 fsl,pins = <
365 MX51_PAD_CSPI1_MISO__ECSPI1_MISO 0x185
366 MX51_PAD_CSPI1_MOSI__ECSPI1_MOSI 0x185
367 MX51_PAD_CSPI1_SCLK__ECSPI1_SCLK 0x185
368 >;
369 };
370 };
371
372 ecspi2 {
373 pinctrl_ecspi2_1: ecspi2grp-1 {
374 fsl,pins = <
375 MX51_PAD_NANDF_RB3__ECSPI2_MISO 0x185
376 MX51_PAD_NANDF_D15__ECSPI2_MOSI 0x185
377 MX51_PAD_NANDF_RB2__ECSPI2_SCLK 0x185
378 >;
379 };
380 };
381
382 esdhc1 {
383 pinctrl_esdhc1_1: esdhc1grp-1 {
384 fsl,pins = <
385 MX51_PAD_SD1_CMD__SD1_CMD 0x400020d5
386 MX51_PAD_SD1_CLK__SD1_CLK 0x20d5
387 MX51_PAD_SD1_DATA0__SD1_DATA0 0x20d5
388 MX51_PAD_SD1_DATA1__SD1_DATA1 0x20d5
389 MX51_PAD_SD1_DATA2__SD1_DATA2 0x20d5
390 MX51_PAD_SD1_DATA3__SD1_DATA3 0x20d5
391 >;
392 };
393 };
394
395 esdhc2 {
396 pinctrl_esdhc2_1: esdhc2grp-1 {
397 fsl,pins = <
398 MX51_PAD_SD2_CMD__SD2_CMD 0x400020d5
399 MX51_PAD_SD2_CLK__SD2_CLK 0x20d5
400 MX51_PAD_SD2_DATA0__SD2_DATA0 0x20d5
401 MX51_PAD_SD2_DATA1__SD2_DATA1 0x20d5
402 MX51_PAD_SD2_DATA2__SD2_DATA2 0x20d5
403 MX51_PAD_SD2_DATA3__SD2_DATA3 0x20d5
404 >;
405 };
406 };
407
408 i2c2 {
409 pinctrl_i2c2_1: i2c2grp-1 {
410 fsl,pins = <
411 MX51_PAD_KEY_COL4__I2C2_SCL 0x400001ed
412 MX51_PAD_KEY_COL5__I2C2_SDA 0x400001ed
413 >;
414 };
415
416 pinctrl_i2c2_2: i2c2grp-2 {
417 fsl,pins = <
418 MX51_PAD_EIM_D27__I2C2_SCL 0x400001ed
419 MX51_PAD_EIM_D24__I2C2_SDA 0x400001ed
420 >;
421 };
422 };
423
424 ipu_disp1 {
425 pinctrl_ipu_disp1_1: ipudisp1grp-1 {
426 fsl,pins = <
427 MX51_PAD_DISP1_DAT0__DISP1_DAT0 0x5
428 MX51_PAD_DISP1_DAT1__DISP1_DAT1 0x5
429 MX51_PAD_DISP1_DAT2__DISP1_DAT2 0x5
430 MX51_PAD_DISP1_DAT3__DISP1_DAT3 0x5
431 MX51_PAD_DISP1_DAT4__DISP1_DAT4 0x5
432 MX51_PAD_DISP1_DAT5__DISP1_DAT5 0x5
433 MX51_PAD_DISP1_DAT6__DISP1_DAT6 0x5
434 MX51_PAD_DISP1_DAT7__DISP1_DAT7 0x5
435 MX51_PAD_DISP1_DAT8__DISP1_DAT8 0x5
436 MX51_PAD_DISP1_DAT9__DISP1_DAT9 0x5
437 MX51_PAD_DISP1_DAT10__DISP1_DAT10 0x5
438 MX51_PAD_DISP1_DAT11__DISP1_DAT11 0x5
439 MX51_PAD_DISP1_DAT12__DISP1_DAT12 0x5
440 MX51_PAD_DISP1_DAT13__DISP1_DAT13 0x5
441 MX51_PAD_DISP1_DAT14__DISP1_DAT14 0x5
442 MX51_PAD_DISP1_DAT15__DISP1_DAT15 0x5
443 MX51_PAD_DISP1_DAT16__DISP1_DAT16 0x5
444 MX51_PAD_DISP1_DAT17__DISP1_DAT17 0x5
445 MX51_PAD_DISP1_DAT18__DISP1_DAT18 0x5
446 MX51_PAD_DISP1_DAT19__DISP1_DAT19 0x5
447 MX51_PAD_DISP1_DAT20__DISP1_DAT20 0x5
448 MX51_PAD_DISP1_DAT21__DISP1_DAT21 0x5
449 MX51_PAD_DISP1_DAT22__DISP1_DAT22 0x5
450 MX51_PAD_DISP1_DAT23__DISP1_DAT23 0x5
451 MX51_PAD_DI1_PIN2__DI1_PIN2 0x5 /* hsync */
452 MX51_PAD_DI1_PIN3__DI1_PIN3 0x5 /* vsync */
453 >;
454 };
455 };
456
457 ipu_disp2 {
458 pinctrl_ipu_disp2_1: ipudisp2grp-1 {
459 fsl,pins = <
460 MX51_PAD_DISP2_DAT0__DISP2_DAT0 0x5
461 MX51_PAD_DISP2_DAT1__DISP2_DAT1 0x5
462 MX51_PAD_DISP2_DAT2__DISP2_DAT2 0x5
463 MX51_PAD_DISP2_DAT3__DISP2_DAT3 0x5
464 MX51_PAD_DISP2_DAT4__DISP2_DAT4 0x5
465 MX51_PAD_DISP2_DAT5__DISP2_DAT5 0x5
466 MX51_PAD_DISP2_DAT6__DISP2_DAT6 0x5
467 MX51_PAD_DISP2_DAT7__DISP2_DAT7 0x5
468 MX51_PAD_DISP2_DAT8__DISP2_DAT8 0x5
469 MX51_PAD_DISP2_DAT9__DISP2_DAT9 0x5
470 MX51_PAD_DISP2_DAT10__DISP2_DAT10 0x5
471 MX51_PAD_DISP2_DAT11__DISP2_DAT11 0x5
472 MX51_PAD_DISP2_DAT12__DISP2_DAT12 0x5
473 MX51_PAD_DISP2_DAT13__DISP2_DAT13 0x5
474 MX51_PAD_DISP2_DAT14__DISP2_DAT14 0x5
475 MX51_PAD_DISP2_DAT15__DISP2_DAT15 0x5
476 MX51_PAD_DI2_PIN2__DI2_PIN2 0x5 /* hsync */
477 MX51_PAD_DI2_PIN3__DI2_PIN3 0x5 /* vsync */
478 MX51_PAD_DI2_DISP_CLK__DI2_DISP_CLK 0x5
479 MX51_PAD_DI_GP4__DI2_PIN15 0x5
480 >;
481 };
482 };
483
484 pata {
485 pinctrl_pata_1: patagrp-1 {
486 fsl,pins = <
487 MX51_PAD_NANDF_WE_B__PATA_DIOW 0x2004
488 MX51_PAD_NANDF_RE_B__PATA_DIOR 0x2004
489 MX51_PAD_NANDF_ALE__PATA_BUFFER_EN 0x2004
490 MX51_PAD_NANDF_CLE__PATA_RESET_B 0x2004
491 MX51_PAD_NANDF_WP_B__PATA_DMACK 0x2004
492 MX51_PAD_NANDF_RB0__PATA_DMARQ 0x2004
493 MX51_PAD_NANDF_RB1__PATA_IORDY 0x2004
494 MX51_PAD_GPIO_NAND__PATA_INTRQ 0x2004
495 MX51_PAD_NANDF_CS2__PATA_CS_0 0x2004
496 MX51_PAD_NANDF_CS3__PATA_CS_1 0x2004
497 MX51_PAD_NANDF_CS4__PATA_DA_0 0x2004
498 MX51_PAD_NANDF_CS5__PATA_DA_1 0x2004
499 MX51_PAD_NANDF_CS6__PATA_DA_2 0x2004
500 MX51_PAD_NANDF_D15__PATA_DATA15 0x2004
501 MX51_PAD_NANDF_D14__PATA_DATA14 0x2004
502 MX51_PAD_NANDF_D13__PATA_DATA13 0x2004
503 MX51_PAD_NANDF_D12__PATA_DATA12 0x2004
504 MX51_PAD_NANDF_D11__PATA_DATA11 0x2004
505 MX51_PAD_NANDF_D10__PATA_DATA10 0x2004
506 MX51_PAD_NANDF_D9__PATA_DATA9 0x2004
507 MX51_PAD_NANDF_D8__PATA_DATA8 0x2004
508 MX51_PAD_NANDF_D7__PATA_DATA7 0x2004
509 MX51_PAD_NANDF_D6__PATA_DATA6 0x2004
510 MX51_PAD_NANDF_D5__PATA_DATA5 0x2004
511 MX51_PAD_NANDF_D4__PATA_DATA4 0x2004
512 MX51_PAD_NANDF_D3__PATA_DATA3 0x2004
513 MX51_PAD_NANDF_D2__PATA_DATA2 0x2004
514 MX51_PAD_NANDF_D1__PATA_DATA1 0x2004
515 MX51_PAD_NANDF_D0__PATA_DATA0 0x2004
516 >;
517 };
518 };
519
520 uart1 {
521 pinctrl_uart1_1: uart1grp-1 {
522 fsl,pins = <
523 MX51_PAD_UART1_RXD__UART1_RXD 0x1c5
524 MX51_PAD_UART1_TXD__UART1_TXD 0x1c5
525 MX51_PAD_UART1_RTS__UART1_RTS 0x1c5
526 MX51_PAD_UART1_CTS__UART1_CTS 0x1c5
527 >;
528 };
529 };
530
531 uart2 {
532 pinctrl_uart2_1: uart2grp-1 {
533 fsl,pins = <
534 MX51_PAD_UART2_RXD__UART2_RXD 0x1c5
535 MX51_PAD_UART2_TXD__UART2_TXD 0x1c5
536 >;
537 };
538 };
539
540 uart3 {
541 pinctrl_uart3_1: uart3grp-1 {
542 fsl,pins = <
543 MX51_PAD_EIM_D25__UART3_RXD 0x1c5
544 MX51_PAD_EIM_D26__UART3_TXD 0x1c5
545 MX51_PAD_EIM_D27__UART3_RTS 0x1c5
546 MX51_PAD_EIM_D24__UART3_CTS 0x1c5
547 >;
548 };
549
550 pinctrl_uart3_2: uart3grp-2 {
551 fsl,pins = <
552 MX51_PAD_UART3_RXD__UART3_RXD 0x1c5
553 MX51_PAD_UART3_TXD__UART3_TXD 0x1c5
554 >;
555 };
556 };
557
558 kpp {
559 pinctrl_kpp_1: kppgrp-1 {
560 fsl,pins = <
561 MX51_PAD_KEY_ROW0__KEY_ROW0 0xe0
562 MX51_PAD_KEY_ROW1__KEY_ROW1 0xe0
563 MX51_PAD_KEY_ROW2__KEY_ROW2 0xe0
564 MX51_PAD_KEY_ROW3__KEY_ROW3 0xe0
565 MX51_PAD_KEY_COL0__KEY_COL0 0xe8
566 MX51_PAD_KEY_COL1__KEY_COL1 0xe8
567 MX51_PAD_KEY_COL2__KEY_COL2 0xe8
568 MX51_PAD_KEY_COL3__KEY_COL3 0xe8
569 >;
570 };
571 };
572 }; 311 };
573 312
574 pwm1: pwm@73fb4000 { 313 pwm1: pwm@73fb4000 {
@@ -628,6 +367,13 @@
628 reg = <0x80000000 0x10000000>; 367 reg = <0x80000000 0x10000000>;
629 ranges; 368 ranges;
630 369
370 iim: iim@83f98000 {
371 compatible = "fsl,imx51-iim", "fsl,imx27-iim";
372 reg = <0x83f98000 0x4000>;
373 interrupts = <69>;
374 clocks = <&clks 107>;
375 };
376
631 ecspi2: ecspi@83fac000 { 377 ecspi2: ecspi@83fac000 {
632 #address-cells = <1>; 378 #address-cells = <1>;
633 #size-cells = <0>; 379 #size-cells = <0>;
@@ -645,6 +391,7 @@
645 interrupts = <6>; 391 interrupts = <6>;
646 clocks = <&clks 56>, <&clks 56>; 392 clocks = <&clks 56>, <&clks 56>;
647 clock-names = "ipg", "ahb"; 393 clock-names = "ipg", "ahb";
394 #dma-cells = <3>;
648 fsl,sdma-ram-script-name = "imx/sdma/sdma-imx51.bin"; 395 fsl,sdma-ram-script-name = "imx/sdma/sdma-imx51.bin";
649 }; 396 };
650 397
@@ -684,6 +431,9 @@
684 reg = <0x83fcc000 0x4000>; 431 reg = <0x83fcc000 0x4000>;
685 interrupts = <29>; 432 interrupts = <29>;
686 clocks = <&clks 48>; 433 clocks = <&clks 48>;
434 dmas = <&sdma 28 0 0>,
435 <&sdma 29 0 0>;
436 dma-names = "rx", "tx";
687 fsl,fifo-depth = <15>; 437 fsl,fifo-depth = <15>;
688 fsl,ssi-dma-events = <29 28 27 26>; /* TX0 RX0 TX1 RX1 */ 438 fsl,ssi-dma-events = <29 28 27 26>; /* TX0 RX0 TX1 RX1 */
689 status = "disabled"; 439 status = "disabled";
@@ -695,6 +445,23 @@
695 status = "disabled"; 445 status = "disabled";
696 }; 446 };
697 447
448 weim: weim@83fda000 {
449 #address-cells = <2>;
450 #size-cells = <1>;
451 compatible = "fsl,imx51-weim";
452 reg = <0x83fda000 0x1000>;
453 clocks = <&clks 57>;
454 ranges = <
455 0 0 0xb0000000 0x08000000
456 1 0 0xb8000000 0x08000000
457 2 0 0xc0000000 0x08000000
458 3 0 0xc8000000 0x04000000
459 4 0 0xcc000000 0x02000000
460 5 0 0xce000000 0x02000000
461 >;
462 status = "disabled";
463 };
464
698 nfc: nand@83fdb000 { 465 nfc: nand@83fdb000 {
699 compatible = "fsl,imx51-nand"; 466 compatible = "fsl,imx51-nand";
700 reg = <0x83fdb000 0x1000 0xcfff0000 0x10000>; 467 reg = <0x83fdb000 0x1000 0xcfff0000 0x10000>;
@@ -707,7 +474,7 @@
707 compatible = "fsl,imx51-pata", "fsl,imx27-pata"; 474 compatible = "fsl,imx51-pata", "fsl,imx27-pata";
708 reg = <0x83fe0000 0x4000>; 475 reg = <0x83fe0000 0x4000>;
709 interrupts = <70>; 476 interrupts = <70>;
710 clocks = <&clks 161>; 477 clocks = <&clks 172>;
711 status = "disabled"; 478 status = "disabled";
712 }; 479 };
713 480
@@ -716,6 +483,9 @@
716 reg = <0x83fe8000 0x4000>; 483 reg = <0x83fe8000 0x4000>;
717 interrupts = <96>; 484 interrupts = <96>;
718 clocks = <&clks 50>; 485 clocks = <&clks 50>;
486 dmas = <&sdma 46 0 0>,
487 <&sdma 47 0 0>;
488 dma-names = "rx", "tx";
719 fsl,fifo-depth = <15>; 489 fsl,fifo-depth = <15>;
720 fsl,ssi-dma-events = <47 46 37 35>; /* TX0 RX0 TX1 RX1 */ 490 fsl,ssi-dma-events = <47 46 37 35>; /* TX0 RX0 TX1 RX1 */
721 status = "disabled"; 491 status = "disabled";
@@ -732,3 +502,319 @@
732 }; 502 };
733 }; 503 };
734}; 504};
505
506&iomuxc {
507 audmux {
508 pinctrl_audmux_1: audmuxgrp-1 {
509 fsl,pins = <
510 MX51_PAD_AUD3_BB_TXD__AUD3_TXD 0x80000000
511 MX51_PAD_AUD3_BB_RXD__AUD3_RXD 0x80000000
512 MX51_PAD_AUD3_BB_CK__AUD3_TXC 0x80000000
513 MX51_PAD_AUD3_BB_FS__AUD3_TXFS 0x80000000
514 >;
515 };
516 };
517
518 fec {
519 pinctrl_fec_1: fecgrp-1 {
520 fsl,pins = <
521 MX51_PAD_EIM_EB2__FEC_MDIO 0x80000000
522 MX51_PAD_EIM_EB3__FEC_RDATA1 0x80000000
523 MX51_PAD_EIM_CS2__FEC_RDATA2 0x80000000
524 MX51_PAD_EIM_CS3__FEC_RDATA3 0x80000000
525 MX51_PAD_EIM_CS4__FEC_RX_ER 0x80000000
526 MX51_PAD_EIM_CS5__FEC_CRS 0x80000000
527 MX51_PAD_NANDF_RB2__FEC_COL 0x80000000
528 MX51_PAD_NANDF_RB3__FEC_RX_CLK 0x80000000
529 MX51_PAD_NANDF_D9__FEC_RDATA0 0x80000000
530 MX51_PAD_NANDF_D8__FEC_TDATA0 0x80000000
531 MX51_PAD_NANDF_CS2__FEC_TX_ER 0x80000000
532 MX51_PAD_NANDF_CS3__FEC_MDC 0x80000000
533 MX51_PAD_NANDF_CS4__FEC_TDATA1 0x80000000
534 MX51_PAD_NANDF_CS5__FEC_TDATA2 0x80000000
535 MX51_PAD_NANDF_CS6__FEC_TDATA3 0x80000000
536 MX51_PAD_NANDF_CS7__FEC_TX_EN 0x80000000
537 MX51_PAD_NANDF_RDY_INT__FEC_TX_CLK 0x80000000
538 >;
539 };
540
541 pinctrl_fec_2: fecgrp-2 {
542 fsl,pins = <
543 MX51_PAD_DI_GP3__FEC_TX_ER 0x80000000
544 MX51_PAD_DI2_PIN4__FEC_CRS 0x80000000
545 MX51_PAD_DI2_PIN2__FEC_MDC 0x80000000
546 MX51_PAD_DI2_PIN3__FEC_MDIO 0x80000000
547 MX51_PAD_DI2_DISP_CLK__FEC_RDATA1 0x80000000
548 MX51_PAD_DI_GP4__FEC_RDATA2 0x80000000
549 MX51_PAD_DISP2_DAT0__FEC_RDATA3 0x80000000
550 MX51_PAD_DISP2_DAT1__FEC_RX_ER 0x80000000
551 MX51_PAD_DISP2_DAT6__FEC_TDATA1 0x80000000
552 MX51_PAD_DISP2_DAT7__FEC_TDATA2 0x80000000
553 MX51_PAD_DISP2_DAT8__FEC_TDATA3 0x80000000
554 MX51_PAD_DISP2_DAT9__FEC_TX_EN 0x80000000
555 MX51_PAD_DISP2_DAT10__FEC_COL 0x80000000
556 MX51_PAD_DISP2_DAT11__FEC_RX_CLK 0x80000000
557 MX51_PAD_DISP2_DAT12__FEC_RX_DV 0x80000000
558 MX51_PAD_DISP2_DAT13__FEC_TX_CLK 0x80000000
559 MX51_PAD_DISP2_DAT14__FEC_RDATA0 0x80000000
560 MX51_PAD_DISP2_DAT15__FEC_TDATA0 0x80000000
561 >;
562 };
563 };
564
565 ecspi1 {
566 pinctrl_ecspi1_1: ecspi1grp-1 {
567 fsl,pins = <
568 MX51_PAD_CSPI1_MISO__ECSPI1_MISO 0x185
569 MX51_PAD_CSPI1_MOSI__ECSPI1_MOSI 0x185
570 MX51_PAD_CSPI1_SCLK__ECSPI1_SCLK 0x185
571 >;
572 };
573 };
574
575 ecspi2 {
576 pinctrl_ecspi2_1: ecspi2grp-1 {
577 fsl,pins = <
578 MX51_PAD_NANDF_RB3__ECSPI2_MISO 0x185
579 MX51_PAD_NANDF_D15__ECSPI2_MOSI 0x185
580 MX51_PAD_NANDF_RB2__ECSPI2_SCLK 0x185
581 >;
582 };
583 };
584
585 esdhc1 {
586 pinctrl_esdhc1_1: esdhc1grp-1 {
587 fsl,pins = <
588 MX51_PAD_SD1_CMD__SD1_CMD 0x400020d5
589 MX51_PAD_SD1_CLK__SD1_CLK 0x20d5
590 MX51_PAD_SD1_DATA0__SD1_DATA0 0x20d5
591 MX51_PAD_SD1_DATA1__SD1_DATA1 0x20d5
592 MX51_PAD_SD1_DATA2__SD1_DATA2 0x20d5
593 MX51_PAD_SD1_DATA3__SD1_DATA3 0x20d5
594 >;
595 };
596 };
597
598 esdhc2 {
599 pinctrl_esdhc2_1: esdhc2grp-1 {
600 fsl,pins = <
601 MX51_PAD_SD2_CMD__SD2_CMD 0x400020d5
602 MX51_PAD_SD2_CLK__SD2_CLK 0x20d5
603 MX51_PAD_SD2_DATA0__SD2_DATA0 0x20d5
604 MX51_PAD_SD2_DATA1__SD2_DATA1 0x20d5
605 MX51_PAD_SD2_DATA2__SD2_DATA2 0x20d5
606 MX51_PAD_SD2_DATA3__SD2_DATA3 0x20d5
607 >;
608 };
609 };
610
611 i2c2 {
612 pinctrl_i2c2_1: i2c2grp-1 {
613 fsl,pins = <
614 MX51_PAD_KEY_COL4__I2C2_SCL 0x400001ed
615 MX51_PAD_KEY_COL5__I2C2_SDA 0x400001ed
616 >;
617 };
618
619 pinctrl_i2c2_2: i2c2grp-2 {
620 fsl,pins = <
621 MX51_PAD_EIM_D27__I2C2_SCL 0x400001ed
622 MX51_PAD_EIM_D24__I2C2_SDA 0x400001ed
623 >;
624 };
625
626 pinctrl_i2c2_3: i2c2grp-3 {
627 fsl,pins = <
628 MX51_PAD_GPIO1_2__I2C2_SCL 0x400001ed
629 MX51_PAD_GPIO1_3__I2C2_SDA 0x400001ed
630 >;
631 };
632 };
633
634 ipu_disp1 {
635 pinctrl_ipu_disp1_1: ipudisp1grp-1 {
636 fsl,pins = <
637 MX51_PAD_DISP1_DAT0__DISP1_DAT0 0x5
638 MX51_PAD_DISP1_DAT1__DISP1_DAT1 0x5
639 MX51_PAD_DISP1_DAT2__DISP1_DAT2 0x5
640 MX51_PAD_DISP1_DAT3__DISP1_DAT3 0x5
641 MX51_PAD_DISP1_DAT4__DISP1_DAT4 0x5
642 MX51_PAD_DISP1_DAT5__DISP1_DAT5 0x5
643 MX51_PAD_DISP1_DAT6__DISP1_DAT6 0x5
644 MX51_PAD_DISP1_DAT7__DISP1_DAT7 0x5
645 MX51_PAD_DISP1_DAT8__DISP1_DAT8 0x5
646 MX51_PAD_DISP1_DAT9__DISP1_DAT9 0x5
647 MX51_PAD_DISP1_DAT10__DISP1_DAT10 0x5
648 MX51_PAD_DISP1_DAT11__DISP1_DAT11 0x5
649 MX51_PAD_DISP1_DAT12__DISP1_DAT12 0x5
650 MX51_PAD_DISP1_DAT13__DISP1_DAT13 0x5
651 MX51_PAD_DISP1_DAT14__DISP1_DAT14 0x5
652 MX51_PAD_DISP1_DAT15__DISP1_DAT15 0x5
653 MX51_PAD_DISP1_DAT16__DISP1_DAT16 0x5
654 MX51_PAD_DISP1_DAT17__DISP1_DAT17 0x5
655 MX51_PAD_DISP1_DAT18__DISP1_DAT18 0x5
656 MX51_PAD_DISP1_DAT19__DISP1_DAT19 0x5
657 MX51_PAD_DISP1_DAT20__DISP1_DAT20 0x5
658 MX51_PAD_DISP1_DAT21__DISP1_DAT21 0x5
659 MX51_PAD_DISP1_DAT22__DISP1_DAT22 0x5
660 MX51_PAD_DISP1_DAT23__DISP1_DAT23 0x5
661 MX51_PAD_DI1_PIN2__DI1_PIN2 0x5 /* hsync */
662 MX51_PAD_DI1_PIN3__DI1_PIN3 0x5 /* vsync */
663 >;
664 };
665 };
666
667 ipu_disp2 {
668 pinctrl_ipu_disp2_1: ipudisp2grp-1 {
669 fsl,pins = <
670 MX51_PAD_DISP2_DAT0__DISP2_DAT0 0x5
671 MX51_PAD_DISP2_DAT1__DISP2_DAT1 0x5
672 MX51_PAD_DISP2_DAT2__DISP2_DAT2 0x5
673 MX51_PAD_DISP2_DAT3__DISP2_DAT3 0x5
674 MX51_PAD_DISP2_DAT4__DISP2_DAT4 0x5
675 MX51_PAD_DISP2_DAT5__DISP2_DAT5 0x5
676 MX51_PAD_DISP2_DAT6__DISP2_DAT6 0x5
677 MX51_PAD_DISP2_DAT7__DISP2_DAT7 0x5
678 MX51_PAD_DISP2_DAT8__DISP2_DAT8 0x5
679 MX51_PAD_DISP2_DAT9__DISP2_DAT9 0x5
680 MX51_PAD_DISP2_DAT10__DISP2_DAT10 0x5
681 MX51_PAD_DISP2_DAT11__DISP2_DAT11 0x5
682 MX51_PAD_DISP2_DAT12__DISP2_DAT12 0x5
683 MX51_PAD_DISP2_DAT13__DISP2_DAT13 0x5
684 MX51_PAD_DISP2_DAT14__DISP2_DAT14 0x5
685 MX51_PAD_DISP2_DAT15__DISP2_DAT15 0x5
686 MX51_PAD_DI2_PIN2__DI2_PIN2 0x5 /* hsync */
687 MX51_PAD_DI2_PIN3__DI2_PIN3 0x5 /* vsync */
688 MX51_PAD_DI2_DISP_CLK__DI2_DISP_CLK 0x5 /* CLK */
689 MX51_PAD_DI_GP4__DI2_PIN15 0x5 /* DE */
690 >;
691 };
692 };
693
694 kpp {
695 pinctrl_kpp_1: kppgrp-1 {
696 fsl,pins = <
697 MX51_PAD_KEY_ROW0__KEY_ROW0 0xe0
698 MX51_PAD_KEY_ROW1__KEY_ROW1 0xe0
699 MX51_PAD_KEY_ROW2__KEY_ROW2 0xe0
700 MX51_PAD_KEY_ROW3__KEY_ROW3 0xe0
701 MX51_PAD_KEY_COL0__KEY_COL0 0xe8
702 MX51_PAD_KEY_COL1__KEY_COL1 0xe8
703 MX51_PAD_KEY_COL2__KEY_COL2 0xe8
704 MX51_PAD_KEY_COL3__KEY_COL3 0xe8
705 >;
706 };
707 };
708
709 pata {
710 pinctrl_pata_1: patagrp-1 {
711 fsl,pins = <
712 MX51_PAD_NANDF_WE_B__PATA_DIOW 0x2004
713 MX51_PAD_NANDF_RE_B__PATA_DIOR 0x2004
714 MX51_PAD_NANDF_ALE__PATA_BUFFER_EN 0x2004
715 MX51_PAD_NANDF_CLE__PATA_RESET_B 0x2004
716 MX51_PAD_NANDF_WP_B__PATA_DMACK 0x2004
717 MX51_PAD_NANDF_RB0__PATA_DMARQ 0x2004
718 MX51_PAD_NANDF_RB1__PATA_IORDY 0x2004
719 MX51_PAD_GPIO_NAND__PATA_INTRQ 0x2004
720 MX51_PAD_NANDF_CS2__PATA_CS_0 0x2004
721 MX51_PAD_NANDF_CS3__PATA_CS_1 0x2004
722 MX51_PAD_NANDF_CS4__PATA_DA_0 0x2004
723 MX51_PAD_NANDF_CS5__PATA_DA_1 0x2004
724 MX51_PAD_NANDF_CS6__PATA_DA_2 0x2004
725 MX51_PAD_NANDF_D15__PATA_DATA15 0x2004
726 MX51_PAD_NANDF_D14__PATA_DATA14 0x2004
727 MX51_PAD_NANDF_D13__PATA_DATA13 0x2004
728 MX51_PAD_NANDF_D12__PATA_DATA12 0x2004
729 MX51_PAD_NANDF_D11__PATA_DATA11 0x2004
730 MX51_PAD_NANDF_D10__PATA_DATA10 0x2004
731 MX51_PAD_NANDF_D9__PATA_DATA9 0x2004
732 MX51_PAD_NANDF_D8__PATA_DATA8 0x2004
733 MX51_PAD_NANDF_D7__PATA_DATA7 0x2004
734 MX51_PAD_NANDF_D6__PATA_DATA6 0x2004
735 MX51_PAD_NANDF_D5__PATA_DATA5 0x2004
736 MX51_PAD_NANDF_D4__PATA_DATA4 0x2004
737 MX51_PAD_NANDF_D3__PATA_DATA3 0x2004
738 MX51_PAD_NANDF_D2__PATA_DATA2 0x2004
739 MX51_PAD_NANDF_D1__PATA_DATA1 0x2004
740 MX51_PAD_NANDF_D0__PATA_DATA0 0x2004
741 >;
742 };
743 };
744
745 uart1 {
746 pinctrl_uart1_1: uart1grp-1 {
747 fsl,pins = <
748 MX51_PAD_UART1_RXD__UART1_RXD 0x1c5
749 MX51_PAD_UART1_TXD__UART1_TXD 0x1c5
750 MX51_PAD_UART1_RTS__UART1_RTS 0x1c5
751 MX51_PAD_UART1_CTS__UART1_CTS 0x1c5
752 >;
753 };
754 };
755
756 uart2 {
757 pinctrl_uart2_1: uart2grp-1 {
758 fsl,pins = <
759 MX51_PAD_UART2_RXD__UART2_RXD 0x1c5
760 MX51_PAD_UART2_TXD__UART2_TXD 0x1c5
761 >;
762 };
763 };
764
765 uart3 {
766 pinctrl_uart3_1: uart3grp-1 {
767 fsl,pins = <
768 MX51_PAD_EIM_D25__UART3_RXD 0x1c5
769 MX51_PAD_EIM_D26__UART3_TXD 0x1c5
770 MX51_PAD_EIM_D27__UART3_RTS 0x1c5
771 MX51_PAD_EIM_D24__UART3_CTS 0x1c5
772 >;
773 };
774
775 pinctrl_uart3_2: uart3grp-2 {
776 fsl,pins = <
777 MX51_PAD_UART3_RXD__UART3_RXD 0x1c5
778 MX51_PAD_UART3_TXD__UART3_TXD 0x1c5
779 >;
780 };
781 };
782
783 usbh1 {
784 pinctrl_usbh1_1: usbh1grp-1 {
785 fsl,pins = <
786 MX51_PAD_USBH1_DATA0__USBH1_DATA0 0x1e5
787 MX51_PAD_USBH1_DATA1__USBH1_DATA1 0x1e5
788 MX51_PAD_USBH1_DATA2__USBH1_DATA2 0x1e5
789 MX51_PAD_USBH1_DATA3__USBH1_DATA3 0x1e5
790 MX51_PAD_USBH1_DATA4__USBH1_DATA4 0x1e5
791 MX51_PAD_USBH1_DATA5__USBH1_DATA5 0x1e5
792 MX51_PAD_USBH1_DATA6__USBH1_DATA6 0x1e5
793 MX51_PAD_USBH1_DATA7__USBH1_DATA7 0x1e5
794 MX51_PAD_USBH1_CLK__USBH1_CLK 0x1e5
795 MX51_PAD_USBH1_DIR__USBH1_DIR 0x1e5
796 MX51_PAD_USBH1_NXT__USBH1_NXT 0x1e5
797 MX51_PAD_USBH1_STP__USBH1_STP 0x1e5
798 >;
799 };
800 };
801
802 usbh2 {
803 pinctrl_usbh2_1: usbh2grp-1 {
804 fsl,pins = <
805 MX51_PAD_EIM_D16__USBH2_DATA0 0x1e5
806 MX51_PAD_EIM_D17__USBH2_DATA1 0x1e5
807 MX51_PAD_EIM_D18__USBH2_DATA2 0x1e5
808 MX51_PAD_EIM_D19__USBH2_DATA3 0x1e5
809 MX51_PAD_EIM_D20__USBH2_DATA4 0x1e5
810 MX51_PAD_EIM_D21__USBH2_DATA5 0x1e5
811 MX51_PAD_EIM_D22__USBH2_DATA6 0x1e5
812 MX51_PAD_EIM_D23__USBH2_DATA7 0x1e5
813 MX51_PAD_EIM_A24__USBH2_CLK 0x1e5
814 MX51_PAD_EIM_A25__USBH2_DIR 0x1e5
815 MX51_PAD_EIM_A27__USBH2_NXT 0x1e5
816 MX51_PAD_EIM_A26__USBH2_STP 0x1e5
817 >;
818 };
819 };
820};
diff --git a/arch/arm/boot/dts/imx53-qsb.dts b/arch/arm/boot/dts/imx53-qsb.dts
index 512a1f608253..e97ddae09d74 100644
--- a/arch/arm/boot/dts/imx53-qsb.dts
+++ b/arch/arm/boot/dts/imx53-qsb.dts
@@ -93,6 +93,15 @@
93 regulator-max-microvolt = <3200000>; 93 regulator-max-microvolt = <3200000>;
94 regulator-always-on; 94 regulator-always-on;
95 }; 95 };
96
97 reg_usb_vbus: usb_vbus {
98 compatible = "regulator-fixed";
99 regulator-name = "usb_vbus";
100 regulator-min-microvolt = <5000000>;
101 regulator-max-microvolt = <5000000>;
102 gpio = <&gpio7 8 0>;
103 enable-active-high;
104 };
96 }; 105 };
97 106
98 sound { 107 sound {
@@ -145,6 +154,7 @@
145 MX53_PAD_EIM_DA12__GPIO3_12 0x80000000 154 MX53_PAD_EIM_DA12__GPIO3_12 0x80000000
146 MX53_PAD_EIM_DA13__GPIO3_13 0x80000000 155 MX53_PAD_EIM_DA13__GPIO3_13 0x80000000
147 MX53_PAD_PATA_DA_0__GPIO7_6 0x80000000 156 MX53_PAD_PATA_DA_0__GPIO7_6 0x80000000
157 MX53_PAD_PATA_DA_2__GPIO7_8 0x80000000
148 MX53_PAD_GPIO_16__GPIO7_11 0x80000000 158 MX53_PAD_GPIO_16__GPIO7_11 0x80000000
149 >; 159 >;
150 }; 160 };
@@ -297,8 +307,14 @@
297 status = "okay"; 307 status = "okay";
298}; 308};
299 309
310&vpu {
311 status = "okay";
312};
313
300&usbh1 { 314&usbh1 {
301 status = "okay"; 315 vbus-supply = <&reg_usb_vbus>;
316 phy_type = "utmi";
317 status = "okay";
302}; 318};
303 319
304&usbotg { 320&usbotg {
diff --git a/arch/arm/boot/dts/imx53.dtsi b/arch/arm/boot/dts/imx53.dtsi
index 569aa9f2c4ed..4307e80b2d2e 100644
--- a/arch/arm/boot/dts/imx53.dtsi
+++ b/arch/arm/boot/dts/imx53.dtsi
@@ -15,11 +15,6 @@
15 15
16/ { 16/ {
17 aliases { 17 aliases {
18 serial0 = &uart1;
19 serial1 = &uart2;
20 serial2 = &uart3;
21 serial3 = &uart4;
22 serial4 = &uart5;
23 gpio0 = &gpio1; 18 gpio0 = &gpio1;
24 gpio1 = &gpio2; 19 gpio1 = &gpio2;
25 gpio2 = &gpio3; 20 gpio2 = &gpio3;
@@ -30,6 +25,24 @@
30 i2c0 = &i2c1; 25 i2c0 = &i2c1;
31 i2c1 = &i2c2; 26 i2c1 = &i2c2;
32 i2c2 = &i2c3; 27 i2c2 = &i2c3;
28 serial0 = &uart1;
29 serial1 = &uart2;
30 serial2 = &uart3;
31 serial3 = &uart4;
32 serial4 = &uart5;
33 spi0 = &ecspi1;
34 spi1 = &ecspi2;
35 spi2 = &cspi;
36 };
37
38 cpus {
39 #address-cells = <1>;
40 #size-cells = <0>;
41 cpu@0 {
42 device_type = "cpu";
43 compatible = "arm,cortex-a8";
44 reg = <0x0>;
45 };
33 }; 46 };
34 47
35 tzic: tz-interrupt-controller@0fffc000 { 48 tzic: tz-interrupt-controller@0fffc000 {
@@ -140,6 +153,9 @@
140 reg = <0x50014000 0x4000>; 153 reg = <0x50014000 0x4000>;
141 interrupts = <30>; 154 interrupts = <30>;
142 clocks = <&clks 49>; 155 clocks = <&clks 49>;
156 dmas = <&sdma 24 1 0>,
157 <&sdma 25 1 0>;
158 dma-names = "rx", "tx";
143 fsl,fifo-depth = <15>; 159 fsl,fifo-depth = <15>;
144 fsl,ssi-dma-events = <25 24 23 22>; /* TX0 RX0 TX1 RX1 */ 160 fsl,ssi-dma-events = <25 24 23 22>; /* TX0 RX0 TX1 RX1 */
145 status = "disabled"; 161 status = "disabled";
@@ -957,6 +973,13 @@
957 reg = <0x60000000 0x10000000>; 973 reg = <0x60000000 0x10000000>;
958 ranges; 974 ranges;
959 975
976 iim: iim@63f98000 {
977 compatible = "fsl,imx53-iim", "fsl,imx27-iim";
978 reg = <0x63f98000 0x4000>;
979 interrupts = <69>;
980 clocks = <&clks 107>;
981 };
982
960 uart5: serial@63f90000 { 983 uart5: serial@63f90000 {
961 compatible = "fsl,imx53-uart", "fsl,imx21-uart"; 984 compatible = "fsl,imx53-uart", "fsl,imx21-uart";
962 reg = <0x63f90000 0x4000>; 985 reg = <0x63f90000 0x4000>;
@@ -990,6 +1013,7 @@
990 interrupts = <6>; 1013 interrupts = <6>;
991 clocks = <&clks 56>, <&clks 56>; 1014 clocks = <&clks 56>, <&clks 56>;
992 clock-names = "ipg", "ahb"; 1015 clock-names = "ipg", "ahb";
1016 #dma-cells = <3>;
993 fsl,sdma-ram-script-name = "imx/sdma/sdma-imx53.bin"; 1017 fsl,sdma-ram-script-name = "imx/sdma/sdma-imx53.bin";
994 }; 1018 };
995 1019
@@ -1029,6 +1053,9 @@
1029 reg = <0x63fcc000 0x4000>; 1053 reg = <0x63fcc000 0x4000>;
1030 interrupts = <29>; 1054 interrupts = <29>;
1031 clocks = <&clks 48>; 1055 clocks = <&clks 48>;
1056 dmas = <&sdma 28 0 0>,
1057 <&sdma 29 0 0>;
1058 dma-names = "rx", "tx";
1032 fsl,fifo-depth = <15>; 1059 fsl,fifo-depth = <15>;
1033 fsl,ssi-dma-events = <29 28 27 26>; /* TX0 RX0 TX1 RX1 */ 1060 fsl,ssi-dma-events = <29 28 27 26>; /* TX0 RX0 TX1 RX1 */
1034 status = "disabled"; 1061 status = "disabled";
@@ -1053,6 +1080,9 @@
1053 reg = <0x63fe8000 0x4000>; 1080 reg = <0x63fe8000 0x4000>;
1054 interrupts = <96>; 1081 interrupts = <96>;
1055 clocks = <&clks 50>; 1082 clocks = <&clks 50>;
1083 dmas = <&sdma 46 0 0>,
1084 <&sdma 47 0 0>;
1085 dma-names = "rx", "tx";
1056 fsl,fifo-depth = <15>; 1086 fsl,fifo-depth = <15>;
1057 fsl,ssi-dma-events = <47 46 45 44>; /* TX0 RX0 TX1 RX1 */ 1087 fsl,ssi-dma-events = <47 46 45 44>; /* TX0 RX0 TX1 RX1 */
1058 status = "disabled"; 1088 status = "disabled";
@@ -1076,6 +1106,22 @@
1076 crtcs = <&ipu 1>; 1106 crtcs = <&ipu 1>;
1077 status = "disabled"; 1107 status = "disabled";
1078 }; 1108 };
1109
1110 vpu: vpu@63ff4000 {
1111 compatible = "fsl,imx53-vpu";
1112 reg = <0x63ff4000 0x1000>;
1113 interrupts = <9>;
1114 clocks = <&clks 63>, <&clks 63>;
1115 clock-names = "per", "ahb";
1116 iram = <&ocram>;
1117 status = "disabled";
1118 };
1119 };
1120
1121 ocram: sram@f8000000 {
1122 compatible = "mmio-sram";
1123 reg = <0xf8000000 0x20000>;
1124 clocks = <&clks 186>;
1079 }; 1125 };
1080 }; 1126 };
1081}; 1127};
diff --git a/arch/arm/boot/dts/imx6dl-pinfunc.h b/arch/arm/boot/dts/imx6dl-pinfunc.h
index 9aab950ec269..b81a7a4ebab6 100644
--- a/arch/arm/boot/dts/imx6dl-pinfunc.h
+++ b/arch/arm/boot/dts/imx6dl-pinfunc.h
@@ -14,1072 +14,1076 @@
14 * The pin function ID is a tuple of 14 * The pin function ID is a tuple of
15 * <mux_reg conf_reg input_reg mux_mode input_val> 15 * <mux_reg conf_reg input_reg mux_mode input_val>
16 */ 16 */
17#define MX6DL_PAD_CSI0_DAT10__IPU1_CSI0_DATA10 0x04c 0x360 0x000 0x0 0x0 17#define MX6QDL_PAD_CSI0_DAT10__IPU1_CSI0_DATA10 0x04c 0x360 0x000 0x0 0x0
18#define MX6DL_PAD_CSI0_DAT10__AUD3_RXC 0x04c 0x360 0x000 0x1 0x0 18#define MX6QDL_PAD_CSI0_DAT10__AUD3_RXC 0x04c 0x360 0x000 0x1 0x0
19#define MX6DL_PAD_CSI0_DAT10__ECSPI2_MISO 0x04c 0x360 0x7f8 0x2 0x0 19#define MX6QDL_PAD_CSI0_DAT10__ECSPI2_MISO 0x04c 0x360 0x7f8 0x2 0x0
20#define MX6DL_PAD_CSI0_DAT10__UART1_TX_DATA 0x04c 0x360 0x000 0x3 0x0 20#define MX6QDL_PAD_CSI0_DAT10__UART1_TX_DATA 0x04c 0x360 0x000 0x3 0x0
21#define MX6DL_PAD_CSI0_DAT10__UART1_RX_DATA 0x04c 0x360 0x8fc 0x3 0x0 21#define MX6QDL_PAD_CSI0_DAT10__UART1_RX_DATA 0x04c 0x360 0x8fc 0x3 0x0
22#define MX6DL_PAD_CSI0_DAT10__GPIO5_IO28 0x04c 0x360 0x000 0x5 0x0 22#define MX6QDL_PAD_CSI0_DAT10__GPIO5_IO28 0x04c 0x360 0x000 0x5 0x0
23#define MX6DL_PAD_CSI0_DAT10__ARM_TRACE07 0x04c 0x360 0x000 0x7 0x0 23#define MX6QDL_PAD_CSI0_DAT10__ARM_TRACE07 0x04c 0x360 0x000 0x7 0x0
24#define MX6DL_PAD_CSI0_DAT11__IPU1_CSI0_DATA11 0x050 0x364 0x000 0x0 0x0 24#define MX6QDL_PAD_CSI0_DAT11__IPU1_CSI0_DATA11 0x050 0x364 0x000 0x0 0x0
25#define MX6DL_PAD_CSI0_DAT11__AUD3_RXFS 0x050 0x364 0x000 0x1 0x0 25#define MX6QDL_PAD_CSI0_DAT11__AUD3_RXFS 0x050 0x364 0x000 0x1 0x0
26#define MX6DL_PAD_CSI0_DAT11__ECSPI2_SS0 0x050 0x364 0x800 0x2 0x0 26#define MX6QDL_PAD_CSI0_DAT11__ECSPI2_SS0 0x050 0x364 0x800 0x2 0x0
27#define MX6DL_PAD_CSI0_DAT11__UART1_RX_DATA 0x050 0x364 0x8fc 0x3 0x1 27#define MX6QDL_PAD_CSI0_DAT11__UART1_RX_DATA 0x050 0x364 0x8fc 0x3 0x1
28#define MX6DL_PAD_CSI0_DAT11__UART1_TX_DATA 0x050 0x364 0x000 0x3 0x0 28#define MX6QDL_PAD_CSI0_DAT11__UART1_TX_DATA 0x050 0x364 0x000 0x3 0x0
29#define MX6DL_PAD_CSI0_DAT11__GPIO5_IO29 0x050 0x364 0x000 0x5 0x0 29#define MX6QDL_PAD_CSI0_DAT11__GPIO5_IO29 0x050 0x364 0x000 0x5 0x0
30#define MX6DL_PAD_CSI0_DAT11__ARM_TRACE08 0x050 0x364 0x000 0x7 0x0 30#define MX6QDL_PAD_CSI0_DAT11__ARM_TRACE08 0x050 0x364 0x000 0x7 0x0
31#define MX6DL_PAD_CSI0_DAT12__IPU1_CSI0_DATA12 0x054 0x368 0x000 0x0 0x0 31#define MX6QDL_PAD_CSI0_DAT12__IPU1_CSI0_DATA12 0x054 0x368 0x000 0x0 0x0
32#define MX6DL_PAD_CSI0_DAT12__EIM_DATA08 0x054 0x368 0x000 0x1 0x0 32#define MX6QDL_PAD_CSI0_DAT12__EIM_DATA08 0x054 0x368 0x000 0x1 0x0
33#define MX6DL_PAD_CSI0_DAT12__UART4_TX_DATA 0x054 0x368 0x000 0x3 0x0 33#define MX6QDL_PAD_CSI0_DAT12__UART4_TX_DATA 0x054 0x368 0x000 0x3 0x0
34#define MX6DL_PAD_CSI0_DAT12__UART4_RX_DATA 0x054 0x368 0x914 0x3 0x0 34#define MX6QDL_PAD_CSI0_DAT12__UART4_RX_DATA 0x054 0x368 0x914 0x3 0x0
35#define MX6DL_PAD_CSI0_DAT12__GPIO5_IO30 0x054 0x368 0x000 0x5 0x0 35#define MX6QDL_PAD_CSI0_DAT12__GPIO5_IO30 0x054 0x368 0x000 0x5 0x0
36#define MX6DL_PAD_CSI0_DAT12__ARM_TRACE09 0x054 0x368 0x000 0x7 0x0 36#define MX6QDL_PAD_CSI0_DAT12__ARM_TRACE09 0x054 0x368 0x000 0x7 0x0
37#define MX6DL_PAD_CSI0_DAT13__IPU1_CSI0_DATA13 0x058 0x36c 0x000 0x0 0x0 37#define MX6QDL_PAD_CSI0_DAT13__IPU1_CSI0_DATA13 0x058 0x36c 0x000 0x0 0x0
38#define MX6DL_PAD_CSI0_DAT13__EIM_DATA09 0x058 0x36c 0x000 0x1 0x0 38#define MX6QDL_PAD_CSI0_DAT13__EIM_DATA09 0x058 0x36c 0x000 0x1 0x0
39#define MX6DL_PAD_CSI0_DAT13__UART4_RX_DATA 0x058 0x36c 0x914 0x3 0x1 39#define MX6QDL_PAD_CSI0_DAT13__UART4_RX_DATA 0x058 0x36c 0x914 0x3 0x1
40#define MX6DL_PAD_CSI0_DAT13__UART4_TX_DATA 0x058 0x36c 0x000 0x3 0x0 40#define MX6QDL_PAD_CSI0_DAT13__UART4_TX_DATA 0x058 0x36c 0x000 0x3 0x0
41#define MX6DL_PAD_CSI0_DAT13__GPIO5_IO31 0x058 0x36c 0x000 0x5 0x0 41#define MX6QDL_PAD_CSI0_DAT13__GPIO5_IO31 0x058 0x36c 0x000 0x5 0x0
42#define MX6DL_PAD_CSI0_DAT13__ARM_TRACE10 0x058 0x36c 0x000 0x7 0x0 42#define MX6QDL_PAD_CSI0_DAT13__ARM_TRACE10 0x058 0x36c 0x000 0x7 0x0
43#define MX6DL_PAD_CSI0_DAT14__IPU1_CSI0_DATA14 0x05c 0x370 0x000 0x0 0x0 43#define MX6QDL_PAD_CSI0_DAT14__IPU1_CSI0_DATA14 0x05c 0x370 0x000 0x0 0x0
44#define MX6DL_PAD_CSI0_DAT14__EIM_DATA10 0x05c 0x370 0x000 0x1 0x0 44#define MX6QDL_PAD_CSI0_DAT14__EIM_DATA10 0x05c 0x370 0x000 0x1 0x0
45#define MX6DL_PAD_CSI0_DAT14__UART5_TX_DATA 0x05c 0x370 0x000 0x3 0x0 45#define MX6QDL_PAD_CSI0_DAT14__UART5_TX_DATA 0x05c 0x370 0x000 0x3 0x0
46#define MX6DL_PAD_CSI0_DAT14__UART5_RX_DATA 0x05c 0x370 0x91c 0x3 0x0 46#define MX6QDL_PAD_CSI0_DAT14__UART5_RX_DATA 0x05c 0x370 0x91c 0x3 0x0
47#define MX6DL_PAD_CSI0_DAT14__GPIO6_IO00 0x05c 0x370 0x000 0x5 0x0 47#define MX6QDL_PAD_CSI0_DAT14__GPIO6_IO00 0x05c 0x370 0x000 0x5 0x0
48#define MX6DL_PAD_CSI0_DAT14__ARM_TRACE11 0x05c 0x370 0x000 0x7 0x0 48#define MX6QDL_PAD_CSI0_DAT14__ARM_TRACE11 0x05c 0x370 0x000 0x7 0x0
49#define MX6DL_PAD_CSI0_DAT15__IPU1_CSI0_DATA15 0x060 0x374 0x000 0x0 0x0 49#define MX6QDL_PAD_CSI0_DAT15__IPU1_CSI0_DATA15 0x060 0x374 0x000 0x0 0x0
50#define MX6DL_PAD_CSI0_DAT15__EIM_DATA11 0x060 0x374 0x000 0x1 0x0 50#define MX6QDL_PAD_CSI0_DAT15__EIM_DATA11 0x060 0x374 0x000 0x1 0x0
51#define MX6DL_PAD_CSI0_DAT15__UART5_RX_DATA 0x060 0x374 0x91c 0x3 0x1 51#define MX6QDL_PAD_CSI0_DAT15__UART5_RX_DATA 0x060 0x374 0x91c 0x3 0x1
52#define MX6DL_PAD_CSI0_DAT15__UART5_TX_DATA 0x060 0x374 0x000 0x3 0x0 52#define MX6QDL_PAD_CSI0_DAT15__UART5_TX_DATA 0x060 0x374 0x000 0x3 0x0
53#define MX6DL_PAD_CSI0_DAT15__GPIO6_IO01 0x060 0x374 0x000 0x5 0x0 53#define MX6QDL_PAD_CSI0_DAT15__GPIO6_IO01 0x060 0x374 0x000 0x5 0x0
54#define MX6DL_PAD_CSI0_DAT15__ARM_TRACE12 0x060 0x374 0x000 0x7 0x0 54#define MX6QDL_PAD_CSI0_DAT15__ARM_TRACE12 0x060 0x374 0x000 0x7 0x0
55#define MX6DL_PAD_CSI0_DAT16__IPU1_CSI0_DATA16 0x064 0x378 0x000 0x0 0x0 55#define MX6QDL_PAD_CSI0_DAT16__IPU1_CSI0_DATA16 0x064 0x378 0x000 0x0 0x0
56#define MX6DL_PAD_CSI0_DAT16__EIM_DATA12 0x064 0x378 0x000 0x1 0x0 56#define MX6QDL_PAD_CSI0_DAT16__EIM_DATA12 0x064 0x378 0x000 0x1 0x0
57#define MX6DL_PAD_CSI0_DAT16__UART4_RTS_B 0x064 0x378 0x910 0x3 0x0 57#define MX6QDL_PAD_CSI0_DAT16__UART4_RTS_B 0x064 0x378 0x910 0x3 0x0
58#define MX6DL_PAD_CSI0_DAT16__UART4_CTS_B 0x064 0x378 0x000 0x3 0x0 58#define MX6QDL_PAD_CSI0_DAT16__UART4_CTS_B 0x064 0x378 0x000 0x3 0x0
59#define MX6DL_PAD_CSI0_DAT16__GPIO6_IO02 0x064 0x378 0x000 0x5 0x0 59#define MX6QDL_PAD_CSI0_DAT16__GPIO6_IO02 0x064 0x378 0x000 0x5 0x0
60#define MX6DL_PAD_CSI0_DAT16__ARM_TRACE13 0x064 0x378 0x000 0x7 0x0 60#define MX6QDL_PAD_CSI0_DAT16__ARM_TRACE13 0x064 0x378 0x000 0x7 0x0
61#define MX6DL_PAD_CSI0_DAT17__IPU1_CSI0_DATA17 0x068 0x37c 0x000 0x0 0x0 61#define MX6QDL_PAD_CSI0_DAT17__IPU1_CSI0_DATA17 0x068 0x37c 0x000 0x0 0x0
62#define MX6DL_PAD_CSI0_DAT17__EIM_DATA13 0x068 0x37c 0x000 0x1 0x0 62#define MX6QDL_PAD_CSI0_DAT17__EIM_DATA13 0x068 0x37c 0x000 0x1 0x0
63#define MX6DL_PAD_CSI0_DAT17__UART4_CTS_B 0x068 0x37c 0x000 0x3 0x0 63#define MX6QDL_PAD_CSI0_DAT17__UART4_CTS_B 0x068 0x37c 0x000 0x3 0x0
64#define MX6DL_PAD_CSI0_DAT17__UART4_RTS_B 0x068 0x37c 0x910 0x3 0x1 64#define MX6QDL_PAD_CSI0_DAT17__UART4_RTS_B 0x068 0x37c 0x910 0x3 0x1
65#define MX6DL_PAD_CSI0_DAT17__GPIO6_IO03 0x068 0x37c 0x000 0x5 0x0 65#define MX6QDL_PAD_CSI0_DAT17__GPIO6_IO03 0x068 0x37c 0x000 0x5 0x0
66#define MX6DL_PAD_CSI0_DAT17__ARM_TRACE14 0x068 0x37c 0x000 0x7 0x0 66#define MX6QDL_PAD_CSI0_DAT17__ARM_TRACE14 0x068 0x37c 0x000 0x7 0x0
67#define MX6DL_PAD_CSI0_DAT18__IPU1_CSI0_DATA18 0x06c 0x380 0x000 0x0 0x0 67#define MX6QDL_PAD_CSI0_DAT18__IPU1_CSI0_DATA18 0x06c 0x380 0x000 0x0 0x0
68#define MX6DL_PAD_CSI0_DAT18__EIM_DATA14 0x06c 0x380 0x000 0x1 0x0 68#define MX6QDL_PAD_CSI0_DAT18__EIM_DATA14 0x06c 0x380 0x000 0x1 0x0
69#define MX6DL_PAD_CSI0_DAT18__UART5_RTS_B 0x06c 0x380 0x918 0x3 0x0 69#define MX6QDL_PAD_CSI0_DAT18__UART5_RTS_B 0x06c 0x380 0x918 0x3 0x0
70#define MX6DL_PAD_CSI0_DAT18__UART5_CTS_B 0x06c 0x380 0x000 0x3 0x0 70#define MX6QDL_PAD_CSI0_DAT18__UART5_CTS_B 0x06c 0x380 0x000 0x3 0x0
71#define MX6DL_PAD_CSI0_DAT18__GPIO6_IO04 0x06c 0x380 0x000 0x5 0x0 71#define MX6QDL_PAD_CSI0_DAT18__GPIO6_IO04 0x06c 0x380 0x000 0x5 0x0
72#define MX6DL_PAD_CSI0_DAT18__ARM_TRACE15 0x06c 0x380 0x000 0x7 0x0 72#define MX6QDL_PAD_CSI0_DAT18__ARM_TRACE15 0x06c 0x380 0x000 0x7 0x0
73#define MX6DL_PAD_CSI0_DAT19__IPU1_CSI0_DATA19 0x070 0x384 0x000 0x0 0x0 73#define MX6QDL_PAD_CSI0_DAT19__IPU1_CSI0_DATA19 0x070 0x384 0x000 0x0 0x0
74#define MX6DL_PAD_CSI0_DAT19__EIM_DATA15 0x070 0x384 0x000 0x1 0x0 74#define MX6QDL_PAD_CSI0_DAT19__EIM_DATA15 0x070 0x384 0x000 0x1 0x0
75#define MX6DL_PAD_CSI0_DAT19__UART5_CTS_B 0x070 0x384 0x000 0x3 0x0 75#define MX6QDL_PAD_CSI0_DAT19__UART5_CTS_B 0x070 0x384 0x000 0x3 0x0
76#define MX6DL_PAD_CSI0_DAT19__UART5_RTS_B 0x070 0x384 0x918 0x3 0x1 76#define MX6QDL_PAD_CSI0_DAT19__UART5_RTS_B 0x070 0x384 0x918 0x3 0x1
77#define MX6DL_PAD_CSI0_DAT19__GPIO6_IO05 0x070 0x384 0x000 0x5 0x0 77#define MX6QDL_PAD_CSI0_DAT19__GPIO6_IO05 0x070 0x384 0x000 0x5 0x0
78#define MX6DL_PAD_CSI0_DAT4__IPU1_CSI0_DATA04 0x074 0x388 0x000 0x0 0x0 78#define MX6QDL_PAD_CSI0_DAT4__IPU1_CSI0_DATA04 0x074 0x388 0x000 0x0 0x0
79#define MX6DL_PAD_CSI0_DAT4__EIM_DATA02 0x074 0x388 0x000 0x1 0x0 79#define MX6QDL_PAD_CSI0_DAT4__EIM_DATA02 0x074 0x388 0x000 0x1 0x0
80#define MX6DL_PAD_CSI0_DAT4__ECSPI1_SCLK 0x074 0x388 0x7d8 0x2 0x0 80#define MX6QDL_PAD_CSI0_DAT4__ECSPI1_SCLK 0x074 0x388 0x7d8 0x2 0x0
81#define MX6DL_PAD_CSI0_DAT4__KEY_COL5 0x074 0x388 0x8c0 0x3 0x0 81#define MX6QDL_PAD_CSI0_DAT4__KEY_COL5 0x074 0x388 0x8c0 0x3 0x0
82#define MX6DL_PAD_CSI0_DAT4__AUD3_TXC 0x074 0x388 0x000 0x4 0x0 82#define MX6QDL_PAD_CSI0_DAT4__AUD3_TXC 0x074 0x388 0x000 0x4 0x0
83#define MX6DL_PAD_CSI0_DAT4__GPIO5_IO22 0x074 0x388 0x000 0x5 0x0 83#define MX6QDL_PAD_CSI0_DAT4__GPIO5_IO22 0x074 0x388 0x000 0x5 0x0
84#define MX6DL_PAD_CSI0_DAT4__ARM_TRACE01 0x074 0x388 0x000 0x7 0x0 84#define MX6QDL_PAD_CSI0_DAT4__ARM_TRACE01 0x074 0x388 0x000 0x7 0x0
85#define MX6DL_PAD_CSI0_DAT5__IPU1_CSI0_DATA05 0x078 0x38c 0x000 0x0 0x0 85#define MX6QDL_PAD_CSI0_DAT5__IPU1_CSI0_DATA05 0x078 0x38c 0x000 0x0 0x0
86#define MX6DL_PAD_CSI0_DAT5__EIM_DATA03 0x078 0x38c 0x000 0x1 0x0 86#define MX6QDL_PAD_CSI0_DAT5__EIM_DATA03 0x078 0x38c 0x000 0x1 0x0
87#define MX6DL_PAD_CSI0_DAT5__ECSPI1_MOSI 0x078 0x38c 0x7e0 0x2 0x0 87#define MX6QDL_PAD_CSI0_DAT5__ECSPI1_MOSI 0x078 0x38c 0x7e0 0x2 0x0
88#define MX6DL_PAD_CSI0_DAT5__KEY_ROW5 0x078 0x38c 0x8cc 0x3 0x0 88#define MX6QDL_PAD_CSI0_DAT5__KEY_ROW5 0x078 0x38c 0x8cc 0x3 0x0
89#define MX6DL_PAD_CSI0_DAT5__AUD3_TXD 0x078 0x38c 0x000 0x4 0x0 89#define MX6QDL_PAD_CSI0_DAT5__AUD3_TXD 0x078 0x38c 0x000 0x4 0x0
90#define MX6DL_PAD_CSI0_DAT5__GPIO5_IO23 0x078 0x38c 0x000 0x5 0x0 90#define MX6QDL_PAD_CSI0_DAT5__GPIO5_IO23 0x078 0x38c 0x000 0x5 0x0
91#define MX6DL_PAD_CSI0_DAT5__ARM_TRACE02 0x078 0x38c 0x000 0x7 0x0 91#define MX6QDL_PAD_CSI0_DAT5__ARM_TRACE02 0x078 0x38c 0x000 0x7 0x0
92#define MX6DL_PAD_CSI0_DAT6__IPU1_CSI0_DATA06 0x07c 0x390 0x000 0x0 0x0 92#define MX6QDL_PAD_CSI0_DAT6__IPU1_CSI0_DATA06 0x07c 0x390 0x000 0x0 0x0
93#define MX6DL_PAD_CSI0_DAT6__EIM_DATA04 0x07c 0x390 0x000 0x1 0x0 93#define MX6QDL_PAD_CSI0_DAT6__EIM_DATA04 0x07c 0x390 0x000 0x1 0x0
94#define MX6DL_PAD_CSI0_DAT6__ECSPI1_MISO 0x07c 0x390 0x7dc 0x2 0x0 94#define MX6QDL_PAD_CSI0_DAT6__ECSPI1_MISO 0x07c 0x390 0x7dc 0x2 0x0
95#define MX6DL_PAD_CSI0_DAT6__KEY_COL6 0x07c 0x390 0x8c4 0x3 0x0 95#define MX6QDL_PAD_CSI0_DAT6__KEY_COL6 0x07c 0x390 0x8c4 0x3 0x0
96#define MX6DL_PAD_CSI0_DAT6__AUD3_TXFS 0x07c 0x390 0x000 0x4 0x0 96#define MX6QDL_PAD_CSI0_DAT6__AUD3_TXFS 0x07c 0x390 0x000 0x4 0x0
97#define MX6DL_PAD_CSI0_DAT6__GPIO5_IO24 0x07c 0x390 0x000 0x5 0x0 97#define MX6QDL_PAD_CSI0_DAT6__GPIO5_IO24 0x07c 0x390 0x000 0x5 0x0
98#define MX6DL_PAD_CSI0_DAT6__ARM_TRACE03 0x07c 0x390 0x000 0x7 0x0 98#define MX6QDL_PAD_CSI0_DAT6__ARM_TRACE03 0x07c 0x390 0x000 0x7 0x0
99#define MX6DL_PAD_CSI0_DAT7__IPU1_CSI0_DATA07 0x080 0x394 0x000 0x0 0x0 99#define MX6QDL_PAD_CSI0_DAT7__IPU1_CSI0_DATA07 0x080 0x394 0x000 0x0 0x0
100#define MX6DL_PAD_CSI0_DAT7__EIM_DATA05 0x080 0x394 0x000 0x1 0x0 100#define MX6QDL_PAD_CSI0_DAT7__EIM_DATA05 0x080 0x394 0x000 0x1 0x0
101#define MX6DL_PAD_CSI0_DAT7__ECSPI1_SS0 0x080 0x394 0x7e4 0x2 0x0 101#define MX6QDL_PAD_CSI0_DAT7__ECSPI1_SS0 0x080 0x394 0x7e4 0x2 0x0
102#define MX6DL_PAD_CSI0_DAT7__KEY_ROW6 0x080 0x394 0x8d0 0x3 0x0 102#define MX6QDL_PAD_CSI0_DAT7__KEY_ROW6 0x080 0x394 0x8d0 0x3 0x0
103#define MX6DL_PAD_CSI0_DAT7__AUD3_RXD 0x080 0x394 0x000 0x4 0x0 103#define MX6QDL_PAD_CSI0_DAT7__AUD3_RXD 0x080 0x394 0x000 0x4 0x0
104#define MX6DL_PAD_CSI0_DAT7__GPIO5_IO25 0x080 0x394 0x000 0x5 0x0 104#define MX6QDL_PAD_CSI0_DAT7__GPIO5_IO25 0x080 0x394 0x000 0x5 0x0
105#define MX6DL_PAD_CSI0_DAT7__ARM_TRACE04 0x080 0x394 0x000 0x7 0x0 105#define MX6QDL_PAD_CSI0_DAT7__ARM_TRACE04 0x080 0x394 0x000 0x7 0x0
106#define MX6DL_PAD_CSI0_DAT8__IPU1_CSI0_DATA08 0x084 0x398 0x000 0x0 0x0 106#define MX6QDL_PAD_CSI0_DAT8__IPU1_CSI0_DATA08 0x084 0x398 0x000 0x0 0x0
107#define MX6DL_PAD_CSI0_DAT8__EIM_DATA06 0x084 0x398 0x000 0x1 0x0 107#define MX6QDL_PAD_CSI0_DAT8__EIM_DATA06 0x084 0x398 0x000 0x1 0x0
108#define MX6DL_PAD_CSI0_DAT8__ECSPI2_SCLK 0x084 0x398 0x7f4 0x2 0x0 108#define MX6QDL_PAD_CSI0_DAT8__ECSPI2_SCLK 0x084 0x398 0x7f4 0x2 0x0
109#define MX6DL_PAD_CSI0_DAT8__KEY_COL7 0x084 0x398 0x8c8 0x3 0x0 109#define MX6QDL_PAD_CSI0_DAT8__KEY_COL7 0x084 0x398 0x8c8 0x3 0x0
110#define MX6DL_PAD_CSI0_DAT8__I2C1_SDA 0x084 0x398 0x86c 0x4 0x0 110#define MX6QDL_PAD_CSI0_DAT8__I2C1_SDA 0x084 0x398 0x86c 0x4 0x0
111#define MX6DL_PAD_CSI0_DAT8__GPIO5_IO26 0x084 0x398 0x000 0x5 0x0 111#define MX6QDL_PAD_CSI0_DAT8__GPIO5_IO26 0x084 0x398 0x000 0x5 0x0
112#define MX6DL_PAD_CSI0_DAT8__ARM_TRACE05 0x084 0x398 0x000 0x7 0x0 112#define MX6QDL_PAD_CSI0_DAT8__ARM_TRACE05 0x084 0x398 0x000 0x7 0x0
113#define MX6DL_PAD_CSI0_DAT9__IPU1_CSI0_DATA09 0x088 0x39c 0x000 0x0 0x0 113#define MX6QDL_PAD_CSI0_DAT9__IPU1_CSI0_DATA09 0x088 0x39c 0x000 0x0 0x0
114#define MX6DL_PAD_CSI0_DAT9__EIM_DATA07 0x088 0x39c 0x000 0x1 0x0 114#define MX6QDL_PAD_CSI0_DAT9__EIM_DATA07 0x088 0x39c 0x000 0x1 0x0
115#define MX6DL_PAD_CSI0_DAT9__ECSPI2_MOSI 0x088 0x39c 0x7fc 0x2 0x0 115#define MX6QDL_PAD_CSI0_DAT9__ECSPI2_MOSI 0x088 0x39c 0x7fc 0x2 0x0
116#define MX6DL_PAD_CSI0_DAT9__KEY_ROW7 0x088 0x39c 0x8d4 0x3 0x0 116#define MX6QDL_PAD_CSI0_DAT9__KEY_ROW7 0x088 0x39c 0x8d4 0x3 0x0
117#define MX6DL_PAD_CSI0_DAT9__I2C1_SCL 0x088 0x39c 0x868 0x4 0x0 117#define MX6QDL_PAD_CSI0_DAT9__I2C1_SCL 0x088 0x39c 0x868 0x4 0x0
118#define MX6DL_PAD_CSI0_DAT9__GPIO5_IO27 0x088 0x39c 0x000 0x5 0x0 118#define MX6QDL_PAD_CSI0_DAT9__GPIO5_IO27 0x088 0x39c 0x000 0x5 0x0
119#define MX6DL_PAD_CSI0_DAT9__ARM_TRACE06 0x088 0x39c 0x000 0x7 0x0 119#define MX6QDL_PAD_CSI0_DAT9__ARM_TRACE06 0x088 0x39c 0x000 0x7 0x0
120#define MX6DL_PAD_CSI0_DATA_EN__IPU1_CSI0_DATA_EN 0x08c 0x3a0 0x000 0x0 0x0 120#define MX6QDL_PAD_CSI0_DATA_EN__IPU1_CSI0_DATA_EN 0x08c 0x3a0 0x000 0x0 0x0
121#define MX6DL_PAD_CSI0_DATA_EN__EIM_DATA00 0x08c 0x3a0 0x000 0x1 0x0 121#define MX6QDL_PAD_CSI0_DATA_EN__EIM_DATA00 0x08c 0x3a0 0x000 0x1 0x0
122#define MX6DL_PAD_CSI0_DATA_EN__GPIO5_IO20 0x08c 0x3a0 0x000 0x5 0x0 122#define MX6QDL_PAD_CSI0_DATA_EN__GPIO5_IO20 0x08c 0x3a0 0x000 0x5 0x0
123#define MX6DL_PAD_CSI0_DATA_EN__ARM_TRACE_CLK 0x08c 0x3a0 0x000 0x7 0x0 123#define MX6QDL_PAD_CSI0_DATA_EN__ARM_TRACE_CLK 0x08c 0x3a0 0x000 0x7 0x0
124#define MX6DL_PAD_CSI0_MCLK__IPU1_CSI0_HSYNC 0x090 0x3a4 0x000 0x0 0x0 124#define MX6QDL_PAD_CSI0_MCLK__IPU1_CSI0_HSYNC 0x090 0x3a4 0x000 0x0 0x0
125#define MX6DL_PAD_CSI0_MCLK__CCM_CLKO1 0x090 0x3a4 0x000 0x3 0x0 125#define MX6QDL_PAD_CSI0_MCLK__CCM_CLKO1 0x090 0x3a4 0x000 0x3 0x0
126#define MX6DL_PAD_CSI0_MCLK__GPIO5_IO19 0x090 0x3a4 0x000 0x5 0x0 126#define MX6QDL_PAD_CSI0_MCLK__GPIO5_IO19 0x090 0x3a4 0x000 0x5 0x0
127#define MX6DL_PAD_CSI0_MCLK__ARM_TRACE_CTL 0x090 0x3a4 0x000 0x7 0x0 127#define MX6QDL_PAD_CSI0_MCLK__ARM_TRACE_CTL 0x090 0x3a4 0x000 0x7 0x0
128#define MX6DL_PAD_CSI0_PIXCLK__IPU1_CSI0_PIXCLK 0x094 0x3a8 0x000 0x0 0x0 128#define MX6QDL_PAD_CSI0_PIXCLK__IPU1_CSI0_PIXCLK 0x094 0x3a8 0x000 0x0 0x0
129#define MX6DL_PAD_CSI0_PIXCLK__GPIO5_IO18 0x094 0x3a8 0x000 0x5 0x0 129#define MX6QDL_PAD_CSI0_PIXCLK__GPIO5_IO18 0x094 0x3a8 0x000 0x5 0x0
130#define MX6DL_PAD_CSI0_PIXCLK__ARM_EVENTO 0x094 0x3a8 0x000 0x7 0x0 130#define MX6QDL_PAD_CSI0_PIXCLK__ARM_EVENTO 0x094 0x3a8 0x000 0x7 0x0
131#define MX6DL_PAD_CSI0_VSYNC__IPU1_CSI0_VSYNC 0x098 0x3ac 0x000 0x0 0x0 131#define MX6QDL_PAD_CSI0_VSYNC__IPU1_CSI0_VSYNC 0x098 0x3ac 0x000 0x0 0x0
132#define MX6DL_PAD_CSI0_VSYNC__EIM_DATA01 0x098 0x3ac 0x000 0x1 0x0 132#define MX6QDL_PAD_CSI0_VSYNC__EIM_DATA01 0x098 0x3ac 0x000 0x1 0x0
133#define MX6DL_PAD_CSI0_VSYNC__GPIO5_IO21 0x098 0x3ac 0x000 0x5 0x0 133#define MX6QDL_PAD_CSI0_VSYNC__GPIO5_IO21 0x098 0x3ac 0x000 0x5 0x0
134#define MX6DL_PAD_CSI0_VSYNC__ARM_TRACE00 0x098 0x3ac 0x000 0x7 0x0 134#define MX6QDL_PAD_CSI0_VSYNC__ARM_TRACE00 0x098 0x3ac 0x000 0x7 0x0
135#define MX6DL_PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK 0x09c 0x3b0 0x000 0x0 0x0 135#define MX6QDL_PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK 0x09c 0x3b0 0x000 0x0 0x0
136#define MX6DL_PAD_DI0_DISP_CLK__LCD_CLK 0x09c 0x3b0 0x000 0x1 0x0 136#define MX6QDL_PAD_DI0_DISP_CLK__LCD_CLK 0x09c 0x3b0 0x000 0x1 0x0
137#define MX6DL_PAD_DI0_DISP_CLK__GPIO4_IO16 0x09c 0x3b0 0x000 0x5 0x0 137#define MX6QDL_PAD_DI0_DISP_CLK__GPIO4_IO16 0x09c 0x3b0 0x000 0x5 0x0
138#define MX6DL_PAD_DI0_DISP_CLK__LCD_WR_RWN 0x09c 0x3b0 0x000 0x8 0x0 138#define MX6QDL_PAD_DI0_DISP_CLK__LCD_WR_RWN 0x09c 0x3b0 0x000 0x8 0x0
139#define MX6DL_PAD_DI0_PIN15__IPU1_DI0_PIN15 0x0a0 0x3b4 0x000 0x0 0x0 139#define MX6QDL_PAD_DI0_PIN15__IPU1_DI0_PIN15 0x0a0 0x3b4 0x000 0x0 0x0
140#define MX6DL_PAD_DI0_PIN15__LCD_ENABLE 0x0a0 0x3b4 0x000 0x1 0x0 140#define MX6QDL_PAD_DI0_PIN15__LCD_ENABLE 0x0a0 0x3b4 0x000 0x1 0x0
141#define MX6DL_PAD_DI0_PIN15__AUD6_TXC 0x0a0 0x3b4 0x000 0x2 0x0 141#define MX6QDL_PAD_DI0_PIN15__AUD6_TXC 0x0a0 0x3b4 0x000 0x2 0x0
142#define MX6DL_PAD_DI0_PIN15__GPIO4_IO17 0x0a0 0x3b4 0x000 0x5 0x0 142#define MX6QDL_PAD_DI0_PIN15__GPIO4_IO17 0x0a0 0x3b4 0x000 0x5 0x0
143#define MX6DL_PAD_DI0_PIN15__LCD_RD_E 0x0a0 0x3b4 0x000 0x8 0x0 143#define MX6QDL_PAD_DI0_PIN15__LCD_RD_E 0x0a0 0x3b4 0x000 0x8 0x0
144#define MX6DL_PAD_DI0_PIN2__IPU1_DI0_PIN02 0x0a4 0x3b8 0x000 0x0 0x0 144#define MX6QDL_PAD_DI0_PIN2__IPU1_DI0_PIN02 0x0a4 0x3b8 0x000 0x0 0x0
145#define MX6DL_PAD_DI0_PIN2__LCD_HSYNC 0x0a4 0x3b8 0x8d8 0x1 0x0 145#define MX6QDL_PAD_DI0_PIN2__LCD_HSYNC 0x0a4 0x3b8 0x8d8 0x1 0x0
146#define MX6DL_PAD_DI0_PIN2__AUD6_TXD 0x0a4 0x3b8 0x000 0x2 0x0 146#define MX6QDL_PAD_DI0_PIN2__AUD6_TXD 0x0a4 0x3b8 0x000 0x2 0x0
147#define MX6DL_PAD_DI0_PIN2__GPIO4_IO18 0x0a4 0x3b8 0x000 0x5 0x0 147#define MX6QDL_PAD_DI0_PIN2__GPIO4_IO18 0x0a4 0x3b8 0x000 0x5 0x0
148#define MX6DL_PAD_DI0_PIN2__LCD_RS 0x0a4 0x3b8 0x000 0x8 0x0 148#define MX6QDL_PAD_DI0_PIN2__LCD_RS 0x0a4 0x3b8 0x000 0x8 0x0
149#define MX6DL_PAD_DI0_PIN3__IPU1_DI0_PIN03 0x0a8 0x3bc 0x000 0x0 0x0 149#define MX6QDL_PAD_DI0_PIN3__IPU1_DI0_PIN03 0x0a8 0x3bc 0x000 0x0 0x0
150#define MX6DL_PAD_DI0_PIN3__LCD_VSYNC 0x0a8 0x3bc 0x000 0x1 0x0 150#define MX6QDL_PAD_DI0_PIN3__LCD_VSYNC 0x0a8 0x3bc 0x000 0x1 0x0
151#define MX6DL_PAD_DI0_PIN3__AUD6_TXFS 0x0a8 0x3bc 0x000 0x2 0x0 151#define MX6QDL_PAD_DI0_PIN3__AUD6_TXFS 0x0a8 0x3bc 0x000 0x2 0x0
152#define MX6DL_PAD_DI0_PIN3__GPIO4_IO19 0x0a8 0x3bc 0x000 0x5 0x0 152#define MX6QDL_PAD_DI0_PIN3__GPIO4_IO19 0x0a8 0x3bc 0x000 0x5 0x0
153#define MX6DL_PAD_DI0_PIN3__LCD_CS 0x0a8 0x3bc 0x000 0x8 0x0 153#define MX6QDL_PAD_DI0_PIN3__LCD_CS 0x0a8 0x3bc 0x000 0x8 0x0
154#define MX6DL_PAD_DI0_PIN4__IPU1_DI0_PIN04 0x0ac 0x3c0 0x000 0x0 0x0 154#define MX6QDL_PAD_DI0_PIN4__IPU1_DI0_PIN04 0x0ac 0x3c0 0x000 0x0 0x0
155#define MX6DL_PAD_DI0_PIN4__LCD_BUSY 0x0ac 0x3c0 0x8d8 0x1 0x1 155#define MX6QDL_PAD_DI0_PIN4__LCD_BUSY 0x0ac 0x3c0 0x8d8 0x1 0x1
156#define MX6DL_PAD_DI0_PIN4__AUD6_RXD 0x0ac 0x3c0 0x000 0x2 0x0 156#define MX6QDL_PAD_DI0_PIN4__AUD6_RXD 0x0ac 0x3c0 0x000 0x2 0x0
157#define MX6DL_PAD_DI0_PIN4__SD1_WP 0x0ac 0x3c0 0x92c 0x3 0x0 157#define MX6QDL_PAD_DI0_PIN4__SD1_WP 0x0ac 0x3c0 0x92c 0x3 0x0
158#define MX6DL_PAD_DI0_PIN4__GPIO4_IO20 0x0ac 0x3c0 0x000 0x5 0x0 158#define MX6QDL_PAD_DI0_PIN4__GPIO4_IO20 0x0ac 0x3c0 0x000 0x5 0x0
159#define MX6DL_PAD_DI0_PIN4__LCD_RESET 0x0ac 0x3c0 0x000 0x8 0x0 159#define MX6QDL_PAD_DI0_PIN4__LCD_RESET 0x0ac 0x3c0 0x000 0x8 0x0
160#define MX6DL_PAD_DISP0_DAT0__IPU1_DISP0_DATA00 0x0b0 0x3c4 0x000 0x0 0x0 160#define MX6QDL_PAD_DISP0_DAT0__IPU1_DISP0_DATA00 0x0b0 0x3c4 0x000 0x0 0x0
161#define MX6DL_PAD_DISP0_DAT0__LCD_DATA00 0x0b0 0x3c4 0x000 0x1 0x0 161#define MX6QDL_PAD_DISP0_DAT0__LCD_DATA00 0x0b0 0x3c4 0x000 0x1 0x0
162#define MX6DL_PAD_DISP0_DAT0__ECSPI3_SCLK 0x0b0 0x3c4 0x000 0x2 0x0 162#define MX6QDL_PAD_DISP0_DAT0__ECSPI3_SCLK 0x0b0 0x3c4 0x000 0x2 0x0
163#define MX6DL_PAD_DISP0_DAT0__GPIO4_IO21 0x0b0 0x3c4 0x000 0x5 0x0 163#define MX6QDL_PAD_DISP0_DAT0__GPIO4_IO21 0x0b0 0x3c4 0x000 0x5 0x0
164#define MX6DL_PAD_DISP0_DAT1__IPU1_DISP0_DATA01 0x0b4 0x3c8 0x000 0x0 0x0 164#define MX6QDL_PAD_DISP0_DAT1__IPU1_DISP0_DATA01 0x0b4 0x3c8 0x000 0x0 0x0
165#define MX6DL_PAD_DISP0_DAT1__LCD_DATA01 0x0b4 0x3c8 0x000 0x1 0x0 165#define MX6QDL_PAD_DISP0_DAT1__LCD_DATA01 0x0b4 0x3c8 0x000 0x1 0x0
166#define MX6DL_PAD_DISP0_DAT1__ECSPI3_MOSI 0x0b4 0x3c8 0x000 0x2 0x0 166#define MX6QDL_PAD_DISP0_DAT1__ECSPI3_MOSI 0x0b4 0x3c8 0x000 0x2 0x0
167#define MX6DL_PAD_DISP0_DAT1__GPIO4_IO22 0x0b4 0x3c8 0x000 0x5 0x0 167#define MX6QDL_PAD_DISP0_DAT1__GPIO4_IO22 0x0b4 0x3c8 0x000 0x5 0x0
168#define MX6DL_PAD_DISP0_DAT10__IPU1_DISP0_DATA10 0x0b8 0x3cc 0x000 0x0 0x0 168#define MX6QDL_PAD_DISP0_DAT10__IPU1_DISP0_DATA10 0x0b8 0x3cc 0x000 0x0 0x0
169#define MX6DL_PAD_DISP0_DAT10__LCD_DATA10 0x0b8 0x3cc 0x000 0x1 0x0 169#define MX6QDL_PAD_DISP0_DAT10__LCD_DATA10 0x0b8 0x3cc 0x000 0x1 0x0
170#define MX6DL_PAD_DISP0_DAT10__GPIO4_IO31 0x0b8 0x3cc 0x000 0x5 0x0 170#define MX6QDL_PAD_DISP0_DAT10__GPIO4_IO31 0x0b8 0x3cc 0x000 0x5 0x0
171#define MX6DL_PAD_DISP0_DAT11__IPU1_DISP0_DATA11 0x0bc 0x3d0 0x000 0x0 0x0 171#define MX6QDL_PAD_DISP0_DAT11__IPU1_DISP0_DATA11 0x0bc 0x3d0 0x000 0x0 0x0
172#define MX6DL_PAD_DISP0_DAT11__LCD_DATA11 0x0bc 0x3d0 0x000 0x1 0x0 172#define MX6QDL_PAD_DISP0_DAT11__LCD_DATA11 0x0bc 0x3d0 0x000 0x1 0x0
173#define MX6DL_PAD_DISP0_DAT11__GPIO5_IO05 0x0bc 0x3d0 0x000 0x5 0x0 173#define MX6QDL_PAD_DISP0_DAT11__GPIO5_IO05 0x0bc 0x3d0 0x000 0x5 0x0
174#define MX6DL_PAD_DISP0_DAT12__IPU1_DISP0_DATA12 0x0c0 0x3d4 0x000 0x0 0x0 174#define MX6QDL_PAD_DISP0_DAT12__IPU1_DISP0_DATA12 0x0c0 0x3d4 0x000 0x0 0x0
175#define MX6DL_PAD_DISP0_DAT12__LCD_DATA12 0x0c0 0x3d4 0x000 0x1 0x0 175#define MX6QDL_PAD_DISP0_DAT12__LCD_DATA12 0x0c0 0x3d4 0x000 0x1 0x0
176#define MX6DL_PAD_DISP0_DAT12__GPIO5_IO06 0x0c0 0x3d4 0x000 0x5 0x0 176#define MX6QDL_PAD_DISP0_DAT12__GPIO5_IO06 0x0c0 0x3d4 0x000 0x5 0x0
177#define MX6DL_PAD_DISP0_DAT13__IPU1_DISP0_DATA13 0x0c4 0x3d8 0x000 0x0 0x0 177#define MX6QDL_PAD_DISP0_DAT13__IPU1_DISP0_DATA13 0x0c4 0x3d8 0x000 0x0 0x0
178#define MX6DL_PAD_DISP0_DAT13__LCD_DATA13 0x0c4 0x3d8 0x000 0x1 0x0 178#define MX6QDL_PAD_DISP0_DAT13__LCD_DATA13 0x0c4 0x3d8 0x000 0x1 0x0
179#define MX6DL_PAD_DISP0_DAT13__AUD5_RXFS 0x0c4 0x3d8 0x7bc 0x3 0x0 179#define MX6QDL_PAD_DISP0_DAT13__AUD5_RXFS 0x0c4 0x3d8 0x7bc 0x3 0x0
180#define MX6DL_PAD_DISP0_DAT13__GPIO5_IO07 0x0c4 0x3d8 0x000 0x5 0x0 180#define MX6QDL_PAD_DISP0_DAT13__GPIO5_IO07 0x0c4 0x3d8 0x000 0x5 0x0
181#define MX6DL_PAD_DISP0_DAT14__IPU1_DISP0_DATA14 0x0c8 0x3dc 0x000 0x0 0x0 181#define MX6QDL_PAD_DISP0_DAT14__IPU1_DISP0_DATA14 0x0c8 0x3dc 0x000 0x0 0x0
182#define MX6DL_PAD_DISP0_DAT14__LCD_DATA14 0x0c8 0x3dc 0x000 0x1 0x0 182#define MX6QDL_PAD_DISP0_DAT14__LCD_DATA14 0x0c8 0x3dc 0x000 0x1 0x0
183#define MX6DL_PAD_DISP0_DAT14__AUD5_RXC 0x0c8 0x3dc 0x7b8 0x3 0x0 183#define MX6QDL_PAD_DISP0_DAT14__AUD5_RXC 0x0c8 0x3dc 0x7b8 0x3 0x0
184#define MX6DL_PAD_DISP0_DAT14__GPIO5_IO08 0x0c8 0x3dc 0x000 0x5 0x0 184#define MX6QDL_PAD_DISP0_DAT14__GPIO5_IO08 0x0c8 0x3dc 0x000 0x5 0x0
185#define MX6DL_PAD_DISP0_DAT15__IPU1_DISP0_DATA15 0x0cc 0x3e0 0x000 0x0 0x0 185#define MX6QDL_PAD_DISP0_DAT15__IPU1_DISP0_DATA15 0x0cc 0x3e0 0x000 0x0 0x0
186#define MX6DL_PAD_DISP0_DAT15__LCD_DATA15 0x0cc 0x3e0 0x000 0x1 0x0 186#define MX6QDL_PAD_DISP0_DAT15__LCD_DATA15 0x0cc 0x3e0 0x000 0x1 0x0
187#define MX6DL_PAD_DISP0_DAT15__ECSPI1_SS1 0x0cc 0x3e0 0x7e8 0x2 0x0 187#define MX6QDL_PAD_DISP0_DAT15__ECSPI1_SS1 0x0cc 0x3e0 0x7e8 0x2 0x0
188#define MX6DL_PAD_DISP0_DAT15__ECSPI2_SS1 0x0cc 0x3e0 0x804 0x3 0x0 188#define MX6QDL_PAD_DISP0_DAT15__ECSPI2_SS1 0x0cc 0x3e0 0x804 0x3 0x0
189#define MX6DL_PAD_DISP0_DAT15__GPIO5_IO09 0x0cc 0x3e0 0x000 0x5 0x0 189#define MX6QDL_PAD_DISP0_DAT15__GPIO5_IO09 0x0cc 0x3e0 0x000 0x5 0x0
190#define MX6DL_PAD_DISP0_DAT16__IPU1_DISP0_DATA16 0x0d0 0x3e4 0x000 0x0 0x0 190#define MX6QDL_PAD_DISP0_DAT16__IPU1_DISP0_DATA16 0x0d0 0x3e4 0x000 0x0 0x0
191#define MX6DL_PAD_DISP0_DAT16__LCD_DATA16 0x0d0 0x3e4 0x000 0x1 0x0 191#define MX6QDL_PAD_DISP0_DAT16__LCD_DATA16 0x0d0 0x3e4 0x000 0x1 0x0
192#define MX6DL_PAD_DISP0_DAT16__ECSPI2_MOSI 0x0d0 0x3e4 0x7fc 0x2 0x1 192#define MX6QDL_PAD_DISP0_DAT16__ECSPI2_MOSI 0x0d0 0x3e4 0x7fc 0x2 0x1
193#define MX6DL_PAD_DISP0_DAT16__AUD5_TXC 0x0d0 0x3e4 0x7c0 0x3 0x0 193#define MX6QDL_PAD_DISP0_DAT16__AUD5_TXC 0x0d0 0x3e4 0x7c0 0x3 0x0
194#define MX6DL_PAD_DISP0_DAT16__SDMA_EXT_EVENT0 0x0d0 0x3e4 0x8e8 0x4 0x0 194#define MX6QDL_PAD_DISP0_DAT16__SDMA_EXT_EVENT0 0x0d0 0x3e4 0x8e8 0x4 0x0
195#define MX6DL_PAD_DISP0_DAT16__GPIO5_IO10 0x0d0 0x3e4 0x000 0x5 0x0 195#define MX6QDL_PAD_DISP0_DAT16__GPIO5_IO10 0x0d0 0x3e4 0x000 0x5 0x0
196#define MX6DL_PAD_DISP0_DAT17__IPU1_DISP0_DATA17 0x0d4 0x3e8 0x000 0x0 0x0 196#define MX6QDL_PAD_DISP0_DAT17__IPU1_DISP0_DATA17 0x0d4 0x3e8 0x000 0x0 0x0
197#define MX6DL_PAD_DISP0_DAT17__LCD_DATA17 0x0d4 0x3e8 0x000 0x1 0x0 197#define MX6QDL_PAD_DISP0_DAT17__LCD_DATA17 0x0d4 0x3e8 0x000 0x1 0x0
198#define MX6DL_PAD_DISP0_DAT17__ECSPI2_MISO 0x0d4 0x3e8 0x7f8 0x2 0x1 198#define MX6QDL_PAD_DISP0_DAT17__ECSPI2_MISO 0x0d4 0x3e8 0x7f8 0x2 0x1
199#define MX6DL_PAD_DISP0_DAT17__AUD5_TXD 0x0d4 0x3e8 0x7b4 0x3 0x0 199#define MX6QDL_PAD_DISP0_DAT17__AUD5_TXD 0x0d4 0x3e8 0x7b4 0x3 0x0
200#define MX6DL_PAD_DISP0_DAT17__SDMA_EXT_EVENT1 0x0d4 0x3e8 0x8ec 0x4 0x0 200#define MX6QDL_PAD_DISP0_DAT17__SDMA_EXT_EVENT1 0x0d4 0x3e8 0x8ec 0x4 0x0
201#define MX6DL_PAD_DISP0_DAT17__GPIO5_IO11 0x0d4 0x3e8 0x000 0x5 0x0 201#define MX6QDL_PAD_DISP0_DAT17__GPIO5_IO11 0x0d4 0x3e8 0x000 0x5 0x0
202#define MX6DL_PAD_DISP0_DAT18__IPU1_DISP0_DATA18 0x0d8 0x3ec 0x000 0x0 0x0 202#define MX6QDL_PAD_DISP0_DAT18__IPU1_DISP0_DATA18 0x0d8 0x3ec 0x000 0x0 0x0
203#define MX6DL_PAD_DISP0_DAT18__LCD_DATA18 0x0d8 0x3ec 0x000 0x1 0x0 203#define MX6QDL_PAD_DISP0_DAT18__LCD_DATA18 0x0d8 0x3ec 0x000 0x1 0x0
204#define MX6DL_PAD_DISP0_DAT18__ECSPI2_SS0 0x0d8 0x3ec 0x800 0x2 0x1 204#define MX6QDL_PAD_DISP0_DAT18__ECSPI2_SS0 0x0d8 0x3ec 0x800 0x2 0x1
205#define MX6DL_PAD_DISP0_DAT18__AUD5_TXFS 0x0d8 0x3ec 0x7c4 0x3 0x0 205#define MX6QDL_PAD_DISP0_DAT18__AUD5_TXFS 0x0d8 0x3ec 0x7c4 0x3 0x0
206#define MX6DL_PAD_DISP0_DAT18__AUD4_RXFS 0x0d8 0x3ec 0x7a4 0x4 0x0 206#define MX6QDL_PAD_DISP0_DAT18__AUD4_RXFS 0x0d8 0x3ec 0x7a4 0x4 0x0
207#define MX6DL_PAD_DISP0_DAT18__GPIO5_IO12 0x0d8 0x3ec 0x000 0x5 0x0 207#define MX6QDL_PAD_DISP0_DAT18__GPIO5_IO12 0x0d8 0x3ec 0x000 0x5 0x0
208#define MX6DL_PAD_DISP0_DAT18__EIM_CS2_B 0x0d8 0x3ec 0x000 0x7 0x0 208#define MX6QDL_PAD_DISP0_DAT18__EIM_CS2_B 0x0d8 0x3ec 0x000 0x7 0x0
209#define MX6DL_PAD_DISP0_DAT19__IPU1_DISP0_DATA19 0x0dc 0x3f0 0x000 0x0 0x0 209#define MX6QDL_PAD_DISP0_DAT19__IPU1_DISP0_DATA19 0x0dc 0x3f0 0x000 0x0 0x0
210#define MX6DL_PAD_DISP0_DAT19__LCD_DATA19 0x0dc 0x3f0 0x000 0x1 0x0 210#define MX6QDL_PAD_DISP0_DAT19__LCD_DATA19 0x0dc 0x3f0 0x000 0x1 0x0
211#define MX6DL_PAD_DISP0_DAT19__ECSPI2_SCLK 0x0dc 0x3f0 0x7f4 0x2 0x1 211#define MX6QDL_PAD_DISP0_DAT19__ECSPI2_SCLK 0x0dc 0x3f0 0x7f4 0x2 0x1
212#define MX6DL_PAD_DISP0_DAT19__AUD5_RXD 0x0dc 0x3f0 0x7b0 0x3 0x0 212#define MX6QDL_PAD_DISP0_DAT19__AUD5_RXD 0x0dc 0x3f0 0x7b0 0x3 0x0
213#define MX6DL_PAD_DISP0_DAT19__AUD4_RXC 0x0dc 0x3f0 0x7a0 0x4 0x0 213#define MX6QDL_PAD_DISP0_DAT19__AUD4_RXC 0x0dc 0x3f0 0x7a0 0x4 0x0
214#define MX6DL_PAD_DISP0_DAT19__GPIO5_IO13 0x0dc 0x3f0 0x000 0x5 0x0 214#define MX6QDL_PAD_DISP0_DAT19__GPIO5_IO13 0x0dc 0x3f0 0x000 0x5 0x0
215#define MX6DL_PAD_DISP0_DAT19__EIM_CS3_B 0x0dc 0x3f0 0x000 0x7 0x0 215#define MX6QDL_PAD_DISP0_DAT19__EIM_CS3_B 0x0dc 0x3f0 0x000 0x7 0x0
216#define MX6DL_PAD_DISP0_DAT2__IPU1_DISP0_DATA02 0x0e0 0x3f4 0x000 0x0 0x0 216#define MX6QDL_PAD_DISP0_DAT2__IPU1_DISP0_DATA02 0x0e0 0x3f4 0x000 0x0 0x0
217#define MX6DL_PAD_DISP0_DAT2__LCD_DATA02 0x0e0 0x3f4 0x000 0x1 0x0 217#define MX6QDL_PAD_DISP0_DAT2__LCD_DATA02 0x0e0 0x3f4 0x000 0x1 0x0
218#define MX6DL_PAD_DISP0_DAT2__ECSPI3_MISO 0x0e0 0x3f4 0x000 0x2 0x0 218#define MX6QDL_PAD_DISP0_DAT2__ECSPI3_MISO 0x0e0 0x3f4 0x000 0x2 0x0
219#define MX6DL_PAD_DISP0_DAT2__GPIO4_IO23 0x0e0 0x3f4 0x000 0x5 0x0 219#define MX6QDL_PAD_DISP0_DAT2__GPIO4_IO23 0x0e0 0x3f4 0x000 0x5 0x0
220#define MX6DL_PAD_DISP0_DAT20__IPU1_DISP0_DATA20 0x0e4 0x3f8 0x000 0x0 0x0 220#define MX6QDL_PAD_DISP0_DAT20__IPU1_DISP0_DATA20 0x0e4 0x3f8 0x000 0x0 0x0
221#define MX6DL_PAD_DISP0_DAT20__LCD_DATA20 0x0e4 0x3f8 0x000 0x1 0x0 221#define MX6QDL_PAD_DISP0_DAT20__LCD_DATA20 0x0e4 0x3f8 0x000 0x1 0x0
222#define MX6DL_PAD_DISP0_DAT20__ECSPI1_SCLK 0x0e4 0x3f8 0x7d8 0x2 0x1 222#define MX6QDL_PAD_DISP0_DAT20__ECSPI1_SCLK 0x0e4 0x3f8 0x7d8 0x2 0x1
223#define MX6DL_PAD_DISP0_DAT20__AUD4_TXC 0x0e4 0x3f8 0x7a8 0x3 0x0 223#define MX6QDL_PAD_DISP0_DAT20__AUD4_TXC 0x0e4 0x3f8 0x7a8 0x3 0x0
224#define MX6DL_PAD_DISP0_DAT20__GPIO5_IO14 0x0e4 0x3f8 0x000 0x5 0x0 224#define MX6QDL_PAD_DISP0_DAT20__GPIO5_IO14 0x0e4 0x3f8 0x000 0x5 0x0
225#define MX6DL_PAD_DISP0_DAT21__IPU1_DISP0_DATA21 0x0e8 0x3fc 0x000 0x0 0x0 225#define MX6QDL_PAD_DISP0_DAT21__IPU1_DISP0_DATA21 0x0e8 0x3fc 0x000 0x0 0x0
226#define MX6DL_PAD_DISP0_DAT21__LCD_DATA21 0x0e8 0x3fc 0x000 0x1 0x0 226#define MX6QDL_PAD_DISP0_DAT21__LCD_DATA21 0x0e8 0x3fc 0x000 0x1 0x0
227#define MX6DL_PAD_DISP0_DAT21__ECSPI1_MOSI 0x0e8 0x3fc 0x7e0 0x2 0x1 227#define MX6QDL_PAD_DISP0_DAT21__ECSPI1_MOSI 0x0e8 0x3fc 0x7e0 0x2 0x1
228#define MX6DL_PAD_DISP0_DAT21__AUD4_TXD 0x0e8 0x3fc 0x79c 0x3 0x0 228#define MX6QDL_PAD_DISP0_DAT21__AUD4_TXD 0x0e8 0x3fc 0x79c 0x3 0x0
229#define MX6DL_PAD_DISP0_DAT21__GPIO5_IO15 0x0e8 0x3fc 0x000 0x5 0x0 229#define MX6QDL_PAD_DISP0_DAT21__GPIO5_IO15 0x0e8 0x3fc 0x000 0x5 0x0
230#define MX6DL_PAD_DISP0_DAT22__IPU1_DISP0_DATA22 0x0ec 0x400 0x000 0x0 0x0 230#define MX6QDL_PAD_DISP0_DAT22__IPU1_DISP0_DATA22 0x0ec 0x400 0x000 0x0 0x0
231#define MX6DL_PAD_DISP0_DAT22__LCD_DATA22 0x0ec 0x400 0x000 0x1 0x0 231#define MX6QDL_PAD_DISP0_DAT22__LCD_DATA22 0x0ec 0x400 0x000 0x1 0x0
232#define MX6DL_PAD_DISP0_DAT22__ECSPI1_MISO 0x0ec 0x400 0x7dc 0x2 0x1 232#define MX6QDL_PAD_DISP0_DAT22__ECSPI1_MISO 0x0ec 0x400 0x7dc 0x2 0x1
233#define MX6DL_PAD_DISP0_DAT22__AUD4_TXFS 0x0ec 0x400 0x7ac 0x3 0x0 233#define MX6QDL_PAD_DISP0_DAT22__AUD4_TXFS 0x0ec 0x400 0x7ac 0x3 0x0
234#define MX6DL_PAD_DISP0_DAT22__GPIO5_IO16 0x0ec 0x400 0x000 0x5 0x0 234#define MX6QDL_PAD_DISP0_DAT22__GPIO5_IO16 0x0ec 0x400 0x000 0x5 0x0
235#define MX6DL_PAD_DISP0_DAT23__IPU1_DISP0_DATA23 0x0f0 0x404 0x000 0x0 0x0 235#define MX6QDL_PAD_DISP0_DAT23__IPU1_DISP0_DATA23 0x0f0 0x404 0x000 0x0 0x0
236#define MX6DL_PAD_DISP0_DAT23__LCD_DATA23 0x0f0 0x404 0x000 0x1 0x0 236#define MX6QDL_PAD_DISP0_DAT23__LCD_DATA23 0x0f0 0x404 0x000 0x1 0x0
237#define MX6DL_PAD_DISP0_DAT23__ECSPI1_SS0 0x0f0 0x404 0x7e4 0x2 0x1 237#define MX6QDL_PAD_DISP0_DAT23__ECSPI1_SS0 0x0f0 0x404 0x7e4 0x2 0x1
238#define MX6DL_PAD_DISP0_DAT23__AUD4_RXD 0x0f0 0x404 0x798 0x3 0x0 238#define MX6QDL_PAD_DISP0_DAT23__AUD4_RXD 0x0f0 0x404 0x798 0x3 0x0
239#define MX6DL_PAD_DISP0_DAT23__GPIO5_IO17 0x0f0 0x404 0x000 0x5 0x0 239#define MX6QDL_PAD_DISP0_DAT23__GPIO5_IO17 0x0f0 0x404 0x000 0x5 0x0
240#define MX6DL_PAD_DISP0_DAT3__IPU1_DISP0_DATA03 0x0f4 0x408 0x000 0x0 0x0 240#define MX6QDL_PAD_DISP0_DAT3__IPU1_DISP0_DATA03 0x0f4 0x408 0x000 0x0 0x0
241#define MX6DL_PAD_DISP0_DAT3__LCD_DATA03 0x0f4 0x408 0x000 0x1 0x0 241#define MX6QDL_PAD_DISP0_DAT3__LCD_DATA03 0x0f4 0x408 0x000 0x1 0x0
242#define MX6DL_PAD_DISP0_DAT3__ECSPI3_SS0 0x0f4 0x408 0x000 0x2 0x0 242#define MX6QDL_PAD_DISP0_DAT3__ECSPI3_SS0 0x0f4 0x408 0x000 0x2 0x0
243#define MX6DL_PAD_DISP0_DAT3__GPIO4_IO24 0x0f4 0x408 0x000 0x5 0x0 243#define MX6QDL_PAD_DISP0_DAT3__GPIO4_IO24 0x0f4 0x408 0x000 0x5 0x0
244#define MX6DL_PAD_DISP0_DAT4__IPU1_DISP0_DATA04 0x0f8 0x40c 0x000 0x0 0x0 244#define MX6QDL_PAD_DISP0_DAT4__IPU1_DISP0_DATA04 0x0f8 0x40c 0x000 0x0 0x0
245#define MX6DL_PAD_DISP0_DAT4__LCD_DATA04 0x0f8 0x40c 0x000 0x1 0x0 245#define MX6QDL_PAD_DISP0_DAT4__LCD_DATA04 0x0f8 0x40c 0x000 0x1 0x0
246#define MX6DL_PAD_DISP0_DAT4__ECSPI3_SS1 0x0f8 0x40c 0x000 0x2 0x0 246#define MX6QDL_PAD_DISP0_DAT4__ECSPI3_SS1 0x0f8 0x40c 0x000 0x2 0x0
247#define MX6DL_PAD_DISP0_DAT4__GPIO4_IO25 0x0f8 0x40c 0x000 0x5 0x0 247#define MX6QDL_PAD_DISP0_DAT4__GPIO4_IO25 0x0f8 0x40c 0x000 0x5 0x0
248#define MX6DL_PAD_DISP0_DAT5__IPU1_DISP0_DATA05 0x0fc 0x410 0x000 0x0 0x0 248#define MX6QDL_PAD_DISP0_DAT5__IPU1_DISP0_DATA05 0x0fc 0x410 0x000 0x0 0x0
249#define MX6DL_PAD_DISP0_DAT5__LCD_DATA05 0x0fc 0x410 0x000 0x1 0x0 249#define MX6QDL_PAD_DISP0_DAT5__LCD_DATA05 0x0fc 0x410 0x000 0x1 0x0
250#define MX6DL_PAD_DISP0_DAT5__ECSPI3_SS2 0x0fc 0x410 0x000 0x2 0x0 250#define MX6QDL_PAD_DISP0_DAT5__ECSPI3_SS2 0x0fc 0x410 0x000 0x2 0x0
251#define MX6DL_PAD_DISP0_DAT5__AUD6_RXFS 0x0fc 0x410 0x000 0x3 0x0 251#define MX6QDL_PAD_DISP0_DAT5__AUD6_RXFS 0x0fc 0x410 0x000 0x3 0x0
252#define MX6DL_PAD_DISP0_DAT5__GPIO4_IO26 0x0fc 0x410 0x000 0x5 0x0 252#define MX6QDL_PAD_DISP0_DAT5__GPIO4_IO26 0x0fc 0x410 0x000 0x5 0x0
253#define MX6DL_PAD_DISP0_DAT6__IPU1_DISP0_DATA06 0x100 0x414 0x000 0x0 0x0 253#define MX6QDL_PAD_DISP0_DAT6__IPU1_DISP0_DATA06 0x100 0x414 0x000 0x0 0x0
254#define MX6DL_PAD_DISP0_DAT6__LCD_DATA06 0x100 0x414 0x000 0x1 0x0 254#define MX6QDL_PAD_DISP0_DAT6__LCD_DATA06 0x100 0x414 0x000 0x1 0x0
255#define MX6DL_PAD_DISP0_DAT6__ECSPI3_SS3 0x100 0x414 0x000 0x2 0x0 255#define MX6QDL_PAD_DISP0_DAT6__ECSPI3_SS3 0x100 0x414 0x000 0x2 0x0
256#define MX6DL_PAD_DISP0_DAT6__AUD6_RXC 0x100 0x414 0x000 0x3 0x0 256#define MX6QDL_PAD_DISP0_DAT6__AUD6_RXC 0x100 0x414 0x000 0x3 0x0
257#define MX6DL_PAD_DISP0_DAT6__GPIO4_IO27 0x100 0x414 0x000 0x5 0x0 257#define MX6QDL_PAD_DISP0_DAT6__GPIO4_IO27 0x100 0x414 0x000 0x5 0x0
258#define MX6DL_PAD_DISP0_DAT7__IPU1_DISP0_DATA07 0x104 0x418 0x000 0x0 0x0 258#define MX6QDL_PAD_DISP0_DAT7__IPU1_DISP0_DATA07 0x104 0x418 0x000 0x0 0x0
259#define MX6DL_PAD_DISP0_DAT7__LCD_DATA07 0x104 0x418 0x000 0x1 0x0 259#define MX6QDL_PAD_DISP0_DAT7__LCD_DATA07 0x104 0x418 0x000 0x1 0x0
260#define MX6DL_PAD_DISP0_DAT7__ECSPI3_RDY 0x104 0x418 0x000 0x2 0x0 260#define MX6QDL_PAD_DISP0_DAT7__ECSPI3_RDY 0x104 0x418 0x000 0x2 0x0
261#define MX6DL_PAD_DISP0_DAT7__GPIO4_IO28 0x104 0x418 0x000 0x5 0x0 261#define MX6QDL_PAD_DISP0_DAT7__GPIO4_IO28 0x104 0x418 0x000 0x5 0x0
262#define MX6DL_PAD_DISP0_DAT8__IPU1_DISP0_DATA08 0x108 0x41c 0x000 0x0 0x0 262#define MX6QDL_PAD_DISP0_DAT8__IPU1_DISP0_DATA08 0x108 0x41c 0x000 0x0 0x0
263#define MX6DL_PAD_DISP0_DAT8__LCD_DATA08 0x108 0x41c 0x000 0x1 0x0 263#define MX6QDL_PAD_DISP0_DAT8__LCD_DATA08 0x108 0x41c 0x000 0x1 0x0
264#define MX6DL_PAD_DISP0_DAT8__PWM1_OUT 0x108 0x41c 0x000 0x2 0x0 264#define MX6QDL_PAD_DISP0_DAT8__PWM1_OUT 0x108 0x41c 0x000 0x2 0x0
265#define MX6DL_PAD_DISP0_DAT8__WDOG1_B 0x108 0x41c 0x000 0x3 0x0 265#define MX6QDL_PAD_DISP0_DAT8__WDOG1_B 0x108 0x41c 0x000 0x3 0x0
266#define MX6DL_PAD_DISP0_DAT8__GPIO4_IO29 0x108 0x41c 0x000 0x5 0x0 266#define MX6QDL_PAD_DISP0_DAT8__GPIO4_IO29 0x108 0x41c 0x000 0x5 0x0
267#define MX6DL_PAD_DISP0_DAT9__IPU1_DISP0_DATA09 0x10c 0x420 0x000 0x0 0x0 267#define MX6QDL_PAD_DISP0_DAT9__IPU1_DISP0_DATA09 0x10c 0x420 0x000 0x0 0x0
268#define MX6DL_PAD_DISP0_DAT9__LCD_DATA09 0x10c 0x420 0x000 0x1 0x0 268#define MX6QDL_PAD_DISP0_DAT9__LCD_DATA09 0x10c 0x420 0x000 0x1 0x0
269#define MX6DL_PAD_DISP0_DAT9__PWM2_OUT 0x10c 0x420 0x000 0x2 0x0 269#define MX6QDL_PAD_DISP0_DAT9__PWM2_OUT 0x10c 0x420 0x000 0x2 0x0
270#define MX6DL_PAD_DISP0_DAT9__WDOG2_B 0x10c 0x420 0x000 0x3 0x0 270#define MX6QDL_PAD_DISP0_DAT9__WDOG2_B 0x10c 0x420 0x000 0x3 0x0
271#define MX6DL_PAD_DISP0_DAT9__GPIO4_IO30 0x10c 0x420 0x000 0x5 0x0 271#define MX6QDL_PAD_DISP0_DAT9__GPIO4_IO30 0x10c 0x420 0x000 0x5 0x0
272#define MX6DL_PAD_EIM_A16__EIM_ADDR16 0x110 0x4e0 0x000 0x0 0x0 272#define MX6QDL_PAD_EIM_A16__EIM_ADDR16 0x110 0x4e0 0x000 0x0 0x0
273#define MX6DL_PAD_EIM_A16__IPU1_DI1_DISP_CLK 0x110 0x4e0 0x000 0x1 0x0 273#define MX6QDL_PAD_EIM_A16__IPU1_DI1_DISP_CLK 0x110 0x4e0 0x000 0x1 0x0
274#define MX6DL_PAD_EIM_A16__IPU1_CSI1_PIXCLK 0x110 0x4e0 0x8b8 0x2 0x0 274#define MX6QDL_PAD_EIM_A16__IPU1_CSI1_PIXCLK 0x110 0x4e0 0x8b8 0x2 0x0
275#define MX6DL_PAD_EIM_A16__GPIO2_IO22 0x110 0x4e0 0x000 0x5 0x0 275#define MX6QDL_PAD_EIM_A16__GPIO2_IO22 0x110 0x4e0 0x000 0x5 0x0
276#define MX6DL_PAD_EIM_A16__SRC_BOOT_CFG16 0x110 0x4e0 0x000 0x7 0x0 276#define MX6QDL_PAD_EIM_A16__SRC_BOOT_CFG16 0x110 0x4e0 0x000 0x7 0x0
277#define MX6DL_PAD_EIM_A16__EPDC_DATA00 0x110 0x4e0 0x000 0x8 0x0 277#define MX6QDL_PAD_EIM_A16__EPDC_DATA00 0x110 0x4e0 0x000 0x8 0x0
278#define MX6DL_PAD_EIM_A17__EIM_ADDR17 0x114 0x4e4 0x000 0x0 0x0 278#define MX6QDL_PAD_EIM_A17__EIM_ADDR17 0x114 0x4e4 0x000 0x0 0x0
279#define MX6DL_PAD_EIM_A17__IPU1_DISP1_DATA12 0x114 0x4e4 0x000 0x1 0x0 279#define MX6QDL_PAD_EIM_A17__IPU1_DISP1_DATA12 0x114 0x4e4 0x000 0x1 0x0
280#define MX6DL_PAD_EIM_A17__IPU1_CSI1_DATA12 0x114 0x4e4 0x890 0x2 0x0 280#define MX6QDL_PAD_EIM_A17__IPU1_CSI1_DATA12 0x114 0x4e4 0x890 0x2 0x0
281#define MX6DL_PAD_EIM_A17__GPIO2_IO21 0x114 0x4e4 0x000 0x5 0x0 281#define MX6QDL_PAD_EIM_A17__GPIO2_IO21 0x114 0x4e4 0x000 0x5 0x0
282#define MX6DL_PAD_EIM_A17__SRC_BOOT_CFG17 0x114 0x4e4 0x000 0x7 0x0 282#define MX6QDL_PAD_EIM_A17__SRC_BOOT_CFG17 0x114 0x4e4 0x000 0x7 0x0
283#define MX6DL_PAD_EIM_A17__EPDC_PWR_STAT 0x114 0x4e4 0x000 0x8 0x0 283#define MX6QDL_PAD_EIM_A17__EPDC_PWR_STAT 0x114 0x4e4 0x000 0x8 0x0
284#define MX6DL_PAD_EIM_A18__EIM_ADDR18 0x118 0x4e8 0x000 0x0 0x0 284#define MX6QDL_PAD_EIM_A18__EIM_ADDR18 0x118 0x4e8 0x000 0x0 0x0
285#define MX6DL_PAD_EIM_A18__IPU1_DISP1_DATA13 0x118 0x4e8 0x000 0x1 0x0 285#define MX6QDL_PAD_EIM_A18__IPU1_DISP1_DATA13 0x118 0x4e8 0x000 0x1 0x0
286#define MX6DL_PAD_EIM_A18__IPU1_CSI1_DATA13 0x118 0x4e8 0x894 0x2 0x0 286#define MX6QDL_PAD_EIM_A18__IPU1_CSI1_DATA13 0x118 0x4e8 0x894 0x2 0x0
287#define MX6DL_PAD_EIM_A18__GPIO2_IO20 0x118 0x4e8 0x000 0x5 0x0 287#define MX6QDL_PAD_EIM_A18__GPIO2_IO20 0x118 0x4e8 0x000 0x5 0x0
288#define MX6DL_PAD_EIM_A18__SRC_BOOT_CFG18 0x118 0x4e8 0x000 0x7 0x0 288#define MX6QDL_PAD_EIM_A18__SRC_BOOT_CFG18 0x118 0x4e8 0x000 0x7 0x0
289#define MX6DL_PAD_EIM_A18__EPDC_PWR_CTRL0 0x118 0x4e8 0x000 0x8 0x0 289#define MX6QDL_PAD_EIM_A18__EPDC_PWR_CTRL0 0x118 0x4e8 0x000 0x8 0x0
290#define MX6DL_PAD_EIM_A19__EIM_ADDR19 0x11c 0x4ec 0x000 0x0 0x0 290#define MX6QDL_PAD_EIM_A19__EIM_ADDR19 0x11c 0x4ec 0x000 0x0 0x0
291#define MX6DL_PAD_EIM_A19__IPU1_DISP1_DATA14 0x11c 0x4ec 0x000 0x1 0x0 291#define MX6QDL_PAD_EIM_A19__IPU1_DISP1_DATA14 0x11c 0x4ec 0x000 0x1 0x0
292#define MX6DL_PAD_EIM_A19__IPU1_CSI1_DATA14 0x11c 0x4ec 0x898 0x2 0x0 292#define MX6QDL_PAD_EIM_A19__IPU1_CSI1_DATA14 0x11c 0x4ec 0x898 0x2 0x0
293#define MX6DL_PAD_EIM_A19__GPIO2_IO19 0x11c 0x4ec 0x000 0x5 0x0 293#define MX6QDL_PAD_EIM_A19__GPIO2_IO19 0x11c 0x4ec 0x000 0x5 0x0
294#define MX6DL_PAD_EIM_A19__SRC_BOOT_CFG19 0x11c 0x4ec 0x000 0x7 0x0 294#define MX6QDL_PAD_EIM_A19__SRC_BOOT_CFG19 0x11c 0x4ec 0x000 0x7 0x0
295#define MX6DL_PAD_EIM_A19__EPDC_PWR_CTRL1 0x11c 0x4ec 0x000 0x8 0x0 295#define MX6QDL_PAD_EIM_A19__EPDC_PWR_CTRL1 0x11c 0x4ec 0x000 0x8 0x0
296#define MX6DL_PAD_EIM_A20__EIM_ADDR20 0x120 0x4f0 0x000 0x0 0x0 296#define MX6QDL_PAD_EIM_A20__EIM_ADDR20 0x120 0x4f0 0x000 0x0 0x0
297#define MX6DL_PAD_EIM_A20__IPU1_DISP1_DATA15 0x120 0x4f0 0x000 0x1 0x0 297#define MX6QDL_PAD_EIM_A20__IPU1_DISP1_DATA15 0x120 0x4f0 0x000 0x1 0x0
298#define MX6DL_PAD_EIM_A20__IPU1_CSI1_DATA15 0x120 0x4f0 0x89c 0x2 0x0 298#define MX6QDL_PAD_EIM_A20__IPU1_CSI1_DATA15 0x120 0x4f0 0x89c 0x2 0x0
299#define MX6DL_PAD_EIM_A20__GPIO2_IO18 0x120 0x4f0 0x000 0x5 0x0 299#define MX6QDL_PAD_EIM_A20__GPIO2_IO18 0x120 0x4f0 0x000 0x5 0x0
300#define MX6DL_PAD_EIM_A20__SRC_BOOT_CFG20 0x120 0x4f0 0x000 0x7 0x0 300#define MX6QDL_PAD_EIM_A20__SRC_BOOT_CFG20 0x120 0x4f0 0x000 0x7 0x0
301#define MX6DL_PAD_EIM_A20__EPDC_PWR_CTRL2 0x120 0x4f0 0x000 0x8 0x0 301#define MX6QDL_PAD_EIM_A20__EPDC_PWR_CTRL2 0x120 0x4f0 0x000 0x8 0x0
302#define MX6DL_PAD_EIM_A21__EIM_ADDR21 0x124 0x4f4 0x000 0x0 0x0 302#define MX6QDL_PAD_EIM_A21__EIM_ADDR21 0x124 0x4f4 0x000 0x0 0x0
303#define MX6DL_PAD_EIM_A21__IPU1_DISP1_DATA16 0x124 0x4f4 0x000 0x1 0x0 303#define MX6QDL_PAD_EIM_A21__IPU1_DISP1_DATA16 0x124 0x4f4 0x000 0x1 0x0
304#define MX6DL_PAD_EIM_A21__IPU1_CSI1_DATA16 0x124 0x4f4 0x8a0 0x2 0x0 304#define MX6QDL_PAD_EIM_A21__IPU1_CSI1_DATA16 0x124 0x4f4 0x8a0 0x2 0x0
305#define MX6DL_PAD_EIM_A21__GPIO2_IO17 0x124 0x4f4 0x000 0x5 0x0 305#define MX6QDL_PAD_EIM_A21__GPIO2_IO17 0x124 0x4f4 0x000 0x5 0x0
306#define MX6DL_PAD_EIM_A21__SRC_BOOT_CFG21 0x124 0x4f4 0x000 0x7 0x0 306#define MX6QDL_PAD_EIM_A21__SRC_BOOT_CFG21 0x124 0x4f4 0x000 0x7 0x0
307#define MX6DL_PAD_EIM_A21__EPDC_GDCLK 0x124 0x4f4 0x000 0x8 0x0 307#define MX6QDL_PAD_EIM_A21__EPDC_GDCLK 0x124 0x4f4 0x000 0x8 0x0
308#define MX6DL_PAD_EIM_A22__EIM_ADDR22 0x128 0x4f8 0x000 0x0 0x0 308#define MX6QDL_PAD_EIM_A22__EIM_ADDR22 0x128 0x4f8 0x000 0x0 0x0
309#define MX6DL_PAD_EIM_A22__IPU1_DISP1_DATA17 0x128 0x4f8 0x000 0x1 0x0 309#define MX6QDL_PAD_EIM_A22__IPU1_DISP1_DATA17 0x128 0x4f8 0x000 0x1 0x0
310#define MX6DL_PAD_EIM_A22__IPU1_CSI1_DATA17 0x128 0x4f8 0x8a4 0x2 0x0 310#define MX6QDL_PAD_EIM_A22__IPU1_CSI1_DATA17 0x128 0x4f8 0x8a4 0x2 0x0
311#define MX6DL_PAD_EIM_A22__GPIO2_IO16 0x128 0x4f8 0x000 0x5 0x0 311#define MX6QDL_PAD_EIM_A22__GPIO2_IO16 0x128 0x4f8 0x000 0x5 0x0
312#define MX6DL_PAD_EIM_A22__SRC_BOOT_CFG22 0x128 0x4f8 0x000 0x7 0x0 312#define MX6QDL_PAD_EIM_A22__SRC_BOOT_CFG22 0x128 0x4f8 0x000 0x7 0x0
313#define MX6DL_PAD_EIM_A22__EPDC_GDSP 0x128 0x4f8 0x000 0x8 0x0 313#define MX6QDL_PAD_EIM_A22__EPDC_GDSP 0x128 0x4f8 0x000 0x8 0x0
314#define MX6DL_PAD_EIM_A23__EIM_ADDR23 0x12c 0x4fc 0x000 0x0 0x0 314#define MX6QDL_PAD_EIM_A23__EIM_ADDR23 0x12c 0x4fc 0x000 0x0 0x0
315#define MX6DL_PAD_EIM_A23__IPU1_DISP1_DATA18 0x12c 0x4fc 0x000 0x1 0x0 315#define MX6QDL_PAD_EIM_A23__IPU1_DISP1_DATA18 0x12c 0x4fc 0x000 0x1 0x0
316#define MX6DL_PAD_EIM_A23__IPU1_CSI1_DATA18 0x12c 0x4fc 0x8a8 0x2 0x0 316#define MX6QDL_PAD_EIM_A23__IPU1_CSI1_DATA18 0x12c 0x4fc 0x8a8 0x2 0x0
317#define MX6DL_PAD_EIM_A23__IPU1_SISG3 0x12c 0x4fc 0x000 0x4 0x0 317#define MX6QDL_PAD_EIM_A23__IPU1_SISG3 0x12c 0x4fc 0x000 0x4 0x0
318#define MX6DL_PAD_EIM_A23__GPIO6_IO06 0x12c 0x4fc 0x000 0x5 0x0 318#define MX6QDL_PAD_EIM_A23__GPIO6_IO06 0x12c 0x4fc 0x000 0x5 0x0
319#define MX6DL_PAD_EIM_A23__SRC_BOOT_CFG23 0x12c 0x4fc 0x000 0x7 0x0 319#define MX6QDL_PAD_EIM_A23__SRC_BOOT_CFG23 0x12c 0x4fc 0x000 0x7 0x0
320#define MX6DL_PAD_EIM_A23__EPDC_GDOE 0x12c 0x4fc 0x000 0x8 0x0 320#define MX6QDL_PAD_EIM_A23__EPDC_GDOE 0x12c 0x4fc 0x000 0x8 0x0
321#define MX6DL_PAD_EIM_A24__EIM_ADDR24 0x130 0x500 0x000 0x0 0x0 321#define MX6QDL_PAD_EIM_A24__EIM_ADDR24 0x130 0x500 0x000 0x0 0x0
322#define MX6DL_PAD_EIM_A24__IPU1_DISP1_DATA19 0x130 0x500 0x000 0x1 0x0 322#define MX6QDL_PAD_EIM_A24__IPU1_DISP1_DATA19 0x130 0x500 0x000 0x1 0x0
323#define MX6DL_PAD_EIM_A24__IPU1_CSI1_DATA19 0x130 0x500 0x8ac 0x2 0x0 323#define MX6QDL_PAD_EIM_A24__IPU1_CSI1_DATA19 0x130 0x500 0x8ac 0x2 0x0
324#define MX6DL_PAD_EIM_A24__IPU1_SISG2 0x130 0x500 0x000 0x4 0x0 324#define MX6QDL_PAD_EIM_A24__IPU1_SISG2 0x130 0x500 0x000 0x4 0x0
325#define MX6DL_PAD_EIM_A24__GPIO5_IO04 0x130 0x500 0x000 0x5 0x0 325#define MX6QDL_PAD_EIM_A24__GPIO5_IO04 0x130 0x500 0x000 0x5 0x0
326#define MX6DL_PAD_EIM_A24__SRC_BOOT_CFG24 0x130 0x500 0x000 0x7 0x0 326#define MX6QDL_PAD_EIM_A24__SRC_BOOT_CFG24 0x130 0x500 0x000 0x7 0x0
327#define MX6DL_PAD_EIM_A24__EPDC_GDRL 0x130 0x500 0x000 0x8 0x0 327#define MX6QDL_PAD_EIM_A24__EPDC_GDRL 0x130 0x500 0x000 0x8 0x0
328#define MX6DL_PAD_EIM_A25__EIM_ADDR25 0x134 0x504 0x000 0x0 0x0 328#define MX6QDL_PAD_EIM_A25__EIM_ADDR25 0x134 0x504 0x000 0x0 0x0
329#define MX6DL_PAD_EIM_A25__ECSPI4_SS1 0x134 0x504 0x000 0x1 0x0 329#define MX6QDL_PAD_EIM_A25__ECSPI4_SS1 0x134 0x504 0x000 0x1 0x0
330#define MX6DL_PAD_EIM_A25__ECSPI2_RDY 0x134 0x504 0x000 0x2 0x0 330#define MX6QDL_PAD_EIM_A25__ECSPI2_RDY 0x134 0x504 0x000 0x2 0x0
331#define MX6DL_PAD_EIM_A25__IPU1_DI1_PIN12 0x134 0x504 0x000 0x3 0x0 331#define MX6QDL_PAD_EIM_A25__IPU1_DI1_PIN12 0x134 0x504 0x000 0x3 0x0
332#define MX6DL_PAD_EIM_A25__IPU1_DI0_D1_CS 0x134 0x504 0x000 0x4 0x0 332#define MX6QDL_PAD_EIM_A25__IPU1_DI0_D1_CS 0x134 0x504 0x000 0x4 0x0
333#define MX6DL_PAD_EIM_A25__GPIO5_IO02 0x134 0x504 0x000 0x5 0x0 333#define MX6QDL_PAD_EIM_A25__GPIO5_IO02 0x134 0x504 0x000 0x5 0x0
334#define MX6DL_PAD_EIM_A25__HDMI_TX_CEC_LINE 0x134 0x504 0x85c 0x6 0x0 334#define MX6QDL_PAD_EIM_A25__HDMI_TX_CEC_LINE 0x134 0x504 0x85c 0x6 0x0
335#define MX6DL_PAD_EIM_A25__EPDC_DATA15 0x134 0x504 0x000 0x8 0x0 335#define MX6QDL_PAD_EIM_A25__EPDC_DATA15 0x134 0x504 0x000 0x8 0x0
336#define MX6DL_PAD_EIM_A25__EIM_ACLK_FREERUN 0x134 0x504 0x000 0x9 0x0 336#define MX6QDL_PAD_EIM_A25__EIM_ACLK_FREERUN 0x134 0x504 0x000 0x9 0x0
337#define MX6DL_PAD_EIM_BCLK__EIM_BCLK 0x138 0x508 0x000 0x0 0x0 337#define MX6QDL_PAD_EIM_BCLK__EIM_BCLK 0x138 0x508 0x000 0x0 0x0
338#define MX6DL_PAD_EIM_BCLK__IPU1_DI1_PIN16 0x138 0x508 0x000 0x1 0x0 338#define MX6QDL_PAD_EIM_BCLK__IPU1_DI1_PIN16 0x138 0x508 0x000 0x1 0x0
339#define MX6DL_PAD_EIM_BCLK__GPIO6_IO31 0x138 0x508 0x000 0x5 0x0 339#define MX6QDL_PAD_EIM_BCLK__GPIO6_IO31 0x138 0x508 0x000 0x5 0x0
340#define MX6DL_PAD_EIM_BCLK__EPDC_SDCE9 0x138 0x508 0x000 0x8 0x0 340#define MX6QDL_PAD_EIM_BCLK__EPDC_SDCE9 0x138 0x508 0x000 0x8 0x0
341#define MX6DL_PAD_EIM_CS0__EIM_CS0_B 0x13c 0x50c 0x000 0x0 0x0 341#define MX6QDL_PAD_EIM_CS0__EIM_CS0_B 0x13c 0x50c 0x000 0x0 0x0
342#define MX6DL_PAD_EIM_CS0__IPU1_DI1_PIN05 0x13c 0x50c 0x000 0x1 0x0 342#define MX6QDL_PAD_EIM_CS0__IPU1_DI1_PIN05 0x13c 0x50c 0x000 0x1 0x0
343#define MX6DL_PAD_EIM_CS0__ECSPI2_SCLK 0x13c 0x50c 0x7f4 0x2 0x2 343#define MX6QDL_PAD_EIM_CS0__ECSPI2_SCLK 0x13c 0x50c 0x7f4 0x2 0x2
344#define MX6DL_PAD_EIM_CS0__GPIO2_IO23 0x13c 0x50c 0x000 0x5 0x0 344#define MX6QDL_PAD_EIM_CS0__GPIO2_IO23 0x13c 0x50c 0x000 0x5 0x0
345#define MX6DL_PAD_EIM_CS0__EPDC_DATA06 0x13c 0x50c 0x000 0x8 0x0 345#define MX6QDL_PAD_EIM_CS0__EPDC_DATA06 0x13c 0x50c 0x000 0x8 0x0
346#define MX6DL_PAD_EIM_CS1__EIM_CS1_B 0x140 0x510 0x000 0x0 0x0 346#define MX6QDL_PAD_EIM_CS1__EIM_CS1_B 0x140 0x510 0x000 0x0 0x0
347#define MX6DL_PAD_EIM_CS1__IPU1_DI1_PIN06 0x140 0x510 0x000 0x1 0x0 347#define MX6QDL_PAD_EIM_CS1__IPU1_DI1_PIN06 0x140 0x510 0x000 0x1 0x0
348#define MX6DL_PAD_EIM_CS1__ECSPI2_MOSI 0x140 0x510 0x7fc 0x2 0x2 348#define MX6QDL_PAD_EIM_CS1__ECSPI2_MOSI 0x140 0x510 0x7fc 0x2 0x2
349#define MX6DL_PAD_EIM_CS1__GPIO2_IO24 0x140 0x510 0x000 0x5 0x0 349#define MX6QDL_PAD_EIM_CS1__GPIO2_IO24 0x140 0x510 0x000 0x5 0x0
350#define MX6DL_PAD_EIM_CS1__EPDC_DATA08 0x140 0x510 0x000 0x8 0x0 350#define MX6QDL_PAD_EIM_CS1__EPDC_DATA08 0x140 0x510 0x000 0x8 0x0
351#define MX6DL_PAD_EIM_D16__EIM_DATA16 0x144 0x514 0x000 0x0 0x0 351#define MX6QDL_PAD_EIM_D16__EIM_DATA16 0x144 0x514 0x000 0x0 0x0
352#define MX6DL_PAD_EIM_D16__ECSPI1_SCLK 0x144 0x514 0x7d8 0x1 0x2 352#define MX6QDL_PAD_EIM_D16__ECSPI1_SCLK 0x144 0x514 0x7d8 0x1 0x2
353#define MX6DL_PAD_EIM_D16__IPU1_DI0_PIN05 0x144 0x514 0x000 0x2 0x0 353#define MX6QDL_PAD_EIM_D16__IPU1_DI0_PIN05 0x144 0x514 0x000 0x2 0x0
354#define MX6DL_PAD_EIM_D16__IPU1_CSI1_DATA18 0x144 0x514 0x8a8 0x3 0x1 354#define MX6QDL_PAD_EIM_D16__IPU1_CSI1_DATA18 0x144 0x514 0x8a8 0x3 0x1
355#define MX6DL_PAD_EIM_D16__HDMI_TX_DDC_SDA 0x144 0x514 0x864 0x4 0x0 355#define MX6QDL_PAD_EIM_D16__HDMI_TX_DDC_SDA 0x144 0x514 0x864 0x4 0x0
356#define MX6DL_PAD_EIM_D16__GPIO3_IO16 0x144 0x514 0x000 0x5 0x0 356#define MX6QDL_PAD_EIM_D16__GPIO3_IO16 0x144 0x514 0x000 0x5 0x0
357#define MX6DL_PAD_EIM_D16__I2C2_SDA 0x144 0x514 0x874 0x6 0x0 357#define MX6QDL_PAD_EIM_D16__I2C2_SDA 0x144 0x514 0x874 0x6 0x0
358#define MX6DL_PAD_EIM_D16__EPDC_DATA10 0x144 0x514 0x000 0x8 0x0 358#define MX6QDL_PAD_EIM_D16__EPDC_DATA10 0x144 0x514 0x000 0x8 0x0
359#define MX6DL_PAD_EIM_D17__EIM_DATA17 0x148 0x518 0x000 0x0 0x0 359#define MX6QDL_PAD_EIM_D17__EIM_DATA17 0x148 0x518 0x000 0x0 0x0
360#define MX6DL_PAD_EIM_D17__ECSPI1_MISO 0x148 0x518 0x7dc 0x1 0x2 360#define MX6QDL_PAD_EIM_D17__ECSPI1_MISO 0x148 0x518 0x7dc 0x1 0x2
361#define MX6DL_PAD_EIM_D17__IPU1_DI0_PIN06 0x148 0x518 0x000 0x2 0x0 361#define MX6QDL_PAD_EIM_D17__IPU1_DI0_PIN06 0x148 0x518 0x000 0x2 0x0
362#define MX6DL_PAD_EIM_D17__IPU1_CSI1_PIXCLK 0x148 0x518 0x8b8 0x3 0x1 362#define MX6QDL_PAD_EIM_D17__IPU1_CSI1_PIXCLK 0x148 0x518 0x8b8 0x3 0x1
363#define MX6DL_PAD_EIM_D17__DCIC1_OUT 0x148 0x518 0x000 0x4 0x0 363#define MX6QDL_PAD_EIM_D17__DCIC1_OUT 0x148 0x518 0x000 0x4 0x0
364#define MX6DL_PAD_EIM_D17__GPIO3_IO17 0x148 0x518 0x000 0x5 0x0 364#define MX6QDL_PAD_EIM_D17__GPIO3_IO17 0x148 0x518 0x000 0x5 0x0
365#define MX6DL_PAD_EIM_D17__I2C3_SCL 0x148 0x518 0x878 0x6 0x0 365#define MX6QDL_PAD_EIM_D17__I2C3_SCL 0x148 0x518 0x878 0x6 0x0
366#define MX6DL_PAD_EIM_D17__EPDC_VCOM0 0x148 0x518 0x000 0x8 0x0 366#define MX6QDL_PAD_EIM_D17__EPDC_VCOM0 0x148 0x518 0x000 0x8 0x0
367#define MX6DL_PAD_EIM_D18__EIM_DATA18 0x14c 0x51c 0x000 0x0 0x0 367#define MX6QDL_PAD_EIM_D18__EIM_DATA18 0x14c 0x51c 0x000 0x0 0x0
368#define MX6DL_PAD_EIM_D18__ECSPI1_MOSI 0x14c 0x51c 0x7e0 0x1 0x2 368#define MX6QDL_PAD_EIM_D18__ECSPI1_MOSI 0x14c 0x51c 0x7e0 0x1 0x2
369#define MX6DL_PAD_EIM_D18__IPU1_DI0_PIN07 0x14c 0x51c 0x000 0x2 0x0 369#define MX6QDL_PAD_EIM_D18__IPU1_DI0_PIN07 0x14c 0x51c 0x000 0x2 0x0
370#define MX6DL_PAD_EIM_D18__IPU1_CSI1_DATA17 0x14c 0x51c 0x8a4 0x3 0x1 370#define MX6QDL_PAD_EIM_D18__IPU1_CSI1_DATA17 0x14c 0x51c 0x8a4 0x3 0x1
371#define MX6DL_PAD_EIM_D18__IPU1_DI1_D0_CS 0x14c 0x51c 0x000 0x4 0x0 371#define MX6QDL_PAD_EIM_D18__IPU1_DI1_D0_CS 0x14c 0x51c 0x000 0x4 0x0
372#define MX6DL_PAD_EIM_D18__GPIO3_IO18 0x14c 0x51c 0x000 0x5 0x0 372#define MX6QDL_PAD_EIM_D18__GPIO3_IO18 0x14c 0x51c 0x000 0x5 0x0
373#define MX6DL_PAD_EIM_D18__I2C3_SDA 0x14c 0x51c 0x87c 0x6 0x0 373#define MX6QDL_PAD_EIM_D18__I2C3_SDA 0x14c 0x51c 0x87c 0x6 0x0
374#define MX6DL_PAD_EIM_D18__EPDC_VCOM1 0x14c 0x51c 0x000 0x8 0x0 374#define MX6QDL_PAD_EIM_D18__EPDC_VCOM1 0x14c 0x51c 0x000 0x8 0x0
375#define MX6DL_PAD_EIM_D19__EIM_DATA19 0x150 0x520 0x000 0x0 0x0 375#define MX6QDL_PAD_EIM_D19__EIM_DATA19 0x150 0x520 0x000 0x0 0x0
376#define MX6DL_PAD_EIM_D19__ECSPI1_SS1 0x150 0x520 0x7e8 0x1 0x1 376#define MX6QDL_PAD_EIM_D19__ECSPI1_SS1 0x150 0x520 0x7e8 0x1 0x1
377#define MX6DL_PAD_EIM_D19__IPU1_DI0_PIN08 0x150 0x520 0x000 0x2 0x0 377#define MX6QDL_PAD_EIM_D19__IPU1_DI0_PIN08 0x150 0x520 0x000 0x2 0x0
378#define MX6DL_PAD_EIM_D19__IPU1_CSI1_DATA16 0x150 0x520 0x8a0 0x3 0x1 378#define MX6QDL_PAD_EIM_D19__IPU1_CSI1_DATA16 0x150 0x520 0x8a0 0x3 0x1
379#define MX6DL_PAD_EIM_D19__UART1_CTS_B 0x150 0x520 0x000 0x4 0x0 379#define MX6QDL_PAD_EIM_D19__UART1_CTS_B 0x150 0x520 0x000 0x4 0x0
380#define MX6DL_PAD_EIM_D19__UART1_RTS_B 0x150 0x520 0x8f8 0x4 0x0 380#define MX6QDL_PAD_EIM_D19__UART1_RTS_B 0x150 0x520 0x8f8 0x4 0x0
381#define MX6DL_PAD_EIM_D19__GPIO3_IO19 0x150 0x520 0x000 0x5 0x0 381#define MX6QDL_PAD_EIM_D19__GPIO3_IO19 0x150 0x520 0x000 0x5 0x0
382#define MX6DL_PAD_EIM_D19__EPIT1_OUT 0x150 0x520 0x000 0x6 0x0 382#define MX6QDL_PAD_EIM_D19__EPIT1_OUT 0x150 0x520 0x000 0x6 0x0
383#define MX6DL_PAD_EIM_D19__EPDC_DATA12 0x150 0x520 0x000 0x8 0x0 383#define MX6QDL_PAD_EIM_D19__EPDC_DATA12 0x150 0x520 0x000 0x8 0x0
384#define MX6DL_PAD_EIM_D20__EIM_DATA20 0x154 0x524 0x000 0x0 0x0 384#define MX6QDL_PAD_EIM_D20__EIM_DATA20 0x154 0x524 0x000 0x0 0x0
385#define MX6DL_PAD_EIM_D20__ECSPI4_SS0 0x154 0x524 0x808 0x1 0x0 385#define MX6QDL_PAD_EIM_D20__ECSPI4_SS0 0x154 0x524 0x808 0x1 0x0
386#define MX6DL_PAD_EIM_D20__IPU1_DI0_PIN16 0x154 0x524 0x000 0x2 0x0 386#define MX6QDL_PAD_EIM_D20__IPU1_DI0_PIN16 0x154 0x524 0x000 0x2 0x0
387#define MX6DL_PAD_EIM_D20__IPU1_CSI1_DATA15 0x154 0x524 0x89c 0x3 0x1 387#define MX6QDL_PAD_EIM_D20__IPU1_CSI1_DATA15 0x154 0x524 0x89c 0x3 0x1
388#define MX6DL_PAD_EIM_D20__UART1_RTS_B 0x154 0x524 0x8f8 0x4 0x1 388#define MX6QDL_PAD_EIM_D20__UART1_RTS_B 0x154 0x524 0x8f8 0x4 0x1
389#define MX6DL_PAD_EIM_D20__UART1_CTS_B 0x154 0x524 0x000 0x4 0x0 389#define MX6QDL_PAD_EIM_D20__UART1_CTS_B 0x154 0x524 0x000 0x4 0x0
390#define MX6DL_PAD_EIM_D20__GPIO3_IO20 0x154 0x524 0x000 0x5 0x0 390#define MX6QDL_PAD_EIM_D20__GPIO3_IO20 0x154 0x524 0x000 0x5 0x0
391#define MX6DL_PAD_EIM_D20__EPIT2_OUT 0x154 0x524 0x000 0x6 0x0 391#define MX6QDL_PAD_EIM_D20__EPIT2_OUT 0x154 0x524 0x000 0x6 0x0
392#define MX6DL_PAD_EIM_D21__EIM_DATA21 0x158 0x528 0x000 0x0 0x0 392#define MX6QDL_PAD_EIM_D21__EIM_DATA21 0x158 0x528 0x000 0x0 0x0
393#define MX6DL_PAD_EIM_D21__ECSPI4_SCLK 0x158 0x528 0x000 0x1 0x0 393#define MX6QDL_PAD_EIM_D21__ECSPI4_SCLK 0x158 0x528 0x000 0x1 0x0
394#define MX6DL_PAD_EIM_D21__IPU1_DI0_PIN17 0x158 0x528 0x000 0x2 0x0 394#define MX6QDL_PAD_EIM_D21__IPU1_DI0_PIN17 0x158 0x528 0x000 0x2 0x0
395#define MX6DL_PAD_EIM_D21__IPU1_CSI1_DATA11 0x158 0x528 0x88c 0x3 0x0 395#define MX6QDL_PAD_EIM_D21__IPU1_CSI1_DATA11 0x158 0x528 0x88c 0x3 0x0
396#define MX6DL_PAD_EIM_D21__USB_OTG_OC 0x158 0x528 0x920 0x4 0x0 396#define MX6QDL_PAD_EIM_D21__USB_OTG_OC 0x158 0x528 0x920 0x4 0x0
397#define MX6DL_PAD_EIM_D21__GPIO3_IO21 0x158 0x528 0x000 0x5 0x0 397#define MX6QDL_PAD_EIM_D21__GPIO3_IO21 0x158 0x528 0x000 0x5 0x0
398#define MX6DL_PAD_EIM_D21__I2C1_SCL 0x158 0x528 0x868 0x6 0x1 398#define MX6QDL_PAD_EIM_D21__I2C1_SCL 0x158 0x528 0x868 0x6 0x1
399#define MX6DL_PAD_EIM_D21__SPDIF_IN 0x158 0x528 0x8f0 0x7 0x0 399#define MX6QDL_PAD_EIM_D21__SPDIF_IN 0x158 0x528 0x8f0 0x7 0x0
400#define MX6DL_PAD_EIM_D22__EIM_DATA22 0x15c 0x52c 0x000 0x0 0x0 400#define MX6QDL_PAD_EIM_D22__EIM_DATA22 0x15c 0x52c 0x000 0x0 0x0
401#define MX6DL_PAD_EIM_D22__ECSPI4_MISO 0x15c 0x52c 0x000 0x1 0x0 401#define MX6QDL_PAD_EIM_D22__ECSPI4_MISO 0x15c 0x52c 0x000 0x1 0x0
402#define MX6DL_PAD_EIM_D22__IPU1_DI0_PIN01 0x15c 0x52c 0x000 0x2 0x0 402#define MX6QDL_PAD_EIM_D22__IPU1_DI0_PIN01 0x15c 0x52c 0x000 0x2 0x0
403#define MX6DL_PAD_EIM_D22__IPU1_CSI1_DATA10 0x15c 0x52c 0x888 0x3 0x0 403#define MX6QDL_PAD_EIM_D22__IPU1_CSI1_DATA10 0x15c 0x52c 0x888 0x3 0x0
404#define MX6DL_PAD_EIM_D22__USB_OTG_PWR 0x15c 0x52c 0x000 0x4 0x0 404#define MX6QDL_PAD_EIM_D22__USB_OTG_PWR 0x15c 0x52c 0x000 0x4 0x0
405#define MX6DL_PAD_EIM_D22__GPIO3_IO22 0x15c 0x52c 0x000 0x5 0x0 405#define MX6QDL_PAD_EIM_D22__GPIO3_IO22 0x15c 0x52c 0x000 0x5 0x0
406#define MX6DL_PAD_EIM_D22__SPDIF_OUT 0x15c 0x52c 0x000 0x6 0x0 406#define MX6QDL_PAD_EIM_D22__SPDIF_OUT 0x15c 0x52c 0x000 0x6 0x0
407#define MX6DL_PAD_EIM_D22__EPDC_SDCE6 0x15c 0x52c 0x000 0x8 0x0 407#define MX6QDL_PAD_EIM_D22__EPDC_SDCE6 0x15c 0x52c 0x000 0x8 0x0
408#define MX6DL_PAD_EIM_D23__EIM_DATA23 0x160 0x530 0x000 0x0 0x0 408#define MX6QDL_PAD_EIM_D23__EIM_DATA23 0x160 0x530 0x000 0x0 0x0
409#define MX6DL_PAD_EIM_D23__IPU1_DI0_D0_CS 0x160 0x530 0x000 0x1 0x0 409#define MX6QDL_PAD_EIM_D23__IPU1_DI0_D0_CS 0x160 0x530 0x000 0x1 0x0
410#define MX6DL_PAD_EIM_D23__UART3_CTS_B 0x160 0x530 0x000 0x2 0x0 410#define MX6QDL_PAD_EIM_D23__UART3_CTS_B 0x160 0x530 0x000 0x2 0x0
411#define MX6DL_PAD_EIM_D23__UART3_RTS_B 0x160 0x530 0x908 0x2 0x0 411#define MX6QDL_PAD_EIM_D23__UART3_RTS_B 0x160 0x530 0x908 0x2 0x0
412#define MX6DL_PAD_EIM_D23__UART1_DCD_B 0x160 0x530 0x000 0x3 0x0 412#define MX6QDL_PAD_EIM_D23__UART1_DCD_B 0x160 0x530 0x000 0x3 0x0
413#define MX6DL_PAD_EIM_D23__IPU1_CSI1_DATA_EN 0x160 0x530 0x8b0 0x4 0x0 413#define MX6QDL_PAD_EIM_D23__IPU1_CSI1_DATA_EN 0x160 0x530 0x8b0 0x4 0x0
414#define MX6DL_PAD_EIM_D23__GPIO3_IO23 0x160 0x530 0x000 0x5 0x0 414#define MX6QDL_PAD_EIM_D23__GPIO3_IO23 0x160 0x530 0x000 0x5 0x0
415#define MX6DL_PAD_EIM_D23__IPU1_DI1_PIN02 0x160 0x530 0x000 0x6 0x0 415#define MX6QDL_PAD_EIM_D23__IPU1_DI1_PIN02 0x160 0x530 0x000 0x6 0x0
416#define MX6DL_PAD_EIM_D23__IPU1_DI1_PIN14 0x160 0x530 0x000 0x7 0x0 416#define MX6QDL_PAD_EIM_D23__IPU1_DI1_PIN14 0x160 0x530 0x000 0x7 0x0
417#define MX6DL_PAD_EIM_D23__EPDC_DATA11 0x160 0x530 0x000 0x8 0x0 417#define MX6QDL_PAD_EIM_D23__EPDC_DATA11 0x160 0x530 0x000 0x8 0x0
418#define MX6DL_PAD_EIM_D24__EIM_DATA24 0x164 0x534 0x000 0x0 0x0 418#define MX6QDL_PAD_EIM_D24__EIM_DATA24 0x164 0x534 0x000 0x0 0x0
419#define MX6DL_PAD_EIM_D24__ECSPI4_SS2 0x164 0x534 0x000 0x1 0x0 419#define MX6QDL_PAD_EIM_D24__ECSPI4_SS2 0x164 0x534 0x000 0x1 0x0
420#define MX6DL_PAD_EIM_D24__UART3_TX_DATA 0x164 0x534 0x000 0x2 0x0 420#define MX6QDL_PAD_EIM_D24__UART3_TX_DATA 0x164 0x534 0x000 0x2 0x0
421#define MX6DL_PAD_EIM_D24__UART3_RX_DATA 0x164 0x534 0x90c 0x2 0x0 421#define MX6QDL_PAD_EIM_D24__UART3_RX_DATA 0x164 0x534 0x90c 0x2 0x0
422#define MX6DL_PAD_EIM_D24__ECSPI1_SS2 0x164 0x534 0x7ec 0x3 0x0 422#define MX6QDL_PAD_EIM_D24__ECSPI1_SS2 0x164 0x534 0x7ec 0x3 0x0
423#define MX6DL_PAD_EIM_D24__ECSPI2_SS2 0x164 0x534 0x000 0x4 0x0 423#define MX6QDL_PAD_EIM_D24__ECSPI2_SS2 0x164 0x534 0x000 0x4 0x0
424#define MX6DL_PAD_EIM_D24__GPIO3_IO24 0x164 0x534 0x000 0x5 0x0 424#define MX6QDL_PAD_EIM_D24__GPIO3_IO24 0x164 0x534 0x000 0x5 0x0
425#define MX6DL_PAD_EIM_D24__AUD5_RXFS 0x164 0x534 0x7bc 0x6 0x1 425#define MX6QDL_PAD_EIM_D24__AUD5_RXFS 0x164 0x534 0x7bc 0x6 0x1
426#define MX6DL_PAD_EIM_D24__UART1_DTR_B 0x164 0x534 0x000 0x7 0x0 426#define MX6QDL_PAD_EIM_D24__UART1_DTR_B 0x164 0x534 0x000 0x7 0x0
427#define MX6DL_PAD_EIM_D24__EPDC_SDCE7 0x164 0x534 0x000 0x8 0x0 427#define MX6QDL_PAD_EIM_D24__EPDC_SDCE7 0x164 0x534 0x000 0x8 0x0
428#define MX6DL_PAD_EIM_D25__EIM_DATA25 0x168 0x538 0x000 0x0 0x0 428#define MX6QDL_PAD_EIM_D25__EIM_DATA25 0x168 0x538 0x000 0x0 0x0
429#define MX6DL_PAD_EIM_D25__ECSPI4_SS3 0x168 0x538 0x000 0x1 0x0 429#define MX6QDL_PAD_EIM_D25__ECSPI4_SS3 0x168 0x538 0x000 0x1 0x0
430#define MX6DL_PAD_EIM_D25__UART3_RX_DATA 0x168 0x538 0x90c 0x2 0x1 430#define MX6QDL_PAD_EIM_D25__UART3_RX_DATA 0x168 0x538 0x90c 0x2 0x1
431#define MX6DL_PAD_EIM_D25__UART3_TX_DATA 0x168 0x538 0x000 0x2 0x0 431#define MX6QDL_PAD_EIM_D25__UART3_TX_DATA 0x168 0x538 0x000 0x2 0x0
432#define MX6DL_PAD_EIM_D25__ECSPI1_SS3 0x168 0x538 0x7f0 0x3 0x0 432#define MX6QDL_PAD_EIM_D25__ECSPI1_SS3 0x168 0x538 0x7f0 0x3 0x0
433#define MX6DL_PAD_EIM_D25__ECSPI2_SS3 0x168 0x538 0x000 0x4 0x0 433#define MX6QDL_PAD_EIM_D25__ECSPI2_SS3 0x168 0x538 0x000 0x4 0x0
434#define MX6DL_PAD_EIM_D25__GPIO3_IO25 0x168 0x538 0x000 0x5 0x0 434#define MX6QDL_PAD_EIM_D25__GPIO3_IO25 0x168 0x538 0x000 0x5 0x0
435#define MX6DL_PAD_EIM_D25__AUD5_RXC 0x168 0x538 0x7b8 0x6 0x1 435#define MX6QDL_PAD_EIM_D25__AUD5_RXC 0x168 0x538 0x7b8 0x6 0x1
436#define MX6DL_PAD_EIM_D25__UART1_DSR_B 0x168 0x538 0x000 0x7 0x0 436#define MX6QDL_PAD_EIM_D25__UART1_DSR_B 0x168 0x538 0x000 0x7 0x0
437#define MX6DL_PAD_EIM_D25__EPDC_SDCE8 0x168 0x538 0x000 0x8 0x0 437#define MX6QDL_PAD_EIM_D25__EPDC_SDCE8 0x168 0x538 0x000 0x8 0x0
438#define MX6DL_PAD_EIM_D26__EIM_DATA26 0x16c 0x53c 0x000 0x0 0x0 438#define MX6QDL_PAD_EIM_D26__EIM_DATA26 0x16c 0x53c 0x000 0x0 0x0
439#define MX6DL_PAD_EIM_D26__IPU1_DI1_PIN11 0x16c 0x53c 0x000 0x1 0x0 439#define MX6QDL_PAD_EIM_D26__IPU1_DI1_PIN11 0x16c 0x53c 0x000 0x1 0x0
440#define MX6DL_PAD_EIM_D26__IPU1_CSI0_DATA01 0x16c 0x53c 0x000 0x2 0x0 440#define MX6QDL_PAD_EIM_D26__IPU1_CSI0_DATA01 0x16c 0x53c 0x000 0x2 0x0
441#define MX6DL_PAD_EIM_D26__IPU1_CSI1_DATA14 0x16c 0x53c 0x898 0x3 0x1 441#define MX6QDL_PAD_EIM_D26__IPU1_CSI1_DATA14 0x16c 0x53c 0x898 0x3 0x1
442#define MX6DL_PAD_EIM_D26__UART2_TX_DATA 0x16c 0x53c 0x000 0x4 0x0 442#define MX6QDL_PAD_EIM_D26__UART2_TX_DATA 0x16c 0x53c 0x000 0x4 0x0
443#define MX6DL_PAD_EIM_D26__UART2_RX_DATA 0x16c 0x53c 0x904 0x4 0x0 443#define MX6QDL_PAD_EIM_D26__UART2_RX_DATA 0x16c 0x53c 0x904 0x4 0x0
444#define MX6DL_PAD_EIM_D26__GPIO3_IO26 0x16c 0x53c 0x000 0x5 0x0 444#define MX6QDL_PAD_EIM_D26__GPIO3_IO26 0x16c 0x53c 0x000 0x5 0x0
445#define MX6DL_PAD_EIM_D26__IPU1_SISG2 0x16c 0x53c 0x000 0x6 0x0 445#define MX6QDL_PAD_EIM_D26__IPU1_SISG2 0x16c 0x53c 0x000 0x6 0x0
446#define MX6DL_PAD_EIM_D26__IPU1_DISP1_DATA22 0x16c 0x53c 0x000 0x7 0x0 446#define MX6QDL_PAD_EIM_D26__IPU1_DISP1_DATA22 0x16c 0x53c 0x000 0x7 0x0
447#define MX6DL_PAD_EIM_D26__EPDC_SDOED 0x16c 0x53c 0x000 0x8 0x0 447#define MX6QDL_PAD_EIM_D26__EPDC_SDOED 0x16c 0x53c 0x000 0x8 0x0
448#define MX6DL_PAD_EIM_D27__EIM_DATA27 0x170 0x540 0x000 0x0 0x0 448#define MX6QDL_PAD_EIM_D27__EIM_DATA27 0x170 0x540 0x000 0x0 0x0
449#define MX6DL_PAD_EIM_D27__IPU1_DI1_PIN13 0x170 0x540 0x000 0x1 0x0 449#define MX6QDL_PAD_EIM_D27__IPU1_DI1_PIN13 0x170 0x540 0x000 0x1 0x0
450#define MX6DL_PAD_EIM_D27__IPU1_CSI0_DATA00 0x170 0x540 0x000 0x2 0x0 450#define MX6QDL_PAD_EIM_D27__IPU1_CSI0_DATA00 0x170 0x540 0x000 0x2 0x0
451#define MX6DL_PAD_EIM_D27__IPU1_CSI1_DATA13 0x170 0x540 0x894 0x3 0x1 451#define MX6QDL_PAD_EIM_D27__IPU1_CSI1_DATA13 0x170 0x540 0x894 0x3 0x1
452#define MX6DL_PAD_EIM_D27__UART2_RX_DATA 0x170 0x540 0x904 0x4 0x1 452#define MX6QDL_PAD_EIM_D27__UART2_RX_DATA 0x170 0x540 0x904 0x4 0x1
453#define MX6DL_PAD_EIM_D27__UART2_TX_DATA 0x170 0x540 0x000 0x4 0x0 453#define MX6QDL_PAD_EIM_D27__UART2_TX_DATA 0x170 0x540 0x000 0x4 0x0
454#define MX6DL_PAD_EIM_D27__GPIO3_IO27 0x170 0x540 0x000 0x5 0x0 454#define MX6QDL_PAD_EIM_D27__GPIO3_IO27 0x170 0x540 0x000 0x5 0x0
455#define MX6DL_PAD_EIM_D27__IPU1_SISG3 0x170 0x540 0x000 0x6 0x0 455#define MX6QDL_PAD_EIM_D27__IPU1_SISG3 0x170 0x540 0x000 0x6 0x0
456#define MX6DL_PAD_EIM_D27__IPU1_DISP1_DATA23 0x170 0x540 0x000 0x7 0x0 456#define MX6QDL_PAD_EIM_D27__IPU1_DISP1_DATA23 0x170 0x540 0x000 0x7 0x0
457#define MX6DL_PAD_EIM_D27__EPDC_SDOE 0x170 0x540 0x000 0x8 0x0 457#define MX6QDL_PAD_EIM_D27__EPDC_SDOE 0x170 0x540 0x000 0x8 0x0
458#define MX6DL_PAD_EIM_D28__EIM_DATA28 0x174 0x544 0x000 0x0 0x0 458#define MX6QDL_PAD_EIM_D28__EIM_DATA28 0x174 0x544 0x000 0x0 0x0
459#define MX6DL_PAD_EIM_D28__I2C1_SDA 0x174 0x544 0x86c 0x1 0x1 459#define MX6QDL_PAD_EIM_D28__I2C1_SDA 0x174 0x544 0x86c 0x1 0x1
460#define MX6DL_PAD_EIM_D28__ECSPI4_MOSI 0x174 0x544 0x000 0x2 0x0 460#define MX6QDL_PAD_EIM_D28__ECSPI4_MOSI 0x174 0x544 0x000 0x2 0x0
461#define MX6DL_PAD_EIM_D28__IPU1_CSI1_DATA12 0x174 0x544 0x890 0x3 0x1 461#define MX6QDL_PAD_EIM_D28__IPU1_CSI1_DATA12 0x174 0x544 0x890 0x3 0x1
462#define MX6DL_PAD_EIM_D28__UART2_CTS_B 0x174 0x544 0x000 0x4 0x0 462#define MX6QDL_PAD_EIM_D28__UART2_CTS_B 0x174 0x544 0x000 0x4 0x0
463#define MX6DL_PAD_EIM_D28__UART2_RTS_B 0x174 0x544 0x900 0x4 0x0 463#define MX6QDL_PAD_EIM_D28__UART2_RTS_B 0x174 0x544 0x900 0x4 0x0
464#define MX6DL_PAD_EIM_D28__GPIO3_IO28 0x174 0x544 0x000 0x5 0x0 464#define MX6QDL_PAD_EIM_D28__UART2_DTE_CTS_B 0x174 0x544 0x900 0x4 0x0
465#define MX6DL_PAD_EIM_D28__IPU1_EXT_TRIG 0x174 0x544 0x000 0x6 0x0 465#define MX6QDL_PAD_EIM_D28__UART2_DTE_RTS_B 0x174 0x544 0x000 0x4 0x0
466#define MX6DL_PAD_EIM_D28__IPU1_DI0_PIN13 0x174 0x544 0x000 0x7 0x0 466#define MX6QDL_PAD_EIM_D28__GPIO3_IO28 0x174 0x544 0x000 0x5 0x0
467#define MX6DL_PAD_EIM_D28__EPDC_PWR_CTRL3 0x174 0x544 0x000 0x8 0x0 467#define MX6QDL_PAD_EIM_D28__IPU1_EXT_TRIG 0x174 0x544 0x000 0x6 0x0
468#define MX6DL_PAD_EIM_D29__EIM_DATA29 0x178 0x548 0x000 0x0 0x0 468#define MX6QDL_PAD_EIM_D28__IPU1_DI0_PIN13 0x174 0x544 0x000 0x7 0x0
469#define MX6DL_PAD_EIM_D29__IPU1_DI1_PIN15 0x178 0x548 0x000 0x1 0x0 469#define MX6QDL_PAD_EIM_D28__EPDC_PWR_CTRL3 0x174 0x544 0x000 0x8 0x0
470#define MX6DL_PAD_EIM_D29__ECSPI4_SS0 0x178 0x548 0x808 0x2 0x1 470#define MX6QDL_PAD_EIM_D29__EIM_DATA29 0x178 0x548 0x000 0x0 0x0
471#define MX6DL_PAD_EIM_D29__UART2_RTS_B 0x178 0x548 0x900 0x4 0x1 471#define MX6QDL_PAD_EIM_D29__IPU1_DI1_PIN15 0x178 0x548 0x000 0x1 0x0
472#define MX6DL_PAD_EIM_D29__UART2_CTS_B 0x178 0x548 0x000 0x4 0x0 472#define MX6QDL_PAD_EIM_D29__ECSPI4_SS0 0x178 0x548 0x808 0x2 0x1
473#define MX6DL_PAD_EIM_D29__GPIO3_IO29 0x178 0x548 0x000 0x5 0x0 473#define MX6QDL_PAD_EIM_D29__UART2_RTS_B 0x178 0x548 0x900 0x4 0x1
474#define MX6DL_PAD_EIM_D29__IPU1_CSI1_VSYNC 0x178 0x548 0x8bc 0x6 0x0 474#define MX6QDL_PAD_EIM_D29__UART2_CTS_B 0x178 0x548 0x000 0x4 0x0
475#define MX6DL_PAD_EIM_D29__IPU1_DI0_PIN14 0x178 0x548 0x000 0x7 0x0 475#define MX6QDL_PAD_EIM_D29__UART2_DTE_RTS_B 0x178 0x548 0x000 0x4 0x0
476#define MX6DL_PAD_EIM_D29__EPDC_PWR_WAKE 0x178 0x548 0x000 0x8 0x0 476#define MX6QDL_PAD_EIM_D29__UART2_DTE_CTS_B 0x178 0x548 0x900 0x4 0x1
477#define MX6DL_PAD_EIM_D30__EIM_DATA30 0x17c 0x54c 0x000 0x0 0x0 477#define MX6QDL_PAD_EIM_D29__GPIO3_IO29 0x178 0x548 0x000 0x5 0x0
478#define MX6DL_PAD_EIM_D30__IPU1_DISP1_DATA21 0x17c 0x54c 0x000 0x1 0x0 478#define MX6QDL_PAD_EIM_D29__IPU1_CSI1_VSYNC 0x178 0x548 0x8bc 0x6 0x0
479#define MX6DL_PAD_EIM_D30__IPU1_DI0_PIN11 0x17c 0x54c 0x000 0x2 0x0 479#define MX6QDL_PAD_EIM_D29__IPU1_DI0_PIN14 0x178 0x548 0x000 0x7 0x0
480#define MX6DL_PAD_EIM_D30__IPU1_CSI0_DATA03 0x17c 0x54c 0x000 0x3 0x0 480#define MX6QDL_PAD_EIM_D29__EPDC_PWR_WAKE 0x178 0x548 0x000 0x8 0x0
481#define MX6DL_PAD_EIM_D30__UART3_CTS_B 0x17c 0x54c 0x000 0x4 0x0 481#define MX6QDL_PAD_EIM_D30__EIM_DATA30 0x17c 0x54c 0x000 0x0 0x0
482#define MX6DL_PAD_EIM_D30__UART3_RTS_B 0x17c 0x54c 0x908 0x4 0x1 482#define MX6QDL_PAD_EIM_D30__IPU1_DISP1_DATA21 0x17c 0x54c 0x000 0x1 0x0
483#define MX6DL_PAD_EIM_D30__GPIO3_IO30 0x17c 0x54c 0x000 0x5 0x0 483#define MX6QDL_PAD_EIM_D30__IPU1_DI0_PIN11 0x17c 0x54c 0x000 0x2 0x0
484#define MX6DL_PAD_EIM_D30__USB_H1_OC 0x17c 0x54c 0x924 0x6 0x0 484#define MX6QDL_PAD_EIM_D30__IPU1_CSI0_DATA03 0x17c 0x54c 0x000 0x3 0x0
485#define MX6DL_PAD_EIM_D30__EPDC_SDOEZ 0x17c 0x54c 0x000 0x8 0x0 485#define MX6QDL_PAD_EIM_D30__UART3_CTS_B 0x17c 0x54c 0x000 0x4 0x0
486#define MX6DL_PAD_EIM_D31__EIM_DATA31 0x180 0x550 0x000 0x0 0x0 486#define MX6QDL_PAD_EIM_D30__UART3_RTS_B 0x17c 0x54c 0x908 0x4 0x1
487#define MX6DL_PAD_EIM_D31__IPU1_DISP1_DATA20 0x180 0x550 0x000 0x1 0x0 487#define MX6QDL_PAD_EIM_D30__GPIO3_IO30 0x17c 0x54c 0x000 0x5 0x0
488#define MX6DL_PAD_EIM_D31__IPU1_DI0_PIN12 0x180 0x550 0x000 0x2 0x0 488#define MX6QDL_PAD_EIM_D30__USB_H1_OC 0x17c 0x54c 0x924 0x6 0x0
489#define MX6DL_PAD_EIM_D31__IPU1_CSI0_DATA02 0x180 0x550 0x000 0x3 0x0 489#define MX6QDL_PAD_EIM_D30__EPDC_SDOEZ 0x17c 0x54c 0x000 0x8 0x0
490#define MX6DL_PAD_EIM_D31__UART3_RTS_B 0x180 0x550 0x908 0x4 0x2 490#define MX6QDL_PAD_EIM_D31__EIM_DATA31 0x180 0x550 0x000 0x0 0x0
491#define MX6DL_PAD_EIM_D31__UART3_CTS_B 0x180 0x550 0x000 0x4 0x0 491#define MX6QDL_PAD_EIM_D31__IPU1_DISP1_DATA20 0x180 0x550 0x000 0x1 0x0
492#define MX6DL_PAD_EIM_D31__GPIO3_IO31 0x180 0x550 0x000 0x5 0x0 492#define MX6QDL_PAD_EIM_D31__IPU1_DI0_PIN12 0x180 0x550 0x000 0x2 0x0
493#define MX6DL_PAD_EIM_D31__USB_H1_PWR 0x180 0x550 0x000 0x6 0x0 493#define MX6QDL_PAD_EIM_D31__IPU1_CSI0_DATA02 0x180 0x550 0x000 0x3 0x0
494#define MX6DL_PAD_EIM_D31__EPDC_SDCLK_P 0x180 0x550 0x000 0x8 0x0 494#define MX6QDL_PAD_EIM_D31__UART3_RTS_B 0x180 0x550 0x908 0x4 0x2
495#define MX6DL_PAD_EIM_D31__EIM_ACLK_FREERUN 0x180 0x550 0x000 0x9 0x0 495#define MX6QDL_PAD_EIM_D31__UART3_CTS_B 0x180 0x550 0x000 0x4 0x0
496#define MX6DL_PAD_EIM_DA0__EIM_AD00 0x184 0x554 0x000 0x0 0x0 496#define MX6QDL_PAD_EIM_D31__GPIO3_IO31 0x180 0x550 0x000 0x5 0x0
497#define MX6DL_PAD_EIM_DA0__IPU1_DISP1_DATA09 0x184 0x554 0x000 0x1 0x0 497#define MX6QDL_PAD_EIM_D31__USB_H1_PWR 0x180 0x550 0x000 0x6 0x0
498#define MX6DL_PAD_EIM_DA0__IPU1_CSI1_DATA09 0x184 0x554 0x000 0x2 0x0 498#define MX6QDL_PAD_EIM_D31__EPDC_SDCLK_P 0x180 0x550 0x000 0x8 0x0
499#define MX6DL_PAD_EIM_DA0__GPIO3_IO00 0x184 0x554 0x000 0x5 0x0 499#define MX6QDL_PAD_EIM_D31__EIM_ACLK_FREERUN 0x180 0x550 0x000 0x9 0x0
500#define MX6DL_PAD_EIM_DA0__SRC_BOOT_CFG00 0x184 0x554 0x000 0x7 0x0 500#define MX6QDL_PAD_EIM_DA0__EIM_AD00 0x184 0x554 0x000 0x0 0x0
501#define MX6DL_PAD_EIM_DA0__EPDC_SDCLK_N 0x184 0x554 0x000 0x8 0x0 501#define MX6QDL_PAD_EIM_DA0__IPU1_DISP1_DATA09 0x184 0x554 0x000 0x1 0x0
502#define MX6DL_PAD_EIM_DA1__EIM_AD01 0x188 0x558 0x000 0x0 0x0 502#define MX6QDL_PAD_EIM_DA0__IPU1_CSI1_DATA09 0x184 0x554 0x000 0x2 0x0
503#define MX6DL_PAD_EIM_DA1__IPU1_DISP1_DATA08 0x188 0x558 0x000 0x1 0x0 503#define MX6QDL_PAD_EIM_DA0__GPIO3_IO00 0x184 0x554 0x000 0x5 0x0
504#define MX6DL_PAD_EIM_DA1__IPU1_CSI1_DATA08 0x188 0x558 0x000 0x2 0x0 504#define MX6QDL_PAD_EIM_DA0__SRC_BOOT_CFG00 0x184 0x554 0x000 0x7 0x0
505#define MX6DL_PAD_EIM_DA1__GPIO3_IO01 0x188 0x558 0x000 0x5 0x0 505#define MX6QDL_PAD_EIM_DA0__EPDC_SDCLK_N 0x184 0x554 0x000 0x8 0x0
506#define MX6DL_PAD_EIM_DA1__SRC_BOOT_CFG01 0x188 0x558 0x000 0x7 0x0 506#define MX6QDL_PAD_EIM_DA1__EIM_AD01 0x188 0x558 0x000 0x0 0x0
507#define MX6DL_PAD_EIM_DA1__EPDC_SDLE 0x188 0x558 0x000 0x8 0x0 507#define MX6QDL_PAD_EIM_DA1__IPU1_DISP1_DATA08 0x188 0x558 0x000 0x1 0x0
508#define MX6DL_PAD_EIM_DA10__EIM_AD10 0x18c 0x55c 0x000 0x0 0x0 508#define MX6QDL_PAD_EIM_DA1__IPU1_CSI1_DATA08 0x188 0x558 0x000 0x2 0x0
509#define MX6DL_PAD_EIM_DA10__IPU1_DI1_PIN15 0x18c 0x55c 0x000 0x1 0x0 509#define MX6QDL_PAD_EIM_DA1__GPIO3_IO01 0x188 0x558 0x000 0x5 0x0
510#define MX6DL_PAD_EIM_DA10__IPU1_CSI1_DATA_EN 0x18c 0x55c 0x8b0 0x2 0x1 510#define MX6QDL_PAD_EIM_DA1__SRC_BOOT_CFG01 0x188 0x558 0x000 0x7 0x0
511#define MX6DL_PAD_EIM_DA10__GPIO3_IO10 0x18c 0x55c 0x000 0x5 0x0 511#define MX6QDL_PAD_EIM_DA1__EPDC_SDLE 0x188 0x558 0x000 0x8 0x0
512#define MX6DL_PAD_EIM_DA10__SRC_BOOT_CFG10 0x18c 0x55c 0x000 0x7 0x0 512#define MX6QDL_PAD_EIM_DA10__EIM_AD10 0x18c 0x55c 0x000 0x0 0x0
513#define MX6DL_PAD_EIM_DA10__EPDC_DATA01 0x18c 0x55c 0x000 0x8 0x0 513#define MX6QDL_PAD_EIM_DA10__IPU1_DI1_PIN15 0x18c 0x55c 0x000 0x1 0x0
514#define MX6DL_PAD_EIM_DA11__EIM_AD11 0x190 0x560 0x000 0x0 0x0 514#define MX6QDL_PAD_EIM_DA10__IPU1_CSI1_DATA_EN 0x18c 0x55c 0x8b0 0x2 0x1
515#define MX6DL_PAD_EIM_DA11__IPU1_DI1_PIN02 0x190 0x560 0x000 0x1 0x0 515#define MX6QDL_PAD_EIM_DA10__GPIO3_IO10 0x18c 0x55c 0x000 0x5 0x0
516#define MX6DL_PAD_EIM_DA11__IPU1_CSI1_HSYNC 0x190 0x560 0x8b4 0x2 0x0 516#define MX6QDL_PAD_EIM_DA10__SRC_BOOT_CFG10 0x18c 0x55c 0x000 0x7 0x0
517#define MX6DL_PAD_EIM_DA11__GPIO3_IO11 0x190 0x560 0x000 0x5 0x0 517#define MX6QDL_PAD_EIM_DA10__EPDC_DATA01 0x18c 0x55c 0x000 0x8 0x0
518#define MX6DL_PAD_EIM_DA11__SRC_BOOT_CFG11 0x190 0x560 0x000 0x7 0x0 518#define MX6QDL_PAD_EIM_DA11__EIM_AD11 0x190 0x560 0x000 0x0 0x0
519#define MX6DL_PAD_EIM_DA11__EPDC_DATA03 0x190 0x560 0x000 0x8 0x0 519#define MX6QDL_PAD_EIM_DA11__IPU1_DI1_PIN02 0x190 0x560 0x000 0x1 0x0
520#define MX6DL_PAD_EIM_DA12__EIM_AD12 0x194 0x564 0x000 0x0 0x0 520#define MX6QDL_PAD_EIM_DA11__IPU1_CSI1_HSYNC 0x190 0x560 0x8b4 0x2 0x0
521#define MX6DL_PAD_EIM_DA12__IPU1_DI1_PIN03 0x194 0x564 0x000 0x1 0x0 521#define MX6QDL_PAD_EIM_DA11__GPIO3_IO11 0x190 0x560 0x000 0x5 0x0
522#define MX6DL_PAD_EIM_DA12__IPU1_CSI1_VSYNC 0x194 0x564 0x8bc 0x2 0x1 522#define MX6QDL_PAD_EIM_DA11__SRC_BOOT_CFG11 0x190 0x560 0x000 0x7 0x0
523#define MX6DL_PAD_EIM_DA12__GPIO3_IO12 0x194 0x564 0x000 0x5 0x0 523#define MX6QDL_PAD_EIM_DA11__EPDC_DATA03 0x190 0x560 0x000 0x8 0x0
524#define MX6DL_PAD_EIM_DA12__SRC_BOOT_CFG12 0x194 0x564 0x000 0x7 0x0 524#define MX6QDL_PAD_EIM_DA12__EIM_AD12 0x194 0x564 0x000 0x0 0x0
525#define MX6DL_PAD_EIM_DA12__EPDC_DATA02 0x194 0x564 0x000 0x8 0x0 525#define MX6QDL_PAD_EIM_DA12__IPU1_DI1_PIN03 0x194 0x564 0x000 0x1 0x0
526#define MX6DL_PAD_EIM_DA13__EIM_AD13 0x198 0x568 0x000 0x0 0x0 526#define MX6QDL_PAD_EIM_DA12__IPU1_CSI1_VSYNC 0x194 0x564 0x8bc 0x2 0x1
527#define MX6DL_PAD_EIM_DA13__IPU1_DI1_D0_CS 0x198 0x568 0x000 0x1 0x0 527#define MX6QDL_PAD_EIM_DA12__GPIO3_IO12 0x194 0x564 0x000 0x5 0x0
528#define MX6DL_PAD_EIM_DA13__GPIO3_IO13 0x198 0x568 0x000 0x5 0x0 528#define MX6QDL_PAD_EIM_DA12__SRC_BOOT_CFG12 0x194 0x564 0x000 0x7 0x0
529#define MX6DL_PAD_EIM_DA13__SRC_BOOT_CFG13 0x198 0x568 0x000 0x7 0x0 529#define MX6QDL_PAD_EIM_DA12__EPDC_DATA02 0x194 0x564 0x000 0x8 0x0
530#define MX6DL_PAD_EIM_DA13__EPDC_DATA13 0x198 0x568 0x000 0x8 0x0 530#define MX6QDL_PAD_EIM_DA13__EIM_AD13 0x198 0x568 0x000 0x0 0x0
531#define MX6DL_PAD_EIM_DA14__EIM_AD14 0x19c 0x56c 0x000 0x0 0x0 531#define MX6QDL_PAD_EIM_DA13__IPU1_DI1_D0_CS 0x198 0x568 0x000 0x1 0x0
532#define MX6DL_PAD_EIM_DA14__IPU1_DI1_D1_CS 0x19c 0x56c 0x000 0x1 0x0 532#define MX6QDL_PAD_EIM_DA13__GPIO3_IO13 0x198 0x568 0x000 0x5 0x0
533#define MX6DL_PAD_EIM_DA14__GPIO3_IO14 0x19c 0x56c 0x000 0x5 0x0 533#define MX6QDL_PAD_EIM_DA13__SRC_BOOT_CFG13 0x198 0x568 0x000 0x7 0x0
534#define MX6DL_PAD_EIM_DA14__SRC_BOOT_CFG14 0x19c 0x56c 0x000 0x7 0x0 534#define MX6QDL_PAD_EIM_DA13__EPDC_DATA13 0x198 0x568 0x000 0x8 0x0
535#define MX6DL_PAD_EIM_DA14__EPDC_DATA14 0x19c 0x56c 0x000 0x8 0x0 535#define MX6QDL_PAD_EIM_DA14__EIM_AD14 0x19c 0x56c 0x000 0x0 0x0
536#define MX6DL_PAD_EIM_DA15__EIM_AD15 0x1a0 0x570 0x000 0x0 0x0 536#define MX6QDL_PAD_EIM_DA14__IPU1_DI1_D1_CS 0x19c 0x56c 0x000 0x1 0x0
537#define MX6DL_PAD_EIM_DA15__IPU1_DI1_PIN01 0x1a0 0x570 0x000 0x1 0x0 537#define MX6QDL_PAD_EIM_DA14__GPIO3_IO14 0x19c 0x56c 0x000 0x5 0x0
538#define MX6DL_PAD_EIM_DA15__IPU1_DI1_PIN04 0x1a0 0x570 0x000 0x2 0x0 538#define MX6QDL_PAD_EIM_DA14__SRC_BOOT_CFG14 0x19c 0x56c 0x000 0x7 0x0
539#define MX6DL_PAD_EIM_DA15__GPIO3_IO15 0x1a0 0x570 0x000 0x5 0x0 539#define MX6QDL_PAD_EIM_DA14__EPDC_DATA14 0x19c 0x56c 0x000 0x8 0x0
540#define MX6DL_PAD_EIM_DA15__SRC_BOOT_CFG15 0x1a0 0x570 0x000 0x7 0x0 540#define MX6QDL_PAD_EIM_DA15__EIM_AD15 0x1a0 0x570 0x000 0x0 0x0
541#define MX6DL_PAD_EIM_DA15__EPDC_DATA09 0x1a0 0x570 0x000 0x8 0x0 541#define MX6QDL_PAD_EIM_DA15__IPU1_DI1_PIN01 0x1a0 0x570 0x000 0x1 0x0
542#define MX6DL_PAD_EIM_DA2__EIM_AD02 0x1a4 0x574 0x000 0x0 0x0 542#define MX6QDL_PAD_EIM_DA15__IPU1_DI1_PIN04 0x1a0 0x570 0x000 0x2 0x0
543#define MX6DL_PAD_EIM_DA2__IPU1_DISP1_DATA07 0x1a4 0x574 0x000 0x1 0x0 543#define MX6QDL_PAD_EIM_DA15__GPIO3_IO15 0x1a0 0x570 0x000 0x5 0x0
544#define MX6DL_PAD_EIM_DA2__IPU1_CSI1_DATA07 0x1a4 0x574 0x000 0x2 0x0 544#define MX6QDL_PAD_EIM_DA15__SRC_BOOT_CFG15 0x1a0 0x570 0x000 0x7 0x0
545#define MX6DL_PAD_EIM_DA2__GPIO3_IO02 0x1a4 0x574 0x000 0x5 0x0 545#define MX6QDL_PAD_EIM_DA15__EPDC_DATA09 0x1a0 0x570 0x000 0x8 0x0
546#define MX6DL_PAD_EIM_DA2__SRC_BOOT_CFG02 0x1a4 0x574 0x000 0x7 0x0 546#define MX6QDL_PAD_EIM_DA2__EIM_AD02 0x1a4 0x574 0x000 0x0 0x0
547#define MX6DL_PAD_EIM_DA2__EPDC_BDR0 0x1a4 0x574 0x000 0x8 0x0 547#define MX6QDL_PAD_EIM_DA2__IPU1_DISP1_DATA07 0x1a4 0x574 0x000 0x1 0x0
548#define MX6DL_PAD_EIM_DA3__EIM_AD03 0x1a8 0x578 0x000 0x0 0x0 548#define MX6QDL_PAD_EIM_DA2__IPU1_CSI1_DATA07 0x1a4 0x574 0x000 0x2 0x0
549#define MX6DL_PAD_EIM_DA3__IPU1_DISP1_DATA06 0x1a8 0x578 0x000 0x1 0x0 549#define MX6QDL_PAD_EIM_DA2__GPIO3_IO02 0x1a4 0x574 0x000 0x5 0x0
550#define MX6DL_PAD_EIM_DA3__IPU1_CSI1_DATA06 0x1a8 0x578 0x000 0x2 0x0 550#define MX6QDL_PAD_EIM_DA2__SRC_BOOT_CFG02 0x1a4 0x574 0x000 0x7 0x0
551#define MX6DL_PAD_EIM_DA3__GPIO3_IO03 0x1a8 0x578 0x000 0x5 0x0 551#define MX6QDL_PAD_EIM_DA2__EPDC_BDR0 0x1a4 0x574 0x000 0x8 0x0
552#define MX6DL_PAD_EIM_DA3__SRC_BOOT_CFG03 0x1a8 0x578 0x000 0x7 0x0 552#define MX6QDL_PAD_EIM_DA3__EIM_AD03 0x1a8 0x578 0x000 0x0 0x0
553#define MX6DL_PAD_EIM_DA3__EPDC_BDR1 0x1a8 0x578 0x000 0x8 0x0 553#define MX6QDL_PAD_EIM_DA3__IPU1_DISP1_DATA06 0x1a8 0x578 0x000 0x1 0x0
554#define MX6DL_PAD_EIM_DA4__EIM_AD04 0x1ac 0x57c 0x000 0x0 0x0 554#define MX6QDL_PAD_EIM_DA3__IPU1_CSI1_DATA06 0x1a8 0x578 0x000 0x2 0x0
555#define MX6DL_PAD_EIM_DA4__IPU1_DISP1_DATA05 0x1ac 0x57c 0x000 0x1 0x0 555#define MX6QDL_PAD_EIM_DA3__GPIO3_IO03 0x1a8 0x578 0x000 0x5 0x0
556#define MX6DL_PAD_EIM_DA4__IPU1_CSI1_DATA05 0x1ac 0x57c 0x000 0x2 0x0 556#define MX6QDL_PAD_EIM_DA3__SRC_BOOT_CFG03 0x1a8 0x578 0x000 0x7 0x0
557#define MX6DL_PAD_EIM_DA4__GPIO3_IO04 0x1ac 0x57c 0x000 0x5 0x0 557#define MX6QDL_PAD_EIM_DA3__EPDC_BDR1 0x1a8 0x578 0x000 0x8 0x0
558#define MX6DL_PAD_EIM_DA4__SRC_BOOT_CFG04 0x1ac 0x57c 0x000 0x7 0x0 558#define MX6QDL_PAD_EIM_DA4__EIM_AD04 0x1ac 0x57c 0x000 0x0 0x0
559#define MX6DL_PAD_EIM_DA4__EPDC_SDCE0 0x1ac 0x57c 0x000 0x8 0x0 559#define MX6QDL_PAD_EIM_DA4__IPU1_DISP1_DATA05 0x1ac 0x57c 0x000 0x1 0x0
560#define MX6DL_PAD_EIM_DA5__EIM_AD05 0x1b0 0x580 0x000 0x0 0x0 560#define MX6QDL_PAD_EIM_DA4__IPU1_CSI1_DATA05 0x1ac 0x57c 0x000 0x2 0x0
561#define MX6DL_PAD_EIM_DA5__IPU1_DISP1_DATA04 0x1b0 0x580 0x000 0x1 0x0 561#define MX6QDL_PAD_EIM_DA4__GPIO3_IO04 0x1ac 0x57c 0x000 0x5 0x0
562#define MX6DL_PAD_EIM_DA5__IPU1_CSI1_DATA04 0x1b0 0x580 0x000 0x2 0x0 562#define MX6QDL_PAD_EIM_DA4__SRC_BOOT_CFG04 0x1ac 0x57c 0x000 0x7 0x0
563#define MX6DL_PAD_EIM_DA5__GPIO3_IO05 0x1b0 0x580 0x000 0x5 0x0 563#define MX6QDL_PAD_EIM_DA4__EPDC_SDCE0 0x1ac 0x57c 0x000 0x8 0x0
564#define MX6DL_PAD_EIM_DA5__SRC_BOOT_CFG05 0x1b0 0x580 0x000 0x7 0x0 564#define MX6QDL_PAD_EIM_DA5__EIM_AD05 0x1b0 0x580 0x000 0x0 0x0
565#define MX6DL_PAD_EIM_DA5__EPDC_SDCE1 0x1b0 0x580 0x000 0x8 0x0 565#define MX6QDL_PAD_EIM_DA5__IPU1_DISP1_DATA04 0x1b0 0x580 0x000 0x1 0x0
566#define MX6DL_PAD_EIM_DA6__EIM_AD06 0x1b4 0x584 0x000 0x0 0x0 566#define MX6QDL_PAD_EIM_DA5__IPU1_CSI1_DATA04 0x1b0 0x580 0x000 0x2 0x0
567#define MX6DL_PAD_EIM_DA6__IPU1_DISP1_DATA03 0x1b4 0x584 0x000 0x1 0x0 567#define MX6QDL_PAD_EIM_DA5__GPIO3_IO05 0x1b0 0x580 0x000 0x5 0x0
568#define MX6DL_PAD_EIM_DA6__IPU1_CSI1_DATA03 0x1b4 0x584 0x000 0x2 0x0 568#define MX6QDL_PAD_EIM_DA5__SRC_BOOT_CFG05 0x1b0 0x580 0x000 0x7 0x0
569#define MX6DL_PAD_EIM_DA6__GPIO3_IO06 0x1b4 0x584 0x000 0x5 0x0 569#define MX6QDL_PAD_EIM_DA5__EPDC_SDCE1 0x1b0 0x580 0x000 0x8 0x0
570#define MX6DL_PAD_EIM_DA6__SRC_BOOT_CFG06 0x1b4 0x584 0x000 0x7 0x0 570#define MX6QDL_PAD_EIM_DA6__EIM_AD06 0x1b4 0x584 0x000 0x0 0x0
571#define MX6DL_PAD_EIM_DA6__EPDC_SDCE2 0x1b4 0x584 0x000 0x8 0x0 571#define MX6QDL_PAD_EIM_DA6__IPU1_DISP1_DATA03 0x1b4 0x584 0x000 0x1 0x0
572#define MX6DL_PAD_EIM_DA7__EIM_AD07 0x1b8 0x588 0x000 0x0 0x0 572#define MX6QDL_PAD_EIM_DA6__IPU1_CSI1_DATA03 0x1b4 0x584 0x000 0x2 0x0
573#define MX6DL_PAD_EIM_DA7__IPU1_DISP1_DATA02 0x1b8 0x588 0x000 0x1 0x0 573#define MX6QDL_PAD_EIM_DA6__GPIO3_IO06 0x1b4 0x584 0x000 0x5 0x0
574#define MX6DL_PAD_EIM_DA7__IPU1_CSI1_DATA02 0x1b8 0x588 0x000 0x2 0x0 574#define MX6QDL_PAD_EIM_DA6__SRC_BOOT_CFG06 0x1b4 0x584 0x000 0x7 0x0
575#define MX6DL_PAD_EIM_DA7__GPIO3_IO07 0x1b8 0x588 0x000 0x5 0x0 575#define MX6QDL_PAD_EIM_DA6__EPDC_SDCE2 0x1b4 0x584 0x000 0x8 0x0
576#define MX6DL_PAD_EIM_DA7__SRC_BOOT_CFG07 0x1b8 0x588 0x000 0x7 0x0 576#define MX6QDL_PAD_EIM_DA7__EIM_AD07 0x1b8 0x588 0x000 0x0 0x0
577#define MX6DL_PAD_EIM_DA7__EPDC_SDCE3 0x1b8 0x588 0x000 0x8 0x0 577#define MX6QDL_PAD_EIM_DA7__IPU1_DISP1_DATA02 0x1b8 0x588 0x000 0x1 0x0
578#define MX6DL_PAD_EIM_DA8__EIM_AD08 0x1bc 0x58c 0x000 0x0 0x0 578#define MX6QDL_PAD_EIM_DA7__IPU1_CSI1_DATA02 0x1b8 0x588 0x000 0x2 0x0
579#define MX6DL_PAD_EIM_DA8__IPU1_DISP1_DATA01 0x1bc 0x58c 0x000 0x1 0x0 579#define MX6QDL_PAD_EIM_DA7__GPIO3_IO07 0x1b8 0x588 0x000 0x5 0x0
580#define MX6DL_PAD_EIM_DA8__IPU1_CSI1_DATA01 0x1bc 0x58c 0x000 0x2 0x0 580#define MX6QDL_PAD_EIM_DA7__SRC_BOOT_CFG07 0x1b8 0x588 0x000 0x7 0x0
581#define MX6DL_PAD_EIM_DA8__GPIO3_IO08 0x1bc 0x58c 0x000 0x5 0x0 581#define MX6QDL_PAD_EIM_DA7__EPDC_SDCE3 0x1b8 0x588 0x000 0x8 0x0
582#define MX6DL_PAD_EIM_DA8__SRC_BOOT_CFG08 0x1bc 0x58c 0x000 0x7 0x0 582#define MX6QDL_PAD_EIM_DA8__EIM_AD08 0x1bc 0x58c 0x000 0x0 0x0
583#define MX6DL_PAD_EIM_DA8__EPDC_SDCE4 0x1bc 0x58c 0x000 0x8 0x0 583#define MX6QDL_PAD_EIM_DA8__IPU1_DISP1_DATA01 0x1bc 0x58c 0x000 0x1 0x0
584#define MX6DL_PAD_EIM_DA9__EIM_AD09 0x1c0 0x590 0x000 0x0 0x0 584#define MX6QDL_PAD_EIM_DA8__IPU1_CSI1_DATA01 0x1bc 0x58c 0x000 0x2 0x0
585#define MX6DL_PAD_EIM_DA9__IPU1_DISP1_DATA00 0x1c0 0x590 0x000 0x1 0x0 585#define MX6QDL_PAD_EIM_DA8__GPIO3_IO08 0x1bc 0x58c 0x000 0x5 0x0
586#define MX6DL_PAD_EIM_DA9__IPU1_CSI1_DATA00 0x1c0 0x590 0x000 0x2 0x0 586#define MX6QDL_PAD_EIM_DA8__SRC_BOOT_CFG08 0x1bc 0x58c 0x000 0x7 0x0
587#define MX6DL_PAD_EIM_DA9__GPIO3_IO09 0x1c0 0x590 0x000 0x5 0x0 587#define MX6QDL_PAD_EIM_DA8__EPDC_SDCE4 0x1bc 0x58c 0x000 0x8 0x0
588#define MX6DL_PAD_EIM_DA9__SRC_BOOT_CFG09 0x1c0 0x590 0x000 0x7 0x0 588#define MX6QDL_PAD_EIM_DA9__EIM_AD09 0x1c0 0x590 0x000 0x0 0x0
589#define MX6DL_PAD_EIM_DA9__EPDC_SDCE5 0x1c0 0x590 0x000 0x8 0x0 589#define MX6QDL_PAD_EIM_DA9__IPU1_DISP1_DATA00 0x1c0 0x590 0x000 0x1 0x0
590#define MX6DL_PAD_EIM_EB0__EIM_EB0_B 0x1c4 0x594 0x000 0x0 0x0 590#define MX6QDL_PAD_EIM_DA9__IPU1_CSI1_DATA00 0x1c0 0x590 0x000 0x2 0x0
591#define MX6DL_PAD_EIM_EB0__IPU1_DISP1_DATA11 0x1c4 0x594 0x000 0x1 0x0 591#define MX6QDL_PAD_EIM_DA9__GPIO3_IO09 0x1c0 0x590 0x000 0x5 0x0
592#define MX6DL_PAD_EIM_EB0__IPU1_CSI1_DATA11 0x1c4 0x594 0x88c 0x2 0x1 592#define MX6QDL_PAD_EIM_DA9__SRC_BOOT_CFG09 0x1c0 0x590 0x000 0x7 0x0
593#define MX6DL_PAD_EIM_EB0__CCM_PMIC_READY 0x1c4 0x594 0x7d4 0x4 0x0 593#define MX6QDL_PAD_EIM_DA9__EPDC_SDCE5 0x1c0 0x590 0x000 0x8 0x0
594#define MX6DL_PAD_EIM_EB0__GPIO2_IO28 0x1c4 0x594 0x000 0x5 0x0 594#define MX6QDL_PAD_EIM_EB0__EIM_EB0_B 0x1c4 0x594 0x000 0x0 0x0
595#define MX6DL_PAD_EIM_EB0__SRC_BOOT_CFG27 0x1c4 0x594 0x000 0x7 0x0 595#define MX6QDL_PAD_EIM_EB0__IPU1_DISP1_DATA11 0x1c4 0x594 0x000 0x1 0x0
596#define MX6DL_PAD_EIM_EB0__EPDC_PWR_COM 0x1c4 0x594 0x000 0x8 0x0 596#define MX6QDL_PAD_EIM_EB0__IPU1_CSI1_DATA11 0x1c4 0x594 0x88c 0x2 0x1
597#define MX6DL_PAD_EIM_EB1__EIM_EB1_B 0x1c8 0x598 0x000 0x0 0x0 597#define MX6QDL_PAD_EIM_EB0__CCM_PMIC_READY 0x1c4 0x594 0x7d4 0x4 0x0
598#define MX6DL_PAD_EIM_EB1__IPU1_DISP1_DATA10 0x1c8 0x598 0x000 0x1 0x0 598#define MX6QDL_PAD_EIM_EB0__GPIO2_IO28 0x1c4 0x594 0x000 0x5 0x0
599#define MX6DL_PAD_EIM_EB1__IPU1_CSI1_DATA10 0x1c8 0x598 0x888 0x2 0x1 599#define MX6QDL_PAD_EIM_EB0__SRC_BOOT_CFG27 0x1c4 0x594 0x000 0x7 0x0
600#define MX6DL_PAD_EIM_EB1__GPIO2_IO29 0x1c8 0x598 0x000 0x5 0x0 600#define MX6QDL_PAD_EIM_EB0__EPDC_PWR_COM 0x1c4 0x594 0x000 0x8 0x0
601#define MX6DL_PAD_EIM_EB1__SRC_BOOT_CFG28 0x1c8 0x598 0x000 0x7 0x0 601#define MX6QDL_PAD_EIM_EB1__EIM_EB1_B 0x1c8 0x598 0x000 0x0 0x0
602#define MX6DL_PAD_EIM_EB1__EPDC_SDSHR 0x1c8 0x598 0x000 0x8 0x0 602#define MX6QDL_PAD_EIM_EB1__IPU1_DISP1_DATA10 0x1c8 0x598 0x000 0x1 0x0
603#define MX6DL_PAD_EIM_EB2__EIM_EB2_B 0x1cc 0x59c 0x000 0x0 0x0 603#define MX6QDL_PAD_EIM_EB1__IPU1_CSI1_DATA10 0x1c8 0x598 0x888 0x2 0x1
604#define MX6DL_PAD_EIM_EB2__ECSPI1_SS0 0x1cc 0x59c 0x7e4 0x1 0x2 604#define MX6QDL_PAD_EIM_EB1__GPIO2_IO29 0x1c8 0x598 0x000 0x5 0x0
605#define MX6DL_PAD_EIM_EB2__IPU1_CSI1_DATA19 0x1cc 0x59c 0x8ac 0x3 0x1 605#define MX6QDL_PAD_EIM_EB1__SRC_BOOT_CFG28 0x1c8 0x598 0x000 0x7 0x0
606#define MX6DL_PAD_EIM_EB2__HDMI_TX_DDC_SCL 0x1cc 0x59c 0x860 0x4 0x0 606#define MX6QDL_PAD_EIM_EB1__EPDC_SDSHR 0x1c8 0x598 0x000 0x8 0x0
607#define MX6DL_PAD_EIM_EB2__GPIO2_IO30 0x1cc 0x59c 0x000 0x5 0x0 607#define MX6QDL_PAD_EIM_EB2__EIM_EB2_B 0x1cc 0x59c 0x000 0x0 0x0
608#define MX6DL_PAD_EIM_EB2__I2C2_SCL 0x1cc 0x59c 0x870 0x6 0x0 608#define MX6QDL_PAD_EIM_EB2__ECSPI1_SS0 0x1cc 0x59c 0x7e4 0x1 0x2
609#define MX6DL_PAD_EIM_EB2__SRC_BOOT_CFG30 0x1cc 0x59c 0x000 0x7 0x0 609#define MX6QDL_PAD_EIM_EB2__IPU1_CSI1_DATA19 0x1cc 0x59c 0x8ac 0x3 0x1
610#define MX6DL_PAD_EIM_EB2__EPDC_DATA05 0x1cc 0x59c 0x000 0x8 0x0 610#define MX6QDL_PAD_EIM_EB2__HDMI_TX_DDC_SCL 0x1cc 0x59c 0x860 0x4 0x0
611#define MX6DL_PAD_EIM_EB3__EIM_EB3_B 0x1d0 0x5a0 0x000 0x0 0x0 611#define MX6QDL_PAD_EIM_EB2__GPIO2_IO30 0x1cc 0x59c 0x000 0x5 0x0
612#define MX6DL_PAD_EIM_EB3__ECSPI4_RDY 0x1d0 0x5a0 0x000 0x1 0x0 612#define MX6QDL_PAD_EIM_EB2__I2C2_SCL 0x1cc 0x59c 0x870 0x6 0x0
613#define MX6DL_PAD_EIM_EB3__UART3_RTS_B 0x1d0 0x5a0 0x908 0x2 0x3 613#define MX6QDL_PAD_EIM_EB2__SRC_BOOT_CFG30 0x1cc 0x59c 0x000 0x7 0x0
614#define MX6DL_PAD_EIM_EB3__UART3_CTS_B 0x1d0 0x5a0 0x000 0x2 0x0 614#define MX6QDL_PAD_EIM_EB2__EPDC_DATA05 0x1cc 0x59c 0x000 0x8 0x0
615#define MX6DL_PAD_EIM_EB3__UART1_RI_B 0x1d0 0x5a0 0x000 0x3 0x0 615#define MX6QDL_PAD_EIM_EB3__EIM_EB3_B 0x1d0 0x5a0 0x000 0x0 0x0
616#define MX6DL_PAD_EIM_EB3__IPU1_CSI1_HSYNC 0x1d0 0x5a0 0x8b4 0x4 0x1 616#define MX6QDL_PAD_EIM_EB3__ECSPI4_RDY 0x1d0 0x5a0 0x000 0x1 0x0
617#define MX6DL_PAD_EIM_EB3__GPIO2_IO31 0x1d0 0x5a0 0x000 0x5 0x0 617#define MX6QDL_PAD_EIM_EB3__UART3_RTS_B 0x1d0 0x5a0 0x908 0x2 0x3
618#define MX6DL_PAD_EIM_EB3__IPU1_DI1_PIN03 0x1d0 0x5a0 0x000 0x6 0x0 618#define MX6QDL_PAD_EIM_EB3__UART3_CTS_B 0x1d0 0x5a0 0x000 0x2 0x0
619#define MX6DL_PAD_EIM_EB3__SRC_BOOT_CFG31 0x1d0 0x5a0 0x000 0x7 0x0 619#define MX6QDL_PAD_EIM_EB3__UART1_RI_B 0x1d0 0x5a0 0x000 0x3 0x0
620#define MX6DL_PAD_EIM_EB3__EPDC_SDCE0 0x1d0 0x5a0 0x000 0x8 0x0 620#define MX6QDL_PAD_EIM_EB3__IPU1_CSI1_HSYNC 0x1d0 0x5a0 0x8b4 0x4 0x1
621#define MX6DL_PAD_EIM_EB3__EIM_ACLK_FREERUN 0x1d0 0x5a0 0x000 0x9 0x0 621#define MX6QDL_PAD_EIM_EB3__GPIO2_IO31 0x1d0 0x5a0 0x000 0x5 0x0
622#define MX6DL_PAD_EIM_LBA__EIM_LBA_B 0x1d4 0x5a4 0x000 0x0 0x0 622#define MX6QDL_PAD_EIM_EB3__IPU1_DI1_PIN03 0x1d0 0x5a0 0x000 0x6 0x0
623#define MX6DL_PAD_EIM_LBA__IPU1_DI1_PIN17 0x1d4 0x5a4 0x000 0x1 0x0 623#define MX6QDL_PAD_EIM_EB3__SRC_BOOT_CFG31 0x1d0 0x5a0 0x000 0x7 0x0
624#define MX6DL_PAD_EIM_LBA__ECSPI2_SS1 0x1d4 0x5a4 0x804 0x2 0x1 624#define MX6QDL_PAD_EIM_EB3__EPDC_SDCE0 0x1d0 0x5a0 0x000 0x8 0x0
625#define MX6DL_PAD_EIM_LBA__GPIO2_IO27 0x1d4 0x5a4 0x000 0x5 0x0 625#define MX6QDL_PAD_EIM_EB3__EIM_ACLK_FREERUN 0x1d0 0x5a0 0x000 0x9 0x0
626#define MX6DL_PAD_EIM_LBA__SRC_BOOT_CFG26 0x1d4 0x5a4 0x000 0x7 0x0 626#define MX6QDL_PAD_EIM_LBA__EIM_LBA_B 0x1d4 0x5a4 0x000 0x0 0x0
627#define MX6DL_PAD_EIM_LBA__EPDC_DATA04 0x1d4 0x5a4 0x000 0x8 0x0 627#define MX6QDL_PAD_EIM_LBA__IPU1_DI1_PIN17 0x1d4 0x5a4 0x000 0x1 0x0
628#define MX6DL_PAD_EIM_OE__EIM_OE_B 0x1d8 0x5a8 0x000 0x0 0x0 628#define MX6QDL_PAD_EIM_LBA__ECSPI2_SS1 0x1d4 0x5a4 0x804 0x2 0x1
629#define MX6DL_PAD_EIM_OE__IPU1_DI1_PIN07 0x1d8 0x5a8 0x000 0x1 0x0 629#define MX6QDL_PAD_EIM_LBA__GPIO2_IO27 0x1d4 0x5a4 0x000 0x5 0x0
630#define MX6DL_PAD_EIM_OE__ECSPI2_MISO 0x1d8 0x5a8 0x7f8 0x2 0x2 630#define MX6QDL_PAD_EIM_LBA__SRC_BOOT_CFG26 0x1d4 0x5a4 0x000 0x7 0x0
631#define MX6DL_PAD_EIM_OE__GPIO2_IO25 0x1d8 0x5a8 0x000 0x5 0x0 631#define MX6QDL_PAD_EIM_LBA__EPDC_DATA04 0x1d4 0x5a4 0x000 0x8 0x0
632#define MX6DL_PAD_EIM_OE__EPDC_PWR_IRQ 0x1d8 0x5a8 0x000 0x8 0x0 632#define MX6QDL_PAD_EIM_OE__EIM_OE_B 0x1d8 0x5a8 0x000 0x0 0x0
633#define MX6DL_PAD_EIM_RW__EIM_RW 0x1dc 0x5ac 0x000 0x0 0x0 633#define MX6QDL_PAD_EIM_OE__IPU1_DI1_PIN07 0x1d8 0x5a8 0x000 0x1 0x0
634#define MX6DL_PAD_EIM_RW__IPU1_DI1_PIN08 0x1dc 0x5ac 0x000 0x1 0x0 634#define MX6QDL_PAD_EIM_OE__ECSPI2_MISO 0x1d8 0x5a8 0x7f8 0x2 0x2
635#define MX6DL_PAD_EIM_RW__ECSPI2_SS0 0x1dc 0x5ac 0x800 0x2 0x2 635#define MX6QDL_PAD_EIM_OE__GPIO2_IO25 0x1d8 0x5a8 0x000 0x5 0x0
636#define MX6DL_PAD_EIM_RW__GPIO2_IO26 0x1dc 0x5ac 0x000 0x5 0x0 636#define MX6QDL_PAD_EIM_OE__EPDC_PWR_IRQ 0x1d8 0x5a8 0x000 0x8 0x0
637#define MX6DL_PAD_EIM_RW__SRC_BOOT_CFG29 0x1dc 0x5ac 0x000 0x7 0x0 637#define MX6QDL_PAD_EIM_RW__EIM_RW 0x1dc 0x5ac 0x000 0x0 0x0
638#define MX6DL_PAD_EIM_RW__EPDC_DATA07 0x1dc 0x5ac 0x000 0x8 0x0 638#define MX6QDL_PAD_EIM_RW__IPU1_DI1_PIN08 0x1dc 0x5ac 0x000 0x1 0x0
639#define MX6DL_PAD_EIM_WAIT__EIM_WAIT_B 0x1e0 0x5b0 0x000 0x0 0x0 639#define MX6QDL_PAD_EIM_RW__ECSPI2_SS0 0x1dc 0x5ac 0x800 0x2 0x2
640#define MX6DL_PAD_EIM_WAIT__EIM_DTACK_B 0x1e0 0x5b0 0x000 0x1 0x0 640#define MX6QDL_PAD_EIM_RW__GPIO2_IO26 0x1dc 0x5ac 0x000 0x5 0x0
641#define MX6DL_PAD_EIM_WAIT__GPIO5_IO00 0x1e0 0x5b0 0x000 0x5 0x0 641#define MX6QDL_PAD_EIM_RW__SRC_BOOT_CFG29 0x1dc 0x5ac 0x000 0x7 0x0
642#define MX6DL_PAD_EIM_WAIT__SRC_BOOT_CFG25 0x1e0 0x5b0 0x000 0x7 0x0 642#define MX6QDL_PAD_EIM_RW__EPDC_DATA07 0x1dc 0x5ac 0x000 0x8 0x0
643#define MX6DL_PAD_ENET_CRS_DV__ENET_RX_EN 0x1e4 0x5b4 0x828 0x1 0x0 643#define MX6QDL_PAD_EIM_WAIT__EIM_WAIT_B 0x1e0 0x5b0 0x000 0x0 0x0
644#define MX6DL_PAD_ENET_CRS_DV__ESAI_TX_CLK 0x1e4 0x5b4 0x840 0x2 0x0 644#define MX6QDL_PAD_EIM_WAIT__EIM_DTACK_B 0x1e0 0x5b0 0x000 0x1 0x0
645#define MX6DL_PAD_ENET_CRS_DV__SPDIF_EXT_CLK 0x1e4 0x5b4 0x8f4 0x3 0x0 645#define MX6QDL_PAD_EIM_WAIT__GPIO5_IO00 0x1e0 0x5b0 0x000 0x5 0x0
646#define MX6DL_PAD_ENET_CRS_DV__GPIO1_IO25 0x1e4 0x5b4 0x000 0x5 0x0 646#define MX6QDL_PAD_EIM_WAIT__SRC_BOOT_CFG25 0x1e0 0x5b0 0x000 0x7 0x0
647#define MX6DL_PAD_ENET_MDC__MLB_DATA 0x1e8 0x5b8 0x8e0 0x0 0x0 647#define MX6QDL_PAD_ENET_CRS_DV__ENET_RX_EN 0x1e4 0x5b4 0x828 0x1 0x0
648#define MX6DL_PAD_ENET_MDC__ENET_MDC 0x1e8 0x5b8 0x000 0x1 0x0 648#define MX6QDL_PAD_ENET_CRS_DV__ESAI_TX_CLK 0x1e4 0x5b4 0x840 0x2 0x0
649#define MX6DL_PAD_ENET_MDC__ESAI_TX5_RX0 0x1e8 0x5b8 0x858 0x2 0x0 649#define MX6QDL_PAD_ENET_CRS_DV__SPDIF_EXT_CLK 0x1e4 0x5b4 0x8f4 0x3 0x0
650#define MX6DL_PAD_ENET_MDC__ENET_1588_EVENT1_IN 0x1e8 0x5b8 0x000 0x4 0x0 650#define MX6QDL_PAD_ENET_CRS_DV__GPIO1_IO25 0x1e4 0x5b4 0x000 0x5 0x0
651#define MX6DL_PAD_ENET_MDC__GPIO1_IO31 0x1e8 0x5b8 0x000 0x5 0x0 651#define MX6QDL_PAD_ENET_MDC__MLB_DATA 0x1e8 0x5b8 0x8e0 0x0 0x0
652#define MX6DL_PAD_ENET_MDIO__ENET_MDIO 0x1ec 0x5bc 0x810 0x1 0x0 652#define MX6QDL_PAD_ENET_MDC__ENET_MDC 0x1e8 0x5b8 0x000 0x1 0x0
653#define MX6DL_PAD_ENET_MDIO__ESAI_RX_CLK 0x1ec 0x5bc 0x83c 0x2 0x0 653#define MX6QDL_PAD_ENET_MDC__ESAI_TX5_RX0 0x1e8 0x5b8 0x858 0x2 0x0
654#define MX6DL_PAD_ENET_MDIO__ENET_1588_EVENT1_OUT 0x1ec 0x5bc 0x000 0x4 0x0 654#define MX6QDL_PAD_ENET_MDC__ENET_1588_EVENT1_IN 0x1e8 0x5b8 0x000 0x4 0x0
655#define MX6DL_PAD_ENET_MDIO__GPIO1_IO22 0x1ec 0x5bc 0x000 0x5 0x0 655#define MX6QDL_PAD_ENET_MDC__GPIO1_IO31 0x1e8 0x5b8 0x000 0x5 0x0
656#define MX6DL_PAD_ENET_MDIO__SPDIF_LOCK 0x1ec 0x5bc 0x000 0x6 0x0 656#define MX6QDL_PAD_ENET_MDIO__ENET_MDIO 0x1ec 0x5bc 0x810 0x1 0x0
657#define MX6DL_PAD_ENET_REF_CLK__ENET_TX_CLK 0x1f0 0x5c0 0x000 0x1 0x0 657#define MX6QDL_PAD_ENET_MDIO__ESAI_RX_CLK 0x1ec 0x5bc 0x83c 0x2 0x0
658#define MX6DL_PAD_ENET_REF_CLK__ESAI_RX_FS 0x1f0 0x5c0 0x82c 0x2 0x0 658#define MX6QDL_PAD_ENET_MDIO__ENET_1588_EVENT1_OUT 0x1ec 0x5bc 0x000 0x4 0x0
659#define MX6DL_PAD_ENET_REF_CLK__GPIO1_IO23 0x1f0 0x5c0 0x000 0x5 0x0 659#define MX6QDL_PAD_ENET_MDIO__GPIO1_IO22 0x1ec 0x5bc 0x000 0x5 0x0
660#define MX6DL_PAD_ENET_REF_CLK__SPDIF_SR_CLK 0x1f0 0x5c0 0x000 0x6 0x0 660#define MX6QDL_PAD_ENET_MDIO__SPDIF_LOCK 0x1ec 0x5bc 0x000 0x6 0x0
661#define MX6DL_PAD_ENET_RX_ER__USB_OTG_ID 0x1f4 0x5c4 0x790 0x0 0x0 661#define MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK 0x1f0 0x5c0 0x000 0x1 0x0
662#define MX6DL_PAD_ENET_RX_ER__ENET_RX_ER 0x1f4 0x5c4 0x000 0x1 0x0 662#define MX6QDL_PAD_ENET_REF_CLK__ESAI_RX_FS 0x1f0 0x5c0 0x82c 0x2 0x0
663#define MX6DL_PAD_ENET_RX_ER__ESAI_RX_HF_CLK 0x1f4 0x5c4 0x834 0x2 0x0 663#define MX6QDL_PAD_ENET_REF_CLK__GPIO1_IO23 0x1f0 0x5c0 0x000 0x5 0x0
664#define MX6DL_PAD_ENET_RX_ER__SPDIF_IN 0x1f4 0x5c4 0x8f0 0x3 0x1 664#define MX6QDL_PAD_ENET_REF_CLK__SPDIF_SR_CLK 0x1f0 0x5c0 0x000 0x6 0x0
665#define MX6DL_PAD_ENET_RX_ER__ENET_1588_EVENT2_OUT 0x1f4 0x5c4 0x000 0x4 0x0 665#define MX6QDL_PAD_ENET_RX_ER__USB_OTG_ID 0x1f4 0x5c4 0x790 0x0 0x0
666#define MX6DL_PAD_ENET_RX_ER__GPIO1_IO24 0x1f4 0x5c4 0x000 0x5 0x0 666#define MX6QDL_PAD_ENET_RX_ER__ENET_RX_ER 0x1f4 0x5c4 0x000 0x1 0x0
667#define MX6DL_PAD_ENET_RXD0__ENET_RX_DATA0 0x1f8 0x5c8 0x818 0x1 0x0 667#define MX6QDL_PAD_ENET_RX_ER__ESAI_RX_HF_CLK 0x1f4 0x5c4 0x834 0x2 0x0
668#define MX6DL_PAD_ENET_RXD0__ESAI_TX_HF_CLK 0x1f8 0x5c8 0x838 0x2 0x0 668#define MX6QDL_PAD_ENET_RX_ER__SPDIF_IN 0x1f4 0x5c4 0x8f0 0x3 0x1
669#define MX6DL_PAD_ENET_RXD0__SPDIF_OUT 0x1f8 0x5c8 0x000 0x3 0x0 669#define MX6QDL_PAD_ENET_RX_ER__ENET_1588_EVENT2_OUT 0x1f4 0x5c4 0x000 0x4 0x0
670#define MX6DL_PAD_ENET_RXD0__GPIO1_IO27 0x1f8 0x5c8 0x000 0x5 0x0 670#define MX6QDL_PAD_ENET_RX_ER__GPIO1_IO24 0x1f4 0x5c4 0x000 0x5 0x0
671#define MX6DL_PAD_ENET_RXD1__MLB_SIG 0x1fc 0x5cc 0x8e4 0x0 0x0 671#define MX6QDL_PAD_ENET_RXD0__ENET_RX_DATA0 0x1f8 0x5c8 0x818 0x1 0x0
672#define MX6DL_PAD_ENET_RXD1__ENET_RX_DATA1 0x1fc 0x5cc 0x81c 0x1 0x0 672#define MX6QDL_PAD_ENET_RXD0__ESAI_TX_HF_CLK 0x1f8 0x5c8 0x838 0x2 0x0
673#define MX6DL_PAD_ENET_RXD1__ESAI_TX_FS 0x1fc 0x5cc 0x830 0x2 0x0 673#define MX6QDL_PAD_ENET_RXD0__SPDIF_OUT 0x1f8 0x5c8 0x000 0x3 0x0
674#define MX6DL_PAD_ENET_RXD1__ENET_1588_EVENT3_OUT 0x1fc 0x5cc 0x000 0x4 0x0 674#define MX6QDL_PAD_ENET_RXD0__GPIO1_IO27 0x1f8 0x5c8 0x000 0x5 0x0
675#define MX6DL_PAD_ENET_RXD1__GPIO1_IO26 0x1fc 0x5cc 0x000 0x5 0x0 675#define MX6QDL_PAD_ENET_RXD1__MLB_SIG 0x1fc 0x5cc 0x8e4 0x0 0x0
676#define MX6DL_PAD_ENET_TX_EN__ENET_TX_EN 0x200 0x5d0 0x000 0x1 0x0 676#define MX6QDL_PAD_ENET_RXD1__ENET_RX_DATA1 0x1fc 0x5cc 0x81c 0x1 0x0
677#define MX6DL_PAD_ENET_TX_EN__ESAI_TX3_RX2 0x200 0x5d0 0x850 0x2 0x0 677#define MX6QDL_PAD_ENET_RXD1__ESAI_TX_FS 0x1fc 0x5cc 0x830 0x2 0x0
678#define MX6DL_PAD_ENET_TX_EN__GPIO1_IO28 0x200 0x5d0 0x000 0x5 0x0 678#define MX6QDL_PAD_ENET_RXD1__ENET_1588_EVENT3_OUT 0x1fc 0x5cc 0x000 0x4 0x0
679#define MX6DL_PAD_ENET_TX_EN__I2C4_SCL 0x200 0x5d0 0x880 0x9 0x0 679#define MX6QDL_PAD_ENET_RXD1__GPIO1_IO26 0x1fc 0x5cc 0x000 0x5 0x0
680#define MX6DL_PAD_ENET_TXD0__ENET_TX_DATA0 0x204 0x5d4 0x000 0x1 0x0 680#define MX6QDL_PAD_ENET_TX_EN__ENET_TX_EN 0x200 0x5d0 0x000 0x1 0x0
681#define MX6DL_PAD_ENET_TXD0__ESAI_TX4_RX1 0x204 0x5d4 0x854 0x2 0x0 681#define MX6QDL_PAD_ENET_TX_EN__ESAI_TX3_RX2 0x200 0x5d0 0x850 0x2 0x0
682#define MX6DL_PAD_ENET_TXD0__GPIO1_IO30 0x204 0x5d4 0x000 0x5 0x0 682#define MX6QDL_PAD_ENET_TX_EN__GPIO1_IO28 0x200 0x5d0 0x000 0x5 0x0
683#define MX6DL_PAD_ENET_TXD1__MLB_CLK 0x208 0x5d8 0x8dc 0x0 0x0 683#define MX6QDL_PAD_ENET_TX_EN__I2C4_SCL 0x200 0x5d0 0x880 0x9 0x0
684#define MX6DL_PAD_ENET_TXD1__ENET_TX_DATA1 0x208 0x5d8 0x000 0x1 0x0 684#define MX6QDL_PAD_ENET_TXD0__ENET_TX_DATA0 0x204 0x5d4 0x000 0x1 0x0
685#define MX6DL_PAD_ENET_TXD1__ESAI_TX2_RX3 0x208 0x5d8 0x84c 0x2 0x0 685#define MX6QDL_PAD_ENET_TXD0__ESAI_TX4_RX1 0x204 0x5d4 0x854 0x2 0x0
686#define MX6DL_PAD_ENET_TXD1__ENET_1588_EVENT0_IN 0x208 0x5d8 0x000 0x4 0x0 686#define MX6QDL_PAD_ENET_TXD0__GPIO1_IO30 0x204 0x5d4 0x000 0x5 0x0
687#define MX6DL_PAD_ENET_TXD1__GPIO1_IO29 0x208 0x5d8 0x000 0x5 0x0 687#define MX6QDL_PAD_ENET_TXD1__MLB_CLK 0x208 0x5d8 0x8dc 0x0 0x0
688#define MX6DL_PAD_ENET_TXD1__I2C4_SDA 0x208 0x5d8 0x884 0x9 0x0 688#define MX6QDL_PAD_ENET_TXD1__ENET_TX_DATA1 0x208 0x5d8 0x000 0x1 0x0
689#define MX6DL_PAD_GPIO_0__CCM_CLKO1 0x20c 0x5dc 0x000 0x0 0x0 689#define MX6QDL_PAD_ENET_TXD1__ESAI_TX2_RX3 0x208 0x5d8 0x84c 0x2 0x0
690#define MX6DL_PAD_GPIO_0__KEY_COL5 0x20c 0x5dc 0x8c0 0x2 0x1 690#define MX6QDL_PAD_ENET_TXD1__ENET_1588_EVENT0_IN 0x208 0x5d8 0x000 0x4 0x0
691#define MX6DL_PAD_GPIO_0__ASRC_EXT_CLK 0x20c 0x5dc 0x794 0x3 0x0 691#define MX6QDL_PAD_ENET_TXD1__GPIO1_IO29 0x208 0x5d8 0x000 0x5 0x0
692#define MX6DL_PAD_GPIO_0__EPIT1_OUT 0x20c 0x5dc 0x000 0x4 0x0 692#define MX6QDL_PAD_ENET_TXD1__I2C4_SDA 0x208 0x5d8 0x884 0x9 0x0
693#define MX6DL_PAD_GPIO_0__GPIO1_IO00 0x20c 0x5dc 0x000 0x5 0x0 693#define MX6QDL_PAD_GPIO_0__CCM_CLKO1 0x20c 0x5dc 0x000 0x0 0x0
694#define MX6DL_PAD_GPIO_0__USB_H1_PWR 0x20c 0x5dc 0x000 0x6 0x0 694#define MX6QDL_PAD_GPIO_0__KEY_COL5 0x20c 0x5dc 0x8c0 0x2 0x1
695#define MX6DL_PAD_GPIO_0__SNVS_VIO_5 0x20c 0x5dc 0x000 0x7 0x0 695#define MX6QDL_PAD_GPIO_0__ASRC_EXT_CLK 0x20c 0x5dc 0x794 0x3 0x0
696#define MX6DL_PAD_GPIO_1__ESAI_RX_CLK 0x210 0x5e0 0x83c 0x0 0x1 696#define MX6QDL_PAD_GPIO_0__EPIT1_OUT 0x20c 0x5dc 0x000 0x4 0x0
697#define MX6DL_PAD_GPIO_1__WDOG2_B 0x210 0x5e0 0x000 0x1 0x0 697#define MX6QDL_PAD_GPIO_0__GPIO1_IO00 0x20c 0x5dc 0x000 0x5 0x0
698#define MX6DL_PAD_GPIO_1__KEY_ROW5 0x210 0x5e0 0x8cc 0x2 0x1 698#define MX6QDL_PAD_GPIO_0__USB_H1_PWR 0x20c 0x5dc 0x000 0x6 0x0
699#define MX6DL_PAD_GPIO_1__USB_OTG_ID 0x210 0x5e0 0x790 0x3 0x1 699#define MX6QDL_PAD_GPIO_0__SNVS_VIO_5 0x20c 0x5dc 0x000 0x7 0x0
700#define MX6DL_PAD_GPIO_1__PWM2_OUT 0x210 0x5e0 0x000 0x4 0x0 700#define MX6QDL_PAD_GPIO_1__ESAI_RX_CLK 0x210 0x5e0 0x83c 0x0 0x1
701#define MX6DL_PAD_GPIO_1__GPIO1_IO01 0x210 0x5e0 0x000 0x5 0x0 701#define MX6QDL_PAD_GPIO_1__WDOG2_B 0x210 0x5e0 0x000 0x1 0x0
702#define MX6DL_PAD_GPIO_1__SD1_CD_B 0x210 0x5e0 0x000 0x6 0x0 702#define MX6QDL_PAD_GPIO_1__KEY_ROW5 0x210 0x5e0 0x8cc 0x2 0x1
703#define MX6DL_PAD_GPIO_16__ESAI_TX3_RX2 0x214 0x5e4 0x850 0x0 0x1 703#define MX6QDL_PAD_GPIO_1__USB_OTG_ID 0x210 0x5e0 0x790 0x3 0x1
704#define MX6DL_PAD_GPIO_16__ENET_1588_EVENT2_IN 0x214 0x5e4 0x000 0x1 0x0 704#define MX6QDL_PAD_GPIO_1__PWM2_OUT 0x210 0x5e0 0x000 0x4 0x0
705#define MX6DL_PAD_GPIO_16__ENET_REF_CLK 0x214 0x5e4 0x80c 0x2 0x0 705#define MX6QDL_PAD_GPIO_1__GPIO1_IO01 0x210 0x5e0 0x000 0x5 0x0
706#define MX6DL_PAD_GPIO_16__SD1_LCTL 0x214 0x5e4 0x000 0x3 0x0 706#define MX6QDL_PAD_GPIO_1__SD1_CD_B 0x210 0x5e0 0x000 0x6 0x0
707#define MX6DL_PAD_GPIO_16__SPDIF_IN 0x214 0x5e4 0x8f0 0x4 0x2 707#define MX6QDL_PAD_GPIO_16__ESAI_TX3_RX2 0x214 0x5e4 0x850 0x0 0x1
708#define MX6DL_PAD_GPIO_16__GPIO7_IO11 0x214 0x5e4 0x000 0x5 0x0 708#define MX6QDL_PAD_GPIO_16__ENET_1588_EVENT2_IN 0x214 0x5e4 0x000 0x1 0x0
709#define MX6DL_PAD_GPIO_16__I2C3_SDA 0x214 0x5e4 0x87c 0x6 0x1 709#define MX6QDL_PAD_GPIO_16__ENET_REF_CLK 0x214 0x5e4 0x80c 0x2 0x0
710#define MX6DL_PAD_GPIO_16__JTAG_DE_B 0x214 0x5e4 0x000 0x7 0x0 710#define MX6QDL_PAD_GPIO_16__SD1_LCTL 0x214 0x5e4 0x000 0x3 0x0
711#define MX6DL_PAD_GPIO_17__ESAI_TX0 0x218 0x5e8 0x844 0x0 0x0 711#define MX6QDL_PAD_GPIO_16__SPDIF_IN 0x214 0x5e4 0x8f0 0x4 0x2
712#define MX6DL_PAD_GPIO_17__ENET_1588_EVENT3_IN 0x218 0x5e8 0x000 0x1 0x0 712#define MX6QDL_PAD_GPIO_16__GPIO7_IO11 0x214 0x5e4 0x000 0x5 0x0
713#define MX6DL_PAD_GPIO_17__CCM_PMIC_READY 0x218 0x5e8 0x7d4 0x2 0x1 713#define MX6QDL_PAD_GPIO_16__I2C3_SDA 0x214 0x5e4 0x87c 0x6 0x1
714#define MX6DL_PAD_GPIO_17__SDMA_EXT_EVENT0 0x218 0x5e8 0x8e8 0x3 0x1 714#define MX6QDL_PAD_GPIO_16__JTAG_DE_B 0x214 0x5e4 0x000 0x7 0x0
715#define MX6DL_PAD_GPIO_17__SPDIF_OUT 0x218 0x5e8 0x000 0x4 0x0 715#define MX6QDL_PAD_GPIO_17__ESAI_TX0 0x218 0x5e8 0x844 0x0 0x0
716#define MX6DL_PAD_GPIO_17__GPIO7_IO12 0x218 0x5e8 0x000 0x5 0x0 716#define MX6QDL_PAD_GPIO_17__ENET_1588_EVENT3_IN 0x218 0x5e8 0x000 0x1 0x0
717#define MX6DL_PAD_GPIO_18__ESAI_TX1 0x21c 0x5ec 0x848 0x0 0x0 717#define MX6QDL_PAD_GPIO_17__CCM_PMIC_READY 0x218 0x5e8 0x7d4 0x2 0x1
718#define MX6DL_PAD_GPIO_18__ENET_RX_CLK 0x21c 0x5ec 0x814 0x1 0x0 718#define MX6QDL_PAD_GPIO_17__SDMA_EXT_EVENT0 0x218 0x5e8 0x8e8 0x3 0x1
719#define MX6DL_PAD_GPIO_18__SD3_VSELECT 0x21c 0x5ec 0x000 0x2 0x0 719#define MX6QDL_PAD_GPIO_17__SPDIF_OUT 0x218 0x5e8 0x000 0x4 0x0
720#define MX6DL_PAD_GPIO_18__SDMA_EXT_EVENT1 0x21c 0x5ec 0x8ec 0x3 0x1 720#define MX6QDL_PAD_GPIO_17__GPIO7_IO12 0x218 0x5e8 0x000 0x5 0x0
721#define MX6DL_PAD_GPIO_18__ASRC_EXT_CLK 0x21c 0x5ec 0x794 0x4 0x1 721#define MX6QDL_PAD_GPIO_18__ESAI_TX1 0x21c 0x5ec 0x848 0x0 0x0
722#define MX6DL_PAD_GPIO_18__GPIO7_IO13 0x21c 0x5ec 0x000 0x5 0x0 722#define MX6QDL_PAD_GPIO_18__ENET_RX_CLK 0x21c 0x5ec 0x814 0x1 0x0
723#define MX6DL_PAD_GPIO_18__SNVS_VIO_5_CTL 0x21c 0x5ec 0x000 0x6 0x0 723#define MX6QDL_PAD_GPIO_18__SD3_VSELECT 0x21c 0x5ec 0x000 0x2 0x0
724#define MX6DL_PAD_GPIO_19__KEY_COL5 0x220 0x5f0 0x8c0 0x0 0x2 724#define MX6QDL_PAD_GPIO_18__SDMA_EXT_EVENT1 0x21c 0x5ec 0x8ec 0x3 0x1
725#define MX6DL_PAD_GPIO_19__ENET_1588_EVENT0_OUT 0x220 0x5f0 0x000 0x1 0x0 725#define MX6QDL_PAD_GPIO_18__ASRC_EXT_CLK 0x21c 0x5ec 0x794 0x4 0x1
726#define MX6DL_PAD_GPIO_19__SPDIF_OUT 0x220 0x5f0 0x000 0x2 0x0 726#define MX6QDL_PAD_GPIO_18__GPIO7_IO13 0x21c 0x5ec 0x000 0x5 0x0
727#define MX6DL_PAD_GPIO_19__CCM_CLKO1 0x220 0x5f0 0x000 0x3 0x0 727#define MX6QDL_PAD_GPIO_18__SNVS_VIO_5_CTL 0x21c 0x5ec 0x000 0x6 0x0
728#define MX6DL_PAD_GPIO_19__ECSPI1_RDY 0x220 0x5f0 0x000 0x4 0x0 728#define MX6QDL_PAD_GPIO_19__KEY_COL5 0x220 0x5f0 0x8c0 0x0 0x2
729#define MX6DL_PAD_GPIO_19__GPIO4_IO05 0x220 0x5f0 0x000 0x5 0x0 729#define MX6QDL_PAD_GPIO_19__ENET_1588_EVENT0_OUT 0x220 0x5f0 0x000 0x1 0x0
730#define MX6DL_PAD_GPIO_19__ENET_TX_ER 0x220 0x5f0 0x000 0x6 0x0 730#define MX6QDL_PAD_GPIO_19__SPDIF_OUT 0x220 0x5f0 0x000 0x2 0x0
731#define MX6DL_PAD_GPIO_2__ESAI_TX_FS 0x224 0x5f4 0x830 0x0 0x1 731#define MX6QDL_PAD_GPIO_19__CCM_CLKO1 0x220 0x5f0 0x000 0x3 0x0
732#define MX6DL_PAD_GPIO_2__KEY_ROW6 0x224 0x5f4 0x8d0 0x2 0x1 732#define MX6QDL_PAD_GPIO_19__ECSPI1_RDY 0x220 0x5f0 0x000 0x4 0x0
733#define MX6DL_PAD_GPIO_2__GPIO1_IO02 0x224 0x5f4 0x000 0x5 0x0 733#define MX6QDL_PAD_GPIO_19__GPIO4_IO05 0x220 0x5f0 0x000 0x5 0x0
734#define MX6DL_PAD_GPIO_2__SD2_WP 0x224 0x5f4 0x000 0x6 0x0 734#define MX6QDL_PAD_GPIO_19__ENET_TX_ER 0x220 0x5f0 0x000 0x6 0x0
735#define MX6DL_PAD_GPIO_2__MLB_DATA 0x224 0x5f4 0x8e0 0x7 0x1 735#define MX6QDL_PAD_GPIO_2__ESAI_TX_FS 0x224 0x5f4 0x830 0x0 0x1
736#define MX6DL_PAD_GPIO_3__ESAI_RX_HF_CLK 0x228 0x5f8 0x834 0x0 0x1 736#define MX6QDL_PAD_GPIO_2__KEY_ROW6 0x224 0x5f4 0x8d0 0x2 0x1
737#define MX6DL_PAD_GPIO_3__I2C3_SCL 0x228 0x5f8 0x878 0x2 0x1 737#define MX6QDL_PAD_GPIO_2__GPIO1_IO02 0x224 0x5f4 0x000 0x5 0x0
738#define MX6DL_PAD_GPIO_3__XTALOSC_REF_CLK_24M 0x228 0x5f8 0x000 0x3 0x0 738#define MX6QDL_PAD_GPIO_2__SD2_WP 0x224 0x5f4 0x000 0x6 0x0
739#define MX6DL_PAD_GPIO_3__CCM_CLKO2 0x228 0x5f8 0x000 0x4 0x0 739#define MX6QDL_PAD_GPIO_2__MLB_DATA 0x224 0x5f4 0x8e0 0x7 0x1
740#define MX6DL_PAD_GPIO_3__GPIO1_IO03 0x228 0x5f8 0x000 0x5 0x0 740#define MX6QDL_PAD_GPIO_3__ESAI_RX_HF_CLK 0x228 0x5f8 0x834 0x0 0x1
741#define MX6DL_PAD_GPIO_3__USB_H1_OC 0x228 0x5f8 0x924 0x6 0x1 741#define MX6QDL_PAD_GPIO_3__I2C3_SCL 0x228 0x5f8 0x878 0x2 0x1
742#define MX6DL_PAD_GPIO_3__MLB_CLK 0x228 0x5f8 0x8dc 0x7 0x1 742#define MX6QDL_PAD_GPIO_3__XTALOSC_REF_CLK_24M 0x228 0x5f8 0x000 0x3 0x0
743#define MX6DL_PAD_GPIO_4__ESAI_TX_HF_CLK 0x22c 0x5fc 0x838 0x0 0x1 743#define MX6QDL_PAD_GPIO_3__CCM_CLKO2 0x228 0x5f8 0x000 0x4 0x0
744#define MX6DL_PAD_GPIO_4__KEY_COL7 0x22c 0x5fc 0x8c8 0x2 0x1 744#define MX6QDL_PAD_GPIO_3__GPIO1_IO03 0x228 0x5f8 0x000 0x5 0x0
745#define MX6DL_PAD_GPIO_4__GPIO1_IO04 0x22c 0x5fc 0x000 0x5 0x0 745#define MX6QDL_PAD_GPIO_3__USB_H1_OC 0x228 0x5f8 0x924 0x6 0x1
746#define MX6DL_PAD_GPIO_4__SD2_CD_B 0x22c 0x5fc 0x000 0x6 0x0 746#define MX6QDL_PAD_GPIO_3__MLB_CLK 0x228 0x5f8 0x8dc 0x7 0x1
747#define MX6DL_PAD_GPIO_5__ESAI_TX2_RX3 0x230 0x600 0x84c 0x0 0x1 747#define MX6QDL_PAD_GPIO_4__ESAI_TX_HF_CLK 0x22c 0x5fc 0x838 0x0 0x1
748#define MX6DL_PAD_GPIO_5__KEY_ROW7 0x230 0x600 0x8d4 0x2 0x1 748#define MX6QDL_PAD_GPIO_4__KEY_COL7 0x22c 0x5fc 0x8c8 0x2 0x1
749#define MX6DL_PAD_GPIO_5__CCM_CLKO1 0x230 0x600 0x000 0x3 0x0 749#define MX6QDL_PAD_GPIO_4__GPIO1_IO04 0x22c 0x5fc 0x000 0x5 0x0
750#define MX6DL_PAD_GPIO_5__GPIO1_IO05 0x230 0x600 0x000 0x5 0x0 750#define MX6QDL_PAD_GPIO_4__SD2_CD_B 0x22c 0x5fc 0x000 0x6 0x0
751#define MX6DL_PAD_GPIO_5__I2C3_SCL 0x230 0x600 0x878 0x6 0x2 751#define MX6QDL_PAD_GPIO_5__ESAI_TX2_RX3 0x230 0x600 0x84c 0x0 0x1
752#define MX6DL_PAD_GPIO_5__ARM_EVENTI 0x230 0x600 0x000 0x7 0x0 752#define MX6QDL_PAD_GPIO_5__KEY_ROW7 0x230 0x600 0x8d4 0x2 0x1
753#define MX6DL_PAD_GPIO_6__ESAI_TX_CLK 0x234 0x604 0x840 0x0 0x1 753#define MX6QDL_PAD_GPIO_5__CCM_CLKO1 0x230 0x600 0x000 0x3 0x0
754#define MX6DL_PAD_GPIO_6__I2C3_SDA 0x234 0x604 0x87c 0x2 0x2 754#define MX6QDL_PAD_GPIO_5__GPIO1_IO05 0x230 0x600 0x000 0x5 0x0
755#define MX6DL_PAD_GPIO_6__GPIO1_IO06 0x234 0x604 0x000 0x5 0x0 755#define MX6QDL_PAD_GPIO_5__I2C3_SCL 0x230 0x600 0x878 0x6 0x2
756#define MX6DL_PAD_GPIO_6__SD2_LCTL 0x234 0x604 0x000 0x6 0x0 756#define MX6QDL_PAD_GPIO_5__ARM_EVENTI 0x230 0x600 0x000 0x7 0x0
757#define MX6DL_PAD_GPIO_6__MLB_SIG 0x234 0x604 0x8e4 0x7 0x1 757#define MX6QDL_PAD_GPIO_6__ESAI_TX_CLK 0x234 0x604 0x840 0x0 0x1
758#define MX6DL_PAD_GPIO_7__ESAI_TX4_RX1 0x238 0x608 0x854 0x0 0x1 758#define MX6QDL_PAD_GPIO_6__I2C3_SDA 0x234 0x604 0x87c 0x2 0x2
759#define MX6DL_PAD_GPIO_7__EPIT1_OUT 0x238 0x608 0x000 0x2 0x0 759#define MX6QDL_PAD_GPIO_6__GPIO1_IO06 0x234 0x604 0x000 0x5 0x0
760#define MX6DL_PAD_GPIO_7__FLEXCAN1_TX 0x238 0x608 0x000 0x3 0x0 760#define MX6QDL_PAD_GPIO_6__SD2_LCTL 0x234 0x604 0x000 0x6 0x0
761#define MX6DL_PAD_GPIO_7__UART2_TX_DATA 0x238 0x608 0x000 0x4 0x0 761#define MX6QDL_PAD_GPIO_6__MLB_SIG 0x234 0x604 0x8e4 0x7 0x1
762#define MX6DL_PAD_GPIO_7__UART2_RX_DATA 0x238 0x608 0x904 0x4 0x2 762#define MX6QDL_PAD_GPIO_7__ESAI_TX4_RX1 0x238 0x608 0x854 0x0 0x1
763#define MX6DL_PAD_GPIO_7__GPIO1_IO07 0x238 0x608 0x000 0x5 0x0 763#define MX6QDL_PAD_GPIO_7__EPIT1_OUT 0x238 0x608 0x000 0x2 0x0
764#define MX6DL_PAD_GPIO_7__SPDIF_LOCK 0x238 0x608 0x000 0x6 0x0 764#define MX6QDL_PAD_GPIO_7__FLEXCAN1_TX 0x238 0x608 0x000 0x3 0x0
765#define MX6DL_PAD_GPIO_7__USB_OTG_HOST_MODE 0x238 0x608 0x000 0x7 0x0 765#define MX6QDL_PAD_GPIO_7__UART2_TX_DATA 0x238 0x608 0x000 0x4 0x0
766#define MX6DL_PAD_GPIO_7__I2C4_SCL 0x238 0x608 0x880 0x8 0x1 766#define MX6QDL_PAD_GPIO_7__UART2_RX_DATA 0x238 0x608 0x904 0x4 0x2
767#define MX6DL_PAD_GPIO_8__ESAI_TX5_RX0 0x23c 0x60c 0x858 0x0 0x1 767#define MX6QDL_PAD_GPIO_7__GPIO1_IO07 0x238 0x608 0x000 0x5 0x0
768#define MX6DL_PAD_GPIO_8__XTALOSC_REF_CLK_32K 0x23c 0x60c 0x000 0x1 0x0 768#define MX6QDL_PAD_GPIO_7__SPDIF_LOCK 0x238 0x608 0x000 0x6 0x0
769#define MX6DL_PAD_GPIO_8__EPIT2_OUT 0x23c 0x60c 0x000 0x2 0x0 769#define MX6QDL_PAD_GPIO_7__USB_OTG_HOST_MODE 0x238 0x608 0x000 0x7 0x0
770#define MX6DL_PAD_GPIO_8__FLEXCAN1_RX 0x23c 0x60c 0x7c8 0x3 0x0 770#define MX6QDL_PAD_GPIO_7__I2C4_SCL 0x238 0x608 0x880 0x8 0x1
771#define MX6DL_PAD_GPIO_8__UART2_RX_DATA 0x23c 0x60c 0x904 0x4 0x3 771#define MX6QDL_PAD_GPIO_8__ESAI_TX5_RX0 0x23c 0x60c 0x858 0x0 0x1
772#define MX6DL_PAD_GPIO_8__UART2_TX_DATA 0x23c 0x60c 0x000 0x4 0x0 772#define MX6QDL_PAD_GPIO_8__XTALOSC_REF_CLK_32K 0x23c 0x60c 0x000 0x1 0x0
773#define MX6DL_PAD_GPIO_8__GPIO1_IO08 0x23c 0x60c 0x000 0x5 0x0 773#define MX6QDL_PAD_GPIO_8__EPIT2_OUT 0x23c 0x60c 0x000 0x2 0x0
774#define MX6DL_PAD_GPIO_8__SPDIF_SR_CLK 0x23c 0x60c 0x000 0x6 0x0 774#define MX6QDL_PAD_GPIO_8__FLEXCAN1_RX 0x23c 0x60c 0x7c8 0x3 0x0
775#define MX6DL_PAD_GPIO_8__USB_OTG_PWR_CTL_WAKE 0x23c 0x60c 0x000 0x7 0x0 775#define MX6QDL_PAD_GPIO_8__UART2_RX_DATA 0x23c 0x60c 0x904 0x4 0x3
776#define MX6DL_PAD_GPIO_8__I2C4_SDA 0x23c 0x60c 0x884 0x8 0x1 776#define MX6QDL_PAD_GPIO_8__UART2_TX_DATA 0x23c 0x60c 0x000 0x4 0x0
777#define MX6DL_PAD_GPIO_9__ESAI_RX_FS 0x240 0x610 0x82c 0x0 0x1 777#define MX6QDL_PAD_GPIO_8__GPIO1_IO08 0x23c 0x60c 0x000 0x5 0x0
778#define MX6DL_PAD_GPIO_9__WDOG1_B 0x240 0x610 0x000 0x1 0x0 778#define MX6QDL_PAD_GPIO_8__SPDIF_SR_CLK 0x23c 0x60c 0x000 0x6 0x0
779#define MX6DL_PAD_GPIO_9__KEY_COL6 0x240 0x610 0x8c4 0x2 0x1 779#define MX6QDL_PAD_GPIO_8__USB_OTG_PWR_CTL_WAKE 0x23c 0x60c 0x000 0x7 0x0
780#define MX6DL_PAD_GPIO_9__CCM_REF_EN_B 0x240 0x610 0x000 0x3 0x0 780#define MX6QDL_PAD_GPIO_8__I2C4_SDA 0x23c 0x60c 0x884 0x8 0x1
781#define MX6DL_PAD_GPIO_9__PWM1_OUT 0x240 0x610 0x000 0x4 0x0 781#define MX6QDL_PAD_GPIO_9__ESAI_RX_FS 0x240 0x610 0x82c 0x0 0x1
782#define MX6DL_PAD_GPIO_9__GPIO1_IO09 0x240 0x610 0x000 0x5 0x0 782#define MX6QDL_PAD_GPIO_9__WDOG1_B 0x240 0x610 0x000 0x1 0x0
783#define MX6DL_PAD_GPIO_9__SD1_WP 0x240 0x610 0x92c 0x6 0x1 783#define MX6QDL_PAD_GPIO_9__KEY_COL6 0x240 0x610 0x8c4 0x2 0x1
784#define MX6DL_PAD_KEY_COL0__ECSPI1_SCLK 0x244 0x62c 0x7d8 0x0 0x3 784#define MX6QDL_PAD_GPIO_9__CCM_REF_EN_B 0x240 0x610 0x000 0x3 0x0
785#define MX6DL_PAD_KEY_COL0__ENET_RX_DATA3 0x244 0x62c 0x824 0x1 0x0 785#define MX6QDL_PAD_GPIO_9__PWM1_OUT 0x240 0x610 0x000 0x4 0x0
786#define MX6DL_PAD_KEY_COL0__AUD5_TXC 0x244 0x62c 0x7c0 0x2 0x1 786#define MX6QDL_PAD_GPIO_9__GPIO1_IO09 0x240 0x610 0x000 0x5 0x0
787#define MX6DL_PAD_KEY_COL0__KEY_COL0 0x244 0x62c 0x000 0x3 0x0 787#define MX6QDL_PAD_GPIO_9__SD1_WP 0x240 0x610 0x92c 0x6 0x1
788#define MX6DL_PAD_KEY_COL0__UART4_TX_DATA 0x244 0x62c 0x000 0x4 0x0 788#define MX6QDL_PAD_KEY_COL0__ECSPI1_SCLK 0x244 0x62c 0x7d8 0x0 0x3
789#define MX6DL_PAD_KEY_COL0__UART4_RX_DATA 0x244 0x62c 0x914 0x4 0x2 789#define MX6QDL_PAD_KEY_COL0__ENET_RX_DATA3 0x244 0x62c 0x824 0x1 0x0
790#define MX6DL_PAD_KEY_COL0__GPIO4_IO06 0x244 0x62c 0x000 0x5 0x0 790#define MX6QDL_PAD_KEY_COL0__AUD5_TXC 0x244 0x62c 0x7c0 0x2 0x1
791#define MX6DL_PAD_KEY_COL0__DCIC1_OUT 0x244 0x62c 0x000 0x6 0x0 791#define MX6QDL_PAD_KEY_COL0__KEY_COL0 0x244 0x62c 0x000 0x3 0x0
792#define MX6DL_PAD_KEY_COL1__ECSPI1_MISO 0x248 0x630 0x7dc 0x0 0x3 792#define MX6QDL_PAD_KEY_COL0__UART4_TX_DATA 0x244 0x62c 0x000 0x4 0x0
793#define MX6DL_PAD_KEY_COL1__ENET_MDIO 0x248 0x630 0x810 0x1 0x1 793#define MX6QDL_PAD_KEY_COL0__UART4_RX_DATA 0x244 0x62c 0x914 0x4 0x2
794#define MX6DL_PAD_KEY_COL1__AUD5_TXFS 0x248 0x630 0x7c4 0x2 0x1 794#define MX6QDL_PAD_KEY_COL0__GPIO4_IO06 0x244 0x62c 0x000 0x5 0x0
795#define MX6DL_PAD_KEY_COL1__KEY_COL1 0x248 0x630 0x000 0x3 0x0 795#define MX6QDL_PAD_KEY_COL0__DCIC1_OUT 0x244 0x62c 0x000 0x6 0x0
796#define MX6DL_PAD_KEY_COL1__UART5_TX_DATA 0x248 0x630 0x000 0x4 0x0 796#define MX6QDL_PAD_KEY_COL1__ECSPI1_MISO 0x248 0x630 0x7dc 0x0 0x3
797#define MX6DL_PAD_KEY_COL1__UART5_RX_DATA 0x248 0x630 0x91c 0x4 0x2 797#define MX6QDL_PAD_KEY_COL1__ENET_MDIO 0x248 0x630 0x810 0x1 0x1
798#define MX6DL_PAD_KEY_COL1__GPIO4_IO08 0x248 0x630 0x000 0x5 0x0 798#define MX6QDL_PAD_KEY_COL1__AUD5_TXFS 0x248 0x630 0x7c4 0x2 0x1
799#define MX6DL_PAD_KEY_COL1__SD1_VSELECT 0x248 0x630 0x000 0x6 0x0 799#define MX6QDL_PAD_KEY_COL1__KEY_COL1 0x248 0x630 0x000 0x3 0x0
800#define MX6DL_PAD_KEY_COL2__ECSPI1_SS1 0x24c 0x634 0x7e8 0x0 0x2 800#define MX6QDL_PAD_KEY_COL1__UART5_TX_DATA 0x248 0x630 0x000 0x4 0x0
801#define MX6DL_PAD_KEY_COL2__ENET_RX_DATA2 0x24c 0x634 0x820 0x1 0x0 801#define MX6QDL_PAD_KEY_COL1__UART5_RX_DATA 0x248 0x630 0x91c 0x4 0x2
802#define MX6DL_PAD_KEY_COL2__FLEXCAN1_TX 0x24c 0x634 0x000 0x2 0x0 802#define MX6QDL_PAD_KEY_COL1__GPIO4_IO08 0x248 0x630 0x000 0x5 0x0
803#define MX6DL_PAD_KEY_COL2__KEY_COL2 0x24c 0x634 0x000 0x3 0x0 803#define MX6QDL_PAD_KEY_COL1__SD1_VSELECT 0x248 0x630 0x000 0x6 0x0
804#define MX6DL_PAD_KEY_COL2__ENET_MDC 0x24c 0x634 0x000 0x4 0x0 804#define MX6QDL_PAD_KEY_COL2__ECSPI1_SS1 0x24c 0x634 0x7e8 0x0 0x2
805#define MX6DL_PAD_KEY_COL2__GPIO4_IO10 0x24c 0x634 0x000 0x5 0x0 805#define MX6QDL_PAD_KEY_COL2__ENET_RX_DATA2 0x24c 0x634 0x820 0x1 0x0
806#define MX6DL_PAD_KEY_COL2__USB_H1_PWR_CTL_WAKE 0x24c 0x634 0x000 0x6 0x0 806#define MX6QDL_PAD_KEY_COL2__FLEXCAN1_TX 0x24c 0x634 0x000 0x2 0x0
807#define MX6DL_PAD_KEY_COL3__ECSPI1_SS3 0x250 0x638 0x7f0 0x0 0x1 807#define MX6QDL_PAD_KEY_COL2__KEY_COL2 0x24c 0x634 0x000 0x3 0x0
808#define MX6DL_PAD_KEY_COL3__ENET_CRS 0x250 0x638 0x000 0x1 0x0 808#define MX6QDL_PAD_KEY_COL2__ENET_MDC 0x24c 0x634 0x000 0x4 0x0
809#define MX6DL_PAD_KEY_COL3__HDMI_TX_DDC_SCL 0x250 0x638 0x860 0x2 0x1 809#define MX6QDL_PAD_KEY_COL2__GPIO4_IO10 0x24c 0x634 0x000 0x5 0x0
810#define MX6DL_PAD_KEY_COL3__KEY_COL3 0x250 0x638 0x000 0x3 0x0 810#define MX6QDL_PAD_KEY_COL2__USB_H1_PWR_CTL_WAKE 0x24c 0x634 0x000 0x6 0x0
811#define MX6DL_PAD_KEY_COL3__I2C2_SCL 0x250 0x638 0x870 0x4 0x1 811#define MX6QDL_PAD_KEY_COL3__ECSPI1_SS3 0x250 0x638 0x7f0 0x0 0x1
812#define MX6DL_PAD_KEY_COL3__GPIO4_IO12 0x250 0x638 0x000 0x5 0x0 812#define MX6QDL_PAD_KEY_COL3__ENET_CRS 0x250 0x638 0x000 0x1 0x0
813#define MX6DL_PAD_KEY_COL3__SPDIF_IN 0x250 0x638 0x8f0 0x6 0x3 813#define MX6QDL_PAD_KEY_COL3__HDMI_TX_DDC_SCL 0x250 0x638 0x860 0x2 0x1
814#define MX6DL_PAD_KEY_COL4__FLEXCAN2_TX 0x254 0x63c 0x000 0x0 0x0 814#define MX6QDL_PAD_KEY_COL3__KEY_COL3 0x250 0x638 0x000 0x3 0x0
815#define MX6DL_PAD_KEY_COL4__IPU1_SISG4 0x254 0x63c 0x000 0x1 0x0 815#define MX6QDL_PAD_KEY_COL3__I2C2_SCL 0x250 0x638 0x870 0x4 0x1
816#define MX6DL_PAD_KEY_COL4__USB_OTG_OC 0x254 0x63c 0x920 0x2 0x1 816#define MX6QDL_PAD_KEY_COL3__GPIO4_IO12 0x250 0x638 0x000 0x5 0x0
817#define MX6DL_PAD_KEY_COL4__KEY_COL4 0x254 0x63c 0x000 0x3 0x0 817#define MX6QDL_PAD_KEY_COL3__SPDIF_IN 0x250 0x638 0x8f0 0x6 0x3
818#define MX6DL_PAD_KEY_COL4__UART5_RTS_B 0x254 0x63c 0x918 0x4 0x2 818#define MX6QDL_PAD_KEY_COL4__FLEXCAN2_TX 0x254 0x63c 0x000 0x0 0x0
819#define MX6DL_PAD_KEY_COL4__UART5_CTS_B 0x254 0x63c 0x000 0x4 0x0 819#define MX6QDL_PAD_KEY_COL4__IPU1_SISG4 0x254 0x63c 0x000 0x1 0x0
820#define MX6DL_PAD_KEY_COL4__GPIO4_IO14 0x254 0x63c 0x000 0x5 0x0 820#define MX6QDL_PAD_KEY_COL4__USB_OTG_OC 0x254 0x63c 0x920 0x2 0x1
821#define MX6DL_PAD_KEY_ROW0__ECSPI1_MOSI 0x258 0x640 0x7e0 0x0 0x3 821#define MX6QDL_PAD_KEY_COL4__KEY_COL4 0x254 0x63c 0x000 0x3 0x0
822#define MX6DL_PAD_KEY_ROW0__ENET_TX_DATA3 0x258 0x640 0x000 0x1 0x0 822#define MX6QDL_PAD_KEY_COL4__UART5_RTS_B 0x254 0x63c 0x918 0x4 0x2
823#define MX6DL_PAD_KEY_ROW0__AUD5_TXD 0x258 0x640 0x7b4 0x2 0x1 823#define MX6QDL_PAD_KEY_COL4__UART5_CTS_B 0x254 0x63c 0x000 0x4 0x0
824#define MX6DL_PAD_KEY_ROW0__KEY_ROW0 0x258 0x640 0x000 0x3 0x0 824#define MX6QDL_PAD_KEY_COL4__GPIO4_IO14 0x254 0x63c 0x000 0x5 0x0
825#define MX6DL_PAD_KEY_ROW0__UART4_RX_DATA 0x258 0x640 0x914 0x4 0x3 825#define MX6QDL_PAD_KEY_ROW0__ECSPI1_MOSI 0x258 0x640 0x7e0 0x0 0x3
826#define MX6DL_PAD_KEY_ROW0__UART4_TX_DATA 0x258 0x640 0x000 0x4 0x0 826#define MX6QDL_PAD_KEY_ROW0__ENET_TX_DATA3 0x258 0x640 0x000 0x1 0x0
827#define MX6DL_PAD_KEY_ROW0__GPIO4_IO07 0x258 0x640 0x000 0x5 0x0 827#define MX6QDL_PAD_KEY_ROW0__AUD5_TXD 0x258 0x640 0x7b4 0x2 0x1
828#define MX6DL_PAD_KEY_ROW0__DCIC2_OUT 0x258 0x640 0x000 0x6 0x0 828#define MX6QDL_PAD_KEY_ROW0__KEY_ROW0 0x258 0x640 0x000 0x3 0x0
829#define MX6DL_PAD_KEY_ROW1__ECSPI1_SS0 0x25c 0x644 0x7e4 0x0 0x3 829#define MX6QDL_PAD_KEY_ROW0__UART4_RX_DATA 0x258 0x640 0x914 0x4 0x3
830#define MX6DL_PAD_KEY_ROW1__ENET_COL 0x25c 0x644 0x000 0x1 0x0 830#define MX6QDL_PAD_KEY_ROW0__UART4_TX_DATA 0x258 0x640 0x000 0x4 0x0
831#define MX6DL_PAD_KEY_ROW1__AUD5_RXD 0x25c 0x644 0x7b0 0x2 0x1 831#define MX6QDL_PAD_KEY_ROW0__GPIO4_IO07 0x258 0x640 0x000 0x5 0x0
832#define MX6DL_PAD_KEY_ROW1__KEY_ROW1 0x25c 0x644 0x000 0x3 0x0 832#define MX6QDL_PAD_KEY_ROW0__DCIC2_OUT 0x258 0x640 0x000 0x6 0x0
833#define MX6DL_PAD_KEY_ROW1__UART5_RX_DATA 0x25c 0x644 0x91c 0x4 0x3 833#define MX6QDL_PAD_KEY_ROW1__ECSPI1_SS0 0x25c 0x644 0x7e4 0x0 0x3
834#define MX6DL_PAD_KEY_ROW1__UART5_TX_DATA 0x25c 0x644 0x000 0x4 0x0 834#define MX6QDL_PAD_KEY_ROW1__ENET_COL 0x25c 0x644 0x000 0x1 0x0
835#define MX6DL_PAD_KEY_ROW1__GPIO4_IO09 0x25c 0x644 0x000 0x5 0x0 835#define MX6QDL_PAD_KEY_ROW1__AUD5_RXD 0x25c 0x644 0x7b0 0x2 0x1
836#define MX6DL_PAD_KEY_ROW1__SD2_VSELECT 0x25c 0x644 0x000 0x6 0x0 836#define MX6QDL_PAD_KEY_ROW1__KEY_ROW1 0x25c 0x644 0x000 0x3 0x0
837#define MX6DL_PAD_KEY_ROW2__ECSPI1_SS2 0x260 0x648 0x7ec 0x0 0x1 837#define MX6QDL_PAD_KEY_ROW1__UART5_RX_DATA 0x25c 0x644 0x91c 0x4 0x3
838#define MX6DL_PAD_KEY_ROW2__ENET_TX_DATA2 0x260 0x648 0x000 0x1 0x0 838#define MX6QDL_PAD_KEY_ROW1__UART5_TX_DATA 0x25c 0x644 0x000 0x4 0x0
839#define MX6DL_PAD_KEY_ROW2__FLEXCAN1_RX 0x260 0x648 0x7c8 0x2 0x1 839#define MX6QDL_PAD_KEY_ROW1__GPIO4_IO09 0x25c 0x644 0x000 0x5 0x0
840#define MX6DL_PAD_KEY_ROW2__KEY_ROW2 0x260 0x648 0x000 0x3 0x0 840#define MX6QDL_PAD_KEY_ROW1__SD2_VSELECT 0x25c 0x644 0x000 0x6 0x0
841#define MX6DL_PAD_KEY_ROW2__SD2_VSELECT 0x260 0x648 0x000 0x4 0x0 841#define MX6QDL_PAD_KEY_ROW2__ECSPI1_SS2 0x260 0x648 0x7ec 0x0 0x1
842#define MX6DL_PAD_KEY_ROW2__GPIO4_IO11 0x260 0x648 0x000 0x5 0x0 842#define MX6QDL_PAD_KEY_ROW2__ENET_TX_DATA2 0x260 0x648 0x000 0x1 0x0
843#define MX6DL_PAD_KEY_ROW2__HDMI_TX_CEC_LINE 0x260 0x648 0x85c 0x6 0x1 843#define MX6QDL_PAD_KEY_ROW2__FLEXCAN1_RX 0x260 0x648 0x7c8 0x2 0x1
844#define MX6DL_PAD_KEY_ROW3__ASRC_EXT_CLK 0x264 0x64c 0x794 0x1 0x2 844#define MX6QDL_PAD_KEY_ROW2__KEY_ROW2 0x260 0x648 0x000 0x3 0x0
845#define MX6DL_PAD_KEY_ROW3__HDMI_TX_DDC_SDA 0x264 0x64c 0x864 0x2 0x1 845#define MX6QDL_PAD_KEY_ROW2__SD2_VSELECT 0x260 0x648 0x000 0x4 0x0
846#define MX6DL_PAD_KEY_ROW3__KEY_ROW3 0x264 0x64c 0x000 0x3 0x0 846#define MX6QDL_PAD_KEY_ROW2__GPIO4_IO11 0x260 0x648 0x000 0x5 0x0
847#define MX6DL_PAD_KEY_ROW3__I2C2_SDA 0x264 0x64c 0x874 0x4 0x1 847#define MX6QDL_PAD_KEY_ROW2__HDMI_TX_CEC_LINE 0x260 0x648 0x85c 0x6 0x1
848#define MX6DL_PAD_KEY_ROW3__GPIO4_IO13 0x264 0x64c 0x000 0x5 0x0 848#define MX6QDL_PAD_KEY_ROW3__ASRC_EXT_CLK 0x264 0x64c 0x794 0x1 0x2
849#define MX6DL_PAD_KEY_ROW3__SD1_VSELECT 0x264 0x64c 0x000 0x6 0x0 849#define MX6QDL_PAD_KEY_ROW3__HDMI_TX_DDC_SDA 0x264 0x64c 0x864 0x2 0x1
850#define MX6DL_PAD_KEY_ROW4__FLEXCAN2_RX 0x268 0x650 0x7cc 0x0 0x0 850#define MX6QDL_PAD_KEY_ROW3__KEY_ROW3 0x264 0x64c 0x000 0x3 0x0
851#define MX6DL_PAD_KEY_ROW4__IPU1_SISG5 0x268 0x650 0x000 0x1 0x0 851#define MX6QDL_PAD_KEY_ROW3__I2C2_SDA 0x264 0x64c 0x874 0x4 0x1
852#define MX6DL_PAD_KEY_ROW4__USB_OTG_PWR 0x268 0x650 0x000 0x2 0x0 852#define MX6QDL_PAD_KEY_ROW3__GPIO4_IO13 0x264 0x64c 0x000 0x5 0x0
853#define MX6DL_PAD_KEY_ROW4__KEY_ROW4 0x268 0x650 0x000 0x3 0x0 853#define MX6QDL_PAD_KEY_ROW3__SD1_VSELECT 0x264 0x64c 0x000 0x6 0x0
854#define MX6DL_PAD_KEY_ROW4__UART5_CTS_B 0x268 0x650 0x000 0x4 0x0 854#define MX6QDL_PAD_KEY_ROW4__FLEXCAN2_RX 0x268 0x650 0x7cc 0x0 0x0
855#define MX6DL_PAD_KEY_ROW4__UART5_RTS_B 0x268 0x650 0x918 0x4 0x3 855#define MX6QDL_PAD_KEY_ROW4__IPU1_SISG5 0x268 0x650 0x000 0x1 0x0
856#define MX6DL_PAD_KEY_ROW4__GPIO4_IO15 0x268 0x650 0x000 0x5 0x0 856#define MX6QDL_PAD_KEY_ROW4__USB_OTG_PWR 0x268 0x650 0x000 0x2 0x0
857#define MX6DL_PAD_NANDF_ALE__NAND_ALE 0x26c 0x654 0x000 0x0 0x0 857#define MX6QDL_PAD_KEY_ROW4__KEY_ROW4 0x268 0x650 0x000 0x3 0x0
858#define MX6DL_PAD_NANDF_ALE__SD4_RESET 0x26c 0x654 0x000 0x1 0x0 858#define MX6QDL_PAD_KEY_ROW4__UART5_CTS_B 0x268 0x650 0x000 0x4 0x0
859#define MX6DL_PAD_NANDF_ALE__GPIO6_IO08 0x26c 0x654 0x000 0x5 0x0 859#define MX6QDL_PAD_KEY_ROW4__UART5_RTS_B 0x268 0x650 0x918 0x4 0x3
860#define MX6DL_PAD_NANDF_CLE__NAND_CLE 0x270 0x658 0x000 0x0 0x0 860#define MX6QDL_PAD_KEY_ROW4__GPIO4_IO15 0x268 0x650 0x000 0x5 0x0
861#define MX6DL_PAD_NANDF_CLE__GPIO6_IO07 0x270 0x658 0x000 0x5 0x0 861#define MX6QDL_PAD_NANDF_ALE__NAND_ALE 0x26c 0x654 0x000 0x0 0x0
862#define MX6DL_PAD_NANDF_CS0__NAND_CE0_B 0x274 0x65c 0x000 0x0 0x0 862#define MX6QDL_PAD_NANDF_ALE__SD4_RESET 0x26c 0x654 0x000 0x1 0x0
863#define MX6DL_PAD_NANDF_CS0__GPIO6_IO11 0x274 0x65c 0x000 0x5 0x0 863#define MX6QDL_PAD_NANDF_ALE__GPIO6_IO08 0x26c 0x654 0x000 0x5 0x0
864#define MX6DL_PAD_NANDF_CS1__NAND_CE1_B 0x278 0x660 0x000 0x0 0x0 864#define MX6QDL_PAD_NANDF_CLE__NAND_CLE 0x270 0x658 0x000 0x0 0x0
865#define MX6DL_PAD_NANDF_CS1__SD4_VSELECT 0x278 0x660 0x000 0x1 0x0 865#define MX6QDL_PAD_NANDF_CLE__GPIO6_IO07 0x270 0x658 0x000 0x5 0x0
866#define MX6DL_PAD_NANDF_CS1__SD3_VSELECT 0x278 0x660 0x000 0x2 0x0 866#define MX6QDL_PAD_NANDF_CS0__NAND_CE0_B 0x274 0x65c 0x000 0x0 0x0
867#define MX6DL_PAD_NANDF_CS1__GPIO6_IO14 0x278 0x660 0x000 0x5 0x0 867#define MX6QDL_PAD_NANDF_CS0__GPIO6_IO11 0x274 0x65c 0x000 0x5 0x0
868#define MX6DL_PAD_NANDF_CS2__NAND_CE2_B 0x27c 0x664 0x000 0x0 0x0 868#define MX6QDL_PAD_NANDF_CS1__NAND_CE1_B 0x278 0x660 0x000 0x0 0x0
869#define MX6DL_PAD_NANDF_CS2__IPU1_SISG0 0x27c 0x664 0x000 0x1 0x0 869#define MX6QDL_PAD_NANDF_CS1__SD4_VSELECT 0x278 0x660 0x000 0x1 0x0
870#define MX6DL_PAD_NANDF_CS2__ESAI_TX0 0x27c 0x664 0x844 0x2 0x1 870#define MX6QDL_PAD_NANDF_CS1__SD3_VSELECT 0x278 0x660 0x000 0x2 0x0
871#define MX6DL_PAD_NANDF_CS2__EIM_CRE 0x27c 0x664 0x000 0x3 0x0 871#define MX6QDL_PAD_NANDF_CS1__GPIO6_IO14 0x278 0x660 0x000 0x5 0x0
872#define MX6DL_PAD_NANDF_CS2__CCM_CLKO2 0x27c 0x664 0x000 0x4 0x0 872#define MX6QDL_PAD_NANDF_CS2__NAND_CE2_B 0x27c 0x664 0x000 0x0 0x0
873#define MX6DL_PAD_NANDF_CS2__GPIO6_IO15 0x27c 0x664 0x000 0x5 0x0 873#define MX6QDL_PAD_NANDF_CS2__IPU1_SISG0 0x27c 0x664 0x000 0x1 0x0
874#define MX6DL_PAD_NANDF_CS3__NAND_CE3_B 0x280 0x668 0x000 0x0 0x0 874#define MX6QDL_PAD_NANDF_CS2__ESAI_TX0 0x27c 0x664 0x844 0x2 0x1
875#define MX6DL_PAD_NANDF_CS3__IPU1_SISG1 0x280 0x668 0x000 0x1 0x0 875#define MX6QDL_PAD_NANDF_CS2__EIM_CRE 0x27c 0x664 0x000 0x3 0x0
876#define MX6DL_PAD_NANDF_CS3__ESAI_TX1 0x280 0x668 0x848 0x2 0x1 876#define MX6QDL_PAD_NANDF_CS2__CCM_CLKO2 0x27c 0x664 0x000 0x4 0x0
877#define MX6DL_PAD_NANDF_CS3__EIM_ADDR26 0x280 0x668 0x000 0x3 0x0 877#define MX6QDL_PAD_NANDF_CS2__GPIO6_IO15 0x27c 0x664 0x000 0x5 0x0
878#define MX6DL_PAD_NANDF_CS3__GPIO6_IO16 0x280 0x668 0x000 0x5 0x0 878#define MX6QDL_PAD_NANDF_CS3__NAND_CE3_B 0x280 0x668 0x000 0x0 0x0
879#define MX6DL_PAD_NANDF_CS3__I2C4_SDA 0x280 0x668 0x884 0x9 0x2 879#define MX6QDL_PAD_NANDF_CS3__IPU1_SISG1 0x280 0x668 0x000 0x1 0x0
880#define MX6DL_PAD_NANDF_D0__NAND_DATA00 0x284 0x66c 0x000 0x0 0x0 880#define MX6QDL_PAD_NANDF_CS3__ESAI_TX1 0x280 0x668 0x848 0x2 0x1
881#define MX6DL_PAD_NANDF_D0__SD1_DATA4 0x284 0x66c 0x000 0x1 0x0 881#define MX6QDL_PAD_NANDF_CS3__EIM_ADDR26 0x280 0x668 0x000 0x3 0x0
882#define MX6DL_PAD_NANDF_D0__GPIO2_IO00 0x284 0x66c 0x000 0x5 0x0 882#define MX6QDL_PAD_NANDF_CS3__GPIO6_IO16 0x280 0x668 0x000 0x5 0x0
883#define MX6DL_PAD_NANDF_D1__NAND_DATA01 0x288 0x670 0x000 0x0 0x0 883#define MX6QDL_PAD_NANDF_CS3__I2C4_SDA 0x280 0x668 0x884 0x9 0x2
884#define MX6DL_PAD_NANDF_D1__SD1_DATA5 0x288 0x670 0x000 0x1 0x0 884#define MX6QDL_PAD_NANDF_D0__NAND_DATA00 0x284 0x66c 0x000 0x0 0x0
885#define MX6DL_PAD_NANDF_D1__GPIO2_IO01 0x288 0x670 0x000 0x5 0x0 885#define MX6QDL_PAD_NANDF_D0__SD1_DATA4 0x284 0x66c 0x000 0x1 0x0
886#define MX6DL_PAD_NANDF_D2__NAND_DATA02 0x28c 0x674 0x000 0x0 0x0 886#define MX6QDL_PAD_NANDF_D0__GPIO2_IO00 0x284 0x66c 0x000 0x5 0x0
887#define MX6DL_PAD_NANDF_D2__SD1_DATA6 0x28c 0x674 0x000 0x1 0x0 887#define MX6QDL_PAD_NANDF_D1__NAND_DATA01 0x288 0x670 0x000 0x0 0x0
888#define MX6DL_PAD_NANDF_D2__GPIO2_IO02 0x28c 0x674 0x000 0x5 0x0 888#define MX6QDL_PAD_NANDF_D1__SD1_DATA5 0x288 0x670 0x000 0x1 0x0
889#define MX6DL_PAD_NANDF_D3__NAND_DATA03 0x290 0x678 0x000 0x0 0x0 889#define MX6QDL_PAD_NANDF_D1__GPIO2_IO01 0x288 0x670 0x000 0x5 0x0
890#define MX6DL_PAD_NANDF_D3__SD1_DATA7 0x290 0x678 0x000 0x1 0x0 890#define MX6QDL_PAD_NANDF_D2__NAND_DATA02 0x28c 0x674 0x000 0x0 0x0
891#define MX6DL_PAD_NANDF_D3__GPIO2_IO03 0x290 0x678 0x000 0x5 0x0 891#define MX6QDL_PAD_NANDF_D2__SD1_DATA6 0x28c 0x674 0x000 0x1 0x0
892#define MX6DL_PAD_NANDF_D4__NAND_DATA04 0x294 0x67c 0x000 0x0 0x0 892#define MX6QDL_PAD_NANDF_D2__GPIO2_IO02 0x28c 0x674 0x000 0x5 0x0
893#define MX6DL_PAD_NANDF_D4__SD2_DATA4 0x294 0x67c 0x000 0x1 0x0 893#define MX6QDL_PAD_NANDF_D3__NAND_DATA03 0x290 0x678 0x000 0x0 0x0
894#define MX6DL_PAD_NANDF_D4__GPIO2_IO04 0x294 0x67c 0x000 0x5 0x0 894#define MX6QDL_PAD_NANDF_D3__SD1_DATA7 0x290 0x678 0x000 0x1 0x0
895#define MX6DL_PAD_NANDF_D5__NAND_DATA05 0x298 0x680 0x000 0x0 0x0 895#define MX6QDL_PAD_NANDF_D3__GPIO2_IO03 0x290 0x678 0x000 0x5 0x0
896#define MX6DL_PAD_NANDF_D5__SD2_DATA5 0x298 0x680 0x000 0x1 0x0 896#define MX6QDL_PAD_NANDF_D4__NAND_DATA04 0x294 0x67c 0x000 0x0 0x0
897#define MX6DL_PAD_NANDF_D5__GPIO2_IO05 0x298 0x680 0x000 0x5 0x0 897#define MX6QDL_PAD_NANDF_D4__SD2_DATA4 0x294 0x67c 0x000 0x1 0x0
898#define MX6DL_PAD_NANDF_D6__NAND_DATA06 0x29c 0x684 0x000 0x0 0x0 898#define MX6QDL_PAD_NANDF_D4__GPIO2_IO04 0x294 0x67c 0x000 0x5 0x0
899#define MX6DL_PAD_NANDF_D6__SD2_DATA6 0x29c 0x684 0x000 0x1 0x0 899#define MX6QDL_PAD_NANDF_D5__NAND_DATA05 0x298 0x680 0x000 0x0 0x0
900#define MX6DL_PAD_NANDF_D6__GPIO2_IO06 0x29c 0x684 0x000 0x5 0x0 900#define MX6QDL_PAD_NANDF_D5__SD2_DATA5 0x298 0x680 0x000 0x1 0x0
901#define MX6DL_PAD_NANDF_D7__NAND_DATA07 0x2a0 0x688 0x000 0x0 0x0 901#define MX6QDL_PAD_NANDF_D5__GPIO2_IO05 0x298 0x680 0x000 0x5 0x0
902#define MX6DL_PAD_NANDF_D7__SD2_DATA7 0x2a0 0x688 0x000 0x1 0x0 902#define MX6QDL_PAD_NANDF_D6__NAND_DATA06 0x29c 0x684 0x000 0x0 0x0
903#define MX6DL_PAD_NANDF_D7__GPIO2_IO07 0x2a0 0x688 0x000 0x5 0x0 903#define MX6QDL_PAD_NANDF_D6__SD2_DATA6 0x29c 0x684 0x000 0x1 0x0
904#define MX6DL_PAD_NANDF_RB0__NAND_READY_B 0x2a4 0x68c 0x000 0x0 0x0 904#define MX6QDL_PAD_NANDF_D6__GPIO2_IO06 0x29c 0x684 0x000 0x5 0x0
905#define MX6DL_PAD_NANDF_RB0__GPIO6_IO10 0x2a4 0x68c 0x000 0x5 0x0 905#define MX6QDL_PAD_NANDF_D7__NAND_DATA07 0x2a0 0x688 0x000 0x0 0x0
906#define MX6DL_PAD_NANDF_WP_B__NAND_WP_B 0x2a8 0x690 0x000 0x0 0x0 906#define MX6QDL_PAD_NANDF_D7__SD2_DATA7 0x2a0 0x688 0x000 0x1 0x0
907#define MX6DL_PAD_NANDF_WP_B__GPIO6_IO09 0x2a8 0x690 0x000 0x5 0x0 907#define MX6QDL_PAD_NANDF_D7__GPIO2_IO07 0x2a0 0x688 0x000 0x5 0x0
908#define MX6DL_PAD_NANDF_WP_B__I2C4_SCL 0x2a8 0x690 0x880 0x9 0x2 908#define MX6QDL_PAD_NANDF_RB0__NAND_READY_B 0x2a4 0x68c 0x000 0x0 0x0
909#define MX6DL_PAD_RGMII_RD0__HSI_RX_READY 0x2ac 0x694 0x000 0x0 0x0 909#define MX6QDL_PAD_NANDF_RB0__GPIO6_IO10 0x2a4 0x68c 0x000 0x5 0x0
910#define MX6DL_PAD_RGMII_RD0__RGMII_RD0 0x2ac 0x694 0x818 0x1 0x1 910#define MX6QDL_PAD_NANDF_WP_B__NAND_WP_B 0x2a8 0x690 0x000 0x0 0x0
911#define MX6DL_PAD_RGMII_RD0__GPIO6_IO25 0x2ac 0x694 0x000 0x5 0x0 911#define MX6QDL_PAD_NANDF_WP_B__GPIO6_IO09 0x2a8 0x690 0x000 0x5 0x0
912#define MX6DL_PAD_RGMII_RD1__HSI_TX_FLAG 0x2b0 0x698 0x000 0x0 0x0 912#define MX6QDL_PAD_NANDF_WP_B__I2C4_SCL 0x2a8 0x690 0x880 0x9 0x2
913#define MX6DL_PAD_RGMII_RD1__RGMII_RD1 0x2b0 0x698 0x81c 0x1 0x1 913#define MX6QDL_PAD_RGMII_RD0__HSI_RX_READY 0x2ac 0x694 0x000 0x0 0x0
914#define MX6DL_PAD_RGMII_RD1__GPIO6_IO27 0x2b0 0x698 0x000 0x5 0x0 914#define MX6QDL_PAD_RGMII_RD0__RGMII_RD0 0x2ac 0x694 0x818 0x1 0x1
915#define MX6DL_PAD_RGMII_RD2__HSI_TX_DATA 0x2b4 0x69c 0x000 0x0 0x0 915#define MX6QDL_PAD_RGMII_RD0__GPIO6_IO25 0x2ac 0x694 0x000 0x5 0x0
916#define MX6DL_PAD_RGMII_RD2__RGMII_RD2 0x2b4 0x69c 0x820 0x1 0x1 916#define MX6QDL_PAD_RGMII_RD1__HSI_TX_FLAG 0x2b0 0x698 0x000 0x0 0x0
917#define MX6DL_PAD_RGMII_RD2__GPIO6_IO28 0x2b4 0x69c 0x000 0x5 0x0 917#define MX6QDL_PAD_RGMII_RD1__RGMII_RD1 0x2b0 0x698 0x81c 0x1 0x1
918#define MX6DL_PAD_RGMII_RD3__HSI_TX_WAKE 0x2b8 0x6a0 0x000 0x0 0x0 918#define MX6QDL_PAD_RGMII_RD1__GPIO6_IO27 0x2b0 0x698 0x000 0x5 0x0
919#define MX6DL_PAD_RGMII_RD3__RGMII_RD3 0x2b8 0x6a0 0x824 0x1 0x1 919#define MX6QDL_PAD_RGMII_RD2__HSI_TX_DATA 0x2b4 0x69c 0x000 0x0 0x0
920#define MX6DL_PAD_RGMII_RD3__GPIO6_IO29 0x2b8 0x6a0 0x000 0x5 0x0 920#define MX6QDL_PAD_RGMII_RD2__RGMII_RD2 0x2b4 0x69c 0x820 0x1 0x1
921#define MX6DL_PAD_RGMII_RX_CTL__USB_H3_DATA 0x2bc 0x6a4 0x000 0x0 0x0 921#define MX6QDL_PAD_RGMII_RD2__GPIO6_IO28 0x2b4 0x69c 0x000 0x5 0x0
922#define MX6DL_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x2bc 0x6a4 0x828 0x1 0x1 922#define MX6QDL_PAD_RGMII_RD3__HSI_TX_WAKE 0x2b8 0x6a0 0x000 0x0 0x0
923#define MX6DL_PAD_RGMII_RX_CTL__GPIO6_IO24 0x2bc 0x6a4 0x000 0x5 0x0 923#define MX6QDL_PAD_RGMII_RD3__RGMII_RD3 0x2b8 0x6a0 0x824 0x1 0x1
924#define MX6DL_PAD_RGMII_RXC__USB_H3_STROBE 0x2c0 0x6a8 0x000 0x0 0x0 924#define MX6QDL_PAD_RGMII_RD3__GPIO6_IO29 0x2b8 0x6a0 0x000 0x5 0x0
925#define MX6DL_PAD_RGMII_RXC__RGMII_RXC 0x2c0 0x6a8 0x814 0x1 0x1 925#define MX6QDL_PAD_RGMII_RX_CTL__USB_H3_DATA 0x2bc 0x6a4 0x000 0x0 0x0
926#define MX6DL_PAD_RGMII_RXC__GPIO6_IO30 0x2c0 0x6a8 0x000 0x5 0x0 926#define MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x2bc 0x6a4 0x828 0x1 0x1
927#define MX6DL_PAD_RGMII_TD0__HSI_TX_READY 0x2c4 0x6ac 0x000 0x0 0x0 927#define MX6QDL_PAD_RGMII_RX_CTL__GPIO6_IO24 0x2bc 0x6a4 0x000 0x5 0x0
928#define MX6DL_PAD_RGMII_TD0__RGMII_TD0 0x2c4 0x6ac 0x000 0x1 0x0 928#define MX6QDL_PAD_RGMII_RXC__USB_H3_STROBE 0x2c0 0x6a8 0x000 0x0 0x0
929#define MX6DL_PAD_RGMII_TD0__GPIO6_IO20 0x2c4 0x6ac 0x000 0x5 0x0 929#define MX6QDL_PAD_RGMII_RXC__RGMII_RXC 0x2c0 0x6a8 0x814 0x1 0x1
930#define MX6DL_PAD_RGMII_TD1__HSI_RX_FLAG 0x2c8 0x6b0 0x000 0x0 0x0 930#define MX6QDL_PAD_RGMII_RXC__GPIO6_IO30 0x2c0 0x6a8 0x000 0x5 0x0
931#define MX6DL_PAD_RGMII_TD1__RGMII_TD1 0x2c8 0x6b0 0x000 0x1 0x0 931#define MX6QDL_PAD_RGMII_TD0__HSI_TX_READY 0x2c4 0x6ac 0x000 0x0 0x0
932#define MX6DL_PAD_RGMII_TD1__GPIO6_IO21 0x2c8 0x6b0 0x000 0x5 0x0 932#define MX6QDL_PAD_RGMII_TD0__RGMII_TD0 0x2c4 0x6ac 0x000 0x1 0x0
933#define MX6DL_PAD_RGMII_TD2__HSI_RX_DATA 0x2cc 0x6b4 0x000 0x0 0x0 933#define MX6QDL_PAD_RGMII_TD0__GPIO6_IO20 0x2c4 0x6ac 0x000 0x5 0x0
934#define MX6DL_PAD_RGMII_TD2__RGMII_TD2 0x2cc 0x6b4 0x000 0x1 0x0 934#define MX6QDL_PAD_RGMII_TD1__HSI_RX_FLAG 0x2c8 0x6b0 0x000 0x0 0x0
935#define MX6DL_PAD_RGMII_TD2__GPIO6_IO22 0x2cc 0x6b4 0x000 0x5 0x0 935#define MX6QDL_PAD_RGMII_TD1__RGMII_TD1 0x2c8 0x6b0 0x000 0x1 0x0
936#define MX6DL_PAD_RGMII_TD3__HSI_RX_WAKE 0x2d0 0x6b8 0x000 0x0 0x0 936#define MX6QDL_PAD_RGMII_TD1__GPIO6_IO21 0x2c8 0x6b0 0x000 0x5 0x0
937#define MX6DL_PAD_RGMII_TD3__RGMII_TD3 0x2d0 0x6b8 0x000 0x1 0x0 937#define MX6QDL_PAD_RGMII_TD2__HSI_RX_DATA 0x2cc 0x6b4 0x000 0x0 0x0
938#define MX6DL_PAD_RGMII_TD3__GPIO6_IO23 0x2d0 0x6b8 0x000 0x5 0x0 938#define MX6QDL_PAD_RGMII_TD2__RGMII_TD2 0x2cc 0x6b4 0x000 0x1 0x0
939#define MX6DL_PAD_RGMII_TX_CTL__USB_H2_STROBE 0x2d4 0x6bc 0x000 0x0 0x0 939#define MX6QDL_PAD_RGMII_TD2__GPIO6_IO22 0x2cc 0x6b4 0x000 0x5 0x0
940#define MX6DL_PAD_RGMII_TX_CTL__RGMII_TX_CTL 0x2d4 0x6bc 0x000 0x1 0x0 940#define MX6QDL_PAD_RGMII_TD3__HSI_RX_WAKE 0x2d0 0x6b8 0x000 0x0 0x0
941#define MX6DL_PAD_RGMII_TX_CTL__GPIO6_IO26 0x2d4 0x6bc 0x000 0x5 0x0 941#define MX6QDL_PAD_RGMII_TD3__RGMII_TD3 0x2d0 0x6b8 0x000 0x1 0x0
942#define MX6DL_PAD_RGMII_TX_CTL__ENET_REF_CLK 0x2d4 0x6bc 0x80c 0x7 0x1 942#define MX6QDL_PAD_RGMII_TD3__GPIO6_IO23 0x2d0 0x6b8 0x000 0x5 0x0
943#define MX6DL_PAD_RGMII_TXC__USB_H2_DATA 0x2d8 0x6c0 0x000 0x0 0x0 943#define MX6QDL_PAD_RGMII_TX_CTL__USB_H2_STROBE 0x2d4 0x6bc 0x000 0x0 0x0
944#define MX6DL_PAD_RGMII_TXC__RGMII_TXC 0x2d8 0x6c0 0x000 0x1 0x0 944#define MX6QDL_PAD_RGMII_TX_CTL__RGMII_TX_CTL 0x2d4 0x6bc 0x000 0x1 0x0
945#define MX6DL_PAD_RGMII_TXC__SPDIF_EXT_CLK 0x2d8 0x6c0 0x8f4 0x2 0x1 945#define MX6QDL_PAD_RGMII_TX_CTL__GPIO6_IO26 0x2d4 0x6bc 0x000 0x5 0x0
946#define MX6DL_PAD_RGMII_TXC__GPIO6_IO19 0x2d8 0x6c0 0x000 0x5 0x0 946#define MX6QDL_PAD_RGMII_TX_CTL__ENET_REF_CLK 0x2d4 0x6bc 0x80c 0x7 0x1
947#define MX6DL_PAD_RGMII_TXC__XTALOSC_REF_CLK_24M 0x2d8 0x6c0 0x000 0x7 0x0 947#define MX6QDL_PAD_RGMII_TXC__USB_H2_DATA 0x2d8 0x6c0 0x000 0x0 0x0
948#define MX6DL_PAD_SD1_CLK__SD1_CLK 0x2dc 0x6c4 0x928 0x0 0x1 948#define MX6QDL_PAD_RGMII_TXC__RGMII_TXC 0x2d8 0x6c0 0x000 0x1 0x0
949#define MX6DL_PAD_SD1_CLK__GPT_CLKIN 0x2dc 0x6c4 0x000 0x3 0x0 949#define MX6QDL_PAD_RGMII_TXC__SPDIF_EXT_CLK 0x2d8 0x6c0 0x8f4 0x2 0x1
950#define MX6DL_PAD_SD1_CLK__GPIO1_IO20 0x2dc 0x6c4 0x000 0x5 0x0 950#define MX6QDL_PAD_RGMII_TXC__GPIO6_IO19 0x2d8 0x6c0 0x000 0x5 0x0
951#define MX6DL_PAD_SD1_CMD__SD1_CMD 0x2e0 0x6c8 0x000 0x0 0x0 951#define MX6QDL_PAD_RGMII_TXC__XTALOSC_REF_CLK_24M 0x2d8 0x6c0 0x000 0x7 0x0
952#define MX6DL_PAD_SD1_CMD__PWM4_OUT 0x2e0 0x6c8 0x000 0x2 0x0 952#define MX6QDL_PAD_SD1_CLK__SD1_CLK 0x2dc 0x6c4 0x928 0x0 0x1
953#define MX6DL_PAD_SD1_CMD__GPT_COMPARE1 0x2e0 0x6c8 0x000 0x3 0x0 953#define MX6QDL_PAD_SD1_CLK__GPT_CLKIN 0x2dc 0x6c4 0x000 0x3 0x0
954#define MX6DL_PAD_SD1_CMD__GPIO1_IO18 0x2e0 0x6c8 0x000 0x5 0x0 954#define MX6QDL_PAD_SD1_CLK__GPIO1_IO20 0x2dc 0x6c4 0x000 0x5 0x0
955#define MX6DL_PAD_SD1_DAT0__SD1_DATA0 0x2e4 0x6cc 0x000 0x0 0x0 955#define MX6QDL_PAD_SD1_CMD__SD1_CMD 0x2e0 0x6c8 0x000 0x0 0x0
956#define MX6DL_PAD_SD1_DAT0__GPT_CAPTURE1 0x2e4 0x6cc 0x000 0x3 0x0 956#define MX6QDL_PAD_SD1_CMD__PWM4_OUT 0x2e0 0x6c8 0x000 0x2 0x0
957#define MX6DL_PAD_SD1_DAT0__GPIO1_IO16 0x2e4 0x6cc 0x000 0x5 0x0 957#define MX6QDL_PAD_SD1_CMD__GPT_COMPARE1 0x2e0 0x6c8 0x000 0x3 0x0
958#define MX6DL_PAD_SD1_DAT1__SD1_DATA1 0x2e8 0x6d0 0x000 0x0 0x0 958#define MX6QDL_PAD_SD1_CMD__GPIO1_IO18 0x2e0 0x6c8 0x000 0x5 0x0
959#define MX6DL_PAD_SD1_DAT1__PWM3_OUT 0x2e8 0x6d0 0x000 0x2 0x0 959#define MX6QDL_PAD_SD1_DAT0__SD1_DATA0 0x2e4 0x6cc 0x000 0x0 0x0
960#define MX6DL_PAD_SD1_DAT1__GPT_CAPTURE2 0x2e8 0x6d0 0x000 0x3 0x0 960#define MX6QDL_PAD_SD1_DAT0__GPT_CAPTURE1 0x2e4 0x6cc 0x000 0x3 0x0
961#define MX6DL_PAD_SD1_DAT1__GPIO1_IO17 0x2e8 0x6d0 0x000 0x5 0x0 961#define MX6QDL_PAD_SD1_DAT0__GPIO1_IO16 0x2e4 0x6cc 0x000 0x5 0x0
962#define MX6DL_PAD_SD1_DAT2__SD1_DATA2 0x2ec 0x6d4 0x000 0x0 0x0 962#define MX6QDL_PAD_SD1_DAT1__SD1_DATA1 0x2e8 0x6d0 0x000 0x0 0x0
963#define MX6DL_PAD_SD1_DAT2__GPT_COMPARE2 0x2ec 0x6d4 0x000 0x2 0x0 963#define MX6QDL_PAD_SD1_DAT1__PWM3_OUT 0x2e8 0x6d0 0x000 0x2 0x0
964#define MX6DL_PAD_SD1_DAT2__PWM2_OUT 0x2ec 0x6d4 0x000 0x3 0x0 964#define MX6QDL_PAD_SD1_DAT1__GPT_CAPTURE2 0x2e8 0x6d0 0x000 0x3 0x0
965#define MX6DL_PAD_SD1_DAT2__WDOG1_B 0x2ec 0x6d4 0x000 0x4 0x0 965#define MX6QDL_PAD_SD1_DAT1__GPIO1_IO17 0x2e8 0x6d0 0x000 0x5 0x0
966#define MX6DL_PAD_SD1_DAT2__GPIO1_IO19 0x2ec 0x6d4 0x000 0x5 0x0 966#define MX6QDL_PAD_SD1_DAT2__SD1_DATA2 0x2ec 0x6d4 0x000 0x0 0x0
967#define MX6DL_PAD_SD1_DAT2__WDOG1_RESET_B_DEB 0x2ec 0x6d4 0x000 0x6 0x0 967#define MX6QDL_PAD_SD1_DAT2__GPT_COMPARE2 0x2ec 0x6d4 0x000 0x2 0x0
968#define MX6DL_PAD_SD1_DAT3__SD1_DATA3 0x2f0 0x6d8 0x000 0x0 0x0 968#define MX6QDL_PAD_SD1_DAT2__PWM2_OUT 0x2ec 0x6d4 0x000 0x3 0x0
969#define MX6DL_PAD_SD1_DAT3__GPT_COMPARE3 0x2f0 0x6d8 0x000 0x2 0x0 969#define MX6QDL_PAD_SD1_DAT2__WDOG1_B 0x2ec 0x6d4 0x000 0x4 0x0
970#define MX6DL_PAD_SD1_DAT3__PWM1_OUT 0x2f0 0x6d8 0x000 0x3 0x0 970#define MX6QDL_PAD_SD1_DAT2__GPIO1_IO19 0x2ec 0x6d4 0x000 0x5 0x0
971#define MX6DL_PAD_SD1_DAT3__WDOG2_B 0x2f0 0x6d8 0x000 0x4 0x0 971#define MX6QDL_PAD_SD1_DAT2__WDOG1_RESET_B_DEB 0x2ec 0x6d4 0x000 0x6 0x0
972#define MX6DL_PAD_SD1_DAT3__GPIO1_IO21 0x2f0 0x6d8 0x000 0x5 0x0 972#define MX6QDL_PAD_SD1_DAT3__SD1_DATA3 0x2f0 0x6d8 0x000 0x0 0x0
973#define MX6DL_PAD_SD1_DAT3__WDOG2_RESET_B_DEB 0x2f0 0x6d8 0x000 0x6 0x0 973#define MX6QDL_PAD_SD1_DAT3__GPT_COMPARE3 0x2f0 0x6d8 0x000 0x2 0x0
974#define MX6DL_PAD_SD2_CLK__SD2_CLK 0x2f4 0x6dc 0x930 0x0 0x1 974#define MX6QDL_PAD_SD1_DAT3__PWM1_OUT 0x2f0 0x6d8 0x000 0x3 0x0
975#define MX6DL_PAD_SD2_CLK__KEY_COL5 0x2f4 0x6dc 0x8c0 0x2 0x3 975#define MX6QDL_PAD_SD1_DAT3__WDOG2_B 0x2f0 0x6d8 0x000 0x4 0x0
976#define MX6DL_PAD_SD2_CLK__AUD4_RXFS 0x2f4 0x6dc 0x7a4 0x3 0x1 976#define MX6QDL_PAD_SD1_DAT3__GPIO1_IO21 0x2f0 0x6d8 0x000 0x5 0x0
977#define MX6DL_PAD_SD2_CLK__GPIO1_IO10 0x2f4 0x6dc 0x000 0x5 0x0 977#define MX6QDL_PAD_SD1_DAT3__WDOG2_RESET_B_DEB 0x2f0 0x6d8 0x000 0x6 0x0
978#define MX6DL_PAD_SD2_CMD__SD2_CMD 0x2f8 0x6e0 0x000 0x0 0x0 978#define MX6QDL_PAD_SD2_CLK__SD2_CLK 0x2f4 0x6dc 0x930 0x0 0x1
979#define MX6DL_PAD_SD2_CMD__KEY_ROW5 0x2f8 0x6e0 0x8cc 0x2 0x2 979#define MX6QDL_PAD_SD2_CLK__KEY_COL5 0x2f4 0x6dc 0x8c0 0x2 0x3
980#define MX6DL_PAD_SD2_CMD__AUD4_RXC 0x2f8 0x6e0 0x7a0 0x3 0x1 980#define MX6QDL_PAD_SD2_CLK__AUD4_RXFS 0x2f4 0x6dc 0x7a4 0x3 0x1
981#define MX6DL_PAD_SD2_CMD__GPIO1_IO11 0x2f8 0x6e0 0x000 0x5 0x0 981#define MX6QDL_PAD_SD2_CLK__GPIO1_IO10 0x2f4 0x6dc 0x000 0x5 0x0
982#define MX6DL_PAD_SD2_DAT0__SD2_DATA0 0x2fc 0x6e4 0x000 0x0 0x0 982#define MX6QDL_PAD_SD2_CMD__SD2_CMD 0x2f8 0x6e0 0x000 0x0 0x0
983#define MX6DL_PAD_SD2_DAT0__AUD4_RXD 0x2fc 0x6e4 0x798 0x3 0x1 983#define MX6QDL_PAD_SD2_CMD__KEY_ROW5 0x2f8 0x6e0 0x8cc 0x2 0x2
984#define MX6DL_PAD_SD2_DAT0__KEY_ROW7 0x2fc 0x6e4 0x8d4 0x4 0x2 984#define MX6QDL_PAD_SD2_CMD__AUD4_RXC 0x2f8 0x6e0 0x7a0 0x3 0x1
985#define MX6DL_PAD_SD2_DAT0__GPIO1_IO15 0x2fc 0x6e4 0x000 0x5 0x0 985#define MX6QDL_PAD_SD2_CMD__GPIO1_IO11 0x2f8 0x6e0 0x000 0x5 0x0
986#define MX6DL_PAD_SD2_DAT0__DCIC2_OUT 0x2fc 0x6e4 0x000 0x6 0x0 986#define MX6QDL_PAD_SD2_DAT0__SD2_DATA0 0x2fc 0x6e4 0x000 0x0 0x0
987#define MX6DL_PAD_SD2_DAT1__SD2_DATA1 0x300 0x6e8 0x000 0x0 0x0 987#define MX6QDL_PAD_SD2_DAT0__AUD4_RXD 0x2fc 0x6e4 0x798 0x3 0x1
988#define MX6DL_PAD_SD2_DAT1__EIM_CS2_B 0x300 0x6e8 0x000 0x2 0x0 988#define MX6QDL_PAD_SD2_DAT0__KEY_ROW7 0x2fc 0x6e4 0x8d4 0x4 0x2
989#define MX6DL_PAD_SD2_DAT1__AUD4_TXFS 0x300 0x6e8 0x7ac 0x3 0x1 989#define MX6QDL_PAD_SD2_DAT0__GPIO1_IO15 0x2fc 0x6e4 0x000 0x5 0x0
990#define MX6DL_PAD_SD2_DAT1__KEY_COL7 0x300 0x6e8 0x8c8 0x4 0x2 990#define MX6QDL_PAD_SD2_DAT0__DCIC2_OUT 0x2fc 0x6e4 0x000 0x6 0x0
991#define MX6DL_PAD_SD2_DAT1__GPIO1_IO14 0x300 0x6e8 0x000 0x5 0x0 991#define MX6QDL_PAD_SD2_DAT1__SD2_DATA1 0x300 0x6e8 0x000 0x0 0x0
992#define MX6DL_PAD_SD2_DAT2__SD2_DATA2 0x304 0x6ec 0x000 0x0 0x0 992#define MX6QDL_PAD_SD2_DAT1__EIM_CS2_B 0x300 0x6e8 0x000 0x2 0x0
993#define MX6DL_PAD_SD2_DAT2__EIM_CS3_B 0x304 0x6ec 0x000 0x2 0x0 993#define MX6QDL_PAD_SD2_DAT1__AUD4_TXFS 0x300 0x6e8 0x7ac 0x3 0x1
994#define MX6DL_PAD_SD2_DAT2__AUD4_TXD 0x304 0x6ec 0x79c 0x3 0x1 994#define MX6QDL_PAD_SD2_DAT1__KEY_COL7 0x300 0x6e8 0x8c8 0x4 0x2
995#define MX6DL_PAD_SD2_DAT2__KEY_ROW6 0x304 0x6ec 0x8d0 0x4 0x2 995#define MX6QDL_PAD_SD2_DAT1__GPIO1_IO14 0x300 0x6e8 0x000 0x5 0x0
996#define MX6DL_PAD_SD2_DAT2__GPIO1_IO13 0x304 0x6ec 0x000 0x5 0x0 996#define MX6QDL_PAD_SD2_DAT2__SD2_DATA2 0x304 0x6ec 0x000 0x0 0x0
997#define MX6DL_PAD_SD2_DAT3__SD2_DATA3 0x308 0x6f0 0x000 0x0 0x0 997#define MX6QDL_PAD_SD2_DAT2__EIM_CS3_B 0x304 0x6ec 0x000 0x2 0x0
998#define MX6DL_PAD_SD2_DAT3__KEY_COL6 0x308 0x6f0 0x8c4 0x2 0x2 998#define MX6QDL_PAD_SD2_DAT2__AUD4_TXD 0x304 0x6ec 0x79c 0x3 0x1
999#define MX6DL_PAD_SD2_DAT3__AUD4_TXC 0x308 0x6f0 0x7a8 0x3 0x1 999#define MX6QDL_PAD_SD2_DAT2__KEY_ROW6 0x304 0x6ec 0x8d0 0x4 0x2
1000#define MX6DL_PAD_SD2_DAT3__GPIO1_IO12 0x308 0x6f0 0x000 0x5 0x0 1000#define MX6QDL_PAD_SD2_DAT2__GPIO1_IO13 0x304 0x6ec 0x000 0x5 0x0
1001#define MX6DL_PAD_SD3_CLK__SD3_CLK 0x30c 0x6f4 0x934 0x0 0x1 1001#define MX6QDL_PAD_SD2_DAT3__SD2_DATA3 0x308 0x6f0 0x000 0x0 0x0
1002#define MX6DL_PAD_SD3_CLK__UART2_RTS_B 0x30c 0x6f4 0x900 0x1 0x2 1002#define MX6QDL_PAD_SD2_DAT3__KEY_COL6 0x308 0x6f0 0x8c4 0x2 0x2
1003#define MX6DL_PAD_SD3_CLK__UART2_CTS_B 0x30c 0x6f4 0x000 0x1 0x0 1003#define MX6QDL_PAD_SD2_DAT3__AUD4_TXC 0x308 0x6f0 0x7a8 0x3 0x1
1004#define MX6DL_PAD_SD3_CLK__FLEXCAN1_RX 0x30c 0x6f4 0x7c8 0x2 0x2 1004#define MX6QDL_PAD_SD2_DAT3__GPIO1_IO12 0x308 0x6f0 0x000 0x5 0x0
1005#define MX6DL_PAD_SD3_CLK__GPIO7_IO03 0x30c 0x6f4 0x000 0x5 0x0 1005#define MX6QDL_PAD_SD3_CLK__SD3_CLK 0x30c 0x6f4 0x934 0x0 0x1
1006#define MX6DL_PAD_SD3_CMD__SD3_CMD 0x310 0x6f8 0x000 0x0 0x0 1006#define MX6QDL_PAD_SD3_CLK__UART2_RTS_B 0x30c 0x6f4 0x900 0x1 0x2
1007#define MX6DL_PAD_SD3_CMD__UART2_CTS_B 0x310 0x6f8 0x000 0x1 0x0 1007#define MX6QDL_PAD_SD3_CLK__UART2_CTS_B 0x30c 0x6f4 0x000 0x1 0x0
1008#define MX6DL_PAD_SD3_CMD__UART2_RTS_B 0x310 0x6f8 0x900 0x1 0x3 1008#define MX6QDL_PAD_SD3_CLK__FLEXCAN1_RX 0x30c 0x6f4 0x7c8 0x2 0x2
1009#define MX6DL_PAD_SD3_CMD__FLEXCAN1_TX 0x310 0x6f8 0x000 0x2 0x0 1009#define MX6QDL_PAD_SD3_CLK__GPIO7_IO03 0x30c 0x6f4 0x000 0x5 0x0
1010#define MX6DL_PAD_SD3_CMD__GPIO7_IO02 0x310 0x6f8 0x000 0x5 0x0 1010#define MX6QDL_PAD_SD3_CMD__SD3_CMD 0x310 0x6f8 0x000 0x0 0x0
1011#define MX6DL_PAD_SD3_DAT0__SD3_DATA0 0x314 0x6fc 0x000 0x0 0x0 1011#define MX6QDL_PAD_SD3_CMD__UART2_CTS_B 0x310 0x6f8 0x000 0x1 0x0
1012#define MX6DL_PAD_SD3_DAT0__UART1_CTS_B 0x314 0x6fc 0x000 0x1 0x0 1012#define MX6QDL_PAD_SD3_CMD__UART2_RTS_B 0x310 0x6f8 0x900 0x1 0x3
1013#define MX6DL_PAD_SD3_DAT0__UART1_RTS_B 0x314 0x6fc 0x8f8 0x1 0x2 1013#define MX6QDL_PAD_SD3_CMD__FLEXCAN1_TX 0x310 0x6f8 0x000 0x2 0x0
1014#define MX6DL_PAD_SD3_DAT0__FLEXCAN2_TX 0x314 0x6fc 0x000 0x2 0x0 1014#define MX6QDL_PAD_SD3_CMD__GPIO7_IO02 0x310 0x6f8 0x000 0x5 0x0
1015#define MX6DL_PAD_SD3_DAT0__GPIO7_IO04 0x314 0x6fc 0x000 0x5 0x0 1015#define MX6QDL_PAD_SD3_DAT0__SD3_DATA0 0x314 0x6fc 0x000 0x0 0x0
1016#define MX6DL_PAD_SD3_DAT1__SD3_DATA1 0x318 0x700 0x000 0x0 0x0 1016#define MX6QDL_PAD_SD3_DAT0__UART1_CTS_B 0x314 0x6fc 0x000 0x1 0x0
1017#define MX6DL_PAD_SD3_DAT1__UART1_RTS_B 0x318 0x700 0x8f8 0x1 0x3 1017#define MX6QDL_PAD_SD3_DAT0__UART1_RTS_B 0x314 0x6fc 0x8f8 0x1 0x2
1018#define MX6DL_PAD_SD3_DAT1__UART1_CTS_B 0x318 0x700 0x000 0x1 0x0 1018#define MX6QDL_PAD_SD3_DAT0__FLEXCAN2_TX 0x314 0x6fc 0x000 0x2 0x0
1019#define MX6DL_PAD_SD3_DAT1__FLEXCAN2_RX 0x318 0x700 0x7cc 0x2 0x1 1019#define MX6QDL_PAD_SD3_DAT0__GPIO7_IO04 0x314 0x6fc 0x000 0x5 0x0
1020#define MX6DL_PAD_SD3_DAT1__GPIO7_IO05 0x318 0x700 0x000 0x5 0x0 1020#define MX6QDL_PAD_SD3_DAT1__SD3_DATA1 0x318 0x700 0x000 0x0 0x0
1021#define MX6DL_PAD_SD3_DAT2__SD3_DATA2 0x31c 0x704 0x000 0x0 0x0 1021#define MX6QDL_PAD_SD3_DAT1__UART1_RTS_B 0x318 0x700 0x8f8 0x1 0x3
1022#define MX6DL_PAD_SD3_DAT2__GPIO7_IO06 0x31c 0x704 0x000 0x5 0x0 1022#define MX6QDL_PAD_SD3_DAT1__UART1_CTS_B 0x318 0x700 0x000 0x1 0x0
1023#define MX6DL_PAD_SD3_DAT3__SD3_DATA3 0x320 0x708 0x000 0x0 0x0 1023#define MX6QDL_PAD_SD3_DAT1__FLEXCAN2_RX 0x318 0x700 0x7cc 0x2 0x1
1024#define MX6DL_PAD_SD3_DAT3__UART3_CTS_B 0x320 0x708 0x000 0x1 0x0 1024#define MX6QDL_PAD_SD3_DAT1__GPIO7_IO05 0x318 0x700 0x000 0x5 0x0
1025#define MX6DL_PAD_SD3_DAT3__UART3_RTS_B 0x320 0x708 0x908 0x1 0x4 1025#define MX6QDL_PAD_SD3_DAT2__SD3_DATA2 0x31c 0x704 0x000 0x0 0x0
1026#define MX6DL_PAD_SD3_DAT3__GPIO7_IO07 0x320 0x708 0x000 0x5 0x0 1026#define MX6QDL_PAD_SD3_DAT2__GPIO7_IO06 0x31c 0x704 0x000 0x5 0x0
1027#define MX6DL_PAD_SD3_DAT4__SD3_DATA4 0x324 0x70c 0x000 0x0 0x0 1027#define MX6QDL_PAD_SD3_DAT3__SD3_DATA3 0x320 0x708 0x000 0x0 0x0
1028#define MX6DL_PAD_SD3_DAT4__UART2_RX_DATA 0x324 0x70c 0x904 0x1 0x4 1028#define MX6QDL_PAD_SD3_DAT3__UART3_CTS_B 0x320 0x708 0x000 0x1 0x0
1029#define MX6DL_PAD_SD3_DAT4__UART2_TX_DATA 0x324 0x70c 0x000 0x1 0x0 1029#define MX6QDL_PAD_SD3_DAT3__UART3_RTS_B 0x320 0x708 0x908 0x1 0x4
1030#define MX6DL_PAD_SD3_DAT4__GPIO7_IO01 0x324 0x70c 0x000 0x5 0x0 1030#define MX6QDL_PAD_SD3_DAT3__GPIO7_IO07 0x320 0x708 0x000 0x5 0x0
1031#define MX6DL_PAD_SD3_DAT5__SD3_DATA5 0x328 0x710 0x000 0x0 0x0 1031#define MX6QDL_PAD_SD3_DAT4__SD3_DATA4 0x324 0x70c 0x000 0x0 0x0
1032#define MX6DL_PAD_SD3_DAT5__UART2_TX_DATA 0x328 0x710 0x000 0x1 0x0 1032#define MX6QDL_PAD_SD3_DAT4__UART2_RX_DATA 0x324 0x70c 0x904 0x1 0x4
1033#define MX6DL_PAD_SD3_DAT5__UART2_RX_DATA 0x328 0x710 0x904 0x1 0x5 1033#define MX6QDL_PAD_SD3_DAT4__UART2_TX_DATA 0x324 0x70c 0x000 0x1 0x0
1034#define MX6DL_PAD_SD3_DAT5__GPIO7_IO00 0x328 0x710 0x000 0x5 0x0 1034#define MX6QDL_PAD_SD3_DAT4__GPIO7_IO01 0x324 0x70c 0x000 0x5 0x0
1035#define MX6DL_PAD_SD3_DAT6__SD3_DATA6 0x32c 0x714 0x000 0x0 0x0 1035#define MX6QDL_PAD_SD3_DAT5__SD3_DATA5 0x328 0x710 0x000 0x0 0x0
1036#define MX6DL_PAD_SD3_DAT6__UART1_RX_DATA 0x32c 0x714 0x8fc 0x1 0x2 1036#define MX6QDL_PAD_SD3_DAT5__UART2_TX_DATA 0x328 0x710 0x000 0x1 0x0
1037#define MX6DL_PAD_SD3_DAT6__UART1_TX_DATA 0x32c 0x714 0x000 0x1 0x0 1037#define MX6QDL_PAD_SD3_DAT5__UART2_RX_DATA 0x328 0x710 0x904 0x1 0x5
1038#define MX6DL_PAD_SD3_DAT6__GPIO6_IO18 0x32c 0x714 0x000 0x5 0x0 1038#define MX6QDL_PAD_SD3_DAT5__GPIO7_IO00 0x328 0x710 0x000 0x5 0x0
1039#define MX6DL_PAD_SD3_DAT7__SD3_DATA7 0x330 0x718 0x000 0x0 0x0 1039#define MX6QDL_PAD_SD3_DAT6__SD3_DATA6 0x32c 0x714 0x000 0x0 0x0
1040#define MX6DL_PAD_SD3_DAT7__UART1_TX_DATA 0x330 0x718 0x000 0x1 0x0 1040#define MX6QDL_PAD_SD3_DAT6__UART1_RX_DATA 0x32c 0x714 0x8fc 0x1 0x2
1041#define MX6DL_PAD_SD3_DAT7__UART1_RX_DATA 0x330 0x718 0x8fc 0x1 0x3 1041#define MX6QDL_PAD_SD3_DAT6__UART1_TX_DATA 0x32c 0x714 0x000 0x1 0x0
1042#define MX6DL_PAD_SD3_DAT7__GPIO6_IO17 0x330 0x718 0x000 0x5 0x0 1042#define MX6QDL_PAD_SD3_DAT6__GPIO6_IO18 0x32c 0x714 0x000 0x5 0x0
1043#define MX6DL_PAD_SD3_RST__SD3_RESET 0x334 0x71c 0x000 0x0 0x0 1043#define MX6QDL_PAD_SD3_DAT7__SD3_DATA7 0x330 0x718 0x000 0x0 0x0
1044#define MX6DL_PAD_SD3_RST__UART3_RTS_B 0x334 0x71c 0x908 0x1 0x5 1044#define MX6QDL_PAD_SD3_DAT7__UART1_TX_DATA 0x330 0x718 0x000 0x1 0x0
1045#define MX6DL_PAD_SD3_RST__UART3_CTS_B 0x334 0x71c 0x000 0x1 0x0 1045#define MX6QDL_PAD_SD3_DAT7__UART1_RX_DATA 0x330 0x718 0x8fc 0x1 0x3
1046#define MX6DL_PAD_SD3_RST__GPIO7_IO08 0x334 0x71c 0x000 0x5 0x0 1046#define MX6QDL_PAD_SD3_DAT7__GPIO6_IO17 0x330 0x718 0x000 0x5 0x0
1047#define MX6DL_PAD_SD4_CLK__SD4_CLK 0x338 0x720 0x938 0x0 0x1 1047#define MX6QDL_PAD_SD3_RST__SD3_RESET 0x334 0x71c 0x000 0x0 0x0
1048#define MX6DL_PAD_SD4_CLK__NAND_WE_B 0x338 0x720 0x000 0x1 0x0 1048#define MX6QDL_PAD_SD3_RST__UART3_RTS_B 0x334 0x71c 0x908 0x1 0x5
1049#define MX6DL_PAD_SD4_CLK__UART3_RX_DATA 0x338 0x720 0x90c 0x2 0x2 1049#define MX6QDL_PAD_SD3_RST__UART3_CTS_B 0x334 0x71c 0x000 0x1 0x0
1050#define MX6DL_PAD_SD4_CLK__UART3_TX_DATA 0x338 0x720 0x000 0x2 0x0 1050#define MX6QDL_PAD_SD3_RST__GPIO7_IO08 0x334 0x71c 0x000 0x5 0x0
1051#define MX6DL_PAD_SD4_CLK__GPIO7_IO10 0x338 0x720 0x000 0x5 0x0 1051#define MX6QDL_PAD_SD4_CLK__SD4_CLK 0x338 0x720 0x938 0x0 0x1
1052#define MX6DL_PAD_SD4_CMD__SD4_CMD 0x33c 0x724 0x000 0x0 0x0 1052#define MX6QDL_PAD_SD4_CLK__NAND_WE_B 0x338 0x720 0x000 0x1 0x0
1053#define MX6DL_PAD_SD4_CMD__NAND_RE_B 0x33c 0x724 0x000 0x1 0x0 1053#define MX6QDL_PAD_SD4_CLK__UART3_RX_DATA 0x338 0x720 0x90c 0x2 0x2
1054#define MX6DL_PAD_SD4_CMD__UART3_TX_DATA 0x33c 0x724 0x000 0x2 0x0 1054#define MX6QDL_PAD_SD4_CLK__UART3_TX_DATA 0x338 0x720 0x000 0x2 0x0
1055#define MX6DL_PAD_SD4_CMD__UART3_RX_DATA 0x33c 0x724 0x90c 0x2 0x3 1055#define MX6QDL_PAD_SD4_CLK__GPIO7_IO10 0x338 0x720 0x000 0x5 0x0
1056#define MX6DL_PAD_SD4_CMD__GPIO7_IO09 0x33c 0x724 0x000 0x5 0x0 1056#define MX6QDL_PAD_SD4_CMD__SD4_CMD 0x33c 0x724 0x000 0x0 0x0
1057#define MX6DL_PAD_SD4_DAT0__SD4_DATA0 0x340 0x728 0x000 0x1 0x0 1057#define MX6QDL_PAD_SD4_CMD__NAND_RE_B 0x33c 0x724 0x000 0x1 0x0
1058#define MX6DL_PAD_SD4_DAT0__NAND_DQS 0x340 0x728 0x000 0x2 0x0 1058#define MX6QDL_PAD_SD4_CMD__UART3_TX_DATA 0x33c 0x724 0x000 0x2 0x0
1059#define MX6DL_PAD_SD4_DAT0__GPIO2_IO08 0x340 0x728 0x000 0x5 0x0 1059#define MX6QDL_PAD_SD4_CMD__UART3_RX_DATA 0x33c 0x724 0x90c 0x2 0x3
1060#define MX6DL_PAD_SD4_DAT1__SD4_DATA1 0x344 0x72c 0x000 0x1 0x0 1060#define MX6QDL_PAD_SD4_CMD__GPIO7_IO09 0x33c 0x724 0x000 0x5 0x0
1061#define MX6DL_PAD_SD4_DAT1__PWM3_OUT 0x344 0x72c 0x000 0x2 0x0 1061#define MX6QDL_PAD_SD4_DAT0__SD4_DATA0 0x340 0x728 0x000 0x1 0x0
1062#define MX6DL_PAD_SD4_DAT1__GPIO2_IO09 0x344 0x72c 0x000 0x5 0x0 1062#define MX6QDL_PAD_SD4_DAT0__NAND_DQS 0x340 0x728 0x000 0x2 0x0
1063#define MX6DL_PAD_SD4_DAT2__SD4_DATA2 0x348 0x730 0x000 0x1 0x0 1063#define MX6QDL_PAD_SD4_DAT0__GPIO2_IO08 0x340 0x728 0x000 0x5 0x0
1064#define MX6DL_PAD_SD4_DAT2__PWM4_OUT 0x348 0x730 0x000 0x2 0x0 1064#define MX6QDL_PAD_SD4_DAT1__SD4_DATA1 0x344 0x72c 0x000 0x1 0x0
1065#define MX6DL_PAD_SD4_DAT2__GPIO2_IO10 0x348 0x730 0x000 0x5 0x0 1065#define MX6QDL_PAD_SD4_DAT1__PWM3_OUT 0x344 0x72c 0x000 0x2 0x0
1066#define MX6DL_PAD_SD4_DAT3__SD4_DATA3 0x34c 0x734 0x000 0x1 0x0 1066#define MX6QDL_PAD_SD4_DAT1__GPIO2_IO09 0x344 0x72c 0x000 0x5 0x0
1067#define MX6DL_PAD_SD4_DAT3__GPIO2_IO11 0x34c 0x734 0x000 0x5 0x0 1067#define MX6QDL_PAD_SD4_DAT2__SD4_DATA2 0x348 0x730 0x000 0x1 0x0
1068#define MX6DL_PAD_SD4_DAT4__SD4_DATA4 0x350 0x738 0x000 0x1 0x0 1068#define MX6QDL_PAD_SD4_DAT2__PWM4_OUT 0x348 0x730 0x000 0x2 0x0
1069#define MX6DL_PAD_SD4_DAT4__UART2_RX_DATA 0x350 0x738 0x904 0x2 0x6 1069#define MX6QDL_PAD_SD4_DAT2__GPIO2_IO10 0x348 0x730 0x000 0x5 0x0
1070#define MX6DL_PAD_SD4_DAT4__UART2_TX_DATA 0x350 0x738 0x000 0x2 0x0 1070#define MX6QDL_PAD_SD4_DAT3__SD4_DATA3 0x34c 0x734 0x000 0x1 0x0
1071#define MX6DL_PAD_SD4_DAT4__GPIO2_IO12 0x350 0x738 0x000 0x5 0x0 1071#define MX6QDL_PAD_SD4_DAT3__GPIO2_IO11 0x34c 0x734 0x000 0x5 0x0
1072#define MX6DL_PAD_SD4_DAT5__SD4_DATA5 0x354 0x73c 0x000 0x1 0x0 1072#define MX6QDL_PAD_SD4_DAT4__SD4_DATA4 0x350 0x738 0x000 0x1 0x0
1073#define MX6DL_PAD_SD4_DAT5__UART2_RTS_B 0x354 0x73c 0x900 0x2 0x4 1073#define MX6QDL_PAD_SD4_DAT4__UART2_RX_DATA 0x350 0x738 0x904 0x2 0x6
1074#define MX6DL_PAD_SD4_DAT5__UART2_CTS_B 0x354 0x73c 0x000 0x2 0x0 1074#define MX6QDL_PAD_SD4_DAT4__UART2_TX_DATA 0x350 0x738 0x000 0x2 0x0
1075#define MX6DL_PAD_SD4_DAT5__GPIO2_IO13 0x354 0x73c 0x000 0x5 0x0 1075#define MX6QDL_PAD_SD4_DAT4__GPIO2_IO12 0x350 0x738 0x000 0x5 0x0
1076#define MX6DL_PAD_SD4_DAT6__SD4_DATA6 0x358 0x740 0x000 0x1 0x0 1076#define MX6QDL_PAD_SD4_DAT5__SD4_DATA5 0x354 0x73c 0x000 0x1 0x0
1077#define MX6DL_PAD_SD4_DAT6__UART2_CTS_B 0x358 0x740 0x000 0x2 0x0 1077#define MX6QDL_PAD_SD4_DAT5__UART2_RTS_B 0x354 0x73c 0x900 0x2 0x4
1078#define MX6DL_PAD_SD4_DAT6__UART2_RTS_B 0x358 0x740 0x900 0x2 0x5 1078#define MX6QDL_PAD_SD4_DAT5__UART2_CTS_B 0x354 0x73c 0x000 0x2 0x0
1079#define MX6DL_PAD_SD4_DAT6__GPIO2_IO14 0x358 0x740 0x000 0x5 0x0 1079#define MX6QDL_PAD_SD4_DAT5__GPIO2_IO13 0x354 0x73c 0x000 0x5 0x0
1080#define MX6DL_PAD_SD4_DAT7__SD4_DATA7 0x35c 0x744 0x000 0x1 0x0 1080#define MX6QDL_PAD_SD4_DAT6__SD4_DATA6 0x358 0x740 0x000 0x1 0x0
1081#define MX6DL_PAD_SD4_DAT7__UART2_TX_DATA 0x35c 0x744 0x000 0x2 0x0 1081#define MX6QDL_PAD_SD4_DAT6__UART2_CTS_B 0x358 0x740 0x000 0x2 0x0
1082#define MX6DL_PAD_SD4_DAT7__UART2_RX_DATA 0x35c 0x744 0x904 0x2 0x7 1082#define MX6QDL_PAD_SD4_DAT6__UART2_RTS_B 0x358 0x740 0x900 0x2 0x5
1083#define MX6DL_PAD_SD4_DAT7__GPIO2_IO15 0x35c 0x744 0x000 0x5 0x0 1083#define MX6QDL_PAD_SD4_DAT6__GPIO2_IO14 0x358 0x740 0x000 0x5 0x0
1084#define MX6QDL_PAD_SD4_DAT7__SD4_DATA7 0x35c 0x744 0x000 0x1 0x0
1085#define MX6QDL_PAD_SD4_DAT7__UART2_TX_DATA 0x35c 0x744 0x000 0x2 0x0
1086#define MX6QDL_PAD_SD4_DAT7__UART2_RX_DATA 0x35c 0x744 0x904 0x2 0x7
1087#define MX6QDL_PAD_SD4_DAT7__GPIO2_IO15 0x35c 0x744 0x000 0x5 0x0
1084 1088
1085#endif /* __DTS_IMX6DL_PINFUNC_H */ 1089#endif /* __DTS_IMX6DL_PINFUNC_H */
diff --git a/arch/arm/boot/dts/imx6dl-sabreauto.dts b/arch/arm/boot/dts/imx6dl-sabreauto.dts
index 95da71185a4a..a6ce7b487ad7 100644
--- a/arch/arm/boot/dts/imx6dl-sabreauto.dts
+++ b/arch/arm/boot/dts/imx6dl-sabreauto.dts
@@ -15,25 +15,3 @@
15 model = "Freescale i.MX6 DualLite/Solo SABRE Automotive Board"; 15 model = "Freescale i.MX6 DualLite/Solo SABRE Automotive Board";
16 compatible = "fsl,imx6dl-sabreauto", "fsl,imx6dl"; 16 compatible = "fsl,imx6dl-sabreauto", "fsl,imx6dl";
17}; 17};
18
19&iomuxc {
20 pinctrl-names = "default";
21 pinctrl-0 = <&pinctrl_hog>;
22
23 hog {
24 pinctrl_hog: hoggrp {
25 fsl,pins = <
26 MX6DL_PAD_NANDF_CS2__GPIO6_IO15 0x80000000
27 MX6DL_PAD_SD2_DAT2__GPIO1_IO13 0x80000000
28 >;
29 };
30 };
31
32 ecspi1 {
33 pinctrl_ecspi1_sabreauto: ecspi1-sabreauto {
34 fsl,pins = <
35 MX6DL_PAD_EIM_D19__GPIO3_IO19 0x80000000
36 >;
37 };
38 };
39};
diff --git a/arch/arm/boot/dts/imx6dl-sabresd.dts b/arch/arm/boot/dts/imx6dl-sabresd.dts
index 8989df2b89e5..1e45f2f9d0b6 100644
--- a/arch/arm/boot/dts/imx6dl-sabresd.dts
+++ b/arch/arm/boot/dts/imx6dl-sabresd.dts
@@ -15,22 +15,3 @@
15 model = "Freescale i.MX6 DualLite SABRE Smart Device Board"; 15 model = "Freescale i.MX6 DualLite SABRE Smart Device Board";
16 compatible = "fsl,imx6dl-sabresd", "fsl,imx6dl"; 16 compatible = "fsl,imx6dl-sabresd", "fsl,imx6dl";
17}; 17};
18
19&iomuxc {
20 pinctrl-names = "default";
21 pinctrl-0 = <&pinctrl_hog>;
22
23 hog {
24 pinctrl_hog: hoggrp {
25 fsl,pins = <
26 MX6DL_PAD_GPIO_4__GPIO1_IO04 0x80000000
27 MX6DL_PAD_GPIO_5__GPIO1_IO05 0x80000000
28 MX6DL_PAD_NANDF_D0__GPIO2_IO00 0x80000000
29 MX6DL_PAD_NANDF_D1__GPIO2_IO01 0x80000000
30 MX6DL_PAD_NANDF_D2__GPIO2_IO02 0x80000000
31 MX6DL_PAD_NANDF_D3__GPIO2_IO03 0x80000000
32 MX6DL_PAD_GPIO_0__CCM_CLKO1 0x130b0
33 >;
34 };
35 };
36};
diff --git a/arch/arm/boot/dts/imx6dl-wandboard.dts b/arch/arm/boot/dts/imx6dl-wandboard.dts
index bfc59c3566a4..e672891c1626 100644
--- a/arch/arm/boot/dts/imx6dl-wandboard.dts
+++ b/arch/arm/boot/dts/imx6dl-wandboard.dts
@@ -10,6 +10,7 @@
10 */ 10 */
11/dts-v1/; 11/dts-v1/;
12#include "imx6dl.dtsi" 12#include "imx6dl.dtsi"
13#include "imx6qdl-wandboard.dtsi"
13 14
14/ { 15/ {
15 model = "Wandboard i.MX6 Dual Lite Board"; 16 model = "Wandboard i.MX6 Dual Lite Board";
@@ -19,26 +20,3 @@
19 reg = <0x10000000 0x40000000>; 20 reg = <0x10000000 0x40000000>;
20 }; 21 };
21}; 22};
22
23&fec {
24 pinctrl-names = "default";
25 pinctrl-0 = <&pinctrl_enet_1>;
26 phy-mode = "rgmii";
27 status = "okay";
28};
29
30&uart1 {
31 pinctrl-names = "default";
32 pinctrl-0 = <&pinctrl_uart1_1>;
33 status = "okay";
34};
35
36&usbh1 {
37 status = "okay";
38};
39
40&usdhc3 {
41 pinctrl-names = "default";
42 pinctrl-0 = <&pinctrl_usdhc3_2>;
43 status = "okay";
44};
diff --git a/arch/arm/boot/dts/imx6dl.dtsi b/arch/arm/boot/dts/imx6dl.dtsi
index 2b3ecd679350..9e8ae118fdd4 100644
--- a/arch/arm/boot/dts/imx6dl.dtsi
+++ b/arch/arm/boot/dts/imx6dl.dtsi
@@ -8,8 +8,8 @@
8 * 8 *
9 */ 9 */
10 10
11#include "imx6qdl.dtsi"
12#include "imx6dl-pinfunc.h" 11#include "imx6dl-pinfunc.h"
12#include "imx6qdl.dtsi"
13 13
14/ { 14/ {
15 cpus { 15 cpus {
@@ -32,238 +32,15 @@
32 }; 32 };
33 33
34 soc { 34 soc {
35 ocram: sram@00900000 {
36 compatible = "mmio-sram";
37 reg = <0x00900000 0x20000>;
38 clocks = <&clks 142>;
39 };
40
35 aips1: aips-bus@02000000 { 41 aips1: aips-bus@02000000 {
36 iomuxc: iomuxc@020e0000 { 42 iomuxc: iomuxc@020e0000 {
37 compatible = "fsl,imx6dl-iomuxc"; 43 compatible = "fsl,imx6dl-iomuxc";
38 reg = <0x020e0000 0x4000>;
39
40 audmux {
41 pinctrl_audmux_2: audmux-2 {
42 fsl,pins = <
43 MX6DL_PAD_CSI0_DAT7__AUD3_RXD 0x80000000
44 MX6DL_PAD_CSI0_DAT4__AUD3_TXC 0x80000000
45 MX6DL_PAD_CSI0_DAT5__AUD3_TXD 0x80000000
46 MX6DL_PAD_CSI0_DAT6__AUD3_TXFS 0x80000000
47 >;
48 };
49 };
50
51 ecspi1 {
52 pinctrl_ecspi1_1: ecspi1grp-1 {
53 fsl,pins = <
54 MX6DL_PAD_EIM_D17__ECSPI1_MISO 0x100b1
55 MX6DL_PAD_EIM_D18__ECSPI1_MOSI 0x100b1
56 MX6DL_PAD_EIM_D16__ECSPI1_SCLK 0x100b1
57 >;
58 };
59 };
60
61 enet {
62 pinctrl_enet_1: enetgrp-1 {
63 fsl,pins = <
64 MX6DL_PAD_ENET_MDIO__ENET_MDIO 0x1b0b0
65 MX6DL_PAD_ENET_MDC__ENET_MDC 0x1b0b0
66 MX6DL_PAD_RGMII_TXC__RGMII_TXC 0x1b0b0
67 MX6DL_PAD_RGMII_TD0__RGMII_TD0 0x1b0b0
68 MX6DL_PAD_RGMII_TD1__RGMII_TD1 0x1b0b0
69 MX6DL_PAD_RGMII_TD2__RGMII_TD2 0x1b0b0
70 MX6DL_PAD_RGMII_TD3__RGMII_TD3 0x1b0b0
71 MX6DL_PAD_RGMII_TX_CTL__RGMII_TX_CTL 0x1b0b0
72 MX6DL_PAD_ENET_REF_CLK__ENET_TX_CLK 0x1b0b0
73 MX6DL_PAD_RGMII_RXC__RGMII_RXC 0x1b0b0
74 MX6DL_PAD_RGMII_RD0__RGMII_RD0 0x1b0b0
75 MX6DL_PAD_RGMII_RD1__RGMII_RD1 0x1b0b0
76 MX6DL_PAD_RGMII_RD2__RGMII_RD2 0x1b0b0
77 MX6DL_PAD_RGMII_RD3__RGMII_RD3 0x1b0b0
78 MX6DL_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x1b0b0
79 MX6DL_PAD_GPIO_16__ENET_REF_CLK 0x4001b0a8
80 >;
81 };
82
83 pinctrl_enet_2: enetgrp-2 {
84 fsl,pins = <
85 MX6DL_PAD_KEY_COL1__ENET_MDIO 0x1b0b0
86 MX6DL_PAD_KEY_COL2__ENET_MDC 0x1b0b0
87 MX6DL_PAD_RGMII_TXC__RGMII_TXC 0x1b0b0
88 MX6DL_PAD_RGMII_TD0__RGMII_TD0 0x1b0b0
89 MX6DL_PAD_RGMII_TD1__RGMII_TD1 0x1b0b0
90 MX6DL_PAD_RGMII_TD2__RGMII_TD2 0x1b0b0
91 MX6DL_PAD_RGMII_TD3__RGMII_TD3 0x1b0b0
92 MX6DL_PAD_RGMII_TX_CTL__RGMII_TX_CTL 0x1b0b0
93 MX6DL_PAD_ENET_REF_CLK__ENET_TX_CLK 0x1b0b0
94 MX6DL_PAD_RGMII_RXC__RGMII_RXC 0x1b0b0
95 MX6DL_PAD_RGMII_RD0__RGMII_RD0 0x1b0b0
96 MX6DL_PAD_RGMII_RD1__RGMII_RD1 0x1b0b0
97 MX6DL_PAD_RGMII_RD2__RGMII_RD2 0x1b0b0
98 MX6DL_PAD_RGMII_RD3__RGMII_RD3 0x1b0b0
99 MX6DL_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x1b0b0
100 >;
101 };
102 };
103
104 gpmi-nand {
105 pinctrl_gpmi_nand_1: gpmi-nand-1 {
106 fsl,pins = <
107 MX6DL_PAD_NANDF_CLE__NAND_CLE 0xb0b1
108 MX6DL_PAD_NANDF_ALE__NAND_ALE 0xb0b1
109 MX6DL_PAD_NANDF_WP_B__NAND_WP_B 0xb0b1
110 MX6DL_PAD_NANDF_RB0__NAND_READY_B 0xb000
111 MX6DL_PAD_NANDF_CS0__NAND_CE0_B 0xb0b1
112 MX6DL_PAD_NANDF_CS1__NAND_CE1_B 0xb0b1
113 MX6DL_PAD_SD4_CMD__NAND_RE_B 0xb0b1
114 MX6DL_PAD_SD4_CLK__NAND_WE_B 0xb0b1
115 MX6DL_PAD_NANDF_D0__NAND_DATA00 0xb0b1
116 MX6DL_PAD_NANDF_D1__NAND_DATA01 0xb0b1
117 MX6DL_PAD_NANDF_D2__NAND_DATA02 0xb0b1
118 MX6DL_PAD_NANDF_D3__NAND_DATA03 0xb0b1
119 MX6DL_PAD_NANDF_D4__NAND_DATA04 0xb0b1
120 MX6DL_PAD_NANDF_D5__NAND_DATA05 0xb0b1
121 MX6DL_PAD_NANDF_D6__NAND_DATA06 0xb0b1
122 MX6DL_PAD_NANDF_D7__NAND_DATA07 0xb0b1
123 MX6DL_PAD_SD4_DAT0__NAND_DQS 0x00b1
124 >;
125 };
126 };
127
128 i2c1 {
129 pinctrl_i2c1_2: i2c1grp-2 {
130 fsl,pins = <
131 MX6DL_PAD_CSI0_DAT8__I2C1_SDA 0x4001b8b1
132 MX6DL_PAD_CSI0_DAT9__I2C1_SCL 0x4001b8b1
133 >;
134 };
135 };
136
137 uart1 {
138 pinctrl_uart1_1: uart1grp-1 {
139 fsl,pins = <
140 MX6DL_PAD_CSI0_DAT10__UART1_TX_DATA 0x1b0b1
141 MX6DL_PAD_CSI0_DAT11__UART1_RX_DATA 0x1b0b1
142 >;
143 };
144 };
145
146 uart4 {
147 pinctrl_uart4_1: uart4grp-1 {
148 fsl,pins = <
149 MX6DL_PAD_KEY_COL0__UART4_TX_DATA 0x1b0b1
150 MX6DL_PAD_KEY_ROW0__UART4_RX_DATA 0x1b0b1
151 >;
152 };
153 };
154
155 usbotg {
156 pinctrl_usbotg_2: usbotggrp-2 {
157 fsl,pins = <
158 MX6DL_PAD_ENET_RX_ER__USB_OTG_ID 0x17059
159 >;
160 };
161 };
162
163 usdhc2 {
164 pinctrl_usdhc2_1: usdhc2grp-1 {
165 fsl,pins = <
166 MX6DL_PAD_SD2_CMD__SD2_CMD 0x17059
167 MX6DL_PAD_SD2_CLK__SD2_CLK 0x10059
168 MX6DL_PAD_SD2_DAT0__SD2_DATA0 0x17059
169 MX6DL_PAD_SD2_DAT1__SD2_DATA1 0x17059
170 MX6DL_PAD_SD2_DAT2__SD2_DATA2 0x17059
171 MX6DL_PAD_SD2_DAT3__SD2_DATA3 0x17059
172 MX6DL_PAD_NANDF_D4__SD2_DATA4 0x17059
173 MX6DL_PAD_NANDF_D5__SD2_DATA5 0x17059
174 MX6DL_PAD_NANDF_D6__SD2_DATA6 0x17059
175 MX6DL_PAD_NANDF_D7__SD2_DATA7 0x17059
176 >;
177 };
178 };
179
180 usdhc3 {
181 pinctrl_usdhc3_1: usdhc3grp-1 {
182 fsl,pins = <
183 MX6DL_PAD_SD3_CMD__SD3_CMD 0x17059
184 MX6DL_PAD_SD3_CLK__SD3_CLK 0x10059
185 MX6DL_PAD_SD3_DAT0__SD3_DATA0 0x17059
186 MX6DL_PAD_SD3_DAT1__SD3_DATA1 0x17059
187 MX6DL_PAD_SD3_DAT2__SD3_DATA2 0x17059
188 MX6DL_PAD_SD3_DAT3__SD3_DATA3 0x17059
189 MX6DL_PAD_SD3_DAT4__SD3_DATA4 0x17059
190 MX6DL_PAD_SD3_DAT5__SD3_DATA5 0x17059
191 MX6DL_PAD_SD3_DAT6__SD3_DATA6 0x17059
192 MX6DL_PAD_SD3_DAT7__SD3_DATA7 0x17059
193 >;
194 };
195
196 pinctrl_usdhc3_2: usdhc3grp_2 {
197 fsl,pins = <
198 MX6DL_PAD_SD3_CMD__SD3_CMD 0x17059
199 MX6DL_PAD_SD3_CLK__SD3_CLK 0x10059
200 MX6DL_PAD_SD3_DAT0__SD3_DATA0 0x17059
201 MX6DL_PAD_SD3_DAT1__SD3_DATA1 0x17059
202 MX6DL_PAD_SD3_DAT2__SD3_DATA2 0x17059
203 MX6DL_PAD_SD3_DAT3__SD3_DATA3 0x17059
204 >;
205 };
206 };
207
208 weim {
209 pinctrl_weim_cs0_1: weim_cs0grp-1 {
210 fsl,pins = <
211 MX6DL_PAD_EIM_CS0__EIM_CS0_B 0xb0b1
212 >;
213 };
214
215 pinctrl_weim_nor_1: weim_norgrp-1 {
216 fsl,pins = <
217 MX6DL_PAD_EIM_OE__EIM_OE_B 0xb0b1
218 MX6DL_PAD_EIM_RW__EIM_RW 0xb0b1
219 MX6DL_PAD_EIM_WAIT__EIM_WAIT_B 0xb060
220 /* data */
221 MX6DL_PAD_EIM_D16__EIM_DATA16 0x1b0b0
222 MX6DL_PAD_EIM_D17__EIM_DATA17 0x1b0b0
223 MX6DL_PAD_EIM_D18__EIM_DATA18 0x1b0b0
224 MX6DL_PAD_EIM_D19__EIM_DATA19 0x1b0b0
225 MX6DL_PAD_EIM_D20__EIM_DATA20 0x1b0b0
226 MX6DL_PAD_EIM_D21__EIM_DATA21 0x1b0b0
227 MX6DL_PAD_EIM_D22__EIM_DATA22 0x1b0b0
228 MX6DL_PAD_EIM_D23__EIM_DATA23 0x1b0b0
229 MX6DL_PAD_EIM_D24__EIM_DATA24 0x1b0b0
230 MX6DL_PAD_EIM_D25__EIM_DATA25 0x1b0b0
231 MX6DL_PAD_EIM_D26__EIM_DATA26 0x1b0b0
232 MX6DL_PAD_EIM_D27__EIM_DATA27 0x1b0b0
233 MX6DL_PAD_EIM_D28__EIM_DATA28 0x1b0b0
234 MX6DL_PAD_EIM_D29__EIM_DATA29 0x1b0b0
235 MX6DL_PAD_EIM_D30__EIM_DATA30 0x1b0b0
236 MX6DL_PAD_EIM_D31__EIM_DATA31 0x1b0b0
237 /* address */
238 MX6DL_PAD_EIM_A23__EIM_ADDR23 0xb0b1
239 MX6DL_PAD_EIM_A22__EIM_ADDR22 0xb0b1
240 MX6DL_PAD_EIM_A21__EIM_ADDR21 0xb0b1
241 MX6DL_PAD_EIM_A20__EIM_ADDR20 0xb0b1
242 MX6DL_PAD_EIM_A19__EIM_ADDR19 0xb0b1
243 MX6DL_PAD_EIM_A18__EIM_ADDR18 0xb0b1
244 MX6DL_PAD_EIM_A17__EIM_ADDR17 0xb0b1
245 MX6DL_PAD_EIM_A16__EIM_ADDR16 0xb0b1
246 MX6DL_PAD_EIM_DA15__EIM_AD15 0xb0b1
247 MX6DL_PAD_EIM_DA14__EIM_AD14 0xb0b1
248 MX6DL_PAD_EIM_DA13__EIM_AD13 0xb0b1
249 MX6DL_PAD_EIM_DA12__EIM_AD12 0xb0b1
250 MX6DL_PAD_EIM_DA11__EIM_AD11 0xb0b1
251 MX6DL_PAD_EIM_DA10__EIM_AD10 0xb0b1
252 MX6DL_PAD_EIM_DA9__EIM_AD09 0xb0b1
253 MX6DL_PAD_EIM_DA8__EIM_AD08 0xb0b1
254 MX6DL_PAD_EIM_DA7__EIM_AD07 0xb0b1
255 MX6DL_PAD_EIM_DA6__EIM_AD06 0xb0b1
256 MX6DL_PAD_EIM_DA5__EIM_AD05 0xb0b1
257 MX6DL_PAD_EIM_DA4__EIM_AD04 0xb0b1
258 MX6DL_PAD_EIM_DA3__EIM_AD03 0xb0b1
259 MX6DL_PAD_EIM_DA2__EIM_AD02 0xb0b1
260 MX6DL_PAD_EIM_DA1__EIM_AD01 0xb0b1
261 MX6DL_PAD_EIM_DA0__EIM_AD00 0xb0b1
262 >;
263 };
264
265 };
266
267 }; 44 };
268 45
269 pxp: pxp@020f0000 { 46 pxp: pxp@020f0000 {
@@ -294,3 +71,20 @@
294 }; 71 };
295 }; 72 };
296}; 73};
74
75&ldb {
76 clocks = <&clks 33>, <&clks 34>,
77 <&clks 39>, <&clks 40>,
78 <&clks 135>, <&clks 136>;
79 clock-names = "di0_pll", "di1_pll",
80 "di0_sel", "di1_sel",
81 "di0", "di1";
82
83 lvds-channel@0 {
84 crtcs = <&ipu1 0>, <&ipu1 1>;
85 };
86
87 lvds-channel@1 {
88 crtcs = <&ipu1 0>, <&ipu1 1>;
89 };
90};
diff --git a/arch/arm/boot/dts/imx6q-arm2.dts b/arch/arm/boot/dts/imx6q-arm2.dts
index 4e54fde591bd..edf1bd967164 100644
--- a/arch/arm/boot/dts/imx6q-arm2.dts
+++ b/arch/arm/boot/dts/imx6q-arm2.dts
@@ -57,7 +57,7 @@
57 hog { 57 hog {
58 pinctrl_hog: hoggrp { 58 pinctrl_hog: hoggrp {
59 fsl,pins = < 59 fsl,pins = <
60 MX6Q_PAD_EIM_D25__GPIO3_IO25 0x80000000 60 MX6QDL_PAD_EIM_D25__GPIO3_IO25 0x80000000
61 >; 61 >;
62 }; 62 };
63 }; 63 };
@@ -65,8 +65,8 @@
65 arm2 { 65 arm2 {
66 pinctrl_usdhc3_arm2: usdhc3grp-arm2 { 66 pinctrl_usdhc3_arm2: usdhc3grp-arm2 {
67 fsl,pins = < 67 fsl,pins = <
68 MX6Q_PAD_NANDF_CS0__GPIO6_IO11 0x80000000 68 MX6QDL_PAD_NANDF_CS0__GPIO6_IO11 0x80000000
69 MX6Q_PAD_NANDF_CS1__GPIO6_IO14 0x80000000 69 MX6QDL_PAD_NANDF_CS1__GPIO6_IO14 0x80000000
70 >; 70 >;
71 }; 71 };
72 }; 72 };
@@ -97,6 +97,14 @@
97 status = "okay"; 97 status = "okay";
98}; 98};
99 99
100&uart2 {
101 pinctrl-names = "default";
102 pinctrl-0 = <&pinctrl_uart2_2>;
103 fsl,dte-mode;
104 fsl,uart-has-rtscts;
105 status = "okay";
106};
107
100&uart4 { 108&uart4 {
101 pinctrl-names = "default"; 109 pinctrl-names = "default";
102 pinctrl-0 = <&pinctrl_uart4_1>; 110 pinctrl-0 = <&pinctrl_uart4_1>;
diff --git a/arch/arm/boot/dts/imx6q-phytec-pfla02.dtsi b/arch/arm/boot/dts/imx6q-phytec-pfla02.dtsi
index f5e1981025ed..1a3b50d4d8fa 100644
--- a/arch/arm/boot/dts/imx6q-phytec-pfla02.dtsi
+++ b/arch/arm/boot/dts/imx6q-phytec-pfla02.dtsi
@@ -20,6 +20,110 @@
20 }; 20 };
21}; 21};
22 22
23&ecspi3 {
24 pinctrl-names = "default";
25 pinctrl-0 = <&pinctrl_ecspi3_1>;
26 status = "okay";
27 fsl,spi-num-chipselects = <1>;
28 cs-gpios = <&gpio4 24 0>;
29
30 flash@0 {
31 compatible = "m25p80";
32 spi-max-frequency = <20000000>;
33 reg = <0>;
34 };
35};
36
37&i2c1 {
38 pinctrl-names = "default";
39 pinctrl-0 = <&pinctrl_i2c1_1>;
40 status = "okay";
41
42 eeprom@50 {
43 compatible = "atmel,24c32";
44 reg = <0x50>;
45 };
46
47 pmic@58 {
48 compatible = "dialog,da9063";
49 reg = <0x58>;
50 interrupt-parent = <&gpio4>;
51 interrupts = <17 0x8>; /* active-low GPIO4_17 */
52
53 regulators {
54 vddcore_reg: bcore1 {
55 regulator-min-microvolt = <730000>;
56 regulator-max-microvolt = <1380000>;
57 regulator-always-on;
58 };
59
60 vddsoc_reg: bcore2 {
61 regulator-min-microvolt = <730000>;
62 regulator-max-microvolt = <1380000>;
63 regulator-always-on;
64 };
65
66 vdd_ddr3_reg: bpro {
67 regulator-min-microvolt = <1500000>;
68 regulator-max-microvolt = <1500000>;
69 regulator-always-on;
70 };
71
72 vdd_3v3_reg: bperi {
73 regulator-min-microvolt = <3300000>;
74 regulator-max-microvolt = <3300000>;
75 regulator-always-on;
76 };
77
78 vdd_buckmem_reg: bmem {
79 regulator-min-microvolt = <3300000>;
80 regulator-max-microvolt = <3300000>;
81 regulator-always-on;
82 };
83
84 vdd_eth_reg: bio {
85 regulator-min-microvolt = <1200000>;
86 regulator-max-microvolt = <1200000>;
87 regulator-always-on;
88 };
89
90 vdd_eth_io_reg: ldo4 {
91 regulator-min-microvolt = <2500000>;
92 regulator-max-microvolt = <2500000>;
93 regulator-always-on;
94 };
95
96 vdd_mx6_snvs_reg: ldo5 {
97 regulator-min-microvolt = <3000000>;
98 regulator-max-microvolt = <3000000>;
99 regulator-always-on;
100 };
101
102 vdd_3v3_pmic_io_reg: ldo6 {
103 regulator-min-microvolt = <3300000>;
104 regulator-max-microvolt = <3300000>;
105 regulator-always-on;
106 };
107
108 vdd_sd0_reg: ldo9 {
109 regulator-min-microvolt = <3300000>;
110 regulator-max-microvolt = <3300000>;
111 };
112
113 vdd_sd1_reg: ldo10 {
114 regulator-min-microvolt = <3300000>;
115 regulator-max-microvolt = <3300000>;
116 };
117
118 vdd_mx6_high_reg: ldo11 {
119 regulator-min-microvolt = <3000000>;
120 regulator-max-microvolt = <3000000>;
121 regulator-always-on;
122 };
123 };
124 };
125};
126
23&iomuxc { 127&iomuxc {
24 pinctrl-names = "default"; 128 pinctrl-names = "default";
25 pinctrl-0 = <&pinctrl_hog>; 129 pinctrl-0 = <&pinctrl_hog>;
@@ -27,7 +131,9 @@
27 hog { 131 hog {
28 pinctrl_hog: hoggrp { 132 pinctrl_hog: hoggrp {
29 fsl,pins = < 133 fsl,pins = <
30 MX6Q_PAD_EIM_D23__GPIO3_IO23 0x80000000 134 MX6QDL_PAD_EIM_D23__GPIO3_IO23 0x80000000
135 MX6QDL_PAD_DISP0_DAT3__GPIO4_IO24 0x80000000 /* SPI NOR chipselect */
136 MX6QDL_PAD_DI0_PIN15__GPIO4_IO17 0x80000000 /* PMIC interrupt */
31 >; 137 >;
32 }; 138 };
33 }; 139 };
@@ -35,8 +141,8 @@
35 pfla02 { 141 pfla02 {
36 pinctrl_usdhc3_pfla02: usdhc3grp-pfla02 { 142 pinctrl_usdhc3_pfla02: usdhc3grp-pfla02 {
37 fsl,pins = < 143 fsl,pins = <
38 MX6Q_PAD_ENET_RXD0__GPIO1_IO27 0x80000000 144 MX6QDL_PAD_ENET_RXD0__GPIO1_IO27 0x80000000
39 MX6Q_PAD_ENET_TXD1__GPIO1_IO29 0x80000000 145 MX6QDL_PAD_ENET_TXD1__GPIO1_IO29 0x80000000
40 >; 146 >;
41 }; 147 };
42 }; 148 };
diff --git a/arch/arm/boot/dts/imx6q-pinfunc.h b/arch/arm/boot/dts/imx6q-pinfunc.h
index faea6e1ada00..9bbe82bdee41 100644
--- a/arch/arm/boot/dts/imx6q-pinfunc.h
+++ b/arch/arm/boot/dts/imx6q-pinfunc.h
@@ -14,1028 +14,1032 @@
14 * The pin function ID is a tuple of 14 * The pin function ID is a tuple of
15 * <mux_reg conf_reg input_reg mux_mode input_val> 15 * <mux_reg conf_reg input_reg mux_mode input_val>
16 */ 16 */
17#define MX6Q_PAD_SD2_DAT1__SD2_DATA1 0x04c 0x360 0x000 0x0 0x0 17#define MX6QDL_PAD_SD2_DAT1__SD2_DATA1 0x04c 0x360 0x000 0x0 0x0
18#define MX6Q_PAD_SD2_DAT1__ECSPI5_SS0 0x04c 0x360 0x834 0x1 0x0 18#define MX6QDL_PAD_SD2_DAT1__ECSPI5_SS0 0x04c 0x360 0x834 0x1 0x0
19#define MX6Q_PAD_SD2_DAT1__EIM_CS2_B 0x04c 0x360 0x000 0x2 0x0 19#define MX6QDL_PAD_SD2_DAT1__EIM_CS2_B 0x04c 0x360 0x000 0x2 0x0
20#define MX6Q_PAD_SD2_DAT1__AUD4_TXFS 0x04c 0x360 0x7c8 0x3 0x0 20#define MX6QDL_PAD_SD2_DAT1__AUD4_TXFS 0x04c 0x360 0x7c8 0x3 0x0
21#define MX6Q_PAD_SD2_DAT1__KEY_COL7 0x04c 0x360 0x8f0 0x4 0x0 21#define MX6QDL_PAD_SD2_DAT1__KEY_COL7 0x04c 0x360 0x8f0 0x4 0x0
22#define MX6Q_PAD_SD2_DAT1__GPIO1_IO14 0x04c 0x360 0x000 0x5 0x0 22#define MX6QDL_PAD_SD2_DAT1__GPIO1_IO14 0x04c 0x360 0x000 0x5 0x0
23#define MX6Q_PAD_SD2_DAT2__SD2_DATA2 0x050 0x364 0x000 0x0 0x0 23#define MX6QDL_PAD_SD2_DAT2__SD2_DATA2 0x050 0x364 0x000 0x0 0x0
24#define MX6Q_PAD_SD2_DAT2__ECSPI5_SS1 0x050 0x364 0x838 0x1 0x0 24#define MX6QDL_PAD_SD2_DAT2__ECSPI5_SS1 0x050 0x364 0x838 0x1 0x0
25#define MX6Q_PAD_SD2_DAT2__EIM_CS3_B 0x050 0x364 0x000 0x2 0x0 25#define MX6QDL_PAD_SD2_DAT2__EIM_CS3_B 0x050 0x364 0x000 0x2 0x0
26#define MX6Q_PAD_SD2_DAT2__AUD4_TXD 0x050 0x364 0x7b8 0x3 0x0 26#define MX6QDL_PAD_SD2_DAT2__AUD4_TXD 0x050 0x364 0x7b8 0x3 0x0
27#define MX6Q_PAD_SD2_DAT2__KEY_ROW6 0x050 0x364 0x8f8 0x4 0x0 27#define MX6QDL_PAD_SD2_DAT2__KEY_ROW6 0x050 0x364 0x8f8 0x4 0x0
28#define MX6Q_PAD_SD2_DAT2__GPIO1_IO13 0x050 0x364 0x000 0x5 0x0 28#define MX6QDL_PAD_SD2_DAT2__GPIO1_IO13 0x050 0x364 0x000 0x5 0x0
29#define MX6Q_PAD_SD2_DAT0__SD2_DATA0 0x054 0x368 0x000 0x0 0x0 29#define MX6QDL_PAD_SD2_DAT0__SD2_DATA0 0x054 0x368 0x000 0x0 0x0
30#define MX6Q_PAD_SD2_DAT0__ECSPI5_MISO 0x054 0x368 0x82c 0x1 0x0 30#define MX6QDL_PAD_SD2_DAT0__ECSPI5_MISO 0x054 0x368 0x82c 0x1 0x0
31#define MX6Q_PAD_SD2_DAT0__AUD4_RXD 0x054 0x368 0x7b4 0x3 0x0 31#define MX6QDL_PAD_SD2_DAT0__AUD4_RXD 0x054 0x368 0x7b4 0x3 0x0
32#define MX6Q_PAD_SD2_DAT0__KEY_ROW7 0x054 0x368 0x8fc 0x4 0x0 32#define MX6QDL_PAD_SD2_DAT0__KEY_ROW7 0x054 0x368 0x8fc 0x4 0x0
33#define MX6Q_PAD_SD2_DAT0__GPIO1_IO15 0x054 0x368 0x000 0x5 0x0 33#define MX6QDL_PAD_SD2_DAT0__GPIO1_IO15 0x054 0x368 0x000 0x5 0x0
34#define MX6Q_PAD_SD2_DAT0__DCIC2_OUT 0x054 0x368 0x000 0x6 0x0 34#define MX6QDL_PAD_SD2_DAT0__DCIC2_OUT 0x054 0x368 0x000 0x6 0x0
35#define MX6Q_PAD_RGMII_TXC__USB_H2_DATA 0x058 0x36c 0x000 0x0 0x0 35#define MX6QDL_PAD_RGMII_TXC__USB_H2_DATA 0x058 0x36c 0x000 0x0 0x0
36#define MX6Q_PAD_RGMII_TXC__RGMII_TXC 0x058 0x36c 0x000 0x1 0x0 36#define MX6QDL_PAD_RGMII_TXC__RGMII_TXC 0x058 0x36c 0x000 0x1 0x0
37#define MX6Q_PAD_RGMII_TXC__SPDIF_EXT_CLK 0x058 0x36c 0x918 0x2 0x0 37#define MX6QDL_PAD_RGMII_TXC__SPDIF_EXT_CLK 0x058 0x36c 0x918 0x2 0x0
38#define MX6Q_PAD_RGMII_TXC__GPIO6_IO19 0x058 0x36c 0x000 0x5 0x0 38#define MX6QDL_PAD_RGMII_TXC__GPIO6_IO19 0x058 0x36c 0x000 0x5 0x0
39#define MX6Q_PAD_RGMII_TXC__XTALOSC_REF_CLK_24M 0x058 0x36c 0x000 0x7 0x0 39#define MX6QDL_PAD_RGMII_TXC__XTALOSC_REF_CLK_24M 0x058 0x36c 0x000 0x7 0x0
40#define MX6Q_PAD_RGMII_TD0__HSI_TX_READY 0x05c 0x370 0x000 0x0 0x0 40#define MX6QDL_PAD_RGMII_TD0__HSI_TX_READY 0x05c 0x370 0x000 0x0 0x0
41#define MX6Q_PAD_RGMII_TD0__RGMII_TD0 0x05c 0x370 0x000 0x1 0x0 41#define MX6QDL_PAD_RGMII_TD0__RGMII_TD0 0x05c 0x370 0x000 0x1 0x0
42#define MX6Q_PAD_RGMII_TD0__GPIO6_IO20 0x05c 0x370 0x000 0x5 0x0 42#define MX6QDL_PAD_RGMII_TD0__GPIO6_IO20 0x05c 0x370 0x000 0x5 0x0
43#define MX6Q_PAD_RGMII_TD1__HSI_RX_FLAG 0x060 0x374 0x000 0x0 0x0 43#define MX6QDL_PAD_RGMII_TD1__HSI_RX_FLAG 0x060 0x374 0x000 0x0 0x0
44#define MX6Q_PAD_RGMII_TD1__RGMII_TD1 0x060 0x374 0x000 0x1 0x0 44#define MX6QDL_PAD_RGMII_TD1__RGMII_TD1 0x060 0x374 0x000 0x1 0x0
45#define MX6Q_PAD_RGMII_TD1__GPIO6_IO21 0x060 0x374 0x000 0x5 0x0 45#define MX6QDL_PAD_RGMII_TD1__GPIO6_IO21 0x060 0x374 0x000 0x5 0x0
46#define MX6Q_PAD_RGMII_TD2__HSI_RX_DATA 0x064 0x378 0x000 0x0 0x0 46#define MX6QDL_PAD_RGMII_TD2__HSI_RX_DATA 0x064 0x378 0x000 0x0 0x0
47#define MX6Q_PAD_RGMII_TD2__RGMII_TD2 0x064 0x378 0x000 0x1 0x0 47#define MX6QDL_PAD_RGMII_TD2__RGMII_TD2 0x064 0x378 0x000 0x1 0x0
48#define MX6Q_PAD_RGMII_TD2__GPIO6_IO22 0x064 0x378 0x000 0x5 0x0 48#define MX6QDL_PAD_RGMII_TD2__GPIO6_IO22 0x064 0x378 0x000 0x5 0x0
49#define MX6Q_PAD_RGMII_TD3__HSI_RX_WAKE 0x068 0x37c 0x000 0x0 0x0 49#define MX6QDL_PAD_RGMII_TD3__HSI_RX_WAKE 0x068 0x37c 0x000 0x0 0x0
50#define MX6Q_PAD_RGMII_TD3__RGMII_TD3 0x068 0x37c 0x000 0x1 0x0 50#define MX6QDL_PAD_RGMII_TD3__RGMII_TD3 0x068 0x37c 0x000 0x1 0x0
51#define MX6Q_PAD_RGMII_TD3__GPIO6_IO23 0x068 0x37c 0x000 0x5 0x0 51#define MX6QDL_PAD_RGMII_TD3__GPIO6_IO23 0x068 0x37c 0x000 0x5 0x0
52#define MX6Q_PAD_RGMII_RX_CTL__USB_H3_DATA 0x06c 0x380 0x000 0x0 0x0 52#define MX6QDL_PAD_RGMII_RX_CTL__USB_H3_DATA 0x06c 0x380 0x000 0x0 0x0
53#define MX6Q_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x06c 0x380 0x858 0x1 0x0 53#define MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x06c 0x380 0x858 0x1 0x0
54#define MX6Q_PAD_RGMII_RX_CTL__GPIO6_IO24 0x06c 0x380 0x000 0x5 0x0 54#define MX6QDL_PAD_RGMII_RX_CTL__GPIO6_IO24 0x06c 0x380 0x000 0x5 0x0
55#define MX6Q_PAD_RGMII_RD0__HSI_RX_READY 0x070 0x384 0x000 0x0 0x0 55#define MX6QDL_PAD_RGMII_RD0__HSI_RX_READY 0x070 0x384 0x000 0x0 0x0
56#define MX6Q_PAD_RGMII_RD0__RGMII_RD0 0x070 0x384 0x848 0x1 0x0 56#define MX6QDL_PAD_RGMII_RD0__RGMII_RD0 0x070 0x384 0x848 0x1 0x0
57#define MX6Q_PAD_RGMII_RD0__GPIO6_IO25 0x070 0x384 0x000 0x5 0x0 57#define MX6QDL_PAD_RGMII_RD0__GPIO6_IO25 0x070 0x384 0x000 0x5 0x0
58#define MX6Q_PAD_RGMII_TX_CTL__USB_H2_STROBE 0x074 0x388 0x000 0x0 0x0 58#define MX6QDL_PAD_RGMII_TX_CTL__USB_H2_STROBE 0x074 0x388 0x000 0x0 0x0
59#define MX6Q_PAD_RGMII_TX_CTL__RGMII_TX_CTL 0x074 0x388 0x000 0x1 0x0 59#define MX6QDL_PAD_RGMII_TX_CTL__RGMII_TX_CTL 0x074 0x388 0x000 0x1 0x0
60#define MX6Q_PAD_RGMII_TX_CTL__GPIO6_IO26 0x074 0x388 0x000 0x5 0x0 60#define MX6QDL_PAD_RGMII_TX_CTL__GPIO6_IO26 0x074 0x388 0x000 0x5 0x0
61#define MX6Q_PAD_RGMII_TX_CTL__ENET_REF_CLK 0x074 0x388 0x83c 0x7 0x0 61#define MX6QDL_PAD_RGMII_TX_CTL__ENET_REF_CLK 0x074 0x388 0x83c 0x7 0x0
62#define MX6Q_PAD_RGMII_RD1__HSI_TX_FLAG 0x078 0x38c 0x000 0x0 0x0 62#define MX6QDL_PAD_RGMII_RD1__HSI_TX_FLAG 0x078 0x38c 0x000 0x0 0x0
63#define MX6Q_PAD_RGMII_RD1__RGMII_RD1 0x078 0x38c 0x84c 0x1 0x0 63#define MX6QDL_PAD_RGMII_RD1__RGMII_RD1 0x078 0x38c 0x84c 0x1 0x0
64#define MX6Q_PAD_RGMII_RD1__GPIO6_IO27 0x078 0x38c 0x000 0x5 0x0 64#define MX6QDL_PAD_RGMII_RD1__GPIO6_IO27 0x078 0x38c 0x000 0x5 0x0
65#define MX6Q_PAD_RGMII_RD2__HSI_TX_DATA 0x07c 0x390 0x000 0x0 0x0 65#define MX6QDL_PAD_RGMII_RD2__HSI_TX_DATA 0x07c 0x390 0x000 0x0 0x0
66#define MX6Q_PAD_RGMII_RD2__RGMII_RD2 0x07c 0x390 0x850 0x1 0x0 66#define MX6QDL_PAD_RGMII_RD2__RGMII_RD2 0x07c 0x390 0x850 0x1 0x0
67#define MX6Q_PAD_RGMII_RD2__GPIO6_IO28 0x07c 0x390 0x000 0x5 0x0 67#define MX6QDL_PAD_RGMII_RD2__GPIO6_IO28 0x07c 0x390 0x000 0x5 0x0
68#define MX6Q_PAD_RGMII_RD3__HSI_TX_WAKE 0x080 0x394 0x000 0x0 0x0 68#define MX6QDL_PAD_RGMII_RD3__HSI_TX_WAKE 0x080 0x394 0x000 0x0 0x0
69#define MX6Q_PAD_RGMII_RD3__RGMII_RD3 0x080 0x394 0x854 0x1 0x0 69#define MX6QDL_PAD_RGMII_RD3__RGMII_RD3 0x080 0x394 0x854 0x1 0x0
70#define MX6Q_PAD_RGMII_RD3__GPIO6_IO29 0x080 0x394 0x000 0x5 0x0 70#define MX6QDL_PAD_RGMII_RD3__GPIO6_IO29 0x080 0x394 0x000 0x5 0x0
71#define MX6Q_PAD_RGMII_RXC__USB_H3_STROBE 0x084 0x398 0x000 0x0 0x0 71#define MX6QDL_PAD_RGMII_RXC__USB_H3_STROBE 0x084 0x398 0x000 0x0 0x0
72#define MX6Q_PAD_RGMII_RXC__RGMII_RXC 0x084 0x398 0x844 0x1 0x0 72#define MX6QDL_PAD_RGMII_RXC__RGMII_RXC 0x084 0x398 0x844 0x1 0x0
73#define MX6Q_PAD_RGMII_RXC__GPIO6_IO30 0x084 0x398 0x000 0x5 0x0 73#define MX6QDL_PAD_RGMII_RXC__GPIO6_IO30 0x084 0x398 0x000 0x5 0x0
74#define MX6Q_PAD_EIM_A25__EIM_ADDR25 0x088 0x39c 0x000 0x0 0x0 74#define MX6QDL_PAD_EIM_A25__EIM_ADDR25 0x088 0x39c 0x000 0x0 0x0
75#define MX6Q_PAD_EIM_A25__ECSPI4_SS1 0x088 0x39c 0x000 0x1 0x0 75#define MX6QDL_PAD_EIM_A25__ECSPI4_SS1 0x088 0x39c 0x000 0x1 0x0
76#define MX6Q_PAD_EIM_A25__ECSPI2_RDY 0x088 0x39c 0x000 0x2 0x0 76#define MX6QDL_PAD_EIM_A25__ECSPI2_RDY 0x088 0x39c 0x000 0x2 0x0
77#define MX6Q_PAD_EIM_A25__IPU1_DI1_PIN12 0x088 0x39c 0x000 0x3 0x0 77#define MX6QDL_PAD_EIM_A25__IPU1_DI1_PIN12 0x088 0x39c 0x000 0x3 0x0
78#define MX6Q_PAD_EIM_A25__IPU1_DI0_D1_CS 0x088 0x39c 0x000 0x4 0x0 78#define MX6QDL_PAD_EIM_A25__IPU1_DI0_D1_CS 0x088 0x39c 0x000 0x4 0x0
79#define MX6Q_PAD_EIM_A25__GPIO5_IO02 0x088 0x39c 0x000 0x5 0x0 79#define MX6QDL_PAD_EIM_A25__GPIO5_IO02 0x088 0x39c 0x000 0x5 0x0
80#define MX6Q_PAD_EIM_A25__HDMI_TX_CEC_LINE 0x088 0x39c 0x88c 0x6 0x0 80#define MX6QDL_PAD_EIM_A25__HDMI_TX_CEC_LINE 0x088 0x39c 0x88c 0x6 0x0
81#define MX6Q_PAD_EIM_EB2__EIM_EB2_B 0x08c 0x3a0 0x000 0x0 0x0 81#define MX6QDL_PAD_EIM_EB2__EIM_EB2_B 0x08c 0x3a0 0x000 0x0 0x0
82#define MX6Q_PAD_EIM_EB2__ECSPI1_SS0 0x08c 0x3a0 0x800 0x1 0x0 82#define MX6QDL_PAD_EIM_EB2__ECSPI1_SS0 0x08c 0x3a0 0x800 0x1 0x0
83#define MX6Q_PAD_EIM_EB2__IPU2_CSI1_DATA19 0x08c 0x3a0 0x8d4 0x3 0x0 83#define MX6QDL_PAD_EIM_EB2__IPU2_CSI1_DATA19 0x08c 0x3a0 0x8d4 0x3 0x0
84#define MX6Q_PAD_EIM_EB2__HDMI_TX_DDC_SCL 0x08c 0x3a0 0x890 0x4 0x0 84#define MX6QDL_PAD_EIM_EB2__HDMI_TX_DDC_SCL 0x08c 0x3a0 0x890 0x4 0x0
85#define MX6Q_PAD_EIM_EB2__GPIO2_IO30 0x08c 0x3a0 0x000 0x5 0x0 85#define MX6QDL_PAD_EIM_EB2__GPIO2_IO30 0x08c 0x3a0 0x000 0x5 0x0
86#define MX6Q_PAD_EIM_EB2__I2C2_SCL 0x08c 0x3a0 0x8a0 0x6 0x0 86#define MX6QDL_PAD_EIM_EB2__I2C2_SCL 0x08c 0x3a0 0x8a0 0x6 0x0
87#define MX6Q_PAD_EIM_EB2__SRC_BOOT_CFG30 0x08c 0x3a0 0x000 0x7 0x0 87#define MX6QDL_PAD_EIM_EB2__SRC_BOOT_CFG30 0x08c 0x3a0 0x000 0x7 0x0
88#define MX6Q_PAD_EIM_D16__EIM_DATA16 0x090 0x3a4 0x000 0x0 0x0 88#define MX6QDL_PAD_EIM_D16__EIM_DATA16 0x090 0x3a4 0x000 0x0 0x0
89#define MX6Q_PAD_EIM_D16__ECSPI1_SCLK 0x090 0x3a4 0x7f4 0x1 0x0 89#define MX6QDL_PAD_EIM_D16__ECSPI1_SCLK 0x090 0x3a4 0x7f4 0x1 0x0
90#define MX6Q_PAD_EIM_D16__IPU1_DI0_PIN05 0x090 0x3a4 0x000 0x2 0x0 90#define MX6QDL_PAD_EIM_D16__IPU1_DI0_PIN05 0x090 0x3a4 0x000 0x2 0x0
91#define MX6Q_PAD_EIM_D16__IPU2_CSI1_DATA18 0x090 0x3a4 0x8d0 0x3 0x0 91#define MX6QDL_PAD_EIM_D16__IPU2_CSI1_DATA18 0x090 0x3a4 0x8d0 0x3 0x0
92#define MX6Q_PAD_EIM_D16__HDMI_TX_DDC_SDA 0x090 0x3a4 0x894 0x4 0x0 92#define MX6QDL_PAD_EIM_D16__HDMI_TX_DDC_SDA 0x090 0x3a4 0x894 0x4 0x0
93#define MX6Q_PAD_EIM_D16__GPIO3_IO16 0x090 0x3a4 0x000 0x5 0x0 93#define MX6QDL_PAD_EIM_D16__GPIO3_IO16 0x090 0x3a4 0x000 0x5 0x0
94#define MX6Q_PAD_EIM_D16__I2C2_SDA 0x090 0x3a4 0x8a4 0x6 0x0 94#define MX6QDL_PAD_EIM_D16__I2C2_SDA 0x090 0x3a4 0x8a4 0x6 0x0
95#define MX6Q_PAD_EIM_D17__EIM_DATA17 0x094 0x3a8 0x000 0x0 0x0 95#define MX6QDL_PAD_EIM_D17__EIM_DATA17 0x094 0x3a8 0x000 0x0 0x0
96#define MX6Q_PAD_EIM_D17__ECSPI1_MISO 0x094 0x3a8 0x7f8 0x1 0x0 96#define MX6QDL_PAD_EIM_D17__ECSPI1_MISO 0x094 0x3a8 0x7f8 0x1 0x0
97#define MX6Q_PAD_EIM_D17__IPU1_DI0_PIN06 0x094 0x3a8 0x000 0x2 0x0 97#define MX6QDL_PAD_EIM_D17__IPU1_DI0_PIN06 0x094 0x3a8 0x000 0x2 0x0
98#define MX6Q_PAD_EIM_D17__IPU2_CSI1_PIXCLK 0x094 0x3a8 0x8e0 0x3 0x0 98#define MX6QDL_PAD_EIM_D17__IPU2_CSI1_PIXCLK 0x094 0x3a8 0x8e0 0x3 0x0
99#define MX6Q_PAD_EIM_D17__DCIC1_OUT 0x094 0x3a8 0x000 0x4 0x0 99#define MX6QDL_PAD_EIM_D17__DCIC1_OUT 0x094 0x3a8 0x000 0x4 0x0
100#define MX6Q_PAD_EIM_D17__GPIO3_IO17 0x094 0x3a8 0x000 0x5 0x0 100#define MX6QDL_PAD_EIM_D17__GPIO3_IO17 0x094 0x3a8 0x000 0x5 0x0
101#define MX6Q_PAD_EIM_D17__I2C3_SCL 0x094 0x3a8 0x8a8 0x6 0x0 101#define MX6QDL_PAD_EIM_D17__I2C3_SCL 0x094 0x3a8 0x8a8 0x6 0x0
102#define MX6Q_PAD_EIM_D18__EIM_DATA18 0x098 0x3ac 0x000 0x0 0x0 102#define MX6QDL_PAD_EIM_D18__EIM_DATA18 0x098 0x3ac 0x000 0x0 0x0
103#define MX6Q_PAD_EIM_D18__ECSPI1_MOSI 0x098 0x3ac 0x7fc 0x1 0x0 103#define MX6QDL_PAD_EIM_D18__ECSPI1_MOSI 0x098 0x3ac 0x7fc 0x1 0x0
104#define MX6Q_PAD_EIM_D18__IPU1_DI0_PIN07 0x098 0x3ac 0x000 0x2 0x0 104#define MX6QDL_PAD_EIM_D18__IPU1_DI0_PIN07 0x098 0x3ac 0x000 0x2 0x0
105#define MX6Q_PAD_EIM_D18__IPU2_CSI1_DATA17 0x098 0x3ac 0x8cc 0x3 0x0 105#define MX6QDL_PAD_EIM_D18__IPU2_CSI1_DATA17 0x098 0x3ac 0x8cc 0x3 0x0
106#define MX6Q_PAD_EIM_D18__IPU1_DI1_D0_CS 0x098 0x3ac 0x000 0x4 0x0 106#define MX6QDL_PAD_EIM_D18__IPU1_DI1_D0_CS 0x098 0x3ac 0x000 0x4 0x0
107#define MX6Q_PAD_EIM_D18__GPIO3_IO18 0x098 0x3ac 0x000 0x5 0x0 107#define MX6QDL_PAD_EIM_D18__GPIO3_IO18 0x098 0x3ac 0x000 0x5 0x0
108#define MX6Q_PAD_EIM_D18__I2C3_SDA 0x098 0x3ac 0x8ac 0x6 0x0 108#define MX6QDL_PAD_EIM_D18__I2C3_SDA 0x098 0x3ac 0x8ac 0x6 0x0
109#define MX6Q_PAD_EIM_D19__EIM_DATA19 0x09c 0x3b0 0x000 0x0 0x0 109#define MX6QDL_PAD_EIM_D19__EIM_DATA19 0x09c 0x3b0 0x000 0x0 0x0
110#define MX6Q_PAD_EIM_D19__ECSPI1_SS1 0x09c 0x3b0 0x804 0x1 0x0 110#define MX6QDL_PAD_EIM_D19__ECSPI1_SS1 0x09c 0x3b0 0x804 0x1 0x0
111#define MX6Q_PAD_EIM_D19__IPU1_DI0_PIN08 0x09c 0x3b0 0x000 0x2 0x0 111#define MX6QDL_PAD_EIM_D19__IPU1_DI0_PIN08 0x09c 0x3b0 0x000 0x2 0x0
112#define MX6Q_PAD_EIM_D19__IPU2_CSI1_DATA16 0x09c 0x3b0 0x8c8 0x3 0x0 112#define MX6QDL_PAD_EIM_D19__IPU2_CSI1_DATA16 0x09c 0x3b0 0x8c8 0x3 0x0
113#define MX6Q_PAD_EIM_D19__UART1_CTS_B 0x09c 0x3b0 0x000 0x4 0x0 113#define MX6QDL_PAD_EIM_D19__UART1_CTS_B 0x09c 0x3b0 0x000 0x4 0x0
114#define MX6Q_PAD_EIM_D19__UART1_RTS_B 0x09c 0x3b0 0x91c 0x4 0x0 114#define MX6QDL_PAD_EIM_D19__UART1_RTS_B 0x09c 0x3b0 0x91c 0x4 0x0
115#define MX6Q_PAD_EIM_D19__GPIO3_IO19 0x09c 0x3b0 0x000 0x5 0x0 115#define MX6QDL_PAD_EIM_D19__GPIO3_IO19 0x09c 0x3b0 0x000 0x5 0x0
116#define MX6Q_PAD_EIM_D19__EPIT1_OUT 0x09c 0x3b0 0x000 0x6 0x0 116#define MX6QDL_PAD_EIM_D19__EPIT1_OUT 0x09c 0x3b0 0x000 0x6 0x0
117#define MX6Q_PAD_EIM_D20__EIM_DATA20 0x0a0 0x3b4 0x000 0x0 0x0 117#define MX6QDL_PAD_EIM_D20__EIM_DATA20 0x0a0 0x3b4 0x000 0x0 0x0
118#define MX6Q_PAD_EIM_D20__ECSPI4_SS0 0x0a0 0x3b4 0x824 0x1 0x0 118#define MX6QDL_PAD_EIM_D20__ECSPI4_SS0 0x0a0 0x3b4 0x824 0x1 0x0
119#define MX6Q_PAD_EIM_D20__IPU1_DI0_PIN16 0x0a0 0x3b4 0x000 0x2 0x0 119#define MX6QDL_PAD_EIM_D20__IPU1_DI0_PIN16 0x0a0 0x3b4 0x000 0x2 0x0
120#define MX6Q_PAD_EIM_D20__IPU2_CSI1_DATA15 0x0a0 0x3b4 0x8c4 0x3 0x0 120#define MX6QDL_PAD_EIM_D20__IPU2_CSI1_DATA15 0x0a0 0x3b4 0x8c4 0x3 0x0
121#define MX6Q_PAD_EIM_D20__UART1_RTS_B 0x0a0 0x3b4 0x91c 0x4 0x1 121#define MX6QDL_PAD_EIM_D20__UART1_RTS_B 0x0a0 0x3b4 0x91c 0x4 0x1
122#define MX6Q_PAD_EIM_D20__UART1_CTS_B 0x0a0 0x3b4 0x000 0x4 0x0 122#define MX6QDL_PAD_EIM_D20__UART1_CTS_B 0x0a0 0x3b4 0x000 0x4 0x0
123#define MX6Q_PAD_EIM_D20__GPIO3_IO20 0x0a0 0x3b4 0x000 0x5 0x0 123#define MX6QDL_PAD_EIM_D20__GPIO3_IO20 0x0a0 0x3b4 0x000 0x5 0x0
124#define MX6Q_PAD_EIM_D20__EPIT2_OUT 0x0a0 0x3b4 0x000 0x6 0x0 124#define MX6QDL_PAD_EIM_D20__EPIT2_OUT 0x0a0 0x3b4 0x000 0x6 0x0
125#define MX6Q_PAD_EIM_D21__EIM_DATA21 0x0a4 0x3b8 0x000 0x0 0x0 125#define MX6QDL_PAD_EIM_D21__EIM_DATA21 0x0a4 0x3b8 0x000 0x0 0x0
126#define MX6Q_PAD_EIM_D21__ECSPI4_SCLK 0x0a4 0x3b8 0x000 0x1 0x0 126#define MX6QDL_PAD_EIM_D21__ECSPI4_SCLK 0x0a4 0x3b8 0x000 0x1 0x0
127#define MX6Q_PAD_EIM_D21__IPU1_DI0_PIN17 0x0a4 0x3b8 0x000 0x2 0x0 127#define MX6QDL_PAD_EIM_D21__IPU1_DI0_PIN17 0x0a4 0x3b8 0x000 0x2 0x0
128#define MX6Q_PAD_EIM_D21__IPU2_CSI1_DATA11 0x0a4 0x3b8 0x8b4 0x3 0x0 128#define MX6QDL_PAD_EIM_D21__IPU2_CSI1_DATA11 0x0a4 0x3b8 0x8b4 0x3 0x0
129#define MX6Q_PAD_EIM_D21__USB_OTG_OC 0x0a4 0x3b8 0x944 0x4 0x0 129#define MX6QDL_PAD_EIM_D21__USB_OTG_OC 0x0a4 0x3b8 0x944 0x4 0x0
130#define MX6Q_PAD_EIM_D21__GPIO3_IO21 0x0a4 0x3b8 0x000 0x5 0x0 130#define MX6QDL_PAD_EIM_D21__GPIO3_IO21 0x0a4 0x3b8 0x000 0x5 0x0
131#define MX6Q_PAD_EIM_D21__I2C1_SCL 0x0a4 0x3b8 0x898 0x6 0x0 131#define MX6QDL_PAD_EIM_D21__I2C1_SCL 0x0a4 0x3b8 0x898 0x6 0x0
132#define MX6Q_PAD_EIM_D21__SPDIF_IN 0x0a4 0x3b8 0x914 0x7 0x0 132#define MX6QDL_PAD_EIM_D21__SPDIF_IN 0x0a4 0x3b8 0x914 0x7 0x0
133#define MX6Q_PAD_EIM_D22__EIM_DATA22 0x0a8 0x3bc 0x000 0x0 0x0 133#define MX6QDL_PAD_EIM_D22__EIM_DATA22 0x0a8 0x3bc 0x000 0x0 0x0
134#define MX6Q_PAD_EIM_D22__ECSPI4_MISO 0x0a8 0x3bc 0x000 0x1 0x0 134#define MX6QDL_PAD_EIM_D22__ECSPI4_MISO 0x0a8 0x3bc 0x000 0x1 0x0
135#define MX6Q_PAD_EIM_D22__IPU1_DI0_PIN01 0x0a8 0x3bc 0x000 0x2 0x0 135#define MX6QDL_PAD_EIM_D22__IPU1_DI0_PIN01 0x0a8 0x3bc 0x000 0x2 0x0
136#define MX6Q_PAD_EIM_D22__IPU2_CSI1_DATA10 0x0a8 0x3bc 0x8b0 0x3 0x0 136#define MX6QDL_PAD_EIM_D22__IPU2_CSI1_DATA10 0x0a8 0x3bc 0x8b0 0x3 0x0
137#define MX6Q_PAD_EIM_D22__USB_OTG_PWR 0x0a8 0x3bc 0x000 0x4 0x0 137#define MX6QDL_PAD_EIM_D22__USB_OTG_PWR 0x0a8 0x3bc 0x000 0x4 0x0
138#define MX6Q_PAD_EIM_D22__GPIO3_IO22 0x0a8 0x3bc 0x000 0x5 0x0 138#define MX6QDL_PAD_EIM_D22__GPIO3_IO22 0x0a8 0x3bc 0x000 0x5 0x0
139#define MX6Q_PAD_EIM_D22__SPDIF_OUT 0x0a8 0x3bc 0x000 0x6 0x0 139#define MX6QDL_PAD_EIM_D22__SPDIF_OUT 0x0a8 0x3bc 0x000 0x6 0x0
140#define MX6Q_PAD_EIM_D23__EIM_DATA23 0x0ac 0x3c0 0x000 0x0 0x0 140#define MX6QDL_PAD_EIM_D23__EIM_DATA23 0x0ac 0x3c0 0x000 0x0 0x0
141#define MX6Q_PAD_EIM_D23__IPU1_DI0_D0_CS 0x0ac 0x3c0 0x000 0x1 0x0 141#define MX6QDL_PAD_EIM_D23__IPU1_DI0_D0_CS 0x0ac 0x3c0 0x000 0x1 0x0
142#define MX6Q_PAD_EIM_D23__UART3_CTS_B 0x0ac 0x3c0 0x000 0x2 0x0 142#define MX6QDL_PAD_EIM_D23__UART3_CTS_B 0x0ac 0x3c0 0x000 0x2 0x0
143#define MX6Q_PAD_EIM_D23__UART3_RTS_B 0x0ac 0x3c0 0x92c 0x2 0x0 143#define MX6QDL_PAD_EIM_D23__UART3_RTS_B 0x0ac 0x3c0 0x92c 0x2 0x0
144#define MX6Q_PAD_EIM_D23__UART1_DCD_B 0x0ac 0x3c0 0x000 0x3 0x0 144#define MX6QDL_PAD_EIM_D23__UART1_DCD_B 0x0ac 0x3c0 0x000 0x3 0x0
145#define MX6Q_PAD_EIM_D23__IPU2_CSI1_DATA_EN 0x0ac 0x3c0 0x8d8 0x4 0x0 145#define MX6QDL_PAD_EIM_D23__IPU2_CSI1_DATA_EN 0x0ac 0x3c0 0x8d8 0x4 0x0
146#define MX6Q_PAD_EIM_D23__GPIO3_IO23 0x0ac 0x3c0 0x000 0x5 0x0 146#define MX6QDL_PAD_EIM_D23__GPIO3_IO23 0x0ac 0x3c0 0x000 0x5 0x0
147#define MX6Q_PAD_EIM_D23__IPU1_DI1_PIN02 0x0ac 0x3c0 0x000 0x6 0x0 147#define MX6QDL_PAD_EIM_D23__IPU1_DI1_PIN02 0x0ac 0x3c0 0x000 0x6 0x0
148#define MX6Q_PAD_EIM_D23__IPU1_DI1_PIN14 0x0ac 0x3c0 0x000 0x7 0x0 148#define MX6QDL_PAD_EIM_D23__IPU1_DI1_PIN14 0x0ac 0x3c0 0x000 0x7 0x0
149#define MX6Q_PAD_EIM_EB3__EIM_EB3_B 0x0b0 0x3c4 0x000 0x0 0x0 149#define MX6QDL_PAD_EIM_EB3__EIM_EB3_B 0x0b0 0x3c4 0x000 0x0 0x0
150#define MX6Q_PAD_EIM_EB3__ECSPI4_RDY 0x0b0 0x3c4 0x000 0x1 0x0 150#define MX6QDL_PAD_EIM_EB3__ECSPI4_RDY 0x0b0 0x3c4 0x000 0x1 0x0
151#define MX6Q_PAD_EIM_EB3__UART3_RTS_B 0x0b0 0x3c4 0x92c 0x2 0x1 151#define MX6QDL_PAD_EIM_EB3__UART3_RTS_B 0x0b0 0x3c4 0x92c 0x2 0x1
152#define MX6Q_PAD_EIM_EB3__UART3_CTS_B 0x0b0 0x3c4 0x000 0x2 0x0 152#define MX6QDL_PAD_EIM_EB3__UART3_CTS_B 0x0b0 0x3c4 0x000 0x2 0x0
153#define MX6Q_PAD_EIM_EB3__UART1_RI_B 0x0b0 0x3c4 0x000 0x3 0x0 153#define MX6QDL_PAD_EIM_EB3__UART1_RI_B 0x0b0 0x3c4 0x000 0x3 0x0
154#define MX6Q_PAD_EIM_EB3__IPU2_CSI1_HSYNC 0x0b0 0x3c4 0x8dc 0x4 0x0 154#define MX6QDL_PAD_EIM_EB3__IPU2_CSI1_HSYNC 0x0b0 0x3c4 0x8dc 0x4 0x0
155#define MX6Q_PAD_EIM_EB3__GPIO2_IO31 0x0b0 0x3c4 0x000 0x5 0x0 155#define MX6QDL_PAD_EIM_EB3__GPIO2_IO31 0x0b0 0x3c4 0x000 0x5 0x0
156#define MX6Q_PAD_EIM_EB3__IPU1_DI1_PIN03 0x0b0 0x3c4 0x000 0x6 0x0 156#define MX6QDL_PAD_EIM_EB3__IPU1_DI1_PIN03 0x0b0 0x3c4 0x000 0x6 0x0
157#define MX6Q_PAD_EIM_EB3__SRC_BOOT_CFG31 0x0b0 0x3c4 0x000 0x7 0x0 157#define MX6QDL_PAD_EIM_EB3__SRC_BOOT_CFG31 0x0b0 0x3c4 0x000 0x7 0x0
158#define MX6Q_PAD_EIM_D24__EIM_DATA24 0x0b4 0x3c8 0x000 0x0 0x0 158#define MX6QDL_PAD_EIM_D24__EIM_DATA24 0x0b4 0x3c8 0x000 0x0 0x0
159#define MX6Q_PAD_EIM_D24__ECSPI4_SS2 0x0b4 0x3c8 0x000 0x1 0x0 159#define MX6QDL_PAD_EIM_D24__ECSPI4_SS2 0x0b4 0x3c8 0x000 0x1 0x0
160#define MX6Q_PAD_EIM_D24__UART3_TX_DATA 0x0b4 0x3c8 0x000 0x2 0x0 160#define MX6QDL_PAD_EIM_D24__UART3_TX_DATA 0x0b4 0x3c8 0x000 0x2 0x0
161#define MX6Q_PAD_EIM_D24__UART3_RX_DATA 0x0b4 0x3c8 0x930 0x2 0x0 161#define MX6QDL_PAD_EIM_D24__UART3_RX_DATA 0x0b4 0x3c8 0x930 0x2 0x0
162#define MX6Q_PAD_EIM_D24__ECSPI1_SS2 0x0b4 0x3c8 0x808 0x3 0x0 162#define MX6QDL_PAD_EIM_D24__ECSPI1_SS2 0x0b4 0x3c8 0x808 0x3 0x0
163#define MX6Q_PAD_EIM_D24__ECSPI2_SS2 0x0b4 0x3c8 0x000 0x4 0x0 163#define MX6QDL_PAD_EIM_D24__ECSPI2_SS2 0x0b4 0x3c8 0x000 0x4 0x0
164#define MX6Q_PAD_EIM_D24__GPIO3_IO24 0x0b4 0x3c8 0x000 0x5 0x0 164#define MX6QDL_PAD_EIM_D24__GPIO3_IO24 0x0b4 0x3c8 0x000 0x5 0x0
165#define MX6Q_PAD_EIM_D24__AUD5_RXFS 0x0b4 0x3c8 0x7d8 0x6 0x0 165#define MX6QDL_PAD_EIM_D24__AUD5_RXFS 0x0b4 0x3c8 0x7d8 0x6 0x0
166#define MX6Q_PAD_EIM_D24__UART1_DTR_B 0x0b4 0x3c8 0x000 0x7 0x0 166#define MX6QDL_PAD_EIM_D24__UART1_DTR_B 0x0b4 0x3c8 0x000 0x7 0x0
167#define MX6Q_PAD_EIM_D25__EIM_DATA25 0x0b8 0x3cc 0x000 0x0 0x0 167#define MX6QDL_PAD_EIM_D25__EIM_DATA25 0x0b8 0x3cc 0x000 0x0 0x0
168#define MX6Q_PAD_EIM_D25__ECSPI4_SS3 0x0b8 0x3cc 0x000 0x1 0x0 168#define MX6QDL_PAD_EIM_D25__ECSPI4_SS3 0x0b8 0x3cc 0x000 0x1 0x0
169#define MX6Q_PAD_EIM_D25__UART3_RX_DATA 0x0b8 0x3cc 0x930 0x2 0x1 169#define MX6QDL_PAD_EIM_D25__UART3_RX_DATA 0x0b8 0x3cc 0x930 0x2 0x1
170#define MX6Q_PAD_EIM_D25__UART3_TX_DATA 0x0b8 0x3cc 0x000 0x2 0x0 170#define MX6QDL_PAD_EIM_D25__UART3_TX_DATA 0x0b8 0x3cc 0x000 0x2 0x0
171#define MX6Q_PAD_EIM_D25__ECSPI1_SS3 0x0b8 0x3cc 0x80c 0x3 0x0 171#define MX6QDL_PAD_EIM_D25__ECSPI1_SS3 0x0b8 0x3cc 0x80c 0x3 0x0
172#define MX6Q_PAD_EIM_D25__ECSPI2_SS3 0x0b8 0x3cc 0x000 0x4 0x0 172#define MX6QDL_PAD_EIM_D25__ECSPI2_SS3 0x0b8 0x3cc 0x000 0x4 0x0
173#define MX6Q_PAD_EIM_D25__GPIO3_IO25 0x0b8 0x3cc 0x000 0x5 0x0 173#define MX6QDL_PAD_EIM_D25__GPIO3_IO25 0x0b8 0x3cc 0x000 0x5 0x0
174#define MX6Q_PAD_EIM_D25__AUD5_RXC 0x0b8 0x3cc 0x7d4 0x6 0x0 174#define MX6QDL_PAD_EIM_D25__AUD5_RXC 0x0b8 0x3cc 0x7d4 0x6 0x0
175#define MX6Q_PAD_EIM_D25__UART1_DSR_B 0x0b8 0x3cc 0x000 0x7 0x0 175#define MX6QDL_PAD_EIM_D25__UART1_DSR_B 0x0b8 0x3cc 0x000 0x7 0x0
176#define MX6Q_PAD_EIM_D26__EIM_DATA26 0x0bc 0x3d0 0x000 0x0 0x0 176#define MX6QDL_PAD_EIM_D26__EIM_DATA26 0x0bc 0x3d0 0x000 0x0 0x0
177#define MX6Q_PAD_EIM_D26__IPU1_DI1_PIN11 0x0bc 0x3d0 0x000 0x1 0x0 177#define MX6QDL_PAD_EIM_D26__IPU1_DI1_PIN11 0x0bc 0x3d0 0x000 0x1 0x0
178#define MX6Q_PAD_EIM_D26__IPU1_CSI0_DATA01 0x0bc 0x3d0 0x000 0x2 0x0 178#define MX6QDL_PAD_EIM_D26__IPU1_CSI0_DATA01 0x0bc 0x3d0 0x000 0x2 0x0
179#define MX6Q_PAD_EIM_D26__IPU2_CSI1_DATA14 0x0bc 0x3d0 0x8c0 0x3 0x0 179#define MX6QDL_PAD_EIM_D26__IPU2_CSI1_DATA14 0x0bc 0x3d0 0x8c0 0x3 0x0
180#define MX6Q_PAD_EIM_D26__UART2_TX_DATA 0x0bc 0x3d0 0x000 0x4 0x0 180#define MX6QDL_PAD_EIM_D26__UART2_TX_DATA 0x0bc 0x3d0 0x000 0x4 0x0
181#define MX6Q_PAD_EIM_D26__UART2_RX_DATA 0x0bc 0x3d0 0x928 0x4 0x0 181#define MX6QDL_PAD_EIM_D26__UART2_RX_DATA 0x0bc 0x3d0 0x928 0x4 0x0
182#define MX6Q_PAD_EIM_D26__GPIO3_IO26 0x0bc 0x3d0 0x000 0x5 0x0 182#define MX6QDL_PAD_EIM_D26__GPIO3_IO26 0x0bc 0x3d0 0x000 0x5 0x0
183#define MX6Q_PAD_EIM_D26__IPU1_SISG2 0x0bc 0x3d0 0x000 0x6 0x0 183#define MX6QDL_PAD_EIM_D26__IPU1_SISG2 0x0bc 0x3d0 0x000 0x6 0x0
184#define MX6Q_PAD_EIM_D26__IPU1_DISP1_DATA22 0x0bc 0x3d0 0x000 0x7 0x0 184#define MX6QDL_PAD_EIM_D26__IPU1_DISP1_DATA22 0x0bc 0x3d0 0x000 0x7 0x0
185#define MX6Q_PAD_EIM_D27__EIM_DATA27 0x0c0 0x3d4 0x000 0x0 0x0 185#define MX6QDL_PAD_EIM_D27__EIM_DATA27 0x0c0 0x3d4 0x000 0x0 0x0
186#define MX6Q_PAD_EIM_D27__IPU1_DI1_PIN13 0x0c0 0x3d4 0x000 0x1 0x0 186#define MX6QDL_PAD_EIM_D27__IPU1_DI1_PIN13 0x0c0 0x3d4 0x000 0x1 0x0
187#define MX6Q_PAD_EIM_D27__IPU1_CSI0_DATA00 0x0c0 0x3d4 0x000 0x2 0x0 187#define MX6QDL_PAD_EIM_D27__IPU1_CSI0_DATA00 0x0c0 0x3d4 0x000 0x2 0x0
188#define MX6Q_PAD_EIM_D27__IPU2_CSI1_DATA13 0x0c0 0x3d4 0x8bc 0x3 0x0 188#define MX6QDL_PAD_EIM_D27__IPU2_CSI1_DATA13 0x0c0 0x3d4 0x8bc 0x3 0x0
189#define MX6Q_PAD_EIM_D27__UART2_RX_DATA 0x0c0 0x3d4 0x928 0x4 0x1 189#define MX6QDL_PAD_EIM_D27__UART2_RX_DATA 0x0c0 0x3d4 0x928 0x4 0x1
190#define MX6Q_PAD_EIM_D27__UART2_TX_DATA 0x0c0 0x3d4 0x000 0x4 0x0 190#define MX6QDL_PAD_EIM_D27__UART2_TX_DATA 0x0c0 0x3d4 0x000 0x4 0x0
191#define MX6Q_PAD_EIM_D27__GPIO3_IO27 0x0c0 0x3d4 0x000 0x5 0x0 191#define MX6QDL_PAD_EIM_D27__GPIO3_IO27 0x0c0 0x3d4 0x000 0x5 0x0
192#define MX6Q_PAD_EIM_D27__IPU1_SISG3 0x0c0 0x3d4 0x000 0x6 0x0 192#define MX6QDL_PAD_EIM_D27__IPU1_SISG3 0x0c0 0x3d4 0x000 0x6 0x0
193#define MX6Q_PAD_EIM_D27__IPU1_DISP1_DATA23 0x0c0 0x3d4 0x000 0x7 0x0 193#define MX6QDL_PAD_EIM_D27__IPU1_DISP1_DATA23 0x0c0 0x3d4 0x000 0x7 0x0
194#define MX6Q_PAD_EIM_D28__EIM_DATA28 0x0c4 0x3d8 0x000 0x0 0x0 194#define MX6QDL_PAD_EIM_D28__EIM_DATA28 0x0c4 0x3d8 0x000 0x0 0x0
195#define MX6Q_PAD_EIM_D28__I2C1_SDA 0x0c4 0x3d8 0x89c 0x1 0x0 195#define MX6QDL_PAD_EIM_D28__I2C1_SDA 0x0c4 0x3d8 0x89c 0x1 0x0
196#define MX6Q_PAD_EIM_D28__ECSPI4_MOSI 0x0c4 0x3d8 0x000 0x2 0x0 196#define MX6QDL_PAD_EIM_D28__ECSPI4_MOSI 0x0c4 0x3d8 0x000 0x2 0x0
197#define MX6Q_PAD_EIM_D28__IPU2_CSI1_DATA12 0x0c4 0x3d8 0x8b8 0x3 0x0 197#define MX6QDL_PAD_EIM_D28__IPU2_CSI1_DATA12 0x0c4 0x3d8 0x8b8 0x3 0x0
198#define MX6Q_PAD_EIM_D28__UART2_CTS_B 0x0c4 0x3d8 0x000 0x4 0x0 198#define MX6QDL_PAD_EIM_D28__UART2_CTS_B 0x0c4 0x3d8 0x000 0x4 0x0
199#define MX6Q_PAD_EIM_D28__UART2_RTS_B 0x0c4 0x3d8 0x924 0x4 0x0 199#define MX6QDL_PAD_EIM_D28__UART2_RTS_B 0x0c4 0x3d8 0x924 0x4 0x0
200#define MX6Q_PAD_EIM_D28__GPIO3_IO28 0x0c4 0x3d8 0x000 0x5 0x0 200#define MX6QDL_PAD_EIM_D28__UART2_DTE_CTS_B 0x0c4 0x3d8 0x924 0x4 0x0
201#define MX6Q_PAD_EIM_D28__IPU1_EXT_TRIG 0x0c4 0x3d8 0x000 0x6 0x0 201#define MX6QDL_PAD_EIM_D28__UART2_DTE_RTS_B 0x0c4 0x3d8 0x000 0x4 0x0
202#define MX6Q_PAD_EIM_D28__IPU1_DI0_PIN13 0x0c4 0x3d8 0x000 0x7 0x0 202#define MX6QDL_PAD_EIM_D28__GPIO3_IO28 0x0c4 0x3d8 0x000 0x5 0x0
203#define MX6Q_PAD_EIM_D29__EIM_DATA29 0x0c8 0x3dc 0x000 0x0 0x0 203#define MX6QDL_PAD_EIM_D28__IPU1_EXT_TRIG 0x0c4 0x3d8 0x000 0x6 0x0
204#define MX6Q_PAD_EIM_D29__IPU1_DI1_PIN15 0x0c8 0x3dc 0x000 0x1 0x0 204#define MX6QDL_PAD_EIM_D28__IPU1_DI0_PIN13 0x0c4 0x3d8 0x000 0x7 0x0
205#define MX6Q_PAD_EIM_D29__ECSPI4_SS0 0x0c8 0x3dc 0x824 0x2 0x1 205#define MX6QDL_PAD_EIM_D29__EIM_DATA29 0x0c8 0x3dc 0x000 0x0 0x0
206#define MX6Q_PAD_EIM_D29__UART2_RTS_B 0x0c8 0x3dc 0x924 0x4 0x1 206#define MX6QDL_PAD_EIM_D29__IPU1_DI1_PIN15 0x0c8 0x3dc 0x000 0x1 0x0
207#define MX6Q_PAD_EIM_D29__UART2_CTS_B 0x0c8 0x3dc 0x000 0x4 0x0 207#define MX6QDL_PAD_EIM_D29__ECSPI4_SS0 0x0c8 0x3dc 0x824 0x2 0x1
208#define MX6Q_PAD_EIM_D29__GPIO3_IO29 0x0c8 0x3dc 0x000 0x5 0x0 208#define MX6QDL_PAD_EIM_D29__UART2_RTS_B 0x0c8 0x3dc 0x924 0x4 0x1
209#define MX6Q_PAD_EIM_D29__IPU2_CSI1_VSYNC 0x0c8 0x3dc 0x8e4 0x6 0x0 209#define MX6QDL_PAD_EIM_D29__UART2_CTS_B 0x0c8 0x3dc 0x000 0x4 0x0
210#define MX6Q_PAD_EIM_D29__IPU1_DI0_PIN14 0x0c8 0x3dc 0x000 0x7 0x0 210#define MX6QDL_PAD_EIM_D29__UART2_DTE_RTS_B 0x0c8 0x3dc 0x000 0x4 0x0
211#define MX6Q_PAD_EIM_D30__EIM_DATA30 0x0cc 0x3e0 0x000 0x0 0x0 211#define MX6QDL_PAD_EIM_D29__UART2_DTE_CTS_B 0x0c8 0x3dc 0x924 0x4 0x1
212#define MX6Q_PAD_EIM_D30__IPU1_DISP1_DATA21 0x0cc 0x3e0 0x000 0x1 0x0 212#define MX6QDL_PAD_EIM_D29__GPIO3_IO29 0x0c8 0x3dc 0x000 0x5 0x0
213#define MX6Q_PAD_EIM_D30__IPU1_DI0_PIN11 0x0cc 0x3e0 0x000 0x2 0x0 213#define MX6QDL_PAD_EIM_D29__IPU2_CSI1_VSYNC 0x0c8 0x3dc 0x8e4 0x6 0x0
214#define MX6Q_PAD_EIM_D30__IPU1_CSI0_DATA03 0x0cc 0x3e0 0x000 0x3 0x0 214#define MX6QDL_PAD_EIM_D29__IPU1_DI0_PIN14 0x0c8 0x3dc 0x000 0x7 0x0
215#define MX6Q_PAD_EIM_D30__UART3_CTS_B 0x0cc 0x3e0 0x000 0x4 0x0 215#define MX6QDL_PAD_EIM_D30__EIM_DATA30 0x0cc 0x3e0 0x000 0x0 0x0
216#define MX6Q_PAD_EIM_D30__UART3_RTS_B 0x0cc 0x3e0 0x92c 0x4 0x2 216#define MX6QDL_PAD_EIM_D30__IPU1_DISP1_DATA21 0x0cc 0x3e0 0x000 0x1 0x0
217#define MX6Q_PAD_EIM_D30__GPIO3_IO30 0x0cc 0x3e0 0x000 0x5 0x0 217#define MX6QDL_PAD_EIM_D30__IPU1_DI0_PIN11 0x0cc 0x3e0 0x000 0x2 0x0
218#define MX6Q_PAD_EIM_D30__USB_H1_OC 0x0cc 0x3e0 0x948 0x6 0x0 218#define MX6QDL_PAD_EIM_D30__IPU1_CSI0_DATA03 0x0cc 0x3e0 0x000 0x3 0x0
219#define MX6Q_PAD_EIM_D31__EIM_DATA31 0x0d0 0x3e4 0x000 0x0 0x0 219#define MX6QDL_PAD_EIM_D30__UART3_CTS_B 0x0cc 0x3e0 0x000 0x4 0x0
220#define MX6Q_PAD_EIM_D31__IPU1_DISP1_DATA20 0x0d0 0x3e4 0x000 0x1 0x0 220#define MX6QDL_PAD_EIM_D30__UART3_RTS_B 0x0cc 0x3e0 0x92c 0x4 0x2
221#define MX6Q_PAD_EIM_D31__IPU1_DI0_PIN12 0x0d0 0x3e4 0x000 0x2 0x0 221#define MX6QDL_PAD_EIM_D30__GPIO3_IO30 0x0cc 0x3e0 0x000 0x5 0x0
222#define MX6Q_PAD_EIM_D31__IPU1_CSI0_DATA02 0x0d0 0x3e4 0x000 0x3 0x0 222#define MX6QDL_PAD_EIM_D30__USB_H1_OC 0x0cc 0x3e0 0x948 0x6 0x0
223#define MX6Q_PAD_EIM_D31__UART3_RTS_B 0x0d0 0x3e4 0x92c 0x4 0x3 223#define MX6QDL_PAD_EIM_D31__EIM_DATA31 0x0d0 0x3e4 0x000 0x0 0x0
224#define MX6Q_PAD_EIM_D31__UART3_CTS_B 0x0d0 0x3e4 0x000 0x4 0x0 224#define MX6QDL_PAD_EIM_D31__IPU1_DISP1_DATA20 0x0d0 0x3e4 0x000 0x1 0x0
225#define MX6Q_PAD_EIM_D31__GPIO3_IO31 0x0d0 0x3e4 0x000 0x5 0x0 225#define MX6QDL_PAD_EIM_D31__IPU1_DI0_PIN12 0x0d0 0x3e4 0x000 0x2 0x0
226#define MX6Q_PAD_EIM_D31__USB_H1_PWR 0x0d0 0x3e4 0x000 0x6 0x0 226#define MX6QDL_PAD_EIM_D31__IPU1_CSI0_DATA02 0x0d0 0x3e4 0x000 0x3 0x0
227#define MX6Q_PAD_EIM_A24__EIM_ADDR24 0x0d4 0x3e8 0x000 0x0 0x0 227#define MX6QDL_PAD_EIM_D31__UART3_RTS_B 0x0d0 0x3e4 0x92c 0x4 0x3
228#define MX6Q_PAD_EIM_A24__IPU1_DISP1_DATA19 0x0d4 0x3e8 0x000 0x1 0x0 228#define MX6QDL_PAD_EIM_D31__UART3_CTS_B 0x0d0 0x3e4 0x000 0x4 0x0
229#define MX6Q_PAD_EIM_A24__IPU2_CSI1_DATA19 0x0d4 0x3e8 0x8d4 0x2 0x1 229#define MX6QDL_PAD_EIM_D31__GPIO3_IO31 0x0d0 0x3e4 0x000 0x5 0x0
230#define MX6Q_PAD_EIM_A24__IPU2_SISG2 0x0d4 0x3e8 0x000 0x3 0x0 230#define MX6QDL_PAD_EIM_D31__USB_H1_PWR 0x0d0 0x3e4 0x000 0x6 0x0
231#define MX6Q_PAD_EIM_A24__IPU1_SISG2 0x0d4 0x3e8 0x000 0x4 0x0 231#define MX6QDL_PAD_EIM_A24__EIM_ADDR24 0x0d4 0x3e8 0x000 0x0 0x0
232#define MX6Q_PAD_EIM_A24__GPIO5_IO04 0x0d4 0x3e8 0x000 0x5 0x0 232#define MX6QDL_PAD_EIM_A24__IPU1_DISP1_DATA19 0x0d4 0x3e8 0x000 0x1 0x0
233#define MX6Q_PAD_EIM_A24__SRC_BOOT_CFG24 0x0d4 0x3e8 0x000 0x7 0x0 233#define MX6QDL_PAD_EIM_A24__IPU2_CSI1_DATA19 0x0d4 0x3e8 0x8d4 0x2 0x1
234#define MX6Q_PAD_EIM_A23__EIM_ADDR23 0x0d8 0x3ec 0x000 0x0 0x0 234#define MX6QDL_PAD_EIM_A24__IPU2_SISG2 0x0d4 0x3e8 0x000 0x3 0x0
235#define MX6Q_PAD_EIM_A23__IPU1_DISP1_DATA18 0x0d8 0x3ec 0x000 0x1 0x0 235#define MX6QDL_PAD_EIM_A24__IPU1_SISG2 0x0d4 0x3e8 0x000 0x4 0x0
236#define MX6Q_PAD_EIM_A23__IPU2_CSI1_DATA18 0x0d8 0x3ec 0x8d0 0x2 0x1 236#define MX6QDL_PAD_EIM_A24__GPIO5_IO04 0x0d4 0x3e8 0x000 0x5 0x0
237#define MX6Q_PAD_EIM_A23__IPU2_SISG3 0x0d8 0x3ec 0x000 0x3 0x0 237#define MX6QDL_PAD_EIM_A24__SRC_BOOT_CFG24 0x0d4 0x3e8 0x000 0x7 0x0
238#define MX6Q_PAD_EIM_A23__IPU1_SISG3 0x0d8 0x3ec 0x000 0x4 0x0 238#define MX6QDL_PAD_EIM_A23__EIM_ADDR23 0x0d8 0x3ec 0x000 0x0 0x0
239#define MX6Q_PAD_EIM_A23__GPIO6_IO06 0x0d8 0x3ec 0x000 0x5 0x0 239#define MX6QDL_PAD_EIM_A23__IPU1_DISP1_DATA18 0x0d8 0x3ec 0x000 0x1 0x0
240#define MX6Q_PAD_EIM_A23__SRC_BOOT_CFG23 0x0d8 0x3ec 0x000 0x7 0x0 240#define MX6QDL_PAD_EIM_A23__IPU2_CSI1_DATA18 0x0d8 0x3ec 0x8d0 0x2 0x1
241#define MX6Q_PAD_EIM_A22__EIM_ADDR22 0x0dc 0x3f0 0x000 0x0 0x0 241#define MX6QDL_PAD_EIM_A23__IPU2_SISG3 0x0d8 0x3ec 0x000 0x3 0x0
242#define MX6Q_PAD_EIM_A22__IPU1_DISP1_DATA17 0x0dc 0x3f0 0x000 0x1 0x0 242#define MX6QDL_PAD_EIM_A23__IPU1_SISG3 0x0d8 0x3ec 0x000 0x4 0x0
243#define MX6Q_PAD_EIM_A22__IPU2_CSI1_DATA17 0x0dc 0x3f0 0x8cc 0x2 0x1 243#define MX6QDL_PAD_EIM_A23__GPIO6_IO06 0x0d8 0x3ec 0x000 0x5 0x0
244#define MX6Q_PAD_EIM_A22__GPIO2_IO16 0x0dc 0x3f0 0x000 0x5 0x0 244#define MX6QDL_PAD_EIM_A23__SRC_BOOT_CFG23 0x0d8 0x3ec 0x000 0x7 0x0
245#define MX6Q_PAD_EIM_A22__SRC_BOOT_CFG22 0x0dc 0x3f0 0x000 0x7 0x0 245#define MX6QDL_PAD_EIM_A22__EIM_ADDR22 0x0dc 0x3f0 0x000 0x0 0x0
246#define MX6Q_PAD_EIM_A21__EIM_ADDR21 0x0e0 0x3f4 0x000 0x0 0x0 246#define MX6QDL_PAD_EIM_A22__IPU1_DISP1_DATA17 0x0dc 0x3f0 0x000 0x1 0x0
247#define MX6Q_PAD_EIM_A21__IPU1_DISP1_DATA16 0x0e0 0x3f4 0x000 0x1 0x0 247#define MX6QDL_PAD_EIM_A22__IPU2_CSI1_DATA17 0x0dc 0x3f0 0x8cc 0x2 0x1
248#define MX6Q_PAD_EIM_A21__IPU2_CSI1_DATA16 0x0e0 0x3f4 0x8c8 0x2 0x1 248#define MX6QDL_PAD_EIM_A22__GPIO2_IO16 0x0dc 0x3f0 0x000 0x5 0x0
249#define MX6Q_PAD_EIM_A21__GPIO2_IO17 0x0e0 0x3f4 0x000 0x5 0x0 249#define MX6QDL_PAD_EIM_A22__SRC_BOOT_CFG22 0x0dc 0x3f0 0x000 0x7 0x0
250#define MX6Q_PAD_EIM_A21__SRC_BOOT_CFG21 0x0e0 0x3f4 0x000 0x7 0x0 250#define MX6QDL_PAD_EIM_A21__EIM_ADDR21 0x0e0 0x3f4 0x000 0x0 0x0
251#define MX6Q_PAD_EIM_A20__EIM_ADDR20 0x0e4 0x3f8 0x000 0x0 0x0 251#define MX6QDL_PAD_EIM_A21__IPU1_DISP1_DATA16 0x0e0 0x3f4 0x000 0x1 0x0
252#define MX6Q_PAD_EIM_A20__IPU1_DISP1_DATA15 0x0e4 0x3f8 0x000 0x1 0x0 252#define MX6QDL_PAD_EIM_A21__IPU2_CSI1_DATA16 0x0e0 0x3f4 0x8c8 0x2 0x1
253#define MX6Q_PAD_EIM_A20__IPU2_CSI1_DATA15 0x0e4 0x3f8 0x8c4 0x2 0x1 253#define MX6QDL_PAD_EIM_A21__GPIO2_IO17 0x0e0 0x3f4 0x000 0x5 0x0
254#define MX6Q_PAD_EIM_A20__GPIO2_IO18 0x0e4 0x3f8 0x000 0x5 0x0 254#define MX6QDL_PAD_EIM_A21__SRC_BOOT_CFG21 0x0e0 0x3f4 0x000 0x7 0x0
255#define MX6Q_PAD_EIM_A20__SRC_BOOT_CFG20 0x0e4 0x3f8 0x000 0x7 0x0 255#define MX6QDL_PAD_EIM_A20__EIM_ADDR20 0x0e4 0x3f8 0x000 0x0 0x0
256#define MX6Q_PAD_EIM_A19__EIM_ADDR19 0x0e8 0x3fc 0x000 0x0 0x0 256#define MX6QDL_PAD_EIM_A20__IPU1_DISP1_DATA15 0x0e4 0x3f8 0x000 0x1 0x0
257#define MX6Q_PAD_EIM_A19__IPU1_DISP1_DATA14 0x0e8 0x3fc 0x000 0x1 0x0 257#define MX6QDL_PAD_EIM_A20__IPU2_CSI1_DATA15 0x0e4 0x3f8 0x8c4 0x2 0x1
258#define MX6Q_PAD_EIM_A19__IPU2_CSI1_DATA14 0x0e8 0x3fc 0x8c0 0x2 0x1 258#define MX6QDL_PAD_EIM_A20__GPIO2_IO18 0x0e4 0x3f8 0x000 0x5 0x0
259#define MX6Q_PAD_EIM_A19__GPIO2_IO19 0x0e8 0x3fc 0x000 0x5 0x0 259#define MX6QDL_PAD_EIM_A20__SRC_BOOT_CFG20 0x0e4 0x3f8 0x000 0x7 0x0
260#define MX6Q_PAD_EIM_A19__SRC_BOOT_CFG19 0x0e8 0x3fc 0x000 0x7 0x0 260#define MX6QDL_PAD_EIM_A19__EIM_ADDR19 0x0e8 0x3fc 0x000 0x0 0x0
261#define MX6Q_PAD_EIM_A18__EIM_ADDR18 0x0ec 0x400 0x000 0x0 0x0 261#define MX6QDL_PAD_EIM_A19__IPU1_DISP1_DATA14 0x0e8 0x3fc 0x000 0x1 0x0
262#define MX6Q_PAD_EIM_A18__IPU1_DISP1_DATA13 0x0ec 0x400 0x000 0x1 0x0 262#define MX6QDL_PAD_EIM_A19__IPU2_CSI1_DATA14 0x0e8 0x3fc 0x8c0 0x2 0x1
263#define MX6Q_PAD_EIM_A18__IPU2_CSI1_DATA13 0x0ec 0x400 0x8bc 0x2 0x1 263#define MX6QDL_PAD_EIM_A19__GPIO2_IO19 0x0e8 0x3fc 0x000 0x5 0x0
264#define MX6Q_PAD_EIM_A18__GPIO2_IO20 0x0ec 0x400 0x000 0x5 0x0 264#define MX6QDL_PAD_EIM_A19__SRC_BOOT_CFG19 0x0e8 0x3fc 0x000 0x7 0x0
265#define MX6Q_PAD_EIM_A18__SRC_BOOT_CFG18 0x0ec 0x400 0x000 0x7 0x0 265#define MX6QDL_PAD_EIM_A18__EIM_ADDR18 0x0ec 0x400 0x000 0x0 0x0
266#define MX6Q_PAD_EIM_A17__EIM_ADDR17 0x0f0 0x404 0x000 0x0 0x0 266#define MX6QDL_PAD_EIM_A18__IPU1_DISP1_DATA13 0x0ec 0x400 0x000 0x1 0x0
267#define MX6Q_PAD_EIM_A17__IPU1_DISP1_DATA12 0x0f0 0x404 0x000 0x1 0x0 267#define MX6QDL_PAD_EIM_A18__IPU2_CSI1_DATA13 0x0ec 0x400 0x8bc 0x2 0x1
268#define MX6Q_PAD_EIM_A17__IPU2_CSI1_DATA12 0x0f0 0x404 0x8b8 0x2 0x1 268#define MX6QDL_PAD_EIM_A18__GPIO2_IO20 0x0ec 0x400 0x000 0x5 0x0
269#define MX6Q_PAD_EIM_A17__GPIO2_IO21 0x0f0 0x404 0x000 0x5 0x0 269#define MX6QDL_PAD_EIM_A18__SRC_BOOT_CFG18 0x0ec 0x400 0x000 0x7 0x0
270#define MX6Q_PAD_EIM_A17__SRC_BOOT_CFG17 0x0f0 0x404 0x000 0x7 0x0 270#define MX6QDL_PAD_EIM_A17__EIM_ADDR17 0x0f0 0x404 0x000 0x0 0x0
271#define MX6Q_PAD_EIM_A16__EIM_ADDR16 0x0f4 0x408 0x000 0x0 0x0 271#define MX6QDL_PAD_EIM_A17__IPU1_DISP1_DATA12 0x0f0 0x404 0x000 0x1 0x0
272#define MX6Q_PAD_EIM_A16__IPU1_DI1_DISP_CLK 0x0f4 0x408 0x000 0x1 0x0 272#define MX6QDL_PAD_EIM_A17__IPU2_CSI1_DATA12 0x0f0 0x404 0x8b8 0x2 0x1
273#define MX6Q_PAD_EIM_A16__IPU2_CSI1_PIXCLK 0x0f4 0x408 0x8e0 0x2 0x1 273#define MX6QDL_PAD_EIM_A17__GPIO2_IO21 0x0f0 0x404 0x000 0x5 0x0
274#define MX6Q_PAD_EIM_A16__GPIO2_IO22 0x0f4 0x408 0x000 0x5 0x0 274#define MX6QDL_PAD_EIM_A17__SRC_BOOT_CFG17 0x0f0 0x404 0x000 0x7 0x0
275#define MX6Q_PAD_EIM_A16__SRC_BOOT_CFG16 0x0f4 0x408 0x000 0x7 0x0 275#define MX6QDL_PAD_EIM_A16__EIM_ADDR16 0x0f4 0x408 0x000 0x0 0x0
276#define MX6Q_PAD_EIM_CS0__EIM_CS0_B 0x0f8 0x40c 0x000 0x0 0x0 276#define MX6QDL_PAD_EIM_A16__IPU1_DI1_DISP_CLK 0x0f4 0x408 0x000 0x1 0x0
277#define MX6Q_PAD_EIM_CS0__IPU1_DI1_PIN05 0x0f8 0x40c 0x000 0x1 0x0 277#define MX6QDL_PAD_EIM_A16__IPU2_CSI1_PIXCLK 0x0f4 0x408 0x8e0 0x2 0x1
278#define MX6Q_PAD_EIM_CS0__ECSPI2_SCLK 0x0f8 0x40c 0x810 0x2 0x0 278#define MX6QDL_PAD_EIM_A16__GPIO2_IO22 0x0f4 0x408 0x000 0x5 0x0
279#define MX6Q_PAD_EIM_CS0__GPIO2_IO23 0x0f8 0x40c 0x000 0x5 0x0 279#define MX6QDL_PAD_EIM_A16__SRC_BOOT_CFG16 0x0f4 0x408 0x000 0x7 0x0
280#define MX6Q_PAD_EIM_CS1__EIM_CS1_B 0x0fc 0x410 0x000 0x0 0x0 280#define MX6QDL_PAD_EIM_CS0__EIM_CS0_B 0x0f8 0x40c 0x000 0x0 0x0
281#define MX6Q_PAD_EIM_CS1__IPU1_DI1_PIN06 0x0fc 0x410 0x000 0x1 0x0 281#define MX6QDL_PAD_EIM_CS0__IPU1_DI1_PIN05 0x0f8 0x40c 0x000 0x1 0x0
282#define MX6Q_PAD_EIM_CS1__ECSPI2_MOSI 0x0fc 0x410 0x818 0x2 0x0 282#define MX6QDL_PAD_EIM_CS0__ECSPI2_SCLK 0x0f8 0x40c 0x810 0x2 0x0
283#define MX6Q_PAD_EIM_CS1__GPIO2_IO24 0x0fc 0x410 0x000 0x5 0x0 283#define MX6QDL_PAD_EIM_CS0__GPIO2_IO23 0x0f8 0x40c 0x000 0x5 0x0
284#define MX6Q_PAD_EIM_OE__EIM_OE_B 0x100 0x414 0x000 0x0 0x0 284#define MX6QDL_PAD_EIM_CS1__EIM_CS1_B 0x0fc 0x410 0x000 0x0 0x0
285#define MX6Q_PAD_EIM_OE__IPU1_DI1_PIN07 0x100 0x414 0x000 0x1 0x0 285#define MX6QDL_PAD_EIM_CS1__IPU1_DI1_PIN06 0x0fc 0x410 0x000 0x1 0x0
286#define MX6Q_PAD_EIM_OE__ECSPI2_MISO 0x100 0x414 0x814 0x2 0x0 286#define MX6QDL_PAD_EIM_CS1__ECSPI2_MOSI 0x0fc 0x410 0x818 0x2 0x0
287#define MX6Q_PAD_EIM_OE__GPIO2_IO25 0x100 0x414 0x000 0x5 0x0 287#define MX6QDL_PAD_EIM_CS1__GPIO2_IO24 0x0fc 0x410 0x000 0x5 0x0
288#define MX6Q_PAD_EIM_RW__EIM_RW 0x104 0x418 0x000 0x0 0x0 288#define MX6QDL_PAD_EIM_OE__EIM_OE_B 0x100 0x414 0x000 0x0 0x0
289#define MX6Q_PAD_EIM_RW__IPU1_DI1_PIN08 0x104 0x418 0x000 0x1 0x0 289#define MX6QDL_PAD_EIM_OE__IPU1_DI1_PIN07 0x100 0x414 0x000 0x1 0x0
290#define MX6Q_PAD_EIM_RW__ECSPI2_SS0 0x104 0x418 0x81c 0x2 0x0 290#define MX6QDL_PAD_EIM_OE__ECSPI2_MISO 0x100 0x414 0x814 0x2 0x0
291#define MX6Q_PAD_EIM_RW__GPIO2_IO26 0x104 0x418 0x000 0x5 0x0 291#define MX6QDL_PAD_EIM_OE__GPIO2_IO25 0x100 0x414 0x000 0x5 0x0
292#define MX6Q_PAD_EIM_RW__SRC_BOOT_CFG29 0x104 0x418 0x000 0x7 0x0 292#define MX6QDL_PAD_EIM_RW__EIM_RW 0x104 0x418 0x000 0x0 0x0
293#define MX6Q_PAD_EIM_LBA__EIM_LBA_B 0x108 0x41c 0x000 0x0 0x0 293#define MX6QDL_PAD_EIM_RW__IPU1_DI1_PIN08 0x104 0x418 0x000 0x1 0x0
294#define MX6Q_PAD_EIM_LBA__IPU1_DI1_PIN17 0x108 0x41c 0x000 0x1 0x0 294#define MX6QDL_PAD_EIM_RW__ECSPI2_SS0 0x104 0x418 0x81c 0x2 0x0
295#define MX6Q_PAD_EIM_LBA__ECSPI2_SS1 0x108 0x41c 0x820 0x2 0x0 295#define MX6QDL_PAD_EIM_RW__GPIO2_IO26 0x104 0x418 0x000 0x5 0x0
296#define MX6Q_PAD_EIM_LBA__GPIO2_IO27 0x108 0x41c 0x000 0x5 0x0 296#define MX6QDL_PAD_EIM_RW__SRC_BOOT_CFG29 0x104 0x418 0x000 0x7 0x0
297#define MX6Q_PAD_EIM_LBA__SRC_BOOT_CFG26 0x108 0x41c 0x000 0x7 0x0 297#define MX6QDL_PAD_EIM_LBA__EIM_LBA_B 0x108 0x41c 0x000 0x0 0x0
298#define MX6Q_PAD_EIM_EB0__EIM_EB0_B 0x10c 0x420 0x000 0x0 0x0 298#define MX6QDL_PAD_EIM_LBA__IPU1_DI1_PIN17 0x108 0x41c 0x000 0x1 0x0
299#define MX6Q_PAD_EIM_EB0__IPU1_DISP1_DATA11 0x10c 0x420 0x000 0x1 0x0 299#define MX6QDL_PAD_EIM_LBA__ECSPI2_SS1 0x108 0x41c 0x820 0x2 0x0
300#define MX6Q_PAD_EIM_EB0__IPU2_CSI1_DATA11 0x10c 0x420 0x8b4 0x2 0x1 300#define MX6QDL_PAD_EIM_LBA__GPIO2_IO27 0x108 0x41c 0x000 0x5 0x0
301#define MX6Q_PAD_EIM_EB0__CCM_PMIC_READY 0x10c 0x420 0x7f0 0x4 0x0 301#define MX6QDL_PAD_EIM_LBA__SRC_BOOT_CFG26 0x108 0x41c 0x000 0x7 0x0
302#define MX6Q_PAD_EIM_EB0__GPIO2_IO28 0x10c 0x420 0x000 0x5 0x0 302#define MX6QDL_PAD_EIM_EB0__EIM_EB0_B 0x10c 0x420 0x000 0x0 0x0
303#define MX6Q_PAD_EIM_EB0__SRC_BOOT_CFG27 0x10c 0x420 0x000 0x7 0x0 303#define MX6QDL_PAD_EIM_EB0__IPU1_DISP1_DATA11 0x10c 0x420 0x000 0x1 0x0
304#define MX6Q_PAD_EIM_EB1__EIM_EB1_B 0x110 0x424 0x000 0x0 0x0 304#define MX6QDL_PAD_EIM_EB0__IPU2_CSI1_DATA11 0x10c 0x420 0x8b4 0x2 0x1
305#define MX6Q_PAD_EIM_EB1__IPU1_DISP1_DATA10 0x110 0x424 0x000 0x1 0x0 305#define MX6QDL_PAD_EIM_EB0__CCM_PMIC_READY 0x10c 0x420 0x7f0 0x4 0x0
306#define MX6Q_PAD_EIM_EB1__IPU2_CSI1_DATA10 0x110 0x424 0x8b0 0x2 0x1 306#define MX6QDL_PAD_EIM_EB0__GPIO2_IO28 0x10c 0x420 0x000 0x5 0x0
307#define MX6Q_PAD_EIM_EB1__GPIO2_IO29 0x110 0x424 0x000 0x5 0x0 307#define MX6QDL_PAD_EIM_EB0__SRC_BOOT_CFG27 0x10c 0x420 0x000 0x7 0x0
308#define MX6Q_PAD_EIM_EB1__SRC_BOOT_CFG28 0x110 0x424 0x000 0x7 0x0 308#define MX6QDL_PAD_EIM_EB1__EIM_EB1_B 0x110 0x424 0x000 0x0 0x0
309#define MX6Q_PAD_EIM_DA0__EIM_AD00 0x114 0x428 0x000 0x0 0x0 309#define MX6QDL_PAD_EIM_EB1__IPU1_DISP1_DATA10 0x110 0x424 0x000 0x1 0x0
310#define MX6Q_PAD_EIM_DA0__IPU1_DISP1_DATA09 0x114 0x428 0x000 0x1 0x0 310#define MX6QDL_PAD_EIM_EB1__IPU2_CSI1_DATA10 0x110 0x424 0x8b0 0x2 0x1
311#define MX6Q_PAD_EIM_DA0__IPU2_CSI1_DATA09 0x114 0x428 0x000 0x2 0x0 311#define MX6QDL_PAD_EIM_EB1__GPIO2_IO29 0x110 0x424 0x000 0x5 0x0
312#define MX6Q_PAD_EIM_DA0__GPIO3_IO00 0x114 0x428 0x000 0x5 0x0 312#define MX6QDL_PAD_EIM_EB1__SRC_BOOT_CFG28 0x110 0x424 0x000 0x7 0x0
313#define MX6Q_PAD_EIM_DA0__SRC_BOOT_CFG00 0x114 0x428 0x000 0x7 0x0 313#define MX6QDL_PAD_EIM_DA0__EIM_AD00 0x114 0x428 0x000 0x0 0x0
314#define MX6Q_PAD_EIM_DA1__EIM_AD01 0x118 0x42c 0x000 0x0 0x0 314#define MX6QDL_PAD_EIM_DA0__IPU1_DISP1_DATA09 0x114 0x428 0x000 0x1 0x0
315#define MX6Q_PAD_EIM_DA1__IPU1_DISP1_DATA08 0x118 0x42c 0x000 0x1 0x0 315#define MX6QDL_PAD_EIM_DA0__IPU2_CSI1_DATA09 0x114 0x428 0x000 0x2 0x0
316#define MX6Q_PAD_EIM_DA1__IPU2_CSI1_DATA08 0x118 0x42c 0x000 0x2 0x0 316#define MX6QDL_PAD_EIM_DA0__GPIO3_IO00 0x114 0x428 0x000 0x5 0x0
317#define MX6Q_PAD_EIM_DA1__GPIO3_IO01 0x118 0x42c 0x000 0x5 0x0 317#define MX6QDL_PAD_EIM_DA0__SRC_BOOT_CFG00 0x114 0x428 0x000 0x7 0x0
318#define MX6Q_PAD_EIM_DA1__SRC_BOOT_CFG01 0x118 0x42c 0x000 0x7 0x0 318#define MX6QDL_PAD_EIM_DA1__EIM_AD01 0x118 0x42c 0x000 0x0 0x0
319#define MX6Q_PAD_EIM_DA2__EIM_AD02 0x11c 0x430 0x000 0x0 0x0 319#define MX6QDL_PAD_EIM_DA1__IPU1_DISP1_DATA08 0x118 0x42c 0x000 0x1 0x0
320#define MX6Q_PAD_EIM_DA2__IPU1_DISP1_DATA07 0x11c 0x430 0x000 0x1 0x0 320#define MX6QDL_PAD_EIM_DA1__IPU2_CSI1_DATA08 0x118 0x42c 0x000 0x2 0x0
321#define MX6Q_PAD_EIM_DA2__IPU2_CSI1_DATA07 0x11c 0x430 0x000 0x2 0x0 321#define MX6QDL_PAD_EIM_DA1__GPIO3_IO01 0x118 0x42c 0x000 0x5 0x0
322#define MX6Q_PAD_EIM_DA2__GPIO3_IO02 0x11c 0x430 0x000 0x5 0x0 322#define MX6QDL_PAD_EIM_DA1__SRC_BOOT_CFG01 0x118 0x42c 0x000 0x7 0x0
323#define MX6Q_PAD_EIM_DA2__SRC_BOOT_CFG02 0x11c 0x430 0x000 0x7 0x0 323#define MX6QDL_PAD_EIM_DA2__EIM_AD02 0x11c 0x430 0x000 0x0 0x0
324#define MX6Q_PAD_EIM_DA3__EIM_AD03 0x120 0x434 0x000 0x0 0x0 324#define MX6QDL_PAD_EIM_DA2__IPU1_DISP1_DATA07 0x11c 0x430 0x000 0x1 0x0
325#define MX6Q_PAD_EIM_DA3__IPU1_DISP1_DATA06 0x120 0x434 0x000 0x1 0x0 325#define MX6QDL_PAD_EIM_DA2__IPU2_CSI1_DATA07 0x11c 0x430 0x000 0x2 0x0
326#define MX6Q_PAD_EIM_DA3__IPU2_CSI1_DATA06 0x120 0x434 0x000 0x2 0x0 326#define MX6QDL_PAD_EIM_DA2__GPIO3_IO02 0x11c 0x430 0x000 0x5 0x0
327#define MX6Q_PAD_EIM_DA3__GPIO3_IO03 0x120 0x434 0x000 0x5 0x0 327#define MX6QDL_PAD_EIM_DA2__SRC_BOOT_CFG02 0x11c 0x430 0x000 0x7 0x0
328#define MX6Q_PAD_EIM_DA3__SRC_BOOT_CFG03 0x120 0x434 0x000 0x7 0x0 328#define MX6QDL_PAD_EIM_DA3__EIM_AD03 0x120 0x434 0x000 0x0 0x0
329#define MX6Q_PAD_EIM_DA4__EIM_AD04 0x124 0x438 0x000 0x0 0x0 329#define MX6QDL_PAD_EIM_DA3__IPU1_DISP1_DATA06 0x120 0x434 0x000 0x1 0x0
330#define MX6Q_PAD_EIM_DA4__IPU1_DISP1_DATA05 0x124 0x438 0x000 0x1 0x0 330#define MX6QDL_PAD_EIM_DA3__IPU2_CSI1_DATA06 0x120 0x434 0x000 0x2 0x0
331#define MX6Q_PAD_EIM_DA4__IPU2_CSI1_DATA05 0x124 0x438 0x000 0x2 0x0 331#define MX6QDL_PAD_EIM_DA3__GPIO3_IO03 0x120 0x434 0x000 0x5 0x0
332#define MX6Q_PAD_EIM_DA4__GPIO3_IO04 0x124 0x438 0x000 0x5 0x0 332#define MX6QDL_PAD_EIM_DA3__SRC_BOOT_CFG03 0x120 0x434 0x000 0x7 0x0
333#define MX6Q_PAD_EIM_DA4__SRC_BOOT_CFG04 0x124 0x438 0x000 0x7 0x0 333#define MX6QDL_PAD_EIM_DA4__EIM_AD04 0x124 0x438 0x000 0x0 0x0
334#define MX6Q_PAD_EIM_DA5__EIM_AD05 0x128 0x43c 0x000 0x0 0x0 334#define MX6QDL_PAD_EIM_DA4__IPU1_DISP1_DATA05 0x124 0x438 0x000 0x1 0x0
335#define MX6Q_PAD_EIM_DA5__IPU1_DISP1_DATA04 0x128 0x43c 0x000 0x1 0x0 335#define MX6QDL_PAD_EIM_DA4__IPU2_CSI1_DATA05 0x124 0x438 0x000 0x2 0x0
336#define MX6Q_PAD_EIM_DA5__IPU2_CSI1_DATA04 0x128 0x43c 0x000 0x2 0x0 336#define MX6QDL_PAD_EIM_DA4__GPIO3_IO04 0x124 0x438 0x000 0x5 0x0
337#define MX6Q_PAD_EIM_DA5__GPIO3_IO05 0x128 0x43c 0x000 0x5 0x0 337#define MX6QDL_PAD_EIM_DA4__SRC_BOOT_CFG04 0x124 0x438 0x000 0x7 0x0
338#define MX6Q_PAD_EIM_DA5__SRC_BOOT_CFG05 0x128 0x43c 0x000 0x7 0x0 338#define MX6QDL_PAD_EIM_DA5__EIM_AD05 0x128 0x43c 0x000 0x0 0x0
339#define MX6Q_PAD_EIM_DA6__EIM_AD06 0x12c 0x440 0x000 0x0 0x0 339#define MX6QDL_PAD_EIM_DA5__IPU1_DISP1_DATA04 0x128 0x43c 0x000 0x1 0x0
340#define MX6Q_PAD_EIM_DA6__IPU1_DISP1_DATA03 0x12c 0x440 0x000 0x1 0x0 340#define MX6QDL_PAD_EIM_DA5__IPU2_CSI1_DATA04 0x128 0x43c 0x000 0x2 0x0
341#define MX6Q_PAD_EIM_DA6__IPU2_CSI1_DATA03 0x12c 0x440 0x000 0x2 0x0 341#define MX6QDL_PAD_EIM_DA5__GPIO3_IO05 0x128 0x43c 0x000 0x5 0x0
342#define MX6Q_PAD_EIM_DA6__GPIO3_IO06 0x12c 0x440 0x000 0x5 0x0 342#define MX6QDL_PAD_EIM_DA5__SRC_BOOT_CFG05 0x128 0x43c 0x000 0x7 0x0
343#define MX6Q_PAD_EIM_DA6__SRC_BOOT_CFG06 0x12c 0x440 0x000 0x7 0x0 343#define MX6QDL_PAD_EIM_DA6__EIM_AD06 0x12c 0x440 0x000 0x0 0x0
344#define MX6Q_PAD_EIM_DA7__EIM_AD07 0x130 0x444 0x000 0x0 0x0 344#define MX6QDL_PAD_EIM_DA6__IPU1_DISP1_DATA03 0x12c 0x440 0x000 0x1 0x0
345#define MX6Q_PAD_EIM_DA7__IPU1_DISP1_DATA02 0x130 0x444 0x000 0x1 0x0 345#define MX6QDL_PAD_EIM_DA6__IPU2_CSI1_DATA03 0x12c 0x440 0x000 0x2 0x0
346#define MX6Q_PAD_EIM_DA7__IPU2_CSI1_DATA02 0x130 0x444 0x000 0x2 0x0 346#define MX6QDL_PAD_EIM_DA6__GPIO3_IO06 0x12c 0x440 0x000 0x5 0x0
347#define MX6Q_PAD_EIM_DA7__GPIO3_IO07 0x130 0x444 0x000 0x5 0x0 347#define MX6QDL_PAD_EIM_DA6__SRC_BOOT_CFG06 0x12c 0x440 0x000 0x7 0x0
348#define MX6Q_PAD_EIM_DA7__SRC_BOOT_CFG07 0x130 0x444 0x000 0x7 0x0 348#define MX6QDL_PAD_EIM_DA7__EIM_AD07 0x130 0x444 0x000 0x0 0x0
349#define MX6Q_PAD_EIM_DA8__EIM_AD08 0x134 0x448 0x000 0x0 0x0 349#define MX6QDL_PAD_EIM_DA7__IPU1_DISP1_DATA02 0x130 0x444 0x000 0x1 0x0
350#define MX6Q_PAD_EIM_DA8__IPU1_DISP1_DATA01 0x134 0x448 0x000 0x1 0x0 350#define MX6QDL_PAD_EIM_DA7__IPU2_CSI1_DATA02 0x130 0x444 0x000 0x2 0x0
351#define MX6Q_PAD_EIM_DA8__IPU2_CSI1_DATA01 0x134 0x448 0x000 0x2 0x0 351#define MX6QDL_PAD_EIM_DA7__GPIO3_IO07 0x130 0x444 0x000 0x5 0x0
352#define MX6Q_PAD_EIM_DA8__GPIO3_IO08 0x134 0x448 0x000 0x5 0x0 352#define MX6QDL_PAD_EIM_DA7__SRC_BOOT_CFG07 0x130 0x444 0x000 0x7 0x0
353#define MX6Q_PAD_EIM_DA8__SRC_BOOT_CFG08 0x134 0x448 0x000 0x7 0x0 353#define MX6QDL_PAD_EIM_DA8__EIM_AD08 0x134 0x448 0x000 0x0 0x0
354#define MX6Q_PAD_EIM_DA9__EIM_AD09 0x138 0x44c 0x000 0x0 0x0 354#define MX6QDL_PAD_EIM_DA8__IPU1_DISP1_DATA01 0x134 0x448 0x000 0x1 0x0
355#define MX6Q_PAD_EIM_DA9__IPU1_DISP1_DATA00 0x138 0x44c 0x000 0x1 0x0 355#define MX6QDL_PAD_EIM_DA8__IPU2_CSI1_DATA01 0x134 0x448 0x000 0x2 0x0
356#define MX6Q_PAD_EIM_DA9__IPU2_CSI1_DATA00 0x138 0x44c 0x000 0x2 0x0 356#define MX6QDL_PAD_EIM_DA8__GPIO3_IO08 0x134 0x448 0x000 0x5 0x0
357#define MX6Q_PAD_EIM_DA9__GPIO3_IO09 0x138 0x44c 0x000 0x5 0x0 357#define MX6QDL_PAD_EIM_DA8__SRC_BOOT_CFG08 0x134 0x448 0x000 0x7 0x0
358#define MX6Q_PAD_EIM_DA9__SRC_BOOT_CFG09 0x138 0x44c 0x000 0x7 0x0 358#define MX6QDL_PAD_EIM_DA9__EIM_AD09 0x138 0x44c 0x000 0x0 0x0
359#define MX6Q_PAD_EIM_DA10__EIM_AD10 0x13c 0x450 0x000 0x0 0x0 359#define MX6QDL_PAD_EIM_DA9__IPU1_DISP1_DATA00 0x138 0x44c 0x000 0x1 0x0
360#define MX6Q_PAD_EIM_DA10__IPU1_DI1_PIN15 0x13c 0x450 0x000 0x1 0x0 360#define MX6QDL_PAD_EIM_DA9__IPU2_CSI1_DATA00 0x138 0x44c 0x000 0x2 0x0
361#define MX6Q_PAD_EIM_DA10__IPU2_CSI1_DATA_EN 0x13c 0x450 0x8d8 0x2 0x1 361#define MX6QDL_PAD_EIM_DA9__GPIO3_IO09 0x138 0x44c 0x000 0x5 0x0
362#define MX6Q_PAD_EIM_DA10__GPIO3_IO10 0x13c 0x450 0x000 0x5 0x0 362#define MX6QDL_PAD_EIM_DA9__SRC_BOOT_CFG09 0x138 0x44c 0x000 0x7 0x0
363#define MX6Q_PAD_EIM_DA10__SRC_BOOT_CFG10 0x13c 0x450 0x000 0x7 0x0 363#define MX6QDL_PAD_EIM_DA10__EIM_AD10 0x13c 0x450 0x000 0x0 0x0
364#define MX6Q_PAD_EIM_DA11__EIM_AD11 0x140 0x454 0x000 0x0 0x0 364#define MX6QDL_PAD_EIM_DA10__IPU1_DI1_PIN15 0x13c 0x450 0x000 0x1 0x0
365#define MX6Q_PAD_EIM_DA11__IPU1_DI1_PIN02 0x140 0x454 0x000 0x1 0x0 365#define MX6QDL_PAD_EIM_DA10__IPU2_CSI1_DATA_EN 0x13c 0x450 0x8d8 0x2 0x1
366#define MX6Q_PAD_EIM_DA11__IPU2_CSI1_HSYNC 0x140 0x454 0x8dc 0x2 0x1 366#define MX6QDL_PAD_EIM_DA10__GPIO3_IO10 0x13c 0x450 0x000 0x5 0x0
367#define MX6Q_PAD_EIM_DA11__GPIO3_IO11 0x140 0x454 0x000 0x5 0x0 367#define MX6QDL_PAD_EIM_DA10__SRC_BOOT_CFG10 0x13c 0x450 0x000 0x7 0x0
368#define MX6Q_PAD_EIM_DA11__SRC_BOOT_CFG11 0x140 0x454 0x000 0x7 0x0 368#define MX6QDL_PAD_EIM_DA11__EIM_AD11 0x140 0x454 0x000 0x0 0x0
369#define MX6Q_PAD_EIM_DA12__EIM_AD12 0x144 0x458 0x000 0x0 0x0 369#define MX6QDL_PAD_EIM_DA11__IPU1_DI1_PIN02 0x140 0x454 0x000 0x1 0x0
370#define MX6Q_PAD_EIM_DA12__IPU1_DI1_PIN03 0x144 0x458 0x000 0x1 0x0 370#define MX6QDL_PAD_EIM_DA11__IPU2_CSI1_HSYNC 0x140 0x454 0x8dc 0x2 0x1
371#define MX6Q_PAD_EIM_DA12__IPU2_CSI1_VSYNC 0x144 0x458 0x8e4 0x2 0x1 371#define MX6QDL_PAD_EIM_DA11__GPIO3_IO11 0x140 0x454 0x000 0x5 0x0
372#define MX6Q_PAD_EIM_DA12__GPIO3_IO12 0x144 0x458 0x000 0x5 0x0 372#define MX6QDL_PAD_EIM_DA11__SRC_BOOT_CFG11 0x140 0x454 0x000 0x7 0x0
373#define MX6Q_PAD_EIM_DA12__SRC_BOOT_CFG12 0x144 0x458 0x000 0x7 0x0 373#define MX6QDL_PAD_EIM_DA12__EIM_AD12 0x144 0x458 0x000 0x0 0x0
374#define MX6Q_PAD_EIM_DA13__EIM_AD13 0x148 0x45c 0x000 0x0 0x0 374#define MX6QDL_PAD_EIM_DA12__IPU1_DI1_PIN03 0x144 0x458 0x000 0x1 0x0
375#define MX6Q_PAD_EIM_DA13__IPU1_DI1_D0_CS 0x148 0x45c 0x000 0x1 0x0 375#define MX6QDL_PAD_EIM_DA12__IPU2_CSI1_VSYNC 0x144 0x458 0x8e4 0x2 0x1
376#define MX6Q_PAD_EIM_DA13__GPIO3_IO13 0x148 0x45c 0x000 0x5 0x0 376#define MX6QDL_PAD_EIM_DA12__GPIO3_IO12 0x144 0x458 0x000 0x5 0x0
377#define MX6Q_PAD_EIM_DA13__SRC_BOOT_CFG13 0x148 0x45c 0x000 0x7 0x0 377#define MX6QDL_PAD_EIM_DA12__SRC_BOOT_CFG12 0x144 0x458 0x000 0x7 0x0
378#define MX6Q_PAD_EIM_DA14__EIM_AD14 0x14c 0x460 0x000 0x0 0x0 378#define MX6QDL_PAD_EIM_DA13__EIM_AD13 0x148 0x45c 0x000 0x0 0x0
379#define MX6Q_PAD_EIM_DA14__IPU1_DI1_D1_CS 0x14c 0x460 0x000 0x1 0x0 379#define MX6QDL_PAD_EIM_DA13__IPU1_DI1_D0_CS 0x148 0x45c 0x000 0x1 0x0
380#define MX6Q_PAD_EIM_DA14__GPIO3_IO14 0x14c 0x460 0x000 0x5 0x0 380#define MX6QDL_PAD_EIM_DA13__GPIO3_IO13 0x148 0x45c 0x000 0x5 0x0
381#define MX6Q_PAD_EIM_DA14__SRC_BOOT_CFG14 0x14c 0x460 0x000 0x7 0x0 381#define MX6QDL_PAD_EIM_DA13__SRC_BOOT_CFG13 0x148 0x45c 0x000 0x7 0x0
382#define MX6Q_PAD_EIM_DA15__EIM_AD15 0x150 0x464 0x000 0x0 0x0 382#define MX6QDL_PAD_EIM_DA14__EIM_AD14 0x14c 0x460 0x000 0x0 0x0
383#define MX6Q_PAD_EIM_DA15__IPU1_DI1_PIN01 0x150 0x464 0x000 0x1 0x0 383#define MX6QDL_PAD_EIM_DA14__IPU1_DI1_D1_CS 0x14c 0x460 0x000 0x1 0x0
384#define MX6Q_PAD_EIM_DA15__IPU1_DI1_PIN04 0x150 0x464 0x000 0x2 0x0 384#define MX6QDL_PAD_EIM_DA14__GPIO3_IO14 0x14c 0x460 0x000 0x5 0x0
385#define MX6Q_PAD_EIM_DA15__GPIO3_IO15 0x150 0x464 0x000 0x5 0x0 385#define MX6QDL_PAD_EIM_DA14__SRC_BOOT_CFG14 0x14c 0x460 0x000 0x7 0x0
386#define MX6Q_PAD_EIM_DA15__SRC_BOOT_CFG15 0x150 0x464 0x000 0x7 0x0 386#define MX6QDL_PAD_EIM_DA15__EIM_AD15 0x150 0x464 0x000 0x0 0x0
387#define MX6Q_PAD_EIM_WAIT__EIM_WAIT_B 0x154 0x468 0x000 0x0 0x0 387#define MX6QDL_PAD_EIM_DA15__IPU1_DI1_PIN01 0x150 0x464 0x000 0x1 0x0
388#define MX6Q_PAD_EIM_WAIT__EIM_DTACK_B 0x154 0x468 0x000 0x1 0x0 388#define MX6QDL_PAD_EIM_DA15__IPU1_DI1_PIN04 0x150 0x464 0x000 0x2 0x0
389#define MX6Q_PAD_EIM_WAIT__GPIO5_IO00 0x154 0x468 0x000 0x5 0x0 389#define MX6QDL_PAD_EIM_DA15__GPIO3_IO15 0x150 0x464 0x000 0x5 0x0
390#define MX6Q_PAD_EIM_WAIT__SRC_BOOT_CFG25 0x154 0x468 0x000 0x7 0x0 390#define MX6QDL_PAD_EIM_DA15__SRC_BOOT_CFG15 0x150 0x464 0x000 0x7 0x0
391#define MX6Q_PAD_EIM_BCLK__EIM_BCLK 0x158 0x46c 0x000 0x0 0x0 391#define MX6QDL_PAD_EIM_WAIT__EIM_WAIT_B 0x154 0x468 0x000 0x0 0x0
392#define MX6Q_PAD_EIM_BCLK__IPU1_DI1_PIN16 0x158 0x46c 0x000 0x1 0x0 392#define MX6QDL_PAD_EIM_WAIT__EIM_DTACK_B 0x154 0x468 0x000 0x1 0x0
393#define MX6Q_PAD_EIM_BCLK__GPIO6_IO31 0x158 0x46c 0x000 0x5 0x0 393#define MX6QDL_PAD_EIM_WAIT__GPIO5_IO00 0x154 0x468 0x000 0x5 0x0
394#define MX6Q_PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK 0x15c 0x470 0x000 0x0 0x0 394#define MX6QDL_PAD_EIM_WAIT__SRC_BOOT_CFG25 0x154 0x468 0x000 0x7 0x0
395#define MX6Q_PAD_DI0_DISP_CLK__IPU2_DI0_DISP_CLK 0x15c 0x470 0x000 0x1 0x0 395#define MX6QDL_PAD_EIM_BCLK__EIM_BCLK 0x158 0x46c 0x000 0x0 0x0
396#define MX6Q_PAD_DI0_DISP_CLK__GPIO4_IO16 0x15c 0x470 0x000 0x5 0x0 396#define MX6QDL_PAD_EIM_BCLK__IPU1_DI1_PIN16 0x158 0x46c 0x000 0x1 0x0
397#define MX6Q_PAD_DI0_PIN15__IPU1_DI0_PIN15 0x160 0x474 0x000 0x0 0x0 397#define MX6QDL_PAD_EIM_BCLK__GPIO6_IO31 0x158 0x46c 0x000 0x5 0x0
398#define MX6Q_PAD_DI0_PIN15__IPU2_DI0_PIN15 0x160 0x474 0x000 0x1 0x0 398#define MX6QDL_PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK 0x15c 0x470 0x000 0x0 0x0
399#define MX6Q_PAD_DI0_PIN15__AUD6_TXC 0x160 0x474 0x000 0x2 0x0 399#define MX6QDL_PAD_DI0_DISP_CLK__IPU2_DI0_DISP_CLK 0x15c 0x470 0x000 0x1 0x0
400#define MX6Q_PAD_DI0_PIN15__GPIO4_IO17 0x160 0x474 0x000 0x5 0x0 400#define MX6QDL_PAD_DI0_DISP_CLK__GPIO4_IO16 0x15c 0x470 0x000 0x5 0x0
401#define MX6Q_PAD_DI0_PIN2__IPU1_DI0_PIN02 0x164 0x478 0x000 0x0 0x0 401#define MX6QDL_PAD_DI0_PIN15__IPU1_DI0_PIN15 0x160 0x474 0x000 0x0 0x0
402#define MX6Q_PAD_DI0_PIN2__IPU2_DI0_PIN02 0x164 0x478 0x000 0x1 0x0 402#define MX6QDL_PAD_DI0_PIN15__IPU2_DI0_PIN15 0x160 0x474 0x000 0x1 0x0
403#define MX6Q_PAD_DI0_PIN2__AUD6_TXD 0x164 0x478 0x000 0x2 0x0 403#define MX6QDL_PAD_DI0_PIN15__AUD6_TXC 0x160 0x474 0x000 0x2 0x0
404#define MX6Q_PAD_DI0_PIN2__GPIO4_IO18 0x164 0x478 0x000 0x5 0x0 404#define MX6QDL_PAD_DI0_PIN15__GPIO4_IO17 0x160 0x474 0x000 0x5 0x0
405#define MX6Q_PAD_DI0_PIN3__IPU1_DI0_PIN03 0x168 0x47c 0x000 0x0 0x0 405#define MX6QDL_PAD_DI0_PIN2__IPU1_DI0_PIN02 0x164 0x478 0x000 0x0 0x0
406#define MX6Q_PAD_DI0_PIN3__IPU2_DI0_PIN03 0x168 0x47c 0x000 0x1 0x0 406#define MX6QDL_PAD_DI0_PIN2__IPU2_DI0_PIN02 0x164 0x478 0x000 0x1 0x0
407#define MX6Q_PAD_DI0_PIN3__AUD6_TXFS 0x168 0x47c 0x000 0x2 0x0 407#define MX6QDL_PAD_DI0_PIN2__AUD6_TXD 0x164 0x478 0x000 0x2 0x0
408#define MX6Q_PAD_DI0_PIN3__GPIO4_IO19 0x168 0x47c 0x000 0x5 0x0 408#define MX6QDL_PAD_DI0_PIN2__GPIO4_IO18 0x164 0x478 0x000 0x5 0x0
409#define MX6Q_PAD_DI0_PIN4__IPU1_DI0_PIN04 0x16c 0x480 0x000 0x0 0x0 409#define MX6QDL_PAD_DI0_PIN3__IPU1_DI0_PIN03 0x168 0x47c 0x000 0x0 0x0
410#define MX6Q_PAD_DI0_PIN4__IPU2_DI0_PIN04 0x16c 0x480 0x000 0x1 0x0 410#define MX6QDL_PAD_DI0_PIN3__IPU2_DI0_PIN03 0x168 0x47c 0x000 0x1 0x0
411#define MX6Q_PAD_DI0_PIN4__AUD6_RXD 0x16c 0x480 0x000 0x2 0x0 411#define MX6QDL_PAD_DI0_PIN3__AUD6_TXFS 0x168 0x47c 0x000 0x2 0x0
412#define MX6Q_PAD_DI0_PIN4__SD1_WP 0x16c 0x480 0x94c 0x3 0x0 412#define MX6QDL_PAD_DI0_PIN3__GPIO4_IO19 0x168 0x47c 0x000 0x5 0x0
413#define MX6Q_PAD_DI0_PIN4__GPIO4_IO20 0x16c 0x480 0x000 0x5 0x0 413#define MX6QDL_PAD_DI0_PIN4__IPU1_DI0_PIN04 0x16c 0x480 0x000 0x0 0x0
414#define MX6Q_PAD_DISP0_DAT0__IPU1_DISP0_DATA00 0x170 0x484 0x000 0x0 0x0 414#define MX6QDL_PAD_DI0_PIN4__IPU2_DI0_PIN04 0x16c 0x480 0x000 0x1 0x0
415#define MX6Q_PAD_DISP0_DAT0__IPU2_DISP0_DATA00 0x170 0x484 0x000 0x1 0x0 415#define MX6QDL_PAD_DI0_PIN4__AUD6_RXD 0x16c 0x480 0x000 0x2 0x0
416#define MX6Q_PAD_DISP0_DAT0__ECSPI3_SCLK 0x170 0x484 0x000 0x2 0x0 416#define MX6QDL_PAD_DI0_PIN4__SD1_WP 0x16c 0x480 0x94c 0x3 0x0
417#define MX6Q_PAD_DISP0_DAT0__GPIO4_IO21 0x170 0x484 0x000 0x5 0x0 417#define MX6QDL_PAD_DI0_PIN4__GPIO4_IO20 0x16c 0x480 0x000 0x5 0x0
418#define MX6Q_PAD_DISP0_DAT1__IPU1_DISP0_DATA01 0x174 0x488 0x000 0x0 0x0 418#define MX6QDL_PAD_DISP0_DAT0__IPU1_DISP0_DATA00 0x170 0x484 0x000 0x0 0x0
419#define MX6Q_PAD_DISP0_DAT1__IPU2_DISP0_DATA01 0x174 0x488 0x000 0x1 0x0 419#define MX6QDL_PAD_DISP0_DAT0__IPU2_DISP0_DATA00 0x170 0x484 0x000 0x1 0x0
420#define MX6Q_PAD_DISP0_DAT1__ECSPI3_MOSI 0x174 0x488 0x000 0x2 0x0 420#define MX6QDL_PAD_DISP0_DAT0__ECSPI3_SCLK 0x170 0x484 0x000 0x2 0x0
421#define MX6Q_PAD_DISP0_DAT1__GPIO4_IO22 0x174 0x488 0x000 0x5 0x0 421#define MX6QDL_PAD_DISP0_DAT0__GPIO4_IO21 0x170 0x484 0x000 0x5 0x0
422#define MX6Q_PAD_DISP0_DAT2__IPU1_DISP0_DATA02 0x178 0x48c 0x000 0x0 0x0 422#define MX6QDL_PAD_DISP0_DAT1__IPU1_DISP0_DATA01 0x174 0x488 0x000 0x0 0x0
423#define MX6Q_PAD_DISP0_DAT2__IPU2_DISP0_DATA02 0x178 0x48c 0x000 0x1 0x0 423#define MX6QDL_PAD_DISP0_DAT1__IPU2_DISP0_DATA01 0x174 0x488 0x000 0x1 0x0
424#define MX6Q_PAD_DISP0_DAT2__ECSPI3_MISO 0x178 0x48c 0x000 0x2 0x0 424#define MX6QDL_PAD_DISP0_DAT1__ECSPI3_MOSI 0x174 0x488 0x000 0x2 0x0
425#define MX6Q_PAD_DISP0_DAT2__GPIO4_IO23 0x178 0x48c 0x000 0x5 0x0 425#define MX6QDL_PAD_DISP0_DAT1__GPIO4_IO22 0x174 0x488 0x000 0x5 0x0
426#define MX6Q_PAD_DISP0_DAT3__IPU1_DISP0_DATA03 0x17c 0x490 0x000 0x0 0x0 426#define MX6QDL_PAD_DISP0_DAT2__IPU1_DISP0_DATA02 0x178 0x48c 0x000 0x0 0x0
427#define MX6Q_PAD_DISP0_DAT3__IPU2_DISP0_DATA03 0x17c 0x490 0x000 0x1 0x0 427#define MX6QDL_PAD_DISP0_DAT2__IPU2_DISP0_DATA02 0x178 0x48c 0x000 0x1 0x0
428#define MX6Q_PAD_DISP0_DAT3__ECSPI3_SS0 0x17c 0x490 0x000 0x2 0x0 428#define MX6QDL_PAD_DISP0_DAT2__ECSPI3_MISO 0x178 0x48c 0x000 0x2 0x0
429#define MX6Q_PAD_DISP0_DAT3__GPIO4_IO24 0x17c 0x490 0x000 0x5 0x0 429#define MX6QDL_PAD_DISP0_DAT2__GPIO4_IO23 0x178 0x48c 0x000 0x5 0x0
430#define MX6Q_PAD_DISP0_DAT4__IPU1_DISP0_DATA04 0x180 0x494 0x000 0x0 0x0 430#define MX6QDL_PAD_DISP0_DAT3__IPU1_DISP0_DATA03 0x17c 0x490 0x000 0x0 0x0
431#define MX6Q_PAD_DISP0_DAT4__IPU2_DISP0_DATA04 0x180 0x494 0x000 0x1 0x0 431#define MX6QDL_PAD_DISP0_DAT3__IPU2_DISP0_DATA03 0x17c 0x490 0x000 0x1 0x0
432#define MX6Q_PAD_DISP0_DAT4__ECSPI3_SS1 0x180 0x494 0x000 0x2 0x0 432#define MX6QDL_PAD_DISP0_DAT3__ECSPI3_SS0 0x17c 0x490 0x000 0x2 0x0
433#define MX6Q_PAD_DISP0_DAT4__GPIO4_IO25 0x180 0x494 0x000 0x5 0x0 433#define MX6QDL_PAD_DISP0_DAT3__GPIO4_IO24 0x17c 0x490 0x000 0x5 0x0
434#define MX6Q_PAD_DISP0_DAT5__IPU1_DISP0_DATA05 0x184 0x498 0x000 0x0 0x0 434#define MX6QDL_PAD_DISP0_DAT4__IPU1_DISP0_DATA04 0x180 0x494 0x000 0x0 0x0
435#define MX6Q_PAD_DISP0_DAT5__IPU2_DISP0_DATA05 0x184 0x498 0x000 0x1 0x0 435#define MX6QDL_PAD_DISP0_DAT4__IPU2_DISP0_DATA04 0x180 0x494 0x000 0x1 0x0
436#define MX6Q_PAD_DISP0_DAT5__ECSPI3_SS2 0x184 0x498 0x000 0x2 0x0 436#define MX6QDL_PAD_DISP0_DAT4__ECSPI3_SS1 0x180 0x494 0x000 0x2 0x0
437#define MX6Q_PAD_DISP0_DAT5__AUD6_RXFS 0x184 0x498 0x000 0x3 0x0 437#define MX6QDL_PAD_DISP0_DAT4__GPIO4_IO25 0x180 0x494 0x000 0x5 0x0
438#define MX6Q_PAD_DISP0_DAT5__GPIO4_IO26 0x184 0x498 0x000 0x5 0x0 438#define MX6QDL_PAD_DISP0_DAT5__IPU1_DISP0_DATA05 0x184 0x498 0x000 0x0 0x0
439#define MX6Q_PAD_DISP0_DAT6__IPU1_DISP0_DATA06 0x188 0x49c 0x000 0x0 0x0 439#define MX6QDL_PAD_DISP0_DAT5__IPU2_DISP0_DATA05 0x184 0x498 0x000 0x1 0x0
440#define MX6Q_PAD_DISP0_DAT6__IPU2_DISP0_DATA06 0x188 0x49c 0x000 0x1 0x0 440#define MX6QDL_PAD_DISP0_DAT5__ECSPI3_SS2 0x184 0x498 0x000 0x2 0x0
441#define MX6Q_PAD_DISP0_DAT6__ECSPI3_SS3 0x188 0x49c 0x000 0x2 0x0 441#define MX6QDL_PAD_DISP0_DAT5__AUD6_RXFS 0x184 0x498 0x000 0x3 0x0
442#define MX6Q_PAD_DISP0_DAT6__AUD6_RXC 0x188 0x49c 0x000 0x3 0x0 442#define MX6QDL_PAD_DISP0_DAT5__GPIO4_IO26 0x184 0x498 0x000 0x5 0x0
443#define MX6Q_PAD_DISP0_DAT6__GPIO4_IO27 0x188 0x49c 0x000 0x5 0x0 443#define MX6QDL_PAD_DISP0_DAT6__IPU1_DISP0_DATA06 0x188 0x49c 0x000 0x0 0x0
444#define MX6Q_PAD_DISP0_DAT7__IPU1_DISP0_DATA07 0x18c 0x4a0 0x000 0x0 0x0 444#define MX6QDL_PAD_DISP0_DAT6__IPU2_DISP0_DATA06 0x188 0x49c 0x000 0x1 0x0
445#define MX6Q_PAD_DISP0_DAT7__IPU2_DISP0_DATA07 0x18c 0x4a0 0x000 0x1 0x0 445#define MX6QDL_PAD_DISP0_DAT6__ECSPI3_SS3 0x188 0x49c 0x000 0x2 0x0
446#define MX6Q_PAD_DISP0_DAT7__ECSPI3_RDY 0x18c 0x4a0 0x000 0x2 0x0 446#define MX6QDL_PAD_DISP0_DAT6__AUD6_RXC 0x188 0x49c 0x000 0x3 0x0
447#define MX6Q_PAD_DISP0_DAT7__GPIO4_IO28 0x18c 0x4a0 0x000 0x5 0x0 447#define MX6QDL_PAD_DISP0_DAT6__GPIO4_IO27 0x188 0x49c 0x000 0x5 0x0
448#define MX6Q_PAD_DISP0_DAT8__IPU1_DISP0_DATA08 0x190 0x4a4 0x000 0x0 0x0 448#define MX6QDL_PAD_DISP0_DAT7__IPU1_DISP0_DATA07 0x18c 0x4a0 0x000 0x0 0x0
449#define MX6Q_PAD_DISP0_DAT8__IPU2_DISP0_DATA08 0x190 0x4a4 0x000 0x1 0x0 449#define MX6QDL_PAD_DISP0_DAT7__IPU2_DISP0_DATA07 0x18c 0x4a0 0x000 0x1 0x0
450#define MX6Q_PAD_DISP0_DAT8__PWM1_OUT 0x190 0x4a4 0x000 0x2 0x0 450#define MX6QDL_PAD_DISP0_DAT7__ECSPI3_RDY 0x18c 0x4a0 0x000 0x2 0x0
451#define MX6Q_PAD_DISP0_DAT8__WDOG1_B 0x190 0x4a4 0x000 0x3 0x0 451#define MX6QDL_PAD_DISP0_DAT7__GPIO4_IO28 0x18c 0x4a0 0x000 0x5 0x0
452#define MX6Q_PAD_DISP0_DAT8__GPIO4_IO29 0x190 0x4a4 0x000 0x5 0x0 452#define MX6QDL_PAD_DISP0_DAT8__IPU1_DISP0_DATA08 0x190 0x4a4 0x000 0x0 0x0
453#define MX6Q_PAD_DISP0_DAT9__IPU1_DISP0_DATA09 0x194 0x4a8 0x000 0x0 0x0 453#define MX6QDL_PAD_DISP0_DAT8__IPU2_DISP0_DATA08 0x190 0x4a4 0x000 0x1 0x0
454#define MX6Q_PAD_DISP0_DAT9__IPU2_DISP0_DATA09 0x194 0x4a8 0x000 0x1 0x0 454#define MX6QDL_PAD_DISP0_DAT8__PWM1_OUT 0x190 0x4a4 0x000 0x2 0x0
455#define MX6Q_PAD_DISP0_DAT9__PWM2_OUT 0x194 0x4a8 0x000 0x2 0x0 455#define MX6QDL_PAD_DISP0_DAT8__WDOG1_B 0x190 0x4a4 0x000 0x3 0x0
456#define MX6Q_PAD_DISP0_DAT9__WDOG2_B 0x194 0x4a8 0x000 0x3 0x0 456#define MX6QDL_PAD_DISP0_DAT8__GPIO4_IO29 0x190 0x4a4 0x000 0x5 0x0
457#define MX6Q_PAD_DISP0_DAT9__GPIO4_IO30 0x194 0x4a8 0x000 0x5 0x0 457#define MX6QDL_PAD_DISP0_DAT9__IPU1_DISP0_DATA09 0x194 0x4a8 0x000 0x0 0x0
458#define MX6Q_PAD_DISP0_DAT10__IPU1_DISP0_DATA10 0x198 0x4ac 0x000 0x0 0x0 458#define MX6QDL_PAD_DISP0_DAT9__IPU2_DISP0_DATA09 0x194 0x4a8 0x000 0x1 0x0
459#define MX6Q_PAD_DISP0_DAT10__IPU2_DISP0_DATA10 0x198 0x4ac 0x000 0x1 0x0 459#define MX6QDL_PAD_DISP0_DAT9__PWM2_OUT 0x194 0x4a8 0x000 0x2 0x0
460#define MX6Q_PAD_DISP0_DAT10__GPIO4_IO31 0x198 0x4ac 0x000 0x5 0x0 460#define MX6QDL_PAD_DISP0_DAT9__WDOG2_B 0x194 0x4a8 0x000 0x3 0x0
461#define MX6Q_PAD_DISP0_DAT11__IPU1_DISP0_DATA11 0x19c 0x4b0 0x000 0x0 0x0 461#define MX6QDL_PAD_DISP0_DAT9__GPIO4_IO30 0x194 0x4a8 0x000 0x5 0x0
462#define MX6Q_PAD_DISP0_DAT11__IPU2_DISP0_DATA11 0x19c 0x4b0 0x000 0x1 0x0 462#define MX6QDL_PAD_DISP0_DAT10__IPU1_DISP0_DATA10 0x198 0x4ac 0x000 0x0 0x0
463#define MX6Q_PAD_DISP0_DAT11__GPIO5_IO05 0x19c 0x4b0 0x000 0x5 0x0 463#define MX6QDL_PAD_DISP0_DAT10__IPU2_DISP0_DATA10 0x198 0x4ac 0x000 0x1 0x0
464#define MX6Q_PAD_DISP0_DAT12__IPU1_DISP0_DATA12 0x1a0 0x4b4 0x000 0x0 0x0 464#define MX6QDL_PAD_DISP0_DAT10__GPIO4_IO31 0x198 0x4ac 0x000 0x5 0x0
465#define MX6Q_PAD_DISP0_DAT12__IPU2_DISP0_DATA12 0x1a0 0x4b4 0x000 0x1 0x0 465#define MX6QDL_PAD_DISP0_DAT11__IPU1_DISP0_DATA11 0x19c 0x4b0 0x000 0x0 0x0
466#define MX6Q_PAD_DISP0_DAT12__GPIO5_IO06 0x1a0 0x4b4 0x000 0x5 0x0 466#define MX6QDL_PAD_DISP0_DAT11__IPU2_DISP0_DATA11 0x19c 0x4b0 0x000 0x1 0x0
467#define MX6Q_PAD_DISP0_DAT13__IPU1_DISP0_DATA13 0x1a4 0x4b8 0x000 0x0 0x0 467#define MX6QDL_PAD_DISP0_DAT11__GPIO5_IO05 0x19c 0x4b0 0x000 0x5 0x0
468#define MX6Q_PAD_DISP0_DAT13__IPU2_DISP0_DATA13 0x1a4 0x4b8 0x000 0x1 0x0 468#define MX6QDL_PAD_DISP0_DAT12__IPU1_DISP0_DATA12 0x1a0 0x4b4 0x000 0x0 0x0
469#define MX6Q_PAD_DISP0_DAT13__AUD5_RXFS 0x1a4 0x4b8 0x7d8 0x3 0x1 469#define MX6QDL_PAD_DISP0_DAT12__IPU2_DISP0_DATA12 0x1a0 0x4b4 0x000 0x1 0x0
470#define MX6Q_PAD_DISP0_DAT13__GPIO5_IO07 0x1a4 0x4b8 0x000 0x5 0x0 470#define MX6QDL_PAD_DISP0_DAT12__GPIO5_IO06 0x1a0 0x4b4 0x000 0x5 0x0
471#define MX6Q_PAD_DISP0_DAT14__IPU1_DISP0_DATA14 0x1a8 0x4bc 0x000 0x0 0x0 471#define MX6QDL_PAD_DISP0_DAT13__IPU1_DISP0_DATA13 0x1a4 0x4b8 0x000 0x0 0x0
472#define MX6Q_PAD_DISP0_DAT14__IPU2_DISP0_DATA14 0x1a8 0x4bc 0x000 0x1 0x0 472#define MX6QDL_PAD_DISP0_DAT13__IPU2_DISP0_DATA13 0x1a4 0x4b8 0x000 0x1 0x0
473#define MX6Q_PAD_DISP0_DAT14__AUD5_RXC 0x1a8 0x4bc 0x7d4 0x3 0x1 473#define MX6QDL_PAD_DISP0_DAT13__AUD5_RXFS 0x1a4 0x4b8 0x7d8 0x3 0x1
474#define MX6Q_PAD_DISP0_DAT14__GPIO5_IO08 0x1a8 0x4bc 0x000 0x5 0x0 474#define MX6QDL_PAD_DISP0_DAT13__GPIO5_IO07 0x1a4 0x4b8 0x000 0x5 0x0
475#define MX6Q_PAD_DISP0_DAT15__IPU1_DISP0_DATA15 0x1ac 0x4c0 0x000 0x0 0x0 475#define MX6QDL_PAD_DISP0_DAT14__IPU1_DISP0_DATA14 0x1a8 0x4bc 0x000 0x0 0x0
476#define MX6Q_PAD_DISP0_DAT15__IPU2_DISP0_DATA15 0x1ac 0x4c0 0x000 0x1 0x0 476#define MX6QDL_PAD_DISP0_DAT14__IPU2_DISP0_DATA14 0x1a8 0x4bc 0x000 0x1 0x0
477#define MX6Q_PAD_DISP0_DAT15__ECSPI1_SS1 0x1ac 0x4c0 0x804 0x2 0x1 477#define MX6QDL_PAD_DISP0_DAT14__AUD5_RXC 0x1a8 0x4bc 0x7d4 0x3 0x1
478#define MX6Q_PAD_DISP0_DAT15__ECSPI2_SS1 0x1ac 0x4c0 0x820 0x3 0x1 478#define MX6QDL_PAD_DISP0_DAT14__GPIO5_IO08 0x1a8 0x4bc 0x000 0x5 0x0
479#define MX6Q_PAD_DISP0_DAT15__GPIO5_IO09 0x1ac 0x4c0 0x000 0x5 0x0 479#define MX6QDL_PAD_DISP0_DAT15__IPU1_DISP0_DATA15 0x1ac 0x4c0 0x000 0x0 0x0
480#define MX6Q_PAD_DISP0_DAT16__IPU1_DISP0_DATA16 0x1b0 0x4c4 0x000 0x0 0x0 480#define MX6QDL_PAD_DISP0_DAT15__IPU2_DISP0_DATA15 0x1ac 0x4c0 0x000 0x1 0x0
481#define MX6Q_PAD_DISP0_DAT16__IPU2_DISP0_DATA16 0x1b0 0x4c4 0x000 0x1 0x0 481#define MX6QDL_PAD_DISP0_DAT15__ECSPI1_SS1 0x1ac 0x4c0 0x804 0x2 0x1
482#define MX6Q_PAD_DISP0_DAT16__ECSPI2_MOSI 0x1b0 0x4c4 0x818 0x2 0x1 482#define MX6QDL_PAD_DISP0_DAT15__ECSPI2_SS1 0x1ac 0x4c0 0x820 0x3 0x1
483#define MX6Q_PAD_DISP0_DAT16__AUD5_TXC 0x1b0 0x4c4 0x7dc 0x3 0x0 483#define MX6QDL_PAD_DISP0_DAT15__GPIO5_IO09 0x1ac 0x4c0 0x000 0x5 0x0
484#define MX6Q_PAD_DISP0_DAT16__SDMA_EXT_EVENT0 0x1b0 0x4c4 0x90c 0x4 0x0 484#define MX6QDL_PAD_DISP0_DAT16__IPU1_DISP0_DATA16 0x1b0 0x4c4 0x000 0x0 0x0
485#define MX6Q_PAD_DISP0_DAT16__GPIO5_IO10 0x1b0 0x4c4 0x000 0x5 0x0 485#define MX6QDL_PAD_DISP0_DAT16__IPU2_DISP0_DATA16 0x1b0 0x4c4 0x000 0x1 0x0
486#define MX6Q_PAD_DISP0_DAT17__IPU1_DISP0_DATA17 0x1b4 0x4c8 0x000 0x0 0x0 486#define MX6QDL_PAD_DISP0_DAT16__ECSPI2_MOSI 0x1b0 0x4c4 0x818 0x2 0x1
487#define MX6Q_PAD_DISP0_DAT17__IPU2_DISP0_DATA17 0x1b4 0x4c8 0x000 0x1 0x0 487#define MX6QDL_PAD_DISP0_DAT16__AUD5_TXC 0x1b0 0x4c4 0x7dc 0x3 0x0
488#define MX6Q_PAD_DISP0_DAT17__ECSPI2_MISO 0x1b4 0x4c8 0x814 0x2 0x1 488#define MX6QDL_PAD_DISP0_DAT16__SDMA_EXT_EVENT0 0x1b0 0x4c4 0x90c 0x4 0x0
489#define MX6Q_PAD_DISP0_DAT17__AUD5_TXD 0x1b4 0x4c8 0x7d0 0x3 0x0 489#define MX6QDL_PAD_DISP0_DAT16__GPIO5_IO10 0x1b0 0x4c4 0x000 0x5 0x0
490#define MX6Q_PAD_DISP0_DAT17__SDMA_EXT_EVENT1 0x1b4 0x4c8 0x910 0x4 0x0 490#define MX6QDL_PAD_DISP0_DAT17__IPU1_DISP0_DATA17 0x1b4 0x4c8 0x000 0x0 0x0
491#define MX6Q_PAD_DISP0_DAT17__GPIO5_IO11 0x1b4 0x4c8 0x000 0x5 0x0 491#define MX6QDL_PAD_DISP0_DAT17__IPU2_DISP0_DATA17 0x1b4 0x4c8 0x000 0x1 0x0
492#define MX6Q_PAD_DISP0_DAT18__IPU1_DISP0_DATA18 0x1b8 0x4cc 0x000 0x0 0x0 492#define MX6QDL_PAD_DISP0_DAT17__ECSPI2_MISO 0x1b4 0x4c8 0x814 0x2 0x1
493#define MX6Q_PAD_DISP0_DAT18__IPU2_DISP0_DATA18 0x1b8 0x4cc 0x000 0x1 0x0 493#define MX6QDL_PAD_DISP0_DAT17__AUD5_TXD 0x1b4 0x4c8 0x7d0 0x3 0x0
494#define MX6Q_PAD_DISP0_DAT18__ECSPI2_SS0 0x1b8 0x4cc 0x81c 0x2 0x1 494#define MX6QDL_PAD_DISP0_DAT17__SDMA_EXT_EVENT1 0x1b4 0x4c8 0x910 0x4 0x0
495#define MX6Q_PAD_DISP0_DAT18__AUD5_TXFS 0x1b8 0x4cc 0x7e0 0x3 0x0 495#define MX6QDL_PAD_DISP0_DAT17__GPIO5_IO11 0x1b4 0x4c8 0x000 0x5 0x0
496#define MX6Q_PAD_DISP0_DAT18__AUD4_RXFS 0x1b8 0x4cc 0x7c0 0x4 0x0 496#define MX6QDL_PAD_DISP0_DAT18__IPU1_DISP0_DATA18 0x1b8 0x4cc 0x000 0x0 0x0
497#define MX6Q_PAD_DISP0_DAT18__GPIO5_IO12 0x1b8 0x4cc 0x000 0x5 0x0 497#define MX6QDL_PAD_DISP0_DAT18__IPU2_DISP0_DATA18 0x1b8 0x4cc 0x000 0x1 0x0
498#define MX6Q_PAD_DISP0_DAT18__EIM_CS2_B 0x1b8 0x4cc 0x000 0x7 0x0 498#define MX6QDL_PAD_DISP0_DAT18__ECSPI2_SS0 0x1b8 0x4cc 0x81c 0x2 0x1
499#define MX6Q_PAD_DISP0_DAT19__IPU1_DISP0_DATA19 0x1bc 0x4d0 0x000 0x0 0x0 499#define MX6QDL_PAD_DISP0_DAT18__AUD5_TXFS 0x1b8 0x4cc 0x7e0 0x3 0x0
500#define MX6Q_PAD_DISP0_DAT19__IPU2_DISP0_DATA19 0x1bc 0x4d0 0x000 0x1 0x0 500#define MX6QDL_PAD_DISP0_DAT18__AUD4_RXFS 0x1b8 0x4cc 0x7c0 0x4 0x0
501#define MX6Q_PAD_DISP0_DAT19__ECSPI2_SCLK 0x1bc 0x4d0 0x810 0x2 0x1 501#define MX6QDL_PAD_DISP0_DAT18__GPIO5_IO12 0x1b8 0x4cc 0x000 0x5 0x0
502#define MX6Q_PAD_DISP0_DAT19__AUD5_RXD 0x1bc 0x4d0 0x7cc 0x3 0x0 502#define MX6QDL_PAD_DISP0_DAT18__EIM_CS2_B 0x1b8 0x4cc 0x000 0x7 0x0
503#define MX6Q_PAD_DISP0_DAT19__AUD4_RXC 0x1bc 0x4d0 0x7bc 0x4 0x0 503#define MX6QDL_PAD_DISP0_DAT19__IPU1_DISP0_DATA19 0x1bc 0x4d0 0x000 0x0 0x0
504#define MX6Q_PAD_DISP0_DAT19__GPIO5_IO13 0x1bc 0x4d0 0x000 0x5 0x0 504#define MX6QDL_PAD_DISP0_DAT19__IPU2_DISP0_DATA19 0x1bc 0x4d0 0x000 0x1 0x0
505#define MX6Q_PAD_DISP0_DAT19__EIM_CS3_B 0x1bc 0x4d0 0x000 0x7 0x0 505#define MX6QDL_PAD_DISP0_DAT19__ECSPI2_SCLK 0x1bc 0x4d0 0x810 0x2 0x1
506#define MX6Q_PAD_DISP0_DAT20__IPU1_DISP0_DATA20 0x1c0 0x4d4 0x000 0x0 0x0 506#define MX6QDL_PAD_DISP0_DAT19__AUD5_RXD 0x1bc 0x4d0 0x7cc 0x3 0x0
507#define MX6Q_PAD_DISP0_DAT20__IPU2_DISP0_DATA20 0x1c0 0x4d4 0x000 0x1 0x0 507#define MX6QDL_PAD_DISP0_DAT19__AUD4_RXC 0x1bc 0x4d0 0x7bc 0x4 0x0
508#define MX6Q_PAD_DISP0_DAT20__ECSPI1_SCLK 0x1c0 0x4d4 0x7f4 0x2 0x1 508#define MX6QDL_PAD_DISP0_DAT19__GPIO5_IO13 0x1bc 0x4d0 0x000 0x5 0x0
509#define MX6Q_PAD_DISP0_DAT20__AUD4_TXC 0x1c0 0x4d4 0x7c4 0x3 0x0 509#define MX6QDL_PAD_DISP0_DAT19__EIM_CS3_B 0x1bc 0x4d0 0x000 0x7 0x0
510#define MX6Q_PAD_DISP0_DAT20__GPIO5_IO14 0x1c0 0x4d4 0x000 0x5 0x0 510#define MX6QDL_PAD_DISP0_DAT20__IPU1_DISP0_DATA20 0x1c0 0x4d4 0x000 0x0 0x0
511#define MX6Q_PAD_DISP0_DAT21__IPU1_DISP0_DATA21 0x1c4 0x4d8 0x000 0x0 0x0 511#define MX6QDL_PAD_DISP0_DAT20__IPU2_DISP0_DATA20 0x1c0 0x4d4 0x000 0x1 0x0
512#define MX6Q_PAD_DISP0_DAT21__IPU2_DISP0_DATA21 0x1c4 0x4d8 0x000 0x1 0x0 512#define MX6QDL_PAD_DISP0_DAT20__ECSPI1_SCLK 0x1c0 0x4d4 0x7f4 0x2 0x1
513#define MX6Q_PAD_DISP0_DAT21__ECSPI1_MOSI 0x1c4 0x4d8 0x7fc 0x2 0x1 513#define MX6QDL_PAD_DISP0_DAT20__AUD4_TXC 0x1c0 0x4d4 0x7c4 0x3 0x0
514#define MX6Q_PAD_DISP0_DAT21__AUD4_TXD 0x1c4 0x4d8 0x7b8 0x3 0x1 514#define MX6QDL_PAD_DISP0_DAT20__GPIO5_IO14 0x1c0 0x4d4 0x000 0x5 0x0
515#define MX6Q_PAD_DISP0_DAT21__GPIO5_IO15 0x1c4 0x4d8 0x000 0x5 0x0 515#define MX6QDL_PAD_DISP0_DAT21__IPU1_DISP0_DATA21 0x1c4 0x4d8 0x000 0x0 0x0
516#define MX6Q_PAD_DISP0_DAT22__IPU1_DISP0_DATA22 0x1c8 0x4dc 0x000 0x0 0x0 516#define MX6QDL_PAD_DISP0_DAT21__IPU2_DISP0_DATA21 0x1c4 0x4d8 0x000 0x1 0x0
517#define MX6Q_PAD_DISP0_DAT22__IPU2_DISP0_DATA22 0x1c8 0x4dc 0x000 0x1 0x0 517#define MX6QDL_PAD_DISP0_DAT21__ECSPI1_MOSI 0x1c4 0x4d8 0x7fc 0x2 0x1
518#define MX6Q_PAD_DISP0_DAT22__ECSPI1_MISO 0x1c8 0x4dc 0x7f8 0x2 0x1 518#define MX6QDL_PAD_DISP0_DAT21__AUD4_TXD 0x1c4 0x4d8 0x7b8 0x3 0x1
519#define MX6Q_PAD_DISP0_DAT22__AUD4_TXFS 0x1c8 0x4dc 0x7c8 0x3 0x1 519#define MX6QDL_PAD_DISP0_DAT21__GPIO5_IO15 0x1c4 0x4d8 0x000 0x5 0x0
520#define MX6Q_PAD_DISP0_DAT22__GPIO5_IO16 0x1c8 0x4dc 0x000 0x5 0x0 520#define MX6QDL_PAD_DISP0_DAT22__IPU1_DISP0_DATA22 0x1c8 0x4dc 0x000 0x0 0x0
521#define MX6Q_PAD_DISP0_DAT23__IPU1_DISP0_DATA23 0x1cc 0x4e0 0x000 0x0 0x0 521#define MX6QDL_PAD_DISP0_DAT22__IPU2_DISP0_DATA22 0x1c8 0x4dc 0x000 0x1 0x0
522#define MX6Q_PAD_DISP0_DAT23__IPU2_DISP0_DATA23 0x1cc 0x4e0 0x000 0x1 0x0 522#define MX6QDL_PAD_DISP0_DAT22__ECSPI1_MISO 0x1c8 0x4dc 0x7f8 0x2 0x1
523#define MX6Q_PAD_DISP0_DAT23__ECSPI1_SS0 0x1cc 0x4e0 0x800 0x2 0x1 523#define MX6QDL_PAD_DISP0_DAT22__AUD4_TXFS 0x1c8 0x4dc 0x7c8 0x3 0x1
524#define MX6Q_PAD_DISP0_DAT23__AUD4_RXD 0x1cc 0x4e0 0x7b4 0x3 0x1 524#define MX6QDL_PAD_DISP0_DAT22__GPIO5_IO16 0x1c8 0x4dc 0x000 0x5 0x0
525#define MX6Q_PAD_DISP0_DAT23__GPIO5_IO17 0x1cc 0x4e0 0x000 0x5 0x0 525#define MX6QDL_PAD_DISP0_DAT23__IPU1_DISP0_DATA23 0x1cc 0x4e0 0x000 0x0 0x0
526#define MX6Q_PAD_ENET_MDIO__ENET_MDIO 0x1d0 0x4e4 0x840 0x1 0x0 526#define MX6QDL_PAD_DISP0_DAT23__IPU2_DISP0_DATA23 0x1cc 0x4e0 0x000 0x1 0x0
527#define MX6Q_PAD_ENET_MDIO__ESAI_RX_CLK 0x1d0 0x4e4 0x86c 0x2 0x0 527#define MX6QDL_PAD_DISP0_DAT23__ECSPI1_SS0 0x1cc 0x4e0 0x800 0x2 0x1
528#define MX6Q_PAD_ENET_MDIO__ENET_1588_EVENT1_OUT 0x1d0 0x4e4 0x000 0x4 0x0 528#define MX6QDL_PAD_DISP0_DAT23__AUD4_RXD 0x1cc 0x4e0 0x7b4 0x3 0x1
529#define MX6Q_PAD_ENET_MDIO__GPIO1_IO22 0x1d0 0x4e4 0x000 0x5 0x0 529#define MX6QDL_PAD_DISP0_DAT23__GPIO5_IO17 0x1cc 0x4e0 0x000 0x5 0x0
530#define MX6Q_PAD_ENET_MDIO__SPDIF_LOCK 0x1d0 0x4e4 0x000 0x6 0x0 530#define MX6QDL_PAD_ENET_MDIO__ENET_MDIO 0x1d0 0x4e4 0x840 0x1 0x0
531#define MX6Q_PAD_ENET_REF_CLK__ENET_TX_CLK 0x1d4 0x4e8 0x000 0x1 0x0 531#define MX6QDL_PAD_ENET_MDIO__ESAI_RX_CLK 0x1d0 0x4e4 0x86c 0x2 0x0
532#define MX6Q_PAD_ENET_REF_CLK__ESAI_RX_FS 0x1d4 0x4e8 0x85c 0x2 0x0 532#define MX6QDL_PAD_ENET_MDIO__ENET_1588_EVENT1_OUT 0x1d0 0x4e4 0x000 0x4 0x0
533#define MX6Q_PAD_ENET_REF_CLK__GPIO1_IO23 0x1d4 0x4e8 0x000 0x5 0x0 533#define MX6QDL_PAD_ENET_MDIO__GPIO1_IO22 0x1d0 0x4e4 0x000 0x5 0x0
534#define MX6Q_PAD_ENET_REF_CLK__SPDIF_SR_CLK 0x1d4 0x4e8 0x000 0x6 0x0 534#define MX6QDL_PAD_ENET_MDIO__SPDIF_LOCK 0x1d0 0x4e4 0x000 0x6 0x0
535#define MX6Q_PAD_ENET_RX_ER__USB_OTG_ID 0x1d8 0x4ec 0x000 0x0 0x0 535#define MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK 0x1d4 0x4e8 0x000 0x1 0x0
536#define MX6Q_PAD_ENET_RX_ER__ENET_RX_ER 0x1d8 0x4ec 0x000 0x1 0x0 536#define MX6QDL_PAD_ENET_REF_CLK__ESAI_RX_FS 0x1d4 0x4e8 0x85c 0x2 0x0
537#define MX6Q_PAD_ENET_RX_ER__ESAI_RX_HF_CLK 0x1d8 0x4ec 0x864 0x2 0x0 537#define MX6QDL_PAD_ENET_REF_CLK__GPIO1_IO23 0x1d4 0x4e8 0x000 0x5 0x0
538#define MX6Q_PAD_ENET_RX_ER__SPDIF_IN 0x1d8 0x4ec 0x914 0x3 0x1 538#define MX6QDL_PAD_ENET_REF_CLK__SPDIF_SR_CLK 0x1d4 0x4e8 0x000 0x6 0x0
539#define MX6Q_PAD_ENET_RX_ER__ENET_1588_EVENT2_OUT 0x1d8 0x4ec 0x000 0x4 0x0 539#define MX6QDL_PAD_ENET_RX_ER__USB_OTG_ID 0x1d8 0x4ec 0x000 0x0 0x0
540#define MX6Q_PAD_ENET_RX_ER__GPIO1_IO24 0x1d8 0x4ec 0x000 0x5 0x0 540#define MX6QDL_PAD_ENET_RX_ER__ENET_RX_ER 0x1d8 0x4ec 0x000 0x1 0x0
541#define MX6Q_PAD_ENET_CRS_DV__ENET_RX_EN 0x1dc 0x4f0 0x858 0x1 0x1 541#define MX6QDL_PAD_ENET_RX_ER__ESAI_RX_HF_CLK 0x1d8 0x4ec 0x864 0x2 0x0
542#define MX6Q_PAD_ENET_CRS_DV__ESAI_TX_CLK 0x1dc 0x4f0 0x870 0x2 0x0 542#define MX6QDL_PAD_ENET_RX_ER__SPDIF_IN 0x1d8 0x4ec 0x914 0x3 0x1
543#define MX6Q_PAD_ENET_CRS_DV__SPDIF_EXT_CLK 0x1dc 0x4f0 0x918 0x3 0x1 543#define MX6QDL_PAD_ENET_RX_ER__ENET_1588_EVENT2_OUT 0x1d8 0x4ec 0x000 0x4 0x0
544#define MX6Q_PAD_ENET_CRS_DV__GPIO1_IO25 0x1dc 0x4f0 0x000 0x5 0x0 544#define MX6QDL_PAD_ENET_RX_ER__GPIO1_IO24 0x1d8 0x4ec 0x000 0x5 0x0
545#define MX6Q_PAD_ENET_RXD1__MLB_SIG 0x1e0 0x4f4 0x908 0x0 0x0 545#define MX6QDL_PAD_ENET_CRS_DV__ENET_RX_EN 0x1dc 0x4f0 0x858 0x1 0x1
546#define MX6Q_PAD_ENET_RXD1__ENET_RX_DATA1 0x1e0 0x4f4 0x84c 0x1 0x1 546#define MX6QDL_PAD_ENET_CRS_DV__ESAI_TX_CLK 0x1dc 0x4f0 0x870 0x2 0x0
547#define MX6Q_PAD_ENET_RXD1__ESAI_TX_FS 0x1e0 0x4f4 0x860 0x2 0x0 547#define MX6QDL_PAD_ENET_CRS_DV__SPDIF_EXT_CLK 0x1dc 0x4f0 0x918 0x3 0x1
548#define MX6Q_PAD_ENET_RXD1__ENET_1588_EVENT3_OUT 0x1e0 0x4f4 0x000 0x4 0x0 548#define MX6QDL_PAD_ENET_CRS_DV__GPIO1_IO25 0x1dc 0x4f0 0x000 0x5 0x0
549#define MX6Q_PAD_ENET_RXD1__GPIO1_IO26 0x1e0 0x4f4 0x000 0x5 0x0 549#define MX6QDL_PAD_ENET_RXD1__MLB_SIG 0x1e0 0x4f4 0x908 0x0 0x0
550#define MX6Q_PAD_ENET_RXD0__ENET_RX_DATA0 0x1e4 0x4f8 0x848 0x1 0x1 550#define MX6QDL_PAD_ENET_RXD1__ENET_RX_DATA1 0x1e0 0x4f4 0x84c 0x1 0x1
551#define MX6Q_PAD_ENET_RXD0__ESAI_TX_HF_CLK 0x1e4 0x4f8 0x868 0x2 0x0 551#define MX6QDL_PAD_ENET_RXD1__ESAI_TX_FS 0x1e0 0x4f4 0x860 0x2 0x0
552#define MX6Q_PAD_ENET_RXD0__SPDIF_OUT 0x1e4 0x4f8 0x000 0x3 0x0 552#define MX6QDL_PAD_ENET_RXD1__ENET_1588_EVENT3_OUT 0x1e0 0x4f4 0x000 0x4 0x0
553#define MX6Q_PAD_ENET_RXD0__GPIO1_IO27 0x1e4 0x4f8 0x000 0x5 0x0 553#define MX6QDL_PAD_ENET_RXD1__GPIO1_IO26 0x1e0 0x4f4 0x000 0x5 0x0
554#define MX6Q_PAD_ENET_TX_EN__ENET_TX_EN 0x1e8 0x4fc 0x000 0x1 0x0 554#define MX6QDL_PAD_ENET_RXD0__ENET_RX_DATA0 0x1e4 0x4f8 0x848 0x1 0x1
555#define MX6Q_PAD_ENET_TX_EN__ESAI_TX3_RX2 0x1e8 0x4fc 0x880 0x2 0x0 555#define MX6QDL_PAD_ENET_RXD0__ESAI_TX_HF_CLK 0x1e4 0x4f8 0x868 0x2 0x0
556#define MX6Q_PAD_ENET_TX_EN__GPIO1_IO28 0x1e8 0x4fc 0x000 0x5 0x0 556#define MX6QDL_PAD_ENET_RXD0__SPDIF_OUT 0x1e4 0x4f8 0x000 0x3 0x0
557#define MX6Q_PAD_ENET_TXD1__MLB_CLK 0x1ec 0x500 0x900 0x0 0x0 557#define MX6QDL_PAD_ENET_RXD0__GPIO1_IO27 0x1e4 0x4f8 0x000 0x5 0x0
558#define MX6Q_PAD_ENET_TXD1__ENET_TX_DATA1 0x1ec 0x500 0x000 0x1 0x0 558#define MX6QDL_PAD_ENET_TX_EN__ENET_TX_EN 0x1e8 0x4fc 0x000 0x1 0x0
559#define MX6Q_PAD_ENET_TXD1__ESAI_TX2_RX3 0x1ec 0x500 0x87c 0x2 0x0 559#define MX6QDL_PAD_ENET_TX_EN__ESAI_TX3_RX2 0x1e8 0x4fc 0x880 0x2 0x0
560#define MX6Q_PAD_ENET_TXD1__ENET_1588_EVENT0_IN 0x1ec 0x500 0x000 0x4 0x0 560#define MX6QDL_PAD_ENET_TX_EN__GPIO1_IO28 0x1e8 0x4fc 0x000 0x5 0x0
561#define MX6Q_PAD_ENET_TXD1__GPIO1_IO29 0x1ec 0x500 0x000 0x5 0x0 561#define MX6QDL_PAD_ENET_TXD1__MLB_CLK 0x1ec 0x500 0x900 0x0 0x0
562#define MX6Q_PAD_ENET_TXD0__ENET_TX_DATA0 0x1f0 0x504 0x000 0x1 0x0 562#define MX6QDL_PAD_ENET_TXD1__ENET_TX_DATA1 0x1ec 0x500 0x000 0x1 0x0
563#define MX6Q_PAD_ENET_TXD0__ESAI_TX4_RX1 0x1f0 0x504 0x884 0x2 0x0 563#define MX6QDL_PAD_ENET_TXD1__ESAI_TX2_RX3 0x1ec 0x500 0x87c 0x2 0x0
564#define MX6Q_PAD_ENET_TXD0__GPIO1_IO30 0x1f0 0x504 0x000 0x5 0x0 564#define MX6QDL_PAD_ENET_TXD1__ENET_1588_EVENT0_IN 0x1ec 0x500 0x000 0x4 0x0
565#define MX6Q_PAD_ENET_MDC__MLB_DATA 0x1f4 0x508 0x904 0x0 0x0 565#define MX6QDL_PAD_ENET_TXD1__GPIO1_IO29 0x1ec 0x500 0x000 0x5 0x0
566#define MX6Q_PAD_ENET_MDC__ENET_MDC 0x1f4 0x508 0x000 0x1 0x0 566#define MX6QDL_PAD_ENET_TXD0__ENET_TX_DATA0 0x1f0 0x504 0x000 0x1 0x0
567#define MX6Q_PAD_ENET_MDC__ESAI_TX5_RX0 0x1f4 0x508 0x888 0x2 0x0 567#define MX6QDL_PAD_ENET_TXD0__ESAI_TX4_RX1 0x1f0 0x504 0x884 0x2 0x0
568#define MX6Q_PAD_ENET_MDC__ENET_1588_EVENT1_IN 0x1f4 0x508 0x000 0x4 0x0 568#define MX6QDL_PAD_ENET_TXD0__GPIO1_IO30 0x1f0 0x504 0x000 0x5 0x0
569#define MX6Q_PAD_ENET_MDC__GPIO1_IO31 0x1f4 0x508 0x000 0x5 0x0 569#define MX6QDL_PAD_ENET_MDC__MLB_DATA 0x1f4 0x508 0x904 0x0 0x0
570#define MX6Q_PAD_KEY_COL0__ECSPI1_SCLK 0x1f8 0x5c8 0x7f4 0x0 0x2 570#define MX6QDL_PAD_ENET_MDC__ENET_MDC 0x1f4 0x508 0x000 0x1 0x0
571#define MX6Q_PAD_KEY_COL0__ENET_RX_DATA3 0x1f8 0x5c8 0x854 0x1 0x1 571#define MX6QDL_PAD_ENET_MDC__ESAI_TX5_RX0 0x1f4 0x508 0x888 0x2 0x0
572#define MX6Q_PAD_KEY_COL0__AUD5_TXC 0x1f8 0x5c8 0x7dc 0x2 0x1 572#define MX6QDL_PAD_ENET_MDC__ENET_1588_EVENT1_IN 0x1f4 0x508 0x000 0x4 0x0
573#define MX6Q_PAD_KEY_COL0__KEY_COL0 0x1f8 0x5c8 0x000 0x3 0x0 573#define MX6QDL_PAD_ENET_MDC__GPIO1_IO31 0x1f4 0x508 0x000 0x5 0x0
574#define MX6Q_PAD_KEY_COL0__UART4_TX_DATA 0x1f8 0x5c8 0x000 0x4 0x0 574#define MX6QDL_PAD_KEY_COL0__ECSPI1_SCLK 0x1f8 0x5c8 0x7f4 0x0 0x2
575#define MX6Q_PAD_KEY_COL0__UART4_RX_DATA 0x1f8 0x5c8 0x938 0x4 0x0 575#define MX6QDL_PAD_KEY_COL0__ENET_RX_DATA3 0x1f8 0x5c8 0x854 0x1 0x1
576#define MX6Q_PAD_KEY_COL0__GPIO4_IO06 0x1f8 0x5c8 0x000 0x5 0x0 576#define MX6QDL_PAD_KEY_COL0__AUD5_TXC 0x1f8 0x5c8 0x7dc 0x2 0x1
577#define MX6Q_PAD_KEY_COL0__DCIC1_OUT 0x1f8 0x5c8 0x000 0x6 0x0 577#define MX6QDL_PAD_KEY_COL0__KEY_COL0 0x1f8 0x5c8 0x000 0x3 0x0
578#define MX6Q_PAD_KEY_ROW0__ECSPI1_MOSI 0x1fc 0x5cc 0x7fc 0x0 0x2 578#define MX6QDL_PAD_KEY_COL0__UART4_TX_DATA 0x1f8 0x5c8 0x000 0x4 0x0
579#define MX6Q_PAD_KEY_ROW0__ENET_TX_DATA3 0x1fc 0x5cc 0x000 0x1 0x0 579#define MX6QDL_PAD_KEY_COL0__UART4_RX_DATA 0x1f8 0x5c8 0x938 0x4 0x0
580#define MX6Q_PAD_KEY_ROW0__AUD5_TXD 0x1fc 0x5cc 0x7d0 0x2 0x1 580#define MX6QDL_PAD_KEY_COL0__GPIO4_IO06 0x1f8 0x5c8 0x000 0x5 0x0
581#define MX6Q_PAD_KEY_ROW0__KEY_ROW0 0x1fc 0x5cc 0x000 0x3 0x0 581#define MX6QDL_PAD_KEY_COL0__DCIC1_OUT 0x1f8 0x5c8 0x000 0x6 0x0
582#define MX6Q_PAD_KEY_ROW0__UART4_RX_DATA 0x1fc 0x5cc 0x938 0x4 0x1 582#define MX6QDL_PAD_KEY_ROW0__ECSPI1_MOSI 0x1fc 0x5cc 0x7fc 0x0 0x2
583#define MX6Q_PAD_KEY_ROW0__UART4_TX_DATA 0x1fc 0x5cc 0x000 0x4 0x0 583#define MX6QDL_PAD_KEY_ROW0__ENET_TX_DATA3 0x1fc 0x5cc 0x000 0x1 0x0
584#define MX6Q_PAD_KEY_ROW0__GPIO4_IO07 0x1fc 0x5cc 0x000 0x5 0x0 584#define MX6QDL_PAD_KEY_ROW0__AUD5_TXD 0x1fc 0x5cc 0x7d0 0x2 0x1
585#define MX6Q_PAD_KEY_ROW0__DCIC2_OUT 0x1fc 0x5cc 0x000 0x6 0x0 585#define MX6QDL_PAD_KEY_ROW0__KEY_ROW0 0x1fc 0x5cc 0x000 0x3 0x0
586#define MX6Q_PAD_KEY_COL1__ECSPI1_MISO 0x200 0x5d0 0x7f8 0x0 0x2 586#define MX6QDL_PAD_KEY_ROW0__UART4_RX_DATA 0x1fc 0x5cc 0x938 0x4 0x1
587#define MX6Q_PAD_KEY_COL1__ENET_MDIO 0x200 0x5d0 0x840 0x1 0x1 587#define MX6QDL_PAD_KEY_ROW0__UART4_TX_DATA 0x1fc 0x5cc 0x000 0x4 0x0
588#define MX6Q_PAD_KEY_COL1__AUD5_TXFS 0x200 0x5d0 0x7e0 0x2 0x1 588#define MX6QDL_PAD_KEY_ROW0__GPIO4_IO07 0x1fc 0x5cc 0x000 0x5 0x0
589#define MX6Q_PAD_KEY_COL1__KEY_COL1 0x200 0x5d0 0x000 0x3 0x0 589#define MX6QDL_PAD_KEY_ROW0__DCIC2_OUT 0x1fc 0x5cc 0x000 0x6 0x0
590#define MX6Q_PAD_KEY_COL1__UART5_TX_DATA 0x200 0x5d0 0x000 0x4 0x0 590#define MX6QDL_PAD_KEY_COL1__ECSPI1_MISO 0x200 0x5d0 0x7f8 0x0 0x2
591#define MX6Q_PAD_KEY_COL1__UART5_RX_DATA 0x200 0x5d0 0x940 0x4 0x0 591#define MX6QDL_PAD_KEY_COL1__ENET_MDIO 0x200 0x5d0 0x840 0x1 0x1
592#define MX6Q_PAD_KEY_COL1__GPIO4_IO08 0x200 0x5d0 0x000 0x5 0x0 592#define MX6QDL_PAD_KEY_COL1__AUD5_TXFS 0x200 0x5d0 0x7e0 0x2 0x1
593#define MX6Q_PAD_KEY_COL1__SD1_VSELECT 0x200 0x5d0 0x000 0x6 0x0 593#define MX6QDL_PAD_KEY_COL1__KEY_COL1 0x200 0x5d0 0x000 0x3 0x0
594#define MX6Q_PAD_KEY_ROW1__ECSPI1_SS0 0x204 0x5d4 0x800 0x0 0x2 594#define MX6QDL_PAD_KEY_COL1__UART5_TX_DATA 0x200 0x5d0 0x000 0x4 0x0
595#define MX6Q_PAD_KEY_ROW1__ENET_COL 0x204 0x5d4 0x000 0x1 0x0 595#define MX6QDL_PAD_KEY_COL1__UART5_RX_DATA 0x200 0x5d0 0x940 0x4 0x0
596#define MX6Q_PAD_KEY_ROW1__AUD5_RXD 0x204 0x5d4 0x7cc 0x2 0x1 596#define MX6QDL_PAD_KEY_COL1__GPIO4_IO08 0x200 0x5d0 0x000 0x5 0x0
597#define MX6Q_PAD_KEY_ROW1__KEY_ROW1 0x204 0x5d4 0x000 0x3 0x0 597#define MX6QDL_PAD_KEY_COL1__SD1_VSELECT 0x200 0x5d0 0x000 0x6 0x0
598#define MX6Q_PAD_KEY_ROW1__UART5_RX_DATA 0x204 0x5d4 0x940 0x4 0x1 598#define MX6QDL_PAD_KEY_ROW1__ECSPI1_SS0 0x204 0x5d4 0x800 0x0 0x2
599#define MX6Q_PAD_KEY_ROW1__UART5_TX_DATA 0x204 0x5d4 0x000 0x4 0x0 599#define MX6QDL_PAD_KEY_ROW1__ENET_COL 0x204 0x5d4 0x000 0x1 0x0
600#define MX6Q_PAD_KEY_ROW1__GPIO4_IO09 0x204 0x5d4 0x000 0x5 0x0 600#define MX6QDL_PAD_KEY_ROW1__AUD5_RXD 0x204 0x5d4 0x7cc 0x2 0x1
601#define MX6Q_PAD_KEY_ROW1__SD2_VSELECT 0x204 0x5d4 0x000 0x6 0x0 601#define MX6QDL_PAD_KEY_ROW1__KEY_ROW1 0x204 0x5d4 0x000 0x3 0x0
602#define MX6Q_PAD_KEY_COL2__ECSPI1_SS1 0x208 0x5d8 0x804 0x0 0x2 602#define MX6QDL_PAD_KEY_ROW1__UART5_RX_DATA 0x204 0x5d4 0x940 0x4 0x1
603#define MX6Q_PAD_KEY_COL2__ENET_RX_DATA2 0x208 0x5d8 0x850 0x1 0x1 603#define MX6QDL_PAD_KEY_ROW1__UART5_TX_DATA 0x204 0x5d4 0x000 0x4 0x0
604#define MX6Q_PAD_KEY_COL2__FLEXCAN1_TX 0x208 0x5d8 0x000 0x2 0x0 604#define MX6QDL_PAD_KEY_ROW1__GPIO4_IO09 0x204 0x5d4 0x000 0x5 0x0
605#define MX6Q_PAD_KEY_COL2__KEY_COL2 0x208 0x5d8 0x000 0x3 0x0 605#define MX6QDL_PAD_KEY_ROW1__SD2_VSELECT 0x204 0x5d4 0x000 0x6 0x0
606#define MX6Q_PAD_KEY_COL2__ENET_MDC 0x208 0x5d8 0x000 0x4 0x0 606#define MX6QDL_PAD_KEY_COL2__ECSPI1_SS1 0x208 0x5d8 0x804 0x0 0x2
607#define MX6Q_PAD_KEY_COL2__GPIO4_IO10 0x208 0x5d8 0x000 0x5 0x0 607#define MX6QDL_PAD_KEY_COL2__ENET_RX_DATA2 0x208 0x5d8 0x850 0x1 0x1
608#define MX6Q_PAD_KEY_COL2__USB_H1_PWR_CTL_WAKE 0x208 0x5d8 0x000 0x6 0x0 608#define MX6QDL_PAD_KEY_COL2__FLEXCAN1_TX 0x208 0x5d8 0x000 0x2 0x0
609#define MX6Q_PAD_KEY_ROW2__ECSPI1_SS2 0x20c 0x5dc 0x808 0x0 0x1 609#define MX6QDL_PAD_KEY_COL2__KEY_COL2 0x208 0x5d8 0x000 0x3 0x0
610#define MX6Q_PAD_KEY_ROW2__ENET_TX_DATA2 0x20c 0x5dc 0x000 0x1 0x0 610#define MX6QDL_PAD_KEY_COL2__ENET_MDC 0x208 0x5d8 0x000 0x4 0x0
611#define MX6Q_PAD_KEY_ROW2__FLEXCAN1_RX 0x20c 0x5dc 0x7e4 0x2 0x0 611#define MX6QDL_PAD_KEY_COL2__GPIO4_IO10 0x208 0x5d8 0x000 0x5 0x0
612#define MX6Q_PAD_KEY_ROW2__KEY_ROW2 0x20c 0x5dc 0x000 0x3 0x0 612#define MX6QDL_PAD_KEY_COL2__USB_H1_PWR_CTL_WAKE 0x208 0x5d8 0x000 0x6 0x0
613#define MX6Q_PAD_KEY_ROW2__SD2_VSELECT 0x20c 0x5dc 0x000 0x4 0x0 613#define MX6QDL_PAD_KEY_ROW2__ECSPI1_SS2 0x20c 0x5dc 0x808 0x0 0x1
614#define MX6Q_PAD_KEY_ROW2__GPIO4_IO11 0x20c 0x5dc 0x000 0x5 0x0 614#define MX6QDL_PAD_KEY_ROW2__ENET_TX_DATA2 0x20c 0x5dc 0x000 0x1 0x0
615#define MX6Q_PAD_KEY_ROW2__HDMI_TX_CEC_LINE 0x20c 0x5dc 0x88c 0x6 0x1 615#define MX6QDL_PAD_KEY_ROW2__FLEXCAN1_RX 0x20c 0x5dc 0x7e4 0x2 0x0
616#define MX6Q_PAD_KEY_COL3__ECSPI1_SS3 0x210 0x5e0 0x80c 0x0 0x1 616#define MX6QDL_PAD_KEY_ROW2__KEY_ROW2 0x20c 0x5dc 0x000 0x3 0x0
617#define MX6Q_PAD_KEY_COL3__ENET_CRS 0x210 0x5e0 0x000 0x1 0x0 617#define MX6QDL_PAD_KEY_ROW2__SD2_VSELECT 0x20c 0x5dc 0x000 0x4 0x0
618#define MX6Q_PAD_KEY_COL3__HDMI_TX_DDC_SCL 0x210 0x5e0 0x890 0x2 0x1 618#define MX6QDL_PAD_KEY_ROW2__GPIO4_IO11 0x20c 0x5dc 0x000 0x5 0x0
619#define MX6Q_PAD_KEY_COL3__KEY_COL3 0x210 0x5e0 0x000 0x3 0x0 619#define MX6QDL_PAD_KEY_ROW2__HDMI_TX_CEC_LINE 0x20c 0x5dc 0x88c 0x6 0x1
620#define MX6Q_PAD_KEY_COL3__I2C2_SCL 0x210 0x5e0 0x8a0 0x4 0x1 620#define MX6QDL_PAD_KEY_COL3__ECSPI1_SS3 0x210 0x5e0 0x80c 0x0 0x1
621#define MX6Q_PAD_KEY_COL3__GPIO4_IO12 0x210 0x5e0 0x000 0x5 0x0 621#define MX6QDL_PAD_KEY_COL3__ENET_CRS 0x210 0x5e0 0x000 0x1 0x0
622#define MX6Q_PAD_KEY_COL3__SPDIF_IN 0x210 0x5e0 0x914 0x6 0x2 622#define MX6QDL_PAD_KEY_COL3__HDMI_TX_DDC_SCL 0x210 0x5e0 0x890 0x2 0x1
623#define MX6Q_PAD_KEY_ROW3__ASRC_EXT_CLK 0x214 0x5e4 0x7b0 0x1 0x0 623#define MX6QDL_PAD_KEY_COL3__KEY_COL3 0x210 0x5e0 0x000 0x3 0x0
624#define MX6Q_PAD_KEY_ROW3__HDMI_TX_DDC_SDA 0x214 0x5e4 0x894 0x2 0x1 624#define MX6QDL_PAD_KEY_COL3__I2C2_SCL 0x210 0x5e0 0x8a0 0x4 0x1
625#define MX6Q_PAD_KEY_ROW3__KEY_ROW3 0x214 0x5e4 0x000 0x3 0x0 625#define MX6QDL_PAD_KEY_COL3__GPIO4_IO12 0x210 0x5e0 0x000 0x5 0x0
626#define MX6Q_PAD_KEY_ROW3__I2C2_SDA 0x214 0x5e4 0x8a4 0x4 0x1 626#define MX6QDL_PAD_KEY_COL3__SPDIF_IN 0x210 0x5e0 0x914 0x6 0x2
627#define MX6Q_PAD_KEY_ROW3__GPIO4_IO13 0x214 0x5e4 0x000 0x5 0x0 627#define MX6QDL_PAD_KEY_ROW3__ASRC_EXT_CLK 0x214 0x5e4 0x7b0 0x1 0x0
628#define MX6Q_PAD_KEY_ROW3__SD1_VSELECT 0x214 0x5e4 0x000 0x6 0x0 628#define MX6QDL_PAD_KEY_ROW3__HDMI_TX_DDC_SDA 0x214 0x5e4 0x894 0x2 0x1
629#define MX6Q_PAD_KEY_COL4__FLEXCAN2_TX 0x218 0x5e8 0x000 0x0 0x0 629#define MX6QDL_PAD_KEY_ROW3__KEY_ROW3 0x214 0x5e4 0x000 0x3 0x0
630#define MX6Q_PAD_KEY_COL4__IPU1_SISG4 0x218 0x5e8 0x000 0x1 0x0 630#define MX6QDL_PAD_KEY_ROW3__I2C2_SDA 0x214 0x5e4 0x8a4 0x4 0x1
631#define MX6Q_PAD_KEY_COL4__USB_OTG_OC 0x218 0x5e8 0x944 0x2 0x1 631#define MX6QDL_PAD_KEY_ROW3__GPIO4_IO13 0x214 0x5e4 0x000 0x5 0x0
632#define MX6Q_PAD_KEY_COL4__KEY_COL4 0x218 0x5e8 0x000 0x3 0x0 632#define MX6QDL_PAD_KEY_ROW3__SD1_VSELECT 0x214 0x5e4 0x000 0x6 0x0
633#define MX6Q_PAD_KEY_COL4__UART5_RTS_B 0x218 0x5e8 0x93c 0x4 0x0 633#define MX6QDL_PAD_KEY_COL4__FLEXCAN2_TX 0x218 0x5e8 0x000 0x0 0x0
634#define MX6Q_PAD_KEY_COL4__UART5_CTS_B 0x218 0x5e8 0x000 0x4 0x0 634#define MX6QDL_PAD_KEY_COL4__IPU1_SISG4 0x218 0x5e8 0x000 0x1 0x0
635#define MX6Q_PAD_KEY_COL4__GPIO4_IO14 0x218 0x5e8 0x000 0x5 0x0 635#define MX6QDL_PAD_KEY_COL4__USB_OTG_OC 0x218 0x5e8 0x944 0x2 0x1
636#define MX6Q_PAD_KEY_ROW4__FLEXCAN2_RX 0x21c 0x5ec 0x7e8 0x0 0x0 636#define MX6QDL_PAD_KEY_COL4__KEY_COL4 0x218 0x5e8 0x000 0x3 0x0
637#define MX6Q_PAD_KEY_ROW4__IPU1_SISG5 0x21c 0x5ec 0x000 0x1 0x0 637#define MX6QDL_PAD_KEY_COL4__UART5_RTS_B 0x218 0x5e8 0x93c 0x4 0x0
638#define MX6Q_PAD_KEY_ROW4__USB_OTG_PWR 0x21c 0x5ec 0x000 0x2 0x0 638#define MX6QDL_PAD_KEY_COL4__UART5_CTS_B 0x218 0x5e8 0x000 0x4 0x0
639#define MX6Q_PAD_KEY_ROW4__KEY_ROW4 0x21c 0x5ec 0x000 0x3 0x0 639#define MX6QDL_PAD_KEY_COL4__GPIO4_IO14 0x218 0x5e8 0x000 0x5 0x0
640#define MX6Q_PAD_KEY_ROW4__UART5_CTS_B 0x21c 0x5ec 0x000 0x4 0x0 640#define MX6QDL_PAD_KEY_ROW4__FLEXCAN2_RX 0x21c 0x5ec 0x7e8 0x0 0x0
641#define MX6Q_PAD_KEY_ROW4__UART5_RTS_B 0x21c 0x5ec 0x93c 0x4 0x1 641#define MX6QDL_PAD_KEY_ROW4__IPU1_SISG5 0x21c 0x5ec 0x000 0x1 0x0
642#define MX6Q_PAD_KEY_ROW4__GPIO4_IO15 0x21c 0x5ec 0x000 0x5 0x0 642#define MX6QDL_PAD_KEY_ROW4__USB_OTG_PWR 0x21c 0x5ec 0x000 0x2 0x0
643#define MX6Q_PAD_GPIO_0__CCM_CLKO1 0x220 0x5f0 0x000 0x0 0x0 643#define MX6QDL_PAD_KEY_ROW4__KEY_ROW4 0x21c 0x5ec 0x000 0x3 0x0
644#define MX6Q_PAD_GPIO_0__KEY_COL5 0x220 0x5f0 0x8e8 0x2 0x0 644#define MX6QDL_PAD_KEY_ROW4__UART5_CTS_B 0x21c 0x5ec 0x000 0x4 0x0
645#define MX6Q_PAD_GPIO_0__ASRC_EXT_CLK 0x220 0x5f0 0x7b0 0x3 0x1 645#define MX6QDL_PAD_KEY_ROW4__UART5_RTS_B 0x21c 0x5ec 0x93c 0x4 0x1
646#define MX6Q_PAD_GPIO_0__EPIT1_OUT 0x220 0x5f0 0x000 0x4 0x0 646#define MX6QDL_PAD_KEY_ROW4__GPIO4_IO15 0x21c 0x5ec 0x000 0x5 0x0
647#define MX6Q_PAD_GPIO_0__GPIO1_IO00 0x220 0x5f0 0x000 0x5 0x0 647#define MX6QDL_PAD_GPIO_0__CCM_CLKO1 0x220 0x5f0 0x000 0x0 0x0
648#define MX6Q_PAD_GPIO_0__USB_H1_PWR 0x220 0x5f0 0x000 0x6 0x0 648#define MX6QDL_PAD_GPIO_0__KEY_COL5 0x220 0x5f0 0x8e8 0x2 0x0
649#define MX6Q_PAD_GPIO_0__SNVS_VIO_5 0x220 0x5f0 0x000 0x7 0x0 649#define MX6QDL_PAD_GPIO_0__ASRC_EXT_CLK 0x220 0x5f0 0x7b0 0x3 0x1
650#define MX6Q_PAD_GPIO_1__ESAI_RX_CLK 0x224 0x5f4 0x86c 0x0 0x1 650#define MX6QDL_PAD_GPIO_0__EPIT1_OUT 0x220 0x5f0 0x000 0x4 0x0
651#define MX6Q_PAD_GPIO_1__WDOG2_B 0x224 0x5f4 0x000 0x1 0x0 651#define MX6QDL_PAD_GPIO_0__GPIO1_IO00 0x220 0x5f0 0x000 0x5 0x0
652#define MX6Q_PAD_GPIO_1__KEY_ROW5 0x224 0x5f4 0x8f4 0x2 0x0 652#define MX6QDL_PAD_GPIO_0__USB_H1_PWR 0x220 0x5f0 0x000 0x6 0x0
653#define MX6Q_PAD_GPIO_1__USB_OTG_ID 0x224 0x5f4 0x000 0x3 0x0 653#define MX6QDL_PAD_GPIO_0__SNVS_VIO_5 0x220 0x5f0 0x000 0x7 0x0
654#define MX6Q_PAD_GPIO_1__PWM2_OUT 0x224 0x5f4 0x000 0x4 0x0 654#define MX6QDL_PAD_GPIO_1__ESAI_RX_CLK 0x224 0x5f4 0x86c 0x0 0x1
655#define MX6Q_PAD_GPIO_1__GPIO1_IO01 0x224 0x5f4 0x000 0x5 0x0 655#define MX6QDL_PAD_GPIO_1__WDOG2_B 0x224 0x5f4 0x000 0x1 0x0
656#define MX6Q_PAD_GPIO_1__SD1_CD_B 0x224 0x5f4 0x000 0x6 0x0 656#define MX6QDL_PAD_GPIO_1__KEY_ROW5 0x224 0x5f4 0x8f4 0x2 0x0
657#define MX6Q_PAD_GPIO_9__ESAI_RX_FS 0x228 0x5f8 0x85c 0x0 0x1 657#define MX6QDL_PAD_GPIO_1__USB_OTG_ID 0x224 0x5f4 0x000 0x3 0x0
658#define MX6Q_PAD_GPIO_9__WDOG1_B 0x228 0x5f8 0x000 0x1 0x0 658#define MX6QDL_PAD_GPIO_1__PWM2_OUT 0x224 0x5f4 0x000 0x4 0x0
659#define MX6Q_PAD_GPIO_9__KEY_COL6 0x228 0x5f8 0x8ec 0x2 0x0 659#define MX6QDL_PAD_GPIO_1__GPIO1_IO01 0x224 0x5f4 0x000 0x5 0x0
660#define MX6Q_PAD_GPIO_9__CCM_REF_EN_B 0x228 0x5f8 0x000 0x3 0x0 660#define MX6QDL_PAD_GPIO_1__SD1_CD_B 0x224 0x5f4 0x000 0x6 0x0
661#define MX6Q_PAD_GPIO_9__PWM1_OUT 0x228 0x5f8 0x000 0x4 0x0 661#define MX6QDL_PAD_GPIO_9__ESAI_RX_FS 0x228 0x5f8 0x85c 0x0 0x1
662#define MX6Q_PAD_GPIO_9__GPIO1_IO09 0x228 0x5f8 0x000 0x5 0x0 662#define MX6QDL_PAD_GPIO_9__WDOG1_B 0x228 0x5f8 0x000 0x1 0x0
663#define MX6Q_PAD_GPIO_9__SD1_WP 0x228 0x5f8 0x94c 0x6 0x1 663#define MX6QDL_PAD_GPIO_9__KEY_COL6 0x228 0x5f8 0x8ec 0x2 0x0
664#define MX6Q_PAD_GPIO_3__ESAI_RX_HF_CLK 0x22c 0x5fc 0x864 0x0 0x1 664#define MX6QDL_PAD_GPIO_9__CCM_REF_EN_B 0x228 0x5f8 0x000 0x3 0x0
665#define MX6Q_PAD_GPIO_3__I2C3_SCL 0x22c 0x5fc 0x8a8 0x2 0x1 665#define MX6QDL_PAD_GPIO_9__PWM1_OUT 0x228 0x5f8 0x000 0x4 0x0
666#define MX6Q_PAD_GPIO_3__XTALOSC_REF_CLK_24M 0x22c 0x5fc 0x000 0x3 0x0 666#define MX6QDL_PAD_GPIO_9__GPIO1_IO09 0x228 0x5f8 0x000 0x5 0x0
667#define MX6Q_PAD_GPIO_3__CCM_CLKO2 0x22c 0x5fc 0x000 0x4 0x0 667#define MX6QDL_PAD_GPIO_9__SD1_WP 0x228 0x5f8 0x94c 0x6 0x1
668#define MX6Q_PAD_GPIO_3__GPIO1_IO03 0x22c 0x5fc 0x000 0x5 0x0 668#define MX6QDL_PAD_GPIO_3__ESAI_RX_HF_CLK 0x22c 0x5fc 0x864 0x0 0x1
669#define MX6Q_PAD_GPIO_3__USB_H1_OC 0x22c 0x5fc 0x948 0x6 0x1 669#define MX6QDL_PAD_GPIO_3__I2C3_SCL 0x22c 0x5fc 0x8a8 0x2 0x1
670#define MX6Q_PAD_GPIO_3__MLB_CLK 0x22c 0x5fc 0x900 0x7 0x1 670#define MX6QDL_PAD_GPIO_3__XTALOSC_REF_CLK_24M 0x22c 0x5fc 0x000 0x3 0x0
671#define MX6Q_PAD_GPIO_6__ESAI_TX_CLK 0x230 0x600 0x870 0x0 0x1 671#define MX6QDL_PAD_GPIO_3__CCM_CLKO2 0x22c 0x5fc 0x000 0x4 0x0
672#define MX6Q_PAD_GPIO_6__I2C3_SDA 0x230 0x600 0x8ac 0x2 0x1 672#define MX6QDL_PAD_GPIO_3__GPIO1_IO03 0x22c 0x5fc 0x000 0x5 0x0
673#define MX6Q_PAD_GPIO_6__GPIO1_IO06 0x230 0x600 0x000 0x5 0x0 673#define MX6QDL_PAD_GPIO_3__USB_H1_OC 0x22c 0x5fc 0x948 0x6 0x1
674#define MX6Q_PAD_GPIO_6__SD2_LCTL 0x230 0x600 0x000 0x6 0x0 674#define MX6QDL_PAD_GPIO_3__MLB_CLK 0x22c 0x5fc 0x900 0x7 0x1
675#define MX6Q_PAD_GPIO_6__MLB_SIG 0x230 0x600 0x908 0x7 0x1 675#define MX6QDL_PAD_GPIO_6__ESAI_TX_CLK 0x230 0x600 0x870 0x0 0x1
676#define MX6Q_PAD_GPIO_2__ESAI_TX_FS 0x234 0x604 0x860 0x0 0x1 676#define MX6QDL_PAD_GPIO_6__I2C3_SDA 0x230 0x600 0x8ac 0x2 0x1
677#define MX6Q_PAD_GPIO_2__KEY_ROW6 0x234 0x604 0x8f8 0x2 0x1 677#define MX6QDL_PAD_GPIO_6__GPIO1_IO06 0x230 0x600 0x000 0x5 0x0
678#define MX6Q_PAD_GPIO_2__GPIO1_IO02 0x234 0x604 0x000 0x5 0x0 678#define MX6QDL_PAD_GPIO_6__SD2_LCTL 0x230 0x600 0x000 0x6 0x0
679#define MX6Q_PAD_GPIO_2__SD2_WP 0x234 0x604 0x000 0x6 0x0 679#define MX6QDL_PAD_GPIO_6__MLB_SIG 0x230 0x600 0x908 0x7 0x1
680#define MX6Q_PAD_GPIO_2__MLB_DATA 0x234 0x604 0x904 0x7 0x1 680#define MX6QDL_PAD_GPIO_2__ESAI_TX_FS 0x234 0x604 0x860 0x0 0x1
681#define MX6Q_PAD_GPIO_4__ESAI_TX_HF_CLK 0x238 0x608 0x868 0x0 0x1 681#define MX6QDL_PAD_GPIO_2__KEY_ROW6 0x234 0x604 0x8f8 0x2 0x1
682#define MX6Q_PAD_GPIO_4__KEY_COL7 0x238 0x608 0x8f0 0x2 0x1 682#define MX6QDL_PAD_GPIO_2__GPIO1_IO02 0x234 0x604 0x000 0x5 0x0
683#define MX6Q_PAD_GPIO_4__GPIO1_IO04 0x238 0x608 0x000 0x5 0x0 683#define MX6QDL_PAD_GPIO_2__SD2_WP 0x234 0x604 0x000 0x6 0x0
684#define MX6Q_PAD_GPIO_4__SD2_CD_B 0x238 0x608 0x000 0x6 0x0 684#define MX6QDL_PAD_GPIO_2__MLB_DATA 0x234 0x604 0x904 0x7 0x1
685#define MX6Q_PAD_GPIO_5__ESAI_TX2_RX3 0x23c 0x60c 0x87c 0x0 0x1 685#define MX6QDL_PAD_GPIO_4__ESAI_TX_HF_CLK 0x238 0x608 0x868 0x0 0x1
686#define MX6Q_PAD_GPIO_5__KEY_ROW7 0x23c 0x60c 0x8fc 0x2 0x1 686#define MX6QDL_PAD_GPIO_4__KEY_COL7 0x238 0x608 0x8f0 0x2 0x1
687#define MX6Q_PAD_GPIO_5__CCM_CLKO1 0x23c 0x60c 0x000 0x3 0x0 687#define MX6QDL_PAD_GPIO_4__GPIO1_IO04 0x238 0x608 0x000 0x5 0x0
688#define MX6Q_PAD_GPIO_5__GPIO1_IO05 0x23c 0x60c 0x000 0x5 0x0 688#define MX6QDL_PAD_GPIO_4__SD2_CD_B 0x238 0x608 0x000 0x6 0x0
689#define MX6Q_PAD_GPIO_5__I2C3_SCL 0x23c 0x60c 0x8a8 0x6 0x2 689#define MX6QDL_PAD_GPIO_5__ESAI_TX2_RX3 0x23c 0x60c 0x87c 0x0 0x1
690#define MX6Q_PAD_GPIO_5__ARM_EVENTI 0x23c 0x60c 0x000 0x7 0x0 690#define MX6QDL_PAD_GPIO_5__KEY_ROW7 0x23c 0x60c 0x8fc 0x2 0x1
691#define MX6Q_PAD_GPIO_7__ESAI_TX4_RX1 0x240 0x610 0x884 0x0 0x1 691#define MX6QDL_PAD_GPIO_5__CCM_CLKO1 0x23c 0x60c 0x000 0x3 0x0
692#define MX6Q_PAD_GPIO_7__ECSPI5_RDY 0x240 0x610 0x000 0x1 0x0 692#define MX6QDL_PAD_GPIO_5__GPIO1_IO05 0x23c 0x60c 0x000 0x5 0x0
693#define MX6Q_PAD_GPIO_7__EPIT1_OUT 0x240 0x610 0x000 0x2 0x0 693#define MX6QDL_PAD_GPIO_5__I2C3_SCL 0x23c 0x60c 0x8a8 0x6 0x2
694#define MX6Q_PAD_GPIO_7__FLEXCAN1_TX 0x240 0x610 0x000 0x3 0x0 694#define MX6QDL_PAD_GPIO_5__ARM_EVENTI 0x23c 0x60c 0x000 0x7 0x0
695#define MX6Q_PAD_GPIO_7__UART2_TX_DATA 0x240 0x610 0x000 0x4 0x0 695#define MX6QDL_PAD_GPIO_7__ESAI_TX4_RX1 0x240 0x610 0x884 0x0 0x1
696#define MX6Q_PAD_GPIO_7__UART2_RX_DATA 0x240 0x610 0x928 0x4 0x2 696#define MX6QDL_PAD_GPIO_7__ECSPI5_RDY 0x240 0x610 0x000 0x1 0x0
697#define MX6Q_PAD_GPIO_7__GPIO1_IO07 0x240 0x610 0x000 0x5 0x0 697#define MX6QDL_PAD_GPIO_7__EPIT1_OUT 0x240 0x610 0x000 0x2 0x0
698#define MX6Q_PAD_GPIO_7__SPDIF_LOCK 0x240 0x610 0x000 0x6 0x0 698#define MX6QDL_PAD_GPIO_7__FLEXCAN1_TX 0x240 0x610 0x000 0x3 0x0
699#define MX6Q_PAD_GPIO_7__USB_OTG_HOST_MODE 0x240 0x610 0x000 0x7 0x0 699#define MX6QDL_PAD_GPIO_7__UART2_TX_DATA 0x240 0x610 0x000 0x4 0x0
700#define MX6Q_PAD_GPIO_8__ESAI_TX5_RX0 0x244 0x614 0x888 0x0 0x1 700#define MX6QDL_PAD_GPIO_7__UART2_RX_DATA 0x240 0x610 0x928 0x4 0x2
701#define MX6Q_PAD_GPIO_8__XTALOSC_REF_CLK_32K 0x244 0x614 0x000 0x1 0x0 701#define MX6QDL_PAD_GPIO_7__GPIO1_IO07 0x240 0x610 0x000 0x5 0x0
702#define MX6Q_PAD_GPIO_8__EPIT2_OUT 0x244 0x614 0x000 0x2 0x0 702#define MX6QDL_PAD_GPIO_7__SPDIF_LOCK 0x240 0x610 0x000 0x6 0x0
703#define MX6Q_PAD_GPIO_8__FLEXCAN1_RX 0x244 0x614 0x7e4 0x3 0x1 703#define MX6QDL_PAD_GPIO_7__USB_OTG_HOST_MODE 0x240 0x610 0x000 0x7 0x0
704#define MX6Q_PAD_GPIO_8__UART2_RX_DATA 0x244 0x614 0x928 0x4 0x3 704#define MX6QDL_PAD_GPIO_8__ESAI_TX5_RX0 0x244 0x614 0x888 0x0 0x1
705#define MX6Q_PAD_GPIO_8__UART2_TX_DATA 0x244 0x614 0x000 0x4 0x0 705#define MX6QDL_PAD_GPIO_8__XTALOSC_REF_CLK_32K 0x244 0x614 0x000 0x1 0x0
706#define MX6Q_PAD_GPIO_8__GPIO1_IO08 0x244 0x614 0x000 0x5 0x0 706#define MX6QDL_PAD_GPIO_8__EPIT2_OUT 0x244 0x614 0x000 0x2 0x0
707#define MX6Q_PAD_GPIO_8__SPDIF_SR_CLK 0x244 0x614 0x000 0x6 0x0 707#define MX6QDL_PAD_GPIO_8__FLEXCAN1_RX 0x244 0x614 0x7e4 0x3 0x1
708#define MX6Q_PAD_GPIO_8__USB_OTG_PWR_CTL_WAKE 0x244 0x614 0x000 0x7 0x0 708#define MX6QDL_PAD_GPIO_8__UART2_RX_DATA 0x244 0x614 0x928 0x4 0x3
709#define MX6Q_PAD_GPIO_16__ESAI_TX3_RX2 0x248 0x618 0x880 0x0 0x1 709#define MX6QDL_PAD_GPIO_8__UART2_TX_DATA 0x244 0x614 0x000 0x4 0x0
710#define MX6Q_PAD_GPIO_16__ENET_1588_EVENT2_IN 0x248 0x618 0x000 0x1 0x0 710#define MX6QDL_PAD_GPIO_8__GPIO1_IO08 0x244 0x614 0x000 0x5 0x0
711#define MX6Q_PAD_GPIO_16__ENET_REF_CLK 0x248 0x618 0x83c 0x2 0x1 711#define MX6QDL_PAD_GPIO_8__SPDIF_SR_CLK 0x244 0x614 0x000 0x6 0x0
712#define MX6Q_PAD_GPIO_16__SD1_LCTL 0x248 0x618 0x000 0x3 0x0 712#define MX6QDL_PAD_GPIO_8__USB_OTG_PWR_CTL_WAKE 0x244 0x614 0x000 0x7 0x0
713#define MX6Q_PAD_GPIO_16__SPDIF_IN 0x248 0x618 0x914 0x4 0x3 713#define MX6QDL_PAD_GPIO_16__ESAI_TX3_RX2 0x248 0x618 0x880 0x0 0x1
714#define MX6Q_PAD_GPIO_16__GPIO7_IO11 0x248 0x618 0x000 0x5 0x0 714#define MX6QDL_PAD_GPIO_16__ENET_1588_EVENT2_IN 0x248 0x618 0x000 0x1 0x0
715#define MX6Q_PAD_GPIO_16__I2C3_SDA 0x248 0x618 0x8ac 0x6 0x2 715#define MX6QDL_PAD_GPIO_16__ENET_REF_CLK 0x248 0x618 0x83c 0x2 0x1
716#define MX6Q_PAD_GPIO_16__JTAG_DE_B 0x248 0x618 0x000 0x7 0x0 716#define MX6QDL_PAD_GPIO_16__SD1_LCTL 0x248 0x618 0x000 0x3 0x0
717#define MX6Q_PAD_GPIO_17__ESAI_TX0 0x24c 0x61c 0x874 0x0 0x0 717#define MX6QDL_PAD_GPIO_16__SPDIF_IN 0x248 0x618 0x914 0x4 0x3
718#define MX6Q_PAD_GPIO_17__ENET_1588_EVENT3_IN 0x24c 0x61c 0x000 0x1 0x0 718#define MX6QDL_PAD_GPIO_16__GPIO7_IO11 0x248 0x618 0x000 0x5 0x0
719#define MX6Q_PAD_GPIO_17__CCM_PMIC_READY 0x24c 0x61c 0x7f0 0x2 0x1 719#define MX6QDL_PAD_GPIO_16__I2C3_SDA 0x248 0x618 0x8ac 0x6 0x2
720#define MX6Q_PAD_GPIO_17__SDMA_EXT_EVENT0 0x24c 0x61c 0x90c 0x3 0x1 720#define MX6QDL_PAD_GPIO_16__JTAG_DE_B 0x248 0x618 0x000 0x7 0x0
721#define MX6Q_PAD_GPIO_17__SPDIF_OUT 0x24c 0x61c 0x000 0x4 0x0 721#define MX6QDL_PAD_GPIO_17__ESAI_TX0 0x24c 0x61c 0x874 0x0 0x0
722#define MX6Q_PAD_GPIO_17__GPIO7_IO12 0x24c 0x61c 0x000 0x5 0x0 722#define MX6QDL_PAD_GPIO_17__ENET_1588_EVENT3_IN 0x24c 0x61c 0x000 0x1 0x0
723#define MX6Q_PAD_GPIO_18__ESAI_TX1 0x250 0x620 0x878 0x0 0x0 723#define MX6QDL_PAD_GPIO_17__CCM_PMIC_READY 0x24c 0x61c 0x7f0 0x2 0x1
724#define MX6Q_PAD_GPIO_18__ENET_RX_CLK 0x250 0x620 0x844 0x1 0x1 724#define MX6QDL_PAD_GPIO_17__SDMA_EXT_EVENT0 0x24c 0x61c 0x90c 0x3 0x1
725#define MX6Q_PAD_GPIO_18__SD3_VSELECT 0x250 0x620 0x000 0x2 0x0 725#define MX6QDL_PAD_GPIO_17__SPDIF_OUT 0x24c 0x61c 0x000 0x4 0x0
726#define MX6Q_PAD_GPIO_18__SDMA_EXT_EVENT1 0x250 0x620 0x910 0x3 0x1 726#define MX6QDL_PAD_GPIO_17__GPIO7_IO12 0x24c 0x61c 0x000 0x5 0x0
727#define MX6Q_PAD_GPIO_18__ASRC_EXT_CLK 0x250 0x620 0x7b0 0x4 0x2 727#define MX6QDL_PAD_GPIO_18__ESAI_TX1 0x250 0x620 0x878 0x0 0x0
728#define MX6Q_PAD_GPIO_18__GPIO7_IO13 0x250 0x620 0x000 0x5 0x0 728#define MX6QDL_PAD_GPIO_18__ENET_RX_CLK 0x250 0x620 0x844 0x1 0x1
729#define MX6Q_PAD_GPIO_18__SNVS_VIO_5_CTL 0x250 0x620 0x000 0x6 0x0 729#define MX6QDL_PAD_GPIO_18__SD3_VSELECT 0x250 0x620 0x000 0x2 0x0
730#define MX6Q_PAD_GPIO_19__KEY_COL5 0x254 0x624 0x8e8 0x0 0x1 730#define MX6QDL_PAD_GPIO_18__SDMA_EXT_EVENT1 0x250 0x620 0x910 0x3 0x1
731#define MX6Q_PAD_GPIO_19__ENET_1588_EVENT0_OUT 0x254 0x624 0x000 0x1 0x0 731#define MX6QDL_PAD_GPIO_18__ASRC_EXT_CLK 0x250 0x620 0x7b0 0x4 0x2
732#define MX6Q_PAD_GPIO_19__SPDIF_OUT 0x254 0x624 0x000 0x2 0x0 732#define MX6QDL_PAD_GPIO_18__GPIO7_IO13 0x250 0x620 0x000 0x5 0x0
733#define MX6Q_PAD_GPIO_19__CCM_CLKO1 0x254 0x624 0x000 0x3 0x0 733#define MX6QDL_PAD_GPIO_18__SNVS_VIO_5_CTL 0x250 0x620 0x000 0x6 0x0
734#define MX6Q_PAD_GPIO_19__ECSPI1_RDY 0x254 0x624 0x000 0x4 0x0 734#define MX6QDL_PAD_GPIO_19__KEY_COL5 0x254 0x624 0x8e8 0x0 0x1
735#define MX6Q_PAD_GPIO_19__GPIO4_IO05 0x254 0x624 0x000 0x5 0x0 735#define MX6QDL_PAD_GPIO_19__ENET_1588_EVENT0_OUT 0x254 0x624 0x000 0x1 0x0
736#define MX6Q_PAD_GPIO_19__ENET_TX_ER 0x254 0x624 0x000 0x6 0x0 736#define MX6QDL_PAD_GPIO_19__SPDIF_OUT 0x254 0x624 0x000 0x2 0x0
737#define MX6Q_PAD_CSI0_PIXCLK__IPU1_CSI0_PIXCLK 0x258 0x628 0x000 0x0 0x0 737#define MX6QDL_PAD_GPIO_19__CCM_CLKO1 0x254 0x624 0x000 0x3 0x0
738#define MX6Q_PAD_CSI0_PIXCLK__GPIO5_IO18 0x258 0x628 0x000 0x5 0x0 738#define MX6QDL_PAD_GPIO_19__ECSPI1_RDY 0x254 0x624 0x000 0x4 0x0
739#define MX6Q_PAD_CSI0_PIXCLK__ARM_EVENTO 0x258 0x628 0x000 0x7 0x0 739#define MX6QDL_PAD_GPIO_19__GPIO4_IO05 0x254 0x624 0x000 0x5 0x0
740#define MX6Q_PAD_CSI0_MCLK__IPU1_CSI0_HSYNC 0x25c 0x62c 0x000 0x0 0x0 740#define MX6QDL_PAD_GPIO_19__ENET_TX_ER 0x254 0x624 0x000 0x6 0x0
741#define MX6Q_PAD_CSI0_MCLK__CCM_CLKO1 0x25c 0x62c 0x000 0x3 0x0 741#define MX6QDL_PAD_CSI0_PIXCLK__IPU1_CSI0_PIXCLK 0x258 0x628 0x000 0x0 0x0
742#define MX6Q_PAD_CSI0_MCLK__GPIO5_IO19 0x25c 0x62c 0x000 0x5 0x0 742#define MX6QDL_PAD_CSI0_PIXCLK__GPIO5_IO18 0x258 0x628 0x000 0x5 0x0
743#define MX6Q_PAD_CSI0_MCLK__ARM_TRACE_CTL 0x25c 0x62c 0x000 0x7 0x0 743#define MX6QDL_PAD_CSI0_PIXCLK__ARM_EVENTO 0x258 0x628 0x000 0x7 0x0
744#define MX6Q_PAD_CSI0_DATA_EN__IPU1_CSI0_DATA_EN 0x260 0x630 0x000 0x0 0x0 744#define MX6QDL_PAD_CSI0_MCLK__IPU1_CSI0_HSYNC 0x25c 0x62c 0x000 0x0 0x0
745#define MX6Q_PAD_CSI0_DATA_EN__EIM_DATA00 0x260 0x630 0x000 0x1 0x0 745#define MX6QDL_PAD_CSI0_MCLK__CCM_CLKO1 0x25c 0x62c 0x000 0x3 0x0
746#define MX6Q_PAD_CSI0_DATA_EN__GPIO5_IO20 0x260 0x630 0x000 0x5 0x0 746#define MX6QDL_PAD_CSI0_MCLK__GPIO5_IO19 0x25c 0x62c 0x000 0x5 0x0
747#define MX6Q_PAD_CSI0_DATA_EN__ARM_TRACE_CLK 0x260 0x630 0x000 0x7 0x0 747#define MX6QDL_PAD_CSI0_MCLK__ARM_TRACE_CTL 0x25c 0x62c 0x000 0x7 0x0
748#define MX6Q_PAD_CSI0_VSYNC__IPU1_CSI0_VSYNC 0x264 0x634 0x000 0x0 0x0 748#define MX6QDL_PAD_CSI0_DATA_EN__IPU1_CSI0_DATA_EN 0x260 0x630 0x000 0x0 0x0
749#define MX6Q_PAD_CSI0_VSYNC__EIM_DATA01 0x264 0x634 0x000 0x1 0x0 749#define MX6QDL_PAD_CSI0_DATA_EN__EIM_DATA00 0x260 0x630 0x000 0x1 0x0
750#define MX6Q_PAD_CSI0_VSYNC__GPIO5_IO21 0x264 0x634 0x000 0x5 0x0 750#define MX6QDL_PAD_CSI0_DATA_EN__GPIO5_IO20 0x260 0x630 0x000 0x5 0x0
751#define MX6Q_PAD_CSI0_VSYNC__ARM_TRACE00 0x264 0x634 0x000 0x7 0x0 751#define MX6QDL_PAD_CSI0_DATA_EN__ARM_TRACE_CLK 0x260 0x630 0x000 0x7 0x0
752#define MX6Q_PAD_CSI0_DAT4__IPU1_CSI0_DATA04 0x268 0x638 0x000 0x0 0x0 752#define MX6QDL_PAD_CSI0_VSYNC__IPU1_CSI0_VSYNC 0x264 0x634 0x000 0x0 0x0
753#define MX6Q_PAD_CSI0_DAT4__EIM_DATA02 0x268 0x638 0x000 0x1 0x0 753#define MX6QDL_PAD_CSI0_VSYNC__EIM_DATA01 0x264 0x634 0x000 0x1 0x0
754#define MX6Q_PAD_CSI0_DAT4__ECSPI1_SCLK 0x268 0x638 0x7f4 0x2 0x3 754#define MX6QDL_PAD_CSI0_VSYNC__GPIO5_IO21 0x264 0x634 0x000 0x5 0x0
755#define MX6Q_PAD_CSI0_DAT4__KEY_COL5 0x268 0x638 0x8e8 0x3 0x2 755#define MX6QDL_PAD_CSI0_VSYNC__ARM_TRACE00 0x264 0x634 0x000 0x7 0x0
756#define MX6Q_PAD_CSI0_DAT4__AUD3_TXC 0x268 0x638 0x000 0x4 0x0 756#define MX6QDL_PAD_CSI0_DAT4__IPU1_CSI0_DATA04 0x268 0x638 0x000 0x0 0x0
757#define MX6Q_PAD_CSI0_DAT4__GPIO5_IO22 0x268 0x638 0x000 0x5 0x0 757#define MX6QDL_PAD_CSI0_DAT4__EIM_DATA02 0x268 0x638 0x000 0x1 0x0
758#define MX6Q_PAD_CSI0_DAT4__ARM_TRACE01 0x268 0x638 0x000 0x7 0x0 758#define MX6QDL_PAD_CSI0_DAT4__ECSPI1_SCLK 0x268 0x638 0x7f4 0x2 0x3
759#define MX6Q_PAD_CSI0_DAT5__IPU1_CSI0_DATA05 0x26c 0x63c 0x000 0x0 0x0 759#define MX6QDL_PAD_CSI0_DAT4__KEY_COL5 0x268 0x638 0x8e8 0x3 0x2
760#define MX6Q_PAD_CSI0_DAT5__EIM_DATA03 0x26c 0x63c 0x000 0x1 0x0 760#define MX6QDL_PAD_CSI0_DAT4__AUD3_TXC 0x268 0x638 0x000 0x4 0x0
761#define MX6Q_PAD_CSI0_DAT5__ECSPI1_MOSI 0x26c 0x63c 0x7fc 0x2 0x3 761#define MX6QDL_PAD_CSI0_DAT4__GPIO5_IO22 0x268 0x638 0x000 0x5 0x0
762#define MX6Q_PAD_CSI0_DAT5__KEY_ROW5 0x26c 0x63c 0x8f4 0x3 0x1 762#define MX6QDL_PAD_CSI0_DAT4__ARM_TRACE01 0x268 0x638 0x000 0x7 0x0
763#define MX6Q_PAD_CSI0_DAT5__AUD3_TXD 0x26c 0x63c 0x000 0x4 0x0 763#define MX6QDL_PAD_CSI0_DAT5__IPU1_CSI0_DATA05 0x26c 0x63c 0x000 0x0 0x0
764#define MX6Q_PAD_CSI0_DAT5__GPIO5_IO23 0x26c 0x63c 0x000 0x5 0x0 764#define MX6QDL_PAD_CSI0_DAT5__EIM_DATA03 0x26c 0x63c 0x000 0x1 0x0
765#define MX6Q_PAD_CSI0_DAT5__ARM_TRACE02 0x26c 0x63c 0x000 0x7 0x0 765#define MX6QDL_PAD_CSI0_DAT5__ECSPI1_MOSI 0x26c 0x63c 0x7fc 0x2 0x3
766#define MX6Q_PAD_CSI0_DAT6__IPU1_CSI0_DATA06 0x270 0x640 0x000 0x0 0x0 766#define MX6QDL_PAD_CSI0_DAT5__KEY_ROW5 0x26c 0x63c 0x8f4 0x3 0x1
767#define MX6Q_PAD_CSI0_DAT6__EIM_DATA04 0x270 0x640 0x000 0x1 0x0 767#define MX6QDL_PAD_CSI0_DAT5__AUD3_TXD 0x26c 0x63c 0x000 0x4 0x0
768#define MX6Q_PAD_CSI0_DAT6__ECSPI1_MISO 0x270 0x640 0x7f8 0x2 0x3 768#define MX6QDL_PAD_CSI0_DAT5__GPIO5_IO23 0x26c 0x63c 0x000 0x5 0x0
769#define MX6Q_PAD_CSI0_DAT6__KEY_COL6 0x270 0x640 0x8ec 0x3 0x1 769#define MX6QDL_PAD_CSI0_DAT5__ARM_TRACE02 0x26c 0x63c 0x000 0x7 0x0
770#define MX6Q_PAD_CSI0_DAT6__AUD3_TXFS 0x270 0x640 0x000 0x4 0x0 770#define MX6QDL_PAD_CSI0_DAT6__IPU1_CSI0_DATA06 0x270 0x640 0x000 0x0 0x0
771#define MX6Q_PAD_CSI0_DAT6__GPIO5_IO24 0x270 0x640 0x000 0x5 0x0 771#define MX6QDL_PAD_CSI0_DAT6__EIM_DATA04 0x270 0x640 0x000 0x1 0x0
772#define MX6Q_PAD_CSI0_DAT6__ARM_TRACE03 0x270 0x640 0x000 0x7 0x0 772#define MX6QDL_PAD_CSI0_DAT6__ECSPI1_MISO 0x270 0x640 0x7f8 0x2 0x3
773#define MX6Q_PAD_CSI0_DAT7__IPU1_CSI0_DATA07 0x274 0x644 0x000 0x0 0x0 773#define MX6QDL_PAD_CSI0_DAT6__KEY_COL6 0x270 0x640 0x8ec 0x3 0x1
774#define MX6Q_PAD_CSI0_DAT7__EIM_DATA05 0x274 0x644 0x000 0x1 0x0 774#define MX6QDL_PAD_CSI0_DAT6__AUD3_TXFS 0x270 0x640 0x000 0x4 0x0
775#define MX6Q_PAD_CSI0_DAT7__ECSPI1_SS0 0x274 0x644 0x800 0x2 0x3 775#define MX6QDL_PAD_CSI0_DAT6__GPIO5_IO24 0x270 0x640 0x000 0x5 0x0
776#define MX6Q_PAD_CSI0_DAT7__KEY_ROW6 0x274 0x644 0x8f8 0x3 0x2 776#define MX6QDL_PAD_CSI0_DAT6__ARM_TRACE03 0x270 0x640 0x000 0x7 0x0
777#define MX6Q_PAD_CSI0_DAT7__AUD3_RXD 0x274 0x644 0x000 0x4 0x0 777#define MX6QDL_PAD_CSI0_DAT7__IPU1_CSI0_DATA07 0x274 0x644 0x000 0x0 0x0
778#define MX6Q_PAD_CSI0_DAT7__GPIO5_IO25 0x274 0x644 0x000 0x5 0x0 778#define MX6QDL_PAD_CSI0_DAT7__EIM_DATA05 0x274 0x644 0x000 0x1 0x0
779#define MX6Q_PAD_CSI0_DAT7__ARM_TRACE04 0x274 0x644 0x000 0x7 0x0 779#define MX6QDL_PAD_CSI0_DAT7__ECSPI1_SS0 0x274 0x644 0x800 0x2 0x3
780#define MX6Q_PAD_CSI0_DAT8__IPU1_CSI0_DATA08 0x278 0x648 0x000 0x0 0x0 780#define MX6QDL_PAD_CSI0_DAT7__KEY_ROW6 0x274 0x644 0x8f8 0x3 0x2
781#define MX6Q_PAD_CSI0_DAT8__EIM_DATA06 0x278 0x648 0x000 0x1 0x0 781#define MX6QDL_PAD_CSI0_DAT7__AUD3_RXD 0x274 0x644 0x000 0x4 0x0
782#define MX6Q_PAD_CSI0_DAT8__ECSPI2_SCLK 0x278 0x648 0x810 0x2 0x2 782#define MX6QDL_PAD_CSI0_DAT7__GPIO5_IO25 0x274 0x644 0x000 0x5 0x0
783#define MX6Q_PAD_CSI0_DAT8__KEY_COL7 0x278 0x648 0x8f0 0x3 0x2 783#define MX6QDL_PAD_CSI0_DAT7__ARM_TRACE04 0x274 0x644 0x000 0x7 0x0
784#define MX6Q_PAD_CSI0_DAT8__I2C1_SDA 0x278 0x648 0x89c 0x4 0x1 784#define MX6QDL_PAD_CSI0_DAT8__IPU1_CSI0_DATA08 0x278 0x648 0x000 0x0 0x0
785#define MX6Q_PAD_CSI0_DAT8__GPIO5_IO26 0x278 0x648 0x000 0x5 0x0 785#define MX6QDL_PAD_CSI0_DAT8__EIM_DATA06 0x278 0x648 0x000 0x1 0x0
786#define MX6Q_PAD_CSI0_DAT8__ARM_TRACE05 0x278 0x648 0x000 0x7 0x0 786#define MX6QDL_PAD_CSI0_DAT8__ECSPI2_SCLK 0x278 0x648 0x810 0x2 0x2
787#define MX6Q_PAD_CSI0_DAT9__IPU1_CSI0_DATA09 0x27c 0x64c 0x000 0x0 0x0 787#define MX6QDL_PAD_CSI0_DAT8__KEY_COL7 0x278 0x648 0x8f0 0x3 0x2
788#define MX6Q_PAD_CSI0_DAT9__EIM_DATA07 0x27c 0x64c 0x000 0x1 0x0 788#define MX6QDL_PAD_CSI0_DAT8__I2C1_SDA 0x278 0x648 0x89c 0x4 0x1
789#define MX6Q_PAD_CSI0_DAT9__ECSPI2_MOSI 0x27c 0x64c 0x818 0x2 0x2 789#define MX6QDL_PAD_CSI0_DAT8__GPIO5_IO26 0x278 0x648 0x000 0x5 0x0
790#define MX6Q_PAD_CSI0_DAT9__KEY_ROW7 0x27c 0x64c 0x8fc 0x3 0x2 790#define MX6QDL_PAD_CSI0_DAT8__ARM_TRACE05 0x278 0x648 0x000 0x7 0x0
791#define MX6Q_PAD_CSI0_DAT9__I2C1_SCL 0x27c 0x64c 0x898 0x4 0x1 791#define MX6QDL_PAD_CSI0_DAT9__IPU1_CSI0_DATA09 0x27c 0x64c 0x000 0x0 0x0
792#define MX6Q_PAD_CSI0_DAT9__GPIO5_IO27 0x27c 0x64c 0x000 0x5 0x0 792#define MX6QDL_PAD_CSI0_DAT9__EIM_DATA07 0x27c 0x64c 0x000 0x1 0x0
793#define MX6Q_PAD_CSI0_DAT9__ARM_TRACE06 0x27c 0x64c 0x000 0x7 0x0 793#define MX6QDL_PAD_CSI0_DAT9__ECSPI2_MOSI 0x27c 0x64c 0x818 0x2 0x2
794#define MX6Q_PAD_CSI0_DAT10__IPU1_CSI0_DATA10 0x280 0x650 0x000 0x0 0x0 794#define MX6QDL_PAD_CSI0_DAT9__KEY_ROW7 0x27c 0x64c 0x8fc 0x3 0x2
795#define MX6Q_PAD_CSI0_DAT10__AUD3_RXC 0x280 0x650 0x000 0x1 0x0 795#define MX6QDL_PAD_CSI0_DAT9__I2C1_SCL 0x27c 0x64c 0x898 0x4 0x1
796#define MX6Q_PAD_CSI0_DAT10__ECSPI2_MISO 0x280 0x650 0x814 0x2 0x2 796#define MX6QDL_PAD_CSI0_DAT9__GPIO5_IO27 0x27c 0x64c 0x000 0x5 0x0
797#define MX6Q_PAD_CSI0_DAT10__UART1_TX_DATA 0x280 0x650 0x000 0x3 0x0 797#define MX6QDL_PAD_CSI0_DAT9__ARM_TRACE06 0x27c 0x64c 0x000 0x7 0x0
798#define MX6Q_PAD_CSI0_DAT10__UART1_RX_DATA 0x280 0x650 0x920 0x3 0x0 798#define MX6QDL_PAD_CSI0_DAT10__IPU1_CSI0_DATA10 0x280 0x650 0x000 0x0 0x0
799#define MX6Q_PAD_CSI0_DAT10__GPIO5_IO28 0x280 0x650 0x000 0x5 0x0 799#define MX6QDL_PAD_CSI0_DAT10__AUD3_RXC 0x280 0x650 0x000 0x1 0x0
800#define MX6Q_PAD_CSI0_DAT10__ARM_TRACE07 0x280 0x650 0x000 0x7 0x0 800#define MX6QDL_PAD_CSI0_DAT10__ECSPI2_MISO 0x280 0x650 0x814 0x2 0x2
801#define MX6Q_PAD_CSI0_DAT11__IPU1_CSI0_DATA11 0x284 0x654 0x000 0x0 0x0 801#define MX6QDL_PAD_CSI0_DAT10__UART1_TX_DATA 0x280 0x650 0x000 0x3 0x0
802#define MX6Q_PAD_CSI0_DAT11__AUD3_RXFS 0x284 0x654 0x000 0x1 0x0 802#define MX6QDL_PAD_CSI0_DAT10__UART1_RX_DATA 0x280 0x650 0x920 0x3 0x0
803#define MX6Q_PAD_CSI0_DAT11__ECSPI2_SS0 0x284 0x654 0x81c 0x2 0x2 803#define MX6QDL_PAD_CSI0_DAT10__GPIO5_IO28 0x280 0x650 0x000 0x5 0x0
804#define MX6Q_PAD_CSI0_DAT11__UART1_RX_DATA 0x284 0x654 0x920 0x3 0x1 804#define MX6QDL_PAD_CSI0_DAT10__ARM_TRACE07 0x280 0x650 0x000 0x7 0x0
805#define MX6Q_PAD_CSI0_DAT11__UART1_TX_DATA 0x284 0x654 0x000 0x3 0x0 805#define MX6QDL_PAD_CSI0_DAT11__IPU1_CSI0_DATA11 0x284 0x654 0x000 0x0 0x0
806#define MX6Q_PAD_CSI0_DAT11__GPIO5_IO29 0x284 0x654 0x000 0x5 0x0 806#define MX6QDL_PAD_CSI0_DAT11__AUD3_RXFS 0x284 0x654 0x000 0x1 0x0
807#define MX6Q_PAD_CSI0_DAT11__ARM_TRACE08 0x284 0x654 0x000 0x7 0x0 807#define MX6QDL_PAD_CSI0_DAT11__ECSPI2_SS0 0x284 0x654 0x81c 0x2 0x2
808#define MX6Q_PAD_CSI0_DAT12__IPU1_CSI0_DATA12 0x288 0x658 0x000 0x0 0x0 808#define MX6QDL_PAD_CSI0_DAT11__UART1_RX_DATA 0x284 0x654 0x920 0x3 0x1
809#define MX6Q_PAD_CSI0_DAT12__EIM_DATA08 0x288 0x658 0x000 0x1 0x0 809#define MX6QDL_PAD_CSI0_DAT11__UART1_TX_DATA 0x284 0x654 0x000 0x3 0x0
810#define MX6Q_PAD_CSI0_DAT12__UART4_TX_DATA 0x288 0x658 0x000 0x3 0x0 810#define MX6QDL_PAD_CSI0_DAT11__GPIO5_IO29 0x284 0x654 0x000 0x5 0x0
811#define MX6Q_PAD_CSI0_DAT12__UART4_RX_DATA 0x288 0x658 0x938 0x3 0x2 811#define MX6QDL_PAD_CSI0_DAT11__ARM_TRACE08 0x284 0x654 0x000 0x7 0x0
812#define MX6Q_PAD_CSI0_DAT12__GPIO5_IO30 0x288 0x658 0x000 0x5 0x0 812#define MX6QDL_PAD_CSI0_DAT12__IPU1_CSI0_DATA12 0x288 0x658 0x000 0x0 0x0
813#define MX6Q_PAD_CSI0_DAT12__ARM_TRACE09 0x288 0x658 0x000 0x7 0x0 813#define MX6QDL_PAD_CSI0_DAT12__EIM_DATA08 0x288 0x658 0x000 0x1 0x0
814#define MX6Q_PAD_CSI0_DAT13__IPU1_CSI0_DATA13 0x28c 0x65c 0x000 0x0 0x0 814#define MX6QDL_PAD_CSI0_DAT12__UART4_TX_DATA 0x288 0x658 0x000 0x3 0x0
815#define MX6Q_PAD_CSI0_DAT13__EIM_DATA09 0x28c 0x65c 0x000 0x1 0x0 815#define MX6QDL_PAD_CSI0_DAT12__UART4_RX_DATA 0x288 0x658 0x938 0x3 0x2
816#define MX6Q_PAD_CSI0_DAT13__UART4_RX_DATA 0x28c 0x65c 0x938 0x3 0x3 816#define MX6QDL_PAD_CSI0_DAT12__GPIO5_IO30 0x288 0x658 0x000 0x5 0x0
817#define MX6Q_PAD_CSI0_DAT13__UART4_TX_DATA 0x28c 0x65c 0x000 0x3 0x0 817#define MX6QDL_PAD_CSI0_DAT12__ARM_TRACE09 0x288 0x658 0x000 0x7 0x0
818#define MX6Q_PAD_CSI0_DAT13__GPIO5_IO31 0x28c 0x65c 0x000 0x5 0x0 818#define MX6QDL_PAD_CSI0_DAT13__IPU1_CSI0_DATA13 0x28c 0x65c 0x000 0x0 0x0
819#define MX6Q_PAD_CSI0_DAT13__ARM_TRACE10 0x28c 0x65c 0x000 0x7 0x0 819#define MX6QDL_PAD_CSI0_DAT13__EIM_DATA09 0x28c 0x65c 0x000 0x1 0x0
820#define MX6Q_PAD_CSI0_DAT14__IPU1_CSI0_DATA14 0x290 0x660 0x000 0x0 0x0 820#define MX6QDL_PAD_CSI0_DAT13__UART4_RX_DATA 0x28c 0x65c 0x938 0x3 0x3
821#define MX6Q_PAD_CSI0_DAT14__EIM_DATA10 0x290 0x660 0x000 0x1 0x0 821#define MX6QDL_PAD_CSI0_DAT13__UART4_TX_DATA 0x28c 0x65c 0x000 0x3 0x0
822#define MX6Q_PAD_CSI0_DAT14__UART5_TX_DATA 0x290 0x660 0x000 0x3 0x0 822#define MX6QDL_PAD_CSI0_DAT13__GPIO5_IO31 0x28c 0x65c 0x000 0x5 0x0
823#define MX6Q_PAD_CSI0_DAT14__UART5_RX_DATA 0x290 0x660 0x940 0x3 0x2 823#define MX6QDL_PAD_CSI0_DAT13__ARM_TRACE10 0x28c 0x65c 0x000 0x7 0x0
824#define MX6Q_PAD_CSI0_DAT14__GPIO6_IO00 0x290 0x660 0x000 0x5 0x0 824#define MX6QDL_PAD_CSI0_DAT14__IPU1_CSI0_DATA14 0x290 0x660 0x000 0x0 0x0
825#define MX6Q_PAD_CSI0_DAT14__ARM_TRACE11 0x290 0x660 0x000 0x7 0x0 825#define MX6QDL_PAD_CSI0_DAT14__EIM_DATA10 0x290 0x660 0x000 0x1 0x0
826#define MX6Q_PAD_CSI0_DAT15__IPU1_CSI0_DATA15 0x294 0x664 0x000 0x0 0x0 826#define MX6QDL_PAD_CSI0_DAT14__UART5_TX_DATA 0x290 0x660 0x000 0x3 0x0
827#define MX6Q_PAD_CSI0_DAT15__EIM_DATA11 0x294 0x664 0x000 0x1 0x0 827#define MX6QDL_PAD_CSI0_DAT14__UART5_RX_DATA 0x290 0x660 0x940 0x3 0x2
828#define MX6Q_PAD_CSI0_DAT15__UART5_RX_DATA 0x294 0x664 0x940 0x3 0x3 828#define MX6QDL_PAD_CSI0_DAT14__GPIO6_IO00 0x290 0x660 0x000 0x5 0x0
829#define MX6Q_PAD_CSI0_DAT15__UART5_TX_DATA 0x294 0x664 0x000 0x3 0x0 829#define MX6QDL_PAD_CSI0_DAT14__ARM_TRACE11 0x290 0x660 0x000 0x7 0x0
830#define MX6Q_PAD_CSI0_DAT15__GPIO6_IO01 0x294 0x664 0x000 0x5 0x0 830#define MX6QDL_PAD_CSI0_DAT15__IPU1_CSI0_DATA15 0x294 0x664 0x000 0x0 0x0
831#define MX6Q_PAD_CSI0_DAT15__ARM_TRACE12 0x294 0x664 0x000 0x7 0x0 831#define MX6QDL_PAD_CSI0_DAT15__EIM_DATA11 0x294 0x664 0x000 0x1 0x0
832#define MX6Q_PAD_CSI0_DAT16__IPU1_CSI0_DATA16 0x298 0x668 0x000 0x0 0x0 832#define MX6QDL_PAD_CSI0_DAT15__UART5_RX_DATA 0x294 0x664 0x940 0x3 0x3
833#define MX6Q_PAD_CSI0_DAT16__EIM_DATA12 0x298 0x668 0x000 0x1 0x0 833#define MX6QDL_PAD_CSI0_DAT15__UART5_TX_DATA 0x294 0x664 0x000 0x3 0x0
834#define MX6Q_PAD_CSI0_DAT16__UART4_RTS_B 0x298 0x668 0x934 0x3 0x0 834#define MX6QDL_PAD_CSI0_DAT15__GPIO6_IO01 0x294 0x664 0x000 0x5 0x0
835#define MX6Q_PAD_CSI0_DAT16__UART4_CTS_B 0x298 0x668 0x000 0x3 0x0 835#define MX6QDL_PAD_CSI0_DAT15__ARM_TRACE12 0x294 0x664 0x000 0x7 0x0
836#define MX6Q_PAD_CSI0_DAT16__GPIO6_IO02 0x298 0x668 0x000 0x5 0x0 836#define MX6QDL_PAD_CSI0_DAT16__IPU1_CSI0_DATA16 0x298 0x668 0x000 0x0 0x0
837#define MX6Q_PAD_CSI0_DAT16__ARM_TRACE13 0x298 0x668 0x000 0x7 0x0 837#define MX6QDL_PAD_CSI0_DAT16__EIM_DATA12 0x298 0x668 0x000 0x1 0x0
838#define MX6Q_PAD_CSI0_DAT17__IPU1_CSI0_DATA17 0x29c 0x66c 0x000 0x0 0x0 838#define MX6QDL_PAD_CSI0_DAT16__UART4_RTS_B 0x298 0x668 0x934 0x3 0x0
839#define MX6Q_PAD_CSI0_DAT17__EIM_DATA13 0x29c 0x66c 0x000 0x1 0x0 839#define MX6QDL_PAD_CSI0_DAT16__UART4_CTS_B 0x298 0x668 0x000 0x3 0x0
840#define MX6Q_PAD_CSI0_DAT17__UART4_CTS_B 0x29c 0x66c 0x000 0x3 0x0 840#define MX6QDL_PAD_CSI0_DAT16__GPIO6_IO02 0x298 0x668 0x000 0x5 0x0
841#define MX6Q_PAD_CSI0_DAT17__UART4_RTS_B 0x29c 0x66c 0x934 0x3 0x1 841#define MX6QDL_PAD_CSI0_DAT16__ARM_TRACE13 0x298 0x668 0x000 0x7 0x0
842#define MX6Q_PAD_CSI0_DAT17__GPIO6_IO03 0x29c 0x66c 0x000 0x5 0x0 842#define MX6QDL_PAD_CSI0_DAT17__IPU1_CSI0_DATA17 0x29c 0x66c 0x000 0x0 0x0
843#define MX6Q_PAD_CSI0_DAT17__ARM_TRACE14 0x29c 0x66c 0x000 0x7 0x0 843#define MX6QDL_PAD_CSI0_DAT17__EIM_DATA13 0x29c 0x66c 0x000 0x1 0x0
844#define MX6Q_PAD_CSI0_DAT18__IPU1_CSI0_DATA18 0x2a0 0x670 0x000 0x0 0x0 844#define MX6QDL_PAD_CSI0_DAT17__UART4_CTS_B 0x29c 0x66c 0x000 0x3 0x0
845#define MX6Q_PAD_CSI0_DAT18__EIM_DATA14 0x2a0 0x670 0x000 0x1 0x0 845#define MX6QDL_PAD_CSI0_DAT17__UART4_RTS_B 0x29c 0x66c 0x934 0x3 0x1
846#define MX6Q_PAD_CSI0_DAT18__UART5_RTS_B 0x2a0 0x670 0x93c 0x3 0x2 846#define MX6QDL_PAD_CSI0_DAT17__GPIO6_IO03 0x29c 0x66c 0x000 0x5 0x0
847#define MX6Q_PAD_CSI0_DAT18__UART5_CTS_B 0x2a0 0x670 0x000 0x3 0x0 847#define MX6QDL_PAD_CSI0_DAT17__ARM_TRACE14 0x29c 0x66c 0x000 0x7 0x0
848#define MX6Q_PAD_CSI0_DAT18__GPIO6_IO04 0x2a0 0x670 0x000 0x5 0x0 848#define MX6QDL_PAD_CSI0_DAT18__IPU1_CSI0_DATA18 0x2a0 0x670 0x000 0x0 0x0
849#define MX6Q_PAD_CSI0_DAT18__ARM_TRACE15 0x2a0 0x670 0x000 0x7 0x0 849#define MX6QDL_PAD_CSI0_DAT18__EIM_DATA14 0x2a0 0x670 0x000 0x1 0x0
850#define MX6Q_PAD_CSI0_DAT19__IPU1_CSI0_DATA19 0x2a4 0x674 0x000 0x0 0x0 850#define MX6QDL_PAD_CSI0_DAT18__UART5_RTS_B 0x2a0 0x670 0x93c 0x3 0x2
851#define MX6Q_PAD_CSI0_DAT19__EIM_DATA15 0x2a4 0x674 0x000 0x1 0x0 851#define MX6QDL_PAD_CSI0_DAT18__UART5_CTS_B 0x2a0 0x670 0x000 0x3 0x0
852#define MX6Q_PAD_CSI0_DAT19__UART5_CTS_B 0x2a4 0x674 0x000 0x3 0x0 852#define MX6QDL_PAD_CSI0_DAT18__GPIO6_IO04 0x2a0 0x670 0x000 0x5 0x0
853#define MX6Q_PAD_CSI0_DAT19__UART5_RTS_B 0x2a4 0x674 0x93c 0x3 0x3 853#define MX6QDL_PAD_CSI0_DAT18__ARM_TRACE15 0x2a0 0x670 0x000 0x7 0x0
854#define MX6Q_PAD_CSI0_DAT19__GPIO6_IO05 0x2a4 0x674 0x000 0x5 0x0 854#define MX6QDL_PAD_CSI0_DAT19__IPU1_CSI0_DATA19 0x2a4 0x674 0x000 0x0 0x0
855#define MX6Q_PAD_SD3_DAT7__SD3_DATA7 0x2a8 0x690 0x000 0x0 0x0 855#define MX6QDL_PAD_CSI0_DAT19__EIM_DATA15 0x2a4 0x674 0x000 0x1 0x0
856#define MX6Q_PAD_SD3_DAT7__UART1_TX_DATA 0x2a8 0x690 0x000 0x1 0x0 856#define MX6QDL_PAD_CSI0_DAT19__UART5_CTS_B 0x2a4 0x674 0x000 0x3 0x0
857#define MX6Q_PAD_SD3_DAT7__UART1_RX_DATA 0x2a8 0x690 0x920 0x1 0x2 857#define MX6QDL_PAD_CSI0_DAT19__UART5_RTS_B 0x2a4 0x674 0x93c 0x3 0x3
858#define MX6Q_PAD_SD3_DAT7__GPIO6_IO17 0x2a8 0x690 0x000 0x5 0x0 858#define MX6QDL_PAD_CSI0_DAT19__GPIO6_IO05 0x2a4 0x674 0x000 0x5 0x0
859#define MX6Q_PAD_SD3_DAT6__SD3_DATA6 0x2ac 0x694 0x000 0x0 0x0 859#define MX6QDL_PAD_SD3_DAT7__SD3_DATA7 0x2a8 0x690 0x000 0x0 0x0
860#define MX6Q_PAD_SD3_DAT6__UART1_RX_DATA 0x2ac 0x694 0x920 0x1 0x3 860#define MX6QDL_PAD_SD3_DAT7__UART1_TX_DATA 0x2a8 0x690 0x000 0x1 0x0
861#define MX6Q_PAD_SD3_DAT6__UART1_TX_DATA 0x2ac 0x694 0x000 0x1 0x0 861#define MX6QDL_PAD_SD3_DAT7__UART1_RX_DATA 0x2a8 0x690 0x920 0x1 0x2
862#define MX6Q_PAD_SD3_DAT6__GPIO6_IO18 0x2ac 0x694 0x000 0x5 0x0 862#define MX6QDL_PAD_SD3_DAT7__GPIO6_IO17 0x2a8 0x690 0x000 0x5 0x0
863#define MX6Q_PAD_SD3_DAT5__SD3_DATA5 0x2b0 0x698 0x000 0x0 0x0 863#define MX6QDL_PAD_SD3_DAT6__SD3_DATA6 0x2ac 0x694 0x000 0x0 0x0
864#define MX6Q_PAD_SD3_DAT5__UART2_TX_DATA 0x2b0 0x698 0x000 0x1 0x0 864#define MX6QDL_PAD_SD3_DAT6__UART1_RX_DATA 0x2ac 0x694 0x920 0x1 0x3
865#define MX6Q_PAD_SD3_DAT5__UART2_RX_DATA 0x2b0 0x698 0x928 0x1 0x4 865#define MX6QDL_PAD_SD3_DAT6__UART1_TX_DATA 0x2ac 0x694 0x000 0x1 0x0
866#define MX6Q_PAD_SD3_DAT5__GPIO7_IO00 0x2b0 0x698 0x000 0x5 0x0 866#define MX6QDL_PAD_SD3_DAT6__GPIO6_IO18 0x2ac 0x694 0x000 0x5 0x0
867#define MX6Q_PAD_SD3_DAT4__SD3_DATA4 0x2b4 0x69c 0x000 0x0 0x0 867#define MX6QDL_PAD_SD3_DAT5__SD3_DATA5 0x2b0 0x698 0x000 0x0 0x0
868#define MX6Q_PAD_SD3_DAT4__UART2_RX_DATA 0x2b4 0x69c 0x928 0x1 0x5 868#define MX6QDL_PAD_SD3_DAT5__UART2_TX_DATA 0x2b0 0x698 0x000 0x1 0x0
869#define MX6Q_PAD_SD3_DAT4__UART2_TX_DATA 0x2b4 0x69c 0x000 0x1 0x0 869#define MX6QDL_PAD_SD3_DAT5__UART2_RX_DATA 0x2b0 0x698 0x928 0x1 0x4
870#define MX6Q_PAD_SD3_DAT4__GPIO7_IO01 0x2b4 0x69c 0x000 0x5 0x0 870#define MX6QDL_PAD_SD3_DAT5__GPIO7_IO00 0x2b0 0x698 0x000 0x5 0x0
871#define MX6Q_PAD_SD3_CMD__SD3_CMD 0x2b8 0x6a0 0x000 0x0 0x0 871#define MX6QDL_PAD_SD3_DAT4__SD3_DATA4 0x2b4 0x69c 0x000 0x0 0x0
872#define MX6Q_PAD_SD3_CMD__UART2_CTS_B 0x2b8 0x6a0 0x000 0x1 0x0 872#define MX6QDL_PAD_SD3_DAT4__UART2_RX_DATA 0x2b4 0x69c 0x928 0x1 0x5
873#define MX6Q_PAD_SD3_CMD__UART2_RTS_B 0x2b8 0x6a0 0x924 0x1 0x2 873#define MX6QDL_PAD_SD3_DAT4__UART2_TX_DATA 0x2b4 0x69c 0x000 0x1 0x0
874#define MX6Q_PAD_SD3_CMD__FLEXCAN1_TX 0x2b8 0x6a0 0x000 0x2 0x0 874#define MX6QDL_PAD_SD3_DAT4__GPIO7_IO01 0x2b4 0x69c 0x000 0x5 0x0
875#define MX6Q_PAD_SD3_CMD__GPIO7_IO02 0x2b8 0x6a0 0x000 0x5 0x0 875#define MX6QDL_PAD_SD3_CMD__SD3_CMD 0x2b8 0x6a0 0x000 0x0 0x0
876#define MX6Q_PAD_SD3_CLK__SD3_CLK 0x2bc 0x6a4 0x000 0x0 0x0 876#define MX6QDL_PAD_SD3_CMD__UART2_CTS_B 0x2b8 0x6a0 0x000 0x1 0x0
877#define MX6Q_PAD_SD3_CLK__UART2_RTS_B 0x2bc 0x6a4 0x924 0x1 0x3 877#define MX6QDL_PAD_SD3_CMD__UART2_RTS_B 0x2b8 0x6a0 0x924 0x1 0x2
878#define MX6Q_PAD_SD3_CLK__UART2_CTS_B 0x2bc 0x6a4 0x000 0x1 0x0 878#define MX6QDL_PAD_SD3_CMD__FLEXCAN1_TX 0x2b8 0x6a0 0x000 0x2 0x0
879#define MX6Q_PAD_SD3_CLK__FLEXCAN1_RX 0x2bc 0x6a4 0x7e4 0x2 0x2 879#define MX6QDL_PAD_SD3_CMD__GPIO7_IO02 0x2b8 0x6a0 0x000 0x5 0x0
880#define MX6Q_PAD_SD3_CLK__GPIO7_IO03 0x2bc 0x6a4 0x000 0x5 0x0 880#define MX6QDL_PAD_SD3_CLK__SD3_CLK 0x2bc 0x6a4 0x000 0x0 0x0
881#define MX6Q_PAD_SD3_DAT0__SD3_DATA0 0x2c0 0x6a8 0x000 0x0 0x0 881#define MX6QDL_PAD_SD3_CLK__UART2_RTS_B 0x2bc 0x6a4 0x924 0x1 0x3
882#define MX6Q_PAD_SD3_DAT0__UART1_CTS_B 0x2c0 0x6a8 0x000 0x1 0x0 882#define MX6QDL_PAD_SD3_CLK__UART2_CTS_B 0x2bc 0x6a4 0x000 0x1 0x0
883#define MX6Q_PAD_SD3_DAT0__UART1_RTS_B 0x2c0 0x6a8 0x91c 0x1 0x2 883#define MX6QDL_PAD_SD3_CLK__FLEXCAN1_RX 0x2bc 0x6a4 0x7e4 0x2 0x2
884#define MX6Q_PAD_SD3_DAT0__FLEXCAN2_TX 0x2c0 0x6a8 0x000 0x2 0x0 884#define MX6QDL_PAD_SD3_CLK__GPIO7_IO03 0x2bc 0x6a4 0x000 0x5 0x0
885#define MX6Q_PAD_SD3_DAT0__GPIO7_IO04 0x2c0 0x6a8 0x000 0x5 0x0 885#define MX6QDL_PAD_SD3_DAT0__SD3_DATA0 0x2c0 0x6a8 0x000 0x0 0x0
886#define MX6Q_PAD_SD3_DAT1__SD3_DATA1 0x2c4 0x6ac 0x000 0x0 0x0 886#define MX6QDL_PAD_SD3_DAT0__UART1_CTS_B 0x2c0 0x6a8 0x000 0x1 0x0
887#define MX6Q_PAD_SD3_DAT1__UART1_RTS_B 0x2c4 0x6ac 0x91c 0x1 0x3 887#define MX6QDL_PAD_SD3_DAT0__UART1_RTS_B 0x2c0 0x6a8 0x91c 0x1 0x2
888#define MX6Q_PAD_SD3_DAT1__UART1_CTS_B 0x2c4 0x6ac 0x000 0x1 0x0 888#define MX6QDL_PAD_SD3_DAT0__FLEXCAN2_TX 0x2c0 0x6a8 0x000 0x2 0x0
889#define MX6Q_PAD_SD3_DAT1__FLEXCAN2_RX 0x2c4 0x6ac 0x7e8 0x2 0x1 889#define MX6QDL_PAD_SD3_DAT0__GPIO7_IO04 0x2c0 0x6a8 0x000 0x5 0x0
890#define MX6Q_PAD_SD3_DAT1__GPIO7_IO05 0x2c4 0x6ac 0x000 0x5 0x0 890#define MX6QDL_PAD_SD3_DAT1__SD3_DATA1 0x2c4 0x6ac 0x000 0x0 0x0
891#define MX6Q_PAD_SD3_DAT2__SD3_DATA2 0x2c8 0x6b0 0x000 0x0 0x0 891#define MX6QDL_PAD_SD3_DAT1__UART1_RTS_B 0x2c4 0x6ac 0x91c 0x1 0x3
892#define MX6Q_PAD_SD3_DAT2__GPIO7_IO06 0x2c8 0x6b0 0x000 0x5 0x0 892#define MX6QDL_PAD_SD3_DAT1__UART1_CTS_B 0x2c4 0x6ac 0x000 0x1 0x0
893#define MX6Q_PAD_SD3_DAT3__SD3_DATA3 0x2cc 0x6b4 0x000 0x0 0x0 893#define MX6QDL_PAD_SD3_DAT1__FLEXCAN2_RX 0x2c4 0x6ac 0x7e8 0x2 0x1
894#define MX6Q_PAD_SD3_DAT3__UART3_CTS_B 0x2cc 0x6b4 0x000 0x1 0x0 894#define MX6QDL_PAD_SD3_DAT1__GPIO7_IO05 0x2c4 0x6ac 0x000 0x5 0x0
895#define MX6Q_PAD_SD3_DAT3__UART3_RTS_B 0x2cc 0x6b4 0x92c 0x1 0x4 895#define MX6QDL_PAD_SD3_DAT2__SD3_DATA2 0x2c8 0x6b0 0x000 0x0 0x0
896#define MX6Q_PAD_SD3_DAT3__GPIO7_IO07 0x2cc 0x6b4 0x000 0x5 0x0 896#define MX6QDL_PAD_SD3_DAT2__GPIO7_IO06 0x2c8 0x6b0 0x000 0x5 0x0
897#define MX6Q_PAD_SD3_RST__SD3_RESET 0x2d0 0x6b8 0x000 0x0 0x0 897#define MX6QDL_PAD_SD3_DAT3__SD3_DATA3 0x2cc 0x6b4 0x000 0x0 0x0
898#define MX6Q_PAD_SD3_RST__UART3_RTS_B 0x2d0 0x6b8 0x92c 0x1 0x5 898#define MX6QDL_PAD_SD3_DAT3__UART3_CTS_B 0x2cc 0x6b4 0x000 0x1 0x0
899#define MX6Q_PAD_SD3_RST__UART3_CTS_B 0x2d0 0x6b8 0x000 0x1 0x0 899#define MX6QDL_PAD_SD3_DAT3__UART3_RTS_B 0x2cc 0x6b4 0x92c 0x1 0x4
900#define MX6Q_PAD_SD3_RST__GPIO7_IO08 0x2d0 0x6b8 0x000 0x5 0x0 900#define MX6QDL_PAD_SD3_DAT3__GPIO7_IO07 0x2cc 0x6b4 0x000 0x5 0x0
901#define MX6Q_PAD_NANDF_CLE__NAND_CLE 0x2d4 0x6bc 0x000 0x0 0x0 901#define MX6QDL_PAD_SD3_RST__SD3_RESET 0x2d0 0x6b8 0x000 0x0 0x0
902#define MX6Q_PAD_NANDF_CLE__IPU2_SISG4 0x2d4 0x6bc 0x000 0x1 0x0 902#define MX6QDL_PAD_SD3_RST__UART3_RTS_B 0x2d0 0x6b8 0x92c 0x1 0x5
903#define MX6Q_PAD_NANDF_CLE__GPIO6_IO07 0x2d4 0x6bc 0x000 0x5 0x0 903#define MX6QDL_PAD_SD3_RST__UART3_CTS_B 0x2d0 0x6b8 0x000 0x1 0x0
904#define MX6Q_PAD_NANDF_ALE__NAND_ALE 0x2d8 0x6c0 0x000 0x0 0x0 904#define MX6QDL_PAD_SD3_RST__GPIO7_IO08 0x2d0 0x6b8 0x000 0x5 0x0
905#define MX6Q_PAD_NANDF_ALE__SD4_RESET 0x2d8 0x6c0 0x000 0x1 0x0 905#define MX6QDL_PAD_NANDF_CLE__NAND_CLE 0x2d4 0x6bc 0x000 0x0 0x0
906#define MX6Q_PAD_NANDF_ALE__GPIO6_IO08 0x2d8 0x6c0 0x000 0x5 0x0 906#define MX6QDL_PAD_NANDF_CLE__IPU2_SISG4 0x2d4 0x6bc 0x000 0x1 0x0
907#define MX6Q_PAD_NANDF_WP_B__NAND_WP_B 0x2dc 0x6c4 0x000 0x0 0x0 907#define MX6QDL_PAD_NANDF_CLE__GPIO6_IO07 0x2d4 0x6bc 0x000 0x5 0x0
908#define MX6Q_PAD_NANDF_WP_B__IPU2_SISG5 0x2dc 0x6c4 0x000 0x1 0x0 908#define MX6QDL_PAD_NANDF_ALE__NAND_ALE 0x2d8 0x6c0 0x000 0x0 0x0
909#define MX6Q_PAD_NANDF_WP_B__GPIO6_IO09 0x2dc 0x6c4 0x000 0x5 0x0 909#define MX6QDL_PAD_NANDF_ALE__SD4_RESET 0x2d8 0x6c0 0x000 0x1 0x0
910#define MX6Q_PAD_NANDF_RB0__NAND_READY_B 0x2e0 0x6c8 0x000 0x0 0x0 910#define MX6QDL_PAD_NANDF_ALE__GPIO6_IO08 0x2d8 0x6c0 0x000 0x5 0x0
911#define MX6Q_PAD_NANDF_RB0__IPU2_DI0_PIN01 0x2e0 0x6c8 0x000 0x1 0x0 911#define MX6QDL_PAD_NANDF_WP_B__NAND_WP_B 0x2dc 0x6c4 0x000 0x0 0x0
912#define MX6Q_PAD_NANDF_RB0__GPIO6_IO10 0x2e0 0x6c8 0x000 0x5 0x0 912#define MX6QDL_PAD_NANDF_WP_B__IPU2_SISG5 0x2dc 0x6c4 0x000 0x1 0x0
913#define MX6Q_PAD_NANDF_CS0__NAND_CE0_B 0x2e4 0x6cc 0x000 0x0 0x0 913#define MX6QDL_PAD_NANDF_WP_B__GPIO6_IO09 0x2dc 0x6c4 0x000 0x5 0x0
914#define MX6Q_PAD_NANDF_CS0__GPIO6_IO11 0x2e4 0x6cc 0x000 0x5 0x0 914#define MX6QDL_PAD_NANDF_RB0__NAND_READY_B 0x2e0 0x6c8 0x000 0x0 0x0
915#define MX6Q_PAD_NANDF_CS1__NAND_CE1_B 0x2e8 0x6d0 0x000 0x0 0x0 915#define MX6QDL_PAD_NANDF_RB0__IPU2_DI0_PIN01 0x2e0 0x6c8 0x000 0x1 0x0
916#define MX6Q_PAD_NANDF_CS1__SD4_VSELECT 0x2e8 0x6d0 0x000 0x1 0x0 916#define MX6QDL_PAD_NANDF_RB0__GPIO6_IO10 0x2e0 0x6c8 0x000 0x5 0x0
917#define MX6Q_PAD_NANDF_CS1__SD3_VSELECT 0x2e8 0x6d0 0x000 0x2 0x0 917#define MX6QDL_PAD_NANDF_CS0__NAND_CE0_B 0x2e4 0x6cc 0x000 0x0 0x0
918#define MX6Q_PAD_NANDF_CS1__GPIO6_IO14 0x2e8 0x6d0 0x000 0x5 0x0 918#define MX6QDL_PAD_NANDF_CS0__GPIO6_IO11 0x2e4 0x6cc 0x000 0x5 0x0
919#define MX6Q_PAD_NANDF_CS2__NAND_CE2_B 0x2ec 0x6d4 0x000 0x0 0x0 919#define MX6QDL_PAD_NANDF_CS1__NAND_CE1_B 0x2e8 0x6d0 0x000 0x0 0x0
920#define MX6Q_PAD_NANDF_CS2__IPU1_SISG0 0x2ec 0x6d4 0x000 0x1 0x0 920#define MX6QDL_PAD_NANDF_CS1__SD4_VSELECT 0x2e8 0x6d0 0x000 0x1 0x0
921#define MX6Q_PAD_NANDF_CS2__ESAI_TX0 0x2ec 0x6d4 0x874 0x2 0x1 921#define MX6QDL_PAD_NANDF_CS1__SD3_VSELECT 0x2e8 0x6d0 0x000 0x2 0x0
922#define MX6Q_PAD_NANDF_CS2__EIM_CRE 0x2ec 0x6d4 0x000 0x3 0x0 922#define MX6QDL_PAD_NANDF_CS1__GPIO6_IO14 0x2e8 0x6d0 0x000 0x5 0x0
923#define MX6Q_PAD_NANDF_CS2__CCM_CLKO2 0x2ec 0x6d4 0x000 0x4 0x0 923#define MX6QDL_PAD_NANDF_CS2__NAND_CE2_B 0x2ec 0x6d4 0x000 0x0 0x0
924#define MX6Q_PAD_NANDF_CS2__GPIO6_IO15 0x2ec 0x6d4 0x000 0x5 0x0 924#define MX6QDL_PAD_NANDF_CS2__IPU1_SISG0 0x2ec 0x6d4 0x000 0x1 0x0
925#define MX6Q_PAD_NANDF_CS2__IPU2_SISG0 0x2ec 0x6d4 0x000 0x6 0x0 925#define MX6QDL_PAD_NANDF_CS2__ESAI_TX0 0x2ec 0x6d4 0x874 0x2 0x1
926#define MX6Q_PAD_NANDF_CS3__NAND_CE3_B 0x2f0 0x6d8 0x000 0x0 0x0 926#define MX6QDL_PAD_NANDF_CS2__EIM_CRE 0x2ec 0x6d4 0x000 0x3 0x0
927#define MX6Q_PAD_NANDF_CS3__IPU1_SISG1 0x2f0 0x6d8 0x000 0x1 0x0 927#define MX6QDL_PAD_NANDF_CS2__CCM_CLKO2 0x2ec 0x6d4 0x000 0x4 0x0
928#define MX6Q_PAD_NANDF_CS3__ESAI_TX1 0x2f0 0x6d8 0x878 0x2 0x1 928#define MX6QDL_PAD_NANDF_CS2__GPIO6_IO15 0x2ec 0x6d4 0x000 0x5 0x0
929#define MX6Q_PAD_NANDF_CS3__EIM_ADDR26 0x2f0 0x6d8 0x000 0x3 0x0 929#define MX6QDL_PAD_NANDF_CS2__IPU2_SISG0 0x2ec 0x6d4 0x000 0x6 0x0
930#define MX6Q_PAD_NANDF_CS3__GPIO6_IO16 0x2f0 0x6d8 0x000 0x5 0x0 930#define MX6QDL_PAD_NANDF_CS3__NAND_CE3_B 0x2f0 0x6d8 0x000 0x0 0x0
931#define MX6Q_PAD_NANDF_CS3__IPU2_SISG1 0x2f0 0x6d8 0x000 0x6 0x0 931#define MX6QDL_PAD_NANDF_CS3__IPU1_SISG1 0x2f0 0x6d8 0x000 0x1 0x0
932#define MX6Q_PAD_SD4_CMD__SD4_CMD 0x2f4 0x6dc 0x000 0x0 0x0 932#define MX6QDL_PAD_NANDF_CS3__ESAI_TX1 0x2f0 0x6d8 0x878 0x2 0x1
933#define MX6Q_PAD_SD4_CMD__NAND_RE_B 0x2f4 0x6dc 0x000 0x1 0x0 933#define MX6QDL_PAD_NANDF_CS3__EIM_ADDR26 0x2f0 0x6d8 0x000 0x3 0x0
934#define MX6Q_PAD_SD4_CMD__UART3_TX_DATA 0x2f4 0x6dc 0x000 0x2 0x0 934#define MX6QDL_PAD_NANDF_CS3__GPIO6_IO16 0x2f0 0x6d8 0x000 0x5 0x0
935#define MX6Q_PAD_SD4_CMD__UART3_RX_DATA 0x2f4 0x6dc 0x930 0x2 0x2 935#define MX6QDL_PAD_NANDF_CS3__IPU2_SISG1 0x2f0 0x6d8 0x000 0x6 0x0
936#define MX6Q_PAD_SD4_CMD__GPIO7_IO09 0x2f4 0x6dc 0x000 0x5 0x0 936#define MX6QDL_PAD_SD4_CMD__SD4_CMD 0x2f4 0x6dc 0x000 0x0 0x0
937#define MX6Q_PAD_SD4_CLK__SD4_CLK 0x2f8 0x6e0 0x000 0x0 0x0 937#define MX6QDL_PAD_SD4_CMD__NAND_RE_B 0x2f4 0x6dc 0x000 0x1 0x0
938#define MX6Q_PAD_SD4_CLK__NAND_WE_B 0x2f8 0x6e0 0x000 0x1 0x0 938#define MX6QDL_PAD_SD4_CMD__UART3_TX_DATA 0x2f4 0x6dc 0x000 0x2 0x0
939#define MX6Q_PAD_SD4_CLK__UART3_RX_DATA 0x2f8 0x6e0 0x930 0x2 0x3 939#define MX6QDL_PAD_SD4_CMD__UART3_RX_DATA 0x2f4 0x6dc 0x930 0x2 0x2
940#define MX6Q_PAD_SD4_CLK__UART3_TX_DATA 0x2f8 0x6e0 0x000 0x2 0x0 940#define MX6QDL_PAD_SD4_CMD__GPIO7_IO09 0x2f4 0x6dc 0x000 0x5 0x0
941#define MX6Q_PAD_SD4_CLK__GPIO7_IO10 0x2f8 0x6e0 0x000 0x5 0x0 941#define MX6QDL_PAD_SD4_CLK__SD4_CLK 0x2f8 0x6e0 0x000 0x0 0x0
942#define MX6Q_PAD_NANDF_D0__NAND_DATA00 0x2fc 0x6e4 0x000 0x0 0x0 942#define MX6QDL_PAD_SD4_CLK__NAND_WE_B 0x2f8 0x6e0 0x000 0x1 0x0
943#define MX6Q_PAD_NANDF_D0__SD1_DATA4 0x2fc 0x6e4 0x000 0x1 0x0 943#define MX6QDL_PAD_SD4_CLK__UART3_RX_DATA 0x2f8 0x6e0 0x930 0x2 0x3
944#define MX6Q_PAD_NANDF_D0__GPIO2_IO00 0x2fc 0x6e4 0x000 0x5 0x0 944#define MX6QDL_PAD_SD4_CLK__UART3_TX_DATA 0x2f8 0x6e0 0x000 0x2 0x0
945#define MX6Q_PAD_NANDF_D1__NAND_DATA01 0x300 0x6e8 0x000 0x0 0x0 945#define MX6QDL_PAD_SD4_CLK__GPIO7_IO10 0x2f8 0x6e0 0x000 0x5 0x0
946#define MX6Q_PAD_NANDF_D1__SD1_DATA5 0x300 0x6e8 0x000 0x1 0x0 946#define MX6QDL_PAD_NANDF_D0__NAND_DATA00 0x2fc 0x6e4 0x000 0x0 0x0
947#define MX6Q_PAD_NANDF_D1__GPIO2_IO01 0x300 0x6e8 0x000 0x5 0x0 947#define MX6QDL_PAD_NANDF_D0__SD1_DATA4 0x2fc 0x6e4 0x000 0x1 0x0
948#define MX6Q_PAD_NANDF_D2__NAND_DATA02 0x304 0x6ec 0x000 0x0 0x0 948#define MX6QDL_PAD_NANDF_D0__GPIO2_IO00 0x2fc 0x6e4 0x000 0x5 0x0
949#define MX6Q_PAD_NANDF_D2__SD1_DATA6 0x304 0x6ec 0x000 0x1 0x0 949#define MX6QDL_PAD_NANDF_D1__NAND_DATA01 0x300 0x6e8 0x000 0x0 0x0
950#define MX6Q_PAD_NANDF_D2__GPIO2_IO02 0x304 0x6ec 0x000 0x5 0x0 950#define MX6QDL_PAD_NANDF_D1__SD1_DATA5 0x300 0x6e8 0x000 0x1 0x0
951#define MX6Q_PAD_NANDF_D3__NAND_DATA03 0x308 0x6f0 0x000 0x0 0x0 951#define MX6QDL_PAD_NANDF_D1__GPIO2_IO01 0x300 0x6e8 0x000 0x5 0x0
952#define MX6Q_PAD_NANDF_D3__SD1_DATA7 0x308 0x6f0 0x000 0x1 0x0 952#define MX6QDL_PAD_NANDF_D2__NAND_DATA02 0x304 0x6ec 0x000 0x0 0x0
953#define MX6Q_PAD_NANDF_D3__GPIO2_IO03 0x308 0x6f0 0x000 0x5 0x0 953#define MX6QDL_PAD_NANDF_D2__SD1_DATA6 0x304 0x6ec 0x000 0x1 0x0
954#define MX6Q_PAD_NANDF_D4__NAND_DATA04 0x30c 0x6f4 0x000 0x0 0x0 954#define MX6QDL_PAD_NANDF_D2__GPIO2_IO02 0x304 0x6ec 0x000 0x5 0x0
955#define MX6Q_PAD_NANDF_D4__SD2_DATA4 0x30c 0x6f4 0x000 0x1 0x0 955#define MX6QDL_PAD_NANDF_D3__NAND_DATA03 0x308 0x6f0 0x000 0x0 0x0
956#define MX6Q_PAD_NANDF_D4__GPIO2_IO04 0x30c 0x6f4 0x000 0x5 0x0 956#define MX6QDL_PAD_NANDF_D3__SD1_DATA7 0x308 0x6f0 0x000 0x1 0x0
957#define MX6Q_PAD_NANDF_D5__NAND_DATA05 0x310 0x6f8 0x000 0x0 0x0 957#define MX6QDL_PAD_NANDF_D3__GPIO2_IO03 0x308 0x6f0 0x000 0x5 0x0
958#define MX6Q_PAD_NANDF_D5__SD2_DATA5 0x310 0x6f8 0x000 0x1 0x0 958#define MX6QDL_PAD_NANDF_D4__NAND_DATA04 0x30c 0x6f4 0x000 0x0 0x0
959#define MX6Q_PAD_NANDF_D5__GPIO2_IO05 0x310 0x6f8 0x000 0x5 0x0 959#define MX6QDL_PAD_NANDF_D4__SD2_DATA4 0x30c 0x6f4 0x000 0x1 0x0
960#define MX6Q_PAD_NANDF_D6__NAND_DATA06 0x314 0x6fc 0x000 0x0 0x0 960#define MX6QDL_PAD_NANDF_D4__GPIO2_IO04 0x30c 0x6f4 0x000 0x5 0x0
961#define MX6Q_PAD_NANDF_D6__SD2_DATA6 0x314 0x6fc 0x000 0x1 0x0 961#define MX6QDL_PAD_NANDF_D5__NAND_DATA05 0x310 0x6f8 0x000 0x0 0x0
962#define MX6Q_PAD_NANDF_D6__GPIO2_IO06 0x314 0x6fc 0x000 0x5 0x0 962#define MX6QDL_PAD_NANDF_D5__SD2_DATA5 0x310 0x6f8 0x000 0x1 0x0
963#define MX6Q_PAD_NANDF_D7__NAND_DATA07 0x318 0x700 0x000 0x0 0x0 963#define MX6QDL_PAD_NANDF_D5__GPIO2_IO05 0x310 0x6f8 0x000 0x5 0x0
964#define MX6Q_PAD_NANDF_D7__SD2_DATA7 0x318 0x700 0x000 0x1 0x0 964#define MX6QDL_PAD_NANDF_D6__NAND_DATA06 0x314 0x6fc 0x000 0x0 0x0
965#define MX6Q_PAD_NANDF_D7__GPIO2_IO07 0x318 0x700 0x000 0x5 0x0 965#define MX6QDL_PAD_NANDF_D6__SD2_DATA6 0x314 0x6fc 0x000 0x1 0x0
966#define MX6Q_PAD_SD4_DAT0__SD4_DATA0 0x31c 0x704 0x000 0x1 0x0 966#define MX6QDL_PAD_NANDF_D6__GPIO2_IO06 0x314 0x6fc 0x000 0x5 0x0
967#define MX6Q_PAD_SD4_DAT0__NAND_DQS 0x31c 0x704 0x000 0x2 0x0 967#define MX6QDL_PAD_NANDF_D7__NAND_DATA07 0x318 0x700 0x000 0x0 0x0
968#define MX6Q_PAD_SD4_DAT0__GPIO2_IO08 0x31c 0x704 0x000 0x5 0x0 968#define MX6QDL_PAD_NANDF_D7__SD2_DATA7 0x318 0x700 0x000 0x1 0x0
969#define MX6Q_PAD_SD4_DAT1__SD4_DATA1 0x320 0x708 0x000 0x1 0x0 969#define MX6QDL_PAD_NANDF_D7__GPIO2_IO07 0x318 0x700 0x000 0x5 0x0
970#define MX6Q_PAD_SD4_DAT1__PWM3_OUT 0x320 0x708 0x000 0x2 0x0 970#define MX6QDL_PAD_SD4_DAT0__SD4_DATA0 0x31c 0x704 0x000 0x1 0x0
971#define MX6Q_PAD_SD4_DAT1__GPIO2_IO09 0x320 0x708 0x000 0x5 0x0 971#define MX6QDL_PAD_SD4_DAT0__NAND_DQS 0x31c 0x704 0x000 0x2 0x0
972#define MX6Q_PAD_SD4_DAT2__SD4_DATA2 0x324 0x70c 0x000 0x1 0x0 972#define MX6QDL_PAD_SD4_DAT0__GPIO2_IO08 0x31c 0x704 0x000 0x5 0x0
973#define MX6Q_PAD_SD4_DAT2__PWM4_OUT 0x324 0x70c 0x000 0x2 0x0 973#define MX6QDL_PAD_SD4_DAT1__SD4_DATA1 0x320 0x708 0x000 0x1 0x0
974#define MX6Q_PAD_SD4_DAT2__GPIO2_IO10 0x324 0x70c 0x000 0x5 0x0 974#define MX6QDL_PAD_SD4_DAT1__PWM3_OUT 0x320 0x708 0x000 0x2 0x0
975#define MX6Q_PAD_SD4_DAT3__SD4_DATA3 0x328 0x710 0x000 0x1 0x0 975#define MX6QDL_PAD_SD4_DAT1__GPIO2_IO09 0x320 0x708 0x000 0x5 0x0
976#define MX6Q_PAD_SD4_DAT3__GPIO2_IO11 0x328 0x710 0x000 0x5 0x0 976#define MX6QDL_PAD_SD4_DAT2__SD4_DATA2 0x324 0x70c 0x000 0x1 0x0
977#define MX6Q_PAD_SD4_DAT4__SD4_DATA4 0x32c 0x714 0x000 0x1 0x0 977#define MX6QDL_PAD_SD4_DAT2__PWM4_OUT 0x324 0x70c 0x000 0x2 0x0
978#define MX6Q_PAD_SD4_DAT4__UART2_RX_DATA 0x32c 0x714 0x928 0x2 0x6 978#define MX6QDL_PAD_SD4_DAT2__GPIO2_IO10 0x324 0x70c 0x000 0x5 0x0
979#define MX6Q_PAD_SD4_DAT4__UART2_TX_DATA 0x32c 0x714 0x000 0x2 0x0 979#define MX6QDL_PAD_SD4_DAT3__SD4_DATA3 0x328 0x710 0x000 0x1 0x0
980#define MX6Q_PAD_SD4_DAT4__GPIO2_IO12 0x32c 0x714 0x000 0x5 0x0 980#define MX6QDL_PAD_SD4_DAT3__GPIO2_IO11 0x328 0x710 0x000 0x5 0x0
981#define MX6Q_PAD_SD4_DAT5__SD4_DATA5 0x330 0x718 0x000 0x1 0x0 981#define MX6QDL_PAD_SD4_DAT4__SD4_DATA4 0x32c 0x714 0x000 0x1 0x0
982#define MX6Q_PAD_SD4_DAT5__UART2_RTS_B 0x330 0x718 0x924 0x2 0x4 982#define MX6QDL_PAD_SD4_DAT4__UART2_RX_DATA 0x32c 0x714 0x928 0x2 0x6
983#define MX6Q_PAD_SD4_DAT5__UART2_CTS_B 0x330 0x718 0x000 0x2 0x0 983#define MX6QDL_PAD_SD4_DAT4__UART2_TX_DATA 0x32c 0x714 0x000 0x2 0x0
984#define MX6Q_PAD_SD4_DAT5__GPIO2_IO13 0x330 0x718 0x000 0x5 0x0 984#define MX6QDL_PAD_SD4_DAT4__GPIO2_IO12 0x32c 0x714 0x000 0x5 0x0
985#define MX6Q_PAD_SD4_DAT6__SD4_DATA6 0x334 0x71c 0x000 0x1 0x0 985#define MX6QDL_PAD_SD4_DAT5__SD4_DATA5 0x330 0x718 0x000 0x1 0x0
986#define MX6Q_PAD_SD4_DAT6__UART2_CTS_B 0x334 0x71c 0x000 0x2 0x0 986#define MX6QDL_PAD_SD4_DAT5__UART2_RTS_B 0x330 0x718 0x924 0x2 0x4
987#define MX6Q_PAD_SD4_DAT6__UART2_RTS_B 0x334 0x71c 0x924 0x2 0x5 987#define MX6QDL_PAD_SD4_DAT5__UART2_CTS_B 0x330 0x718 0x000 0x2 0x0
988#define MX6Q_PAD_SD4_DAT6__GPIO2_IO14 0x334 0x71c 0x000 0x5 0x0 988#define MX6QDL_PAD_SD4_DAT5__GPIO2_IO13 0x330 0x718 0x000 0x5 0x0
989#define MX6Q_PAD_SD4_DAT7__SD4_DATA7 0x338 0x720 0x000 0x1 0x0 989#define MX6QDL_PAD_SD4_DAT6__SD4_DATA6 0x334 0x71c 0x000 0x1 0x0
990#define MX6Q_PAD_SD4_DAT7__UART2_TX_DATA 0x338 0x720 0x000 0x2 0x0 990#define MX6QDL_PAD_SD4_DAT6__UART2_CTS_B 0x334 0x71c 0x000 0x2 0x0
991#define MX6Q_PAD_SD4_DAT7__UART2_RX_DATA 0x338 0x720 0x928 0x2 0x7 991#define MX6QDL_PAD_SD4_DAT6__UART2_RTS_B 0x334 0x71c 0x924 0x2 0x5
992#define MX6Q_PAD_SD4_DAT7__GPIO2_IO15 0x338 0x720 0x000 0x5 0x0 992#define MX6QDL_PAD_SD4_DAT6__GPIO2_IO14 0x334 0x71c 0x000 0x5 0x0
993#define MX6Q_PAD_SD1_DAT1__SD1_DATA1 0x33c 0x724 0x000 0x0 0x0 993#define MX6QDL_PAD_SD4_DAT7__SD4_DATA7 0x338 0x720 0x000 0x1 0x0
994#define MX6Q_PAD_SD1_DAT1__ECSPI5_SS0 0x33c 0x724 0x834 0x1 0x1 994#define MX6QDL_PAD_SD4_DAT7__UART2_TX_DATA 0x338 0x720 0x000 0x2 0x0
995#define MX6Q_PAD_SD1_DAT1__PWM3_OUT 0x33c 0x724 0x000 0x2 0x0 995#define MX6QDL_PAD_SD4_DAT7__UART2_RX_DATA 0x338 0x720 0x928 0x2 0x7
996#define MX6Q_PAD_SD1_DAT1__GPT_CAPTURE2 0x33c 0x724 0x000 0x3 0x0 996#define MX6QDL_PAD_SD4_DAT7__GPIO2_IO15 0x338 0x720 0x000 0x5 0x0
997#define MX6Q_PAD_SD1_DAT1__GPIO1_IO17 0x33c 0x724 0x000 0x5 0x0 997#define MX6QDL_PAD_SD1_DAT1__SD1_DATA1 0x33c 0x724 0x000 0x0 0x0
998#define MX6Q_PAD_SD1_DAT0__SD1_DATA0 0x340 0x728 0x000 0x0 0x0 998#define MX6QDL_PAD_SD1_DAT1__ECSPI5_SS0 0x33c 0x724 0x834 0x1 0x1
999#define MX6Q_PAD_SD1_DAT0__ECSPI5_MISO 0x340 0x728 0x82c 0x1 0x1 999#define MX6QDL_PAD_SD1_DAT1__PWM3_OUT 0x33c 0x724 0x000 0x2 0x0
1000#define MX6Q_PAD_SD1_DAT0__GPT_CAPTURE1 0x340 0x728 0x000 0x3 0x0 1000#define MX6QDL_PAD_SD1_DAT1__GPT_CAPTURE2 0x33c 0x724 0x000 0x3 0x0
1001#define MX6Q_PAD_SD1_DAT0__GPIO1_IO16 0x340 0x728 0x000 0x5 0x0 1001#define MX6QDL_PAD_SD1_DAT1__GPIO1_IO17 0x33c 0x724 0x000 0x5 0x0
1002#define MX6Q_PAD_SD1_DAT3__SD1_DATA3 0x344 0x72c 0x000 0x0 0x0 1002#define MX6QDL_PAD_SD1_DAT0__SD1_DATA0 0x340 0x728 0x000 0x0 0x0
1003#define MX6Q_PAD_SD1_DAT3__ECSPI5_SS2 0x344 0x72c 0x000 0x1 0x0 1003#define MX6QDL_PAD_SD1_DAT0__ECSPI5_MISO 0x340 0x728 0x82c 0x1 0x1
1004#define MX6Q_PAD_SD1_DAT3__GPT_COMPARE3 0x344 0x72c 0x000 0x2 0x0 1004#define MX6QDL_PAD_SD1_DAT0__GPT_CAPTURE1 0x340 0x728 0x000 0x3 0x0
1005#define MX6Q_PAD_SD1_DAT3__PWM1_OUT 0x344 0x72c 0x000 0x3 0x0 1005#define MX6QDL_PAD_SD1_DAT0__GPIO1_IO16 0x340 0x728 0x000 0x5 0x0
1006#define MX6Q_PAD_SD1_DAT3__WDOG2_B 0x344 0x72c 0x000 0x4 0x0 1006#define MX6QDL_PAD_SD1_DAT3__SD1_DATA3 0x344 0x72c 0x000 0x0 0x0
1007#define MX6Q_PAD_SD1_DAT3__GPIO1_IO21 0x344 0x72c 0x000 0x5 0x0 1007#define MX6QDL_PAD_SD1_DAT3__ECSPI5_SS2 0x344 0x72c 0x000 0x1 0x0
1008#define MX6Q_PAD_SD1_DAT3__WDOG2_RESET_B_DEB 0x344 0x72c 0x000 0x6 0x0 1008#define MX6QDL_PAD_SD1_DAT3__GPT_COMPARE3 0x344 0x72c 0x000 0x2 0x0
1009#define MX6Q_PAD_SD1_CMD__SD1_CMD 0x348 0x730 0x000 0x0 0x0 1009#define MX6QDL_PAD_SD1_DAT3__PWM1_OUT 0x344 0x72c 0x000 0x3 0x0
1010#define MX6Q_PAD_SD1_CMD__ECSPI5_MOSI 0x348 0x730 0x830 0x1 0x0 1010#define MX6QDL_PAD_SD1_DAT3__WDOG2_B 0x344 0x72c 0x000 0x4 0x0
1011#define MX6Q_PAD_SD1_CMD__PWM4_OUT 0x348 0x730 0x000 0x2 0x0 1011#define MX6QDL_PAD_SD1_DAT3__GPIO1_IO21 0x344 0x72c 0x000 0x5 0x0
1012#define MX6Q_PAD_SD1_CMD__GPT_COMPARE1 0x348 0x730 0x000 0x3 0x0 1012#define MX6QDL_PAD_SD1_DAT3__WDOG2_RESET_B_DEB 0x344 0x72c 0x000 0x6 0x0
1013#define MX6Q_PAD_SD1_CMD__GPIO1_IO18 0x348 0x730 0x000 0x5 0x0 1013#define MX6QDL_PAD_SD1_CMD__SD1_CMD 0x348 0x730 0x000 0x0 0x0
1014#define MX6Q_PAD_SD1_DAT2__SD1_DATA2 0x34c 0x734 0x000 0x0 0x0 1014#define MX6QDL_PAD_SD1_CMD__ECSPI5_MOSI 0x348 0x730 0x830 0x1 0x0
1015#define MX6Q_PAD_SD1_DAT2__ECSPI5_SS1 0x34c 0x734 0x838 0x1 0x1 1015#define MX6QDL_PAD_SD1_CMD__PWM4_OUT 0x348 0x730 0x000 0x2 0x0
1016#define MX6Q_PAD_SD1_DAT2__GPT_COMPARE2 0x34c 0x734 0x000 0x2 0x0 1016#define MX6QDL_PAD_SD1_CMD__GPT_COMPARE1 0x348 0x730 0x000 0x3 0x0
1017#define MX6Q_PAD_SD1_DAT2__PWM2_OUT 0x34c 0x734 0x000 0x3 0x0 1017#define MX6QDL_PAD_SD1_CMD__GPIO1_IO18 0x348 0x730 0x000 0x5 0x0
1018#define MX6Q_PAD_SD1_DAT2__WDOG1_B 0x34c 0x734 0x000 0x4 0x0 1018#define MX6QDL_PAD_SD1_DAT2__SD1_DATA2 0x34c 0x734 0x000 0x0 0x0
1019#define MX6Q_PAD_SD1_DAT2__GPIO1_IO19 0x34c 0x734 0x000 0x5 0x0 1019#define MX6QDL_PAD_SD1_DAT2__ECSPI5_SS1 0x34c 0x734 0x838 0x1 0x1
1020#define MX6Q_PAD_SD1_DAT2__WDOG1_RESET_B_DEB 0x34c 0x734 0x000 0x6 0x0 1020#define MX6QDL_PAD_SD1_DAT2__GPT_COMPARE2 0x34c 0x734 0x000 0x2 0x0
1021#define MX6Q_PAD_SD1_CLK__SD1_CLK 0x350 0x738 0x000 0x0 0x0 1021#define MX6QDL_PAD_SD1_DAT2__PWM2_OUT 0x34c 0x734 0x000 0x3 0x0
1022#define MX6Q_PAD_SD1_CLK__ECSPI5_SCLK 0x350 0x738 0x828 0x1 0x0 1022#define MX6QDL_PAD_SD1_DAT2__WDOG1_B 0x34c 0x734 0x000 0x4 0x0
1023#define MX6Q_PAD_SD1_CLK__GPT_CLKIN 0x350 0x738 0x000 0x3 0x0 1023#define MX6QDL_PAD_SD1_DAT2__GPIO1_IO19 0x34c 0x734 0x000 0x5 0x0
1024#define MX6Q_PAD_SD1_CLK__GPIO1_IO20 0x350 0x738 0x000 0x5 0x0 1024#define MX6QDL_PAD_SD1_DAT2__WDOG1_RESET_B_DEB 0x34c 0x734 0x000 0x6 0x0
1025#define MX6Q_PAD_SD2_CLK__SD2_CLK 0x354 0x73c 0x000 0x0 0x0 1025#define MX6QDL_PAD_SD1_CLK__SD1_CLK 0x350 0x738 0x000 0x0 0x0
1026#define MX6Q_PAD_SD2_CLK__ECSPI5_SCLK 0x354 0x73c 0x828 0x1 0x1 1026#define MX6QDL_PAD_SD1_CLK__ECSPI5_SCLK 0x350 0x738 0x828 0x1 0x0
1027#define MX6Q_PAD_SD2_CLK__KEY_COL5 0x354 0x73c 0x8e8 0x2 0x3 1027#define MX6QDL_PAD_SD1_CLK__GPT_CLKIN 0x350 0x738 0x000 0x3 0x0
1028#define MX6Q_PAD_SD2_CLK__AUD4_RXFS 0x354 0x73c 0x7c0 0x3 0x1 1028#define MX6QDL_PAD_SD1_CLK__GPIO1_IO20 0x350 0x738 0x000 0x5 0x0
1029#define MX6Q_PAD_SD2_CLK__GPIO1_IO10 0x354 0x73c 0x000 0x5 0x0 1029#define MX6QDL_PAD_SD2_CLK__SD2_CLK 0x354 0x73c 0x000 0x0 0x0
1030#define MX6Q_PAD_SD2_CMD__SD2_CMD 0x358 0x740 0x000 0x0 0x0 1030#define MX6QDL_PAD_SD2_CLK__ECSPI5_SCLK 0x354 0x73c 0x828 0x1 0x1
1031#define MX6Q_PAD_SD2_CMD__ECSPI5_MOSI 0x358 0x740 0x830 0x1 0x1 1031#define MX6QDL_PAD_SD2_CLK__KEY_COL5 0x354 0x73c 0x8e8 0x2 0x3
1032#define MX6Q_PAD_SD2_CMD__KEY_ROW5 0x358 0x740 0x8f4 0x2 0x2 1032#define MX6QDL_PAD_SD2_CLK__AUD4_RXFS 0x354 0x73c 0x7c0 0x3 0x1
1033#define MX6Q_PAD_SD2_CMD__AUD4_RXC 0x358 0x740 0x7bc 0x3 0x1 1033#define MX6QDL_PAD_SD2_CLK__GPIO1_IO10 0x354 0x73c 0x000 0x5 0x0
1034#define MX6Q_PAD_SD2_CMD__GPIO1_IO11 0x358 0x740 0x000 0x5 0x0 1034#define MX6QDL_PAD_SD2_CMD__SD2_CMD 0x358 0x740 0x000 0x0 0x0
1035#define MX6Q_PAD_SD2_DAT3__SD2_DATA3 0x35c 0x744 0x000 0x0 0x0 1035#define MX6QDL_PAD_SD2_CMD__ECSPI5_MOSI 0x358 0x740 0x830 0x1 0x1
1036#define MX6Q_PAD_SD2_DAT3__ECSPI5_SS3 0x35c 0x744 0x000 0x1 0x0 1036#define MX6QDL_PAD_SD2_CMD__KEY_ROW5 0x358 0x740 0x8f4 0x2 0x2
1037#define MX6Q_PAD_SD2_DAT3__KEY_COL6 0x35c 0x744 0x8ec 0x2 0x2 1037#define MX6QDL_PAD_SD2_CMD__AUD4_RXC 0x358 0x740 0x7bc 0x3 0x1
1038#define MX6Q_PAD_SD2_DAT3__AUD4_TXC 0x35c 0x744 0x7c4 0x3 0x1 1038#define MX6QDL_PAD_SD2_CMD__GPIO1_IO11 0x358 0x740 0x000 0x5 0x0
1039#define MX6Q_PAD_SD2_DAT3__GPIO1_IO12 0x35c 0x744 0x000 0x5 0x0 1039#define MX6QDL_PAD_SD2_DAT3__SD2_DATA3 0x35c 0x744 0x000 0x0 0x0
1040#define MX6QDL_PAD_SD2_DAT3__ECSPI5_SS3 0x35c 0x744 0x000 0x1 0x0
1041#define MX6QDL_PAD_SD2_DAT3__KEY_COL6 0x35c 0x744 0x8ec 0x2 0x2
1042#define MX6QDL_PAD_SD2_DAT3__AUD4_TXC 0x35c 0x744 0x7c4 0x3 0x1
1043#define MX6QDL_PAD_SD2_DAT3__GPIO1_IO12 0x35c 0x744 0x000 0x5 0x0
1040 1044
1041#endif /* __DTS_IMX6Q_PINFUNC_H */ 1045#endif /* __DTS_IMX6Q_PINFUNC_H */
diff --git a/arch/arm/boot/dts/imx6q-sabreauto.dts b/arch/arm/boot/dts/imx6q-sabreauto.dts
index 09a75807bc6d..334b9247e78c 100644
--- a/arch/arm/boot/dts/imx6q-sabreauto.dts
+++ b/arch/arm/boot/dts/imx6q-sabreauto.dts
@@ -20,24 +20,6 @@
20 compatible = "fsl,imx6q-sabreauto", "fsl,imx6q"; 20 compatible = "fsl,imx6q-sabreauto", "fsl,imx6q";
21}; 21};
22 22
23&iomuxc { 23&sata {
24 pinctrl-names = "default"; 24 status = "okay";
25 pinctrl-0 = <&pinctrl_hog>;
26
27 hog {
28 pinctrl_hog: hoggrp {
29 fsl,pins = <
30 MX6Q_PAD_NANDF_CS2__GPIO6_IO15 0x80000000
31 MX6Q_PAD_SD2_DAT2__GPIO1_IO13 0x80000000
32 >;
33 };
34 };
35
36 ecspi1 {
37 pinctrl_ecspi1_sabreauto: ecspi1-sabreauto {
38 fsl,pins = <
39 MX6Q_PAD_EIM_D19__GPIO3_IO19 0x80000000
40 >;
41 };
42 };
43}; 25};
diff --git a/arch/arm/boot/dts/imx6q-sabrelite.dts b/arch/arm/boot/dts/imx6q-sabrelite.dts
index 6a000666c147..3530280f5150 100644
--- a/arch/arm/boot/dts/imx6q-sabrelite.dts
+++ b/arch/arm/boot/dts/imx6q-sabrelite.dts
@@ -65,6 +65,10 @@
65 }; 65 };
66}; 66};
67 67
68&sata {
69 status = "okay";
70};
71
68&ecspi1 { 72&ecspi1 {
69 fsl,spi-num-chipselects = <1>; 73 fsl,spi-num-chipselects = <1>;
70 cs-gpios = <&gpio3 19 0>; 74 cs-gpios = <&gpio3 19 0>;
@@ -91,14 +95,14 @@
91 hog { 95 hog {
92 pinctrl_hog: hoggrp { 96 pinctrl_hog: hoggrp {
93 fsl,pins = < 97 fsl,pins = <
94 MX6Q_PAD_NANDF_D6__GPIO2_IO06 0x80000000 98 MX6QDL_PAD_NANDF_D6__GPIO2_IO06 0x80000000
95 MX6Q_PAD_NANDF_D7__GPIO2_IO07 0x80000000 99 MX6QDL_PAD_NANDF_D7__GPIO2_IO07 0x80000000
96 MX6Q_PAD_EIM_D19__GPIO3_IO19 0x80000000 100 MX6QDL_PAD_EIM_D19__GPIO3_IO19 0x80000000
97 MX6Q_PAD_EIM_D22__GPIO3_IO22 0x80000000 101 MX6QDL_PAD_EIM_D22__GPIO3_IO22 0x80000000
98 MX6Q_PAD_EIM_D23__GPIO3_IO23 0x80000000 102 MX6QDL_PAD_EIM_D23__GPIO3_IO23 0x80000000
99 MX6Q_PAD_SD3_DAT5__GPIO7_IO00 0x80000000 103 MX6QDL_PAD_SD3_DAT5__GPIO7_IO00 0x80000000
100 MX6Q_PAD_SD3_DAT4__GPIO7_IO01 0x1f0b0 104 MX6QDL_PAD_SD3_DAT4__GPIO7_IO01 0x1f0b0
101 MX6Q_PAD_GPIO_0__CCM_CLKO1 0x80000000 105 MX6QDL_PAD_GPIO_0__CCM_CLKO1 0x80000000
102 >; 106 >;
103 }; 107 };
104 }; 108 };
@@ -163,7 +167,7 @@
163 codec: sgtl5000@0a { 167 codec: sgtl5000@0a {
164 compatible = "fsl,sgtl5000"; 168 compatible = "fsl,sgtl5000";
165 reg = <0x0a>; 169 reg = <0x0a>;
166 clocks = <&clks 169>; 170 clocks = <&clks 201>;
167 VDDA-supply = <&reg_2p5v>; 171 VDDA-supply = <&reg_2p5v>;
168 VDDIO-supply = <&reg_3p3v>; 172 VDDIO-supply = <&reg_3p3v>;
169 }; 173 };
diff --git a/arch/arm/boot/dts/imx6q-sabresd.dts b/arch/arm/boot/dts/imx6q-sabresd.dts
index 0038228c508c..9cbdfe7a0931 100644
--- a/arch/arm/boot/dts/imx6q-sabresd.dts
+++ b/arch/arm/boot/dts/imx6q-sabresd.dts
@@ -20,21 +20,6 @@
20 compatible = "fsl,imx6q-sabresd", "fsl,imx6q"; 20 compatible = "fsl,imx6q-sabresd", "fsl,imx6q";
21}; 21};
22 22
23&iomuxc { 23&sata {
24 pinctrl-names = "default"; 24 status = "okay";
25 pinctrl-0 = <&pinctrl_hog>;
26
27 hog {
28 pinctrl_hog: hoggrp {
29 fsl,pins = <
30 MX6Q_PAD_GPIO_4__GPIO1_IO04 0x80000000
31 MX6Q_PAD_GPIO_5__GPIO1_IO05 0x80000000
32 MX6Q_PAD_NANDF_D0__GPIO2_IO00 0x80000000
33 MX6Q_PAD_NANDF_D1__GPIO2_IO01 0x80000000
34 MX6Q_PAD_NANDF_D2__GPIO2_IO02 0x80000000
35 MX6Q_PAD_NANDF_D3__GPIO2_IO03 0x80000000
36 MX6Q_PAD_GPIO_0__CCM_CLKO1 0x130b0
37 >;
38 };
39 };
40}; 25};
diff --git a/arch/arm/boot/dts/imx6q-wandboard.dts b/arch/arm/boot/dts/imx6q-wandboard.dts
new file mode 100644
index 000000000000..36be17f207b1
--- /dev/null
+++ b/arch/arm/boot/dts/imx6q-wandboard.dts
@@ -0,0 +1,26 @@
1/*
2 * Copyright 2013 Freescale Semiconductor, Inc.
3 *
4 * Author: Fabio Estevam <fabio.estevam@freescale.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 */
11/dts-v1/;
12#include "imx6q.dtsi"
13#include "imx6qdl-wandboard.dtsi"
14
15/ {
16 model = "Wandboard i.MX6 Quad Board";
17 compatible = "wand,imx6q-wandboard", "fsl,imx6q";
18
19 memory {
20 reg = <0x10000000 0x80000000>;
21 };
22};
23
24&sata {
25 status = "okay";
26};
diff --git a/arch/arm/boot/dts/imx6q.dtsi b/arch/arm/boot/dts/imx6q.dtsi
index ba09dc32324e..f024ef28b34b 100644
--- a/arch/arm/boot/dts/imx6q.dtsi
+++ b/arch/arm/boot/dts/imx6q.dtsi
@@ -8,8 +8,8 @@
8 * 8 *
9 */ 9 */
10 10
11#include "imx6qdl.dtsi"
12#include "imx6q-pinfunc.h" 11#include "imx6q-pinfunc.h"
12#include "imx6qdl.dtsi"
13 13
14/ { 14/ {
15 cpus { 15 cpus {
@@ -61,6 +61,12 @@
61 }; 61 };
62 62
63 soc { 63 soc {
64 ocram: sram@00900000 {
65 compatible = "mmio-sram";
66 reg = <0x00900000 0x40000>;
67 clocks = <&clks 142>;
68 };
69
64 aips-bus@02000000 { /* AIPS1 */ 70 aips-bus@02000000 { /* AIPS1 */
65 spba-bus@02000000 { 71 spba-bus@02000000 {
66 ecspi5: ecspi@02018000 { 72 ecspi5: ecspi@02018000 {
@@ -77,357 +83,54 @@
77 83
78 iomuxc: iomuxc@020e0000 { 84 iomuxc: iomuxc@020e0000 {
79 compatible = "fsl,imx6q-iomuxc"; 85 compatible = "fsl,imx6q-iomuxc";
80 reg = <0x020e0000 0x4000>;
81
82 /* shared pinctrl settings */
83 audmux {
84 pinctrl_audmux_1: audmux-1 {
85 fsl,pins = <
86 MX6Q_PAD_SD2_DAT0__AUD4_RXD 0x80000000
87 MX6Q_PAD_SD2_DAT3__AUD4_TXC 0x80000000
88 MX6Q_PAD_SD2_DAT2__AUD4_TXD 0x80000000
89 MX6Q_PAD_SD2_DAT1__AUD4_TXFS 0x80000000
90 >;
91 };
92
93 pinctrl_audmux_2: audmux-2 {
94 fsl,pins = <
95 MX6Q_PAD_CSI0_DAT7__AUD3_RXD 0x80000000
96 MX6Q_PAD_CSI0_DAT4__AUD3_TXC 0x80000000
97 MX6Q_PAD_CSI0_DAT5__AUD3_TXD 0x80000000
98 MX6Q_PAD_CSI0_DAT6__AUD3_TXFS 0x80000000
99 >;
100 };
101 };
102
103 ecspi1 {
104 pinctrl_ecspi1_1: ecspi1grp-1 {
105 fsl,pins = <
106 MX6Q_PAD_EIM_D17__ECSPI1_MISO 0x100b1
107 MX6Q_PAD_EIM_D18__ECSPI1_MOSI 0x100b1
108 MX6Q_PAD_EIM_D16__ECSPI1_SCLK 0x100b1
109 >;
110 };
111 };
112
113 ecspi3 {
114 pinctrl_ecspi3_1: ecspi3grp-1 {
115 fsl,pins = <
116 MX6Q_PAD_DISP0_DAT2__ECSPI3_MISO 0x100b1
117 MX6Q_PAD_DISP0_DAT1__ECSPI3_MOSI 0x100b1
118 MX6Q_PAD_DISP0_DAT0__ECSPI3_SCLK 0x100b1
119 >;
120 };
121 };
122
123 enet {
124 pinctrl_enet_1: enetgrp-1 {
125 fsl,pins = <
126 MX6Q_PAD_ENET_MDIO__ENET_MDIO 0x1b0b0
127 MX6Q_PAD_ENET_MDC__ENET_MDC 0x1b0b0
128 MX6Q_PAD_RGMII_TXC__RGMII_TXC 0x1b0b0
129 MX6Q_PAD_RGMII_TD0__RGMII_TD0 0x1b0b0
130 MX6Q_PAD_RGMII_TD1__RGMII_TD1 0x1b0b0
131 MX6Q_PAD_RGMII_TD2__RGMII_TD2 0x1b0b0
132 MX6Q_PAD_RGMII_TD3__RGMII_TD3 0x1b0b0
133 MX6Q_PAD_RGMII_TX_CTL__RGMII_TX_CTL 0x1b0b0
134 MX6Q_PAD_ENET_REF_CLK__ENET_TX_CLK 0x1b0b0
135 MX6Q_PAD_RGMII_RXC__RGMII_RXC 0x1b0b0
136 MX6Q_PAD_RGMII_RD0__RGMII_RD0 0x1b0b0
137 MX6Q_PAD_RGMII_RD1__RGMII_RD1 0x1b0b0
138 MX6Q_PAD_RGMII_RD2__RGMII_RD2 0x1b0b0
139 MX6Q_PAD_RGMII_RD3__RGMII_RD3 0x1b0b0
140 MX6Q_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x1b0b0
141 MX6Q_PAD_GPIO_16__ENET_REF_CLK 0x4001b0a8
142 >;
143 };
144
145 pinctrl_enet_2: enetgrp-2 {
146 fsl,pins = <
147 MX6Q_PAD_KEY_COL1__ENET_MDIO 0x1b0b0
148 MX6Q_PAD_KEY_COL2__ENET_MDC 0x1b0b0
149 MX6Q_PAD_RGMII_TXC__RGMII_TXC 0x1b0b0
150 MX6Q_PAD_RGMII_TD0__RGMII_TD0 0x1b0b0
151 MX6Q_PAD_RGMII_TD1__RGMII_TD1 0x1b0b0
152 MX6Q_PAD_RGMII_TD2__RGMII_TD2 0x1b0b0
153 MX6Q_PAD_RGMII_TD3__RGMII_TD3 0x1b0b0
154 MX6Q_PAD_RGMII_TX_CTL__RGMII_TX_CTL 0x1b0b0
155 MX6Q_PAD_ENET_REF_CLK__ENET_TX_CLK 0x1b0b0
156 MX6Q_PAD_RGMII_RXC__RGMII_RXC 0x1b0b0
157 MX6Q_PAD_RGMII_RD0__RGMII_RD0 0x1b0b0
158 MX6Q_PAD_RGMII_RD1__RGMII_RD1 0x1b0b0
159 MX6Q_PAD_RGMII_RD2__RGMII_RD2 0x1b0b0
160 MX6Q_PAD_RGMII_RD3__RGMII_RD3 0x1b0b0
161 MX6Q_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x1b0b0
162 >;
163 };
164
165 pinctrl_enet_3: enetgrp-3 {
166 fsl,pins = <
167 MX6Q_PAD_ENET_MDIO__ENET_MDIO 0x1b0b0
168 MX6Q_PAD_ENET_MDC__ENET_MDC 0x1b0b0
169 MX6Q_PAD_RGMII_TXC__RGMII_TXC 0x1b0b0
170 MX6Q_PAD_RGMII_TD0__RGMII_TD0 0x1b0b0
171 MX6Q_PAD_RGMII_TD1__RGMII_TD1 0x1b0b0
172 MX6Q_PAD_RGMII_TD2__RGMII_TD2 0x1b0b0
173 MX6Q_PAD_RGMII_TD3__RGMII_TD3 0x1b0b0
174 MX6Q_PAD_RGMII_TX_CTL__RGMII_TX_CTL 0x1b0b0
175 MX6Q_PAD_ENET_REF_CLK__ENET_TX_CLK 0x1b0b0
176 MX6Q_PAD_RGMII_RXC__RGMII_RXC 0x1b0b0
177 MX6Q_PAD_RGMII_RD0__RGMII_RD0 0x1b0b0
178 MX6Q_PAD_RGMII_RD1__RGMII_RD1 0x1b0b0
179 MX6Q_PAD_RGMII_RD2__RGMII_RD2 0x1b0b0
180 MX6Q_PAD_RGMII_RD3__RGMII_RD3 0x1b0b0
181 MX6Q_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x1b0b0
182 MX6Q_PAD_ENET_TX_EN__ENET_TX_EN 0x1b0b0
183 >;
184 };
185 };
186
187 gpmi-nand {
188 pinctrl_gpmi_nand_1: gpmi-nand-1 {
189 fsl,pins = <
190 MX6Q_PAD_NANDF_CLE__NAND_CLE 0xb0b1
191 MX6Q_PAD_NANDF_ALE__NAND_ALE 0xb0b1
192 MX6Q_PAD_NANDF_WP_B__NAND_WP_B 0xb0b1
193 MX6Q_PAD_NANDF_RB0__NAND_READY_B 0xb000
194 MX6Q_PAD_NANDF_CS0__NAND_CE0_B 0xb0b1
195 MX6Q_PAD_NANDF_CS1__NAND_CE1_B 0xb0b1
196 MX6Q_PAD_SD4_CMD__NAND_RE_B 0xb0b1
197 MX6Q_PAD_SD4_CLK__NAND_WE_B 0xb0b1
198 MX6Q_PAD_NANDF_D0__NAND_DATA00 0xb0b1
199 MX6Q_PAD_NANDF_D1__NAND_DATA01 0xb0b1
200 MX6Q_PAD_NANDF_D2__NAND_DATA02 0xb0b1
201 MX6Q_PAD_NANDF_D3__NAND_DATA03 0xb0b1
202 MX6Q_PAD_NANDF_D4__NAND_DATA04 0xb0b1
203 MX6Q_PAD_NANDF_D5__NAND_DATA05 0xb0b1
204 MX6Q_PAD_NANDF_D6__NAND_DATA06 0xb0b1
205 MX6Q_PAD_NANDF_D7__NAND_DATA07 0xb0b1
206 MX6Q_PAD_SD4_DAT0__NAND_DQS 0x00b1
207 >;
208 };
209 };
210
211 i2c1 {
212 pinctrl_i2c1_1: i2c1grp-1 {
213 fsl,pins = <
214 MX6Q_PAD_EIM_D21__I2C1_SCL 0x4001b8b1
215 MX6Q_PAD_EIM_D28__I2C1_SDA 0x4001b8b1
216 >;
217 };
218 86
219 pinctrl_i2c1_2: i2c1grp-2 { 87 ipu2 {
220 fsl,pins = < 88 pinctrl_ipu2_1: ipu2grp-1 {
221 MX6Q_PAD_CSI0_DAT8__I2C1_SDA 0x4001b8b1 89 fsl,pins = <
222 MX6Q_PAD_CSI0_DAT9__I2C1_SCL 0x4001b8b1 90 MX6QDL_PAD_DI0_DISP_CLK__IPU2_DI0_DISP_CLK 0x10
223 >; 91 MX6QDL_PAD_DI0_PIN15__IPU2_DI0_PIN15 0x10
224 }; 92 MX6QDL_PAD_DI0_PIN2__IPU2_DI0_PIN02 0x10
225 }; 93 MX6QDL_PAD_DI0_PIN3__IPU2_DI0_PIN03 0x10
226 94 MX6QDL_PAD_DI0_PIN4__IPU2_DI0_PIN04 0x80000000
227 i2c2 { 95 MX6QDL_PAD_DISP0_DAT0__IPU2_DISP0_DATA00 0x10
228 pinctrl_i2c2_1: i2c2grp-1 { 96 MX6QDL_PAD_DISP0_DAT1__IPU2_DISP0_DATA01 0x10
229 fsl,pins = < 97 MX6QDL_PAD_DISP0_DAT2__IPU2_DISP0_DATA02 0x10
230 MX6Q_PAD_EIM_EB2__I2C2_SCL 0x4001b8b1 98 MX6QDL_PAD_DISP0_DAT3__IPU2_DISP0_DATA03 0x10
231 MX6Q_PAD_EIM_D16__I2C2_SDA 0x4001b8b1 99 MX6QDL_PAD_DISP0_DAT4__IPU2_DISP0_DATA04 0x10
100 MX6QDL_PAD_DISP0_DAT5__IPU2_DISP0_DATA05 0x10
101 MX6QDL_PAD_DISP0_DAT6__IPU2_DISP0_DATA06 0x10
102 MX6QDL_PAD_DISP0_DAT7__IPU2_DISP0_DATA07 0x10
103 MX6QDL_PAD_DISP0_DAT8__IPU2_DISP0_DATA08 0x10
104 MX6QDL_PAD_DISP0_DAT9__IPU2_DISP0_DATA09 0x10
105 MX6QDL_PAD_DISP0_DAT10__IPU2_DISP0_DATA10 0x10
106 MX6QDL_PAD_DISP0_DAT11__IPU2_DISP0_DATA11 0x10
107 MX6QDL_PAD_DISP0_DAT12__IPU2_DISP0_DATA12 0x10
108 MX6QDL_PAD_DISP0_DAT13__IPU2_DISP0_DATA13 0x10
109 MX6QDL_PAD_DISP0_DAT14__IPU2_DISP0_DATA14 0x10
110 MX6QDL_PAD_DISP0_DAT15__IPU2_DISP0_DATA15 0x10
111 MX6QDL_PAD_DISP0_DAT16__IPU2_DISP0_DATA16 0x10
112 MX6QDL_PAD_DISP0_DAT17__IPU2_DISP0_DATA17 0x10
113 MX6QDL_PAD_DISP0_DAT18__IPU2_DISP0_DATA18 0x10
114 MX6QDL_PAD_DISP0_DAT19__IPU2_DISP0_DATA19 0x10
115 MX6QDL_PAD_DISP0_DAT20__IPU2_DISP0_DATA20 0x10
116 MX6QDL_PAD_DISP0_DAT21__IPU2_DISP0_DATA21 0x10
117 MX6QDL_PAD_DISP0_DAT22__IPU2_DISP0_DATA22 0x10
118 MX6QDL_PAD_DISP0_DAT23__IPU2_DISP0_DATA23 0x10
232 >; 119 >;
233 }; 120 };
234 }; 121 };
235
236 i2c3 {
237 pinctrl_i2c3_1: i2c3grp-1 {
238 fsl,pins = <
239 MX6Q_PAD_EIM_D17__I2C3_SCL 0x4001b8b1
240 MX6Q_PAD_EIM_D18__I2C3_SDA 0x4001b8b1
241 >;
242 };
243 };
244
245 uart1 {
246 pinctrl_uart1_1: uart1grp-1 {
247 fsl,pins = <
248 MX6Q_PAD_CSI0_DAT10__UART1_TX_DATA 0x1b0b1
249 MX6Q_PAD_CSI0_DAT11__UART1_RX_DATA 0x1b0b1
250 >;
251 };
252 };
253
254 uart2 {
255 pinctrl_uart2_1: uart2grp-1 {
256 fsl,pins = <
257 MX6Q_PAD_EIM_D26__UART2_TX_DATA 0x1b0b1
258 MX6Q_PAD_EIM_D27__UART2_RX_DATA 0x1b0b1
259 >;
260 };
261 };
262
263 uart4 {
264 pinctrl_uart4_1: uart4grp-1 {
265 fsl,pins = <
266 MX6Q_PAD_KEY_COL0__UART4_TX_DATA 0x1b0b1
267 MX6Q_PAD_KEY_ROW0__UART4_RX_DATA 0x1b0b1
268 >;
269 };
270 };
271
272 usbotg {
273 pinctrl_usbotg_1: usbotggrp-1 {
274 fsl,pins = <
275 MX6Q_PAD_GPIO_1__USB_OTG_ID 0x17059
276 >;
277 };
278
279 pinctrl_usbotg_2: usbotggrp-2 {
280 fsl,pins = <
281 MX6Q_PAD_ENET_RX_ER__USB_OTG_ID 0x17059
282 >;
283 };
284 };
285
286 usdhc2 {
287 pinctrl_usdhc2_1: usdhc2grp-1 {
288 fsl,pins = <
289 MX6Q_PAD_SD2_CMD__SD2_CMD 0x17059
290 MX6Q_PAD_SD2_CLK__SD2_CLK 0x10059
291 MX6Q_PAD_SD2_DAT0__SD2_DATA0 0x17059
292 MX6Q_PAD_SD2_DAT1__SD2_DATA1 0x17059
293 MX6Q_PAD_SD2_DAT2__SD2_DATA2 0x17059
294 MX6Q_PAD_SD2_DAT3__SD2_DATA3 0x17059
295 MX6Q_PAD_NANDF_D4__SD2_DATA4 0x17059
296 MX6Q_PAD_NANDF_D5__SD2_DATA5 0x17059
297 MX6Q_PAD_NANDF_D6__SD2_DATA6 0x17059
298 MX6Q_PAD_NANDF_D7__SD2_DATA7 0x17059
299 >;
300 };
301
302 pinctrl_usdhc2_2: usdhc2grp-2 {
303 fsl,pins = <
304 MX6Q_PAD_SD2_CMD__SD2_CMD 0x17059
305 MX6Q_PAD_SD2_CLK__SD2_CLK 0x10059
306 MX6Q_PAD_SD2_DAT0__SD2_DATA0 0x17059
307 MX6Q_PAD_SD2_DAT1__SD2_DATA1 0x17059
308 MX6Q_PAD_SD2_DAT2__SD2_DATA2 0x17059
309 MX6Q_PAD_SD2_DAT3__SD2_DATA3 0x17059
310 >;
311 };
312 };
313
314 usdhc3 {
315 pinctrl_usdhc3_1: usdhc3grp-1 {
316 fsl,pins = <
317 MX6Q_PAD_SD3_CMD__SD3_CMD 0x17059
318 MX6Q_PAD_SD3_CLK__SD3_CLK 0x10059
319 MX6Q_PAD_SD3_DAT0__SD3_DATA0 0x17059
320 MX6Q_PAD_SD3_DAT1__SD3_DATA1 0x17059
321 MX6Q_PAD_SD3_DAT2__SD3_DATA2 0x17059
322 MX6Q_PAD_SD3_DAT3__SD3_DATA3 0x17059
323 MX6Q_PAD_SD3_DAT4__SD3_DATA4 0x17059
324 MX6Q_PAD_SD3_DAT5__SD3_DATA5 0x17059
325 MX6Q_PAD_SD3_DAT6__SD3_DATA6 0x17059
326 MX6Q_PAD_SD3_DAT7__SD3_DATA7 0x17059
327 >;
328 };
329
330 pinctrl_usdhc3_2: usdhc3grp-2 {
331 fsl,pins = <
332 MX6Q_PAD_SD3_CMD__SD3_CMD 0x17059
333 MX6Q_PAD_SD3_CLK__SD3_CLK 0x10059
334 MX6Q_PAD_SD3_DAT0__SD3_DATA0 0x17059
335 MX6Q_PAD_SD3_DAT1__SD3_DATA1 0x17059
336 MX6Q_PAD_SD3_DAT2__SD3_DATA2 0x17059
337 MX6Q_PAD_SD3_DAT3__SD3_DATA3 0x17059
338 >;
339 };
340 };
341
342 usdhc4 {
343 pinctrl_usdhc4_1: usdhc4grp-1 {
344 fsl,pins = <
345 MX6Q_PAD_SD4_CMD__SD4_CMD 0x17059
346 MX6Q_PAD_SD4_CLK__SD4_CLK 0x10059
347 MX6Q_PAD_SD4_DAT0__SD4_DATA0 0x17059
348 MX6Q_PAD_SD4_DAT1__SD4_DATA1 0x17059
349 MX6Q_PAD_SD4_DAT2__SD4_DATA2 0x17059
350 MX6Q_PAD_SD4_DAT3__SD4_DATA3 0x17059
351 MX6Q_PAD_SD4_DAT4__SD4_DATA4 0x17059
352 MX6Q_PAD_SD4_DAT5__SD4_DATA5 0x17059
353 MX6Q_PAD_SD4_DAT6__SD4_DATA6 0x17059
354 MX6Q_PAD_SD4_DAT7__SD4_DATA7 0x17059
355 >;
356 };
357
358 pinctrl_usdhc4_2: usdhc4grp-2 {
359 fsl,pins = <
360 MX6Q_PAD_SD4_CMD__SD4_CMD 0x17059
361 MX6Q_PAD_SD4_CLK__SD4_CLK 0x10059
362 MX6Q_PAD_SD4_DAT0__SD4_DATA0 0x17059
363 MX6Q_PAD_SD4_DAT1__SD4_DATA1 0x17059
364 MX6Q_PAD_SD4_DAT2__SD4_DATA2 0x17059
365 MX6Q_PAD_SD4_DAT3__SD4_DATA3 0x17059
366 >;
367 };
368 };
369
370 weim {
371 pinctrl_weim_cs0_1: weim_cs0grp-1 {
372 fsl,pins = <
373 MX6Q_PAD_EIM_CS0__EIM_CS0_B 0xb0b1
374 >;
375 };
376
377 pinctrl_weim_nor_1: weimnorgrp-1 {
378 fsl,pins = <
379 MX6Q_PAD_EIM_OE__EIM_OE_B 0xb0b1
380 MX6Q_PAD_EIM_RW__EIM_RW 0xb0b1
381 MX6Q_PAD_EIM_WAIT__EIM_WAIT_B 0xb060
382 /* data */
383 MX6Q_PAD_EIM_D16__EIM_DATA16 0x1b0b0
384 MX6Q_PAD_EIM_D17__EIM_DATA17 0x1b0b0
385 MX6Q_PAD_EIM_D18__EIM_DATA18 0x1b0b0
386 MX6Q_PAD_EIM_D19__EIM_DATA19 0x1b0b0
387 MX6Q_PAD_EIM_D20__EIM_DATA20 0x1b0b0
388 MX6Q_PAD_EIM_D21__EIM_DATA21 0x1b0b0
389 MX6Q_PAD_EIM_D22__EIM_DATA22 0x1b0b0
390 MX6Q_PAD_EIM_D23__EIM_DATA23 0x1b0b0
391 MX6Q_PAD_EIM_D24__EIM_DATA24 0x1b0b0
392 MX6Q_PAD_EIM_D25__EIM_DATA25 0x1b0b0
393 MX6Q_PAD_EIM_D26__EIM_DATA26 0x1b0b0
394 MX6Q_PAD_EIM_D27__EIM_DATA27 0x1b0b0
395 MX6Q_PAD_EIM_D28__EIM_DATA28 0x1b0b0
396 MX6Q_PAD_EIM_D29__EIM_DATA29 0x1b0b0
397 MX6Q_PAD_EIM_D30__EIM_DATA30 0x1b0b0
398 MX6Q_PAD_EIM_D31__EIM_DATA31 0x1b0b0
399 /* address */
400 MX6Q_PAD_EIM_A23__EIM_ADDR23 0xb0b1
401 MX6Q_PAD_EIM_A22__EIM_ADDR22 0xb0b1
402 MX6Q_PAD_EIM_A21__EIM_ADDR21 0xb0b1
403 MX6Q_PAD_EIM_A20__EIM_ADDR20 0xb0b1
404 MX6Q_PAD_EIM_A19__EIM_ADDR19 0xb0b1
405 MX6Q_PAD_EIM_A18__EIM_ADDR18 0xb0b1
406 MX6Q_PAD_EIM_A17__EIM_ADDR17 0xb0b1
407 MX6Q_PAD_EIM_A16__EIM_ADDR16 0xb0b1
408 MX6Q_PAD_EIM_DA15__EIM_AD15 0xb0b1
409 MX6Q_PAD_EIM_DA14__EIM_AD14 0xb0b1
410 MX6Q_PAD_EIM_DA13__EIM_AD13 0xb0b1
411 MX6Q_PAD_EIM_DA12__EIM_AD12 0xb0b1
412 MX6Q_PAD_EIM_DA11__EIM_AD11 0xb0b1
413 MX6Q_PAD_EIM_DA10__EIM_AD10 0xb0b1
414 MX6Q_PAD_EIM_DA9__EIM_AD09 0xb0b1
415 MX6Q_PAD_EIM_DA8__EIM_AD08 0xb0b1
416 MX6Q_PAD_EIM_DA7__EIM_AD07 0xb0b1
417 MX6Q_PAD_EIM_DA6__EIM_AD06 0xb0b1
418 MX6Q_PAD_EIM_DA5__EIM_AD05 0xb0b1
419 MX6Q_PAD_EIM_DA4__EIM_AD04 0xb0b1
420 MX6Q_PAD_EIM_DA3__EIM_AD03 0xb0b1
421 MX6Q_PAD_EIM_DA2__EIM_AD02 0xb0b1
422 MX6Q_PAD_EIM_DA1__EIM_AD01 0xb0b1
423 MX6Q_PAD_EIM_DA0__EIM_AD00 0xb0b1
424 >;
425 };
426
427 };
428 }; 122 };
429 }; 123 };
430 124
125 sata: sata@02200000 {
126 compatible = "fsl,imx6q-ahci";
127 reg = <0x02200000 0x4000>;
128 interrupts = <0 39 0x04>;
129 clocks = <&clks 154>, <&clks 187>, <&clks 105>;
130 clock-names = "sata", "sata_ref", "ahb";
131 status = "disabled";
132 };
133
431 ipu2: ipu@02800000 { 134 ipu2: ipu@02800000 {
432 #crtc-cells = <1>; 135 #crtc-cells = <1>;
433 compatible = "fsl,imx6q-ipu"; 136 compatible = "fsl,imx6q-ipu";
diff --git a/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi b/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi
index e994011220e7..1cbbc5160d27 100644
--- a/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi
@@ -45,6 +45,28 @@
45 status = "okay"; 45 status = "okay";
46}; 46};
47 47
48&iomuxc {
49 pinctrl-names = "default";
50 pinctrl-0 = <&pinctrl_hog>;
51
52 hog {
53 pinctrl_hog: hoggrp {
54 fsl,pins = <
55 MX6QDL_PAD_NANDF_CS2__GPIO6_IO15 0x80000000
56 MX6QDL_PAD_SD2_DAT2__GPIO1_IO13 0x80000000
57 >;
58 };
59 };
60
61 ecspi1 {
62 pinctrl_ecspi1_sabreauto: ecspi1-sabreauto {
63 fsl,pins = <
64 MX6QDL_PAD_EIM_D19__GPIO3_IO19 0x80000000
65 >;
66 };
67 };
68};
69
48&uart4 { 70&uart4 {
49 pinctrl-names = "default"; 71 pinctrl-names = "default";
50 pinctrl-0 = <&pinctrl_uart4_1>; 72 pinctrl-0 = <&pinctrl_uart4_1>;
diff --git a/arch/arm/boot/dts/imx6qdl-sabresd.dtsi b/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
index 6e5dfdb32416..39eafc222a2e 100644
--- a/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
+++ b/arch/arm/boot/dts/imx6qdl-sabresd.dtsi
@@ -27,6 +27,15 @@
27 enable-active-high; 27 enable-active-high;
28 }; 28 };
29 29
30 reg_usb_h1_vbus: usb_h1_vbus {
31 compatible = "regulator-fixed";
32 regulator-name = "usb_h1_vbus";
33 regulator-min-microvolt = <5000000>;
34 regulator-max-microvolt = <5000000>;
35 gpio = <&gpio1 29 0>;
36 enable-active-high;
37 };
38
30 reg_audio: wm8962_supply { 39 reg_audio: wm8962_supply {
31 compatible = "regulator-fixed"; 40 compatible = "regulator-fixed";
32 regulator-name = "wm8962-supply"; 41 regulator-name = "wm8962-supply";
@@ -41,12 +50,14 @@
41 volume-up { 50 volume-up {
42 label = "Volume Up"; 51 label = "Volume Up";
43 gpios = <&gpio1 4 0>; 52 gpios = <&gpio1 4 0>;
53 gpio-key,wakeup;
44 linux,code = <115>; /* KEY_VOLUMEUP */ 54 linux,code = <115>; /* KEY_VOLUMEUP */
45 }; 55 };
46 56
47 volume-down { 57 volume-down {
48 label = "Volume Down"; 58 label = "Volume Down";
49 gpios = <&gpio1 5 0>; 59 gpios = <&gpio1 5 0>;
60 gpio-key,wakeup;
50 linux,code = <114>; /* KEY_VOLUMEDOWN */ 61 linux,code = <114>; /* KEY_VOLUMEDOWN */
51 }; 62 };
52 }; 63 };
@@ -77,6 +88,22 @@
77 status = "okay"; 88 status = "okay";
78}; 89};
79 90
91&ecspi1 {
92 fsl,spi-num-chipselects = <1>;
93 cs-gpios = <&gpio4 9 0>;
94 pinctrl-names = "default";
95 pinctrl-0 = <&pinctrl_ecspi1_2>;
96 status = "okay";
97
98 flash: m25p80@0 {
99 #address-cells = <1>;
100 #size-cells = <1>;
101 compatible = "st,m25p32";
102 spi-max-frequency = <20000000>;
103 reg = <0>;
104 };
105};
106
80&fec { 107&fec {
81 pinctrl-names = "default"; 108 pinctrl-names = "default";
82 pinctrl-0 = <&pinctrl_enet_1>; 109 pinctrl-0 = <&pinctrl_enet_1>;
@@ -93,7 +120,7 @@
93 codec: wm8962@1a { 120 codec: wm8962@1a {
94 compatible = "wlf,wm8962"; 121 compatible = "wlf,wm8962";
95 reg = <0x1a>; 122 reg = <0x1a>;
96 clocks = <&clks 169>; 123 clocks = <&clks 201>;
97 DCVDD-supply = <&reg_audio>; 124 DCVDD-supply = <&reg_audio>;
98 DBVDD-supply = <&reg_audio>; 125 DBVDD-supply = <&reg_audio>;
99 AVDD-supply = <&reg_audio>; 126 AVDD-supply = <&reg_audio>;
@@ -113,6 +140,68 @@
113 }; 140 };
114}; 141};
115 142
143&i2c3 {
144 clock-frequency = <100000>;
145 pinctrl-names = "default";
146 pinctrl-0 = <&pinctrl_i2c3_2>;
147 status = "okay";
148
149 egalax_ts@04 {
150 compatible = "eeti,egalax_ts";
151 reg = <0x04>;
152 interrupt-parent = <&gpio6>;
153 interrupts = <7 2>;
154 wakeup-gpios = <&gpio6 7 0>;
155 };
156};
157
158&iomuxc {
159 pinctrl-names = "default";
160 pinctrl-0 = <&pinctrl_hog>;
161
162 hog {
163 pinctrl_hog: hoggrp {
164 fsl,pins = <
165 MX6QDL_PAD_GPIO_4__GPIO1_IO04 0x80000000
166 MX6QDL_PAD_GPIO_5__GPIO1_IO05 0x80000000
167 MX6QDL_PAD_NANDF_D0__GPIO2_IO00 0x80000000
168 MX6QDL_PAD_NANDF_D1__GPIO2_IO01 0x80000000
169 MX6QDL_PAD_NANDF_D2__GPIO2_IO02 0x80000000
170 MX6QDL_PAD_NANDF_D3__GPIO2_IO03 0x80000000
171 MX6QDL_PAD_GPIO_0__CCM_CLKO1 0x130b0
172 MX6QDL_PAD_NANDF_CLE__GPIO6_IO07 0x80000000
173 MX6QDL_PAD_ENET_TXD1__GPIO1_IO29 0x80000000
174 MX6QDL_PAD_EIM_D22__GPIO3_IO22 0x80000000
175 >;
176 };
177 };
178};
179
180&ldb {
181 status = "okay";
182
183 lvds-channel@1 {
184 fsl,data-mapping = "spwg";
185 fsl,data-width = <18>;
186 status = "okay";
187
188 display-timings {
189 native-mode = <&timing0>;
190 timing0: hsd100pxn1 {
191 clock-frequency = <65000000>;
192 hactive = <1024>;
193 vactive = <768>;
194 hback-porch = <220>;
195 hfront-porch = <40>;
196 vback-porch = <21>;
197 vfront-porch = <7>;
198 hsync-len = <60>;
199 vsync-len = <10>;
200 };
201 };
202 };
203};
204
116&ssi2 { 205&ssi2 {
117 fsl,mode = "i2s-slave"; 206 fsl,mode = "i2s-slave";
118 status = "okay"; 207 status = "okay";
@@ -125,6 +214,7 @@
125}; 214};
126 215
127&usbh1 { 216&usbh1 {
217 vbus-supply = <&reg_usb_h1_vbus>;
128 status = "okay"; 218 status = "okay";
129}; 219};
130 220
diff --git a/arch/arm/boot/dts/imx6qdl-wandboard.dtsi b/arch/arm/boot/dts/imx6qdl-wandboard.dtsi
new file mode 100644
index 000000000000..a55113e65bcb
--- /dev/null
+++ b/arch/arm/boot/dts/imx6qdl-wandboard.dtsi
@@ -0,0 +1,137 @@
1/*
2 * Copyright 2013 Freescale Semiconductor, Inc.
3 *
4 * Author: Fabio Estevam <fabio.estevam@freescale.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 */
11
12/ {
13 regulators {
14 compatible = "simple-bus";
15
16 reg_2p5v: 2p5v {
17 compatible = "regulator-fixed";
18 regulator-name = "2P5V";
19 regulator-min-microvolt = <2500000>;
20 regulator-max-microvolt = <2500000>;
21 regulator-always-on;
22 };
23
24 reg_3p3v: 3p3v {
25 compatible = "regulator-fixed";
26 regulator-name = "3P3V";
27 regulator-min-microvolt = <3300000>;
28 regulator-max-microvolt = <3300000>;
29 regulator-always-on;
30 };
31 };
32
33 sound {
34 compatible = "fsl,imx6-wandboard-sgtl5000",
35 "fsl,imx-audio-sgtl5000";
36 model = "imx6-wandboard-sgtl5000";
37 ssi-controller = <&ssi1>;
38 audio-codec = <&codec>;
39 audio-routing =
40 "MIC_IN", "Mic Jack",
41 "Mic Jack", "Mic Bias",
42 "Headphone Jack", "HP_OUT";
43 mux-int-port = <1>;
44 mux-ext-port = <3>;
45 };
46};
47
48&audmux {
49 pinctrl-names = "default";
50 pinctrl-0 = <&pinctrl_audmux_2>;
51 status = "okay";
52};
53
54&i2c2 {
55 clock-frequency = <100000>;
56 pinctrl-names = "default";
57 pinctrl-0 = <&pinctrl_i2c2_2>;
58 status = "okay";
59
60 codec: sgtl5000@0a {
61 compatible = "fsl,sgtl5000";
62 reg = <0x0a>;
63 clocks = <&clks 201>;
64 VDDA-supply = <&reg_2p5v>;
65 VDDIO-supply = <&reg_3p3v>;
66 };
67};
68
69&iomuxc {
70 pinctrl-names = "default";
71 pinctrl-0 = <&pinctrl_hog>;
72
73 hog {
74 pinctrl_hog: hoggrp {
75 fsl,pins = <
76 MX6QDL_PAD_GPIO_0__CCM_CLKO1 0x130b0
77 MX6QDL_PAD_GPIO_2__GPIO1_IO02 0x80000000
78 MX6QDL_PAD_EIM_DA9__GPIO3_IO09 0x80000000
79 MX6QDL_PAD_EIM_EB1__GPIO2_IO29 0x80000000 /* WL_REF_ON */
80 MX6QDL_PAD_EIM_A25__GPIO5_IO02 0x80000000 /* WL_RST_N */
81 MX6QDL_PAD_ENET_RXD1__GPIO1_IO26 0x80000000 /* WL_REG_ON */
82 MX6QDL_PAD_ENET_TXD1__GPIO1_IO29 0x80000000 /* WL_HOST_WAKE */
83 MX6QDL_PAD_ENET_TXD0__GPIO1_IO30 0x80000000 /* WL_WAKE */
84 >;
85 };
86 };
87};
88
89&fec {
90 pinctrl-names = "default";
91 pinctrl-0 = <&pinctrl_enet_1>;
92 phy-mode = "rgmii";
93 status = "okay";
94};
95
96&ssi1 {
97 fsl,mode = "i2s-slave";
98 status = "okay";
99};
100
101&uart1 {
102 pinctrl-names = "default";
103 pinctrl-0 = <&pinctrl_uart1_1>;
104 status = "okay";
105};
106
107&uart3 {
108 pinctrl-names = "default";
109 pinctrl-0 = <&pinctrl_uart3_2>;
110 fsl,uart-has-rtscts;
111 status = "okay";
112};
113
114&usbh1 {
115 status = "okay";
116};
117
118&usdhc1 {
119 pinctrl-names = "default";
120 pinctrl-0 = <&pinctrl_usdhc1_2>;
121 cd-gpios = <&gpio1 2 0>;
122 status = "okay";
123};
124
125&usdhc2 {
126 pinctrl-names = "default";
127 pinctrl-0 = <&pinctrl_usdhc2_2>;
128 non-removable;
129 status = "okay";
130};
131
132&usdhc3 {
133 pinctrl-names = "default";
134 pinctrl-0 = <&pinctrl_usdhc3_2>;
135 cd-gpios = <&gpio3 9 0>;
136 status = "okay";
137};
diff --git a/arch/arm/boot/dts/imx6qdl.dtsi b/arch/arm/boot/dts/imx6qdl.dtsi
index f21d259080fd..ccd55c2fdb67 100644
--- a/arch/arm/boot/dts/imx6qdl.dtsi
+++ b/arch/arm/boot/dts/imx6qdl.dtsi
@@ -14,11 +14,6 @@
14 14
15/ { 15/ {
16 aliases { 16 aliases {
17 serial0 = &uart1;
18 serial1 = &uart2;
19 serial2 = &uart3;
20 serial3 = &uart4;
21 serial4 = &uart5;
22 gpio0 = &gpio1; 17 gpio0 = &gpio1;
23 gpio1 = &gpio2; 18 gpio1 = &gpio2;
24 gpio2 = &gpio3; 19 gpio2 = &gpio3;
@@ -26,6 +21,18 @@
26 gpio4 = &gpio5; 21 gpio4 = &gpio5;
27 gpio5 = &gpio6; 22 gpio5 = &gpio6;
28 gpio6 = &gpio7; 23 gpio6 = &gpio7;
24 i2c0 = &i2c1;
25 i2c1 = &i2c2;
26 i2c2 = &i2c3;
27 serial0 = &uart1;
28 serial1 = &uart2;
29 serial2 = &uart3;
30 serial3 = &uart4;
31 serial4 = &uart5;
32 spi0 = &ecspi1;
33 spi1 = &ecspi2;
34 spi2 = &ecspi3;
35 spi3 = &ecspi4;
29 }; 36 };
30 37
31 intc: interrupt-controller@00a01000 { 38 intc: interrupt-controller@00a01000 {
@@ -81,15 +88,14 @@
81 #size-cells = <1>; 88 #size-cells = <1>;
82 reg = <0x00112000 0x2000>, <0x00114000 0x2000>; 89 reg = <0x00112000 0x2000>, <0x00114000 0x2000>;
83 reg-names = "gpmi-nand", "bch"; 90 reg-names = "gpmi-nand", "bch";
84 interrupts = <0 13 0x04>, <0 15 0x04>; 91 interrupts = <0 15 0x04>;
85 interrupt-names = "gpmi-dma", "bch"; 92 interrupt-names = "bch";
86 clocks = <&clks 152>, <&clks 153>, <&clks 151>, 93 clocks = <&clks 152>, <&clks 153>, <&clks 151>,
87 <&clks 150>, <&clks 149>; 94 <&clks 150>, <&clks 149>;
88 clock-names = "gpmi_io", "gpmi_apb", "gpmi_bch", 95 clock-names = "gpmi_io", "gpmi_apb", "gpmi_bch",
89 "gpmi_bch_apb", "per1_bch"; 96 "gpmi_bch_apb", "per1_bch";
90 dmas = <&dma_apbh 0>; 97 dmas = <&dma_apbh 0>;
91 dma-names = "rx-tx"; 98 dma-names = "rx-tx";
92 fsl,gpmi-dma-channel = <0>;
93 status = "disabled"; 99 status = "disabled";
94 }; 100 };
95 101
@@ -184,6 +190,8 @@
184 interrupts = <0 26 0x04>; 190 interrupts = <0 26 0x04>;
185 clocks = <&clks 160>, <&clks 161>; 191 clocks = <&clks 160>, <&clks 161>;
186 clock-names = "ipg", "per"; 192 clock-names = "ipg", "per";
193 dmas = <&sdma 25 4 0>, <&sdma 26 4 0>;
194 dma-names = "rx", "tx";
187 status = "disabled"; 195 status = "disabled";
188 }; 196 };
189 197
@@ -197,6 +205,9 @@
197 reg = <0x02028000 0x4000>; 205 reg = <0x02028000 0x4000>;
198 interrupts = <0 46 0x04>; 206 interrupts = <0 46 0x04>;
199 clocks = <&clks 178>; 207 clocks = <&clks 178>;
208 dmas = <&sdma 37 1 0>,
209 <&sdma 38 1 0>;
210 dma-names = "rx", "tx";
200 fsl,fifo-depth = <15>; 211 fsl,fifo-depth = <15>;
201 fsl,ssi-dma-events = <38 37>; 212 fsl,ssi-dma-events = <38 37>;
202 status = "disabled"; 213 status = "disabled";
@@ -207,6 +218,9 @@
207 reg = <0x0202c000 0x4000>; 218 reg = <0x0202c000 0x4000>;
208 interrupts = <0 47 0x04>; 219 interrupts = <0 47 0x04>;
209 clocks = <&clks 179>; 220 clocks = <&clks 179>;
221 dmas = <&sdma 41 1 0>,
222 <&sdma 42 1 0>;
223 dma-names = "rx", "tx";
210 fsl,fifo-depth = <15>; 224 fsl,fifo-depth = <15>;
211 fsl,ssi-dma-events = <42 41>; 225 fsl,ssi-dma-events = <42 41>;
212 status = "disabled"; 226 status = "disabled";
@@ -217,6 +231,9 @@
217 reg = <0x02030000 0x4000>; 231 reg = <0x02030000 0x4000>;
218 interrupts = <0 48 0x04>; 232 interrupts = <0 48 0x04>;
219 clocks = <&clks 180>; 233 clocks = <&clks 180>;
234 dmas = <&sdma 45 1 0>,
235 <&sdma 46 1 0>;
236 dma-names = "rx", "tx";
220 fsl,fifo-depth = <15>; 237 fsl,fifo-depth = <15>;
221 fsl,ssi-dma-events = <46 45>; 238 fsl,ssi-dma-events = <46 45>;
222 status = "disabled"; 239 status = "disabled";
@@ -278,17 +295,23 @@
278 }; 295 };
279 296
280 can1: flexcan@02090000 { 297 can1: flexcan@02090000 {
298 compatible = "fsl,imx6q-flexcan";
281 reg = <0x02090000 0x4000>; 299 reg = <0x02090000 0x4000>;
282 interrupts = <0 110 0x04>; 300 interrupts = <0 110 0x04>;
301 clocks = <&clks 108>, <&clks 109>;
302 clock-names = "ipg", "per";
283 }; 303 };
284 304
285 can2: flexcan@02094000 { 305 can2: flexcan@02094000 {
306 compatible = "fsl,imx6q-flexcan";
286 reg = <0x02094000 0x4000>; 307 reg = <0x02094000 0x4000>;
287 interrupts = <0 111 0x04>; 308 interrupts = <0 111 0x04>;
309 clocks = <&clks 110>, <&clks 111>;
310 clock-names = "ipg", "per";
288 }; 311 };
289 312
290 gpt: gpt@02098000 { 313 gpt: gpt@02098000 {
291 compatible = "fsl,imx6q-gpt"; 314 compatible = "fsl,imx6q-gpt", "fsl,imx31-gpt";
292 reg = <0x02098000 0x4000>; 315 reg = <0x02098000 0x4000>;
293 interrupts = <0 55 0x04>; 316 interrupts = <0 55 0x04>;
294 clocks = <&clks 119>, <&clks 120>; 317 clocks = <&clks 119>, <&clks 120>;
@@ -491,6 +514,13 @@
491 }; 514 };
492 }; 515 };
493 516
517 tempmon: tempmon {
518 compatible = "fsl,imx6q-tempmon";
519 interrupts = <0 49 0x04>;
520 fsl,tempmon = <&anatop>;
521 fsl,tempmon-data = <&ocotp>;
522 };
523
494 usbphy1: usbphy@020c9000 { 524 usbphy1: usbphy@020c9000 {
495 compatible = "fsl,imx6q-usbphy", "fsl,imx23-usbphy"; 525 compatible = "fsl,imx6q-usbphy", "fsl,imx23-usbphy";
496 reg = <0x020c9000 0x1000>; 526 reg = <0x020c9000 0x1000>;
@@ -546,6 +576,713 @@
546 reg = <0x020e0000 0x38>; 576 reg = <0x020e0000 0x38>;
547 }; 577 };
548 578
579 iomuxc: iomuxc@020e0000 {
580 compatible = "fsl,imx6dl-iomuxc", "fsl,imx6q-iomuxc";
581 reg = <0x020e0000 0x4000>;
582
583 audmux {
584 pinctrl_audmux_1: audmux-1 {
585 fsl,pins = <
586 MX6QDL_PAD_SD2_DAT0__AUD4_RXD 0x80000000
587 MX6QDL_PAD_SD2_DAT3__AUD4_TXC 0x80000000
588 MX6QDL_PAD_SD2_DAT2__AUD4_TXD 0x80000000
589 MX6QDL_PAD_SD2_DAT1__AUD4_TXFS 0x80000000
590 >;
591 };
592
593 pinctrl_audmux_2: audmux-2 {
594 fsl,pins = <
595 MX6QDL_PAD_CSI0_DAT7__AUD3_RXD 0x80000000
596 MX6QDL_PAD_CSI0_DAT4__AUD3_TXC 0x80000000
597 MX6QDL_PAD_CSI0_DAT5__AUD3_TXD 0x80000000
598 MX6QDL_PAD_CSI0_DAT6__AUD3_TXFS 0x80000000
599 >;
600 };
601
602 pinctrl_audmux_3: audmux-3 {
603 fsl,pins = <
604 MX6QDL_PAD_DISP0_DAT16__AUD5_TXC 0x80000000
605 MX6QDL_PAD_DISP0_DAT18__AUD5_TXFS 0x80000000
606 MX6QDL_PAD_DISP0_DAT19__AUD5_RXD 0x80000000
607 >;
608 };
609 };
610
611 ecspi1 {
612 pinctrl_ecspi1_1: ecspi1grp-1 {
613 fsl,pins = <
614 MX6QDL_PAD_EIM_D17__ECSPI1_MISO 0x100b1
615 MX6QDL_PAD_EIM_D18__ECSPI1_MOSI 0x100b1
616 MX6QDL_PAD_EIM_D16__ECSPI1_SCLK 0x100b1
617 >;
618 };
619
620 pinctrl_ecspi1_2: ecspi1grp-2 {
621 fsl,pins = <
622 MX6QDL_PAD_KEY_COL1__ECSPI1_MISO 0x100b1
623 MX6QDL_PAD_KEY_ROW0__ECSPI1_MOSI 0x100b1
624 MX6QDL_PAD_KEY_COL0__ECSPI1_SCLK 0x100b1
625 >;
626 };
627 };
628
629 ecspi3 {
630 pinctrl_ecspi3_1: ecspi3grp-1 {
631 fsl,pins = <
632 MX6QDL_PAD_DISP0_DAT2__ECSPI3_MISO 0x100b1
633 MX6QDL_PAD_DISP0_DAT1__ECSPI3_MOSI 0x100b1
634 MX6QDL_PAD_DISP0_DAT0__ECSPI3_SCLK 0x100b1
635 >;
636 };
637 };
638
639 enet {
640 pinctrl_enet_1: enetgrp-1 {
641 fsl,pins = <
642 MX6QDL_PAD_ENET_MDIO__ENET_MDIO 0x1b0b0
643 MX6QDL_PAD_ENET_MDC__ENET_MDC 0x1b0b0
644 MX6QDL_PAD_RGMII_TXC__RGMII_TXC 0x1b0b0
645 MX6QDL_PAD_RGMII_TD0__RGMII_TD0 0x1b0b0
646 MX6QDL_PAD_RGMII_TD1__RGMII_TD1 0x1b0b0
647 MX6QDL_PAD_RGMII_TD2__RGMII_TD2 0x1b0b0
648 MX6QDL_PAD_RGMII_TD3__RGMII_TD3 0x1b0b0
649 MX6QDL_PAD_RGMII_TX_CTL__RGMII_TX_CTL 0x1b0b0
650 MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK 0x1b0b0
651 MX6QDL_PAD_RGMII_RXC__RGMII_RXC 0x1b0b0
652 MX6QDL_PAD_RGMII_RD0__RGMII_RD0 0x1b0b0
653 MX6QDL_PAD_RGMII_RD1__RGMII_RD1 0x1b0b0
654 MX6QDL_PAD_RGMII_RD2__RGMII_RD2 0x1b0b0
655 MX6QDL_PAD_RGMII_RD3__RGMII_RD3 0x1b0b0
656 MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x1b0b0
657 MX6QDL_PAD_GPIO_16__ENET_REF_CLK 0x4001b0a8
658 >;
659 };
660
661 pinctrl_enet_2: enetgrp-2 {
662 fsl,pins = <
663 MX6QDL_PAD_KEY_COL1__ENET_MDIO 0x1b0b0
664 MX6QDL_PAD_KEY_COL2__ENET_MDC 0x1b0b0
665 MX6QDL_PAD_RGMII_TXC__RGMII_TXC 0x1b0b0
666 MX6QDL_PAD_RGMII_TD0__RGMII_TD0 0x1b0b0
667 MX6QDL_PAD_RGMII_TD1__RGMII_TD1 0x1b0b0
668 MX6QDL_PAD_RGMII_TD2__RGMII_TD2 0x1b0b0
669 MX6QDL_PAD_RGMII_TD3__RGMII_TD3 0x1b0b0
670 MX6QDL_PAD_RGMII_TX_CTL__RGMII_TX_CTL 0x1b0b0
671 MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK 0x1b0b0
672 MX6QDL_PAD_RGMII_RXC__RGMII_RXC 0x1b0b0
673 MX6QDL_PAD_RGMII_RD0__RGMII_RD0 0x1b0b0
674 MX6QDL_PAD_RGMII_RD1__RGMII_RD1 0x1b0b0
675 MX6QDL_PAD_RGMII_RD2__RGMII_RD2 0x1b0b0
676 MX6QDL_PAD_RGMII_RD3__RGMII_RD3 0x1b0b0
677 MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x1b0b0
678 >;
679 };
680
681 pinctrl_enet_3: enetgrp-3 {
682 fsl,pins = <
683 MX6QDL_PAD_ENET_MDIO__ENET_MDIO 0x1b0b0
684 MX6QDL_PAD_ENET_MDC__ENET_MDC 0x1b0b0
685 MX6QDL_PAD_RGMII_TXC__RGMII_TXC 0x1b0b0
686 MX6QDL_PAD_RGMII_TD0__RGMII_TD0 0x1b0b0
687 MX6QDL_PAD_RGMII_TD1__RGMII_TD1 0x1b0b0
688 MX6QDL_PAD_RGMII_TD2__RGMII_TD2 0x1b0b0
689 MX6QDL_PAD_RGMII_TD3__RGMII_TD3 0x1b0b0
690 MX6QDL_PAD_RGMII_TX_CTL__RGMII_TX_CTL 0x1b0b0
691 MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK 0x1b0b0
692 MX6QDL_PAD_RGMII_RXC__RGMII_RXC 0x1b0b0
693 MX6QDL_PAD_RGMII_RD0__RGMII_RD0 0x1b0b0
694 MX6QDL_PAD_RGMII_RD1__RGMII_RD1 0x1b0b0
695 MX6QDL_PAD_RGMII_RD2__RGMII_RD2 0x1b0b0
696 MX6QDL_PAD_RGMII_RD3__RGMII_RD3 0x1b0b0
697 MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x1b0b0
698 MX6QDL_PAD_ENET_TX_EN__ENET_TX_EN 0x1b0b0
699 >;
700 };
701 };
702
703 esai {
704 pinctrl_esai_1: esaigrp-1 {
705 fsl,pins = <
706 MX6QDL_PAD_ENET_RXD0__ESAI_TX_HF_CLK 0x1b030
707 MX6QDL_PAD_ENET_CRS_DV__ESAI_TX_CLK 0x1b030
708 MX6QDL_PAD_ENET_RXD1__ESAI_TX_FS 0x1b030
709 MX6QDL_PAD_ENET_TX_EN__ESAI_TX3_RX2 0x1b030
710 MX6QDL_PAD_ENET_TXD1__ESAI_TX2_RX3 0x1b030
711 MX6QDL_PAD_ENET_TXD0__ESAI_TX4_RX1 0x1b030
712 MX6QDL_PAD_ENET_MDC__ESAI_TX5_RX0 0x1b030
713 MX6QDL_PAD_NANDF_CS2__ESAI_TX0 0x1b030
714 MX6QDL_PAD_NANDF_CS3__ESAI_TX1 0x1b030
715 >;
716 };
717
718 pinctrl_esai_2: esaigrp-2 {
719 fsl,pins = <
720 MX6QDL_PAD_ENET_CRS_DV__ESAI_TX_CLK 0x1b030
721 MX6QDL_PAD_ENET_RXD1__ESAI_TX_FS 0x1b030
722 MX6QDL_PAD_ENET_TX_EN__ESAI_TX3_RX2 0x1b030
723 MX6QDL_PAD_GPIO_5__ESAI_TX2_RX3 0x1b030
724 MX6QDL_PAD_ENET_TXD0__ESAI_TX4_RX1 0x1b030
725 MX6QDL_PAD_ENET_MDC__ESAI_TX5_RX0 0x1b030
726 MX6QDL_PAD_GPIO_17__ESAI_TX0 0x1b030
727 MX6QDL_PAD_NANDF_CS3__ESAI_TX1 0x1b030
728 MX6QDL_PAD_ENET_MDIO__ESAI_RX_CLK 0x1b030
729 MX6QDL_PAD_GPIO_9__ESAI_RX_FS 0x1b030
730 >;
731 };
732 };
733
734 flexcan1 {
735 pinctrl_flexcan1_1: flexcan1grp-1 {
736 fsl,pins = <
737 MX6QDL_PAD_KEY_ROW2__FLEXCAN1_RX 0x80000000
738 MX6QDL_PAD_KEY_COL2__FLEXCAN1_TX 0x80000000
739 >;
740 };
741
742 pinctrl_flexcan1_2: flexcan1grp-2 {
743 fsl,pins = <
744 MX6QDL_PAD_GPIO_7__FLEXCAN1_TX 0x80000000
745 MX6QDL_PAD_KEY_ROW2__FLEXCAN1_RX 0x80000000
746 >;
747 };
748 };
749
750 flexcan2 {
751 pinctrl_flexcan2_1: flexcan2grp-1 {
752 fsl,pins = <
753 MX6QDL_PAD_KEY_COL4__FLEXCAN2_TX 0x80000000
754 MX6QDL_PAD_KEY_ROW4__FLEXCAN2_RX 0x80000000
755 >;
756 };
757 };
758
759 gpmi-nand {
760 pinctrl_gpmi_nand_1: gpmi-nand-1 {
761 fsl,pins = <
762 MX6QDL_PAD_NANDF_CLE__NAND_CLE 0xb0b1
763 MX6QDL_PAD_NANDF_ALE__NAND_ALE 0xb0b1
764 MX6QDL_PAD_NANDF_WP_B__NAND_WP_B 0xb0b1
765 MX6QDL_PAD_NANDF_RB0__NAND_READY_B 0xb000
766 MX6QDL_PAD_NANDF_CS0__NAND_CE0_B 0xb0b1
767 MX6QDL_PAD_NANDF_CS1__NAND_CE1_B 0xb0b1
768 MX6QDL_PAD_SD4_CMD__NAND_RE_B 0xb0b1
769 MX6QDL_PAD_SD4_CLK__NAND_WE_B 0xb0b1
770 MX6QDL_PAD_NANDF_D0__NAND_DATA00 0xb0b1
771 MX6QDL_PAD_NANDF_D1__NAND_DATA01 0xb0b1
772 MX6QDL_PAD_NANDF_D2__NAND_DATA02 0xb0b1
773 MX6QDL_PAD_NANDF_D3__NAND_DATA03 0xb0b1
774 MX6QDL_PAD_NANDF_D4__NAND_DATA04 0xb0b1
775 MX6QDL_PAD_NANDF_D5__NAND_DATA05 0xb0b1
776 MX6QDL_PAD_NANDF_D6__NAND_DATA06 0xb0b1
777 MX6QDL_PAD_NANDF_D7__NAND_DATA07 0xb0b1
778 MX6QDL_PAD_SD4_DAT0__NAND_DQS 0x00b1
779 >;
780 };
781 };
782
783 hdmi_hdcp {
784 pinctrl_hdmi_hdcp_1: hdmihdcpgrp-1 {
785 fsl,pins = <
786 MX6QDL_PAD_KEY_COL3__HDMI_TX_DDC_SCL 0x4001b8b1
787 MX6QDL_PAD_KEY_ROW3__HDMI_TX_DDC_SDA 0x4001b8b1
788 >;
789 };
790
791 pinctrl_hdmi_hdcp_2: hdmihdcpgrp-2 {
792 fsl,pins = <
793 MX6QDL_PAD_EIM_EB2__HDMI_TX_DDC_SCL 0x4001b8b1
794 MX6QDL_PAD_EIM_D16__HDMI_TX_DDC_SDA 0x4001b8b1
795 >;
796 };
797
798 pinctrl_hdmi_hdcp_3: hdmihdcpgrp-3 {
799 fsl,pins = <
800 MX6QDL_PAD_EIM_EB2__HDMI_TX_DDC_SCL 0x4001b8b1
801 MX6QDL_PAD_KEY_ROW3__HDMI_TX_DDC_SDA 0x4001b8b1
802 >;
803 };
804 };
805
806 hdmi_cec {
807 pinctrl_hdmi_cec_1: hdmicecgrp-1 {
808 fsl,pins = <
809 MX6QDL_PAD_EIM_A25__HDMI_TX_CEC_LINE 0x1f8b0
810 >;
811 };
812
813 pinctrl_hdmi_cec_2: hdmicecgrp-2 {
814 fsl,pins = <
815 MX6QDL_PAD_KEY_ROW2__HDMI_TX_CEC_LINE 0x1f8b0
816 >;
817 };
818 };
819
820 i2c1 {
821 pinctrl_i2c1_1: i2c1grp-1 {
822 fsl,pins = <
823 MX6QDL_PAD_EIM_D21__I2C1_SCL 0x4001b8b1
824 MX6QDL_PAD_EIM_D28__I2C1_SDA 0x4001b8b1
825 >;
826 };
827
828 pinctrl_i2c1_2: i2c1grp-2 {
829 fsl,pins = <
830 MX6QDL_PAD_CSI0_DAT8__I2C1_SDA 0x4001b8b1
831 MX6QDL_PAD_CSI0_DAT9__I2C1_SCL 0x4001b8b1
832 >;
833 };
834 };
835
836 i2c2 {
837 pinctrl_i2c2_1: i2c2grp-1 {
838 fsl,pins = <
839 MX6QDL_PAD_EIM_EB2__I2C2_SCL 0x4001b8b1
840 MX6QDL_PAD_EIM_D16__I2C2_SDA 0x4001b8b1
841 >;
842 };
843
844 pinctrl_i2c2_2: i2c2grp-2 {
845 fsl,pins = <
846 MX6QDL_PAD_KEY_COL3__I2C2_SCL 0x4001b8b1
847 MX6QDL_PAD_KEY_ROW3__I2C2_SDA 0x4001b8b1
848 >;
849 };
850
851 pinctrl_i2c2_3: i2c2grp-3 {
852 fsl,pins = <
853 MX6QDL_PAD_EIM_EB2__I2C2_SCL 0x4001b8b1
854 MX6QDL_PAD_KEY_ROW3__I2C2_SDA 0x4001b8b1
855 >;
856 };
857 };
858
859 i2c3 {
860 pinctrl_i2c3_1: i2c3grp-1 {
861 fsl,pins = <
862 MX6QDL_PAD_EIM_D17__I2C3_SCL 0x4001b8b1
863 MX6QDL_PAD_EIM_D18__I2C3_SDA 0x4001b8b1
864 >;
865 };
866
867 pinctrl_i2c3_2: i2c3grp-2 {
868 fsl,pins = <
869 MX6QDL_PAD_GPIO_3__I2C3_SCL 0x4001b8b1
870 MX6QDL_PAD_GPIO_6__I2C3_SDA 0x4001b8b1
871 >;
872 };
873
874 pinctrl_i2c3_3: i2c3grp-3 {
875 fsl,pins = <
876 MX6QDL_PAD_GPIO_5__I2C3_SCL 0x4001b8b1
877 MX6QDL_PAD_GPIO_16__I2C3_SDA 0x4001b8b1
878 >;
879 };
880
881 pinctrl_i2c3_4: i2c3grp-4 {
882 fsl,pins = <
883 MX6QDL_PAD_GPIO_3__I2C3_SCL 0x4001b8b1
884 MX6QDL_PAD_EIM_D18__I2C3_SDA 0x4001b8b1
885 >;
886 };
887 };
888
889 ipu1 {
890 pinctrl_ipu1_1: ipu1grp-1 {
891 fsl,pins = <
892 MX6QDL_PAD_DI0_DISP_CLK__IPU1_DI0_DISP_CLK 0x10
893 MX6QDL_PAD_DI0_PIN15__IPU1_DI0_PIN15 0x10
894 MX6QDL_PAD_DI0_PIN2__IPU1_DI0_PIN02 0x10
895 MX6QDL_PAD_DI0_PIN3__IPU1_DI0_PIN03 0x10
896 MX6QDL_PAD_DI0_PIN4__IPU1_DI0_PIN04 0x80000000
897 MX6QDL_PAD_DISP0_DAT0__IPU1_DISP0_DATA00 0x10
898 MX6QDL_PAD_DISP0_DAT1__IPU1_DISP0_DATA01 0x10
899 MX6QDL_PAD_DISP0_DAT2__IPU1_DISP0_DATA02 0x10
900 MX6QDL_PAD_DISP0_DAT3__IPU1_DISP0_DATA03 0x10
901 MX6QDL_PAD_DISP0_DAT4__IPU1_DISP0_DATA04 0x10
902 MX6QDL_PAD_DISP0_DAT5__IPU1_DISP0_DATA05 0x10
903 MX6QDL_PAD_DISP0_DAT6__IPU1_DISP0_DATA06 0x10
904 MX6QDL_PAD_DISP0_DAT7__IPU1_DISP0_DATA07 0x10
905 MX6QDL_PAD_DISP0_DAT8__IPU1_DISP0_DATA08 0x10
906 MX6QDL_PAD_DISP0_DAT9__IPU1_DISP0_DATA09 0x10
907 MX6QDL_PAD_DISP0_DAT10__IPU1_DISP0_DATA10 0x10
908 MX6QDL_PAD_DISP0_DAT11__IPU1_DISP0_DATA11 0x10
909 MX6QDL_PAD_DISP0_DAT12__IPU1_DISP0_DATA12 0x10
910 MX6QDL_PAD_DISP0_DAT13__IPU1_DISP0_DATA13 0x10
911 MX6QDL_PAD_DISP0_DAT14__IPU1_DISP0_DATA14 0x10
912 MX6QDL_PAD_DISP0_DAT15__IPU1_DISP0_DATA15 0x10
913 MX6QDL_PAD_DISP0_DAT16__IPU1_DISP0_DATA16 0x10
914 MX6QDL_PAD_DISP0_DAT17__IPU1_DISP0_DATA17 0x10
915 MX6QDL_PAD_DISP0_DAT18__IPU1_DISP0_DATA18 0x10
916 MX6QDL_PAD_DISP0_DAT19__IPU1_DISP0_DATA19 0x10
917 MX6QDL_PAD_DISP0_DAT20__IPU1_DISP0_DATA20 0x10
918 MX6QDL_PAD_DISP0_DAT21__IPU1_DISP0_DATA21 0x10
919 MX6QDL_PAD_DISP0_DAT22__IPU1_DISP0_DATA22 0x10
920 MX6QDL_PAD_DISP0_DAT23__IPU1_DISP0_DATA23 0x10
921 >;
922 };
923
924 pinctrl_ipu1_2: ipu1grp-2 { /* parallel camera */
925 fsl,pins = <
926 MX6QDL_PAD_CSI0_DAT12__IPU1_CSI0_DATA12 0x80000000
927 MX6QDL_PAD_CSI0_DAT13__IPU1_CSI0_DATA13 0x80000000
928 MX6QDL_PAD_CSI0_DAT14__IPU1_CSI0_DATA14 0x80000000
929 MX6QDL_PAD_CSI0_DAT15__IPU1_CSI0_DATA15 0x80000000
930 MX6QDL_PAD_CSI0_DAT16__IPU1_CSI0_DATA16 0x80000000
931 MX6QDL_PAD_CSI0_DAT17__IPU1_CSI0_DATA17 0x80000000
932 MX6QDL_PAD_CSI0_DAT18__IPU1_CSI0_DATA18 0x80000000
933 MX6QDL_PAD_CSI0_DAT19__IPU1_CSI0_DATA19 0x80000000
934 MX6QDL_PAD_CSI0_DATA_EN__IPU1_CSI0_DATA_EN 0x80000000
935 MX6QDL_PAD_CSI0_PIXCLK__IPU1_CSI0_PIXCLK 0x80000000
936 MX6QDL_PAD_CSI0_MCLK__IPU1_CSI0_HSYNC 0x80000000
937 MX6QDL_PAD_CSI0_VSYNC__IPU1_CSI0_VSYNC 0x80000000
938 >;
939 };
940
941 pinctrl_ipu1_3: ipu1grp-3 { /* parallel port 16-bit */
942 fsl,pins = <
943 MX6QDL_PAD_CSI0_DAT4__IPU1_CSI0_DATA04 0x80000000
944 MX6QDL_PAD_CSI0_DAT5__IPU1_CSI0_DATA05 0x80000000
945 MX6QDL_PAD_CSI0_DAT6__IPU1_CSI0_DATA06 0x80000000
946 MX6QDL_PAD_CSI0_DAT7__IPU1_CSI0_DATA07 0x80000000
947 MX6QDL_PAD_CSI0_DAT8__IPU1_CSI0_DATA08 0x80000000
948 MX6QDL_PAD_CSI0_DAT9__IPU1_CSI0_DATA09 0x80000000
949 MX6QDL_PAD_CSI0_DAT10__IPU1_CSI0_DATA10 0x80000000
950 MX6QDL_PAD_CSI0_DAT11__IPU1_CSI0_DATA11 0x80000000
951 MX6QDL_PAD_CSI0_DAT12__IPU1_CSI0_DATA12 0x80000000
952 MX6QDL_PAD_CSI0_DAT13__IPU1_CSI0_DATA13 0x80000000
953 MX6QDL_PAD_CSI0_DAT14__IPU1_CSI0_DATA14 0x80000000
954 MX6QDL_PAD_CSI0_DAT15__IPU1_CSI0_DATA15 0x80000000
955 MX6QDL_PAD_CSI0_DAT16__IPU1_CSI0_DATA16 0x80000000
956 MX6QDL_PAD_CSI0_DAT17__IPU1_CSI0_DATA17 0x80000000
957 MX6QDL_PAD_CSI0_DAT18__IPU1_CSI0_DATA18 0x80000000
958 MX6QDL_PAD_CSI0_DAT19__IPU1_CSI0_DATA19 0x80000000
959 MX6QDL_PAD_CSI0_PIXCLK__IPU1_CSI0_PIXCLK 0x80000000
960 MX6QDL_PAD_CSI0_MCLK__IPU1_CSI0_HSYNC 0x80000000
961 MX6QDL_PAD_CSI0_VSYNC__IPU1_CSI0_VSYNC 0x80000000
962 >;
963 };
964 };
965
966 mlb {
967 pinctrl_mlb_1: mlbgrp-1 {
968 fsl,pins = <
969 MX6QDL_PAD_GPIO_3__MLB_CLK 0x71
970 MX6QDL_PAD_GPIO_6__MLB_SIG 0x71
971 MX6QDL_PAD_GPIO_2__MLB_DATA 0x71
972 >;
973 };
974
975 pinctrl_mlb_2: mlbgrp-2 {
976 fsl,pins = <
977 MX6QDL_PAD_ENET_TXD1__MLB_CLK 0x71
978 MX6QDL_PAD_GPIO_6__MLB_SIG 0x71
979 MX6QDL_PAD_GPIO_2__MLB_DATA 0x71
980 >;
981 };
982 };
983
984 pwm0 {
985 pinctrl_pwm0_1: pwm0grp-1 {
986 fsl,pins = <
987 MX6QDL_PAD_SD1_DAT3__PWM1_OUT 0x1b0b1
988 >;
989 };
990 };
991
992 pwm3 {
993 pinctrl_pwm3_1: pwm3grp-1 {
994 fsl,pins = <
995 MX6QDL_PAD_SD4_DAT1__PWM3_OUT 0x1b0b1
996 >;
997 };
998 };
999
1000 spdif {
1001 pinctrl_spdif_1: spdifgrp-1 {
1002 fsl,pins = <
1003 MX6QDL_PAD_KEY_COL3__SPDIF_IN 0x1b0b0
1004 >;
1005 };
1006
1007 pinctrl_spdif_2: spdifgrp-2 {
1008 fsl,pins = <
1009 MX6QDL_PAD_GPIO_16__SPDIF_IN 0x1b0b0
1010 MX6QDL_PAD_GPIO_17__SPDIF_OUT 0x1b0b0
1011 >;
1012 };
1013 };
1014
1015 uart1 {
1016 pinctrl_uart1_1: uart1grp-1 {
1017 fsl,pins = <
1018 MX6QDL_PAD_CSI0_DAT10__UART1_TX_DATA 0x1b0b1
1019 MX6QDL_PAD_CSI0_DAT11__UART1_RX_DATA 0x1b0b1
1020 >;
1021 };
1022 };
1023
1024 uart2 {
1025 pinctrl_uart2_1: uart2grp-1 {
1026 fsl,pins = <
1027 MX6QDL_PAD_EIM_D26__UART2_TX_DATA 0x1b0b1
1028 MX6QDL_PAD_EIM_D27__UART2_RX_DATA 0x1b0b1
1029 >;
1030 };
1031
1032 pinctrl_uart2_2: uart2grp-2 { /* DTE mode */
1033 fsl,pins = <
1034 MX6QDL_PAD_EIM_D26__UART2_RX_DATA 0x1b0b1
1035 MX6QDL_PAD_EIM_D27__UART2_TX_DATA 0x1b0b1
1036 MX6QDL_PAD_EIM_D28__UART2_DTE_CTS_B 0x1b0b1
1037 MX6QDL_PAD_EIM_D29__UART2_DTE_RTS_B 0x1b0b1
1038 >;
1039 };
1040 };
1041
1042 uart3 {
1043 pinctrl_uart3_1: uart3grp-1 {
1044 fsl,pins = <
1045 MX6QDL_PAD_SD4_CLK__UART3_RX_DATA 0x1b0b1
1046 MX6QDL_PAD_SD4_CMD__UART3_TX_DATA 0x1b0b1
1047 MX6QDL_PAD_EIM_D30__UART3_CTS_B 0x1b0b1
1048 MX6QDL_PAD_EIM_EB3__UART3_RTS_B 0x1b0b1
1049 >;
1050 };
1051
1052 pinctrl_uart3_2: uart3grp-2 {
1053 fsl,pins = <
1054 MX6QDL_PAD_EIM_D24__UART3_TX_DATA 0x1b0b1
1055 MX6QDL_PAD_EIM_D25__UART3_RX_DATA 0x1b0b1
1056 MX6QDL_PAD_EIM_D23__UART3_CTS_B 0x1b0b1
1057 MX6QDL_PAD_EIM_EB3__UART3_RTS_B 0x1b0b1
1058 >;
1059 };
1060 };
1061
1062 uart4 {
1063 pinctrl_uart4_1: uart4grp-1 {
1064 fsl,pins = <
1065 MX6QDL_PAD_KEY_COL0__UART4_TX_DATA 0x1b0b1
1066 MX6QDL_PAD_KEY_ROW0__UART4_RX_DATA 0x1b0b1
1067 >;
1068 };
1069 };
1070
1071 usbotg {
1072 pinctrl_usbotg_1: usbotggrp-1 {
1073 fsl,pins = <
1074 MX6QDL_PAD_GPIO_1__USB_OTG_ID 0x17059
1075 >;
1076 };
1077
1078 pinctrl_usbotg_2: usbotggrp-2 {
1079 fsl,pins = <
1080 MX6QDL_PAD_ENET_RX_ER__USB_OTG_ID 0x17059
1081 >;
1082 };
1083 };
1084
1085 usbh2 {
1086 pinctrl_usbh2_1: usbh2grp-1 {
1087 fsl,pins = <
1088 MX6QDL_PAD_RGMII_TXC__USB_H2_DATA 0x40013030
1089 MX6QDL_PAD_RGMII_TX_CTL__USB_H2_STROBE 0x40013030
1090 >;
1091 };
1092
1093 pinctrl_usbh2_2: usbh2grp-2 {
1094 fsl,pins = <
1095 MX6QDL_PAD_RGMII_TX_CTL__USB_H2_STROBE 0x40017030
1096 >;
1097 };
1098 };
1099
1100 usbh3 {
1101 pinctrl_usbh3_1: usbh3grp-1 {
1102 fsl,pins = <
1103 MX6QDL_PAD_RGMII_RX_CTL__USB_H3_DATA 0x40013030
1104 MX6QDL_PAD_RGMII_RXC__USB_H3_STROBE 0x40013030
1105 >;
1106 };
1107
1108 pinctrl_usbh3_2: usbh3grp-2 {
1109 fsl,pins = <
1110 MX6QDL_PAD_RGMII_RXC__USB_H3_STROBE 0x40017030
1111 >;
1112 };
1113 };
1114
1115 usdhc1 {
1116 pinctrl_usdhc1_1: usdhc1grp-1 {
1117 fsl,pins = <
1118 MX6QDL_PAD_SD1_CMD__SD1_CMD 0x17059
1119 MX6QDL_PAD_SD1_CLK__SD1_CLK 0x10059
1120 MX6QDL_PAD_SD1_DAT0__SD1_DATA0 0x17059
1121 MX6QDL_PAD_SD1_DAT1__SD1_DATA1 0x17059
1122 MX6QDL_PAD_SD1_DAT2__SD1_DATA2 0x17059
1123 MX6QDL_PAD_SD1_DAT3__SD1_DATA3 0x17059
1124 MX6QDL_PAD_NANDF_D0__SD1_DATA4 0x17059
1125 MX6QDL_PAD_NANDF_D1__SD1_DATA5 0x17059
1126 MX6QDL_PAD_NANDF_D2__SD1_DATA6 0x17059
1127 MX6QDL_PAD_NANDF_D3__SD1_DATA7 0x17059
1128 >;
1129 };
1130
1131 pinctrl_usdhc1_2: usdhc1grp-2 {
1132 fsl,pins = <
1133 MX6QDL_PAD_SD1_CMD__SD1_CMD 0x17059
1134 MX6QDL_PAD_SD1_CLK__SD1_CLK 0x10059
1135 MX6QDL_PAD_SD1_DAT0__SD1_DATA0 0x17059
1136 MX6QDL_PAD_SD1_DAT1__SD1_DATA1 0x17059
1137 MX6QDL_PAD_SD1_DAT2__SD1_DATA2 0x17059
1138 MX6QDL_PAD_SD1_DAT3__SD1_DATA3 0x17059
1139 >;
1140 };
1141 };
1142
1143 usdhc2 {
1144 pinctrl_usdhc2_1: usdhc2grp-1 {
1145 fsl,pins = <
1146 MX6QDL_PAD_SD2_CMD__SD2_CMD 0x17059
1147 MX6QDL_PAD_SD2_CLK__SD2_CLK 0x10059
1148 MX6QDL_PAD_SD2_DAT0__SD2_DATA0 0x17059
1149 MX6QDL_PAD_SD2_DAT1__SD2_DATA1 0x17059
1150 MX6QDL_PAD_SD2_DAT2__SD2_DATA2 0x17059
1151 MX6QDL_PAD_SD2_DAT3__SD2_DATA3 0x17059
1152 MX6QDL_PAD_NANDF_D4__SD2_DATA4 0x17059
1153 MX6QDL_PAD_NANDF_D5__SD2_DATA5 0x17059
1154 MX6QDL_PAD_NANDF_D6__SD2_DATA6 0x17059
1155 MX6QDL_PAD_NANDF_D7__SD2_DATA7 0x17059
1156 >;
1157 };
1158
1159 pinctrl_usdhc2_2: usdhc2grp-2 {
1160 fsl,pins = <
1161 MX6QDL_PAD_SD2_CMD__SD2_CMD 0x17059
1162 MX6QDL_PAD_SD2_CLK__SD2_CLK 0x10059
1163 MX6QDL_PAD_SD2_DAT0__SD2_DATA0 0x17059
1164 MX6QDL_PAD_SD2_DAT1__SD2_DATA1 0x17059
1165 MX6QDL_PAD_SD2_DAT2__SD2_DATA2 0x17059
1166 MX6QDL_PAD_SD2_DAT3__SD2_DATA3 0x17059
1167 >;
1168 };
1169 };
1170
1171 usdhc3 {
1172 pinctrl_usdhc3_1: usdhc3grp-1 {
1173 fsl,pins = <
1174 MX6QDL_PAD_SD3_CMD__SD3_CMD 0x17059
1175 MX6QDL_PAD_SD3_CLK__SD3_CLK 0x10059
1176 MX6QDL_PAD_SD3_DAT0__SD3_DATA0 0x17059
1177 MX6QDL_PAD_SD3_DAT1__SD3_DATA1 0x17059
1178 MX6QDL_PAD_SD3_DAT2__SD3_DATA2 0x17059
1179 MX6QDL_PAD_SD3_DAT3__SD3_DATA3 0x17059
1180 MX6QDL_PAD_SD3_DAT4__SD3_DATA4 0x17059
1181 MX6QDL_PAD_SD3_DAT5__SD3_DATA5 0x17059
1182 MX6QDL_PAD_SD3_DAT6__SD3_DATA6 0x17059
1183 MX6QDL_PAD_SD3_DAT7__SD3_DATA7 0x17059
1184 >;
1185 };
1186
1187 pinctrl_usdhc3_2: usdhc3grp-2 {
1188 fsl,pins = <
1189 MX6QDL_PAD_SD3_CMD__SD3_CMD 0x17059
1190 MX6QDL_PAD_SD3_CLK__SD3_CLK 0x10059
1191 MX6QDL_PAD_SD3_DAT0__SD3_DATA0 0x17059
1192 MX6QDL_PAD_SD3_DAT1__SD3_DATA1 0x17059
1193 MX6QDL_PAD_SD3_DAT2__SD3_DATA2 0x17059
1194 MX6QDL_PAD_SD3_DAT3__SD3_DATA3 0x17059
1195 >;
1196 };
1197 };
1198
1199 usdhc4 {
1200 pinctrl_usdhc4_1: usdhc4grp-1 {
1201 fsl,pins = <
1202 MX6QDL_PAD_SD4_CMD__SD4_CMD 0x17059
1203 MX6QDL_PAD_SD4_CLK__SD4_CLK 0x10059
1204 MX6QDL_PAD_SD4_DAT0__SD4_DATA0 0x17059
1205 MX6QDL_PAD_SD4_DAT1__SD4_DATA1 0x17059
1206 MX6QDL_PAD_SD4_DAT2__SD4_DATA2 0x17059
1207 MX6QDL_PAD_SD4_DAT3__SD4_DATA3 0x17059
1208 MX6QDL_PAD_SD4_DAT4__SD4_DATA4 0x17059
1209 MX6QDL_PAD_SD4_DAT5__SD4_DATA5 0x17059
1210 MX6QDL_PAD_SD4_DAT6__SD4_DATA6 0x17059
1211 MX6QDL_PAD_SD4_DAT7__SD4_DATA7 0x17059
1212 >;
1213 };
1214
1215 pinctrl_usdhc4_2: usdhc4grp-2 {
1216 fsl,pins = <
1217 MX6QDL_PAD_SD4_CMD__SD4_CMD 0x17059
1218 MX6QDL_PAD_SD4_CLK__SD4_CLK 0x10059
1219 MX6QDL_PAD_SD4_DAT0__SD4_DATA0 0x17059
1220 MX6QDL_PAD_SD4_DAT1__SD4_DATA1 0x17059
1221 MX6QDL_PAD_SD4_DAT2__SD4_DATA2 0x17059
1222 MX6QDL_PAD_SD4_DAT3__SD4_DATA3 0x17059
1223 >;
1224 };
1225 };
1226
1227 weim {
1228 pinctrl_weim_cs0_1: weim_cs0grp-1 {
1229 fsl,pins = <
1230 MX6QDL_PAD_EIM_CS0__EIM_CS0_B 0xb0b1
1231 >;
1232 };
1233
1234 pinctrl_weim_nor_1: weim_norgrp-1 {
1235 fsl,pins = <
1236 MX6QDL_PAD_EIM_OE__EIM_OE_B 0xb0b1
1237 MX6QDL_PAD_EIM_RW__EIM_RW 0xb0b1
1238 MX6QDL_PAD_EIM_WAIT__EIM_WAIT_B 0xb060
1239 /* data */
1240 MX6QDL_PAD_EIM_D16__EIM_DATA16 0x1b0b0
1241 MX6QDL_PAD_EIM_D17__EIM_DATA17 0x1b0b0
1242 MX6QDL_PAD_EIM_D18__EIM_DATA18 0x1b0b0
1243 MX6QDL_PAD_EIM_D19__EIM_DATA19 0x1b0b0
1244 MX6QDL_PAD_EIM_D20__EIM_DATA20 0x1b0b0
1245 MX6QDL_PAD_EIM_D21__EIM_DATA21 0x1b0b0
1246 MX6QDL_PAD_EIM_D22__EIM_DATA22 0x1b0b0
1247 MX6QDL_PAD_EIM_D23__EIM_DATA23 0x1b0b0
1248 MX6QDL_PAD_EIM_D24__EIM_DATA24 0x1b0b0
1249 MX6QDL_PAD_EIM_D25__EIM_DATA25 0x1b0b0
1250 MX6QDL_PAD_EIM_D26__EIM_DATA26 0x1b0b0
1251 MX6QDL_PAD_EIM_D27__EIM_DATA27 0x1b0b0
1252 MX6QDL_PAD_EIM_D28__EIM_DATA28 0x1b0b0
1253 MX6QDL_PAD_EIM_D29__EIM_DATA29 0x1b0b0
1254 MX6QDL_PAD_EIM_D30__EIM_DATA30 0x1b0b0
1255 MX6QDL_PAD_EIM_D31__EIM_DATA31 0x1b0b0
1256 /* address */
1257 MX6QDL_PAD_EIM_A23__EIM_ADDR23 0xb0b1
1258 MX6QDL_PAD_EIM_A22__EIM_ADDR22 0xb0b1
1259 MX6QDL_PAD_EIM_A21__EIM_ADDR21 0xb0b1
1260 MX6QDL_PAD_EIM_A20__EIM_ADDR20 0xb0b1
1261 MX6QDL_PAD_EIM_A19__EIM_ADDR19 0xb0b1
1262 MX6QDL_PAD_EIM_A18__EIM_ADDR18 0xb0b1
1263 MX6QDL_PAD_EIM_A17__EIM_ADDR17 0xb0b1
1264 MX6QDL_PAD_EIM_A16__EIM_ADDR16 0xb0b1
1265 MX6QDL_PAD_EIM_DA15__EIM_AD15 0xb0b1
1266 MX6QDL_PAD_EIM_DA14__EIM_AD14 0xb0b1
1267 MX6QDL_PAD_EIM_DA13__EIM_AD13 0xb0b1
1268 MX6QDL_PAD_EIM_DA12__EIM_AD12 0xb0b1
1269 MX6QDL_PAD_EIM_DA11__EIM_AD11 0xb0b1
1270 MX6QDL_PAD_EIM_DA10__EIM_AD10 0xb0b1
1271 MX6QDL_PAD_EIM_DA9__EIM_AD09 0xb0b1
1272 MX6QDL_PAD_EIM_DA8__EIM_AD08 0xb0b1
1273 MX6QDL_PAD_EIM_DA7__EIM_AD07 0xb0b1
1274 MX6QDL_PAD_EIM_DA6__EIM_AD06 0xb0b1
1275 MX6QDL_PAD_EIM_DA5__EIM_AD05 0xb0b1
1276 MX6QDL_PAD_EIM_DA4__EIM_AD04 0xb0b1
1277 MX6QDL_PAD_EIM_DA3__EIM_AD03 0xb0b1
1278 MX6QDL_PAD_EIM_DA2__EIM_AD02 0xb0b1
1279 MX6QDL_PAD_EIM_DA1__EIM_AD01 0xb0b1
1280 MX6QDL_PAD_EIM_DA0__EIM_AD00 0xb0b1
1281 >;
1282 };
1283 };
1284 };
1285
549 ldb: ldb@020e0008 { 1286 ldb: ldb@020e0008 {
550 #address-cells = <1>; 1287 #address-cells = <1>;
551 #size-cells = <0>; 1288 #size-cells = <0>;
@@ -555,13 +1292,11 @@
555 1292
556 lvds-channel@0 { 1293 lvds-channel@0 {
557 reg = <0>; 1294 reg = <0>;
558 crtcs = <&ipu1 0>;
559 status = "disabled"; 1295 status = "disabled";
560 }; 1296 };
561 1297
562 lvds-channel@1 { 1298 lvds-channel@1 {
563 reg = <1>; 1299 reg = <1>;
564 crtcs = <&ipu1 1>;
565 status = "disabled"; 1300 status = "disabled";
566 }; 1301 };
567 }; 1302 };
@@ -582,6 +1317,7 @@
582 interrupts = <0 2 0x04>; 1317 interrupts = <0 2 0x04>;
583 clocks = <&clks 155>, <&clks 155>; 1318 clocks = <&clks 155>, <&clks 155>;
584 clock-names = "ipg", "ahb"; 1319 clock-names = "ipg", "ahb";
1320 #dma-cells = <3>;
585 fsl,sdma-ram-script-name = "imx/sdma/sdma-imx6q.bin"; 1321 fsl,sdma-ram-script-name = "imx/sdma/sdma-imx6q.bin";
586 }; 1322 };
587 }; 1323 };
@@ -751,8 +1487,8 @@
751 clocks = <&clks 196>; 1487 clocks = <&clks 196>;
752 }; 1488 };
753 1489
754 ocotp@021bc000 { 1490 ocotp: ocotp@021bc000 {
755 compatible = "fsl,imx6q-ocotp"; 1491 compatible = "fsl,imx6q-ocotp", "syscon";
756 reg = <0x021bc000 0x4000>; 1492 reg = <0x021bc000 0x4000>;
757 }; 1493 };
758 1494
@@ -791,6 +1527,8 @@
791 interrupts = <0 27 0x04>; 1527 interrupts = <0 27 0x04>;
792 clocks = <&clks 160>, <&clks 161>; 1528 clocks = <&clks 160>, <&clks 161>;
793 clock-names = "ipg", "per"; 1529 clock-names = "ipg", "per";
1530 dmas = <&sdma 27 4 0>, <&sdma 28 4 0>;
1531 dma-names = "rx", "tx";
794 status = "disabled"; 1532 status = "disabled";
795 }; 1533 };
796 1534
@@ -800,6 +1538,8 @@
800 interrupts = <0 28 0x04>; 1538 interrupts = <0 28 0x04>;
801 clocks = <&clks 160>, <&clks 161>; 1539 clocks = <&clks 160>, <&clks 161>;
802 clock-names = "ipg", "per"; 1540 clock-names = "ipg", "per";
1541 dmas = <&sdma 29 4 0>, <&sdma 30 4 0>;
1542 dma-names = "rx", "tx";
803 status = "disabled"; 1543 status = "disabled";
804 }; 1544 };
805 1545
@@ -809,6 +1549,8 @@
809 interrupts = <0 29 0x04>; 1549 interrupts = <0 29 0x04>;
810 clocks = <&clks 160>, <&clks 161>; 1550 clocks = <&clks 160>, <&clks 161>;
811 clock-names = "ipg", "per"; 1551 clock-names = "ipg", "per";
1552 dmas = <&sdma 31 4 0>, <&sdma 32 4 0>;
1553 dma-names = "rx", "tx";
812 status = "disabled"; 1554 status = "disabled";
813 }; 1555 };
814 1556
@@ -818,6 +1560,8 @@
818 interrupts = <0 30 0x04>; 1560 interrupts = <0 30 0x04>;
819 clocks = <&clks 160>, <&clks 161>; 1561 clocks = <&clks 160>, <&clks 161>;
820 clock-names = "ipg", "per"; 1562 clock-names = "ipg", "per";
1563 dmas = <&sdma 33 4 0>, <&sdma 34 4 0>;
1564 dma-names = "rx", "tx";
821 status = "disabled"; 1565 status = "disabled";
822 }; 1566 };
823 }; 1567 };
diff --git a/arch/arm/boot/dts/imx6sl.dtsi b/arch/arm/boot/dts/imx6sl.dtsi
index c5e5da02d7e3..c46651e4d966 100644
--- a/arch/arm/boot/dts/imx6sl.dtsi
+++ b/arch/arm/boot/dts/imx6sl.dtsi
@@ -152,32 +152,41 @@
152 }; 152 };
153 153
154 uart5: serial@02018000 { 154 uart5: serial@02018000 {
155 compatible = "fsl,imx6sl-uart", "fsl,imx21-uart"; 155 compatible = "fsl,imx6sl-uart",
156 "fsl,imx6q-uart", "fsl,imx21-uart";
156 reg = <0x02018000 0x4000>; 157 reg = <0x02018000 0x4000>;
157 interrupts = <0 30 0x04>; 158 interrupts = <0 30 0x04>;
158 clocks = <&clks IMX6SL_CLK_UART>, 159 clocks = <&clks IMX6SL_CLK_UART>,
159 <&clks IMX6SL_CLK_UART_SERIAL>; 160 <&clks IMX6SL_CLK_UART_SERIAL>;
160 clock-names = "ipg", "per"; 161 clock-names = "ipg", "per";
162 dmas = <&sdma 33 4 0>, <&sdma 34 4 0>;
163 dma-names = "rx", "tx";
161 status = "disabled"; 164 status = "disabled";
162 }; 165 };
163 166
164 uart1: serial@02020000 { 167 uart1: serial@02020000 {
165 compatible = "fsl,imx6sl-uart", "fsl,imx21-uart"; 168 compatible = "fsl,imx6sl-uart",
169 "fsl,imx6q-uart", "fsl,imx21-uart";
166 reg = <0x02020000 0x4000>; 170 reg = <0x02020000 0x4000>;
167 interrupts = <0 26 0x04>; 171 interrupts = <0 26 0x04>;
168 clocks = <&clks IMX6SL_CLK_UART>, 172 clocks = <&clks IMX6SL_CLK_UART>,
169 <&clks IMX6SL_CLK_UART_SERIAL>; 173 <&clks IMX6SL_CLK_UART_SERIAL>;
170 clock-names = "ipg", "per"; 174 clock-names = "ipg", "per";
175 dmas = <&sdma 25 4 0>, <&sdma 26 4 0>;
176 dma-names = "rx", "tx";
171 status = "disabled"; 177 status = "disabled";
172 }; 178 };
173 179
174 uart2: serial@02024000 { 180 uart2: serial@02024000 {
175 compatible = "fsl,imx6sl-uart", "fsl,imx21-uart"; 181 compatible = "fsl,imx6sl-uart",
182 "fsl,imx6q-uart", "fsl,imx21-uart";
176 reg = <0x02024000 0x4000>; 183 reg = <0x02024000 0x4000>;
177 interrupts = <0 27 0x04>; 184 interrupts = <0 27 0x04>;
178 clocks = <&clks IMX6SL_CLK_UART>, 185 clocks = <&clks IMX6SL_CLK_UART>,
179 <&clks IMX6SL_CLK_UART_SERIAL>; 186 <&clks IMX6SL_CLK_UART_SERIAL>;
180 clock-names = "ipg", "per"; 187 clock-names = "ipg", "per";
188 dmas = <&sdma 27 4 0>, <&sdma 28 4 0>;
189 dma-names = "rx", "tx";
181 status = "disabled"; 190 status = "disabled";
182 }; 191 };
183 192
@@ -186,6 +195,9 @@
186 reg = <0x02028000 0x4000>; 195 reg = <0x02028000 0x4000>;
187 interrupts = <0 46 0x04>; 196 interrupts = <0 46 0x04>;
188 clocks = <&clks IMX6SL_CLK_SSI1>; 197 clocks = <&clks IMX6SL_CLK_SSI1>;
198 dmas = <&sdma 37 1 0>,
199 <&sdma 38 1 0>;
200 dma-names = "rx", "tx";
189 fsl,fifo-depth = <15>; 201 fsl,fifo-depth = <15>;
190 status = "disabled"; 202 status = "disabled";
191 }; 203 };
@@ -195,6 +207,9 @@
195 reg = <0x0202c000 0x4000>; 207 reg = <0x0202c000 0x4000>;
196 interrupts = <0 47 0x04>; 208 interrupts = <0 47 0x04>;
197 clocks = <&clks IMX6SL_CLK_SSI2>; 209 clocks = <&clks IMX6SL_CLK_SSI2>;
210 dmas = <&sdma 41 1 0>,
211 <&sdma 42 1 0>;
212 dma-names = "rx", "tx";
198 fsl,fifo-depth = <15>; 213 fsl,fifo-depth = <15>;
199 status = "disabled"; 214 status = "disabled";
200 }; 215 };
@@ -204,27 +219,36 @@
204 reg = <0x02030000 0x4000>; 219 reg = <0x02030000 0x4000>;
205 interrupts = <0 48 0x04>; 220 interrupts = <0 48 0x04>;
206 clocks = <&clks IMX6SL_CLK_SSI3>; 221 clocks = <&clks IMX6SL_CLK_SSI3>;
222 dmas = <&sdma 45 1 0>,
223 <&sdma 46 1 0>;
224 dma-names = "rx", "tx";
207 fsl,fifo-depth = <15>; 225 fsl,fifo-depth = <15>;
208 status = "disabled"; 226 status = "disabled";
209 }; 227 };
210 228
211 uart3: serial@02034000 { 229 uart3: serial@02034000 {
212 compatible = "fsl,imx6sl-uart", "fsl,imx21-uart"; 230 compatible = "fsl,imx6sl-uart",
231 "fsl,imx6q-uart", "fsl,imx21-uart";
213 reg = <0x02034000 0x4000>; 232 reg = <0x02034000 0x4000>;
214 interrupts = <0 28 0x04>; 233 interrupts = <0 28 0x04>;
215 clocks = <&clks IMX6SL_CLK_UART>, 234 clocks = <&clks IMX6SL_CLK_UART>,
216 <&clks IMX6SL_CLK_UART_SERIAL>; 235 <&clks IMX6SL_CLK_UART_SERIAL>;
217 clock-names = "ipg", "per"; 236 clock-names = "ipg", "per";
237 dmas = <&sdma 29 4 0>, <&sdma 30 4 0>;
238 dma-names = "rx", "tx";
218 status = "disabled"; 239 status = "disabled";
219 }; 240 };
220 241
221 uart4: serial@02038000 { 242 uart4: serial@02038000 {
222 compatible = "fsl,imx6sl-uart", "fsl,imx21-uart"; 243 compatible = "fsl,imx6sl-uart",
244 "fsl,imx6q-uart", "fsl,imx21-uart";
223 reg = <0x02038000 0x4000>; 245 reg = <0x02038000 0x4000>;
224 interrupts = <0 29 0x04>; 246 interrupts = <0 29 0x04>;
225 clocks = <&clks IMX6SL_CLK_UART>, 247 clocks = <&clks IMX6SL_CLK_UART>,
226 <&clks IMX6SL_CLK_UART_SERIAL>; 248 <&clks IMX6SL_CLK_UART_SERIAL>;
227 clock-names = "ipg", "per"; 249 clock-names = "ipg", "per";
250 dmas = <&sdma 31 4 0>, <&sdma 32 4 0>;
251 dma-names = "rx", "tx";
228 status = "disabled"; 252 status = "disabled";
229 }; 253 };
230 }; 254 };
@@ -594,6 +618,7 @@
594 clocks = <&clks IMX6SL_CLK_SDMA>, 618 clocks = <&clks IMX6SL_CLK_SDMA>,
595 <&clks IMX6SL_CLK_SDMA>; 619 <&clks IMX6SL_CLK_SDMA>;
596 clock-names = "ipg", "ahb"; 620 clock-names = "ipg", "ahb";
621 #dma-cells = <3>;
597 fsl,sdma-ram-script-name = "imx/sdma/sdma-imx6sl.bin"; 622 fsl,sdma-ram-script-name = "imx/sdma/sdma-imx6sl.bin";
598 }; 623 };
599 624
diff --git a/arch/arm/boot/dts/keystone.dts b/arch/arm/boot/dts/keystone.dts
index 1334b42c6b77..a68e34bbecb2 100644
--- a/arch/arm/boot/dts/keystone.dts
+++ b/arch/arm/boot/dts/keystone.dts
@@ -7,7 +7,9 @@
7 */ 7 */
8 8
9/dts-v1/; 9/dts-v1/;
10/include/ "skeleton.dtsi" 10#include <dt-bindings/interrupt-controller/arm-gic.h>
11
12#include "skeleton.dtsi"
11 13
12/ { 14/ {
13 model = "Texas Instruments Keystone 2 SoC"; 15 model = "Texas Instruments Keystone 2 SoC";
@@ -67,18 +69,23 @@
67 69
68 timer { 70 timer {
69 compatible = "arm,armv7-timer"; 71 compatible = "arm,armv7-timer";
70 interrupts = <1 13 0xf08>, 72 interrupts =
71 <1 14 0xf08>, 73 <GIC_PPI 13
72 <1 11 0xf08>, 74 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
73 <1 10 0x308>; 75 <GIC_PPI 14
76 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
77 <GIC_PPI 11
78 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
79 <GIC_PPI 10
80 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>;
74 }; 81 };
75 82
76 pmu { 83 pmu {
77 compatible = "arm,cortex-a15-pmu"; 84 compatible = "arm,cortex-a15-pmu";
78 interrupts = <0 20 0xf01>, 85 interrupts = <GIC_SPI 20 IRQ_TYPE_EDGE_RISING>,
79 <0 21 0xf01>, 86 <GIC_SPI 21 IRQ_TYPE_EDGE_RISING>,
80 <0 22 0xf01>, 87 <GIC_SPI 22 IRQ_TYPE_EDGE_RISING>,
81 <0 23 0xf01>; 88 <GIC_SPI 23 IRQ_TYPE_EDGE_RISING>;
82 }; 89 };
83 90
84 soc { 91 soc {
@@ -100,7 +107,7 @@
100 reg-io-width = <4>; 107 reg-io-width = <4>;
101 reg = <0x02530c00 0x100>; 108 reg = <0x02530c00 0x100>;
102 clock-frequency = <133120000>; 109 clock-frequency = <133120000>;
103 interrupts = <0 277 0xf01>; 110 interrupts = <GIC_SPI 277 IRQ_TYPE_EDGE_RISING>;
104 }; 111 };
105 112
106 uart1: serial@02531000 { 113 uart1: serial@02531000 {
@@ -110,7 +117,7 @@
110 reg-io-width = <4>; 117 reg-io-width = <4>;
111 reg = <0x02531000 0x100>; 118 reg = <0x02531000 0x100>;
112 clock-frequency = <133120000>; 119 clock-frequency = <133120000>;
113 interrupts = <0 280 0xf01>; 120 interrupts = <GIC_SPI 280 IRQ_TYPE_EDGE_RISING>;
114 }; 121 };
115 122
116 }; 123 };
diff --git a/arch/arm/boot/dts/kirkwood-6281.dtsi b/arch/arm/boot/dts/kirkwood-6281.dtsi
index 1e5bef0bead7..650ef30e1856 100644
--- a/arch/arm/boot/dts/kirkwood-6281.dtsi
+++ b/arch/arm/boot/dts/kirkwood-6281.dtsi
@@ -1,4 +1,39 @@
1/ { 1/ {
2 mbus {
3 pcie-controller {
4 compatible = "marvell,kirkwood-pcie";
5 status = "disabled";
6 device_type = "pci";
7
8 #address-cells = <3>;
9 #size-cells = <2>;
10
11 bus-range = <0x00 0xff>;
12
13 ranges =
14 <0x82000000 0 0x40000 MBUS_ID(0xf0, 0x01) 0x40000 0 0x00002000
15 0x82000000 0x1 0 MBUS_ID(0x04, 0xe8) 0 1 0 /* Port 0.0 MEM */
16 0x81000000 0x1 0 MBUS_ID(0x04, 0xe0) 0 1 0 /* Port 0.0 IO */>;
17
18 pcie@1,0 {
19 device_type = "pci";
20 assigned-addresses = <0x82000800 0 0x00040000 0 0x2000>;
21 reg = <0x0800 0 0 0 0>;
22 #address-cells = <3>;
23 #size-cells = <2>;
24 #interrupt-cells = <1>;
25 ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
26 0x81000000 0 0 0x81000000 0x1 0 1 0>;
27 interrupt-map-mask = <0 0 0 0>;
28 interrupt-map = <0 0 0 0 &intc 9>;
29 marvell,pcie-port = <0>;
30 marvell,pcie-lane = <0>;
31 clocks = <&gate_clk 2>;
32 status = "disabled";
33 };
34 };
35 };
36
2 ocp@f1000000 { 37 ocp@f1000000 {
3 pinctrl: pinctrl@10000 { 38 pinctrl: pinctrl@10000 {
4 compatible = "marvell,88f6281-pinctrl"; 39 compatible = "marvell,88f6281-pinctrl";
@@ -41,37 +76,6 @@
41 }; 76 };
42 }; 77 };
43 78
44 pcie-controller {
45 compatible = "marvell,kirkwood-pcie";
46 status = "disabled";
47 device_type = "pci";
48
49 #address-cells = <3>;
50 #size-cells = <2>;
51
52 bus-range = <0x00 0xff>;
53
54 ranges = <0x82000000 0 0x00040000 0x00040000 0 0x00002000 /* Port 0.0 registers */
55 0x82000000 0 0xe0000000 0xe0000000 0 0x08000000 /* non-prefetchable memory */
56 0x81000000 0 0 0xe8000000 0 0x00100000>; /* downstream I/O */
57
58 pcie@1,0 {
59 device_type = "pci";
60 assigned-addresses = <0x82000800 0 0x00040000 0 0x2000>;
61 reg = <0x0800 0 0 0 0>;
62 #address-cells = <3>;
63 #size-cells = <2>;
64 #interrupt-cells = <1>;
65 ranges;
66 interrupt-map-mask = <0 0 0 0>;
67 interrupt-map = <0 0 0 0 &intc 9>;
68 marvell,pcie-port = <0>;
69 marvell,pcie-lane = <0>;
70 clocks = <&gate_clk 2>;
71 status = "disabled";
72 };
73 };
74
75 rtc@10300 { 79 rtc@10300 {
76 compatible = "marvell,kirkwood-rtc", "marvell,orion-rtc"; 80 compatible = "marvell,kirkwood-rtc", "marvell,orion-rtc";
77 reg = <0x10300 0x20>; 81 reg = <0x10300 0x20>;
diff --git a/arch/arm/boot/dts/kirkwood-6282.dtsi b/arch/arm/boot/dts/kirkwood-6282.dtsi
index a63a11137262..3933a331ddc2 100644
--- a/arch/arm/boot/dts/kirkwood-6282.dtsi
+++ b/arch/arm/boot/dts/kirkwood-6282.dtsi
@@ -1,4 +1,59 @@
1/ { 1/ {
2 mbus {
3 pcie-controller {
4 compatible = "marvell,kirkwood-pcie";
5 status = "disabled";
6 device_type = "pci";
7
8 #address-cells = <3>;
9 #size-cells = <2>;
10
11 bus-range = <0x00 0xff>;
12
13 ranges =
14 <0x82000000 0 0x40000 MBUS_ID(0xf0, 0x01) 0x40000 0 0x00002000
15 0x82000000 0 0x44000 MBUS_ID(0xf0, 0x01) 0x44000 0 0x00002000
16 0x82000000 0 0x80000 MBUS_ID(0xf0, 0x01) 0x80000 0 0x00002000
17 0x82000000 0x1 0 MBUS_ID(0x04, 0xe8) 0 1 0 /* Port 0.0 MEM */
18 0x81000000 0x1 0 MBUS_ID(0x04, 0xe0) 0 1 0 /* Port 0.0 IO */
19 0x82000000 0x2 0 MBUS_ID(0x04, 0xd8) 0 1 0 /* Port 1.0 MEM */
20 0x81000000 0x2 0 MBUS_ID(0x04, 0xd0) 0 1 0 /* Port 1.0 IO */>;
21
22 pcie@1,0 {
23 device_type = "pci";
24 assigned-addresses = <0x82000800 0 0x00040000 0 0x2000>;
25 reg = <0x0800 0 0 0 0>;
26 #address-cells = <3>;
27 #size-cells = <2>;
28 #interrupt-cells = <1>;
29 ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
30 0x81000000 0 0 0x81000000 0x1 0 1 0>;
31 interrupt-map-mask = <0 0 0 0>;
32 interrupt-map = <0 0 0 0 &intc 9>;
33 marvell,pcie-port = <0>;
34 marvell,pcie-lane = <0>;
35 clocks = <&gate_clk 2>;
36 status = "disabled";
37 };
38
39 pcie@2,0 {
40 device_type = "pci";
41 assigned-addresses = <0x82001000 0 0x00044000 0 0x2000>;
42 reg = <0x1000 0 0 0 0>;
43 #address-cells = <3>;
44 #size-cells = <2>;
45 #interrupt-cells = <1>;
46 ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0
47 0x81000000 0 0 0x81000000 0x2 0 1 0>;
48 interrupt-map-mask = <0 0 0 0>;
49 interrupt-map = <0 0 0 0 &intc 10>;
50 marvell,pcie-port = <1>;
51 marvell,pcie-lane = <0>;
52 clocks = <&gate_clk 18>;
53 status = "disabled";
54 };
55 };
56 };
2 ocp@f1000000 { 57 ocp@f1000000 {
3 58
4 pinctrl: pinctrl@10000 { 59 pinctrl: pinctrl@10000 {
@@ -94,52 +149,5 @@
94 status = "disabled"; 149 status = "disabled";
95 }; 150 };
96 151
97 pcie-controller {
98 compatible = "marvell,kirkwood-pcie";
99 status = "disabled";
100 device_type = "pci";
101
102 #address-cells = <3>;
103 #size-cells = <2>;
104
105 bus-range = <0x00 0xff>;
106
107 ranges = <0x82000000 0 0x00040000 0x00040000 0 0x00002000 /* Port 0.0 registers */
108 0x82000000 0 0x00044000 0x00044000 0 0x00002000 /* Port 1.0 registers */
109 0x82000000 0 0xe0000000 0xe0000000 0 0x08000000 /* non-prefetchable memory */
110 0x81000000 0 0 0xe8000000 0 0x00100000>; /* downstream I/O */
111
112 pcie@1,0 {
113 device_type = "pci";
114 assigned-addresses = <0x82000800 0 0x00040000 0 0x2000>;
115 reg = <0x0800 0 0 0 0>;
116 #address-cells = <3>;
117 #size-cells = <2>;
118 #interrupt-cells = <1>;
119 ranges;
120 interrupt-map-mask = <0 0 0 0>;
121 interrupt-map = <0 0 0 0 &intc 9>;
122 marvell,pcie-port = <0>;
123 marvell,pcie-lane = <0>;
124 clocks = <&gate_clk 2>;
125 status = "disabled";
126 };
127
128 pcie@2,0 {
129 device_type = "pci";
130 assigned-addresses = <0x82001000 0 0x00044000 0 0x2000>;
131 reg = <0x1000 0 0 0 0>;
132 #address-cells = <3>;
133 #size-cells = <2>;
134 #interrupt-cells = <1>;
135 ranges;
136 interrupt-map-mask = <0 0 0 0>;
137 interrupt-map = <0 0 0 0 &intc 10>;
138 marvell,pcie-port = <1>;
139 marvell,pcie-lane = <0>;
140 clocks = <&gate_clk 18>;
141 status = "disabled";
142 };
143 };
144 }; 152 };
145}; 153};
diff --git a/arch/arm/boot/dts/kirkwood-cloudbox.dts b/arch/arm/boot/dts/kirkwood-cloudbox.dts
index 00c48d26de68..142b9cd3b454 100644
--- a/arch/arm/boot/dts/kirkwood-cloudbox.dts
+++ b/arch/arm/boot/dts/kirkwood-cloudbox.dts
@@ -1,7 +1,7 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood.dtsi" 3#include "kirkwood.dtsi"
4/include/ "kirkwood-6281.dtsi" 4#include "kirkwood-6281.dtsi"
5 5
6/ { 6/ {
7 model = "LaCie CloudBox"; 7 model = "LaCie CloudBox";
@@ -89,3 +89,19 @@
89 gpios = <&gpio0 17 0>; 89 gpios = <&gpio0 17 0>;
90 }; 90 };
91}; 91};
92
93&mdio {
94 status = "okay";
95
96 ethphy0: ethernet-phy@0 {
97 device_type = "ethernet-phy";
98 reg = <0>;
99 };
100};
101
102&eth0 {
103 status = "okay";
104 ethernet0-port@0 {
105 phy-handle = <&ethphy0>;
106 };
107};
diff --git a/arch/arm/boot/dts/kirkwood-db-88f6281.dts b/arch/arm/boot/dts/kirkwood-db-88f6281.dts
index 9d777edd1f36..72c4b0a0366f 100644
--- a/arch/arm/boot/dts/kirkwood-db-88f6281.dts
+++ b/arch/arm/boot/dts/kirkwood-db-88f6281.dts
@@ -11,14 +11,15 @@
11 11
12/dts-v1/; 12/dts-v1/;
13 13
14/include/ "kirkwood-db.dtsi" 14#include "kirkwood-db.dtsi"
15/include/ "kirkwood-6281.dtsi" 15#include "kirkwood-6281.dtsi"
16 16
17/ { 17/ {
18 model = "Marvell DB-88F6281-BP Development Board"; 18 model = "Marvell DB-88F6281-BP Development Board";
19 compatible = "marvell,db-88f6281-bp", "marvell,kirkwood-88f6281", "marvell,kirkwood"; 19 compatible = "marvell,db-88f6281-bp", "marvell,kirkwood-88f6281", "marvell,kirkwood";
20 20
21 ocp@f1000000 { 21 mbus {
22 ranges = <MBUS_ID(0xf0, 0x01) 0 0xf1000000 0x100000>;
22 pcie-controller { 23 pcie-controller {
23 status = "okay"; 24 status = "okay";
24 25
diff --git a/arch/arm/boot/dts/kirkwood-db-88f6282.dts b/arch/arm/boot/dts/kirkwood-db-88f6282.dts
index f4c852886d23..36c411d34926 100644
--- a/arch/arm/boot/dts/kirkwood-db-88f6282.dts
+++ b/arch/arm/boot/dts/kirkwood-db-88f6282.dts
@@ -11,14 +11,15 @@
11 11
12/dts-v1/; 12/dts-v1/;
13 13
14/include/ "kirkwood-db.dtsi" 14#include "kirkwood-db.dtsi"
15/include/ "kirkwood-6282.dtsi" 15#include "kirkwood-6282.dtsi"
16 16
17/ { 17/ {
18 model = "Marvell DB-88F6282-BP Development Board"; 18 model = "Marvell DB-88F6282-BP Development Board";
19 compatible = "marvell,db-88f6282-bp", "marvell,kirkwood-88f6282", "marvell,kirkwood"; 19 compatible = "marvell,db-88f6282-bp", "marvell,kirkwood-88f6282", "marvell,kirkwood";
20 20
21 ocp@f1000000 { 21 mbus {
22 ranges = <MBUS_ID(0xf0, 0x01) 0 0xf1000000 0x100000>;
22 pcie-controller { 23 pcie-controller {
23 status = "okay"; 24 status = "okay";
24 25
diff --git a/arch/arm/boot/dts/kirkwood-db.dtsi b/arch/arm/boot/dts/kirkwood-db.dtsi
index c87cfb816120..c0e2a5879174 100644
--- a/arch/arm/boot/dts/kirkwood-db.dtsi
+++ b/arch/arm/boot/dts/kirkwood-db.dtsi
@@ -12,7 +12,7 @@
12 * and 6282 variants of the Marvell Kirkwood Development Board. 12 * and 6282 variants of the Marvell Kirkwood Development Board.
13 */ 13 */
14 14
15/include/ "kirkwood.dtsi" 15#include "kirkwood.dtsi"
16 16
17/ { 17/ {
18 memory { 18 memory {
@@ -77,13 +77,21 @@
77 cd-gpios = <&gpio1 6 0>; 77 cd-gpios = <&gpio1 6 0>;
78 status = "okay"; 78 status = "okay";
79 }; 79 };
80 };
81};
80 82
81 pcie-controller { 83&mdio {
82 status = "okay"; 84 status = "okay";
83 85
84 pcie@1,0 { 86 ethphy0: ethernet-phy@8 {
85 status = "okay"; 87 device_type = "ethernet-phy";
86 }; 88 reg = <8>;
87 }; 89 };
90};
91
92&eth0 {
93 status = "okay";
94 ethernet0-port@0 {
95 phy-handle = <&ethphy0>;
88 }; 96 };
89}; 97};
diff --git a/arch/arm/boot/dts/kirkwood-dns320.dts b/arch/arm/boot/dts/kirkwood-dns320.dts
index 14d4ceea3057..e112ca62d978 100644
--- a/arch/arm/boot/dts/kirkwood-dns320.dts
+++ b/arch/arm/boot/dts/kirkwood-dns320.dts
@@ -1,6 +1,6 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood-dnskw.dtsi" 3#include "kirkwood-dnskw.dtsi"
4 4
5/ { 5/ {
6 model = "D-Link DNS-320 NAS (Rev A1)"; 6 model = "D-Link DNS-320 NAS (Rev A1)";
diff --git a/arch/arm/boot/dts/kirkwood-dns325.dts b/arch/arm/boot/dts/kirkwood-dns325.dts
index 63872570e6ce..5119fb8a8eb6 100644
--- a/arch/arm/boot/dts/kirkwood-dns325.dts
+++ b/arch/arm/boot/dts/kirkwood-dns325.dts
@@ -1,6 +1,6 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood-dnskw.dtsi" 3#include "kirkwood-dnskw.dtsi"
4 4
5/ { 5/ {
6 model = "D-Link DNS-325 NAS (Rev A1)"; 6 model = "D-Link DNS-325 NAS (Rev A1)";
diff --git a/arch/arm/boot/dts/kirkwood-dnskw.dtsi b/arch/arm/boot/dts/kirkwood-dnskw.dtsi
index 0afe1d07c803..d544f77a4ca4 100644
--- a/arch/arm/boot/dts/kirkwood-dnskw.dtsi
+++ b/arch/arm/boot/dts/kirkwood-dnskw.dtsi
@@ -1,5 +1,5 @@
1/include/ "kirkwood.dtsi" 1#include "kirkwood.dtsi"
2/include/ "kirkwood-6281.dtsi" 2#include "kirkwood-6281.dtsi"
3 3
4/ { 4/ {
5 model = "D-Link DNS NASes (kirkwood-based)"; 5 model = "D-Link DNS NASes (kirkwood-based)";
@@ -219,3 +219,19 @@
219 }; 219 };
220 }; 220 };
221}; 221};
222
223&mdio {
224 status = "okay";
225
226 ethphy0: ethernet-phy@8 {
227 device_type = "ethernet-phy";
228 reg = <8>;
229 };
230};
231
232&eth0 {
233 status = "okay";
234 ethernet0-port@0 {
235 phy-handle = <&ethphy0>;
236 };
237};
diff --git a/arch/arm/boot/dts/kirkwood-dockstar.dts b/arch/arm/boot/dts/kirkwood-dockstar.dts
index 7714742bb8d8..59a2117c35a7 100644
--- a/arch/arm/boot/dts/kirkwood-dockstar.dts
+++ b/arch/arm/boot/dts/kirkwood-dockstar.dts
@@ -1,7 +1,7 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood.dtsi" 3#include "kirkwood.dtsi"
4/include/ "kirkwood-6281.dtsi" 4#include "kirkwood-6281.dtsi"
5 5
6/ { 6/ {
7 model = "Seagate FreeAgent Dockstar"; 7 model = "Seagate FreeAgent Dockstar";
@@ -90,3 +90,20 @@
90 }; 90 };
91 }; 91 };
92}; 92};
93
94&mdio {
95 status = "okay";
96
97 ethphy0: ethernet-phy@0 {
98 device_type = "ethernet-phy";
99 compatible = "marvell,88e1116";
100 reg = <0>;
101 };
102};
103
104&eth0 {
105 status = "okay";
106 ethernet0-port@0 {
107 phy-handle = <&ethphy0>;
108 };
109};
diff --git a/arch/arm/boot/dts/kirkwood-dreamplug.dts b/arch/arm/boot/dts/kirkwood-dreamplug.dts
index 36c7ba38d500..6f62af99c9cb 100644
--- a/arch/arm/boot/dts/kirkwood-dreamplug.dts
+++ b/arch/arm/boot/dts/kirkwood-dreamplug.dts
@@ -1,7 +1,7 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood.dtsi" 3#include "kirkwood.dtsi"
4/include/ "kirkwood-6281.dtsi" 4#include "kirkwood-6281.dtsi"
5 5
6/ { 6/ {
7 model = "Globalscale Technologies Dreamplug"; 7 model = "Globalscale Technologies Dreamplug";
@@ -99,3 +99,31 @@
99 }; 99 };
100 }; 100 };
101}; 101};
102
103&mdio {
104 status = "okay";
105
106 ethphy0: ethernet-phy@0 {
107 device_type = "ethernet-phy";
108 reg = <0>;
109 };
110
111 ethphy1: ethernet-phy@1 {
112 device_type = "ethernet-phy";
113 reg = <1>;
114 };
115};
116
117&eth0 {
118 status = "okay";
119 ethernet0-port@0 {
120 phy-handle = <&ethphy0>;
121 };
122};
123
124&eth1 {
125 status = "okay";
126 ethernet1-port@0 {
127 phy-handle = <&ethphy1>;
128 };
129};
diff --git a/arch/arm/boot/dts/kirkwood-goflexnet.dts b/arch/arm/boot/dts/kirkwood-goflexnet.dts
index 31caa6405065..6f7c7d7ecf2a 100644
--- a/arch/arm/boot/dts/kirkwood-goflexnet.dts
+++ b/arch/arm/boot/dts/kirkwood-goflexnet.dts
@@ -1,7 +1,7 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood.dtsi" 3#include "kirkwood.dtsi"
4/include/ "kirkwood-6281.dtsi" 4#include "kirkwood-6281.dtsi"
5 5
6/ { 6/ {
7 model = "Seagate GoFlex Net"; 7 model = "Seagate GoFlex Net";
@@ -170,3 +170,19 @@
170 }; 170 };
171 }; 171 };
172}; 172};
173
174&mdio {
175 status = "okay";
176
177 ethphy0: ethernet-phy@0 {
178 device_type = "ethernet-phy";
179 reg = <0>;
180 };
181};
182
183&eth0 {
184 status = "okay";
185 ethernet0-port@0 {
186 phy-handle = <&ethphy0>;
187 };
188};
diff --git a/arch/arm/boot/dts/kirkwood-guruplug-server-plus.dts b/arch/arm/boot/dts/kirkwood-guruplug-server-plus.dts
index 1e642f39b154..6548b9dc6855 100644
--- a/arch/arm/boot/dts/kirkwood-guruplug-server-plus.dts
+++ b/arch/arm/boot/dts/kirkwood-guruplug-server-plus.dts
@@ -1,7 +1,7 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood.dtsi" 3#include "kirkwood.dtsi"
4/include/ "kirkwood-6281.dtsi" 4#include "kirkwood-6281.dtsi"
5 5
6/ { 6/ {
7 model = "Globalscale Technologies Guruplug Server Plus"; 7 model = "Globalscale Technologies Guruplug Server Plus";
@@ -96,3 +96,33 @@
96 }; 96 };
97 }; 97 };
98}; 98};
99
100&mdio {
101 status = "okay";
102
103 ethphy0: ethernet-phy@0 {
104 device_type = "ethernet-phy";
105 compatible = "marvell,88e1121";
106 reg = <0>;
107 };
108
109 ethphy1: ethernet-phy@1 {
110 device_type = "ethernet-phy";
111 compatible = "marvell,88e1121";
112 reg = <1>;
113 };
114};
115
116&eth0 {
117 status = "okay";
118 ethernet0-port@0 {
119 phy-handle = <&ethphy0>;
120 };
121};
122
123&eth1 {
124 status = "okay";
125 ethernet1-port@0 {
126 phy-handle = <&ethphy1>;
127 };
128};
diff --git a/arch/arm/boot/dts/kirkwood-ib62x0.dts b/arch/arm/boot/dts/kirkwood-ib62x0.dts
index 20c4b081f420..cb711a3bd983 100644
--- a/arch/arm/boot/dts/kirkwood-ib62x0.dts
+++ b/arch/arm/boot/dts/kirkwood-ib62x0.dts
@@ -1,7 +1,7 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood.dtsi" 3#include "kirkwood.dtsi"
4/include/ "kirkwood-6281.dtsi" 4#include "kirkwood-6281.dtsi"
5 5
6/ { 6/ {
7 model = "RaidSonic ICY BOX IB-NAS62x0 (Rev B)"; 7 model = "RaidSonic ICY BOX IB-NAS62x0 (Rev B)";
@@ -122,3 +122,19 @@
122 122
123 123
124}; 124};
125
126&mdio {
127 status = "okay";
128
129 ethphy0: ethernet-phy@8 {
130 device_type = "ethernet-phy";
131 reg = <8>;
132 };
133};
134
135&eth0 {
136 status = "okay";
137 ethernet0-port@0 {
138 phy-handle = <&ethphy0>;
139 };
140};
diff --git a/arch/arm/boot/dts/kirkwood-iconnect.dts b/arch/arm/boot/dts/kirkwood-iconnect.dts
index 441204e8abc6..0323f017eeed 100644
--- a/arch/arm/boot/dts/kirkwood-iconnect.dts
+++ b/arch/arm/boot/dts/kirkwood-iconnect.dts
@@ -1,7 +1,7 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood.dtsi" 3#include "kirkwood.dtsi"
4/include/ "kirkwood-6281.dtsi" 4#include "kirkwood-6281.dtsi"
5 5
6/ { 6/ {
7 model = "Iomega Iconnect"; 7 model = "Iomega Iconnect";
@@ -18,6 +18,17 @@
18 linux,initrd-end = <0x4800000>; 18 linux,initrd-end = <0x4800000>;
19 }; 19 };
20 20
21 mbus {
22 ranges = <MBUS_ID(0xf0, 0x01) 0 0xf1000000 0x100000>;
23 pcie-controller {
24 status = "okay";
25
26 pcie@1,0 {
27 status = "okay";
28 };
29 };
30 };
31
21 ocp@f1000000 { 32 ocp@f1000000 {
22 pinctrl: pinctrl@10000 { 33 pinctrl: pinctrl@10000 {
23 pmx_button_reset: pmx-button-reset { 34 pmx_button_reset: pmx-button-reset {
@@ -101,14 +112,6 @@
101 reg = <0x980000 0x1f400000>; 112 reg = <0x980000 0x1f400000>;
102 }; 113 };
103 }; 114 };
104
105 pcie-controller {
106 status = "okay";
107
108 pcie@1,0 {
109 status = "okay";
110 };
111 };
112 }; 115 };
113 116
114 gpio-leds { 117 gpio-leds {
@@ -176,3 +179,19 @@
176 }; 179 };
177 }; 180 };
178}; 181};
182
183&mdio {
184 status = "okay";
185
186 ethphy0: ethernet-phy@11 {
187 device_type = "ethernet-phy";
188 reg = <11>;
189 };
190};
191
192&eth0 {
193 status = "okay";
194 ethernet0-port@0 {
195 phy-handle = <&ethphy0>;
196 };
197};
diff --git a/arch/arm/boot/dts/kirkwood-iomega_ix2_200.dts b/arch/arm/boot/dts/kirkwood-iomega_ix2_200.dts
index 00a7bfe5e83b..df8447442b37 100644
--- a/arch/arm/boot/dts/kirkwood-iomega_ix2_200.dts
+++ b/arch/arm/boot/dts/kirkwood-iomega_ix2_200.dts
@@ -1,7 +1,7 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood.dtsi" 3#include "kirkwood.dtsi"
4/include/ "kirkwood-6281.dtsi" 4#include "kirkwood-6281.dtsi"
5 5
6/ { 6/ {
7 model = "Iomega StorCenter ix2-200"; 7 model = "Iomega StorCenter ix2-200";
@@ -194,3 +194,27 @@
194 }; 194 };
195 }; 195 };
196}; 196};
197
198&mdio {
199 status = "okay";
200
201 ethphy1: ethernet-phy@11 {
202 device_type = "ethernet-phy";
203 reg = <11>;
204 };
205};
206
207&eth0 {
208 status = "okay";
209 ethernet0-port@0 {
210 speed = <1000>;
211 duplex = <1>;
212 };
213};
214
215&eth1 {
216 status = "okay";
217 ethernet1-port@0 {
218 phy-handle = <&ethphy1>;
219 };
220};
diff --git a/arch/arm/boot/dts/kirkwood-is2.dts b/arch/arm/boot/dts/kirkwood-is2.dts
index c3f036b86cca..da674bbd49a8 100644
--- a/arch/arm/boot/dts/kirkwood-is2.dts
+++ b/arch/arm/boot/dts/kirkwood-is2.dts
@@ -1,6 +1,6 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood-ns2-common.dtsi" 3#include "kirkwood-ns2-common.dtsi"
4 4
5/ { 5/ {
6 model = "LaCie Internet Space v2"; 6 model = "LaCie Internet Space v2";
@@ -30,3 +30,5 @@
30 }; 30 };
31 }; 31 };
32}; 32};
33
34&ethphy0 { reg = <8>; };
diff --git a/arch/arm/boot/dts/kirkwood-km_kirkwood.dts b/arch/arm/boot/dts/kirkwood-km_kirkwood.dts
index 5d9f5ea78700..6899408482d2 100644
--- a/arch/arm/boot/dts/kirkwood-km_kirkwood.dts
+++ b/arch/arm/boot/dts/kirkwood-km_kirkwood.dts
@@ -1,7 +1,7 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood.dtsi" 3#include "kirkwood.dtsi"
4/include/ "kirkwood-98dx4122.dtsi" 4#include "kirkwood-98dx4122.dtsi"
5 5
6/ { 6/ {
7 model = "Keymile Kirkwood Reference Design"; 7 model = "Keymile Kirkwood Reference Design";
@@ -50,3 +50,19 @@
50 i2c-gpio,delay-us = <2>; /* ~100 kHz */ 50 i2c-gpio,delay-us = <2>; /* ~100 kHz */
51 }; 51 };
52}; 52};
53
54&mdio {
55 status = "okay";
56
57 ethphy0: ethernet-phy@0 {
58 device_type = "ethernet-phy";
59 reg = <0>;
60 };
61};
62
63&eth0 {
64 status = "okay";
65 ethernet0-port@0 {
66 phy-handle = <&ethphy0>;
67 };
68};
diff --git a/arch/arm/boot/dts/kirkwood-lschlv2.dts b/arch/arm/boot/dts/kirkwood-lschlv2.dts
index 9f55d95f35f5..e2fa368aef25 100644
--- a/arch/arm/boot/dts/kirkwood-lschlv2.dts
+++ b/arch/arm/boot/dts/kirkwood-lschlv2.dts
@@ -1,6 +1,6 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood-lsxl.dtsi" 3#include "kirkwood-lsxl.dtsi"
4 4
5/ { 5/ {
6 model = "Buffalo Linkstation LS-CHLv2"; 6 model = "Buffalo Linkstation LS-CHLv2";
diff --git a/arch/arm/boot/dts/kirkwood-lsxhl.dts b/arch/arm/boot/dts/kirkwood-lsxhl.dts
index 5c84c118ed8d..8d89cdf8d6bf 100644
--- a/arch/arm/boot/dts/kirkwood-lsxhl.dts
+++ b/arch/arm/boot/dts/kirkwood-lsxhl.dts
@@ -1,6 +1,6 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood-lsxl.dtsi" 3#include "kirkwood-lsxl.dtsi"
4 4
5/ { 5/ {
6 model = "Buffalo Linkstation LS-XHL"; 6 model = "Buffalo Linkstation LS-XHL";
diff --git a/arch/arm/boot/dts/kirkwood-lsxl.dtsi b/arch/arm/boot/dts/kirkwood-lsxl.dtsi
index 31b17f5b9d28..4e8f9e42c592 100644
--- a/arch/arm/boot/dts/kirkwood-lsxl.dtsi
+++ b/arch/arm/boot/dts/kirkwood-lsxl.dtsi
@@ -1,5 +1,5 @@
1/include/ "kirkwood.dtsi" 1#include "kirkwood.dtsi"
2/include/ "kirkwood-6281.dtsi" 2#include "kirkwood-6281.dtsi"
3 3
4/ { 4/ {
5 chosen { 5 chosen {
@@ -207,3 +207,31 @@
207 }; 207 };
208 }; 208 };
209}; 209};
210
211&mdio {
212 status = "okay";
213
214 ethphy0: ethernet-phy@0 {
215 device_type = "ethernet-phy";
216 reg = <0>;
217 };
218
219 ethphy1: ethernet-phy@8 {
220 device_type = "ethernet-phy";
221 reg = <8>;
222 };
223};
224
225&eth0 {
226 status = "okay";
227 ethernet0-port@0 {
228 phy-handle = <&ethphy0>;
229 };
230};
231
232&eth1 {
233 status = "okay";
234 ethernet1-port@0 {
235 phy-handle = <&ethphy1>;
236 };
237};
diff --git a/arch/arm/boot/dts/kirkwood-mplcec4.dts b/arch/arm/boot/dts/kirkwood-mplcec4.dts
index 6179333fd71f..ce2b94b513db 100644
--- a/arch/arm/boot/dts/kirkwood-mplcec4.dts
+++ b/arch/arm/boot/dts/kirkwood-mplcec4.dts
@@ -1,7 +1,7 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood.dtsi" 3#include "kirkwood.dtsi"
4/include/ "kirkwood-6281.dtsi" 4#include "kirkwood-6281.dtsi"
5 5
6/ { 6/ {
7 model = "MPL CEC4"; 7 model = "MPL CEC4";
@@ -16,6 +16,17 @@
16 bootargs = "console=ttyS0,115200n8 earlyprintk"; 16 bootargs = "console=ttyS0,115200n8 earlyprintk";
17 }; 17 };
18 18
19 mbus {
20 ranges = <MBUS_ID(0xf0, 0x01) 0 0xf1000000 0x100000>;
21 pcie-controller {
22 status = "okay";
23
24 pcie@1,0 {
25 status = "okay";
26 };
27 };
28 };
29
19 ocp@f1000000 { 30 ocp@f1000000 {
20 pinctrl: pinctrl@10000 { 31 pinctrl: pinctrl@10000 {
21 pmx_led_health: pmx-led-health { 32 pmx_led_health: pmx-led-health {
@@ -134,14 +145,6 @@
134 cd-gpios = <&gpio1 15 1>; 145 cd-gpios = <&gpio1 15 1>;
135 /* No WP GPIO */ 146 /* No WP GPIO */
136 }; 147 };
137
138 pcie-controller {
139 status = "okay";
140
141 pcie@1,0 {
142 status = "okay";
143 };
144 };
145 }; 148 };
146 149
147 gpio-leds { 150 gpio-leds {
@@ -191,3 +194,30 @@
191 }; 194 };
192}; 195};
193 196
197&mdio {
198 status = "okay";
199
200 ethphy0: ethernet-phy@1 {
201 device_type = "ethernet-phy";
202 reg = <1>;
203 };
204
205 ethphy1: ethernet-phy@2 {
206 device_type = "ethernet-phy";
207 reg = <2>;
208 };
209};
210
211&eth0 {
212 status = "okay";
213 ethernet0-port@0 {
214 phy-handle = <&ethphy0>;
215 };
216};
217
218&eth1 {
219 status = "okay";
220 ethernet1-port@0 {
221 phy-handle = <&ethphy1>;
222 };
223};
diff --git a/arch/arm/boot/dts/kirkwood-mv88f6281gtw-ge.dts b/arch/arm/boot/dts/kirkwood-mv88f6281gtw-ge.dts
new file mode 100644
index 000000000000..6317e1d088b3
--- /dev/null
+++ b/arch/arm/boot/dts/kirkwood-mv88f6281gtw-ge.dts
@@ -0,0 +1,125 @@
1/*
2 * Marvell 88F6281 GTW GE Board
3 *
4 * Lennert Buytenhek <buytenh@marvell.com>
5 * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
6 *
7 * This file is licensed under the terms of the GNU General Public
8 * License version 2. This program is licensed "as is" without any
9 * warranty of any kind, whether express or implied.
10 *
11 * This file contains the definitions that are common between the 6281
12 * and 6282 variants of the Marvell Kirkwood Development Board.
13 */
14
15/dts-v1/;
16
17#include "kirkwood.dtsi"
18#include "kirkwood-6281.dtsi"
19
20/ {
21 model = "Marvell 88F6281 GTW GE Board";
22 compatible = "marvell,mv88f6281gtw-ge", "marvell,kirkwood-88f6281", "marvell,kirkwood";
23
24 memory {
25 device_type = "memory";
26 reg = <0x00000000 0x20000000>; /* 512 MB */
27 };
28
29 chosen {
30 bootargs = "console=ttyS0,115200n8 earlyprintk";
31 };
32
33 ocp@f1000000 {
34 pinctrl@10000 {
35 pmx_usb_led: pmx-usb-led {
36 marvell,pins = "mpp12";
37 marvell,function = "gpo";
38 };
39
40 pmx_leds: pmx-leds {
41 marvell,pins = "mpp20", "mpp21";
42 marvell,function = "gpio";
43 };
44
45 pmx_keys: pmx-keys {
46 marvell,pins = "mpp46", "mpp47";
47 marvell,function = "gpio";
48 };
49 };
50
51 spi@10600 {
52 pinctrl-0 = <&pmx_spi>;
53 pinctrl-names = "default";
54 status = "okay";
55
56 flash@0 {
57 #address-cells = <1>;
58 #size-cells = <1>;
59 compatible = "mx25l12805d";
60 reg = <0>;
61 spi-max-frequency = <50000000>;
62 mode = <0>;
63 };
64 };
65
66 serial@12000 {
67 pinctrl-0 = <&pmx_uart0>;
68 pinctrl-names = "default";
69 clock-frequency = <200000000>;
70 status = "ok";
71 };
72
73 ehci@50000 {
74 status = "okay";
75 };
76
77 pcie-controller {
78 status = "okay";
79
80 pcie@1,0 {
81 status = "okay";
82 };
83 };
84 };
85
86 gpio-leds {
87 compatible = "gpio-leds";
88 pinctrl-0 = <&pmx_leds &pmx_usb_led>;
89 pinctrl-names = "default";
90
91 green-status {
92 label = "gtw:green:Status";
93 gpios = <&gpio0 20 0>;
94 };
95
96 red-status {
97 label = "gtw:red:Status";
98 gpios = <&gpio0 21 0>;
99 };
100
101 green-usb {
102 label = "gtw:green:USB";
103 gpios = <&gpio0 12 0>;
104 };
105 };
106
107 gpio_keys {
108 compatible = "gpio-keys";
109 #address-cells = <1>;
110 #size-cells = <0>;
111 pinctrl-0 = <&pmx_keys>;
112 pinctrl-names = "default";
113
114 button@1 {
115 label = "SWR Button";
116 linux,code = <0x198>; /* KEY_RESTART */
117 gpios = <&gpio1 15 1>;
118 };
119 button@2 {
120 label = "WPS Button";
121 linux,code = <0x211>; /* KEY_WPS_BUTTON */
122 gpios = <&gpio1 14 1>;
123 };
124 };
125};
diff --git a/arch/arm/boot/dts/kirkwood-netgear_readynas_duo_v2.dts b/arch/arm/boot/dts/kirkwood-netgear_readynas_duo_v2.dts
index ad6ade7d9191..874857ea9cb8 100644
--- a/arch/arm/boot/dts/kirkwood-netgear_readynas_duo_v2.dts
+++ b/arch/arm/boot/dts/kirkwood-netgear_readynas_duo_v2.dts
@@ -1,7 +1,7 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood.dtsi" 3#include "kirkwood.dtsi"
4/include/ "kirkwood-6282.dtsi" 4#include "kirkwood-6282.dtsi"
5 5
6/ { 6/ {
7 model = "NETGEAR ReadyNAS Duo v2"; 7 model = "NETGEAR ReadyNAS Duo v2";
@@ -16,6 +16,17 @@
16 bootargs = "console=ttyS0,115200n8 earlyprintk"; 16 bootargs = "console=ttyS0,115200n8 earlyprintk";
17 }; 17 };
18 18
19 mbus {
20 ranges = <MBUS_ID(0xf0, 0x01) 0 0xf1000000 0x100000>;
21 pcie-controller {
22 status = "okay";
23
24 pcie@1,0 {
25 status = "okay";
26 };
27 };
28 };
29
19 ocp@f1000000 { 30 ocp@f1000000 {
20 pinctrl: pinctrl@10000 { 31 pinctrl: pinctrl@10000 {
21 pmx_button_power: pmx-button-power { 32 pmx_button_power: pmx-button-power {
@@ -52,6 +63,17 @@
52 }; 63 };
53 }; 64 };
54 65
66 clocks {
67 #address-cells = <1>;
68 #size-cells = <0>;
69
70 g762_clk: fixedclk {
71 compatible = "fixed-clock";
72 #clock-cells = <0>;
73 clock-frequency = <8192>;
74 };
75 };
76
55 i2c@11000 { 77 i2c@11000 {
56 status = "okay"; 78 status = "okay";
57 79
@@ -59,6 +81,15 @@
59 compatible = "ricoh,rs5c372a"; 81 compatible = "ricoh,rs5c372a";
60 reg = <0x32>; 82 reg = <0x32>;
61 }; 83 };
84
85 g762: g762@3e {
86 compatible = "gmt,g762";
87 reg = <0x3e>;
88 clocks = <&g762_clk>; /* input clock */
89 fan_gear_mode = <0>;
90 fan_startv = <1>;
91 pwm_polarity = <0>;
92 };
62 }; 93 };
63 94
64 serial@12000 { 95 serial@12000 {
@@ -101,14 +132,6 @@
101 status = "okay"; 132 status = "okay";
102 nr-ports = <2>; 133 nr-ports = <2>;
103 }; 134 };
104
105 pcie-controller {
106 status = "okay";
107
108 pcie@1,0 {
109 status = "okay";
110 };
111 };
112 }; 135 };
113 136
114 gpio-leds { 137 gpio-leds {
@@ -184,3 +207,19 @@
184 }; 207 };
185 }; 208 };
186}; 209};
210
211&mdio {
212 status = "okay";
213
214 ethphy0: ethernet-phy@0 {
215 device_type = "ethernet-phy";
216 reg = <0>;
217 };
218};
219
220&eth0 {
221 status = "okay";
222 ethernet0-port@0 {
223 phy-handle = <&ethphy0>;
224 };
225};
diff --git a/arch/arm/boot/dts/kirkwood-ns2-common.dtsi b/arch/arm/boot/dts/kirkwood-ns2-common.dtsi
index 2afac0405816..2fcb82e20828 100644
--- a/arch/arm/boot/dts/kirkwood-ns2-common.dtsi
+++ b/arch/arm/boot/dts/kirkwood-ns2-common.dtsi
@@ -1,5 +1,5 @@
1/include/ "kirkwood.dtsi" 1#include "kirkwood.dtsi"
2/include/ "kirkwood-6281.dtsi" 2#include "kirkwood-6281.dtsi"
3 3
4/ { 4/ {
5 chosen { 5 chosen {
@@ -84,3 +84,19 @@
84 }; 84 };
85 85
86}; 86};
87
88&mdio {
89 status = "okay";
90
91 ethphy0: ethernet-phy {
92 device_type = "ethernet-phy";
93 /* overwrite reg property in board file */
94 };
95};
96
97&eth0 {
98 status = "okay";
99 ethernet0-port@0 {
100 phy-handle = <&ethphy0>;
101 };
102};
diff --git a/arch/arm/boot/dts/kirkwood-ns2.dts b/arch/arm/boot/dts/kirkwood-ns2.dts
index b50e93d7796c..53368d1022cc 100644
--- a/arch/arm/boot/dts/kirkwood-ns2.dts
+++ b/arch/arm/boot/dts/kirkwood-ns2.dts
@@ -1,6 +1,6 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood-ns2-common.dtsi" 3#include "kirkwood-ns2-common.dtsi"
4 4
5/ { 5/ {
6 model = "LaCie Network Space v2"; 6 model = "LaCie Network Space v2";
@@ -30,3 +30,5 @@
30 }; 30 };
31 }; 31 };
32}; 32};
33
34&ethphy0 { reg = <8>; };
diff --git a/arch/arm/boot/dts/kirkwood-ns2lite.dts b/arch/arm/boot/dts/kirkwood-ns2lite.dts
index af8259fe8955..279607093cdb 100644
--- a/arch/arm/boot/dts/kirkwood-ns2lite.dts
+++ b/arch/arm/boot/dts/kirkwood-ns2lite.dts
@@ -1,6 +1,6 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood-ns2-common.dtsi" 3#include "kirkwood-ns2-common.dtsi"
4 4
5/ { 5/ {
6 model = "LaCie Network Space Lite v2"; 6 model = "LaCie Network Space Lite v2";
@@ -30,3 +30,5 @@
30 }; 30 };
31 }; 31 };
32}; 32};
33
34&ethphy0 { reg = <0>; };
diff --git a/arch/arm/boot/dts/kirkwood-ns2max.dts b/arch/arm/boot/dts/kirkwood-ns2max.dts
index 85f24d227e17..defdc77fb550 100644
--- a/arch/arm/boot/dts/kirkwood-ns2max.dts
+++ b/arch/arm/boot/dts/kirkwood-ns2max.dts
@@ -1,6 +1,6 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood-ns2-common.dtsi" 3#include "kirkwood-ns2-common.dtsi"
4 4
5/ { 5/ {
6 model = "LaCie Network Space Max v2"; 6 model = "LaCie Network Space Max v2";
@@ -49,3 +49,5 @@
49 }; 49 };
50 }; 50 };
51}; 51};
52
53&ethphy0 { reg = <8>; };
diff --git a/arch/arm/boot/dts/kirkwood-ns2mini.dts b/arch/arm/boot/dts/kirkwood-ns2mini.dts
index 329e530bffe7..adbafdd90991 100644
--- a/arch/arm/boot/dts/kirkwood-ns2mini.dts
+++ b/arch/arm/boot/dts/kirkwood-ns2mini.dts
@@ -1,6 +1,6 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood-ns2-common.dtsi" 3#include "kirkwood-ns2-common.dtsi"
4 4
5/ { 5/ {
6 /* This machine is embedded in the first LaCie CloudBox product. */ 6 /* This machine is embedded in the first LaCie CloudBox product. */
@@ -50,3 +50,5 @@
50 }; 50 };
51 }; 51 };
52}; 52};
53
54&ethphy0 { reg = <0>; };
diff --git a/arch/arm/boot/dts/kirkwood-nsa310-common.dtsi b/arch/arm/boot/dts/kirkwood-nsa310-common.dtsi
new file mode 100644
index 000000000000..06267a91de38
--- /dev/null
+++ b/arch/arm/boot/dts/kirkwood-nsa310-common.dtsi
@@ -0,0 +1,107 @@
1#include "kirkwood.dtsi"
2#include "kirkwood-6281.dtsi"
3
4/ {
5 model = "ZyXEL NSA310";
6
7 ocp@f1000000 {
8 pinctrl: pinctrl@10000 {
9
10 pmx_usb_power_off: pmx-usb-power-off {
11 marvell,pins = "mpp21";
12 marvell,function = "gpio";
13 };
14 pmx_pwr_off: pmx-pwr-off {
15 marvell,pins = "mpp48";
16 marvell,function = "gpio";
17 };
18
19 };
20
21 serial@12000 {
22 status = "ok";
23 };
24
25 sata@80000 {
26 status = "okay";
27 nr-ports = <2>;
28 };
29
30 nand@3000000 {
31 status = "okay";
32 chip-delay = <35>;
33
34 partition@0 {
35 label = "uboot";
36 reg = <0x0000000 0x0100000>;
37 read-only;
38 };
39 partition@100000 {
40 label = "uboot_env";
41 reg = <0x0100000 0x0080000>;
42 };
43 partition@180000 {
44 label = "key_store";
45 reg = <0x0180000 0x0080000>;
46 };
47 partition@200000 {
48 label = "info";
49 reg = <0x0200000 0x0080000>;
50 };
51 partition@280000 {
52 label = "etc";
53 reg = <0x0280000 0x0a00000>;
54 };
55 partition@c80000 {
56 label = "kernel_1";
57 reg = <0x0c80000 0x0a00000>;
58 };
59 partition@1680000 {
60 label = "rootfs1";
61 reg = <0x1680000 0x2fc0000>;
62 };
63 partition@4640000 {
64 label = "kernel_2";
65 reg = <0x4640000 0x0a00000>;
66 };
67 partition@5040000 {
68 label = "rootfs2";
69 reg = <0x5040000 0x2fc0000>;
70 };
71 };
72
73 pcie-controller {
74 status = "okay";
75
76 pcie@1,0 {
77 status = "okay";
78 };
79 };
80 };
81
82 gpio_poweroff {
83 compatible = "gpio-poweroff";
84 pinctrl-0 = <&pmx_pwr_off>;
85 pinctrl-names = "default";
86 gpios = <&gpio1 16 0>;
87 };
88
89 regulators {
90 compatible = "simple-bus";
91 #address-cells = <1>;
92 #size-cells = <0>;
93 pinctrl-0 = <&pmx_usb_power_off>;
94 pinctrl-names = "default";
95
96 usb0_power_off: regulator@1 {
97 compatible = "regulator-fixed";
98 reg = <1>;
99 regulator-name = "USB Power Off";
100 regulator-min-microvolt = <5000000>;
101 regulator-max-microvolt = <5000000>;
102 regulator-always-on;
103 regulator-boot-on;
104 gpio = <&gpio0 21 0>;
105 };
106 };
107};
diff --git a/arch/arm/boot/dts/kirkwood-nsa310.dts b/arch/arm/boot/dts/kirkwood-nsa310.dts
index 69003598f5fa..7aeae0c2c1f4 100644
--- a/arch/arm/boot/dts/kirkwood-nsa310.dts
+++ b/arch/arm/boot/dts/kirkwood-nsa310.dts
@@ -1,10 +1,8 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood.dtsi" 3#include "kirkwood-nsa310-common.dtsi"
4/include/ "kirkwood-6281.dtsi"
5 4
6/ { 5/ {
7 model = "ZyXEL NSA310";
8 compatible = "zyxel,nsa310", "marvell,kirkwood-88f6281", "marvell,kirkwood"; 6 compatible = "zyxel,nsa310", "marvell,kirkwood-88f6281", "marvell,kirkwood";
9 7
10 memory { 8 memory {
@@ -16,6 +14,17 @@
16 bootargs = "console=ttyS0,115200"; 14 bootargs = "console=ttyS0,115200";
17 }; 15 };
18 16
17 mbus {
18 ranges = <MBUS_ID(0xf0, 0x01) 0 0xf1000000 0x100000>;
19 pcie-controller {
20 status = "okay";
21
22 pcie@1,0 {
23 status = "okay";
24 };
25 };
26 };
27
19 ocp@f1000000 { 28 ocp@f1000000 {
20 pinctrl: pinctrl@10000 { 29 pinctrl: pinctrl@10000 {
21 pinctrl-0 = <&pmx_unknown>; 30 pinctrl-0 = <&pmx_unknown>;
@@ -41,11 +50,6 @@
41 marvell,function = "gpio"; 50 marvell,function = "gpio";
42 }; 51 };
43 52
44 pmx_usb_power_off: pmx-usb-power-off {
45 marvell,pins = "mpp21";
46 marvell,function = "gpio";
47 };
48
49 pmx_led_sys_green: pmx-led-sys-green { 53 pmx_led_sys_green: pmx-led-sys-green {
50 marvell,pins = "mpp28"; 54 marvell,pins = "mpp28";
51 marvell,function = "gpio"; 55 marvell,function = "gpio";
@@ -95,20 +99,6 @@
95 marvell,pins = "mpp46"; 99 marvell,pins = "mpp46";
96 marvell,function = "gpio"; 100 marvell,function = "gpio";
97 }; 101 };
98
99 pmx_pwr_off: pmx-pwr-off {
100 marvell,pins = "mpp48";
101 marvell,function = "gpio";
102 };
103 };
104
105 serial@12000 {
106 status = "ok";
107 };
108
109 sata@80000 {
110 status = "okay";
111 nr-ports = <2>;
112 }; 102 };
113 103
114 i2c@11000 { 104 i2c@11000 {
@@ -119,57 +109,6 @@
119 reg = <0x2e>; 109 reg = <0x2e>;
120 }; 110 };
121 }; 111 };
122
123 nand@3000000 {
124 status = "okay";
125 chip-delay = <35>;
126
127 partition@0 {
128 label = "uboot";
129 reg = <0x0000000 0x0100000>;
130 read-only;
131 };
132 partition@100000 {
133 label = "uboot_env";
134 reg = <0x0100000 0x0080000>;
135 };
136 partition@180000 {
137 label = "key_store";
138 reg = <0x0180000 0x0080000>;
139 };
140 partition@200000 {
141 label = "info";
142 reg = <0x0200000 0x0080000>;
143 };
144 partition@280000 {
145 label = "etc";
146 reg = <0x0280000 0x0a00000>;
147 };
148 partition@c80000 {
149 label = "kernel_1";
150 reg = <0x0c80000 0x0a00000>;
151 };
152 partition@1680000 {
153 label = "rootfs1";
154 reg = <0x1680000 0x2fc0000>;
155 };
156 partition@4640000 {
157 label = "kernel_2";
158 reg = <0x4640000 0x0a00000>;
159 };
160 partition@5040000 {
161 label = "rootfs2";
162 reg = <0x5040000 0x2fc0000>;
163 };
164 };
165
166 pcie-controller {
167 status = "okay";
168
169 pcie@1,0 {
170 status = "okay";
171 };
172 };
173 }; 112 };
174 113
175 gpio_keys { 114 gpio_keys {
@@ -246,30 +185,4 @@
246 gpios = <&gpio1 8 0>; 185 gpios = <&gpio1 8 0>;
247 }; 186 };
248 }; 187 };
249
250 gpio_poweroff {
251 compatible = "gpio-poweroff";
252 pinctrl-0 = <&pmx_pwr_off>;
253 pinctrl-names = "default";
254 gpios = <&gpio1 16 0>;
255 };
256
257 regulators {
258 compatible = "simple-bus";
259 #address-cells = <1>;
260 #size-cells = <0>;
261 pinctrl-0 = <&pmx_usb_power_off>;
262 pinctrl-names = "default";
263
264 usb0_power_off: regulator@1 {
265 compatible = "regulator-fixed";
266 reg = <1>;
267 regulator-name = "USB Power Off";
268 regulator-min-microvolt = <5000000>;
269 regulator-max-microvolt = <5000000>;
270 regulator-always-on;
271 regulator-boot-on;
272 gpio = <&gpio0 21 0>;
273 };
274 };
275}; 188};
diff --git a/arch/arm/boot/dts/kirkwood-nsa310a.dts b/arch/arm/boot/dts/kirkwood-nsa310a.dts
new file mode 100644
index 000000000000..ab0212b0e6f5
--- /dev/null
+++ b/arch/arm/boot/dts/kirkwood-nsa310a.dts
@@ -0,0 +1,165 @@
1/dts-v1/;
2
3#include "kirkwood-nsa310-common.dtsi"
4
5/*
6 * There are at least two different NSA310 designs. This variant does
7 * not have the red USB Led.
8 */
9
10/ {
11 compatible = "zyxel,nsa310a", "zyxel,nsa310", "marvell,kirkwood-88f6281", "marvell,kirkwood";
12
13 memory {
14 device_type = "memory";
15 reg = <0x00000000 0x10000000>;
16 };
17
18 chosen {
19 bootargs = "console=ttyS0,115200";
20 };
21
22 ocp@f1000000 {
23 pinctrl: pinctrl@10000 {
24 pinctrl-names = "default";
25
26 pmx_led_esata_green: pmx-led-esata-green {
27 marvell,pins = "mpp12";
28 marvell,function = "gpio";
29 };
30
31 pmx_led_esata_red: pmx-led-esata-red {
32 marvell,pins = "mpp13";
33 marvell,function = "gpio";
34 };
35
36 pmx_led_usb_green: pmx-led-usb-green {
37 marvell,pins = "mpp15";
38 marvell,function = "gpio";
39 };
40
41 pmx_usb_power_off: pmx-usb-power-off {
42 marvell,pins = "mpp21";
43 marvell,function = "gpio";
44 };
45
46 pmx_led_sys_green: pmx-led-sys-green {
47 marvell,pins = "mpp28";
48 marvell,function = "gpio";
49 };
50
51 pmx_led_sys_red: pmx-led-sys-red {
52 marvell,pins = "mpp29";
53 marvell,function = "gpio";
54 };
55
56 pmx_btn_reset: pmx-btn-reset {
57 marvell,pins = "mpp36";
58 marvell,function = "gpio";
59 };
60
61 pmx_btn_copy: pmx-btn-copy {
62 marvell,pins = "mpp37";
63 marvell,function = "gpio";
64 };
65
66 pmx_led_copy_green: pmx-led-copy-green {
67 marvell,pins = "mpp39";
68 marvell,function = "gpio";
69 };
70
71 pmx_led_copy_red: pmx-led-copy-red {
72 marvell,pins = "mpp40";
73 marvell,function = "gpio";
74 };
75
76 pmx_led_hdd_green: pmx-led-hdd-green {
77 marvell,pins = "mpp41";
78 marvell,function = "gpio";
79 };
80
81 pmx_led_hdd_red: pmx-led-hdd-red {
82 marvell,pins = "mpp42";
83 marvell,function = "gpio";
84 };
85
86 pmx_btn_power: pmx-btn-power {
87 marvell,pins = "mpp46";
88 marvell,function = "gpio";
89 };
90
91 };
92
93 i2c@11000 {
94 status = "okay";
95
96 lm85: lm85@2e {
97 compatible = "lm85";
98 reg = <0x2e>;
99 };
100 };
101 };
102
103 gpio_keys {
104 compatible = "gpio-keys";
105 #address-cells = <1>;
106 #size-cells = <0>;
107
108 button@1 {
109 label = "Power Button";
110 linux,code = <116>;
111 gpios = <&gpio1 14 0>;
112 };
113 button@2 {
114 label = "Copy Button";
115 linux,code = <133>;
116 gpios = <&gpio1 5 1>;
117 };
118 button@3 {
119 label = "Reset Button";
120 linux,code = <0x198>;
121 gpios = <&gpio1 4 1>;
122 };
123 };
124
125 gpio-leds {
126 compatible = "gpio-leds";
127
128 green-sys {
129 label = "nsa310:green:sys";
130 gpios = <&gpio0 28 0>;
131 };
132 red-sys {
133 label = "nsa310:red:sys";
134 gpios = <&gpio0 29 0>;
135 };
136 green-hdd {
137 label = "nsa310:green:hdd";
138 gpios = <&gpio1 9 0>;
139 };
140 red-hdd {
141 label = "nsa310:red:hdd";
142 gpios = <&gpio1 10 0>;
143 };
144 green-esata {
145 label = "nsa310:green:esata";
146 gpios = <&gpio0 12 0>;
147 };
148 red-esata {
149 label = "nsa310:red:esata";
150 gpios = <&gpio0 13 0>;
151 };
152 green-usb {
153 label = "nsa310:green:usb";
154 gpios = <&gpio0 15 0>;
155 };
156 green-copy {
157 label = "nsa310:green:copy";
158 gpios = <&gpio1 7 0>;
159 };
160 red-copy {
161 label = "nsa310:red:copy";
162 gpios = <&gpio1 8 0>;
163 };
164 };
165};
diff --git a/arch/arm/boot/dts/kirkwood-openblocks_a6.dts b/arch/arm/boot/dts/kirkwood-openblocks_a6.dts
index 38dc8517d777..85ccf8d8abb1 100644
--- a/arch/arm/boot/dts/kirkwood-openblocks_a6.dts
+++ b/arch/arm/boot/dts/kirkwood-openblocks_a6.dts
@@ -1,7 +1,7 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood.dtsi" 3#include "kirkwood.dtsi"
4/include/ "kirkwood-6282.dtsi" 4#include "kirkwood-6282.dtsi"
5 5
6/ { 6/ {
7 model = "Plat'Home OpenBlocksA6"; 7 model = "Plat'Home OpenBlocksA6";
@@ -166,3 +166,19 @@
166 }; 166 };
167 }; 167 };
168}; 168};
169
170&mdio {
171 status = "okay";
172
173 ethphy0: ethernet-phy@0 {
174 device_type = "ethernet-phy";
175 reg = <0>;
176 };
177};
178
179&eth0 {
180 status = "okay";
181 ethernet0-port@0 {
182 phy-handle = <&ethphy0>;
183 };
184};
diff --git a/arch/arm/boot/dts/kirkwood-sheevaplug-common.dtsi b/arch/arm/boot/dts/kirkwood-sheevaplug-common.dtsi
index f7143f128504..5696b630b70b 100644
--- a/arch/arm/boot/dts/kirkwood-sheevaplug-common.dtsi
+++ b/arch/arm/boot/dts/kirkwood-sheevaplug-common.dtsi
@@ -6,8 +6,8 @@
6 * Licensed under GPLv2 6 * Licensed under GPLv2
7 */ 7 */
8 8
9/include/ "kirkwood.dtsi" 9#include "kirkwood.dtsi"
10/include/ "kirkwood-6281.dtsi" 10#include "kirkwood-6281.dtsi"
11 11
12/ { 12/ {
13 memory { 13 memory {
@@ -91,3 +91,19 @@
91 }; 91 };
92 }; 92 };
93}; 93};
94
95&mdio {
96 status = "okay";
97
98 ethphy0: ethernet-phy@0 {
99 device_type = "ethernet-phy";
100 reg = <0>;
101 };
102};
103
104&eth0 {
105 status = "okay";
106 ethernet0-port@0 {
107 phy-handle = <&ethphy0>;
108 };
109};
diff --git a/arch/arm/boot/dts/kirkwood-sheevaplug-esata.dts b/arch/arm/boot/dts/kirkwood-sheevaplug-esata.dts
index f620ce48de97..eac6a21f3b1f 100644
--- a/arch/arm/boot/dts/kirkwood-sheevaplug-esata.dts
+++ b/arch/arm/boot/dts/kirkwood-sheevaplug-esata.dts
@@ -8,7 +8,7 @@
8 8
9/dts-v1/; 9/dts-v1/;
10 10
11/include/ "kirkwood-sheevaplug-common.dtsi" 11#include "kirkwood-sheevaplug-common.dtsi"
12 12
13/ { 13/ {
14 model = "Globalscale Technologies eSATA SheevaPlug"; 14 model = "Globalscale Technologies eSATA SheevaPlug";
diff --git a/arch/arm/boot/dts/kirkwood-sheevaplug.dts b/arch/arm/boot/dts/kirkwood-sheevaplug.dts
index bf1dff251432..bb61918313db 100644
--- a/arch/arm/boot/dts/kirkwood-sheevaplug.dts
+++ b/arch/arm/boot/dts/kirkwood-sheevaplug.dts
@@ -8,7 +8,7 @@
8 8
9/dts-v1/; 9/dts-v1/;
10 10
11/include/ "kirkwood-sheevaplug-common.dtsi" 11#include "kirkwood-sheevaplug-common.dtsi"
12 12
13/ { 13/ {
14 model = "Globalscale Technologies SheevaPlug"; 14 model = "Globalscale Technologies SheevaPlug";
diff --git a/arch/arm/boot/dts/kirkwood-topkick.dts b/arch/arm/boot/dts/kirkwood-topkick.dts
index f2052d7bc10f..30842b4ff293 100644
--- a/arch/arm/boot/dts/kirkwood-topkick.dts
+++ b/arch/arm/boot/dts/kirkwood-topkick.dts
@@ -1,7 +1,7 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood.dtsi" 3#include "kirkwood.dtsi"
4/include/ "kirkwood-6282.dtsi" 4#include "kirkwood-6282.dtsi"
5 5
6/ { 6/ {
7 model = "Univeral Scientific Industrial Co. Topkick-1281P2"; 7 model = "Univeral Scientific Industrial Co. Topkick-1281P2";
@@ -203,3 +203,19 @@
203 }; 203 };
204 }; 204 };
205}; 205};
206
207&mdio {
208 status = "okay";
209
210 ethphy0: ethernet-phy@0 {
211 device_type = "ethernet-phy";
212 reg = <0>;
213 };
214};
215
216&eth0 {
217 status = "okay";
218 ethernet0-port@0 {
219 phy-handle = <&ethphy0>;
220 };
221};
diff --git a/arch/arm/boot/dts/kirkwood-ts219-6281.dts b/arch/arm/boot/dts/kirkwood-ts219-6281.dts
index 6dd1038e4de4..f755bc1dc604 100644
--- a/arch/arm/boot/dts/kirkwood-ts219-6281.dts
+++ b/arch/arm/boot/dts/kirkwood-ts219-6281.dts
@@ -1,8 +1,8 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood.dtsi" 3#include "kirkwood.dtsi"
4/include/ "kirkwood-6281.dtsi" 4#include "kirkwood-6281.dtsi"
5/include/ "kirkwood-ts219.dtsi" 5#include "kirkwood-ts219.dtsi"
6 6
7/ { 7/ {
8 ocp@f1000000 { 8 ocp@f1000000 {
@@ -50,4 +50,6 @@
50 gpios = <&gpio0 16 1>; 50 gpios = <&gpio0 16 1>;
51 }; 51 };
52 }; 52 };
53}; \ No newline at end of file 53};
54
55&ethphy0 { reg = <8>; };
diff --git a/arch/arm/boot/dts/kirkwood-ts219-6282.dts b/arch/arm/boot/dts/kirkwood-ts219-6282.dts
index 6fdc5ffcaae5..9efcd2dc79d3 100644
--- a/arch/arm/boot/dts/kirkwood-ts219-6282.dts
+++ b/arch/arm/boot/dts/kirkwood-ts219-6282.dts
@@ -1,10 +1,21 @@
1/dts-v1/; 1/dts-v1/;
2 2
3/include/ "kirkwood.dtsi" 3#include "kirkwood.dtsi"
4/include/ "kirkwood-6282.dtsi" 4#include "kirkwood-6282.dtsi"
5/include/ "kirkwood-ts219.dtsi" 5#include "kirkwood-ts219.dtsi"
6 6
7/ { 7/ {
8 mbus {
9 ranges = <MBUS_ID(0xf0, 0x01) 0 0xf1000000 0x100000>;
10 pcie-controller {
11 status = "okay";
12
13 pcie@2,0 {
14 status = "okay";
15 };
16 };
17 };
18
8 ocp@f1000000 { 19 ocp@f1000000 {
9 pinctrl: pinctrl@10000 { 20 pinctrl: pinctrl@10000 {
10 21
@@ -30,14 +41,6 @@
30 marvell,function = "gpio"; 41 marvell,function = "gpio";
31 }; 42 };
32 }; 43 };
33 pcie-controller {
34 status = "okay";
35
36 pcie@2,0 {
37 status = "okay";
38 };
39 };
40
41 }; 44 };
42 45
43 gpio_keys { 46 gpio_keys {
@@ -58,4 +61,6 @@
58 gpios = <&gpio1 5 1>; 61 gpios = <&gpio1 5 1>;
59 }; 62 };
60 }; 63 };
61}; \ No newline at end of file 64};
65
66&ethphy0 { reg = <0>; };
diff --git a/arch/arm/boot/dts/kirkwood-ts219.dtsi b/arch/arm/boot/dts/kirkwood-ts219.dtsi
index 0c9a94cd666c..39158cf16258 100644
--- a/arch/arm/boot/dts/kirkwood-ts219.dtsi
+++ b/arch/arm/boot/dts/kirkwood-ts219.dtsi
@@ -11,6 +11,16 @@
11 bootargs = "console=ttyS0,115200n8"; 11 bootargs = "console=ttyS0,115200n8";
12 }; 12 };
13 13
14 mbus {
15 pcie-controller {
16 status = "okay";
17
18 pcie@1,0 {
19 status = "okay";
20 };
21 };
22 };
23
14 ocp@f1000000 { 24 ocp@f1000000 {
15 i2c@11000 { 25 i2c@11000 {
16 status = "okay"; 26 status = "okay";
@@ -87,12 +97,21 @@
87 status = "okay"; 97 status = "okay";
88 nr-ports = <2>; 98 nr-ports = <2>;
89 }; 99 };
90 pcie-controller { 100 };
91 status = "okay"; 101};
92 102
93 pcie@1,0 { 103&mdio {
94 status = "okay"; 104 status = "okay";
95 }; 105
96 }; 106 ethphy0: ethernet-phy {
107 device_type = "ethernet-phy";
108 /* overwrite reg property in board file */
109 };
110};
111
112&eth0 {
113 status = "okay";
114 ethernet0-port@0 {
115 phy-handle = <&ethphy0>;
97 }; 116 };
98}; 117};
diff --git a/arch/arm/boot/dts/kirkwood.dtsi b/arch/arm/boot/dts/kirkwood.dtsi
index 9809fc1f105c..cf7aeaf89e9c 100644
--- a/arch/arm/boot/dts/kirkwood.dtsi
+++ b/arch/arm/boot/dts/kirkwood.dtsi
@@ -1,5 +1,7 @@
1/include/ "skeleton.dtsi" 1/include/ "skeleton.dtsi"
2 2
3#define MBUS_ID(target,attributes) (((target) << 24) | ((attributes) << 16))
4
3/ { 5/ {
4 compatible = "marvell,kirkwood"; 6 compatible = "marvell,kirkwood";
5 interrupt-parent = <&intc>; 7 interrupt-parent = <&intc>;
@@ -20,23 +22,53 @@
20 gpio0 = &gpio0; 22 gpio0 = &gpio0;
21 gpio1 = &gpio1; 23 gpio1 = &gpio1;
22 }; 24 };
23 intc: interrupt-controller { 25
24 compatible = "marvell,orion-intc", "marvell,intc"; 26 mbus {
25 interrupt-controller; 27 compatible = "marvell,kirkwood-mbus", "simple-bus";
26 #interrupt-cells = <1>; 28 #address-cells = <2>;
27 reg = <0xf1020204 0x04>, 29 #size-cells = <1>;
28 <0xf1020214 0x04>; 30 controller = <&mbusc>;
31 pcie-mem-aperture = <0xe0000000 0x10000000>; /* 256 MiB memory space */
32 pcie-io-aperture = <0xf2000000 0x100000>; /* 1 MiB I/O space */
29 }; 33 };
30 34
31 ocp@f1000000 { 35 ocp@f1000000 {
32 compatible = "simple-bus"; 36 compatible = "simple-bus";
33 ranges = <0x00000000 0xf1000000 0x0100000 37 ranges = <0x00000000 0xf1000000 0x0100000
34 0xe0000000 0xe0000000 0x8100000 /* PCIE */
35 0xf4000000 0xf4000000 0x0000400 38 0xf4000000 0xf4000000 0x0000400
36 0xf5000000 0xf5000000 0x0000400>; 39 0xf5000000 0xf5000000 0x0000400>;
37 #address-cells = <1>; 40 #address-cells = <1>;
38 #size-cells = <1>; 41 #size-cells = <1>;
39 42
43 mbusc: mbus-controller@20000 {
44 compatible = "marvell,mbus-controller";
45 reg = <0x20000 0x80>, <0x1500 0x20>;
46 };
47
48 timer: timer@20300 {
49 compatible = "marvell,orion-timer";
50 reg = <0x20300 0x20>;
51 interrupt-parent = <&bridge_intc>;
52 interrupts = <1>, <2>;
53 clocks = <&core_clk 0>;
54 };
55
56 intc: main-interrupt-ctrl@20200 {
57 compatible = "marvell,orion-intc";
58 interrupt-controller;
59 #interrupt-cells = <1>;
60 reg = <0x20200 0x10>, <0x20210 0x10>;
61 };
62
63 bridge_intc: bridge-interrupt-ctrl@20110 {
64 compatible = "marvell,orion-bridge-intc";
65 interrupt-controller;
66 #interrupt-cells = <1>;
67 reg = <0x20110 0x8>;
68 interrupts = <1>;
69 marvell,#interrupts = <6>;
70 };
71
40 core_clk: core-clocks@10030 { 72 core_clk: core-clocks@10030 {
41 compatible = "marvell,kirkwood-core-clock"; 73 compatible = "marvell,kirkwood-core-clock";
42 reg = <0x10030 0x4>; 74 reg = <0x10030 0x4>;
@@ -103,9 +135,11 @@
103 #clock-cells = <1>; 135 #clock-cells = <1>;
104 }; 136 };
105 137
106 wdt@20300 { 138 wdt: watchdog-timer@20300 {
107 compatible = "marvell,orion-wdt"; 139 compatible = "marvell,orion-wdt";
108 reg = <0x20300 0x28>; 140 reg = <0x20300 0x28>;
141 interrupt-parent = <&bridge_intc>;
142 interrupts = <3>;
109 clocks = <&gate_clk 7>; 143 clocks = <&gate_clk 7>;
110 status = "okay"; 144 status = "okay";
111 }; 145 };
@@ -192,5 +226,57 @@
192 clocks = <&gate_clk 17>; 226 clocks = <&gate_clk 17>;
193 status = "okay"; 227 status = "okay";
194 }; 228 };
229
230 mdio: mdio-bus@72004 {
231 compatible = "marvell,orion-mdio";
232 #address-cells = <1>;
233 #size-cells = <0>;
234 reg = <0x72004 0x84>;
235 interrupts = <46>;
236 clocks = <&gate_clk 0>;
237 status = "disabled";
238
239 /* add phy nodes in board file */
240 };
241
242 eth0: ethernet-controller@72000 {
243 compatible = "marvell,kirkwood-eth";
244 #address-cells = <1>;
245 #size-cells = <0>;
246 reg = <0x72000 0x4000>;
247 clocks = <&gate_clk 0>;
248 marvell,tx-checksum-limit = <1600>;
249 status = "disabled";
250
251 ethernet0-port@0 {
252 device_type = "network";
253 compatible = "marvell,kirkwood-eth-port";
254 reg = <0>;
255 interrupts = <11>;
256 /* overwrite MAC address in bootloader */
257 local-mac-address = [00 00 00 00 00 00];
258 /* set phy-handle property in board file */
259 };
260 };
261
262 eth1: ethernet-controller@76000 {
263 compatible = "marvell,kirkwood-eth";
264 #address-cells = <1>;
265 #size-cells = <0>;
266 reg = <0x76000 0x4000>;
267 clocks = <&gate_clk 19>;
268 marvell,tx-checksum-limit = <1600>;
269 status = "disabled";
270
271 ethernet1-port@0 {
272 device_type = "network";
273 compatible = "marvell,kirkwood-eth-port";
274 reg = <0>;
275 interrupts = <15>;
276 /* overwrite MAC address in bootloader */
277 local-mac-address = [00 00 00 00 00 00];
278 /* set phy-handle property in board file */
279 };
280 };
195 }; 281 };
196}; 282};
diff --git a/arch/arm/boot/dts/msm8660-surf.dts b/arch/arm/boot/dts/msm8660-surf.dts
index cdc010e0f93e..386d42870215 100644
--- a/arch/arm/boot/dts/msm8660-surf.dts
+++ b/arch/arm/boot/dts/msm8660-surf.dts
@@ -38,7 +38,7 @@
38 }; 38 };
39 39
40 serial@19c40000 { 40 serial@19c40000 {
41 compatible = "qcom,msm-hsuart", "qcom,msm-uart"; 41 compatible = "qcom,msm-uartdm-v1.3", "qcom,msm-uartdm";
42 reg = <0x19c40000 0x1000>, 42 reg = <0x19c40000 0x1000>,
43 <0x19c00000 0x1000>; 43 <0x19c00000 0x1000>;
44 interrupts = <0 195 0x0>; 44 interrupts = <0 195 0x0>;
diff --git a/arch/arm/boot/dts/msm8960-cdp.dts b/arch/arm/boot/dts/msm8960-cdp.dts
index 9c1167b0459b..93e9f7e0b7ad 100644
--- a/arch/arm/boot/dts/msm8960-cdp.dts
+++ b/arch/arm/boot/dts/msm8960-cdp.dts
@@ -38,7 +38,7 @@
38 }; 38 };
39 39
40 serial@16440000 { 40 serial@16440000 {
41 compatible = "qcom,msm-hsuart", "qcom,msm-uart"; 41 compatible = "qcom,msm-uartdm-v1.3", "qcom,msm-uartdm";
42 reg = <0x16440000 0x1000>, 42 reg = <0x16440000 0x1000>,
43 <0x16400000 0x1000>; 43 <0x16400000 0x1000>;
44 interrupts = <0 154 0x0>; 44 interrupts = <0 154 0x0>;
diff --git a/arch/arm/boot/dts/omap3-beagle-xm.dts b/arch/arm/boot/dts/omap3-beagle-xm.dts
index afdb16417d4e..0c514dc8460c 100644
--- a/arch/arm/boot/dts/omap3-beagle-xm.dts
+++ b/arch/arm/boot/dts/omap3-beagle-xm.dts
@@ -11,7 +11,7 @@
11 11
12/ { 12/ {
13 model = "TI OMAP3 BeagleBoard xM"; 13 model = "TI OMAP3 BeagleBoard xM";
14 compatible = "ti,omap3-beagle-xm, ti,omap3-beagle", "ti,omap3"; 14 compatible = "ti,omap3-beagle-xm", "ti,omap3-beagle", "ti,omap3";
15 15
16 cpus { 16 cpus {
17 cpu@0 { 17 cpu@0 {
diff --git a/arch/arm/boot/dts/omap3-igep.dtsi b/arch/arm/boot/dts/omap3-igep.dtsi
index bc48b114eae6..2326d11462a5 100644
--- a/arch/arm/boot/dts/omap3-igep.dtsi
+++ b/arch/arm/boot/dts/omap3-igep.dtsi
@@ -48,6 +48,15 @@
48 >; 48 >;
49 }; 49 };
50 50
51 mcbsp2_pins: pinmux_mcbsp2_pins {
52 pinctrl-single,pins = <
53 0x10c (PIN_INPUT | MUX_MODE0) /* mcbsp2_fsx.mcbsp2_fsx */
54 0x10e (PIN_INPUT | MUX_MODE0) /* mcbsp2_clkx.mcbsp2_clkx */
55 0x110 (PIN_INPUT | MUX_MODE0) /* mcbsp2_dr.mcbsp2.dr */
56 0x112 (PIN_OUTPUT | MUX_MODE0) /* mcbsp2_dx.mcbsp2_dx */
57 >;
58 };
59
51 mmc1_pins: pinmux_mmc1_pins { 60 mmc1_pins: pinmux_mmc1_pins {
52 pinctrl-single,pins = < 61 pinctrl-single,pins = <
53 0x114 (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc1_clk.sdmmc1_clk */ 62 0x114 (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc1_clk.sdmmc1_clk */
@@ -93,6 +102,11 @@
93 clock-frequency = <400000>; 102 clock-frequency = <400000>;
94}; 103};
95 104
105&mcbsp2 {
106 pinctrl-names = "default";
107 pinctrl-0 = <&mcbsp2_pins>;
108};
109
96&mmc1 { 110&mmc1 {
97 pinctrl-names = "default"; 111 pinctrl-names = "default";
98 pinctrl-0 = <&mmc1_pins>; 112 pinctrl-0 = <&mmc1_pins>;
diff --git a/arch/arm/boot/dts/omap4-panda-common.dtsi b/arch/arm/boot/dts/omap4-panda-common.dtsi
index faa95b5b242e..814ab67c8c29 100644
--- a/arch/arm/boot/dts/omap4-panda-common.dtsi
+++ b/arch/arm/boot/dts/omap4-panda-common.dtsi
@@ -107,6 +107,19 @@
107 */ 107 */
108 clock-frequency = <19200000>; 108 clock-frequency = <19200000>;
109 }; 109 };
110
111 /* regulator for wl12xx on sdio5 */
112 wl12xx_vmmc: wl12xx_vmmc {
113 pinctrl-names = "default";
114 pinctrl-0 = <&wl12xx_gpio>;
115 compatible = "regulator-fixed";
116 regulator-name = "vwl1271";
117 regulator-min-microvolt = <1800000>;
118 regulator-max-microvolt = <1800000>;
119 gpio = <&gpio2 11 0>;
120 startup-delay-us = <70000>;
121 enable-active-high;
122 };
110}; 123};
111 124
112&omap4_pmx_wkup { 125&omap4_pmx_wkup {
@@ -235,6 +248,33 @@
235 0x1c (PIN_OUTPUT | MUX_MODE3) /* gpio_wk8 */ 248 0x1c (PIN_OUTPUT | MUX_MODE3) /* gpio_wk8 */
236 >; 249 >;
237 }; 250 };
251
252 /*
253 * wl12xx GPIO outputs for WLAN_EN, BT_EN, FM_EN, BT_WAKEUP
254 * REVISIT: Are the pull-ups needed for GPIO 48 and 49?
255 */
256 wl12xx_gpio: pinmux_wl12xx_gpio {
257 pinctrl-single,pins = <
258 0x26 (PIN_OUTPUT | MUX_MODE3) /* gpmc_a19.gpio_43 */
259 0x2c (PIN_OUTPUT | MUX_MODE3) /* gpmc_a22.gpio_46 */
260 0x30 (PIN_OUTPUT_PULLUP | MUX_MODE3) /* gpmc_a24.gpio_48 */
261 0x32 (PIN_OUTPUT_PULLUP | MUX_MODE3) /* gpmc_a25.gpio_49 */
262 >;
263 };
264
265 /* wl12xx GPIO inputs and SDIO pins */
266 wl12xx_pins: pinmux_wl12xx_pins {
267 pinctrl-single,pins = <
268 0x38 (PIN_INPUT | MUX_MODE3) /* gpmc_ncs2.gpio_52 */
269 0x3a (PIN_INPUT | MUX_MODE3) /* gpmc_ncs3.gpio_53 */
270 0x108 (PIN_OUTPUT | MUX_MODE0) /* sdmmc5_clk.sdmmc5_clk */
271 0x10a (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc5_cmd.sdmmc5_cmd */
272 0x10c (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc5_dat0.sdmmc5_dat0 */
273 0x10e (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc5_dat1.sdmmc5_dat1 */
274 0x110 (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc5_dat2.sdmmc5_dat2 */
275 0x112 (PIN_INPUT_PULLUP | MUX_MODE0) /* sdmmc5_dat3.sdmmc5_dat3 */
276 >;
277 };
238}; 278};
239 279
240&i2c1 { 280&i2c1 {
@@ -314,8 +354,12 @@
314}; 354};
315 355
316&mmc5 { 356&mmc5 {
317 ti,non-removable; 357 pinctrl-names = "default";
358 pinctrl-0 = <&wl12xx_pins>;
359 vmmc-supply = <&wl12xx_vmmc>;
360 non-removable;
318 bus-width = <4>; 361 bus-width = <4>;
362 cap-power-off-card;
319}; 363};
320 364
321&emif1 { 365&emif1 {
diff --git a/arch/arm/boot/dts/omap4-sdp.dts b/arch/arm/boot/dts/omap4-sdp.dts
index 7951b4ea500a..4f78380ecdb8 100644
--- a/arch/arm/boot/dts/omap4-sdp.dts
+++ b/arch/arm/boot/dts/omap4-sdp.dts
@@ -140,6 +140,19 @@
140 "DMic", "Digital Mic", 140 "DMic", "Digital Mic",
141 "Digital Mic", "Digital Mic1 Bias"; 141 "Digital Mic", "Digital Mic1 Bias";
142 }; 142 };
143
144 /* regulator for wl12xx on sdio5 */
145 wl12xx_vmmc: wl12xx_vmmc {
146 pinctrl-names = "default";
147 pinctrl-0 = <&wl12xx_gpio>;
148 compatible = "regulator-fixed";
149 regulator-name = "vwl1271";
150 regulator-min-microvolt = <1800000>;
151 regulator-max-microvolt = <1800000>;
152 gpio = <&gpio2 22 0>;
153 startup-delay-us = <70000>;
154 enable-active-high;
155 };
143}; 156};
144 157
145&omap4_pmx_wkup { 158&omap4_pmx_wkup {
@@ -295,6 +308,26 @@
295 0xf0 (PIN_INPUT_PULLUP | MUX_MODE0) /* i2c4_sda */ 308 0xf0 (PIN_INPUT_PULLUP | MUX_MODE0) /* i2c4_sda */
296 >; 309 >;
297 }; 310 };
311
312 /* wl12xx GPIO output for WLAN_EN */
313 wl12xx_gpio: pinmux_wl12xx_gpio {
314 pinctrl-single,pins = <
315 0x3c (PIN_OUTPUT | MUX_MODE3) /* gpmc_nwp.gpio_54 */
316 >;
317 };
318
319 /* wl12xx GPIO inputs and SDIO pins */
320 wl12xx_pins: pinmux_wl12xx_pins {
321 pinctrl-single,pins = <
322 0x3a (PIN_INPUT | MUX_MODE3) /* gpmc_ncs3.gpio_53 */
323 0x108 (PIN_OUTPUT | MUX_MODE3) /* sdmmc5_clk.sdmmc5_clk */
324 0x10a (PIN_INPUT_PULLUP | MUX_MODE3) /* sdmmc5_cmd.sdmmc5_cmd */
325 0x10c (PIN_INPUT_PULLUP | MUX_MODE3) /* sdmmc5_dat0.sdmmc5_dat0 */
326 0x10e (PIN_INPUT_PULLUP | MUX_MODE3) /* sdmmc5_dat1.sdmmc5_dat1 */
327 0x110 (PIN_INPUT_PULLUP | MUX_MODE3) /* sdmmc5_dat2.sdmmc5_dat2 */
328 0x112 (PIN_INPUT_PULLUP | MUX_MODE3) /* sdmmc5_dat3.sdmmc5_dat3 */
329 >;
330 };
298}; 331};
299 332
300&i2c1 { 333&i2c1 {
@@ -420,8 +453,12 @@
420}; 453};
421 454
422&mmc5 { 455&mmc5 {
456 pinctrl-names = "default";
457 pinctrl-0 = <&wl12xx_pins>;
458 vmmc-supply = <&wl12xx_vmmc>;
459 non-removable;
423 bus-width = <4>; 460 bus-width = <4>;
424 ti,non-removable; 461 cap-power-off-card;
425}; 462};
426 463
427&emif1 { 464&emif1 {
diff --git a/arch/arm/boot/dts/omap5.dtsi b/arch/arm/boot/dts/omap5.dtsi
index e643620417a9..7cdea1bfea09 100644
--- a/arch/arm/boot/dts/omap5.dtsi
+++ b/arch/arm/boot/dts/omap5.dtsi
@@ -637,25 +637,26 @@
637 omap_dwc3@4a020000 { 637 omap_dwc3@4a020000 {
638 compatible = "ti,dwc3"; 638 compatible = "ti,dwc3";
639 ti,hwmods = "usb_otg_ss"; 639 ti,hwmods = "usb_otg_ss";
640 reg = <0x4a020000 0x1000>; 640 reg = <0x4a020000 0x10000>;
641 interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>; 641 interrupts = <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH>;
642 #address-cells = <1>; 642 #address-cells = <1>;
643 #size-cells = <1>; 643 #size-cells = <1>;
644 utmi-mode = <2>; 644 utmi-mode = <2>;
645 ranges; 645 ranges;
646 dwc3@4a030000 { 646 dwc3@4a030000 {
647 compatible = "synopsys,dwc3"; 647 compatible = "snps,dwc3";
648 reg = <0x4a030000 0x1000>; 648 reg = <0x4a030000 0x10000>;
649 interrupts = <GIC_SPI 92 IRQ_TYPE_LEVEL_HIGH>; 649 interrupts = <GIC_SPI 92 IRQ_TYPE_LEVEL_HIGH>;
650 usb-phy = <&usb2_phy>, <&usb3_phy>; 650 usb-phy = <&usb2_phy>, <&usb3_phy>;
651 tx-fifo-resize; 651 tx-fifo-resize;
652 }; 652 };
653 }; 653 };
654 654
655 ocp2scp { 655 ocp2scp@4a080000 {
656 compatible = "ti,omap-ocp2scp"; 656 compatible = "ti,omap-ocp2scp";
657 #address-cells = <1>; 657 #address-cells = <1>;
658 #size-cells = <1>; 658 #size-cells = <1>;
659 reg = <0x4a080000 0x20>;
659 ranges; 660 ranges;
660 ti,hwmods = "ocp2scp1"; 661 ti,hwmods = "ocp2scp1";
661 usb2_phy: usb2phy@4a084000 { 662 usb2_phy: usb2phy@4a084000 {
diff --git a/arch/arm/boot/dts/orion5x-lacie-ethernet-disk-mini-v2.dts b/arch/arm/boot/dts/orion5x-lacie-ethernet-disk-mini-v2.dts
index 0077fc8510b7..aed83deaa991 100644
--- a/arch/arm/boot/dts/orion5x-lacie-ethernet-disk-mini-v2.dts
+++ b/arch/arm/boot/dts/orion5x-lacie-ethernet-disk-mini-v2.dts
@@ -53,3 +53,20 @@
53 }; 53 };
54 }; 54 };
55}; 55};
56
57&mdio {
58 status = "okay";
59
60 ethphy: ethernet-phy {
61 device-type = "ethernet-phy";
62 reg = <8>;
63 };
64};
65
66&eth {
67 status = "okay";
68
69 ethernet-port@0 {
70 phy-handle = <&ethphy>;
71 };
72};
diff --git a/arch/arm/boot/dts/orion5x.dtsi b/arch/arm/boot/dts/orion5x.dtsi
index 892c64e3f1e1..e06c37e91ac6 100644
--- a/arch/arm/boot/dts/orion5x.dtsi
+++ b/arch/arm/boot/dts/orion5x.dtsi
@@ -16,11 +16,12 @@
16 aliases { 16 aliases {
17 gpio0 = &gpio0; 17 gpio0 = &gpio0;
18 }; 18 };
19
19 intc: interrupt-controller { 20 intc: interrupt-controller {
20 compatible = "marvell,orion-intc", "marvell,intc"; 21 compatible = "marvell,orion-intc";
21 interrupt-controller; 22 interrupt-controller;
22 #interrupt-cells = <1>; 23 #interrupt-cells = <1>;
23 reg = <0xf1020204 0x04>; 24 reg = <0xf1020200 0x08>;
24 }; 25 };
25 26
26 ocp@f1000000 { 27 ocp@f1000000 {
@@ -132,5 +133,34 @@
132 interrupts = <28>; 133 interrupts = <28>;
133 status = "okay"; 134 status = "okay";
134 }; 135 };
136
137 mdio: mdio-bus@72004 {
138 compatible = "marvell,orion-mdio";
139 #address-cells = <1>;
140 #size-cells = <0>;
141 reg = <0x72004 0x84>;
142 interrupts = <22>;
143 status = "disabled";
144
145 /* add phy nodes in board file */
146 };
147
148 eth: ethernet-controller@72000 {
149 compatible = "marvell,orion-eth";
150 #address-cells = <1>;
151 #size-cells = <0>;
152 reg = <0x72000 0x4000>;
153 marvell,tx-checksum-limit = <1600>;
154 status = "disabled";
155
156 ethernet-port@0 {
157 device_type = "network";
158 compatible = "marvell,orion-eth-port";
159 reg = <0>;
160 /* overwrite MAC address in bootloader */
161 local-mac-address = [00 00 00 00 00 00];
162 /* set phy-handle property in board file */
163 };
164 };
135 }; 165 };
136}; 166};
diff --git a/arch/arm/boot/dts/pxa3xx.dtsi b/arch/arm/boot/dts/pxa3xx.dtsi
index f9d92da86783..83bb0eff697b 100644
--- a/arch/arm/boot/dts/pxa3xx.dtsi
+++ b/arch/arm/boot/dts/pxa3xx.dtsi
@@ -28,5 +28,16 @@
28 marvell,intc-priority; 28 marvell,intc-priority;
29 marvell,intc-nr-irqs = <56>; 29 marvell,intc-nr-irqs = <56>;
30 }; 30 };
31
32 gpio: gpio@40e00000 {
33 compatible = "intel,pxa3xx-gpio";
34 reg = <0x40e00000 0x10000>;
35 interrupt-names = "gpio0", "gpio1", "gpio_mux";
36 interrupts = <8 9 10>;
37 gpio-controller;
38 #gpio-cells = <0x2>;
39 interrupt-controller;
40 #interrupt-cells = <0x2>;
41 };
31 }; 42 };
32}; 43};
diff --git a/arch/arm/boot/dts/r8a73a4-ape6evm-reference.dts b/arch/arm/boot/dts/r8a73a4-ape6evm-reference.dts
new file mode 100644
index 000000000000..f444624eb097
--- /dev/null
+++ b/arch/arm/boot/dts/r8a73a4-ape6evm-reference.dts
@@ -0,0 +1,65 @@
1/*
2 * Device Tree Source for the APE6EVM board
3 *
4 * Copyright (C) 2013 Renesas Solutions Corp.
5 *
6 * This file is licensed under the terms of the GNU General Public License
7 * version 2. This program is licensed "as is" without any warranty of any
8 * kind, whether express or implied.
9 */
10
11/dts-v1/;
12/include/ "r8a73a4.dtsi"
13
14/ {
15 model = "APE6EVM";
16 compatible = "renesas,ape6evm-reference", "renesas,r8a73a4";
17
18 chosen {
19 bootargs = "console=ttySC0,115200 ignore_loglevel rw";
20 };
21
22 memory@40000000 {
23 device_type = "memory";
24 reg = <0 0x40000000 0 0x40000000>;
25 };
26
27 lbsc {
28 compatible = "simple-bus";
29 #address-cells = <1>;
30 #size-cells = <1>;
31 ranges = <0 0 0 0x80000000>;
32 };
33};
34
35&i2c5 {
36 vdd_dvfs: max8973@1b {
37 compatible = "maxim,max8973";
38 reg = <0x1b>;
39
40 regulator-min-microvolt = <935000>;
41 regulator-max-microvolt = <1200000>;
42 regulator-boot-on;
43 regulator-always-on;
44 };
45};
46
47&cpu0 {
48 cpu0-supply = <&vdd_dvfs>;
49 operating-points = <
50 /* kHz uV */
51 1950000 1115000
52 1462500 995000
53 >;
54 voltage-tolerance = <1>; /* 1% */
55};
56
57&pfc {
58 pinctrl-0 = <&scifa0_pins>;
59 pinctrl-names = "default";
60
61 scifa0_pins: scifa0 {
62 renesas,groups = "scifa0_data";
63 renesas,function = "scifa0";
64 };
65};
diff --git a/arch/arm/boot/dts/r8a73a4-ape6evm.dts b/arch/arm/boot/dts/r8a73a4-ape6evm.dts
index f603c6946c29..72f867e65791 100644
--- a/arch/arm/boot/dts/r8a73a4-ape6evm.dts
+++ b/arch/arm/boot/dts/r8a73a4-ape6evm.dts
@@ -16,7 +16,7 @@
16 compatible = "renesas,ape6evm", "renesas,r8a73a4"; 16 compatible = "renesas,ape6evm", "renesas,r8a73a4";
17 17
18 chosen { 18 chosen {
19 bootargs = "console=ttySC0,115200 ignore_loglevel root=/dev/nfs ip=dhcp"; 19 bootargs = "console=ttySC0,115200 ignore_loglevel root=/dev/nfs ip=dhcp rw";
20 }; 20 };
21 21
22 memory@40000000 { 22 memory@40000000 {
@@ -50,3 +50,25 @@
50 }; 50 };
51 }; 51 };
52}; 52};
53
54&i2c5 {
55 vdd_dvfs: max8973@1b {
56 compatible = "maxim,max8973";
57 reg = <0x1b>;
58
59 regulator-min-microvolt = <935000>;
60 regulator-max-microvolt = <1200000>;
61 regulator-boot-on;
62 regulator-always-on;
63 };
64};
65
66&cpu0 {
67 cpu0-supply = <&vdd_dvfs>;
68 operating-points = <
69 /* kHz uV */
70 1950000 1115000
71 1462500 995000
72 >;
73 voltage-tolerance = <1>; /* 1% */
74};
diff --git a/arch/arm/boot/dts/r8a73a4.dtsi b/arch/arm/boot/dts/r8a73a4.dtsi
index 4ff2019c0e30..6c26caa880f2 100644
--- a/arch/arm/boot/dts/r8a73a4.dtsi
+++ b/arch/arm/boot/dts/r8a73a4.dtsi
@@ -85,4 +85,137 @@
85 interrupt-parent = <&gic>; 85 interrupt-parent = <&gic>;
86 interrupts = <0 69 4>; 86 interrupts = <0 69 4>;
87 }; 87 };
88
89 i2c0: i2c@e6500000 {
90 #address-cells = <1>;
91 #size-cells = <0>;
92 compatible = "renesas,rmobile-iic";
93 reg = <0 0xe6500000 0 0x428>;
94 interrupt-parent = <&gic>;
95 interrupts = <0 174 0x4>;
96 };
97
98 i2c1: i2c@e6510000 {
99 #address-cells = <1>;
100 #size-cells = <0>;
101 compatible = "renesas,rmobile-iic";
102 reg = <0 0xe6510000 0 0x428>;
103 interrupt-parent = <&gic>;
104 interrupts = <0 175 0x4>;
105 };
106
107 i2c2: i2c@e6520000 {
108 #address-cells = <1>;
109 #size-cells = <0>;
110 compatible = "renesas,rmobile-iic";
111 reg = <0 0xe6520000 0 0x428>;
112 interrupt-parent = <&gic>;
113 interrupts = <0 176 0x4>;
114 };
115
116 i2c3: i2c@e6530000 {
117 #address-cells = <1>;
118 #size-cells = <0>;
119 compatible = "renesas,rmobile-iic";
120 reg = <0 0xe6530000 0 0x428>;
121 interrupt-parent = <&gic>;
122 interrupts = <0 177 0x4>;
123 };
124
125 i2c4: i2c@e6540000 {
126 #address-cells = <1>;
127 #size-cells = <0>;
128 compatible = "renesas,rmobile-iic";
129 reg = <0 0xe6540000 0 0x428>;
130 interrupt-parent = <&gic>;
131 interrupts = <0 178 0x4>;
132 };
133
134 i2c5: i2c@e60b0000 {
135 #address-cells = <1>;
136 #size-cells = <0>;
137 compatible = "renesas,rmobile-iic";
138 reg = <0 0xe60b0000 0 0x428>;
139 interrupt-parent = <&gic>;
140 interrupts = <0 179 0x4>;
141 };
142
143 i2c6: i2c@e6550000 {
144 #address-cells = <1>;
145 #size-cells = <0>;
146 compatible = "renesas,rmobile-iic";
147 reg = <0 0xe6550000 0 0x428>;
148 interrupt-parent = <&gic>;
149 interrupts = <0 184 0x4>;
150 };
151
152 i2c7: i2c@e6560000 {
153 #address-cells = <1>;
154 #size-cells = <0>;
155 compatible = "renesas,rmobile-iic";
156 reg = <0 0xe6560000 0 0x428>;
157 interrupt-parent = <&gic>;
158 interrupts = <0 185 0x4>;
159 };
160
161 i2c8: i2c@e6570000 {
162 #address-cells = <1>;
163 #size-cells = <0>;
164 compatible = "renesas,rmobile-iic";
165 reg = <0 0xe6570000 0 0x428>;
166 interrupt-parent = <&gic>;
167 interrupts = <0 173 0x4>;
168 };
169
170 mmcif0: mmcif@ee200000 {
171 compatible = "renesas,sh-mmcif";
172 reg = <0 0xee200000 0 0x80>;
173 interrupt-parent = <&gic>;
174 interrupts = <0 169 0x4>;
175 reg-io-width = <4>;
176 status = "disabled";
177 };
178
179 mmcif1: mmcif@ee220000 {
180 compatible = "renesas,sh-mmcif";
181 reg = <0 0xee220000 0 0x80>;
182 interrupt-parent = <&gic>;
183 interrupts = <0 170 0x4>;
184 reg-io-width = <4>;
185 status = "disabled";
186 };
187
188 pfc: pfc@e6050000 {
189 compatible = "renesas,pfc-r8a73a4";
190 reg = <0 0xe6050000 0 0x9000>;
191 gpio-controller;
192 #gpio-cells = <2>;
193 };
194
195 sdhi0: sdhi@ee100000 {
196 compatible = "renesas,r8a73a4-sdhi";
197 reg = <0 0xee100000 0 0x100>;
198 interrupt-parent = <&gic>;
199 interrupts = <0 165 4>;
200 cap-sd-highspeed;
201 status = "disabled";
202 };
203
204 sdhi1: sdhi@ee120000 {
205 compatible = "renesas,r8a73a4-sdhi";
206 reg = <0 0xee120000 0 0x100>;
207 interrupt-parent = <&gic>;
208 interrupts = <0 166 4>;
209 cap-sd-highspeed;
210 status = "disabled";
211 };
212
213 sdhi2: sdhi@ee140000 {
214 compatible = "renesas,r8a73a4-sdhi";
215 reg = <0 0xee140000 0 0x100>;
216 interrupt-parent = <&gic>;
217 interrupts = <0 167 4>;
218 cap-sd-highspeed;
219 status = "disabled";
220 };
88}; 221};
diff --git a/arch/arm/boot/dts/r8a7740-armadillo800eva-reference.dts b/arch/arm/boot/dts/r8a7740-armadillo800eva-reference.dts
index 09ea22c26359..c638e4ab91b8 100644
--- a/arch/arm/boot/dts/r8a7740-armadillo800eva-reference.dts
+++ b/arch/arm/boot/dts/r8a7740-armadillo800eva-reference.dts
@@ -10,13 +10,14 @@
10 10
11/dts-v1/; 11/dts-v1/;
12/include/ "r8a7740.dtsi" 12/include/ "r8a7740.dtsi"
13#include <dt-bindings/gpio/gpio.h>
13 14
14/ { 15/ {
15 model = "armadillo 800 eva reference"; 16 model = "armadillo 800 eva reference";
16 compatible = "renesas,armadillo800eva-reference", "renesas,r8a7740"; 17 compatible = "renesas,armadillo800eva-reference", "renesas,r8a7740";
17 18
18 chosen { 19 chosen {
19 bootargs = "console=tty0 console=ttySC1,115200 earlyprintk=sh-sci.1,115200 ignore_loglevel root=/dev/nfs ip=dhcp nfsroot=,rsize=4096,wsize=4096 rw"; 20 bootargs = "console=tty0 console=ttySC1,115200 earlyprintk=sh-sci.1,115200 ignore_loglevel root=/dev/nfs ip=dhcp rw";
20 }; 21 };
21 22
22 memory { 23 memory {
@@ -33,6 +34,21 @@
33 regulator-boot-on; 34 regulator-boot-on;
34 }; 35 };
35 36
37 leds {
38 compatible = "gpio-leds";
39 led1 {
40 gpios = <&pfc 102 GPIO_ACTIVE_HIGH>;
41 };
42 led2 {
43 gpios = <&pfc 111 GPIO_ACTIVE_HIGH>;
44 };
45 led3 {
46 gpios = <&pfc 110 GPIO_ACTIVE_HIGH>;
47 };
48 led4 {
49 gpios = <&pfc 177 GPIO_ACTIVE_HIGH>;
50 };
51 };
36}; 52};
37 53
38&i2c0 { 54&i2c0 {
@@ -41,5 +57,23 @@
41 reg = <0x55>; 57 reg = <0x55>;
42 interrupt-parent = <&irqpin1>; 58 interrupt-parent = <&irqpin1>;
43 interrupts = <2 0>; /* IRQ10: hwirq 2 on irqpin1 */ 59 interrupts = <2 0>; /* IRQ10: hwirq 2 on irqpin1 */
60 pinctrl-0 = <&st1232_pins>;
61 pinctrl-names = "default";
62 gpios = <&pfc 166 GPIO_ACTIVE_LOW>;
63 };
64};
65
66&pfc {
67 pinctrl-0 = <&scifa1_pins>;
68 pinctrl-names = "default";
69
70 scifa1_pins: scifa1 {
71 renesas,groups = "scifa1_data";
72 renesas,function = "scifa1";
73 };
74
75 st1232_pins: st1232 {
76 renesas,groups = "intc_irq10";
77 renesas,function = "intc";
44 }; 78 };
45}; 79};
diff --git a/arch/arm/boot/dts/r8a7740-armadillo800eva.dts b/arch/arm/boot/dts/r8a7740-armadillo800eva.dts
index 93da655b2598..426cd9c3e1c4 100644
--- a/arch/arm/boot/dts/r8a7740-armadillo800eva.dts
+++ b/arch/arm/boot/dts/r8a7740-armadillo800eva.dts
@@ -16,7 +16,7 @@
16 compatible = "renesas,armadillo800eva"; 16 compatible = "renesas,armadillo800eva";
17 17
18 chosen { 18 chosen {
19 bootargs = "console=tty0 console=ttySC1,115200 earlyprintk=sh-sci.1,115200 ignore_loglevel root=/dev/nfs ip=dhcp nfsroot=,rsize=4096,wsize=4096 rw"; 19 bootargs = "console=tty0 console=ttySC1,115200 earlyprintk=sh-sci.1,115200 ignore_loglevel root=/dev/nfs ip=dhcp rw";
20 }; 20 };
21 21
22 memory { 22 memory {
diff --git a/arch/arm/boot/dts/r8a7740.dtsi b/arch/arm/boot/dts/r8a7740.dtsi
index 24e930643821..44d3d520e01f 100644
--- a/arch/arm/boot/dts/r8a7740.dtsi
+++ b/arch/arm/boot/dts/r8a7740.dtsi
@@ -32,6 +32,11 @@
32 <0xc2000000 0x1000>; 32 <0xc2000000 0x1000>;
33 }; 33 };
34 34
35 pmu {
36 compatible = "arm,cortex-a9-pmu";
37 interrupts = <0 83 4>;
38 };
39
35 /* irqpin0: IRQ0 - IRQ7 */ 40 /* irqpin0: IRQ0 - IRQ7 */
36 irqpin0: irqpin@e6900000 { 41 irqpin0: irqpin@e6900000 {
37 compatible = "renesas,intc-irqpin"; 42 compatible = "renesas,intc-irqpin";
@@ -139,4 +144,19 @@
139 0 72 0x4 144 0 72 0x4
140 0 73 0x4>; 145 0 73 0x4>;
141 }; 146 };
147
148 pfc: pfc@e6050000 {
149 compatible = "renesas,pfc-r8a7740";
150 reg = <0xe6050000 0x8000>,
151 <0xe605800c 0x20>;
152 gpio-controller;
153 #gpio-cells = <2>;
154 };
155
156 tpu: pwm@e6600000 {
157 compatible = "renesas,tpu-r8a7740", "renesas,tpu";
158 reg = <0xe6600000 0x100>;
159 status = "disabled";
160 #pwm-cells = <3>;
161 };
142}; 162};
diff --git a/arch/arm/boot/dts/r8a7778-bockw-reference.dts b/arch/arm/boot/dts/r8a7778-bockw-reference.dts
new file mode 100644
index 000000000000..9bb903a3230d
--- /dev/null
+++ b/arch/arm/boot/dts/r8a7778-bockw-reference.dts
@@ -0,0 +1,32 @@
1/*
2 * Reference Device Tree Source for the Bock-W board
3 *
4 * Copyright (C) 2013 Renesas Solutions Corp.
5 * Copyright (C) 2013 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
6 *
7 * based on r8a7779
8 *
9 * Copyright (C) 2013 Renesas Solutions Corp.
10 * Copyright (C) 2013 Simon Horman
11 *
12 * This file is licensed under the terms of the GNU General Public License
13 * version 2. This program is licensed "as is" without any warranty of any
14 * kind, whether express or implied.
15 */
16
17/dts-v1/;
18/include/ "r8a7778.dtsi"
19
20/ {
21 model = "bockw";
22 compatible = "renesas,bockw-reference", "renesas,r8a7778";
23
24 chosen {
25 bootargs = "console=ttySC0,115200 ignore_loglevel rw";
26 };
27
28 memory {
29 device_type = "memory";
30 reg = <0x60000000 0x10000000>;
31 };
32};
diff --git a/arch/arm/boot/dts/r8a7778-bockw.dts b/arch/arm/boot/dts/r8a7778-bockw.dts
index 0076b1e8a0fb..12bbebc9c955 100644
--- a/arch/arm/boot/dts/r8a7778-bockw.dts
+++ b/arch/arm/boot/dts/r8a7778-bockw.dts
@@ -22,7 +22,7 @@
22 compatible = "renesas,bockw", "renesas,r8a7778"; 22 compatible = "renesas,bockw", "renesas,r8a7778";
23 23
24 chosen { 24 chosen {
25 bootargs = "console=ttySC0,115200 ignore_loglevel ip=dhcp root=/dev/nfs"; 25 bootargs = "console=ttySC0,115200 ignore_loglevel ip=dhcp root=/dev/nfs rw";
26 }; 26 };
27 27
28 memory { 28 memory {
diff --git a/arch/arm/boot/dts/r8a7778.dtsi b/arch/arm/boot/dts/r8a7778.dtsi
index 474373559bdc..45ac404ab6d8 100644
--- a/arch/arm/boot/dts/r8a7778.dtsi
+++ b/arch/arm/boot/dts/r8a7778.dtsi
@@ -32,4 +32,70 @@
32 reg = <0xfe438000 0x1000>, 32 reg = <0xfe438000 0x1000>,
33 <0xfe430000 0x100>; 33 <0xfe430000 0x100>;
34 }; 34 };
35
36 gpio0: gpio@ffc40000 {
37 compatible = "renesas,gpio-r8a7778", "renesas,gpio-rcar";
38 reg = <0xffc40000 0x2c>;
39 interrupt-parent = <&gic>;
40 interrupts = <0 103 0x4>;
41 #gpio-cells = <2>;
42 gpio-controller;
43 gpio-ranges = <&pfc 0 0 32>;
44 #interrupt-cells = <2>;
45 interrupt-controller;
46 };
47
48 gpio1: gpio@ffc41000 {
49 compatible = "renesas,gpio-r8a7778", "renesas,gpio-rcar";
50 reg = <0xffc41000 0x2c>;
51 interrupt-parent = <&gic>;
52 interrupts = <0 103 0x4>;
53 #gpio-cells = <2>;
54 gpio-controller;
55 gpio-ranges = <&pfc 0 32 32>;
56 #interrupt-cells = <2>;
57 interrupt-controller;
58 };
59
60 gpio2: gpio@ffc42000 {
61 compatible = "renesas,gpio-r8a7778", "renesas,gpio-rcar";
62 reg = <0xffc42000 0x2c>;
63 interrupt-parent = <&gic>;
64 interrupts = <0 103 0x4>;
65 #gpio-cells = <2>;
66 gpio-controller;
67 gpio-ranges = <&pfc 0 64 32>;
68 #interrupt-cells = <2>;
69 interrupt-controller;
70 };
71
72 gpio3: gpio@ffc43000 {
73 compatible = "renesas,gpio-r8a7778", "renesas,gpio-rcar";
74 reg = <0xffc43000 0x2c>;
75 interrupt-parent = <&gic>;
76 interrupts = <0 103 0x4>;
77 #gpio-cells = <2>;
78 gpio-controller;
79 gpio-ranges = <&pfc 0 96 32>;
80 #interrupt-cells = <2>;
81 interrupt-controller;
82 };
83
84 gpio4: gpio@ffc44000 {
85 compatible = "renesas,gpio-r8a7778", "renesas,gpio-rcar";
86 reg = <0xffc44000 0x2c>;
87 interrupt-parent = <&gic>;
88 interrupts = <0 103 0x4>;
89 #gpio-cells = <2>;
90 gpio-controller;
91 gpio-ranges = <&pfc 0 128 27>;
92 #interrupt-cells = <2>;
93 interrupt-controller;
94 };
95
96 pfc: pfc@fffc0000 {
97 compatible = "renesas,pfc-r8a7778";
98 reg = <0xfffc000 0x118>;
99 #gpio-range-cells = <3>;
100 };
35}; 101};
diff --git a/arch/arm/boot/dts/r8a7779-marzen-reference.dts b/arch/arm/boot/dts/r8a7779-marzen-reference.dts
index 72be4c87cfb5..6d5508392252 100644
--- a/arch/arm/boot/dts/r8a7779-marzen-reference.dts
+++ b/arch/arm/boot/dts/r8a7779-marzen-reference.dts
@@ -11,13 +11,14 @@
11 11
12/dts-v1/; 12/dts-v1/;
13/include/ "r8a7779.dtsi" 13/include/ "r8a7779.dtsi"
14#include <dt-bindings/gpio/gpio.h>
14 15
15/ { 16/ {
16 model = "marzen"; 17 model = "marzen";
17 compatible = "renesas,marzen-reference", "renesas,r8a7779"; 18 compatible = "renesas,marzen-reference", "renesas,r8a7779";
18 19
19 chosen { 20 chosen {
20 bootargs = "console=ttySC2,115200 earlyprintk=sh-sci.2,115200 ignore_loglevel root=/dev/nfs ip=on"; 21 bootargs = "console=ttySC2,115200 earlyprintk=sh-sci.2,115200 ignore_loglevel root=/dev/nfs ip=on rw";
21 }; 22 };
22 23
23 memory { 24 memory {
@@ -37,6 +38,9 @@
37 lan0@18000000 { 38 lan0@18000000 {
38 compatible = "smsc,lan9220", "smsc,lan9115"; 39 compatible = "smsc,lan9220", "smsc,lan9115";
39 reg = <0x18000000 0x100>; 40 reg = <0x18000000 0x100>;
41 pinctrl-0 = <&lan0_pins>;
42 pinctrl-names = "default";
43
40 phy-mode = "mii"; 44 phy-mode = "mii";
41 interrupt-parent = <&gic>; 45 interrupt-parent = <&gic>;
42 interrupts = <0 28 0x4>; 46 interrupts = <0 28 0x4>;
@@ -44,4 +48,49 @@
44 vddvario-supply = <&fixedregulator3v3>; 48 vddvario-supply = <&fixedregulator3v3>;
45 vdd33a-supply = <&fixedregulator3v3>; 49 vdd33a-supply = <&fixedregulator3v3>;
46 }; 50 };
51
52 leds {
53 compatible = "gpio-leds";
54 led2 {
55 gpios = <&gpio4 29 GPIO_ACTIVE_HIGH>;
56 };
57 led3 {
58 gpios = <&gpio4 30 GPIO_ACTIVE_HIGH>;
59 };
60 led4 {
61 gpios = <&gpio4 31 GPIO_ACTIVE_HIGH>;
62 };
63 };
64};
65
66&pfc {
67 pinctrl-0 = <&scif2_pins &scif4_pins &sdhi0_pins>;
68 pinctrl-names = "default";
69
70 lan0_pins: lan0 {
71 intc {
72 renesas,groups = "intc_irq1_b";
73 renesas,function = "intc";
74 };
75 lbsc {
76 renesas,groups = "lbsc_ex_cs0";
77 renesas,function = "lbsc";
78 };
79 };
80
81 scif2_pins: scif2 {
82 renesas,groups = "scif2_data_c";
83 renesas,function = "scif2";
84 };
85
86 scif4_pins: scif4 {
87 renesas,groups = "scif4_data";
88 renesas,function = "scif4";
89 };
90
91 sdhi0_pins: sdhi0 {
92 renesas,groups = "sdhi0_data4", "sdhi0_ctrl", "sdhi0_cd",
93 "sdhi0_wp";
94 renesas,function = "sdhi0";
95 };
47}; 96};
diff --git a/arch/arm/boot/dts/r8a7779-marzen.dts b/arch/arm/boot/dts/r8a7779-marzen.dts
new file mode 100644
index 000000000000..f3f7f7999736
--- /dev/null
+++ b/arch/arm/boot/dts/r8a7779-marzen.dts
@@ -0,0 +1,27 @@
1/*
2 * Device Tree Source for the Marzen board
3 *
4 * Copyright (C) 2013 Renesas Solutions Corp.
5 * Copyright (C) 2013 Simon Horman
6 *
7 * This file is licensed under the terms of the GNU General Public License
8 * version 2. This program is licensed "as is" without any warranty of any
9 * kind, whether express or implied.
10 */
11
12/dts-v1/;
13/include/ "r8a7779.dtsi"
14
15/ {
16 model = "marzen";
17 compatible = "renesas,marzen", "renesas,r8a7779";
18
19 chosen {
20 bootargs = "console=ttySC2,115200 earlyprintk=sh-sci.2,115200 ignore_loglevel root=/dev/nfs ip=on";
21 };
22
23 memory {
24 device_type = "memory";
25 reg = <0x60000000 0x40000000>;
26 };
27};
diff --git a/arch/arm/boot/dts/r8a7779.dtsi b/arch/arm/boot/dts/r8a7779.dtsi
index 7f146c6bf756..23a62447359c 100644
--- a/arch/arm/boot/dts/r8a7779.dtsi
+++ b/arch/arm/boot/dts/r8a7779.dtsi
@@ -48,6 +48,90 @@
48 <0xf0000100 0x100>; 48 <0xf0000100 0x100>;
49 }; 49 };
50 50
51 gpio0: gpio@ffc40000 {
52 compatible = "renesas,gpio-r8a7779", "renesas,gpio-rcar";
53 reg = <0xffc40000 0x2c>;
54 interrupt-parent = <&gic>;
55 interrupts = <0 141 0x4>;
56 #gpio-cells = <2>;
57 gpio-controller;
58 gpio-ranges = <&pfc 0 0 32>;
59 #interrupt-cells = <2>;
60 interrupt-controller;
61 };
62
63 gpio1: gpio@ffc41000 {
64 compatible = "renesas,gpio-r8a7779", "renesas,gpio-rcar";
65 reg = <0xffc41000 0x2c>;
66 interrupt-parent = <&gic>;
67 interrupts = <0 142 0x4>;
68 #gpio-cells = <2>;
69 gpio-controller;
70 gpio-ranges = <&pfc 0 32 32>;
71 #interrupt-cells = <2>;
72 interrupt-controller;
73 };
74
75 gpio2: gpio@ffc42000 {
76 compatible = "renesas,gpio-r8a7779", "renesas,gpio-rcar";
77 reg = <0xffc42000 0x2c>;
78 interrupt-parent = <&gic>;
79 interrupts = <0 143 0x4>;
80 #gpio-cells = <2>;
81 gpio-controller;
82 gpio-ranges = <&pfc 0 64 32>;
83 #interrupt-cells = <2>;
84 interrupt-controller;
85 };
86
87 gpio3: gpio@ffc43000 {
88 compatible = "renesas,gpio-r8a7779", "renesas,gpio-rcar";
89 reg = <0xffc43000 0x2c>;
90 interrupt-parent = <&gic>;
91 interrupts = <0 144 0x4>;
92 #gpio-cells = <2>;
93 gpio-controller;
94 gpio-ranges = <&pfc 0 96 32>;
95 #interrupt-cells = <2>;
96 interrupt-controller;
97 };
98
99 gpio4: gpio@ffc44000 {
100 compatible = "renesas,gpio-r8a7779", "renesas,gpio-rcar";
101 reg = <0xffc44000 0x2c>;
102 interrupt-parent = <&gic>;
103 interrupts = <0 145 0x4>;
104 #gpio-cells = <2>;
105 gpio-controller;
106 gpio-ranges = <&pfc 0 128 32>;
107 #interrupt-cells = <2>;
108 interrupt-controller;
109 };
110
111 gpio5: gpio@ffc45000 {
112 compatible = "renesas,gpio-r8a7779", "renesas,gpio-rcar";
113 reg = <0xffc45000 0x2c>;
114 interrupt-parent = <&gic>;
115 interrupts = <0 146 0x4>;
116 #gpio-cells = <2>;
117 gpio-controller;
118 gpio-ranges = <&pfc 0 160 32>;
119 #interrupt-cells = <2>;
120 interrupt-controller;
121 };
122
123 gpio6: gpio@ffc46000 {
124 compatible = "renesas,gpio-r8a7779", "renesas,gpio-rcar";
125 reg = <0xffc46000 0x2c>;
126 interrupt-parent = <&gic>;
127 interrupts = <0 147 0x4>;
128 #gpio-cells = <2>;
129 gpio-controller;
130 gpio-ranges = <&pfc 0 192 9>;
131 #interrupt-cells = <2>;
132 interrupt-controller;
133 };
134
51 irqpin0: irqpin@fe780010 { 135 irqpin0: irqpin@fe780010 {
52 compatible = "renesas,intc-irqpin"; 136 compatible = "renesas,intc-irqpin";
53 #interrupt-cells = <2>; 137 #interrupt-cells = <2>;
@@ -65,7 +149,7 @@
65 sense-bitfield-width = <2>; 149 sense-bitfield-width = <2>;
66 }; 150 };
67 151
68 i2c0: i2c@0xffc70000 { 152 i2c0: i2c@ffc70000 {
69 #address-cells = <1>; 153 #address-cells = <1>;
70 #size-cells = <0>; 154 #size-cells = <0>;
71 compatible = "renesas,rmobile-iic"; 155 compatible = "renesas,rmobile-iic";
@@ -74,7 +158,7 @@
74 interrupts = <0 79 0x4>; 158 interrupts = <0 79 0x4>;
75 }; 159 };
76 160
77 i2c1: i2c@0xffc71000 { 161 i2c1: i2c@ffc71000 {
78 #address-cells = <1>; 162 #address-cells = <1>;
79 #size-cells = <0>; 163 #size-cells = <0>;
80 compatible = "renesas,rmobile-iic"; 164 compatible = "renesas,rmobile-iic";
@@ -83,7 +167,7 @@
83 interrupts = <0 82 0x4>; 167 interrupts = <0 82 0x4>;
84 }; 168 };
85 169
86 i2c2: i2c@0xffc72000 { 170 i2c2: i2c@ffc72000 {
87 #address-cells = <1>; 171 #address-cells = <1>;
88 #size-cells = <0>; 172 #size-cells = <0>;
89 compatible = "renesas,rmobile-iic"; 173 compatible = "renesas,rmobile-iic";
@@ -92,7 +176,7 @@
92 interrupts = <0 80 0x4>; 176 interrupts = <0 80 0x4>;
93 }; 177 };
94 178
95 i2c3: i2c@0xffc73000 { 179 i2c3: i2c@ffc73000 {
96 #address-cells = <1>; 180 #address-cells = <1>;
97 #size-cells = <0>; 181 #size-cells = <0>;
98 compatible = "renesas,rmobile-iic"; 182 compatible = "renesas,rmobile-iic";
@@ -101,6 +185,12 @@
101 interrupts = <0 81 0x4>; 185 interrupts = <0 81 0x4>;
102 }; 186 };
103 187
188 pfc: pfc@fffc0000 {
189 compatible = "renesas,pfc-r8a7779";
190 reg = <0xfffc0000 0x23c>;
191 #gpio-range-cells = <3>;
192 };
193
104 thermal@ffc48000 { 194 thermal@ffc48000 {
105 compatible = "renesas,rcar-thermal"; 195 compatible = "renesas,rcar-thermal";
106 reg = <0xffc48000 0x38>; 196 reg = <0xffc48000 0x38>;
diff --git a/arch/arm/boot/dts/r8a7790-lager-reference.dts b/arch/arm/boot/dts/r8a7790-lager-reference.dts
new file mode 100644
index 000000000000..c462ef138922
--- /dev/null
+++ b/arch/arm/boot/dts/r8a7790-lager-reference.dts
@@ -0,0 +1,45 @@
1/*
2 * Device Tree Source for the Lager board
3 *
4 * Copyright (C) 2013 Renesas Solutions Corp.
5 *
6 * This file is licensed under the terms of the GNU General Public License
7 * version 2. This program is licensed "as is" without any warranty of any
8 * kind, whether express or implied.
9 */
10
11/dts-v1/;
12/include/ "r8a7790.dtsi"
13#include <dt-bindings/gpio/gpio.h>
14
15/ {
16 model = "Lager";
17 compatible = "renesas,lager-reference", "renesas,r8a7790";
18
19 chosen {
20 bootargs = "console=ttySC6,115200 ignore_loglevel rw";
21 };
22
23 memory@40000000 {
24 device_type = "memory";
25 reg = <0 0x40000000 0 0x80000000>;
26 };
27
28 lbsc {
29 #address-cells = <1>;
30 #size-cells = <1>;
31 };
32
33 leds {
34 compatible = "gpio-leds";
35 led6 {
36 gpios = <&gpio4 22 GPIO_ACTIVE_HIGH>;
37 };
38 led7 {
39 gpios = <&gpio4 23 GPIO_ACTIVE_HIGH>;
40 };
41 led8 {
42 gpios = <&gpio5 17 GPIO_ACTIVE_HIGH>;
43 };
44 };
45};
diff --git a/arch/arm/boot/dts/r8a7790-lager.dts b/arch/arm/boot/dts/r8a7790-lager.dts
index 09a84fce89d6..203bd089af29 100644
--- a/arch/arm/boot/dts/r8a7790-lager.dts
+++ b/arch/arm/boot/dts/r8a7790-lager.dts
@@ -16,7 +16,7 @@
16 compatible = "renesas,lager", "renesas,r8a7790"; 16 compatible = "renesas,lager", "renesas,r8a7790";
17 17
18 chosen { 18 chosen {
19 bootargs = "console=ttySC6,115200 ignore_loglevel"; 19 bootargs = "console=ttySC6,115200 ignore_loglevel rw root=/dev/nfs ip=dhcp";
20 }; 20 };
21 21
22 memory@40000000 { 22 memory@40000000 {
diff --git a/arch/arm/boot/dts/r8a7790.dtsi b/arch/arm/boot/dts/r8a7790.dtsi
index 339d9b11721c..3b879e7c697c 100644
--- a/arch/arm/boot/dts/r8a7790.dtsi
+++ b/arch/arm/boot/dts/r8a7790.dtsi
@@ -38,6 +38,78 @@
38 interrupts = <1 9 0xf04>; 38 interrupts = <1 9 0xf04>;
39 }; 39 };
40 40
41 gpio0: gpio@ffc40000 {
42 compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar";
43 reg = <0 0xffc40000 0 0x2c>;
44 interrupt-parent = <&gic>;
45 interrupts = <0 4 0x4>;
46 #gpio-cells = <2>;
47 gpio-controller;
48 gpio-ranges = <&pfc 0 0 32>;
49 #interrupt-cells = <2>;
50 interrupt-controller;
51 };
52
53 gpio1: gpio@ffc41000 {
54 compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar";
55 reg = <0 0xffc41000 0 0x2c>;
56 interrupt-parent = <&gic>;
57 interrupts = <0 5 0x4>;
58 #gpio-cells = <2>;
59 gpio-controller;
60 gpio-ranges = <&pfc 0 32 32>;
61 #interrupt-cells = <2>;
62 interrupt-controller;
63 };
64
65 gpio2: gpio@ffc42000 {
66 compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar";
67 reg = <0 0xffc42000 0 0x2c>;
68 interrupt-parent = <&gic>;
69 interrupts = <0 6 0x4>;
70 #gpio-cells = <2>;
71 gpio-controller;
72 gpio-ranges = <&pfc 0 64 32>;
73 #interrupt-cells = <2>;
74 interrupt-controller;
75 };
76
77 gpio3: gpio@ffc43000 {
78 compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar";
79 reg = <0 0xffc43000 0 0x2c>;
80 interrupt-parent = <&gic>;
81 interrupts = <0 7 0x4>;
82 #gpio-cells = <2>;
83 gpio-controller;
84 gpio-ranges = <&pfc 0 96 32>;
85 #interrupt-cells = <2>;
86 interrupt-controller;
87 };
88
89 gpio4: gpio@ffc44000 {
90 compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar";
91 reg = <0 0xffc44000 0 0x2c>;
92 interrupt-parent = <&gic>;
93 interrupts = <0 8 0x4>;
94 #gpio-cells = <2>;
95 gpio-controller;
96 gpio-ranges = <&pfc 0 128 32>;
97 #interrupt-cells = <2>;
98 interrupt-controller;
99 };
100
101 gpio5: gpio@ffc45000 {
102 compatible = "renesas,gpio-r8a7790", "renesas,gpio-rcar";
103 reg = <0 0xffc45000 0 0x2c>;
104 interrupt-parent = <&gic>;
105 interrupts = <0 9 0x4>;
106 #gpio-cells = <2>;
107 gpio-controller;
108 gpio-ranges = <&pfc 0 160 32>;
109 #interrupt-cells = <2>;
110 interrupt-controller;
111 };
112
41 timer { 113 timer {
42 compatible = "arm,armv7-timer"; 114 compatible = "arm,armv7-timer";
43 interrupts = <1 13 0xf08>, 115 interrupts = <1 13 0xf08>,
@@ -54,4 +126,64 @@
54 interrupt-parent = <&gic>; 126 interrupt-parent = <&gic>;
55 interrupts = <0 0 4>, <0 1 4>, <0 2 4>, <0 3 4>; 127 interrupts = <0 0 4>, <0 1 4>, <0 2 4>, <0 3 4>;
56 }; 128 };
129
130 mmcif0: mmcif@ee200000 {
131 compatible = "renesas,sh-mmcif";
132 reg = <0 0xee200000 0 0x80>;
133 interrupt-parent = <&gic>;
134 interrupts = <0 169 0x4>;
135 reg-io-width = <4>;
136 status = "disabled";
137 };
138
139 mmcif1: mmcif@ee220000 {
140 compatible = "renesas,sh-mmcif";
141 reg = <0 0xee220000 0 0x80>;
142 interrupt-parent = <&gic>;
143 interrupts = <0 170 0x4>;
144 reg-io-width = <4>;
145 status = "disabled";
146 };
147
148 pfc: pfc@e6060000 {
149 compatible = "renesas,pfc-r8a7790";
150 reg = <0 0xe6060000 0 0x250>;
151 #gpio-range-cells = <3>;
152 };
153
154 sdhi0: sdhi@ee100000 {
155 compatible = "renesas,r8a7790-sdhi";
156 reg = <0 0xee100000 0 0x100>;
157 interrupt-parent = <&gic>;
158 interrupts = <0 165 4>;
159 cap-sd-highspeed;
160 status = "disabled";
161 };
162
163 sdhi1: sdhi@ee120000 {
164 compatible = "renesas,r8a7790-sdhi";
165 reg = <0 0xee120000 0 0x100>;
166 interrupt-parent = <&gic>;
167 interrupts = <0 166 4>;
168 cap-sd-highspeed;
169 status = "disabled";
170 };
171
172 sdhi2: sdhi@ee140000 {
173 compatible = "renesas,r8a7790-sdhi";
174 reg = <0 0xee140000 0 0x100>;
175 interrupt-parent = <&gic>;
176 interrupts = <0 167 4>;
177 cap-sd-highspeed;
178 status = "disabled";
179 };
180
181 sdhi3: sdhi@ee160000 {
182 compatible = "renesas,r8a7790-sdhi";
183 reg = <0 0xee160000 0 0x100>;
184 interrupt-parent = <&gic>;
185 interrupts = <0 168 4>;
186 cap-sd-highspeed;
187 status = "disabled";
188 };
57}; 189};
diff --git a/arch/arm/boot/dts/sama5d3.dtsi b/arch/arm/boot/dts/sama5d3.dtsi
index a1d5e25a6698..b7f49615120d 100644
--- a/arch/arm/boot/dts/sama5d3.dtsi
+++ b/arch/arm/boot/dts/sama5d3.dtsi
@@ -48,6 +48,11 @@
48 }; 48 };
49 }; 49 };
50 50
51 pmu {
52 compatible = "arm,cortex-a5-pmu";
53 interrupts = <46 IRQ_TYPE_LEVEL_HIGH 0>;
54 };
55
51 memory { 56 memory {
52 reg = <0x20000000 0x8000000>; 57 reg = <0x20000000 0x8000000>;
53 }; 58 };
@@ -1029,21 +1034,30 @@
1029 compatible = "atmel,at91rm9200-nand"; 1034 compatible = "atmel,at91rm9200-nand";
1030 #address-cells = <1>; 1035 #address-cells = <1>;
1031 #size-cells = <1>; 1036 #size-cells = <1>;
1037 ranges;
1032 reg = < 0x60000000 0x01000000 /* EBI CS3 */ 1038 reg = < 0x60000000 0x01000000 /* EBI CS3 */
1033 0xffffc070 0x00000490 /* SMC PMECC regs */ 1039 0xffffc070 0x00000490 /* SMC PMECC regs */
1034 0xffffc500 0x00000100 /* SMC PMECC Error Location regs */ 1040 0xffffc500 0x00000100 /* SMC PMECC Error Location regs */
1035 0x00100000 0x00100000 /* ROM code */ 1041 0x00110000 0x00018000 /* ROM code */
1036 0x70000000 0x10000000 /* NFC Command Registers */
1037 0xffffc000 0x00000070 /* NFC HSMC regs */
1038 0x00200000 0x00100000 /* NFC SRAM banks */
1039 >; 1042 >;
1040 interrupts = <5 IRQ_TYPE_LEVEL_HIGH 6>; 1043 interrupts = <5 IRQ_TYPE_LEVEL_HIGH 6>;
1041 atmel,nand-addr-offset = <21>; 1044 atmel,nand-addr-offset = <21>;
1042 atmel,nand-cmd-offset = <22>; 1045 atmel,nand-cmd-offset = <22>;
1043 pinctrl-names = "default"; 1046 pinctrl-names = "default";
1044 pinctrl-0 = <&pinctrl_nand0_ale_cle>; 1047 pinctrl-0 = <&pinctrl_nand0_ale_cle>;
1045 atmel,pmecc-lookup-table-offset = <0x10000 0x18000>; 1048 atmel,pmecc-lookup-table-offset = <0x0 0x8000>;
1046 status = "disabled"; 1049 status = "disabled";
1050
1051 nfc@70000000 {
1052 compatible = "atmel,sama5d3-nfc";
1053 #address-cells = <1>;
1054 #size-cells = <1>;
1055 reg = <
1056 0x70000000 0x10000000 /* NFC Command Registers */
1057 0xffffc000 0x00000070 /* NFC HSMC regs */
1058 0x00200000 0x00100000 /* NFC SRAM banks */
1059 >;
1060 };
1047 }; 1061 };
1048 }; 1062 };
1049}; 1063};
diff --git a/arch/arm/boot/dts/sama5d3xcm.dtsi b/arch/arm/boot/dts/sama5d3xcm.dtsi
index 1f8050813a54..31ed9e3bb649 100644
--- a/arch/arm/boot/dts/sama5d3xcm.dtsi
+++ b/arch/arm/boot/dts/sama5d3xcm.dtsi
@@ -47,8 +47,6 @@
47 atmel,has-pmecc; 47 atmel,has-pmecc;
48 atmel,pmecc-cap = <4>; 48 atmel,pmecc-cap = <4>;
49 atmel,pmecc-sector-size = <512>; 49 atmel,pmecc-sector-size = <512>;
50 atmel,has-nfc;
51 atmel,use-nfc-sram;
52 nand-on-flash-bbt; 50 nand-on-flash-bbt;
53 status = "okay"; 51 status = "okay";
54 52
diff --git a/arch/arm/boot/dts/sama5d3xmb.dtsi b/arch/arm/boot/dts/sama5d3xmb.dtsi
index 8a9e05d8a4b8..dba739b6ef36 100644
--- a/arch/arm/boot/dts/sama5d3xmb.dtsi
+++ b/arch/arm/boot/dts/sama5d3xmb.dtsi
@@ -81,6 +81,14 @@
81 81
82 macb1: ethernet@f802c000 { 82 macb1: ethernet@f802c000 {
83 phy-mode = "rmii"; 83 phy-mode = "rmii";
84
85 #address-cells = <1>;
86 #size-cells = <0>;
87 phy0: ethernet-phy@1 {
88 interrupt-parent = <&pioE>;
89 interrupts = <30 IRQ_TYPE_EDGE_FALLING>;
90 reg = <1>;
91 };
84 }; 92 };
85 93
86 pinctrl@fffff200 { 94 pinctrl@fffff200 {
diff --git a/arch/arm/boot/dts/sh7372.dtsi b/arch/arm/boot/dts/sh7372.dtsi
index 7bf020ecadf5..249f65be2a50 100644
--- a/arch/arm/boot/dts/sh7372.dtsi
+++ b/arch/arm/boot/dts/sh7372.dtsi
@@ -23,4 +23,12 @@
23 reg = <0x0>; 23 reg = <0x0>;
24 }; 24 };
25 }; 25 };
26
27 pfc: pfc@e6050000 {
28 compatible = "renesas,pfc-sh7372";
29 reg = <0xe6050000 0x8000>,
30 <0xe605801c 0x1c>;
31 gpio-controller;
32 #gpio-cells = <2>;
33 };
26}; 34};
diff --git a/arch/arm/boot/dts/sh73a0-kzm9g-reference.dts b/arch/arm/boot/dts/sh73a0-kzm9g-reference.dts
index b6f759e830ed..212230629f27 100644
--- a/arch/arm/boot/dts/sh73a0-kzm9g-reference.dts
+++ b/arch/arm/boot/dts/sh73a0-kzm9g-reference.dts
@@ -13,6 +13,7 @@
13 13
14/dts-v1/; 14/dts-v1/;
15/include/ "sh73a0.dtsi" 15/include/ "sh73a0.dtsi"
16#include <dt-bindings/gpio/gpio.h>
16 17
17/ { 18/ {
18 model = "KZM-A9-GT"; 19 model = "KZM-A9-GT";
@@ -32,7 +33,7 @@
32 }; 33 };
33 34
34 chosen { 35 chosen {
35 bootargs = "console=tty0 console=ttySC4,115200 root=/dev/nfs ip=dhcp ignore_loglevel earlyprintk=sh-sci.4,115200"; 36 bootargs = "console=tty0 console=ttySC4,115200 root=/dev/nfs ip=dhcp ignore_loglevel earlyprintk=sh-sci.4,115200 rw";
36 }; 37 };
37 38
38 memory { 39 memory {
@@ -58,6 +59,24 @@
58 regulator-boot-on; 59 regulator-boot-on;
59 }; 60 };
60 61
62 vmmc_sdhi0: regulator@2 {
63 compatible = "regulator-fixed";
64 regulator-name = "SDHI0 Vcc";
65 regulator-min-microvolt = <3300000>;
66 regulator-max-microvolt = <3300000>;
67 gpio = <&pfc 15 GPIO_ACTIVE_HIGH>;
68 enable-active-high;
69 };
70
71 vmmc_sdhi2: regulator@3 {
72 compatible = "regulator-fixed";
73 regulator-name = "SDHI2 Vcc";
74 regulator-min-microvolt = <3300000>;
75 regulator-max-microvolt = <3300000>;
76 gpio = <&pfc 14 GPIO_ACTIVE_HIGH>;
77 enable-active-high;
78 };
79
61 lan9220@10000000 { 80 lan9220@10000000 {
62 compatible = "smsc,lan9220", "smsc,lan9115"; 81 compatible = "smsc,lan9220", "smsc,lan9115";
63 reg = <0x10000000 0x100>; 82 reg = <0x10000000 0x100>;
@@ -70,6 +89,22 @@
70 vddvario-supply = <&reg_1p8v>; 89 vddvario-supply = <&reg_1p8v>;
71 vdd33a-supply = <&reg_3p3v>; 90 vdd33a-supply = <&reg_3p3v>;
72 }; 91 };
92
93 leds {
94 compatible = "gpio-leds";
95 led1 {
96 gpios = <&pfc 20 GPIO_ACTIVE_LOW>;
97 };
98 led2 {
99 gpios = <&pfc 21 GPIO_ACTIVE_LOW>;
100 };
101 led3 {
102 gpios = <&pfc 22 GPIO_ACTIVE_LOW>;
103 };
104 led4 {
105 gpios = <&pfc 23 GPIO_ACTIVE_LOW>;
106 };
107 };
73}; 108};
74 109
75&i2c0 { 110&i2c0 {
@@ -145,20 +180,71 @@
145 }; 180 };
146}; 181};
147 182
183&i2c3 {
184 pinctrl-0 = <&i2c3_pins>;
185 pinctrl-names = "default";
186};
187
148&mmcif { 188&mmcif {
189 pinctrl-0 = <&mmcif_pins>;
190 pinctrl-names = "default";
191
149 bus-width = <8>; 192 bus-width = <8>;
150 vmmc-supply = <&reg_1p8v>; 193 vmmc-supply = <&reg_1p8v>;
151 status = "okay"; 194 status = "okay";
152}; 195};
153 196
197&pfc {
198 pinctrl-0 = <&scifa4_pins>;
199 pinctrl-names = "default";
200
201 i2c3_pins: i2c3 {
202 renesas,groups = "i2c3_1";
203 renesas,function = "i2c3";
204 };
205
206 mmcif_pins: mmcif {
207 mux {
208 renesas,groups = "mmc0_data8_0", "mmc0_ctrl_0";
209 renesas,function = "mmc0";
210 };
211 cfg {
212 renesas,groups = "mmc0_data8_0";
213 renesas,pins = "PORT279";
214 bias-pull-up;
215 };
216 };
217
218 scifa4_pins: scifa4 {
219 renesas,groups = "scifa4_data", "scifa4_ctrl";
220 renesas,function = "scifa4";
221 };
222
223 sdhi0_pins: sdhi0 {
224 renesas,groups = "sdhi0_data4", "sdhi0_ctrl", "sdhi0_cd", "sdhi0_wp";
225 renesas,function = "sdhi0";
226 };
227
228 sdhi2_pins: sdhi2 {
229 renesas,groups = "sdhi2_data4", "sdhi2_ctrl";
230 renesas,function = "sdhi2";
231 };
232};
233
154&sdhi0 { 234&sdhi0 {
155 vmmc-supply = <&reg_3p3v>; 235 pinctrl-0 = <&sdhi0_pins>;
236 pinctrl-names = "default";
237
238 vmmc-supply = <&vmmc_sdhi0>;
156 bus-width = <4>; 239 bus-width = <4>;
157 status = "okay"; 240 status = "okay";
158}; 241};
159 242
160&sdhi2 { 243&sdhi2 {
161 vmmc-supply = <&reg_3p3v>; 244 pinctrl-0 = <&sdhi2_pins>;
245 pinctrl-names = "default";
246
247 vmmc-supply = <&vmmc_sdhi2>;
162 bus-width = <4>; 248 bus-width = <4>;
163 broken-cd; 249 broken-cd;
164 status = "okay"; 250 status = "okay";
diff --git a/arch/arm/boot/dts/sh73a0-kzm9g.dts b/arch/arm/boot/dts/sh73a0-kzm9g.dts
index 7c4071e7790c..0f1ca7792c46 100644
--- a/arch/arm/boot/dts/sh73a0-kzm9g.dts
+++ b/arch/arm/boot/dts/sh73a0-kzm9g.dts
@@ -16,7 +16,7 @@
16 compatible = "renesas,kzm9g", "renesas,sh73a0"; 16 compatible = "renesas,kzm9g", "renesas,sh73a0";
17 17
18 chosen { 18 chosen {
19 bootargs = "console=tty0 console=ttySC4,115200 root=/dev/nfs ip=dhcp ignore_loglevel earlyprintk=sh-sci.4,115200"; 19 bootargs = "console=tty0 console=ttySC4,115200 root=/dev/nfs ip=dhcp ignore_loglevel earlyprintk=sh-sci.4,115200 rw";
20 }; 20 };
21 21
22 memory { 22 memory {
diff --git a/arch/arm/boot/dts/sh73a0.dtsi b/arch/arm/boot/dts/sh73a0.dtsi
index b97750256003..ba59a5875a10 100644
--- a/arch/arm/boot/dts/sh73a0.dtsi
+++ b/arch/arm/boot/dts/sh73a0.dtsi
@@ -38,6 +38,12 @@
38 <0xf0000100 0x100>; 38 <0xf0000100 0x100>;
39 }; 39 };
40 40
41 pmu {
42 compatible = "arm,cortex-a9-pmu";
43 interrupts = <0 55 4>,
44 <0 56 4>;
45 };
46
41 irqpin0: irqpin@e6900000 { 47 irqpin0: irqpin@e6900000 {
42 compatible = "renesas,intc-irqpin"; 48 compatible = "renesas,intc-irqpin";
43 #interrupt-cells = <2>; 49 #interrupt-cells = <2>;
@@ -222,4 +228,12 @@
222 cap-sd-highspeed; 228 cap-sd-highspeed;
223 status = "disabled"; 229 status = "disabled";
224 }; 230 };
231
232 pfc: pfc@e6050000 {
233 compatible = "renesas,pfc-sh73a0";
234 reg = <0xe6050000 0x8000>,
235 <0xe605801c 0x1c>;
236 gpio-controller;
237 #gpio-cells = <2>;
238 };
225}; 239};
diff --git a/arch/arm/boot/dts/skeleton64.dtsi b/arch/arm/boot/dts/skeleton64.dtsi
index 15994158a998..b5d7f36f33de 100644
--- a/arch/arm/boot/dts/skeleton64.dtsi
+++ b/arch/arm/boot/dts/skeleton64.dtsi
@@ -9,5 +9,5 @@
9 #size-cells = <2>; 9 #size-cells = <2>;
10 chosen { }; 10 chosen { };
11 aliases { }; 11 aliases { };
12 memory { device_type = "memory"; reg = <0 0>; }; 12 memory { device_type = "memory"; reg = <0 0 0 0>; };
13}; 13};
diff --git a/arch/arm/boot/dts/socfpga.dtsi b/arch/arm/boot/dts/socfpga.dtsi
index bee62a2cf6d6..e273fa993b8c 100644
--- a/arch/arm/boot/dts/socfpga.dtsi
+++ b/arch/arm/boot/dts/socfpga.dtsi
@@ -476,25 +476,25 @@
476 }; 476 };
477 477
478 timer0: timer0@ffc08000 { 478 timer0: timer0@ffc08000 {
479 compatible = "snps,dw-apb-timer-sp"; 479 compatible = "snps,dw-apb-timer";
480 interrupts = <0 167 4>; 480 interrupts = <0 167 4>;
481 reg = <0xffc08000 0x1000>; 481 reg = <0xffc08000 0x1000>;
482 }; 482 };
483 483
484 timer1: timer1@ffc09000 { 484 timer1: timer1@ffc09000 {
485 compatible = "snps,dw-apb-timer-sp"; 485 compatible = "snps,dw-apb-timer";
486 interrupts = <0 168 4>; 486 interrupts = <0 168 4>;
487 reg = <0xffc09000 0x1000>; 487 reg = <0xffc09000 0x1000>;
488 }; 488 };
489 489
490 timer2: timer2@ffd00000 { 490 timer2: timer2@ffd00000 {
491 compatible = "snps,dw-apb-timer-osc"; 491 compatible = "snps,dw-apb-timer";
492 interrupts = <0 169 4>; 492 interrupts = <0 169 4>;
493 reg = <0xffd00000 0x1000>; 493 reg = <0xffd00000 0x1000>;
494 }; 494 };
495 495
496 timer3: timer3@ffd01000 { 496 timer3: timer3@ffd01000 {
497 compatible = "snps,dw-apb-timer-osc"; 497 compatible = "snps,dw-apb-timer";
498 interrupts = <0 170 4>; 498 interrupts = <0 170 4>;
499 reg = <0xffd01000 0x1000>; 499 reg = <0xffd01000 0x1000>;
500 }; 500 };
diff --git a/arch/arm/boot/dts/ste-ccu8540-pinctrl.dtsi b/arch/arm/boot/dts/ste-ccu8540-pinctrl.dtsi
new file mode 100644
index 000000000000..e0799966bc25
--- /dev/null
+++ b/arch/arm/boot/dts/ste-ccu8540-pinctrl.dtsi
@@ -0,0 +1,196 @@
1/*
2 * Copyright 2012 ST-Ericsson
3 *
4 * The code contained herein is licensed under the GNU General Public
5 * License. You may obtain a copy of the GNU General Public License
6 * Version 2 or later at the following locations:
7 *
8 * http://www.opensource.org/licenses/gpl-license.html
9 * http://www.gnu.org/copyleft/gpl.html
10 */
11#include "ste-nomadik-pinctrl.dtsi"
12
13/ {
14 soc {
15 pinctrl {
16 uart0 {
17 uart0_default_mux: uart0_mux {
18 default_mux {
19 ste,function = "u0";
20 ste,pins = "u0_a_1";
21 };
22 };
23
24 uart0_default_mode: uart0_default {
25 default_cfg1 {
26 ste,pins = "GPIO0", "GPIO2";
27 ste,config = <&in_pu>;
28 };
29
30 default_cfg2 {
31 ste,pins = "GPIO1", "GPIO3";
32 ste,config = <&out_hi>;
33 };
34 };
35
36 uart0_sleep_mode: uart0_sleep {
37 sleep_cfg1 {
38 ste,pins = "GPIO0", "GPIO2";
39 ste,config = <&slpm_in_pu>;
40 };
41
42 sleep_cfg2 {
43 ste,pins = "GPIO1", "GPIO3";
44 ste,config = <&slpm_out_hi>;
45 };
46 };
47 };
48
49 uart2 {
50 uart2_default_mode: uart2_default {
51 default_mux {
52 ste,function = "u2";
53 ste,pins = "u2txrx_a_1";
54 };
55
56 default_cfg1 {
57 ste,pins = "GPIO120";
58 ste,config = <&in_pu>;
59 };
60
61 default_cfg2 {
62 ste,pins = "GPIO121";
63 ste,config = <&out_hi>;
64 };
65 };
66
67 uart2_sleep_mode: uart2_sleep {
68 sleep_cfg1 {
69 ste,pins = "GPIO120";
70 ste,config = <&slpm_in_pu>;
71 };
72
73 sleep_cfg2 {
74 ste,pins = "GPIO121";
75 ste,config = <&slpm_out_hi>;
76 };
77 };
78 };
79
80 i2c0 {
81 i2c0_default_mux: i2c_mux {
82 default_mux {
83 ste,function = "i2c0";
84 ste,pins = "i2c0_a_1";
85 };
86 };
87
88 i2c0_default_mode: i2c_default {
89 default_cfg1 {
90 ste,pins = "GPIO147", "GPIO148";
91 ste,config = <&in_pu>;
92 };
93 };
94
95 i2c0_sleep_mode: i2c_sleep {
96 sleep_cfg1 {
97 ste,pins = "GPIO147", "GPIO148";
98 ste,config = <&slpm_in_pu>;
99 };
100 };
101 };
102
103 i2c1 {
104 i2c1_default_mux: i2c_mux {
105 default_mux {
106 ste,function = "i2c1";
107 ste,pins = "i2c1_b_2";
108 };
109 };
110
111 i2c1_default_mode: i2c_default {
112 default_cfg1 {
113 ste,pins = "GPIO16", "GPIO17";
114 ste,config = <&in_pu>;
115 };
116 };
117
118 i2c1_sleep_mode: i2c_sleep {
119 sleep_cfg1 {
120 ste,pins = "GPIO16", "GPIO17";
121 ste,config = <&slpm_in_pu>;
122 };
123 };
124 };
125
126 i2c2 {
127 i2c2_default_mux: i2c_mux {
128 default_mux {
129 ste,function = "i2c2";
130 ste,pins = "i2c2_b_2";
131 };
132 };
133
134 i2c2_default_mode: i2c_default {
135 default_cfg1 {
136 ste,pins = "GPIO10", "GPIO11";
137 ste,config = <&in_pu>;
138 };
139 };
140
141 i2c2_sleep_mode: i2c_sleep {
142 sleep_cfg1 {
143 ste,pins = "GPIO11", "GPIO11";
144 ste,config = <&slpm_in_pu>;
145 };
146 };
147 };
148
149 i2c4 {
150 i2c4_default_mux: i2c_mux {
151 default_mux {
152 ste,function = "i2c4";
153 ste,pins = "i2c4_b_2";
154 };
155 };
156
157 i2c4_default_mode: i2c_default {
158 default_cfg1 {
159 ste,pins = "GPIO122", "GPIO123";
160 ste,config = <&in_pu>;
161 };
162 };
163
164 i2c4_sleep_mode: i2c_sleep {
165 sleep_cfg1 {
166 ste,pins = "GPIO122", "GPIO123";
167 ste,config = <&slpm_in_pu>;
168 };
169 };
170 };
171
172 i2c5 {
173 i2c5_default_mux: i2c_mux {
174 default_mux {
175 ste,function = "i2c5";
176 ste,pins = "i2c5_c_2";
177 };
178 };
179
180 i2c5_default_mode: i2c_default {
181 default_cfg1 {
182 ste,pins = "GPIO118", "GPIO119";
183 ste,config = <&in_pu>;
184 };
185 };
186
187 i2c5_sleep_mode: i2c_sleep {
188 sleep_cfg1 {
189 ste,pins = "GPIO118", "GPIO119";
190 ste,config = <&slpm_in_pu>;
191 };
192 };
193 };
194 };
195 };
196};
diff --git a/arch/arm/boot/dts/ste-ccu8540.dts b/arch/arm/boot/dts/ste-ccu8540.dts
new file mode 100644
index 000000000000..7f3baf51a3a9
--- /dev/null
+++ b/arch/arm/boot/dts/ste-ccu8540.dts
@@ -0,0 +1,86 @@
1/*
2 * Copyright 2013 ST-Ericsson AB
3 *
4 * The code contained herein is licensed under the GNU General Public
5 * License. You may obtain a copy of the GNU General Public License
6 * Version 2 or later at the following locations:
7 *
8 * http://www.opensource.org/licenses/gpl-license.html
9 * http://www.gnu.org/copyleft/gpl.html
10 */
11
12/dts-v1/;
13#include "ste-dbx5x0.dtsi"
14#include "ste-ccu8540-pinctrl.dtsi"
15
16/ {
17 model = "ST-Ericsson U8540 platform with Device Tree";
18 compatible = "st-ericsson,ccu8540", "st-ericsson,u8540";
19
20 memory@0 {
21 reg = <0x20000000 0x1f000000>, <0xc0000000 0x3f000000>;
22 };
23
24 soc {
25 pinctrl {
26 compatible = "stericsson,db8540-pinctrl";
27 };
28
29 prcmu@80157000 {
30 reg = <0x80157000 0x2000>, <0x801b0000 0x8000>, <0x801b8000 0x3000>;
31 reg-names = "prcmu", "prcmu-tcpm", "prcmu-tcdm";
32 };
33
34 uart@80120000 {
35 pinctrl-names = "default", "sleep";
36 pinctrl-0 = <&uart0_default_mux>, <&uart0_default_mode>;
37 pinctrl-1 = <&uart0_sleep_mode>;
38 status = "okay";
39 };
40
41 uart@80121000 {
42 status = "okay";
43 };
44
45 uart@80007000 {
46 pinctrl-names = "default", "sleep";
47 pinctrl-0 = <&uart2_default_mode>;
48 pinctrl-1 = <&uart2_sleep_mode>;
49 status = "okay";
50 };
51
52 i2c0: i2c@80004000 {
53 pinctrl-names = "default","sleep";
54 pinctrl-0 = <&i2c0_default_mux>, <&i2c0_default_mode>;
55 pinctrl-1 = <&i2c0_sleep_mode>;
56 };
57
58 i2c1: i2c@80122000 {
59 pinctrl-names = "default","sleep";
60 pinctrl-0 = <&i2c1_default_mux>, <&i2c1_default_mode>;
61 pinctrl-1 = <&i2c1_sleep_mode>;
62 };
63
64 i2c2: i2c@80128000 {
65 pinctrl-names = "default","sleep";
66 pinctrl-0 = <&i2c2_default_mux>, <&i2c2_default_mode>;
67 pinctrl-1 = <&i2c2_sleep_mode>;
68 };
69
70 i2c3: i2c@80110000 {
71 status = "disabled";
72 };
73
74 i2c4: i2c@8012a000 {
75 pinctrl-names = "default","sleep";
76 pinctrl-0 = <&i2c4_default_mux>, <&i2c4_default_mode>;
77 pinctrl-1 = <&i2c4_sleep_mode>;
78 };
79
80 i2c5: i2c@80001000 {
81 pinctrl-names = "default","sleep";
82 pinctrl-0 = <&i2c5_default_mux>, <&i2c5_default_mode>;
83 pinctrl-1 = <&i2c5_sleep_mode>;
84 };
85 };
86};
diff --git a/arch/arm/boot/dts/ccu9540.dts b/arch/arm/boot/dts/ste-ccu9540.dts
index ed29ec7288e4..229508750890 100644
--- a/arch/arm/boot/dts/ccu9540.dts
+++ b/arch/arm/boot/dts/ste-ccu9540.dts
@@ -10,7 +10,7 @@
10 */ 10 */
11 11
12/dts-v1/; 12/dts-v1/;
13#include "dbx5x0.dtsi" 13#include "ste-dbx5x0.dtsi"
14 14
15/ { 15/ {
16 model = "ST-Ericsson CCU9540 platform with Device Tree"; 16 model = "ST-Ericsson CCU9540 platform with Device Tree";
diff --git a/arch/arm/boot/dts/dbx5x0.dtsi b/arch/arm/boot/dts/ste-dbx5x0.dtsi
index a1529455f081..1c1091eedade 100644
--- a/arch/arm/boot/dts/dbx5x0.dtsi
+++ b/arch/arm/boot/dts/ste-dbx5x0.dtsi
@@ -245,7 +245,7 @@
245 <22 IRQ_TYPE_LEVEL_HIGH>; 245 <22 IRQ_TYPE_LEVEL_HIGH>;
246 interrupt-names = "IRQ_HOTMON_LOW", "IRQ_HOTMON_HIGH"; 246 interrupt-names = "IRQ_HOTMON_LOW", "IRQ_HOTMON_HIGH";
247 status = "disabled"; 247 status = "disabled";
248 }; 248 };
249 249
250 db8500-prcmu-regulators { 250 db8500-prcmu-regulators {
251 compatible = "stericsson,db8500-prcmu-regulator"; 251 compatible = "stericsson,db8500-prcmu-regulator";
@@ -457,8 +457,36 @@
457 stericsson,earpeice-cmv = <950>; /* Units in mV. */ 457 stericsson,earpeice-cmv = <950>; /* Units in mV. */
458 }; 458 };
459 459
460 ext_regulators: ab8500-ext-regulators {
461 compatible = "stericsson,ab8500-ext-regulator";
462
463 ab8500_ext1_reg: ab8500_ext1 {
464 regulator-compatible = "ab8500_ext1";
465 regulator-min-microvolt = <1800000>;
466 regulator-max-microvolt = <1800000>;
467 regulator-boot-on;
468 regulator-always-on;
469 };
470
471 ab8500_ext2_reg: ab8500_ext2 {
472 regulator-compatible = "ab8500_ext2";
473 regulator-min-microvolt = <1360000>;
474 regulator-max-microvolt = <1360000>;
475 regulator-boot-on;
476 regulator-always-on;
477 };
478
479 ab8500_ext3_reg: ab8500_ext3 {
480 regulator-compatible = "ab8500_ext3";
481 regulator-min-microvolt = <3400000>;
482 regulator-max-microvolt = <3400000>;
483 regulator-boot-on;
484 };
485 };
486
460 ab8500-regulators { 487 ab8500-regulators {
461 compatible = "stericsson,ab8500-regulator"; 488 compatible = "stericsson,ab8500-regulator";
489 vin-supply = <&ab8500_ext3_reg>;
462 490
463 // supplies to the display/camera 491 // supplies to the display/camera
464 ab8500_ldo_aux1_reg: ab8500_ldo_aux1 { 492 ab8500_ldo_aux1_reg: ab8500_ldo_aux1 {
diff --git a/arch/arm/boot/dts/href.dtsi b/arch/arm/boot/dts/ste-href.dtsi
index 9db41b9d8358..370e03f5e7b2 100644
--- a/arch/arm/boot/dts/href.dtsi
+++ b/arch/arm/boot/dts/ste-href.dtsi
@@ -10,7 +10,7 @@
10 */ 10 */
11 11
12#include <dt-bindings/interrupt-controller/irq.h> 12#include <dt-bindings/interrupt-controller/irq.h>
13#include "dbx5x0.dtsi" 13#include "ste-dbx5x0.dtsi"
14 14
15/ { 15/ {
16 memory { 16 memory {
diff --git a/arch/arm/boot/dts/hrefprev60.dts b/arch/arm/boot/dts/ste-hrefprev60.dts
index c6bb07df2d1d..d8d3b99ab007 100644
--- a/arch/arm/boot/dts/hrefprev60.dts
+++ b/arch/arm/boot/dts/ste-hrefprev60.dts
@@ -10,9 +10,9 @@
10 */ 10 */
11 11
12/dts-v1/; 12/dts-v1/;
13#include "dbx5x0.dtsi" 13#include "ste-dbx5x0.dtsi"
14#include "href.dtsi" 14#include "ste-href.dtsi"
15#include "stuib.dtsi" 15#include "ste-stuib.dtsi"
16 16
17/ { 17/ {
18 model = "ST-Ericsson HREF (pre-v60) platform with Device Tree"; 18 model = "ST-Ericsson HREF (pre-v60) platform with Device Tree";
diff --git a/arch/arm/boot/dts/hrefv60plus.dts b/arch/arm/boot/dts/ste-hrefv60plus.dts
index 3d580d6447f9..6e52ebbf113f 100644
--- a/arch/arm/boot/dts/hrefv60plus.dts
+++ b/arch/arm/boot/dts/ste-hrefv60plus.dts
@@ -10,9 +10,9 @@
10 */ 10 */
11 11
12/dts-v1/; 12/dts-v1/;
13#include "dbx5x0.dtsi" 13#include "ste-dbx5x0.dtsi"
14#include "href.dtsi" 14#include "ste-href.dtsi"
15#include "stuib.dtsi" 15#include "ste-stuib.dtsi"
16 16
17/ { 17/ {
18 model = "ST-Ericsson HREF (v60+) platform with Device Tree"; 18 model = "ST-Ericsson HREF (v60+) platform with Device Tree";
diff --git a/arch/arm/boot/dts/ste-nomadik-pinctrl.dtsi b/arch/arm/boot/dts/ste-nomadik-pinctrl.dtsi
new file mode 100644
index 000000000000..efddee9403c4
--- /dev/null
+++ b/arch/arm/boot/dts/ste-nomadik-pinctrl.dtsi
@@ -0,0 +1,95 @@
1/*
2 * Copyright 2012 ST-Ericsson
3 *
4 * The code contained herein is licensed under the GNU General Public
5 * License. You may obtain a copy of the GNU General Public License
6 * Version 2 or later at the following locations:
7 *
8 * http://www.opensource.org/licenses/gpl-license.html
9 * http://www.gnu.org/copyleft/gpl.html
10 */
11#include <dt-bindings/pinctrl/nomadik.h>
12
13/ {
14 in_nopull: in_nopull {
15 ste,input = <INPUT_NOPULL>;
16 };
17
18 in_pu: input_pull_up {
19 ste,input = <INPUT_PULLUP>;
20 };
21
22 in_pd: input_pull_down {
23 ste,input = <INPUT_PULLDOWN>;
24 };
25
26 out_hi: output_high {
27 ste,output = <OUTPUT_HIGH>;
28 };
29
30 out_lo: output_low {
31 ste,output = <OUTPUT_LOW>;
32 };
33
34 gpio_out_lo: gpio_output_low {
35 ste,gpio = <GPIOMODE_ENABLED>;
36 ste,output = <OUTPUT_LOW>;
37 };
38
39 slpm_in_pu: slpm_in_pu {
40 ste,sleep = <SLPM_ENABLED>;
41 ste,sleep-input = <SLPM_INPUT_PULLUP>;
42 ste,sleep-wakeup = <SLPM_WAKEUP_ENABLE>;
43 };
44
45 slpm_in_wkup_pdis: slpm_in_wkup_pdis {
46 ste,sleep = <SLPM_ENABLED>;
47 ste,sleep-input = <SLPM_DIR_INPUT>;
48 ste,sleep-wakeup = <SLPM_WAKEUP_ENABLE>;
49 ste,sleep-pull-disable = <SLPM_PDIS_DISABLED>;
50 };
51
52 slpm_out_lo: slpm_out_lo {
53 ste,sleep = <SLPM_ENABLED>;
54 ste,sleep-output = <SLPM_OUTPUT_LOW>;
55 ste,sleep-wakeup = <SLPM_WAKEUP_ENABLE>;
56 };
57
58 slpm_out_hi: slpm_out_hi {
59 ste,sleep = <SLPM_ENABLED>;
60 ste,sleep-output = <SLPM_OUTPUT_HIGH>;
61 ste,sleep-wakeup = <SLPM_WAKEUP_ENABLE>;
62 };
63
64 slpm_out_hi_wkup_pdis: slpm_out_hi_wkup_pdis {
65 ste,sleep = <SLPM_ENABLED>;
66 ste,sleep-output = <SLPM_OUTPUT_HIGH>;
67 ste,sleep-wakeup = <SLPM_WAKEUP_ENABLE>;
68 ste,sleep-pull-disable = <SLPM_PDIS_DISABLED>;
69 };
70
71 slpm_out_wkup_pdis: slpm_out_wkup_pdis {
72 ste,sleep = <SLPM_ENABLED>;
73 ste,sleep-output = <SLPM_DIR_OUTPUT>;
74 ste,sleep-wakeup = <SLPM_WAKEUP_ENABLE>;
75 ste,sleep-pull-disable = <SLPM_PDIS_DISABLED>;
76 };
77
78 in_wkup_pdis: in_wkup_pdis {
79 ste,sleep-input = <SLPM_DIR_INPUT>;
80 ste,sleep-wakeup = <SLPM_WAKEUP_ENABLE>;
81 ste,sleep-pull-disable = <SLPM_PDIS_DISABLED>;
82 };
83
84 out_hi_wkup_pdis: out_hi_wkup_pdis {
85 ste,sleep-output = <SLPM_OUTPUT_HIGH>;
86 ste,sleep-wakeup = <SLPM_WAKEUP_ENABLE>;
87 ste,sleep-pull-disable = <SLPM_PDIS_DISABLED>;
88 };
89
90 out_wkup_pdis: out_wkup_pdis {
91 ste,sleep-output = <SLPM_DIR_OUTPUT>;
92 ste,sleep-wakeup = <SLPM_WAKEUP_ENABLE>;
93 ste,sleep-pull-disable = <SLPM_PDIS_DISABLED>;
94 };
95};
diff --git a/arch/arm/boot/dts/ste-nomadik-stn8815.dtsi b/arch/arm/boot/dts/ste-nomadik-stn8815.dtsi
index a3acfa7b3dc9..9169d3025f39 100644
--- a/arch/arm/boot/dts/ste-nomadik-stn8815.dtsi
+++ b/arch/arm/boot/dts/ste-nomadik-stn8815.dtsi
@@ -140,18 +140,30 @@
140 }; 140 };
141 }; 141 };
142 i2c0 { 142 i2c0 {
143 i2c0_default_mux: i2c0_mux {
144 i2c0_default_mux {
145 ste,function = "i2c0";
146 ste,pins = "i2c0_a_1";
147 };
148 };
143 i2c0_default_mode: i2c0_default { 149 i2c0_default_mode: i2c0_default {
144 i2c0_default_cfg { 150 i2c0_default_cfg {
145 ste,pins = "GPIO62_D3", "GPIO63_D2"; 151 ste,pins = "GPIO62_D3", "GPIO63_D2";
146 ste,input = <1>; 152 ste,input = <0>;
147 }; 153 };
148 }; 154 };
149 }; 155 };
150 i2c1 { 156 i2c1 {
157 i2c1_default_mux: i2c1_mux {
158 i2c1_default_mux {
159 ste,function = "i2c1";
160 ste,pins = "i2c1_a_1";
161 };
162 };
151 i2c1_default_mode: i2c1_default { 163 i2c1_default_mode: i2c1_default {
152 i2c1_default_cfg { 164 i2c1_default_cfg {
153 ste,pins = "GPIO53_L4", "GPIO54_L3"; 165 ste,pins = "GPIO53_L4", "GPIO54_L3";
154 ste,input = <1>; 166 ste,input = <0>;
155 }; 167 };
156 }; 168 };
157 }; 169 };
@@ -159,7 +171,7 @@
159 i2c2_default_mode: i2c2_default { 171 i2c2_default_mode: i2c2_default {
160 i2c2_default_cfg { 172 i2c2_default_cfg {
161 ste,pins = "GPIO73_C21", "GPIO74_C20"; 173 ste,pins = "GPIO73_C21", "GPIO74_C20";
162 ste,input = <1>; 174 ste,input = <0>;
163 }; 175 };
164 }; 176 };
165 }; 177 };
@@ -682,13 +694,17 @@
682 694
683 /* I2C0 connected to the STw4811 power management chip */ 695 /* I2C0 connected to the STw4811 power management chip */
684 i2c0 { 696 i2c0 {
685 compatible = "i2c-gpio"; 697 compatible = "st,nomadik-i2c", "arm,primecell";
686 gpios = <&gpio1 31 0>, /* sda */ 698 reg = <0x101f8000 0x1000>;
687 <&gpio1 30 0>; /* scl */ 699 interrupt-parent = <&vica>;
700 interrupts = <20>;
701 clock-frequency = <100000>;
688 #address-cells = <1>; 702 #address-cells = <1>;
689 #size-cells = <0>; 703 #size-cells = <0>;
704 clocks = <&i2c0clk>, <&pclki2c0>;
705 clock-names = "mclk", "apb_pclk";
690 pinctrl-names = "default"; 706 pinctrl-names = "default";
691 pinctrl-0 = <&i2c0_default_mode>; 707 pinctrl-0 = <&i2c0_default_mux>, <&i2c0_default_mode>;
692 708
693 stw4811@2d { 709 stw4811@2d {
694 compatible = "st,stw4811"; 710 compatible = "st,stw4811";
@@ -698,13 +714,17 @@
698 714
699 /* I2C1 connected to various sensors */ 715 /* I2C1 connected to various sensors */
700 i2c1 { 716 i2c1 {
701 compatible = "i2c-gpio"; 717 compatible = "st,nomadik-i2c", "arm,primecell";
702 gpios = <&gpio1 22 0>, /* sda */ 718 reg = <0x101f7000 0x1000>;
703 <&gpio1 21 0>; /* scl */ 719 interrupt-parent = <&vica>;
720 interrupts = <21>;
721 clock-frequency = <100000>;
704 #address-cells = <1>; 722 #address-cells = <1>;
705 #size-cells = <0>; 723 #size-cells = <0>;
724 clocks = <&i2c1clk>, <&pclki2c1>;
725 clock-names = "mclk", "apb_pclk";
706 pinctrl-names = "default"; 726 pinctrl-names = "default";
707 pinctrl-0 = <&i2c1_default_mode>; 727 pinctrl-0 = <&i2c1_default_mux>, <&i2c1_default_mode>;
708 728
709 camera@2d { 729 camera@2d {
710 compatible = "st,camera"; 730 compatible = "st,camera";
diff --git a/arch/arm/boot/dts/snowball.dts b/arch/arm/boot/dts/ste-snowball.dts
index 49824be66845..f1fc128e249d 100644
--- a/arch/arm/boot/dts/snowball.dts
+++ b/arch/arm/boot/dts/ste-snowball.dts
@@ -10,7 +10,7 @@
10 */ 10 */
11 11
12/dts-v1/; 12/dts-v1/;
13#include "dbx5x0.dtsi" 13#include "ste-dbx5x0.dtsi"
14 14
15/ { 15/ {
16 model = "Calao Systems Snowball platform with device tree"; 16 model = "Calao Systems Snowball platform with device tree";
@@ -165,34 +165,6 @@
165 status = "okay"; 165 status = "okay";
166 }; 166 };
167 167
168 i2c@80004000 {
169 tc3589x@42 {
170 //compatible = "tc3589x";
171 reg = <0x42>;
172 gpios = <&gpio6 25 0x4>;
173 interrupt-parent = <&gpio6>;
174 };
175 tps61052@33 {
176 //compatible = "tps61052";
177 reg = <0x33>;
178 };
179 };
180
181 i2c@80128000 {
182 lp5521@33 {
183 // compatible = "lp5521";
184 reg = <0x33>;
185 };
186 lp5521@34 {
187 // compatible = "lp5521";
188 reg = <0x34>;
189 };
190 bh1780@29 {
191 // compatible = "rohm,bh1780gli";
192 reg = <0x33>;
193 };
194 };
195
196 cpufreq-cooling { 168 cpufreq-cooling {
197 status = "okay"; 169 status = "okay";
198 }; 170 };
@@ -310,6 +282,20 @@
310 compatible = "stericsson,ab8500-gpio"; 282 compatible = "stericsson,ab8500-gpio";
311 }; 283 };
312 284
285 ext_regulators: ab8500-ext-regulators {
286 ab8500_ext1_reg: ab8500_ext1 {
287 regulator-name = "ab8500-ext-supply1";
288 };
289
290 ab8500_ext2_reg_reg: ab8500_ext2 {
291 regulator-name = "ab8500-ext-supply2";
292 };
293
294 ab8500_ext3_reg_reg: ab8500_ext3 {
295 regulator-name = "ab8500-ext-supply3";
296 };
297 };
298
313 ab8500-regulators { 299 ab8500-regulators {
314 ab8500_ldo_aux1_reg: ab8500_ldo_aux1 { 300 ab8500_ldo_aux1_reg: ab8500_ldo_aux1 {
315 regulator-name = "V-DISPLAY"; 301 regulator-name = "V-DISPLAY";
diff --git a/arch/arm/boot/dts/stuib.dtsi b/arch/arm/boot/dts/ste-stuib.dtsi
index 524e33240ad4..524e33240ad4 100644
--- a/arch/arm/boot/dts/stuib.dtsi
+++ b/arch/arm/boot/dts/ste-stuib.dtsi
diff --git a/arch/arm/boot/dts/sun4i-a10-a1000.dts b/arch/arm/boot/dts/sun4i-a10-a1000.dts
new file mode 100644
index 000000000000..eb4d73b6a090
--- /dev/null
+++ b/arch/arm/boot/dts/sun4i-a10-a1000.dts
@@ -0,0 +1,101 @@
1/*
2 * Copyright 2013 Emilio López
3 *
4 * Emilio López <emilio@elopez.com.ar>
5 *
6 * The code contained herein is licensed under the GNU General Public
7 * License. You may obtain a copy of the GNU General Public License
8 * Version 2 or later at the following locations:
9 *
10 * http://www.opensource.org/licenses/gpl-license.html
11 * http://www.gnu.org/copyleft/gpl.html
12 */
13
14/dts-v1/;
15/include/ "sun4i-a10.dtsi"
16
17/ {
18 model = "Mele A1000";
19 compatible = "mele,a1000", "allwinner,sun4i-a10";
20
21 aliases {
22 serial0 = &uart0;
23 };
24
25 soc@01c00000 {
26 emac: ethernet@01c0b000 {
27 pinctrl-names = "default";
28 pinctrl-0 = <&emac_pins_a>;
29 phy = <&phy1>;
30 status = "okay";
31 };
32
33 mdio@01c0b080 {
34 phy-supply = <&reg_emac_3v3>;
35 status = "okay";
36
37 phy1: ethernet-phy@1 {
38 reg = <1>;
39 };
40 };
41
42 pinctrl@01c20800 {
43 emac_power_pin_a1000: emac_power_pin@0 {
44 allwinner,pins = "PH15";
45 allwinner,function = "gpio_out";
46 allwinner,drive = <0>;
47 allwinner,pull = <0>;
48 };
49
50 led_pins_a1000: led_pins@0 {
51 allwinner,pins = "PH10", "PH20";
52 allwinner,function = "gpio_out";
53 allwinner,drive = <0>;
54 allwinner,pull = <0>;
55 };
56 };
57
58 uart0: serial@01c28000 {
59 pinctrl-names = "default";
60 pinctrl-0 = <&uart0_pins_a>;
61 status = "okay";
62 };
63
64 i2c0: i2c@01c2ac00 {
65 pinctrl-names = "default";
66 pinctrl-0 = <&i2c0_pins_a>;
67 status = "okay";
68 };
69 };
70
71 leds {
72 compatible = "gpio-leds";
73 pinctrl-names = "default";
74 pinctrl-0 = <&led_pins_a1000>;
75
76 red {
77 label = "a1000:red:usr";
78 gpios = <&pio 7 10 0>;
79 };
80
81 blue {
82 label = "a1000:blue:usr";
83 gpios = <&pio 7 20 0>;
84 };
85 };
86
87 regulators {
88 compatible = "simple-bus";
89
90 reg_emac_3v3: emac-3v3 {
91 compatible = "regulator-fixed";
92 pinctrl-names = "default";
93 pinctrl-0 = <&emac_power_pin_a1000>;
94 regulator-name = "emac-3v3";
95 regulator-min-microvolt = <3300000>;
96 regulator-max-microvolt = <3300000>;
97 enable-active-high;
98 gpio = <&pio 7 15 0>;
99 };
100 };
101};
diff --git a/arch/arm/boot/dts/sun4i-a10-cubieboard.dts b/arch/arm/boot/dts/sun4i-a10-cubieboard.dts
index 757c4cd900ee..425a7db898c5 100644
--- a/arch/arm/boot/dts/sun4i-a10-cubieboard.dts
+++ b/arch/arm/boot/dts/sun4i-a10-cubieboard.dts
@@ -26,7 +26,7 @@
26 bootargs = "earlyprintk console=ttyS0,115200"; 26 bootargs = "earlyprintk console=ttyS0,115200";
27 }; 27 };
28 28
29 soc@01c20000 { 29 soc@01c00000 {
30 emac: ethernet@01c0b000 { 30 emac: ethernet@01c0b000 {
31 pinctrl-names = "default"; 31 pinctrl-names = "default";
32 pinctrl-0 = <&emac_pins_a>; 32 pinctrl-0 = <&emac_pins_a>;
@@ -76,12 +76,12 @@
76 pinctrl-0 = <&led_pins_cubieboard>; 76 pinctrl-0 = <&led_pins_cubieboard>;
77 77
78 blue { 78 blue {
79 label = "cubieboard::blue"; 79 label = "cubieboard:blue:usr";
80 gpios = <&pio 7 21 0>; /* LED1 */ 80 gpios = <&pio 7 21 0>; /* LED1 */
81 }; 81 };
82 82
83 green { 83 green {
84 label = "cubieboard::green"; 84 label = "cubieboard:green:usr";
85 gpios = <&pio 7 20 0>; /* LED2 */ 85 gpios = <&pio 7 20 0>; /* LED2 */
86 linux,default-trigger = "heartbeat"; 86 linux,default-trigger = "heartbeat";
87 }; 87 };
diff --git a/arch/arm/boot/dts/sun4i-a10-hackberry.dts b/arch/arm/boot/dts/sun4i-a10-hackberry.dts
index 3514b37d66bc..b3ae51fa9372 100644
--- a/arch/arm/boot/dts/sun4i-a10-hackberry.dts
+++ b/arch/arm/boot/dts/sun4i-a10-hackberry.dts
@@ -22,7 +22,7 @@
22 bootargs = "earlyprintk console=ttyS0,115200"; 22 bootargs = "earlyprintk console=ttyS0,115200";
23 }; 23 };
24 24
25 soc@01c20000 { 25 soc@01c00000 {
26 emac: ethernet@01c0b000 { 26 emac: ethernet@01c0b000 {
27 pinctrl-names = "default"; 27 pinctrl-names = "default";
28 pinctrl-0 = <&emac_pins_a>; 28 pinctrl-0 = <&emac_pins_a>;
diff --git a/arch/arm/boot/dts/sun4i-a10-mini-xplus.dts b/arch/arm/boot/dts/sun4i-a10-mini-xplus.dts
index 078ed7f618d7..0c1447c68059 100644
--- a/arch/arm/boot/dts/sun4i-a10-mini-xplus.dts
+++ b/arch/arm/boot/dts/sun4i-a10-mini-xplus.dts
@@ -22,7 +22,7 @@
22 bootargs = "earlyprintk console=ttyS0,115200"; 22 bootargs = "earlyprintk console=ttyS0,115200";
23 }; 23 };
24 24
25 soc@01c20000 { 25 soc@01c00000 {
26 uart0: serial@01c28000 { 26 uart0: serial@01c28000 {
27 pinctrl-names = "default"; 27 pinctrl-names = "default";
28 pinctrl-0 = <&uart0_pins_a>; 28 pinctrl-0 = <&uart0_pins_a>;
diff --git a/arch/arm/boot/dts/sun4i-a10.dtsi b/arch/arm/boot/dts/sun4i-a10.dtsi
index b2bd6e124250..c32770a28acf 100644
--- a/arch/arm/boot/dts/sun4i-a10.dtsi
+++ b/arch/arm/boot/dts/sun4i-a10.dtsi
@@ -160,11 +160,10 @@
160 }; 160 };
161 }; 161 };
162 162
163 soc@01c20000 { 163 soc@01c00000 {
164 compatible = "simple-bus"; 164 compatible = "simple-bus";
165 #address-cells = <1>; 165 #address-cells = <1>;
166 #size-cells = <1>; 166 #size-cells = <1>;
167 reg = <0x01c20000 0x300000>;
168 ranges; 167 ranges;
169 168
170 emac: ethernet@01c0b000 { 169 emac: ethernet@01c0b000 {
diff --git a/arch/arm/boot/dts/sun5i-a10s-olinuxino-micro.dts b/arch/arm/boot/dts/sun5i-a10s-olinuxino-micro.dts
index 64dc0c42c43a..3c9f8b3cd3e3 100644
--- a/arch/arm/boot/dts/sun5i-a10s-olinuxino-micro.dts
+++ b/arch/arm/boot/dts/sun5i-a10s-olinuxino-micro.dts
@@ -18,7 +18,7 @@
18 model = "Olimex A10s-Olinuxino Micro"; 18 model = "Olimex A10s-Olinuxino Micro";
19 compatible = "olimex,a10s-olinuxino-micro", "allwinner,sun5i-a10s"; 19 compatible = "olimex,a10s-olinuxino-micro", "allwinner,sun5i-a10s";
20 20
21 soc@01c20000 { 21 soc@01c00000 {
22 emac: ethernet@01c0b000 { 22 emac: ethernet@01c0b000 {
23 pinctrl-names = "default"; 23 pinctrl-names = "default";
24 pinctrl-0 = <&emac_pins_a>; 24 pinctrl-0 = <&emac_pins_a>;
@@ -60,6 +60,31 @@
60 pinctrl-0 = <&uart3_pins_a>; 60 pinctrl-0 = <&uart3_pins_a>;
61 status = "okay"; 61 status = "okay";
62 }; 62 };
63
64 i2c0: i2c@01c2ac00 {
65 pinctrl-names = "default";
66 pinctrl-0 = <&i2c0_pins_a>;
67 status = "okay";
68 };
69
70 i2c1: i2c@01c2b000 {
71 pinctrl-names = "default";
72 pinctrl-0 = <&i2c1_pins_a>;
73 status = "okay";
74
75 at24@50 {
76 compatible = "at,24c16";
77 pagesize = <16>;
78 reg = <0x50>;
79 read-only;
80 };
81 };
82
83 i2c2: i2c@01c2b400 {
84 pinctrl-names = "default";
85 pinctrl-0 = <&i2c2_pins_a>;
86 status = "okay";
87 };
63 }; 88 };
64 89
65 leds { 90 leds {
diff --git a/arch/arm/boot/dts/sun5i-a10s.dtsi b/arch/arm/boot/dts/sun5i-a10s.dtsi
index 2307ce827ae0..3b4a0574f068 100644
--- a/arch/arm/boot/dts/sun5i-a10s.dtsi
+++ b/arch/arm/boot/dts/sun5i-a10s.dtsi
@@ -95,20 +95,16 @@
95 95
96 ahb_gates: ahb_gates@01c20060 { 96 ahb_gates: ahb_gates@01c20060 {
97 #clock-cells = <1>; 97 #clock-cells = <1>;
98 compatible = "allwinner,sun4i-ahb-gates-clk"; 98 compatible = "allwinner,sun5i-a10s-ahb-gates-clk";
99 reg = <0x01c20060 0x8>; 99 reg = <0x01c20060 0x8>;
100 clocks = <&ahb>; 100 clocks = <&ahb>;
101 clock-output-names = "ahb_usb0", "ahb_ehci0", 101 clock-output-names = "ahb_usbotg", "ahb_ehci", "ahb_ohci",
102 "ahb_ohci0", "ahb_ehci1", "ahb_ohci1", "ahb_ss", 102 "ahb_ss", "ahb_dma", "ahb_bist", "ahb_mmc0",
103 "ahb_dma", "ahb_bist", "ahb_mmc0", "ahb_mmc1", 103 "ahb_mmc1", "ahb_mmc2", "ahb_nand", "ahb_sdram",
104 "ahb_mmc2", "ahb_mmc3", "ahb_ms", "ahb_nand", 104 "ahb_emac", "ahb_ts", "ahb_spi0", "ahb_spi1",
105 "ahb_sdram", "ahb_ace", "ahb_emac", "ahb_ts", 105 "ahb_spi2", "ahb_gps", "ahb_stimer", "ahb_ve",
106 "ahb_spi0", "ahb_spi1", "ahb_spi2", "ahb_spi3", 106 "ahb_tve", "ahb_lcd", "ahb_csi", "ahb_hdmi",
107 "ahb_pata", "ahb_sata", "ahb_gps", "ahb_ve", 107 "ahb_de_be", "ahb_de_fe", "ahb_iep", "ahb_mali400";
108 "ahb_tvd", "ahb_tve0", "ahb_tve1", "ahb_lcd0",
109 "ahb_lcd1", "ahb_csi0", "ahb_csi1", "ahb_hdmi",
110 "ahb_de_be0", "ahb_de_be1", "ahb_de_fe0",
111 "ahb_de_fe1", "ahb_mp", "ahb_mali400";
112 }; 108 };
113 109
114 apb0: apb0@01c20054 { 110 apb0: apb0@01c20054 {
@@ -120,12 +116,11 @@
120 116
121 apb0_gates: apb0_gates@01c20068 { 117 apb0_gates: apb0_gates@01c20068 {
122 #clock-cells = <1>; 118 #clock-cells = <1>;
123 compatible = "allwinner,sun4i-apb0-gates-clk"; 119 compatible = "allwinner,sun5i-a10s-apb0-gates-clk";
124 reg = <0x01c20068 0x4>; 120 reg = <0x01c20068 0x4>;
125 clocks = <&apb0>; 121 clocks = <&apb0>;
126 clock-output-names = "apb0_codec", "apb0_spdif", 122 clock-output-names = "apb0_codec", "apb0_iis", "apb0_pio",
127 "apb0_ac97", "apb0_iis", "apb0_pio", "apb0_ir0", 123 "apb0_ir", "apb0_keypad";
128 "apb0_ir1", "apb0_keypad";
129 }; 124 };
130 125
131 /* dummy is pll62 */ 126 /* dummy is pll62 */
@@ -145,23 +140,19 @@
145 140
146 apb1_gates: apb1_gates@01c2006c { 141 apb1_gates: apb1_gates@01c2006c {
147 #clock-cells = <1>; 142 #clock-cells = <1>;
148 compatible = "allwinner,sun4i-apb1-gates-clk"; 143 compatible = "allwinner,sun5i-a10s-apb1-gates-clk";
149 reg = <0x01c2006c 0x4>; 144 reg = <0x01c2006c 0x4>;
150 clocks = <&apb1>; 145 clocks = <&apb1>;
151 clock-output-names = "apb1_i2c0", "apb1_i2c1", 146 clock-output-names = "apb1_i2c0", "apb1_i2c1",
152 "apb1_i2c2", "apb1_can", "apb1_scr", 147 "apb1_i2c2", "apb1_uart0", "apb1_uart1",
153 "apb1_ps20", "apb1_ps21", "apb1_uart0", 148 "apb1_uart2", "apb1_uart3";
154 "apb1_uart1", "apb1_uart2", "apb1_uart3",
155 "apb1_uart4", "apb1_uart5", "apb1_uart6",
156 "apb1_uart7";
157 }; 149 };
158 }; 150 };
159 151
160 soc@01c20000 { 152 soc@01c00000 {
161 compatible = "simple-bus"; 153 compatible = "simple-bus";
162 #address-cells = <1>; 154 #address-cells = <1>;
163 #size-cells = <1>; 155 #size-cells = <1>;
164 reg = <0x01c20000 0x300000>;
165 ranges; 156 ranges;
166 157
167 emac: ethernet@01c0b000 { 158 emac: ethernet@01c0b000 {
@@ -229,6 +220,27 @@
229 allwinner,drive = <0>; 220 allwinner,drive = <0>;
230 allwinner,pull = <0>; 221 allwinner,pull = <0>;
231 }; 222 };
223
224 i2c0_pins_a: i2c0@0 {
225 allwinner,pins = "PB0", "PB1";
226 allwinner,function = "i2c0";
227 allwinner,drive = <0>;
228 allwinner,pull = <0>;
229 };
230
231 i2c1_pins_a: i2c1@0 {
232 allwinner,pins = "PB15", "PB16";
233 allwinner,function = "i2c1";
234 allwinner,drive = <0>;
235 allwinner,pull = <0>;
236 };
237
238 i2c2_pins_a: i2c2@0 {
239 allwinner,pins = "PB17", "PB18";
240 allwinner,function = "i2c2";
241 allwinner,drive = <0>;
242 allwinner,pull = <0>;
243 };
232 }; 244 };
233 245
234 timer@01c20c00 { 246 timer@01c20c00 {
@@ -282,5 +294,38 @@
282 clocks = <&apb1_gates 19>; 294 clocks = <&apb1_gates 19>;
283 status = "disabled"; 295 status = "disabled";
284 }; 296 };
297
298 i2c0: i2c@01c2ac00 {
299 #address-cells = <1>;
300 #size-cells = <0>;
301 compatible = "allwinner,sun4i-i2c";
302 reg = <0x01c2ac00 0x400>;
303 interrupts = <7>;
304 clocks = <&apb1_gates 0>;
305 clock-frequency = <100000>;
306 status = "disabled";
307 };
308
309 i2c1: i2c@01c2b000 {
310 #address-cells = <1>;
311 #size-cells = <0>;
312 compatible = "allwinner,sun4i-i2c";
313 reg = <0x01c2b000 0x400>;
314 interrupts = <8>;
315 clocks = <&apb1_gates 1>;
316 clock-frequency = <100000>;
317 status = "disabled";
318 };
319
320 i2c2: i2c@01c2b400 {
321 #address-cells = <1>;
322 #size-cells = <0>;
323 compatible = "allwinner,sun4i-i2c";
324 reg = <0x01c2b400 0x400>;
325 interrupts = <9>;
326 clocks = <&apb1_gates 2>;
327 clock-frequency = <100000>;
328 status = "disabled";
329 };
285 }; 330 };
286}; 331};
diff --git a/arch/arm/boot/dts/sun5i-a13-olinuxino.dts b/arch/arm/boot/dts/sun5i-a13-olinuxino.dts
index 80497e376706..9e508dcc4245 100644
--- a/arch/arm/boot/dts/sun5i-a13-olinuxino.dts
+++ b/arch/arm/boot/dts/sun5i-a13-olinuxino.dts
@@ -22,7 +22,7 @@
22 bootargs = "earlyprintk console=ttyS0,115200"; 22 bootargs = "earlyprintk console=ttyS0,115200";
23 }; 23 };
24 24
25 soc@01c20000 { 25 soc@01c00000 {
26 pinctrl@01c20800 { 26 pinctrl@01c20800 {
27 led_pins_olinuxino: led_pins@0 { 27 led_pins_olinuxino: led_pins@0 {
28 allwinner,pins = "PG9"; 28 allwinner,pins = "PG9";
diff --git a/arch/arm/boot/dts/sun5i-a13.dtsi b/arch/arm/boot/dts/sun5i-a13.dtsi
index 7363211daf84..f6091dc0936c 100644
--- a/arch/arm/boot/dts/sun5i-a13.dtsi
+++ b/arch/arm/boot/dts/sun5i-a13.dtsi
@@ -150,11 +150,10 @@
150 }; 150 };
151 }; 151 };
152 152
153 soc@01c20000 { 153 soc@01c00000 {
154 compatible = "simple-bus"; 154 compatible = "simple-bus";
155 #address-cells = <1>; 155 #address-cells = <1>;
156 #size-cells = <1>; 156 #size-cells = <1>;
157 reg = <0x01c20000 0x300000>;
158 ranges; 157 ranges;
159 158
160 intc: interrupt-controller@01c20400 { 159 intc: interrupt-controller@01c20400 {
diff --git a/arch/arm/boot/dts/sun6i-a31-colombus.dts b/arch/arm/boot/dts/sun6i-a31-colombus.dts
new file mode 100644
index 000000000000..e5adae30899b
--- /dev/null
+++ b/arch/arm/boot/dts/sun6i-a31-colombus.dts
@@ -0,0 +1,32 @@
1/*
2 * Copyright 2013 Maxime Ripard
3 *
4 * Maxime Ripard <maxime.ripard@free-electrons.com>
5 *
6 * The code contained herein is licensed under the GNU General Public
7 * License. You may obtain a copy of the GNU General Public License
8 * Version 2 or later at the following locations:
9 *
10 * http://www.opensource.org/licenses/gpl-license.html
11 * http://www.gnu.org/copyleft/gpl.html
12 */
13
14/dts-v1/;
15/include/ "sun6i-a31.dtsi"
16
17/ {
18 model = "WITS A31 Colombus Evaluation Board";
19 compatible = "wits,colombus", "allwinner,sun6i-a31";
20
21 chosen {
22 bootargs = "earlyprintk console=ttyS0,115200";
23 };
24
25 soc@01c00000 {
26 uart0: serial@01c28000 {
27 pinctrl-names = "default";
28 pinctrl-0 = <&uart0_pins_a>;
29 status = "okay";
30 };
31 };
32};
diff --git a/arch/arm/boot/dts/sun6i-a31.dtsi b/arch/arm/boot/dts/sun6i-a31.dtsi
new file mode 100644
index 000000000000..f244f5f02365
--- /dev/null
+++ b/arch/arm/boot/dts/sun6i-a31.dtsi
@@ -0,0 +1,299 @@
1/*
2 * Copyright 2013 Maxime Ripard
3 *
4 * Maxime Ripard <maxime.ripard@free-electrons.com>
5 *
6 * The code contained herein is licensed under the GNU General Public
7 * License. You may obtain a copy of the GNU General Public License
8 * Version 2 or later at the following locations:
9 *
10 * http://www.opensource.org/licenses/gpl-license.html
11 * http://www.gnu.org/copyleft/gpl.html
12 */
13
14/include/ "skeleton.dtsi"
15
16/ {
17 interrupt-parent = <&gic>;
18
19 cpus {
20 #address-cells = <1>;
21 #size-cells = <0>;
22
23 cpu@0 {
24 compatible = "arm,cortex-a7";
25 device_type = "cpu";
26 reg = <0>;
27 };
28
29 cpu@1 {
30 compatible = "arm,cortex-a7";
31 device_type = "cpu";
32 reg = <1>;
33 };
34
35 cpu@2 {
36 compatible = "arm,cortex-a7";
37 device_type = "cpu";
38 reg = <2>;
39 };
40
41 cpu@3 {
42 compatible = "arm,cortex-a7";
43 device_type = "cpu";
44 reg = <3>;
45 };
46 };
47
48 memory {
49 reg = <0x40000000 0x80000000>;
50 };
51
52 clocks {
53 #address-cells = <1>;
54 #size-cells = <1>;
55 ranges;
56
57 osc24M: osc24M {
58 #clock-cells = <0>;
59 compatible = "fixed-clock";
60 clock-frequency = <24000000>;
61 };
62
63 osc32k: osc32k {
64 #clock-cells = <0>;
65 compatible = "fixed-clock";
66 clock-frequency = <32768>;
67 };
68
69 pll1: pll1@01c20000 {
70 #clock-cells = <0>;
71 compatible = "allwinner,sun6i-a31-pll1-clk";
72 reg = <0x01c20000 0x4>;
73 clocks = <&osc24M>;
74 };
75
76 /*
77 * This is a dummy clock, to be used as placeholder on
78 * other mux clocks when a specific parent clock is not
79 * yet implemented. It should be dropped when the driver
80 * is complete.
81 */
82 pll6: pll6 {
83 #clock-cells = <0>;
84 compatible = "fixed-clock";
85 clock-frequency = <0>;
86 };
87
88 cpu: cpu@01c20050 {
89 #clock-cells = <0>;
90 compatible = "allwinner,sun4i-cpu-clk";
91 reg = <0x01c20050 0x4>;
92
93 /*
94 * PLL1 is listed twice here.
95 * While it looks suspicious, it's actually documented
96 * that way both in the datasheet and in the code from
97 * Allwinner.
98 */
99 clocks = <&osc32k>, <&osc24M>, <&pll1>, <&pll1>;
100 };
101
102 axi: axi@01c20050 {
103 #clock-cells = <0>;
104 compatible = "allwinner,sun4i-axi-clk";
105 reg = <0x01c20050 0x4>;
106 clocks = <&cpu>;
107 };
108
109 ahb1_mux: ahb1_mux@01c20054 {
110 #clock-cells = <0>;
111 compatible = "allwinner,sun6i-a31-ahb1-mux-clk";
112 reg = <0x01c20054 0x4>;
113 clocks = <&osc32k>, <&osc24M>, <&axi>, <&pll6>;
114 };
115
116 ahb1: ahb1@01c20054 {
117 #clock-cells = <0>;
118 compatible = "allwinner,sun4i-ahb-clk";
119 reg = <0x01c20054 0x4>;
120 clocks = <&ahb1_mux>;
121 };
122
123 ahb1_gates: ahb1_gates@01c20060 {
124 #clock-cells = <1>;
125 compatible = "allwinner,sun6i-a31-ahb1-gates-clk";
126 reg = <0x01c20060 0x8>;
127 clocks = <&ahb1>;
128 clock-output-names = "ahb1_mipidsi", "ahb1_ss",
129 "ahb1_dma", "ahb1_mmc0", "ahb1_mmc1",
130 "ahb1_mmc2", "ahb1_mmc3", "ahb1_nand1",
131 "ahb1_nand0", "ahb1_sdram",
132 "ahb1_gmac", "ahb1_ts", "ahb1_hstimer",
133 "ahb1_spi0", "ahb1_spi1", "ahb1_spi2",
134 "ahb1_spi3", "ahb1_otg", "ahb1_ehci0",
135 "ahb1_ehci1", "ahb1_ohci0",
136 "ahb1_ohci1", "ahb1_ohci2", "ahb1_ve",
137 "ahb1_lcd0", "ahb1_lcd1", "ahb1_csi",
138 "ahb1_hdmi", "ahb1_de0", "ahb1_de1",
139 "ahb1_fe0", "ahb1_fe1", "ahb1_mp",
140 "ahb1_gpu", "ahb1_deu0", "ahb1_deu1",
141 "ahb1_drc0", "ahb1_drc1";
142 };
143
144 apb1: apb1@01c20054 {
145 #clock-cells = <0>;
146 compatible = "allwinner,sun4i-apb0-clk";
147 reg = <0x01c20054 0x4>;
148 clocks = <&ahb1>;
149 };
150
151 apb1_gates: apb1_gates@01c20060 {
152 #clock-cells = <1>;
153 compatible = "allwinner,sun6i-a31-apb1-gates-clk";
154 reg = <0x01c20068 0x4>;
155 clocks = <&apb1>;
156 clock-output-names = "apb1_codec", "apb1_digital_mic",
157 "apb1_pio", "apb1_daudio0",
158 "apb1_daudio1";
159 };
160
161 apb2_mux: apb2_mux@01c20058 {
162 #clock-cells = <0>;
163 compatible = "allwinner,sun4i-apb1-mux-clk";
164 reg = <0x01c20058 0x4>;
165 clocks = <&osc32k>, <&osc24M>, <&pll6>, <&pll6>;
166 };
167
168 apb2: apb2@01c20058 {
169 #clock-cells = <0>;
170 compatible = "allwinner,sun6i-a31-apb2-div-clk";
171 reg = <0x01c20058 0x4>;
172 clocks = <&apb2_mux>;
173 };
174
175 apb2_gates: apb2_gates@01c2006c {
176 #clock-cells = <1>;
177 compatible = "allwinner,sun6i-a31-apb2-gates-clk";
178 reg = <0x01c2006c 0x8>;
179 clocks = <&apb2>;
180 clock-output-names = "apb2_i2c0", "apb2_i2c1",
181 "apb2_i2c2", "apb2_i2c3", "apb2_uart0",
182 "apb2_uart1", "apb2_uart2", "apb2_uart3",
183 "apb2_uart4", "apb2_uart5";
184 };
185 };
186
187 soc@01c00000 {
188 compatible = "simple-bus";
189 #address-cells = <1>;
190 #size-cells = <1>;
191 ranges;
192
193 pio: pinctrl@01c20800 {
194 compatible = "allwinner,sun6i-a31-pinctrl";
195 reg = <0x01c20800 0x400>;
196 interrupts = <0 11 1>, <0 15 1>, <0 16 1>, <0 17 1>;
197 clocks = <&apb1_gates 5>;
198 gpio-controller;
199 interrupt-controller;
200 #address-cells = <1>;
201 #size-cells = <0>;
202 #gpio-cells = <3>;
203
204 uart0_pins_a: uart0@0 {
205 allwinner,pins = "PH20", "PH21";
206 allwinner,function = "uart0";
207 allwinner,drive = <0>;
208 allwinner,pull = <0>;
209 };
210 };
211
212 timer@01c20c00 {
213 compatible = "allwinner,sun4i-timer";
214 reg = <0x01c20c00 0xa0>;
215 interrupts = <0 18 1>,
216 <0 19 1>,
217 <0 20 1>,
218 <0 21 1>,
219 <0 22 1>;
220 clocks = <&osc24M>;
221 };
222
223 wdt1: watchdog@01c20ca0 {
224 compatible = "allwinner,sun6i-wdt";
225 reg = <0x01c20ca0 0x20>;
226 };
227
228 uart0: serial@01c28000 {
229 compatible = "snps,dw-apb-uart";
230 reg = <0x01c28000 0x400>;
231 interrupts = <0 0 1>;
232 reg-shift = <2>;
233 reg-io-width = <4>;
234 clocks = <&apb2_gates 16>;
235 status = "disabled";
236 };
237
238 uart1: serial@01c28400 {
239 compatible = "snps,dw-apb-uart";
240 reg = <0x01c28400 0x400>;
241 interrupts = <0 1 1>;
242 reg-shift = <2>;
243 reg-io-width = <4>;
244 clocks = <&apb2_gates 17>;
245 status = "disabled";
246 };
247
248 uart2: serial@01c28800 {
249 compatible = "snps,dw-apb-uart";
250 reg = <0x01c28800 0x400>;
251 interrupts = <0 2 1>;
252 reg-shift = <2>;
253 reg-io-width = <4>;
254 clocks = <&apb2_gates 18>;
255 status = "disabled";
256 };
257
258 uart3: serial@01c28c00 {
259 compatible = "snps,dw-apb-uart";
260 reg = <0x01c28c00 0x400>;
261 interrupts = <0 3 1>;
262 reg-shift = <2>;
263 reg-io-width = <4>;
264 clocks = <&apb2_gates 19>;
265 status = "disabled";
266 };
267
268 uart4: serial@01c29000 {
269 compatible = "snps,dw-apb-uart";
270 reg = <0x01c29000 0x400>;
271 interrupts = <0 4 1>;
272 reg-shift = <2>;
273 reg-io-width = <4>;
274 clocks = <&apb2_gates 20>;
275 status = "disabled";
276 };
277
278 uart5: serial@01c29400 {
279 compatible = "snps,dw-apb-uart";
280 reg = <0x01c29400 0x400>;
281 interrupts = <0 5 1>;
282 reg-shift = <2>;
283 reg-io-width = <4>;
284 clocks = <&apb2_gates 21>;
285 status = "disabled";
286 };
287
288 gic: interrupt-controller@01c81000 {
289 compatible = "arm,cortex-a7-gic", "arm,cortex-a15-gic";
290 reg = <0x01c81000 0x1000>,
291 <0x01c82000 0x1000>,
292 <0x01c84000 0x2000>,
293 <0x01c86000 0x2000>;
294 interrupt-controller;
295 #interrupt-cells = <3>;
296 interrupts = <1 9 0xf04>;
297 };
298 };
299};
diff --git a/arch/arm/boot/dts/sun7i-a20-cubieboard2.dts b/arch/arm/boot/dts/sun7i-a20-cubieboard2.dts
new file mode 100644
index 000000000000..15e625eca312
--- /dev/null
+++ b/arch/arm/boot/dts/sun7i-a20-cubieboard2.dts
@@ -0,0 +1,68 @@
1/*
2 * Copyright 2013 Maxime Ripard
3 *
4 * Maxime Ripard <maxime.ripard@free-electrons.com>
5 *
6 * The code contained herein is licensed under the GNU General Public
7 * License. You may obtain a copy of the GNU General Public License
8 * Version 2 or later at the following locations:
9 *
10 * http://www.opensource.org/licenses/gpl-license.html
11 * http://www.gnu.org/copyleft/gpl.html
12 */
13
14/dts-v1/;
15/include/ "sun7i-a20.dtsi"
16
17/ {
18 model = "Cubietech Cubieboard2";
19 compatible = "cubietech,cubieboard2", "allwinner,sun7i-a20";
20
21 soc@01c00000 {
22 emac: ethernet@01c0b000 {
23 pinctrl-names = "default";
24 pinctrl-0 = <&emac_pins_a>;
25 phy = <&phy1>;
26 status = "okay";
27 };
28
29 mdio@01c0b080 {
30 status = "okay";
31
32 phy1: ethernet-phy@1 {
33 reg = <1>;
34 };
35 };
36
37 pinctrl@01c20800 {
38 led_pins_cubieboard2: led_pins@0 {
39 allwinner,pins = "PH20", "PH21";
40 allwinner,function = "gpio_out";
41 allwinner,drive = <0>;
42 allwinner,pull = <0>;
43 };
44 };
45
46 uart0: serial@01c28000 {
47 pinctrl-names = "default";
48 pinctrl-0 = <&uart0_pins_a>;
49 status = "okay";
50 };
51 };
52
53 leds {
54 compatible = "gpio-leds";
55 pinctrl-names = "default";
56 pinctrl-0 = <&led_pins_cubieboard2>;
57
58 blue {
59 label = "cubieboard2:blue:usr";
60 gpios = <&pio 7 21 0>;
61 };
62
63 green {
64 label = "cubieboard2:green:usr";
65 gpios = <&pio 7 20 0>;
66 };
67 };
68};
diff --git a/arch/arm/boot/dts/sun7i-a20-olinuxino-micro.dts b/arch/arm/boot/dts/sun7i-a20-olinuxino-micro.dts
new file mode 100644
index 000000000000..9e778557fadb
--- /dev/null
+++ b/arch/arm/boot/dts/sun7i-a20-olinuxino-micro.dts
@@ -0,0 +1,76 @@
1/*
2 * Copyright 2013 Maxime Ripard
3 *
4 * Maxime Ripard <maxime.ripard@free-electrons.com>
5 *
6 * The code contained herein is licensed under the GNU General Public
7 * License. You may obtain a copy of the GNU General Public License
8 * Version 2 or later at the following locations:
9 *
10 * http://www.opensource.org/licenses/gpl-license.html
11 * http://www.gnu.org/copyleft/gpl.html
12 */
13
14/dts-v1/;
15/include/ "sun7i-a20.dtsi"
16
17/ {
18 model = "Olimex A20-Olinuxino Micro";
19 compatible = "olimex,a20-olinuxino-micro", "allwinner,sun7i-a20";
20
21 soc@01c00000 {
22 emac: ethernet@01c0b000 {
23 pinctrl-names = "default";
24 pinctrl-0 = <&emac_pins_a>;
25 phy = <&phy1>;
26 status = "okay";
27 };
28
29 mdio@01c0b080 {
30 status = "okay";
31
32 phy1: ethernet-phy@1 {
33 reg = <1>;
34 };
35 };
36
37 pinctrl@01c20800 {
38 led_pins_olinuxino: led_pins@0 {
39 allwinner,pins = "PH2";
40 allwinner,function = "gpio_out";
41 allwinner,drive = <1>;
42 allwinner,pull = <0>;
43 };
44 };
45
46 uart0: serial@01c28000 {
47 pinctrl-names = "default";
48 pinctrl-0 = <&uart0_pins_a>;
49 status = "okay";
50 };
51
52 uart6: serial@01c29800 {
53 pinctrl-names = "default";
54 pinctrl-0 = <&uart6_pins_a>;
55 status = "okay";
56 };
57
58 uart7: serial@01c29c00 {
59 pinctrl-names = "default";
60 pinctrl-0 = <&uart7_pins_a>;
61 status = "okay";
62 };
63 };
64
65 leds {
66 compatible = "gpio-leds";
67 pinctrl-names = "default";
68 pinctrl-0 = <&led_pins_olinuxino>;
69
70 green {
71 label = "a20-olinuxino-micro:green:usr";
72 gpios = <&pio 7 2 0>;
73 default-state = "on";
74 };
75 };
76};
diff --git a/arch/arm/boot/dts/sun7i-a20.dtsi b/arch/arm/boot/dts/sun7i-a20.dtsi
new file mode 100644
index 000000000000..80559cbdbc87
--- /dev/null
+++ b/arch/arm/boot/dts/sun7i-a20.dtsi
@@ -0,0 +1,338 @@
1/*
2 * Copyright 2013 Maxime Ripard
3 *
4 * Maxime Ripard <maxime.ripard@free-electrons.com>
5 *
6 * The code contained herein is licensed under the GNU General Public
7 * License. You may obtain a copy of the GNU General Public License
8 * Version 2 or later at the following locations:
9 *
10 * http://www.opensource.org/licenses/gpl-license.html
11 * http://www.gnu.org/copyleft/gpl.html
12 */
13
14/include/ "skeleton.dtsi"
15
16/ {
17 interrupt-parent = <&gic>;
18
19 cpus {
20 #address-cells = <1>;
21 #size-cells = <0>;
22
23 cpu@0 {
24 compatible = "arm,cortex-a7";
25 device_type = "cpu";
26 reg = <0>;
27 };
28
29 cpu@1 {
30 compatible = "arm,cortex-a7";
31 device_type = "cpu";
32 reg = <1>;
33 };
34 };
35
36 memory {
37 reg = <0x40000000 0x80000000>;
38 };
39
40 clocks {
41 #address-cells = <1>;
42 #size-cells = <1>;
43 ranges;
44
45 osc24M: osc24M@01c20050 {
46 #clock-cells = <0>;
47 compatible = "allwinner,sun4i-osc-clk";
48 reg = <0x01c20050 0x4>;
49 clock-frequency = <24000000>;
50 };
51
52 osc32k: osc32k {
53 #clock-cells = <0>;
54 compatible = "fixed-clock";
55 clock-frequency = <32768>;
56 };
57
58 pll1: pll1@01c20000 {
59 #clock-cells = <0>;
60 compatible = "allwinner,sun4i-pll1-clk";
61 reg = <0x01c20000 0x4>;
62 clocks = <&osc24M>;
63 };
64
65 /*
66 * This is a dummy clock, to be used as placeholder on
67 * other mux clocks when a specific parent clock is not
68 * yet implemented. It should be dropped when the driver
69 * is complete.
70 */
71 pll6: pll6 {
72 #clock-cells = <0>;
73 compatible = "fixed-clock";
74 clock-frequency = <0>;
75 };
76
77 cpu: cpu@01c20054 {
78 #clock-cells = <0>;
79 compatible = "allwinner,sun4i-cpu-clk";
80 reg = <0x01c20054 0x4>;
81 clocks = <&osc32k>, <&osc24M>, <&pll1>, <&pll6>;
82 };
83
84 axi: axi@01c20054 {
85 #clock-cells = <0>;
86 compatible = "allwinner,sun4i-axi-clk";
87 reg = <0x01c20054 0x4>;
88 clocks = <&cpu>;
89 };
90
91 ahb: ahb@01c20054 {
92 #clock-cells = <0>;
93 compatible = "allwinner,sun4i-ahb-clk";
94 reg = <0x01c20054 0x4>;
95 clocks = <&axi>;
96 };
97
98 ahb_gates: ahb_gates@01c20060 {
99 #clock-cells = <1>;
100 compatible = "allwinner,sun7i-a20-ahb-gates-clk";
101 reg = <0x01c20060 0x8>;
102 clocks = <&ahb>;
103 clock-output-names = "ahb_usb0", "ahb_ehci0",
104 "ahb_ohci0", "ahb_ehci1", "ahb_ohci1",
105 "ahb_ss", "ahb_dma", "ahb_bist", "ahb_mmc0",
106 "ahb_mmc1", "ahb_mmc2", "ahb_mmc3", "ahb_ms",
107 "ahb_nand", "ahb_sdram", "ahb_ace",
108 "ahb_emac", "ahb_ts", "ahb_spi0", "ahb_spi1",
109 "ahb_spi2", "ahb_spi3", "ahb_sata",
110 "ahb_hstimer", "ahb_ve", "ahb_tvd", "ahb_tve0",
111 "ahb_tve1", "ahb_lcd0", "ahb_lcd1", "ahb_csi0",
112 "ahb_csi1", "ahb_hdmi1", "ahb_hdmi0",
113 "ahb_de_be0", "ahb_de_be1", "ahb_de_fe0",
114 "ahb_de_fe1", "ahb_gmac", "ahb_mp",
115 "ahb_mali";
116 };
117
118 apb0: apb0@01c20054 {
119 #clock-cells = <0>;
120 compatible = "allwinner,sun4i-apb0-clk";
121 reg = <0x01c20054 0x4>;
122 clocks = <&ahb>;
123 };
124
125 apb0_gates: apb0_gates@01c20068 {
126 #clock-cells = <1>;
127 compatible = "allwinner,sun7i-a20-apb0-gates-clk";
128 reg = <0x01c20068 0x4>;
129 clocks = <&apb0>;
130 clock-output-names = "apb0_codec", "apb0_spdif",
131 "apb0_ac97", "apb0_iis0", "apb0_iis1",
132 "apb0_pio", "apb0_ir0", "apb0_ir1",
133 "apb0_iis2", "apb0_keypad";
134 };
135
136 apb1_mux: apb1_mux@01c20058 {
137 #clock-cells = <0>;
138 compatible = "allwinner,sun4i-apb1-mux-clk";
139 reg = <0x01c20058 0x4>;
140 clocks = <&osc24M>, <&pll6>, <&osc32k>;
141 };
142
143 apb1: apb1@01c20058 {
144 #clock-cells = <0>;
145 compatible = "allwinner,sun4i-apb1-clk";
146 reg = <0x01c20058 0x4>;
147 clocks = <&apb1_mux>;
148 };
149
150 apb1_gates: apb1_gates@01c2006c {
151 #clock-cells = <1>;
152 compatible = "allwinner,sun7i-a20-apb1-gates-clk";
153 reg = <0x01c2006c 0x4>;
154 clocks = <&apb1>;
155 clock-output-names = "apb1_i2c0", "apb1_i2c1",
156 "apb1_i2c2", "apb1_i2c3", "apb1_can",
157 "apb1_scr", "apb1_ps20", "apb1_ps21",
158 "apb1_i2c4", "apb1_uart0", "apb1_uart1",
159 "apb1_uart2", "apb1_uart3", "apb1_uart4",
160 "apb1_uart5", "apb1_uart6", "apb1_uart7";
161 };
162 };
163
164 soc@01c00000 {
165 compatible = "simple-bus";
166 #address-cells = <1>;
167 #size-cells = <1>;
168 ranges;
169
170 emac: ethernet@01c0b000 {
171 compatible = "allwinner,sun4i-emac";
172 reg = <0x01c0b000 0x1000>;
173 interrupts = <0 55 1>;
174 clocks = <&ahb_gates 17>;
175 status = "disabled";
176 };
177
178 mdio@01c0b080 {
179 compatible = "allwinner,sun4i-mdio";
180 reg = <0x01c0b080 0x14>;
181 status = "disabled";
182 #address-cells = <1>;
183 #size-cells = <0>;
184 };
185
186 pio: pinctrl@01c20800 {
187 compatible = "allwinner,sun7i-a20-pinctrl";
188 reg = <0x01c20800 0x400>;
189 interrupts = <0 28 1>;
190 clocks = <&apb0_gates 5>;
191 gpio-controller;
192 interrupt-controller;
193 #address-cells = <1>;
194 #size-cells = <0>;
195 #gpio-cells = <3>;
196
197 uart0_pins_a: uart0@0 {
198 allwinner,pins = "PB22", "PB23";
199 allwinner,function = "uart0";
200 allwinner,drive = <0>;
201 allwinner,pull = <0>;
202 };
203
204 uart6_pins_a: uart6@0 {
205 allwinner,pins = "PI12", "PI13";
206 allwinner,function = "uart6";
207 allwinner,drive = <0>;
208 allwinner,pull = <0>;
209 };
210
211 uart7_pins_a: uart7@0 {
212 allwinner,pins = "PI20", "PI21";
213 allwinner,function = "uart7";
214 allwinner,drive = <0>;
215 allwinner,pull = <0>;
216 };
217
218 emac_pins_a: emac0@0 {
219 allwinner,pins = "PA0", "PA1", "PA2",
220 "PA3", "PA4", "PA5", "PA6",
221 "PA7", "PA8", "PA9", "PA10",
222 "PA11", "PA12", "PA13", "PA14",
223 "PA15", "PA16";
224 allwinner,function = "emac";
225 allwinner,drive = <0>;
226 allwinner,pull = <0>;
227 };
228 };
229
230 timer@01c20c00 {
231 compatible = "allwinner,sun4i-timer";
232 reg = <0x01c20c00 0x90>;
233 interrupts = <0 22 1>,
234 <0 23 1>,
235 <0 24 1>,
236 <0 25 1>,
237 <0 67 1>,
238 <0 68 1>;
239 clocks = <&osc24M>;
240 };
241
242 wdt: watchdog@01c20c90 {
243 compatible = "allwinner,sun4i-wdt";
244 reg = <0x01c20c90 0x10>;
245 };
246
247 uart0: serial@01c28000 {
248 compatible = "snps,dw-apb-uart";
249 reg = <0x01c28000 0x400>;
250 interrupts = <0 1 1>;
251 reg-shift = <2>;
252 reg-io-width = <4>;
253 clocks = <&apb1_gates 16>;
254 status = "disabled";
255 };
256
257 uart1: serial@01c28400 {
258 compatible = "snps,dw-apb-uart";
259 reg = <0x01c28400 0x400>;
260 interrupts = <0 2 1>;
261 reg-shift = <2>;
262 reg-io-width = <4>;
263 clocks = <&apb1_gates 17>;
264 status = "disabled";
265 };
266
267 uart2: serial@01c28800 {
268 compatible = "snps,dw-apb-uart";
269 reg = <0x01c28800 0x400>;
270 interrupts = <0 3 1>;
271 reg-shift = <2>;
272 reg-io-width = <4>;
273 clocks = <&apb1_gates 18>;
274 status = "disabled";
275 };
276
277 uart3: serial@01c28c00 {
278 compatible = "snps,dw-apb-uart";
279 reg = <0x01c28c00 0x400>;
280 interrupts = <0 4 1>;
281 reg-shift = <2>;
282 reg-io-width = <4>;
283 clocks = <&apb1_gates 19>;
284 status = "disabled";
285 };
286
287 uart4: serial@01c29000 {
288 compatible = "snps,dw-apb-uart";
289 reg = <0x01c29000 0x400>;
290 interrupts = <0 17 1>;
291 reg-shift = <2>;
292 reg-io-width = <4>;
293 clocks = <&apb1_gates 20>;
294 status = "disabled";
295 };
296
297 uart5: serial@01c29400 {
298 compatible = "snps,dw-apb-uart";
299 reg = <0x01c29400 0x400>;
300 interrupts = <0 18 1>;
301 reg-shift = <2>;
302 reg-io-width = <4>;
303 clocks = <&apb1_gates 21>;
304 status = "disabled";
305 };
306
307 uart6: serial@01c29800 {
308 compatible = "snps,dw-apb-uart";
309 reg = <0x01c29800 0x400>;
310 interrupts = <0 19 1>;
311 reg-shift = <2>;
312 reg-io-width = <4>;
313 clocks = <&apb1_gates 22>;
314 status = "disabled";
315 };
316
317 uart7: serial@01c29c00 {
318 compatible = "snps,dw-apb-uart";
319 reg = <0x01c29c00 0x400>;
320 interrupts = <0 20 1>;
321 reg-shift = <2>;
322 reg-io-width = <4>;
323 clocks = <&apb1_gates 23>;
324 status = "disabled";
325 };
326
327 gic: interrupt-controller@01c81000 {
328 compatible = "arm,cortex-a7-gic", "arm,cortex-a15-gic";
329 reg = <0x01c81000 0x1000>,
330 <0x01c82000 0x1000>,
331 <0x01c84000 0x2000>,
332 <0x01c86000 0x2000>;
333 interrupt-controller;
334 #interrupt-cells = <3>;
335 interrupts = <1 9 0xf04>;
336 };
337 };
338};
diff --git a/arch/arm/boot/dts/tegra114-dalmore.dts b/arch/arm/boot/dts/tegra114-dalmore.dts
index cb640eb6c932..60230288884b 100644
--- a/arch/arm/boot/dts/tegra114-dalmore.dts
+++ b/arch/arm/boot/dts/tegra114-dalmore.dts
@@ -791,7 +791,7 @@
791 regulator-boot-on; 791 regulator-boot-on;
792 }; 792 };
793 793
794 dcdc3 { 794 tps65090_dcdc3_reg: dcdc3 {
795 regulator-name = "vdd-ao"; 795 regulator-name = "vdd-ao";
796 regulator-always-on; 796 regulator-always-on;
797 regulator-boot-on; 797 regulator-boot-on;
@@ -836,6 +836,182 @@
836 }; 836 };
837 }; 837 };
838 }; 838 };
839
840 palmas: tps65913 {
841 compatible = "ti,palmas";
842 reg = <0x58>;
843 interrupts = <0 86 IRQ_TYPE_LEVEL_LOW>;
844
845 #interrupt-cells = <2>;
846 interrupt-controller;
847
848 ti,system-power-controller;
849
850 palmas_gpio: gpio {
851 compatible = "ti,palmas-gpio";
852 gpio-controller;
853 #gpio-cells = <2>;
854 };
855
856 pmic {
857 compatible = "ti,tps65913-pmic", "ti,palmas-pmic";
858 smps1-in-supply = <&tps65090_dcdc3_reg>;
859 smps3-in-supply = <&tps65090_dcdc3_reg>;
860 smps4-in-supply = <&tps65090_dcdc2_reg>;
861 smps7-in-supply = <&tps65090_dcdc2_reg>;
862 smps8-in-supply = <&tps65090_dcdc2_reg>;
863 smps9-in-supply = <&tps65090_dcdc2_reg>;
864 ldo1-in-supply = <&tps65090_dcdc2_reg>;
865 ldo2-in-supply = <&tps65090_dcdc2_reg>;
866 ldo3-in-supply = <&palmas_smps3_reg>;
867 ldo4-in-supply = <&tps65090_dcdc2_reg>;
868 ldo5-in-supply = <&vdd_ac_bat_reg>;
869 ldo6-in-supply = <&tps65090_dcdc2_reg>;
870 ldo7-in-supply = <&tps65090_dcdc2_reg>;
871 ldo8-in-supply = <&tps65090_dcdc3_reg>;
872 ldo9-in-supply = <&palmas_smps9_reg>;
873 ldoln-in-supply = <&tps65090_dcdc1_reg>;
874 ldousb-in-supply = <&tps65090_dcdc1_reg>;
875
876 regulators {
877 smps12 {
878 regulator-name = "vddio-ddr";
879 regulator-min-microvolt = <1350000>;
880 regulator-max-microvolt = <1350000>;
881 regulator-always-on;
882 regulator-boot-on;
883 };
884
885 palmas_smps3_reg: smps3 {
886 regulator-name = "vddio-1v8";
887 regulator-min-microvolt = <1800000>;
888 regulator-max-microvolt = <1800000>;
889 regulator-always-on;
890 regulator-boot-on;
891 };
892
893 smps45 {
894 regulator-name = "vdd-core";
895 regulator-min-microvolt = <900000>;
896 regulator-max-microvolt = <1400000>;
897 regulator-always-on;
898 regulator-boot-on;
899 };
900
901 smps457 {
902 regulator-name = "vdd-core";
903 regulator-min-microvolt = <900000>;
904 regulator-max-microvolt = <1400000>;
905 regulator-always-on;
906 regulator-boot-on;
907 };
908
909 smps8 {
910 regulator-name = "avdd-pll";
911 regulator-min-microvolt = <1050000>;
912 regulator-max-microvolt = <1050000>;
913 regulator-always-on;
914 regulator-boot-on;
915 };
916
917 palmas_smps9_reg: smps9 {
918 regulator-name = "sdhci-vdd-sd-slot";
919 regulator-min-microvolt = <2800000>;
920 regulator-max-microvolt = <2800000>;
921 regulator-always-on;
922 };
923
924 ldo1 {
925 regulator-name = "avdd-cam1";
926 regulator-min-microvolt = <2800000>;
927 regulator-max-microvolt = <2800000>;
928 };
929
930 ldo2 {
931 regulator-name = "avdd-cam2";
932 regulator-min-microvolt = <2800000>;
933 regulator-max-microvolt = <2800000>;
934 };
935
936 ldo3 {
937 regulator-name = "avdd-dsi-csi";
938 regulator-min-microvolt = <1200000>;
939 regulator-max-microvolt = <1200000>;
940 regulator-always-on;
941 regulator-boot-on;
942 };
943
944 ldo4 {
945 regulator-name = "vpp-fuse";
946 regulator-min-microvolt = <1800000>;
947 regulator-max-microvolt = <1800000>;
948 };
949
950 ldo6 {
951 regulator-name = "vdd-sensor-2v85";
952 regulator-min-microvolt = <2850000>;
953 regulator-max-microvolt = <2850000>;
954 };
955
956 ldo7 {
957 regulator-name = "vdd-af-cam1";
958 regulator-min-microvolt = <2800000>;
959 regulator-max-microvolt = <2800000>;
960 };
961
962 ldo8 {
963 regulator-name = "vdd-rtc";
964 regulator-min-microvolt = <900000>;
965 regulator-max-microvolt = <900000>;
966 regulator-always-on;
967 regulator-boot-on;
968 ti,enable-ldo8-tracking;
969 };
970
971 ldo9 {
972 regulator-name = "vddio-sdmmc-2";
973 regulator-min-microvolt = <1800000>;
974 regulator-max-microvolt = <3300000>;
975 regulator-always-on;
976 regulator-boot-on;
977 };
978
979 ldoln {
980 regulator-name = "hvdd-usb";
981 regulator-min-microvolt = <3300000>;
982 regulator-max-microvolt = <3300000>;
983 };
984
985 ldousb {
986 regulator-name = "avdd-usb";
987 regulator-min-microvolt = <3300000>;
988 regulator-max-microvolt = <3300000>;
989 regulator-always-on;
990 regulator-boot-on;
991 };
992
993 regen1 {
994 regulator-name = "rail-3v3";
995 regulator-max-microvolt = <3300000>;
996 regulator-always-on;
997 regulator-boot-on;
998 };
999
1000 regen2 {
1001 regulator-name = "rail-5v0";
1002 regulator-max-microvolt = <5000000>;
1003 regulator-always-on;
1004 regulator-boot-on;
1005 };
1006 };
1007 };
1008
1009 rtc {
1010 compatible = "ti,palmas-rtc";
1011 interrupt-parent = <&palmas>;
1012 interrupts = <8 0>;
1013 };
1014 };
839 }; 1015 };
840 1016
841 spi@7000da00 { 1017 spi@7000da00 {
@@ -850,6 +1026,13 @@
850 1026
851 pmc { 1027 pmc {
852 nvidia,invert-interrupt; 1028 nvidia,invert-interrupt;
1029 nvidia,suspend-mode = <1>;
1030 nvidia,cpu-pwr-good-time = <500>;
1031 nvidia,cpu-pwr-off-time = <300>;
1032 nvidia,core-pwr-good-time = <641 3845>;
1033 nvidia,core-pwr-off-time = <61036>;
1034 nvidia,core-power-req-active-high;
1035 nvidia,sys-clock-req-active-high;
853 }; 1036 };
854 1037
855 ahub { 1038 ahub {
@@ -870,6 +1053,15 @@
870 non-removable; 1053 non-removable;
871 }; 1054 };
872 1055
1056 usb@7d008000 {
1057 status = "okay";
1058 };
1059
1060 usb-phy@7d008000 {
1061 status = "okay";
1062 vbus-supply = <&usb3_vbus_reg>;
1063 };
1064
873 clocks { 1065 clocks {
874 compatible = "simple-bus"; 1066 compatible = "simple-bus";
875 #address-cells = <1>; 1067 #address-cells = <1>;
@@ -883,6 +1075,35 @@
883 }; 1075 };
884 }; 1076 };
885 1077
1078 gpio-keys {
1079 compatible = "gpio-keys";
1080
1081 home {
1082 label = "Home";
1083 gpios = <&gpio TEGRA_GPIO(I, 5) GPIO_ACTIVE_LOW>;
1084 linux,code = <102>; /* KEY_HOME */
1085 };
1086
1087 power {
1088 label = "Power";
1089 gpios = <&gpio TEGRA_GPIO(Q, 0) GPIO_ACTIVE_LOW>;
1090 linux,code = <116>; /* KEY_POWER */
1091 gpio-key,wakeup;
1092 };
1093
1094 volume_down {
1095 label = "Volume Down";
1096 gpios = <&gpio TEGRA_GPIO(R, 1) GPIO_ACTIVE_LOW>;
1097 linux,code = <114>; /* KEY_VOLUMEDOWN */
1098 };
1099
1100 volume_up {
1101 label = "Volume Up";
1102 gpios = <&gpio TEGRA_GPIO(R, 2) GPIO_ACTIVE_LOW>;
1103 linux,code = <115>; /* KEY_VOLUMEUP */
1104 };
1105 };
1106
886 regulators { 1107 regulators {
887 compatible = "simple-bus"; 1108 compatible = "simple-bus";
888 #address-cells = <1>; 1109 #address-cells = <1>;
@@ -951,6 +1172,16 @@
951 gpio = <&gpio TEGRA_GPIO(K, 1) GPIO_ACTIVE_HIGH>; 1172 gpio = <&gpio TEGRA_GPIO(K, 1) GPIO_ACTIVE_HIGH>;
952 vin-supply = <&tps65090_dcdc1_reg>; 1173 vin-supply = <&tps65090_dcdc1_reg>;
953 }; 1174 };
1175
1176 vdd_cam_1v8_reg: regulator@6 {
1177 compatible = "regulator-fixed";
1178 reg = <6>;
1179 regulator-name = "vdd_cam_1v8_reg";
1180 regulator-min-microvolt = <1800000>;
1181 regulator-max-microvolt = <1800000>;
1182 enable-active-high;
1183 gpio = <&palmas_gpio 6 0>;
1184 };
954 }; 1185 };
955 1186
956 sound { 1187 sound {
@@ -964,7 +1195,9 @@
964 "Speakers", "SPORP", 1195 "Speakers", "SPORP",
965 "Speakers", "SPORN", 1196 "Speakers", "SPORN",
966 "Speakers", "SPOLP", 1197 "Speakers", "SPOLP",
967 "Speakers", "SPOLN"; 1198 "Speakers", "SPOLN",
1199 "Mic Jack", "MICBIAS1",
1200 "IN2P", "Mic Jack";
968 1201
969 nvidia,i2s-controller = <&tegra_i2s1>; 1202 nvidia,i2s-controller = <&tegra_i2s1>;
970 nvidia,audio-codec = <&rt5640>; 1203 nvidia,audio-codec = <&rt5640>;
diff --git a/arch/arm/boot/dts/tegra114-pluto.dts b/arch/arm/boot/dts/tegra114-pluto.dts
deleted file mode 100644
index d5f8d3e0bde2..000000000000
--- a/arch/arm/boot/dts/tegra114-pluto.dts
+++ /dev/null
@@ -1,33 +0,0 @@
1/dts-v1/;
2
3#include "tegra114.dtsi"
4
5/ {
6 model = "NVIDIA Tegra114 Pluto evaluation board";
7 compatible = "nvidia,pluto", "nvidia,tegra114";
8
9 memory {
10 reg = <0x80000000 0x40000000>;
11 };
12
13 serial@70006300 {
14 status = "okay";
15 };
16
17 pmc {
18 nvidia,invert-interrupt;
19 };
20
21 clocks {
22 compatible = "simple-bus";
23 #address-cells = <1>;
24 #size-cells = <0>;
25
26 clk32k_in: clock {
27 compatible = "fixed-clock";
28 reg=<0>;
29 #clock-cells = <0>;
30 clock-frequency = <32768>;
31 };
32 };
33};
diff --git a/arch/arm/boot/dts/tegra114.dtsi b/arch/arm/boot/dts/tegra114.dtsi
index abf6c40d28c6..2905145d8e59 100644
--- a/arch/arm/boot/dts/tegra114.dtsi
+++ b/arch/arm/boot/dts/tegra114.dtsi
@@ -430,6 +430,68 @@
430 status = "disable"; 430 status = "disable";
431 }; 431 };
432 432
433 usb@7d000000 {
434 compatible = "nvidia,tegra30-ehci", "usb-ehci";
435 reg = <0x7d000000 0x4000>;
436 interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>;
437 phy_type = "utmi";
438 clocks = <&tegra_car TEGRA114_CLK_USBD>;
439 nvidia,phy = <&phy1>;
440 status = "disabled";
441 };
442
443 phy1: usb-phy@7d000000 {
444 compatible = "nvidia,tegra30-usb-phy";
445 reg = <0x7d000000 0x4000 0x7d000000 0x4000>;
446 phy_type = "utmi";
447 clocks = <&tegra_car TEGRA114_CLK_USBD>,
448 <&tegra_car TEGRA114_CLK_PLL_U>,
449 <&tegra_car TEGRA114_CLK_USBD>;
450 clock-names = "reg", "pll_u", "utmi-pads";
451 nvidia,hssync-start-delay = <0>;
452 nvidia,idle-wait-delay = <17>;
453 nvidia,elastic-limit = <16>;
454 nvidia,term-range-adj = <6>;
455 nvidia,xcvr-setup = <9>;
456 nvidia,xcvr-lsfslew = <0>;
457 nvidia,xcvr-lsrslew = <3>;
458 nvidia,hssquelch-level = <2>;
459 nvidia,hsdiscon-level = <5>;
460 nvidia,xcvr-hsslew = <12>;
461 status = "disabled";
462 };
463
464 usb@7d008000 {
465 compatible = "nvidia,tegra30-ehci", "usb-ehci";
466 reg = <0x7d008000 0x4000>;
467 interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>;
468 phy_type = "utmi";
469 clocks = <&tegra_car TEGRA114_CLK_USB3>;
470 nvidia,phy = <&phy3>;
471 status = "disabled";
472 };
473
474 phy3: usb-phy@7d008000 {
475 compatible = "nvidia,tegra30-usb-phy";
476 reg = <0x7d008000 0x4000 0x7d000000 0x4000>;
477 phy_type = "utmi";
478 clocks = <&tegra_car TEGRA114_CLK_USB3>,
479 <&tegra_car TEGRA114_CLK_PLL_U>,
480 <&tegra_car TEGRA114_CLK_USBD>;
481 clock-names = "reg", "pll_u", "utmi-pads";
482 nvidia,hssync-start-delay = <0>;
483 nvidia,idle-wait-delay = <17>;
484 nvidia,elastic-limit = <16>;
485 nvidia,term-range-adj = <6>;
486 nvidia,xcvr-setup = <9>;
487 nvidia,xcvr-lsfslew = <0>;
488 nvidia,xcvr-lsrslew = <3>;
489 nvidia,hssquelch-level = <2>;
490 nvidia,hsdiscon-level = <5>;
491 nvidia,xcvr-hsslew = <12>;
492 status = "disabled";
493 };
494
433 cpus { 495 cpus {
434 #address-cells = <1>; 496 #address-cells = <1>;
435 #size-cells = <0>; 497 #size-cells = <0>;
diff --git a/arch/arm/boot/dts/tegra20-colibri-512.dtsi b/arch/arm/boot/dts/tegra20-colibri-512.dtsi
index 5592be6f2f7a..d5c9bca01232 100644
--- a/arch/arm/boot/dts/tegra20-colibri-512.dtsi
+++ b/arch/arm/boot/dts/tegra20-colibri-512.dtsi
@@ -363,7 +363,7 @@
363 }; 363 };
364 364
365 pmc { 365 pmc {
366 nvidia,suspend-mode = <2>; 366 nvidia,suspend-mode = <1>;
367 nvidia,cpu-pwr-good-time = <5000>; 367 nvidia,cpu-pwr-good-time = <5000>;
368 nvidia,cpu-pwr-off-time = <5000>; 368 nvidia,cpu-pwr-off-time = <5000>;
369 nvidia,core-pwr-good-time = <3845 3845>; 369 nvidia,core-pwr-good-time = <3845 3845>;
diff --git a/arch/arm/boot/dts/tegra20-harmony.dts b/arch/arm/boot/dts/tegra20-harmony.dts
index d9f89cd879a7..e156ab30e763 100644
--- a/arch/arm/boot/dts/tegra20-harmony.dts
+++ b/arch/arm/boot/dts/tegra20-harmony.dts
@@ -335,7 +335,7 @@
335 regulator-always-on; 335 regulator-always-on;
336 }; 336 };
337 337
338 ldo0 { 338 pci_clk_reg: ldo0 {
339 regulator-name = "vdd_ldo0,vddio_pex_clk"; 339 regulator-name = "vdd_ldo0,vddio_pex_clk";
340 regulator-min-microvolt = <3300000>; 340 regulator-min-microvolt = <3300000>;
341 regulator-max-microvolt = <3300000>; 341 regulator-max-microvolt = <3300000>;
@@ -417,7 +417,7 @@
417 417
418 pmc { 418 pmc {
419 nvidia,invert-interrupt; 419 nvidia,invert-interrupt;
420 nvidia,suspend-mode = <2>; 420 nvidia,suspend-mode = <1>;
421 nvidia,cpu-pwr-good-time = <5000>; 421 nvidia,cpu-pwr-good-time = <5000>;
422 nvidia,cpu-pwr-off-time = <5000>; 422 nvidia,cpu-pwr-off-time = <5000>;
423 nvidia,core-pwr-good-time = <3845 3845>; 423 nvidia,core-pwr-good-time = <3845 3845>;
@@ -425,6 +425,20 @@
425 nvidia,sys-clock-req-active-high; 425 nvidia,sys-clock-req-active-high;
426 }; 426 };
427 427
428 pcie-controller {
429 pex-clk-supply = <&pci_clk_reg>;
430 vdd-supply = <&pci_vdd_reg>;
431 status = "okay";
432
433 pci@1,0 {
434 status = "okay";
435 };
436
437 pci@2,0 {
438 status = "okay";
439 };
440 };
441
428 usb@c5000000 { 442 usb@c5000000 {
429 status = "okay"; 443 status = "okay";
430 }; 444 };
@@ -643,7 +657,7 @@
643 enable-active-high; 657 enable-active-high;
644 }; 658 };
645 659
646 regulator@3 { 660 pci_vdd_reg: regulator@3 {
647 compatible = "regulator-fixed"; 661 compatible = "regulator-fixed";
648 reg = <3>; 662 reg = <3>;
649 regulator-name = "vdd_1v05"; 663 regulator-name = "vdd_1v05";
@@ -651,8 +665,6 @@
651 regulator-max-microvolt = <1050000>; 665 regulator-max-microvolt = <1050000>;
652 gpio = <&pmic 2 GPIO_ACTIVE_HIGH>; 666 gpio = <&pmic 2 GPIO_ACTIVE_HIGH>;
653 enable-active-high; 667 enable-active-high;
654 /* Hack until board-harmony-pcie.c is removed */
655 status = "disabled";
656 }; 668 };
657 669
658 regulator@4 { 670 regulator@4 {
diff --git a/arch/arm/boot/dts/tegra20-paz00.dts b/arch/arm/boot/dts/tegra20-paz00.dts
index cfd12763b1b2..8d71fc9d8a2f 100644
--- a/arch/arm/boot/dts/tegra20-paz00.dts
+++ b/arch/arm/boot/dts/tegra20-paz00.dts
@@ -417,7 +417,7 @@
417 417
418 pmc { 418 pmc {
419 nvidia,invert-interrupt; 419 nvidia,invert-interrupt;
420 nvidia,suspend-mode = <2>; 420 nvidia,suspend-mode = <1>;
421 nvidia,cpu-pwr-good-time = <2000>; 421 nvidia,cpu-pwr-good-time = <2000>;
422 nvidia,cpu-pwr-off-time = <0>; 422 nvidia,cpu-pwr-off-time = <0>;
423 nvidia,core-pwr-good-time = <3845 3845>; 423 nvidia,core-pwr-good-time = <3845 3845>;
diff --git a/arch/arm/boot/dts/tegra20-seaboard.dts b/arch/arm/boot/dts/tegra20-seaboard.dts
index 40e6fb280333..315aae26c3cd 100644
--- a/arch/arm/boot/dts/tegra20-seaboard.dts
+++ b/arch/arm/boot/dts/tegra20-seaboard.dts
@@ -518,7 +518,7 @@
518 518
519 pmc { 519 pmc {
520 nvidia,invert-interrupt; 520 nvidia,invert-interrupt;
521 nvidia,suspend-mode = <2>; 521 nvidia,suspend-mode = <1>;
522 nvidia,cpu-pwr-good-time = <5000>; 522 nvidia,cpu-pwr-good-time = <5000>;
523 nvidia,cpu-pwr-off-time = <5000>; 523 nvidia,cpu-pwr-off-time = <5000>;
524 nvidia,core-pwr-good-time = <3845 3845>; 524 nvidia,core-pwr-good-time = <3845 3845>;
@@ -566,7 +566,6 @@
566 566
567 usb@c5000000 { 567 usb@c5000000 {
568 status = "okay"; 568 status = "okay";
569 nvidia,vbus-gpio = <&gpio TEGRA_GPIO(D, 0) GPIO_ACTIVE_HIGH>;
570 dr_mode = "otg"; 569 dr_mode = "otg";
571 }; 570 };
572 571
@@ -829,7 +828,7 @@
829 regulator-min-microvolt = <5000000>; 828 regulator-min-microvolt = <5000000>;
830 regulator-max-microvolt = <5000000>; 829 regulator-max-microvolt = <5000000>;
831 enable-active-high; 830 enable-active-high;
832 gpio = <&gpio 24 0>; /* PD0 */ 831 gpio = <&gpio TEGRA_GPIO(D, 0) 0>;
833 regulator-always-on; 832 regulator-always-on;
834 regulator-boot-on; 833 regulator-boot-on;
835 }; 834 };
diff --git a/arch/arm/boot/dts/tegra20-tamonten.dtsi b/arch/arm/boot/dts/tegra20-tamonten.dtsi
index c54faae7cfb3..7726dab3d08d 100644
--- a/arch/arm/boot/dts/tegra20-tamonten.dtsi
+++ b/arch/arm/boot/dts/tegra20-tamonten.dtsi
@@ -366,7 +366,7 @@
366 regulator-always-on; 366 regulator-always-on;
367 }; 367 };
368 368
369 ldo0 { 369 pci_clk_reg: ldo0 {
370 regulator-name = "vdd_ldo0,vddio_pex_clk"; 370 regulator-name = "vdd_ldo0,vddio_pex_clk";
371 regulator-min-microvolt = <3300000>; 371 regulator-min-microvolt = <3300000>;
372 regulator-max-microvolt = <3300000>; 372 regulator-max-microvolt = <3300000>;
@@ -459,7 +459,7 @@
459 459
460 pmc { 460 pmc {
461 nvidia,invert-interrupt; 461 nvidia,invert-interrupt;
462 nvidia,suspend-mode = <2>; 462 nvidia,suspend-mode = <1>;
463 nvidia,cpu-pwr-good-time = <5000>; 463 nvidia,cpu-pwr-good-time = <5000>;
464 nvidia,cpu-pwr-off-time = <5000>; 464 nvidia,cpu-pwr-off-time = <5000>;
465 nvidia,core-pwr-good-time = <3845 3845>; 465 nvidia,core-pwr-good-time = <3845 3845>;
@@ -467,6 +467,11 @@
467 nvidia,sys-clock-req-active-high; 467 nvidia,sys-clock-req-active-high;
468 }; 468 };
469 469
470 pcie-controller {
471 pex-clk-supply = <&pci_clk_reg>;
472 vdd-supply = <&pci_vdd_reg>;
473 };
474
470 usb@c5008000 { 475 usb@c5008000 {
471 status = "okay"; 476 status = "okay";
472 }; 477 };
@@ -509,5 +514,15 @@
509 regulator-max-microvolt = <5000000>; 514 regulator-max-microvolt = <5000000>;
510 regulator-always-on; 515 regulator-always-on;
511 }; 516 };
517
518 pci_vdd_reg: regulator@1 {
519 compatible = "regulator-fixed";
520 reg = <1>;
521 regulator-name = "vdd_1v05";
522 regulator-min-microvolt = <1050000>;
523 regulator-max-microvolt = <1050000>;
524 gpio = <&pmic 2 0>;
525 enable-active-high;
526 };
512 }; 527 };
513}; 528};
diff --git a/arch/arm/boot/dts/tegra20-tec.dts b/arch/arm/boot/dts/tegra20-tec.dts
index c572c43751b1..3ada3cb67f07 100644
--- a/arch/arm/boot/dts/tegra20-tec.dts
+++ b/arch/arm/boot/dts/tegra20-tec.dts
@@ -32,6 +32,14 @@
32 }; 32 };
33 }; 33 };
34 34
35 pcie-controller {
36 status = "okay";
37
38 pci@1,0 {
39 status = "okay";
40 };
41 };
42
35 sound { 43 sound {
36 compatible = "ad,tegra-audio-wm8903-tec", 44 compatible = "ad,tegra-audio-wm8903-tec",
37 "nvidia,tegra-audio-wm8903"; 45 "nvidia,tegra-audio-wm8903";
diff --git a/arch/arm/boot/dts/tegra20-trimslice.dts b/arch/arm/boot/dts/tegra20-trimslice.dts
index 37c93d3c4812..78deea5c0d21 100644
--- a/arch/arm/boot/dts/tegra20-trimslice.dts
+++ b/arch/arm/boot/dts/tegra20-trimslice.dts
@@ -302,7 +302,7 @@
302 }; 302 };
303 303
304 pmc { 304 pmc {
305 nvidia,suspend-mode = <2>; 305 nvidia,suspend-mode = <1>;
306 nvidia,cpu-pwr-good-time = <5000>; 306 nvidia,cpu-pwr-good-time = <5000>;
307 nvidia,cpu-pwr-off-time = <5000>; 307 nvidia,cpu-pwr-off-time = <5000>;
308 nvidia,core-pwr-good-time = <3845 3845>; 308 nvidia,core-pwr-good-time = <3845 3845>;
@@ -310,9 +310,18 @@
310 nvidia,sys-clock-req-active-high; 310 nvidia,sys-clock-req-active-high;
311 }; 311 };
312 312
313 pcie-controller {
314 status = "okay";
315 pex-clk-supply = <&pci_clk_reg>;
316 vdd-supply = <&pci_vdd_reg>;
317
318 pci@1,0 {
319 status = "okay";
320 };
321 };
322
313 usb@c5000000 { 323 usb@c5000000 {
314 status = "okay"; 324 status = "okay";
315 nvidia,vbus-gpio = <&gpio TEGRA_GPIO(V, 2) GPIO_ACTIVE_HIGH>;
316 }; 325 };
317 326
318 usb-phy@c5000000 { 327 usb-phy@c5000000 {
@@ -411,10 +420,28 @@
411 regulator-min-microvolt = <5000000>; 420 regulator-min-microvolt = <5000000>;
412 regulator-max-microvolt = <5000000>; 421 regulator-max-microvolt = <5000000>;
413 enable-active-high; 422 enable-active-high;
414 gpio = <&gpio 170 0>; /* PV2 */ 423 gpio = <&gpio TEGRA_GPIO(V, 2) 0>;
415 regulator-always-on; 424 regulator-always-on;
416 regulator-boot-on; 425 regulator-boot-on;
417 }; 426 };
427
428 pci_clk_reg: regulator@3 {
429 compatible = "regulator-fixed";
430 reg = <3>;
431 regulator-name = "pci_clk";
432 regulator-min-microvolt = <3300000>;
433 regulator-max-microvolt = <3300000>;
434 regulator-always-on;
435 };
436
437 pci_vdd_reg: regulator@4 {
438 compatible = "regulator-fixed";
439 reg = <4>;
440 regulator-name = "pci_vdd";
441 regulator-min-microvolt = <1050000>;
442 regulator-max-microvolt = <1050000>;
443 regulator-always-on;
444 };
418 }; 445 };
419 446
420 sound { 447 sound {
diff --git a/arch/arm/boot/dts/tegra20-ventana.dts b/arch/arm/boot/dts/tegra20-ventana.dts
index 7f8c28d1121f..aab872cd0530 100644
--- a/arch/arm/boot/dts/tegra20-ventana.dts
+++ b/arch/arm/boot/dts/tegra20-ventana.dts
@@ -494,7 +494,7 @@
494 494
495 pmc { 495 pmc {
496 nvidia,invert-interrupt; 496 nvidia,invert-interrupt;
497 nvidia,suspend-mode = <2>; 497 nvidia,suspend-mode = <1>;
498 nvidia,cpu-pwr-good-time = <2000>; 498 nvidia,cpu-pwr-good-time = <2000>;
499 nvidia,cpu-pwr-off-time = <100>; 499 nvidia,cpu-pwr-off-time = <100>;
500 nvidia,core-pwr-good-time = <3845 3845>; 500 nvidia,core-pwr-good-time = <3845 3845>;
diff --git a/arch/arm/boot/dts/tegra20-whistler.dts b/arch/arm/boot/dts/tegra20-whistler.dts
index a3d0ebad78a1..d33a73cf167c 100644
--- a/arch/arm/boot/dts/tegra20-whistler.dts
+++ b/arch/arm/boot/dts/tegra20-whistler.dts
@@ -497,7 +497,7 @@
497 497
498 pmc { 498 pmc {
499 nvidia,invert-interrupt; 499 nvidia,invert-interrupt;
500 nvidia,suspend-mode = <2>; 500 nvidia,suspend-mode = <1>;
501 nvidia,cpu-pwr-good-time = <2000>; 501 nvidia,cpu-pwr-good-time = <2000>;
502 nvidia,cpu-pwr-off-time = <1000>; 502 nvidia,cpu-pwr-off-time = <1000>;
503 nvidia,core-pwr-good-time = <0 3845>; 503 nvidia,core-pwr-good-time = <0 3845>;
@@ -509,7 +509,6 @@
509 509
510 usb@c5000000 { 510 usb@c5000000 {
511 status = "okay"; 511 status = "okay";
512 nvidia,vbus-gpio = <&tca6416 0 GPIO_ACTIVE_HIGH>;
513 }; 512 };
514 513
515 usb-phy@c5000000 { 514 usb-phy@c5000000 {
@@ -519,7 +518,6 @@
519 518
520 usb@c5008000 { 519 usb@c5008000 {
521 status = "okay"; 520 status = "okay";
522 nvidia,vbus-gpio = <&tca6416 1 GPIO_ACTIVE_HIGH>;
523 }; 521 };
524 522
525 usb-phy@c5008000 { 523 usb-phy@c5008000 {
diff --git a/arch/arm/boot/dts/tegra20.dtsi b/arch/arm/boot/dts/tegra20.dtsi
index 9653fd8288d2..df40b54fd8bc 100644
--- a/arch/arm/boot/dts/tegra20.dtsi
+++ b/arch/arm/boot/dts/tegra20.dtsi
@@ -455,6 +455,61 @@
455 #size-cells = <0>; 455 #size-cells = <0>;
456 }; 456 };
457 457
458 pcie-controller {
459 compatible = "nvidia,tegra20-pcie";
460 device_type = "pci";
461 reg = <0x80003000 0x00000800 /* PADS registers */
462 0x80003800 0x00000200 /* AFI registers */
463 0x90000000 0x10000000>; /* configuration space */
464 reg-names = "pads", "afi", "cs";
465 interrupts = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH /* controller interrupt */
466 GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>; /* MSI interrupt */
467 interrupt-names = "intr", "msi";
468
469 bus-range = <0x00 0xff>;
470 #address-cells = <3>;
471 #size-cells = <2>;
472
473 ranges = <0x82000000 0 0x80000000 0x80000000 0 0x00001000 /* port 0 registers */
474 0x82000000 0 0x80001000 0x80001000 0 0x00001000 /* port 1 registers */
475 0x81000000 0 0 0x82000000 0 0x00010000 /* downstream I/O */
476 0x82000000 0 0xa0000000 0xa0000000 0 0x08000000 /* non-prefetchable memory */
477 0xc2000000 0 0xa8000000 0xa8000000 0 0x18000000>; /* prefetchable memory */
478
479 clocks = <&tegra_car TEGRA20_CLK_PEX>,
480 <&tegra_car TEGRA20_CLK_AFI>,
481 <&tegra_car TEGRA20_CLK_PCIE_XCLK>,
482 <&tegra_car TEGRA20_CLK_PLL_E>;
483 clock-names = "pex", "afi", "pcie_xclk", "pll_e";
484 status = "disabled";
485
486 pci@1,0 {
487 device_type = "pci";
488 assigned-addresses = <0x82000800 0 0x80000000 0 0x1000>;
489 reg = <0x000800 0 0 0 0>;
490 status = "disabled";
491
492 #address-cells = <3>;
493 #size-cells = <2>;
494 ranges;
495
496 nvidia,num-lanes = <2>;
497 };
498
499 pci@2,0 {
500 device_type = "pci";
501 assigned-addresses = <0x82001000 0 0x80001000 0 0x1000>;
502 reg = <0x001000 0 0 0 0>;
503 status = "disabled";
504
505 #address-cells = <3>;
506 #size-cells = <2>;
507 ranges;
508
509 nvidia,num-lanes = <2>;
510 };
511 };
512
458 usb@c5000000 { 513 usb@c5000000 {
459 compatible = "nvidia,tegra20-ehci", "usb-ehci"; 514 compatible = "nvidia,tegra20-ehci", "usb-ehci";
460 reg = <0xc5000000 0x4000>; 515 reg = <0xc5000000 0x4000>;
@@ -477,13 +532,13 @@
477 <&tegra_car TEGRA20_CLK_USBD>; 532 <&tegra_car TEGRA20_CLK_USBD>;
478 clock-names = "reg", "pll_u", "timer", "utmi-pads"; 533 clock-names = "reg", "pll_u", "timer", "utmi-pads";
479 nvidia,has-legacy-mode; 534 nvidia,has-legacy-mode;
480 hssync_start_delay = <9>; 535 nvidia,hssync-start-delay = <9>;
481 idle_wait_delay = <17>; 536 nvidia,idle-wait-delay = <17>;
482 elastic_limit = <16>; 537 nvidia,elastic-limit = <16>;
483 term_range_adj = <6>; 538 nvidia,term-range-adj = <6>;
484 xcvr_setup = <9>; 539 nvidia,xcvr-setup = <9>;
485 xcvr_lsfslew = <1>; 540 nvidia,xcvr-lsfslew = <1>;
486 xcvr_lsrslew = <1>; 541 nvidia,xcvr-lsrslew = <1>;
487 status = "disabled"; 542 status = "disabled";
488 }; 543 };
489 544
@@ -527,13 +582,13 @@
527 <&tegra_car TEGRA20_CLK_CLK_M>, 582 <&tegra_car TEGRA20_CLK_CLK_M>,
528 <&tegra_car TEGRA20_CLK_USBD>; 583 <&tegra_car TEGRA20_CLK_USBD>;
529 clock-names = "reg", "pll_u", "timer", "utmi-pads"; 584 clock-names = "reg", "pll_u", "timer", "utmi-pads";
530 hssync_start_delay = <9>; 585 nvidia,hssync-start-delay = <9>;
531 idle_wait_delay = <17>; 586 nvidia,idle-wait-delay = <17>;
532 elastic_limit = <16>; 587 nvidia,elastic-limit = <16>;
533 term_range_adj = <6>; 588 nvidia,term-range-adj = <6>;
534 xcvr_setup = <9>; 589 nvidia,xcvr-setup = <9>;
535 xcvr_lsfslew = <2>; 590 nvidia,xcvr-lsfslew = <2>;
536 xcvr_lsrslew = <2>; 591 nvidia,xcvr-lsrslew = <2>;
537 status = "disabled"; 592 status = "disabled";
538 }; 593 };
539 594
diff --git a/arch/arm/boot/dts/tegra30-beaver.dts b/arch/arm/boot/dts/tegra30-beaver.dts
index 87c5f7b7c271..08cad696e89f 100644
--- a/arch/arm/boot/dts/tegra30-beaver.dts
+++ b/arch/arm/boot/dts/tegra30-beaver.dts
@@ -10,6 +10,40 @@
10 reg = <0x80000000 0x7ff00000>; 10 reg = <0x80000000 0x7ff00000>;
11 }; 11 };
12 12
13 pcie-controller {
14 status = "okay";
15 pex-clk-supply = <&sys_3v3_pexs_reg>;
16 vdd-supply = <&ldo1_reg>;
17 avdd-supply = <&ldo2_reg>;
18
19 pci@1,0 {
20 status = "okay";
21 nvidia,num-lanes = <2>;
22 };
23
24 pci@2,0 {
25 nvidia,num-lanes = <2>;
26 };
27
28 pci@3,0 {
29 status = "okay";
30 nvidia,num-lanes = <2>;
31 };
32 };
33
34 host1x {
35 hdmi {
36 status = "okay";
37
38 vdd-supply = <&sys_3v3_reg>;
39 pll-supply = <&vio_reg>;
40
41 nvidia,hpd-gpio =
42 <&gpio TEGRA_GPIO(N, 7) GPIO_ACTIVE_HIGH>;
43 nvidia,ddc-i2c-bus = <&hdmiddc>;
44 };
45 };
46
13 pinmux { 47 pinmux {
14 pinctrl-names = "default"; 48 pinctrl-names = "default";
15 pinctrl-0 = <&state_default>; 49 pinctrl-0 = <&state_default>;
@@ -76,6 +110,11 @@
76 nvidia,pull = <0>; 110 nvidia,pull = <0>;
77 nvidia,tristate = <0>; 111 nvidia,tristate = <0>;
78 }; 112 };
113 pex_l1_prsnt_n_pdd4 {
114 nvidia,pins = "pex_l1_prsnt_n_pdd4",
115 "pex_l1_clkreq_n_pdd6";
116 nvidia,pull = <2>;
117 };
79 sdio3 { 118 sdio3 {
80 nvidia,pins = "drive_sdio3"; 119 nvidia,pins = "drive_sdio3";
81 nvidia,high-speed-mode = <0>; 120 nvidia,high-speed-mode = <0>;
@@ -85,6 +124,10 @@
85 nvidia,slew-rate-rising = <1>; 124 nvidia,slew-rate-rising = <1>;
86 nvidia,slew-rate-falling = <1>; 125 nvidia,slew-rate-falling = <1>;
87 }; 126 };
127 gpv {
128 nvidia,pins = "drive_gpv";
129 nvidia,pull-up-strength = <16>;
130 };
88 }; 131 };
89 }; 132 };
90 133
@@ -107,7 +150,7 @@
107 clock-frequency = <100000>; 150 clock-frequency = <100000>;
108 }; 151 };
109 152
110 i2c@7000c700 { 153 hdmiddc: i2c@7000c700 {
111 status = "okay"; 154 status = "okay";
112 clock-frequency = <100000>; 155 clock-frequency = <100000>;
113 }; 156 };
@@ -262,7 +305,7 @@
262 pmc { 305 pmc {
263 status = "okay"; 306 status = "okay";
264 nvidia,invert-interrupt; 307 nvidia,invert-interrupt;
265 nvidia,suspend-mode = <2>; 308 nvidia,suspend-mode = <1>;
266 nvidia,cpu-pwr-good-time = <2000>; 309 nvidia,cpu-pwr-good-time = <2000>;
267 nvidia,cpu-pwr-off-time = <200>; 310 nvidia,cpu-pwr-off-time = <200>;
268 nvidia,core-pwr-good-time = <3845 3845>; 311 nvidia,core-pwr-good-time = <3845 3845>;
@@ -285,6 +328,15 @@
285 non-removable; 328 non-removable;
286 }; 329 };
287 330
331 usb@7d008000 {
332 status = "okay";
333 };
334
335 usb-phy@7d008000 {
336 vbus-supply = <&usb3_vbus_reg>;
337 status = "okay";
338 };
339
288 clocks { 340 clocks {
289 compatible = "simple-bus"; 341 compatible = "simple-bus";
290 #address-cells = <1>; 342 #address-cells = <1>;
@@ -357,7 +409,7 @@
357 regulator-min-microvolt = <5000000>; 409 regulator-min-microvolt = <5000000>;
358 regulator-max-microvolt = <5000000>; 410 regulator-max-microvolt = <5000000>;
359 enable-active-high; 411 enable-active-high;
360 gpio = <&gpio TEGRA_GPIO(I, 4) GPIO_ACTIVE_HIGH>; 412 gpio = <&gpio TEGRA_GPIO(DD, 6) GPIO_ACTIVE_HIGH>;
361 gpio-open-drain; 413 gpio-open-drain;
362 vin-supply = <&vdd_5v_in_reg>; 414 vin-supply = <&vdd_5v_in_reg>;
363 }; 415 };
@@ -369,7 +421,7 @@
369 regulator-min-microvolt = <5000000>; 421 regulator-min-microvolt = <5000000>;
370 regulator-max-microvolt = <5000000>; 422 regulator-max-microvolt = <5000000>;
371 enable-active-high; 423 enable-active-high;
372 gpio = <&gpio TEGRA_GPIO(H, 7) GPIO_ACTIVE_HIGH>; 424 gpio = <&gpio TEGRA_GPIO(DD, 4) GPIO_ACTIVE_HIGH>;
373 gpio-open-drain; 425 gpio-open-drain;
374 vin-supply = <&vdd_5v_in_reg>; 426 vin-supply = <&vdd_5v_in_reg>;
375 }; 427 };
@@ -421,7 +473,9 @@
421 473
422 nvidia,audio-routing = 474 nvidia,audio-routing =
423 "Headphones", "HPOR", 475 "Headphones", "HPOR",
424 "Headphones", "HPOL"; 476 "Headphones", "HPOL",
477 "Mic Jack", "MICBIAS1",
478 "IN2P", "Mic Jack";
425 479
426 nvidia,i2s-controller = <&tegra_i2s1>; 480 nvidia,i2s-controller = <&tegra_i2s1>;
427 nvidia,audio-codec = <&rt5640>; 481 nvidia,audio-codec = <&rt5640>;
diff --git a/arch/arm/boot/dts/tegra30-cardhu.dtsi b/arch/arm/boot/dts/tegra30-cardhu.dtsi
index f65b53d32416..e19dbf238e5c 100644
--- a/arch/arm/boot/dts/tegra30-cardhu.dtsi
+++ b/arch/arm/boot/dts/tegra30-cardhu.dtsi
@@ -31,6 +31,26 @@
31 reg = <0x80000000 0x40000000>; 31 reg = <0x80000000 0x40000000>;
32 }; 32 };
33 33
34 pcie-controller {
35 status = "okay";
36 pex-clk-supply = <&pex_hvdd_3v3_reg>;
37 vdd-supply = <&ldo1_reg>;
38 avdd-supply = <&ldo2_reg>;
39
40 pci@1,0 {
41 nvidia,num-lanes = <4>;
42 };
43
44 pci@2,0 {
45 nvidia,num-lanes = <1>;
46 };
47
48 pci@3,0 {
49 status = "okay";
50 nvidia,num-lanes = <1>;
51 };
52 };
53
34 pinmux { 54 pinmux {
35 pinctrl-names = "default"; 55 pinctrl-names = "default";
36 pinctrl-0 = <&state_default>; 56 pinctrl-0 = <&state_default>;
@@ -173,19 +193,6 @@
173 gpio-cfg = <0xffffffff 0xffffffff 0 0xffffffff 0xffffffff>; 193 gpio-cfg = <0xffffffff 0xffffffff 0 0xffffffff 0xffffffff>;
174 }; 194 };
175 195
176 tps62361 {
177 compatible = "ti,tps62361";
178 reg = <0x60>;
179
180 regulator-name = "tps62361-vout";
181 regulator-min-microvolt = <500000>;
182 regulator-max-microvolt = <1500000>;
183 regulator-boot-on;
184 regulator-always-on;
185 ti,vsel0-state-high;
186 ti,vsel1-state-high;
187 };
188
189 pmic: tps65911@2d { 196 pmic: tps65911@2d {
190 compatible = "ti,tps65911"; 197 compatible = "ti,tps65911";
191 reg = <0x2d>; 198 reg = <0x2d>;
@@ -286,6 +293,26 @@
286 }; 293 };
287 }; 294 };
288 }; 295 };
296
297 nct1008 {
298 compatible = "onnn,nct1008";
299 reg = <0x4c>;
300 interrupt-parent = <&gpio>;
301 interrupts = <TEGRA_GPIO(CC, 2) IRQ_TYPE_LEVEL_LOW>;
302 };
303
304 tps62361 {
305 compatible = "ti,tps62361";
306 reg = <0x60>;
307
308 regulator-name = "tps62361-vout";
309 regulator-min-microvolt = <500000>;
310 regulator-max-microvolt = <1500000>;
311 regulator-boot-on;
312 regulator-always-on;
313 ti,vsel0-state-high;
314 ti,vsel1-state-high;
315 };
289 }; 316 };
290 317
291 spi@7000da00 { 318 spi@7000da00 {
@@ -307,7 +334,7 @@
307 pmc { 334 pmc {
308 status = "okay"; 335 status = "okay";
309 nvidia,invert-interrupt; 336 nvidia,invert-interrupt;
310 nvidia,suspend-mode = <2>; 337 nvidia,suspend-mode = <1>;
311 nvidia,cpu-pwr-good-time = <2000>; 338 nvidia,cpu-pwr-good-time = <2000>;
312 nvidia,cpu-pwr-off-time = <200>; 339 nvidia,cpu-pwr-off-time = <200>;
313 nvidia,core-pwr-good-time = <3845 3845>; 340 nvidia,core-pwr-good-time = <3845 3845>;
@@ -330,6 +357,15 @@
330 non-removable; 357 non-removable;
331 }; 358 };
332 359
360 usb@7d008000 {
361 status = "okay";
362 };
363
364 usb-phy@7d008000 {
365 vbus-supply = <&usb3_vbus_reg>;
366 status = "okay";
367 };
368
333 clocks { 369 clocks {
334 compatible = "simple-bus"; 370 compatible = "simple-bus";
335 #address-cells = <1>; 371 #address-cells = <1>;
diff --git a/arch/arm/boot/dts/tegra30.dtsi b/arch/arm/boot/dts/tegra30.dtsi
index d8783f0fae63..0022c127e1d9 100644
--- a/arch/arm/boot/dts/tegra30.dtsi
+++ b/arch/arm/boot/dts/tegra30.dtsi
@@ -16,6 +16,76 @@
16 serial4 = &uarte; 16 serial4 = &uarte;
17 }; 17 };
18 18
19 pcie-controller {
20 compatible = "nvidia,tegra30-pcie";
21 device_type = "pci";
22 reg = <0x00003000 0x00000800 /* PADS registers */
23 0x00003800 0x00000200 /* AFI registers */
24 0x10000000 0x10000000>; /* configuration space */
25 reg-names = "pads", "afi", "cs";
26 interrupts = <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH /* controller interrupt */
27 GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>; /* MSI interrupt */
28 interrupt-names = "intr", "msi";
29
30 bus-range = <0x00 0xff>;
31 #address-cells = <3>;
32 #size-cells = <2>;
33
34 ranges = <0x82000000 0 0x00000000 0x00000000 0 0x00001000 /* port 0 configuration space */
35 0x82000000 0 0x00001000 0x00001000 0 0x00001000 /* port 1 configuration space */
36 0x82000000 0 0x00004000 0x00004000 0 0x00001000 /* port 2 configuration space */
37 0x81000000 0 0 0x02000000 0 0x00010000 /* downstream I/O */
38 0x82000000 0 0x20000000 0x20000000 0 0x08000000 /* non-prefetchable memory */
39 0xc2000000 0 0x28000000 0x28000000 0 0x18000000>; /* prefetchable memory */
40
41 clocks = <&tegra_car TEGRA30_CLK_PCIE>,
42 <&tegra_car TEGRA30_CLK_AFI>,
43 <&tegra_car TEGRA30_CLK_PCIEX>,
44 <&tegra_car TEGRA30_CLK_PLL_E>,
45 <&tegra_car TEGRA30_CLK_CML0>;
46 clock-names = "pex", "afi", "pcie_xclk", "pll_e", "cml";
47 status = "disabled";
48
49 pci@1,0 {
50 device_type = "pci";
51 assigned-addresses = <0x82000800 0 0x00000000 0 0x1000>;
52 reg = <0x000800 0 0 0 0>;
53 status = "disabled";
54
55 #address-cells = <3>;
56 #size-cells = <2>;
57 ranges;
58
59 nvidia,num-lanes = <2>;
60 };
61
62 pci@2,0 {
63 device_type = "pci";
64 assigned-addresses = <0x82001000 0 0x00001000 0 0x1000>;
65 reg = <0x001000 0 0 0 0>;
66 status = "disabled";
67
68 #address-cells = <3>;
69 #size-cells = <2>;
70 ranges;
71
72 nvidia,num-lanes = <2>;
73 };
74
75 pci@3,0 {
76 device_type = "pci";
77 assigned-addresses = <0x82001800 0 0x00004000 0 0x1000>;
78 reg = <0x001800 0 0 0 0>;
79 status = "disabled";
80
81 #address-cells = <3>;
82 #size-cells = <2>;
83 ranges;
84
85 nvidia,num-lanes = <2>;
86 };
87 };
88
19 host1x { 89 host1x {
20 compatible = "nvidia,tegra30-host1x", "simple-bus"; 90 compatible = "nvidia,tegra30-host1x", "simple-bus";
21 reg = <0x50000000 0x00024000>; 91 reg = <0x50000000 0x00024000>;
@@ -561,6 +631,92 @@
561 status = "disabled"; 631 status = "disabled";
562 }; 632 };
563 633
634 usb@7d000000 {
635 compatible = "nvidia,tegra30-ehci", "usb-ehci";
636 reg = <0x7d000000 0x4000>;
637 interrupts = <GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>;
638 phy_type = "utmi";
639 clocks = <&tegra_car TEGRA30_CLK_USBD>;
640 nvidia,needs-double-reset;
641 nvidia,phy = <&phy1>;
642 status = "disabled";
643 };
644
645 phy1: usb-phy@7d000000 {
646 compatible = "nvidia,tegra30-usb-phy";
647 reg = <0x7d000000 0x4000 0x7d000000 0x4000>;
648 phy_type = "utmi";
649 clocks = <&tegra_car TEGRA30_CLK_USBD>,
650 <&tegra_car TEGRA30_CLK_PLL_U>,
651 <&tegra_car TEGRA30_CLK_USBD>;
652 clock-names = "reg", "pll_u", "utmi-pads";
653 nvidia,hssync-start-delay = <9>;
654 nvidia,idle-wait-delay = <17>;
655 nvidia,elastic-limit = <16>;
656 nvidia,term-range-adj = <6>;
657 nvidia,xcvr-setup = <51>;
658 nvidia.xcvr-setup-use-fuses;
659 nvidia,xcvr-lsfslew = <1>;
660 nvidia,xcvr-lsrslew = <1>;
661 nvidia,xcvr-hsslew = <32>;
662 nvidia,hssquelch-level = <2>;
663 nvidia,hsdiscon-level = <5>;
664 status = "disabled";
665 };
666
667 usb@7d004000 {
668 compatible = "nvidia,tegra30-ehci", "usb-ehci";
669 reg = <0x7d004000 0x4000>;
670 interrupts = <GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;
671 phy_type = "ulpi";
672 clocks = <&tegra_car TEGRA30_CLK_USB2>;
673 nvidia,phy = <&phy2>;
674 status = "disabled";
675 };
676
677 phy2: usb-phy@7d004000 {
678 compatible = "nvidia,tegra30-usb-phy";
679 reg = <0x7d004000 0x4000>;
680 phy_type = "ulpi";
681 clocks = <&tegra_car TEGRA30_CLK_USB2>,
682 <&tegra_car TEGRA30_CLK_PLL_U>,
683 <&tegra_car TEGRA30_CLK_CDEV2>;
684 clock-names = "reg", "pll_u", "ulpi-link";
685 status = "disabled";
686 };
687
688 usb@7d008000 {
689 compatible = "nvidia,tegra30-ehci", "usb-ehci";
690 reg = <0x7d008000 0x4000>;
691 interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH>;
692 phy_type = "utmi";
693 clocks = <&tegra_car TEGRA30_CLK_USB3>;
694 nvidia,phy = <&phy3>;
695 status = "disabled";
696 };
697
698 phy3: usb-phy@7d008000 {
699 compatible = "nvidia,tegra30-usb-phy";
700 reg = <0x7d008000 0x4000 0x7d000000 0x4000>;
701 phy_type = "utmi";
702 clocks = <&tegra_car TEGRA30_CLK_USB3>,
703 <&tegra_car TEGRA30_CLK_PLL_U>,
704 <&tegra_car TEGRA30_CLK_USBD>;
705 clock-names = "reg", "pll_u", "utmi-pads";
706 nvidia,hssync-start-delay = <0>;
707 nvidia,idle-wait-delay = <17>;
708 nvidia,elastic-limit = <16>;
709 nvidia,term-range-adj = <6>;
710 nvidia,xcvr-setup = <51>;
711 nvidia.xcvr-setup-use-fuses;
712 nvidia,xcvr-lsfslew = <2>;
713 nvidia,xcvr-lsrslew = <2>;
714 nvidia,xcvr-hsslew = <32>;
715 nvidia,hssquelch-level = <2>;
716 nvidia,hsdiscon-level = <5>;
717 status = "disabled";
718 };
719
564 cpus { 720 cpus {
565 #address-cells = <1>; 721 #address-cells = <1>;
566 #size-cells = <0>; 722 #size-cells = <0>;
diff --git a/arch/arm/boot/dts/u9540.dts b/arch/arm/boot/dts/u9540.dts
deleted file mode 100644
index 95892ec6c342..000000000000
--- a/arch/arm/boot/dts/u9540.dts
+++ /dev/null
@@ -1,72 +0,0 @@
1/*
2 * Copyright 2012 ST-Ericsson AB
3 *
4 * The code contained herein is licensed under the GNU General Public
5 * License. You may obtain a copy of the GNU General Public License
6 * Version 2 or later at the following locations:
7 *
8 * http://www.opensource.org/licenses/gpl-license.html
9 * http://www.gnu.org/copyleft/gpl.html
10 */
11
12/dts-v1/;
13/include/ "dbx5x0.dtsi"
14
15/ {
16 model = "ST-Ericsson U9540 platform with Device Tree";
17 compatible = "st-ericsson,u9540";
18
19 memory {
20 reg = <0x00000000 0x20000000>;
21 };
22
23 soc-u9500 {
24 uart@80120000 {
25 status = "okay";
26 };
27
28 uart@80121000 {
29 status = "okay";
30 };
31
32 uart@80007000 {
33 status = "okay";
34 };
35
36 // External Micro SD slot
37 sdi0_per1@80126000 {
38 arm,primecell-periphid = <0x10480180>;
39 max-frequency = <100000000>;
40 bus-width = <4>;
41 mmc-cap-sd-highspeed;
42 mmc-cap-mmc-highspeed;
43 vmmc-supply = <&ab8500_ldo_aux3_reg>;
44
45 cd-gpios = <&gpio7 6 0x4>; // 230
46 cd-inverted;
47
48 status = "okay";
49 };
50
51
52 // WLAN SDIO channel
53 sdi1_per2@80118000 {
54 arm,primecell-periphid = <0x10480180>;
55 max-frequency = <50000000>;
56 bus-width = <4>;
57
58 status = "okay";
59 };
60
61 // On-board eMMC
62 sdi4_per2@80114000 {
63 arm,primecell-periphid = <0x10480180>;
64 max-frequency = <100000000>;
65 bus-width = <8>;
66 mmc-cap-mmc-highspeed;
67 vmmc-supply = <&ab8500_ldo_aux2_reg>;
68
69 status = "okay";
70 };
71 };
72};
diff --git a/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts b/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts
index d2803be4e1a8..15f98cbcb75a 100644
--- a/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts
+++ b/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts
@@ -37,30 +37,35 @@
37 device_type = "cpu"; 37 device_type = "cpu";
38 compatible = "arm,cortex-a15"; 38 compatible = "arm,cortex-a15";
39 reg = <0>; 39 reg = <0>;
40 cci-control-port = <&cci_control1>;
40 }; 41 };
41 42
42 cpu1: cpu@1 { 43 cpu1: cpu@1 {
43 device_type = "cpu"; 44 device_type = "cpu";
44 compatible = "arm,cortex-a15"; 45 compatible = "arm,cortex-a15";
45 reg = <1>; 46 reg = <1>;
47 cci-control-port = <&cci_control1>;
46 }; 48 };
47 49
48 cpu2: cpu@2 { 50 cpu2: cpu@2 {
49 device_type = "cpu"; 51 device_type = "cpu";
50 compatible = "arm,cortex-a7"; 52 compatible = "arm,cortex-a7";
51 reg = <0x100>; 53 reg = <0x100>;
54 cci-control-port = <&cci_control2>;
52 }; 55 };
53 56
54 cpu3: cpu@3 { 57 cpu3: cpu@3 {
55 device_type = "cpu"; 58 device_type = "cpu";
56 compatible = "arm,cortex-a7"; 59 compatible = "arm,cortex-a7";
57 reg = <0x101>; 60 reg = <0x101>;
61 cci-control-port = <&cci_control2>;
58 }; 62 };
59 63
60 cpu4: cpu@4 { 64 cpu4: cpu@4 {
61 device_type = "cpu"; 65 device_type = "cpu";
62 compatible = "arm,cortex-a7"; 66 compatible = "arm,cortex-a7";
63 reg = <0x102>; 67 reg = <0x102>;
68 cci-control-port = <&cci_control2>;
64 }; 69 };
65 }; 70 };
66 71
@@ -104,6 +109,26 @@
104 interrupts = <1 9 0xf04>; 109 interrupts = <1 9 0xf04>;
105 }; 110 };
106 111
112 cci@2c090000 {
113 compatible = "arm,cci-400";
114 #address-cells = <1>;
115 #size-cells = <1>;
116 reg = <0 0x2c090000 0 0x1000>;
117 ranges = <0x0 0x0 0x2c090000 0x10000>;
118
119 cci_control1: slave-if@4000 {
120 compatible = "arm,cci-400-ctrl-if";
121 interface-type = "ace";
122 reg = <0x4000 0x1000>;
123 };
124
125 cci_control2: slave-if@5000 {
126 compatible = "arm,cci-400-ctrl-if";
127 interface-type = "ace";
128 reg = <0x5000 0x1000>;
129 };
130 };
131
107 memory-controller@7ffd0000 { 132 memory-controller@7ffd0000 {
108 compatible = "arm,pl354", "arm,primecell"; 133 compatible = "arm,pl354", "arm,primecell";
109 reg = <0 0x7ffd0000 0 0x1000>; 134 reg = <0 0x7ffd0000 0 0x1000>;
@@ -125,6 +150,12 @@
125 clock-names = "apb_pclk"; 150 clock-names = "apb_pclk";
126 }; 151 };
127 152
153 scc@7fff0000 {
154 compatible = "arm,vexpress-scc,v2p-ca15_a7", "arm,vexpress-scc";
155 reg = <0 0x7fff0000 0 0x1000>;
156 interrupts = <0 95 4>;
157 };
158
128 timer { 159 timer {
129 compatible = "arm,armv7-timer"; 160 compatible = "arm,armv7-timer";
130 interrupts = <1 13 0xf08>, 161 interrupts = <1 13 0xf08>,
diff --git a/arch/arm/boot/dts/vf610-twr.dts b/arch/arm/boot/dts/vf610-twr.dts
index b3905f5bcaf9..1a58678b93fa 100644
--- a/arch/arm/boot/dts/vf610-twr.dts
+++ b/arch/arm/boot/dts/vf610-twr.dts
@@ -50,6 +50,13 @@
50 status = "okay"; 50 status = "okay";
51}; 51};
52 52
53&i2c0 {
54 clock-frequency = <100000>;
55 pinctrl-names = "default";
56 pinctrl-0 = <&pinctrl_i2c0_1>;
57 status = "okay";
58};
59
53&uart1 { 60&uart1 {
54 pinctrl-names = "default"; 61 pinctrl-names = "default";
55 pinctrl-0 = <&pinctrl_uart1_1>; 62 pinctrl-0 = <&pinctrl_uart1_1>;
diff --git a/arch/arm/boot/dts/wm8850-w70v2.dts b/arch/arm/boot/dts/wm8850-w70v2.dts
index 90e913fb64be..7a563d2523b0 100644
--- a/arch/arm/boot/dts/wm8850-w70v2.dts
+++ b/arch/arm/boot/dts/wm8850-w70v2.dts
@@ -11,13 +11,14 @@
11 11
12/dts-v1/; 12/dts-v1/;
13/include/ "wm8850.dtsi" 13/include/ "wm8850.dtsi"
14#include <dt-bindings/pwm/pwm.h>
14 15
15/ { 16/ {
16 model = "Wondermedia WM8850-W70v2 Tablet"; 17 model = "Wondermedia WM8850-W70v2 Tablet";
17 18
18 backlight { 19 backlight {
19 compatible = "pwm-backlight"; 20 compatible = "pwm-backlight";
20 pwms = <&pwm 0 50000 1>; /* duty inverted */ 21 pwms = <&pwm 0 50000 PWM_POLARITY_INVERTED>;
21 22
22 brightness-levels = <0 40 60 80 100 130 190 255>; 23 brightness-levels = <0 40 60 80 100 130 190 255>;
23 default-brightness-level = <5>; 24 default-brightness-level = <5>;
diff --git a/arch/arm/boot/dts/zynq-7000.dtsi b/arch/arm/boot/dts/zynq-7000.dtsi
index 6f54a64850eb..e32b92b949d2 100644
--- a/arch/arm/boot/dts/zynq-7000.dtsi
+++ b/arch/arm/boot/dts/zynq-7000.dtsi
@@ -41,8 +41,8 @@
41 L2: cache-controller { 41 L2: cache-controller {
42 compatible = "arm,pl310-cache"; 42 compatible = "arm,pl310-cache";
43 reg = <0xF8F02000 0x1000>; 43 reg = <0xF8F02000 0x1000>;
44 arm,data-latency = <2 3 2>; 44 arm,data-latency = <3 2 2>;
45 arm,tag-latency = <2 3 2>; 45 arm,tag-latency = <2 2 2>;
46 cache-unified; 46 cache-unified;
47 cache-level = <2>; 47 cache-level = <2>;
48 }; 48 };
diff --git a/arch/arm/common/edma.c b/arch/arm/common/edma.c
index 39ad030ac0c7..117f955a2a06 100644
--- a/arch/arm/common/edma.c
+++ b/arch/arm/common/edma.c
@@ -1235,6 +1235,23 @@ void edma_resume(unsigned channel)
1235} 1235}
1236EXPORT_SYMBOL(edma_resume); 1236EXPORT_SYMBOL(edma_resume);
1237 1237
1238int edma_trigger_channel(unsigned channel)
1239{
1240 unsigned ctlr;
1241 unsigned int mask;
1242
1243 ctlr = EDMA_CTLR(channel);
1244 channel = EDMA_CHAN_SLOT(channel);
1245 mask = BIT(channel & 0x1f);
1246
1247 edma_shadow0_write_array(ctlr, SH_ESR, (channel >> 5), mask);
1248
1249 pr_debug("EDMA: ESR%d %08x\n", (channel >> 5),
1250 edma_shadow0_read_array(ctlr, SH_ESR, (channel >> 5)));
1251 return 0;
1252}
1253EXPORT_SYMBOL(edma_trigger_channel);
1254
1238/** 1255/**
1239 * edma_start - start dma on a channel 1256 * edma_start - start dma on a channel
1240 * @channel: channel being activated 1257 * @channel: channel being activated
diff --git a/arch/arm/common/mcpm_head.S b/arch/arm/common/mcpm_head.S
index 80f033614a1f..39c96df3477a 100644
--- a/arch/arm/common/mcpm_head.S
+++ b/arch/arm/common/mcpm_head.S
@@ -151,7 +151,7 @@ mcpm_setup_leave:
151 151
152 mov r0, #INBOUND_NOT_COMING_UP 152 mov r0, #INBOUND_NOT_COMING_UP
153 strb r0, [r8, #MCPM_SYNC_CLUSTER_INBOUND] 153 strb r0, [r8, #MCPM_SYNC_CLUSTER_INBOUND]
154 dsb 154 dsb st
155 sev 155 sev
156 156
157 mov r0, r11 157 mov r0, r11
diff --git a/arch/arm/common/timer-sp.c b/arch/arm/common/timer-sp.c
index 023ee63827a2..e901d0f3e0bb 100644
--- a/arch/arm/common/timer-sp.c
+++ b/arch/arm/common/timer-sp.c
@@ -166,7 +166,8 @@ static int sp804_set_next_event(unsigned long next,
166} 166}
167 167
168static struct clock_event_device sp804_clockevent = { 168static struct clock_event_device sp804_clockevent = {
169 .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, 169 .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT |
170 CLOCK_EVT_FEAT_DYNIRQ,
170 .set_mode = sp804_set_mode, 171 .set_mode = sp804_set_mode,
171 .set_next_event = sp804_set_next_event, 172 .set_next_event = sp804_set_next_event,
172 .rating = 300, 173 .rating = 300,
diff --git a/arch/arm/common/vlock.S b/arch/arm/common/vlock.S
index ff198583f683..8b7df283fedf 100644
--- a/arch/arm/common/vlock.S
+++ b/arch/arm/common/vlock.S
@@ -42,7 +42,7 @@
42 dmb 42 dmb
43 mov \rscratch, #0 43 mov \rscratch, #0
44 strb \rscratch, [\rbase, \rcpu] 44 strb \rscratch, [\rbase, \rcpu]
45 dsb 45 dsb st
46 sev 46 sev
47.endm 47.endm
48 48
@@ -102,7 +102,7 @@ ENTRY(vlock_unlock)
102 dmb 102 dmb
103 mov r1, #VLOCK_OWNER_NONE 103 mov r1, #VLOCK_OWNER_NONE
104 strb r1, [r0, #VLOCK_OWNER_OFFSET] 104 strb r1, [r0, #VLOCK_OWNER_OFFSET]
105 dsb 105 dsb st
106 sev 106 sev
107 bx lr 107 bx lr
108ENDPROC(vlock_unlock) 108ENDPROC(vlock_unlock)
diff --git a/arch/arm/configs/ag5evm_defconfig b/arch/arm/configs/ag5evm_defconfig
deleted file mode 100644
index 212ead354a6b..000000000000
--- a/arch/arm/configs/ag5evm_defconfig
+++ /dev/null
@@ -1,83 +0,0 @@
1CONFIG_EXPERIMENTAL=y
2CONFIG_SYSVIPC=y
3CONFIG_IKCONFIG=y
4CONFIG_IKCONFIG_PROC=y
5CONFIG_LOG_BUF_SHIFT=16
6CONFIG_NAMESPACES=y
7# CONFIG_UTS_NS is not set
8# CONFIG_IPC_NS is not set
9# CONFIG_USER_NS is not set
10# CONFIG_PID_NS is not set
11CONFIG_BLK_DEV_INITRD=y
12CONFIG_INITRAMFS_SOURCE=""
13CONFIG_EXPERT=y
14CONFIG_SLAB=y
15# CONFIG_BLK_DEV_BSG is not set
16# CONFIG_IOSCHED_DEADLINE is not set
17# CONFIG_IOSCHED_CFQ is not set
18CONFIG_ARCH_SHMOBILE=y
19CONFIG_ARCH_SH73A0=y
20CONFIG_MACH_AG5EVM=y
21CONFIG_MEMORY_SIZE=0x10000000
22CONFIG_CPU_BPREDICT_DISABLE=y
23CONFIG_ARM_ERRATA_430973=y
24CONFIG_ARM_ERRATA_458693=y
25CONFIG_NO_HZ=y
26CONFIG_AEABI=y
27# CONFIG_OABI_COMPAT is not set
28CONFIG_HIGHMEM=y
29CONFIG_ZBOOT_ROM_TEXT=0x0
30CONFIG_ZBOOT_ROM_BSS=0x0
31CONFIG_CMDLINE="console=tty0 console=ttySC2,115200 earlyprintk=sh-sci.2,115200 ignore_loglevel"
32CONFIG_CMDLINE_FORCE=y
33CONFIG_KEXEC=y
34# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
35CONFIG_PM=y
36# CONFIG_SUSPEND is not set
37CONFIG_PM_RUNTIME=y
38CONFIG_NET=y
39CONFIG_PACKET=y
40CONFIG_UNIX=y
41CONFIG_INET=y
42# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
43# CONFIG_INET_XFRM_MODE_TUNNEL is not set
44# CONFIG_INET_XFRM_MODE_BEET is not set
45# CONFIG_INET_LRO is not set
46# CONFIG_INET_DIAG is not set
47# CONFIG_IPV6 is not set
48# CONFIG_WIRELESS is not set
49CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
50# CONFIG_BLK_DEV is not set
51CONFIG_NETDEVICES=y
52CONFIG_NET_ETHERNET=y
53CONFIG_SMSC911X=y
54# CONFIG_NETDEV_1000 is not set
55# CONFIG_NETDEV_10000 is not set
56# CONFIG_WLAN is not set
57CONFIG_INPUT_SPARSEKMAP=y
58# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
59CONFIG_INPUT_EVDEV=y
60# CONFIG_INPUT_KEYBOARD is not set
61# CONFIG_INPUT_MOUSE is not set
62CONFIG_SERIAL_SH_SCI=y
63CONFIG_SERIAL_SH_SCI_NR_UARTS=9
64CONFIG_SERIAL_SH_SCI_CONSOLE=y
65# CONFIG_LEGACY_PTYS is not set
66# CONFIG_HW_RANDOM is not set
67CONFIG_I2C=y
68CONFIG_I2C_SH_MOBILE=y
69# CONFIG_HWMON is not set
70# CONFIG_MFD_SUPPORT is not set
71CONFIG_FB=y
72CONFIG_FB_SH_MOBILE_LCDC=y
73CONFIG_FRAMEBUFFER_CONSOLE=y
74CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
75# CONFIG_HID_SUPPORT is not set
76# CONFIG_USB_SUPPORT is not set
77# CONFIG_DNOTIFY is not set
78# CONFIG_INOTIFY_USER is not set
79CONFIG_TMPFS=y
80# CONFIG_MISC_FILESYSTEMS is not set
81CONFIG_MAGIC_SYSRQ=y
82CONFIG_DEBUG_KERNEL=y
83# CONFIG_FTRACE is not set
diff --git a/arch/arm/configs/ape6evm_defconfig b/arch/arm/configs/ape6evm_defconfig
index dab5a7dfadc6..1ce39940795d 100644
--- a/arch/arm/configs/ape6evm_defconfig
+++ b/arch/arm/configs/ape6evm_defconfig
@@ -54,7 +54,8 @@ CONFIG_NETDEVICES=y
54CONFIG_SMC91X=y 54CONFIG_SMC91X=y
55CONFIG_SMSC911X=y 55CONFIG_SMSC911X=y
56# CONFIG_INPUT_MOUSEDEV is not set 56# CONFIG_INPUT_MOUSEDEV is not set
57# CONFIG_INPUT_KEYBOARD is not set 57CONFIG_INPUT_EVDEV=y
58CONFIG_KEYBOARD_GPIO=y
58# CONFIG_INPUT_MOUSE is not set 59# CONFIG_INPUT_MOUSE is not set
59# CONFIG_SERIO is not set 60# CONFIG_SERIO is not set
60CONFIG_SERIAL_NONSTANDARD=y 61CONFIG_SERIAL_NONSTANDARD=y
@@ -71,6 +72,9 @@ CONFIG_REGULATOR_FIXED_VOLTAGE=y
71CONFIG_REGULATOR_GPIO=y 72CONFIG_REGULATOR_GPIO=y
72# CONFIG_HID is not set 73# CONFIG_HID is not set
73# CONFIG_USB_SUPPORT is not set 74# CONFIG_USB_SUPPORT is not set
75CONFIG_NEW_LEDS=y
76CONFIG_LEDS_CLASS=y
77CONFIG_LEDS_GPIO=y
74# CONFIG_IOMMU_SUPPORT is not set 78# CONFIG_IOMMU_SUPPORT is not set
75# CONFIG_DNOTIFY is not set 79# CONFIG_DNOTIFY is not set
76CONFIG_TMPFS=y 80CONFIG_TMPFS=y
diff --git a/arch/arm/configs/at91_dt_defconfig b/arch/arm/configs/at91_dt_defconfig
index 75fd842d4071..690e89273230 100644
--- a/arch/arm/configs/at91_dt_defconfig
+++ b/arch/arm/configs/at91_dt_defconfig
@@ -14,11 +14,13 @@ CONFIG_MODULE_UNLOAD=y
14# CONFIG_IOSCHED_DEADLINE is not set 14# CONFIG_IOSCHED_DEADLINE is not set
15# CONFIG_IOSCHED_CFQ is not set 15# CONFIG_IOSCHED_CFQ is not set
16CONFIG_ARCH_AT91=y 16CONFIG_ARCH_AT91=y
17CONFIG_SOC_AT91RM9200=y
17CONFIG_SOC_AT91SAM9260=y 18CONFIG_SOC_AT91SAM9260=y
18CONFIG_SOC_AT91SAM9263=y 19CONFIG_SOC_AT91SAM9263=y
19CONFIG_SOC_AT91SAM9G45=y 20CONFIG_SOC_AT91SAM9G45=y
20CONFIG_SOC_AT91SAM9X5=y 21CONFIG_SOC_AT91SAM9X5=y
21CONFIG_SOC_AT91SAM9N12=y 22CONFIG_SOC_AT91SAM9N12=y
23CONFIG_MACH_AT91RM9200_DT=y
22CONFIG_MACH_AT91SAM9_DT=y 24CONFIG_MACH_AT91SAM9_DT=y
23CONFIG_AT91_PROGRAMMABLE_CLOCKS=y 25CONFIG_AT91_PROGRAMMABLE_CLOCKS=y
24CONFIG_AT91_TIMER_HZ=128 26CONFIG_AT91_TIMER_HZ=128
@@ -62,6 +64,7 @@ CONFIG_MTD=y
62CONFIG_MTD_CMDLINE_PARTS=y 64CONFIG_MTD_CMDLINE_PARTS=y
63CONFIG_MTD_CHAR=y 65CONFIG_MTD_CHAR=y
64CONFIG_MTD_BLOCK=y 66CONFIG_MTD_BLOCK=y
67CONFIG_MTD_DATAFLASH=y
65CONFIG_MTD_NAND=y 68CONFIG_MTD_NAND=y
66CONFIG_MTD_NAND_ATMEL=y 69CONFIG_MTD_NAND_ATMEL=y
67CONFIG_MTD_UBI=y 70CONFIG_MTD_UBI=y
@@ -78,7 +81,6 @@ CONFIG_BLK_DEV_SD=y
78CONFIG_SCSI_MULTI_LUN=y 81CONFIG_SCSI_MULTI_LUN=y
79# CONFIG_SCSI_LOWLEVEL is not set 82# CONFIG_SCSI_LOWLEVEL is not set
80CONFIG_NETDEVICES=y 83CONFIG_NETDEVICES=y
81CONFIG_MII=y
82CONFIG_MACB=y 84CONFIG_MACB=y
83# CONFIG_NET_VENDOR_BROADCOM is not set 85# CONFIG_NET_VENDOR_BROADCOM is not set
84# CONFIG_NET_VENDOR_FARADAY is not set 86# CONFIG_NET_VENDOR_FARADAY is not set
diff --git a/arch/arm/configs/bcm_defconfig b/arch/arm/configs/bcm_defconfig
index 65edf6d47215..6e4931097dd4 100644
--- a/arch/arm/configs/bcm_defconfig
+++ b/arch/arm/configs/bcm_defconfig
@@ -42,6 +42,18 @@ CONFIG_VFP=y
42CONFIG_NEON=y 42CONFIG_NEON=y
43# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set 43# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
44CONFIG_PM_RUNTIME=y 44CONFIG_PM_RUNTIME=y
45CONFIG_NET=y
46CONFIG_PACKET=y
47CONFIG_PACKET_DIAG=y
48CONFIG_UNIX=y
49CONFIG_UNIX_DIAG=y
50CONFIG_NET_KEY=y
51CONFIG_INET=y
52CONFIG_IP_MULTICAST=y
53CONFIG_ARPD=y
54CONFIG_SYN_COOKIES=y
55CONFIG_TCP_MD5SIG=y
56CONFIG_IPV6=y
45CONFIG_DEVTMPFS=y 57CONFIG_DEVTMPFS=y
46CONFIG_DEVTMPFS_MOUNT=y 58CONFIG_DEVTMPFS_MOUNT=y
47CONFIG_PROC_DEVICETREE=y 59CONFIG_PROC_DEVICETREE=y
@@ -112,7 +124,6 @@ CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=110
112CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y 124CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y
113CONFIG_DEBUG_INFO=y 125CONFIG_DEBUG_INFO=y
114# CONFIG_FTRACE is not set 126# CONFIG_FTRACE is not set
115CONFIG_DEBUG_LL=y
116CONFIG_CRC_CCITT=y 127CONFIG_CRC_CCITT=y
117CONFIG_CRC_T10DIF=y 128CONFIG_CRC_T10DIF=y
118CONFIG_CRC_ITU_T=y 129CONFIG_CRC_ITU_T=y
diff --git a/arch/arm/configs/bockw_defconfig b/arch/arm/configs/bockw_defconfig
index 845f5cdf62b5..e7e94948d194 100644
--- a/arch/arm/configs/bockw_defconfig
+++ b/arch/arm/configs/bockw_defconfig
@@ -82,6 +82,13 @@ CONFIG_SERIAL_SH_SCI_CONSOLE=y
82# CONFIG_HWMON is not set 82# CONFIG_HWMON is not set
83CONFIG_I2C=y 83CONFIG_I2C=y
84CONFIG_I2C_RCAR=y 84CONFIG_I2C_RCAR=y
85CONFIG_MEDIA_SUPPORT=y
86CONFIG_MEDIA_CAMERA_SUPPORT=y
87CONFIG_V4L_PLATFORM_DRIVERS=y
88CONFIG_SOC_CAMERA=y
89CONFIG_VIDEO_RCAR_VIN=y
90# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set
91CONFIG_VIDEO_ML86V7667=y
85CONFIG_SPI=y 92CONFIG_SPI=y
86CONFIG_SPI_SH_HSPI=y 93CONFIG_SPI_SH_HSPI=y
87CONFIG_USB=y 94CONFIG_USB=y
diff --git a/arch/arm/configs/dove_defconfig b/arch/arm/configs/dove_defconfig
index 4364eff5b01e..110105476848 100644
--- a/arch/arm/configs/dove_defconfig
+++ b/arch/arm/configs/dove_defconfig
@@ -13,6 +13,9 @@ CONFIG_ARCH_DOVE=y
13CONFIG_MACH_DOVE_DB=y 13CONFIG_MACH_DOVE_DB=y
14CONFIG_MACH_CM_A510=y 14CONFIG_MACH_CM_A510=y
15CONFIG_MACH_DOVE_DT=y 15CONFIG_MACH_DOVE_DT=y
16CONFIG_PCI=y
17CONFIG_PCI_MSI=y
18CONFIG_PCI_MVEBU=y
16CONFIG_AEABI=y 19CONFIG_AEABI=y
17CONFIG_HIGHMEM=y 20CONFIG_HIGHMEM=y
18CONFIG_ZBOOT_ROM_TEXT=0x0 21CONFIG_ZBOOT_ROM_TEXT=0x0
@@ -78,6 +81,7 @@ CONFIG_SPI_ORION=y
78CONFIG_THERMAL=y 81CONFIG_THERMAL=y
79CONFIG_DOVE_THERMAL=y 82CONFIG_DOVE_THERMAL=y
80CONFIG_USB=y 83CONFIG_USB=y
84CONFIG_USB_XHCI_HCD=y
81CONFIG_USB_EHCI_HCD=y 85CONFIG_USB_EHCI_HCD=y
82CONFIG_USB_EHCI_ROOT_HUB_TT=y 86CONFIG_USB_EHCI_ROOT_HUB_TT=y
83CONFIG_USB_STORAGE=y 87CONFIG_USB_STORAGE=y
diff --git a/arch/arm/configs/exynos4_defconfig b/arch/arm/configs/exynos4_defconfig
deleted file mode 100644
index bffe68e190a3..000000000000
--- a/arch/arm/configs/exynos4_defconfig
+++ /dev/null
@@ -1,68 +0,0 @@
1CONFIG_EXPERIMENTAL=y
2CONFIG_BLK_DEV_INITRD=y
3CONFIG_KALLSYMS_ALL=y
4CONFIG_MODULES=y
5CONFIG_MODULE_UNLOAD=y
6# CONFIG_BLK_DEV_BSG is not set
7CONFIG_ARCH_EXYNOS=y
8CONFIG_S3C_LOWLEVEL_UART_PORT=1
9CONFIG_MACH_SMDKC210=y
10CONFIG_MACH_ARMLEX4210=y
11CONFIG_MACH_UNIVERSAL_C210=y
12CONFIG_MACH_NURI=y
13CONFIG_MACH_ORIGEN=y
14CONFIG_MACH_SMDK4412=y
15CONFIG_NO_HZ=y
16CONFIG_HIGH_RES_TIMERS=y
17CONFIG_SMP=y
18CONFIG_NR_CPUS=2
19CONFIG_PREEMPT=y
20CONFIG_AEABI=y
21CONFIG_CMDLINE="root=/dev/ram0 rw ramdisk=8192 initrd=0x41000000,8M console=ttySAC1,115200 init=/linuxrc mem=256M"
22CONFIG_VFP=y
23CONFIG_NEON=y
24CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
25CONFIG_BLK_DEV_LOOP=y
26CONFIG_BLK_DEV_RAM=y
27CONFIG_BLK_DEV_RAM_SIZE=8192
28CONFIG_SCSI=y
29CONFIG_BLK_DEV_SD=y
30CONFIG_CHR_DEV_SG=y
31CONFIG_INPUT_EVDEV=y
32# CONFIG_INPUT_KEYBOARD is not set
33# CONFIG_INPUT_MOUSE is not set
34CONFIG_INPUT_TOUCHSCREEN=y
35CONFIG_SERIAL_8250=y
36CONFIG_SERIAL_SAMSUNG=y
37CONFIG_SERIAL_SAMSUNG_CONSOLE=y
38CONFIG_HW_RANDOM=y
39CONFIG_I2C=y
40# CONFIG_HWMON is not set
41# CONFIG_MFD_SUPPORT is not set
42# CONFIG_HID_SUPPORT is not set
43# CONFIG_USB_SUPPORT is not set
44CONFIG_EXT2_FS=y
45CONFIG_MSDOS_FS=y
46CONFIG_VFAT_FS=y
47CONFIG_TMPFS=y
48CONFIG_TMPFS_POSIX_ACL=y
49CONFIG_CRAMFS=y
50CONFIG_ROMFS_FS=y
51CONFIG_PARTITION_ADVANCED=y
52CONFIG_BSD_DISKLABEL=y
53CONFIG_SOLARIS_X86_PARTITION=y
54CONFIG_NLS_CODEPAGE_437=y
55CONFIG_NLS_ASCII=y
56CONFIG_NLS_ISO8859_1=y
57CONFIG_MAGIC_SYSRQ=y
58CONFIG_DEBUG_KERNEL=y
59CONFIG_DETECT_HUNG_TASK=y
60CONFIG_DEBUG_RT_MUTEXES=y
61CONFIG_DEBUG_SPINLOCK=y
62CONFIG_DEBUG_MUTEXES=y
63CONFIG_DEBUG_INFO=y
64CONFIG_SYSCTL_SYSCALL_CHECK=y
65CONFIG_DEBUG_USER=y
66CONFIG_DEBUG_LL=y
67CONFIG_EARLY_PRINTK=y
68CONFIG_CRC_CCITT=y
diff --git a/arch/arm/configs/imx_v4_v5_defconfig b/arch/arm/configs/imx_v4_v5_defconfig
index f07a847b00c9..e958ebe79779 100644
--- a/arch/arm/configs/imx_v4_v5_defconfig
+++ b/arch/arm/configs/imx_v4_v5_defconfig
@@ -1,4 +1,3 @@
1CONFIG_EXPERIMENTAL=y
2# CONFIG_SWAP is not set 1# CONFIG_SWAP is not set
3CONFIG_SYSVIPC=y 2CONFIG_SYSVIPC=y
4CONFIG_POSIX_MQUEUE=y 3CONFIG_POSIX_MQUEUE=y
@@ -17,16 +16,18 @@ CONFIG_MODULE_UNLOAD=y
17# CONFIG_BLK_DEV_BSG is not set 16# CONFIG_BLK_DEV_BSG is not set
18# CONFIG_IOSCHED_DEADLINE is not set 17# CONFIG_IOSCHED_DEADLINE is not set
19# CONFIG_IOSCHED_CFQ is not set 18# CONFIG_IOSCHED_CFQ is not set
20CONFIG_ARCH_MXC=y
21CONFIG_ARCH_MULTI_V4T=y 19CONFIG_ARCH_MULTI_V4T=y
22CONFIG_ARCH_MULTI_V5=y 20CONFIG_ARCH_MULTI_V5=y
23# CONFIG_ARCH_MULTI_V7 is not set 21# CONFIG_ARCH_MULTI_V7 is not set
22CONFIG_ARCH_MXC=y
23CONFIG_MXC_IRQ_PRIOR=y
24CONFIG_ARCH_MX1ADS=y 24CONFIG_ARCH_MX1ADS=y
25CONFIG_MACH_SCB9328=y 25CONFIG_MACH_SCB9328=y
26CONFIG_MACH_APF9328=y 26CONFIG_MACH_APF9328=y
27CONFIG_MACH_MX21ADS=y 27CONFIG_MACH_MX21ADS=y
28CONFIG_MACH_MX25_3DS=y 28CONFIG_MACH_MX25_3DS=y
29CONFIG_MACH_EUKREA_CPUIMX25SD=y 29CONFIG_MACH_EUKREA_CPUIMX25SD=y
30CONFIG_MACH_IMX25_DT=y
30CONFIG_MACH_MX27ADS=y 31CONFIG_MACH_MX27ADS=y
31CONFIG_MACH_PCM038=y 32CONFIG_MACH_PCM038=y
32CONFIG_MACH_CPUIMX27=y 33CONFIG_MACH_CPUIMX27=y
@@ -39,8 +40,6 @@ CONFIG_MACH_PCA100=y
39CONFIG_MACH_MXT_TD60=y 40CONFIG_MACH_MXT_TD60=y
40CONFIG_MACH_IMX27IPCAM=y 41CONFIG_MACH_IMX27IPCAM=y
41CONFIG_MACH_IMX27_DT=y 42CONFIG_MACH_IMX27_DT=y
42CONFIG_MXC_IRQ_PRIOR=y
43CONFIG_MXC_PWM=y
44CONFIG_PREEMPT=y 43CONFIG_PREEMPT=y
45CONFIG_AEABI=y 44CONFIG_AEABI=y
46CONFIG_ZBOOT_ROM_TEXT=0x0 45CONFIG_ZBOOT_ROM_TEXT=0x0
@@ -67,7 +66,6 @@ CONFIG_DEVTMPFS=y
67CONFIG_DEVTMPFS_MOUNT=y 66CONFIG_DEVTMPFS_MOUNT=y
68CONFIG_MTD=y 67CONFIG_MTD=y
69CONFIG_MTD_CMDLINE_PARTS=y 68CONFIG_MTD_CMDLINE_PARTS=y
70CONFIG_MTD_CHAR=y
71CONFIG_MTD_BLOCK=y 69CONFIG_MTD_BLOCK=y
72CONFIG_MTD_CFI=y 70CONFIG_MTD_CFI=y
73CONFIG_MTD_CFI_ADV_OPTIONS=y 71CONFIG_MTD_CFI_ADV_OPTIONS=y
@@ -123,24 +121,20 @@ CONFIG_REGULATOR_FIXED_VOLTAGE=y
123CONFIG_REGULATOR_MC13783=y 121CONFIG_REGULATOR_MC13783=y
124CONFIG_REGULATOR_MC13892=y 122CONFIG_REGULATOR_MC13892=y
125CONFIG_MEDIA_SUPPORT=y 123CONFIG_MEDIA_SUPPORT=y
126CONFIG_VIDEO_DEV=y
127CONFIG_V4L_PLATFORM_DRIVERS=y
128CONFIG_MEDIA_CAMERA_SUPPORT=y 124CONFIG_MEDIA_CAMERA_SUPPORT=y
125CONFIG_V4L_PLATFORM_DRIVERS=y
129CONFIG_SOC_CAMERA=y 126CONFIG_SOC_CAMERA=y
130CONFIG_SOC_CAMERA_OV2640=y
131CONFIG_VIDEO_MX2=y 127CONFIG_VIDEO_MX2=y
132CONFIG_V4L_MEM2MEM_DRIVERS=y 128CONFIG_V4L_MEM2MEM_DRIVERS=y
133CONFIG_VIDEO_CODA=y 129CONFIG_VIDEO_CODA=y
130CONFIG_SOC_CAMERA_OV2640=y
134CONFIG_FB=y 131CONFIG_FB=y
135CONFIG_FB_IMX=y 132CONFIG_FB_IMX=y
136CONFIG_BACKLIGHT_LCD_SUPPORT=y 133CONFIG_BACKLIGHT_LCD_SUPPORT=y
137CONFIG_LCD_CLASS_DEVICE=y 134CONFIG_LCD_CLASS_DEVICE=y
138CONFIG_LCD_L4F00242T03=y 135CONFIG_LCD_L4F00242T03=y
139CONFIG_BACKLIGHT_CLASS_DEVICE=y 136CONFIG_BACKLIGHT_CLASS_DEVICE=y
140CONFIG_BACKLIGHT_PWM=y
141CONFIG_FRAMEBUFFER_CONSOLE=y 137CONFIG_FRAMEBUFFER_CONSOLE=y
142CONFIG_FONTS=y
143CONFIG_FONT_8x8=y
144CONFIG_LOGO=y 138CONFIG_LOGO=y
145CONFIG_SOUND=y 139CONFIG_SOUND=y
146CONFIG_SND=y 140CONFIG_SND=y
@@ -157,7 +151,6 @@ CONFIG_USB_HID=m
157CONFIG_USB=y 151CONFIG_USB=y
158CONFIG_USB_EHCI_HCD=y 152CONFIG_USB_EHCI_HCD=y
159CONFIG_USB_EHCI_MXC=y 153CONFIG_USB_EHCI_MXC=y
160CONFIG_USB_ULPI=y
161CONFIG_MMC=y 154CONFIG_MMC=y
162CONFIG_MMC_SDHCI=y 155CONFIG_MMC_SDHCI=y
163CONFIG_MMC_SDHCI_PLTFM=y 156CONFIG_MMC_SDHCI_PLTFM=y
@@ -198,3 +191,5 @@ CONFIG_NLS_CODEPAGE_850=m
198CONFIG_NLS_ISO8859_1=y 191CONFIG_NLS_ISO8859_1=y
199CONFIG_NLS_ISO8859_15=m 192CONFIG_NLS_ISO8859_15=m
200# CONFIG_CRYPTO_ANSI_CPRNG is not set 193# CONFIG_CRYPTO_ANSI_CPRNG is not set
194CONFIG_FONTS=y
195CONFIG_FONT_8x8=y
diff --git a/arch/arm/configs/imx_v6_v7_defconfig b/arch/arm/configs/imx_v6_v7_defconfig
index 06686e7303a9..5d488c24b132 100644
--- a/arch/arm/configs/imx_v6_v7_defconfig
+++ b/arch/arm/configs/imx_v6_v7_defconfig
@@ -1,4 +1,3 @@
1CONFIG_EXPERIMENTAL=y
2# CONFIG_LOCALVERSION_AUTO is not set 1# CONFIG_LOCALVERSION_AUTO is not set
3CONFIG_KERNEL_LZO=y 2CONFIG_KERNEL_LZO=y
4CONFIG_SYSVIPC=y 3CONFIG_SYSVIPC=y
@@ -17,10 +16,8 @@ CONFIG_MODULE_UNLOAD=y
17CONFIG_MODVERSIONS=y 16CONFIG_MODVERSIONS=y
18CONFIG_MODULE_SRCVERSION_ALL=y 17CONFIG_MODULE_SRCVERSION_ALL=y
19# CONFIG_BLK_DEV_BSG is not set 18# CONFIG_BLK_DEV_BSG is not set
20CONFIG_ARCH_MXC=y
21CONFIG_ARCH_MULTI_V6=y 19CONFIG_ARCH_MULTI_V6=y
22CONFIG_ARCH_MULTI_V7=y 20CONFIG_ARCH_MXC=y
23CONFIG_MACH_IMX31_DT=y
24CONFIG_MACH_MX31LILLY=y 21CONFIG_MACH_MX31LILLY=y
25CONFIG_MACH_MX31LITE=y 22CONFIG_MACH_MX31LITE=y
26CONFIG_MACH_PCM037=y 23CONFIG_MACH_PCM037=y
@@ -30,6 +27,7 @@ CONFIG_MACH_MX31MOBOARD=y
30CONFIG_MACH_QONG=y 27CONFIG_MACH_QONG=y
31CONFIG_MACH_ARMADILLO5X0=y 28CONFIG_MACH_ARMADILLO5X0=y
32CONFIG_MACH_KZM_ARM11_01=y 29CONFIG_MACH_KZM_ARM11_01=y
30CONFIG_MACH_IMX31_DT=y
33CONFIG_MACH_PCM043=y 31CONFIG_MACH_PCM043=y
34CONFIG_MACH_MX35_3DS=y 32CONFIG_MACH_MX35_3DS=y
35CONFIG_MACH_VPR200=y 33CONFIG_MACH_VPR200=y
@@ -39,7 +37,6 @@ CONFIG_SOC_IMX53=y
39CONFIG_SOC_IMX6Q=y 37CONFIG_SOC_IMX6Q=y
40CONFIG_SOC_IMX6SL=y 38CONFIG_SOC_IMX6SL=y
41CONFIG_SOC_VF610=y 39CONFIG_SOC_VF610=y
42CONFIG_MXC_PWM=y
43CONFIG_SMP=y 40CONFIG_SMP=y
44CONFIG_VMSPLIT_2G=y 41CONFIG_VMSPLIT_2G=y
45CONFIG_PREEMPT_VOLUNTARY=y 42CONFIG_PREEMPT_VOLUNTARY=y
@@ -64,20 +61,24 @@ CONFIG_IP_PNP_DHCP=y
64# CONFIG_INET_LRO is not set 61# CONFIG_INET_LRO is not set
65CONFIG_IPV6=y 62CONFIG_IPV6=y
66CONFIG_NETFILTER=y 63CONFIG_NETFILTER=y
67# CONFIG_WIRELESS is not set 64CONFIG_CFG80211=y
65CONFIG_MAC80211=y
66CONFIG_RFKILL=y
67CONFIG_RFKILL_INPUT=y
68CONFIG_DEVTMPFS=y 68CONFIG_DEVTMPFS=y
69CONFIG_DEVTMPFS_MOUNT=y 69CONFIG_DEVTMPFS_MOUNT=y
70# CONFIG_STANDALONE is not set 70# CONFIG_STANDALONE is not set
71CONFIG_IMX_WEIM=y
71CONFIG_CONNECTOR=y 72CONFIG_CONNECTOR=y
72CONFIG_MTD=y 73CONFIG_MTD=y
73CONFIG_MTD_CMDLINE_PARTS=y 74CONFIG_MTD_CMDLINE_PARTS=y
74CONFIG_MTD_CHAR=y
75CONFIG_MTD_BLOCK=y 75CONFIG_MTD_BLOCK=y
76CONFIG_MTD_CFI=y 76CONFIG_MTD_CFI=y
77CONFIG_MTD_JEDECPROBE=y 77CONFIG_MTD_JEDECPROBE=y
78CONFIG_MTD_CFI_INTELEXT=y 78CONFIG_MTD_CFI_INTELEXT=y
79CONFIG_MTD_CFI_AMDSTD=y 79CONFIG_MTD_CFI_AMDSTD=y
80CONFIG_MTD_CFI_STAA=y 80CONFIG_MTD_CFI_STAA=y
81CONFIG_MTD_PHYSMAP_OF=y
81CONFIG_MTD_DATAFLASH=y 82CONFIG_MTD_DATAFLASH=y
82CONFIG_MTD_M25P80=y 83CONFIG_MTD_M25P80=y
83CONFIG_MTD_SST25L=y 84CONFIG_MTD_SST25L=y
@@ -88,6 +89,7 @@ CONFIG_MTD_UBI=y
88CONFIG_BLK_DEV_LOOP=y 89CONFIG_BLK_DEV_LOOP=y
89CONFIG_BLK_DEV_RAM=y 90CONFIG_BLK_DEV_RAM=y
90CONFIG_BLK_DEV_RAM_SIZE=65536 91CONFIG_BLK_DEV_RAM_SIZE=65536
92CONFIG_SRAM=y
91CONFIG_EEPROM_AT24=y 93CONFIG_EEPROM_AT24=y
92CONFIG_EEPROM_AT25=y 94CONFIG_EEPROM_AT25=y
93# CONFIG_SCSI_PROC_FS is not set 95# CONFIG_SCSI_PROC_FS is not set
@@ -98,10 +100,11 @@ CONFIG_SCSI_LOGGING=y
98CONFIG_SCSI_SCAN_ASYNC=y 100CONFIG_SCSI_SCAN_ASYNC=y
99# CONFIG_SCSI_LOWLEVEL is not set 101# CONFIG_SCSI_LOWLEVEL is not set
100CONFIG_ATA=y 102CONFIG_ATA=y
103CONFIG_SATA_AHCI_PLATFORM=y
104CONFIG_AHCI_IMX=y
101CONFIG_PATA_IMX=y 105CONFIG_PATA_IMX=y
102CONFIG_NETDEVICES=y 106CONFIG_NETDEVICES=y
103# CONFIG_NET_VENDOR_BROADCOM is not set 107# CONFIG_NET_VENDOR_BROADCOM is not set
104# CONFIG_NET_VENDOR_CHELSIO is not set
105CONFIG_CS89x0=y 108CONFIG_CS89x0=y
106CONFIG_CS89x0_PLATFORM=y 109CONFIG_CS89x0_PLATFORM=y
107# CONFIG_NET_VENDOR_FARADAY is not set 110# CONFIG_NET_VENDOR_FARADAY is not set
@@ -115,7 +118,7 @@ CONFIG_SMC91X=y
115CONFIG_SMC911X=y 118CONFIG_SMC911X=y
116CONFIG_SMSC911X=y 119CONFIG_SMSC911X=y
117# CONFIG_NET_VENDOR_STMICRO is not set 120# CONFIG_NET_VENDOR_STMICRO is not set
118# CONFIG_WLAN is not set 121CONFIG_BRCMFMAC=m
119# CONFIG_INPUT_MOUSEDEV_PSAUX is not set 122# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
120CONFIG_INPUT_EVDEV=y 123CONFIG_INPUT_EVDEV=y
121CONFIG_INPUT_EVBUG=m 124CONFIG_INPUT_EVBUG=m
@@ -124,6 +127,7 @@ CONFIG_KEYBOARD_IMX=y
124CONFIG_MOUSE_PS2=m 127CONFIG_MOUSE_PS2=m
125CONFIG_MOUSE_PS2_ELANTECH=y 128CONFIG_MOUSE_PS2_ELANTECH=y
126CONFIG_INPUT_TOUCHSCREEN=y 129CONFIG_INPUT_TOUCHSCREEN=y
130CONFIG_TOUCHSCREEN_EGALAX=y
127CONFIG_TOUCHSCREEN_MC13783=y 131CONFIG_TOUCHSCREEN_MC13783=y
128CONFIG_INPUT_MISC=y 132CONFIG_INPUT_MISC=y
129CONFIG_INPUT_MMA8450=y 133CONFIG_INPUT_MMA8450=y
@@ -133,13 +137,13 @@ CONFIG_VT_HW_CONSOLE_BINDING=y
133# CONFIG_DEVKMEM is not set 137# CONFIG_DEVKMEM is not set
134CONFIG_SERIAL_IMX=y 138CONFIG_SERIAL_IMX=y
135CONFIG_SERIAL_IMX_CONSOLE=y 139CONFIG_SERIAL_IMX_CONSOLE=y
140CONFIG_SERIAL_FSL_LPUART=y
141CONFIG_SERIAL_FSL_LPUART_CONSOLE=y
136CONFIG_HW_RANDOM=y 142CONFIG_HW_RANDOM=y
137CONFIG_HW_RANDOM_MXC_RNGA=y 143CONFIG_HW_RANDOM_MXC_RNGA=y
138CONFIG_I2C=y
139# CONFIG_I2C_COMPAT is not set 144# CONFIG_I2C_COMPAT is not set
140CONFIG_I2C_CHARDEV=y 145CONFIG_I2C_CHARDEV=y
141# CONFIG_I2C_HELPER_AUTO is not set 146# CONFIG_I2C_HELPER_AUTO is not set
142CONFIG_I2C_ALGOBIT=m
143CONFIG_I2C_ALGOPCF=m 147CONFIG_I2C_ALGOPCF=m
144CONFIG_I2C_ALGOPCA=m 148CONFIG_I2C_ALGOPCA=m
145CONFIG_I2C_IMX=y 149CONFIG_I2C_IMX=y
@@ -155,30 +159,26 @@ CONFIG_MFD_MC13XXX_SPI=y
155CONFIG_MFD_MC13XXX_I2C=y 159CONFIG_MFD_MC13XXX_I2C=y
156CONFIG_REGULATOR=y 160CONFIG_REGULATOR=y
157CONFIG_REGULATOR_FIXED_VOLTAGE=y 161CONFIG_REGULATOR_FIXED_VOLTAGE=y
158CONFIG_REGULATOR_DA9052=y
159CONFIG_REGULATOR_ANATOP=y 162CONFIG_REGULATOR_ANATOP=y
163CONFIG_REGULATOR_DA9052=y
160CONFIG_REGULATOR_MC13783=y 164CONFIG_REGULATOR_MC13783=y
161CONFIG_REGULATOR_MC13892=y 165CONFIG_REGULATOR_MC13892=y
162CONFIG_MEDIA_SUPPORT=y 166CONFIG_MEDIA_SUPPORT=y
163CONFIG_VIDEO_DEV=y
164CONFIG_V4L_PLATFORM_DRIVERS=y
165CONFIG_MEDIA_CAMERA_SUPPORT=y 167CONFIG_MEDIA_CAMERA_SUPPORT=y
168CONFIG_V4L_PLATFORM_DRIVERS=y
166CONFIG_SOC_CAMERA=y 169CONFIG_SOC_CAMERA=y
170CONFIG_VIDEO_MX3=y
171CONFIG_V4L_MEM2MEM_DRIVERS=y
172CONFIG_VIDEO_CODA=y
167CONFIG_SOC_CAMERA_OV2640=y 173CONFIG_SOC_CAMERA_OV2640=y
168CONFIG_DRM=y 174CONFIG_DRM=y
169CONFIG_VIDEO_MX3=y
170CONFIG_FB=y
171CONFIG_LCD_PLATFORM=y
172CONFIG_BACKLIGHT_LCD_SUPPORT=y 175CONFIG_BACKLIGHT_LCD_SUPPORT=y
173CONFIG_LCD_CLASS_DEVICE=y 176CONFIG_LCD_CLASS_DEVICE=y
174CONFIG_LCD_L4F00242T03=y 177CONFIG_LCD_L4F00242T03=y
178CONFIG_LCD_PLATFORM=y
175CONFIG_BACKLIGHT_CLASS_DEVICE=y 179CONFIG_BACKLIGHT_CLASS_DEVICE=y
176CONFIG_BACKLIGHT_PWM=y 180CONFIG_BACKLIGHT_PWM=y
177CONFIG_FRAMEBUFFER_CONSOLE=y 181CONFIG_FRAMEBUFFER_CONSOLE=y
178CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
179CONFIG_FONTS=y
180CONFIG_FONT_8x8=y
181CONFIG_FONT_8x16=y
182CONFIG_LOGO=y 182CONFIG_LOGO=y
183CONFIG_SOUND=y 183CONFIG_SOUND=y
184CONFIG_SND=y 184CONFIG_SND=y
@@ -192,11 +192,12 @@ CONFIG_SND_SOC_IMX_MC13783=y
192CONFIG_USB=y 192CONFIG_USB=y
193CONFIG_USB_EHCI_HCD=y 193CONFIG_USB_EHCI_HCD=y
194CONFIG_USB_EHCI_MXC=y 194CONFIG_USB_EHCI_MXC=y
195CONFIG_USB_STORAGE=y
195CONFIG_USB_CHIPIDEA=y 196CONFIG_USB_CHIPIDEA=y
196CONFIG_USB_CHIPIDEA_HOST=y 197CONFIG_USB_CHIPIDEA_HOST=y
197CONFIG_USB_PHY=y 198CONFIG_USB_PHY=y
199CONFIG_NOP_USB_XCEIV=y
198CONFIG_USB_MXS_PHY=y 200CONFIG_USB_MXS_PHY=y
199CONFIG_USB_STORAGE=y
200CONFIG_MMC=y 201CONFIG_MMC=y
201CONFIG_MMC_SDHCI=y 202CONFIG_MMC_SDHCI=y
202CONFIG_MMC_SDHCI_PLTFM=y 203CONFIG_MMC_SDHCI_PLTFM=y
@@ -213,9 +214,10 @@ CONFIG_IMX_SDMA=y
213CONFIG_MXS_DMA=y 214CONFIG_MXS_DMA=y
214CONFIG_STAGING=y 215CONFIG_STAGING=y
215CONFIG_DRM_IMX=y 216CONFIG_DRM_IMX=y
216CONFIG_DRM_IMX_TVE=y
217CONFIG_DRM_IMX_FB_HELPER=y 217CONFIG_DRM_IMX_FB_HELPER=y
218CONFIG_DRM_IMX_PARALLEL_DISPLAY=y 218CONFIG_DRM_IMX_PARALLEL_DISPLAY=y
219CONFIG_DRM_IMX_TVE=y
220CONFIG_DRM_IMX_LDB=y
219CONFIG_DRM_IMX_IPUV3_CORE=y 221CONFIG_DRM_IMX_IPUV3_CORE=y
220CONFIG_DRM_IMX_IPUV3=y 222CONFIG_DRM_IMX_IPUV3=y
221CONFIG_COMMON_CLK_DEBUG=y 223CONFIG_COMMON_CLK_DEBUG=y
@@ -269,3 +271,6 @@ CONFIG_CRC_CCITT=m
269CONFIG_CRC_T10DIF=y 271CONFIG_CRC_T10DIF=y
270CONFIG_CRC7=m 272CONFIG_CRC7=m
271CONFIG_LIBCRC32C=m 273CONFIG_LIBCRC32C=m
274CONFIG_FONTS=y
275CONFIG_FONT_8x8=y
276CONFIG_FONT_8x16=y
diff --git a/arch/arm/configs/keystone_defconfig b/arch/arm/configs/keystone_defconfig
index 62e968cac9dc..1f36b823905f 100644
--- a/arch/arm/configs/keystone_defconfig
+++ b/arch/arm/configs/keystone_defconfig
@@ -104,6 +104,7 @@ CONFIG_IP_SCTP=y
104CONFIG_VLAN_8021Q=y 104CONFIG_VLAN_8021Q=y
105CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" 105CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
106CONFIG_CMA=y 106CONFIG_CMA=y
107CONFIG_DMA_CMA=y
107CONFIG_MTD=y 108CONFIG_MTD=y
108CONFIG_MTD_CMDLINE_PARTS=y 109CONFIG_MTD_CMDLINE_PARTS=y
109CONFIG_MTD_BLOCK=y 110CONFIG_MTD_BLOCK=y
diff --git a/arch/arm/configs/kirkwood_defconfig b/arch/arm/configs/kirkwood_defconfig
index 0f2aa61911a3..0ae0eaebf6b2 100644
--- a/arch/arm/configs/kirkwood_defconfig
+++ b/arch/arm/configs/kirkwood_defconfig
@@ -10,49 +10,18 @@ CONFIG_MODULE_UNLOAD=y
10# CONFIG_BLK_DEV_BSG is not set 10# CONFIG_BLK_DEV_BSG is not set
11CONFIG_ARCH_KIRKWOOD=y 11CONFIG_ARCH_KIRKWOOD=y
12CONFIG_MACH_D2NET_V2=y 12CONFIG_MACH_D2NET_V2=y
13CONFIG_MACH_DB88F6281_BP=y
14CONFIG_MACH_DOCKSTAR=y
15CONFIG_MACH_ESATA_SHEEVAPLUG=y
16CONFIG_MACH_GURUPLUG=y
17CONFIG_MACH_INETSPACE_V2=y
18CONFIG_MACH_MV88F6281GTW_GE=y
19CONFIG_MACH_NET2BIG_V2=y 13CONFIG_MACH_NET2BIG_V2=y
20CONFIG_MACH_NET5BIG_V2=y 14CONFIG_MACH_NET5BIG_V2=y
21CONFIG_MACH_NETSPACE_MAX_V2=y
22CONFIG_MACH_NETSPACE_V2=y
23CONFIG_MACH_OPENRD_BASE=y 15CONFIG_MACH_OPENRD_BASE=y
24CONFIG_MACH_OPENRD_CLIENT=y 16CONFIG_MACH_OPENRD_CLIENT=y
25CONFIG_MACH_OPENRD_ULTIMATE=y 17CONFIG_MACH_OPENRD_ULTIMATE=y
26CONFIG_MACH_RD88F6192_NAS=y 18CONFIG_MACH_RD88F6192_NAS=y
27CONFIG_MACH_RD88F6281=y 19CONFIG_MACH_RD88F6281=y
28CONFIG_MACH_SHEEVAPLUG=y
29CONFIG_MACH_T5325=y 20CONFIG_MACH_T5325=y
30CONFIG_MACH_TS219=y 21CONFIG_MACH_TS219=y
31CONFIG_MACH_TS41X=y 22CONFIG_MACH_TS41X=y
32CONFIG_MACH_CLOUDBOX_DT=y 23CONFIG_ARCH_KIRKWOOD_DT=y
33CONFIG_MACH_DB88F628X_BP_DT=y 24CONFIG_MACH_MV88F6281GTW_GE_DT=y
34CONFIG_MACH_DLINK_KIRKWOOD_DT=y
35CONFIG_MACH_DOCKSTAR_DT=y
36CONFIG_MACH_DREAMPLUG_DT=y
37CONFIG_MACH_GOFLEXNET_DT=y
38CONFIG_MACH_GURUPLUG_DT=y
39CONFIG_MACH_IB62X0_DT=y
40CONFIG_MACH_ICONNECT_DT=y
41CONFIG_MACH_INETSPACE_V2_DT=y
42CONFIG_MACH_IOMEGA_IX2_200_DT=y
43CONFIG_MACH_KM_KIRKWOOD_DT=y
44CONFIG_MACH_LSXL_DT=y
45CONFIG_MACH_MPLCEC4_DT=y
46CONFIG_MACH_NETSPACE_LITE_V2_DT=y
47CONFIG_MACH_NETSPACE_MAX_V2_DT=y
48CONFIG_MACH_NETSPACE_MINI_V2_DT=y
49CONFIG_MACH_NETSPACE_V2_DT=y
50CONFIG_MACH_NSA310_DT=y
51CONFIG_MACH_OPENBLOCKS_A6_DT=y
52CONFIG_MACH_READYNAS_DT=y
53CONFIG_MACH_SHEEVAPLUG_DT=y
54CONFIG_MACH_TOPKICK_DT=y
55CONFIG_MACH_TS219_DT=y
56# CONFIG_CPU_FEROCEON_OLD_ID is not set 25# CONFIG_CPU_FEROCEON_OLD_ID is not set
57CONFIG_PCI_MVEBU=y 26CONFIG_PCI_MVEBU=y
58CONFIG_PREEMPT=y 27CONFIG_PREEMPT=y
@@ -92,6 +61,7 @@ CONFIG_MTD_M25P80=y
92CONFIG_MTD_NAND=y 61CONFIG_MTD_NAND=y
93CONFIG_MTD_NAND_ORION=y 62CONFIG_MTD_NAND_ORION=y
94CONFIG_BLK_DEV_LOOP=y 63CONFIG_BLK_DEV_LOOP=y
64CONFIG_EEPROM_AT24=y
95# CONFIG_SCSI_PROC_FS is not set 65# CONFIG_SCSI_PROC_FS is not set
96CONFIG_BLK_DEV_SD=y 66CONFIG_BLK_DEV_SD=y
97CONFIG_BLK_DEV_SR=m 67CONFIG_BLK_DEV_SR=m
@@ -100,9 +70,9 @@ CONFIG_ATA=y
100CONFIG_SATA_AHCI=y 70CONFIG_SATA_AHCI=y
101CONFIG_SATA_MV=y 71CONFIG_SATA_MV=y
102CONFIG_NETDEVICES=y 72CONFIG_NETDEVICES=y
103CONFIG_MII=y
104CONFIG_NET_DSA_MV88E6123_61_65=y 73CONFIG_NET_DSA_MV88E6123_61_65=y
105CONFIG_MV643XX_ETH=y 74CONFIG_MV643XX_ETH=y
75CONFIG_R8169=y
106CONFIG_MARVELL_PHY=y 76CONFIG_MARVELL_PHY=y
107CONFIG_LIBERTAS=y 77CONFIG_LIBERTAS=y
108CONFIG_LIBERTAS_SDIO=y 78CONFIG_LIBERTAS_SDIO=y
@@ -123,9 +93,11 @@ CONFIG_I2C_MV64XXX=y
123CONFIG_SPI=y 93CONFIG_SPI=y
124CONFIG_SPI_ORION=y 94CONFIG_SPI_ORION=y
125CONFIG_GPIO_SYSFS=y 95CONFIG_GPIO_SYSFS=y
126# CONFIG_HWMON is not set 96CONFIG_SENSORS_ADT7475=y
97CONFIG_SENSORS_LM63=y
98CONFIG_SENSORS_LM75=y
99CONFIG_SENSORS_LM85=y
127CONFIG_THERMAL=y 100CONFIG_THERMAL=y
128CONFIG_KIRKWOOD_THERMAL=y
129CONFIG_WATCHDOG=y 101CONFIG_WATCHDOG=y
130CONFIG_ORION_WATCHDOG=y 102CONFIG_ORION_WATCHDOG=y
131CONFIG_HID_DRAGONRISE=y 103CONFIG_HID_DRAGONRISE=y
@@ -164,6 +136,8 @@ CONFIG_LEDS_TRIGGER_TIMER=y
164CONFIG_LEDS_TRIGGER_HEARTBEAT=y 136CONFIG_LEDS_TRIGGER_HEARTBEAT=y
165CONFIG_LEDS_TRIGGER_DEFAULT_ON=y 137CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
166CONFIG_RTC_CLASS=y 138CONFIG_RTC_CLASS=y
139CONFIG_RTC_DRV_RS5C372=y
140CONFIG_RTC_DRV_PCF8563=y
167CONFIG_RTC_DRV_S35390A=y 141CONFIG_RTC_DRV_S35390A=y
168CONFIG_RTC_DRV_MV=y 142CONFIG_RTC_DRV_MV=y
169CONFIG_DMADEVICES=y 143CONFIG_DMADEVICES=y
@@ -171,6 +145,7 @@ CONFIG_MV_XOR=y
171CONFIG_EXT2_FS=y 145CONFIG_EXT2_FS=y
172CONFIG_EXT3_FS=y 146CONFIG_EXT3_FS=y
173# CONFIG_EXT3_FS_XATTR is not set 147# CONFIG_EXT3_FS_XATTR is not set
148CONFIG_EXT4_FS=y
174CONFIG_ISO9660_FS=m 149CONFIG_ISO9660_FS=m
175CONFIG_JOLIET=y 150CONFIG_JOLIET=y
176CONFIG_UDF_FS=m 151CONFIG_UDF_FS=m
@@ -186,12 +161,12 @@ CONFIG_NLS_CODEPAGE_850=y
186CONFIG_NLS_ISO8859_1=y 161CONFIG_NLS_ISO8859_1=y
187CONFIG_NLS_ISO8859_2=y 162CONFIG_NLS_ISO8859_2=y
188CONFIG_NLS_UTF8=y 163CONFIG_NLS_UTF8=y
189CONFIG_MAGIC_SYSRQ=y 164CONFIG_DEBUG_INFO=y
190CONFIG_DEBUG_FS=y 165CONFIG_DEBUG_FS=y
166CONFIG_MAGIC_SYSRQ=y
191CONFIG_DEBUG_KERNEL=y 167CONFIG_DEBUG_KERNEL=y
192# CONFIG_SCHED_DEBUG is not set 168# CONFIG_SCHED_DEBUG is not set
193# CONFIG_DEBUG_PREEMPT is not set 169# CONFIG_DEBUG_PREEMPT is not set
194CONFIG_DEBUG_INFO=y
195# CONFIG_FTRACE is not set 170# CONFIG_FTRACE is not set
196CONFIG_DEBUG_USER=y 171CONFIG_DEBUG_USER=y
197CONFIG_DEBUG_LL=y 172CONFIG_DEBUG_LL=y
diff --git a/arch/arm/configs/kota2_defconfig b/arch/arm/configs/lager_defconfig
index 57ad3d47de70..e777ef22b801 100644
--- a/arch/arm/configs/kota2_defconfig
+++ b/arch/arm/configs/lager_defconfig
@@ -1,52 +1,38 @@
1# CONFIG_ARM_PATCH_PHYS_VIRT is not set
2CONFIG_EXPERIMENTAL=y
3CONFIG_SYSVIPC=y 1CONFIG_SYSVIPC=y
2CONFIG_NO_HZ=y
4CONFIG_IKCONFIG=y 3CONFIG_IKCONFIG=y
5CONFIG_IKCONFIG_PROC=y 4CONFIG_IKCONFIG_PROC=y
6CONFIG_LOG_BUF_SHIFT=16 5CONFIG_LOG_BUF_SHIFT=16
7CONFIG_CGROUPS=y 6CONFIG_CC_OPTIMIZE_FOR_SIZE=y
8CONFIG_CPUSETS=y
9CONFIG_NAMESPACES=y
10# CONFIG_UTS_NS is not set
11# CONFIG_IPC_NS is not set
12# CONFIG_USER_NS is not set
13# CONFIG_PID_NS is not set
14CONFIG_SYSCTL_SYSCALL=y 7CONFIG_SYSCTL_SYSCALL=y
15CONFIG_EMBEDDED=y 8CONFIG_EMBEDDED=y
9CONFIG_PERF_EVENTS=y
16CONFIG_SLAB=y 10CONFIG_SLAB=y
11# CONFIG_LBDAF is not set
17# CONFIG_BLK_DEV_BSG is not set 12# CONFIG_BLK_DEV_BSG is not set
18# CONFIG_IOSCHED_DEADLINE is not set 13# CONFIG_IOSCHED_DEADLINE is not set
19# CONFIG_IOSCHED_CFQ is not set 14# CONFIG_IOSCHED_CFQ is not set
20CONFIG_ARCH_SHMOBILE=y 15CONFIG_ARCH_SHMOBILE=y
21CONFIG_KEYBOARD_GPIO_POLLED=y 16CONFIG_ARCH_R8A7790=y
22CONFIG_ARCH_SH73A0=y 17CONFIG_MACH_LAGER=y
23CONFIG_MACH_KOTA2=y
24CONFIG_MEMORY_SIZE=0x1e000000
25# CONFIG_SH_TIMER_TMU is not set 18# CONFIG_SH_TIMER_TMU is not set
26# CONFIG_SWP_EMULATE is not set 19# CONFIG_EM_TIMER_STI is not set
27CONFIG_CPU_BPREDICT_DISABLE=y 20CONFIG_ARM_ERRATA_430973=y
21CONFIG_ARM_ERRATA_458693=y
28CONFIG_ARM_ERRATA_460075=y 22CONFIG_ARM_ERRATA_460075=y
29CONFIG_ARM_ERRATA_742230=y
30CONFIG_ARM_ERRATA_742231=y
31CONFIG_PL310_ERRATA_588369=y
32CONFIG_ARM_ERRATA_720789=y
33CONFIG_PL310_ERRATA_727915=y
34CONFIG_ARM_ERRATA_743622=y 23CONFIG_ARM_ERRATA_743622=y
35CONFIG_ARM_ERRATA_751472=y
36CONFIG_PL310_ERRATA_753970=y
37CONFIG_ARM_ERRATA_754322=y 24CONFIG_ARM_ERRATA_754322=y
38CONFIG_PL310_ERRATA_769419=y 25CONFIG_HAVE_ARM_ARCH_TIMER=y
39CONFIG_NO_HZ=y
40CONFIG_SMP=y
41CONFIG_AEABI=y 26CONFIG_AEABI=y
42# CONFIG_OABI_COMPAT is not set 27# CONFIG_OABI_COMPAT is not set
43CONFIG_HIGHMEM=y 28CONFIG_FORCE_MAX_ZONEORDER=13
44CONFIG_ZBOOT_ROM_TEXT=0x0 29CONFIG_ZBOOT_ROM_TEXT=0x0
45CONFIG_ZBOOT_ROM_BSS=0x0 30CONFIG_ZBOOT_ROM_BSS=0x0
46CONFIG_CMDLINE="console=ttySC2,115200 earlyprintk=sh-sci.2,115200 ignore_loglevel" 31CONFIG_ARM_APPENDED_DTB=y
47CONFIG_CMDLINE_FORCE=y
48CONFIG_KEXEC=y 32CONFIG_KEXEC=y
49CONFIG_CPU_IDLE=y 33CONFIG_AUTO_ZRELADDR=y
34CONFIG_VFP=y
35CONFIG_NEON=y
50# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set 36# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
51CONFIG_PM_RUNTIME=y 37CONFIG_PM_RUNTIME=y
52CONFIG_NET=y 38CONFIG_NET=y
@@ -61,47 +47,48 @@ CONFIG_IP_PNP_DHCP=y
61# CONFIG_INET_LRO is not set 47# CONFIG_INET_LRO is not set
62# CONFIG_INET_DIAG is not set 48# CONFIG_INET_DIAG is not set
63# CONFIG_IPV6 is not set 49# CONFIG_IPV6 is not set
64CONFIG_CFG80211=y 50# CONFIG_WIRELESS is not set
65CONFIG_WIRELESS_EXT_SYSFS=y
66CONFIG_MAC80211=y
67CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" 51CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
68# CONFIG_BLK_DEV is not set
69CONFIG_NETDEVICES=y 52CONFIG_NETDEVICES=y
53# CONFIG_NET_CORE is not set
54# CONFIG_NET_VENDOR_ARC is not set
55# CONFIG_NET_CADENCE is not set
70# CONFIG_NET_VENDOR_BROADCOM is not set 56# CONFIG_NET_VENDOR_BROADCOM is not set
71# CONFIG_NET_VENDOR_CHELSIO is not set 57# CONFIG_NET_VENDOR_CIRRUS is not set
72# CONFIG_NET_VENDOR_FARADAY is not set 58# CONFIG_NET_VENDOR_FARADAY is not set
73# CONFIG_NET_VENDOR_INTEL is not set 59# CONFIG_NET_VENDOR_INTEL is not set
74# CONFIG_NET_VENDOR_MARVELL is not set 60# CONFIG_NET_VENDOR_MARVELL is not set
75# CONFIG_NET_VENDOR_MICREL is not set 61# CONFIG_NET_VENDOR_MICREL is not set
76# CONFIG_NET_VENDOR_NATSEMI is not set 62# CONFIG_NET_VENDOR_NATSEMI is not set
63CONFIG_SH_ETH=y
77# CONFIG_NET_VENDOR_SEEQ is not set 64# CONFIG_NET_VENDOR_SEEQ is not set
78CONFIG_SMSC911X=y 65# CONFIG_NET_VENDOR_SMSC is not set
79# CONFIG_NET_VENDOR_STMICRO is not set 66# CONFIG_NET_VENDOR_STMICRO is not set
80CONFIG_B43=y 67# CONFIG_NET_VENDOR_VIA is not set
81CONFIG_B43_PHY_N=y 68# CONFIG_NET_VENDOR_WIZNET is not set
82CONFIG_B43_DEBUG=y 69# CONFIG_WLAN is not set
83CONFIG_INPUT_SPARSEKMAP=y
84# CONFIG_INPUT_MOUSEDEV_PSAUX is not set 70# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
85CONFIG_INPUT_EVDEV=y 71CONFIG_INPUT_EVDEV=y
86# CONFIG_KEYBOARD_ATKBD is not set 72# CONFIG_KEYBOARD_ATKBD is not set
87CONFIG_KEYBOARD_GPIO=y 73CONFIG_KEYBOARD_GPIO=y
88CONFIG_KEYBOARD_SH_KEYSC=y
89# CONFIG_INPUT_MOUSE is not set 74# CONFIG_INPUT_MOUSE is not set
75# CONFIG_SERIO is not set
90# CONFIG_LEGACY_PTYS is not set 76# CONFIG_LEGACY_PTYS is not set
91CONFIG_SERIAL_SH_SCI=y 77CONFIG_SERIAL_SH_SCI=y
92CONFIG_SERIAL_SH_SCI_NR_UARTS=9 78CONFIG_SERIAL_SH_SCI_NR_UARTS=10
93CONFIG_SERIAL_SH_SCI_CONSOLE=y 79CONFIG_SERIAL_SH_SCI_CONSOLE=y
94# CONFIG_HW_RANDOM is not set 80# CONFIG_HW_RANDOM is not set
81CONFIG_I2C=y
82CONFIG_I2C_GPIO=y
95CONFIG_I2C_SH_MOBILE=y 83CONFIG_I2C_SH_MOBILE=y
84CONFIG_GPIO_SH_PFC=y
85CONFIG_GPIOLIB=y
86CONFIG_GPIO_RCAR=y
96# CONFIG_HWMON is not set 87# CONFIG_HWMON is not set
97CONFIG_BCMA=y 88CONFIG_THERMAL=y
98CONFIG_BCMA_DEBUG=y 89CONFIG_RCAR_THERMAL=y
99CONFIG_FB=y 90CONFIG_REGULATOR=y
100CONFIG_FB_SH_MOBILE_LCDC=y 91CONFIG_REGULATOR_FIXED_VOLTAGE=y
101CONFIG_LCD_PLATFORM=y
102CONFIG_FRAMEBUFFER_CONSOLE=y
103CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
104# CONFIG_HID_SUPPORT is not set
105# CONFIG_USB_SUPPORT is not set 92# CONFIG_USB_SUPPORT is not set
106CONFIG_MMC=y 93CONFIG_MMC=y
107CONFIG_MMC_SDHI=y 94CONFIG_MMC_SDHI=y
@@ -109,13 +96,25 @@ CONFIG_MMC_SH_MMCIF=y
109CONFIG_NEW_LEDS=y 96CONFIG_NEW_LEDS=y
110CONFIG_LEDS_CLASS=y 97CONFIG_LEDS_CLASS=y
111CONFIG_LEDS_GPIO=y 98CONFIG_LEDS_GPIO=y
112CONFIG_LEDS_RENESAS_TPU=y 99CONFIG_RTC_CLASS=y
113CONFIG_LEDS_TRIGGERS=y 100CONFIG_DMADEVICES=y
101CONFIG_SH_DMAE=y
102# CONFIG_IOMMU_SUPPORT is not set
114# CONFIG_DNOTIFY is not set 103# CONFIG_DNOTIFY is not set
104CONFIG_MSDOS_FS=y
105CONFIG_VFAT_FS=y
115CONFIG_TMPFS=y 106CONFIG_TMPFS=y
107CONFIG_CONFIGFS_FS=y
116# CONFIG_MISC_FILESYSTEMS is not set 108# CONFIG_MISC_FILESYSTEMS is not set
117CONFIG_MAGIC_SYSRQ=y 109CONFIG_NFS_FS=y
118CONFIG_DEBUG_INFO=y 110CONFIG_NFS_V3_ACL=y
119CONFIG_DEBUG_INFO_REDUCED=y 111CONFIG_NFS_V4=y
120# CONFIG_FTRACE is not set 112CONFIG_NFS_V4_1=y
121CONFIG_DEBUG_USER=y 113CONFIG_ROOT_NFS=y
114CONFIG_NLS_CODEPAGE_437=y
115CONFIG_NLS_ISO8859_1=y
116# CONFIG_ENABLE_WARN_DEPRECATED is not set
117# CONFIG_ENABLE_MUST_CHECK is not set
118# CONFIG_ARM_UNWIND is not set
119# CONFIG_CRYPTO_ANSI_CPRNG is not set
120# CONFIG_CRYPTO_HW is not set
diff --git a/arch/arm/configs/marzen_defconfig b/arch/arm/configs/marzen_defconfig
index 494e70aeb9e1..000e9205b2b9 100644
--- a/arch/arm/configs/marzen_defconfig
+++ b/arch/arm/configs/marzen_defconfig
@@ -29,6 +29,7 @@ CONFIG_AEABI=y
29CONFIG_HIGHMEM=y 29CONFIG_HIGHMEM=y
30CONFIG_ZBOOT_ROM_TEXT=0x0 30CONFIG_ZBOOT_ROM_TEXT=0x0
31CONFIG_ZBOOT_ROM_BSS=0x0 31CONFIG_ZBOOT_ROM_BSS=0x0
32CONFIG_ARM_APPENDED_DTB=y
32CONFIG_CMDLINE="console=ttySC2,115200 earlyprintk=sh-sci.2,115200 ignore_loglevel root=/dev/nfs ip=on" 33CONFIG_CMDLINE="console=ttySC2,115200 earlyprintk=sh-sci.2,115200 ignore_loglevel root=/dev/nfs ip=on"
33CONFIG_CMDLINE_FORCE=y 34CONFIG_CMDLINE_FORCE=y
34CONFIG_KEXEC=y 35CONFIG_KEXEC=y
@@ -84,6 +85,13 @@ CONFIG_GPIO_RCAR=y
84CONFIG_THERMAL=y 85CONFIG_THERMAL=y
85CONFIG_RCAR_THERMAL=y 86CONFIG_RCAR_THERMAL=y
86CONFIG_SSB=y 87CONFIG_SSB=y
88CONFIG_MEDIA_SUPPORT=y
89CONFIG_MEDIA_CAMERA_SUPPORT=y
90CONFIG_V4L_PLATFORM_DRIVERS=y
91CONFIG_SOC_CAMERA=y
92CONFIG_VIDEO_RCAR_VIN=y
93# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set
94CONFIG_VIDEO_ADV7180=y
87CONFIG_USB=y 95CONFIG_USB=y
88CONFIG_USB_RCAR_PHY=y 96CONFIG_USB_RCAR_PHY=y
89CONFIG_MMC=y 97CONFIG_MMC=y
diff --git a/arch/arm/configs/multi_v7_defconfig b/arch/arm/configs/multi_v7_defconfig
index 6e572c64cf5a..f3935b46df29 100644
--- a/arch/arm/configs/multi_v7_defconfig
+++ b/arch/arm/configs/multi_v7_defconfig
@@ -36,6 +36,7 @@ CONFIG_ARCH_TEGRA_114_SOC=y
36CONFIG_TEGRA_PCI=y 36CONFIG_TEGRA_PCI=y
37CONFIG_TEGRA_EMC_SCALING_ENABLE=y 37CONFIG_TEGRA_EMC_SCALING_ENABLE=y
38CONFIG_ARCH_U8500=y 38CONFIG_ARCH_U8500=y
39CONFIG_MACH_HREFV60=y
39CONFIG_MACH_SNOWBALL=y 40CONFIG_MACH_SNOWBALL=y
40CONFIG_MACH_UX500_DT=y 41CONFIG_MACH_UX500_DT=y
41CONFIG_ARCH_VEXPRESS=y 42CONFIG_ARCH_VEXPRESS=y
@@ -46,6 +47,7 @@ CONFIG_ARCH_ZYNQ=y
46CONFIG_SMP=y 47CONFIG_SMP=y
47CONFIG_HIGHPTE=y 48CONFIG_HIGHPTE=y
48CONFIG_ARM_APPENDED_DTB=y 49CONFIG_ARM_APPENDED_DTB=y
50CONFIG_ARM_ATAG_DTB_COMPAT=y
49CONFIG_NET=y 51CONFIG_NET=y
50CONFIG_UNIX=y 52CONFIG_UNIX=y
51CONFIG_INET=y 53CONFIG_INET=y
diff --git a/arch/arm/configs/mvebu_defconfig b/arch/arm/configs/mvebu_defconfig
index 731814e2c189..594d706b641f 100644
--- a/arch/arm/configs/mvebu_defconfig
+++ b/arch/arm/configs/mvebu_defconfig
@@ -39,6 +39,8 @@ CONFIG_MVNETA=y
39CONFIG_MARVELL_PHY=y 39CONFIG_MARVELL_PHY=y
40CONFIG_MWIFIEX=y 40CONFIG_MWIFIEX=y
41CONFIG_MWIFIEX_SDIO=y 41CONFIG_MWIFIEX_SDIO=y
42CONFIG_INPUT_EVDEV=y
43CONFIG_KEYBOARD_GPIO=y
42CONFIG_SERIAL_8250=y 44CONFIG_SERIAL_8250=y
43CONFIG_SERIAL_8250_CONSOLE=y 45CONFIG_SERIAL_8250_CONSOLE=y
44CONFIG_I2C=y 46CONFIG_I2C=y
diff --git a/arch/arm/configs/mxs_defconfig b/arch/arm/configs/mxs_defconfig
index 1d6d8fb7f4a1..4555c025629a 100644
--- a/arch/arm/configs/mxs_defconfig
+++ b/arch/arm/configs/mxs_defconfig
@@ -1,4 +1,3 @@
1CONFIG_EXPERIMENTAL=y
2CONFIG_SYSVIPC=y 1CONFIG_SYSVIPC=y
3CONFIG_NO_HZ=y 2CONFIG_NO_HZ=y
4CONFIG_HIGH_RES_TIMERS=y 3CONFIG_HIGH_RES_TIMERS=y
@@ -27,7 +26,6 @@ CONFIG_ARCH_MXS=y
27# CONFIG_ARM_THUMB is not set 26# CONFIG_ARM_THUMB is not set
28CONFIG_PREEMPT_VOLUNTARY=y 27CONFIG_PREEMPT_VOLUNTARY=y
29CONFIG_AEABI=y 28CONFIG_AEABI=y
30CONFIG_AUTO_ZRELADDR=y
31CONFIG_FPE_NWFPE=y 29CONFIG_FPE_NWFPE=y
32CONFIG_NET=y 30CONFIG_NET=y
33CONFIG_PACKET=y 31CONFIG_PACKET=y
@@ -43,8 +41,6 @@ CONFIG_SYN_COOKIES=y
43# CONFIG_INET_DIAG is not set 41# CONFIG_INET_DIAG is not set
44# CONFIG_IPV6 is not set 42# CONFIG_IPV6 is not set
45CONFIG_CAN=m 43CONFIG_CAN=m
46CONFIG_CAN_RAW=m
47CONFIG_CAN_BCM=m
48CONFIG_CAN_FLEXCAN=m 44CONFIG_CAN_FLEXCAN=m
49# CONFIG_WIRELESS is not set 45# CONFIG_WIRELESS is not set
50CONFIG_DEVTMPFS=y 46CONFIG_DEVTMPFS=y
@@ -52,7 +48,6 @@ CONFIG_DEVTMPFS_MOUNT=y
52# CONFIG_FIRMWARE_IN_KERNEL is not set 48# CONFIG_FIRMWARE_IN_KERNEL is not set
53CONFIG_MTD=y 49CONFIG_MTD=y
54CONFIG_MTD_CMDLINE_PARTS=y 50CONFIG_MTD_CMDLINE_PARTS=y
55CONFIG_MTD_CHAR=y
56CONFIG_MTD_BLOCK=y 51CONFIG_MTD_BLOCK=y
57CONFIG_MTD_DATAFLASH=y 52CONFIG_MTD_DATAFLASH=y
58CONFIG_MTD_M25P80=y 53CONFIG_MTD_M25P80=y
@@ -67,12 +62,12 @@ CONFIG_SCSI=y
67CONFIG_BLK_DEV_SD=y 62CONFIG_BLK_DEV_SD=y
68CONFIG_NETDEVICES=y 63CONFIG_NETDEVICES=y
69CONFIG_ENC28J60=y 64CONFIG_ENC28J60=y
70CONFIG_USB_USBNET=y
71CONFIG_USB_NET_SMSC95XX=y
72CONFIG_SMSC_PHY=y 65CONFIG_SMSC_PHY=y
73CONFIG_ICPLUS_PHY=y 66CONFIG_ICPLUS_PHY=y
74CONFIG_REALTEK_PHY=y 67CONFIG_REALTEK_PHY=y
75CONFIG_MICREL_PHY=y 68CONFIG_MICREL_PHY=y
69CONFIG_USB_USBNET=y
70CONFIG_USB_NET_SMSC95XX=y
76# CONFIG_WLAN is not set 71# CONFIG_WLAN is not set
77# CONFIG_INPUT_MOUSEDEV_PSAUX is not set 72# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
78CONFIG_INPUT_EVDEV=y 73CONFIG_INPUT_EVDEV=y
@@ -110,7 +105,6 @@ CONFIG_LCD_CLASS_DEVICE=y
110CONFIG_BACKLIGHT_CLASS_DEVICE=y 105CONFIG_BACKLIGHT_CLASS_DEVICE=y
111CONFIG_BACKLIGHT_PWM=y 106CONFIG_BACKLIGHT_PWM=y
112CONFIG_FRAMEBUFFER_CONSOLE=y 107CONFIG_FRAMEBUFFER_CONSOLE=y
113CONFIG_FONTS=y
114CONFIG_LOGO=y 108CONFIG_LOGO=y
115CONFIG_SOUND=y 109CONFIG_SOUND=y
116CONFIG_SND=y 110CONFIG_SND=y
@@ -119,9 +113,9 @@ CONFIG_SND_MXS_SOC=y
119CONFIG_SND_SOC_MXS_SGTL5000=y 113CONFIG_SND_SOC_MXS_SGTL5000=y
120CONFIG_USB=y 114CONFIG_USB=y
121CONFIG_USB_EHCI_HCD=y 115CONFIG_USB_EHCI_HCD=y
116CONFIG_USB_STORAGE=y
122CONFIG_USB_CHIPIDEA=y 117CONFIG_USB_CHIPIDEA=y
123CONFIG_USB_CHIPIDEA_HOST=y 118CONFIG_USB_CHIPIDEA_HOST=y
124CONFIG_USB_STORAGE=y
125CONFIG_USB_PHY=y 119CONFIG_USB_PHY=y
126CONFIG_USB_MXS_PHY=y 120CONFIG_USB_MXS_PHY=y
127CONFIG_MMC=y 121CONFIG_MMC=y
@@ -143,9 +137,9 @@ CONFIG_DMADEVICES=y
143CONFIG_MXS_DMA=y 137CONFIG_MXS_DMA=y
144CONFIG_STAGING=y 138CONFIG_STAGING=y
145CONFIG_MXS_LRADC=y 139CONFIG_MXS_LRADC=y
146CONFIG_IIO_SYSFS_TRIGGER=y
147CONFIG_COMMON_CLK_DEBUG=y 140CONFIG_COMMON_CLK_DEBUG=y
148CONFIG_IIO=y 141CONFIG_IIO=y
142CONFIG_IIO_SYSFS_TRIGGER=y
149CONFIG_PWM=y 143CONFIG_PWM=y
150CONFIG_PWM_MXS=y 144CONFIG_PWM_MXS=y
151CONFIG_EXT2_FS=y 145CONFIG_EXT2_FS=y
@@ -173,14 +167,14 @@ CONFIG_NLS_CODEPAGE_850=y
173CONFIG_NLS_ISO8859_1=y 167CONFIG_NLS_ISO8859_1=y
174CONFIG_NLS_ISO8859_15=y 168CONFIG_NLS_ISO8859_15=y
175CONFIG_PRINTK_TIME=y 169CONFIG_PRINTK_TIME=y
170CONFIG_DEBUG_INFO=y
176CONFIG_FRAME_WARN=2048 171CONFIG_FRAME_WARN=2048
177CONFIG_MAGIC_SYSRQ=y
178CONFIG_UNUSED_SYMBOLS=y 172CONFIG_UNUSED_SYMBOLS=y
173CONFIG_MAGIC_SYSRQ=y
179CONFIG_DEBUG_KERNEL=y 174CONFIG_DEBUG_KERNEL=y
180CONFIG_LOCKUP_DETECTOR=y 175CONFIG_LOCKUP_DETECTOR=y
181CONFIG_TIMER_STATS=y 176CONFIG_TIMER_STATS=y
182CONFIG_PROVE_LOCKING=y 177CONFIG_PROVE_LOCKING=y
183CONFIG_DEBUG_INFO=y
184CONFIG_BLK_DEV_IO_TRACE=y 178CONFIG_BLK_DEV_IO_TRACE=y
185CONFIG_STRICT_DEVMEM=y 179CONFIG_STRICT_DEVMEM=y
186CONFIG_DEBUG_USER=y 180CONFIG_DEBUG_USER=y
@@ -188,3 +182,4 @@ CONFIG_DEBUG_USER=y
188# CONFIG_CRYPTO_HW is not set 182# CONFIG_CRYPTO_HW is not set
189CONFIG_CRC_ITU_T=m 183CONFIG_CRC_ITU_T=m
190CONFIG_CRC7=m 184CONFIG_CRC7=m
185CONFIG_FONTS=y
diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig
index 5339e6a4d639..254cf0539439 100644
--- a/arch/arm/configs/omap2plus_defconfig
+++ b/arch/arm/configs/omap2plus_defconfig
@@ -78,6 +78,7 @@ CONFIG_MAC80211_RC_PID=y
78CONFIG_MAC80211_RC_DEFAULT_PID=y 78CONFIG_MAC80211_RC_DEFAULT_PID=y
79CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" 79CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
80CONFIG_CMA=y 80CONFIG_CMA=y
81CONFIG_DMA_CMA=y
81CONFIG_CONNECTOR=y 82CONFIG_CONNECTOR=y
82CONFIG_DEVTMPFS=y 83CONFIG_DEVTMPFS=y
83CONFIG_DEVTMPFS_MOUNT=y 84CONFIG_DEVTMPFS_MOUNT=y
@@ -185,13 +186,11 @@ CONFIG_OMAP2_DSS_RFBI=y
185CONFIG_OMAP2_DSS_SDI=y 186CONFIG_OMAP2_DSS_SDI=y
186CONFIG_OMAP2_DSS_DSI=y 187CONFIG_OMAP2_DSS_DSI=y
187CONFIG_FB_OMAP2=m 188CONFIG_FB_OMAP2=m
188CONFIG_PANEL_GENERIC_DPI=m 189CONFIG_DISPLAY_ENCODER_TFP410=m
189CONFIG_PANEL_TFP410=m 190CONFIG_DISPLAY_ENCODER_TPD12S015=m
190CONFIG_PANEL_SHARP_LS037V7DW01=m 191CONFIG_DISPLAY_CONNECTOR_DVI=m
191CONFIG_PANEL_NEC_NL8048HL11_01B=m 192CONFIG_DISPLAY_CONNECTOR_HDMI=m
192CONFIG_PANEL_TAAL=m 193CONFIG_DISPLAY_PANEL_DPI=m
193CONFIG_PANEL_TPO_TD043MTEA1=m
194CONFIG_PANEL_ACX565AKM=m
195CONFIG_BACKLIGHT_LCD_SUPPORT=y 194CONFIG_BACKLIGHT_LCD_SUPPORT=y
196CONFIG_LCD_CLASS_DEVICE=y 195CONFIG_LCD_CLASS_DEVICE=y
197CONFIG_LCD_PLATFORM=y 196CONFIG_LCD_PLATFORM=y
@@ -306,3 +305,4 @@ CONFIG_TI_DAVINCI_MDIO=y
306CONFIG_TI_DAVINCI_CPDMA=y 305CONFIG_TI_DAVINCI_CPDMA=y
307CONFIG_TI_CPSW=y 306CONFIG_TI_CPSW=y
308CONFIG_AT803X_PHY=y 307CONFIG_AT803X_PHY=y
308CONFIG_SOC_DRA7XX=y
diff --git a/arch/arm/configs/tegra_defconfig b/arch/arm/configs/tegra_defconfig
index 1effb43dab80..ea042e80e54d 100644
--- a/arch/arm/configs/tegra_defconfig
+++ b/arch/arm/configs/tegra_defconfig
@@ -1,3 +1,4 @@
1CONFIG_SYSVIPC=y
1CONFIG_NO_HZ=y 2CONFIG_NO_HZ=y
2CONFIG_HIGH_RES_TIMERS=y 3CONFIG_HIGH_RES_TIMERS=y
3CONFIG_IKCONFIG=y 4CONFIG_IKCONFIG=y
@@ -26,8 +27,11 @@ CONFIG_ARCH_TEGRA=y
26CONFIG_ARCH_TEGRA_2x_SOC=y 27CONFIG_ARCH_TEGRA_2x_SOC=y
27CONFIG_ARCH_TEGRA_3x_SOC=y 28CONFIG_ARCH_TEGRA_3x_SOC=y
28CONFIG_ARCH_TEGRA_114_SOC=y 29CONFIG_ARCH_TEGRA_114_SOC=y
29CONFIG_TEGRA_PCI=y
30CONFIG_TEGRA_EMC_SCALING_ENABLE=y 30CONFIG_TEGRA_EMC_SCALING_ENABLE=y
31CONFIG_PCI=y
32CONFIG_PCI_MSI=y
33CONFIG_PCI_TEGRA=y
34CONFIG_PCIEPORTBUS=y
31CONFIG_SMP=y 35CONFIG_SMP=y
32CONFIG_PREEMPT=y 36CONFIG_PREEMPT=y
33CONFIG_AEABI=y 37CONFIG_AEABI=y
@@ -79,6 +83,7 @@ CONFIG_DEVTMPFS=y
79CONFIG_DEVTMPFS_MOUNT=y 83CONFIG_DEVTMPFS_MOUNT=y
80# CONFIG_FIRMWARE_IN_KERNEL is not set 84# CONFIG_FIRMWARE_IN_KERNEL is not set
81CONFIG_CMA=y 85CONFIG_CMA=y
86CONFIG_DMA_CMA=y
82CONFIG_MTD=y 87CONFIG_MTD=y
83CONFIG_MTD_M25P80=y 88CONFIG_MTD_M25P80=y
84CONFIG_PROC_DEVICETREE=y 89CONFIG_PROC_DEVICETREE=y
@@ -91,6 +96,7 @@ CONFIG_ISL29003=y
91CONFIG_SCSI=y 96CONFIG_SCSI=y
92CONFIG_BLK_DEV_SD=y 97CONFIG_BLK_DEV_SD=y
93CONFIG_BLK_DEV_SR=y 98CONFIG_BLK_DEV_SR=y
99CONFIG_SCSI_MULTI_LUN=y
94# CONFIG_SCSI_LOWLEVEL is not set 100# CONFIG_SCSI_LOWLEVEL is not set
95CONFIG_NETDEVICES=y 101CONFIG_NETDEVICES=y
96CONFIG_DUMMY=y 102CONFIG_DUMMY=y
@@ -105,6 +111,7 @@ CONFIG_RT2800USB=m
105CONFIG_INPUT_EVDEV=y 111CONFIG_INPUT_EVDEV=y
106CONFIG_KEYBOARD_GPIO=y 112CONFIG_KEYBOARD_GPIO=y
107CONFIG_KEYBOARD_TEGRA=y 113CONFIG_KEYBOARD_TEGRA=y
114CONFIG_MOUSE_PS2_ELANTECH=y
108CONFIG_INPUT_MISC=y 115CONFIG_INPUT_MISC=y
109CONFIG_INPUT_MPU3050=y 116CONFIG_INPUT_MPU3050=y
110# CONFIG_LEGACY_PTYS is not set 117# CONFIG_LEGACY_PTYS is not set
@@ -177,6 +184,7 @@ CONFIG_SND_SOC_TEGRA_WM8903=y
177CONFIG_SND_SOC_TEGRA_TRIMSLICE=y 184CONFIG_SND_SOC_TEGRA_TRIMSLICE=y
178CONFIG_SND_SOC_TEGRA_ALC5632=y 185CONFIG_SND_SOC_TEGRA_ALC5632=y
179CONFIG_USB=y 186CONFIG_USB=y
187CONFIG_USB_XHCI_HCD=y
180CONFIG_USB_EHCI_HCD=y 188CONFIG_USB_EHCI_HCD=y
181CONFIG_USB_EHCI_TEGRA=y 189CONFIG_USB_EHCI_TEGRA=y
182CONFIG_USB_ACM=y 190CONFIG_USB_ACM=y
diff --git a/arch/arm/include/asm/arch_timer.h b/arch/arm/include/asm/arch_timer.h
index e406d575c94f..5665134bfa3e 100644
--- a/arch/arm/include/asm/arch_timer.h
+++ b/arch/arm/include/asm/arch_timer.h
@@ -17,7 +17,8 @@ int arch_timer_arch_init(void);
17 * nicely work out which register we want, and chuck away the rest of 17 * nicely work out which register we want, and chuck away the rest of
18 * the code. At least it does so with a recent GCC (4.6.3). 18 * the code. At least it does so with a recent GCC (4.6.3).
19 */ 19 */
20static inline void arch_timer_reg_write(const int access, const int reg, u32 val) 20static __always_inline
21void arch_timer_reg_write_cp15(int access, enum arch_timer_reg reg, u32 val)
21{ 22{
22 if (access == ARCH_TIMER_PHYS_ACCESS) { 23 if (access == ARCH_TIMER_PHYS_ACCESS) {
23 switch (reg) { 24 switch (reg) {
@@ -28,9 +29,7 @@ static inline void arch_timer_reg_write(const int access, const int reg, u32 val
28 asm volatile("mcr p15, 0, %0, c14, c2, 0" : : "r" (val)); 29 asm volatile("mcr p15, 0, %0, c14, c2, 0" : : "r" (val));
29 break; 30 break;
30 } 31 }
31 } 32 } else if (access == ARCH_TIMER_VIRT_ACCESS) {
32
33 if (access == ARCH_TIMER_VIRT_ACCESS) {
34 switch (reg) { 33 switch (reg) {
35 case ARCH_TIMER_REG_CTRL: 34 case ARCH_TIMER_REG_CTRL:
36 asm volatile("mcr p15, 0, %0, c14, c3, 1" : : "r" (val)); 35 asm volatile("mcr p15, 0, %0, c14, c3, 1" : : "r" (val));
@@ -44,7 +43,8 @@ static inline void arch_timer_reg_write(const int access, const int reg, u32 val
44 isb(); 43 isb();
45} 44}
46 45
47static inline u32 arch_timer_reg_read(const int access, const int reg) 46static __always_inline
47u32 arch_timer_reg_read_cp15(int access, enum arch_timer_reg reg)
48{ 48{
49 u32 val = 0; 49 u32 val = 0;
50 50
@@ -57,9 +57,7 @@ static inline u32 arch_timer_reg_read(const int access, const int reg)
57 asm volatile("mrc p15, 0, %0, c14, c2, 0" : "=r" (val)); 57 asm volatile("mrc p15, 0, %0, c14, c2, 0" : "=r" (val));
58 break; 58 break;
59 } 59 }
60 } 60 } else if (access == ARCH_TIMER_VIRT_ACCESS) {
61
62 if (access == ARCH_TIMER_VIRT_ACCESS) {
63 switch (reg) { 61 switch (reg) {
64 case ARCH_TIMER_REG_CTRL: 62 case ARCH_TIMER_REG_CTRL:
65 asm volatile("mrc p15, 0, %0, c14, c3, 1" : "=r" (val)); 63 asm volatile("mrc p15, 0, %0, c14, c3, 1" : "=r" (val));
diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h
index a5fef710af32..fcc1b5bf6979 100644
--- a/arch/arm/include/asm/assembler.h
+++ b/arch/arm/include/asm/assembler.h
@@ -220,9 +220,9 @@
220#ifdef CONFIG_SMP 220#ifdef CONFIG_SMP
221#if __LINUX_ARM_ARCH__ >= 7 221#if __LINUX_ARM_ARCH__ >= 7
222 .ifeqs "\mode","arm" 222 .ifeqs "\mode","arm"
223 ALT_SMP(dmb) 223 ALT_SMP(dmb ish)
224 .else 224 .else
225 ALT_SMP(W(dmb)) 225 ALT_SMP(W(dmb) ish)
226 .endif 226 .endif
227#elif __LINUX_ARM_ARCH__ == 6 227#elif __LINUX_ARM_ARCH__ == 6
228 ALT_SMP(mcr p15, 0, r0, c7, c10, 5) @ dmb 228 ALT_SMP(mcr p15, 0, r0, c7, c10, 5) @ dmb
diff --git a/arch/arm/include/asm/barrier.h b/arch/arm/include/asm/barrier.h
index 8dcd9c702d90..60f15e274e6d 100644
--- a/arch/arm/include/asm/barrier.h
+++ b/arch/arm/include/asm/barrier.h
@@ -14,27 +14,27 @@
14#endif 14#endif
15 15
16#if __LINUX_ARM_ARCH__ >= 7 16#if __LINUX_ARM_ARCH__ >= 7
17#define isb() __asm__ __volatile__ ("isb" : : : "memory") 17#define isb(option) __asm__ __volatile__ ("isb " #option : : : "memory")
18#define dsb() __asm__ __volatile__ ("dsb" : : : "memory") 18#define dsb(option) __asm__ __volatile__ ("dsb " #option : : : "memory")
19#define dmb() __asm__ __volatile__ ("dmb" : : : "memory") 19#define dmb(option) __asm__ __volatile__ ("dmb " #option : : : "memory")
20#elif defined(CONFIG_CPU_XSC3) || __LINUX_ARM_ARCH__ == 6 20#elif defined(CONFIG_CPU_XSC3) || __LINUX_ARM_ARCH__ == 6
21#define isb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c5, 4" \ 21#define isb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c5, 4" \
22 : : "r" (0) : "memory") 22 : : "r" (0) : "memory")
23#define dsb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \ 23#define dsb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \
24 : : "r" (0) : "memory") 24 : : "r" (0) : "memory")
25#define dmb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" \ 25#define dmb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" \
26 : : "r" (0) : "memory") 26 : : "r" (0) : "memory")
27#elif defined(CONFIG_CPU_FA526) 27#elif defined(CONFIG_CPU_FA526)
28#define isb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c5, 4" \ 28#define isb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c5, 4" \
29 : : "r" (0) : "memory") 29 : : "r" (0) : "memory")
30#define dsb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \ 30#define dsb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \
31 : : "r" (0) : "memory") 31 : : "r" (0) : "memory")
32#define dmb() __asm__ __volatile__ ("" : : : "memory") 32#define dmb(x) __asm__ __volatile__ ("" : : : "memory")
33#else 33#else
34#define isb() __asm__ __volatile__ ("" : : : "memory") 34#define isb(x) __asm__ __volatile__ ("" : : : "memory")
35#define dsb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \ 35#define dsb(x) __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 4" \
36 : : "r" (0) : "memory") 36 : : "r" (0) : "memory")
37#define dmb() __asm__ __volatile__ ("" : : : "memory") 37#define dmb(x) __asm__ __volatile__ ("" : : : "memory")
38#endif 38#endif
39 39
40#ifdef CONFIG_ARCH_HAS_BARRIERS 40#ifdef CONFIG_ARCH_HAS_BARRIERS
@@ -42,7 +42,7 @@
42#elif defined(CONFIG_ARM_DMA_MEM_BUFFERABLE) || defined(CONFIG_SMP) 42#elif defined(CONFIG_ARM_DMA_MEM_BUFFERABLE) || defined(CONFIG_SMP)
43#define mb() do { dsb(); outer_sync(); } while (0) 43#define mb() do { dsb(); outer_sync(); } while (0)
44#define rmb() dsb() 44#define rmb() dsb()
45#define wmb() mb() 45#define wmb() do { dsb(st); outer_sync(); } while (0)
46#else 46#else
47#define mb() barrier() 47#define mb() barrier()
48#define rmb() barrier() 48#define rmb() barrier()
@@ -54,9 +54,9 @@
54#define smp_rmb() barrier() 54#define smp_rmb() barrier()
55#define smp_wmb() barrier() 55#define smp_wmb() barrier()
56#else 56#else
57#define smp_mb() dmb() 57#define smp_mb() dmb(ish)
58#define smp_rmb() dmb() 58#define smp_rmb() smp_mb()
59#define smp_wmb() dmb() 59#define smp_wmb() dmb(ishst)
60#endif 60#endif
61 61
62#define read_barrier_depends() do { } while(0) 62#define read_barrier_depends() do { } while(0)
diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h
index 17d0ae8672fa..15f2d5bf8875 100644
--- a/arch/arm/include/asm/cacheflush.h
+++ b/arch/arm/include/asm/cacheflush.h
@@ -268,8 +268,7 @@ extern void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr
268 * Harvard caches are synchronised for the user space address range. 268 * Harvard caches are synchronised for the user space address range.
269 * This is used for the ARM private sys_cacheflush system call. 269 * This is used for the ARM private sys_cacheflush system call.
270 */ 270 */
271#define flush_cache_user_range(start,end) \ 271#define flush_cache_user_range(s,e) __cpuc_coherent_user_range(s,e)
272 __cpuc_coherent_user_range((start) & PAGE_MASK, PAGE_ALIGN(end))
273 272
274/* 273/*
275 * Perform necessary cache operations to ensure that data previously 274 * Perform necessary cache operations to ensure that data previously
@@ -352,7 +351,7 @@ static inline void flush_cache_vmap(unsigned long start, unsigned long end)
352 * set_pte_at() called from vmap_pte_range() does not 351 * set_pte_at() called from vmap_pte_range() does not
353 * have a DSB after cleaning the cache line. 352 * have a DSB after cleaning the cache line.
354 */ 353 */
355 dsb(); 354 dsb(ishst);
356} 355}
357 356
358static inline void flush_cache_vunmap(unsigned long start, unsigned long end) 357static inline void flush_cache_vunmap(unsigned long start, unsigned long end)
diff --git a/arch/arm/include/asm/dma-contiguous.h b/arch/arm/include/asm/dma-contiguous.h
index 3ed37b4d93da..4f8e9e5514b1 100644
--- a/arch/arm/include/asm/dma-contiguous.h
+++ b/arch/arm/include/asm/dma-contiguous.h
@@ -2,10 +2,9 @@
2#define ASMARM_DMA_CONTIGUOUS_H 2#define ASMARM_DMA_CONTIGUOUS_H
3 3
4#ifdef __KERNEL__ 4#ifdef __KERNEL__
5#ifdef CONFIG_CMA 5#ifdef CONFIG_DMA_CMA
6 6
7#include <linux/types.h> 7#include <linux/types.h>
8#include <asm-generic/dma-contiguous.h>
9 8
10void dma_contiguous_early_fixup(phys_addr_t base, unsigned long size); 9void dma_contiguous_early_fixup(phys_addr_t base, unsigned long size);
11 10
diff --git a/arch/arm/include/asm/elf.h b/arch/arm/include/asm/elf.h
index 56211f2084ef..f4b46d39b9cf 100644
--- a/arch/arm/include/asm/elf.h
+++ b/arch/arm/include/asm/elf.h
@@ -19,8 +19,6 @@ typedef elf_greg_t elf_gregset_t[ELF_NGREG];
19 19
20typedef struct user_fp elf_fpregset_t; 20typedef struct user_fp elf_fpregset_t;
21 21
22#define EM_ARM 40
23
24#define EF_ARM_EABI_MASK 0xff000000 22#define EF_ARM_EABI_MASK 0xff000000
25#define EF_ARM_EABI_UNKNOWN 0x00000000 23#define EF_ARM_EABI_UNKNOWN 0x00000000
26#define EF_ARM_EABI_VER1 0x01000000 24#define EF_ARM_EABI_VER1 0x01000000
diff --git a/arch/arm/include/asm/hardware/debug-8250.S b/arch/arm/include/asm/hardware/debug-8250.S
deleted file mode 100644
index 22c689255e6e..000000000000
--- a/arch/arm/include/asm/hardware/debug-8250.S
+++ /dev/null
@@ -1,29 +0,0 @@
1/*
2 * arch/arm/include/asm/hardware/debug-8250.S
3 *
4 * Copyright (C) 1994-1999 Russell King
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10#include <linux/serial_reg.h>
11
12 .macro senduart,rd,rx
13 strb \rd, [\rx, #UART_TX << UART_SHIFT]
14 .endm
15
16 .macro busyuart,rd,rx
171002: ldrb \rd, [\rx, #UART_LSR << UART_SHIFT]
18 and \rd, \rd, #UART_LSR_TEMT | UART_LSR_THRE
19 teq \rd, #UART_LSR_TEMT | UART_LSR_THRE
20 bne 1002b
21 .endm
22
23 .macro waituart,rd,rx
24#ifdef FLOW_CONTROL
251001: ldrb \rd, [\rx, #UART_MSR << UART_SHIFT]
26 tst \rd, #UART_MSR_CTS
27 beq 1001b
28#endif
29 .endm
diff --git a/arch/arm/include/asm/kvm_mmu.h b/arch/arm/include/asm/kvm_mmu.h
index 472ac7091003..9b28c41f4ba9 100644
--- a/arch/arm/include/asm/kvm_mmu.h
+++ b/arch/arm/include/asm/kvm_mmu.h
@@ -64,7 +64,7 @@ void kvm_clear_hyp_idmap(void);
64 64
65static inline void kvm_set_pte(pte_t *pte, pte_t new_pte) 65static inline void kvm_set_pte(pte_t *pte, pte_t new_pte)
66{ 66{
67 pte_val(*pte) = new_pte; 67 *pte = new_pte;
68 /* 68 /*
69 * flush_pmd_entry just takes a void pointer and cleans the necessary 69 * flush_pmd_entry just takes a void pointer and cleans the necessary
70 * cache entries, so we can reuse the function for ptes. 70 * cache entries, so we can reuse the function for ptes.
diff --git a/arch/arm/include/asm/localtimer.h b/arch/arm/include/asm/localtimer.h
deleted file mode 100644
index f77ffc1eb0c2..000000000000
--- a/arch/arm/include/asm/localtimer.h
+++ /dev/null
@@ -1,34 +0,0 @@
1/*
2 * arch/arm/include/asm/localtimer.h
3 *
4 * Copyright (C) 2004-2005 ARM Ltd.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10#ifndef __ASM_ARM_LOCALTIMER_H
11#define __ASM_ARM_LOCALTIMER_H
12
13#include <linux/errno.h>
14
15struct clock_event_device;
16
17struct local_timer_ops {
18 int (*setup)(struct clock_event_device *);
19 void (*stop)(struct clock_event_device *);
20};
21
22#ifdef CONFIG_LOCAL_TIMERS
23/*
24 * Register a local timer driver
25 */
26int local_timer_register(struct local_timer_ops *);
27#else
28static inline int local_timer_register(struct local_timer_ops *ops)
29{
30 return -ENXIO;
31}
32#endif
33
34#endif
diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h
index 441efc491b50..402a2bc6aa68 100644
--- a/arch/arm/include/asm/mach/arch.h
+++ b/arch/arm/include/asm/mach/arch.h
@@ -35,7 +35,7 @@ struct machine_desc {
35 unsigned int nr_irqs; /* number of IRQs */ 35 unsigned int nr_irqs; /* number of IRQs */
36 36
37#ifdef CONFIG_ZONE_DMA 37#ifdef CONFIG_ZONE_DMA
38 unsigned long dma_zone_size; /* size of DMA-able area */ 38 phys_addr_t dma_zone_size; /* size of DMA-able area */
39#endif 39#endif
40 40
41 unsigned int video_start; /* start of video RAM */ 41 unsigned int video_start; /* start of video RAM */
@@ -65,12 +65,12 @@ struct machine_desc {
65/* 65/*
66 * Current machine - only accessible during boot. 66 * Current machine - only accessible during boot.
67 */ 67 */
68extern struct machine_desc *machine_desc; 68extern const struct machine_desc *machine_desc;
69 69
70/* 70/*
71 * Machine type table - also only accessible during boot 71 * Machine type table - also only accessible during boot
72 */ 72 */
73extern struct machine_desc __arch_info_begin[], __arch_info_end[]; 73extern const struct machine_desc __arch_info_begin[], __arch_info_end[];
74#define for_each_machine_desc(p) \ 74#define for_each_machine_desc(p) \
75 for (p = __arch_info_begin; p < __arch_info_end; p++) 75 for (p = __arch_info_begin; p < __arch_info_end; p++)
76 76
diff --git a/arch/arm/include/asm/mach/pci.h b/arch/arm/include/asm/mach/pci.h
index a1c90d7feb0e..454d642a4070 100644
--- a/arch/arm/include/asm/mach/pci.h
+++ b/arch/arm/include/asm/mach/pci.h
@@ -36,6 +36,8 @@ struct hw_pci {
36 resource_size_t start, 36 resource_size_t start,
37 resource_size_t size, 37 resource_size_t size,
38 resource_size_t align); 38 resource_size_t align);
39 void (*add_bus)(struct pci_bus *bus);
40 void (*remove_bus)(struct pci_bus *bus);
39}; 41};
40 42
41/* 43/*
@@ -63,6 +65,8 @@ struct pci_sys_data {
63 resource_size_t start, 65 resource_size_t start,
64 resource_size_t size, 66 resource_size_t size,
65 resource_size_t align); 67 resource_size_t align);
68 void (*add_bus)(struct pci_bus *bus);
69 void (*remove_bus)(struct pci_bus *bus);
66 void *private_data; /* platform controller private data */ 70 void *private_data; /* platform controller private data */
67}; 71};
68 72
diff --git a/arch/arm/include/asm/memblock.h b/arch/arm/include/asm/memblock.h
index 00ca5f92648e..c2f5102ae659 100644
--- a/arch/arm/include/asm/memblock.h
+++ b/arch/arm/include/asm/memblock.h
@@ -4,8 +4,7 @@
4struct meminfo; 4struct meminfo;
5struct machine_desc; 5struct machine_desc;
6 6
7extern void arm_memblock_init(struct meminfo *, struct machine_desc *); 7void arm_memblock_init(struct meminfo *, const struct machine_desc *);
8
9phys_addr_t arm_memblock_steal(phys_addr_t size, phys_addr_t align); 8phys_addr_t arm_memblock_steal(phys_addr_t size, phys_addr_t align);
10 9
11#endif 10#endif
diff --git a/arch/arm/include/asm/module.h b/arch/arm/include/asm/module.h
index 0d3a28dbc8e5..ed690c49ef93 100644
--- a/arch/arm/include/asm/module.h
+++ b/arch/arm/include/asm/module.h
@@ -12,6 +12,8 @@ enum {
12 ARM_SEC_CORE, 12 ARM_SEC_CORE,
13 ARM_SEC_EXIT, 13 ARM_SEC_EXIT,
14 ARM_SEC_DEVEXIT, 14 ARM_SEC_DEVEXIT,
15 ARM_SEC_HOT,
16 ARM_SEC_UNLIKELY,
15 ARM_SEC_MAX, 17 ARM_SEC_MAX,
16}; 18};
17 19
diff --git a/arch/arm/include/asm/neon.h b/arch/arm/include/asm/neon.h
new file mode 100644
index 000000000000..8f730fe70093
--- /dev/null
+++ b/arch/arm/include/asm/neon.h
@@ -0,0 +1,36 @@
1/*
2 * linux/arch/arm/include/asm/neon.h
3 *
4 * Copyright (C) 2013 Linaro Ltd <ard.biesheuvel@linaro.org>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10
11#include <asm/hwcap.h>
12
13#define cpu_has_neon() (!!(elf_hwcap & HWCAP_NEON))
14
15#ifdef __ARM_NEON__
16
17/*
18 * If you are affected by the BUILD_BUG below, it probably means that you are
19 * using NEON code /and/ calling the kernel_neon_begin() function from the same
20 * compilation unit. To prevent issues that may arise from GCC reordering or
21 * generating(1) NEON instructions outside of these begin/end functions, the
22 * only supported way of using NEON code in the kernel is by isolating it in a
23 * separate compilation unit, and calling it from another unit from inside a
24 * kernel_neon_begin/kernel_neon_end pair.
25 *
26 * (1) Current GCC (4.7) might generate NEON instructions at O3 level if
27 * -mpfu=neon is set.
28 */
29
30#define kernel_neon_begin() \
31 BUILD_BUG_ON_MSG(1, "kernel_neon_begin() called from NEON code")
32
33#else
34void kernel_neon_begin(void);
35#endif
36void kernel_neon_end(void);
diff --git a/arch/arm/include/asm/outercache.h b/arch/arm/include/asm/outercache.h
index 12f71a190422..f94784f0e3a6 100644
--- a/arch/arm/include/asm/outercache.h
+++ b/arch/arm/include/asm/outercache.h
@@ -37,10 +37,10 @@ struct outer_cache_fns {
37 void (*resume)(void); 37 void (*resume)(void);
38}; 38};
39 39
40#ifdef CONFIG_OUTER_CACHE
41
42extern struct outer_cache_fns outer_cache; 40extern struct outer_cache_fns outer_cache;
43 41
42#ifdef CONFIG_OUTER_CACHE
43
44static inline void outer_inv_range(phys_addr_t start, phys_addr_t end) 44static inline void outer_inv_range(phys_addr_t start, phys_addr_t end)
45{ 45{
46 if (outer_cache.inv_range) 46 if (outer_cache.inv_range)
diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h
index 04aeb02d2e11..be956dbf6bae 100644
--- a/arch/arm/include/asm/pgtable.h
+++ b/arch/arm/include/asm/pgtable.h
@@ -100,7 +100,7 @@ extern pgprot_t pgprot_s2_device;
100#define PAGE_HYP _MOD_PROT(pgprot_kernel, L_PTE_HYP) 100#define PAGE_HYP _MOD_PROT(pgprot_kernel, L_PTE_HYP)
101#define PAGE_HYP_DEVICE _MOD_PROT(pgprot_hyp_device, L_PTE_HYP) 101#define PAGE_HYP_DEVICE _MOD_PROT(pgprot_hyp_device, L_PTE_HYP)
102#define PAGE_S2 _MOD_PROT(pgprot_s2, L_PTE_S2_RDONLY) 102#define PAGE_S2 _MOD_PROT(pgprot_s2, L_PTE_S2_RDONLY)
103#define PAGE_S2_DEVICE _MOD_PROT(pgprot_s2_device, L_PTE_USER | L_PTE_S2_RDONLY) 103#define PAGE_S2_DEVICE _MOD_PROT(pgprot_s2_device, L_PTE_S2_RDWR)
104 104
105#define __PAGE_NONE __pgprot(_L_PTE_DEFAULT | L_PTE_RDONLY | L_PTE_XN | L_PTE_NONE) 105#define __PAGE_NONE __pgprot(_L_PTE_DEFAULT | L_PTE_RDONLY | L_PTE_XN | L_PTE_NONE)
106#define __PAGE_SHARED __pgprot(_L_PTE_DEFAULT | L_PTE_USER | L_PTE_XN) 106#define __PAGE_SHARED __pgprot(_L_PTE_DEFAULT | L_PTE_USER | L_PTE_XN)
diff --git a/arch/arm/include/asm/prom.h b/arch/arm/include/asm/prom.h
index a219227c3e43..4a2985e21969 100644
--- a/arch/arm/include/asm/prom.h
+++ b/arch/arm/include/asm/prom.h
@@ -15,13 +15,13 @@
15 15
16#ifdef CONFIG_OF 16#ifdef CONFIG_OF
17 17
18extern struct machine_desc *setup_machine_fdt(unsigned int dt_phys); 18extern const struct machine_desc *setup_machine_fdt(unsigned int dt_phys);
19extern void arm_dt_memblock_reserve(void); 19extern void arm_dt_memblock_reserve(void);
20extern void __init arm_dt_init_cpu_maps(void); 20extern void __init arm_dt_init_cpu_maps(void);
21 21
22#else /* CONFIG_OF */ 22#else /* CONFIG_OF */
23 23
24static inline struct machine_desc *setup_machine_fdt(unsigned int dt_phys) 24static inline const struct machine_desc *setup_machine_fdt(unsigned int dt_phys)
25{ 25{
26 return NULL; 26 return NULL;
27} 27}
diff --git a/arch/arm/include/asm/spinlock.h b/arch/arm/include/asm/spinlock.h
index b07c09e5a0ac..4f2c28060c9a 100644
--- a/arch/arm/include/asm/spinlock.h
+++ b/arch/arm/include/asm/spinlock.h
@@ -46,7 +46,7 @@ static inline void dsb_sev(void)
46{ 46{
47#if __LINUX_ARM_ARCH__ >= 7 47#if __LINUX_ARM_ARCH__ >= 7
48 __asm__ __volatile__ ( 48 __asm__ __volatile__ (
49 "dsb\n" 49 "dsb ishst\n"
50 SEV 50 SEV
51 ); 51 );
52#else 52#else
diff --git a/arch/arm/include/asm/switch_to.h b/arch/arm/include/asm/switch_to.h
index fa09e6b49bf1..c99e259469f7 100644
--- a/arch/arm/include/asm/switch_to.h
+++ b/arch/arm/include/asm/switch_to.h
@@ -4,6 +4,16 @@
4#include <linux/thread_info.h> 4#include <linux/thread_info.h>
5 5
6/* 6/*
7 * For v7 SMP cores running a preemptible kernel we may be pre-empted
8 * during a TLB maintenance operation, so execute an inner-shareable dsb
9 * to ensure that the maintenance completes in case we migrate to another
10 * CPU.
11 */
12#if defined(CONFIG_PREEMPT) && defined(CONFIG_SMP) && defined(CONFIG_CPU_V7)
13#define finish_arch_switch(prev) dsb(ish)
14#endif
15
16/*
7 * switch_to(prev, next) should switch from task `prev' to `next' 17 * switch_to(prev, next) should switch from task `prev' to `next'
8 * `prev' will never be the same as `next'. schedule() itself 18 * `prev' will never be the same as `next'. schedule() itself
9 * contains the memory barrier to tell GCC not to cache `current'. 19 * contains the memory barrier to tell GCC not to cache `current'.
diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h
index 2b8114fcba09..df5e13d64f2c 100644
--- a/arch/arm/include/asm/thread_info.h
+++ b/arch/arm/include/asm/thread_info.h
@@ -43,6 +43,16 @@ struct cpu_context_save {
43 __u32 extra[2]; /* Xscale 'acc' register, etc */ 43 __u32 extra[2]; /* Xscale 'acc' register, etc */
44}; 44};
45 45
46struct arm_restart_block {
47 union {
48 /* For user cache flushing */
49 struct {
50 unsigned long start;
51 unsigned long end;
52 } cache;
53 };
54};
55
46/* 56/*
47 * low level task data that entry.S needs immediate access to. 57 * low level task data that entry.S needs immediate access to.
48 * __switch_to() assumes cpu_context follows immediately after cpu_domain. 58 * __switch_to() assumes cpu_context follows immediately after cpu_domain.
@@ -68,6 +78,7 @@ struct thread_info {
68 unsigned long thumbee_state; /* ThumbEE Handler Base register */ 78 unsigned long thumbee_state; /* ThumbEE Handler Base register */
69#endif 79#endif
70 struct restart_block restart_block; 80 struct restart_block restart_block;
81 struct arm_restart_block arm_restart_block;
71}; 82};
72 83
73#define INIT_THREAD_INFO(tsk) \ 84#define INIT_THREAD_INFO(tsk) \
diff --git a/arch/arm/include/asm/tlbflush.h b/arch/arm/include/asm/tlbflush.h
index f467e9b3f8d5..38960264040c 100644
--- a/arch/arm/include/asm/tlbflush.h
+++ b/arch/arm/include/asm/tlbflush.h
@@ -319,67 +319,110 @@ extern struct cpu_tlb_fns cpu_tlb;
319#define tlb_op(f, regs, arg) __tlb_op(f, "p15, 0, %0, " regs, arg) 319#define tlb_op(f, regs, arg) __tlb_op(f, "p15, 0, %0, " regs, arg)
320#define tlb_l2_op(f, regs, arg) __tlb_op(f, "p15, 1, %0, " regs, arg) 320#define tlb_l2_op(f, regs, arg) __tlb_op(f, "p15, 1, %0, " regs, arg)
321 321
322static inline void local_flush_tlb_all(void) 322static inline void __local_flush_tlb_all(void)
323{ 323{
324 const int zero = 0; 324 const int zero = 0;
325 const unsigned int __tlb_flag = __cpu_tlb_flags; 325 const unsigned int __tlb_flag = __cpu_tlb_flags;
326 326
327 if (tlb_flag(TLB_WB))
328 dsb();
329
330 tlb_op(TLB_V4_U_FULL | TLB_V6_U_FULL, "c8, c7, 0", zero); 327 tlb_op(TLB_V4_U_FULL | TLB_V6_U_FULL, "c8, c7, 0", zero);
331 tlb_op(TLB_V4_D_FULL | TLB_V6_D_FULL, "c8, c6, 0", zero); 328 tlb_op(TLB_V4_D_FULL | TLB_V6_D_FULL, "c8, c6, 0", zero);
332 tlb_op(TLB_V4_I_FULL | TLB_V6_I_FULL, "c8, c5, 0", zero); 329 tlb_op(TLB_V4_I_FULL | TLB_V6_I_FULL, "c8, c5, 0", zero);
333 tlb_op(TLB_V7_UIS_FULL, "c8, c3, 0", zero); 330}
331
332static inline void local_flush_tlb_all(void)
333{
334 const int zero = 0;
335 const unsigned int __tlb_flag = __cpu_tlb_flags;
336
337 if (tlb_flag(TLB_WB))
338 dsb(nshst);
339
340 __local_flush_tlb_all();
341 tlb_op(TLB_V7_UIS_FULL, "c8, c7, 0", zero);
334 342
335 if (tlb_flag(TLB_BARRIER)) { 343 if (tlb_flag(TLB_BARRIER)) {
336 dsb(); 344 dsb(nsh);
337 isb(); 345 isb();
338 } 346 }
339} 347}
340 348
341static inline void local_flush_tlb_mm(struct mm_struct *mm) 349static inline void __flush_tlb_all(void)
342{ 350{
343 const int zero = 0; 351 const int zero = 0;
344 const int asid = ASID(mm);
345 const unsigned int __tlb_flag = __cpu_tlb_flags; 352 const unsigned int __tlb_flag = __cpu_tlb_flags;
346 353
347 if (tlb_flag(TLB_WB)) 354 if (tlb_flag(TLB_WB))
348 dsb(); 355 dsb(ishst);
356
357 __local_flush_tlb_all();
358 tlb_op(TLB_V7_UIS_FULL, "c8, c3, 0", zero);
359
360 if (tlb_flag(TLB_BARRIER)) {
361 dsb(ish);
362 isb();
363 }
364}
365
366static inline void __local_flush_tlb_mm(struct mm_struct *mm)
367{
368 const int zero = 0;
369 const int asid = ASID(mm);
370 const unsigned int __tlb_flag = __cpu_tlb_flags;
349 371
350 if (possible_tlb_flags & (TLB_V4_U_FULL|TLB_V4_D_FULL|TLB_V4_I_FULL)) { 372 if (possible_tlb_flags & (TLB_V4_U_FULL|TLB_V4_D_FULL|TLB_V4_I_FULL)) {
351 if (cpumask_test_cpu(get_cpu(), mm_cpumask(mm))) { 373 if (cpumask_test_cpu(smp_processor_id(), mm_cpumask(mm))) {
352 tlb_op(TLB_V4_U_FULL, "c8, c7, 0", zero); 374 tlb_op(TLB_V4_U_FULL, "c8, c7, 0", zero);
353 tlb_op(TLB_V4_D_FULL, "c8, c6, 0", zero); 375 tlb_op(TLB_V4_D_FULL, "c8, c6, 0", zero);
354 tlb_op(TLB_V4_I_FULL, "c8, c5, 0", zero); 376 tlb_op(TLB_V4_I_FULL, "c8, c5, 0", zero);
355 } 377 }
356 put_cpu();
357 } 378 }
358 379
359 tlb_op(TLB_V6_U_ASID, "c8, c7, 2", asid); 380 tlb_op(TLB_V6_U_ASID, "c8, c7, 2", asid);
360 tlb_op(TLB_V6_D_ASID, "c8, c6, 2", asid); 381 tlb_op(TLB_V6_D_ASID, "c8, c6, 2", asid);
361 tlb_op(TLB_V6_I_ASID, "c8, c5, 2", asid); 382 tlb_op(TLB_V6_I_ASID, "c8, c5, 2", asid);
383}
384
385static inline void local_flush_tlb_mm(struct mm_struct *mm)
386{
387 const int asid = ASID(mm);
388 const unsigned int __tlb_flag = __cpu_tlb_flags;
389
390 if (tlb_flag(TLB_WB))
391 dsb(nshst);
392
393 __local_flush_tlb_mm(mm);
394 tlb_op(TLB_V7_UIS_ASID, "c8, c7, 2", asid);
395
396 if (tlb_flag(TLB_BARRIER))
397 dsb(nsh);
398}
399
400static inline void __flush_tlb_mm(struct mm_struct *mm)
401{
402 const unsigned int __tlb_flag = __cpu_tlb_flags;
403
404 if (tlb_flag(TLB_WB))
405 dsb(ishst);
406
407 __local_flush_tlb_mm(mm);
362#ifdef CONFIG_ARM_ERRATA_720789 408#ifdef CONFIG_ARM_ERRATA_720789
363 tlb_op(TLB_V7_UIS_ASID, "c8, c3, 0", zero); 409 tlb_op(TLB_V7_UIS_ASID, "c8, c3, 0", 0);
364#else 410#else
365 tlb_op(TLB_V7_UIS_ASID, "c8, c3, 2", asid); 411 tlb_op(TLB_V7_UIS_ASID, "c8, c3, 2", ASID(mm));
366#endif 412#endif
367 413
368 if (tlb_flag(TLB_BARRIER)) 414 if (tlb_flag(TLB_BARRIER))
369 dsb(); 415 dsb(ish);
370} 416}
371 417
372static inline void 418static inline void
373local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr) 419__local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
374{ 420{
375 const int zero = 0; 421 const int zero = 0;
376 const unsigned int __tlb_flag = __cpu_tlb_flags; 422 const unsigned int __tlb_flag = __cpu_tlb_flags;
377 423
378 uaddr = (uaddr & PAGE_MASK) | ASID(vma->vm_mm); 424 uaddr = (uaddr & PAGE_MASK) | ASID(vma->vm_mm);
379 425
380 if (tlb_flag(TLB_WB))
381 dsb();
382
383 if (possible_tlb_flags & (TLB_V4_U_PAGE|TLB_V4_D_PAGE|TLB_V4_I_PAGE|TLB_V4_I_FULL) && 426 if (possible_tlb_flags & (TLB_V4_U_PAGE|TLB_V4_D_PAGE|TLB_V4_I_PAGE|TLB_V4_I_FULL) &&
384 cpumask_test_cpu(smp_processor_id(), mm_cpumask(vma->vm_mm))) { 427 cpumask_test_cpu(smp_processor_id(), mm_cpumask(vma->vm_mm))) {
385 tlb_op(TLB_V4_U_PAGE, "c8, c7, 1", uaddr); 428 tlb_op(TLB_V4_U_PAGE, "c8, c7, 1", uaddr);
@@ -392,6 +435,36 @@ local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
392 tlb_op(TLB_V6_U_PAGE, "c8, c7, 1", uaddr); 435 tlb_op(TLB_V6_U_PAGE, "c8, c7, 1", uaddr);
393 tlb_op(TLB_V6_D_PAGE, "c8, c6, 1", uaddr); 436 tlb_op(TLB_V6_D_PAGE, "c8, c6, 1", uaddr);
394 tlb_op(TLB_V6_I_PAGE, "c8, c5, 1", uaddr); 437 tlb_op(TLB_V6_I_PAGE, "c8, c5, 1", uaddr);
438}
439
440static inline void
441local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
442{
443 const unsigned int __tlb_flag = __cpu_tlb_flags;
444
445 uaddr = (uaddr & PAGE_MASK) | ASID(vma->vm_mm);
446
447 if (tlb_flag(TLB_WB))
448 dsb(nshst);
449
450 __local_flush_tlb_page(vma, uaddr);
451 tlb_op(TLB_V7_UIS_PAGE, "c8, c7, 1", uaddr);
452
453 if (tlb_flag(TLB_BARRIER))
454 dsb(nsh);
455}
456
457static inline void
458__flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
459{
460 const unsigned int __tlb_flag = __cpu_tlb_flags;
461
462 uaddr = (uaddr & PAGE_MASK) | ASID(vma->vm_mm);
463
464 if (tlb_flag(TLB_WB))
465 dsb(ishst);
466
467 __local_flush_tlb_page(vma, uaddr);
395#ifdef CONFIG_ARM_ERRATA_720789 468#ifdef CONFIG_ARM_ERRATA_720789
396 tlb_op(TLB_V7_UIS_PAGE, "c8, c3, 3", uaddr & PAGE_MASK); 469 tlb_op(TLB_V7_UIS_PAGE, "c8, c3, 3", uaddr & PAGE_MASK);
397#else 470#else
@@ -399,19 +472,14 @@ local_flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
399#endif 472#endif
400 473
401 if (tlb_flag(TLB_BARRIER)) 474 if (tlb_flag(TLB_BARRIER))
402 dsb(); 475 dsb(ish);
403} 476}
404 477
405static inline void local_flush_tlb_kernel_page(unsigned long kaddr) 478static inline void __local_flush_tlb_kernel_page(unsigned long kaddr)
406{ 479{
407 const int zero = 0; 480 const int zero = 0;
408 const unsigned int __tlb_flag = __cpu_tlb_flags; 481 const unsigned int __tlb_flag = __cpu_tlb_flags;
409 482
410 kaddr &= PAGE_MASK;
411
412 if (tlb_flag(TLB_WB))
413 dsb();
414
415 tlb_op(TLB_V4_U_PAGE, "c8, c7, 1", kaddr); 483 tlb_op(TLB_V4_U_PAGE, "c8, c7, 1", kaddr);
416 tlb_op(TLB_V4_D_PAGE, "c8, c6, 1", kaddr); 484 tlb_op(TLB_V4_D_PAGE, "c8, c6, 1", kaddr);
417 tlb_op(TLB_V4_I_PAGE, "c8, c5, 1", kaddr); 485 tlb_op(TLB_V4_I_PAGE, "c8, c5, 1", kaddr);
@@ -421,26 +489,75 @@ static inline void local_flush_tlb_kernel_page(unsigned long kaddr)
421 tlb_op(TLB_V6_U_PAGE, "c8, c7, 1", kaddr); 489 tlb_op(TLB_V6_U_PAGE, "c8, c7, 1", kaddr);
422 tlb_op(TLB_V6_D_PAGE, "c8, c6, 1", kaddr); 490 tlb_op(TLB_V6_D_PAGE, "c8, c6, 1", kaddr);
423 tlb_op(TLB_V6_I_PAGE, "c8, c5, 1", kaddr); 491 tlb_op(TLB_V6_I_PAGE, "c8, c5, 1", kaddr);
492}
493
494static inline void local_flush_tlb_kernel_page(unsigned long kaddr)
495{
496 const unsigned int __tlb_flag = __cpu_tlb_flags;
497
498 kaddr &= PAGE_MASK;
499
500 if (tlb_flag(TLB_WB))
501 dsb(nshst);
502
503 __local_flush_tlb_kernel_page(kaddr);
504 tlb_op(TLB_V7_UIS_PAGE, "c8, c7, 1", kaddr);
505
506 if (tlb_flag(TLB_BARRIER)) {
507 dsb(nsh);
508 isb();
509 }
510}
511
512static inline void __flush_tlb_kernel_page(unsigned long kaddr)
513{
514 const unsigned int __tlb_flag = __cpu_tlb_flags;
515
516 kaddr &= PAGE_MASK;
517
518 if (tlb_flag(TLB_WB))
519 dsb(ishst);
520
521 __local_flush_tlb_kernel_page(kaddr);
424 tlb_op(TLB_V7_UIS_PAGE, "c8, c3, 1", kaddr); 522 tlb_op(TLB_V7_UIS_PAGE, "c8, c3, 1", kaddr);
425 523
426 if (tlb_flag(TLB_BARRIER)) { 524 if (tlb_flag(TLB_BARRIER)) {
427 dsb(); 525 dsb(ish);
428 isb(); 526 isb();
429 } 527 }
430} 528}
431 529
530/*
531 * Branch predictor maintenance is paired with full TLB invalidation, so
532 * there is no need for any barriers here.
533 */
534static inline void __local_flush_bp_all(void)
535{
536 const int zero = 0;
537 const unsigned int __tlb_flag = __cpu_tlb_flags;
538
539 if (tlb_flag(TLB_V6_BP))
540 asm("mcr p15, 0, %0, c7, c5, 6" : : "r" (zero));
541}
542
432static inline void local_flush_bp_all(void) 543static inline void local_flush_bp_all(void)
433{ 544{
434 const int zero = 0; 545 const int zero = 0;
435 const unsigned int __tlb_flag = __cpu_tlb_flags; 546 const unsigned int __tlb_flag = __cpu_tlb_flags;
436 547
548 __local_flush_bp_all();
437 if (tlb_flag(TLB_V7_UIS_BP)) 549 if (tlb_flag(TLB_V7_UIS_BP))
438 asm("mcr p15, 0, %0, c7, c1, 6" : : "r" (zero));
439 else if (tlb_flag(TLB_V6_BP))
440 asm("mcr p15, 0, %0, c7, c5, 6" : : "r" (zero)); 550 asm("mcr p15, 0, %0, c7, c5, 6" : : "r" (zero));
551}
441 552
442 if (tlb_flag(TLB_BARRIER)) 553static inline void __flush_bp_all(void)
443 isb(); 554{
555 const int zero = 0;
556 const unsigned int __tlb_flag = __cpu_tlb_flags;
557
558 __local_flush_bp_all();
559 if (tlb_flag(TLB_V7_UIS_BP))
560 asm("mcr p15, 0, %0, c7, c1, 6" : : "r" (zero));
444} 561}
445 562
446#include <asm/cputype.h> 563#include <asm/cputype.h>
@@ -461,7 +578,7 @@ static inline void dummy_flush_tlb_a15_erratum(void)
461 * Dummy TLBIMVAIS. Using the unmapped address 0 and ASID 0. 578 * Dummy TLBIMVAIS. Using the unmapped address 0 and ASID 0.
462 */ 579 */
463 asm("mcr p15, 0, %0, c8, c3, 1" : : "r" (0)); 580 asm("mcr p15, 0, %0, c8, c3, 1" : : "r" (0));
464 dsb(); 581 dsb(ish);
465} 582}
466#else 583#else
467static inline int erratum_a15_798181(void) 584static inline int erratum_a15_798181(void)
@@ -495,7 +612,7 @@ static inline void flush_pmd_entry(void *pmd)
495 tlb_l2_op(TLB_L2CLEAN_FR, "c15, c9, 1 @ L2 flush_pmd", pmd); 612 tlb_l2_op(TLB_L2CLEAN_FR, "c15, c9, 1 @ L2 flush_pmd", pmd);
496 613
497 if (tlb_flag(TLB_WB)) 614 if (tlb_flag(TLB_WB))
498 dsb(); 615 dsb(ishst);
499} 616}
500 617
501static inline void clean_pmd_entry(void *pmd) 618static inline void clean_pmd_entry(void *pmd)
diff --git a/arch/arm/include/asm/types.h b/arch/arm/include/asm/types.h
new file mode 100644
index 000000000000..a53cdb8f068c
--- /dev/null
+++ b/arch/arm/include/asm/types.h
@@ -0,0 +1,40 @@
1#ifndef _ASM_TYPES_H
2#define _ASM_TYPES_H
3
4#include <asm-generic/int-ll64.h>
5
6/*
7 * The C99 types uintXX_t that are usually defined in 'stdint.h' are not as
8 * unambiguous on ARM as you would expect. For the types below, there is a
9 * difference on ARM between GCC built for bare metal ARM, GCC built for glibc
10 * and the kernel itself, which results in build errors if you try to build with
11 * -ffreestanding and include 'stdint.h' (such as when you include 'arm_neon.h'
12 * in order to use NEON intrinsics)
13 *
14 * As the typedefs for these types in 'stdint.h' are based on builtin defines
15 * supplied by GCC, we can tweak these to align with the kernel's idea of those
16 * types, so 'linux/types.h' and 'stdint.h' can be safely included from the same
17 * source file (provided that -ffreestanding is used).
18 *
19 * int32_t uint32_t uintptr_t
20 * bare metal GCC long unsigned long unsigned int
21 * glibc GCC int unsigned int unsigned int
22 * kernel int unsigned int unsigned long
23 */
24
25#ifdef __INT32_TYPE__
26#undef __INT32_TYPE__
27#define __INT32_TYPE__ int
28#endif
29
30#ifdef __UINT32_TYPE__
31#undef __UINT32_TYPE__
32#define __UINT32_TYPE__ unsigned int
33#endif
34
35#ifdef __UINTPTR_TYPE__
36#undef __UINTPTR_TYPE__
37#define __UINTPTR_TYPE__ unsigned long
38#endif
39
40#endif /* _ASM_TYPES_H */
diff --git a/arch/arm/include/asm/v7m.h b/arch/arm/include/asm/v7m.h
index fa88d09fa3d9..615781c61627 100644
--- a/arch/arm/include/asm/v7m.h
+++ b/arch/arm/include/asm/v7m.h
@@ -15,6 +15,10 @@
15 15
16#define V7M_SCB_VTOR 0x08 16#define V7M_SCB_VTOR 0x08
17 17
18#define V7M_SCB_AIRCR 0x0c
19#define V7M_SCB_AIRCR_VECTKEY (0x05fa << 16)
20#define V7M_SCB_AIRCR_SYSRESETREQ (1 << 2)
21
18#define V7M_SCB_SCR 0x10 22#define V7M_SCB_SCR 0x10
19#define V7M_SCB_SCR_SLEEPDEEP (1 << 2) 23#define V7M_SCB_SCR_SLEEPDEEP (1 << 2)
20 24
@@ -42,3 +46,11 @@
42 */ 46 */
43#define EXC_RET_STACK_MASK 0x00000004 47#define EXC_RET_STACK_MASK 0x00000004
44#define EXC_RET_THREADMODE_PROCESSSTACK 0xfffffffd 48#define EXC_RET_THREADMODE_PROCESSSTACK 0xfffffffd
49
50#ifndef __ASSEMBLY__
51
52enum reboot_mode;
53
54void armv7m_restart(enum reboot_mode mode, const char *cmd);
55
56#endif /* __ASSEMBLY__ */
diff --git a/arch/arm/include/asm/xor.h b/arch/arm/include/asm/xor.h
index 7604673dc427..4ffb26d4cad8 100644
--- a/arch/arm/include/asm/xor.h
+++ b/arch/arm/include/asm/xor.h
@@ -7,7 +7,10 @@
7 * it under the terms of the GNU General Public License version 2 as 7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation. 8 * published by the Free Software Foundation.
9 */ 9 */
10#include <linux/hardirq.h>
10#include <asm-generic/xor.h> 11#include <asm-generic/xor.h>
12#include <asm/hwcap.h>
13#include <asm/neon.h>
11 14
12#define __XOR(a1, a2) a1 ^= a2 15#define __XOR(a1, a2) a1 ^= a2
13 16
@@ -138,4 +141,74 @@ static struct xor_block_template xor_block_arm4regs = {
138 xor_speed(&xor_block_arm4regs); \ 141 xor_speed(&xor_block_arm4regs); \
139 xor_speed(&xor_block_8regs); \ 142 xor_speed(&xor_block_8regs); \
140 xor_speed(&xor_block_32regs); \ 143 xor_speed(&xor_block_32regs); \
144 NEON_TEMPLATES; \
141 } while (0) 145 } while (0)
146
147#ifdef CONFIG_KERNEL_MODE_NEON
148
149extern struct xor_block_template const xor_block_neon_inner;
150
151static void
152xor_neon_2(unsigned long bytes, unsigned long *p1, unsigned long *p2)
153{
154 if (in_interrupt()) {
155 xor_arm4regs_2(bytes, p1, p2);
156 } else {
157 kernel_neon_begin();
158 xor_block_neon_inner.do_2(bytes, p1, p2);
159 kernel_neon_end();
160 }
161}
162
163static void
164xor_neon_3(unsigned long bytes, unsigned long *p1, unsigned long *p2,
165 unsigned long *p3)
166{
167 if (in_interrupt()) {
168 xor_arm4regs_3(bytes, p1, p2, p3);
169 } else {
170 kernel_neon_begin();
171 xor_block_neon_inner.do_3(bytes, p1, p2, p3);
172 kernel_neon_end();
173 }
174}
175
176static void
177xor_neon_4(unsigned long bytes, unsigned long *p1, unsigned long *p2,
178 unsigned long *p3, unsigned long *p4)
179{
180 if (in_interrupt()) {
181 xor_arm4regs_4(bytes, p1, p2, p3, p4);
182 } else {
183 kernel_neon_begin();
184 xor_block_neon_inner.do_4(bytes, p1, p2, p3, p4);
185 kernel_neon_end();
186 }
187}
188
189static void
190xor_neon_5(unsigned long bytes, unsigned long *p1, unsigned long *p2,
191 unsigned long *p3, unsigned long *p4, unsigned long *p5)
192{
193 if (in_interrupt()) {
194 xor_arm4regs_5(bytes, p1, p2, p3, p4, p5);
195 } else {
196 kernel_neon_begin();
197 xor_block_neon_inner.do_5(bytes, p1, p2, p3, p4, p5);
198 kernel_neon_end();
199 }
200}
201
202static struct xor_block_template xor_block_neon = {
203 .name = "neon",
204 .do_2 = xor_neon_2,
205 .do_3 = xor_neon_3,
206 .do_4 = xor_neon_4,
207 .do_5 = xor_neon_5
208};
209
210#define NEON_TEMPLATES \
211 do { if (cpu_has_neon()) xor_speed(&xor_block_neon); } while (0)
212#else
213#define NEON_TEMPLATES
214#endif
diff --git a/arch/arm/include/debug/8250.S b/arch/arm/include/debug/8250.S
new file mode 100644
index 000000000000..7a2baf913aa0
--- /dev/null
+++ b/arch/arm/include/debug/8250.S
@@ -0,0 +1,54 @@
1/*
2 * arch/arm/include/debug/8250.S
3 *
4 * Copyright (C) 1994-2013 Russell King
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10#include <linux/serial_reg.h>
11
12 .macro addruart, rp, rv, tmp
13 ldr \rp, =CONFIG_DEBUG_UART_PHYS
14 ldr \rv, =CONFIG_DEBUG_UART_VIRT
15 .endm
16
17#ifdef CONFIG_DEBUG_UART_8250_WORD
18 .macro store, rd, rx:vararg
19 str \rd, \rx
20 .endm
21
22 .macro load, rd, rx:vararg
23 ldr \rd, \rx
24 .endm
25#else
26 .macro store, rd, rx:vararg
27 strb \rd, \rx
28 .endm
29
30 .macro load, rd, rx:vararg
31 ldrb \rd, \rx
32 .endm
33#endif
34
35#define UART_SHIFT CONFIG_DEBUG_UART_8250_SHIFT
36
37 .macro senduart,rd,rx
38 store \rd, [\rx, #UART_TX << UART_SHIFT]
39 .endm
40
41 .macro busyuart,rd,rx
421002: load \rd, [\rx, #UART_LSR << UART_SHIFT]
43 and \rd, \rd, #UART_LSR_TEMT | UART_LSR_THRE
44 teq \rd, #UART_LSR_TEMT | UART_LSR_THRE
45 bne 1002b
46 .endm
47
48 .macro waituart,rd,rx
49#ifdef CONFIG_DEBUG_UART_8250_FLOW_CONTROL
501001: load \rd, [\rx, #UART_MSR << UART_SHIFT]
51 tst \rd, #UART_MSR_CTS
52 beq 1001b
53#endif
54 .endm
diff --git a/arch/arm/include/debug/8250_32.S b/arch/arm/include/debug/8250_32.S
deleted file mode 100644
index 8db01eeabbb4..000000000000
--- a/arch/arm/include/debug/8250_32.S
+++ /dev/null
@@ -1,27 +0,0 @@
1/*
2 * Copyright (c) 2011 Picochip Ltd., Jamie Iles
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 *
8 * Derived from arch/arm/mach-davinci/include/mach/debug-macro.S to use 32-bit
9 * accesses to the 8250.
10 */
11
12#include <linux/serial_reg.h>
13
14 .macro senduart,rd,rx
15 str \rd, [\rx, #UART_TX << UART_SHIFT]
16 .endm
17
18 .macro busyuart,rd,rx
191002: ldr \rd, [\rx, #UART_LSR << UART_SHIFT]
20 and \rd, \rd, #UART_LSR_TEMT | UART_LSR_THRE
21 teq \rd, #UART_LSR_TEMT | UART_LSR_THRE
22 bne 1002b
23 .endm
24
25 /* The UART's don't have any flow control IO's wired up. */
26 .macro waituart,rd,rx
27 .endm
diff --git a/arch/arm/include/debug/bcm2835.S b/arch/arm/include/debug/bcm2835.S
deleted file mode 100644
index aed9199bd847..000000000000
--- a/arch/arm/include/debug/bcm2835.S
+++ /dev/null
@@ -1,22 +0,0 @@
1/*
2 * Debugging macro include header
3 *
4 * Copyright (C) 2010 Broadcom
5 * Copyright (C) 1994-1999 Russell King
6 * Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 *
12 */
13
14#define BCM2835_DEBUG_PHYS 0x20201000
15#define BCM2835_DEBUG_VIRT 0xf0201000
16
17 .macro addruart, rp, rv, tmp
18 ldr \rp, =BCM2835_DEBUG_PHYS
19 ldr \rv, =BCM2835_DEBUG_VIRT
20 .endm
21
22#include <asm/hardware/debug-pl01x.S>
diff --git a/arch/arm/include/debug/cns3xxx.S b/arch/arm/include/debug/cns3xxx.S
deleted file mode 100644
index d04c150baa1c..000000000000
--- a/arch/arm/include/debug/cns3xxx.S
+++ /dev/null
@@ -1,19 +0,0 @@
1/*
2 * Debugging macro include header
3 *
4 * Copyright 1994-1999 Russell King
5 * Copyright 2008 Cavium Networks
6 * Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
7 *
8 * This file is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License, Version 2, as
10 * published by the Free Software Foundation.
11 */
12
13 .macro addruart,rp,rv,tmp
14 mov \rp, #0x00009000
15 orr \rv, \rp, #0xf0000000 @ virtual base
16 orr \rp, \rp, #0x10000000
17 .endm
18
19#include <asm/hardware/debug-pl01x.S>
diff --git a/arch/arm/include/debug/highbank.S b/arch/arm/include/debug/highbank.S
deleted file mode 100644
index 8cad4322a5a2..000000000000
--- a/arch/arm/include/debug/highbank.S
+++ /dev/null
@@ -1,17 +0,0 @@
1/*
2 * Debugging macro include header
3 *
4 * Copyright (C) 1994-1999 Russell King
5 * Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11
12 .macro addruart,rp,rv,tmp
13 ldr \rv, =0xfee36000
14 ldr \rp, =0xfff36000
15 .endm
16
17#include <asm/hardware/debug-pl01x.S>
diff --git a/arch/arm/include/debug/keystone.S b/arch/arm/include/debug/keystone.S
deleted file mode 100644
index 9aef9ba3f4f0..000000000000
--- a/arch/arm/include/debug/keystone.S
+++ /dev/null
@@ -1,43 +0,0 @@
1/*
2 * Early serial debug output macro for Keystone SOCs
3 *
4 * Copyright 2013 Texas Instruments, Inc.
5 * Santosh Shilimkar <santosh.shilimkar@ti.com>
6 *
7 * Based on RMKs low level debug code.
8 * Copyright (C) 1994-1999 Russell King
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 */
14
15#include <linux/serial_reg.h>
16
17#define UART_SHIFT 2
18#if defined(CONFIG_DEBUG_KEYSTONE_UART0)
19#define UART_PHYS 0x02530c00
20#define UART_VIRT 0xfeb30c00
21#elif defined(CONFIG_DEBUG_KEYSTONE_UART1)
22#define UART_PHYS 0x02531000
23#define UART_VIRT 0xfeb31000
24#endif
25
26 .macro addruart, rp, rv, tmp
27 ldr \rv, =UART_VIRT @ physical base address
28 ldr \rp, =UART_PHYS @ virtual base address
29 .endm
30
31 .macro senduart,rd,rx
32 str \rd, [\rx, #UART_TX << UART_SHIFT]
33 .endm
34
35 .macro busyuart,rd,rx
361002: ldr \rd, [\rx, #UART_LSR << UART_SHIFT]
37 and \rd, \rd, #UART_LSR_TEMT | UART_LSR_THRE
38 teq \rd, #UART_LSR_TEMT | UART_LSR_THRE
39 bne 1002b
40 .endm
41
42 .macro waituart,rd,rx
43 .endm
diff --git a/arch/arm/mach-msm/include/mach/debug-macro.S b/arch/arm/include/debug/msm.S
index 0e05f88abcd5..9166e1bc470e 100644
--- a/arch/arm/mach-msm/include/mach/debug-macro.S
+++ b/arch/arm/include/debug/msm.S
@@ -15,8 +15,36 @@
15 * 15 *
16 */ 16 */
17 17
18#include <mach/hardware.h> 18#if defined(CONFIG_ARCH_MSM7X00A) || defined(CONFIG_ARCH_QSD8X50)
19#include <mach/msm_iomap.h> 19#define MSM_UART1_PHYS 0xA9A00000
20#define MSM_UART2_PHYS 0xA9B00000
21#define MSM_UART3_PHYS 0xA9C00000
22#elif defined(CONFIG_ARCH_MSM7X30)
23#define MSM_UART1_PHYS 0xACA00000
24#define MSM_UART2_PHYS 0xACB00000
25#define MSM_UART3_PHYS 0xACC00000
26#endif
27
28#if defined(CONFIG_DEBUG_MSM_UART1)
29#define MSM_DEBUG_UART_BASE 0xE1000000
30#define MSM_DEBUG_UART_PHYS MSM_UART1_PHYS
31#elif defined(CONFIG_DEBUG_MSM_UART2)
32#define MSM_DEBUG_UART_BASE 0xE1000000
33#define MSM_DEBUG_UART_PHYS MSM_UART2_PHYS
34#elif defined(CONFIG_DEBUG_MSM_UART3)
35#define MSM_DEBUG_UART_BASE 0xE1000000
36#define MSM_DEBUG_UART_PHYS MSM_UART3_PHYS
37#endif
38
39#ifdef CONFIG_DEBUG_MSM8660_UART
40#define MSM_DEBUG_UART_BASE 0xF0040000
41#define MSM_DEBUG_UART_PHYS 0x19C40000
42#endif
43
44#ifdef CONFIG_DEBUG_MSM8960_UART
45#define MSM_DEBUG_UART_BASE 0xF0040000
46#define MSM_DEBUG_UART_PHYS 0x16440000
47#endif
20 48
21 .macro addruart, rp, rv, tmp 49 .macro addruart, rp, rv, tmp
22#ifdef MSM_DEBUG_UART_PHYS 50#ifdef MSM_DEBUG_UART_PHYS
diff --git a/arch/arm/include/debug/mvebu.S b/arch/arm/include/debug/mvebu.S
deleted file mode 100644
index 6517311a1c91..000000000000
--- a/arch/arm/include/debug/mvebu.S
+++ /dev/null
@@ -1,30 +0,0 @@
1/*
2 * Early serial output macro for Marvell SoC
3 *
4 * Copyright (C) 2012 Marvell
5 *
6 * Lior Amsalem <alior@marvell.com>
7 * Gregory Clement <gregory.clement@free-electrons.com>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12*/
13
14#ifdef CONFIG_DEBUG_MVEBU_UART_ALTERNATE
15#define ARMADA_370_XP_REGS_PHYS_BASE 0xf1000000
16#else
17#define ARMADA_370_XP_REGS_PHYS_BASE 0xd0000000
18#endif
19
20#define ARMADA_370_XP_REGS_VIRT_BASE 0xfec00000
21
22 .macro addruart, rp, rv, tmp
23 ldr \rp, =ARMADA_370_XP_REGS_PHYS_BASE
24 ldr \rv, =ARMADA_370_XP_REGS_VIRT_BASE
25 orr \rp, \rp, #0x00012000
26 orr \rv, \rv, #0x00012000
27 .endm
28
29#define UART_SHIFT 2
30#include <asm/hardware/debug-8250.S>
diff --git a/arch/arm/include/debug/mxs.S b/arch/arm/include/debug/mxs.S
deleted file mode 100644
index d86951551ca1..000000000000
--- a/arch/arm/include/debug/mxs.S
+++ /dev/null
@@ -1,27 +0,0 @@
1/* arch/arm/mach-mxs/include/mach/debug-macro.S
2 *
3 * Debugging macro include header
4 *
5 * Copyright (C) 1994-1999 Russell King
6 * Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 *
12 */
13
14#ifdef CONFIG_DEBUG_IMX23_UART
15#define UART_PADDR 0x80070000
16#elif defined (CONFIG_DEBUG_IMX28_UART)
17#define UART_PADDR 0x80074000
18#endif
19
20#define UART_VADDR 0xfe100000
21
22 .macro addruart, rp, rv, tmp
23 ldr \rp, =UART_PADDR @ physical
24 ldr \rv, =UART_VADDR @ virtual
25 .endm
26
27#include <asm/hardware/debug-pl01x.S>
diff --git a/arch/arm/include/debug/nomadik.S b/arch/arm/include/debug/nomadik.S
deleted file mode 100644
index 735417922ce2..000000000000
--- a/arch/arm/include/debug/nomadik.S
+++ /dev/null
@@ -1,20 +0,0 @@
1/*
2 * Debugging macro include header
3 *
4 * Copyright (C) 1994-1999 Russell King
5 * Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 *
11*/
12
13 .macro addruart, rp, rv, tmp
14 mov \rp, #0x00100000
15 add \rp, \rp, #0x000fb000
16 add \rv, \rp, #0xf0000000 @ virtual base
17 add \rp, \rp, #0x10000000 @ physical base address
18 .endm
19
20#include <asm/hardware/debug-pl01x.S>
diff --git a/arch/arm/include/debug/nspire.S b/arch/arm/include/debug/nspire.S
deleted file mode 100644
index 886fd276fcbc..000000000000
--- a/arch/arm/include/debug/nspire.S
+++ /dev/null
@@ -1,28 +0,0 @@
1/*
2 * linux/arch/arm/include/debug/nspire.S
3 *
4 * Copyright (C) 2013 Daniel Tang <tangrs@tangrs.id.au>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2, as
8 * published by the Free Software Foundation.
9 *
10 */
11
12#define NSPIRE_EARLY_UART_PHYS_BASE 0x90020000
13#define NSPIRE_EARLY_UART_VIRT_BASE 0xfee20000
14
15.macro addruart, rp, rv, tmp
16 ldr \rp, =(NSPIRE_EARLY_UART_PHYS_BASE) @ physical base address
17 ldr \rv, =(NSPIRE_EARLY_UART_VIRT_BASE) @ virtual base address
18.endm
19
20
21#ifdef CONFIG_DEBUG_NSPIRE_CX_UART
22#include <asm/hardware/debug-pl01x.S>
23#endif
24
25#ifdef CONFIG_DEBUG_NSPIRE_CLASSIC_UART
26#define UART_SHIFT 2
27#include <asm/hardware/debug-8250.S>
28#endif
diff --git a/arch/arm/include/debug/picoxcell.S b/arch/arm/include/debug/picoxcell.S
deleted file mode 100644
index bc1f07c49cd4..000000000000
--- a/arch/arm/include/debug/picoxcell.S
+++ /dev/null
@@ -1,19 +0,0 @@
1/*
2 * Copyright (c) 2011 Picochip Ltd., Jamie Iles
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 *
8 */
9
10#define UART_SHIFT 2
11#define PICOXCELL_UART1_BASE 0x80230000
12#define PHYS_TO_IO(x) (((x) & 0x00ffffff) | 0xfe000000)
13
14 .macro addruart, rp, rv, tmp
15 ldr \rv, =PHYS_TO_IO(PICOXCELL_UART1_BASE)
16 ldr \rp, =PICOXCELL_UART1_BASE
17 .endm
18
19#include "8250_32.S"
diff --git a/arch/arm/include/asm/hardware/debug-pl01x.S b/arch/arm/include/debug/pl01x.S
index f9fd083eff63..37c6895b87e6 100644
--- a/arch/arm/include/asm/hardware/debug-pl01x.S
+++ b/arch/arm/include/debug/pl01x.S
@@ -1,4 +1,4 @@
1/* arch/arm/include/asm/hardware/debug-pl01x.S 1/* arch/arm/include/debug/pl01x.S
2 * 2 *
3 * Debugging macro include header 3 * Debugging macro include header
4 * 4 *
@@ -12,6 +12,13 @@
12*/ 12*/
13#include <linux/amba/serial.h> 13#include <linux/amba/serial.h>
14 14
15#ifdef CONFIG_DEBUG_UART_PHYS
16 .macro addruart, rp, rv, tmp
17 ldr \rp, =CONFIG_DEBUG_UART_PHYS
18 ldr \rv, =CONFIG_DEBUG_UART_VIRT
19 .endm
20#endif
21
15 .macro senduart,rd,rx 22 .macro senduart,rd,rx
16 strb \rd, [\rx, #UART01x_DR] 23 strb \rd, [\rx, #UART01x_DR]
17 .endm 24 .endm
diff --git a/arch/arm/include/debug/pxa.S b/arch/arm/include/debug/pxa.S
deleted file mode 100644
index e1e795aa3d7f..000000000000
--- a/arch/arm/include/debug/pxa.S
+++ /dev/null
@@ -1,33 +0,0 @@
1/*
2 * Early serial output macro for Marvell PXA/MMP SoC
3 *
4 * Copyright (C) 1994-1999 Russell King
5 * Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
6 *
7 * Copyright (C) 2013 Haojian Zhuang
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12*/
13
14#if defined(CONFIG_DEBUG_PXA_UART1)
15#define PXA_UART_REG_PHYS_BASE 0x40100000
16#define PXA_UART_REG_VIRT_BASE 0xf2100000
17#elif defined(CONFIG_DEBUG_MMP_UART2)
18#define PXA_UART_REG_PHYS_BASE 0xd4017000
19#define PXA_UART_REG_VIRT_BASE 0xfe017000
20#elif defined(CONFIG_DEBUG_MMP_UART3)
21#define PXA_UART_REG_PHYS_BASE 0xd4018000
22#define PXA_UART_REG_VIRT_BASE 0xfe018000
23#else
24#error "Select uart for DEBUG_LL"
25#endif
26
27 .macro addruart, rp, rv, tmp
28 ldr \rp, =PXA_UART_REG_PHYS_BASE
29 ldr \rv, =PXA_UART_REG_VIRT_BASE
30 .endm
31
32#define UART_SHIFT 2
33#include <asm/hardware/debug-8250.S>
diff --git a/arch/arm/include/debug/rockchip.S b/arch/arm/include/debug/rockchip.S
deleted file mode 100644
index cfd883e69588..000000000000
--- a/arch/arm/include/debug/rockchip.S
+++ /dev/null
@@ -1,42 +0,0 @@
1/*
2 * Early serial output macro for Rockchip SoCs
3 *
4 * Copyright (C) 2012 Maxime Ripard
5 *
6 * Maxime Ripard <maxime.ripard@free-electrons.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11*/
12
13#if defined(CONFIG_DEBUG_RK29_UART0)
14#define ROCKCHIP_UART_DEBUG_PHYS_BASE 0x20060000
15#define ROCKCHIP_UART_DEBUG_VIRT_BASE 0xfed60000
16#elif defined(CONFIG_DEBUG_RK29_UART1)
17#define ROCKCHIP_UART_DEBUG_PHYS_BASE 0x20064000
18#define ROCKCHIP_UART_DEBUG_VIRT_BASE 0xfed64000
19#elif defined(CONFIG_DEBUG_RK29_UART2)
20#define ROCKCHIP_UART_DEBUG_PHYS_BASE 0x20068000
21#define ROCKCHIP_UART_DEBUG_VIRT_BASE 0xfed68000
22#elif defined(CONFIG_DEBUG_RK3X_UART0)
23#define ROCKCHIP_UART_DEBUG_PHYS_BASE 0x10124000
24#define ROCKCHIP_UART_DEBUG_VIRT_BASE 0xfeb24000
25#elif defined(CONFIG_DEBUG_RK3X_UART1)
26#define ROCKCHIP_UART_DEBUG_PHYS_BASE 0x10126000
27#define ROCKCHIP_UART_DEBUG_VIRT_BASE 0xfeb26000
28#elif defined(CONFIG_DEBUG_RK3X_UART2)
29#define ROCKCHIP_UART_DEBUG_PHYS_BASE 0x20064000
30#define ROCKCHIP_UART_DEBUG_VIRT_BASE 0xfed64000
31#elif defined(CONFIG_DEBUG_RK3X_UART3)
32#define ROCKCHIP_UART_DEBUG_PHYS_BASE 0x20068000
33#define ROCKCHIP_UART_DEBUG_VIRT_BASE 0xfed68000
34#endif
35
36 .macro addruart, rp, rv, tmp
37 ldr \rp, =ROCKCHIP_UART_DEBUG_PHYS_BASE
38 ldr \rv, =ROCKCHIP_UART_DEBUG_VIRT_BASE
39 .endm
40
41#define UART_SHIFT 2
42#include <asm/hardware/debug-8250.S>
diff --git a/arch/arm/include/debug/socfpga.S b/arch/arm/include/debug/socfpga.S
deleted file mode 100644
index 966b2f994946..000000000000
--- a/arch/arm/include/debug/socfpga.S
+++ /dev/null
@@ -1,21 +0,0 @@
1/*
2 * Copyright (C) 1994-1999 Russell King
3 * Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 */
9
10#define UART_SHIFT 2
11#define DEBUG_LL_UART_OFFSET 0x00002000
12
13 .macro addruart, rp, rv, tmp
14 mov \rp, #DEBUG_LL_UART_OFFSET
15 orr \rp, \rp, #0x00c00000
16 orr \rv, \rp, #0xfe000000 @ virtual base
17 orr \rp, \rp, #0xff000000 @ physical base
18 .endm
19
20#include "8250_32.S"
21
diff --git a/arch/arm/include/debug/sunxi.S b/arch/arm/include/debug/sunxi.S
deleted file mode 100644
index 04eb56d5db2c..000000000000
--- a/arch/arm/include/debug/sunxi.S
+++ /dev/null
@@ -1,27 +0,0 @@
1/*
2 * Early serial output macro for Allwinner A1X SoCs
3 *
4 * Copyright (C) 2012 Maxime Ripard
5 *
6 * Maxime Ripard <maxime.ripard@free-electrons.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11*/
12
13#if defined(CONFIG_DEBUG_SUNXI_UART0)
14#define SUNXI_UART_DEBUG_PHYS_BASE 0x01c28000
15#define SUNXI_UART_DEBUG_VIRT_BASE 0xf1c28000
16#elif defined(CONFIG_DEBUG_SUNXI_UART1)
17#define SUNXI_UART_DEBUG_PHYS_BASE 0x01c28400
18#define SUNXI_UART_DEBUG_VIRT_BASE 0xf1c28400
19#endif
20
21 .macro addruart, rp, rv, tmp
22 ldr \rp, =SUNXI_UART_DEBUG_PHYS_BASE
23 ldr \rv, =SUNXI_UART_DEBUG_VIRT_BASE
24 .endm
25
26#define UART_SHIFT 2
27#include <asm/hardware/debug-8250.S>
diff --git a/arch/arm/include/debug/tegra.S b/arch/arm/include/debug/tegra.S
index 883d7c22fd9d..be6a720dd183 100644
--- a/arch/arm/include/debug/tegra.S
+++ b/arch/arm/include/debug/tegra.S
@@ -221,3 +221,32 @@
2211002: 2211002:
222#endif 222#endif
223 .endm 223 .endm
224
225/*
226 * Storage for the state maintained by the macros above.
227 *
228 * In the kernel proper, this data is located in arch/arm/mach-tegra/common.c.
229 * That's because this header is included from multiple files, and we only
230 * want a single copy of the data. In particular, the UART probing code above
231 * assumes it's running using physical addresses. This is true when this file
232 * is included from head.o, but not when included from debug.o. So we need
233 * to share the probe results between the two copies, rather than having
234 * to re-run the probing again later.
235 *
236 * In the decompressor, we put the symbol/storage right here, since common.c
237 * isn't included in the decompressor build. This symbol gets put in .text
238 * even though it's really data, since .data is discarded from the
239 * decompressor. Luckily, .text is writeable in the decompressor, unless
240 * CONFIG_ZBOOT_ROM. That dependency is handled in arch/arm/Kconfig.debug.
241 */
242#if defined(ZIMAGE)
243tegra_uart_config:
244 /* Debug UART initialization required */
245 .word 1
246 /* Debug UART physical address */
247 .word 0
248 /* Debug UART virtual address */
249 .word 0
250 /* Scratch space for debug macro */
251 .word 0
252#endif
diff --git a/arch/arm/include/debug/u300.S b/arch/arm/include/debug/u300.S
deleted file mode 100644
index 6f04f08a203c..000000000000
--- a/arch/arm/include/debug/u300.S
+++ /dev/null
@@ -1,18 +0,0 @@
1/*
2 * Copyright (C) 2006-2013 ST-Ericsson AB
3 * License terms: GNU General Public License (GPL) version 2
4 * Debugging macro include header.
5 * Author: Linus Walleij <linus.walleij@stericsson.com>
6 */
7#define U300_SLOW_PER_PHYS_BASE 0xc0010000
8#define U300_SLOW_PER_VIRT_BASE 0xff000000
9
10 .macro addruart, rp, rv, tmp
11 /* If we move the address using MMU, use this. */
12 ldr \rp, = U300_SLOW_PER_PHYS_BASE @ MMU off, physical address
13 ldr \rv, = U300_SLOW_PER_VIRT_BASE @ MMU on, virtual address
14 orr \rp, \rp, #0x00003000
15 orr \rv, \rv, #0x00003000
16 .endm
17
18#include <asm/hardware/debug-pl01x.S>
diff --git a/arch/arm/include/debug/ux500.S b/arch/arm/include/debug/ux500.S
index fbd24beeb1fa..aa7f63a8b5e0 100644
--- a/arch/arm/include/debug/ux500.S
+++ b/arch/arm/include/debug/ux500.S
@@ -45,4 +45,4 @@
45 ldr \rv, =UART_VIRT_BASE @ yes, virtual address 45 ldr \rv, =UART_VIRT_BASE @ yes, virtual address
46 .endm 46 .endm
47 47
48#include <asm/hardware/debug-pl01x.S> 48#include <debug/pl01x.S>
diff --git a/arch/arm/include/debug/vexpress.S b/arch/arm/include/debug/vexpress.S
index acafb229e2b6..524acd5a223e 100644
--- a/arch/arm/include/debug/vexpress.S
+++ b/arch/arm/include/debug/vexpress.S
@@ -47,51 +47,5 @@
47 47
48 .endm 48 .endm
49 49
50#include <asm/hardware/debug-pl01x.S> 50#include <debug/pl01x.S>
51
52#elif defined(CONFIG_DEBUG_VEXPRESS_UART0_CA9)
53
54 .macro addruart,rp,rv,tmp
55 mov \rp, #DEBUG_LL_UART_OFFSET
56 orr \rv, \rp, #DEBUG_LL_VIRT_BASE
57 orr \rp, \rp, #DEBUG_LL_PHYS_BASE
58 .endm
59
60#include <asm/hardware/debug-pl01x.S>
61
62#elif defined(CONFIG_DEBUG_VEXPRESS_UART0_RS1)
63
64 .macro addruart,rp,rv,tmp
65 mov \rp, #DEBUG_LL_UART_OFFSET_RS1
66 orr \rv, \rp, #DEBUG_LL_VIRT_BASE
67 orr \rp, \rp, #DEBUG_LL_PHYS_BASE_RS1
68 .endm
69
70#include <asm/hardware/debug-pl01x.S>
71
72#elif defined(CONFIG_DEBUG_VEXPRESS_UART0_CRX)
73
74 .macro addruart,rp,tmp,tmp2
75 ldr \rp, =DEBUG_LL_UART_PHYS_CRX
76 .endm
77
78#include <asm/hardware/debug-pl01x.S>
79
80#else /* CONFIG_DEBUG_LL_UART_NONE */
81
82 .macro addruart, rp, rv, tmp
83 /* Safe dummy values */
84 mov \rp, #0
85 mov \rv, #DEBUG_LL_VIRT_BASE
86 .endm
87
88 .macro senduart,rd,rx
89 .endm
90
91 .macro waituart,rd,rx
92 .endm
93
94 .macro busyuart,rd,rx
95 .endm
96
97#endif 51#endif
diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile
index 86d10dd47dc4..5140df5f23aa 100644
--- a/arch/arm/kernel/Makefile
+++ b/arch/arm/kernel/Makefile
@@ -24,7 +24,7 @@ obj-$(CONFIG_ATAGS_PROC) += atags_proc.o
24obj-$(CONFIG_DEPRECATED_PARAM_STRUCT) += atags_compat.o 24obj-$(CONFIG_DEPRECATED_PARAM_STRUCT) += atags_compat.o
25 25
26ifeq ($(CONFIG_CPU_V7M),y) 26ifeq ($(CONFIG_CPU_V7M),y)
27obj-y += entry-v7m.o 27obj-y += entry-v7m.o v7m.o
28else 28else
29obj-y += entry-armv.o 29obj-y += entry-armv.o
30endif 30endif
diff --git a/arch/arm/kernel/atags.h b/arch/arm/kernel/atags.h
index 9edc9692332d..ec4164da6e30 100644
--- a/arch/arm/kernel/atags.h
+++ b/arch/arm/kernel/atags.h
@@ -7,9 +7,10 @@ static inline void save_atags(struct tag *tags) { }
7void convert_to_tag_list(struct tag *tags); 7void convert_to_tag_list(struct tag *tags);
8 8
9#ifdef CONFIG_ATAGS 9#ifdef CONFIG_ATAGS
10struct machine_desc *setup_machine_tags(phys_addr_t __atags_pointer, unsigned int machine_nr); 10const struct machine_desc *setup_machine_tags(phys_addr_t __atags_pointer,
11 unsigned int machine_nr);
11#else 12#else
12static inline struct machine_desc * 13static inline const struct machine_desc *
13setup_machine_tags(phys_addr_t __atags_pointer, unsigned int machine_nr) 14setup_machine_tags(phys_addr_t __atags_pointer, unsigned int machine_nr)
14{ 15{
15 early_print("no ATAGS support: can't continue\n"); 16 early_print("no ATAGS support: can't continue\n");
diff --git a/arch/arm/kernel/atags_parse.c b/arch/arm/kernel/atags_parse.c
index 14512e6931d8..8c14de8180c0 100644
--- a/arch/arm/kernel/atags_parse.c
+++ b/arch/arm/kernel/atags_parse.c
@@ -178,11 +178,11 @@ static void __init squash_mem_tags(struct tag *tag)
178 tag->hdr.tag = ATAG_NONE; 178 tag->hdr.tag = ATAG_NONE;
179} 179}
180 180
181struct machine_desc * __init setup_machine_tags(phys_addr_t __atags_pointer, 181const struct machine_desc * __init
182 unsigned int machine_nr) 182setup_machine_tags(phys_addr_t __atags_pointer, unsigned int machine_nr)
183{ 183{
184 struct tag *tags = (struct tag *)&default_tags; 184 struct tag *tags = (struct tag *)&default_tags;
185 struct machine_desc *mdesc = NULL, *p; 185 const struct machine_desc *mdesc = NULL, *p;
186 char *from = default_command_line; 186 char *from = default_command_line;
187 187
188 default_tags.mem.start = PHYS_OFFSET; 188 default_tags.mem.start = PHYS_OFFSET;
diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c
index 261fcc826169..317da88ae65b 100644
--- a/arch/arm/kernel/bios32.c
+++ b/arch/arm/kernel/bios32.c
@@ -363,6 +363,20 @@ void pcibios_fixup_bus(struct pci_bus *bus)
363} 363}
364EXPORT_SYMBOL(pcibios_fixup_bus); 364EXPORT_SYMBOL(pcibios_fixup_bus);
365 365
366void pcibios_add_bus(struct pci_bus *bus)
367{
368 struct pci_sys_data *sys = bus->sysdata;
369 if (sys->add_bus)
370 sys->add_bus(bus);
371}
372
373void pcibios_remove_bus(struct pci_bus *bus)
374{
375 struct pci_sys_data *sys = bus->sysdata;
376 if (sys->remove_bus)
377 sys->remove_bus(bus);
378}
379
366/* 380/*
367 * Swizzle the device pin each time we cross a bridge. If a platform does 381 * Swizzle the device pin each time we cross a bridge. If a platform does
368 * not provide a swizzle function, we perform the standard PCI swizzling. 382 * not provide a swizzle function, we perform the standard PCI swizzling.
@@ -464,6 +478,8 @@ static void pcibios_init_hw(struct device *parent, struct hw_pci *hw,
464 sys->swizzle = hw->swizzle; 478 sys->swizzle = hw->swizzle;
465 sys->map_irq = hw->map_irq; 479 sys->map_irq = hw->map_irq;
466 sys->align_resource = hw->align_resource; 480 sys->align_resource = hw->align_resource;
481 sys->add_bus = hw->add_bus;
482 sys->remove_bus = hw->remove_bus;
467 INIT_LIST_HEAD(&sys->resources); 483 INIT_LIST_HEAD(&sys->resources);
468 484
469 if (hw->private_data) 485 if (hw->private_data)
@@ -525,11 +541,6 @@ void pci_common_init_dev(struct device *parent, struct hw_pci *hw)
525 * Assign resources. 541 * Assign resources.
526 */ 542 */
527 pci_bus_assign_resources(bus); 543 pci_bus_assign_resources(bus);
528
529 /*
530 * Enable bridges
531 */
532 pci_enable_bridges(bus);
533 } 544 }
534 545
535 /* 546 /*
diff --git a/arch/arm/kernel/devtree.c b/arch/arm/kernel/devtree.c
index 5859c8bc727c..f35906b3d8c9 100644
--- a/arch/arm/kernel/devtree.c
+++ b/arch/arm/kernel/devtree.c
@@ -169,6 +169,11 @@ void __init arm_dt_init_cpu_maps(void)
169 } 169 }
170} 170}
171 171
172bool arch_match_cpu_phys_id(int cpu, u64 phys_id)
173{
174 return (phys_id & MPIDR_HWID_BITMASK) == cpu_logical_map(cpu);
175}
176
172/** 177/**
173 * setup_machine_fdt - Machine setup when an dtb was passed to the kernel 178 * setup_machine_fdt - Machine setup when an dtb was passed to the kernel
174 * @dt_phys: physical address of dt blob 179 * @dt_phys: physical address of dt blob
@@ -176,10 +181,10 @@ void __init arm_dt_init_cpu_maps(void)
176 * If a dtb was passed to the kernel in r2, then use it to choose the 181 * If a dtb was passed to the kernel in r2, then use it to choose the
177 * correct machine_desc and to setup the system. 182 * correct machine_desc and to setup the system.
178 */ 183 */
179struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys) 184const struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys)
180{ 185{
181 struct boot_param_header *devtree; 186 struct boot_param_header *devtree;
182 struct machine_desc *mdesc, *mdesc_best = NULL; 187 const struct machine_desc *mdesc, *mdesc_best = NULL;
183 unsigned int score, mdesc_score = ~1; 188 unsigned int score, mdesc_score = ~1;
184 unsigned long dt_root; 189 unsigned long dt_root;
185 const char *model; 190 const char *model;
@@ -188,7 +193,7 @@ struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys)
188 DT_MACHINE_START(GENERIC_DT, "Generic DT based system") 193 DT_MACHINE_START(GENERIC_DT, "Generic DT based system")
189 MACHINE_END 194 MACHINE_END
190 195
191 mdesc_best = (struct machine_desc *)&__mach_desc_GENERIC_DT; 196 mdesc_best = &__mach_desc_GENERIC_DT;
192#endif 197#endif
193 198
194 if (!dt_phys) 199 if (!dt_phys)
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S
index 94104bf69719..74ad15d1a065 100644
--- a/arch/arm/kernel/entry-common.S
+++ b/arch/arm/kernel/entry-common.S
@@ -442,10 +442,10 @@ local_restart:
442 ldrcc pc, [tbl, scno, lsl #2] @ call sys_* routine 442 ldrcc pc, [tbl, scno, lsl #2] @ call sys_* routine
443 443
444 add r1, sp, #S_OFF 444 add r1, sp, #S_OFF
4452: mov why, #0 @ no longer a real syscall
446 cmp scno, #(__ARM_NR_BASE - __NR_SYSCALL_BASE) 445 cmp scno, #(__ARM_NR_BASE - __NR_SYSCALL_BASE)
447 eor r0, scno, #__NR_SYSCALL_BASE @ put OS number back 446 eor r0, scno, #__NR_SYSCALL_BASE @ put OS number back
448 bcs arm_syscall 447 bcs arm_syscall
4482: mov why, #0 @ no longer a real syscall
449 b sys_ni_syscall @ not private func 449 b sys_ni_syscall @ not private func
450 450
451#if defined(CONFIG_OABI_COMPAT) || !defined(CONFIG_AEABI) 451#if defined(CONFIG_OABI_COMPAT) || !defined(CONFIG_AEABI)
diff --git a/arch/arm/kernel/module.c b/arch/arm/kernel/module.c
index 85c3fb6c93c2..084dc8896986 100644
--- a/arch/arm/kernel/module.c
+++ b/arch/arm/kernel/module.c
@@ -292,12 +292,20 @@ int module_finalize(const Elf32_Ehdr *hdr, const Elf_Shdr *sechdrs,
292 maps[ARM_SEC_CORE].unw_sec = s; 292 maps[ARM_SEC_CORE].unw_sec = s;
293 else if (strcmp(".ARM.exidx.exit.text", secname) == 0) 293 else if (strcmp(".ARM.exidx.exit.text", secname) == 0)
294 maps[ARM_SEC_EXIT].unw_sec = s; 294 maps[ARM_SEC_EXIT].unw_sec = s;
295 else if (strcmp(".ARM.exidx.text.unlikely", secname) == 0)
296 maps[ARM_SEC_UNLIKELY].unw_sec = s;
297 else if (strcmp(".ARM.exidx.text.hot", secname) == 0)
298 maps[ARM_SEC_HOT].unw_sec = s;
295 else if (strcmp(".init.text", secname) == 0) 299 else if (strcmp(".init.text", secname) == 0)
296 maps[ARM_SEC_INIT].txt_sec = s; 300 maps[ARM_SEC_INIT].txt_sec = s;
297 else if (strcmp(".text", secname) == 0) 301 else if (strcmp(".text", secname) == 0)
298 maps[ARM_SEC_CORE].txt_sec = s; 302 maps[ARM_SEC_CORE].txt_sec = s;
299 else if (strcmp(".exit.text", secname) == 0) 303 else if (strcmp(".exit.text", secname) == 0)
300 maps[ARM_SEC_EXIT].txt_sec = s; 304 maps[ARM_SEC_EXIT].txt_sec = s;
305 else if (strcmp(".text.unlikely", secname) == 0)
306 maps[ARM_SEC_UNLIKELY].txt_sec = s;
307 else if (strcmp(".text.hot", secname) == 0)
308 maps[ARM_SEC_HOT].txt_sec = s;
301 } 309 }
302 310
303 for (i = 0; i < ARM_SEC_MAX; i++) 311 for (i = 0; i < ARM_SEC_MAX; i++)
diff --git a/arch/arm/kernel/perf_event_cpu.c b/arch/arm/kernel/perf_event_cpu.c
index aebe0e99c153..8d6147b2001f 100644
--- a/arch/arm/kernel/perf_event_cpu.c
+++ b/arch/arm/kernel/perf_event_cpu.c
@@ -118,7 +118,8 @@ static int cpu_pmu_request_irq(struct arm_pmu *cpu_pmu, irq_handler_t handler)
118 continue; 118 continue;
119 } 119 }
120 120
121 err = request_irq(irq, handler, IRQF_NOBALANCING, "arm-pmu", 121 err = request_irq(irq, handler,
122 IRQF_NOBALANCING | IRQF_NO_THREAD, "arm-pmu",
122 cpu_pmu); 123 cpu_pmu);
123 if (err) { 124 if (err) {
124 pr_err("unable to request IRQ%d for ARM PMU counters\n", 125 pr_err("unable to request IRQ%d for ARM PMU counters\n",
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index afc2489ee13b..0e1e2b3afa45 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -72,10 +72,10 @@ static int __init fpe_setup(char *line)
72__setup("fpe=", fpe_setup); 72__setup("fpe=", fpe_setup);
73#endif 73#endif
74 74
75extern void paging_init(struct machine_desc *desc); 75extern void paging_init(const struct machine_desc *desc);
76extern void sanity_check_meminfo(void); 76extern void sanity_check_meminfo(void);
77extern enum reboot_mode reboot_mode; 77extern enum reboot_mode reboot_mode;
78extern void setup_dma_zone(struct machine_desc *desc); 78extern void setup_dma_zone(const struct machine_desc *desc);
79 79
80unsigned int processor_id; 80unsigned int processor_id;
81EXPORT_SYMBOL(processor_id); 81EXPORT_SYMBOL(processor_id);
@@ -139,7 +139,7 @@ EXPORT_SYMBOL(elf_platform);
139static const char *cpu_name; 139static const char *cpu_name;
140static const char *machine_name; 140static const char *machine_name;
141static char __initdata cmd_line[COMMAND_LINE_SIZE]; 141static char __initdata cmd_line[COMMAND_LINE_SIZE];
142struct machine_desc *machine_desc __initdata; 142const struct machine_desc *machine_desc __initdata;
143 143
144static union { char c[4]; unsigned long l; } endian_test __initdata = { { 'l', '?', '?', 'b' } }; 144static union { char c[4]; unsigned long l; } endian_test __initdata = { { 'l', '?', '?', 'b' } };
145#define ENDIANNESS ((char)endian_test.l) 145#define ENDIANNESS ((char)endian_test.l)
@@ -607,7 +607,7 @@ static void __init setup_processor(void)
607 607
608void __init dump_machine_table(void) 608void __init dump_machine_table(void)
609{ 609{
610 struct machine_desc *p; 610 const struct machine_desc *p;
611 611
612 early_print("Available machine support:\n\nID (hex)\tNAME\n"); 612 early_print("Available machine support:\n\nID (hex)\tNAME\n");
613 for_each_machine_desc(p) 613 for_each_machine_desc(p)
@@ -694,7 +694,7 @@ static int __init early_mem(char *p)
694} 694}
695early_param("mem", early_mem); 695early_param("mem", early_mem);
696 696
697static void __init request_standard_resources(struct machine_desc *mdesc) 697static void __init request_standard_resources(const struct machine_desc *mdesc)
698{ 698{
699 struct memblock_region *region; 699 struct memblock_region *region;
700 struct resource *res; 700 struct resource *res;
@@ -852,7 +852,7 @@ void __init hyp_mode_check(void)
852 852
853void __init setup_arch(char **cmdline_p) 853void __init setup_arch(char **cmdline_p)
854{ 854{
855 struct machine_desc *mdesc; 855 const struct machine_desc *mdesc;
856 856
857 setup_processor(); 857 setup_processor();
858 mdesc = setup_machine_fdt(__atags_pointer); 858 mdesc = setup_machine_fdt(__atags_pointer);
@@ -994,15 +994,6 @@ static int c_show(struct seq_file *m, void *v)
994 seq_printf(m, "model name\t: %s rev %d (%s)\n", 994 seq_printf(m, "model name\t: %s rev %d (%s)\n",
995 cpu_name, cpuid & 15, elf_platform); 995 cpu_name, cpuid & 15, elf_platform);
996 996
997#if defined(CONFIG_SMP)
998 seq_printf(m, "BogoMIPS\t: %lu.%02lu\n",
999 per_cpu(cpu_data, i).loops_per_jiffy / (500000UL/HZ),
1000 (per_cpu(cpu_data, i).loops_per_jiffy / (5000UL/HZ)) % 100);
1001#else
1002 seq_printf(m, "BogoMIPS\t: %lu.%02lu\n",
1003 loops_per_jiffy / (500000/HZ),
1004 (loops_per_jiffy / (5000/HZ)) % 100);
1005#endif
1006 /* dump out the processor features */ 997 /* dump out the processor features */
1007 seq_puts(m, "Features\t: "); 998 seq_puts(m, "Features\t: ");
1008 999
diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
index 2dc19349eb19..72024ea8a3a6 100644
--- a/arch/arm/kernel/smp.c
+++ b/arch/arm/kernel/smp.c
@@ -41,7 +41,6 @@
41#include <asm/sections.h> 41#include <asm/sections.h>
42#include <asm/tlbflush.h> 42#include <asm/tlbflush.h>
43#include <asm/ptrace.h> 43#include <asm/ptrace.h>
44#include <asm/localtimer.h>
45#include <asm/smp_plat.h> 44#include <asm/smp_plat.h>
46#include <asm/virt.h> 45#include <asm/virt.h>
47#include <asm/mach/arch.h> 46#include <asm/mach/arch.h>
@@ -156,8 +155,6 @@ int platform_can_cpu_hotplug(void)
156} 155}
157 156
158#ifdef CONFIG_HOTPLUG_CPU 157#ifdef CONFIG_HOTPLUG_CPU
159static void percpu_timer_stop(void);
160
161static int platform_cpu_kill(unsigned int cpu) 158static int platform_cpu_kill(unsigned int cpu)
162{ 159{
163 if (smp_ops.cpu_kill) 160 if (smp_ops.cpu_kill)
@@ -201,11 +198,6 @@ int __cpu_disable(void)
201 migrate_irqs(); 198 migrate_irqs();
202 199
203 /* 200 /*
204 * Stop the local timer for this CPU.
205 */
206 percpu_timer_stop();
207
208 /*
209 * Flush user cache and TLB mappings, and then remove this CPU 201 * Flush user cache and TLB mappings, and then remove this CPU
210 * from the vm mask set of all processes. 202 * from the vm mask set of all processes.
211 * 203 *
@@ -326,8 +318,6 @@ static void smp_store_cpu_info(unsigned int cpuid)
326 store_cpu_topology(cpuid); 318 store_cpu_topology(cpuid);
327} 319}
328 320
329static void percpu_timer_setup(void);
330
331/* 321/*
332 * This is the secondary CPU boot entry. We're using this CPUs 322 * This is the secondary CPU boot entry. We're using this CPUs
333 * idle thread stack, but a set of temporary page tables. 323 * idle thread stack, but a set of temporary page tables.
@@ -382,11 +372,6 @@ asmlinkage void secondary_start_kernel(void)
382 set_cpu_online(cpu, true); 372 set_cpu_online(cpu, true);
383 complete(&cpu_running); 373 complete(&cpu_running);
384 374
385 /*
386 * Setup the percpu timer for this CPU.
387 */
388 percpu_timer_setup();
389
390 local_irq_enable(); 375 local_irq_enable();
391 local_fiq_enable(); 376 local_fiq_enable();
392 377
@@ -398,17 +383,8 @@ asmlinkage void secondary_start_kernel(void)
398 383
399void __init smp_cpus_done(unsigned int max_cpus) 384void __init smp_cpus_done(unsigned int max_cpus)
400{ 385{
401 int cpu; 386 printk(KERN_INFO "SMP: Total of %d processors activated.\n",
402 unsigned long bogosum = 0; 387 num_online_cpus());
403
404 for_each_online_cpu(cpu)
405 bogosum += per_cpu(cpu_data, cpu).loops_per_jiffy;
406
407 printk(KERN_INFO "SMP: Total of %d processors activated "
408 "(%lu.%02lu BogoMIPS).\n",
409 num_online_cpus(),
410 bogosum / (500000/HZ),
411 (bogosum / (5000/HZ)) % 100);
412 388
413 hyp_mode_check(); 389 hyp_mode_check();
414} 390}
@@ -433,12 +409,6 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
433 max_cpus = ncores; 409 max_cpus = ncores;
434 if (ncores > 1 && max_cpus) { 410 if (ncores > 1 && max_cpus) {
435 /* 411 /*
436 * Enable the local timer or broadcast device for the
437 * boot CPU, but only if we have more than one CPU.
438 */
439 percpu_timer_setup();
440
441 /*
442 * Initialise the present map, which describes the set of CPUs 412 * Initialise the present map, which describes the set of CPUs
443 * actually populated at the present time. A platform should 413 * actually populated at the present time. A platform should
444 * re-initialize the map in the platforms smp_prepare_cpus() 414 * re-initialize the map in the platforms smp_prepare_cpus()
@@ -514,11 +484,6 @@ u64 smp_irq_stat_cpu(unsigned int cpu)
514 return sum; 484 return sum;
515} 485}
516 486
517/*
518 * Timer (local or broadcast) support
519 */
520static DEFINE_PER_CPU(struct clock_event_device, percpu_clockevent);
521
522#ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST 487#ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
523void tick_broadcast(const struct cpumask *mask) 488void tick_broadcast(const struct cpumask *mask)
524{ 489{
@@ -526,67 +491,6 @@ void tick_broadcast(const struct cpumask *mask)
526} 491}
527#endif 492#endif
528 493
529static void broadcast_timer_set_mode(enum clock_event_mode mode,
530 struct clock_event_device *evt)
531{
532}
533
534static void broadcast_timer_setup(struct clock_event_device *evt)
535{
536 evt->name = "dummy_timer";
537 evt->features = CLOCK_EVT_FEAT_ONESHOT |
538 CLOCK_EVT_FEAT_PERIODIC |
539 CLOCK_EVT_FEAT_DUMMY;
540 evt->rating = 100;
541 evt->mult = 1;
542 evt->set_mode = broadcast_timer_set_mode;
543
544 clockevents_register_device(evt);
545}
546
547static struct local_timer_ops *lt_ops;
548
549#ifdef CONFIG_LOCAL_TIMERS
550int local_timer_register(struct local_timer_ops *ops)
551{
552 if (!is_smp() || !setup_max_cpus)
553 return -ENXIO;
554
555 if (lt_ops)
556 return -EBUSY;
557
558 lt_ops = ops;
559 return 0;
560}
561#endif
562
563static void percpu_timer_setup(void)
564{
565 unsigned int cpu = smp_processor_id();
566 struct clock_event_device *evt = &per_cpu(percpu_clockevent, cpu);
567
568 evt->cpumask = cpumask_of(cpu);
569
570 if (!lt_ops || lt_ops->setup(evt))
571 broadcast_timer_setup(evt);
572}
573
574#ifdef CONFIG_HOTPLUG_CPU
575/*
576 * The generic clock events code purposely does not stop the local timer
577 * on CPU_DEAD/CPU_DEAD_FROZEN hotplug events, so we have to do it
578 * manually here.
579 */
580static void percpu_timer_stop(void)
581{
582 unsigned int cpu = smp_processor_id();
583 struct clock_event_device *evt = &per_cpu(percpu_clockevent, cpu);
584
585 if (lt_ops)
586 lt_ops->stop(evt);
587}
588#endif
589
590static DEFINE_RAW_SPINLOCK(stop_lock); 494static DEFINE_RAW_SPINLOCK(stop_lock);
591 495
592/* 496/*
diff --git a/arch/arm/kernel/smp_tlb.c b/arch/arm/kernel/smp_tlb.c
index c2edfff573c2..83ccca303df8 100644
--- a/arch/arm/kernel/smp_tlb.c
+++ b/arch/arm/kernel/smp_tlb.c
@@ -104,7 +104,7 @@ void flush_tlb_all(void)
104 if (tlb_ops_need_broadcast()) 104 if (tlb_ops_need_broadcast())
105 on_each_cpu(ipi_flush_tlb_all, NULL, 1); 105 on_each_cpu(ipi_flush_tlb_all, NULL, 1);
106 else 106 else
107 local_flush_tlb_all(); 107 __flush_tlb_all();
108 broadcast_tlb_a15_erratum(); 108 broadcast_tlb_a15_erratum();
109} 109}
110 110
@@ -113,7 +113,7 @@ void flush_tlb_mm(struct mm_struct *mm)
113 if (tlb_ops_need_broadcast()) 113 if (tlb_ops_need_broadcast())
114 on_each_cpu_mask(mm_cpumask(mm), ipi_flush_tlb_mm, mm, 1); 114 on_each_cpu_mask(mm_cpumask(mm), ipi_flush_tlb_mm, mm, 1);
115 else 115 else
116 local_flush_tlb_mm(mm); 116 __flush_tlb_mm(mm);
117 broadcast_tlb_mm_a15_erratum(mm); 117 broadcast_tlb_mm_a15_erratum(mm);
118} 118}
119 119
@@ -126,7 +126,7 @@ void flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
126 on_each_cpu_mask(mm_cpumask(vma->vm_mm), ipi_flush_tlb_page, 126 on_each_cpu_mask(mm_cpumask(vma->vm_mm), ipi_flush_tlb_page,
127 &ta, 1); 127 &ta, 1);
128 } else 128 } else
129 local_flush_tlb_page(vma, uaddr); 129 __flush_tlb_page(vma, uaddr);
130 broadcast_tlb_mm_a15_erratum(vma->vm_mm); 130 broadcast_tlb_mm_a15_erratum(vma->vm_mm);
131} 131}
132 132
@@ -137,7 +137,7 @@ void flush_tlb_kernel_page(unsigned long kaddr)
137 ta.ta_start = kaddr; 137 ta.ta_start = kaddr;
138 on_each_cpu(ipi_flush_tlb_kernel_page, &ta, 1); 138 on_each_cpu(ipi_flush_tlb_kernel_page, &ta, 1);
139 } else 139 } else
140 local_flush_tlb_kernel_page(kaddr); 140 __flush_tlb_kernel_page(kaddr);
141 broadcast_tlb_a15_erratum(); 141 broadcast_tlb_a15_erratum();
142} 142}
143 143
@@ -173,5 +173,5 @@ void flush_bp_all(void)
173 if (tlb_ops_need_broadcast()) 173 if (tlb_ops_need_broadcast())
174 on_each_cpu(ipi_flush_bp_all, NULL, 1); 174 on_each_cpu(ipi_flush_bp_all, NULL, 1);
175 else 175 else
176 local_flush_bp_all(); 176 __flush_bp_all();
177} 177}
diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c
index 25956204ef23..2985c9f0905d 100644
--- a/arch/arm/kernel/smp_twd.c
+++ b/arch/arm/kernel/smp_twd.c
@@ -11,6 +11,7 @@
11#include <linux/init.h> 11#include <linux/init.h>
12#include <linux/kernel.h> 12#include <linux/kernel.h>
13#include <linux/clk.h> 13#include <linux/clk.h>
14#include <linux/cpu.h>
14#include <linux/delay.h> 15#include <linux/delay.h>
15#include <linux/device.h> 16#include <linux/device.h>
16#include <linux/err.h> 17#include <linux/err.h>
@@ -24,7 +25,6 @@
24 25
25#include <asm/smp_plat.h> 26#include <asm/smp_plat.h>
26#include <asm/smp_twd.h> 27#include <asm/smp_twd.h>
27#include <asm/localtimer.h>
28 28
29/* set up by the platform code */ 29/* set up by the platform code */
30static void __iomem *twd_base; 30static void __iomem *twd_base;
@@ -33,7 +33,7 @@ static struct clk *twd_clk;
33static unsigned long twd_timer_rate; 33static unsigned long twd_timer_rate;
34static DEFINE_PER_CPU(bool, percpu_setup_called); 34static DEFINE_PER_CPU(bool, percpu_setup_called);
35 35
36static struct clock_event_device __percpu **twd_evt; 36static struct clock_event_device __percpu *twd_evt;
37static int twd_ppi; 37static int twd_ppi;
38 38
39static void twd_set_mode(enum clock_event_mode mode, 39static void twd_set_mode(enum clock_event_mode mode,
@@ -90,8 +90,10 @@ static int twd_timer_ack(void)
90 return 0; 90 return 0;
91} 91}
92 92
93static void twd_timer_stop(struct clock_event_device *clk) 93static void twd_timer_stop(void)
94{ 94{
95 struct clock_event_device *clk = __this_cpu_ptr(twd_evt);
96
95 twd_set_mode(CLOCK_EVT_MODE_UNUSED, clk); 97 twd_set_mode(CLOCK_EVT_MODE_UNUSED, clk);
96 disable_percpu_irq(clk->irq); 98 disable_percpu_irq(clk->irq);
97} 99}
@@ -106,7 +108,7 @@ static void twd_update_frequency(void *new_rate)
106{ 108{
107 twd_timer_rate = *((unsigned long *) new_rate); 109 twd_timer_rate = *((unsigned long *) new_rate);
108 110
109 clockevents_update_freq(*__this_cpu_ptr(twd_evt), twd_timer_rate); 111 clockevents_update_freq(__this_cpu_ptr(twd_evt), twd_timer_rate);
110} 112}
111 113
112static int twd_rate_change(struct notifier_block *nb, 114static int twd_rate_change(struct notifier_block *nb,
@@ -132,7 +134,7 @@ static struct notifier_block twd_clk_nb = {
132 134
133static int twd_clk_init(void) 135static int twd_clk_init(void)
134{ 136{
135 if (twd_evt && *__this_cpu_ptr(twd_evt) && !IS_ERR(twd_clk)) 137 if (twd_evt && __this_cpu_ptr(twd_evt) && !IS_ERR(twd_clk))
136 return clk_notifier_register(twd_clk, &twd_clk_nb); 138 return clk_notifier_register(twd_clk, &twd_clk_nb);
137 139
138 return 0; 140 return 0;
@@ -151,7 +153,7 @@ static void twd_update_frequency(void *data)
151{ 153{
152 twd_timer_rate = clk_get_rate(twd_clk); 154 twd_timer_rate = clk_get_rate(twd_clk);
153 155
154 clockevents_update_freq(*__this_cpu_ptr(twd_evt), twd_timer_rate); 156 clockevents_update_freq(__this_cpu_ptr(twd_evt), twd_timer_rate);
155} 157}
156 158
157static int twd_cpufreq_transition(struct notifier_block *nb, 159static int twd_cpufreq_transition(struct notifier_block *nb,
@@ -177,7 +179,7 @@ static struct notifier_block twd_cpufreq_nb = {
177 179
178static int twd_cpufreq_init(void) 180static int twd_cpufreq_init(void)
179{ 181{
180 if (twd_evt && *__this_cpu_ptr(twd_evt) && !IS_ERR(twd_clk)) 182 if (twd_evt && __this_cpu_ptr(twd_evt) && !IS_ERR(twd_clk))
181 return cpufreq_register_notifier(&twd_cpufreq_nb, 183 return cpufreq_register_notifier(&twd_cpufreq_nb,
182 CPUFREQ_TRANSITION_NOTIFIER); 184 CPUFREQ_TRANSITION_NOTIFIER);
183 185
@@ -228,7 +230,7 @@ static void twd_calibrate_rate(void)
228 230
229static irqreturn_t twd_handler(int irq, void *dev_id) 231static irqreturn_t twd_handler(int irq, void *dev_id)
230{ 232{
231 struct clock_event_device *evt = *(struct clock_event_device **)dev_id; 233 struct clock_event_device *evt = dev_id;
232 234
233 if (twd_timer_ack()) { 235 if (twd_timer_ack()) {
234 evt->event_handler(evt); 236 evt->event_handler(evt);
@@ -265,9 +267,9 @@ static void twd_get_clock(struct device_node *np)
265/* 267/*
266 * Setup the local clock events for a CPU. 268 * Setup the local clock events for a CPU.
267 */ 269 */
268static int twd_timer_setup(struct clock_event_device *clk) 270static void twd_timer_setup(void)
269{ 271{
270 struct clock_event_device **this_cpu_clk; 272 struct clock_event_device *clk = __this_cpu_ptr(twd_evt);
271 int cpu = smp_processor_id(); 273 int cpu = smp_processor_id();
272 274
273 /* 275 /*
@@ -276,9 +278,9 @@ static int twd_timer_setup(struct clock_event_device *clk)
276 */ 278 */
277 if (per_cpu(percpu_setup_called, cpu)) { 279 if (per_cpu(percpu_setup_called, cpu)) {
278 __raw_writel(0, twd_base + TWD_TIMER_CONTROL); 280 __raw_writel(0, twd_base + TWD_TIMER_CONTROL);
279 clockevents_register_device(*__this_cpu_ptr(twd_evt)); 281 clockevents_register_device(clk);
280 enable_percpu_irq(clk->irq, 0); 282 enable_percpu_irq(clk->irq, 0);
281 return 0; 283 return;
282 } 284 }
283 per_cpu(percpu_setup_called, cpu) = true; 285 per_cpu(percpu_setup_called, cpu) = true;
284 286
@@ -297,27 +299,37 @@ static int twd_timer_setup(struct clock_event_device *clk)
297 clk->set_mode = twd_set_mode; 299 clk->set_mode = twd_set_mode;
298 clk->set_next_event = twd_set_next_event; 300 clk->set_next_event = twd_set_next_event;
299 clk->irq = twd_ppi; 301 clk->irq = twd_ppi;
300 302 clk->cpumask = cpumask_of(cpu);
301 this_cpu_clk = __this_cpu_ptr(twd_evt);
302 *this_cpu_clk = clk;
303 303
304 clockevents_config_and_register(clk, twd_timer_rate, 304 clockevents_config_and_register(clk, twd_timer_rate,
305 0xf, 0xffffffff); 305 0xf, 0xffffffff);
306 enable_percpu_irq(clk->irq, 0); 306 enable_percpu_irq(clk->irq, 0);
307}
307 308
308 return 0; 309static int twd_timer_cpu_notify(struct notifier_block *self,
310 unsigned long action, void *hcpu)
311{
312 switch (action & ~CPU_TASKS_FROZEN) {
313 case CPU_STARTING:
314 twd_timer_setup();
315 break;
316 case CPU_DYING:
317 twd_timer_stop();
318 break;
319 }
320
321 return NOTIFY_OK;
309} 322}
310 323
311static struct local_timer_ops twd_lt_ops = { 324static struct notifier_block twd_timer_cpu_nb = {
312 .setup = twd_timer_setup, 325 .notifier_call = twd_timer_cpu_notify,
313 .stop = twd_timer_stop,
314}; 326};
315 327
316static int __init twd_local_timer_common_register(struct device_node *np) 328static int __init twd_local_timer_common_register(struct device_node *np)
317{ 329{
318 int err; 330 int err;
319 331
320 twd_evt = alloc_percpu(struct clock_event_device *); 332 twd_evt = alloc_percpu(struct clock_event_device);
321 if (!twd_evt) { 333 if (!twd_evt) {
322 err = -ENOMEM; 334 err = -ENOMEM;
323 goto out_free; 335 goto out_free;
@@ -329,12 +341,22 @@ static int __init twd_local_timer_common_register(struct device_node *np)
329 goto out_free; 341 goto out_free;
330 } 342 }
331 343
332 err = local_timer_register(&twd_lt_ops); 344 err = register_cpu_notifier(&twd_timer_cpu_nb);
333 if (err) 345 if (err)
334 goto out_irq; 346 goto out_irq;
335 347
336 twd_get_clock(np); 348 twd_get_clock(np);
337 349
350 /*
351 * Immediately configure the timer on the boot CPU, unless we need
352 * jiffies to be incrementing to calibrate the rate in which case
353 * setup the timer in late_time_init.
354 */
355 if (twd_timer_rate)
356 twd_timer_setup();
357 else
358 late_time_init = twd_timer_setup;
359
338 return 0; 360 return 0;
339 361
340out_irq: 362out_irq:
diff --git a/arch/arm/kernel/topology.c b/arch/arm/kernel/topology.c
index c5a59546a256..85a87370f144 100644
--- a/arch/arm/kernel/topology.c
+++ b/arch/arm/kernel/topology.c
@@ -74,12 +74,8 @@ struct cpu_efficiency table_efficiency[] = {
74 {NULL, }, 74 {NULL, },
75}; 75};
76 76
77struct cpu_capacity { 77unsigned long *__cpu_capacity;
78 unsigned long hwid; 78#define cpu_capacity(cpu) __cpu_capacity[cpu]
79 unsigned long capacity;
80};
81
82struct cpu_capacity *cpu_capacity;
83 79
84unsigned long middle_capacity = 1; 80unsigned long middle_capacity = 1;
85 81
@@ -100,15 +96,19 @@ static void __init parse_dt_topology(void)
100 unsigned long capacity = 0; 96 unsigned long capacity = 0;
101 int alloc_size, cpu = 0; 97 int alloc_size, cpu = 0;
102 98
103 alloc_size = nr_cpu_ids * sizeof(struct cpu_capacity); 99 alloc_size = nr_cpu_ids * sizeof(*__cpu_capacity);
104 cpu_capacity = kzalloc(alloc_size, GFP_NOWAIT); 100 __cpu_capacity = kzalloc(alloc_size, GFP_NOWAIT);
105 101
106 while ((cn = of_find_node_by_type(cn, "cpu"))) { 102 for_each_possible_cpu(cpu) {
107 const u32 *rate, *reg; 103 const u32 *rate;
108 int len; 104 int len;
109 105
110 if (cpu >= num_possible_cpus()) 106 /* too early to use cpu->of_node */
111 break; 107 cn = of_get_cpu_node(cpu, NULL);
108 if (!cn) {
109 pr_err("missing device node for CPU %d\n", cpu);
110 continue;
111 }
112 112
113 for (cpu_eff = table_efficiency; cpu_eff->compatible; cpu_eff++) 113 for (cpu_eff = table_efficiency; cpu_eff->compatible; cpu_eff++)
114 if (of_device_is_compatible(cn, cpu_eff->compatible)) 114 if (of_device_is_compatible(cn, cpu_eff->compatible))
@@ -124,12 +124,6 @@ static void __init parse_dt_topology(void)
124 continue; 124 continue;
125 } 125 }
126 126
127 reg = of_get_property(cn, "reg", &len);
128 if (!reg || len != 4) {
129 pr_err("%s missing reg property\n", cn->full_name);
130 continue;
131 }
132
133 capacity = ((be32_to_cpup(rate)) >> 20) * cpu_eff->efficiency; 127 capacity = ((be32_to_cpup(rate)) >> 20) * cpu_eff->efficiency;
134 128
135 /* Save min capacity of the system */ 129 /* Save min capacity of the system */
@@ -140,13 +134,9 @@ static void __init parse_dt_topology(void)
140 if (capacity > max_capacity) 134 if (capacity > max_capacity)
141 max_capacity = capacity; 135 max_capacity = capacity;
142 136
143 cpu_capacity[cpu].capacity = capacity; 137 cpu_capacity(cpu) = capacity;
144 cpu_capacity[cpu++].hwid = be32_to_cpup(reg);
145 } 138 }
146 139
147 if (cpu < num_possible_cpus())
148 cpu_capacity[cpu].hwid = (unsigned long)(-1);
149
150 /* If min and max capacities are equals, we bypass the update of the 140 /* If min and max capacities are equals, we bypass the update of the
151 * cpu_scale because all CPUs have the same capacity. Otherwise, we 141 * cpu_scale because all CPUs have the same capacity. Otherwise, we
152 * compute a middle_capacity factor that will ensure that the capacity 142 * compute a middle_capacity factor that will ensure that the capacity
@@ -154,9 +144,7 @@ static void __init parse_dt_topology(void)
154 * SCHED_POWER_SCALE, which is the default value, but with the 144 * SCHED_POWER_SCALE, which is the default value, but with the
155 * constraint explained near table_efficiency[]. 145 * constraint explained near table_efficiency[].
156 */ 146 */
157 if (min_capacity == max_capacity) 147 if (4*max_capacity < (3*(max_capacity + min_capacity)))
158 cpu_capacity[0].hwid = (unsigned long)(-1);
159 else if (4*max_capacity < (3*(max_capacity + min_capacity)))
160 middle_capacity = (min_capacity + max_capacity) 148 middle_capacity = (min_capacity + max_capacity)
161 >> (SCHED_POWER_SHIFT+1); 149 >> (SCHED_POWER_SHIFT+1);
162 else 150 else
@@ -170,23 +158,12 @@ static void __init parse_dt_topology(void)
170 * boot. The update of all CPUs is in O(n^2) for heteregeneous system but the 158 * boot. The update of all CPUs is in O(n^2) for heteregeneous system but the
171 * function returns directly for SMP system. 159 * function returns directly for SMP system.
172 */ 160 */
173void update_cpu_power(unsigned int cpu, unsigned long hwid) 161void update_cpu_power(unsigned int cpu)
174{ 162{
175 unsigned int idx = 0; 163 if (!cpu_capacity(cpu))
176
177 /* look for the cpu's hwid in the cpu capacity table */
178 for (idx = 0; idx < num_possible_cpus(); idx++) {
179 if (cpu_capacity[idx].hwid == hwid)
180 break;
181
182 if (cpu_capacity[idx].hwid == -1)
183 return;
184 }
185
186 if (idx == num_possible_cpus())
187 return; 164 return;
188 165
189 set_power_scale(cpu, cpu_capacity[idx].capacity / middle_capacity); 166 set_power_scale(cpu, cpu_capacity(cpu) / middle_capacity);
190 167
191 printk(KERN_INFO "CPU%u: update cpu_power %lu\n", 168 printk(KERN_INFO "CPU%u: update cpu_power %lu\n",
192 cpu, arch_scale_freq_power(NULL, cpu)); 169 cpu, arch_scale_freq_power(NULL, cpu));
@@ -194,7 +171,7 @@ void update_cpu_power(unsigned int cpu, unsigned long hwid)
194 171
195#else 172#else
196static inline void parse_dt_topology(void) {} 173static inline void parse_dt_topology(void) {}
197static inline void update_cpu_power(unsigned int cpuid, unsigned int mpidr) {} 174static inline void update_cpu_power(unsigned int cpuid) {}
198#endif 175#endif
199 176
200 /* 177 /*
@@ -281,7 +258,7 @@ void store_cpu_topology(unsigned int cpuid)
281 258
282 update_siblings_masks(cpuid); 259 update_siblings_masks(cpuid);
283 260
284 update_cpu_power(cpuid, mpidr & MPIDR_HWID_BITMASK); 261 update_cpu_power(cpuid);
285 262
286 printk(KERN_INFO "CPU%u: thread %d, cpu %d, socket %d, mpidr %x\n", 263 printk(KERN_INFO "CPU%u: thread %d, cpu %d, socket %d, mpidr %x\n",
287 cpuid, cpu_topology[cpuid].thread_id, 264 cpuid, cpu_topology[cpuid].thread_id,
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c
index ab517fcce21b..8fcda140358d 100644
--- a/arch/arm/kernel/traps.c
+++ b/arch/arm/kernel/traps.c
@@ -497,28 +497,64 @@ static int bad_syscall(int n, struct pt_regs *regs)
497 return regs->ARM_r0; 497 return regs->ARM_r0;
498} 498}
499 499
500static long do_cache_op_restart(struct restart_block *);
501
500static inline int 502static inline int
501do_cache_op(unsigned long start, unsigned long end, int flags) 503__do_cache_op(unsigned long start, unsigned long end)
502{ 504{
503 struct mm_struct *mm = current->active_mm; 505 int ret;
504 struct vm_area_struct *vma; 506 unsigned long chunk = PAGE_SIZE;
507
508 do {
509 if (signal_pending(current)) {
510 struct thread_info *ti = current_thread_info();
511
512 ti->restart_block = (struct restart_block) {
513 .fn = do_cache_op_restart,
514 };
515
516 ti->arm_restart_block = (struct arm_restart_block) {
517 {
518 .cache = {
519 .start = start,
520 .end = end,
521 },
522 },
523 };
524
525 return -ERESTART_RESTARTBLOCK;
526 }
527
528 ret = flush_cache_user_range(start, start + chunk);
529 if (ret)
530 return ret;
505 531
532 cond_resched();
533 start += chunk;
534 } while (start < end);
535
536 return 0;
537}
538
539static long do_cache_op_restart(struct restart_block *unused)
540{
541 struct arm_restart_block *restart_block;
542
543 restart_block = &current_thread_info()->arm_restart_block;
544 return __do_cache_op(restart_block->cache.start,
545 restart_block->cache.end);
546}
547
548static inline int
549do_cache_op(unsigned long start, unsigned long end, int flags)
550{
506 if (end < start || flags) 551 if (end < start || flags)
507 return -EINVAL; 552 return -EINVAL;
508 553
509 down_read(&mm->mmap_sem); 554 if (!access_ok(VERIFY_READ, start, end - start))
510 vma = find_vma(mm, start); 555 return -EFAULT;
511 if (vma && vma->vm_start < end) {
512 if (start < vma->vm_start)
513 start = vma->vm_start;
514 if (end > vma->vm_end)
515 end = vma->vm_end;
516 556
517 up_read(&mm->mmap_sem); 557 return __do_cache_op(start, end);
518 return flush_cache_user_range(start, end);
519 }
520 up_read(&mm->mmap_sem);
521 return -EINVAL;
522} 558}
523 559
524/* 560/*
diff --git a/arch/arm/kernel/v7m.c b/arch/arm/kernel/v7m.c
new file mode 100644
index 000000000000..4d2cba94f5cc
--- /dev/null
+++ b/arch/arm/kernel/v7m.c
@@ -0,0 +1,19 @@
1/*
2 * Copyright (C) 2013 Uwe Kleine-Koenig for Pengutronix
3 *
4 * This program is free software; you can redistribute it and/or modify it under
5 * the terms of the GNU General Public License version 2 as published by the
6 * Free Software Foundation.
7 */
8#include <linux/io.h>
9#include <linux/reboot.h>
10#include <asm/barrier.h>
11#include <asm/v7m.h>
12
13void armv7m_restart(enum reboot_mode mode, const char *cmd)
14{
15 dsb();
16 __raw_writel(V7M_SCB_AIRCR_VECTKEY | V7M_SCB_AIRCR_SYSRESETREQ,
17 BASEADDR_V7M_SCB + V7M_SCB_AIRCR);
18 dsb();
19}
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
index 741f66a2edbd..9c697db2787e 100644
--- a/arch/arm/kvm/arm.c
+++ b/arch/arm/kvm/arm.c
@@ -219,6 +219,10 @@ long kvm_arch_dev_ioctl(struct file *filp,
219 return -EINVAL; 219 return -EINVAL;
220} 220}
221 221
222void kvm_arch_memslots_updated(struct kvm *kvm)
223{
224}
225
222int kvm_arch_prepare_memory_region(struct kvm *kvm, 226int kvm_arch_prepare_memory_region(struct kvm *kvm,
223 struct kvm_memory_slot *memslot, 227 struct kvm_memory_slot *memslot,
224 struct kvm_userspace_memory_region *mem, 228 struct kvm_userspace_memory_region *mem,
diff --git a/arch/arm/kvm/init.S b/arch/arm/kvm/init.S
index f048338135f7..1b9844d369cc 100644
--- a/arch/arm/kvm/init.S
+++ b/arch/arm/kvm/init.S
@@ -142,7 +142,7 @@ target: @ We're now in the trampoline code, switch page tables
142 142
143 @ Invalidate the old TLBs 143 @ Invalidate the old TLBs
144 mcr p15, 4, r0, c8, c7, 0 @ TLBIALLH 144 mcr p15, 4, r0, c8, c7, 0 @ TLBIALLH
145 dsb 145 dsb ish
146 146
147 eret 147 eret
148 148
diff --git a/arch/arm/kvm/interrupts.S b/arch/arm/kvm/interrupts.S
index 16cd4ba5d7fd..ddc15539bad2 100644
--- a/arch/arm/kvm/interrupts.S
+++ b/arch/arm/kvm/interrupts.S
@@ -55,7 +55,7 @@ ENTRY(__kvm_tlb_flush_vmid_ipa)
55 mcrr p15, 6, r2, r3, c2 @ Write VTTBR 55 mcrr p15, 6, r2, r3, c2 @ Write VTTBR
56 isb 56 isb
57 mcr p15, 0, r0, c8, c3, 0 @ TLBIALLIS (rt ignored) 57 mcr p15, 0, r0, c8, c3, 0 @ TLBIALLIS (rt ignored)
58 dsb 58 dsb ish
59 isb 59 isb
60 mov r2, #0 60 mov r2, #0
61 mov r3, #0 61 mov r3, #0
@@ -79,7 +79,7 @@ ENTRY(__kvm_flush_vm_context)
79 mcr p15, 4, r0, c8, c3, 4 79 mcr p15, 4, r0, c8, c3, 4
80 /* Invalidate instruction caches Inner Shareable (ICIALLUIS) */ 80 /* Invalidate instruction caches Inner Shareable (ICIALLUIS) */
81 mcr p15, 0, r0, c7, c1, 0 81 mcr p15, 0, r0, c7, c1, 0
82 dsb 82 dsb ish
83 isb @ Not necessary if followed by eret 83 isb @ Not necessary if followed by eret
84 84
85 bx lr 85 bx lr
@@ -492,10 +492,10 @@ __kvm_hyp_code_end:
492 .section ".rodata" 492 .section ".rodata"
493 493
494und_die_str: 494und_die_str:
495 .ascii "unexpected undefined exception in Hyp mode at: %#08x" 495 .ascii "unexpected undefined exception in Hyp mode at: %#08x\n"
496pabt_die_str: 496pabt_die_str:
497 .ascii "unexpected prefetch abort in Hyp mode at: %#08x" 497 .ascii "unexpected prefetch abort in Hyp mode at: %#08x\n"
498dabt_die_str: 498dabt_die_str:
499 .ascii "unexpected data abort in Hyp mode at: %#08x" 499 .ascii "unexpected data abort in Hyp mode at: %#08x\n"
500svc_die_str: 500svc_die_str:
501 .ascii "unexpected HVC/SVC trap in Hyp mode at: %#08x" 501 .ascii "unexpected HVC/SVC trap in Hyp mode at: %#08x\n"
diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
index 0988d9e04dd4..b0de86b56c13 100644
--- a/arch/arm/kvm/mmu.c
+++ b/arch/arm/kvm/mmu.c
@@ -489,7 +489,6 @@ int kvm_phys_addr_ioremap(struct kvm *kvm, phys_addr_t guest_ipa,
489 489
490 for (addr = guest_ipa; addr < end; addr += PAGE_SIZE) { 490 for (addr = guest_ipa; addr < end; addr += PAGE_SIZE) {
491 pte_t pte = pfn_pte(pfn, PAGE_S2_DEVICE); 491 pte_t pte = pfn_pte(pfn, PAGE_S2_DEVICE);
492 kvm_set_s2pte_writable(&pte);
493 492
494 ret = mmu_topup_memory_cache(&cache, 2, 2); 493 ret = mmu_topup_memory_cache(&cache, 2, 2);
495 if (ret) 494 if (ret)
diff --git a/arch/arm/kvm/reset.c b/arch/arm/kvm/reset.c
index b7840e7aa452..71e08baee209 100644
--- a/arch/arm/kvm/reset.c
+++ b/arch/arm/kvm/reset.c
@@ -40,7 +40,7 @@ static struct kvm_regs a15_regs_reset = {
40}; 40};
41 41
42static const struct kvm_irq_level a15_vtimer_irq = { 42static const struct kvm_irq_level a15_vtimer_irq = {
43 .irq = 27, 43 { .irq = 27 },
44 .level = 1, 44 .level = 1,
45}; 45};
46 46
diff --git a/arch/arm/kvm/trace.h b/arch/arm/kvm/trace.h
index a8e73ed5ad5b..b1d640f78623 100644
--- a/arch/arm/kvm/trace.h
+++ b/arch/arm/kvm/trace.h
@@ -59,10 +59,9 @@ TRACE_EVENT(kvm_guest_fault,
59 __entry->ipa = ipa; 59 __entry->ipa = ipa;
60 ), 60 ),
61 61
62 TP_printk("guest fault at PC %#08lx (hxfar %#08lx, " 62 TP_printk("ipa %#llx, hsr %#08lx, hxfar %#08lx, pc %#08lx",
63 "ipa %#16llx, hsr %#08lx", 63 __entry->ipa, __entry->hsr,
64 __entry->vcpu_pc, __entry->hxfar, 64 __entry->hxfar, __entry->vcpu_pc)
65 __entry->ipa, __entry->hsr)
66); 65);
67 66
68TRACE_EVENT(kvm_irq_line, 67TRACE_EVENT(kvm_irq_line,
diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile
index af72969820b4..bd454b09133e 100644
--- a/arch/arm/lib/Makefile
+++ b/arch/arm/lib/Makefile
@@ -45,3 +45,9 @@ lib-$(CONFIG_ARCH_SHARK) += io-shark.o
45 45
46$(obj)/csumpartialcopy.o: $(obj)/csumpartialcopygeneric.S 46$(obj)/csumpartialcopy.o: $(obj)/csumpartialcopygeneric.S
47$(obj)/csumpartialcopyuser.o: $(obj)/csumpartialcopygeneric.S 47$(obj)/csumpartialcopyuser.o: $(obj)/csumpartialcopygeneric.S
48
49ifeq ($(CONFIG_KERNEL_MODE_NEON),y)
50 NEON_FLAGS := -mfloat-abi=softfp -mfpu=neon
51 CFLAGS_xor-neon.o += $(NEON_FLAGS)
52 obj-$(CONFIG_XOR_BLOCKS) += xor-neon.o
53endif
diff --git a/arch/arm/lib/xor-neon.c b/arch/arm/lib/xor-neon.c
new file mode 100644
index 000000000000..2c40aeab3eaa
--- /dev/null
+++ b/arch/arm/lib/xor-neon.c
@@ -0,0 +1,46 @@
1/*
2 * linux/arch/arm/lib/xor-neon.c
3 *
4 * Copyright (C) 2013 Linaro Ltd <ard.biesheuvel@linaro.org>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10
11#include <linux/raid/xor.h>
12#include <linux/module.h>
13
14MODULE_LICENSE("GPL");
15
16#ifndef __ARM_NEON__
17#error You should compile this file with '-mfloat-abi=softfp -mfpu=neon'
18#endif
19
20/*
21 * Pull in the reference implementations while instructing GCC (through
22 * -ftree-vectorize) to attempt to exploit implicit parallelism and emit
23 * NEON instructions.
24 */
25#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
26#pragma GCC optimize "tree-vectorize"
27#else
28/*
29 * While older versions of GCC do not generate incorrect code, they fail to
30 * recognize the parallel nature of these functions, and emit plain ARM code,
31 * which is known to be slower than the optimized ARM code in asm-arm/xor.h.
32 */
33#warning This code requires at least version 4.6 of GCC
34#endif
35
36#pragma GCC diagnostic ignored "-Wunused-variable"
37#include <asm-generic/xor.h>
38
39struct xor_block_template const xor_block_neon_inner = {
40 .name = "__inner_neon__",
41 .do_2 = xor_8regs_2,
42 .do_3 = xor_8regs_3,
43 .do_4 = xor_8regs_4,
44 .do_5 = xor_8regs_5,
45};
46EXPORT_SYMBOL(xor_block_neon_inner);
diff --git a/arch/arm/mach-at91/board-dt-sama5.c b/arch/arm/mach-at91/board-dt-sama5.c
index ad95f6a23a28..bf00d15d954d 100644
--- a/arch/arm/mach-at91/board-dt-sama5.c
+++ b/arch/arm/mach-at91/board-dt-sama5.c
@@ -42,20 +42,15 @@ static int ksz9021rn_phy_fixup(struct phy_device *phy)
42{ 42{
43 int value; 43 int value;
44 44
45#define GMII_RCCPSR 260
46#define GMII_RRDPSR 261
47#define GMII_ERCR 11
48#define GMII_ERDWR 12
49
50 /* Set delay values */ 45 /* Set delay values */
51 value = GMII_RCCPSR | 0x8000; 46 value = MICREL_KSZ9021_RGMII_CLK_CTRL_PAD_SCEW | 0x8000;
52 phy_write(phy, GMII_ERCR, value); 47 phy_write(phy, MICREL_KSZ9021_EXTREG_CTRL, value);
53 value = 0xF2F4; 48 value = 0xF2F4;
54 phy_write(phy, GMII_ERDWR, value); 49 phy_write(phy, MICREL_KSZ9021_EXTREG_DATA_WRITE, value);
55 value = GMII_RRDPSR | 0x8000; 50 value = MICREL_KSZ9021_RGMII_RX_DATA_PAD_SCEW | 0x8000;
56 phy_write(phy, GMII_ERCR, value); 51 phy_write(phy, MICREL_KSZ9021_EXTREG_CTRL, value);
57 value = 0x2222; 52 value = 0x2222;
58 phy_write(phy, GMII_ERDWR, value); 53 phy_write(phy, MICREL_KSZ9021_EXTREG_DATA_WRITE, value);
59 54
60 return 0; 55 return 0;
61} 56}
diff --git a/arch/arm/mach-at91/board-snapper9260.c b/arch/arm/mach-at91/board-snapper9260.c
index 3aaa9784cf0e..f1d49e929ccb 100644
--- a/arch/arm/mach-at91/board-snapper9260.c
+++ b/arch/arm/mach-at91/board-snapper9260.c
@@ -26,7 +26,7 @@
26#include <linux/gpio.h> 26#include <linux/gpio.h>
27#include <linux/platform_device.h> 27#include <linux/platform_device.h>
28#include <linux/spi/spi.h> 28#include <linux/spi/spi.h>
29#include <linux/i2c/pca953x.h> 29#include <linux/platform_data/pca953x.h>
30 30
31#include <asm/mach-types.h> 31#include <asm/mach-types.h>
32#include <asm/mach/arch.h> 32#include <asm/mach/arch.h>
diff --git a/arch/arm/mach-at91/include/mach/at91_adc.h b/arch/arm/mach-at91/include/mach/at91_adc.h
index 8e7ed5c90817..048a57f76bd3 100644
--- a/arch/arm/mach-at91/include/mach/at91_adc.h
+++ b/arch/arm/mach-at91/include/mach/at91_adc.h
@@ -28,9 +28,12 @@
28#define AT91_ADC_TRGSEL_EXTERNAL (6 << 1) 28#define AT91_ADC_TRGSEL_EXTERNAL (6 << 1)
29#define AT91_ADC_LOWRES (1 << 4) /* Low Resolution */ 29#define AT91_ADC_LOWRES (1 << 4) /* Low Resolution */
30#define AT91_ADC_SLEEP (1 << 5) /* Sleep Mode */ 30#define AT91_ADC_SLEEP (1 << 5) /* Sleep Mode */
31#define AT91_ADC_PRESCAL (0x3f << 8) /* Prescalar Rate Selection */ 31#define AT91_ADC_PRESCAL_9260 (0x3f << 8) /* Prescalar Rate Selection */
32#define AT91_ADC_PRESCAL_9G45 (0xff << 8)
32#define AT91_ADC_PRESCAL_(x) ((x) << 8) 33#define AT91_ADC_PRESCAL_(x) ((x) << 8)
33#define AT91_ADC_STARTUP (0x1f << 16) /* Startup Up Time */ 34#define AT91_ADC_STARTUP_9260 (0x1f << 16) /* Startup Up Time */
35#define AT91_ADC_STARTUP_9G45 (0x7f << 16)
36#define AT91_ADC_STARTUP_9X5 (0xf << 16)
34#define AT91_ADC_STARTUP_(x) ((x) << 16) 37#define AT91_ADC_STARTUP_(x) ((x) << 16)
35#define AT91_ADC_SHTIM (0xf << 24) /* Sample & Hold Time */ 38#define AT91_ADC_SHTIM (0xf << 24) /* Sample & Hold Time */
36#define AT91_ADC_SHTIM_(x) ((x) << 24) 39#define AT91_ADC_SHTIM_(x) ((x) << 24)
@@ -48,6 +51,9 @@
48#define AT91_ADC_ENDRX (1 << 18) /* End of RX Buffer */ 51#define AT91_ADC_ENDRX (1 << 18) /* End of RX Buffer */
49#define AT91_ADC_RXFUFF (1 << 19) /* RX Buffer Full */ 52#define AT91_ADC_RXFUFF (1 << 19) /* RX Buffer Full */
50 53
54#define AT91_ADC_SR_9X5 0x30 /* Status Register for 9x5 */
55#define AT91_ADC_SR_DRDY_9X5 (1 << 24) /* Data Ready */
56
51#define AT91_ADC_LCDR 0x20 /* Last Converted Data Register */ 57#define AT91_ADC_LCDR 0x20 /* Last Converted Data Register */
52#define AT91_ADC_LDATA (0x3ff) 58#define AT91_ADC_LDATA (0x3ff)
53 59
@@ -58,4 +64,10 @@
58#define AT91_ADC_CHR(n) (0x30 + ((n) * 4)) /* Channel Data Register N */ 64#define AT91_ADC_CHR(n) (0x30 + ((n) * 4)) /* Channel Data Register N */
59#define AT91_ADC_DATA (0x3ff) 65#define AT91_ADC_DATA (0x3ff)
60 66
67#define AT91_ADC_CDR0_9X5 (0x50) /* Channel Data Register 0 for 9X5 */
68
69#define AT91_ADC_TRGR_9260 AT91_ADC_MR
70#define AT91_ADC_TRGR_9G45 0x08
71#define AT91_ADC_TRGR_9X5 0xC0
72
61#endif 73#endif
diff --git a/arch/arm/mach-at91/include/mach/hardware.h b/arch/arm/mach-at91/include/mach/hardware.h
index a832e0707611..f17aa3150019 100644
--- a/arch/arm/mach-at91/include/mach/hardware.h
+++ b/arch/arm/mach-at91/include/mach/hardware.h
@@ -33,6 +33,7 @@
33#include <mach/at91sam9g45.h> 33#include <mach/at91sam9g45.h>
34#include <mach/at91sam9x5.h> 34#include <mach/at91sam9x5.h>
35#include <mach/at91sam9n12.h> 35#include <mach/at91sam9n12.h>
36#include <mach/sama5d3.h>
36 37
37/* 38/*
38 * On all at91 except rm9200 and x40 have the System Controller starts 39 * On all at91 except rm9200 and x40 have the System Controller starts
diff --git a/arch/arm/mach-at91/include/mach/sama5d3.h b/arch/arm/mach-at91/include/mach/sama5d3.h
index 6dc81ee38048..31096a8aaf1d 100644
--- a/arch/arm/mach-at91/include/mach/sama5d3.h
+++ b/arch/arm/mach-at91/include/mach/sama5d3.h
@@ -65,6 +65,14 @@
65#define SAMA5D3_ID_IRQ0 47 /* Advanced Interrupt Controller (IRQ0) */ 65#define SAMA5D3_ID_IRQ0 47 /* Advanced Interrupt Controller (IRQ0) */
66 66
67/* 67/*
68 * User Peripheral physical base addresses.
69 */
70#define SAMA5D3_BASE_USART0 0xf001c000
71#define SAMA5D3_BASE_USART1 0xf0020000
72#define SAMA5D3_BASE_USART2 0xf8020000
73#define SAMA5D3_BASE_USART3 0xf8024000
74
75/*
68 * Internal Memory 76 * Internal Memory
69 */ 77 */
70#define SAMA5D3_SRAM_BASE 0x00300000 /* Internal SRAM base address */ 78#define SAMA5D3_SRAM_BASE 0x00300000 /* Internal SRAM base address */
diff --git a/arch/arm/mach-at91/include/mach/uncompress.h b/arch/arm/mach-at91/include/mach/uncompress.h
index 5659f7c72120..4bb644f8e87c 100644
--- a/arch/arm/mach-at91/include/mach/uncompress.h
+++ b/arch/arm/mach-at91/include/mach/uncompress.h
@@ -94,6 +94,15 @@ static const u32 uarts_sam9x5[] = {
94 0, 94 0,
95}; 95};
96 96
97static const u32 uarts_sama5[] = {
98 AT91_BASE_DBGU1,
99 SAMA5D3_BASE_USART0,
100 SAMA5D3_BASE_USART1,
101 SAMA5D3_BASE_USART2,
102 SAMA5D3_BASE_USART3,
103 0,
104};
105
97static inline const u32* decomp_soc_detect(void __iomem *dbgu_base) 106static inline const u32* decomp_soc_detect(void __iomem *dbgu_base)
98{ 107{
99 u32 cidr, socid; 108 u32 cidr, socid;
@@ -121,8 +130,12 @@ static inline const u32* decomp_soc_detect(void __iomem *dbgu_base)
121 case ARCH_ID_AT91SAM9RL64: 130 case ARCH_ID_AT91SAM9RL64:
122 return uarts_sam9rl; 131 return uarts_sam9rl;
123 132
133 case ARCH_ID_AT91SAM9N12:
124 case ARCH_ID_AT91SAM9X5: 134 case ARCH_ID_AT91SAM9X5:
125 return uarts_sam9x5; 135 return uarts_sam9x5;
136
137 case ARCH_ID_SAMA5D3:
138 return uarts_sama5;
126 } 139 }
127 140
128 /* at91sam9g10 */ 141 /* at91sam9g10 */
diff --git a/arch/arm/mach-bcm/Kconfig b/arch/arm/mach-bcm/Kconfig
index f11289519c39..69d67f714a2f 100644
--- a/arch/arm/mach-bcm/Kconfig
+++ b/arch/arm/mach-bcm/Kconfig
@@ -12,6 +12,7 @@ config ARCH_BCM
12 select GPIO_BCM 12 select GPIO_BCM
13 select SPARSE_IRQ 13 select SPARSE_IRQ
14 select TICK_ONESHOT 14 select TICK_ONESHOT
15 select CACHE_L2X0
15 help 16 help
16 This enables support for system based on Broadcom SoCs. 17 This enables support for system based on Broadcom SoCs.
17 It currently supports the 'BCM281XX' family, which includes 18 It currently supports the 'BCM281XX' family, which includes
diff --git a/arch/arm/mach-bcm/Makefile b/arch/arm/mach-bcm/Makefile
index 6adb6aecf48f..e3d03033a7e2 100644
--- a/arch/arm/mach-bcm/Makefile
+++ b/arch/arm/mach-bcm/Makefile
@@ -1,5 +1,5 @@
1# 1#
2# Copyright (C) 2012 Broadcom Corporation 2# Copyright (C) 2012-2013 Broadcom Corporation
3# 3#
4# This program is free software; you can redistribute it and/or 4# This program is free software; you can redistribute it and/or
5# modify it under the terms of the GNU General Public License as 5# modify it under the terms of the GNU General Public License as
@@ -10,6 +10,6 @@
10# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11# GNU General Public License for more details. 11# GNU General Public License for more details.
12 12
13obj-$(CONFIG_ARCH_BCM) := board_bcm.o bcm_kona_smc.o bcm_kona_smc_asm.o 13obj-$(CONFIG_ARCH_BCM) := board_bcm281xx.o bcm_kona_smc.o bcm_kona_smc_asm.o kona.o
14plus_sec := $(call as-instr,.arch_extension sec,+sec) 14plus_sec := $(call as-instr,.arch_extension sec,+sec)
15AFLAGS_bcm_kona_smc_asm.o :=-Wa,-march=armv7-a$(plus_sec) 15AFLAGS_bcm_kona_smc_asm.o :=-Wa,-march=armv7-a$(plus_sec)
diff --git a/arch/arm/mach-bcm/bcm_kona_smc.c b/arch/arm/mach-bcm/bcm_kona_smc.c
index 56d9d19b2470..5e31e918f325 100644
--- a/arch/arm/mach-bcm/bcm_kona_smc.c
+++ b/arch/arm/mach-bcm/bcm_kona_smc.c
@@ -36,18 +36,20 @@ struct bcm_kona_smc_data {
36}; 36};
37 37
38static const struct of_device_id bcm_kona_smc_ids[] __initconst = { 38static const struct of_device_id bcm_kona_smc_ids[] __initconst = {
39 {.compatible = "bcm,kona-smc"}, 39 {.compatible = "brcm,kona-smc"},
40 {.compatible = "bcm,kona-smc"}, /* deprecated name */
40 {}, 41 {},
41}; 42};
42 43
43/* Map in the bounce area */ 44/* Map in the bounce area */
44void __init bcm_kona_smc_init(void) 45int __init bcm_kona_smc_init(void)
45{ 46{
46 struct device_node *node; 47 struct device_node *node;
47 48
48 /* Read buffer addr and size from the device tree node */ 49 /* Read buffer addr and size from the device tree node */
49 node = of_find_matching_node(NULL, bcm_kona_smc_ids); 50 node = of_find_matching_node(NULL, bcm_kona_smc_ids);
50 BUG_ON(!node); 51 if (!node)
52 return -ENODEV;
51 53
52 /* Don't care about size or flags of the DT node */ 54 /* Don't care about size or flags of the DT node */
53 bridge_data.buffer_addr = 55 bridge_data.buffer_addr =
@@ -59,7 +61,9 @@ void __init bcm_kona_smc_init(void)
59 61
60 bridge_data.initialized = 1; 62 bridge_data.initialized = 1;
61 63
62 pr_info("Secure API initialized!\n"); 64 pr_info("Kona Secure API initialized\n");
65
66 return 0;
63} 67}
64 68
65/* __bcm_kona_smc() should only run on CPU 0, with pre-emption disabled */ 69/* __bcm_kona_smc() should only run on CPU 0, with pre-emption disabled */
diff --git a/arch/arm/mach-bcm/bcm_kona_smc.h b/arch/arm/mach-bcm/bcm_kona_smc.h
index 3bedbed1c21b..d098a7e76744 100644
--- a/arch/arm/mach-bcm/bcm_kona_smc.h
+++ b/arch/arm/mach-bcm/bcm_kona_smc.h
@@ -64,7 +64,7 @@
64#define SSAPI_BRCM_START_VC_CORE 0x0E000008 64#define SSAPI_BRCM_START_VC_CORE 0x0E000008
65 65
66#ifndef __ASSEMBLY__ 66#ifndef __ASSEMBLY__
67extern void bcm_kona_smc_init(void); 67extern int __init bcm_kona_smc_init(void);
68 68
69extern unsigned bcm_kona_smc(unsigned service_id, 69extern unsigned bcm_kona_smc(unsigned service_id,
70 unsigned arg0, 70 unsigned arg0,
diff --git a/arch/arm/mach-bcm/board_bcm.c b/arch/arm/mach-bcm/board_bcm281xx.c
index 28599326d4ad..8d9f931164bb 100644
--- a/arch/arm/mach-bcm/board_bcm.c
+++ b/arch/arm/mach-bcm/board_bcm281xx.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright (C) 2012 Broadcom Corporation 2 * Copyright (C) 2012-2013 Broadcom Corporation
3 * 3 *
4 * This program is free software; you can redistribute it and/or 4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as 5 * modify it under the terms of the GNU General Public License as
@@ -21,23 +21,39 @@
21#include <asm/mach/time.h> 21#include <asm/mach/time.h>
22#include <asm/hardware/cache-l2x0.h> 22#include <asm/hardware/cache-l2x0.h>
23 23
24
25#include "bcm_kona_smc.h" 24#include "bcm_kona_smc.h"
25#include "kona.h"
26 26
27static int __init kona_l2_cache_init(void) 27static int __init kona_l2_cache_init(void)
28{ 28{
29 if (!IS_ENABLED(CONFIG_CACHE_L2X0)) 29 if (!IS_ENABLED(CONFIG_CACHE_L2X0))
30 return 0; 30 return 0;
31 31
32 if (bcm_kona_smc_init() < 0) {
33 pr_info("Kona secure API not available. Skipping L2 init\n");
34 return 0;
35 }
36
32 bcm_kona_smc(SSAPI_ENABLE_L2_CACHE, 0, 0, 0, 0); 37 bcm_kona_smc(SSAPI_ENABLE_L2_CACHE, 0, 0, 0, 0);
33 38
34 /* 39 /*
35 * The aux_val and aux_mask have no effect since L2 cache is already 40 * The aux_val and aux_mask have no effect since L2 cache is already
36 * enabled. Pass 0s for aux_val and 1s for aux_mask for default value. 41 * enabled. Pass 0s for aux_val and 1s for aux_mask for default value.
37 */ 42 */
38 l2x0_of_init(0, ~0); 43 return l2x0_of_init(0, ~0);
44}
39 45
40 return 0; 46static void bcm_board_setup_restart(void)
47{
48 struct device_node *np;
49
50 np = of_find_compatible_node(NULL, NULL, "brcm,bcm11351");
51 if (np) {
52 if (of_device_is_available(np))
53 bcm_kona_setup_restart();
54 of_node_put(np);
55 }
56 /* Restart setup for other boards goes here */
41} 57}
42 58
43static void __init board_init(void) 59static void __init board_init(void)
@@ -45,15 +61,15 @@ static void __init board_init(void)
45 of_platform_populate(NULL, of_default_bus_match_table, NULL, 61 of_platform_populate(NULL, of_default_bus_match_table, NULL,
46 &platform_bus); 62 &platform_bus);
47 63
48 bcm_kona_smc_init(); 64 bcm_board_setup_restart();
49
50 kona_l2_cache_init(); 65 kona_l2_cache_init();
51} 66}
52 67
53static const char * const bcm11351_dt_compat[] = { "bcm,bcm11351", NULL, }; 68static const char * const bcm11351_dt_compat[] = { "brcm,bcm11351", NULL, };
54 69
55DT_MACHINE_START(BCM11351_DT, "Broadcom Application Processor") 70DT_MACHINE_START(BCM11351_DT, "Broadcom Application Processor")
56 .init_time = clocksource_of_init, 71 .init_time = clocksource_of_init,
57 .init_machine = board_init, 72 .init_machine = board_init,
73 .restart = bcm_kona_restart,
58 .dt_compat = bcm11351_dt_compat, 74 .dt_compat = bcm11351_dt_compat,
59MACHINE_END 75MACHINE_END
diff --git a/arch/arm/mach-bcm/kona.c b/arch/arm/mach-bcm/kona.c
new file mode 100644
index 000000000000..6939d9017f63
--- /dev/null
+++ b/arch/arm/mach-bcm/kona.c
@@ -0,0 +1,65 @@
1/*
2 * Copyright (C) 2013 Broadcom Corporation
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation version 2.
7 *
8 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
9 * kind, whether express or implied; without even the implied warranty
10 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 */
13
14#include <linux/of_address.h>
15#include <asm/io.h>
16
17#include "kona.h"
18
19static void __iomem *watchdog_base;
20
21void bcm_kona_setup_restart(void)
22{
23 struct device_node *np_wdog;
24
25 /*
26 * The assumption is that whoever calls bcm_kona_setup_restart()
27 * also needs a Kona Watchdog Timer entry in Device Tree, i.e. we
28 * report an error if the DT entry is missing.
29 */
30 np_wdog = of_find_compatible_node(NULL, NULL, "brcm,kona-wdt");
31 if (!np_wdog) {
32 pr_err("brcm,kona-wdt not found in DT, reboot disabled\n");
33 return;
34 }
35 watchdog_base = of_iomap(np_wdog, 0);
36 WARN(!watchdog_base, "failed to map watchdog base");
37 of_node_put(np_wdog);
38}
39
40#define SECWDOG_OFFSET 0x00000000
41#define SECWDOG_RESERVED_MASK 0xE2000000
42#define SECWDOG_WD_LOAD_FLAG_MASK 0x10000000
43#define SECWDOG_EN_MASK 0x08000000
44#define SECWDOG_SRSTEN_MASK 0x04000000
45#define SECWDOG_CLKS_SHIFT 20
46#define SECWDOG_LOCK_SHIFT 0
47
48void bcm_kona_restart(enum reboot_mode mode, const char *cmd)
49{
50 uint32_t val;
51
52 if (!watchdog_base)
53 panic("Watchdog not mapped. Reboot failed.\n");
54
55 /* Enable watchdog2 with very short timeout. */
56 val = readl(watchdog_base + SECWDOG_OFFSET);
57 val &= SECWDOG_RESERVED_MASK | SECWDOG_WD_LOAD_FLAG_MASK;
58 val |= SECWDOG_EN_MASK | SECWDOG_SRSTEN_MASK |
59 (0x8 << SECWDOG_CLKS_SHIFT) |
60 (0x8 << SECWDOG_LOCK_SHIFT);
61 writel(val, watchdog_base + SECWDOG_OFFSET);
62
63 while (1)
64 ;
65}
diff --git a/arch/arm/mach-bcm/kona.h b/arch/arm/mach-bcm/kona.h
new file mode 100644
index 000000000000..291eca3e06ff
--- /dev/null
+++ b/arch/arm/mach-bcm/kona.h
@@ -0,0 +1,17 @@
1/*
2 * Copyright (C) 2013 Broadcom Corporation
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation version 2.
7 *
8 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
9 * kind, whether express or implied; without even the implied warranty
10 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 */
13
14#include <linux/reboot.h>
15
16void bcm_kona_setup_restart(void);
17void bcm_kona_restart(enum reboot_mode mode, const char *cmd);
diff --git a/arch/arm/mach-clps711x/Kconfig b/arch/arm/mach-clps711x/Kconfig
index 01ad4d41e728..bea6295c8c59 100644
--- a/arch/arm/mach-clps711x/Kconfig
+++ b/arch/arm/mach-clps711x/Kconfig
@@ -33,9 +33,6 @@ config ARCH_P720T
33 Say Y here if you intend to run this kernel on the ARM Prospector 33 Say Y here if you intend to run this kernel on the ARM Prospector
34 720T. 34 720T.
35 35
36config ARCH_FORTUNET
37 bool "FORTUNET"
38
39config EP72XX_ROM_BOOT 36config EP72XX_ROM_BOOT
40 bool "EP721x/EP731x ROM boot" 37 bool "EP721x/EP731x ROM boot"
41 help 38 help
diff --git a/arch/arm/mach-clps711x/Makefile b/arch/arm/mach-clps711x/Makefile
index f30ed2b496fb..f04151efd96a 100644
--- a/arch/arm/mach-clps711x/Makefile
+++ b/arch/arm/mach-clps711x/Makefile
@@ -10,5 +10,4 @@ obj-$(CONFIG_ARCH_AUTCPU12) += board-autcpu12.o
10obj-$(CONFIG_ARCH_CDB89712) += board-cdb89712.o 10obj-$(CONFIG_ARCH_CDB89712) += board-cdb89712.o
11obj-$(CONFIG_ARCH_CLEP7312) += board-clep7312.o 11obj-$(CONFIG_ARCH_CLEP7312) += board-clep7312.o
12obj-$(CONFIG_ARCH_EDB7211) += board-edb7211.o 12obj-$(CONFIG_ARCH_EDB7211) += board-edb7211.o
13obj-$(CONFIG_ARCH_FORTUNET) += board-fortunet.o
14obj-$(CONFIG_ARCH_P720T) += board-p720t.o 13obj-$(CONFIG_ARCH_P720T) += board-p720t.o
diff --git a/arch/arm/mach-clps711x/board-autcpu12.c b/arch/arm/mach-clps711x/board-autcpu12.c
index 5867aebd8d0c..f8d71a89644a 100644
--- a/arch/arm/mach-clps711x/board-autcpu12.c
+++ b/arch/arm/mach-clps711x/board-autcpu12.c
@@ -259,11 +259,7 @@ static void __init autcpu12_init(void)
259static void __init autcpu12_init_late(void) 259static void __init autcpu12_init_late(void)
260{ 260{
261 gpio_request_array(autcpu12_gpios, ARRAY_SIZE(autcpu12_gpios)); 261 gpio_request_array(autcpu12_gpios, ARRAY_SIZE(autcpu12_gpios));
262 262 platform_device_register(&autcpu12_nand_pdev);
263 if (IS_ENABLED(MTD_NAND_GPIO) && IS_ENABLED(GPIO_GENERIC_PLATFORM)) {
264 /* We are need both drivers to handle NAND */
265 platform_device_register(&autcpu12_nand_pdev);
266 }
267} 263}
268 264
269MACHINE_START(AUTCPU12, "autronix autcpu12") 265MACHINE_START(AUTCPU12, "autronix autcpu12")
diff --git a/arch/arm/mach-clps711x/board-edb7211.c b/arch/arm/mach-clps711x/board-edb7211.c
index 9dfb990f0801..fe6184ead896 100644
--- a/arch/arm/mach-clps711x/board-edb7211.c
+++ b/arch/arm/mach-clps711x/board-edb7211.c
@@ -126,21 +126,6 @@ static struct gpio edb7211_gpios[] __initconst = {
126 { EDB7211_LCDBL, GPIOF_OUT_INIT_LOW, "LCD BACKLIGHT" }, 126 { EDB7211_LCDBL, GPIOF_OUT_INIT_LOW, "LCD BACKLIGHT" },
127}; 127};
128 128
129static struct map_desc edb7211_io_desc[] __initdata = {
130 { /* Memory-mapped extra keyboard row */
131 .virtual = IO_ADDRESS(EDB7211_EXTKBD_BASE),
132 .pfn = __phys_to_pfn(EDB7211_EXTKBD_BASE),
133 .length = SZ_1M,
134 .type = MT_DEVICE,
135 },
136};
137
138void __init edb7211_map_io(void)
139{
140 clps711x_map_io();
141 iotable_init(edb7211_io_desc, ARRAY_SIZE(edb7211_io_desc));
142}
143
144/* Reserve screen memory region at the start of main system memory. */ 129/* Reserve screen memory region at the start of main system memory. */
145static void __init edb7211_reserve(void) 130static void __init edb7211_reserve(void)
146{ 131{
@@ -195,7 +180,7 @@ MACHINE_START(EDB7211, "CL-EDB7211 (EP7211 eval board)")
195 .nr_irqs = CLPS711X_NR_IRQS, 180 .nr_irqs = CLPS711X_NR_IRQS,
196 .fixup = fixup_edb7211, 181 .fixup = fixup_edb7211,
197 .reserve = edb7211_reserve, 182 .reserve = edb7211_reserve,
198 .map_io = edb7211_map_io, 183 .map_io = clps711x_map_io,
199 .init_early = clps711x_init_early, 184 .init_early = clps711x_init_early,
200 .init_irq = clps711x_init_irq, 185 .init_irq = clps711x_init_irq,
201 .init_time = clps711x_timer_init, 186 .init_time = clps711x_timer_init,
diff --git a/arch/arm/mach-clps711x/board-fortunet.c b/arch/arm/mach-clps711x/board-fortunet.c
deleted file mode 100644
index b1561e3d7c5c..000000000000
--- a/arch/arm/mach-clps711x/board-fortunet.c
+++ /dev/null
@@ -1,85 +0,0 @@
1/*
2 * linux/arch/arm/mach-clps711x/fortunet.c
3 *
4 * Derived from linux/arch/arm/mach-integrator/arch.c
5 *
6 * Copyright (C) 2000 Deep Blue Solutions Ltd
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */
22#include <linux/types.h>
23#include <linux/init.h>
24#include <linux/initrd.h>
25
26#include <mach/hardware.h>
27#include <asm/setup.h>
28#include <asm/mach-types.h>
29
30#include <asm/mach/arch.h>
31
32#include <asm/memory.h>
33
34#include "common.h"
35
36struct meminfo memmap = {
37 .nr_banks = 1,
38 .bank = {
39 {
40 .start = 0xC0000000,
41 .size = 0x01000000,
42 },
43 },
44};
45
46typedef struct tag_IMAGE_PARAMS
47{
48 int ramdisk_ok;
49 int ramdisk_address;
50 int ramdisk_size;
51 int ram_size;
52 int extra_param_type;
53 int extra_param_ptr;
54 int command_line;
55} IMAGE_PARAMS;
56
57#define IMAGE_PARAMS_PHYS 0xC01F0000
58
59static void __init
60fortunet_fixup(struct tag *tags, char **cmdline, struct meminfo *mi)
61{
62 IMAGE_PARAMS *ip = phys_to_virt(IMAGE_PARAMS_PHYS);
63 *cmdline = phys_to_virt(ip->command_line);
64#ifdef CONFIG_BLK_DEV_INITRD
65 if(ip->ramdisk_ok)
66 {
67 initrd_start = __phys_to_virt(ip->ramdisk_address);
68 initrd_end = initrd_start + ip->ramdisk_size;
69 }
70#endif
71 memmap.bank[0].size = ip->ram_size;
72 *mi = memmap;
73}
74
75MACHINE_START(FORTUNET, "ARM-FortuNet")
76 /* Maintainer: FortuNet Inc. */
77 .nr_irqs = CLPS711X_NR_IRQS,
78 .fixup = fortunet_fixup,
79 .map_io = clps711x_map_io,
80 .init_early = clps711x_init_early,
81 .init_irq = clps711x_init_irq,
82 .init_time = clps711x_timer_init,
83 .handle_irq = clps711x_handle_irq,
84 .restart = clps711x_restart,
85MACHINE_END
diff --git a/arch/arm/mach-clps711x/devices.c b/arch/arm/mach-clps711x/devices.c
index 856b81cf2f8a..fb77d1448fec 100644
--- a/arch/arm/mach-clps711x/devices.c
+++ b/arch/arm/mach-clps711x/devices.c
@@ -57,7 +57,7 @@ static void __init clps711x_add_syscon(void)
57 unsigned i; 57 unsigned i;
58 58
59 for (i = 0; i < ARRAY_SIZE(clps711x_syscon_res); i++) 59 for (i = 0; i < ARRAY_SIZE(clps711x_syscon_res); i++)
60 platform_device_register_simple("clps711x-syscon", i + 1, 60 platform_device_register_simple("syscon", i + 1,
61 &clps711x_syscon_res[i], 1); 61 &clps711x_syscon_res[i], 1);
62} 62}
63 63
diff --git a/arch/arm/mach-davinci/board-da830-evm.c b/arch/arm/mach-davinci/board-da830-evm.c
index 1332de8c52c9..c4bdc0a1c36e 100644
--- a/arch/arm/mach-davinci/board-da830-evm.c
+++ b/arch/arm/mach-davinci/board-da830-evm.c
@@ -185,10 +185,6 @@ static __init void da830_evm_usb_init(void)
185 __func__, ret); 185 __func__, ret);
186} 186}
187 187
188static struct davinci_uart_config da830_evm_uart_config __initdata = {
189 .enabled_uarts = 0x7,
190};
191
192static const short da830_evm_mcasp1_pins[] = { 188static const short da830_evm_mcasp1_pins[] = {
193 DA830_AHCLKX1, DA830_ACLKX1, DA830_AFSX1, DA830_AHCLKR1, DA830_AFSR1, 189 DA830_AHCLKX1, DA830_ACLKX1, DA830_AFSX1, DA830_AHCLKR1, DA830_AFSR1,
194 DA830_AMUTE1, DA830_AXR1_0, DA830_AXR1_1, DA830_AXR1_2, DA830_AXR1_5, 190 DA830_AMUTE1, DA830_AXR1_0, DA830_AXR1_1, DA830_AXR1_2, DA830_AXR1_5,
@@ -630,7 +626,7 @@ static __init void da830_evm_init(void)
630 pr_warning("da830_evm_init: watchdog registration failed: %d\n", 626 pr_warning("da830_evm_init: watchdog registration failed: %d\n",
631 ret); 627 ret);
632 628
633 davinci_serial_init(&da830_evm_uart_config); 629 davinci_serial_init(da8xx_serial_device);
634 i2c_register_board_info(1, da830_evm_i2c_devices, 630 i2c_register_board_info(1, da830_evm_i2c_devices,
635 ARRAY_SIZE(da830_evm_i2c_devices)); 631 ARRAY_SIZE(da830_evm_i2c_devices));
636 632
diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c
index bea6793a7ede..dd1fb24521aa 100644
--- a/arch/arm/mach-davinci/board-da850-evm.c
+++ b/arch/arm/mach-davinci/board-da850-evm.c
@@ -19,7 +19,7 @@
19#include <linux/kernel.h> 19#include <linux/kernel.h>
20#include <linux/i2c.h> 20#include <linux/i2c.h>
21#include <linux/i2c/at24.h> 21#include <linux/i2c/at24.h>
22#include <linux/i2c/pca953x.h> 22#include <linux/platform_data/pca953x.h>
23#include <linux/input.h> 23#include <linux/input.h>
24#include <linux/input/tps6507x-ts.h> 24#include <linux/input/tps6507x-ts.h>
25#include <linux/mfd/tps6507x.h> 25#include <linux/mfd/tps6507x.h>
@@ -746,10 +746,6 @@ static struct davinci_i2c_platform_data da850_evm_i2c_0_pdata = {
746 .bus_delay = 0, /* usec */ 746 .bus_delay = 0, /* usec */
747}; 747};
748 748
749static struct davinci_uart_config da850_evm_uart_config __initdata = {
750 .enabled_uarts = 0x7,
751};
752
753/* davinci da850 evm audio machine driver */ 749/* davinci da850 evm audio machine driver */
754static u8 da850_iis_serializer_direction[] = { 750static u8 da850_iis_serializer_direction[] = {
755 INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, 751 INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
@@ -1249,12 +1245,10 @@ static struct vpif_capture_config da850_vpif_capture_config = {
1249 1245
1250static struct adv7343_platform_data adv7343_pdata = { 1246static struct adv7343_platform_data adv7343_pdata = {
1251 .mode_config = { 1247 .mode_config = {
1252 .dac_3 = 1, 1248 .dac = { 1, 1, 1 },
1253 .dac_2 = 1,
1254 .dac_1 = 1,
1255 }, 1249 },
1256 .sd_config = { 1250 .sd_config = {
1257 .sd_dac_out1 = 1, 1251 .sd_dac_out = { 1 },
1258 }, 1252 },
1259}; 1253};
1260 1254
@@ -1494,7 +1488,7 @@ static __init void da850_evm_init(void)
1494 __func__, ret); 1488 __func__, ret);
1495 } 1489 }
1496 1490
1497 davinci_serial_init(&da850_evm_uart_config); 1491 davinci_serial_init(da8xx_serial_device);
1498 1492
1499 i2c_register_board_info(1, da850_evm_i2c_devices, 1493 i2c_register_board_info(1, da850_evm_i2c_devices,
1500 ARRAY_SIZE(da850_evm_i2c_devices)); 1494 ARRAY_SIZE(da850_evm_i2c_devices));
diff --git a/arch/arm/mach-davinci/board-dm355-evm.c b/arch/arm/mach-davinci/board-dm355-evm.c
index c2a0a67d09e0..42b23a3194a0 100644
--- a/arch/arm/mach-davinci/board-dm355-evm.c
+++ b/arch/arm/mach-davinci/board-dm355-evm.c
@@ -314,10 +314,6 @@ static struct platform_device *davinci_evm_devices[] __initdata = {
314 &davinci_nand_device, 314 &davinci_nand_device,
315}; 315};
316 316
317static struct davinci_uart_config uart_config __initdata = {
318 .enabled_uarts = (1 << 0),
319};
320
321static void __init dm355_evm_map_io(void) 317static void __init dm355_evm_map_io(void)
322{ 318{
323 dm355_init(); 319 dm355_init();
@@ -393,7 +389,7 @@ static __init void dm355_evm_init(void)
393 platform_add_devices(davinci_evm_devices, 389 platform_add_devices(davinci_evm_devices,
394 ARRAY_SIZE(davinci_evm_devices)); 390 ARRAY_SIZE(davinci_evm_devices));
395 evm_init_i2c(); 391 evm_init_i2c();
396 davinci_serial_init(&uart_config); 392 davinci_serial_init(dm355_serial_device);
397 393
398 /* NOTE: NAND flash timings set by the UBL are slower than 394 /* NOTE: NAND flash timings set by the UBL are slower than
399 * needed by MT29F16G08FAA chips ... EMIF.A1CR is 0x40400204 395 * needed by MT29F16G08FAA chips ... EMIF.A1CR is 0x40400204
diff --git a/arch/arm/mach-davinci/board-dm355-leopard.c b/arch/arm/mach-davinci/board-dm355-leopard.c
index 139e42da25f0..65a984c52df6 100644
--- a/arch/arm/mach-davinci/board-dm355-leopard.c
+++ b/arch/arm/mach-davinci/board-dm355-leopard.c
@@ -173,10 +173,6 @@ static struct platform_device *davinci_leopard_devices[] __initdata = {
173 &davinci_nand_device, 173 &davinci_nand_device,
174}; 174};
175 175
176static struct davinci_uart_config uart_config __initdata = {
177 .enabled_uarts = (1 << 0),
178};
179
180static void __init dm355_leopard_map_io(void) 176static void __init dm355_leopard_map_io(void)
181{ 177{
182 dm355_init(); 178 dm355_init();
@@ -252,7 +248,7 @@ static __init void dm355_leopard_init(void)
252 platform_add_devices(davinci_leopard_devices, 248 platform_add_devices(davinci_leopard_devices,
253 ARRAY_SIZE(davinci_leopard_devices)); 249 ARRAY_SIZE(davinci_leopard_devices));
254 leopard_init_i2c(); 250 leopard_init_i2c();
255 davinci_serial_init(&uart_config); 251 davinci_serial_init(dm355_serial_device);
256 252
257 /* NOTE: NAND flash timings set by the UBL are slower than 253 /* NOTE: NAND flash timings set by the UBL are slower than
258 * needed by MT29F16G08FAA chips ... EMIF.A1CR is 0x40400204 254 * needed by MT29F16G08FAA chips ... EMIF.A1CR is 0x40400204
diff --git a/arch/arm/mach-davinci/board-dm365-evm.c b/arch/arm/mach-davinci/board-dm365-evm.c
index 4cdb61c54459..92b7f770615a 100644
--- a/arch/arm/mach-davinci/board-dm365-evm.c
+++ b/arch/arm/mach-davinci/board-dm365-evm.c
@@ -718,10 +718,6 @@ fail:
718 /* REVISIT export switches: NTSC/PAL (SW5.6), EXTRA1 (SW5.2), etc */ 718 /* REVISIT export switches: NTSC/PAL (SW5.6), EXTRA1 (SW5.2), etc */
719} 719}
720 720
721static struct davinci_uart_config uart_config __initdata = {
722 .enabled_uarts = (1 << 0),
723};
724
725static void __init dm365_evm_map_io(void) 721static void __init dm365_evm_map_io(void)
726{ 722{
727 dm365_init(); 723 dm365_init();
@@ -748,7 +744,7 @@ static struct spi_board_info dm365_evm_spi_info[] __initconst = {
748static __init void dm365_evm_init(void) 744static __init void dm365_evm_init(void)
749{ 745{
750 evm_init_i2c(); 746 evm_init_i2c();
751 davinci_serial_init(&uart_config); 747 davinci_serial_init(dm365_serial_device);
752 748
753 dm365evm_emac_configure(); 749 dm365evm_emac_configure();
754 dm365evm_mmc_configure(); 750 dm365evm_mmc_configure();
diff --git a/arch/arm/mach-davinci/board-dm644x-evm.c b/arch/arm/mach-davinci/board-dm644x-evm.c
index fa4bfaf952d8..40bb9b5b87e8 100644
--- a/arch/arm/mach-davinci/board-dm644x-evm.c
+++ b/arch/arm/mach-davinci/board-dm644x-evm.c
@@ -727,10 +727,6 @@ static struct platform_device *davinci_evm_devices[] __initdata = {
727 &rtc_dev, 727 &rtc_dev,
728}; 728};
729 729
730static struct davinci_uart_config uart_config __initdata = {
731 .enabled_uarts = (1 << 0),
732};
733
734static void __init 730static void __init
735davinci_evm_map_io(void) 731davinci_evm_map_io(void)
736{ 732{
@@ -792,7 +788,7 @@ static __init void davinci_evm_init(void)
792 davinci_setup_mmc(0, &dm6446evm_mmc_config); 788 davinci_setup_mmc(0, &dm6446evm_mmc_config);
793 dm644x_init_video(&dm644xevm_capture_cfg, &dm644xevm_display_cfg); 789 dm644x_init_video(&dm644xevm_capture_cfg, &dm644xevm_display_cfg);
794 790
795 davinci_serial_init(&uart_config); 791 davinci_serial_init(dm644x_serial_device);
796 dm644x_init_asp(&dm644x_evm_snd_data); 792 dm644x_init_asp(&dm644x_evm_snd_data);
797 793
798 /* irlml6401 switches over 1A, in under 8 msec */ 794 /* irlml6401 switches over 1A, in under 8 msec */
diff --git a/arch/arm/mach-davinci/board-dm646x-evm.c b/arch/arm/mach-davinci/board-dm646x-evm.c
index 0c005e876cac..2bc3651d56cc 100644
--- a/arch/arm/mach-davinci/board-dm646x-evm.c
+++ b/arch/arm/mach-davinci/board-dm646x-evm.c
@@ -750,10 +750,6 @@ static void __init davinci_map_io(void)
750 cdce_clk_init(); 750 cdce_clk_init();
751} 751}
752 752
753static struct davinci_uart_config uart_config __initdata = {
754 .enabled_uarts = (1 << 0),
755};
756
757#define DM646X_EVM_PHY_ID "davinci_mdio-0:01" 753#define DM646X_EVM_PHY_ID "davinci_mdio-0:01"
758/* 754/*
759 * The following EDMA channels/slots are not being used by drivers (for 755 * The following EDMA channels/slots are not being used by drivers (for
@@ -793,7 +789,7 @@ static __init void evm_init(void)
793 struct davinci_soc_info *soc_info = &davinci_soc_info; 789 struct davinci_soc_info *soc_info = &davinci_soc_info;
794 790
795 evm_init_i2c(); 791 evm_init_i2c();
796 davinci_serial_init(&uart_config); 792 davinci_serial_init(dm646x_serial_device);
797 dm646x_init_mcasp0(&dm646x_evm_snd_data[0]); 793 dm646x_init_mcasp0(&dm646x_evm_snd_data[0]);
798 dm646x_init_mcasp1(&dm646x_evm_snd_data[1]); 794 dm646x_init_mcasp1(&dm646x_evm_snd_data[1]);
799 795
diff --git a/arch/arm/mach-davinci/board-mityomapl138.c b/arch/arm/mach-davinci/board-mityomapl138.c
index 9549d53aa63f..cd0f58730c2b 100644
--- a/arch/arm/mach-davinci/board-mityomapl138.c
+++ b/arch/arm/mach-davinci/board-mityomapl138.c
@@ -434,10 +434,6 @@ static void __init mityomapl138_setup_nand(void)
434 ARRAY_SIZE(mityomapl138_devices)); 434 ARRAY_SIZE(mityomapl138_devices));
435} 435}
436 436
437static struct davinci_uart_config mityomapl138_uart_config __initdata = {
438 .enabled_uarts = 0x7,
439};
440
441static const short mityomap_mii_pins[] = { 437static const short mityomap_mii_pins[] = {
442 DA850_MII_TXEN, DA850_MII_TXCLK, DA850_MII_COL, DA850_MII_TXD_3, 438 DA850_MII_TXEN, DA850_MII_TXCLK, DA850_MII_COL, DA850_MII_TXD_3,
443 DA850_MII_TXD_2, DA850_MII_TXD_1, DA850_MII_TXD_0, DA850_MII_RXER, 439 DA850_MII_TXD_2, DA850_MII_TXD_1, DA850_MII_TXD_0, DA850_MII_RXER,
@@ -517,7 +513,7 @@ static void __init mityomapl138_init(void)
517 if (ret) 513 if (ret)
518 pr_warning("watchdog registration failed: %d\n", ret); 514 pr_warning("watchdog registration failed: %d\n", ret);
519 515
520 davinci_serial_init(&mityomapl138_uart_config); 516 davinci_serial_init(da8xx_serial_device);
521 517
522 ret = da8xx_register_i2c(0, &mityomap_i2c_0_pdata); 518 ret = da8xx_register_i2c(0, &mityomap_i2c_0_pdata);
523 if (ret) 519 if (ret)
diff --git a/arch/arm/mach-davinci/board-neuros-osd2.c b/arch/arm/mach-davinci/board-neuros-osd2.c
index 808233b60e3d..46f336fca803 100644
--- a/arch/arm/mach-davinci/board-neuros-osd2.c
+++ b/arch/arm/mach-davinci/board-neuros-osd2.c
@@ -154,10 +154,6 @@ static struct platform_device *davinci_ntosd2_devices[] __initdata = {
154 &ntosd2_leds_dev, 154 &ntosd2_leds_dev,
155}; 155};
156 156
157static struct davinci_uart_config uart_config __initdata = {
158 .enabled_uarts = (1 << 0),
159};
160
161static void __init davinci_ntosd2_map_io(void) 157static void __init davinci_ntosd2_map_io(void)
162{ 158{
163 dm644x_init(); 159 dm644x_init();
@@ -198,7 +194,7 @@ static __init void davinci_ntosd2_init(void)
198 platform_add_devices(davinci_ntosd2_devices, 194 platform_add_devices(davinci_ntosd2_devices,
199 ARRAY_SIZE(davinci_ntosd2_devices)); 195 ARRAY_SIZE(davinci_ntosd2_devices));
200 196
201 davinci_serial_init(&uart_config); 197 davinci_serial_init(dm644x_serial_device);
202 dm644x_init_asp(&dm644x_ntosd2_snd_data); 198 dm644x_init_asp(&dm644x_ntosd2_snd_data);
203 199
204 soc_info->emac_pdata->phy_id = NEUROS_OSD2_PHY_ID; 200 soc_info->emac_pdata->phy_id = NEUROS_OSD2_PHY_ID;
diff --git a/arch/arm/mach-davinci/board-omapl138-hawk.c b/arch/arm/mach-davinci/board-omapl138-hawk.c
index b8c20de10ca2..ab98c75cabb4 100644
--- a/arch/arm/mach-davinci/board-omapl138-hawk.c
+++ b/arch/arm/mach-davinci/board-omapl138-hawk.c
@@ -286,15 +286,11 @@ usb11_setup_oc_fail:
286 gpio_free(DA850_USB1_VBUS_PIN); 286 gpio_free(DA850_USB1_VBUS_PIN);
287} 287}
288 288
289static struct davinci_uart_config omapl138_hawk_uart_config __initdata = {
290 .enabled_uarts = 0x7,
291};
292
293static __init void omapl138_hawk_init(void) 289static __init void omapl138_hawk_init(void)
294{ 290{
295 int ret; 291 int ret;
296 292
297 davinci_serial_init(&omapl138_hawk_uart_config); 293 davinci_serial_init(da8xx_serial_device);
298 294
299 omapl138_hawk_config_emac(); 295 omapl138_hawk_config_emac();
300 296
diff --git a/arch/arm/mach-davinci/board-sffsdr.c b/arch/arm/mach-davinci/board-sffsdr.c
index 513eee14f77d..d84360148100 100644
--- a/arch/arm/mach-davinci/board-sffsdr.c
+++ b/arch/arm/mach-davinci/board-sffsdr.c
@@ -125,10 +125,6 @@ static struct platform_device *davinci_sffsdr_devices[] __initdata = {
125 &davinci_sffsdr_nandflash_device, 125 &davinci_sffsdr_nandflash_device,
126}; 126};
127 127
128static struct davinci_uart_config uart_config __initdata = {
129 .enabled_uarts = (1 << 0),
130};
131
132static void __init davinci_sffsdr_map_io(void) 128static void __init davinci_sffsdr_map_io(void)
133{ 129{
134 dm644x_init(); 130 dm644x_init();
@@ -141,7 +137,7 @@ static __init void davinci_sffsdr_init(void)
141 platform_add_devices(davinci_sffsdr_devices, 137 platform_add_devices(davinci_sffsdr_devices,
142 ARRAY_SIZE(davinci_sffsdr_devices)); 138 ARRAY_SIZE(davinci_sffsdr_devices));
143 sffsdr_init_i2c(); 139 sffsdr_init_i2c();
144 davinci_serial_init(&uart_config); 140 davinci_serial_init(dm644x_serial_device);
145 soc_info->emac_pdata->phy_id = SFFSDR_PHY_ID; 141 soc_info->emac_pdata->phy_id = SFFSDR_PHY_ID;
146 davinci_setup_usb(0, 0); /* We support only peripheral mode. */ 142 davinci_setup_usb(0, 0); /* We support only peripheral mode. */
147 143
diff --git a/arch/arm/mach-davinci/cpuidle.c b/arch/arm/mach-davinci/cpuidle.c
index 36aef3a7dedb..f1ac1c94ac0f 100644
--- a/arch/arm/mach-davinci/cpuidle.c
+++ b/arch/arm/mach-davinci/cpuidle.c
@@ -65,7 +65,7 @@ static struct cpuidle_driver davinci_idle_driver = {
65 .states[1] = { 65 .states[1] = {
66 .enter = davinci_enter_idle, 66 .enter = davinci_enter_idle,
67 .exit_latency = 10, 67 .exit_latency = 10,
68 .target_residency = 100000, 68 .target_residency = 10000,
69 .flags = CPUIDLE_FLAG_TIME_VALID, 69 .flags = CPUIDLE_FLAG_TIME_VALID,
70 .name = "DDR SR", 70 .name = "DDR SR",
71 .desc = "WFI and DDR Self Refresh", 71 .desc = "WFI and DDR Self Refresh",
diff --git a/arch/arm/mach-davinci/da830.c b/arch/arm/mach-davinci/da830.c
index abbaf0270be6..d6c746e35ad9 100644
--- a/arch/arm/mach-davinci/da830.c
+++ b/arch/arm/mach-davinci/da830.c
@@ -395,9 +395,9 @@ static struct clk_lookup da830_clks[] = {
395 CLK(NULL, "tptc0", &tptc0_clk), 395 CLK(NULL, "tptc0", &tptc0_clk),
396 CLK(NULL, "tptc1", &tptc1_clk), 396 CLK(NULL, "tptc1", &tptc1_clk),
397 CLK("da830-mmc.0", NULL, &mmcsd_clk), 397 CLK("da830-mmc.0", NULL, &mmcsd_clk),
398 CLK(NULL, "uart0", &uart0_clk), 398 CLK("serial8250.0", NULL, &uart0_clk),
399 CLK(NULL, "uart1", &uart1_clk), 399 CLK("serial8250.1", NULL, &uart1_clk),
400 CLK(NULL, "uart2", &uart2_clk), 400 CLK("serial8250.2", NULL, &uart2_clk),
401 CLK("spi_davinci.0", NULL, &spi0_clk), 401 CLK("spi_davinci.0", NULL, &spi0_clk),
402 CLK("spi_davinci.1", NULL, &spi1_clk), 402 CLK("spi_davinci.1", NULL, &spi1_clk),
403 CLK(NULL, "ecap0", &ecap0_clk), 403 CLK(NULL, "ecap0", &ecap0_clk),
@@ -417,6 +417,7 @@ static struct clk_lookup da830_clks[] = {
417 CLK(NULL, "aintc", &aintc_clk), 417 CLK(NULL, "aintc", &aintc_clk),
418 CLK(NULL, "secu_mgr", &secu_mgr_clk), 418 CLK(NULL, "secu_mgr", &secu_mgr_clk),
419 CLK("davinci_emac.1", NULL, &emac_clk), 419 CLK("davinci_emac.1", NULL, &emac_clk),
420 CLK("davinci_mdio.0", "fck", &emac_clk),
420 CLK(NULL, "gpio", &gpio_clk), 421 CLK(NULL, "gpio", &gpio_clk),
421 CLK("i2c_davinci.2", NULL, &i2c1_clk), 422 CLK("i2c_davinci.2", NULL, &i2c1_clk),
422 CLK(NULL, "usb11", &usb11_clk), 423 CLK(NULL, "usb11", &usb11_clk),
@@ -1199,7 +1200,6 @@ static struct davinci_soc_info davinci_soc_info_da830 = {
1199 .gpio_base = DA8XX_GPIO_BASE, 1200 .gpio_base = DA8XX_GPIO_BASE,
1200 .gpio_num = 128, 1201 .gpio_num = 128,
1201 .gpio_irq = IRQ_DA8XX_GPIO0, 1202 .gpio_irq = IRQ_DA8XX_GPIO0,
1202 .serial_dev = &da8xx_serial_device,
1203 .emac_pdata = &da8xx_emac_pdata, 1203 .emac_pdata = &da8xx_emac_pdata,
1204}; 1204};
1205 1205
diff --git a/arch/arm/mach-davinci/da850.c b/arch/arm/mach-davinci/da850.c
index a0d4f6038b60..f56e5fbfa2fd 100644
--- a/arch/arm/mach-davinci/da850.c
+++ b/arch/arm/mach-davinci/da850.c
@@ -451,9 +451,9 @@ static struct clk_lookup da850_clks[] = {
451 CLK(NULL, "tpcc1", &tpcc1_clk), 451 CLK(NULL, "tpcc1", &tpcc1_clk),
452 CLK(NULL, "tptc2", &tptc2_clk), 452 CLK(NULL, "tptc2", &tptc2_clk),
453 CLK("pruss_uio", "pruss", &pruss_clk), 453 CLK("pruss_uio", "pruss", &pruss_clk),
454 CLK(NULL, "uart0", &uart0_clk), 454 CLK("serial8250.0", NULL, &uart0_clk),
455 CLK(NULL, "uart1", &uart1_clk), 455 CLK("serial8250.1", NULL, &uart1_clk),
456 CLK(NULL, "uart2", &uart2_clk), 456 CLK("serial8250.2", NULL, &uart2_clk),
457 CLK(NULL, "aintc", &aintc_clk), 457 CLK(NULL, "aintc", &aintc_clk),
458 CLK(NULL, "gpio", &gpio_clk), 458 CLK(NULL, "gpio", &gpio_clk),
459 CLK("i2c_davinci.2", NULL, &i2c1_clk), 459 CLK("i2c_davinci.2", NULL, &i2c1_clk),
@@ -461,6 +461,7 @@ static struct clk_lookup da850_clks[] = {
461 CLK(NULL, "arm", &arm_clk), 461 CLK(NULL, "arm", &arm_clk),
462 CLK(NULL, "rmii", &rmii_clk), 462 CLK(NULL, "rmii", &rmii_clk),
463 CLK("davinci_emac.1", NULL, &emac_clk), 463 CLK("davinci_emac.1", NULL, &emac_clk),
464 CLK("davinci_mdio.0", "fck", &emac_clk),
464 CLK("davinci-mcasp.0", NULL, &mcasp_clk), 465 CLK("davinci-mcasp.0", NULL, &mcasp_clk),
465 CLK("da8xx_lcdc.0", "fck", &lcdc_clk), 466 CLK("da8xx_lcdc.0", "fck", &lcdc_clk),
466 CLK("da830-mmc.0", NULL, &mmcsd0_clk), 467 CLK("da830-mmc.0", NULL, &mmcsd0_clk),
@@ -1301,7 +1302,6 @@ static struct davinci_soc_info davinci_soc_info_da850 = {
1301 .gpio_base = DA8XX_GPIO_BASE, 1302 .gpio_base = DA8XX_GPIO_BASE,
1302 .gpio_num = 144, 1303 .gpio_num = 144,
1303 .gpio_irq = IRQ_DA8XX_GPIO0, 1304 .gpio_irq = IRQ_DA8XX_GPIO0,
1304 .serial_dev = &da8xx_serial_device,
1305 .emac_pdata = &da8xx_emac_pdata, 1305 .emac_pdata = &da8xx_emac_pdata,
1306 .sram_dma = DA8XX_SHARED_RAM_BASE, 1306 .sram_dma = DA8XX_SHARED_RAM_BASE,
1307 .sram_len = SZ_128K, 1307 .sram_len = SZ_128K,
diff --git a/arch/arm/mach-davinci/da8xx-dt.c b/arch/arm/mach-davinci/da8xx-dt.c
index 961aea8bbad5..d2bc574ae172 100644
--- a/arch/arm/mach-davinci/da8xx-dt.c
+++ b/arch/arm/mach-davinci/da8xx-dt.c
@@ -20,13 +20,6 @@
20 20
21#define DA8XX_NUM_UARTS 3 21#define DA8XX_NUM_UARTS 3
22 22
23static void __init da8xx_uart_clk_enable(void)
24{
25 int i;
26 for (i = 0; i < DA8XX_NUM_UARTS; i++)
27 davinci_serial_setup_clk(i, NULL);
28}
29
30static struct of_device_id da8xx_irq_match[] __initdata = { 23static struct of_device_id da8xx_irq_match[] __initdata = {
31 { .compatible = "ti,cp-intc", .data = cp_intc_of_init, }, 24 { .compatible = "ti,cp-intc", .data = cp_intc_of_init, },
32 { } 25 { }
@@ -47,6 +40,12 @@ static struct of_dev_auxdata da850_auxdata_lookup[] __initdata = {
47 OF_DEV_AUXDATA("ti,da850-ecap", 0x01f07000, "ecap", NULL), 40 OF_DEV_AUXDATA("ti,da850-ecap", 0x01f07000, "ecap", NULL),
48 OF_DEV_AUXDATA("ti,da850-ecap", 0x01f08000, "ecap", NULL), 41 OF_DEV_AUXDATA("ti,da850-ecap", 0x01f08000, "ecap", NULL),
49 OF_DEV_AUXDATA("ti,da830-spi", 0x01f0e000, "spi_davinci.1", NULL), 42 OF_DEV_AUXDATA("ti,da830-spi", 0x01f0e000, "spi_davinci.1", NULL),
43 OF_DEV_AUXDATA("ns16550a", 0x01c42000, "serial8250.0", NULL),
44 OF_DEV_AUXDATA("ns16550a", 0x01d0c000, "serial8250.1", NULL),
45 OF_DEV_AUXDATA("ns16550a", 0x01d0d000, "serial8250.2", NULL),
46 OF_DEV_AUXDATA("ti,davinci_mdio", 0x01e24000, "davinci_mdio.0", NULL),
47 OF_DEV_AUXDATA("ti,davinci-dm6467-emac", 0x01e20000, "davinci_emac.1",
48 NULL),
50 {} 49 {}
51}; 50};
52 51
@@ -57,7 +56,6 @@ static void __init da850_init_machine(void)
57 of_platform_populate(NULL, of_default_bus_match_table, 56 of_platform_populate(NULL, of_default_bus_match_table,
58 da850_auxdata_lookup, NULL); 57 da850_auxdata_lookup, NULL);
59 58
60 da8xx_uart_clk_enable();
61} 59}
62 60
63static const char *da850_boards_compat[] __initdata = { 61static const char *da850_boards_compat[] __initdata = {
diff --git a/arch/arm/mach-davinci/davinci.h b/arch/arm/mach-davinci/davinci.h
index a883043d0820..2ab5d577186f 100644
--- a/arch/arm/mach-davinci/davinci.h
+++ b/arch/arm/mach-davinci/davinci.h
@@ -106,4 +106,9 @@ int dm646x_init_edma(struct edma_rsv_info *rsv);
106void dm646x_video_init(void); 106void dm646x_video_init(void);
107void dm646x_setup_vpif(struct vpif_display_config *, 107void dm646x_setup_vpif(struct vpif_display_config *,
108 struct vpif_capture_config *); 108 struct vpif_capture_config *);
109
110extern struct platform_device dm365_serial_device[];
111extern struct platform_device dm355_serial_device[];
112extern struct platform_device dm644x_serial_device[];
113extern struct platform_device dm646x_serial_device[];
109#endif /*__DAVINCI_H */ 114#endif /*__DAVINCI_H */
diff --git a/arch/arm/mach-davinci/devices-da8xx.c b/arch/arm/mach-davinci/devices-da8xx.c
index 71a46a348761..2e473fefd71e 100644
--- a/arch/arm/mach-davinci/devices-da8xx.c
+++ b/arch/arm/mach-davinci/devices-da8xx.c
@@ -68,7 +68,7 @@
68void __iomem *da8xx_syscfg0_base; 68void __iomem *da8xx_syscfg0_base;
69void __iomem *da8xx_syscfg1_base; 69void __iomem *da8xx_syscfg1_base;
70 70
71static struct plat_serial8250_port da8xx_serial_pdata[] = { 71static struct plat_serial8250_port da8xx_serial0_pdata[] = {
72 { 72 {
73 .mapbase = DA8XX_UART0_BASE, 73 .mapbase = DA8XX_UART0_BASE,
74 .irq = IRQ_DA8XX_UARTINT0, 74 .irq = IRQ_DA8XX_UARTINT0,
@@ -78,6 +78,11 @@ static struct plat_serial8250_port da8xx_serial_pdata[] = {
78 .regshift = 2, 78 .regshift = 2,
79 }, 79 },
80 { 80 {
81 .flags = 0,
82 }
83};
84static struct plat_serial8250_port da8xx_serial1_pdata[] = {
85 {
81 .mapbase = DA8XX_UART1_BASE, 86 .mapbase = DA8XX_UART1_BASE,
82 .irq = IRQ_DA8XX_UARTINT1, 87 .irq = IRQ_DA8XX_UARTINT1,
83 .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | 88 .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
@@ -86,6 +91,11 @@ static struct plat_serial8250_port da8xx_serial_pdata[] = {
86 .regshift = 2, 91 .regshift = 2,
87 }, 92 },
88 { 93 {
94 .flags = 0,
95 }
96};
97static struct plat_serial8250_port da8xx_serial2_pdata[] = {
98 {
89 .mapbase = DA8XX_UART2_BASE, 99 .mapbase = DA8XX_UART2_BASE,
90 .irq = IRQ_DA8XX_UARTINT2, 100 .irq = IRQ_DA8XX_UARTINT2,
91 .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | 101 .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
@@ -95,15 +105,33 @@ static struct plat_serial8250_port da8xx_serial_pdata[] = {
95 }, 105 },
96 { 106 {
97 .flags = 0, 107 .flags = 0,
98 }, 108 }
99}; 109};
100 110
101struct platform_device da8xx_serial_device = { 111struct platform_device da8xx_serial_device[] = {
102 .name = "serial8250", 112 {
103 .id = PLAT8250_DEV_PLATFORM, 113 .name = "serial8250",
104 .dev = { 114 .id = PLAT8250_DEV_PLATFORM,
105 .platform_data = da8xx_serial_pdata, 115 .dev = {
116 .platform_data = da8xx_serial0_pdata,
117 }
118 },
119 {
120 .name = "serial8250",
121 .id = PLAT8250_DEV_PLATFORM1,
122 .dev = {
123 .platform_data = da8xx_serial1_pdata,
124 }
125 },
126 {
127 .name = "serial8250",
128 .id = PLAT8250_DEV_PLATFORM2,
129 .dev = {
130 .platform_data = da8xx_serial2_pdata,
131 }
106 }, 132 },
133 {
134 }
107}; 135};
108 136
109static s8 da8xx_queue_tc_mapping[][2] = { 137static s8 da8xx_queue_tc_mapping[][2] = {
@@ -453,12 +481,8 @@ int __init da8xx_register_emac(void)
453 ret = platform_device_register(&da8xx_mdio_device); 481 ret = platform_device_register(&da8xx_mdio_device);
454 if (ret < 0) 482 if (ret < 0)
455 return ret; 483 return ret;
456 ret = platform_device_register(&da8xx_emac_device); 484
457 if (ret < 0) 485 return platform_device_register(&da8xx_emac_device);
458 return ret;
459 ret = clk_add_alias(NULL, dev_name(&da8xx_mdio_device.dev),
460 NULL, &da8xx_emac_device.dev);
461 return ret;
462} 486}
463 487
464static struct resource da830_mcasp1_resources[] = { 488static struct resource da830_mcasp1_resources[] = {
@@ -828,14 +852,7 @@ static struct platform_device da8xx_rtc_device = {
828 852
829int da8xx_register_rtc(void) 853int da8xx_register_rtc(void)
830{ 854{
831 int ret; 855 return platform_device_register(&da8xx_rtc_device);
832
833 ret = platform_device_register(&da8xx_rtc_device);
834 if (!ret)
835 /* Atleast on DA850, RTC is a wakeup source */
836 device_init_wakeup(&da8xx_rtc_device.dev, true);
837
838 return ret;
839} 856}
840 857
841static void __iomem *da8xx_ddr2_ctlr_base; 858static void __iomem *da8xx_ddr2_ctlr_base;
diff --git a/arch/arm/mach-davinci/devices-tnetv107x.c b/arch/arm/mach-davinci/devices-tnetv107x.c
index 128cb9ae80f4..01d8686e553c 100644
--- a/arch/arm/mach-davinci/devices-tnetv107x.c
+++ b/arch/arm/mach-davinci/devices-tnetv107x.c
@@ -126,7 +126,7 @@ static struct platform_device edma_device = {
126 .dev.platform_data = tnetv107x_edma_info, 126 .dev.platform_data = tnetv107x_edma_info,
127}; 127};
128 128
129static struct plat_serial8250_port serial_data[] = { 129static struct plat_serial8250_port serial0_platform_data[] = {
130 { 130 {
131 .mapbase = TNETV107X_UART0_BASE, 131 .mapbase = TNETV107X_UART0_BASE,
132 .irq = IRQ_TNETV107X_UART0, 132 .irq = IRQ_TNETV107X_UART0,
@@ -137,6 +137,11 @@ static struct plat_serial8250_port serial_data[] = {
137 .regshift = 2, 137 .regshift = 2,
138 }, 138 },
139 { 139 {
140 .flags = 0,
141 }
142};
143static struct plat_serial8250_port serial1_platform_data[] = {
144 {
140 .mapbase = TNETV107X_UART1_BASE, 145 .mapbase = TNETV107X_UART1_BASE,
141 .irq = IRQ_TNETV107X_UART1, 146 .irq = IRQ_TNETV107X_UART1,
142 .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | 147 .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
@@ -146,6 +151,11 @@ static struct plat_serial8250_port serial_data[] = {
146 .regshift = 2, 151 .regshift = 2,
147 }, 152 },
148 { 153 {
154 .flags = 0,
155 }
156};
157static struct plat_serial8250_port serial2_platform_data[] = {
158 {
149 .mapbase = TNETV107X_UART2_BASE, 159 .mapbase = TNETV107X_UART2_BASE,
150 .irq = IRQ_TNETV107X_UART2, 160 .irq = IRQ_TNETV107X_UART2,
151 .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | 161 .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
@@ -156,13 +166,28 @@ static struct plat_serial8250_port serial_data[] = {
156 }, 166 },
157 { 167 {
158 .flags = 0, 168 .flags = 0,
159 }, 169 }
160}; 170};
161 171
162struct platform_device tnetv107x_serial_device = { 172
163 .name = "serial8250", 173struct platform_device tnetv107x_serial_device[] = {
164 .id = PLAT8250_DEV_PLATFORM, 174 {
165 .dev.platform_data = serial_data, 175 .name = "serial8250",
176 .id = PLAT8250_DEV_PLATFORM,
177 .dev.platform_data = serial0_platform_data,
178 },
179 {
180 .name = "serial8250",
181 .id = PLAT8250_DEV_PLATFORM1,
182 .dev.platform_data = serial1_platform_data,
183 },
184 {
185 .name = "serial8250",
186 .id = PLAT8250_DEV_PLATFORM2,
187 .dev.platform_data = serial2_platform_data,
188 },
189 {
190 }
166}; 191};
167 192
168static struct resource mmc0_resources[] = { 193static struct resource mmc0_resources[] = {
@@ -385,7 +410,7 @@ void __init tnetv107x_devices_init(struct tnetv107x_device_info *info)
385 platform_device_register(&tsc_device); 410 platform_device_register(&tsc_device);
386 411
387 if (info->serial_config) 412 if (info->serial_config)
388 davinci_serial_init(info->serial_config); 413 davinci_serial_init(tnetv107x_serial_device);
389 414
390 for (i = 0; i < 2; i++) 415 for (i = 0; i < 2; i++)
391 if (info->mmc_config[i]) { 416 if (info->mmc_config[i]) {
diff --git a/arch/arm/mach-davinci/dm355.c b/arch/arm/mach-davinci/dm355.c
index 86100d179694..3eaa5f6b2160 100644
--- a/arch/arm/mach-davinci/dm355.c
+++ b/arch/arm/mach-davinci/dm355.c
@@ -357,9 +357,9 @@ static struct clk_lookup dm355_clks[] = {
357 CLK(NULL, "clkout3", &clkout3_clk), 357 CLK(NULL, "clkout3", &clkout3_clk),
358 CLK(NULL, "arm", &arm_clk), 358 CLK(NULL, "arm", &arm_clk),
359 CLK(NULL, "mjcp", &mjcp_clk), 359 CLK(NULL, "mjcp", &mjcp_clk),
360 CLK(NULL, "uart0", &uart0_clk), 360 CLK("serial8250.0", NULL, &uart0_clk),
361 CLK(NULL, "uart1", &uart1_clk), 361 CLK("serial8250.1", NULL, &uart1_clk),
362 CLK(NULL, "uart2", &uart2_clk), 362 CLK("serial8250.2", NULL, &uart2_clk),
363 CLK("i2c_davinci.1", NULL, &i2c_clk), 363 CLK("i2c_davinci.1", NULL, &i2c_clk),
364 CLK("davinci-mcbsp.0", NULL, &asp0_clk), 364 CLK("davinci-mcbsp.0", NULL, &asp0_clk),
365 CLK("davinci-mcbsp.1", NULL, &asp1_clk), 365 CLK("davinci-mcbsp.1", NULL, &asp1_clk),
@@ -922,7 +922,7 @@ static struct davinci_timer_info dm355_timer_info = {
922 .clocksource_id = T0_TOP, 922 .clocksource_id = T0_TOP,
923}; 923};
924 924
925static struct plat_serial8250_port dm355_serial_platform_data[] = { 925static struct plat_serial8250_port dm355_serial0_platform_data[] = {
926 { 926 {
927 .mapbase = DAVINCI_UART0_BASE, 927 .mapbase = DAVINCI_UART0_BASE,
928 .irq = IRQ_UARTINT0, 928 .irq = IRQ_UARTINT0,
@@ -932,6 +932,11 @@ static struct plat_serial8250_port dm355_serial_platform_data[] = {
932 .regshift = 2, 932 .regshift = 2,
933 }, 933 },
934 { 934 {
935 .flags = 0,
936 }
937};
938static struct plat_serial8250_port dm355_serial1_platform_data[] = {
939 {
935 .mapbase = DAVINCI_UART1_BASE, 940 .mapbase = DAVINCI_UART1_BASE,
936 .irq = IRQ_UARTINT1, 941 .irq = IRQ_UARTINT1,
937 .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | 942 .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
@@ -940,6 +945,11 @@ static struct plat_serial8250_port dm355_serial_platform_data[] = {
940 .regshift = 2, 945 .regshift = 2,
941 }, 946 },
942 { 947 {
948 .flags = 0,
949 }
950};
951static struct plat_serial8250_port dm355_serial2_platform_data[] = {
952 {
943 .mapbase = DM355_UART2_BASE, 953 .mapbase = DM355_UART2_BASE,
944 .irq = IRQ_DM355_UARTINT2, 954 .irq = IRQ_DM355_UARTINT2,
945 .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | 955 .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
@@ -948,16 +958,34 @@ static struct plat_serial8250_port dm355_serial_platform_data[] = {
948 .regshift = 2, 958 .regshift = 2,
949 }, 959 },
950 { 960 {
951 .flags = 0 961 .flags = 0,
952 }, 962 }
953}; 963};
954 964
955static struct platform_device dm355_serial_device = { 965struct platform_device dm355_serial_device[] = {
956 .name = "serial8250", 966 {
957 .id = PLAT8250_DEV_PLATFORM, 967 .name = "serial8250",
958 .dev = { 968 .id = PLAT8250_DEV_PLATFORM,
959 .platform_data = dm355_serial_platform_data, 969 .dev = {
970 .platform_data = dm355_serial0_platform_data,
971 }
972 },
973 {
974 .name = "serial8250",
975 .id = PLAT8250_DEV_PLATFORM1,
976 .dev = {
977 .platform_data = dm355_serial1_platform_data,
978 }
960 }, 979 },
980 {
981 .name = "serial8250",
982 .id = PLAT8250_DEV_PLATFORM2,
983 .dev = {
984 .platform_data = dm355_serial2_platform_data,
985 }
986 },
987 {
988 }
961}; 989};
962 990
963static struct davinci_soc_info davinci_soc_info_dm355 = { 991static struct davinci_soc_info davinci_soc_info_dm355 = {
@@ -981,7 +1009,6 @@ static struct davinci_soc_info davinci_soc_info_dm355 = {
981 .gpio_base = DAVINCI_GPIO_BASE, 1009 .gpio_base = DAVINCI_GPIO_BASE,
982 .gpio_num = 104, 1010 .gpio_num = 104,
983 .gpio_irq = IRQ_DM355_GPIOBNK0, 1011 .gpio_irq = IRQ_DM355_GPIOBNK0,
984 .serial_dev = &dm355_serial_device,
985 .sram_dma = 0x00010000, 1012 .sram_dma = 0x00010000,
986 .sram_len = SZ_32K, 1013 .sram_len = SZ_32K,
987}; 1014};
diff --git a/arch/arm/mach-davinci/dm365.c b/arch/arm/mach-davinci/dm365.c
index dad28029ba9b..c29e324eb0bb 100644
--- a/arch/arm/mach-davinci/dm365.c
+++ b/arch/arm/mach-davinci/dm365.c
@@ -455,8 +455,8 @@ static struct clk_lookup dm365_clks[] = {
455 CLK("vpss", "master", &vpss_master_clk), 455 CLK("vpss", "master", &vpss_master_clk),
456 CLK("vpss", "slave", &vpss_slave_clk), 456 CLK("vpss", "slave", &vpss_slave_clk),
457 CLK(NULL, "arm", &arm_clk), 457 CLK(NULL, "arm", &arm_clk),
458 CLK(NULL, "uart0", &uart0_clk), 458 CLK("serial8250.0", NULL, &uart0_clk),
459 CLK(NULL, "uart1", &uart1_clk), 459 CLK("serial8250.1", NULL, &uart1_clk),
460 CLK("i2c_davinci.1", NULL, &i2c_clk), 460 CLK("i2c_davinci.1", NULL, &i2c_clk),
461 CLK("da830-mmc.0", NULL, &mmcsd0_clk), 461 CLK("da830-mmc.0", NULL, &mmcsd0_clk),
462 CLK("da830-mmc.1", NULL, &mmcsd1_clk), 462 CLK("da830-mmc.1", NULL, &mmcsd1_clk),
@@ -477,6 +477,7 @@ static struct clk_lookup dm365_clks[] = {
477 CLK(NULL, "timer3", &timer3_clk), 477 CLK(NULL, "timer3", &timer3_clk),
478 CLK(NULL, "usb", &usb_clk), 478 CLK(NULL, "usb", &usb_clk),
479 CLK("davinci_emac.1", NULL, &emac_clk), 479 CLK("davinci_emac.1", NULL, &emac_clk),
480 CLK("davinci_mdio.0", "fck", &emac_clk),
480 CLK("davinci_voicecodec", NULL, &voicecodec_clk), 481 CLK("davinci_voicecodec", NULL, &voicecodec_clk),
481 CLK("davinci-mcbsp", NULL, &asp0_clk), 482 CLK("davinci-mcbsp", NULL, &asp0_clk),
482 CLK(NULL, "rto", &rto_clk), 483 CLK(NULL, "rto", &rto_clk),
@@ -1041,7 +1042,7 @@ static struct davinci_timer_info dm365_timer_info = {
1041 1042
1042#define DM365_UART1_BASE (IO_PHYS + 0x106000) 1043#define DM365_UART1_BASE (IO_PHYS + 0x106000)
1043 1044
1044static struct plat_serial8250_port dm365_serial_platform_data[] = { 1045static struct plat_serial8250_port dm365_serial0_platform_data[] = {
1045 { 1046 {
1046 .mapbase = DAVINCI_UART0_BASE, 1047 .mapbase = DAVINCI_UART0_BASE,
1047 .irq = IRQ_UARTINT0, 1048 .irq = IRQ_UARTINT0,
@@ -1051,6 +1052,11 @@ static struct plat_serial8250_port dm365_serial_platform_data[] = {
1051 .regshift = 2, 1052 .regshift = 2,
1052 }, 1053 },
1053 { 1054 {
1055 .flags = 0,
1056 }
1057};
1058static struct plat_serial8250_port dm365_serial1_platform_data[] = {
1059 {
1054 .mapbase = DM365_UART1_BASE, 1060 .mapbase = DM365_UART1_BASE,
1055 .irq = IRQ_UARTINT1, 1061 .irq = IRQ_UARTINT1,
1056 .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | 1062 .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
@@ -1059,16 +1065,27 @@ static struct plat_serial8250_port dm365_serial_platform_data[] = {
1059 .regshift = 2, 1065 .regshift = 2,
1060 }, 1066 },
1061 { 1067 {
1062 .flags = 0 1068 .flags = 0,
1063 }, 1069 }
1064}; 1070};
1065 1071
1066static struct platform_device dm365_serial_device = { 1072struct platform_device dm365_serial_device[] = {
1067 .name = "serial8250", 1073 {
1068 .id = PLAT8250_DEV_PLATFORM, 1074 .name = "serial8250",
1069 .dev = { 1075 .id = PLAT8250_DEV_PLATFORM,
1070 .platform_data = dm365_serial_platform_data, 1076 .dev = {
1077 .platform_data = dm365_serial0_platform_data,
1078 }
1079 },
1080 {
1081 .name = "serial8250",
1082 .id = PLAT8250_DEV_PLATFORM1,
1083 .dev = {
1084 .platform_data = dm365_serial1_platform_data,
1085 }
1071 }, 1086 },
1087 {
1088 }
1072}; 1089};
1073 1090
1074static struct davinci_soc_info davinci_soc_info_dm365 = { 1091static struct davinci_soc_info davinci_soc_info_dm365 = {
@@ -1093,7 +1110,6 @@ static struct davinci_soc_info davinci_soc_info_dm365 = {
1093 .gpio_num = 104, 1110 .gpio_num = 104,
1094 .gpio_irq = IRQ_DM365_GPIO0, 1111 .gpio_irq = IRQ_DM365_GPIO0,
1095 .gpio_unbanked = 8, /* really 16 ... skip muxed GPIOs */ 1112 .gpio_unbanked = 8, /* really 16 ... skip muxed GPIOs */
1096 .serial_dev = &dm365_serial_device,
1097 .emac_pdata = &dm365_emac_pdata, 1113 .emac_pdata = &dm365_emac_pdata,
1098 .sram_dma = 0x00010000, 1114 .sram_dma = 0x00010000,
1099 .sram_len = SZ_32K, 1115 .sram_len = SZ_32K,
@@ -1407,8 +1423,6 @@ static int __init dm365_init_devices(void)
1407 1423
1408 platform_device_register(&dm365_mdio_device); 1424 platform_device_register(&dm365_mdio_device);
1409 platform_device_register(&dm365_emac_device); 1425 platform_device_register(&dm365_emac_device);
1410 clk_add_alias(NULL, dev_name(&dm365_mdio_device.dev),
1411 NULL, &dm365_emac_device.dev);
1412 1426
1413 return 0; 1427 return 0;
1414} 1428}
diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-davinci/dm644x.c
index a49d18246fe9..4f74682293d6 100644
--- a/arch/arm/mach-davinci/dm644x.c
+++ b/arch/arm/mach-davinci/dm644x.c
@@ -303,10 +303,11 @@ static struct clk_lookup dm644x_clks[] = {
303 CLK("vpss", "master", &vpss_master_clk), 303 CLK("vpss", "master", &vpss_master_clk),
304 CLK("vpss", "slave", &vpss_slave_clk), 304 CLK("vpss", "slave", &vpss_slave_clk),
305 CLK(NULL, "arm", &arm_clk), 305 CLK(NULL, "arm", &arm_clk),
306 CLK(NULL, "uart0", &uart0_clk), 306 CLK("serial8250.0", NULL, &uart0_clk),
307 CLK(NULL, "uart1", &uart1_clk), 307 CLK("serial8250.1", NULL, &uart1_clk),
308 CLK(NULL, "uart2", &uart2_clk), 308 CLK("serial8250.2", NULL, &uart2_clk),
309 CLK("davinci_emac.1", NULL, &emac_clk), 309 CLK("davinci_emac.1", NULL, &emac_clk),
310 CLK("davinci_mdio.0", "fck", &emac_clk),
310 CLK("i2c_davinci.1", NULL, &i2c_clk), 311 CLK("i2c_davinci.1", NULL, &i2c_clk),
311 CLK("palm_bk3710", NULL, &ide_clk), 312 CLK("palm_bk3710", NULL, &ide_clk),
312 CLK("davinci-mcbsp", NULL, &asp_clk), 313 CLK("davinci-mcbsp", NULL, &asp_clk),
@@ -813,7 +814,7 @@ static struct davinci_timer_info dm644x_timer_info = {
813 .clocksource_id = T0_TOP, 814 .clocksource_id = T0_TOP,
814}; 815};
815 816
816static struct plat_serial8250_port dm644x_serial_platform_data[] = { 817static struct plat_serial8250_port dm644x_serial0_platform_data[] = {
817 { 818 {
818 .mapbase = DAVINCI_UART0_BASE, 819 .mapbase = DAVINCI_UART0_BASE,
819 .irq = IRQ_UARTINT0, 820 .irq = IRQ_UARTINT0,
@@ -823,6 +824,11 @@ static struct plat_serial8250_port dm644x_serial_platform_data[] = {
823 .regshift = 2, 824 .regshift = 2,
824 }, 825 },
825 { 826 {
827 .flags = 0,
828 }
829};
830static struct plat_serial8250_port dm644x_serial1_platform_data[] = {
831 {
826 .mapbase = DAVINCI_UART1_BASE, 832 .mapbase = DAVINCI_UART1_BASE,
827 .irq = IRQ_UARTINT1, 833 .irq = IRQ_UARTINT1,
828 .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | 834 .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
@@ -831,6 +837,11 @@ static struct plat_serial8250_port dm644x_serial_platform_data[] = {
831 .regshift = 2, 837 .regshift = 2,
832 }, 838 },
833 { 839 {
840 .flags = 0,
841 }
842};
843static struct plat_serial8250_port dm644x_serial2_platform_data[] = {
844 {
834 .mapbase = DAVINCI_UART2_BASE, 845 .mapbase = DAVINCI_UART2_BASE,
835 .irq = IRQ_UARTINT2, 846 .irq = IRQ_UARTINT2,
836 .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | 847 .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
@@ -839,16 +850,34 @@ static struct plat_serial8250_port dm644x_serial_platform_data[] = {
839 .regshift = 2, 850 .regshift = 2,
840 }, 851 },
841 { 852 {
842 .flags = 0 853 .flags = 0,
843 }, 854 }
844}; 855};
845 856
846static struct platform_device dm644x_serial_device = { 857struct platform_device dm644x_serial_device[] = {
847 .name = "serial8250", 858 {
848 .id = PLAT8250_DEV_PLATFORM, 859 .name = "serial8250",
849 .dev = { 860 .id = PLAT8250_DEV_PLATFORM,
850 .platform_data = dm644x_serial_platform_data, 861 .dev = {
862 .platform_data = dm644x_serial0_platform_data,
863 }
851 }, 864 },
865 {
866 .name = "serial8250",
867 .id = PLAT8250_DEV_PLATFORM1,
868 .dev = {
869 .platform_data = dm644x_serial1_platform_data,
870 }
871 },
872 {
873 .name = "serial8250",
874 .id = PLAT8250_DEV_PLATFORM2,
875 .dev = {
876 .platform_data = dm644x_serial2_platform_data,
877 }
878 },
879 {
880 }
852}; 881};
853 882
854static struct davinci_soc_info davinci_soc_info_dm644x = { 883static struct davinci_soc_info davinci_soc_info_dm644x = {
@@ -872,7 +901,6 @@ static struct davinci_soc_info davinci_soc_info_dm644x = {
872 .gpio_base = DAVINCI_GPIO_BASE, 901 .gpio_base = DAVINCI_GPIO_BASE,
873 .gpio_num = 71, 902 .gpio_num = 71,
874 .gpio_irq = IRQ_GPIOBNK0, 903 .gpio_irq = IRQ_GPIOBNK0,
875 .serial_dev = &dm644x_serial_device,
876 .emac_pdata = &dm644x_emac_pdata, 904 .emac_pdata = &dm644x_emac_pdata,
877 .sram_dma = 0x00008000, 905 .sram_dma = 0x00008000,
878 .sram_len = SZ_16K, 906 .sram_len = SZ_16K,
@@ -923,8 +951,6 @@ static int __init dm644x_init_devices(void)
923 951
924 platform_device_register(&dm644x_mdio_device); 952 platform_device_register(&dm644x_mdio_device);
925 platform_device_register(&dm644x_emac_device); 953 platform_device_register(&dm644x_emac_device);
926 clk_add_alias(NULL, dev_name(&dm644x_mdio_device.dev),
927 NULL, &dm644x_emac_device.dev);
928 954
929 return 0; 955 return 0;
930} 956}
diff --git a/arch/arm/mach-davinci/dm646x.c b/arch/arm/mach-davinci/dm646x.c
index d1259e80141b..68f8d1f1aca1 100644
--- a/arch/arm/mach-davinci/dm646x.c
+++ b/arch/arm/mach-davinci/dm646x.c
@@ -342,15 +342,16 @@ static struct clk_lookup dm646x_clks[] = {
342 CLK(NULL, "edma_tc1", &edma_tc1_clk), 342 CLK(NULL, "edma_tc1", &edma_tc1_clk),
343 CLK(NULL, "edma_tc2", &edma_tc2_clk), 343 CLK(NULL, "edma_tc2", &edma_tc2_clk),
344 CLK(NULL, "edma_tc3", &edma_tc3_clk), 344 CLK(NULL, "edma_tc3", &edma_tc3_clk),
345 CLK(NULL, "uart0", &uart0_clk), 345 CLK("serial8250.0", NULL, &uart0_clk),
346 CLK(NULL, "uart1", &uart1_clk), 346 CLK("serial8250.1", NULL, &uart1_clk),
347 CLK(NULL, "uart2", &uart2_clk), 347 CLK("serial8250.2", NULL, &uart2_clk),
348 CLK("i2c_davinci.1", NULL, &i2c_clk), 348 CLK("i2c_davinci.1", NULL, &i2c_clk),
349 CLK(NULL, "gpio", &gpio_clk), 349 CLK(NULL, "gpio", &gpio_clk),
350 CLK("davinci-mcasp.0", NULL, &mcasp0_clk), 350 CLK("davinci-mcasp.0", NULL, &mcasp0_clk),
351 CLK("davinci-mcasp.1", NULL, &mcasp1_clk), 351 CLK("davinci-mcasp.1", NULL, &mcasp1_clk),
352 CLK(NULL, "aemif", &aemif_clk), 352 CLK(NULL, "aemif", &aemif_clk),
353 CLK("davinci_emac.1", NULL, &emac_clk), 353 CLK("davinci_emac.1", NULL, &emac_clk),
354 CLK("davinci_mdio.0", "fck", &emac_clk),
354 CLK(NULL, "pwm0", &pwm0_clk), 355 CLK(NULL, "pwm0", &pwm0_clk),
355 CLK(NULL, "pwm1", &pwm1_clk), 356 CLK(NULL, "pwm1", &pwm1_clk),
356 CLK(NULL, "timer0", &timer0_clk), 357 CLK(NULL, "timer0", &timer0_clk),
@@ -790,7 +791,7 @@ static struct davinci_timer_info dm646x_timer_info = {
790 .clocksource_id = T0_TOP, 791 .clocksource_id = T0_TOP,
791}; 792};
792 793
793static struct plat_serial8250_port dm646x_serial_platform_data[] = { 794static struct plat_serial8250_port dm646x_serial0_platform_data[] = {
794 { 795 {
795 .mapbase = DAVINCI_UART0_BASE, 796 .mapbase = DAVINCI_UART0_BASE,
796 .irq = IRQ_UARTINT0, 797 .irq = IRQ_UARTINT0,
@@ -800,6 +801,11 @@ static struct plat_serial8250_port dm646x_serial_platform_data[] = {
800 .regshift = 2, 801 .regshift = 2,
801 }, 802 },
802 { 803 {
804 .flags = 0,
805 }
806};
807static struct plat_serial8250_port dm646x_serial1_platform_data[] = {
808 {
803 .mapbase = DAVINCI_UART1_BASE, 809 .mapbase = DAVINCI_UART1_BASE,
804 .irq = IRQ_UARTINT1, 810 .irq = IRQ_UARTINT1,
805 .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | 811 .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
@@ -808,6 +814,11 @@ static struct plat_serial8250_port dm646x_serial_platform_data[] = {
808 .regshift = 2, 814 .regshift = 2,
809 }, 815 },
810 { 816 {
817 .flags = 0,
818 }
819};
820static struct plat_serial8250_port dm646x_serial2_platform_data[] = {
821 {
811 .mapbase = DAVINCI_UART2_BASE, 822 .mapbase = DAVINCI_UART2_BASE,
812 .irq = IRQ_DM646X_UARTINT2, 823 .irq = IRQ_DM646X_UARTINT2,
813 .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | 824 .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
@@ -816,16 +827,34 @@ static struct plat_serial8250_port dm646x_serial_platform_data[] = {
816 .regshift = 2, 827 .regshift = 2,
817 }, 828 },
818 { 829 {
819 .flags = 0 830 .flags = 0,
820 }, 831 }
821}; 832};
822 833
823static struct platform_device dm646x_serial_device = { 834struct platform_device dm646x_serial_device[] = {
824 .name = "serial8250", 835 {
825 .id = PLAT8250_DEV_PLATFORM, 836 .name = "serial8250",
826 .dev = { 837 .id = PLAT8250_DEV_PLATFORM,
827 .platform_data = dm646x_serial_platform_data, 838 .dev = {
839 .platform_data = dm646x_serial0_platform_data,
840 }
841 },
842 {
843 .name = "serial8250",
844 .id = PLAT8250_DEV_PLATFORM1,
845 .dev = {
846 .platform_data = dm646x_serial1_platform_data,
847 }
828 }, 848 },
849 {
850 .name = "serial8250",
851 .id = PLAT8250_DEV_PLATFORM2,
852 .dev = {
853 .platform_data = dm646x_serial2_platform_data,
854 }
855 },
856 {
857 }
829}; 858};
830 859
831static struct davinci_soc_info davinci_soc_info_dm646x = { 860static struct davinci_soc_info davinci_soc_info_dm646x = {
@@ -849,7 +878,6 @@ static struct davinci_soc_info davinci_soc_info_dm646x = {
849 .gpio_base = DAVINCI_GPIO_BASE, 878 .gpio_base = DAVINCI_GPIO_BASE,
850 .gpio_num = 43, /* Only 33 usable */ 879 .gpio_num = 43, /* Only 33 usable */
851 .gpio_irq = IRQ_DM646X_GPIOBNK0, 880 .gpio_irq = IRQ_DM646X_GPIOBNK0,
852 .serial_dev = &dm646x_serial_device,
853 .emac_pdata = &dm646x_emac_pdata, 881 .emac_pdata = &dm646x_emac_pdata,
854 .sram_dma = 0x10010000, 882 .sram_dma = 0x10010000,
855 .sram_len = SZ_32K, 883 .sram_len = SZ_32K,
@@ -913,8 +941,6 @@ static int __init dm646x_init_devices(void)
913 941
914 platform_device_register(&dm646x_mdio_device); 942 platform_device_register(&dm646x_mdio_device);
915 platform_device_register(&dm646x_emac_device); 943 platform_device_register(&dm646x_emac_device);
916 clk_add_alias(NULL, dev_name(&dm646x_mdio_device.dev),
917 NULL, &dm646x_emac_device.dev);
918 944
919 return 0; 945 return 0;
920} 946}
diff --git a/arch/arm/mach-davinci/include/mach/common.h b/arch/arm/mach-davinci/include/mach/common.h
index cce316b92c06..0b3c169758ed 100644
--- a/arch/arm/mach-davinci/include/mach/common.h
+++ b/arch/arm/mach-davinci/include/mach/common.h
@@ -72,7 +72,6 @@ struct davinci_soc_info {
72 unsigned gpio_unbanked; 72 unsigned gpio_unbanked;
73 struct davinci_gpio_controller *gpio_ctlrs; 73 struct davinci_gpio_controller *gpio_ctlrs;
74 int gpio_ctlrs_num; 74 int gpio_ctlrs_num;
75 struct platform_device *serial_dev;
76 struct emac_platform_data *emac_pdata; 75 struct emac_platform_data *emac_pdata;
77 dma_addr_t sram_dma; 76 dma_addr_t sram_dma;
78 unsigned sram_len; 77 unsigned sram_len;
diff --git a/arch/arm/mach-davinci/include/mach/da8xx.h b/arch/arm/mach-davinci/include/mach/da8xx.h
index 7b41a5e9bc31..aae53072c0eb 100644
--- a/arch/arm/mach-davinci/include/mach/da8xx.h
+++ b/arch/arm/mach-davinci/include/mach/da8xx.h
@@ -111,7 +111,7 @@ void da8xx_restart(enum reboot_mode mode, const char *cmd);
111void da8xx_rproc_reserve_cma(void); 111void da8xx_rproc_reserve_cma(void);
112int da8xx_register_rproc(void); 112int da8xx_register_rproc(void);
113 113
114extern struct platform_device da8xx_serial_device; 114extern struct platform_device da8xx_serial_device[];
115extern struct emac_platform_data da8xx_emac_pdata; 115extern struct emac_platform_data da8xx_emac_pdata;
116extern struct da8xx_lcdc_platform_data sharp_lcd035q3dg01_pdata; 116extern struct da8xx_lcdc_platform_data sharp_lcd035q3dg01_pdata;
117extern struct da8xx_lcdc_platform_data sharp_lk043t1dg01_pdata; 117extern struct da8xx_lcdc_platform_data sharp_lk043t1dg01_pdata;
diff --git a/arch/arm/mach-davinci/include/mach/debug-macro.S b/arch/arm/mach-davinci/include/mach/debug-macro.S
deleted file mode 100644
index b18b8ebc6508..000000000000
--- a/arch/arm/mach-davinci/include/mach/debug-macro.S
+++ /dev/null
@@ -1,65 +0,0 @@
1/*
2 * Debugging macro for DaVinci
3 *
4 * Author: Kevin Hilman, MontaVista Software, Inc. <source@mvista.com>
5 *
6 * 2007 (c) MontaVista Software, Inc. This file is licensed under
7 * the terms of the GNU General Public License version 2. This program
8 * is licensed "as is" without any warranty of any kind, whether express
9 * or implied.
10 */
11
12/* Modifications
13 * Jan 2009 Chaithrika U S Added senduart, busyuart, waituart
14 * macros, based on debug-8250.S file
15 * but using 32-bit accesses required for
16 * some davinci devices.
17 */
18
19#include <linux/serial_reg.h>
20
21#include <mach/serial.h>
22
23#define UART_SHIFT 2
24
25#if defined(CONFIG_DEBUG_DAVINCI_DMx_UART0)
26#define UART_BASE DAVINCI_UART0_BASE
27#elif defined(CONFIG_DEBUG_DAVINCI_DA8XX_UART1)
28#define UART_BASE DA8XX_UART1_BASE
29#elif defined(CONFIG_DEBUG_DAVINCI_DA8XX_UART2)
30#define UART_BASE DA8XX_UART2_BASE
31#elif defined(CONFIG_DEBUG_DAVINCI_TNETV107X_UART1)
32#define UART_BASE TNETV107X_UART2_BASE
33#define UART_VIRTBASE TNETV107X_UART2_VIRT
34#else
35#error "Select a specifc port for DEBUG_LL"
36#endif
37
38#ifndef UART_VIRTBASE
39#define UART_VIRTBASE IO_ADDRESS(UART_BASE)
40#endif
41
42 .macro addruart, rp, rv, tmp
43 ldr \rp, =UART_BASE
44 ldr \rv, =UART_VIRTBASE
45 .endm
46
47 .macro senduart,rd,rx
48 str \rd, [\rx, #UART_TX << UART_SHIFT]
49 .endm
50
51 .macro busyuart,rd,rx
521002: ldr \rd, [\rx, #UART_LSR << UART_SHIFT]
53 and \rd, \rd, #UART_LSR_TEMT | UART_LSR_THRE
54 teq \rd, #UART_LSR_TEMT | UART_LSR_THRE
55 bne 1002b
56 .endm
57
58 .macro waituart,rd,rx
59#ifdef FLOW_CONTROL
601001: ldr \rd, [\rx, #UART_MSR << UART_SHIFT]
61 tst \rd, #UART_MSR_CTS
62 beq 1001b
63#endif
64 .endm
65
diff --git a/arch/arm/mach-davinci/include/mach/serial.h b/arch/arm/mach-davinci/include/mach/serial.h
index 62ad300440f5..52b8571b2e70 100644
--- a/arch/arm/mach-davinci/include/mach/serial.h
+++ b/arch/arm/mach-davinci/include/mach/serial.h
@@ -15,6 +15,8 @@
15 15
16#include <mach/hardware.h> 16#include <mach/hardware.h>
17 17
18#include <linux/platform_device.h>
19
18#define DAVINCI_UART0_BASE (IO_PHYS + 0x20000) 20#define DAVINCI_UART0_BASE (IO_PHYS + 0x20000)
19#define DAVINCI_UART1_BASE (IO_PHYS + 0x20400) 21#define DAVINCI_UART1_BASE (IO_PHYS + 0x20400)
20#define DAVINCI_UART2_BASE (IO_PHYS + 0x20800) 22#define DAVINCI_UART2_BASE (IO_PHYS + 0x20800)
@@ -37,13 +39,7 @@
37#define UART_DM646X_SCR_TX_WATERMARK 0x08 39#define UART_DM646X_SCR_TX_WATERMARK 0x08
38 40
39#ifndef __ASSEMBLY__ 41#ifndef __ASSEMBLY__
40struct davinci_uart_config { 42extern int davinci_serial_init(struct platform_device *);
41 /* Bit field of UARTs present; bit 0 --> UART0 */
42 unsigned int enabled_uarts;
43};
44
45extern int davinci_serial_init(struct davinci_uart_config *);
46extern int davinci_serial_setup_clk(unsigned instance, unsigned int *rate);
47#endif 43#endif
48 44
49#endif /* __ASM_ARCH_SERIAL_H */ 45#endif /* __ASM_ARCH_SERIAL_H */
diff --git a/arch/arm/mach-davinci/include/mach/tnetv107x.h b/arch/arm/mach-davinci/include/mach/tnetv107x.h
index 16314c64f755..494fcf5ccfe1 100644
--- a/arch/arm/mach-davinci/include/mach/tnetv107x.h
+++ b/arch/arm/mach-davinci/include/mach/tnetv107x.h
@@ -42,7 +42,6 @@
42#include <mach/serial.h> 42#include <mach/serial.h>
43 43
44struct tnetv107x_device_info { 44struct tnetv107x_device_info {
45 struct davinci_uart_config *serial_config;
46 struct davinci_mmc_config *mmc_config[2]; /* 2 controllers */ 45 struct davinci_mmc_config *mmc_config[2]; /* 2 controllers */
47 struct davinci_nand_pdata *nand_config[4]; /* 4 chipsels */ 46 struct davinci_nand_pdata *nand_config[4]; /* 4 chipsels */
48 struct matrix_keypad_platform_data *keypad_config; 47 struct matrix_keypad_platform_data *keypad_config;
@@ -50,7 +49,7 @@ struct tnetv107x_device_info {
50}; 49};
51 50
52extern struct platform_device tnetv107x_wdt_device; 51extern struct platform_device tnetv107x_wdt_device;
53extern struct platform_device tnetv107x_serial_device; 52extern struct platform_device tnetv107x_serial_device[];
54 53
55extern void tnetv107x_init(void); 54extern void tnetv107x_init(void);
56extern void tnetv107x_devices_init(struct tnetv107x_device_info *); 55extern void tnetv107x_devices_init(struct tnetv107x_device_info *);
diff --git a/arch/arm/mach-davinci/serial.c b/arch/arm/mach-davinci/serial.c
index f2625814c3c9..5e93a734c858 100644
--- a/arch/arm/mach-davinci/serial.c
+++ b/arch/arm/mach-davinci/serial.c
@@ -70,49 +70,36 @@ static void __init davinci_serial_reset(struct plat_serial8250_port *p)
70 UART_DM646X_SCR_TX_WATERMARK); 70 UART_DM646X_SCR_TX_WATERMARK);
71} 71}
72 72
73/* Enable UART clock and obtain its rate */ 73int __init davinci_serial_init(struct platform_device *serial_dev)
74int __init davinci_serial_setup_clk(unsigned instance, unsigned int *rate)
75{ 74{
76 char name[16]; 75 int i, ret = 0;
76 struct device *dev;
77 struct plat_serial8250_port *p;
77 struct clk *clk; 78 struct clk *clk;
78 struct davinci_soc_info *soc_info = &davinci_soc_info;
79 struct device *dev = &soc_info->serial_dev->dev;
80
81 sprintf(name, "uart%d", instance);
82 clk = clk_get(dev, name);
83 if (IS_ERR(clk)) {
84 pr_err("%s:%d: failed to get UART%d clock\n",
85 __func__, __LINE__, instance);
86 return PTR_ERR(clk);
87 }
88
89 clk_prepare_enable(clk);
90
91 if (rate)
92 *rate = clk_get_rate(clk);
93
94 return 0;
95}
96
97int __init davinci_serial_init(struct davinci_uart_config *info)
98{
99 int i, ret;
100 struct davinci_soc_info *soc_info = &davinci_soc_info;
101 struct device *dev = &soc_info->serial_dev->dev;
102 struct plat_serial8250_port *p = dev->platform_data;
103 79
104 /* 80 /*
105 * Make sure the serial ports are muxed on at this point. 81 * Make sure the serial ports are muxed on at this point.
106 * You have to mux them off in device drivers later on if not needed. 82 * You have to mux them off in device drivers later on if not needed.
107 */ 83 */
108 for (i = 0; p->flags; i++, p++) { 84 for (i = 0; serial_dev[i].dev.platform_data != NULL; i++) {
109 if (!(info->enabled_uarts & (1 << i))) 85 dev = &serial_dev[i].dev;
110 continue; 86 p = dev->platform_data;
111 87
112 ret = davinci_serial_setup_clk(i, &p->uartclk); 88 ret = platform_device_register(&serial_dev[i]);
113 if (ret) 89 if (ret)
114 continue; 90 continue;
115 91
92 clk = clk_get(dev, NULL);
93 if (IS_ERR(clk)) {
94 pr_err("%s:%d: failed to get UART%d clock\n",
95 __func__, __LINE__, i);
96 continue;
97 }
98
99 clk_prepare_enable(clk);
100
101 p->uartclk = clk_get_rate(clk);
102
116 if (!p->membase && p->mapbase) { 103 if (!p->membase && p->mapbase) {
117 p->membase = ioremap(p->mapbase, SZ_4K); 104 p->membase = ioremap(p->mapbase, SZ_4K);
118 105
@@ -125,6 +112,5 @@ int __init davinci_serial_init(struct davinci_uart_config *info)
125 if (p->membase && p->type != PORT_AR7) 112 if (p->membase && p->type != PORT_AR7)
126 davinci_serial_reset(p); 113 davinci_serial_reset(p);
127 } 114 }
128 115 return ret;
129 return platform_device_register(soc_info->serial_dev);
130} 116}
diff --git a/arch/arm/mach-davinci/tnetv107x.c b/arch/arm/mach-davinci/tnetv107x.c
index 4545667ecd3c..f4d7fbb24b3b 100644
--- a/arch/arm/mach-davinci/tnetv107x.c
+++ b/arch/arm/mach-davinci/tnetv107x.c
@@ -264,7 +264,7 @@ static struct clk_lookup clks[] = {
264 CLK(NULL, "clk_chipcfg", &clk_chipcfg), 264 CLK(NULL, "clk_chipcfg", &clk_chipcfg),
265 CLK("tnetv107x-ts.0", NULL, &clk_tsc), 265 CLK("tnetv107x-ts.0", NULL, &clk_tsc),
266 CLK(NULL, "clk_rom", &clk_rom), 266 CLK(NULL, "clk_rom", &clk_rom),
267 CLK(NULL, "uart2", &clk_uart2), 267 CLK("serial8250.2", NULL, &clk_uart2),
268 CLK(NULL, "clk_pktsec", &clk_pktsec), 268 CLK(NULL, "clk_pktsec", &clk_pktsec),
269 CLK("tnetv107x-rng.0", NULL, &clk_rng), 269 CLK("tnetv107x-rng.0", NULL, &clk_rng),
270 CLK("tnetv107x-pka.0", NULL, &clk_pka), 270 CLK("tnetv107x-pka.0", NULL, &clk_pka),
@@ -274,8 +274,8 @@ static struct clk_lookup clks[] = {
274 CLK(NULL, "clk_gpio", &clk_gpio), 274 CLK(NULL, "clk_gpio", &clk_gpio),
275 CLK(NULL, "clk_mdio", &clk_mdio), 275 CLK(NULL, "clk_mdio", &clk_mdio),
276 CLK("dm6441-mmc.0", NULL, &clk_sdio0), 276 CLK("dm6441-mmc.0", NULL, &clk_sdio0),
277 CLK(NULL, "uart0", &clk_uart0), 277 CLK("serial8250.0", NULL, &clk_uart0),
278 CLK(NULL, "uart1", &clk_uart1), 278 CLK("serial8250.1", NULL, &clk_uart1),
279 CLK(NULL, "timer0", &clk_timer0), 279 CLK(NULL, "timer0", &clk_timer0),
280 CLK(NULL, "timer1", &clk_timer1), 280 CLK(NULL, "timer1", &clk_timer1),
281 CLK("tnetv107x_wdt.0", NULL, &clk_wdt_arm), 281 CLK("tnetv107x_wdt.0", NULL, &clk_wdt_arm),
@@ -757,7 +757,7 @@ static struct davinci_soc_info tnetv107x_soc_info = {
757 .gpio_type = GPIO_TYPE_TNETV107X, 757 .gpio_type = GPIO_TYPE_TNETV107X,
758 .gpio_num = TNETV107X_N_GPIO, 758 .gpio_num = TNETV107X_N_GPIO,
759 .timer_info = &timer_info, 759 .timer_info = &timer_info,
760 .serial_dev = &tnetv107x_serial_device, 760 .serial_dev = tnetv107x_serial_device,
761}; 761};
762 762
763void __init tnetv107x_init(void) 763void __init tnetv107x_init(void)
diff --git a/arch/arm/mach-dove/Kconfig b/arch/arm/mach-dove/Kconfig
index dff7b2fd4e20..0bc7cdf8cf46 100644
--- a/arch/arm/mach-dove/Kconfig
+++ b/arch/arm/mach-dove/Kconfig
@@ -23,6 +23,8 @@ config MACH_CM_A510
23config MACH_DOVE_DT 23config MACH_DOVE_DT
24 bool "Marvell Dove Flattened Device Tree" 24 bool "Marvell Dove Flattened Device Tree"
25 select DOVE_CLK 25 select DOVE_CLK
26 select ORION_IRQCHIP
27 select ORION_TIMER
26 select REGULATOR 28 select REGULATOR
27 select REGULATOR_FIXED_VOLTAGE 29 select REGULATOR_FIXED_VOLTAGE
28 select USE_OF 30 select USE_OF
diff --git a/arch/arm/mach-dove/Makefile b/arch/arm/mach-dove/Makefile
index 4d9d2ffc4535..cbc5c0618788 100644
--- a/arch/arm/mach-dove/Makefile
+++ b/arch/arm/mach-dove/Makefile
@@ -1,5 +1,5 @@
1obj-y += common.o irq.o 1obj-y += common.o
2obj-$(CONFIG_DOVE_LEGACY) += mpp.o 2obj-$(CONFIG_DOVE_LEGACY) += irq.o mpp.o
3obj-$(CONFIG_PCI) += pcie.o 3obj-$(CONFIG_PCI) += pcie.o
4obj-$(CONFIG_MACH_DOVE_DB) += dove-db-setup.o 4obj-$(CONFIG_MACH_DOVE_DB) += dove-db-setup.o
5obj-$(CONFIG_MACH_DOVE_DT) += board-dt.o 5obj-$(CONFIG_MACH_DOVE_DT) += board-dt.o
diff --git a/arch/arm/mach-dove/board-dt.c b/arch/arm/mach-dove/board-dt.c
index f3755ac81148..49f72a848423 100644
--- a/arch/arm/mach-dove/board-dt.c
+++ b/arch/arm/mach-dove/board-dt.c
@@ -10,11 +10,14 @@
10 10
11#include <linux/init.h> 11#include <linux/init.h>
12#include <linux/clk-provider.h> 12#include <linux/clk-provider.h>
13#include <linux/clocksource.h>
14#include <linux/irqchip.h>
13#include <linux/of.h> 15#include <linux/of.h>
14#include <linux/of_platform.h> 16#include <linux/of_platform.h>
15#include <linux/platform_data/usb-ehci-orion.h> 17#include <linux/platform_data/usb-ehci-orion.h>
16#include <asm/hardware/cache-tauros2.h> 18#include <asm/hardware/cache-tauros2.h>
17#include <asm/mach/arch.h> 19#include <asm/mach/arch.h>
20#include <mach/dove.h>
18#include <mach/pm.h> 21#include <mach/pm.h>
19#include <plat/common.h> 22#include <plat/common.h>
20#include <plat/irq.h> 23#include <plat/irq.h>
@@ -33,10 +36,6 @@ static void __init dove_legacy_clk_init(void)
33 clkspec.np = np; 36 clkspec.np = np;
34 clkspec.args_count = 1; 37 clkspec.args_count = 1;
35 38
36 clkspec.args[0] = CLOCK_GATING_BIT_GBE;
37 orion_clkdev_add(NULL, "mv643xx_eth_port.0",
38 of_clk_get_from_provider(&clkspec));
39
40 clkspec.args[0] = CLOCK_GATING_BIT_PCIE0; 39 clkspec.args[0] = CLOCK_GATING_BIT_PCIE0;
41 orion_clkdev_add("0", "pcie", 40 orion_clkdev_add("0", "pcie",
42 of_clk_get_from_provider(&clkspec)); 41 of_clk_get_from_provider(&clkspec));
@@ -46,15 +45,18 @@ static void __init dove_legacy_clk_init(void)
46 of_clk_get_from_provider(&clkspec)); 45 of_clk_get_from_provider(&clkspec));
47} 46}
48 47
49static void __init dove_of_clk_init(void) 48static void __init dove_dt_time_init(void)
50{ 49{
51 of_clk_init(NULL); 50 of_clk_init(NULL);
52 dove_legacy_clk_init(); 51 clocksource_of_init();
53} 52}
54 53
55static struct mv643xx_eth_platform_data dove_dt_ge00_data = { 54static void __init dove_dt_init_early(void)
56 .phy_addr = MV643XX_ETH_PHY_ADDR_DEFAULT, 55{
57}; 56 mvebu_mbus_init("marvell,dove-mbus",
57 BRIDGE_WINS_BASE, BRIDGE_WINS_SZ,
58 DOVE_MC_WINS_BASE, DOVE_MC_WINS_SZ);
59}
58 60
59static void __init dove_dt_init(void) 61static void __init dove_dt_init(void)
60{ 62{
@@ -65,11 +67,10 @@ static void __init dove_dt_init(void)
65#endif 67#endif
66 dove_setup_cpu_wins(); 68 dove_setup_cpu_wins();
67 69
68 /* Setup root of clk tree */ 70 /* Setup clocks for legacy devices */
69 dove_of_clk_init(); 71 dove_legacy_clk_init();
70 72
71 /* Internal devices not ported to DT yet */ 73 /* Internal devices not ported to DT yet */
72 dove_ge00_init(&dove_dt_ge00_data);
73 dove_pcie_init(1, 1); 74 dove_pcie_init(1, 1);
74 75
75 of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); 76 of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
@@ -82,9 +83,8 @@ static const char * const dove_dt_board_compat[] = {
82 83
83DT_MACHINE_START(DOVE_DT, "Marvell Dove (Flattened Device Tree)") 84DT_MACHINE_START(DOVE_DT, "Marvell Dove (Flattened Device Tree)")
84 .map_io = dove_map_io, 85 .map_io = dove_map_io,
85 .init_early = dove_init_early, 86 .init_early = dove_dt_init_early,
86 .init_irq = orion_dt_init_irq, 87 .init_time = dove_dt_time_init,
87 .init_time = dove_timer_init,
88 .init_machine = dove_dt_init, 88 .init_machine = dove_dt_init,
89 .restart = dove_restart, 89 .restart = dove_restart,
90 .dt_compat = dove_dt_board_compat, 90 .dt_compat = dove_dt_board_compat,
diff --git a/arch/arm/mach-dove/common.c b/arch/arm/mach-dove/common.c
index 00247c771313..c122bcff9f7c 100644
--- a/arch/arm/mach-dove/common.c
+++ b/arch/arm/mach-dove/common.c
@@ -27,6 +27,22 @@
27#include <plat/time.h> 27#include <plat/time.h>
28#include "common.h" 28#include "common.h"
29 29
30/* These can go away once Dove uses the mvebu-mbus DT binding */
31#define DOVE_MBUS_PCIE0_MEM_TARGET 0x4
32#define DOVE_MBUS_PCIE0_MEM_ATTR 0xe8
33#define DOVE_MBUS_PCIE0_IO_TARGET 0x4
34#define DOVE_MBUS_PCIE0_IO_ATTR 0xe0
35#define DOVE_MBUS_PCIE1_MEM_TARGET 0x8
36#define DOVE_MBUS_PCIE1_MEM_ATTR 0xe8
37#define DOVE_MBUS_PCIE1_IO_TARGET 0x8
38#define DOVE_MBUS_PCIE1_IO_ATTR 0xe0
39#define DOVE_MBUS_CESA_TARGET 0x3
40#define DOVE_MBUS_CESA_ATTR 0x1
41#define DOVE_MBUS_BOOTROM_TARGET 0x1
42#define DOVE_MBUS_BOOTROM_ATTR 0xfd
43#define DOVE_MBUS_SCRATCHPAD_TARGET 0xd
44#define DOVE_MBUS_SCRATCHPAD_ATTR 0x0
45
30/***************************************************************************** 46/*****************************************************************************
31 * I/O Address Mapping 47 * I/O Address Mapping
32 ****************************************************************************/ 48 ****************************************************************************/
@@ -108,8 +124,8 @@ static void __init dove_clk_init(void)
108 orion_clkdev_add(NULL, "sdhci-dove.1", sdio1); 124 orion_clkdev_add(NULL, "sdhci-dove.1", sdio1);
109 orion_clkdev_add(NULL, "orion_nand", nand); 125 orion_clkdev_add(NULL, "orion_nand", nand);
110 orion_clkdev_add(NULL, "cafe1000-ccic.0", camera); 126 orion_clkdev_add(NULL, "cafe1000-ccic.0", camera);
111 orion_clkdev_add(NULL, "kirkwood-i2s.0", i2s0); 127 orion_clkdev_add(NULL, "mvebu-audio.0", i2s0);
112 orion_clkdev_add(NULL, "kirkwood-i2s.1", i2s1); 128 orion_clkdev_add(NULL, "mvebu-audio.1", i2s1);
113 orion_clkdev_add(NULL, "mv_crypto", crypto); 129 orion_clkdev_add(NULL, "mv_crypto", crypto);
114 orion_clkdev_add(NULL, "dove-ac97", ac97); 130 orion_clkdev_add(NULL, "dove-ac97", ac97);
115 orion_clkdev_add(NULL, "dove-pdma", pdma); 131 orion_clkdev_add(NULL, "dove-pdma", pdma);
@@ -332,34 +348,40 @@ void __init dove_setup_cpu_wins(void)
332{ 348{
333 /* 349 /*
334 * The PCIe windows will no longer be statically allocated 350 * The PCIe windows will no longer be statically allocated
335 * here once Dove is migrated to the pci-mvebu driver. 351 * here once Dove is migrated to the pci-mvebu driver. The
352 * non-PCIe windows will no longer be created here once Dove
353 * fully moves to DT.
336 */ 354 */
337 mvebu_mbus_add_window_remap_flags("pcie0.0", 355 mvebu_mbus_add_window_remap_by_id(DOVE_MBUS_PCIE0_IO_TARGET,
356 DOVE_MBUS_PCIE0_IO_ATTR,
338 DOVE_PCIE0_IO_PHYS_BASE, 357 DOVE_PCIE0_IO_PHYS_BASE,
339 DOVE_PCIE0_IO_SIZE, 358 DOVE_PCIE0_IO_SIZE,
340 DOVE_PCIE0_IO_BUS_BASE, 359 DOVE_PCIE0_IO_BUS_BASE);
341 MVEBU_MBUS_PCI_IO); 360 mvebu_mbus_add_window_remap_by_id(DOVE_MBUS_PCIE1_IO_TARGET,
342 mvebu_mbus_add_window_remap_flags("pcie1.0", 361 DOVE_MBUS_PCIE1_IO_ATTR,
343 DOVE_PCIE1_IO_PHYS_BASE, 362 DOVE_PCIE1_IO_PHYS_BASE,
344 DOVE_PCIE1_IO_SIZE, 363 DOVE_PCIE1_IO_SIZE,
345 DOVE_PCIE1_IO_BUS_BASE, 364 DOVE_PCIE1_IO_BUS_BASE);
346 MVEBU_MBUS_PCI_IO); 365 mvebu_mbus_add_window_by_id(DOVE_MBUS_PCIE0_MEM_TARGET,
347 mvebu_mbus_add_window_remap_flags("pcie0.0", 366 DOVE_MBUS_PCIE0_MEM_ATTR,
348 DOVE_PCIE0_MEM_PHYS_BASE, 367 DOVE_PCIE0_MEM_PHYS_BASE,
349 DOVE_PCIE0_MEM_SIZE, 368 DOVE_PCIE0_MEM_SIZE);
350 MVEBU_MBUS_NO_REMAP, 369 mvebu_mbus_add_window_by_id(DOVE_MBUS_PCIE1_MEM_TARGET,
351 MVEBU_MBUS_PCI_MEM); 370 DOVE_MBUS_PCIE1_MEM_ATTR,
352 mvebu_mbus_add_window_remap_flags("pcie1.0", 371 DOVE_PCIE1_MEM_PHYS_BASE,
353 DOVE_PCIE1_MEM_PHYS_BASE, 372 DOVE_PCIE1_MEM_SIZE);
354 DOVE_PCIE1_MEM_SIZE, 373 mvebu_mbus_add_window_by_id(DOVE_MBUS_CESA_TARGET,
355 MVEBU_MBUS_NO_REMAP, 374 DOVE_MBUS_CESA_ATTR,
356 MVEBU_MBUS_PCI_MEM); 375 DOVE_CESA_PHYS_BASE,
357 mvebu_mbus_add_window("cesa", DOVE_CESA_PHYS_BASE, 376 DOVE_CESA_SIZE);
358 DOVE_CESA_SIZE); 377 mvebu_mbus_add_window_by_id(DOVE_MBUS_BOOTROM_TARGET,
359 mvebu_mbus_add_window("bootrom", DOVE_BOOTROM_PHYS_BASE, 378 DOVE_MBUS_BOOTROM_ATTR,
360 DOVE_BOOTROM_SIZE); 379 DOVE_BOOTROM_PHYS_BASE,
361 mvebu_mbus_add_window("scratchpad", DOVE_SCRATCHPAD_PHYS_BASE, 380 DOVE_BOOTROM_SIZE);
362 DOVE_SCRATCHPAD_SIZE); 381 mvebu_mbus_add_window_by_id(DOVE_MBUS_SCRATCHPAD_TARGET,
382 DOVE_MBUS_SCRATCHPAD_ATTR,
383 DOVE_SCRATCHPAD_PHYS_BASE,
384 DOVE_SCRATCHPAD_SIZE);
363} 385}
364 386
365void __init dove_init(void) 387void __init dove_init(void)
diff --git a/arch/arm/mach-dove/include/mach/debug-macro.S b/arch/arm/mach-dove/include/mach/debug-macro.S
deleted file mode 100644
index 5929cbc59161..000000000000
--- a/arch/arm/mach-dove/include/mach/debug-macro.S
+++ /dev/null
@@ -1,19 +0,0 @@
1/*
2 * arch/arm/mach-dove/include/mach/debug-macro.S
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7*/
8
9#include <mach/bridge-regs.h>
10
11 .macro addruart, rp, rv, tmp
12 ldr \rp, =DOVE_SB_REGS_PHYS_BASE
13 ldr \rv, =DOVE_SB_REGS_VIRT_BASE
14 orr \rp, \rp, #0x00012000
15 orr \rv, \rv, #0x00012000
16 .endm
17
18#define UART_SHIFT 2
19#include <asm/hardware/debug-8250.S>
diff --git a/arch/arm/mach-dove/mpp.c b/arch/arm/mach-dove/mpp.c
index 60bd729a1ba5..8a433a51289c 100644
--- a/arch/arm/mach-dove/mpp.c
+++ b/arch/arm/mach-dove/mpp.c
@@ -47,7 +47,7 @@ static const struct dove_mpp_grp dove_mpp_grp[] = {
47 47
48/* Enable gpio for a range of pins. mode should be a combination of 48/* Enable gpio for a range of pins. mode should be a combination of
49 GPIO_OUTPUT_OK | GPIO_INPUT_OK */ 49 GPIO_OUTPUT_OK | GPIO_INPUT_OK */
50static void dove_mpp_gpio_mode(int start, int end, int gpio_mode) 50static void __init dove_mpp_gpio_mode(int start, int end, int gpio_mode)
51{ 51{
52 int i; 52 int i;
53 53
diff --git a/arch/arm/mach-ebsa110/include/mach/debug-macro.S b/arch/arm/mach-ebsa110/include/mach/debug-macro.S
deleted file mode 100644
index bb02c05e6812..000000000000
--- a/arch/arm/mach-ebsa110/include/mach/debug-macro.S
+++ /dev/null
@@ -1,22 +0,0 @@
1/* arch/arm/mach-ebsa110/include/mach/debug-macro.S
2 *
3 * Debugging macro include header
4 *
5 * Copyright (C) 1994-1999 Russell King
6 * Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 *
12**/
13
14 .macro addruart, rp, rv, tmp
15 mov \rp, #0xf0000000
16 orr \rp, \rp, #0x00000be0
17 mov \rp, \rv
18 .endm
19
20#define UART_SHIFT 2
21#define FLOW_CONTROL
22#include <asm/hardware/debug-8250.S>
diff --git a/arch/arm/mach-ep93xx/Kconfig b/arch/arm/mach-ep93xx/Kconfig
index fe3c1fa5462b..93e54fd4e3d5 100644
--- a/arch/arm/mach-ep93xx/Kconfig
+++ b/arch/arm/mach-ep93xx/Kconfig
@@ -194,20 +194,6 @@ config MACH_VISION_EP9307
194 Say 'Y' here if you want your kernel to support the 194 Say 'Y' here if you want your kernel to support the
195 Vision Engraving Systems EP9307 SoM. 195 Vision Engraving Systems EP9307 SoM.
196 196
197choice
198 prompt "Select a UART for early kernel messages"
199
200config EP93XX_EARLY_UART1
201 bool "UART1"
202
203config EP93XX_EARLY_UART2
204 bool "UART2"
205
206config EP93XX_EARLY_UART3
207 bool "UART3"
208
209endchoice
210
211endmenu 197endmenu
212 198
213endif 199endif
diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c
index df8612fbbc9c..3f12b885c083 100644
--- a/arch/arm/mach-ep93xx/core.c
+++ b/arch/arm/mach-ep93xx/core.c
@@ -281,7 +281,7 @@ static AMBA_APB_DEVICE(uart1, "apb:uart1", 0x00041010, EP93XX_UART1_PHYS_BASE,
281 { IRQ_EP93XX_UART1 }, &ep93xx_uart_data); 281 { IRQ_EP93XX_UART1 }, &ep93xx_uart_data);
282 282
283static AMBA_APB_DEVICE(uart2, "apb:uart2", 0x00041010, EP93XX_UART2_PHYS_BASE, 283static AMBA_APB_DEVICE(uart2, "apb:uart2", 0x00041010, EP93XX_UART2_PHYS_BASE,
284 { IRQ_EP93XX_UART2 }, &ep93xx_uart_data); 284 { IRQ_EP93XX_UART2 }, NULL);
285 285
286static AMBA_APB_DEVICE(uart3, "apb:uart3", 0x00041010, EP93XX_UART3_PHYS_BASE, 286static AMBA_APB_DEVICE(uart3, "apb:uart3", 0x00041010, EP93XX_UART3_PHYS_BASE,
287 { IRQ_EP93XX_UART3 }, &ep93xx_uart_data); 287 { IRQ_EP93XX_UART3 }, &ep93xx_uart_data);
diff --git a/arch/arm/mach-ep93xx/include/mach/debug-macro.S b/arch/arm/mach-ep93xx/include/mach/debug-macro.S
deleted file mode 100644
index af54e43132cf..000000000000
--- a/arch/arm/mach-ep93xx/include/mach/debug-macro.S
+++ /dev/null
@@ -1,21 +0,0 @@
1/*
2 * arch/arm/mach-ep93xx/include/mach/debug-macro.S
3 * Debugging macro include header
4 *
5 * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or (at
10 * your option) any later version.
11 */
12#include <mach/ep93xx-regs.h>
13
14 .macro addruart, rp, rv, tmp
15 ldr \rp, =EP93XX_APB_PHYS_BASE @ Physical base
16 ldr \rv, =EP93XX_APB_VIRT_BASE @ virtual base
17 orr \rp, \rp, #0x000c0000
18 orr \rv, \rv, #0x000c0000
19 .endm
20
21#include <asm/hardware/debug-pl01x.S>
diff --git a/arch/arm/mach-ep93xx/include/mach/uncompress.h b/arch/arm/mach-ep93xx/include/mach/uncompress.h
index b5cc77d2380b..03c42e5400d2 100644
--- a/arch/arm/mach-ep93xx/include/mach/uncompress.h
+++ b/arch/arm/mach-ep93xx/include/mach/uncompress.h
@@ -31,18 +31,8 @@ static void __raw_writel(unsigned int value, unsigned int ptr)
31 *((volatile unsigned int *)ptr) = value; 31 *((volatile unsigned int *)ptr) = value;
32} 32}
33 33
34#if defined(CONFIG_EP93XX_EARLY_UART1) 34#define PHYS_UART_DATA (CONFIG_DEBUG_UART_PHYS + 0x00)
35#define UART_BASE EP93XX_UART1_PHYS_BASE 35#define PHYS_UART_FLAG (CONFIG_DEBUG_UART_PHYS + 0x18)
36#elif defined(CONFIG_EP93XX_EARLY_UART2)
37#define UART_BASE EP93XX_UART2_PHYS_BASE
38#elif defined(CONFIG_EP93XX_EARLY_UART3)
39#define UART_BASE EP93XX_UART3_PHYS_BASE
40#else
41#define UART_BASE EP93XX_UART1_PHYS_BASE
42#endif
43
44#define PHYS_UART_DATA (UART_BASE + 0x00)
45#define PHYS_UART_FLAG (UART_BASE + 0x18)
46#define UART_FLAG_TXFF 0x20 36#define UART_FLAG_TXFF 0x20
47 37
48static inline void putc(int c) 38static inline void putc(int c)
diff --git a/arch/arm/mach-ep93xx/vision_ep9307.c b/arch/arm/mach-ep93xx/vision_ep9307.c
index 605956fd07a2..6bc1c181581d 100644
--- a/arch/arm/mach-ep93xx/vision_ep9307.c
+++ b/arch/arm/mach-ep93xx/vision_ep9307.c
@@ -23,7 +23,7 @@
23#include <linux/mtd/partitions.h> 23#include <linux/mtd/partitions.h>
24#include <linux/i2c.h> 24#include <linux/i2c.h>
25#include <linux/i2c-gpio.h> 25#include <linux/i2c-gpio.h>
26#include <linux/i2c/pca953x.h> 26#include <linux/platform_data/pca953x.h>
27#include <linux/spi/spi.h> 27#include <linux/spi/spi.h>
28#include <linux/spi/flash.h> 28#include <linux/spi/flash.h>
29#include <linux/spi/mmc_spi.h> 29#include <linux/spi/mmc_spi.h>
@@ -224,62 +224,15 @@ static struct ep93xx_spi_chip_ops vision_spi_flash_hw = {
224#define VISION_SPI_MMC_WP EP93XX_GPIO_LINE_F(0) 224#define VISION_SPI_MMC_WP EP93XX_GPIO_LINE_F(0)
225#define VISION_SPI_MMC_CD EP93XX_GPIO_LINE_EGPIO15 225#define VISION_SPI_MMC_CD EP93XX_GPIO_LINE_EGPIO15
226 226
227static struct gpio vision_spi_mmc_gpios[] = {
228 { VISION_SPI_MMC_WP, GPIOF_DIR_IN, "mmc_spi:wp" },
229 { VISION_SPI_MMC_CD, GPIOF_DIR_IN, "mmc_spi:cd" },
230};
231
232static int vision_spi_mmc_init(struct device *pdev,
233 irqreturn_t (*func)(int, void *), void *pdata)
234{
235 int err;
236
237 err = gpio_request_array(vision_spi_mmc_gpios,
238 ARRAY_SIZE(vision_spi_mmc_gpios));
239 if (err)
240 return err;
241
242 err = gpio_set_debounce(VISION_SPI_MMC_CD, 1);
243 if (err)
244 goto exit_err;
245
246 err = request_irq(gpio_to_irq(VISION_SPI_MMC_CD), func,
247 IRQ_TYPE_EDGE_BOTH, "mmc_spi:cd", pdata);
248 if (err)
249 goto exit_err;
250
251 return 0;
252
253exit_err:
254 gpio_free_array(vision_spi_mmc_gpios, ARRAY_SIZE(vision_spi_mmc_gpios));
255 return err;
256
257}
258
259static void vision_spi_mmc_exit(struct device *pdev, void *pdata)
260{
261 free_irq(gpio_to_irq(VISION_SPI_MMC_CD), pdata);
262 gpio_free_array(vision_spi_mmc_gpios, ARRAY_SIZE(vision_spi_mmc_gpios));
263}
264
265static int vision_spi_mmc_get_ro(struct device *pdev)
266{
267 return !!gpio_get_value(VISION_SPI_MMC_WP);
268}
269
270static int vision_spi_mmc_get_cd(struct device *pdev)
271{
272 return !gpio_get_value(VISION_SPI_MMC_CD);
273}
274
275static struct mmc_spi_platform_data vision_spi_mmc_data = { 227static struct mmc_spi_platform_data vision_spi_mmc_data = {
276 .init = vision_spi_mmc_init,
277 .exit = vision_spi_mmc_exit,
278 .get_ro = vision_spi_mmc_get_ro,
279 .get_cd = vision_spi_mmc_get_cd,
280 .detect_delay = 100, 228 .detect_delay = 100,
281 .powerup_msecs = 100, 229 .powerup_msecs = 100,
282 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, 230 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
231 .flags = MMC_SPI_USE_CD_GPIO | MMC_SPI_USE_RO_GPIO,
232 .cd_gpio = VISION_SPI_MMC_CD,
233 .cd_debounce = 1,
234 .ro_gpio = VISION_SPI_MMC_WP,
235 .caps2 = MMC_CAP2_RO_ACTIVE_HIGH,
283}; 236};
284 237
285static int vision_spi_mmc_hw_setup(struct spi_device *spi) 238static int vision_spi_mmc_hw_setup(struct spi_device *spi)
diff --git a/arch/arm/mach-exynos/Kconfig b/arch/arm/mach-exynos/Kconfig
index 5952e68c76c4..56fe819ee10b 100644
--- a/arch/arm/mach-exynos/Kconfig
+++ b/arch/arm/mach-exynos/Kconfig
@@ -36,6 +36,7 @@ config CPU_EXYNOS4210
36 bool "SAMSUNG EXYNOS4210" 36 bool "SAMSUNG EXYNOS4210"
37 default y 37 default y
38 depends on ARCH_EXYNOS4 38 depends on ARCH_EXYNOS4
39 select ARCH_HAS_BANDGAP
39 select ARM_CPU_SUSPEND if PM 40 select ARM_CPU_SUSPEND if PM
40 select PINCTRL_EXYNOS 41 select PINCTRL_EXYNOS
41 select PM_GENERIC_DOMAINS if PM 42 select PM_GENERIC_DOMAINS if PM
@@ -49,7 +50,9 @@ config SOC_EXYNOS4212
49 bool "SAMSUNG EXYNOS4212" 50 bool "SAMSUNG EXYNOS4212"
50 default y 51 default y
51 depends on ARCH_EXYNOS4 52 depends on ARCH_EXYNOS4
53 select ARCH_HAS_BANDGAP
52 select PINCTRL_EXYNOS 54 select PINCTRL_EXYNOS
55 select PM_GENERIC_DOMAINS if PM
53 select S5P_PM if PM 56 select S5P_PM if PM
54 select S5P_SLEEP if PM 57 select S5P_SLEEP if PM
55 select SAMSUNG_DMADEV 58 select SAMSUNG_DMADEV
@@ -60,7 +63,9 @@ config SOC_EXYNOS4412
60 bool "SAMSUNG EXYNOS4412" 63 bool "SAMSUNG EXYNOS4412"
61 default y 64 default y
62 depends on ARCH_EXYNOS4 65 depends on ARCH_EXYNOS4
66 select ARCH_HAS_BANDGAP
63 select PINCTRL_EXYNOS 67 select PINCTRL_EXYNOS
68 select PM_GENERIC_DOMAINS if PM
64 select SAMSUNG_DMADEV 69 select SAMSUNG_DMADEV
65 help 70 help
66 Enable EXYNOS4412 SoC support 71 Enable EXYNOS4412 SoC support
@@ -69,6 +74,7 @@ config SOC_EXYNOS5250
69 bool "SAMSUNG EXYNOS5250" 74 bool "SAMSUNG EXYNOS5250"
70 default y 75 default y
71 depends on ARCH_EXYNOS5 76 depends on ARCH_EXYNOS5
77 select ARCH_HAS_BANDGAP
72 select PINCTRL_EXYNOS 78 select PINCTRL_EXYNOS
73 select PM_GENERIC_DOMAINS if PM 79 select PM_GENERIC_DOMAINS if PM
74 select S5P_PM if PM 80 select S5P_PM if PM
@@ -93,6 +99,7 @@ config SOC_EXYNOS5440
93 default y 99 default y
94 depends on ARCH_EXYNOS5 100 depends on ARCH_EXYNOS5
95 select ARCH_DMA_ADDR_T_64BIT if ARM_LPAE 101 select ARCH_DMA_ADDR_T_64BIT if ARM_LPAE
102 select ARCH_HAS_BANDGAP
96 select ARCH_HAS_OPP 103 select ARCH_HAS_OPP
97 select HAVE_ARM_ARCH_TIMER 104 select HAVE_ARM_ARCH_TIMER
98 select AUTO_ZRELADDR 105 select AUTO_ZRELADDR
diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h
index 972490fc09d6..8646a141ae46 100644
--- a/arch/arm/mach-exynos/common.h
+++ b/arch/arm/mach-exynos/common.h
@@ -17,7 +17,6 @@
17 17
18void mct_init(void __iomem *base, int irq_g0, int irq_l0, int irq_l1); 18void mct_init(void __iomem *base, int irq_g0, int irq_l0, int irq_l1);
19void exynos_init_time(void); 19void exynos_init_time(void);
20extern unsigned long xxti_f, xusbxti_f;
21 20
22struct map_desc; 21struct map_desc;
23void exynos_init_io(void); 22void exynos_init_io(void);
@@ -25,56 +24,14 @@ void exynos4_restart(enum reboot_mode mode, const char *cmd);
25void exynos5_restart(enum reboot_mode mode, const char *cmd); 24void exynos5_restart(enum reboot_mode mode, const char *cmd);
26void exynos_init_late(void); 25void exynos_init_late(void);
27 26
28/* ToDo: remove these after migrating legacy exynos4 platforms to dt */
29void exynos4_clk_init(struct device_node *np, int is_exynos4210, void __iomem *reg_base, unsigned long xom);
30void exynos4_clk_register_fixed_ext(unsigned long, unsigned long);
31
32void exynos_firmware_init(void); 27void exynos_firmware_init(void);
33 28
34void exynos_set_timer_source(u8 channels);
35
36#ifdef CONFIG_PM_GENERIC_DOMAINS 29#ifdef CONFIG_PM_GENERIC_DOMAINS
37int exynos_pm_late_initcall(void); 30int exynos_pm_late_initcall(void);
38#else 31#else
39static inline int exynos_pm_late_initcall(void) { return 0; } 32static inline int exynos_pm_late_initcall(void) { return 0; }
40#endif 33#endif
41 34
42#ifdef CONFIG_ARCH_EXYNOS4
43void exynos4_register_clocks(void);
44void exynos4_setup_clocks(void);
45
46#else
47#define exynos4_register_clocks()
48#define exynos4_setup_clocks()
49#endif
50
51#ifdef CONFIG_ARCH_EXYNOS5
52void exynos5_register_clocks(void);
53void exynos5_setup_clocks(void);
54
55#else
56#define exynos5_register_clocks()
57#define exynos5_setup_clocks()
58#endif
59
60#ifdef CONFIG_CPU_EXYNOS4210
61void exynos4210_register_clocks(void);
62
63#else
64#define exynos4210_register_clocks()
65#endif
66
67#ifdef CONFIG_SOC_EXYNOS4212
68void exynos4212_register_clocks(void);
69
70#else
71#define exynos4212_register_clocks()
72#endif
73
74struct device_node;
75void combiner_init(void __iomem *combiner_base, struct device_node *np,
76 unsigned int max_nr, int irq_base);
77
78extern struct smp_operations exynos_smp_ops; 35extern struct smp_operations exynos_smp_ops;
79 36
80extern void exynos_cpu_die(unsigned int cpu); 37extern void exynos_cpu_die(unsigned int cpu);
diff --git a/arch/arm/mach-exynos/cpuidle.c b/arch/arm/mach-exynos/cpuidle.c
index 225ee8431c72..ac139226d63c 100644
--- a/arch/arm/mach-exynos/cpuidle.c
+++ b/arch/arm/mach-exynos/cpuidle.c
@@ -200,6 +200,9 @@ static int __init exynos4_init_cpuidle(void)
200 if (soc_is_exynos5250()) 200 if (soc_is_exynos5250())
201 exynos5_core_down_clk(); 201 exynos5_core_down_clk();
202 202
203 if (soc_is_exynos5440())
204 exynos4_idle_driver.state_count = 1;
205
203 ret = cpuidle_register_driver(&exynos4_idle_driver); 206 ret = cpuidle_register_driver(&exynos4_idle_driver);
204 if (ret) { 207 if (ret) {
205 printk(KERN_ERR "CPUidle failed to register driver\n"); 208 printk(KERN_ERR "CPUidle failed to register driver\n");
diff --git a/arch/arm/mach-footbridge/include/mach/debug-macro.S b/arch/arm/mach-footbridge/include/mach/debug-macro.S
index c169f0c99b2a..02247f313e94 100644
--- a/arch/arm/mach-footbridge/include/mach/debug-macro.S
+++ b/arch/arm/mach-footbridge/include/mach/debug-macro.S
@@ -13,20 +13,6 @@
13 13
14#include <asm/hardware/dec21285.h> 14#include <asm/hardware/dec21285.h>
15 15
16#ifndef CONFIG_DEBUG_DC21285_PORT
17 /* For NetWinder debugging */
18 .macro addruart, rp, rv, tmp
19 mov \rp, #0x000003f8
20 orr \rv, \rp, #0xfe000000 @ virtual
21 orr \rv, \rv, #0x00e00000 @ virtual
22 orr \rp, \rp, #0x7c000000 @ physical
23 .endm
24
25#define UART_SHIFT 0
26#define FLOW_CONTROL
27#include <asm/hardware/debug-8250.S>
28
29#else
30#include <mach/hardware.h> 16#include <mach/hardware.h>
31 /* For EBSA285 debugging */ 17 /* For EBSA285 debugging */
32 .equ dc21285_high, ARMCSR_BASE & 0xff000000 18 .equ dc21285_high, ARMCSR_BASE & 0xff000000
@@ -54,4 +40,3 @@
54 40
55 .macro waituart,rd,rx 41 .macro waituart,rd,rx
56 .endm 42 .endm
57#endif
diff --git a/arch/arm/mach-gemini/include/mach/debug-macro.S b/arch/arm/mach-gemini/include/mach/debug-macro.S
deleted file mode 100644
index 837670763b85..000000000000
--- a/arch/arm/mach-gemini/include/mach/debug-macro.S
+++ /dev/null
@@ -1,21 +0,0 @@
1/*
2 * Debugging macro include header
3 *
4 * Copyright (C) 1994-1999 Russell King
5 * Copyright (C) 2001-2006 Storlink, Corp.
6 * Copyright (C) 2008-2009 Paulius Zaleckas <paulius.zaleckas@teltonika.lt>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12#include <mach/hardware.h>
13
14 .macro addruart, rp, rv, tmp
15 ldr \rp, =GEMINI_UART_BASE @ physical
16 ldr \rv, =IO_ADDRESS(GEMINI_UART_BASE) @ virtual
17 .endm
18
19#define UART_SHIFT 2
20#define FLOW_CONTROL
21#include <asm/hardware/debug-8250.S>
diff --git a/arch/arm/mach-highbank/Kconfig b/arch/arm/mach-highbank/Kconfig
index cd9fcb1cd7ab..8e8437dea3ce 100644
--- a/arch/arm/mach-highbank/Kconfig
+++ b/arch/arm/mach-highbank/Kconfig
@@ -1,9 +1,14 @@
1config ARCH_HIGHBANK 1config ARCH_HIGHBANK
2 bool "Calxeda ECX-1000/2000 (Highbank/Midway)" if ARCH_MULTI_V7 2 bool "Calxeda ECX-1000/2000 (Highbank/Midway)" if ARCH_MULTI_V7
3 select ARCH_DMA_ADDR_T_64BIT if ARM_LPAE
3 select ARCH_HAS_CPUFREQ 4 select ARCH_HAS_CPUFREQ
5 select ARCH_HAS_HOLES_MEMORYMODEL
4 select ARCH_HAS_OPP 6 select ARCH_HAS_OPP
5 select ARCH_WANT_OPTIONAL_GPIOLIB 7 select ARCH_WANT_OPTIONAL_GPIOLIB
6 select ARM_AMBA 8 select ARM_AMBA
9 select ARM_ERRATA_764369
10 select ARM_ERRATA_775420
11 select ARM_ERRATA_798181
7 select ARM_GIC 12 select ARM_GIC
8 select ARM_TIMER_SP804 13 select ARM_TIMER_SP804
9 select CACHE_L2X0 14 select CACHE_L2X0
@@ -12,9 +17,10 @@ config ARCH_HIGHBANK
12 select CPU_V7 17 select CPU_V7
13 select GENERIC_CLOCKEVENTS 18 select GENERIC_CLOCKEVENTS
14 select HAVE_ARM_SCU 19 select HAVE_ARM_SCU
15 select HAVE_ARM_TWD if LOCAL_TIMERS 20 select HAVE_ARM_TWD if SMP
16 select HAVE_SMP 21 select HAVE_SMP
17 select MAILBOX 22 select MAILBOX
18 select PL320_MBOX 23 select PL320_MBOX
19 select SPARSE_IRQ 24 select SPARSE_IRQ
20 select USE_OF 25 select USE_OF
26 select ZONE_DMA if ARM_LPAE
diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c
index 88815795fe26..8e63ccdb0de3 100644
--- a/arch/arm/mach-highbank/highbank.c
+++ b/arch/arm/mach-highbank/highbank.c
@@ -18,14 +18,11 @@
18#include <linux/clocksource.h> 18#include <linux/clocksource.h>
19#include <linux/dma-mapping.h> 19#include <linux/dma-mapping.h>
20#include <linux/io.h> 20#include <linux/io.h>
21#include <linux/irq.h>
22#include <linux/irqchip.h> 21#include <linux/irqchip.h>
23#include <linux/irqdomain.h>
24#include <linux/of.h> 22#include <linux/of.h>
25#include <linux/of_irq.h> 23#include <linux/of_irq.h>
26#include <linux/of_platform.h> 24#include <linux/of_platform.h>
27#include <linux/of_address.h> 25#include <linux/of_address.h>
28#include <linux/smp.h>
29#include <linux/amba/bus.h> 26#include <linux/amba/bus.h>
30#include <linux/clk-provider.h> 27#include <linux/clk-provider.h>
31 28
@@ -35,7 +32,6 @@
35#include <asm/hardware/cache-l2x0.h> 32#include <asm/hardware/cache-l2x0.h>
36#include <asm/mach/arch.h> 33#include <asm/mach/arch.h>
37#include <asm/mach/map.h> 34#include <asm/mach/map.h>
38#include <asm/mach/time.h>
39 35
40#include "core.h" 36#include "core.h"
41#include "sysregs.h" 37#include "sysregs.h"
@@ -65,13 +61,11 @@ void highbank_set_cpu_jump(int cpu, void *jump_addr)
65 HB_JUMP_TABLE_PHYS(cpu) + 15); 61 HB_JUMP_TABLE_PHYS(cpu) + 15);
66} 62}
67 63
68#ifdef CONFIG_CACHE_L2X0
69static void highbank_l2x0_disable(void) 64static void highbank_l2x0_disable(void)
70{ 65{
71 /* Disable PL310 L2 Cache controller */ 66 /* Disable PL310 L2 Cache controller */
72 highbank_smc1(0x102, 0x0); 67 highbank_smc1(0x102, 0x0);
73} 68}
74#endif
75 69
76static void __init highbank_init_irq(void) 70static void __init highbank_init_irq(void)
77{ 71{
@@ -80,12 +74,13 @@ static void __init highbank_init_irq(void)
80 if (of_find_compatible_node(NULL, NULL, "arm,cortex-a9")) 74 if (of_find_compatible_node(NULL, NULL, "arm,cortex-a9"))
81 highbank_scu_map_io(); 75 highbank_scu_map_io();
82 76
83#ifdef CONFIG_CACHE_L2X0
84 /* Enable PL310 L2 Cache controller */ 77 /* Enable PL310 L2 Cache controller */
85 highbank_smc1(0x102, 0x1); 78 if (IS_ENABLED(CONFIG_CACHE_L2X0) &&
86 l2x0_of_init(0, ~0UL); 79 of_find_compatible_node(NULL, NULL, "arm,pl310-cache")) {
87 outer_cache.disable = highbank_l2x0_disable; 80 highbank_smc1(0x102, 0x1);
88#endif 81 l2x0_of_init(0, ~0UL);
82 outer_cache.disable = highbank_l2x0_disable;
83 }
89} 84}
90 85
91static void __init highbank_timer_init(void) 86static void __init highbank_timer_init(void)
@@ -176,6 +171,9 @@ static const char *highbank_match[] __initconst = {
176}; 171};
177 172
178DT_MACHINE_START(HIGHBANK, "Highbank") 173DT_MACHINE_START(HIGHBANK, "Highbank")
174#if defined(CONFIG_ZONE_DMA) && defined(CONFIG_ARM_LPAE)
175 .dma_zone_size = (4ULL * SZ_1G),
176#endif
179 .smp = smp_ops(highbank_smp_ops), 177 .smp = smp_ops(highbank_smp_ops),
180 .init_irq = highbank_init_irq, 178 .init_irq = highbank_init_irq,
181 .init_time = highbank_timer_init, 179 .init_time = highbank_timer_init,
diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
index f54656091a9d..29a8af6922a8 100644
--- a/arch/arm/mach-imx/Kconfig
+++ b/arch/arm/mach-imx/Kconfig
@@ -1,6 +1,7 @@
1config ARCH_MXC 1config ARCH_MXC
2 bool "Freescale i.MX family" if ARCH_MULTI_V4_V5 || ARCH_MULTI_V6_V7 2 bool "Freescale i.MX family" if ARCH_MULTI_V4_V5 || ARCH_MULTI_V6_V7
3 select ARCH_REQUIRE_GPIOLIB 3 select ARCH_REQUIRE_GPIOLIB
4 select ARM_CPU_SUSPEND if PM
4 select ARM_PATCH_PHYS_VIRT 5 select ARM_PATCH_PHYS_VIRT
5 select AUTO_ZRELADDR if !ZBOOT_ROM 6 select AUTO_ZRELADDR if !ZBOOT_ROM
6 select CLKDEV_LOOKUP 7 select CLKDEV_LOOKUP
@@ -8,6 +9,7 @@ config ARCH_MXC
8 select GENERIC_ALLOCATOR 9 select GENERIC_ALLOCATOR
9 select GENERIC_CLOCKEVENTS 10 select GENERIC_CLOCKEVENTS
10 select GENERIC_IRQ_CHIP 11 select GENERIC_IRQ_CHIP
12 select MIGHT_HAVE_CACHE_L2X0 if ARCH_MULTI_V6_V7
11 select MULTI_IRQ_HANDLER 13 select MULTI_IRQ_HANDLER
12 select SPARSE_IRQ 14 select SPARSE_IRQ
13 select USE_OF 15 select USE_OF
@@ -785,7 +787,6 @@ config SOC_IMX6Q
785 bool "i.MX6 Quad/DualLite support" 787 bool "i.MX6 Quad/DualLite support"
786 select ARCH_HAS_CPUFREQ 788 select ARCH_HAS_CPUFREQ
787 select ARCH_HAS_OPP 789 select ARCH_HAS_OPP
788 select ARM_CPU_SUSPEND if PM
789 select ARM_ERRATA_754322 790 select ARM_ERRATA_754322
790 select ARM_ERRATA_764369 if SMP 791 select ARM_ERRATA_764369 if SMP
791 select ARM_ERRATA_775420 792 select ARM_ERRATA_775420
@@ -793,7 +794,7 @@ config SOC_IMX6Q
793 select COMMON_CLK 794 select COMMON_CLK
794 select CPU_V7 795 select CPU_V7
795 select HAVE_ARM_SCU if SMP 796 select HAVE_ARM_SCU if SMP
796 select HAVE_ARM_TWD if LOCAL_TIMERS 797 select HAVE_ARM_TWD if SMP
797 select HAVE_IMX_ANATOP 798 select HAVE_IMX_ANATOP
798 select HAVE_IMX_GPC 799 select HAVE_IMX_GPC
799 select HAVE_IMX_MMDC 800 select HAVE_IMX_MMDC
diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile
index e20f22d58fd8..5383c589ad71 100644
--- a/arch/arm/mach-imx/Makefile
+++ b/arch/arm/mach-imx/Makefile
@@ -15,7 +15,8 @@ imx5-pm-$(CONFIG_PM) += pm-imx5.o
15obj-$(CONFIG_SOC_IMX5) += cpu-imx5.o mm-imx5.o clk-imx51-imx53.o ehci-imx5.o $(imx5-pm-y) 15obj-$(CONFIG_SOC_IMX5) += cpu-imx5.o mm-imx5.o clk-imx51-imx53.o ehci-imx5.o $(imx5-pm-y)
16 16
17obj-$(CONFIG_COMMON_CLK) += clk-pllv1.o clk-pllv2.o clk-pllv3.o clk-gate2.o \ 17obj-$(CONFIG_COMMON_CLK) += clk-pllv1.o clk-pllv2.o clk-pllv3.o clk-gate2.o \
18 clk-pfd.o clk-busy.o clk.o 18 clk-pfd.o clk-busy.o clk.o \
19 clk-fixup-div.o clk-fixup-mux.o
19 20
20obj-$(CONFIG_IMX_HAVE_IOMUX_V1) += iomux-v1.o 21obj-$(CONFIG_IMX_HAVE_IOMUX_V1) += iomux-v1.o
21obj-$(CONFIG_ARCH_MXC_IOMUX_V3) += iomux-v3.o 22obj-$(CONFIG_ARCH_MXC_IOMUX_V3) += iomux-v3.o
diff --git a/arch/arm/mach-imx/anatop.c b/arch/arm/mach-imx/anatop.c
index 0cfa07dd9aa4..ad3b755abb78 100644
--- a/arch/arm/mach-imx/anatop.c
+++ b/arch/arm/mach-imx/anatop.c
@@ -66,7 +66,7 @@ void imx_anatop_post_resume(void)
66 imx_anatop_enable_weak2p5(false); 66 imx_anatop_enable_weak2p5(false);
67} 67}
68 68
69void imx_anatop_usb_chrg_detect_disable(void) 69static void imx_anatop_usb_chrg_detect_disable(void)
70{ 70{
71 regmap_write(anatop, ANADIG_USB1_CHRG_DETECT, 71 regmap_write(anatop, ANADIG_USB1_CHRG_DETECT,
72 BM_ANADIG_USB_CHRG_DETECT_EN_B 72 BM_ANADIG_USB_CHRG_DETECT_EN_B
@@ -100,4 +100,6 @@ void __init imx_anatop_init(void)
100 pr_err("%s: failed to find imx6q-anatop regmap!\n", __func__); 100 pr_err("%s: failed to find imx6q-anatop regmap!\n", __func__);
101 return; 101 return;
102 } 102 }
103
104 imx_anatop_usb_chrg_detect_disable();
103} 105}
diff --git a/arch/arm/mach-imx/clk-fixup-div.c b/arch/arm/mach-imx/clk-fixup-div.c
new file mode 100644
index 000000000000..21db020b1f2d
--- /dev/null
+++ b/arch/arm/mach-imx/clk-fixup-div.c
@@ -0,0 +1,129 @@
1/*
2 * Copyright (C) 2013 Freescale Semiconductor, Inc.
3 *
4 * The code contained herein is licensed under the GNU General Public
5 * License. You may obtain a copy of the GNU General Public License
6 * Version 2 or later at the following locations:
7 *
8 * http://www.opensource.org/licenses/gpl-license.html
9 * http://www.gnu.org/copyleft/gpl.html
10 */
11
12#include <linux/clk-provider.h>
13#include <linux/err.h>
14#include <linux/io.h>
15#include <linux/slab.h>
16#include "clk.h"
17
18#define to_clk_div(_hw) container_of(_hw, struct clk_divider, hw)
19#define div_mask(d) ((1 << (d->width)) - 1)
20
21/**
22 * struct clk_fixup_div - imx integer fixup divider clock
23 * @divider: the parent class
24 * @ops: pointer to clk_ops of parent class
25 * @fixup: a hook to fixup the write value
26 *
27 * The imx fixup divider clock is a subclass of basic clk_divider
28 * with an addtional fixup hook.
29 */
30struct clk_fixup_div {
31 struct clk_divider divider;
32 const struct clk_ops *ops;
33 void (*fixup)(u32 *val);
34};
35
36static inline struct clk_fixup_div *to_clk_fixup_div(struct clk_hw *hw)
37{
38 struct clk_divider *divider = to_clk_div(hw);
39
40 return container_of(divider, struct clk_fixup_div, divider);
41}
42
43static unsigned long clk_fixup_div_recalc_rate(struct clk_hw *hw,
44 unsigned long parent_rate)
45{
46 struct clk_fixup_div *fixup_div = to_clk_fixup_div(hw);
47
48 return fixup_div->ops->recalc_rate(&fixup_div->divider.hw, parent_rate);
49}
50
51static long clk_fixup_div_round_rate(struct clk_hw *hw, unsigned long rate,
52 unsigned long *prate)
53{
54 struct clk_fixup_div *fixup_div = to_clk_fixup_div(hw);
55
56 return fixup_div->ops->round_rate(&fixup_div->divider.hw, rate, prate);
57}
58
59static int clk_fixup_div_set_rate(struct clk_hw *hw, unsigned long rate,
60 unsigned long parent_rate)
61{
62 struct clk_fixup_div *fixup_div = to_clk_fixup_div(hw);
63 struct clk_divider *div = to_clk_div(hw);
64 unsigned int divider, value;
65 unsigned long flags = 0;
66 u32 val;
67
68 divider = parent_rate / rate;
69
70 /* Zero based divider */
71 value = divider - 1;
72
73 if (value > div_mask(div))
74 value = div_mask(div);
75
76 spin_lock_irqsave(div->lock, flags);
77
78 val = readl(div->reg);
79 val &= ~(div_mask(div) << div->shift);
80 val |= value << div->shift;
81 fixup_div->fixup(&val);
82 writel(val, div->reg);
83
84 spin_unlock_irqrestore(div->lock, flags);
85
86 return 0;
87}
88
89static const struct clk_ops clk_fixup_div_ops = {
90 .recalc_rate = clk_fixup_div_recalc_rate,
91 .round_rate = clk_fixup_div_round_rate,
92 .set_rate = clk_fixup_div_set_rate,
93};
94
95struct clk *imx_clk_fixup_divider(const char *name, const char *parent,
96 void __iomem *reg, u8 shift, u8 width,
97 void (*fixup)(u32 *val))
98{
99 struct clk_fixup_div *fixup_div;
100 struct clk *clk;
101 struct clk_init_data init;
102
103 if (!fixup)
104 return ERR_PTR(-EINVAL);
105
106 fixup_div = kzalloc(sizeof(*fixup_div), GFP_KERNEL);
107 if (!fixup_div)
108 return ERR_PTR(-ENOMEM);
109
110 init.name = name;
111 init.ops = &clk_fixup_div_ops;
112 init.flags = CLK_SET_RATE_PARENT;
113 init.parent_names = parent ? &parent : NULL;
114 init.num_parents = parent ? 1 : 0;
115
116 fixup_div->divider.reg = reg;
117 fixup_div->divider.shift = shift;
118 fixup_div->divider.width = width;
119 fixup_div->divider.lock = &imx_ccm_lock;
120 fixup_div->divider.hw.init = &init;
121 fixup_div->ops = &clk_divider_ops;
122 fixup_div->fixup = fixup;
123
124 clk = clk_register(NULL, &fixup_div->divider.hw);
125 if (IS_ERR(clk))
126 kfree(fixup_div);
127
128 return clk;
129}
diff --git a/arch/arm/mach-imx/clk-fixup-mux.c b/arch/arm/mach-imx/clk-fixup-mux.c
new file mode 100644
index 000000000000..0d40b35c557c
--- /dev/null
+++ b/arch/arm/mach-imx/clk-fixup-mux.c
@@ -0,0 +1,108 @@
1/*
2 * Copyright (C) 2013 Freescale Semiconductor, Inc.
3 *
4 * The code contained herein is licensed under the GNU General Public
5 * License. You may obtain a copy of the GNU General Public License
6 * Version 2 or later at the following locations:
7 *
8 * http://www.opensource.org/licenses/gpl-license.html
9 * http://www.gnu.org/copyleft/gpl.html
10 */
11
12#include <linux/clk-provider.h>
13#include <linux/err.h>
14#include <linux/io.h>
15#include <linux/slab.h>
16#include "clk.h"
17
18#define to_clk_mux(_hw) container_of(_hw, struct clk_mux, hw)
19
20/**
21 * struct clk_fixup_mux - imx integer fixup multiplexer clock
22 * @mux: the parent class
23 * @ops: pointer to clk_ops of parent class
24 * @fixup: a hook to fixup the write value
25 *
26 * The imx fixup multiplexer clock is a subclass of basic clk_mux
27 * with an addtional fixup hook.
28 */
29struct clk_fixup_mux {
30 struct clk_mux mux;
31 const struct clk_ops *ops;
32 void (*fixup)(u32 *val);
33};
34
35static inline struct clk_fixup_mux *to_clk_fixup_mux(struct clk_hw *hw)
36{
37 struct clk_mux *mux = to_clk_mux(hw);
38
39 return container_of(mux, struct clk_fixup_mux, mux);
40}
41
42static u8 clk_fixup_mux_get_parent(struct clk_hw *hw)
43{
44 struct clk_fixup_mux *fixup_mux = to_clk_fixup_mux(hw);
45
46 return fixup_mux->ops->get_parent(&fixup_mux->mux.hw);
47}
48
49static int clk_fixup_mux_set_parent(struct clk_hw *hw, u8 index)
50{
51 struct clk_fixup_mux *fixup_mux = to_clk_fixup_mux(hw);
52 struct clk_mux *mux = to_clk_mux(hw);
53 unsigned long flags = 0;
54 u32 val;
55
56 spin_lock_irqsave(mux->lock, flags);
57
58 val = readl(mux->reg);
59 val &= ~(mux->mask << mux->shift);
60 val |= index << mux->shift;
61 fixup_mux->fixup(&val);
62 writel(val, mux->reg);
63
64 spin_unlock_irqrestore(mux->lock, flags);
65
66 return 0;
67}
68
69static const struct clk_ops clk_fixup_mux_ops = {
70 .get_parent = clk_fixup_mux_get_parent,
71 .set_parent = clk_fixup_mux_set_parent,
72};
73
74struct clk *imx_clk_fixup_mux(const char *name, void __iomem *reg,
75 u8 shift, u8 width, const char **parents,
76 int num_parents, void (*fixup)(u32 *val))
77{
78 struct clk_fixup_mux *fixup_mux;
79 struct clk *clk;
80 struct clk_init_data init;
81
82 if (!fixup)
83 return ERR_PTR(-EINVAL);
84
85 fixup_mux = kzalloc(sizeof(*fixup_mux), GFP_KERNEL);
86 if (!fixup_mux)
87 return ERR_PTR(-ENOMEM);
88
89 init.name = name;
90 init.ops = &clk_fixup_mux_ops;
91 init.parent_names = parents;
92 init.num_parents = num_parents;
93 init.flags = 0;
94
95 fixup_mux->mux.reg = reg;
96 fixup_mux->mux.shift = shift;
97 fixup_mux->mux.mask = BIT(width) - 1;
98 fixup_mux->mux.lock = &imx_ccm_lock;
99 fixup_mux->mux.hw.init = &init;
100 fixup_mux->ops = &clk_mux_ops;
101 fixup_mux->fixup = fixup;
102
103 clk = clk_register(NULL, &fixup_mux->mux.hw);
104 if (IS_ERR(clk))
105 kfree(fixup_mux);
106
107 return clk;
108}
diff --git a/arch/arm/mach-imx/clk-imx27.c b/arch/arm/mach-imx/clk-imx27.c
index c3cfa4116dc0..c6b40f386786 100644
--- a/arch/arm/mach-imx/clk-imx27.c
+++ b/arch/arm/mach-imx/clk-imx27.c
@@ -285,7 +285,7 @@ int __init mx27_clocks_init(unsigned long fref)
285 clk_register_clkdev(clk[ata_ahb_gate], "ata", NULL); 285 clk_register_clkdev(clk[ata_ahb_gate], "ata", NULL);
286 clk_register_clkdev(clk[rtc_ipg_gate], NULL, "imx21-rtc"); 286 clk_register_clkdev(clk[rtc_ipg_gate], NULL, "imx21-rtc");
287 clk_register_clkdev(clk[scc_ipg_gate], "scc", NULL); 287 clk_register_clkdev(clk[scc_ipg_gate], "scc", NULL);
288 clk_register_clkdev(clk[cpu_div], NULL, "cpufreq-cpu0.0"); 288 clk_register_clkdev(clk[cpu_div], NULL, "cpu0");
289 clk_register_clkdev(clk[emi_ahb_gate], "emi_ahb" , NULL); 289 clk_register_clkdev(clk[emi_ahb_gate], "emi_ahb" , NULL);
290 290
291 mxc_timer_init(MX27_IO_ADDRESS(MX27_GPT1_BASE_ADDR), MX27_INT_GPT1); 291 mxc_timer_init(MX27_IO_ADDRESS(MX27_GPT1_BASE_ADDR), MX27_INT_GPT1);
diff --git a/arch/arm/mach-imx/clk-imx51-imx53.c b/arch/arm/mach-imx/clk-imx51-imx53.c
index 9afac26fa1cc..7c0dc4540aa4 100644
--- a/arch/arm/mach-imx/clk-imx51-imx53.c
+++ b/arch/arm/mach-imx/clk-imx51-imx53.c
@@ -119,7 +119,7 @@ enum imx5_clks {
119 srtc_gate, pata_gate, sata_gate, spdif_xtal_sel, spdif0_sel, 119 srtc_gate, pata_gate, sata_gate, spdif_xtal_sel, spdif0_sel,
120 spdif1_sel, spdif0_pred, spdif0_podf, spdif1_pred, spdif1_podf, 120 spdif1_sel, spdif0_pred, spdif0_podf, spdif1_pred, spdif1_podf,
121 spdif0_com_s, spdif1_com_sel, spdif0_gate, spdif1_gate, spdif_ipg_gate, 121 spdif0_com_s, spdif1_com_sel, spdif0_gate, spdif1_gate, spdif_ipg_gate,
122 clk_max 122 ocram, clk_max
123}; 123};
124 124
125static struct clk *clk[clk_max]; 125static struct clk *clk[clk_max];
@@ -328,7 +328,7 @@ static void __init mx5_clocks_common_init(unsigned long rate_ckil,
328 clk_register_clkdev(clk[ssi2_ipg_gate], NULL, "imx-ssi.1"); 328 clk_register_clkdev(clk[ssi2_ipg_gate], NULL, "imx-ssi.1");
329 clk_register_clkdev(clk[ssi3_ipg_gate], NULL, "imx-ssi.2"); 329 clk_register_clkdev(clk[ssi3_ipg_gate], NULL, "imx-ssi.2");
330 clk_register_clkdev(clk[sdma_gate], NULL, "imx35-sdma"); 330 clk_register_clkdev(clk[sdma_gate], NULL, "imx35-sdma");
331 clk_register_clkdev(clk[cpu_podf], NULL, "cpufreq-cpu0.0"); 331 clk_register_clkdev(clk[cpu_podf], NULL, "cpu0");
332 clk_register_clkdev(clk[iim_gate], "iim", NULL); 332 clk_register_clkdev(clk[iim_gate], "iim", NULL);
333 clk_register_clkdev(clk[dummy], NULL, "imx2-wdt.0"); 333 clk_register_clkdev(clk[dummy], NULL, "imx2-wdt.0");
334 clk_register_clkdev(clk[dummy], NULL, "imx2-wdt.1"); 334 clk_register_clkdev(clk[dummy], NULL, "imx2-wdt.1");
@@ -397,7 +397,7 @@ int __init mx51_clocks_init(unsigned long rate_ckil, unsigned long rate_osc,
397 mx51_spdif_xtal_sel, ARRAY_SIZE(mx51_spdif_xtal_sel)); 397 mx51_spdif_xtal_sel, ARRAY_SIZE(mx51_spdif_xtal_sel));
398 clk[spdif1_sel] = imx_clk_mux("spdif1_sel", MXC_CCM_CSCMR2, 2, 2, 398 clk[spdif1_sel] = imx_clk_mux("spdif1_sel", MXC_CCM_CSCMR2, 2, 2,
399 spdif_sel, ARRAY_SIZE(spdif_sel)); 399 spdif_sel, ARRAY_SIZE(spdif_sel));
400 clk[spdif1_pred] = imx_clk_divider("spdif1_podf", "spdif1_sel", MXC_CCM_CDCDR, 16, 3); 400 clk[spdif1_pred] = imx_clk_divider("spdif1_pred", "spdif1_sel", MXC_CCM_CDCDR, 16, 3);
401 clk[spdif1_podf] = imx_clk_divider("spdif1_podf", "spdif1_pred", MXC_CCM_CDCDR, 9, 6); 401 clk[spdif1_podf] = imx_clk_divider("spdif1_podf", "spdif1_pred", MXC_CCM_CDCDR, 9, 6);
402 clk[spdif1_com_sel] = imx_clk_mux("spdif1_com_sel", MXC_CCM_CSCMR2, 5, 1, 402 clk[spdif1_com_sel] = imx_clk_mux("spdif1_com_sel", MXC_CCM_CSCMR2, 5, 1,
403 mx51_spdif1_com_sel, ARRAY_SIZE(mx51_spdif1_com_sel)); 403 mx51_spdif1_com_sel, ARRAY_SIZE(mx51_spdif1_com_sel));
@@ -506,6 +506,7 @@ int __init mx53_clocks_init(unsigned long rate_ckil, unsigned long rate_osc,
506 mx53_can_sel, ARRAY_SIZE(mx53_can_sel)); 506 mx53_can_sel, ARRAY_SIZE(mx53_can_sel));
507 clk[can1_serial_gate] = imx_clk_gate2("can1_serial_gate", "can_sel", MXC_CCM_CCGR6, 22); 507 clk[can1_serial_gate] = imx_clk_gate2("can1_serial_gate", "can_sel", MXC_CCM_CCGR6, 22);
508 clk[can1_ipg_gate] = imx_clk_gate2("can1_ipg_gate", "ipg", MXC_CCM_CCGR6, 20); 508 clk[can1_ipg_gate] = imx_clk_gate2("can1_ipg_gate", "ipg", MXC_CCM_CCGR6, 20);
509 clk[ocram] = imx_clk_gate2("ocram", "ahb", MXC_CCM_CCGR6, 2);
509 clk[can2_serial_gate] = imx_clk_gate2("can2_serial_gate", "can_sel", MXC_CCM_CCGR4, 8); 510 clk[can2_serial_gate] = imx_clk_gate2("can2_serial_gate", "can_sel", MXC_CCM_CCGR4, 8);
510 clk[can2_ipg_gate] = imx_clk_gate2("can2_ipg_gate", "ipg", MXC_CCM_CCGR4, 6); 511 clk[can2_ipg_gate] = imx_clk_gate2("can2_ipg_gate", "ipg", MXC_CCM_CCGR4, 6);
511 clk[i2c3_gate] = imx_clk_gate2("i2c3_gate", "per_root", MXC_CCM_CCGR1, 22); 512 clk[i2c3_gate] = imx_clk_gate2("i2c3_gate", "per_root", MXC_CCM_CCGR1, 22);
diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c
index 86567d980b07..9181a241d3a8 100644
--- a/arch/arm/mach-imx/clk-imx6q.c
+++ b/arch/arm/mach-imx/clk-imx6q.c
@@ -206,6 +206,17 @@ static const char *vpu_axi_sels[] = { "axi", "pll2_pfd2_396m", "pll2_pfd0_352m",
206static const char *cko1_sels[] = { "pll3_usb_otg", "pll2_bus", "pll1_sys", "pll5_video_div", 206static const char *cko1_sels[] = { "pll3_usb_otg", "pll2_bus", "pll1_sys", "pll5_video_div",
207 "dummy", "axi", "enfc", "ipu1_di0", "ipu1_di1", "ipu2_di0", 207 "dummy", "axi", "enfc", "ipu1_di0", "ipu1_di1", "ipu2_di0",
208 "ipu2_di1", "ahb", "ipg", "ipg_per", "ckil", "pll4_post_div", }; 208 "ipu2_di1", "ahb", "ipg", "ipg_per", "ckil", "pll4_post_div", };
209static const char *cko2_sels[] = {
210 "mmdc_ch0_axi", "mmdc_ch1_axi", "usdhc4", "usdhc1",
211 "gpu2d_axi", "dummy", "ecspi_root", "gpu3d_axi",
212 "usdhc3", "dummy", "arm", "ipu1",
213 "ipu2", "vdo_axi", "osc", "gpu2d_core",
214 "gpu3d_core", "usdhc2", "ssi1", "ssi2",
215 "ssi3", "gpu3d_shader", "vpu_axi", "can_root",
216 "ldb_di0", "ldb_di1", "esai", "eim_slow",
217 "uart_serial", "spdif", "asrc", "hsi_tx",
218};
219static const char *cko_sels[] = { "cko1", "cko2", };
209 220
210enum mx6q_clks { 221enum mx6q_clks {
211 dummy, ckil, ckih, osc, pll2_pfd0_352m, pll2_pfd1_594m, pll2_pfd2_396m, 222 dummy, ckil, ckih, osc, pll2_pfd0_352m, pll2_pfd1_594m, pll2_pfd2_396m,
@@ -239,7 +250,8 @@ enum mx6q_clks {
239 pll4_audio, pll5_video, pll8_mlb, pll7_usb_host, pll6_enet, ssi1_ipg, 250 pll4_audio, pll5_video, pll8_mlb, pll7_usb_host, pll6_enet, ssi1_ipg,
240 ssi2_ipg, ssi3_ipg, rom, usbphy1, usbphy2, ldb_di0_div_3_5, ldb_di1_div_3_5, 251 ssi2_ipg, ssi3_ipg, rom, usbphy1, usbphy2, ldb_di0_div_3_5, ldb_di1_div_3_5,
241 sata_ref, sata_ref_100m, pcie_ref, pcie_ref_125m, enet_ref, usbphy1_gate, 252 sata_ref, sata_ref_100m, pcie_ref, pcie_ref_125m, enet_ref, usbphy1_gate,
242 usbphy2_gate, pll4_post_div, pll5_post_div, pll5_video_div, eim_slow, clk_max 253 usbphy2_gate, pll4_post_div, pll5_post_div, pll5_video_div, eim_slow,
254 spdif, cko2_sel, cko2_podf, cko2, cko, vdoa, clk_max
243}; 255};
244 256
245static struct clk *clk[clk_max]; 257static struct clk *clk[clk_max];
@@ -276,6 +288,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
276 struct device_node *np; 288 struct device_node *np;
277 void __iomem *base; 289 void __iomem *base;
278 int i, irq; 290 int i, irq;
291 int ret;
279 292
280 clk[dummy] = imx_clk_fixed("dummy", 0); 293 clk[dummy] = imx_clk_fixed("dummy", 0);
281 clk[ckil] = imx_obtain_fixed_clock("ckil", 0); 294 clk[ckil] = imx_obtain_fixed_clock("ckil", 0);
@@ -384,19 +397,21 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
384 clk[ipu2_di1_sel] = imx_clk_mux("ipu2_di1_sel", base + 0x38, 9, 3, ipu2_di1_sels, ARRAY_SIZE(ipu2_di1_sels)); 397 clk[ipu2_di1_sel] = imx_clk_mux("ipu2_di1_sel", base + 0x38, 9, 3, ipu2_di1_sels, ARRAY_SIZE(ipu2_di1_sels));
385 clk[hsi_tx_sel] = imx_clk_mux("hsi_tx_sel", base + 0x30, 28, 1, hsi_tx_sels, ARRAY_SIZE(hsi_tx_sels)); 398 clk[hsi_tx_sel] = imx_clk_mux("hsi_tx_sel", base + 0x30, 28, 1, hsi_tx_sels, ARRAY_SIZE(hsi_tx_sels));
386 clk[pcie_axi_sel] = imx_clk_mux("pcie_axi_sel", base + 0x18, 10, 1, pcie_axi_sels, ARRAY_SIZE(pcie_axi_sels)); 399 clk[pcie_axi_sel] = imx_clk_mux("pcie_axi_sel", base + 0x18, 10, 1, pcie_axi_sels, ARRAY_SIZE(pcie_axi_sels));
387 clk[ssi1_sel] = imx_clk_mux("ssi1_sel", base + 0x1c, 10, 2, ssi_sels, ARRAY_SIZE(ssi_sels)); 400 clk[ssi1_sel] = imx_clk_fixup_mux("ssi1_sel", base + 0x1c, 10, 2, ssi_sels, ARRAY_SIZE(ssi_sels), imx_cscmr1_fixup);
388 clk[ssi2_sel] = imx_clk_mux("ssi2_sel", base + 0x1c, 12, 2, ssi_sels, ARRAY_SIZE(ssi_sels)); 401 clk[ssi2_sel] = imx_clk_fixup_mux("ssi2_sel", base + 0x1c, 12, 2, ssi_sels, ARRAY_SIZE(ssi_sels), imx_cscmr1_fixup);
389 clk[ssi3_sel] = imx_clk_mux("ssi3_sel", base + 0x1c, 14, 2, ssi_sels, ARRAY_SIZE(ssi_sels)); 402 clk[ssi3_sel] = imx_clk_fixup_mux("ssi3_sel", base + 0x1c, 14, 2, ssi_sels, ARRAY_SIZE(ssi_sels), imx_cscmr1_fixup);
390 clk[usdhc1_sel] = imx_clk_mux("usdhc1_sel", base + 0x1c, 16, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels)); 403 clk[usdhc1_sel] = imx_clk_fixup_mux("usdhc1_sel", base + 0x1c, 16, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels), imx_cscmr1_fixup);
391 clk[usdhc2_sel] = imx_clk_mux("usdhc2_sel", base + 0x1c, 17, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels)); 404 clk[usdhc2_sel] = imx_clk_fixup_mux("usdhc2_sel", base + 0x1c, 17, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels), imx_cscmr1_fixup);
392 clk[usdhc3_sel] = imx_clk_mux("usdhc3_sel", base + 0x1c, 18, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels)); 405 clk[usdhc3_sel] = imx_clk_fixup_mux("usdhc3_sel", base + 0x1c, 18, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels), imx_cscmr1_fixup);
393 clk[usdhc4_sel] = imx_clk_mux("usdhc4_sel", base + 0x1c, 19, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels)); 406 clk[usdhc4_sel] = imx_clk_fixup_mux("usdhc4_sel", base + 0x1c, 19, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels), imx_cscmr1_fixup);
394 clk[enfc_sel] = imx_clk_mux("enfc_sel", base + 0x2c, 16, 2, enfc_sels, ARRAY_SIZE(enfc_sels)); 407 clk[enfc_sel] = imx_clk_mux("enfc_sel", base + 0x2c, 16, 2, enfc_sels, ARRAY_SIZE(enfc_sels));
395 clk[emi_sel] = imx_clk_mux("emi_sel", base + 0x1c, 27, 2, emi_sels, ARRAY_SIZE(emi_sels)); 408 clk[emi_sel] = imx_clk_fixup_mux("emi_sel", base + 0x1c, 27, 2, emi_sels, ARRAY_SIZE(emi_sels), imx_cscmr1_fixup);
396 clk[emi_slow_sel] = imx_clk_mux("emi_slow_sel", base + 0x1c, 29, 2, emi_slow_sels, ARRAY_SIZE(emi_slow_sels)); 409 clk[emi_slow_sel] = imx_clk_fixup_mux("emi_slow_sel", base + 0x1c, 29, 2, emi_slow_sels, ARRAY_SIZE(emi_slow_sels), imx_cscmr1_fixup);
397 clk[vdo_axi_sel] = imx_clk_mux("vdo_axi_sel", base + 0x18, 11, 1, vdo_axi_sels, ARRAY_SIZE(vdo_axi_sels)); 410 clk[vdo_axi_sel] = imx_clk_mux("vdo_axi_sel", base + 0x18, 11, 1, vdo_axi_sels, ARRAY_SIZE(vdo_axi_sels));
398 clk[vpu_axi_sel] = imx_clk_mux("vpu_axi_sel", base + 0x18, 14, 2, vpu_axi_sels, ARRAY_SIZE(vpu_axi_sels)); 411 clk[vpu_axi_sel] = imx_clk_mux("vpu_axi_sel", base + 0x18, 14, 2, vpu_axi_sels, ARRAY_SIZE(vpu_axi_sels));
399 clk[cko1_sel] = imx_clk_mux("cko1_sel", base + 0x60, 0, 4, cko1_sels, ARRAY_SIZE(cko1_sels)); 412 clk[cko1_sel] = imx_clk_mux("cko1_sel", base + 0x60, 0, 4, cko1_sels, ARRAY_SIZE(cko1_sels));
413 clk[cko2_sel] = imx_clk_mux("cko2_sel", base + 0x60, 16, 5, cko2_sels, ARRAY_SIZE(cko2_sels));
414 clk[cko] = imx_clk_mux("cko", base + 0x60, 8, 1, cko_sels, ARRAY_SIZE(cko_sels));
400 415
401 /* name reg shift width busy: reg, shift parent_names num_parents */ 416 /* name reg shift width busy: reg, shift parent_names num_parents */
402 clk[periph] = imx_clk_busy_mux("periph", base + 0x14, 25, 1, base + 0x48, 5, periph_sels, ARRAY_SIZE(periph_sels)); 417 clk[periph] = imx_clk_busy_mux("periph", base + 0x14, 25, 1, base + 0x48, 5, periph_sels, ARRAY_SIZE(periph_sels));
@@ -406,7 +421,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
406 clk[periph_clk2] = imx_clk_divider("periph_clk2", "periph_clk2_sel", base + 0x14, 27, 3); 421 clk[periph_clk2] = imx_clk_divider("periph_clk2", "periph_clk2_sel", base + 0x14, 27, 3);
407 clk[periph2_clk2] = imx_clk_divider("periph2_clk2", "periph2_clk2_sel", base + 0x14, 0, 3); 422 clk[periph2_clk2] = imx_clk_divider("periph2_clk2", "periph2_clk2_sel", base + 0x14, 0, 3);
408 clk[ipg] = imx_clk_divider("ipg", "ahb", base + 0x14, 8, 2); 423 clk[ipg] = imx_clk_divider("ipg", "ahb", base + 0x14, 8, 2);
409 clk[ipg_per] = imx_clk_divider("ipg_per", "ipg", base + 0x1c, 0, 6); 424 clk[ipg_per] = imx_clk_fixup_divider("ipg_per", "ipg", base + 0x1c, 0, 6, imx_cscmr1_fixup);
410 clk[esai_pred] = imx_clk_divider("esai_pred", "esai_sel", base + 0x28, 9, 3); 425 clk[esai_pred] = imx_clk_divider("esai_pred", "esai_sel", base + 0x28, 9, 3);
411 clk[esai_podf] = imx_clk_divider("esai_podf", "esai_pred", base + 0x28, 25, 3); 426 clk[esai_podf] = imx_clk_divider("esai_podf", "esai_pred", base + 0x28, 25, 3);
412 clk[asrc_pred] = imx_clk_divider("asrc_pred", "asrc_sel", base + 0x30, 12, 3); 427 clk[asrc_pred] = imx_clk_divider("asrc_pred", "asrc_sel", base + 0x30, 12, 3);
@@ -442,10 +457,11 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
442 clk[usdhc4_podf] = imx_clk_divider("usdhc4_podf", "usdhc4_sel", base + 0x24, 22, 3); 457 clk[usdhc4_podf] = imx_clk_divider("usdhc4_podf", "usdhc4_sel", base + 0x24, 22, 3);
443 clk[enfc_pred] = imx_clk_divider("enfc_pred", "enfc_sel", base + 0x2c, 18, 3); 458 clk[enfc_pred] = imx_clk_divider("enfc_pred", "enfc_sel", base + 0x2c, 18, 3);
444 clk[enfc_podf] = imx_clk_divider("enfc_podf", "enfc_pred", base + 0x2c, 21, 6); 459 clk[enfc_podf] = imx_clk_divider("enfc_podf", "enfc_pred", base + 0x2c, 21, 6);
445 clk[emi_podf] = imx_clk_divider("emi_podf", "emi_sel", base + 0x1c, 20, 3); 460 clk[emi_podf] = imx_clk_fixup_divider("emi_podf", "emi_sel", base + 0x1c, 20, 3, imx_cscmr1_fixup);
446 clk[emi_slow_podf] = imx_clk_divider("emi_slow_podf", "emi_slow_sel", base + 0x1c, 23, 3); 461 clk[emi_slow_podf] = imx_clk_fixup_divider("emi_slow_podf", "emi_slow_sel", base + 0x1c, 23, 3, imx_cscmr1_fixup);
447 clk[vpu_axi_podf] = imx_clk_divider("vpu_axi_podf", "vpu_axi_sel", base + 0x24, 25, 3); 462 clk[vpu_axi_podf] = imx_clk_divider("vpu_axi_podf", "vpu_axi_sel", base + 0x24, 25, 3);
448 clk[cko1_podf] = imx_clk_divider("cko1_podf", "cko1_sel", base + 0x60, 4, 3); 463 clk[cko1_podf] = imx_clk_divider("cko1_podf", "cko1_sel", base + 0x60, 4, 3);
464 clk[cko2_podf] = imx_clk_divider("cko2_podf", "cko2_sel", base + 0x60, 21, 3);
449 465
450 /* name parent_name reg shift width busy: reg, shift */ 466 /* name parent_name reg shift width busy: reg, shift */
451 clk[axi] = imx_clk_busy_divider("axi", "axi_sel", base + 0x14, 16, 3, base + 0x48, 0); 467 clk[axi] = imx_clk_busy_divider("axi", "axi_sel", base + 0x14, 16, 3, base + 0x48, 0);
@@ -486,6 +502,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
486 clk[i2c3] = imx_clk_gate2("i2c3", "ipg_per", base + 0x70, 10); 502 clk[i2c3] = imx_clk_gate2("i2c3", "ipg_per", base + 0x70, 10);
487 clk[iim] = imx_clk_gate2("iim", "ipg", base + 0x70, 12); 503 clk[iim] = imx_clk_gate2("iim", "ipg", base + 0x70, 12);
488 clk[enfc] = imx_clk_gate2("enfc", "enfc_podf", base + 0x70, 14); 504 clk[enfc] = imx_clk_gate2("enfc", "enfc_podf", base + 0x70, 14);
505 clk[vdoa] = imx_clk_gate2("vdoa", "vdo_axi", base + 0x70, 26);
489 clk[ipu1] = imx_clk_gate2("ipu1", "ipu1_podf", base + 0x74, 0); 506 clk[ipu1] = imx_clk_gate2("ipu1", "ipu1_podf", base + 0x74, 0);
490 clk[ipu1_di0] = imx_clk_gate2("ipu1_di0", "ipu1_di0_sel", base + 0x74, 2); 507 clk[ipu1_di0] = imx_clk_gate2("ipu1_di0", "ipu1_di0_sel", base + 0x74, 2);
491 clk[ipu1_di1] = imx_clk_gate2("ipu1_di1", "ipu1_di1_sel", base + 0x74, 4); 508 clk[ipu1_di1] = imx_clk_gate2("ipu1_di1", "ipu1_di1_sel", base + 0x74, 4);
@@ -521,6 +538,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
521 clk[sata] = imx_clk_gate2("sata", "ipg", base + 0x7c, 4); 538 clk[sata] = imx_clk_gate2("sata", "ipg", base + 0x7c, 4);
522 clk[sdma] = imx_clk_gate2("sdma", "ahb", base + 0x7c, 6); 539 clk[sdma] = imx_clk_gate2("sdma", "ahb", base + 0x7c, 6);
523 clk[spba] = imx_clk_gate2("spba", "ipg", base + 0x7c, 12); 540 clk[spba] = imx_clk_gate2("spba", "ipg", base + 0x7c, 12);
541 clk[spdif] = imx_clk_gate2("spdif", "spdif_podf", base + 0x7c, 14);
524 clk[ssi1_ipg] = imx_clk_gate2("ssi1_ipg", "ipg", base + 0x7c, 18); 542 clk[ssi1_ipg] = imx_clk_gate2("ssi1_ipg", "ipg", base + 0x7c, 18);
525 clk[ssi2_ipg] = imx_clk_gate2("ssi2_ipg", "ipg", base + 0x7c, 20); 543 clk[ssi2_ipg] = imx_clk_gate2("ssi2_ipg", "ipg", base + 0x7c, 20);
526 clk[ssi3_ipg] = imx_clk_gate2("ssi3_ipg", "ipg", base + 0x7c, 22); 544 clk[ssi3_ipg] = imx_clk_gate2("ssi3_ipg", "ipg", base + 0x7c, 22);
@@ -535,6 +553,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
535 clk[vdo_axi] = imx_clk_gate2("vdo_axi", "vdo_axi_sel", base + 0x80, 12); 553 clk[vdo_axi] = imx_clk_gate2("vdo_axi", "vdo_axi_sel", base + 0x80, 12);
536 clk[vpu_axi] = imx_clk_gate2("vpu_axi", "vpu_axi_podf", base + 0x80, 14); 554 clk[vpu_axi] = imx_clk_gate2("vpu_axi", "vpu_axi_podf", base + 0x80, 14);
537 clk[cko1] = imx_clk_gate("cko1", "cko1_podf", base + 0x60, 7); 555 clk[cko1] = imx_clk_gate("cko1", "cko1_podf", base + 0x60, 7);
556 clk[cko2] = imx_clk_gate("cko2", "cko2_podf", base + 0x60, 24);
538 557
539 for (i = 0; i < ARRAY_SIZE(clk); i++) 558 for (i = 0; i < ARRAY_SIZE(clk); i++)
540 if (IS_ERR(clk[i])) 559 if (IS_ERR(clk[i]))
@@ -554,7 +573,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
554 clk_register_clkdev(clk[pll4_post_div], "pll4_post_div", NULL); 573 clk_register_clkdev(clk[pll4_post_div], "pll4_post_div", NULL);
555 clk_register_clkdev(clk[pll4_audio], "pll4_audio", NULL); 574 clk_register_clkdev(clk[pll4_audio], "pll4_audio", NULL);
556 575
557 if (imx6q_revision() != IMX_CHIP_REVISION_1_0) { 576 if ((imx6q_revision() != IMX_CHIP_REVISION_1_0) || cpu_is_imx6dl()) {
558 clk_set_parent(clk[ldb_di0_sel], clk[pll5_video_div]); 577 clk_set_parent(clk[ldb_di0_sel], clk[pll5_video_div]);
559 clk_set_parent(clk[ldb_di1_sel], clk[pll5_video_div]); 578 clk_set_parent(clk[ldb_di1_sel], clk[pll5_video_div]);
560 } 579 }
@@ -574,6 +593,16 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
574 clk_prepare_enable(clk[usbphy2_gate]); 593 clk_prepare_enable(clk[usbphy2_gate]);
575 } 594 }
576 595
596 /*
597 * Let's initially set up CLKO with OSC24M, since this configuration
598 * is widely used by imx6q board designs to clock audio codec.
599 */
600 ret = clk_set_parent(clk[cko2_sel], clk[osc]);
601 if (!ret)
602 ret = clk_set_parent(clk[cko], clk[cko2]);
603 if (ret)
604 pr_warn("failed to set up CLKO: %d\n", ret);
605
577 /* Set initial power mode */ 606 /* Set initial power mode */
578 imx6q_set_lpm(WAIT_CLOCKED); 607 imx6q_set_lpm(WAIT_CLOCKED);
579 608
diff --git a/arch/arm/mach-imx/clk-imx6sl.c b/arch/arm/mach-imx/clk-imx6sl.c
index a307ac22dffe..a5c3c5d21aee 100644
--- a/arch/arm/mach-imx/clk-imx6sl.c
+++ b/arch/arm/mach-imx/clk-imx6sl.c
@@ -138,14 +138,14 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node)
138 clks[IMX6SL_CLK_PERIPH_CLK2_SEL] = imx_clk_mux("periph_clk2_sel", base + 0x18, 12, 2, periph_clk2_sels, ARRAY_SIZE(periph_clk2_sels)); 138 clks[IMX6SL_CLK_PERIPH_CLK2_SEL] = imx_clk_mux("periph_clk2_sel", base + 0x18, 12, 2, periph_clk2_sels, ARRAY_SIZE(periph_clk2_sels));
139 clks[IMX6SL_CLK_CSI_SEL] = imx_clk_mux("csi_sel", base + 0x3c, 9, 2, csi_lcdif_sels, ARRAY_SIZE(csi_lcdif_sels)); 139 clks[IMX6SL_CLK_CSI_SEL] = imx_clk_mux("csi_sel", base + 0x3c, 9, 2, csi_lcdif_sels, ARRAY_SIZE(csi_lcdif_sels));
140 clks[IMX6SL_CLK_LCDIF_AXI_SEL] = imx_clk_mux("lcdif_axi_sel", base + 0x3c, 14, 2, csi_lcdif_sels, ARRAY_SIZE(csi_lcdif_sels)); 140 clks[IMX6SL_CLK_LCDIF_AXI_SEL] = imx_clk_mux("lcdif_axi_sel", base + 0x3c, 14, 2, csi_lcdif_sels, ARRAY_SIZE(csi_lcdif_sels));
141 clks[IMX6SL_CLK_USDHC1_SEL] = imx_clk_mux("usdhc1_sel", base + 0x1c, 16, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels)); 141 clks[IMX6SL_CLK_USDHC1_SEL] = imx_clk_fixup_mux("usdhc1_sel", base + 0x1c, 16, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels), imx_cscmr1_fixup);
142 clks[IMX6SL_CLK_USDHC2_SEL] = imx_clk_mux("usdhc2_sel", base + 0x1c, 17, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels)); 142 clks[IMX6SL_CLK_USDHC2_SEL] = imx_clk_fixup_mux("usdhc2_sel", base + 0x1c, 17, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels), imx_cscmr1_fixup);
143 clks[IMX6SL_CLK_USDHC3_SEL] = imx_clk_mux("usdhc3_sel", base + 0x1c, 18, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels)); 143 clks[IMX6SL_CLK_USDHC3_SEL] = imx_clk_fixup_mux("usdhc3_sel", base + 0x1c, 18, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels), imx_cscmr1_fixup);
144 clks[IMX6SL_CLK_USDHC4_SEL] = imx_clk_mux("usdhc4_sel", base + 0x1c, 19, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels)); 144 clks[IMX6SL_CLK_USDHC4_SEL] = imx_clk_fixup_mux("usdhc4_sel", base + 0x1c, 19, 1, usdhc_sels, ARRAY_SIZE(usdhc_sels), imx_cscmr1_fixup);
145 clks[IMX6SL_CLK_SSI1_SEL] = imx_clk_mux("ssi1_sel", base + 0x1c, 10, 2, ssi_sels, ARRAY_SIZE(ssi_sels)); 145 clks[IMX6SL_CLK_SSI1_SEL] = imx_clk_fixup_mux("ssi1_sel", base + 0x1c, 10, 2, ssi_sels, ARRAY_SIZE(ssi_sels), imx_cscmr1_fixup);
146 clks[IMX6SL_CLK_SSI2_SEL] = imx_clk_mux("ssi2_sel", base + 0x1c, 12, 2, ssi_sels, ARRAY_SIZE(ssi_sels)); 146 clks[IMX6SL_CLK_SSI2_SEL] = imx_clk_fixup_mux("ssi2_sel", base + 0x1c, 12, 2, ssi_sels, ARRAY_SIZE(ssi_sels), imx_cscmr1_fixup);
147 clks[IMX6SL_CLK_SSI3_SEL] = imx_clk_mux("ssi3_sel", base + 0x1c, 14, 2, ssi_sels, ARRAY_SIZE(ssi_sels)); 147 clks[IMX6SL_CLK_SSI3_SEL] = imx_clk_fixup_mux("ssi3_sel", base + 0x1c, 14, 2, ssi_sels, ARRAY_SIZE(ssi_sels), imx_cscmr1_fixup);
148 clks[IMX6SL_CLK_PERCLK_SEL] = imx_clk_mux("perclk_sel", base + 0x1c, 6, 1, perclk_sels, ARRAY_SIZE(perclk_sels)); 148 clks[IMX6SL_CLK_PERCLK_SEL] = imx_clk_fixup_mux("perclk_sel", base + 0x1c, 6, 1, perclk_sels, ARRAY_SIZE(perclk_sels), imx_cscmr1_fixup);
149 clks[IMX6SL_CLK_PXP_AXI_SEL] = imx_clk_mux("pxp_axi_sel", base + 0x34, 6, 3, epdc_pxp_sels, ARRAY_SIZE(epdc_pxp_sels)); 149 clks[IMX6SL_CLK_PXP_AXI_SEL] = imx_clk_mux("pxp_axi_sel", base + 0x34, 6, 3, epdc_pxp_sels, ARRAY_SIZE(epdc_pxp_sels));
150 clks[IMX6SL_CLK_EPDC_AXI_SEL] = imx_clk_mux("epdc_axi_sel", base + 0x34, 15, 3, epdc_pxp_sels, ARRAY_SIZE(epdc_pxp_sels)); 150 clks[IMX6SL_CLK_EPDC_AXI_SEL] = imx_clk_mux("epdc_axi_sel", base + 0x34, 15, 3, epdc_pxp_sels, ARRAY_SIZE(epdc_pxp_sels));
151 clks[IMX6SL_CLK_GPU2D_OVG_SEL] = imx_clk_mux("gpu2d_ovg_sel", base + 0x18, 4, 2, gpu2d_ovg_sels, ARRAY_SIZE(gpu2d_ovg_sels)); 151 clks[IMX6SL_CLK_GPU2D_OVG_SEL] = imx_clk_mux("gpu2d_ovg_sel", base + 0x18, 4, 2, gpu2d_ovg_sels, ARRAY_SIZE(gpu2d_ovg_sels));
@@ -179,14 +179,14 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node)
179 clks[IMX6SL_CLK_SSI2_PODF] = imx_clk_divider("ssi2_podf", "ssi2_pred", base + 0x2c, 0, 6); 179 clks[IMX6SL_CLK_SSI2_PODF] = imx_clk_divider("ssi2_podf", "ssi2_pred", base + 0x2c, 0, 6);
180 clks[IMX6SL_CLK_SSI3_PRED] = imx_clk_divider("ssi3_pred", "ssi3_sel", base + 0x28, 22, 3); 180 clks[IMX6SL_CLK_SSI3_PRED] = imx_clk_divider("ssi3_pred", "ssi3_sel", base + 0x28, 22, 3);
181 clks[IMX6SL_CLK_SSI3_PODF] = imx_clk_divider("ssi3_podf", "ssi3_pred", base + 0x28, 16, 6); 181 clks[IMX6SL_CLK_SSI3_PODF] = imx_clk_divider("ssi3_podf", "ssi3_pred", base + 0x28, 16, 6);
182 clks[IMX6SL_CLK_PERCLK] = imx_clk_divider("perclk", "perclk_sel", base + 0x1c, 0, 6); 182 clks[IMX6SL_CLK_PERCLK] = imx_clk_fixup_divider("perclk", "perclk_sel", base + 0x1c, 0, 6, imx_cscmr1_fixup);
183 clks[IMX6SL_CLK_PXP_AXI_PODF] = imx_clk_divider("pxp_axi_podf", "pxp_axi_sel", base + 0x34, 3, 3); 183 clks[IMX6SL_CLK_PXP_AXI_PODF] = imx_clk_divider("pxp_axi_podf", "pxp_axi_sel", base + 0x34, 3, 3);
184 clks[IMX6SL_CLK_EPDC_AXI_PODF] = imx_clk_divider("epdc_axi_podf", "epdc_axi_sel", base + 0x34, 12, 3); 184 clks[IMX6SL_CLK_EPDC_AXI_PODF] = imx_clk_divider("epdc_axi_podf", "epdc_axi_sel", base + 0x34, 12, 3);
185 clks[IMX6SL_CLK_GPU2D_OVG_PODF] = imx_clk_divider("gpu2d_ovg_podf", "gpu2d_ovg_sel", base + 0x18, 26, 3); 185 clks[IMX6SL_CLK_GPU2D_OVG_PODF] = imx_clk_divider("gpu2d_ovg_podf", "gpu2d_ovg_sel", base + 0x18, 26, 3);
186 clks[IMX6SL_CLK_GPU2D_PODF] = imx_clk_divider("gpu2d_podf", "gpu2d_sel", base + 0x18, 29, 3); 186 clks[IMX6SL_CLK_GPU2D_PODF] = imx_clk_divider("gpu2d_podf", "gpu2d_sel", base + 0x18, 29, 3);
187 clks[IMX6SL_CLK_LCDIF_PIX_PRED] = imx_clk_divider("lcdif_pix_pred", "lcdif_pix_sel", base + 0x38, 3, 3); 187 clks[IMX6SL_CLK_LCDIF_PIX_PRED] = imx_clk_divider("lcdif_pix_pred", "lcdif_pix_sel", base + 0x38, 3, 3);
188 clks[IMX6SL_CLK_EPDC_PIX_PRED] = imx_clk_divider("epdc_pix_pred", "epdc_pix_sel", base + 0x38, 12, 3); 188 clks[IMX6SL_CLK_EPDC_PIX_PRED] = imx_clk_divider("epdc_pix_pred", "epdc_pix_sel", base + 0x38, 12, 3);
189 clks[IMX6SL_CLK_LCDIF_PIX_PODF] = imx_clk_divider("lcdif_pix_podf", "lcdif_pix_pred", base + 0x1c, 20, 3); 189 clks[IMX6SL_CLK_LCDIF_PIX_PODF] = imx_clk_fixup_divider("lcdif_pix_podf", "lcdif_pix_pred", base + 0x1c, 20, 3, imx_cscmr1_fixup);
190 clks[IMX6SL_CLK_EPDC_PIX_PODF] = imx_clk_divider("epdc_pix_podf", "epdc_pix_pred", base + 0x18, 23, 3); 190 clks[IMX6SL_CLK_EPDC_PIX_PODF] = imx_clk_divider("epdc_pix_podf", "epdc_pix_pred", base + 0x18, 23, 3);
191 clks[IMX6SL_CLK_SPDIF0_PRED] = imx_clk_divider("spdif0_pred", "spdif0_sel", base + 0x30, 25, 3); 191 clks[IMX6SL_CLK_SPDIF0_PRED] = imx_clk_divider("spdif0_pred", "spdif0_sel", base + 0x30, 25, 3);
192 clks[IMX6SL_CLK_SPDIF0_PODF] = imx_clk_divider("spdif0_podf", "spdif0_pred", base + 0x30, 22, 3); 192 clks[IMX6SL_CLK_SPDIF0_PODF] = imx_clk_divider("spdif0_podf", "spdif0_pred", base + 0x30, 22, 3);
diff --git a/arch/arm/mach-imx/clk-pllv3.c b/arch/arm/mach-imx/clk-pllv3.c
index a9fad5f8d340..f6640b6a7b31 100644
--- a/arch/arm/mach-imx/clk-pllv3.c
+++ b/arch/arm/mach-imx/clk-pllv3.c
@@ -48,7 +48,7 @@ struct clk_pllv3 {
48static int clk_pllv3_prepare(struct clk_hw *hw) 48static int clk_pllv3_prepare(struct clk_hw *hw)
49{ 49{
50 struct clk_pllv3 *pll = to_clk_pllv3(hw); 50 struct clk_pllv3 *pll = to_clk_pllv3(hw);
51 unsigned long timeout = jiffies + msecs_to_jiffies(10); 51 unsigned long timeout;
52 u32 val; 52 u32 val;
53 53
54 val = readl_relaxed(pll->base); 54 val = readl_relaxed(pll->base);
@@ -59,12 +59,19 @@ static int clk_pllv3_prepare(struct clk_hw *hw)
59 val &= ~BM_PLL_POWER; 59 val &= ~BM_PLL_POWER;
60 writel_relaxed(val, pll->base); 60 writel_relaxed(val, pll->base);
61 61
62 timeout = jiffies + msecs_to_jiffies(10);
62 /* Wait for PLL to lock */ 63 /* Wait for PLL to lock */
63 while (!(readl_relaxed(pll->base) & BM_PLL_LOCK)) 64 do {
65 if (readl_relaxed(pll->base) & BM_PLL_LOCK)
66 break;
64 if (time_after(jiffies, timeout)) 67 if (time_after(jiffies, timeout))
65 return -ETIMEDOUT; 68 break;
69 } while (1);
66 70
67 return 0; 71 if (readl_relaxed(pll->base) & BM_PLL_LOCK)
72 return 0;
73 else
74 return -ETIMEDOUT;
68} 75}
69 76
70static void clk_pllv3_unprepare(struct clk_hw *hw) 77static void clk_pllv3_unprepare(struct clk_hw *hw)
diff --git a/arch/arm/mach-imx/clk.c b/arch/arm/mach-imx/clk.c
index 55bc80a00666..edc35df7bed4 100644
--- a/arch/arm/mach-imx/clk.c
+++ b/arch/arm/mach-imx/clk.c
@@ -37,3 +37,29 @@ struct clk * __init imx_obtain_fixed_clock(
37 clk = imx_clk_fixed(name, rate); 37 clk = imx_clk_fixed(name, rate);
38 return clk; 38 return clk;
39} 39}
40
41/*
42 * This fixups the register CCM_CSCMR1 write value.
43 * The write/read/divider values of the aclk_podf field
44 * of that register have the relationship described by
45 * the following table:
46 *
47 * write value read value divider
48 * 3b'000 3b'110 7
49 * 3b'001 3b'111 8
50 * 3b'010 3b'100 5
51 * 3b'011 3b'101 6
52 * 3b'100 3b'010 3
53 * 3b'101 3b'011 4
54 * 3b'110 3b'000 1
55 * 3b'111 3b'001 2(default)
56 *
57 * That's why we do the xor operation below.
58 */
59#define CSCMR1_FIXUP 0x00600000
60
61void imx_cscmr1_fixup(u32 *val)
62{
63 *val ^= CSCMR1_FIXUP;
64 return;
65}
diff --git a/arch/arm/mach-imx/clk.h b/arch/arm/mach-imx/clk.h
index 0e4e8bb261b9..048c5ad8a80b 100644
--- a/arch/arm/mach-imx/clk.h
+++ b/arch/arm/mach-imx/clk.h
@@ -6,6 +6,8 @@
6 6
7extern spinlock_t imx_ccm_lock; 7extern spinlock_t imx_ccm_lock;
8 8
9extern void imx_cscmr1_fixup(u32 *val);
10
9struct clk *imx_clk_pllv1(const char *name, const char *parent, 11struct clk *imx_clk_pllv1(const char *name, const char *parent,
10 void __iomem *base); 12 void __iomem *base);
11 13
@@ -49,6 +51,14 @@ struct clk *imx_clk_busy_mux(const char *name, void __iomem *reg, u8 shift,
49 u8 width, void __iomem *busy_reg, u8 busy_shift, 51 u8 width, void __iomem *busy_reg, u8 busy_shift,
50 const char **parent_names, int num_parents); 52 const char **parent_names, int num_parents);
51 53
54struct clk *imx_clk_fixup_divider(const char *name, const char *parent,
55 void __iomem *reg, u8 shift, u8 width,
56 void (*fixup)(u32 *val));
57
58struct clk *imx_clk_fixup_mux(const char *name, void __iomem *reg,
59 u8 shift, u8 width, const char **parents,
60 int num_parents, void (*fixup)(u32 *val));
61
52static inline struct clk *imx_clk_fixed(const char *name, int rate) 62static inline struct clk *imx_clk_fixed(const char *name, int rate)
53{ 63{
54 return clk_register_fixed_rate(NULL, name, NULL, CLK_IS_ROOT, rate); 64 return clk_register_fixed_rate(NULL, name, NULL, CLK_IS_ROOT, rate);
@@ -79,7 +89,8 @@ static inline struct clk *imx_clk_gate(const char *name, const char *parent,
79static inline struct clk *imx_clk_mux(const char *name, void __iomem *reg, 89static inline struct clk *imx_clk_mux(const char *name, void __iomem *reg,
80 u8 shift, u8 width, const char **parents, int num_parents) 90 u8 shift, u8 width, const char **parents, int num_parents)
81{ 91{
82 return clk_register_mux(NULL, name, parents, num_parents, 0, reg, shift, 92 return clk_register_mux(NULL, name, parents, num_parents,
93 CLK_SET_RATE_NO_REPARENT, reg, shift,
83 width, 0, &imx_ccm_lock); 94 width, 0, &imx_ccm_lock);
84} 95}
85 96
@@ -88,7 +99,7 @@ static inline struct clk *imx_clk_mux_flags(const char *name,
88 int num_parents, unsigned long flags) 99 int num_parents, unsigned long flags)
89{ 100{
90 return clk_register_mux(NULL, name, parents, num_parents, 101 return clk_register_mux(NULL, name, parents, num_parents,
91 flags, reg, shift, width, 0, 102 flags | CLK_SET_RATE_NO_REPARENT, reg, shift, width, 0,
92 &imx_ccm_lock); 103 &imx_ccm_lock);
93} 104}
94 105
diff --git a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h
index cb6c838b63ed..4517fd760bfc 100644
--- a/arch/arm/mach-imx/common.h
+++ b/arch/arm/mach-imx/common.h
@@ -137,7 +137,6 @@ extern void imx_gpc_restore_all(void);
137extern void imx_anatop_init(void); 137extern void imx_anatop_init(void);
138extern void imx_anatop_pre_suspend(void); 138extern void imx_anatop_pre_suspend(void);
139extern void imx_anatop_post_resume(void); 139extern void imx_anatop_post_resume(void);
140extern void imx_anatop_usb_chrg_detect_disable(void);
141extern u32 imx_anatop_get_digprog(void); 140extern u32 imx_anatop_get_digprog(void);
142extern int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode); 141extern int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode);
143extern void imx6q_set_chicken_bit(void); 142extern void imx6q_set_chicken_bit(void);
@@ -147,12 +146,10 @@ extern int imx_cpu_kill(unsigned int cpu);
147 146
148#ifdef CONFIG_PM 147#ifdef CONFIG_PM
149extern void imx6q_pm_init(void); 148extern void imx6q_pm_init(void);
150extern void imx51_pm_init(void); 149extern void imx5_pm_init(void);
151extern void imx53_pm_init(void);
152#else 150#else
153static inline void imx6q_pm_init(void) {} 151static inline void imx6q_pm_init(void) {}
154static inline void imx51_pm_init(void) {} 152static inline void imx5_pm_init(void) {}
155static inline void imx53_pm_init(void) {}
156#endif 153#endif
157 154
158#ifdef CONFIG_NEON 155#ifdef CONFIG_NEON
@@ -161,6 +158,12 @@ extern int mx51_neon_fixup(void);
161static inline int mx51_neon_fixup(void) { return 0; } 158static inline int mx51_neon_fixup(void) { return 0; }
162#endif 159#endif
163 160
161#ifdef CONFIG_CACHE_L2X0
162extern void imx_init_l2cache(void);
163#else
164static inline void imx_init_l2cache(void) {}
165#endif
166
164extern struct smp_operations imx_smp_ops; 167extern struct smp_operations imx_smp_ops;
165 168
166#endif 169#endif
diff --git a/arch/arm/mach-imx/mach-imx27_visstrim_m10.c b/arch/arm/mach-imx/mach-imx27_visstrim_m10.c
index 29ac8ee651d2..97f9c6297fcf 100644
--- a/arch/arm/mach-imx/mach-imx27_visstrim_m10.c
+++ b/arch/arm/mach-imx/mach-imx27_visstrim_m10.c
@@ -26,7 +26,7 @@
26#include <linux/platform_device.h> 26#include <linux/platform_device.h>
27#include <linux/mtd/physmap.h> 27#include <linux/mtd/physmap.h>
28#include <linux/i2c.h> 28#include <linux/i2c.h>
29#include <linux/i2c/pca953x.h> 29#include <linux/platform_data/pca953x.h>
30#include <linux/input.h> 30#include <linux/input.h>
31#include <linux/gpio.h> 31#include <linux/gpio.h>
32#include <linux/delay.h> 32#include <linux/delay.h>
diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c
index 7be13f8e69a0..90372a21087f 100644
--- a/arch/arm/mach-imx/mach-imx6q.c
+++ b/arch/arm/mach-imx/mach-imx6q.c
@@ -31,7 +31,7 @@
31#include <linux/regmap.h> 31#include <linux/regmap.h>
32#include <linux/micrel_phy.h> 32#include <linux/micrel_phy.h>
33#include <linux/mfd/syscon.h> 33#include <linux/mfd/syscon.h>
34#include <asm/hardware/cache-l2x0.h> 34#include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
35#include <asm/mach/arch.h> 35#include <asm/mach/arch.h>
36#include <asm/mach/map.h> 36#include <asm/mach/map.h>
37#include <asm/system_misc.h> 37#include <asm/system_misc.h>
@@ -103,87 +103,77 @@ static int ksz9021rn_phy_fixup(struct phy_device *phydev)
103{ 103{
104 if (IS_BUILTIN(CONFIG_PHYLIB)) { 104 if (IS_BUILTIN(CONFIG_PHYLIB)) {
105 /* min rx data delay */ 105 /* min rx data delay */
106 phy_write(phydev, 0x0b, 0x8105); 106 phy_write(phydev, MICREL_KSZ9021_EXTREG_CTRL,
107 phy_write(phydev, 0x0c, 0x0000); 107 0x8000 | MICREL_KSZ9021_RGMII_RX_DATA_PAD_SCEW);
108 phy_write(phydev, MICREL_KSZ9021_EXTREG_DATA_WRITE, 0x0000);
108 109
109 /* max rx/tx clock delay, min rx/tx control delay */ 110 /* max rx/tx clock delay, min rx/tx control delay */
110 phy_write(phydev, 0x0b, 0x8104); 111 phy_write(phydev, MICREL_KSZ9021_EXTREG_CTRL,
111 phy_write(phydev, 0x0c, 0xf0f0); 112 0x8000 | MICREL_KSZ9021_RGMII_CLK_CTRL_PAD_SCEW);
112 phy_write(phydev, 0x0b, 0x104); 113 phy_write(phydev, MICREL_KSZ9021_EXTREG_DATA_WRITE, 0xf0f0);
114 phy_write(phydev, MICREL_KSZ9021_EXTREG_CTRL,
115 MICREL_KSZ9021_RGMII_CLK_CTRL_PAD_SCEW);
113 } 116 }
114 117
115 return 0; 118 return 0;
116} 119}
117 120
118static void __init imx6q_sabrelite_cko1_setup(void) 121static void mmd_write_reg(struct phy_device *dev, int device, int reg, int val)
119{ 122{
120 struct clk *cko1_sel, *ahb, *cko1; 123 phy_write(dev, 0x0d, device);
121 unsigned long rate; 124 phy_write(dev, 0x0e, reg);
122 125 phy_write(dev, 0x0d, (1 << 14) | device);
123 cko1_sel = clk_get_sys(NULL, "cko1_sel"); 126 phy_write(dev, 0x0e, val);
124 ahb = clk_get_sys(NULL, "ahb");
125 cko1 = clk_get_sys(NULL, "cko1");
126 if (IS_ERR(cko1_sel) || IS_ERR(ahb) || IS_ERR(cko1)) {
127 pr_err("cko1 setup failed!\n");
128 goto put_clk;
129 }
130 clk_set_parent(cko1_sel, ahb);
131 rate = clk_round_rate(cko1, 16000000);
132 clk_set_rate(cko1, rate);
133put_clk:
134 if (!IS_ERR(cko1_sel))
135 clk_put(cko1_sel);
136 if (!IS_ERR(ahb))
137 clk_put(ahb);
138 if (!IS_ERR(cko1))
139 clk_put(cko1);
140} 127}
141 128
142static void __init imx6q_sabrelite_init(void) 129static int ksz9031rn_phy_fixup(struct phy_device *dev)
143{ 130{
144 if (IS_BUILTIN(CONFIG_PHYLIB)) 131 /*
145 phy_register_fixup_for_uid(PHY_ID_KSZ9021, MICREL_PHY_ID_MASK, 132 * min rx data delay, max rx/tx clock delay,
146 ksz9021rn_phy_fixup); 133 * min rx/tx control delay
147 imx6q_sabrelite_cko1_setup(); 134 */
135 mmd_write_reg(dev, 2, 4, 0);
136 mmd_write_reg(dev, 2, 5, 0);
137 mmd_write_reg(dev, 2, 8, 0x003ff);
138
139 return 0;
148} 140}
149 141
150static void __init imx6q_sabresd_cko1_setup(void) 142static int ar8031_phy_fixup(struct phy_device *dev)
151{ 143{
152 struct clk *cko1_sel, *pll4, *pll4_post, *cko1; 144 u16 val;
153 unsigned long rate; 145
154 146 /* To enable AR8031 output a 125MHz clk from CLK_25M */
155 cko1_sel = clk_get_sys(NULL, "cko1_sel"); 147 phy_write(dev, 0xd, 0x7);
156 pll4 = clk_get_sys(NULL, "pll4_audio"); 148 phy_write(dev, 0xe, 0x8016);
157 pll4_post = clk_get_sys(NULL, "pll4_post_div"); 149 phy_write(dev, 0xd, 0x4007);
158 cko1 = clk_get_sys(NULL, "cko1"); 150
159 if (IS_ERR(cko1_sel) || IS_ERR(pll4) 151 val = phy_read(dev, 0xe);
160 || IS_ERR(pll4_post) || IS_ERR(cko1)) { 152 val &= 0xffe3;
161 pr_err("cko1 setup failed!\n"); 153 val |= 0x18;
162 goto put_clk; 154 phy_write(dev, 0xe, val);
163 } 155
164 /* 156 /* introduce tx clock delay */
165 * Setting pll4 at 768MHz (24MHz * 32) 157 phy_write(dev, 0x1d, 0x5);
166 * So its child clock can get 24MHz easily 158 val = phy_read(dev, 0x1e);
167 */ 159 val |= 0x0100;
168 clk_set_rate(pll4, 768000000); 160 phy_write(dev, 0x1e, val);
169 161
170 clk_set_parent(cko1_sel, pll4_post); 162 return 0;
171 rate = clk_round_rate(cko1, 24000000);
172 clk_set_rate(cko1, rate);
173put_clk:
174 if (!IS_ERR(cko1_sel))
175 clk_put(cko1_sel);
176 if (!IS_ERR(pll4_post))
177 clk_put(pll4_post);
178 if (!IS_ERR(pll4))
179 clk_put(pll4);
180 if (!IS_ERR(cko1))
181 clk_put(cko1);
182} 163}
183 164
184static void __init imx6q_sabresd_init(void) 165#define PHY_ID_AR8031 0x004dd074
166
167static void __init imx6q_enet_phy_init(void)
185{ 168{
186 imx6q_sabresd_cko1_setup(); 169 if (IS_BUILTIN(CONFIG_PHYLIB)) {
170 phy_register_fixup_for_uid(PHY_ID_KSZ9021, MICREL_PHY_ID_MASK,
171 ksz9021rn_phy_fixup);
172 phy_register_fixup_for_uid(PHY_ID_KSZ9031, MICREL_PHY_ID_MASK,
173 ksz9031rn_phy_fixup);
174 phy_register_fixup_for_uid(PHY_ID_AR8031, 0xffffffff,
175 ar8031_phy_fixup);
176 }
187} 177}
188 178
189static void __init imx6q_1588_init(void) 179static void __init imx6q_1588_init(void)
@@ -192,29 +182,22 @@ static void __init imx6q_1588_init(void)
192 182
193 gpr = syscon_regmap_lookup_by_compatible("fsl,imx6q-iomuxc-gpr"); 183 gpr = syscon_regmap_lookup_by_compatible("fsl,imx6q-iomuxc-gpr");
194 if (!IS_ERR(gpr)) 184 if (!IS_ERR(gpr))
195 regmap_update_bits(gpr, 0x4, 1 << 21, 1 << 21); 185 regmap_update_bits(gpr, IOMUXC_GPR1,
186 IMX6Q_GPR1_ENET_CLK_SEL_MASK,
187 IMX6Q_GPR1_ENET_CLK_SEL_ANATOP);
196 else 188 else
197 pr_err("failed to find fsl,imx6q-iomux-gpr regmap\n"); 189 pr_err("failed to find fsl,imx6q-iomux-gpr regmap\n");
198 190
199} 191}
200static void __init imx6q_usb_init(void)
201{
202 imx_anatop_usb_chrg_detect_disable();
203}
204 192
205static void __init imx6q_init_machine(void) 193static void __init imx6q_init_machine(void)
206{ 194{
207 if (of_machine_is_compatible("fsl,imx6q-sabrelite")) 195 imx6q_enet_phy_init();
208 imx6q_sabrelite_init();
209 else if (of_machine_is_compatible("fsl,imx6q-sabresd") ||
210 of_machine_is_compatible("fsl,imx6dl-sabresd"))
211 imx6q_sabresd_init();
212 196
213 of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); 197 of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
214 198
215 imx_anatop_init(); 199 imx_anatop_init();
216 imx6q_pm_init(); 200 imx6q_pm_init();
217 imx6q_usb_init();
218 imx6q_1588_init(); 201 imx6q_1588_init();
219} 202}
220 203
@@ -250,17 +233,21 @@ put_node:
250 of_node_put(np); 233 of_node_put(np);
251} 234}
252 235
253static void __init imx6q_opp_init(struct device *cpu_dev) 236static void __init imx6q_opp_init(void)
254{ 237{
255 struct device_node *np; 238 struct device_node *np;
239 struct device *cpu_dev = get_cpu_device(0);
256 240
257 np = of_find_node_by_path("/cpus/cpu@0"); 241 if (!cpu_dev) {
242 pr_warn("failed to get cpu0 device\n");
243 return;
244 }
245 np = of_node_get(cpu_dev->of_node);
258 if (!np) { 246 if (!np) {
259 pr_warn("failed to find cpu0 node\n"); 247 pr_warn("failed to find cpu0 node\n");
260 return; 248 return;
261 } 249 }
262 250
263 cpu_dev->of_node = np;
264 if (of_init_opp_table(cpu_dev)) { 251 if (of_init_opp_table(cpu_dev)) {
265 pr_warn("failed to init OPP table\n"); 252 pr_warn("failed to init OPP table\n");
266 goto put_node; 253 goto put_node;
@@ -286,7 +273,7 @@ static void __init imx6q_init_late(void)
286 imx6q_cpuidle_init(); 273 imx6q_cpuidle_init();
287 274
288 if (IS_ENABLED(CONFIG_ARM_IMX6Q_CPUFREQ)) { 275 if (IS_ENABLED(CONFIG_ARM_IMX6Q_CPUFREQ)) {
289 imx6q_opp_init(&imx6q_cpufreq_pdev.dev); 276 imx6q_opp_init();
290 platform_device_register(&imx6q_cpufreq_pdev); 277 platform_device_register(&imx6q_cpufreq_pdev);
291 } 278 }
292} 279}
@@ -297,44 +284,10 @@ static void __init imx6q_map_io(void)
297 imx_scu_map_io(); 284 imx_scu_map_io();
298} 285}
299 286
300#ifdef CONFIG_CACHE_L2X0
301static void __init imx6q_init_l2cache(void)
302{
303 void __iomem *l2x0_base;
304 struct device_node *np;
305 unsigned int val;
306
307 np = of_find_compatible_node(NULL, NULL, "arm,pl310-cache");
308 if (!np)
309 goto out;
310
311 l2x0_base = of_iomap(np, 0);
312 if (!l2x0_base) {
313 of_node_put(np);
314 goto out;
315 }
316
317 /* Configure the L2 PREFETCH and POWER registers */
318 val = readl_relaxed(l2x0_base + L2X0_PREFETCH_CTRL);
319 val |= 0x70800000;
320 writel_relaxed(val, l2x0_base + L2X0_PREFETCH_CTRL);
321 val = L2X0_DYNAMIC_CLK_GATING_EN | L2X0_STNDBY_MODE_EN;
322 writel_relaxed(val, l2x0_base + L2X0_POWER_CTRL);
323
324 iounmap(l2x0_base);
325 of_node_put(np);
326
327out:
328 l2x0_of_init(0, ~0UL);
329}
330#else
331static inline void imx6q_init_l2cache(void) {}
332#endif
333
334static void __init imx6q_init_irq(void) 287static void __init imx6q_init_irq(void)
335{ 288{
336 imx6q_init_revision(); 289 imx6q_init_revision();
337 imx6q_init_l2cache(); 290 imx_init_l2cache();
338 imx_src_init(); 291 imx_src_init();
339 imx_gpc_init(); 292 imx_gpc_init();
340 irqchip_init(); 293 irqchip_init();
diff --git a/arch/arm/mach-imx/mach-imx6sl.c b/arch/arm/mach-imx/mach-imx6sl.c
index 132db2609507..0d75dc54f715 100644
--- a/arch/arm/mach-imx/mach-imx6sl.c
+++ b/arch/arm/mach-imx/mach-imx6sl.c
@@ -11,7 +11,6 @@
11#include <linux/irqchip.h> 11#include <linux/irqchip.h>
12#include <linux/of.h> 12#include <linux/of.h>
13#include <linux/of_platform.h> 13#include <linux/of_platform.h>
14#include <asm/hardware/cache-l2x0.h>
15#include <asm/mach/arch.h> 14#include <asm/mach/arch.h>
16#include <asm/mach/map.h> 15#include <asm/mach/map.h>
17 16
@@ -26,7 +25,7 @@ static void __init imx6sl_init_machine(void)
26 25
27static void __init imx6sl_init_irq(void) 26static void __init imx6sl_init_irq(void)
28{ 27{
29 l2x0_of_init(0, ~0UL); 28 imx_init_l2cache();
30 imx_src_init(); 29 imx_src_init();
31 imx_gpc_init(); 30 imx_gpc_init();
32 irqchip_init(); 31 irqchip_init();
diff --git a/arch/arm/mach-imx/mach-mxt_td60.c b/arch/arm/mach-imx/mach-mxt_td60.c
index a27faaba98ec..c91894003da9 100644
--- a/arch/arm/mach-imx/mach-mxt_td60.c
+++ b/arch/arm/mach-imx/mach-mxt_td60.c
@@ -26,7 +26,7 @@
26#include <asm/mach/time.h> 26#include <asm/mach/time.h>
27#include <asm/mach/map.h> 27#include <asm/mach/map.h>
28#include <linux/gpio.h> 28#include <linux/gpio.h>
29#include <linux/i2c/pca953x.h> 29#include <linux/platform_data/pca953x.h>
30 30
31#include "common.h" 31#include "common.h"
32#include "devices-imx27.h" 32#include "devices-imx27.h"
diff --git a/arch/arm/mach-imx/mm-imx25.c b/arch/arm/mach-imx/mm-imx25.c
index e065c117f5a6..5211f62c624e 100644
--- a/arch/arm/mach-imx/mm-imx25.c
+++ b/arch/arm/mach-imx/mm-imx25.c
@@ -61,25 +61,8 @@ void __init mx25_init_irq(void)
61 mxc_init_irq(MX25_IO_ADDRESS(MX25_AVIC_BASE_ADDR)); 61 mxc_init_irq(MX25_IO_ADDRESS(MX25_AVIC_BASE_ADDR));
62} 62}
63 63
64static struct sdma_script_start_addrs imx25_sdma_script __initdata = {
65 .ap_2_ap_addr = 729,
66 .uart_2_mcu_addr = 904,
67 .per_2_app_addr = 1255,
68 .mcu_2_app_addr = 834,
69 .uartsh_2_mcu_addr = 1120,
70 .per_2_shp_addr = 1329,
71 .mcu_2_shp_addr = 1048,
72 .ata_2_mcu_addr = 1560,
73 .mcu_2_ata_addr = 1479,
74 .app_2_per_addr = 1189,
75 .app_2_mcu_addr = 770,
76 .shp_2_per_addr = 1407,
77 .shp_2_mcu_addr = 979,
78};
79
80static struct sdma_platform_data imx25_sdma_pdata __initdata = { 64static struct sdma_platform_data imx25_sdma_pdata __initdata = {
81 .fw_name = "sdma-imx25.bin", 65 .fw_name = "sdma-imx25.bin",
82 .script_addrs = &imx25_sdma_script,
83}; 66};
84 67
85static const struct resource imx25_audmux_res[] __initconst = { 68static const struct resource imx25_audmux_res[] __initconst = {
diff --git a/arch/arm/mach-imx/mm-imx5.c b/arch/arm/mach-imx/mm-imx5.c
index cf193d87274a..eb3cce38c70d 100644
--- a/arch/arm/mach-imx/mm-imx5.c
+++ b/arch/arm/mach-imx/mm-imx5.c
@@ -103,22 +103,8 @@ void __init mx53_init_irq(void)
103 tzic_init_irq(MX53_IO_ADDRESS(MX53_TZIC_BASE_ADDR)); 103 tzic_init_irq(MX53_IO_ADDRESS(MX53_TZIC_BASE_ADDR));
104} 104}
105 105
106static struct sdma_script_start_addrs imx51_sdma_script __initdata = {
107 .ap_2_ap_addr = 642,
108 .uart_2_mcu_addr = 817,
109 .mcu_2_app_addr = 747,
110 .mcu_2_shp_addr = 961,
111 .ata_2_mcu_addr = 1473,
112 .mcu_2_ata_addr = 1392,
113 .app_2_per_addr = 1033,
114 .app_2_mcu_addr = 683,
115 .shp_2_per_addr = 1251,
116 .shp_2_mcu_addr = 892,
117};
118
119static struct sdma_platform_data imx51_sdma_pdata __initdata = { 106static struct sdma_platform_data imx51_sdma_pdata __initdata = {
120 .fw_name = "sdma-imx51.bin", 107 .fw_name = "sdma-imx51.bin",
121 .script_addrs = &imx51_sdma_script,
122}; 108};
123 109
124static const struct resource imx51_audmux_res[] __initconst = { 110static const struct resource imx51_audmux_res[] __initconst = {
@@ -153,10 +139,10 @@ void __init imx51_soc_init(void)
153void __init imx51_init_late(void) 139void __init imx51_init_late(void)
154{ 140{
155 mx51_neon_fixup(); 141 mx51_neon_fixup();
156 imx51_pm_init(); 142 imx5_pm_init();
157} 143}
158 144
159void __init imx53_init_late(void) 145void __init imx53_init_late(void)
160{ 146{
161 imx53_pm_init(); 147 imx5_pm_init();
162} 148}
diff --git a/arch/arm/mach-imx/pm-imx5.c b/arch/arm/mach-imx/pm-imx5.c
index 82e79c658eb2..58aeaf5baaf6 100644
--- a/arch/arm/mach-imx/pm-imx5.c
+++ b/arch/arm/mach-imx/pm-imx5.c
@@ -169,14 +169,9 @@ static int __init imx5_pm_common_init(void)
169 return imx5_cpuidle_init(); 169 return imx5_cpuidle_init();
170} 170}
171 171
172void __init imx51_pm_init(void) 172void __init imx5_pm_init(void)
173{ 173{
174 int ret = imx5_pm_common_init(); 174 int ret = imx5_pm_common_init();
175 if (!ret) 175 if (!ret)
176 suspend_set_ops(&mx5_suspend_ops); 176 suspend_set_ops(&mx5_suspend_ops);
177} 177}
178
179void __init imx53_pm_init(void)
180{
181 imx5_pm_common_init();
182}
diff --git a/arch/arm/mach-imx/system.c b/arch/arm/mach-imx/system.c
index 6fe81bb4d3c9..80c177c36c5f 100644
--- a/arch/arm/mach-imx/system.c
+++ b/arch/arm/mach-imx/system.c
@@ -27,6 +27,7 @@
27#include <asm/system_misc.h> 27#include <asm/system_misc.h>
28#include <asm/proc-fns.h> 28#include <asm/proc-fns.h>
29#include <asm/mach-types.h> 29#include <asm/mach-types.h>
30#include <asm/hardware/cache-l2x0.h>
30 31
31#include "common.h" 32#include "common.h"
32#include "hardware.h" 33#include "hardware.h"
@@ -95,3 +96,46 @@ void __init mxc_arch_reset_init_dt(void)
95 96
96 clk_prepare(wdog_clk); 97 clk_prepare(wdog_clk);
97} 98}
99
100#ifdef CONFIG_CACHE_L2X0
101void __init imx_init_l2cache(void)
102{
103 void __iomem *l2x0_base;
104 struct device_node *np;
105 unsigned int val;
106
107 np = of_find_compatible_node(NULL, NULL, "arm,pl310-cache");
108 if (!np)
109 goto out;
110
111 l2x0_base = of_iomap(np, 0);
112 if (!l2x0_base) {
113 of_node_put(np);
114 goto out;
115 }
116
117 /* Configure the L2 PREFETCH and POWER registers */
118 val = readl_relaxed(l2x0_base + L2X0_PREFETCH_CTRL);
119 val |= 0x70800000;
120 /*
121 * The L2 cache controller(PL310) version on the i.MX6D/Q is r3p1-50rel0
122 * The L2 cache controller(PL310) version on the i.MX6DL/SOLO/SL is r3p2
123 * But according to ARM PL310 errata: 752271
124 * ID: 752271: Double linefill feature can cause data corruption
125 * Fault Status: Present in: r3p0, r3p1, r3p1-50rel0. Fixed in r3p2
126 * Workaround: The only workaround to this erratum is to disable the
127 * double linefill feature. This is the default behavior.
128 */
129 if (cpu_is_imx6q())
130 val &= ~(1 << 30 | 1 << 23);
131 writel_relaxed(val, l2x0_base + L2X0_PREFETCH_CTRL);
132 val = L2X0_DYNAMIC_CLK_GATING_EN | L2X0_STNDBY_MODE_EN;
133 writel_relaxed(val, l2x0_base + L2X0_POWER_CTRL);
134
135 iounmap(l2x0_base);
136 of_node_put(np);
137
138out:
139 l2x0_of_init(0, ~0UL);
140}
141#endif
diff --git a/arch/arm/mach-integrator/include/mach/debug-macro.S b/arch/arm/mach-integrator/include/mach/debug-macro.S
deleted file mode 100644
index 411b116077e4..000000000000
--- a/arch/arm/mach-integrator/include/mach/debug-macro.S
+++ /dev/null
@@ -1,20 +0,0 @@
1/* arch/arm/mach-integrator/include/mach/debug-macro.S
2 *
3 * Debugging macro include header
4 *
5 * Copyright (C) 1994-1999 Russell King
6 * Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 *
12*/
13
14 .macro addruart, rp, rv, tmp
15 mov \rp, #0x16000000 @ physical base address
16 mov \rv, #0xf0000000 @ virtual base
17 add \rv, \rv, #0x16000000 >> 4
18 .endm
19
20#include <asm/hardware/debug-pl01x.S>
diff --git a/arch/arm/mach-iop13xx/include/mach/debug-macro.S b/arch/arm/mach-iop13xx/include/mach/debug-macro.S
deleted file mode 100644
index d869a6f67e5c..000000000000
--- a/arch/arm/mach-iop13xx/include/mach/debug-macro.S
+++ /dev/null
@@ -1,24 +0,0 @@
1/*
2 * arch/arm/mach-iop13xx/include/mach/debug-macro.S
3 *
4 * Debugging macro include header
5 *
6 * Copyright (C) 1994-1999 Russell King
7 * Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12 */
13
14 .macro addruart, rp, rv, tmp
15 mov \rp, #0x00002300
16 orr \rp, \rp, #0x00000040
17 orr \rv, \rp, #0xfe000000 @ virtual
18 orr \rv, \rv, #0x00e80000
19 orr \rp, \rp, #0xff000000 @ physical
20 orr \rp, \rp, #0x00d80000
21 .endm
22
23#define UART_SHIFT 2
24#include <asm/hardware/debug-8250.S>
diff --git a/arch/arm/mach-iop32x/include/mach/debug-macro.S b/arch/arm/mach-iop32x/include/mach/debug-macro.S
deleted file mode 100644
index 363bdf90b34d..000000000000
--- a/arch/arm/mach-iop32x/include/mach/debug-macro.S
+++ /dev/null
@@ -1,21 +0,0 @@
1/*
2 * arch/arm/mach-iop32x/include/mach/debug-macro.S
3 *
4 * Debugging macro include header
5 *
6 * Copyright (C) 1994-1999 Russell King
7 * Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12 */
13
14 .macro addruart, rp, rv, tmp
15 mov \rp, #0xfe000000 @ physical as well as virtual
16 orr \rp, \rp, #0x00800000 @ location of the UART
17 mov \rv, \rp
18 .endm
19
20#define UART_SHIFT 0
21#include <asm/hardware/debug-8250.S>
diff --git a/arch/arm/mach-iop33x/include/mach/debug-macro.S b/arch/arm/mach-iop33x/include/mach/debug-macro.S
deleted file mode 100644
index 361be1f6026e..000000000000
--- a/arch/arm/mach-iop33x/include/mach/debug-macro.S
+++ /dev/null
@@ -1,22 +0,0 @@
1/*
2 * arch/arm/mach-iop33x/include/mach/debug-macro.S
3 *
4 * Debugging macro include header
5 *
6 * Copyright (C) 1994-1999 Russell King
7 * Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12 */
13
14 .macro addruart, rp, rv, tmp
15 mov \rp, #0x00ff0000
16 orr \rp, \rp, #0x0000f700
17 orr \rv, #0xfe000000 @ virtual
18 orr \rp, #0xff000000 @ physical
19 .endm
20
21#define UART_SHIFT 2
22#include <asm/hardware/debug-8250.S>
diff --git a/arch/arm/mach-ixp4xx/include/mach/debug-macro.S b/arch/arm/mach-ixp4xx/include/mach/debug-macro.S
deleted file mode 100644
index ff686cbc5df4..000000000000
--- a/arch/arm/mach-ixp4xx/include/mach/debug-macro.S
+++ /dev/null
@@ -1,26 +0,0 @@
1/* arch/arm/mach-ixp4xx/include/mach/debug-macro.S
2 *
3 * Debugging macro include header
4 *
5 * Copyright (C) 1994-1999 Russell King
6 * Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11*/
12
13 .macro addruart, rp, rv, tmp
14#ifdef __ARMEB__
15 mov \rp, #3 @ Uart regs are at off set of 3 if
16 @ byte writes used - Big Endian.
17#else
18 mov \rp, #0
19#endif
20 orr \rv, \rp, #0xfe000000 @ virtual
21 orr \rv, \rv, #0x00f00000
22 orr \rp, \rp, #0xc8000000 @ physical
23 .endm
24
25#define UART_SHIFT 2
26#include <asm/hardware/debug-8250.S>
diff --git a/arch/arm/mach-keystone/Kconfig b/arch/arm/mach-keystone/Kconfig
index 51a50e996840..366d1a3b418d 100644
--- a/arch/arm/mach-keystone/Kconfig
+++ b/arch/arm/mach-keystone/Kconfig
@@ -7,7 +7,6 @@ config ARCH_KEYSTONE
7 select HAVE_SMP 7 select HAVE_SMP
8 select CLKSRC_MMIO 8 select CLKSRC_MMIO
9 select GENERIC_CLOCKEVENTS 9 select GENERIC_CLOCKEVENTS
10 select HAVE_SCHED_CLOCK
11 select ARCH_WANT_OPTIONAL_GPIOLIB 10 select ARCH_WANT_OPTIONAL_GPIOLIB
12 select ARM_ERRATA_798181 if SMP 11 select ARM_ERRATA_798181 if SMP
13 help 12 help
diff --git a/arch/arm/mach-keystone/platsmp.c b/arch/arm/mach-keystone/platsmp.c
index 14378e3fef16..c12296157d4a 100644
--- a/arch/arm/mach-keystone/platsmp.c
+++ b/arch/arm/mach-keystone/platsmp.c
@@ -38,6 +38,5 @@ static int keystone_smp_boot_secondary(unsigned int cpu,
38} 38}
39 39
40struct smp_operations keystone_smp_ops __initdata = { 40struct smp_operations keystone_smp_ops __initdata = {
41 .smp_init_cpus = arm_dt_init_cpu_maps,
42 .smp_boot_secondary = keystone_smp_boot_secondary, 41 .smp_boot_secondary = keystone_smp_boot_secondary,
43}; 42};
diff --git a/arch/arm/mach-keystone/smc.S b/arch/arm/mach-keystone/smc.S
index 9b9e4f7b241e..d15de8179fab 100644
--- a/arch/arm/mach-keystone/smc.S
+++ b/arch/arm/mach-keystone/smc.S
@@ -22,8 +22,7 @@
22 * Return: Non zero value on failure 22 * Return: Non zero value on failure
23 */ 23 */
24ENTRY(keystone_cpu_smc) 24ENTRY(keystone_cpu_smc)
25 stmfd sp!, {r4-r12, lr} 25 stmfd sp!, {r4-r11, lr}
26 smc #0 26 smc #0
27 dsb 27 ldmfd sp!, {r4-r11, pc}
28 ldmfd sp!, {r4-r12, pc}
29ENDPROC(keystone_cpu_smc) 28ENDPROC(keystone_cpu_smc)
diff --git a/arch/arm/mach-kirkwood/Kconfig b/arch/arm/mach-kirkwood/Kconfig
index b634f9650a7b..fe8319ad3158 100644
--- a/arch/arm/mach-kirkwood/Kconfig
+++ b/arch/arm/mach-kirkwood/Kconfig
@@ -2,67 +2,32 @@ if ARCH_KIRKWOOD
2 2
3menu "Marvell Kirkwood Implementations" 3menu "Marvell Kirkwood Implementations"
4 4
5config KIRKWOOD_LEGACY
6 bool
7
5config MACH_D2NET_V2 8config MACH_D2NET_V2
6 bool "LaCie d2 Network v2 NAS Board" 9 bool "LaCie d2 Network v2 NAS Board"
10 select KIRKWOOD_LEGACY
7 help 11 help
8 Say 'Y' here if you want your kernel to support the 12 Say 'Y' here if you want your kernel to support the
9 LaCie d2 Network v2 NAS. 13 LaCie d2 Network v2 NAS.
10 14
11config MACH_DOCKSTAR
12 bool "Seagate FreeAgent DockStar"
13 help
14 Say 'Y' here if you want your kernel to support the
15 Seagate FreeAgent DockStar.
16
17config MACH_ESATA_SHEEVAPLUG
18 bool "Marvell eSATA SheevaPlug Reference Board"
19 help
20 Say 'Y' here if you want your kernel to support the
21 Marvell eSATA SheevaPlug Reference Board.
22
23config MACH_GURUPLUG
24 bool "Marvell GuruPlug Reference Board"
25 help
26 Say 'Y' here if you want your kernel to support the
27 Marvell GuruPlug Reference Board.
28
29config MACH_INETSPACE_V2
30 bool "LaCie Internet Space v2 NAS Board"
31 help
32 Say 'Y' here if you want your kernel to support the
33 LaCie Internet Space v2 NAS.
34
35config MACH_MV88F6281GTW_GE
36 bool "Marvell 88F6281 GTW GE Board"
37 help
38 Say 'Y' here if you want your kernel to support the
39 Marvell 88F6281 GTW GE Board.
40
41config MACH_NET2BIG_V2 15config MACH_NET2BIG_V2
42 bool "LaCie 2Big Network v2 NAS Board" 16 bool "LaCie 2Big Network v2 NAS Board"
17 select KIRKWOOD_LEGACY
43 help 18 help
44 Say 'Y' here if you want your kernel to support the 19 Say 'Y' here if you want your kernel to support the
45 LaCie 2Big Network v2 NAS. 20 LaCie 2Big Network v2 NAS.
46 21
47config MACH_NET5BIG_V2 22config MACH_NET5BIG_V2
48 bool "LaCie 5Big Network v2 NAS Board" 23 bool "LaCie 5Big Network v2 NAS Board"
24 select KIRKWOOD_LEGACY
49 help 25 help
50 Say 'Y' here if you want your kernel to support the 26 Say 'Y' here if you want your kernel to support the
51 LaCie 5Big Network v2 NAS. 27 LaCie 5Big Network v2 NAS.
52 28
53config MACH_NETSPACE_MAX_V2
54 bool "LaCie Network Space Max v2 NAS Board"
55 help
56 Say 'Y' here if you want your kernel to support the
57 LaCie Network Space Max v2 NAS.
58
59config MACH_NETSPACE_V2
60 bool "LaCie Network Space v2 NAS Board"
61 help
62 Say 'Y' here if you want your kernel to support the
63 LaCie Network Space v2 NAS.
64
65config MACH_OPENRD 29config MACH_OPENRD
30 select KIRKWOOD_LEGACY
66 bool 31 bool
67 32
68config MACH_OPENRD_BASE 33config MACH_OPENRD_BASE
@@ -88,30 +53,28 @@ config MACH_OPENRD_ULTIMATE
88 53
89config MACH_RD88F6192_NAS 54config MACH_RD88F6192_NAS
90 bool "Marvell RD-88F6192-NAS Reference Board" 55 bool "Marvell RD-88F6192-NAS Reference Board"
56 select KIRKWOOD_LEGACY
91 help 57 help
92 Say 'Y' here if you want your kernel to support the 58 Say 'Y' here if you want your kernel to support the
93 Marvell RD-88F6192-NAS Reference Board. 59 Marvell RD-88F6192-NAS Reference Board.
94 60
95config MACH_RD88F6281 61config MACH_RD88F6281
96 bool "Marvell RD-88F6281 Reference Board" 62 bool "Marvell RD-88F6281 Reference Board"
63 select KIRKWOOD_LEGACY
97 help 64 help
98 Say 'Y' here if you want your kernel to support the 65 Say 'Y' here if you want your kernel to support the
99 Marvell RD-88F6281 Reference Board. 66 Marvell RD-88F6281 Reference Board.
100 67
101config MACH_SHEEVAPLUG
102 bool "Marvell SheevaPlug Reference Board"
103 help
104 Say 'Y' here if you want your kernel to support the
105 Marvell SheevaPlug Reference Board.
106
107config MACH_T5325 68config MACH_T5325
108 bool "HP t5325 Thin Client" 69 bool "HP t5325 Thin Client"
70 select KIRKWOOD_LEGACY
109 help 71 help
110 Say 'Y' here if you want your kernel to support the 72 Say 'Y' here if you want your kernel to support the
111 HP t5325 Thin Client. 73 HP t5325 Thin Client.
112 74
113config MACH_TS219 75config MACH_TS219
114 bool "QNAP TS-110, TS-119, TS-119P+, TS-210, TS-219, TS-219P and TS-219P+ Turbo NAS" 76 bool "QNAP TS-110, TS-119, TS-119P+, TS-210, TS-219, TS-219P and TS-219P+ Turbo NAS"
77 select KIRKWOOD_LEGACY
115 help 78 help
116 Say 'Y' here if you want your kernel to support the 79 Say 'Y' here if you want your kernel to support the
117 QNAP TS-110, TS-119, TS-119P+, TS-210, TS-219, TS-219P and 80 QNAP TS-110, TS-119, TS-119P+, TS-210, TS-219, TS-219P and
@@ -119,6 +82,7 @@ config MACH_TS219
119 82
120config MACH_TS41X 83config MACH_TS41X
121 bool "QNAP TS-410, TS-410U, TS-419P, TS-419P+ and TS-419U Turbo NAS" 84 bool "QNAP TS-410, TS-410U, TS-419P, TS-419P+ and TS-419U Turbo NAS"
85 select KIRKWOOD_LEGACY
122 help 86 help
123 Say 'Y' here if you want your kernel to support the 87 Say 'Y' here if you want your kernel to support the
124 QNAP TS-410, TS-410U, TS-419P, TS-419P+ and TS-419U Turbo 88 QNAP TS-410, TS-410U, TS-419P, TS-419P+ and TS-419U Turbo
@@ -129,6 +93,9 @@ comment "Device tree entries"
129config ARCH_KIRKWOOD_DT 93config ARCH_KIRKWOOD_DT
130 bool "Marvell Kirkwood Flattened Device Tree" 94 bool "Marvell Kirkwood Flattened Device Tree"
131 select KIRKWOOD_CLK 95 select KIRKWOOD_CLK
96 select OF_IRQ
97 select ORION_IRQCHIP
98 select ORION_TIMER
132 select POWER_SUPPLY 99 select POWER_SUPPLY
133 select POWER_RESET 100 select POWER_RESET
134 select POWER_RESET_GPIO 101 select POWER_RESET_GPIO
@@ -139,184 +106,12 @@ config ARCH_KIRKWOOD_DT
139 Say 'Y' here if you want your kernel to support the 106 Say 'Y' here if you want your kernel to support the
140 Marvell Kirkwood using flattened device tree. 107 Marvell Kirkwood using flattened device tree.
141 108
142config MACH_CLOUDBOX_DT 109config MACH_MV88F6281GTW_GE_DT
143 bool "LaCie CloudBox NAS (Flattened Device Tree)" 110 bool "Marvell 88F6281 GTW GE Board (Flattened Device Tree)"
144 select ARCH_KIRKWOOD_DT 111 depends on ARCH_KIRKWOOD_DT
145 help
146 Say 'Y' here if you want your kernel to support the LaCie
147 CloudBox NAS, using Flattened Device Tree.
148
149config MACH_DB88F628X_BP_DT
150 bool "Marvell DB-88F628x-BP Development Board (Flattened Device Tree)"
151 help
152 Say 'Y' here if you want your kernel to support the Marvell
153 DB-88F6281-BP and DB-88F6282-BP Development Board (Flattened
154 Device Tree).
155
156config MACH_DLINK_KIRKWOOD_DT
157 bool "D-Link Kirkwood-based NAS (Flattened Device Tree)"
158 select ARCH_KIRKWOOD_DT
159 help
160 Say 'Y' here if you want your kernel to support the
161 Kirkwood-based D-Link NASes such as DNS-320 & DNS-325,
162 using Flattened Device Tree.
163
164config MACH_DOCKSTAR_DT
165 bool "Seagate FreeAgent Dockstar (Flattened Device Tree)"
166 select ARCH_KIRKWOOD_DT
167 help 112 help
168 Say 'Y' here if you want your kernel to support the 113 Say 'Y' here if you want your kernel to support the
169 Seagate FreeAgent Dockstar (Flattened Device Tree). 114 Marvell 88F6281 GTW GE Board (Flattened Device Tree).
170
171config MACH_DREAMPLUG_DT
172 bool "Marvell DreamPlug (Flattened Device Tree)"
173 select ARCH_KIRKWOOD_DT
174 help
175 Say 'Y' here if you want your kernel to support the
176 Marvell DreamPlug (Flattened Device Tree).
177
178config MACH_GOFLEXNET_DT
179 bool "Seagate GoFlex Net (Flattened Device Tree)"
180 select ARCH_KIRKWOOD_DT
181 help
182 Say 'Y' here if you want your kernel to support the
183 Seagate GoFlex Net (Flattened Device Tree).
184
185config MACH_GURUPLUG_DT
186 bool "Marvell GuruPlug Reference Board (Flattened Device Tree)"
187 select ARCH_KIRKWOOD_DT
188 help
189 Say 'Y' here if you want your kernel to support the
190 Marvell GuruPlug Reference Board (Flattened Device Tree).
191
192config MACH_IB62X0_DT
193 bool "RaidSonic IB-NAS6210, IB-NAS6220 (Flattened Device Tree)"
194 select ARCH_KIRKWOOD_DT
195 help
196 Say 'Y' here if you want your kernel to support the
197 RaidSonic IB-NAS6210 & IB-NAS6220 devices, using
198 Flattened Device Tree.
199
200config MACH_ICONNECT_DT
201 bool "Iomega Iconnect (Flattened Device Tree)"
202 select ARCH_KIRKWOOD_DT
203 help
204 Say 'Y' here to enable Iomega Iconnect support.
205
206config MACH_INETSPACE_V2_DT
207 bool "LaCie Internet Space v2 NAS (Flattened Device Tree)"
208 select ARCH_KIRKWOOD_DT
209 help
210 Say 'Y' here if you want your kernel to support the LaCie
211 Internet Space v2 NAS, using Flattened Device Tree.
212
213config MACH_IOMEGA_IX2_200_DT
214 bool "Iomega StorCenter ix2-200 (Flattened Device Tree)"
215 select ARCH_KIRKWOOD_DT
216 help
217 Say 'Y' here if you want your kernel to support the
218 Iomega StorCenter ix2-200 (Flattened Device Tree).
219
220config MACH_KM_KIRKWOOD_DT
221 bool "Keymile Kirkwood Reference Design (Flattened Device Tree)"
222 select ARCH_KIRKWOOD_DT
223 help
224 Say 'Y' here if you want your kernel to support the
225 Keymile Kirkwood Reference Desgin, using Flattened Device Tree.
226
227config MACH_LSXL_DT
228 bool "Buffalo Linkstation LS-XHL, LS-CHLv2 (Flattened Device Tree)"
229 select ARCH_KIRKWOOD_DT
230 select POWER_RESET_RESTART
231 help
232 Say 'Y' here if you want your kernel to support the
233 Buffalo Linkstation LS-XHL & LS-CHLv2 devices, using
234 Flattened Device Tree.
235
236config MACH_MPLCEC4_DT
237 bool "MPL CEC4 (Flattened Device Tree)"
238 select ARCH_KIRKWOOD_DT
239 help
240 Say 'Y' here if you want your kernel to support the
241 MPL CEC4 (Flattened Device Tree).
242
243config MACH_NETSPACE_LITE_V2_DT
244 bool "LaCie Network Space Lite v2 NAS (Flattened Device Tree)"
245 select ARCH_KIRKWOOD_DT
246 help
247 Say 'Y' here if you want your kernel to support the LaCie
248 Network Space Lite v2 NAS, using Flattened Device Tree.
249
250config MACH_NETSPACE_MAX_V2_DT
251 bool "LaCie Network Space Max v2 NAS (Flattened Device Tree)"
252 select ARCH_KIRKWOOD_DT
253 help
254 Say 'Y' here if you want your kernel to support the LaCie
255 Network Space Max v2 NAS, using Flattened Device Tree.
256
257config MACH_NETSPACE_MINI_V2_DT
258 bool "LaCie Network Space Mini v2 NAS (Flattened Device Tree)"
259 select ARCH_KIRKWOOD_DT
260 help
261 Say 'Y' here if you want your kernel to support the LaCie
262 Network Space Mini v2 NAS using Flattened Device Tree.
263
264 This board is embedded in a product named CloudBox, which
265 provides automatic backup on a 100GB cloud storage. This
266 should not confused with a more recent LaCie NAS also named
267 CloudBox. For this last, the disk capacity is 1TB or above.
268
269config MACH_NETSPACE_V2_DT
270 bool "LaCie Network Space v2 NAS (Flattened Device Tree)"
271 select ARCH_KIRKWOOD_DT
272 help
273 Say 'Y' here if you want your kernel to support the LaCie
274 Network Space v2 NAS, using Flattened Device Tree.
275
276config MACH_OPENBLOCKS_A6_DT
277 bool "Plat'Home OpenBlocks A6 (Flattened Device Tree)"
278 select ARCH_KIRKWOOD_DT
279 help
280 Say 'Y' here if you want your kernel to support the
281 Plat'Home OpenBlocks A6 (Flattened Device Tree).
282
283config MACH_READYNAS_DT
284 bool "NETGEAR ReadyNAS Duo v2 (Flattened Device Tree)"
285 select ARCH_KIRKWOOD_DT
286 select ARM_APPENDED_DTB
287 select ARM_ATAG_DTB_COMPAT
288 help
289 Say 'Y' here if you want your kernel to support the
290 NETGEAR ReadyNAS Duo v2 using Fattened Device Tree.
291
292config MACH_SHEEVAPLUG_DT
293 bool "Marvell (eSATA) SheevaPlug (Flattened Device Tree)"
294 select ARCH_KIRKWOOD_DT
295 help
296 Say 'Y' here if you want your kernel to support the
297 Marvell (eSATA) SheevaPlug (Flattened Device Tree).
298
299config MACH_TOPKICK_DT
300 bool "USI Topkick (Flattened Device Tree)"
301 select ARCH_KIRKWOOD_DT
302 help
303 Say 'Y' here if you want your kernel to support the
304 USI Topkick, using Flattened Device Tree
305
306config MACH_TS219_DT
307 bool "Device Tree for QNAP TS-11X, TS-21X NAS"
308 select ARCH_KIRKWOOD_DT
309 select ARM_APPENDED_DTB
310 select ARM_ATAG_DTB_COMPAT
311 select POWER_RESET_QNAP
312 help
313 Say 'Y' here if you want your kernel to support the QNAP
314 TS-110, TS-119, TS-119P+, TS-210, TS-219, TS-219P and
315 TS-219P+ Turbo NAS devices using Fattened Device Tree.
316 There are two different Device Tree descriptions, depending
317 on if the device is based on an if the board uses the MV6281
318 or MV6282. If you have the wrong one, the buttons will not
319 work.
320 115
321endmenu 116endmenu
322 117
diff --git a/arch/arm/mach-kirkwood/Makefile b/arch/arm/mach-kirkwood/Makefile
index ac4cd75dd499..d1f8e3d0793b 100644
--- a/arch/arm/mach-kirkwood/Makefile
+++ b/arch/arm/mach-kirkwood/Makefile
@@ -1,44 +1,14 @@
1obj-y += common.o irq.o pcie.o mpp.o 1obj-y += common.o pcie.o
2 2obj-$(CONFIG_KIRKWOOD_LEGACY) += irq.o mpp.o
3obj-$(CONFIG_MACH_D2NET_V2) += d2net_v2-setup.o lacie_v2-common.o 3obj-$(CONFIG_MACH_D2NET_V2) += d2net_v2-setup.o lacie_v2-common.o
4obj-$(CONFIG_MACH_DOCKSTAR) += dockstar-setup.o
5obj-$(CONFIG_MACH_ESATA_SHEEVAPLUG) += sheevaplug-setup.o
6obj-$(CONFIG_MACH_GURUPLUG) += guruplug-setup.o
7obj-$(CONFIG_MACH_INETSPACE_V2) += netspace_v2-setup.o lacie_v2-common.o
8obj-$(CONFIG_MACH_MV88F6281GTW_GE) += mv88f6281gtw_ge-setup.o
9obj-$(CONFIG_MACH_NET2BIG_V2) += netxbig_v2-setup.o lacie_v2-common.o 4obj-$(CONFIG_MACH_NET2BIG_V2) += netxbig_v2-setup.o lacie_v2-common.o
10obj-$(CONFIG_MACH_NET5BIG_V2) += netxbig_v2-setup.o lacie_v2-common.o 5obj-$(CONFIG_MACH_NET5BIG_V2) += netxbig_v2-setup.o lacie_v2-common.o
11obj-$(CONFIG_MACH_NETSPACE_MAX_V2) += netspace_v2-setup.o lacie_v2-common.o
12obj-$(CONFIG_MACH_NETSPACE_V2) += netspace_v2-setup.o lacie_v2-common.o
13obj-$(CONFIG_MACH_OPENRD) += openrd-setup.o 6obj-$(CONFIG_MACH_OPENRD) += openrd-setup.o
14obj-$(CONFIG_MACH_RD88F6192_NAS) += rd88f6192-nas-setup.o 7obj-$(CONFIG_MACH_RD88F6192_NAS) += rd88f6192-nas-setup.o
15obj-$(CONFIG_MACH_RD88F6281) += rd88f6281-setup.o 8obj-$(CONFIG_MACH_RD88F6281) += rd88f6281-setup.o
16obj-$(CONFIG_MACH_SHEEVAPLUG) += sheevaplug-setup.o
17obj-$(CONFIG_MACH_T5325) += t5325-setup.o 9obj-$(CONFIG_MACH_T5325) += t5325-setup.o
18obj-$(CONFIG_MACH_TS219) += ts219-setup.o tsx1x-common.o 10obj-$(CONFIG_MACH_TS219) += ts219-setup.o tsx1x-common.o
19obj-$(CONFIG_MACH_TS41X) += ts41x-setup.o tsx1x-common.o 11obj-$(CONFIG_MACH_TS41X) += ts41x-setup.o tsx1x-common.o
20 12
21obj-$(CONFIG_ARCH_KIRKWOOD_DT) += board-dt.o 13obj-$(CONFIG_ARCH_KIRKWOOD_DT) += board-dt.o
22obj-$(CONFIG_MACH_CLOUDBOX_DT) += board-ns2.o 14obj-$(CONFIG_MACH_MV88F6281GTW_GE_DT) += board-mv88f6281gtw_ge.o
23obj-$(CONFIG_MACH_DB88F628X_BP_DT) += board-db88f628x-bp.o
24obj-$(CONFIG_MACH_DLINK_KIRKWOOD_DT) += board-dnskw.o
25obj-$(CONFIG_MACH_DOCKSTAR_DT) += board-dockstar.o
26obj-$(CONFIG_MACH_DREAMPLUG_DT) += board-dreamplug.o
27obj-$(CONFIG_MACH_GOFLEXNET_DT) += board-goflexnet.o
28obj-$(CONFIG_MACH_GURUPLUG_DT) += board-guruplug.o
29obj-$(CONFIG_MACH_IB62X0_DT) += board-ib62x0.o
30obj-$(CONFIG_MACH_ICONNECT_DT) += board-iconnect.o
31obj-$(CONFIG_MACH_INETSPACE_V2_DT) += board-ns2.o
32obj-$(CONFIG_MACH_IOMEGA_IX2_200_DT) += board-iomega_ix2_200.o
33obj-$(CONFIG_MACH_KM_KIRKWOOD_DT) += board-km_kirkwood.o
34obj-$(CONFIG_MACH_LSXL_DT) += board-lsxl.o
35obj-$(CONFIG_MACH_MPLCEC4_DT) += board-mplcec4.o
36obj-$(CONFIG_MACH_NETSPACE_LITE_V2_DT) += board-ns2.o
37obj-$(CONFIG_MACH_NETSPACE_MAX_V2_DT) += board-ns2.o
38obj-$(CONFIG_MACH_NETSPACE_MINI_V2_DT) += board-ns2.o
39obj-$(CONFIG_MACH_NETSPACE_V2_DT) += board-ns2.o
40obj-$(CONFIG_MACH_OPENBLOCKS_A6_DT) += board-openblocks_a6.o
41obj-$(CONFIG_MACH_READYNAS_DT) += board-readynas.o
42obj-$(CONFIG_MACH_SHEEVAPLUG_DT) += board-sheevaplug.o
43obj-$(CONFIG_MACH_TOPKICK_DT) += board-usi_topkick.o
44obj-$(CONFIG_MACH_TS219_DT) += board-ts219.o tsx1x-common.o
diff --git a/arch/arm/mach-kirkwood/board-db88f628x-bp.c b/arch/arm/mach-kirkwood/board-db88f628x-bp.c
deleted file mode 100644
index 2f574bc8ed40..000000000000
--- a/arch/arm/mach-kirkwood/board-db88f628x-bp.c
+++ /dev/null
@@ -1,24 +0,0 @@
1/*
2 * Saeed Bishara <saeed@marvell.com>
3 *
4 * Marvell DB-88F628{1,2}-BP Development Board Setup
5 *
6 * This file is licensed under the terms of the GNU General Public
7 * License version 2. This program is licensed "as is" without any
8 * warranty of any kind, whether express or implied.
9 */
10
11#include <linux/kernel.h>
12#include <linux/init.h>
13#include <linux/of.h>
14#include <linux/mv643xx_eth.h>
15#include "common.h"
16
17static struct mv643xx_eth_platform_data db88f628x_ge00_data = {
18 .phy_addr = MV643XX_ETH_PHY_ADDR(8),
19};
20
21void __init db88f628x_init(void)
22{
23 kirkwood_ge00_init(&db88f628x_ge00_data);
24}
diff --git a/arch/arm/mach-kirkwood/board-dnskw.c b/arch/arm/mach-kirkwood/board-dnskw.c
deleted file mode 100644
index a1aa87f09180..000000000000
--- a/arch/arm/mach-kirkwood/board-dnskw.c
+++ /dev/null
@@ -1,43 +0,0 @@
1/*
2 * Copyright 2012 (C), Jamie Lentin <jm@lentin.co.uk>
3 *
4 * arch/arm/mach-kirkwood/board-dnskw.c
5 *
6 * D-link DNS-320 & DNS-325 NAS Init for drivers not converted to
7 * flattened device tree yet.
8 *
9 * This file is licensed under the terms of the GNU General Public
10 * License version 2. This program is licensed "as is" without any
11 * warranty of any kind, whether express or implied.
12 */
13
14#include <linux/kernel.h>
15#include <linux/init.h>
16#include <linux/platform_device.h>
17#include <linux/mv643xx_eth.h>
18#include <linux/gpio.h>
19#include "common.h"
20
21static struct mv643xx_eth_platform_data dnskw_ge00_data = {
22 .phy_addr = MV643XX_ETH_PHY_ADDR(8),
23};
24
25/* Register any GPIO for output and set the value */
26static void __init dnskw_gpio_register(unsigned gpio, char *name, int def)
27{
28 if (gpio_request(gpio, name) == 0 &&
29 gpio_direction_output(gpio, 0) == 0) {
30 gpio_set_value(gpio, def);
31 if (gpio_export(gpio, 0) != 0)
32 pr_err("dnskw: Failed to export GPIO %s\n", name);
33 } else
34 pr_err("dnskw: Failed to register %s\n", name);
35}
36
37void __init dnskw_init(void)
38{
39 kirkwood_ge00_init(&dnskw_ge00_data);
40
41 /* Set NAS to turn back on after a power failure */
42 dnskw_gpio_register(37, "dnskw:power:recover", 1);
43}
diff --git a/arch/arm/mach-kirkwood/board-dockstar.c b/arch/arm/mach-kirkwood/board-dockstar.c
deleted file mode 100644
index d7196db33984..000000000000
--- a/arch/arm/mach-kirkwood/board-dockstar.c
+++ /dev/null
@@ -1,32 +0,0 @@
1/*
2 * arch/arm/mach-kirkwood/board-dockstar.c
3 *
4 * Seagate FreeAgent Dockstar Board Init for drivers not converted to
5 * flattened device tree yet.
6 *
7 * This file is licensed under the terms of the GNU General Public
8 * License version 2. This program is licensed "as is" without any
9 * warranty of any kind, whether express or implied.
10 *
11 * Copied and modified for Seagate GoFlex Net support by
12 * Joshua Coombs <josh.coombs@gmail.com> based on ArchLinux ARM's
13 * GoFlex kernel patches.
14 *
15 */
16
17#include <linux/kernel.h>
18#include <linux/init.h>
19#include <linux/mv643xx_eth.h>
20#include "common.h"
21
22static struct mv643xx_eth_platform_data dockstar_ge00_data = {
23 .phy_addr = MV643XX_ETH_PHY_ADDR(0),
24};
25
26void __init dockstar_dt_init(void)
27{
28 /*
29 * Basic setup. Needs to be called early.
30 */
31 kirkwood_ge00_init(&dockstar_ge00_data);
32}
diff --git a/arch/arm/mach-kirkwood/board-dreamplug.c b/arch/arm/mach-kirkwood/board-dreamplug.c
deleted file mode 100644
index 0903242c00dc..000000000000
--- a/arch/arm/mach-kirkwood/board-dreamplug.c
+++ /dev/null
@@ -1,35 +0,0 @@
1/*
2 * Copyright 2012 (C), Jason Cooper <jason@lakedaemon.net>
3 *
4 * arch/arm/mach-kirkwood/board-dreamplug.c
5 *
6 * Marvell DreamPlug Reference Board Init for drivers not converted to
7 * flattened device tree yet.
8 *
9 * This file is licensed under the terms of the GNU General Public
10 * License version 2. This program is licensed "as is" without any
11 * warranty of any kind, whether express or implied.
12 */
13
14#include <linux/kernel.h>
15#include <linux/init.h>
16#include <linux/mv643xx_eth.h>
17#include <linux/gpio.h>
18#include "common.h"
19
20static struct mv643xx_eth_platform_data dreamplug_ge00_data = {
21 .phy_addr = MV643XX_ETH_PHY_ADDR(0),
22};
23
24static struct mv643xx_eth_platform_data dreamplug_ge01_data = {
25 .phy_addr = MV643XX_ETH_PHY_ADDR(1),
26};
27
28void __init dreamplug_init(void)
29{
30 /*
31 * Basic setup. Needs to be called early.
32 */
33 kirkwood_ge00_init(&dreamplug_ge00_data);
34 kirkwood_ge01_init(&dreamplug_ge01_data);
35}
diff --git a/arch/arm/mach-kirkwood/board-dt.c b/arch/arm/mach-kirkwood/board-dt.c
index 6e122ed3282f..82d3ad8e87cf 100644
--- a/arch/arm/mach-kirkwood/board-dt.c
+++ b/arch/arm/mach-kirkwood/board-dt.c
@@ -15,6 +15,9 @@
15#include <linux/of.h> 15#include <linux/of.h>
16#include <linux/of_platform.h> 16#include <linux/of_platform.h>
17#include <linux/clk-provider.h> 17#include <linux/clk-provider.h>
18#include <linux/clocksource.h>
19#include <linux/dma-mapping.h>
20#include <linux/irqchip.h>
18#include <linux/kexec.h> 21#include <linux/kexec.h>
19#include <asm/mach/arch.h> 22#include <asm/mach/arch.h>
20#include <asm/mach/map.h> 23#include <asm/mach/map.h>
@@ -49,10 +52,6 @@ static void __init kirkwood_legacy_clk_init(void)
49 orion_clkdev_add("1", "pcie", 52 orion_clkdev_add("1", "pcie",
50 of_clk_get_from_provider(&clkspec)); 53 of_clk_get_from_provider(&clkspec));
51 54
52 clkspec.args[0] = CGC_BIT_SDIO;
53 orion_clkdev_add(NULL, "mvsdio",
54 of_clk_get_from_provider(&clkspec));
55
56 /* 55 /*
57 * The ethernet interfaces forget the MAC address assigned by 56 * The ethernet interfaces forget the MAC address assigned by
58 * u-boot if the clocks are turned off. Until proper DT support 57 * u-boot if the clocks are turned off. Until proper DT support
@@ -60,19 +59,24 @@ static void __init kirkwood_legacy_clk_init(void)
60 */ 59 */
61 clkspec.args[0] = CGC_BIT_GE0; 60 clkspec.args[0] = CGC_BIT_GE0;
62 clk = of_clk_get_from_provider(&clkspec); 61 clk = of_clk_get_from_provider(&clkspec);
63 orion_clkdev_add(NULL, "mv643xx_eth_port.0", clk);
64 clk_prepare_enable(clk); 62 clk_prepare_enable(clk);
65 63
66 clkspec.args[0] = CGC_BIT_GE1; 64 clkspec.args[0] = CGC_BIT_GE1;
67 clk = of_clk_get_from_provider(&clkspec); 65 clk = of_clk_get_from_provider(&clkspec);
68 orion_clkdev_add(NULL, "mv643xx_eth_port.1", clk);
69 clk_prepare_enable(clk); 66 clk_prepare_enable(clk);
70} 67}
71 68
72static void __init kirkwood_of_clk_init(void) 69static void __init kirkwood_dt_time_init(void)
73{ 70{
74 of_clk_init(NULL); 71 of_clk_init(NULL);
75 kirkwood_legacy_clk_init(); 72 clocksource_of_init();
73}
74
75static void __init kirkwood_dt_init_early(void)
76{
77 mvebu_mbus_init("marvell,kirkwood-mbus",
78 BRIDGE_WINS_BASE, BRIDGE_WINS_SZ,
79 DDR_WINDOW_CPU_BASE, DDR_WINDOW_CPU_SZ);
76} 80}
77 81
78static void __init kirkwood_dt_init(void) 82static void __init kirkwood_dt_init(void)
@@ -87,14 +91,15 @@ static void __init kirkwood_dt_init(void)
87 */ 91 */
88 writel(readl(CPU_CONFIG) & ~CPU_CONFIG_ERROR_PROP, CPU_CONFIG); 92 writel(readl(CPU_CONFIG) & ~CPU_CONFIG_ERROR_PROP, CPU_CONFIG);
89 93
94 BUG_ON(mvebu_mbus_dt_init());
90 kirkwood_setup_wins(); 95 kirkwood_setup_wins();
91 96
92 kirkwood_l2_init(); 97 kirkwood_l2_init();
93 98
94 kirkwood_cpufreq_init(); 99 kirkwood_cpufreq_init();
95 100
96 /* Setup root of clk tree */ 101 /* Setup clocks for legacy devices */
97 kirkwood_of_clk_init(); 102 kirkwood_legacy_clk_init();
98 103
99 kirkwood_cpuidle_init(); 104 kirkwood_cpuidle_init();
100 105
@@ -102,105 +107,22 @@ static void __init kirkwood_dt_init(void)
102 kexec_reinit = kirkwood_enable_pcie; 107 kexec_reinit = kirkwood_enable_pcie;
103#endif 108#endif
104 109
105 if (of_machine_is_compatible("globalscale,dreamplug")) 110 if (of_machine_is_compatible("marvell,mv88f6281gtw-ge"))
106 dreamplug_init(); 111 mv88f6281gtw_ge_init();
107
108 if (of_machine_is_compatible("globalscale,guruplug"))
109 guruplug_dt_init();
110
111 if (of_machine_is_compatible("globalscale,sheevaplug"))
112 sheevaplug_dt_init();
113
114 if (of_machine_is_compatible("dlink,dns-kirkwood"))
115 dnskw_init();
116
117 if (of_machine_is_compatible("iom,iconnect"))
118 iconnect_init();
119
120 if (of_machine_is_compatible("raidsonic,ib-nas62x0"))
121 ib62x0_init();
122
123 if (of_machine_is_compatible("qnap,ts219"))
124 qnap_dt_ts219_init();
125
126 if (of_machine_is_compatible("seagate,dockstar"))
127 dockstar_dt_init();
128
129 if (of_machine_is_compatible("seagate,goflexnet"))
130 goflexnet_init();
131
132 if (of_machine_is_compatible("buffalo,lsxl"))
133 lsxl_init();
134
135 if (of_machine_is_compatible("iom,ix2-200"))
136 iomega_ix2_200_init();
137
138 if (of_machine_is_compatible("keymile,km_kirkwood"))
139 km_kirkwood_init();
140
141 if (of_machine_is_compatible("lacie,cloudbox") ||
142 of_machine_is_compatible("lacie,inetspace_v2") ||
143 of_machine_is_compatible("lacie,netspace_lite_v2") ||
144 of_machine_is_compatible("lacie,netspace_max_v2") ||
145 of_machine_is_compatible("lacie,netspace_mini_v2") ||
146 of_machine_is_compatible("lacie,netspace_v2"))
147 ns2_init();
148
149 if (of_machine_is_compatible("marvell,db-88f6281-bp") ||
150 of_machine_is_compatible("marvell,db-88f6282-bp"))
151 db88f628x_init();
152
153 if (of_machine_is_compatible("mpl,cec4"))
154 mplcec4_init();
155
156 if (of_machine_is_compatible("netgear,readynas-duo-v2"))
157 netgear_readynas_init();
158
159 if (of_machine_is_compatible("plathome,openblocks-a6"))
160 openblocks_a6_init();
161
162 if (of_machine_is_compatible("usi,topkick"))
163 usi_topkick_init();
164 112
165 of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); 113 of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
166} 114}
167 115
168static const char * const kirkwood_dt_board_compat[] = { 116static const char * const kirkwood_dt_board_compat[] = {
169 "globalscale,dreamplug", 117 "marvell,kirkwood",
170 "globalscale,guruplug",
171 "globalscale,sheevaplug",
172 "dlink,dns-320",
173 "dlink,dns-325",
174 "iom,iconnect",
175 "raidsonic,ib-nas62x0",
176 "qnap,ts219",
177 "seagate,dockstar",
178 "seagate,goflexnet",
179 "buffalo,lsxl",
180 "iom,ix2-200",
181 "keymile,km_kirkwood",
182 "lacie,cloudbox",
183 "lacie,inetspace_v2",
184 "lacie,netspace_lite_v2",
185 "lacie,netspace_max_v2",
186 "lacie,netspace_mini_v2",
187 "lacie,netspace_v2",
188 "marvell,db-88f6281-bp",
189 "marvell,db-88f6282-bp",
190 "mpl,cec4",
191 "netgear,readynas-duo-v2",
192 "plathome,openblocks-a6",
193 "usi,topkick",
194 "zyxel,nsa310",
195 NULL 118 NULL
196}; 119};
197 120
198DT_MACHINE_START(KIRKWOOD_DT, "Marvell Kirkwood (Flattened Device Tree)") 121DT_MACHINE_START(KIRKWOOD_DT, "Marvell Kirkwood (Flattened Device Tree)")
199 /* Maintainer: Jason Cooper <jason@lakedaemon.net> */ 122 /* Maintainer: Jason Cooper <jason@lakedaemon.net> */
200 .map_io = kirkwood_map_io, 123 .map_io = kirkwood_map_io,
201 .init_early = kirkwood_init_early, 124 .init_early = kirkwood_dt_init_early,
202 .init_irq = orion_dt_init_irq, 125 .init_time = kirkwood_dt_time_init,
203 .init_time = kirkwood_timer_init,
204 .init_machine = kirkwood_dt_init, 126 .init_machine = kirkwood_dt_init,
205 .restart = kirkwood_restart, 127 .restart = kirkwood_restart,
206 .dt_compat = kirkwood_dt_board_compat, 128 .dt_compat = kirkwood_dt_board_compat,
diff --git a/arch/arm/mach-kirkwood/board-goflexnet.c b/arch/arm/mach-kirkwood/board-goflexnet.c
deleted file mode 100644
index 9db979aec82e..000000000000
--- a/arch/arm/mach-kirkwood/board-goflexnet.c
+++ /dev/null
@@ -1,34 +0,0 @@
1/*
2 * Copyright 2012 (C), Jason Cooper <jason@lakedaemon.net>
3 *
4 * arch/arm/mach-kirkwood/board-goflexnet.c
5 *
6 * Seagate GoFlext Net Board Init for drivers not converted to
7 * flattened device tree yet.
8 *
9 * This file is licensed under the terms of the GNU General Public
10 * License version 2. This program is licensed "as is" without any
11 * warranty of any kind, whether express or implied.
12 *
13 * Copied and modified for Seagate GoFlex Net support by
14 * Joshua Coombs <josh.coombs@gmail.com> based on ArchLinux ARM's
15 * GoFlex kernel patches.
16 *
17 */
18
19#include <linux/kernel.h>
20#include <linux/init.h>
21#include <linux/mv643xx_eth.h>
22#include "common.h"
23
24static struct mv643xx_eth_platform_data goflexnet_ge00_data = {
25 .phy_addr = MV643XX_ETH_PHY_ADDR(0),
26};
27
28void __init goflexnet_init(void)
29{
30 /*
31 * Basic setup. Needs to be called early.
32 */
33 kirkwood_ge00_init(&goflexnet_ge00_data);
34}
diff --git a/arch/arm/mach-kirkwood/board-guruplug.c b/arch/arm/mach-kirkwood/board-guruplug.c
deleted file mode 100644
index a857163954a5..000000000000
--- a/arch/arm/mach-kirkwood/board-guruplug.c
+++ /dev/null
@@ -1,33 +0,0 @@
1/*
2 * arch/arm/mach-kirkwood/board-guruplug.c
3 *
4 * Marvell Guruplug Reference Board Init for drivers not converted to
5 * flattened device tree yet.
6 *
7 * This file is licensed under the terms of the GNU General Public
8 * License version 2. This program is licensed "as is" without any
9 * warranty of any kind, whether express or implied.
10 */
11
12#include <linux/kernel.h>
13#include <linux/init.h>
14#include <linux/mv643xx_eth.h>
15#include <linux/gpio.h>
16#include "common.h"
17
18static struct mv643xx_eth_platform_data guruplug_ge00_data = {
19 .phy_addr = MV643XX_ETH_PHY_ADDR(0),
20};
21
22static struct mv643xx_eth_platform_data guruplug_ge01_data = {
23 .phy_addr = MV643XX_ETH_PHY_ADDR(1),
24};
25
26void __init guruplug_dt_init(void)
27{
28 /*
29 * Basic setup. Needs to be called early.
30 */
31 kirkwood_ge00_init(&guruplug_ge00_data);
32 kirkwood_ge01_init(&guruplug_ge01_data);
33}
diff --git a/arch/arm/mach-kirkwood/board-ib62x0.c b/arch/arm/mach-kirkwood/board-ib62x0.c
deleted file mode 100644
index 9a857ae83984..000000000000
--- a/arch/arm/mach-kirkwood/board-ib62x0.c
+++ /dev/null
@@ -1,29 +0,0 @@
1/*
2 * Copyright 2012 (C), Simon Baatz <gmbnomis@gmail.com>
3 *
4 * arch/arm/mach-kirkwood/board-ib62x0.c
5 *
6 * RaidSonic ICY BOX IB-NAS6210 & IB-NAS6220 init for drivers not
7 * converted to flattened device tree yet.
8 *
9 * This file is licensed under the terms of the GNU General Public
10 * License version 2. This program is licensed "as is" without any
11 * warranty of any kind, whether express or implied.
12 */
13
14#include <linux/kernel.h>
15#include <linux/init.h>
16#include <linux/mv643xx_eth.h>
17#include "common.h"
18
19static struct mv643xx_eth_platform_data ib62x0_ge00_data = {
20 .phy_addr = MV643XX_ETH_PHY_ADDR(8),
21};
22
23void __init ib62x0_init(void)
24{
25 /*
26 * Basic setup. Needs to be called early.
27 */
28 kirkwood_ge00_init(&ib62x0_ge00_data);
29}
diff --git a/arch/arm/mach-kirkwood/board-iconnect.c b/arch/arm/mach-kirkwood/board-iconnect.c
deleted file mode 100644
index 98b5ad1bba90..000000000000
--- a/arch/arm/mach-kirkwood/board-iconnect.c
+++ /dev/null
@@ -1,24 +0,0 @@
1/*
2 * arch/arm/mach-kirkwood/board-iconnect.c
3 *
4 * Iomega i-connect Board Setup
5 *
6 * This file is licensed under the terms of the GNU General Public
7 * License version 2. This program is licensed "as is" without any
8 * warranty of any kind, whether express or implied.
9 */
10
11#include <linux/kernel.h>
12#include <linux/init.h>
13#include <linux/of.h>
14#include <linux/mv643xx_eth.h>
15#include "common.h"
16
17static struct mv643xx_eth_platform_data iconnect_ge00_data = {
18 .phy_addr = MV643XX_ETH_PHY_ADDR(11),
19};
20
21void __init iconnect_init(void)
22{
23 kirkwood_ge00_init(&iconnect_ge00_data);
24}
diff --git a/arch/arm/mach-kirkwood/board-iomega_ix2_200.c b/arch/arm/mach-kirkwood/board-iomega_ix2_200.c
deleted file mode 100644
index e5f70415905a..000000000000
--- a/arch/arm/mach-kirkwood/board-iomega_ix2_200.c
+++ /dev/null
@@ -1,34 +0,0 @@
1/*
2 * arch/arm/mach-kirkwood/board-iomega_ix2_200.c
3 *
4 * Iomega StorCenter ix2-200
5 *
6 * This file is licensed under the terms of the GNU General Public
7 * License version 2. This program is licensed "as is" without any
8 * warranty of any kind, whether express or implied.
9 */
10
11#include <linux/kernel.h>
12#include <linux/init.h>
13#include <linux/mv643xx_eth.h>
14#include <linux/ethtool.h>
15#include "common.h"
16
17static struct mv643xx_eth_platform_data iomega_ix2_200_ge00_data = {
18 .phy_addr = MV643XX_ETH_PHY_NONE,
19 .speed = SPEED_1000,
20 .duplex = DUPLEX_FULL,
21};
22
23static struct mv643xx_eth_platform_data iomega_ix2_200_ge01_data = {
24 .phy_addr = MV643XX_ETH_PHY_ADDR(11),
25};
26
27void __init iomega_ix2_200_init(void)
28{
29 /*
30 * Basic setup. Needs to be called early.
31 */
32 kirkwood_ge00_init(&iomega_ix2_200_ge00_data);
33 kirkwood_ge01_init(&iomega_ix2_200_ge01_data);
34}
diff --git a/arch/arm/mach-kirkwood/board-km_kirkwood.c b/arch/arm/mach-kirkwood/board-km_kirkwood.c
deleted file mode 100644
index 44e4605ba0bf..000000000000
--- a/arch/arm/mach-kirkwood/board-km_kirkwood.c
+++ /dev/null
@@ -1,44 +0,0 @@
1/*
2 * Copyright 2012 2012 KEYMILE AG, CH-3097 Bern
3 * Valentin Longchamp <valentin.longchamp@keymile.com>
4 *
5 * arch/arm/mach-kirkwood/board-km_kirkwood.c
6 *
7 * Keymile km_kirkwood Reference Desing Init for drivers not converted to
8 * flattened device tree yet.
9 *
10 * This file is licensed under the terms of the GNU General Public
11 * License version 2. This program is licensed "as is" without any
12 * warranty of any kind, whether express or implied.
13 */
14
15#include <linux/kernel.h>
16#include <linux/init.h>
17#include <linux/mv643xx_eth.h>
18#include <linux/clk.h>
19#include <linux/clk-private.h>
20#include "common.h"
21
22static struct mv643xx_eth_platform_data km_kirkwood_ge00_data = {
23 .phy_addr = MV643XX_ETH_PHY_ADDR(0),
24};
25
26void __init km_kirkwood_init(void)
27{
28 struct clk *sata_clk;
29 /*
30 * Our variant of kirkwood (integrated in the Bobcat) hangs on accessing
31 * SATA bits (14-15) of the Clock Gating Control Register. Since these
32 * devices are also not present in this variant, their clocks get
33 * disabled because unused when clk_disable_unused() gets called.
34 * That's why we change the flags to these clocks to CLK_IGNORE_UNUSED
35 */
36 sata_clk = clk_get_sys("sata_mv.0", "0");
37 if (!IS_ERR(sata_clk))
38 sata_clk->flags |= CLK_IGNORE_UNUSED;
39 sata_clk = clk_get_sys("sata_mv.0", "1");
40 if (!IS_ERR(sata_clk))
41 sata_clk->flags |= CLK_IGNORE_UNUSED;
42
43 kirkwood_ge00_init(&km_kirkwood_ge00_data);
44}
diff --git a/arch/arm/mach-kirkwood/board-lsxl.c b/arch/arm/mach-kirkwood/board-lsxl.c
deleted file mode 100644
index 348395238df6..000000000000
--- a/arch/arm/mach-kirkwood/board-lsxl.c
+++ /dev/null
@@ -1,36 +0,0 @@
1/*
2 * Copyright 2012 (C), Michael Walle <michael@walle.cc>
3 *
4 * arch/arm/mach-kirkwood/board-lsxl.c
5 *
6 * Buffalo Linkstation LS-XHL and LS-CHLv2 init for drivers not
7 * converted to flattened device tree yet.
8 *
9 * This file is licensed under the terms of the GNU General Public
10 * License version 2. This program is licensed "as is" without any
11 * warranty of any kind, whether express or implied.
12 */
13
14#include <linux/kernel.h>
15#include <linux/init.h>
16#include <linux/platform_device.h>
17#include <linux/mv643xx_eth.h>
18#include "common.h"
19
20static struct mv643xx_eth_platform_data lsxl_ge00_data = {
21 .phy_addr = MV643XX_ETH_PHY_ADDR(0),
22};
23
24static struct mv643xx_eth_platform_data lsxl_ge01_data = {
25 .phy_addr = MV643XX_ETH_PHY_ADDR(8),
26};
27
28void __init lsxl_init(void)
29{
30 /*
31 * Basic setup. Needs to be called early.
32 */
33
34 kirkwood_ge00_init(&lsxl_ge00_data);
35 kirkwood_ge01_init(&lsxl_ge01_data);
36}
diff --git a/arch/arm/mach-kirkwood/board-mplcec4.c b/arch/arm/mach-kirkwood/board-mplcec4.c
deleted file mode 100644
index 938712e248f1..000000000000
--- a/arch/arm/mach-kirkwood/board-mplcec4.c
+++ /dev/null
@@ -1,35 +0,0 @@
1/*
2 * Copyright (C) 2012 MPL AG, Switzerland
3 * Stefan Peter <s.peter@mpl.ch>
4 *
5 * arch/arm/mach-kirkwood/board-mplcec4.c
6 *
7 * This file is licensed under the terms of the GNU General Public
8 * License version 2. This program is licensed "as is" without any
9 * warranty of any kind, whether express or implied.
10 */
11
12#include <linux/kernel.h>
13#include <linux/init.h>
14#include <linux/mv643xx_eth.h>
15#include "common.h"
16
17static struct mv643xx_eth_platform_data mplcec4_ge00_data = {
18 .phy_addr = MV643XX_ETH_PHY_ADDR(1),
19};
20
21static struct mv643xx_eth_platform_data mplcec4_ge01_data = {
22 .phy_addr = MV643XX_ETH_PHY_ADDR(2),
23};
24
25void __init mplcec4_init(void)
26{
27 /*
28 * Basic setup. Needs to be called early.
29 */
30 kirkwood_ge00_init(&mplcec4_ge00_data);
31 kirkwood_ge01_init(&mplcec4_ge01_data);
32}
33
34
35
diff --git a/arch/arm/mach-kirkwood/board-mv88f6281gtw_ge.c b/arch/arm/mach-kirkwood/board-mv88f6281gtw_ge.c
new file mode 100644
index 000000000000..ee5eea678c11
--- /dev/null
+++ b/arch/arm/mach-kirkwood/board-mv88f6281gtw_ge.c
@@ -0,0 +1,50 @@
1/*
2 * arch/arm/mach-kirkwood/board-mv88f6281gtw_ge.c
3 *
4 * Marvell 88F6281 GTW GE Board Setup
5 *
6 * This file is licensed under the terms of the GNU General Public
7 * License version 2. This program is licensed "as is" without any
8 * warranty of any kind, whether express or implied.
9 */
10
11#include <linux/kernel.h>
12#include <linux/init.h>
13#include <linux/platform_device.h>
14#include <linux/irq.h>
15#include <linux/timer.h>
16#include <linux/mv643xx_eth.h>
17#include <linux/ethtool.h>
18#include <linux/gpio.h>
19#include <net/dsa.h>
20#include <asm/mach-types.h>
21#include <asm/mach/arch.h>
22#include <asm/mach/pci.h>
23#include <mach/kirkwood.h>
24#include "common.h"
25
26static struct mv643xx_eth_platform_data mv88f6281gtw_ge_ge00_data = {
27 .phy_addr = MV643XX_ETH_PHY_NONE,
28 .speed = SPEED_1000,
29 .duplex = DUPLEX_FULL,
30};
31
32static struct dsa_chip_data mv88f6281gtw_ge_switch_chip_data = {
33 .port_names[0] = "lan1",
34 .port_names[1] = "lan2",
35 .port_names[2] = "lan3",
36 .port_names[3] = "lan4",
37 .port_names[4] = "wan",
38 .port_names[5] = "cpu",
39};
40
41static struct dsa_platform_data mv88f6281gtw_ge_switch_plat_data = {
42 .nr_chips = 1,
43 .chip = &mv88f6281gtw_ge_switch_chip_data,
44};
45
46void __init mv88f6281gtw_ge_init(void)
47{
48 kirkwood_ge00_init(&mv88f6281gtw_ge_ge00_data);
49 kirkwood_ge00_switch_init(&mv88f6281gtw_ge_switch_plat_data, NO_IRQ);
50}
diff --git a/arch/arm/mach-kirkwood/board-ns2.c b/arch/arm/mach-kirkwood/board-ns2.c
deleted file mode 100644
index f8f660525ace..000000000000
--- a/arch/arm/mach-kirkwood/board-ns2.c
+++ /dev/null
@@ -1,35 +0,0 @@
1/*
2 * Copyright 2012 (C), Simon Guinot <simon.guinot@sequanux.org>
3 *
4 * arch/arm/mach-kirkwood/board-ns2.c
5 *
6 * LaCie Network Space v2 board (and parents) initialization for drivers
7 * not converted to flattened device tree yet.
8 *
9 * This file is licensed under the terms of the GNU General Public
10 * License version 2. This program is licensed "as is" without any
11 * warranty of any kind, whether express or implied.
12 */
13
14#include <linux/kernel.h>
15#include <linux/init.h>
16#include <linux/platform_device.h>
17#include <linux/mv643xx_eth.h>
18#include <linux/of.h>
19#include "common.h"
20
21static struct mv643xx_eth_platform_data ns2_ge00_data = {
22 .phy_addr = MV643XX_ETH_PHY_ADDR(8),
23};
24
25void __init ns2_init(void)
26{
27 /*
28 * Basic setup. Needs to be called early.
29 */
30 if (of_machine_is_compatible("lacie,cloudbox") ||
31 of_machine_is_compatible("lacie,netspace_lite_v2") ||
32 of_machine_is_compatible("lacie,netspace_mini_v2"))
33 ns2_ge00_data.phy_addr = MV643XX_ETH_PHY_ADDR(0);
34 kirkwood_ge00_init(&ns2_ge00_data);
35}
diff --git a/arch/arm/mach-kirkwood/board-openblocks_a6.c b/arch/arm/mach-kirkwood/board-openblocks_a6.c
deleted file mode 100644
index b11d8fdeca93..000000000000
--- a/arch/arm/mach-kirkwood/board-openblocks_a6.c
+++ /dev/null
@@ -1,26 +0,0 @@
1/*
2 * Copyright 2012 Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
3 *
4 * arch/arm/mach-kirkwood/board-openblocks_a6.c
5 *
6 * This file is licensed under the terms of the GNU General Public
7 * License version 2. This program is licensed "as is" without any
8 * warranty of any kind, whether express or implied.
9 */
10
11#include <linux/kernel.h>
12#include <linux/init.h>
13#include <linux/mv643xx_eth.h>
14#include "common.h"
15
16static struct mv643xx_eth_platform_data openblocks_ge00_data = {
17 .phy_addr = MV643XX_ETH_PHY_ADDR(0),
18};
19
20void __init openblocks_a6_init(void)
21{
22 /*
23 * Basic setup. Needs to be called early.
24 */
25 kirkwood_ge00_init(&openblocks_ge00_data);
26}
diff --git a/arch/arm/mach-kirkwood/board-readynas.c b/arch/arm/mach-kirkwood/board-readynas.c
deleted file mode 100644
index 341b82d9cadb..000000000000
--- a/arch/arm/mach-kirkwood/board-readynas.c
+++ /dev/null
@@ -1,27 +0,0 @@
1/*
2 * NETGEAR ReadyNAS Duo v2 Board setup for drivers not already
3 * converted to DT.
4 *
5 * Copyright (C) 2013, Arnaud EBALARD <arno@natisbad.org>
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version
10 * 2 of the License, or (at your option) any later version.
11 */
12
13#include <linux/kernel.h>
14#include <linux/init.h>
15#include <linux/platform_device.h>
16#include <linux/mv643xx_eth.h>
17#include <mach/kirkwood.h>
18#include "common.h"
19
20static struct mv643xx_eth_platform_data netgear_readynas_ge00_data = {
21 .phy_addr = MV643XX_ETH_PHY_ADDR(0),
22};
23
24void __init netgear_readynas_init(void)
25{
26 kirkwood_ge00_init(&netgear_readynas_ge00_data);
27}
diff --git a/arch/arm/mach-kirkwood/board-sheevaplug.c b/arch/arm/mach-kirkwood/board-sheevaplug.c
deleted file mode 100644
index fa389373ca74..000000000000
--- a/arch/arm/mach-kirkwood/board-sheevaplug.c
+++ /dev/null
@@ -1,27 +0,0 @@
1/*
2 * arch/arm/mach-kirkwood/board-sheevaplug.c
3 *
4 * Marvell Sheevaplug Reference Board Init for drivers not converted to
5 * flattened device tree yet.
6 *
7 * This file is licensed under the terms of the GNU General Public
8 * License version 2. This program is licensed "as is" without any
9 * warranty of any kind, whether express or implied.
10 */
11
12#include <linux/kernel.h>
13#include <linux/init.h>
14#include <linux/mv643xx_eth.h>
15#include "common.h"
16
17static struct mv643xx_eth_platform_data sheevaplug_ge00_data = {
18 .phy_addr = MV643XX_ETH_PHY_ADDR(0),
19};
20
21void __init sheevaplug_dt_init(void)
22{
23 /*
24 * Basic setup. Needs to be called early.
25 */
26 kirkwood_ge00_init(&sheevaplug_ge00_data);
27}
diff --git a/arch/arm/mach-kirkwood/board-ts219.c b/arch/arm/mach-kirkwood/board-ts219.c
deleted file mode 100644
index 860f44ab457d..000000000000
--- a/arch/arm/mach-kirkwood/board-ts219.c
+++ /dev/null
@@ -1,40 +0,0 @@
1/*
2 *
3 * QNAP TS-11x/TS-21x Turbo NAS Board Setup via DT
4 *
5 * Copyright (C) 2012 Andrew Lunn <andrew@lunn.ch>
6 *
7 * Based on the board file ts219-setup.c:
8 *
9 * Copyright (C) 2009 Martin Michlmayr <tbm@cyrius.com>
10 * Copyright (C) 2008 Byron Bradley <byron.bbradley@gmail.com>
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version
15 * 2 of the License, or (at your option) any later version.
16 */
17
18#include <linux/kernel.h>
19#include <linux/init.h>
20#include <linux/platform_device.h>
21#include <linux/mv643xx_eth.h>
22#include <asm/mach-types.h>
23#include <asm/mach/arch.h>
24#include <mach/kirkwood.h>
25#include "common.h"
26
27static struct mv643xx_eth_platform_data qnap_ts219_ge00_data = {
28 .phy_addr = MV643XX_ETH_PHY_ADDR(8),
29};
30
31void __init qnap_dt_ts219_init(void)
32{
33 u32 dev, rev;
34
35 kirkwood_pcie_id(&dev, &rev);
36 if (dev == MV88F6282_DEV_ID)
37 qnap_ts219_ge00_data.phy_addr = MV643XX_ETH_PHY_ADDR(0);
38
39 kirkwood_ge00_init(&qnap_ts219_ge00_data);
40}
diff --git a/arch/arm/mach-kirkwood/board-usi_topkick.c b/arch/arm/mach-kirkwood/board-usi_topkick.c
deleted file mode 100644
index 1cc04ec33f0b..000000000000
--- a/arch/arm/mach-kirkwood/board-usi_topkick.c
+++ /dev/null
@@ -1,29 +0,0 @@
1/*
2 * Copyright 2012 (C), Jason Cooper <jason@lakedaemon.net>
3 *
4 * arch/arm/mach-kirkwood/board-usi_topkick.c
5 *
6 * USI Topkick Init for drivers not converted to flattened device tree yet.
7 *
8 * This file is licensed under the terms of the GNU General Public
9 * License version 2. This program is licensed "as is" without any
10 * warranty of any kind, whether express or implied.
11 */
12
13#include <linux/kernel.h>
14#include <linux/init.h>
15#include <linux/mv643xx_eth.h>
16#include <linux/gpio.h>
17#include "common.h"
18
19static struct mv643xx_eth_platform_data topkick_ge00_data = {
20 .phy_addr = MV643XX_ETH_PHY_ADDR(0),
21};
22
23void __init usi_topkick_init(void)
24{
25 /*
26 * Basic setup. Needs to be called early.
27 */
28 kirkwood_ge00_init(&topkick_ge00_data);
29}
diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c
index e9238b5567ee..176761134a66 100644
--- a/arch/arm/mach-kirkwood/common.c
+++ b/arch/arm/mach-kirkwood/common.c
@@ -37,6 +37,12 @@
37#include <linux/platform_data/dma-mv_xor.h> 37#include <linux/platform_data/dma-mv_xor.h>
38#include "common.h" 38#include "common.h"
39 39
40/* These can go away once Kirkwood uses the mvebu-mbus DT binding */
41#define KIRKWOOD_MBUS_NAND_TARGET 0x01
42#define KIRKWOOD_MBUS_NAND_ATTR 0x2f
43#define KIRKWOOD_MBUS_SRAM_TARGET 0x03
44#define KIRKWOOD_MBUS_SRAM_ATTR 0x01
45
40/***************************************************************************** 46/*****************************************************************************
41 * I/O Address Mapping 47 * I/O Address Mapping
42 ****************************************************************************/ 48 ****************************************************************************/
@@ -264,7 +270,7 @@ void __init kirkwood_clk_init(void)
264 orion_clkdev_add(NULL, MV_XOR_NAME ".1", xor1); 270 orion_clkdev_add(NULL, MV_XOR_NAME ".1", xor1);
265 orion_clkdev_add("0", "pcie", pex0); 271 orion_clkdev_add("0", "pcie", pex0);
266 orion_clkdev_add("1", "pcie", pex1); 272 orion_clkdev_add("1", "pcie", pex1);
267 orion_clkdev_add(NULL, "kirkwood-i2s", audio); 273 orion_clkdev_add(NULL, "mvebu-audio", audio);
268 orion_clkdev_add(NULL, MV64XXX_I2C_CTLR_NAME ".0", runit); 274 orion_clkdev_add(NULL, MV64XXX_I2C_CTLR_NAME ".0", runit);
269 orion_clkdev_add(NULL, MV64XXX_I2C_CTLR_NAME ".1", runit); 275 orion_clkdev_add(NULL, MV64XXX_I2C_CTLR_NAME ".1", runit);
270 276
@@ -528,10 +534,6 @@ void __init kirkwood_cpuidle_init(void)
528void __init kirkwood_init_early(void) 534void __init kirkwood_init_early(void)
529{ 535{
530 orion_time_set_base(TIMER_VIRT_BASE); 536 orion_time_set_base(TIMER_VIRT_BASE);
531
532 mvebu_mbus_init("marvell,kirkwood-mbus",
533 BRIDGE_WINS_BASE, BRIDGE_WINS_SZ,
534 DDR_WINDOW_CPU_BASE, DDR_WINDOW_CPU_SZ);
535} 537}
536 538
537int kirkwood_tclk; 539int kirkwood_tclk;
@@ -560,7 +562,7 @@ void __init kirkwood_timer_init(void)
560/***************************************************************************** 562/*****************************************************************************
561 * Audio 563 * Audio
562 ****************************************************************************/ 564 ****************************************************************************/
563static struct resource kirkwood_i2s_resources[] = { 565static struct resource kirkwood_audio_resources[] = {
564 [0] = { 566 [0] = {
565 .start = AUDIO_PHYS_BASE, 567 .start = AUDIO_PHYS_BASE,
566 .end = AUDIO_PHYS_BASE + SZ_16K - 1, 568 .end = AUDIO_PHYS_BASE + SZ_16K - 1,
@@ -573,29 +575,23 @@ static struct resource kirkwood_i2s_resources[] = {
573 }, 575 },
574}; 576};
575 577
576static struct kirkwood_asoc_platform_data kirkwood_i2s_data = { 578static struct kirkwood_asoc_platform_data kirkwood_audio_data = {
577 .burst = 128, 579 .burst = 128,
578}; 580};
579 581
580static struct platform_device kirkwood_i2s_device = { 582static struct platform_device kirkwood_audio_device = {
581 .name = "kirkwood-i2s", 583 .name = "mvebu-audio",
582 .id = -1, 584 .id = -1,
583 .num_resources = ARRAY_SIZE(kirkwood_i2s_resources), 585 .num_resources = ARRAY_SIZE(kirkwood_audio_resources),
584 .resource = kirkwood_i2s_resources, 586 .resource = kirkwood_audio_resources,
585 .dev = { 587 .dev = {
586 .platform_data = &kirkwood_i2s_data, 588 .platform_data = &kirkwood_audio_data,
587 }, 589 },
588}; 590};
589 591
590static struct platform_device kirkwood_pcm_device = {
591 .name = "kirkwood-pcm-audio",
592 .id = -1,
593};
594
595void __init kirkwood_audio_init(void) 592void __init kirkwood_audio_init(void)
596{ 593{
597 platform_device_register(&kirkwood_i2s_device); 594 platform_device_register(&kirkwood_audio_device);
598 platform_device_register(&kirkwood_pcm_device);
599} 595}
600 596
601/***************************************************************************** 597/*****************************************************************************
@@ -672,10 +668,14 @@ char * __init kirkwood_id(void)
672 668
673void __init kirkwood_setup_wins(void) 669void __init kirkwood_setup_wins(void)
674{ 670{
675 mvebu_mbus_add_window("nand", KIRKWOOD_NAND_MEM_PHYS_BASE, 671 mvebu_mbus_add_window_by_id(KIRKWOOD_MBUS_NAND_TARGET,
676 KIRKWOOD_NAND_MEM_SIZE); 672 KIRKWOOD_MBUS_NAND_ATTR,
677 mvebu_mbus_add_window("sram", KIRKWOOD_SRAM_PHYS_BASE, 673 KIRKWOOD_NAND_MEM_PHYS_BASE,
678 KIRKWOOD_SRAM_SIZE); 674 KIRKWOOD_NAND_MEM_SIZE);
675 mvebu_mbus_add_window_by_id(KIRKWOOD_MBUS_SRAM_TARGET,
676 KIRKWOOD_MBUS_SRAM_ATTR,
677 KIRKWOOD_SRAM_PHYS_BASE,
678 KIRKWOOD_SRAM_SIZE);
679} 679}
680 680
681void __init kirkwood_l2_init(void) 681void __init kirkwood_l2_init(void)
@@ -703,6 +703,10 @@ void __init kirkwood_init(void)
703 */ 703 */
704 writel(readl(CPU_CONFIG) & ~CPU_CONFIG_ERROR_PROP, CPU_CONFIG); 704 writel(readl(CPU_CONFIG) & ~CPU_CONFIG_ERROR_PROP, CPU_CONFIG);
705 705
706 BUG_ON(mvebu_mbus_init("marvell,kirkwood-mbus",
707 BRIDGE_WINS_BASE, BRIDGE_WINS_SZ,
708 DDR_WINDOW_CPU_BASE, DDR_WINDOW_CPU_SZ));
709
706 kirkwood_setup_wins(); 710 kirkwood_setup_wins();
707 711
708 kirkwood_l2_init(); 712 kirkwood_l2_init();
diff --git a/arch/arm/mach-kirkwood/common.h b/arch/arm/mach-kirkwood/common.h
index fcf3ba682e24..1296de94febf 100644
--- a/arch/arm/mach-kirkwood/common.h
+++ b/arch/arm/mach-kirkwood/common.h
@@ -59,119 +59,10 @@ void kirkwood_restart(enum reboot_mode, const char *);
59void kirkwood_clk_init(void); 59void kirkwood_clk_init(void);
60 60
61/* board init functions for boards not fully converted to fdt */ 61/* board init functions for boards not fully converted to fdt */
62#ifdef CONFIG_MACH_DREAMPLUG_DT 62#ifdef CONFIG_MACH_MV88F6281GTW_GE_DT
63void dreamplug_init(void); 63void mv88f6281gtw_ge_init(void);
64#else 64#else
65static inline void dreamplug_init(void) {}; 65static inline void mv88f6281gtw_ge_init(void) {};
66#endif
67#ifdef CONFIG_MACH_GURUPLUG_DT
68void guruplug_dt_init(void);
69#else
70static inline void guruplug_dt_init(void) {};
71#endif
72#ifdef CONFIG_MACH_SHEEVAPLUG_DT
73void sheevaplug_dt_init(void);
74#else
75static inline void sheevaplug_dt_init(void) {};
76#endif
77#ifdef CONFIG_MACH_TS219_DT
78void qnap_dt_ts219_init(void);
79#else
80static inline void qnap_dt_ts219_init(void) {};
81#endif
82
83#ifdef CONFIG_MACH_DLINK_KIRKWOOD_DT
84void dnskw_init(void);
85#else
86static inline void dnskw_init(void) {};
87#endif
88
89#ifdef CONFIG_MACH_ICONNECT_DT
90void iconnect_init(void);
91#else
92static inline void iconnect_init(void) {};
93#endif
94
95#ifdef CONFIG_MACH_IB62X0_DT
96void ib62x0_init(void);
97#else
98static inline void ib62x0_init(void) {};
99#endif
100
101#ifdef CONFIG_MACH_DOCKSTAR_DT
102void dockstar_dt_init(void);
103#else
104static inline void dockstar_dt_init(void) {};
105#endif
106
107#ifdef CONFIG_MACH_GOFLEXNET_DT
108void goflexnet_init(void);
109#else
110static inline void goflexnet_init(void) {};
111#endif
112
113#ifdef CONFIG_MACH_LSXL_DT
114void lsxl_init(void);
115#else
116static inline void lsxl_init(void) {};
117#endif
118
119#ifdef CONFIG_MACH_IOMEGA_IX2_200_DT
120void iomega_ix2_200_init(void);
121#else
122static inline void iomega_ix2_200_init(void) {};
123#endif
124
125#ifdef CONFIG_MACH_KM_KIRKWOOD_DT
126void km_kirkwood_init(void);
127#else
128static inline void km_kirkwood_init(void) {};
129#endif
130
131#ifdef CONFIG_MACH_DB88F628X_BP_DT
132void db88f628x_init(void);
133#else
134static inline void db88f628x_init(void) {};
135#endif
136
137#ifdef CONFIG_MACH_MPLCEC4_DT
138void mplcec4_init(void);
139#else
140static inline void mplcec4_init(void) {};
141#endif
142
143#if defined(CONFIG_MACH_INETSPACE_V2_DT) || \
144 defined(CONFIG_MACH_NETSPACE_V2_DT) || \
145 defined(CONFIG_MACH_NETSPACE_MAX_V2_DT) || \
146 defined(CONFIG_MACH_NETSPACE_LITE_V2_DT) || \
147 defined(CONFIG_MACH_NETSPACE_MINI_V2_DT)
148void ns2_init(void);
149#else
150static inline void ns2_init(void) {};
151#endif
152
153#ifdef CONFIG_MACH_OPENBLOCKS_A6_DT
154void openblocks_a6_init(void);
155#else
156static inline void openblocks_a6_init(void) {};
157#endif
158
159#ifdef CONFIG_MACH_READYNAS_DT
160void netgear_readynas_init(void);
161#else
162static inline void netgear_readynas_init(void) {};
163#endif
164
165#ifdef CONFIG_MACH_TOPKICK_DT
166void usi_topkick_init(void);
167#else
168static inline void usi_topkick_init(void) {};
169#endif
170
171#ifdef CONFIG_MACH_CLOUDBOX_DT
172void cloudbox_init(void);
173#else
174static inline void cloudbox_init(void) {};
175#endif 66#endif
176 67
177/* early init functions not converted to fdt yet */ 68/* early init functions not converted to fdt yet */
diff --git a/arch/arm/mach-kirkwood/dockstar-setup.c b/arch/arm/mach-kirkwood/dockstar-setup.c
deleted file mode 100644
index 060ccf9cb63f..000000000000
--- a/arch/arm/mach-kirkwood/dockstar-setup.c
+++ /dev/null
@@ -1,111 +0,0 @@
1/*
2 * arch/arm/mach-kirkwood/dockstar-setup.c
3 *
4 * Seagate FreeAgent DockStar Setup
5 *
6 * This file is licensed under the terms of the GNU General Public
7 * License version 2. This program is licensed "as is" without any
8 * warranty of any kind, whether express or implied.
9 */
10
11#include <linux/kernel.h>
12#include <linux/init.h>
13#include <linux/platform_device.h>
14#include <linux/ata_platform.h>
15#include <linux/mtd/partitions.h>
16#include <linux/mv643xx_eth.h>
17#include <linux/gpio.h>
18#include <linux/leds.h>
19#include <asm/mach-types.h>
20#include <asm/mach/arch.h>
21#include <mach/kirkwood.h>
22#include "common.h"
23#include "mpp.h"
24
25static struct mtd_partition dockstar_nand_parts[] = {
26 {
27 .name = "u-boot",
28 .offset = 0,
29 .size = SZ_1M
30 }, {
31 .name = "uImage",
32 .offset = MTDPART_OFS_NXTBLK,
33 .size = SZ_4M
34 }, {
35 .name = "root",
36 .offset = MTDPART_OFS_NXTBLK,
37 .size = MTDPART_SIZ_FULL
38 },
39};
40
41static struct mv643xx_eth_platform_data dockstar_ge00_data = {
42 .phy_addr = MV643XX_ETH_PHY_ADDR(0),
43};
44
45static struct gpio_led dockstar_led_pins[] = {
46 {
47 .name = "dockstar:green:health",
48 .default_trigger = "default-on",
49 .gpio = 46,
50 .active_low = 1,
51 },
52 {
53 .name = "dockstar:orange:misc",
54 .default_trigger = "none",
55 .gpio = 47,
56 .active_low = 1,
57 },
58};
59
60static struct gpio_led_platform_data dockstar_led_data = {
61 .leds = dockstar_led_pins,
62 .num_leds = ARRAY_SIZE(dockstar_led_pins),
63};
64
65static struct platform_device dockstar_leds = {
66 .name = "leds-gpio",
67 .id = -1,
68 .dev = {
69 .platform_data = &dockstar_led_data,
70 }
71};
72
73static unsigned int dockstar_mpp_config[] __initdata = {
74 MPP29_GPIO, /* USB Power Enable */
75 MPP46_GPIO, /* LED green */
76 MPP47_GPIO, /* LED orange */
77 0
78};
79
80static void __init dockstar_init(void)
81{
82 /*
83 * Basic setup. Needs to be called early.
84 */
85 kirkwood_init();
86
87 /* setup gpio pin select */
88 kirkwood_mpp_conf(dockstar_mpp_config);
89
90 kirkwood_uart0_init();
91 kirkwood_nand_init(ARRAY_AND_SIZE(dockstar_nand_parts), 25);
92
93 if (gpio_request(29, "USB Power Enable") != 0 ||
94 gpio_direction_output(29, 1) != 0)
95 pr_err("can't set up GPIO 29 (USB Power Enable)\n");
96 kirkwood_ehci_init();
97
98 kirkwood_ge00_init(&dockstar_ge00_data);
99
100 platform_device_register(&dockstar_leds);
101}
102
103MACHINE_START(DOCKSTAR, "Seagate FreeAgent DockStar")
104 .atag_offset = 0x100,
105 .init_machine = dockstar_init,
106 .map_io = kirkwood_map_io,
107 .init_early = kirkwood_init_early,
108 .init_irq = kirkwood_init_irq,
109 .init_time = kirkwood_timer_init,
110 .restart = kirkwood_restart,
111MACHINE_END
diff --git a/arch/arm/mach-kirkwood/guruplug-setup.c b/arch/arm/mach-kirkwood/guruplug-setup.c
deleted file mode 100644
index 08dd739aa709..000000000000
--- a/arch/arm/mach-kirkwood/guruplug-setup.c
+++ /dev/null
@@ -1,133 +0,0 @@
1/*
2 * arch/arm/mach-kirkwood/guruplug-setup.c
3 *
4 * Marvell GuruPlug Reference Board Setup
5 *
6 * This file is licensed under the terms of the GNU General Public
7 * License version 2. This program is licensed "as is" without any
8 * warranty of any kind, whether express or implied.
9 */
10
11#include <linux/kernel.h>
12#include <linux/init.h>
13#include <linux/platform_device.h>
14#include <linux/mtd/partitions.h>
15#include <linux/ata_platform.h>
16#include <linux/mv643xx_eth.h>
17#include <linux/gpio.h>
18#include <linux/leds.h>
19#include <asm/mach-types.h>
20#include <asm/mach/arch.h>
21#include <mach/kirkwood.h>
22#include <linux/platform_data/mmc-mvsdio.h>
23#include "common.h"
24#include "mpp.h"
25
26static struct mtd_partition guruplug_nand_parts[] = {
27 {
28 .name = "u-boot",
29 .offset = 0,
30 .size = SZ_1M
31 }, {
32 .name = "uImage",
33 .offset = MTDPART_OFS_NXTBLK,
34 .size = SZ_4M
35 }, {
36 .name = "root",
37 .offset = MTDPART_OFS_NXTBLK,
38 .size = MTDPART_SIZ_FULL
39 },
40};
41
42static struct mv643xx_eth_platform_data guruplug_ge00_data = {
43 .phy_addr = MV643XX_ETH_PHY_ADDR(0),
44};
45
46static struct mv643xx_eth_platform_data guruplug_ge01_data = {
47 .phy_addr = MV643XX_ETH_PHY_ADDR(1),
48};
49
50static struct mv_sata_platform_data guruplug_sata_data = {
51 .n_ports = 1,
52};
53
54static struct mvsdio_platform_data guruplug_mvsdio_data = {
55 /* unfortunately the CD signal has not been connected */
56 .gpio_card_detect = -1,
57 .gpio_write_protect = -1,
58};
59
60static struct gpio_led guruplug_led_pins[] = {
61 {
62 .name = "guruplug:red:health",
63 .gpio = 46,
64 .active_low = 1,
65 },
66 {
67 .name = "guruplug:green:health",
68 .gpio = 47,
69 .active_low = 1,
70 },
71 {
72 .name = "guruplug:red:wmode",
73 .gpio = 48,
74 .active_low = 1,
75 },
76 {
77 .name = "guruplug:green:wmode",
78 .gpio = 49,
79 .active_low = 1,
80 },
81};
82
83static struct gpio_led_platform_data guruplug_led_data = {
84 .leds = guruplug_led_pins,
85 .num_leds = ARRAY_SIZE(guruplug_led_pins),
86};
87
88static struct platform_device guruplug_leds = {
89 .name = "leds-gpio",
90 .id = -1,
91 .dev = {
92 .platform_data = &guruplug_led_data,
93 }
94};
95
96static unsigned int guruplug_mpp_config[] __initdata = {
97 MPP46_GPIO, /* M_RLED */
98 MPP47_GPIO, /* M_GLED */
99 MPP48_GPIO, /* B_RLED */
100 MPP49_GPIO, /* B_GLED */
101 0
102};
103
104static void __init guruplug_init(void)
105{
106 /*
107 * Basic setup. Needs to be called early.
108 */
109 kirkwood_init();
110 kirkwood_mpp_conf(guruplug_mpp_config);
111
112 kirkwood_uart0_init();
113 kirkwood_nand_init(ARRAY_AND_SIZE(guruplug_nand_parts), 25);
114
115 kirkwood_ehci_init();
116 kirkwood_ge00_init(&guruplug_ge00_data);
117 kirkwood_ge01_init(&guruplug_ge01_data);
118 kirkwood_sata_init(&guruplug_sata_data);
119 kirkwood_sdio_init(&guruplug_mvsdio_data);
120
121 platform_device_register(&guruplug_leds);
122}
123
124MACHINE_START(GURUPLUG, "Marvell GuruPlug Reference Board")
125 /* Maintainer: Siddarth Gore <gores@marvell.com> */
126 .atag_offset = 0x100,
127 .init_machine = guruplug_init,
128 .map_io = kirkwood_map_io,
129 .init_early = kirkwood_init_early,
130 .init_irq = kirkwood_init_irq,
131 .init_time = kirkwood_timer_init,
132 .restart = kirkwood_restart,
133MACHINE_END
diff --git a/arch/arm/mach-kirkwood/include/mach/debug-macro.S b/arch/arm/mach-kirkwood/include/mach/debug-macro.S
deleted file mode 100644
index f785d401a607..000000000000
--- a/arch/arm/mach-kirkwood/include/mach/debug-macro.S
+++ /dev/null
@@ -1,19 +0,0 @@
1/*
2 * arch/arm/mach-kirkwood/include/mach/debug-macro.S
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7*/
8
9#include <mach/bridge-regs.h>
10
11 .macro addruart, rp, rv, tmp
12 ldr \rp, =KIRKWOOD_REGS_PHYS_BASE
13 ldr \rv, =KIRKWOOD_REGS_VIRT_BASE
14 orr \rp, \rp, #0x00012000
15 orr \rv, \rv, #0x00012000
16 .endm
17
18#define UART_SHIFT 2
19#include <asm/hardware/debug-8250.S>
diff --git a/arch/arm/mach-kirkwood/mv88f6281gtw_ge-setup.c b/arch/arm/mach-kirkwood/mv88f6281gtw_ge-setup.c
deleted file mode 100644
index ba384b992bef..000000000000
--- a/arch/arm/mach-kirkwood/mv88f6281gtw_ge-setup.c
+++ /dev/null
@@ -1,172 +0,0 @@
1/*
2 * arch/arm/mach-kirkwood/mv88f6281gtw_ge-setup.c
3 *
4 * Marvell 88F6281 GTW GE Board Setup
5 *
6 * This file is licensed under the terms of the GNU General Public
7 * License version 2. This program is licensed "as is" without any
8 * warranty of any kind, whether express or implied.
9 */
10
11#include <linux/kernel.h>
12#include <linux/init.h>
13#include <linux/platform_device.h>
14#include <linux/pci.h>
15#include <linux/irq.h>
16#include <linux/mtd/physmap.h>
17#include <linux/timer.h>
18#include <linux/mv643xx_eth.h>
19#include <linux/ethtool.h>
20#include <linux/gpio.h>
21#include <linux/leds.h>
22#include <linux/input.h>
23#include <linux/gpio_keys.h>
24#include <linux/spi/flash.h>
25#include <linux/spi/spi.h>
26#include <net/dsa.h>
27#include <asm/mach-types.h>
28#include <asm/mach/arch.h>
29#include <asm/mach/pci.h>
30#include <mach/kirkwood.h>
31#include "common.h"
32#include "mpp.h"
33
34static struct mv643xx_eth_platform_data mv88f6281gtw_ge_ge00_data = {
35 .phy_addr = MV643XX_ETH_PHY_NONE,
36 .speed = SPEED_1000,
37 .duplex = DUPLEX_FULL,
38};
39
40static struct dsa_chip_data mv88f6281gtw_ge_switch_chip_data = {
41 .port_names[0] = "lan1",
42 .port_names[1] = "lan2",
43 .port_names[2] = "lan3",
44 .port_names[3] = "lan4",
45 .port_names[4] = "wan",
46 .port_names[5] = "cpu",
47};
48
49static struct dsa_platform_data mv88f6281gtw_ge_switch_plat_data = {
50 .nr_chips = 1,
51 .chip = &mv88f6281gtw_ge_switch_chip_data,
52};
53
54static const struct flash_platform_data mv88f6281gtw_ge_spi_slave_data = {
55 .type = "mx25l12805d",
56};
57
58static struct spi_board_info __initdata mv88f6281gtw_ge_spi_slave_info[] = {
59 {
60 .modalias = "m25p80",
61 .platform_data = &mv88f6281gtw_ge_spi_slave_data,
62 .irq = -1,
63 .max_speed_hz = 50000000,
64 .bus_num = 0,
65 .chip_select = 0,
66 },
67};
68
69static struct gpio_keys_button mv88f6281gtw_ge_button_pins[] = {
70 {
71 .code = KEY_RESTART,
72 .gpio = 47,
73 .desc = "SWR Button",
74 .active_low = 1,
75 }, {
76 .code = KEY_WPS_BUTTON,
77 .gpio = 46,
78 .desc = "WPS Button",
79 .active_low = 1,
80 },
81};
82
83static struct gpio_keys_platform_data mv88f6281gtw_ge_button_data = {
84 .buttons = mv88f6281gtw_ge_button_pins,
85 .nbuttons = ARRAY_SIZE(mv88f6281gtw_ge_button_pins),
86};
87
88static struct platform_device mv88f6281gtw_ge_buttons = {
89 .name = "gpio-keys",
90 .id = -1,
91 .num_resources = 0,
92 .dev = {
93 .platform_data = &mv88f6281gtw_ge_button_data,
94 },
95};
96
97static struct gpio_led mv88f6281gtw_ge_led_pins[] = {
98 {
99 .name = "gtw:green:Status",
100 .gpio = 20,
101 .active_low = 0,
102 }, {
103 .name = "gtw:red:Status",
104 .gpio = 21,
105 .active_low = 0,
106 }, {
107 .name = "gtw:green:USB",
108 .gpio = 12,
109 .active_low = 0,
110 },
111};
112
113static struct gpio_led_platform_data mv88f6281gtw_ge_led_data = {
114 .leds = mv88f6281gtw_ge_led_pins,
115 .num_leds = ARRAY_SIZE(mv88f6281gtw_ge_led_pins),
116};
117
118static struct platform_device mv88f6281gtw_ge_leds = {
119 .name = "leds-gpio",
120 .id = -1,
121 .dev = {
122 .platform_data = &mv88f6281gtw_ge_led_data,
123 },
124};
125
126static unsigned int mv88f6281gtw_ge_mpp_config[] __initdata = {
127 MPP12_GPO, /* Status#_USB pin */
128 MPP20_GPIO, /* Status#_GLED pin */
129 MPP21_GPIO, /* Status#_RLED pin */
130 MPP46_GPIO, /* WPS_Switch pin */
131 MPP47_GPIO, /* SW_Init pin */
132 0
133};
134
135static void __init mv88f6281gtw_ge_init(void)
136{
137 /*
138 * Basic setup. Needs to be called early.
139 */
140 kirkwood_init();
141 kirkwood_mpp_conf(mv88f6281gtw_ge_mpp_config);
142
143 kirkwood_ehci_init();
144 kirkwood_ge00_init(&mv88f6281gtw_ge_ge00_data);
145 kirkwood_ge00_switch_init(&mv88f6281gtw_ge_switch_plat_data, NO_IRQ);
146 spi_register_board_info(mv88f6281gtw_ge_spi_slave_info,
147 ARRAY_SIZE(mv88f6281gtw_ge_spi_slave_info));
148 kirkwood_spi_init();
149 kirkwood_uart0_init();
150 platform_device_register(&mv88f6281gtw_ge_leds);
151 platform_device_register(&mv88f6281gtw_ge_buttons);
152}
153
154static int __init mv88f6281gtw_ge_pci_init(void)
155{
156 if (machine_is_mv88f6281gtw_ge())
157 kirkwood_pcie_init(KW_PCIE0);
158
159 return 0;
160}
161subsys_initcall(mv88f6281gtw_ge_pci_init);
162
163MACHINE_START(MV88F6281GTW_GE, "Marvell 88F6281 GTW GE Board")
164 /* Maintainer: Lennert Buytenhek <buytenh@marvell.com> */
165 .atag_offset = 0x100,
166 .init_machine = mv88f6281gtw_ge_init,
167 .map_io = kirkwood_map_io,
168 .init_early = kirkwood_init_early,
169 .init_irq = kirkwood_init_irq,
170 .init_time = kirkwood_timer_init,
171 .restart = kirkwood_restart,
172MACHINE_END
diff --git a/arch/arm/mach-kirkwood/netspace_v2-setup.c b/arch/arm/mach-kirkwood/netspace_v2-setup.c
deleted file mode 100644
index 3b706611da8e..000000000000
--- a/arch/arm/mach-kirkwood/netspace_v2-setup.c
+++ /dev/null
@@ -1,293 +0,0 @@
1/*
2 * arch/arm/mach-kirkwood/netspace_v2-setup.c
3 *
4 * LaCie Network Space v2 board setup
5 *
6 * Copyright (C) 2009 Simon Guinot <sguinot@lacie.com>
7 * Copyright (C) 2009 Benoît Canet <benoit.canet@gmail.com>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 */
23
24#include <linux/kernel.h>
25#include <linux/init.h>
26#include <linux/platform_device.h>
27#include <linux/ata_platform.h>
28#include <linux/mv643xx_eth.h>
29#include <linux/input.h>
30#include <linux/gpio.h>
31#include <linux/gpio_keys.h>
32#include <linux/leds.h>
33#include <linux/gpio-fan.h>
34#include <asm/mach-types.h>
35#include <asm/mach/arch.h>
36#include <mach/kirkwood.h>
37#include <linux/platform_data/leds-kirkwood-ns2.h>
38#include "common.h"
39#include "mpp.h"
40#include "lacie_v2-common.h"
41
42/*****************************************************************************
43 * Ethernet
44 ****************************************************************************/
45
46static struct mv643xx_eth_platform_data netspace_v2_ge00_data = {
47 .phy_addr = MV643XX_ETH_PHY_ADDR(8),
48};
49
50/*****************************************************************************
51 * SATA
52 ****************************************************************************/
53
54static struct mv_sata_platform_data netspace_v2_sata_data = {
55 .n_ports = 2,
56};
57
58/*****************************************************************************
59 * GPIO keys
60 ****************************************************************************/
61
62#define NETSPACE_V2_PUSH_BUTTON 32
63
64static struct gpio_keys_button netspace_v2_buttons[] = {
65 [0] = {
66 .code = KEY_POWER,
67 .gpio = NETSPACE_V2_PUSH_BUTTON,
68 .desc = "Power push button",
69 .active_low = 0,
70 },
71};
72
73static struct gpio_keys_platform_data netspace_v2_button_data = {
74 .buttons = netspace_v2_buttons,
75 .nbuttons = ARRAY_SIZE(netspace_v2_buttons),
76};
77
78static struct platform_device netspace_v2_gpio_buttons = {
79 .name = "gpio-keys",
80 .id = -1,
81 .dev = {
82 .platform_data = &netspace_v2_button_data,
83 },
84};
85
86/*****************************************************************************
87 * GPIO LEDs
88 ****************************************************************************/
89
90#define NETSPACE_V2_GPIO_RED_LED 12
91
92static struct gpio_led netspace_v2_gpio_led_pins[] = {
93 {
94 .name = "ns_v2:red:fail",
95 .gpio = NETSPACE_V2_GPIO_RED_LED,
96 },
97};
98
99static struct gpio_led_platform_data netspace_v2_gpio_leds_data = {
100 .num_leds = ARRAY_SIZE(netspace_v2_gpio_led_pins),
101 .leds = netspace_v2_gpio_led_pins,
102};
103
104static struct platform_device netspace_v2_gpio_leds = {
105 .name = "leds-gpio",
106 .id = -1,
107 .dev = {
108 .platform_data = &netspace_v2_gpio_leds_data,
109 },
110};
111
112/*****************************************************************************
113 * Dual-GPIO CPLD LEDs
114 ****************************************************************************/
115
116#define NETSPACE_V2_GPIO_BLUE_LED_SLOW 29
117#define NETSPACE_V2_GPIO_BLUE_LED_CMD 30
118
119static struct ns2_led netspace_v2_led_pins[] = {
120 {
121 .name = "ns_v2:blue:sata",
122 .cmd = NETSPACE_V2_GPIO_BLUE_LED_CMD,
123 .slow = NETSPACE_V2_GPIO_BLUE_LED_SLOW,
124 },
125};
126
127static struct ns2_led_platform_data netspace_v2_leds_data = {
128 .num_leds = ARRAY_SIZE(netspace_v2_led_pins),
129 .leds = netspace_v2_led_pins,
130};
131
132static struct platform_device netspace_v2_leds = {
133 .name = "leds-ns2",
134 .id = -1,
135 .dev = {
136 .platform_data = &netspace_v2_leds_data,
137 },
138};
139
140/*****************************************************************************
141 * GPIO fan
142 ****************************************************************************/
143
144/* Designed for fan 40x40x16: ADDA AD0412LB-D50 6000rpm@12v */
145static struct gpio_fan_speed netspace_max_v2_fan_speed[] = {
146 { 0, 0 },
147 { 1500, 15 },
148 { 1700, 14 },
149 { 1800, 13 },
150 { 2100, 12 },
151 { 3100, 11 },
152 { 3300, 10 },
153 { 4300, 9 },
154 { 5500, 8 },
155};
156
157static unsigned netspace_max_v2_fan_ctrl[] = { 22, 7, 33, 23 };
158
159static struct gpio_fan_alarm netspace_max_v2_fan_alarm = {
160 .gpio = 25,
161 .active_low = 1,
162};
163
164static struct gpio_fan_platform_data netspace_max_v2_fan_data = {
165 .num_ctrl = ARRAY_SIZE(netspace_max_v2_fan_ctrl),
166 .ctrl = netspace_max_v2_fan_ctrl,
167 .alarm = &netspace_max_v2_fan_alarm,
168 .num_speed = ARRAY_SIZE(netspace_max_v2_fan_speed),
169 .speed = netspace_max_v2_fan_speed,
170};
171
172static struct platform_device netspace_max_v2_gpio_fan = {
173 .name = "gpio-fan",
174 .id = -1,
175 .dev = {
176 .platform_data = &netspace_max_v2_fan_data,
177 },
178};
179
180/*****************************************************************************
181 * General Setup
182 ****************************************************************************/
183
184static unsigned int netspace_v2_mpp_config[] __initdata = {
185 MPP0_SPI_SCn,
186 MPP1_SPI_MOSI,
187 MPP2_SPI_SCK,
188 MPP3_SPI_MISO,
189 MPP4_NF_IO6,
190 MPP5_NF_IO7,
191 MPP6_SYSRST_OUTn,
192 MPP7_GPO, /* Fan speed (bit 1) */
193 MPP8_TW0_SDA,
194 MPP9_TW0_SCK,
195 MPP10_UART0_TXD,
196 MPP11_UART0_RXD,
197 MPP12_GPO, /* Red led */
198 MPP14_GPIO, /* USB fuse */
199 MPP16_GPIO, /* SATA 0 power */
200 MPP17_GPIO, /* SATA 1 power */
201 MPP18_NF_IO0,
202 MPP19_NF_IO1,
203 MPP20_SATA1_ACTn,
204 MPP21_SATA0_ACTn,
205 MPP22_GPIO, /* Fan speed (bit 0) */
206 MPP23_GPIO, /* Fan power */
207 MPP24_GPIO, /* USB mode select */
208 MPP25_GPIO, /* Fan rotation fail */
209 MPP26_GPIO, /* USB device vbus */
210 MPP28_GPIO, /* USB enable host vbus */
211 MPP29_GPIO, /* Blue led (slow register) */
212 MPP30_GPIO, /* Blue led (command register) */
213 MPP31_GPIO, /* Board power off */
214 MPP32_GPIO, /* Power button (0 = Released, 1 = Pushed) */
215 MPP33_GPO, /* Fan speed (bit 2) */
216 0
217};
218
219#define NETSPACE_V2_GPIO_POWER_OFF 31
220
221static void netspace_v2_power_off(void)
222{
223 gpio_set_value(NETSPACE_V2_GPIO_POWER_OFF, 1);
224}
225
226static void __init netspace_v2_init(void)
227{
228 /*
229 * Basic setup. Needs to be called early.
230 */
231 kirkwood_init();
232 kirkwood_mpp_conf(netspace_v2_mpp_config);
233
234 if (machine_is_netspace_max_v2())
235 lacie_v2_hdd_power_init(2);
236 else
237 lacie_v2_hdd_power_init(1);
238
239 kirkwood_ehci_init();
240 kirkwood_ge00_init(&netspace_v2_ge00_data);
241 kirkwood_sata_init(&netspace_v2_sata_data);
242 kirkwood_uart0_init();
243 lacie_v2_register_flash();
244 lacie_v2_register_i2c_devices();
245
246 platform_device_register(&netspace_v2_leds);
247 platform_device_register(&netspace_v2_gpio_leds);
248 platform_device_register(&netspace_v2_gpio_buttons);
249 if (machine_is_netspace_max_v2())
250 platform_device_register(&netspace_max_v2_gpio_fan);
251
252 if (gpio_request(NETSPACE_V2_GPIO_POWER_OFF, "power-off") == 0 &&
253 gpio_direction_output(NETSPACE_V2_GPIO_POWER_OFF, 0) == 0)
254 pm_power_off = netspace_v2_power_off;
255 else
256 pr_err("netspace_v2: failed to configure power-off GPIO\n");
257}
258
259#ifdef CONFIG_MACH_NETSPACE_V2
260MACHINE_START(NETSPACE_V2, "LaCie Network Space v2")
261 .atag_offset = 0x100,
262 .init_machine = netspace_v2_init,
263 .map_io = kirkwood_map_io,
264 .init_early = kirkwood_init_early,
265 .init_irq = kirkwood_init_irq,
266 .init_time = kirkwood_timer_init,
267 .restart = kirkwood_restart,
268MACHINE_END
269#endif
270
271#ifdef CONFIG_MACH_INETSPACE_V2
272MACHINE_START(INETSPACE_V2, "LaCie Internet Space v2")
273 .atag_offset = 0x100,
274 .init_machine = netspace_v2_init,
275 .map_io = kirkwood_map_io,
276 .init_early = kirkwood_init_early,
277 .init_irq = kirkwood_init_irq,
278 .init_time = kirkwood_timer_init,
279 .restart = kirkwood_restart,
280MACHINE_END
281#endif
282
283#ifdef CONFIG_MACH_NETSPACE_MAX_V2
284MACHINE_START(NETSPACE_MAX_V2, "LaCie Network Space Max v2")
285 .atag_offset = 0x100,
286 .init_machine = netspace_v2_init,
287 .map_io = kirkwood_map_io,
288 .init_early = kirkwood_init_early,
289 .init_irq = kirkwood_init_irq,
290 .init_time = kirkwood_timer_init,
291 .restart = kirkwood_restart,
292MACHINE_END
293#endif
diff --git a/arch/arm/mach-kirkwood/openrd-setup.c b/arch/arm/mach-kirkwood/openrd-setup.c
index 6a6eb548307d..e5cf84103583 100644
--- a/arch/arm/mach-kirkwood/openrd-setup.c
+++ b/arch/arm/mach-kirkwood/openrd-setup.c
@@ -158,7 +158,8 @@ static void __init openrd_init(void)
158 kirkwood_mpp_conf(openrd_mpp_config); 158 kirkwood_mpp_conf(openrd_mpp_config);
159 159
160 kirkwood_uart0_init(); 160 kirkwood_uart0_init();
161 kirkwood_nand_init(ARRAY_AND_SIZE(openrd_nand_parts), 25); 161 kirkwood_nand_init(openrd_nand_parts, ARRAY_SIZE(openrd_nand_parts),
162 25);
162 163
163 kirkwood_ehci_init(); 164 kirkwood_ehci_init();
164 165
diff --git a/arch/arm/mach-kirkwood/pcie.c b/arch/arm/mach-kirkwood/pcie.c
index ddcb09f5bdd3..12d86f39f380 100644
--- a/arch/arm/mach-kirkwood/pcie.c
+++ b/arch/arm/mach-kirkwood/pcie.c
@@ -20,6 +20,16 @@
20#include <mach/bridge-regs.h> 20#include <mach/bridge-regs.h>
21#include "common.h" 21#include "common.h"
22 22
23/* These can go away once Kirkwood uses the mvebu-mbus DT binding */
24#define KIRKWOOD_MBUS_PCIE0_MEM_TARGET 0x4
25#define KIRKWOOD_MBUS_PCIE0_MEM_ATTR 0xe8
26#define KIRKWOOD_MBUS_PCIE0_IO_TARGET 0x4
27#define KIRKWOOD_MBUS_PCIE0_IO_ATTR 0xe0
28#define KIRKWOOD_MBUS_PCIE1_MEM_TARGET 0x4
29#define KIRKWOOD_MBUS_PCIE1_MEM_ATTR 0xd8
30#define KIRKWOOD_MBUS_PCIE1_IO_TARGET 0x4
31#define KIRKWOOD_MBUS_PCIE1_IO_ATTR 0xd0
32
23static void kirkwood_enable_pcie_clk(const char *port) 33static void kirkwood_enable_pcie_clk(const char *port)
24{ 34{
25 struct clk *clk; 35 struct clk *clk;
@@ -254,26 +264,24 @@ static void __init add_pcie_port(int index, void __iomem *base)
254 264
255void __init kirkwood_pcie_init(unsigned int portmask) 265void __init kirkwood_pcie_init(unsigned int portmask)
256{ 266{
257 mvebu_mbus_add_window_remap_flags("pcie0.0", 267 mvebu_mbus_add_window_remap_by_id(KIRKWOOD_MBUS_PCIE0_IO_TARGET,
268 KIRKWOOD_MBUS_PCIE0_IO_ATTR,
258 KIRKWOOD_PCIE_IO_PHYS_BASE, 269 KIRKWOOD_PCIE_IO_PHYS_BASE,
259 KIRKWOOD_PCIE_IO_SIZE, 270 KIRKWOOD_PCIE_IO_SIZE,
260 KIRKWOOD_PCIE_IO_BUS_BASE, 271 KIRKWOOD_PCIE_IO_BUS_BASE);
261 MVEBU_MBUS_PCI_IO); 272 mvebu_mbus_add_window_by_id(KIRKWOOD_MBUS_PCIE0_MEM_TARGET,
262 mvebu_mbus_add_window_remap_flags("pcie0.0", 273 KIRKWOOD_MBUS_PCIE0_MEM_ATTR,
263 KIRKWOOD_PCIE_MEM_PHYS_BASE, 274 KIRKWOOD_PCIE_MEM_PHYS_BASE,
264 KIRKWOOD_PCIE_MEM_SIZE, 275 KIRKWOOD_PCIE_MEM_SIZE);
265 MVEBU_MBUS_NO_REMAP, 276 mvebu_mbus_add_window_remap_by_id(KIRKWOOD_MBUS_PCIE1_IO_TARGET,
266 MVEBU_MBUS_PCI_MEM); 277 KIRKWOOD_MBUS_PCIE1_IO_ATTR,
267 mvebu_mbus_add_window_remap_flags("pcie1.0",
268 KIRKWOOD_PCIE1_IO_PHYS_BASE, 278 KIRKWOOD_PCIE1_IO_PHYS_BASE,
269 KIRKWOOD_PCIE1_IO_SIZE, 279 KIRKWOOD_PCIE1_IO_SIZE,
270 KIRKWOOD_PCIE1_IO_BUS_BASE, 280 KIRKWOOD_PCIE1_IO_BUS_BASE);
271 MVEBU_MBUS_PCI_IO); 281 mvebu_mbus_add_window_by_id(KIRKWOOD_MBUS_PCIE1_MEM_TARGET,
272 mvebu_mbus_add_window_remap_flags("pcie1.0", 282 KIRKWOOD_MBUS_PCIE1_MEM_ATTR,
273 KIRKWOOD_PCIE1_MEM_PHYS_BASE, 283 KIRKWOOD_PCIE1_MEM_PHYS_BASE,
274 KIRKWOOD_PCIE1_MEM_SIZE, 284 KIRKWOOD_PCIE1_MEM_SIZE);
275 MVEBU_MBUS_NO_REMAP,
276 MVEBU_MBUS_PCI_MEM);
277 285
278 vga_base = KIRKWOOD_PCIE_MEM_PHYS_BASE; 286 vga_base = KIRKWOOD_PCIE_MEM_PHYS_BASE;
279 287
diff --git a/arch/arm/mach-kirkwood/rd88f6281-setup.c b/arch/arm/mach-kirkwood/rd88f6281-setup.c
index d24223166e06..5154bd2a3ad3 100644
--- a/arch/arm/mach-kirkwood/rd88f6281-setup.c
+++ b/arch/arm/mach-kirkwood/rd88f6281-setup.c
@@ -87,7 +87,9 @@ static void __init rd88f6281_init(void)
87 kirkwood_init(); 87 kirkwood_init();
88 kirkwood_mpp_conf(rd88f6281_mpp_config); 88 kirkwood_mpp_conf(rd88f6281_mpp_config);
89 89
90 kirkwood_nand_init(ARRAY_AND_SIZE(rd88f6281_nand_parts), 25); 90 kirkwood_nand_init(rd88f6281_nand_parts,
91 ARRAY_SIZE(rd88f6281_nand_parts),
92 25);
91 kirkwood_ehci_init(); 93 kirkwood_ehci_init();
92 94
93 kirkwood_ge00_init(&rd88f6281_ge00_data); 95 kirkwood_ge00_init(&rd88f6281_ge00_data);
diff --git a/arch/arm/mach-kirkwood/sheevaplug-setup.c b/arch/arm/mach-kirkwood/sheevaplug-setup.c
deleted file mode 100644
index 55b68fa39f45..000000000000
--- a/arch/arm/mach-kirkwood/sheevaplug-setup.c
+++ /dev/null
@@ -1,161 +0,0 @@
1/*
2 * arch/arm/mach-kirkwood/sheevaplug-setup.c
3 *
4 * Marvell SheevaPlug Reference Board Setup
5 *
6 * This file is licensed under the terms of the GNU General Public
7 * License version 2. This program is licensed "as is" without any
8 * warranty of any kind, whether express or implied.
9 */
10
11#include <linux/kernel.h>
12#include <linux/init.h>
13#include <linux/platform_device.h>
14#include <linux/ata_platform.h>
15#include <linux/mtd/partitions.h>
16#include <linux/mv643xx_eth.h>
17#include <linux/gpio.h>
18#include <linux/leds.h>
19#include <asm/mach-types.h>
20#include <asm/mach/arch.h>
21#include <mach/kirkwood.h>
22#include <linux/platform_data/mmc-mvsdio.h>
23#include "common.h"
24#include "mpp.h"
25
26static struct mtd_partition sheevaplug_nand_parts[] = {
27 {
28 .name = "u-boot",
29 .offset = 0,
30 .size = SZ_1M
31 }, {
32 .name = "uImage",
33 .offset = MTDPART_OFS_NXTBLK,
34 .size = SZ_4M
35 }, {
36 .name = "root",
37 .offset = MTDPART_OFS_NXTBLK,
38 .size = MTDPART_SIZ_FULL
39 },
40};
41
42static struct mv643xx_eth_platform_data sheevaplug_ge00_data = {
43 .phy_addr = MV643XX_ETH_PHY_ADDR(0),
44};
45
46static struct mv_sata_platform_data sheeva_esata_sata_data = {
47 .n_ports = 2,
48};
49
50static struct mvsdio_platform_data sheevaplug_mvsdio_data = {
51 /* unfortunately the CD signal has not been connected */
52};
53
54static struct mvsdio_platform_data sheeva_esata_mvsdio_data = {
55 .gpio_write_protect = 44, /* MPP44 used as SD write protect */
56 .gpio_card_detect = 47, /* MPP47 used as SD card detect */
57};
58
59static struct gpio_led sheevaplug_led_pins[] = {
60 {
61 .name = "plug:red:misc",
62 .default_trigger = "none",
63 .gpio = 46,
64 .active_low = 1,
65 },
66 {
67 .name = "plug:green:health",
68 .default_trigger = "default-on",
69 .gpio = 49,
70 .active_low = 1,
71 },
72};
73
74static struct gpio_led_platform_data sheevaplug_led_data = {
75 .leds = sheevaplug_led_pins,
76 .num_leds = ARRAY_SIZE(sheevaplug_led_pins),
77};
78
79static struct platform_device sheevaplug_leds = {
80 .name = "leds-gpio",
81 .id = -1,
82 .dev = {
83 .platform_data = &sheevaplug_led_data,
84 }
85};
86
87static unsigned int sheevaplug_mpp_config[] __initdata = {
88 MPP29_GPIO, /* USB Power Enable */
89 MPP46_GPIO, /* LED Red */
90 MPP49_GPIO, /* LED */
91 0
92};
93
94static unsigned int sheeva_esata_mpp_config[] __initdata = {
95 MPP29_GPIO, /* USB Power Enable */
96 MPP44_GPIO, /* SD Write Protect */
97 MPP47_GPIO, /* SD Card Detect */
98 MPP49_GPIO, /* LED Green */
99 0
100};
101
102static void __init sheevaplug_init(void)
103{
104 /*
105 * Basic setup. Needs to be called early.
106 */
107 kirkwood_init();
108
109 /* setup gpio pin select */
110 if (machine_is_esata_sheevaplug())
111 kirkwood_mpp_conf(sheeva_esata_mpp_config);
112 else
113 kirkwood_mpp_conf(sheevaplug_mpp_config);
114
115 kirkwood_uart0_init();
116 kirkwood_nand_init(ARRAY_AND_SIZE(sheevaplug_nand_parts), 25);
117
118 if (gpio_request(29, "USB Power Enable") != 0 ||
119 gpio_direction_output(29, 1) != 0)
120 pr_err("can't set up GPIO 29 (USB Power Enable)\n");
121 kirkwood_ehci_init();
122
123 kirkwood_ge00_init(&sheevaplug_ge00_data);
124
125 /* honor lower power consumption for plugs with out eSATA */
126 if (machine_is_esata_sheevaplug())
127 kirkwood_sata_init(&sheeva_esata_sata_data);
128
129 /* enable sd wp and sd cd on plugs with esata */
130 if (machine_is_esata_sheevaplug())
131 kirkwood_sdio_init(&sheeva_esata_mvsdio_data);
132 else
133 kirkwood_sdio_init(&sheevaplug_mvsdio_data);
134
135 platform_device_register(&sheevaplug_leds);
136}
137
138#ifdef CONFIG_MACH_SHEEVAPLUG
139MACHINE_START(SHEEVAPLUG, "Marvell SheevaPlug Reference Board")
140 /* Maintainer: shadi Ammouri <shadi@marvell.com> */
141 .atag_offset = 0x100,
142 .init_machine = sheevaplug_init,
143 .map_io = kirkwood_map_io,
144 .init_early = kirkwood_init_early,
145 .init_irq = kirkwood_init_irq,
146 .init_time = kirkwood_timer_init,
147 .restart = kirkwood_restart,
148MACHINE_END
149#endif
150
151#ifdef CONFIG_MACH_ESATA_SHEEVAPLUG
152MACHINE_START(ESATA_SHEEVAPLUG, "Marvell eSATA SheevaPlug Reference Board")
153 .atag_offset = 0x100,
154 .init_machine = sheevaplug_init,
155 .map_io = kirkwood_map_io,
156 .init_early = kirkwood_init_early,
157 .init_irq = kirkwood_init_irq,
158 .init_time = kirkwood_timer_init,
159 .restart = kirkwood_restart,
160MACHINE_END
161#endif
diff --git a/arch/arm/mach-ks8695/board-acs5k.c b/arch/arm/mach-ks8695/board-acs5k.c
index 456d6386edf8..9f9c0441a917 100644
--- a/arch/arm/mach-ks8695/board-acs5k.c
+++ b/arch/arm/mach-ks8695/board-acs5k.c
@@ -20,7 +20,7 @@
20#include <linux/i2c.h> 20#include <linux/i2c.h>
21#include <linux/i2c-algo-bit.h> 21#include <linux/i2c-algo-bit.h>
22#include <linux/i2c-gpio.h> 22#include <linux/i2c-gpio.h>
23#include <linux/i2c/pca953x.h> 23#include <linux/platform_data/pca953x.h>
24 24
25#include <linux/mtd/mtd.h> 25#include <linux/mtd/mtd.h>
26#include <linux/mtd/map.h> 26#include <linux/mtd/map.h>
diff --git a/arch/arm/mach-lpc32xx/include/mach/debug-macro.S b/arch/arm/mach-lpc32xx/include/mach/debug-macro.S
deleted file mode 100644
index 351bd6c84909..000000000000
--- a/arch/arm/mach-lpc32xx/include/mach/debug-macro.S
+++ /dev/null
@@ -1,29 +0,0 @@
1/*
2 * arch/arm/mach-lpc32xx/include/mach/debug-macro.S
3 *
4 * Author: Kevin Wells <kevin.wells@nxp.com>
5 *
6 * Copyright (C) 2010 NXP Semiconductors
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 */
18
19/*
20 * Debug output is hardcoded to standard UART 5
21*/
22
23 .macro addruart, rp, rv, tmp
24 ldreq \rp, =0x40090000
25 ldrne \rv, =0xF4090000
26 .endm
27
28#define UART_SHIFT 2
29#include <asm/hardware/debug-8250.S>
diff --git a/arch/arm/mach-mmp/Makefile b/arch/arm/mach-mmp/Makefile
index 095c155d6fb8..9b702a1dc7b0 100644
--- a/arch/arm/mach-mmp/Makefile
+++ b/arch/arm/mach-mmp/Makefile
@@ -2,7 +2,7 @@
2# Makefile for Marvell's PXA168 processors line 2# Makefile for Marvell's PXA168 processors line
3# 3#
4 4
5obj-y += common.o devices.o time.o irq.o 5obj-y += common.o devices.o time.o
6 6
7# SoC support 7# SoC support
8obj-$(CONFIG_CPU_PXA168) += pxa168.o 8obj-$(CONFIG_CPU_PXA168) += pxa168.o
diff --git a/arch/arm/mach-mmp/common.h b/arch/arm/mach-mmp/common.h
index 991d7e9877de..cf445bae6d77 100644
--- a/arch/arm/mach-mmp/common.h
+++ b/arch/arm/mach-mmp/common.h
@@ -3,7 +3,6 @@
3 3
4extern void timer_init(int irq); 4extern void timer_init(int irq);
5 5
6extern void __init icu_init_irq(void);
7extern void __init mmp_map_io(void); 6extern void __init mmp_map_io(void);
8extern void mmp_restart(enum reboot_mode, const char *); 7extern void mmp_restart(enum reboot_mode, const char *);
9extern void __init pxa168_clk_init(void); 8extern void __init pxa168_clk_init(void);
diff --git a/arch/arm/mach-mmp/include/mach/entry-macro.S b/arch/arm/mach-mmp/include/mach/entry-macro.S
deleted file mode 100644
index bd152e24e6d7..000000000000
--- a/arch/arm/mach-mmp/include/mach/entry-macro.S
+++ /dev/null
@@ -1,26 +0,0 @@
1/*
2 * linux/arch/arm/mach-mmp/include/mach/entry-macro.S
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
8
9#include <asm/irq.h>
10#include <mach/regs-icu.h>
11
12 .macro get_irqnr_preamble, base, tmp
13 mrc p15, 0, \tmp, c0, c0, 0 @ CPUID
14 and \tmp, \tmp, #0xff00
15 cmp \tmp, #0x5800
16 ldr \base, =mmp_icu_base
17 ldr \base, [\base, #0]
18 addne \base, \base, #0x10c @ PJ1 AP INT SEL register
19 addeq \base, \base, #0x104 @ PJ4 IRQ SEL register
20 .endm
21
22 .macro get_irqnr_and_base, irqnr, irqstat, base, tmp
23 ldr \tmp, [\base, #0]
24 and \irqnr, \tmp, #0x3f
25 tst \tmp, #(1 << 6)
26 .endm
diff --git a/arch/arm/mach-mmp/include/mach/pxa168.h b/arch/arm/mach-mmp/include/mach/pxa168.h
index 459c2d03eb5c..a83ba7cb525d 100644
--- a/arch/arm/mach-mmp/include/mach/pxa168.h
+++ b/arch/arm/mach-mmp/include/mach/pxa168.h
@@ -4,6 +4,7 @@
4#include <linux/reboot.h> 4#include <linux/reboot.h>
5 5
6extern void pxa168_timer_init(void); 6extern void pxa168_timer_init(void);
7extern void __init icu_init_irq(void);
7extern void __init pxa168_init_irq(void); 8extern void __init pxa168_init_irq(void);
8extern void pxa168_restart(enum reboot_mode, const char *); 9extern void pxa168_restart(enum reboot_mode, const char *);
9extern void pxa168_clear_keypad_wakeup(void); 10extern void pxa168_clear_keypad_wakeup(void);
diff --git a/arch/arm/mach-mmp/include/mach/pxa910.h b/arch/arm/mach-mmp/include/mach/pxa910.h
index b914afa1fcdc..92253203f5b4 100644
--- a/arch/arm/mach-mmp/include/mach/pxa910.h
+++ b/arch/arm/mach-mmp/include/mach/pxa910.h
@@ -2,6 +2,7 @@
2#define __ASM_MACH_PXA910_H 2#define __ASM_MACH_PXA910_H
3 3
4extern void pxa910_timer_init(void); 4extern void pxa910_timer_init(void);
5extern void __init icu_init_irq(void);
5extern void __init pxa910_init_irq(void); 6extern void __init pxa910_init_irq(void);
6 7
7#include <linux/i2c.h> 8#include <linux/i2c.h>
diff --git a/arch/arm/mach-mmp/irq.c b/arch/arm/mach-mmp/irq.c
deleted file mode 100644
index 3c71246cd994..000000000000
--- a/arch/arm/mach-mmp/irq.c
+++ /dev/null
@@ -1,463 +0,0 @@
1/*
2 * linux/arch/arm/mach-mmp/irq.c
3 *
4 * Generic IRQ handling, GPIO IRQ demultiplexing, etc.
5 * Copyright (C) 2008 - 2012 Marvell Technology Group Ltd.
6 *
7 * Author: Bin Yang <bin.yang@marvell.com>
8 * Haojian Zhuang <haojian.zhuang@gmail.com>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 */
14
15#include <linux/module.h>
16#include <linux/init.h>
17#include <linux/irq.h>
18#include <linux/irqdomain.h>
19#include <linux/io.h>
20#include <linux/ioport.h>
21#include <linux/of_address.h>
22#include <linux/of_irq.h>
23
24#include <mach/irqs.h>
25
26#ifdef CONFIG_CPU_MMP2
27#include <mach/pm-mmp2.h>
28#endif
29#ifdef CONFIG_CPU_PXA910
30#include <mach/pm-pxa910.h>
31#endif
32
33#include "common.h"
34
35#define MAX_ICU_NR 16
36
37struct icu_chip_data {
38 int nr_irqs;
39 unsigned int virq_base;
40 unsigned int cascade_irq;
41 void __iomem *reg_status;
42 void __iomem *reg_mask;
43 unsigned int conf_enable;
44 unsigned int conf_disable;
45 unsigned int conf_mask;
46 unsigned int clr_mfp_irq_base;
47 unsigned int clr_mfp_hwirq;
48 struct irq_domain *domain;
49};
50
51struct mmp_intc_conf {
52 unsigned int conf_enable;
53 unsigned int conf_disable;
54 unsigned int conf_mask;
55};
56
57void __iomem *mmp_icu_base;
58static struct icu_chip_data icu_data[MAX_ICU_NR];
59static int max_icu_nr;
60
61extern void mmp2_clear_pmic_int(void);
62
63static void icu_mask_ack_irq(struct irq_data *d)
64{
65 struct irq_domain *domain = d->domain;
66 struct icu_chip_data *data = (struct icu_chip_data *)domain->host_data;
67 int hwirq;
68 u32 r;
69
70 hwirq = d->irq - data->virq_base;
71 if (data == &icu_data[0]) {
72 r = readl_relaxed(mmp_icu_base + (hwirq << 2));
73 r &= ~data->conf_mask;
74 r |= data->conf_disable;
75 writel_relaxed(r, mmp_icu_base + (hwirq << 2));
76 } else {
77#ifdef CONFIG_CPU_MMP2
78 if ((data->virq_base == data->clr_mfp_irq_base)
79 && (hwirq == data->clr_mfp_hwirq))
80 mmp2_clear_pmic_int();
81#endif
82 r = readl_relaxed(data->reg_mask) | (1 << hwirq);
83 writel_relaxed(r, data->reg_mask);
84 }
85}
86
87static void icu_mask_irq(struct irq_data *d)
88{
89 struct irq_domain *domain = d->domain;
90 struct icu_chip_data *data = (struct icu_chip_data *)domain->host_data;
91 int hwirq;
92 u32 r;
93
94 hwirq = d->irq - data->virq_base;
95 if (data == &icu_data[0]) {
96 r = readl_relaxed(mmp_icu_base + (hwirq << 2));
97 r &= ~data->conf_mask;
98 r |= data->conf_disable;
99 writel_relaxed(r, mmp_icu_base + (hwirq << 2));
100 } else {
101 r = readl_relaxed(data->reg_mask) | (1 << hwirq);
102 writel_relaxed(r, data->reg_mask);
103 }
104}
105
106static void icu_unmask_irq(struct irq_data *d)
107{
108 struct irq_domain *domain = d->domain;
109 struct icu_chip_data *data = (struct icu_chip_data *)domain->host_data;
110 int hwirq;
111 u32 r;
112
113 hwirq = d->irq - data->virq_base;
114 if (data == &icu_data[0]) {
115 r = readl_relaxed(mmp_icu_base + (hwirq << 2));
116 r &= ~data->conf_mask;
117 r |= data->conf_enable;
118 writel_relaxed(r, mmp_icu_base + (hwirq << 2));
119 } else {
120 r = readl_relaxed(data->reg_mask) & ~(1 << hwirq);
121 writel_relaxed(r, data->reg_mask);
122 }
123}
124
125static struct irq_chip icu_irq_chip = {
126 .name = "icu_irq",
127 .irq_mask = icu_mask_irq,
128 .irq_mask_ack = icu_mask_ack_irq,
129 .irq_unmask = icu_unmask_irq,
130};
131
132static void icu_mux_irq_demux(unsigned int irq, struct irq_desc *desc)
133{
134 struct irq_domain *domain;
135 struct icu_chip_data *data;
136 int i;
137 unsigned long mask, status, n;
138
139 for (i = 1; i < max_icu_nr; i++) {
140 if (irq == icu_data[i].cascade_irq) {
141 domain = icu_data[i].domain;
142 data = (struct icu_chip_data *)domain->host_data;
143 break;
144 }
145 }
146 if (i >= max_icu_nr) {
147 pr_err("Spurious irq %d in MMP INTC\n", irq);
148 return;
149 }
150
151 mask = readl_relaxed(data->reg_mask);
152 while (1) {
153 status = readl_relaxed(data->reg_status) & ~mask;
154 if (status == 0)
155 break;
156 for_each_set_bit(n, &status, BITS_PER_LONG) {
157 generic_handle_irq(icu_data[i].virq_base + n);
158 }
159 }
160}
161
162static int mmp_irq_domain_map(struct irq_domain *d, unsigned int irq,
163 irq_hw_number_t hw)
164{
165 irq_set_chip_and_handler(irq, &icu_irq_chip, handle_level_irq);
166 set_irq_flags(irq, IRQF_VALID);
167 return 0;
168}
169
170static int mmp_irq_domain_xlate(struct irq_domain *d, struct device_node *node,
171 const u32 *intspec, unsigned int intsize,
172 unsigned long *out_hwirq,
173 unsigned int *out_type)
174{
175 *out_hwirq = intspec[0];
176 return 0;
177}
178
179const struct irq_domain_ops mmp_irq_domain_ops = {
180 .map = mmp_irq_domain_map,
181 .xlate = mmp_irq_domain_xlate,
182};
183
184static struct mmp_intc_conf mmp_conf = {
185 .conf_enable = 0x51,
186 .conf_disable = 0x0,
187 .conf_mask = 0x7f,
188};
189
190static struct mmp_intc_conf mmp2_conf = {
191 .conf_enable = 0x20,
192 .conf_disable = 0x0,
193 .conf_mask = 0x7f,
194};
195
196/* MMP (ARMv5) */
197void __init icu_init_irq(void)
198{
199 int irq;
200
201 max_icu_nr = 1;
202 mmp_icu_base = ioremap(0xd4282000, 0x1000);
203 icu_data[0].conf_enable = mmp_conf.conf_enable;
204 icu_data[0].conf_disable = mmp_conf.conf_disable;
205 icu_data[0].conf_mask = mmp_conf.conf_mask;
206 icu_data[0].nr_irqs = 64;
207 icu_data[0].virq_base = 0;
208 icu_data[0].domain = irq_domain_add_legacy(NULL, 64, 0, 0,
209 &irq_domain_simple_ops,
210 &icu_data[0]);
211 for (irq = 0; irq < 64; irq++) {
212 icu_mask_irq(irq_get_irq_data(irq));
213 irq_set_chip_and_handler(irq, &icu_irq_chip, handle_level_irq);
214 set_irq_flags(irq, IRQF_VALID);
215 }
216 irq_set_default_host(icu_data[0].domain);
217#ifdef CONFIG_CPU_PXA910
218 icu_irq_chip.irq_set_wake = pxa910_set_wake;
219#endif
220}
221
222/* MMP2 (ARMv7) */
223void __init mmp2_init_icu(void)
224{
225 int irq;
226
227 max_icu_nr = 8;
228 mmp_icu_base = ioremap(0xd4282000, 0x1000);
229 icu_data[0].conf_enable = mmp2_conf.conf_enable;
230 icu_data[0].conf_disable = mmp2_conf.conf_disable;
231 icu_data[0].conf_mask = mmp2_conf.conf_mask;
232 icu_data[0].nr_irqs = 64;
233 icu_data[0].virq_base = 0;
234 icu_data[0].domain = irq_domain_add_legacy(NULL, 64, 0, 0,
235 &irq_domain_simple_ops,
236 &icu_data[0]);
237 icu_data[1].reg_status = mmp_icu_base + 0x150;
238 icu_data[1].reg_mask = mmp_icu_base + 0x168;
239 icu_data[1].clr_mfp_irq_base = IRQ_MMP2_PMIC_BASE;
240 icu_data[1].clr_mfp_hwirq = IRQ_MMP2_PMIC - IRQ_MMP2_PMIC_BASE;
241 icu_data[1].nr_irqs = 2;
242 icu_data[1].cascade_irq = 4;
243 icu_data[1].virq_base = IRQ_MMP2_PMIC_BASE;
244 icu_data[1].domain = irq_domain_add_legacy(NULL, icu_data[1].nr_irqs,
245 icu_data[1].virq_base, 0,
246 &irq_domain_simple_ops,
247 &icu_data[1]);
248 icu_data[2].reg_status = mmp_icu_base + 0x154;
249 icu_data[2].reg_mask = mmp_icu_base + 0x16c;
250 icu_data[2].nr_irqs = 2;
251 icu_data[2].cascade_irq = 5;
252 icu_data[2].virq_base = IRQ_MMP2_RTC_BASE;
253 icu_data[2].domain = irq_domain_add_legacy(NULL, icu_data[2].nr_irqs,
254 icu_data[2].virq_base, 0,
255 &irq_domain_simple_ops,
256 &icu_data[2]);
257 icu_data[3].reg_status = mmp_icu_base + 0x180;
258 icu_data[3].reg_mask = mmp_icu_base + 0x17c;
259 icu_data[3].nr_irqs = 3;
260 icu_data[3].cascade_irq = 9;
261 icu_data[3].virq_base = IRQ_MMP2_KEYPAD_BASE;
262 icu_data[3].domain = irq_domain_add_legacy(NULL, icu_data[3].nr_irqs,
263 icu_data[3].virq_base, 0,
264 &irq_domain_simple_ops,
265 &icu_data[3]);
266 icu_data[4].reg_status = mmp_icu_base + 0x158;
267 icu_data[4].reg_mask = mmp_icu_base + 0x170;
268 icu_data[4].nr_irqs = 5;
269 icu_data[4].cascade_irq = 17;
270 icu_data[4].virq_base = IRQ_MMP2_TWSI_BASE;
271 icu_data[4].domain = irq_domain_add_legacy(NULL, icu_data[4].nr_irqs,
272 icu_data[4].virq_base, 0,
273 &irq_domain_simple_ops,
274 &icu_data[4]);
275 icu_data[5].reg_status = mmp_icu_base + 0x15c;
276 icu_data[5].reg_mask = mmp_icu_base + 0x174;
277 icu_data[5].nr_irqs = 15;
278 icu_data[5].cascade_irq = 35;
279 icu_data[5].virq_base = IRQ_MMP2_MISC_BASE;
280 icu_data[5].domain = irq_domain_add_legacy(NULL, icu_data[5].nr_irqs,
281 icu_data[5].virq_base, 0,
282 &irq_domain_simple_ops,
283 &icu_data[5]);
284 icu_data[6].reg_status = mmp_icu_base + 0x160;
285 icu_data[6].reg_mask = mmp_icu_base + 0x178;
286 icu_data[6].nr_irqs = 2;
287 icu_data[6].cascade_irq = 51;
288 icu_data[6].virq_base = IRQ_MMP2_MIPI_HSI1_BASE;
289 icu_data[6].domain = irq_domain_add_legacy(NULL, icu_data[6].nr_irqs,
290 icu_data[6].virq_base, 0,
291 &irq_domain_simple_ops,
292 &icu_data[6]);
293 icu_data[7].reg_status = mmp_icu_base + 0x188;
294 icu_data[7].reg_mask = mmp_icu_base + 0x184;
295 icu_data[7].nr_irqs = 2;
296 icu_data[7].cascade_irq = 55;
297 icu_data[7].virq_base = IRQ_MMP2_MIPI_HSI0_BASE;
298 icu_data[7].domain = irq_domain_add_legacy(NULL, icu_data[7].nr_irqs,
299 icu_data[7].virq_base, 0,
300 &irq_domain_simple_ops,
301 &icu_data[7]);
302 for (irq = 0; irq < IRQ_MMP2_MUX_END; irq++) {
303 icu_mask_irq(irq_get_irq_data(irq));
304 switch (irq) {
305 case IRQ_MMP2_PMIC_MUX:
306 case IRQ_MMP2_RTC_MUX:
307 case IRQ_MMP2_KEYPAD_MUX:
308 case IRQ_MMP2_TWSI_MUX:
309 case IRQ_MMP2_MISC_MUX:
310 case IRQ_MMP2_MIPI_HSI1_MUX:
311 case IRQ_MMP2_MIPI_HSI0_MUX:
312 irq_set_chip(irq, &icu_irq_chip);
313 irq_set_chained_handler(irq, icu_mux_irq_demux);
314 break;
315 default:
316 irq_set_chip_and_handler(irq, &icu_irq_chip,
317 handle_level_irq);
318 break;
319 }
320 set_irq_flags(irq, IRQF_VALID);
321 }
322 irq_set_default_host(icu_data[0].domain);
323#ifdef CONFIG_CPU_MMP2
324 icu_irq_chip.irq_set_wake = mmp2_set_wake;
325#endif
326}
327
328#ifdef CONFIG_OF
329static const struct of_device_id intc_ids[] __initconst = {
330 { .compatible = "mrvl,mmp-intc", .data = &mmp_conf },
331 { .compatible = "mrvl,mmp2-intc", .data = &mmp2_conf },
332 {}
333};
334
335static const struct of_device_id mmp_mux_irq_match[] __initconst = {
336 { .compatible = "mrvl,mmp2-mux-intc" },
337 {}
338};
339
340int __init mmp2_mux_init(struct device_node *parent)
341{
342 struct device_node *node;
343 const struct of_device_id *of_id;
344 struct resource res;
345 int i, irq_base, ret, irq;
346 u32 nr_irqs, mfp_irq;
347
348 node = parent;
349 max_icu_nr = 1;
350 for (i = 1; i < MAX_ICU_NR; i++) {
351 node = of_find_matching_node(node, mmp_mux_irq_match);
352 if (!node)
353 break;
354 of_id = of_match_node(&mmp_mux_irq_match[0], node);
355 ret = of_property_read_u32(node, "mrvl,intc-nr-irqs",
356 &nr_irqs);
357 if (ret) {
358 pr_err("Not found mrvl,intc-nr-irqs property\n");
359 ret = -EINVAL;
360 goto err;
361 }
362 ret = of_address_to_resource(node, 0, &res);
363 if (ret < 0) {
364 pr_err("Not found reg property\n");
365 ret = -EINVAL;
366 goto err;
367 }
368 icu_data[i].reg_status = mmp_icu_base + res.start;
369 ret = of_address_to_resource(node, 1, &res);
370 if (ret < 0) {
371 pr_err("Not found reg property\n");
372 ret = -EINVAL;
373 goto err;
374 }
375 icu_data[i].reg_mask = mmp_icu_base + res.start;
376 icu_data[i].cascade_irq = irq_of_parse_and_map(node, 0);
377 if (!icu_data[i].cascade_irq) {
378 ret = -EINVAL;
379 goto err;
380 }
381
382 irq_base = irq_alloc_descs(-1, 0, nr_irqs, 0);
383 if (irq_base < 0) {
384 pr_err("Failed to allocate IRQ numbers for mux intc\n");
385 ret = irq_base;
386 goto err;
387 }
388 if (!of_property_read_u32(node, "mrvl,clr-mfp-irq",
389 &mfp_irq)) {
390 icu_data[i].clr_mfp_irq_base = irq_base;
391 icu_data[i].clr_mfp_hwirq = mfp_irq;
392 }
393 irq_set_chained_handler(icu_data[i].cascade_irq,
394 icu_mux_irq_demux);
395 icu_data[i].nr_irqs = nr_irqs;
396 icu_data[i].virq_base = irq_base;
397 icu_data[i].domain = irq_domain_add_legacy(node, nr_irqs,
398 irq_base, 0,
399 &mmp_irq_domain_ops,
400 &icu_data[i]);
401 for (irq = irq_base; irq < irq_base + nr_irqs; irq++)
402 icu_mask_irq(irq_get_irq_data(irq));
403 }
404 max_icu_nr = i;
405 return 0;
406err:
407 of_node_put(node);
408 max_icu_nr = i;
409 return ret;
410}
411
412void __init mmp_dt_irq_init(void)
413{
414 struct device_node *node;
415 const struct of_device_id *of_id;
416 struct mmp_intc_conf *conf;
417 int nr_irqs, irq_base, ret, irq;
418
419 node = of_find_matching_node(NULL, intc_ids);
420 if (!node) {
421 pr_err("Failed to find interrupt controller in arch-mmp\n");
422 return;
423 }
424 of_id = of_match_node(intc_ids, node);
425 conf = of_id->data;
426
427 ret = of_property_read_u32(node, "mrvl,intc-nr-irqs", &nr_irqs);
428 if (ret) {
429 pr_err("Not found mrvl,intc-nr-irqs property\n");
430 return;
431 }
432
433 mmp_icu_base = of_iomap(node, 0);
434 if (!mmp_icu_base) {
435 pr_err("Failed to get interrupt controller register\n");
436 return;
437 }
438
439 irq_base = irq_alloc_descs(-1, 0, nr_irqs - NR_IRQS_LEGACY, 0);
440 if (irq_base < 0) {
441 pr_err("Failed to allocate IRQ numbers\n");
442 goto err;
443 } else if (irq_base != NR_IRQS_LEGACY) {
444 pr_err("ICU's irqbase should be started from 0\n");
445 goto err;
446 }
447 icu_data[0].conf_enable = conf->conf_enable;
448 icu_data[0].conf_disable = conf->conf_disable;
449 icu_data[0].conf_mask = conf->conf_mask;
450 icu_data[0].nr_irqs = nr_irqs;
451 icu_data[0].virq_base = 0;
452 icu_data[0].domain = irq_domain_add_legacy(node, nr_irqs, 0, 0,
453 &mmp_irq_domain_ops,
454 &icu_data[0]);
455 irq_set_default_host(icu_data[0].domain);
456 for (irq = 0; irq < nr_irqs; irq++)
457 icu_mask_irq(irq_get_irq_data(irq));
458 mmp2_mux_init(node);
459 return;
460err:
461 iounmap(mmp_icu_base);
462}
463#endif
diff --git a/arch/arm/mach-mmp/mmp-dt.c b/arch/arm/mach-mmp/mmp-dt.c
index b37915dc4470..cca529ceecb7 100644
--- a/arch/arm/mach-mmp/mmp-dt.c
+++ b/arch/arm/mach-mmp/mmp-dt.c
@@ -9,17 +9,13 @@
9 * publishhed by the Free Software Foundation. 9 * publishhed by the Free Software Foundation.
10 */ 10 */
11 11
12#include <linux/irq.h> 12#include <linux/irqchip.h>
13#include <linux/irqdomain.h>
14#include <linux/of_irq.h>
15#include <linux/of_platform.h> 13#include <linux/of_platform.h>
16#include <asm/mach/arch.h> 14#include <asm/mach/arch.h>
17#include <asm/mach/time.h> 15#include <asm/mach/time.h>
18#include <mach/irqs.h>
19 16
20#include "common.h" 17#include "common.h"
21 18
22extern void __init mmp_dt_irq_init(void);
23extern void __init mmp_dt_init_timer(void); 19extern void __init mmp_dt_init_timer(void);
24 20
25static const struct of_dev_auxdata pxa168_auxdata_lookup[] __initconst = { 21static const struct of_dev_auxdata pxa168_auxdata_lookup[] __initconst = {
@@ -64,7 +60,6 @@ static const char *mmp_dt_board_compat[] __initdata = {
64 60
65DT_MACHINE_START(PXA168_DT, "Marvell PXA168 (Device Tree Support)") 61DT_MACHINE_START(PXA168_DT, "Marvell PXA168 (Device Tree Support)")
66 .map_io = mmp_map_io, 62 .map_io = mmp_map_io,
67 .init_irq = mmp_dt_irq_init,
68 .init_time = mmp_dt_init_timer, 63 .init_time = mmp_dt_init_timer,
69 .init_machine = pxa168_dt_init, 64 .init_machine = pxa168_dt_init,
70 .dt_compat = mmp_dt_board_compat, 65 .dt_compat = mmp_dt_board_compat,
@@ -72,7 +67,6 @@ MACHINE_END
72 67
73DT_MACHINE_START(PXA910_DT, "Marvell PXA910 (Device Tree Support)") 68DT_MACHINE_START(PXA910_DT, "Marvell PXA910 (Device Tree Support)")
74 .map_io = mmp_map_io, 69 .map_io = mmp_map_io,
75 .init_irq = mmp_dt_irq_init,
76 .init_time = mmp_dt_init_timer, 70 .init_time = mmp_dt_init_timer,
77 .init_machine = pxa910_dt_init, 71 .init_machine = pxa910_dt_init,
78 .dt_compat = mmp_dt_board_compat, 72 .dt_compat = mmp_dt_board_compat,
diff --git a/arch/arm/mach-mmp/mmp2-dt.c b/arch/arm/mach-mmp/mmp2-dt.c
index 4ac256720f7d..023cb453f157 100644
--- a/arch/arm/mach-mmp/mmp2-dt.c
+++ b/arch/arm/mach-mmp/mmp2-dt.c
@@ -10,18 +10,13 @@
10 */ 10 */
11 11
12#include <linux/io.h> 12#include <linux/io.h>
13#include <linux/irq.h> 13#include <linux/irqchip.h>
14#include <linux/irqdomain.h>
15#include <linux/of_irq.h>
16#include <linux/of_platform.h> 14#include <linux/of_platform.h>
17#include <asm/mach/arch.h> 15#include <asm/mach/arch.h>
18#include <asm/mach/time.h> 16#include <asm/mach/time.h>
19#include <mach/irqs.h>
20#include <mach/regs-apbc.h>
21 17
22#include "common.h" 18#include "common.h"
23 19
24extern void __init mmp_dt_irq_init(void);
25extern void __init mmp_dt_init_timer(void); 20extern void __init mmp_dt_init_timer(void);
26 21
27static const struct of_dev_auxdata mmp2_auxdata_lookup[] __initconst = { 22static const struct of_dev_auxdata mmp2_auxdata_lookup[] __initconst = {
@@ -49,7 +44,6 @@ static const char *mmp2_dt_board_compat[] __initdata = {
49 44
50DT_MACHINE_START(MMP2_DT, "Marvell MMP2 (Device Tree Support)") 45DT_MACHINE_START(MMP2_DT, "Marvell MMP2 (Device Tree Support)")
51 .map_io = mmp_map_io, 46 .map_io = mmp_map_io,
52 .init_irq = mmp_dt_irq_init,
53 .init_time = mmp_dt_init_timer, 47 .init_time = mmp_dt_init_timer,
54 .init_machine = mmp2_dt_init, 48 .init_machine = mmp2_dt_init,
55 .dt_compat = mmp2_dt_board_compat, 49 .dt_compat = mmp2_dt_board_compat,
diff --git a/arch/arm/mach-mmp/mmp2.c b/arch/arm/mach-mmp/mmp2.c
index c7592f168bbd..a70b5530bd42 100644
--- a/arch/arm/mach-mmp/mmp2.c
+++ b/arch/arm/mach-mmp/mmp2.c
@@ -13,6 +13,8 @@
13#include <linux/kernel.h> 13#include <linux/kernel.h>
14#include <linux/init.h> 14#include <linux/init.h>
15#include <linux/io.h> 15#include <linux/io.h>
16#include <linux/irq.h>
17#include <linux/irqchip/mmp.h>
16#include <linux/platform_device.h> 18#include <linux/platform_device.h>
17 19
18#include <asm/hardware/cache-tauros2.h> 20#include <asm/hardware/cache-tauros2.h>
@@ -26,6 +28,7 @@
26#include <mach/mfp.h> 28#include <mach/mfp.h>
27#include <mach/devices.h> 29#include <mach/devices.h>
28#include <mach/mmp2.h> 30#include <mach/mmp2.h>
31#include <mach/pm-mmp2.h>
29 32
30#include "common.h" 33#include "common.h"
31 34
@@ -94,6 +97,9 @@ void mmp2_clear_pmic_int(void)
94void __init mmp2_init_irq(void) 97void __init mmp2_init_irq(void)
95{ 98{
96 mmp2_init_icu(); 99 mmp2_init_icu();
100#ifdef CONFIG_PM
101 icu_irq_chip.irq_set_wake = mmp2_set_wake;
102#endif
97} 103}
98 104
99static int __init mmp2_init(void) 105static int __init mmp2_init(void)
diff --git a/arch/arm/mach-mmp/pxa910.c b/arch/arm/mach-mmp/pxa910.c
index ce6393acad86..eb57ee196842 100644
--- a/arch/arm/mach-mmp/pxa910.c
+++ b/arch/arm/mach-mmp/pxa910.c
@@ -12,6 +12,8 @@
12#include <linux/init.h> 12#include <linux/init.h>
13#include <linux/list.h> 13#include <linux/list.h>
14#include <linux/io.h> 14#include <linux/io.h>
15#include <linux/irq.h>
16#include <linux/irqchip/mmp.h>
15#include <linux/platform_device.h> 17#include <linux/platform_device.h>
16 18
17#include <asm/hardware/cache-tauros2.h> 19#include <asm/hardware/cache-tauros2.h>
@@ -23,6 +25,8 @@
23#include <mach/dma.h> 25#include <mach/dma.h>
24#include <mach/mfp.h> 26#include <mach/mfp.h>
25#include <mach/devices.h> 27#include <mach/devices.h>
28#include <mach/pm-pxa910.h>
29#include <mach/pxa910.h>
26 30
27#include "common.h" 31#include "common.h"
28 32
@@ -79,6 +83,9 @@ static struct mfp_addr_map pxa910_mfp_addr_map[] __initdata =
79void __init pxa910_init_irq(void) 83void __init pxa910_init_irq(void)
80{ 84{
81 icu_init_irq(); 85 icu_init_irq();
86#ifdef CONFIG_PM
87 icu_irq_chip.irq_set_wake = pxa910_set_wake;
88#endif
82} 89}
83 90
84static int __init pxa910_init(void) 91static int __init pxa910_init(void)
diff --git a/arch/arm/mach-mmp/ttc_dkb.c b/arch/arm/mach-mmp/ttc_dkb.c
index 8483906d4308..702232996c8c 100644
--- a/arch/arm/mach-mmp/ttc_dkb.c
+++ b/arch/arm/mach-mmp/ttc_dkb.c
@@ -15,7 +15,7 @@
15#include <linux/mtd/partitions.h> 15#include <linux/mtd/partitions.h>
16#include <linux/mtd/onenand.h> 16#include <linux/mtd/onenand.h>
17#include <linux/interrupt.h> 17#include <linux/interrupt.h>
18#include <linux/i2c/pca953x.h> 18#include <linux/platform_data/pca953x.h>
19#include <linux/gpio.h> 19#include <linux/gpio.h>
20#include <linux/gpio-pxa.h> 20#include <linux/gpio-pxa.h>
21#include <linux/mfd/88pm860x.h> 21#include <linux/mfd/88pm860x.h>
diff --git a/arch/arm/mach-msm/Makefile b/arch/arm/mach-msm/Makefile
index d257ff40e16b..d872634c2f85 100644
--- a/arch/arm/mach-msm/Makefile
+++ b/arch/arm/mach-msm/Makefile
@@ -1,17 +1,16 @@
1obj-y += io.o timer.o 1obj-y += timer.o
2obj-y += clock.o 2obj-y += clock.o
3 3
4obj-$(CONFIG_MSM_VIC) += irq-vic.o 4obj-$(CONFIG_MSM_VIC) += irq-vic.o
5obj-$(CONFIG_MSM_IOMMU) += devices-iommu.o
6 5
7obj-$(CONFIG_ARCH_MSM7X00A) += irq.o 6obj-$(CONFIG_ARCH_MSM7X00A) += irq.o
8obj-$(CONFIG_ARCH_QSD8X50) += sirc.o 7obj-$(CONFIG_ARCH_QSD8X50) += sirc.o
9 8
10obj-$(CONFIG_MSM_PROC_COMM) += proc_comm.o clock-pcom.o vreg.o 9obj-$(CONFIG_MSM_PROC_COMM) += proc_comm.o clock-pcom.o vreg.o
11 10
12obj-$(CONFIG_ARCH_MSM7X00A) += dma.o 11obj-$(CONFIG_ARCH_MSM7X00A) += dma.o io.o
13obj-$(CONFIG_ARCH_MSM7X30) += dma.o 12obj-$(CONFIG_ARCH_MSM7X30) += dma.o io.o
14obj-$(CONFIG_ARCH_QSD8X50) += dma.o 13obj-$(CONFIG_ARCH_QSD8X50) += dma.o io.o
15 14
16obj-$(CONFIG_MSM_SMD) += smd.o smd_debug.o 15obj-$(CONFIG_MSM_SMD) += smd.o smd_debug.o
17obj-$(CONFIG_MSM_SMD) += last_radio_log.o 16obj-$(CONFIG_MSM_SMD) += last_radio_log.o
diff --git a/arch/arm/mach-msm/board-dt-8660.c b/arch/arm/mach-msm/board-dt-8660.c
index 492f5cd87b0a..c2946892f5e3 100644
--- a/arch/arm/mach-msm/board-dt-8660.c
+++ b/arch/arm/mach-msm/board-dt-8660.c
@@ -15,8 +15,8 @@
15#include <linux/of_platform.h> 15#include <linux/of_platform.h>
16 16
17#include <asm/mach/arch.h> 17#include <asm/mach/arch.h>
18#include <asm/mach/map.h>
18 19
19#include <mach/board.h>
20#include "common.h" 20#include "common.h"
21 21
22static void __init msm8x60_init_late(void) 22static void __init msm8x60_init_late(void)
@@ -42,9 +42,7 @@ static const char *msm8x60_fluid_match[] __initdata = {
42 42
43DT_MACHINE_START(MSM_DT, "Qualcomm MSM (Flattened Device Tree)") 43DT_MACHINE_START(MSM_DT, "Qualcomm MSM (Flattened Device Tree)")
44 .smp = smp_ops(msm_smp_ops), 44 .smp = smp_ops(msm_smp_ops),
45 .map_io = msm_map_msm8x60_io,
46 .init_machine = msm8x60_dt_init, 45 .init_machine = msm8x60_dt_init,
47 .init_late = msm8x60_init_late, 46 .init_late = msm8x60_init_late,
48 .init_time = msm_dt_timer_init,
49 .dt_compat = msm8x60_fluid_match, 47 .dt_compat = msm8x60_fluid_match,
50MACHINE_END 48MACHINE_END
diff --git a/arch/arm/mach-msm/board-dt-8960.c b/arch/arm/mach-msm/board-dt-8960.c
index bb5530957c4f..d4ca52c45111 100644
--- a/arch/arm/mach-msm/board-dt-8960.c
+++ b/arch/arm/mach-msm/board-dt-8960.c
@@ -14,6 +14,7 @@
14#include <linux/of_platform.h> 14#include <linux/of_platform.h>
15 15
16#include <asm/mach/arch.h> 16#include <asm/mach/arch.h>
17#include <asm/mach/map.h>
17 18
18#include "common.h" 19#include "common.h"
19 20
@@ -29,8 +30,6 @@ static const char * const msm8960_dt_match[] __initconst = {
29 30
30DT_MACHINE_START(MSM8960_DT, "Qualcomm MSM (Flattened Device Tree)") 31DT_MACHINE_START(MSM8960_DT, "Qualcomm MSM (Flattened Device Tree)")
31 .smp = smp_ops(msm_smp_ops), 32 .smp = smp_ops(msm_smp_ops),
32 .map_io = msm_map_msm8960_io,
33 .init_time = msm_dt_timer_init,
34 .init_machine = msm_dt_init, 33 .init_machine = msm_dt_init,
35 .dt_compat = msm8960_dt_match, 34 .dt_compat = msm8960_dt_match,
36MACHINE_END 35MACHINE_END
diff --git a/arch/arm/mach-msm/board-halibut.c b/arch/arm/mach-msm/board-halibut.c
index 803651ad4f62..a77529887cbc 100644
--- a/arch/arm/mach-msm/board-halibut.c
+++ b/arch/arm/mach-msm/board-halibut.c
@@ -29,7 +29,6 @@
29#include <asm/setup.h> 29#include <asm/setup.h>
30 30
31#include <mach/irqs.h> 31#include <mach/irqs.h>
32#include <mach/board.h>
33#include <mach/msm_iomap.h> 32#include <mach/msm_iomap.h>
34 33
35#include <linux/mtd/nand.h> 34#include <linux/mtd/nand.h>
diff --git a/arch/arm/mach-msm/board-mahimahi.c b/arch/arm/mach-msm/board-mahimahi.c
index 30c3496db593..7d9981cb400e 100644
--- a/arch/arm/mach-msm/board-mahimahi.c
+++ b/arch/arm/mach-msm/board-mahimahi.c
@@ -28,12 +28,12 @@
28#include <asm/mach/map.h> 28#include <asm/mach/map.h>
29#include <asm/setup.h> 29#include <asm/setup.h>
30 30
31#include <mach/board.h>
32#include <mach/hardware.h> 31#include <mach/hardware.h>
33 32
34#include "board-mahimahi.h" 33#include "board-mahimahi.h"
35#include "devices.h" 34#include "devices.h"
36#include "proc_comm.h" 35#include "proc_comm.h"
36#include "common.h"
37 37
38static uint debug_uart; 38static uint debug_uart;
39 39
diff --git a/arch/arm/mach-msm/board-msm7x30.c b/arch/arm/mach-msm/board-msm7x30.c
index db3d8c0bc8a4..f9af5a46e8b6 100644
--- a/arch/arm/mach-msm/board-msm7x30.c
+++ b/arch/arm/mach-msm/board-msm7x30.c
@@ -30,7 +30,6 @@
30#include <asm/memory.h> 30#include <asm/memory.h>
31#include <asm/setup.h> 31#include <asm/setup.h>
32 32
33#include <mach/board.h>
34#include <mach/msm_iomap.h> 33#include <mach/msm_iomap.h>
35#include <mach/dma.h> 34#include <mach/dma.h>
36 35
diff --git a/arch/arm/mach-msm/board-qsd8x50.c b/arch/arm/mach-msm/board-qsd8x50.c
index f14a73d86bc0..5f933bc50783 100644
--- a/arch/arm/mach-msm/board-qsd8x50.c
+++ b/arch/arm/mach-msm/board-qsd8x50.c
@@ -28,7 +28,6 @@
28#include <asm/io.h> 28#include <asm/io.h>
29#include <asm/setup.h> 29#include <asm/setup.h>
30 30
31#include <mach/board.h>
32#include <mach/irqs.h> 31#include <mach/irqs.h>
33#include <mach/sirc.h> 32#include <mach/sirc.h>
34#include <mach/vreg.h> 33#include <mach/vreg.h>
diff --git a/arch/arm/mach-msm/board-sapphire.c b/arch/arm/mach-msm/board-sapphire.c
index 70730111b37c..327605174d63 100644
--- a/arch/arm/mach-msm/board-sapphire.c
+++ b/arch/arm/mach-msm/board-sapphire.c
@@ -28,7 +28,6 @@
28#include <asm/mach/map.h> 28#include <asm/mach/map.h>
29#include <asm/mach/flash.h> 29#include <asm/mach/flash.h>
30#include <mach/vreg.h> 30#include <mach/vreg.h>
31#include <mach/board.h>
32 31
33#include <asm/io.h> 32#include <asm/io.h>
34#include <asm/delay.h> 33#include <asm/delay.h>
@@ -41,6 +40,7 @@
41#include "board-sapphire.h" 40#include "board-sapphire.h"
42#include "proc_comm.h" 41#include "proc_comm.h"
43#include "devices.h" 42#include "devices.h"
43#include "common.h"
44 44
45void msm_init_irq(void); 45void msm_init_irq(void);
46void msm_init_gpio(void); 46void msm_init_gpio(void);
diff --git a/arch/arm/mach-msm/board-trout.c b/arch/arm/mach-msm/board-trout.c
index 64a46eb4fc49..ccf6621bc664 100644
--- a/arch/arm/mach-msm/board-trout.c
+++ b/arch/arm/mach-msm/board-trout.c
@@ -25,7 +25,6 @@
25#include <asm/mach/map.h> 25#include <asm/mach/map.h>
26#include <asm/setup.h> 26#include <asm/setup.h>
27 27
28#include <mach/board.h>
29#include <mach/hardware.h> 28#include <mach/hardware.h>
30#include <mach/msm_iomap.h> 29#include <mach/msm_iomap.h>
31 30
diff --git a/arch/arm/mach-msm/board-trout.h b/arch/arm/mach-msm/board-trout.h
index 651851c3e1dd..b2379ede43bc 100644
--- a/arch/arm/mach-msm/board-trout.h
+++ b/arch/arm/mach-msm/board-trout.h
@@ -4,7 +4,7 @@
4#ifndef __ARCH_ARM_MACH_MSM_BOARD_TROUT_H 4#ifndef __ARCH_ARM_MACH_MSM_BOARD_TROUT_H
5#define __ARCH_ARM_MACH_MSM_BOARD_TROUT_H 5#define __ARCH_ARM_MACH_MSM_BOARD_TROUT_H
6 6
7#include <mach/board.h> 7#include "common.h"
8 8
9#define MSM_SMI_BASE 0x00000000 9#define MSM_SMI_BASE 0x00000000
10#define MSM_SMI_SIZE 0x00800000 10#define MSM_SMI_SIZE 0x00800000
diff --git a/arch/arm/mach-msm/common.h b/arch/arm/mach-msm/common.h
index 421cf7751a80..33c7725adae2 100644
--- a/arch/arm/mach-msm/common.h
+++ b/arch/arm/mach-msm/common.h
@@ -14,13 +14,10 @@
14 14
15extern void msm7x01_timer_init(void); 15extern void msm7x01_timer_init(void);
16extern void msm7x30_timer_init(void); 16extern void msm7x30_timer_init(void);
17extern void msm_dt_timer_init(void);
18extern void qsd8x50_timer_init(void); 17extern void qsd8x50_timer_init(void);
19 18
20extern void msm_map_common_io(void); 19extern void msm_map_common_io(void);
21extern void msm_map_msm7x30_io(void); 20extern void msm_map_msm7x30_io(void);
22extern void msm_map_msm8x60_io(void);
23extern void msm_map_msm8960_io(void);
24extern void msm_map_qsd8x50_io(void); 21extern void msm_map_qsd8x50_io(void);
25 22
26extern void __iomem *__msm_ioremap_caller(phys_addr_t phys_addr, size_t size, 23extern void __iomem *__msm_ioremap_caller(phys_addr_t phys_addr, size_t size,
@@ -29,4 +26,19 @@ extern void __iomem *__msm_ioremap_caller(phys_addr_t phys_addr, size_t size,
29extern struct smp_operations msm_smp_ops; 26extern struct smp_operations msm_smp_ops;
30extern void msm_cpu_die(unsigned int cpu); 27extern void msm_cpu_die(unsigned int cpu);
31 28
29struct msm_mmc_platform_data;
30
31extern void msm_add_devices(void);
32extern void msm_init_irq(void);
33extern void msm_init_gpio(void);
34extern int msm_add_sdcc(unsigned int controller,
35 struct msm_mmc_platform_data *plat,
36 unsigned int stat_irq, unsigned long stat_irq_flags);
37
38#if defined(CONFIG_MSM_SMD) && defined(CONFIG_DEBUG_FS)
39extern int smd_debugfs_init(void);
40#else
41static inline int smd_debugfs_init(void) { return 0; }
42#endif
43
32#endif 44#endif
diff --git a/arch/arm/mach-msm/devices-iommu.c b/arch/arm/mach-msm/devices-iommu.c
deleted file mode 100644
index 0fb7a17df398..000000000000
--- a/arch/arm/mach-msm/devices-iommu.c
+++ /dev/null
@@ -1,912 +0,0 @@
1/* Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
15 * 02110-1301, USA.
16 */
17
18#include <linux/kernel.h>
19#include <linux/platform_device.h>
20#include <linux/bootmem.h>
21#include <linux/module.h>
22#include <mach/irqs.h>
23#include <mach/iommu.h>
24
25static struct resource msm_iommu_jpegd_resources[] = {
26 {
27 .start = 0x07300000,
28 .end = 0x07300000 + SZ_1M - 1,
29 .name = "physbase",
30 .flags = IORESOURCE_MEM,
31 },
32 {
33 .name = "nonsecure_irq",
34 .start = SMMU_JPEGD_CB_SC_NON_SECURE_IRQ,
35 .end = SMMU_JPEGD_CB_SC_NON_SECURE_IRQ,
36 .flags = IORESOURCE_IRQ,
37 },
38 {
39 .name = "secure_irq",
40 .start = SMMU_JPEGD_CB_SC_SECURE_IRQ,
41 .end = SMMU_JPEGD_CB_SC_SECURE_IRQ,
42 .flags = IORESOURCE_IRQ,
43 },
44};
45
46static struct resource msm_iommu_vpe_resources[] = {
47 {
48 .start = 0x07400000,
49 .end = 0x07400000 + SZ_1M - 1,
50 .name = "physbase",
51 .flags = IORESOURCE_MEM,
52 },
53 {
54 .name = "nonsecure_irq",
55 .start = SMMU_VPE_CB_SC_NON_SECURE_IRQ,
56 .end = SMMU_VPE_CB_SC_NON_SECURE_IRQ,
57 .flags = IORESOURCE_IRQ,
58 },
59 {
60 .name = "secure_irq",
61 .start = SMMU_VPE_CB_SC_SECURE_IRQ,
62 .end = SMMU_VPE_CB_SC_SECURE_IRQ,
63 .flags = IORESOURCE_IRQ,
64 },
65};
66
67static struct resource msm_iommu_mdp0_resources[] = {
68 {
69 .start = 0x07500000,
70 .end = 0x07500000 + SZ_1M - 1,
71 .name = "physbase",
72 .flags = IORESOURCE_MEM,
73 },
74 {
75 .name = "nonsecure_irq",
76 .start = SMMU_MDP0_CB_SC_NON_SECURE_IRQ,
77 .end = SMMU_MDP0_CB_SC_NON_SECURE_IRQ,
78 .flags = IORESOURCE_IRQ,
79 },
80 {
81 .name = "secure_irq",
82 .start = SMMU_MDP0_CB_SC_SECURE_IRQ,
83 .end = SMMU_MDP0_CB_SC_SECURE_IRQ,
84 .flags = IORESOURCE_IRQ,
85 },
86};
87
88static struct resource msm_iommu_mdp1_resources[] = {
89 {
90 .start = 0x07600000,
91 .end = 0x07600000 + SZ_1M - 1,
92 .name = "physbase",
93 .flags = IORESOURCE_MEM,
94 },
95 {
96 .name = "nonsecure_irq",
97 .start = SMMU_MDP1_CB_SC_NON_SECURE_IRQ,
98 .end = SMMU_MDP1_CB_SC_NON_SECURE_IRQ,
99 .flags = IORESOURCE_IRQ,
100 },
101 {
102 .name = "secure_irq",
103 .start = SMMU_MDP1_CB_SC_SECURE_IRQ,
104 .end = SMMU_MDP1_CB_SC_SECURE_IRQ,
105 .flags = IORESOURCE_IRQ,
106 },
107};
108
109static struct resource msm_iommu_rot_resources[] = {
110 {
111 .start = 0x07700000,
112 .end = 0x07700000 + SZ_1M - 1,
113 .name = "physbase",
114 .flags = IORESOURCE_MEM,
115 },
116 {
117 .name = "nonsecure_irq",
118 .start = SMMU_ROT_CB_SC_NON_SECURE_IRQ,
119 .end = SMMU_ROT_CB_SC_NON_SECURE_IRQ,
120 .flags = IORESOURCE_IRQ,
121 },
122 {
123 .name = "secure_irq",
124 .start = SMMU_ROT_CB_SC_SECURE_IRQ,
125 .end = SMMU_ROT_CB_SC_SECURE_IRQ,
126 .flags = IORESOURCE_IRQ,
127 },
128};
129
130static struct resource msm_iommu_ijpeg_resources[] = {
131 {
132 .start = 0x07800000,
133 .end = 0x07800000 + SZ_1M - 1,
134 .name = "physbase",
135 .flags = IORESOURCE_MEM,
136 },
137 {
138 .name = "nonsecure_irq",
139 .start = SMMU_IJPEG_CB_SC_NON_SECURE_IRQ,
140 .end = SMMU_IJPEG_CB_SC_NON_SECURE_IRQ,
141 .flags = IORESOURCE_IRQ,
142 },
143 {
144 .name = "secure_irq",
145 .start = SMMU_IJPEG_CB_SC_SECURE_IRQ,
146 .end = SMMU_IJPEG_CB_SC_SECURE_IRQ,
147 .flags = IORESOURCE_IRQ,
148 },
149};
150
151static struct resource msm_iommu_vfe_resources[] = {
152 {
153 .start = 0x07900000,
154 .end = 0x07900000 + SZ_1M - 1,
155 .name = "physbase",
156 .flags = IORESOURCE_MEM,
157 },
158 {
159 .name = "nonsecure_irq",
160 .start = SMMU_VFE_CB_SC_NON_SECURE_IRQ,
161 .end = SMMU_VFE_CB_SC_NON_SECURE_IRQ,
162 .flags = IORESOURCE_IRQ,
163 },
164 {
165 .name = "secure_irq",
166 .start = SMMU_VFE_CB_SC_SECURE_IRQ,
167 .end = SMMU_VFE_CB_SC_SECURE_IRQ,
168 .flags = IORESOURCE_IRQ,
169 },
170};
171
172static struct resource msm_iommu_vcodec_a_resources[] = {
173 {
174 .start = 0x07A00000,
175 .end = 0x07A00000 + SZ_1M - 1,
176 .name = "physbase",
177 .flags = IORESOURCE_MEM,
178 },
179 {
180 .name = "nonsecure_irq",
181 .start = SMMU_VCODEC_A_CB_SC_NON_SECURE_IRQ,
182 .end = SMMU_VCODEC_A_CB_SC_NON_SECURE_IRQ,
183 .flags = IORESOURCE_IRQ,
184 },
185 {
186 .name = "secure_irq",
187 .start = SMMU_VCODEC_A_CB_SC_SECURE_IRQ,
188 .end = SMMU_VCODEC_A_CB_SC_SECURE_IRQ,
189 .flags = IORESOURCE_IRQ,
190 },
191};
192
193static struct resource msm_iommu_vcodec_b_resources[] = {
194 {
195 .start = 0x07B00000,
196 .end = 0x07B00000 + SZ_1M - 1,
197 .name = "physbase",
198 .flags = IORESOURCE_MEM,
199 },
200 {
201 .name = "nonsecure_irq",
202 .start = SMMU_VCODEC_B_CB_SC_NON_SECURE_IRQ,
203 .end = SMMU_VCODEC_B_CB_SC_NON_SECURE_IRQ,
204 .flags = IORESOURCE_IRQ,
205 },
206 {
207 .name = "secure_irq",
208 .start = SMMU_VCODEC_B_CB_SC_SECURE_IRQ,
209 .end = SMMU_VCODEC_B_CB_SC_SECURE_IRQ,
210 .flags = IORESOURCE_IRQ,
211 },
212};
213
214static struct resource msm_iommu_gfx3d_resources[] = {
215 {
216 .start = 0x07C00000,
217 .end = 0x07C00000 + SZ_1M - 1,
218 .name = "physbase",
219 .flags = IORESOURCE_MEM,
220 },
221 {
222 .name = "nonsecure_irq",
223 .start = SMMU_GFX3D_CB_SC_NON_SECURE_IRQ,
224 .end = SMMU_GFX3D_CB_SC_NON_SECURE_IRQ,
225 .flags = IORESOURCE_IRQ,
226 },
227 {
228 .name = "secure_irq",
229 .start = SMMU_GFX3D_CB_SC_SECURE_IRQ,
230 .end = SMMU_GFX3D_CB_SC_SECURE_IRQ,
231 .flags = IORESOURCE_IRQ,
232 },
233};
234
235static struct resource msm_iommu_gfx2d0_resources[] = {
236 {
237 .start = 0x07D00000,
238 .end = 0x07D00000 + SZ_1M - 1,
239 .name = "physbase",
240 .flags = IORESOURCE_MEM,
241 },
242 {
243 .name = "nonsecure_irq",
244 .start = SMMU_GFX2D0_CB_SC_NON_SECURE_IRQ,
245 .end = SMMU_GFX2D0_CB_SC_NON_SECURE_IRQ,
246 .flags = IORESOURCE_IRQ,
247 },
248 {
249 .name = "secure_irq",
250 .start = SMMU_GFX2D0_CB_SC_SECURE_IRQ,
251 .end = SMMU_GFX2D0_CB_SC_SECURE_IRQ,
252 .flags = IORESOURCE_IRQ,
253 },
254};
255
256static struct resource msm_iommu_gfx2d1_resources[] = {
257 {
258 .start = 0x07E00000,
259 .end = 0x07E00000 + SZ_1M - 1,
260 .name = "physbase",
261 .flags = IORESOURCE_MEM,
262 },
263 {
264 .name = "nonsecure_irq",
265 .start = SMMU_GFX2D1_CB_SC_NON_SECURE_IRQ,
266 .end = SMMU_GFX2D1_CB_SC_NON_SECURE_IRQ,
267 .flags = IORESOURCE_IRQ,
268 },
269 {
270 .name = "secure_irq",
271 .start = SMMU_GFX2D1_CB_SC_SECURE_IRQ,
272 .end = SMMU_GFX2D1_CB_SC_SECURE_IRQ,
273 .flags = IORESOURCE_IRQ,
274 },
275};
276
277static struct platform_device msm_root_iommu_dev = {
278 .name = "msm_iommu",
279 .id = -1,
280};
281
282static struct msm_iommu_dev jpegd_iommu = {
283 .name = "jpegd",
284 .ncb = 2,
285};
286
287static struct msm_iommu_dev vpe_iommu = {
288 .name = "vpe",
289 .ncb = 2,
290};
291
292static struct msm_iommu_dev mdp0_iommu = {
293 .name = "mdp0",
294 .ncb = 2,
295};
296
297static struct msm_iommu_dev mdp1_iommu = {
298 .name = "mdp1",
299 .ncb = 2,
300};
301
302static struct msm_iommu_dev rot_iommu = {
303 .name = "rot",
304 .ncb = 2,
305};
306
307static struct msm_iommu_dev ijpeg_iommu = {
308 .name = "ijpeg",
309 .ncb = 2,
310};
311
312static struct msm_iommu_dev vfe_iommu = {
313 .name = "vfe",
314 .ncb = 2,
315};
316
317static struct msm_iommu_dev vcodec_a_iommu = {
318 .name = "vcodec_a",
319 .ncb = 2,
320};
321
322static struct msm_iommu_dev vcodec_b_iommu = {
323 .name = "vcodec_b",
324 .ncb = 2,
325};
326
327static struct msm_iommu_dev gfx3d_iommu = {
328 .name = "gfx3d",
329 .ncb = 3,
330};
331
332static struct msm_iommu_dev gfx2d0_iommu = {
333 .name = "gfx2d0",
334 .ncb = 2,
335};
336
337static struct msm_iommu_dev gfx2d1_iommu = {
338 .name = "gfx2d1",
339 .ncb = 2,
340};
341
342static struct platform_device msm_device_iommu_jpegd = {
343 .name = "msm_iommu",
344 .id = 0,
345 .dev = {
346 .parent = &msm_root_iommu_dev.dev,
347 },
348 .num_resources = ARRAY_SIZE(msm_iommu_jpegd_resources),
349 .resource = msm_iommu_jpegd_resources,
350};
351
352static struct platform_device msm_device_iommu_vpe = {
353 .name = "msm_iommu",
354 .id = 1,
355 .dev = {
356 .parent = &msm_root_iommu_dev.dev,
357 },
358 .num_resources = ARRAY_SIZE(msm_iommu_vpe_resources),
359 .resource = msm_iommu_vpe_resources,
360};
361
362static struct platform_device msm_device_iommu_mdp0 = {
363 .name = "msm_iommu",
364 .id = 2,
365 .dev = {
366 .parent = &msm_root_iommu_dev.dev,
367 },
368 .num_resources = ARRAY_SIZE(msm_iommu_mdp0_resources),
369 .resource = msm_iommu_mdp0_resources,
370};
371
372static struct platform_device msm_device_iommu_mdp1 = {
373 .name = "msm_iommu",
374 .id = 3,
375 .dev = {
376 .parent = &msm_root_iommu_dev.dev,
377 },
378 .num_resources = ARRAY_SIZE(msm_iommu_mdp1_resources),
379 .resource = msm_iommu_mdp1_resources,
380};
381
382static struct platform_device msm_device_iommu_rot = {
383 .name = "msm_iommu",
384 .id = 4,
385 .dev = {
386 .parent = &msm_root_iommu_dev.dev,
387 },
388 .num_resources = ARRAY_SIZE(msm_iommu_rot_resources),
389 .resource = msm_iommu_rot_resources,
390};
391
392static struct platform_device msm_device_iommu_ijpeg = {
393 .name = "msm_iommu",
394 .id = 5,
395 .dev = {
396 .parent = &msm_root_iommu_dev.dev,
397 },
398 .num_resources = ARRAY_SIZE(msm_iommu_ijpeg_resources),
399 .resource = msm_iommu_ijpeg_resources,
400};
401
402static struct platform_device msm_device_iommu_vfe = {
403 .name = "msm_iommu",
404 .id = 6,
405 .dev = {
406 .parent = &msm_root_iommu_dev.dev,
407 },
408 .num_resources = ARRAY_SIZE(msm_iommu_vfe_resources),
409 .resource = msm_iommu_vfe_resources,
410};
411
412static struct platform_device msm_device_iommu_vcodec_a = {
413 .name = "msm_iommu",
414 .id = 7,
415 .dev = {
416 .parent = &msm_root_iommu_dev.dev,
417 },
418 .num_resources = ARRAY_SIZE(msm_iommu_vcodec_a_resources),
419 .resource = msm_iommu_vcodec_a_resources,
420};
421
422static struct platform_device msm_device_iommu_vcodec_b = {
423 .name = "msm_iommu",
424 .id = 8,
425 .dev = {
426 .parent = &msm_root_iommu_dev.dev,
427 },
428 .num_resources = ARRAY_SIZE(msm_iommu_vcodec_b_resources),
429 .resource = msm_iommu_vcodec_b_resources,
430};
431
432static struct platform_device msm_device_iommu_gfx3d = {
433 .name = "msm_iommu",
434 .id = 9,
435 .dev = {
436 .parent = &msm_root_iommu_dev.dev,
437 },
438 .num_resources = ARRAY_SIZE(msm_iommu_gfx3d_resources),
439 .resource = msm_iommu_gfx3d_resources,
440};
441
442static struct platform_device msm_device_iommu_gfx2d0 = {
443 .name = "msm_iommu",
444 .id = 10,
445 .dev = {
446 .parent = &msm_root_iommu_dev.dev,
447 },
448 .num_resources = ARRAY_SIZE(msm_iommu_gfx2d0_resources),
449 .resource = msm_iommu_gfx2d0_resources,
450};
451
452struct platform_device msm_device_iommu_gfx2d1 = {
453 .name = "msm_iommu",
454 .id = 11,
455 .dev = {
456 .parent = &msm_root_iommu_dev.dev,
457 },
458 .num_resources = ARRAY_SIZE(msm_iommu_gfx2d1_resources),
459 .resource = msm_iommu_gfx2d1_resources,
460};
461
462static struct msm_iommu_ctx_dev jpegd_src_ctx = {
463 .name = "jpegd_src",
464 .num = 0,
465 .mids = {0, -1}
466};
467
468static struct msm_iommu_ctx_dev jpegd_dst_ctx = {
469 .name = "jpegd_dst",
470 .num = 1,
471 .mids = {1, -1}
472};
473
474static struct msm_iommu_ctx_dev vpe_src_ctx = {
475 .name = "vpe_src",
476 .num = 0,
477 .mids = {0, -1}
478};
479
480static struct msm_iommu_ctx_dev vpe_dst_ctx = {
481 .name = "vpe_dst",
482 .num = 1,
483 .mids = {1, -1}
484};
485
486static struct msm_iommu_ctx_dev mdp_vg1_ctx = {
487 .name = "mdp_vg1",
488 .num = 0,
489 .mids = {0, 2, -1}
490};
491
492static struct msm_iommu_ctx_dev mdp_rgb1_ctx = {
493 .name = "mdp_rgb1",
494 .num = 1,
495 .mids = {1, 3, 4, 5, 6, 7, 8, 9, 10, -1}
496};
497
498static struct msm_iommu_ctx_dev mdp_vg2_ctx = {
499 .name = "mdp_vg2",
500 .num = 0,
501 .mids = {0, 2, -1}
502};
503
504static struct msm_iommu_ctx_dev mdp_rgb2_ctx = {
505 .name = "mdp_rgb2",
506 .num = 1,
507 .mids = {1, 3, 4, 5, 6, 7, 8, 9, 10, -1}
508};
509
510static struct msm_iommu_ctx_dev rot_src_ctx = {
511 .name = "rot_src",
512 .num = 0,
513 .mids = {0, -1}
514};
515
516static struct msm_iommu_ctx_dev rot_dst_ctx = {
517 .name = "rot_dst",
518 .num = 1,
519 .mids = {1, -1}
520};
521
522static struct msm_iommu_ctx_dev ijpeg_src_ctx = {
523 .name = "ijpeg_src",
524 .num = 0,
525 .mids = {0, -1}
526};
527
528static struct msm_iommu_ctx_dev ijpeg_dst_ctx = {
529 .name = "ijpeg_dst",
530 .num = 1,
531 .mids = {1, -1}
532};
533
534static struct msm_iommu_ctx_dev vfe_imgwr_ctx = {
535 .name = "vfe_imgwr",
536 .num = 0,
537 .mids = {2, 3, 4, 5, 6, 7, 8, -1}
538};
539
540static struct msm_iommu_ctx_dev vfe_misc_ctx = {
541 .name = "vfe_misc",
542 .num = 1,
543 .mids = {0, 1, 9, -1}
544};
545
546static struct msm_iommu_ctx_dev vcodec_a_stream_ctx = {
547 .name = "vcodec_a_stream",
548 .num = 0,
549 .mids = {2, 5, -1}
550};
551
552static struct msm_iommu_ctx_dev vcodec_a_mm1_ctx = {
553 .name = "vcodec_a_mm1",
554 .num = 1,
555 .mids = {0, 1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -1}
556};
557
558static struct msm_iommu_ctx_dev vcodec_b_mm2_ctx = {
559 .name = "vcodec_b_mm2",
560 .num = 0,
561 .mids = {0, 1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -1}
562};
563
564static struct msm_iommu_ctx_dev gfx3d_user_ctx = {
565 .name = "gfx3d_user",
566 .num = 0,
567 .mids = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, -1}
568};
569
570static struct msm_iommu_ctx_dev gfx3d_priv_ctx = {
571 .name = "gfx3d_priv",
572 .num = 1,
573 .mids = {16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
574 31, -1}
575};
576
577static struct msm_iommu_ctx_dev gfx2d0_2d0_ctx = {
578 .name = "gfx2d0_2d0",
579 .num = 0,
580 .mids = {0, 1, 2, 3, 4, 5, 6, 7, -1}
581};
582
583static struct msm_iommu_ctx_dev gfx2d1_2d1_ctx = {
584 .name = "gfx2d1_2d1",
585 .num = 0,
586 .mids = {0, 1, 2, 3, 4, 5, 6, 7, -1}
587};
588
589static struct platform_device msm_device_jpegd_src_ctx = {
590 .name = "msm_iommu_ctx",
591 .id = 0,
592 .dev = {
593 .parent = &msm_device_iommu_jpegd.dev,
594 },
595};
596
597static struct platform_device msm_device_jpegd_dst_ctx = {
598 .name = "msm_iommu_ctx",
599 .id = 1,
600 .dev = {
601 .parent = &msm_device_iommu_jpegd.dev,
602 },
603};
604
605static struct platform_device msm_device_vpe_src_ctx = {
606 .name = "msm_iommu_ctx",
607 .id = 2,
608 .dev = {
609 .parent = &msm_device_iommu_vpe.dev,
610 },
611};
612
613static struct platform_device msm_device_vpe_dst_ctx = {
614 .name = "msm_iommu_ctx",
615 .id = 3,
616 .dev = {
617 .parent = &msm_device_iommu_vpe.dev,
618 },
619};
620
621static struct platform_device msm_device_mdp_vg1_ctx = {
622 .name = "msm_iommu_ctx",
623 .id = 4,
624 .dev = {
625 .parent = &msm_device_iommu_mdp0.dev,
626 },
627};
628
629static struct platform_device msm_device_mdp_rgb1_ctx = {
630 .name = "msm_iommu_ctx",
631 .id = 5,
632 .dev = {
633 .parent = &msm_device_iommu_mdp0.dev,
634 },
635};
636
637static struct platform_device msm_device_mdp_vg2_ctx = {
638 .name = "msm_iommu_ctx",
639 .id = 6,
640 .dev = {
641 .parent = &msm_device_iommu_mdp1.dev,
642 },
643};
644
645static struct platform_device msm_device_mdp_rgb2_ctx = {
646 .name = "msm_iommu_ctx",
647 .id = 7,
648 .dev = {
649 .parent = &msm_device_iommu_mdp1.dev,
650 },
651};
652
653static struct platform_device msm_device_rot_src_ctx = {
654 .name = "msm_iommu_ctx",
655 .id = 8,
656 .dev = {
657 .parent = &msm_device_iommu_rot.dev,
658 },
659};
660
661static struct platform_device msm_device_rot_dst_ctx = {
662 .name = "msm_iommu_ctx",
663 .id = 9,
664 .dev = {
665 .parent = &msm_device_iommu_rot.dev,
666 },
667};
668
669static struct platform_device msm_device_ijpeg_src_ctx = {
670 .name = "msm_iommu_ctx",
671 .id = 10,
672 .dev = {
673 .parent = &msm_device_iommu_ijpeg.dev,
674 },
675};
676
677static struct platform_device msm_device_ijpeg_dst_ctx = {
678 .name = "msm_iommu_ctx",
679 .id = 11,
680 .dev = {
681 .parent = &msm_device_iommu_ijpeg.dev,
682 },
683};
684
685static struct platform_device msm_device_vfe_imgwr_ctx = {
686 .name = "msm_iommu_ctx",
687 .id = 12,
688 .dev = {
689 .parent = &msm_device_iommu_vfe.dev,
690 },
691};
692
693static struct platform_device msm_device_vfe_misc_ctx = {
694 .name = "msm_iommu_ctx",
695 .id = 13,
696 .dev = {
697 .parent = &msm_device_iommu_vfe.dev,
698 },
699};
700
701static struct platform_device msm_device_vcodec_a_stream_ctx = {
702 .name = "msm_iommu_ctx",
703 .id = 14,
704 .dev = {
705 .parent = &msm_device_iommu_vcodec_a.dev,
706 },
707};
708
709static struct platform_device msm_device_vcodec_a_mm1_ctx = {
710 .name = "msm_iommu_ctx",
711 .id = 15,
712 .dev = {
713 .parent = &msm_device_iommu_vcodec_a.dev,
714 },
715};
716
717static struct platform_device msm_device_vcodec_b_mm2_ctx = {
718 .name = "msm_iommu_ctx",
719 .id = 16,
720 .dev = {
721 .parent = &msm_device_iommu_vcodec_b.dev,
722 },
723};
724
725static struct platform_device msm_device_gfx3d_user_ctx = {
726 .name = "msm_iommu_ctx",
727 .id = 17,
728 .dev = {
729 .parent = &msm_device_iommu_gfx3d.dev,
730 },
731};
732
733static struct platform_device msm_device_gfx3d_priv_ctx = {
734 .name = "msm_iommu_ctx",
735 .id = 18,
736 .dev = {
737 .parent = &msm_device_iommu_gfx3d.dev,
738 },
739};
740
741static struct platform_device msm_device_gfx2d0_2d0_ctx = {
742 .name = "msm_iommu_ctx",
743 .id = 19,
744 .dev = {
745 .parent = &msm_device_iommu_gfx2d0.dev,
746 },
747};
748
749static struct platform_device msm_device_gfx2d1_2d1_ctx = {
750 .name = "msm_iommu_ctx",
751 .id = 20,
752 .dev = {
753 .parent = &msm_device_iommu_gfx2d1.dev,
754 },
755};
756
757static struct platform_device *msm_iommu_devs[] = {
758 &msm_device_iommu_jpegd,
759 &msm_device_iommu_vpe,
760 &msm_device_iommu_mdp0,
761 &msm_device_iommu_mdp1,
762 &msm_device_iommu_rot,
763 &msm_device_iommu_ijpeg,
764 &msm_device_iommu_vfe,
765 &msm_device_iommu_vcodec_a,
766 &msm_device_iommu_vcodec_b,
767 &msm_device_iommu_gfx3d,
768 &msm_device_iommu_gfx2d0,
769 &msm_device_iommu_gfx2d1,
770};
771
772static struct msm_iommu_dev *msm_iommu_data[] = {
773 &jpegd_iommu,
774 &vpe_iommu,
775 &mdp0_iommu,
776 &mdp1_iommu,
777 &rot_iommu,
778 &ijpeg_iommu,
779 &vfe_iommu,
780 &vcodec_a_iommu,
781 &vcodec_b_iommu,
782 &gfx3d_iommu,
783 &gfx2d0_iommu,
784 &gfx2d1_iommu,
785};
786
787static struct platform_device *msm_iommu_ctx_devs[] = {
788 &msm_device_jpegd_src_ctx,
789 &msm_device_jpegd_dst_ctx,
790 &msm_device_vpe_src_ctx,
791 &msm_device_vpe_dst_ctx,
792 &msm_device_mdp_vg1_ctx,
793 &msm_device_mdp_rgb1_ctx,
794 &msm_device_mdp_vg2_ctx,
795 &msm_device_mdp_rgb2_ctx,
796 &msm_device_rot_src_ctx,
797 &msm_device_rot_dst_ctx,
798 &msm_device_ijpeg_src_ctx,
799 &msm_device_ijpeg_dst_ctx,
800 &msm_device_vfe_imgwr_ctx,
801 &msm_device_vfe_misc_ctx,
802 &msm_device_vcodec_a_stream_ctx,
803 &msm_device_vcodec_a_mm1_ctx,
804 &msm_device_vcodec_b_mm2_ctx,
805 &msm_device_gfx3d_user_ctx,
806 &msm_device_gfx3d_priv_ctx,
807 &msm_device_gfx2d0_2d0_ctx,
808 &msm_device_gfx2d1_2d1_ctx,
809};
810
811static struct msm_iommu_ctx_dev *msm_iommu_ctx_data[] = {
812 &jpegd_src_ctx,
813 &jpegd_dst_ctx,
814 &vpe_src_ctx,
815 &vpe_dst_ctx,
816 &mdp_vg1_ctx,
817 &mdp_rgb1_ctx,
818 &mdp_vg2_ctx,
819 &mdp_rgb2_ctx,
820 &rot_src_ctx,
821 &rot_dst_ctx,
822 &ijpeg_src_ctx,
823 &ijpeg_dst_ctx,
824 &vfe_imgwr_ctx,
825 &vfe_misc_ctx,
826 &vcodec_a_stream_ctx,
827 &vcodec_a_mm1_ctx,
828 &vcodec_b_mm2_ctx,
829 &gfx3d_user_ctx,
830 &gfx3d_priv_ctx,
831 &gfx2d0_2d0_ctx,
832 &gfx2d1_2d1_ctx,
833};
834
835static int __init msm8x60_iommu_init(void)
836{
837 int ret, i;
838
839 ret = platform_device_register(&msm_root_iommu_dev);
840 if (ret != 0) {
841 pr_err("Failed to register root IOMMU device!\n");
842 goto failure;
843 }
844
845 for (i = 0; i < ARRAY_SIZE(msm_iommu_devs); i++) {
846 ret = platform_device_add_data(msm_iommu_devs[i],
847 msm_iommu_data[i],
848 sizeof(struct msm_iommu_dev));
849 if (ret != 0) {
850 pr_err("platform_device_add_data failed, "
851 "i = %d\n", i);
852 goto failure_unwind;
853 }
854
855 ret = platform_device_register(msm_iommu_devs[i]);
856
857 if (ret != 0) {
858 pr_err("platform_device_register iommu failed, "
859 "i = %d\n", i);
860 goto failure_unwind;
861 }
862 }
863
864 for (i = 0; i < ARRAY_SIZE(msm_iommu_ctx_devs); i++) {
865 ret = platform_device_add_data(msm_iommu_ctx_devs[i],
866 msm_iommu_ctx_data[i],
867 sizeof(*msm_iommu_ctx_devs[i]));
868 if (ret != 0) {
869 pr_err("platform_device_add_data iommu failed, "
870 "i = %d\n", i);
871 goto failure_unwind2;
872 }
873
874 ret = platform_device_register(msm_iommu_ctx_devs[i]);
875 if (ret != 0) {
876 pr_err("platform_device_register ctx failed, "
877 "i = %d\n", i);
878 goto failure_unwind2;
879 }
880 }
881 return 0;
882
883failure_unwind2:
884 while (--i >= 0)
885 platform_device_unregister(msm_iommu_ctx_devs[i]);
886failure_unwind:
887 while (--i >= 0)
888 platform_device_unregister(msm_iommu_devs[i]);
889
890 platform_device_unregister(&msm_root_iommu_dev);
891failure:
892 return ret;
893}
894
895static void __exit msm8x60_iommu_exit(void)
896{
897 int i;
898
899 for (i = 0; i < ARRAY_SIZE(msm_iommu_ctx_devs); i++)
900 platform_device_unregister(msm_iommu_ctx_devs[i]);
901
902 for (i = 0; i < ARRAY_SIZE(msm_iommu_devs); ++i)
903 platform_device_unregister(msm_iommu_devs[i]);
904
905 platform_device_unregister(&msm_root_iommu_dev);
906}
907
908subsys_initcall(msm8x60_iommu_init);
909module_exit(msm8x60_iommu_exit);
910
911MODULE_LICENSE("GPL v2");
912MODULE_AUTHOR("Stepan Moskovchenko <stepanm@codeaurora.org>");
diff --git a/arch/arm/mach-msm/devices-msm7x00.c b/arch/arm/mach-msm/devices-msm7x00.c
index 6d50fb964863..d83404d4b328 100644
--- a/arch/arm/mach-msm/devices-msm7x00.c
+++ b/arch/arm/mach-msm/devices-msm7x00.c
@@ -456,9 +456,9 @@ static struct clk_pcom_desc msm_clocks_7x01a[] = {
456 CLK_PCOM("tsif_ref_clk", TSIF_REF_CLK, NULL, 0), 456 CLK_PCOM("tsif_ref_clk", TSIF_REF_CLK, NULL, 0),
457 CLK_PCOM("tv_dac_clk", TV_DAC_CLK, NULL, 0), 457 CLK_PCOM("tv_dac_clk", TV_DAC_CLK, NULL, 0),
458 CLK_PCOM("tv_enc_clk", TV_ENC_CLK, NULL, 0), 458 CLK_PCOM("tv_enc_clk", TV_ENC_CLK, NULL, 0),
459 CLK_PCOM("uart_clk", UART1_CLK, "msm_serial.0", OFF), 459 CLK_PCOM("core", UART1_CLK, "msm_serial.0", OFF),
460 CLK_PCOM("uart_clk", UART2_CLK, "msm_serial.1", 0), 460 CLK_PCOM("core", UART2_CLK, "msm_serial.1", 0),
461 CLK_PCOM("uart_clk", UART3_CLK, "msm_serial.2", OFF), 461 CLK_PCOM("core", UART3_CLK, "msm_serial.2", OFF),
462 CLK_PCOM("uart1dm_clk", UART1DM_CLK, NULL, OFF), 462 CLK_PCOM("uart1dm_clk", UART1DM_CLK, NULL, OFF),
463 CLK_PCOM("uart2dm_clk", UART2DM_CLK, NULL, 0), 463 CLK_PCOM("uart2dm_clk", UART2DM_CLK, NULL, 0),
464 CLK_PCOM("usb_hs_clk", USB_HS_CLK, "msm_hsusb", OFF), 464 CLK_PCOM("usb_hs_clk", USB_HS_CLK, "msm_hsusb", OFF),
diff --git a/arch/arm/mach-msm/devices-msm7x30.c b/arch/arm/mach-msm/devices-msm7x30.c
index d4db75acff56..c15ea8ab20a7 100644
--- a/arch/arm/mach-msm/devices-msm7x30.c
+++ b/arch/arm/mach-msm/devices-msm7x30.c
@@ -21,10 +21,10 @@
21#include <mach/irqs.h> 21#include <mach/irqs.h>
22#include <mach/msm_iomap.h> 22#include <mach/msm_iomap.h>
23#include <mach/dma.h> 23#include <mach/dma.h>
24#include <mach/board.h>
25 24
26#include "devices.h" 25#include "devices.h"
27#include "smd_private.h" 26#include "smd_private.h"
27#include "common.h"
28 28
29#include <asm/mach/flash.h> 29#include <asm/mach/flash.h>
30 30
@@ -211,7 +211,7 @@ static struct clk_pcom_desc msm_clocks_7x30[] = {
211 CLK_PCOM("spi_pclk", SPI_P_CLK, NULL, 0), 211 CLK_PCOM("spi_pclk", SPI_P_CLK, NULL, 0),
212 CLK_PCOM("tv_dac_clk", TV_DAC_CLK, NULL, 0), 212 CLK_PCOM("tv_dac_clk", TV_DAC_CLK, NULL, 0),
213 CLK_PCOM("tv_enc_clk", TV_ENC_CLK, NULL, 0), 213 CLK_PCOM("tv_enc_clk", TV_ENC_CLK, NULL, 0),
214 CLK_PCOM("uart_clk", UART2_CLK, "msm_serial.1", 0), 214 CLK_PCOM("core", UART2_CLK, "msm_serial.1", 0),
215 CLK_PCOM("usb_phy_clk", USB_PHY_CLK, NULL, 0), 215 CLK_PCOM("usb_phy_clk", USB_PHY_CLK, NULL, 0),
216 CLK_PCOM("usb_hs_clk", USB_HS_CLK, NULL, OFF), 216 CLK_PCOM("usb_hs_clk", USB_HS_CLK, NULL, OFF),
217 CLK_PCOM("usb_hs_pclk", USB_HS_P_CLK, NULL, OFF), 217 CLK_PCOM("usb_hs_pclk", USB_HS_P_CLK, NULL, OFF),
diff --git a/arch/arm/mach-msm/devices-qsd8x50.c b/arch/arm/mach-msm/devices-qsd8x50.c
index f5518112284b..9e1e9ce07b1a 100644
--- a/arch/arm/mach-msm/devices-qsd8x50.c
+++ b/arch/arm/mach-msm/devices-qsd8x50.c
@@ -21,9 +21,9 @@
21#include <mach/irqs.h> 21#include <mach/irqs.h>
22#include <mach/msm_iomap.h> 22#include <mach/msm_iomap.h>
23#include <mach/dma.h> 23#include <mach/dma.h>
24#include <mach/board.h>
25 24
26#include "devices.h" 25#include "devices.h"
26#include "common.h"
27 27
28#include <asm/mach/flash.h> 28#include <asm/mach/flash.h>
29 29
@@ -358,9 +358,9 @@ static struct clk_pcom_desc msm_clocks_8x50[] = {
358 CLK_PCOM("tsif_ref_clk", TSIF_REF_CLK, NULL, 0), 358 CLK_PCOM("tsif_ref_clk", TSIF_REF_CLK, NULL, 0),
359 CLK_PCOM("tv_dac_clk", TV_DAC_CLK, NULL, 0), 359 CLK_PCOM("tv_dac_clk", TV_DAC_CLK, NULL, 0),
360 CLK_PCOM("tv_enc_clk", TV_ENC_CLK, NULL, 0), 360 CLK_PCOM("tv_enc_clk", TV_ENC_CLK, NULL, 0),
361 CLK_PCOM("uart_clk", UART1_CLK, NULL, OFF), 361 CLK_PCOM("core", UART1_CLK, NULL, OFF),
362 CLK_PCOM("uart_clk", UART2_CLK, NULL, 0), 362 CLK_PCOM("core", UART2_CLK, NULL, 0),
363 CLK_PCOM("uart_clk", UART3_CLK, "msm_serial.2", OFF), 363 CLK_PCOM("core", UART3_CLK, "msm_serial.2", OFF),
364 CLK_PCOM("uartdm_clk", UART1DM_CLK, NULL, OFF), 364 CLK_PCOM("uartdm_clk", UART1DM_CLK, NULL, OFF),
365 CLK_PCOM("uartdm_clk", UART2DM_CLK, NULL, 0), 365 CLK_PCOM("uartdm_clk", UART2DM_CLK, NULL, 0),
366 CLK_PCOM("usb_hs_clk", USB_HS_CLK, NULL, OFF), 366 CLK_PCOM("usb_hs_clk", USB_HS_CLK, NULL, OFF),
diff --git a/arch/arm/mach-msm/include/mach/board.h b/arch/arm/mach-msm/include/mach/board.h
deleted file mode 100644
index c34e246a3e07..000000000000
--- a/arch/arm/mach-msm/include/mach/board.h
+++ /dev/null
@@ -1,38 +0,0 @@
1/* arch/arm/mach-msm/include/mach/board.h
2 *
3 * Copyright (C) 2007 Google, Inc.
4 * Author: Brian Swetland <swetland@google.com>
5 *
6 * This software is licensed under the terms of the GNU General Public
7 * License version 2, as published by the Free Software Foundation, and
8 * may be copied, distributed, and modified under those terms.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 */
16
17#ifndef __ASM_ARCH_MSM_BOARD_H
18#define __ASM_ARCH_MSM_BOARD_H
19
20#include <linux/types.h>
21#include <linux/platform_data/mmc-msm_sdcc.h>
22
23/* common init routines for use by arch/arm/mach-msm/board-*.c */
24
25void __init msm_add_devices(void);
26void __init msm_init_irq(void);
27void __init msm_init_gpio(void);
28int __init msm_add_sdcc(unsigned int controller,
29 struct msm_mmc_platform_data *plat,
30 unsigned int stat_irq, unsigned long stat_irq_flags);
31
32#if defined(CONFIG_MSM_SMD) && defined(CONFIG_DEBUG_FS)
33int smd_debugfs_init(void);
34#else
35static inline int smd_debugfs_init(void) { return 0; }
36#endif
37
38#endif
diff --git a/arch/arm/mach-msm/include/mach/iommu.h b/arch/arm/mach-msm/include/mach/iommu.h
deleted file mode 100644
index 5c7c955e6d25..000000000000
--- a/arch/arm/mach-msm/include/mach/iommu.h
+++ /dev/null
@@ -1,120 +0,0 @@
1/* Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
15 * 02110-1301, USA.
16 */
17
18#ifndef MSM_IOMMU_H
19#define MSM_IOMMU_H
20
21#include <linux/interrupt.h>
22#include <linux/clk.h>
23
24/* Sharability attributes of MSM IOMMU mappings */
25#define MSM_IOMMU_ATTR_NON_SH 0x0
26#define MSM_IOMMU_ATTR_SH 0x4
27
28/* Cacheability attributes of MSM IOMMU mappings */
29#define MSM_IOMMU_ATTR_NONCACHED 0x0
30#define MSM_IOMMU_ATTR_CACHED_WB_WA 0x1
31#define MSM_IOMMU_ATTR_CACHED_WB_NWA 0x2
32#define MSM_IOMMU_ATTR_CACHED_WT 0x3
33
34/* Mask for the cache policy attribute */
35#define MSM_IOMMU_CP_MASK 0x03
36
37/* Maximum number of Machine IDs that we are allowing to be mapped to the same
38 * context bank. The number of MIDs mapped to the same CB does not affect
39 * performance, but there is a practical limit on how many distinct MIDs may
40 * be present. These mappings are typically determined at design time and are
41 * not expected to change at run time.
42 */
43#define MAX_NUM_MIDS 32
44
45/**
46 * struct msm_iommu_dev - a single IOMMU hardware instance
47 * name Human-readable name given to this IOMMU HW instance
48 * ncb Number of context banks present on this IOMMU HW instance
49 */
50struct msm_iommu_dev {
51 const char *name;
52 int ncb;
53};
54
55/**
56 * struct msm_iommu_ctx_dev - an IOMMU context bank instance
57 * name Human-readable name given to this context bank
58 * num Index of this context bank within the hardware
59 * mids List of Machine IDs that are to be mapped into this context
60 * bank, terminated by -1. The MID is a set of signals on the
61 * AXI bus that identifies the function associated with a specific
62 * memory request. (See ARM spec).
63 */
64struct msm_iommu_ctx_dev {
65 const char *name;
66 int num;
67 int mids[MAX_NUM_MIDS];
68};
69
70
71/**
72 * struct msm_iommu_drvdata - A single IOMMU hardware instance
73 * @base: IOMMU config port base address (VA)
74 * @ncb The number of contexts on this IOMMU
75 * @irq: Interrupt number
76 * @clk: The bus clock for this IOMMU hardware instance
77 * @pclk: The clock for the IOMMU bus interconnect
78 *
79 * A msm_iommu_drvdata holds the global driver data about a single piece
80 * of an IOMMU hardware instance.
81 */
82struct msm_iommu_drvdata {
83 void __iomem *base;
84 int irq;
85 int ncb;
86 struct clk *clk;
87 struct clk *pclk;
88};
89
90/**
91 * struct msm_iommu_ctx_drvdata - an IOMMU context bank instance
92 * @num: Hardware context number of this context
93 * @pdev: Platform device associated wit this HW instance
94 * @attached_elm: List element for domains to track which devices are
95 * attached to them
96 *
97 * A msm_iommu_ctx_drvdata holds the driver data for a single context bank
98 * within each IOMMU hardware instance
99 */
100struct msm_iommu_ctx_drvdata {
101 int num;
102 struct platform_device *pdev;
103 struct list_head attached_elm;
104};
105
106/*
107 * Look up an IOMMU context device by its context name. NULL if none found.
108 * Useful for testing and drivers that do not yet fully have IOMMU stuff in
109 * their platform devices.
110 */
111struct device *msm_iommu_get_ctx(const char *ctx_name);
112
113/*
114 * Interrupt handler for the IOMMU context fault interrupt. Hooking the
115 * interrupt is not supported in the API yet, but this will print an error
116 * message and dump useful IOMMU registers.
117 */
118irqreturn_t msm_iommu_fault_handler(int irq, void *dev_id);
119
120#endif
diff --git a/arch/arm/mach-msm/include/mach/iommu_hw-8xxx.h b/arch/arm/mach-msm/include/mach/iommu_hw-8xxx.h
deleted file mode 100644
index fc160101dead..000000000000
--- a/arch/arm/mach-msm/include/mach/iommu_hw-8xxx.h
+++ /dev/null
@@ -1,1865 +0,0 @@
1/* Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
15 * 02110-1301, USA.
16 */
17
18#ifndef __ARCH_ARM_MACH_MSM_IOMMU_HW_8XXX_H
19#define __ARCH_ARM_MACH_MSM_IOMMU_HW_8XXX_H
20
21#define CTX_SHIFT 12
22
23#define GET_GLOBAL_REG(reg, base) (readl((base) + (reg)))
24#define GET_CTX_REG(reg, base, ctx) \
25 (readl((base) + (reg) + ((ctx) << CTX_SHIFT)))
26
27#define SET_GLOBAL_REG(reg, base, val) writel((val), ((base) + (reg)))
28
29#define SET_CTX_REG(reg, base, ctx, val) \
30 writel((val), ((base) + (reg) + ((ctx) << CTX_SHIFT)))
31
32/* Wrappers for numbered registers */
33#define SET_GLOBAL_REG_N(b, n, r, v) SET_GLOBAL_REG(b, ((r) + (n << 2)), (v))
34#define GET_GLOBAL_REG_N(b, n, r) GET_GLOBAL_REG(b, ((r) + (n << 2)))
35
36/* Field wrappers */
37#define GET_GLOBAL_FIELD(b, r, F) GET_FIELD(((b) + (r)), F##_MASK, F##_SHIFT)
38#define GET_CONTEXT_FIELD(b, c, r, F) \
39 GET_FIELD(((b) + (r) + ((c) << CTX_SHIFT)), F##_MASK, F##_SHIFT)
40
41#define SET_GLOBAL_FIELD(b, r, F, v) \
42 SET_FIELD(((b) + (r)), F##_MASK, F##_SHIFT, (v))
43#define SET_CONTEXT_FIELD(b, c, r, F, v) \
44 SET_FIELD(((b) + (r) + ((c) << CTX_SHIFT)), F##_MASK, F##_SHIFT, (v))
45
46#define GET_FIELD(addr, mask, shift) ((readl(addr) >> (shift)) & (mask))
47
48#define SET_FIELD(addr, mask, shift, v) \
49do { \
50 int t = readl(addr); \
51 writel((t & ~((mask) << (shift))) + (((v) & (mask)) << (shift)), addr);\
52} while (0)
53
54
55#define NUM_FL_PTE 4096
56#define NUM_SL_PTE 256
57#define NUM_TEX_CLASS 8
58
59/* First-level page table bits */
60#define FL_BASE_MASK 0xFFFFFC00
61#define FL_TYPE_TABLE (1 << 0)
62#define FL_TYPE_SECT (2 << 0)
63#define FL_SUPERSECTION (1 << 18)
64#define FL_AP_WRITE (1 << 10)
65#define FL_AP_READ (1 << 11)
66#define FL_SHARED (1 << 16)
67#define FL_BUFFERABLE (1 << 2)
68#define FL_CACHEABLE (1 << 3)
69#define FL_TEX0 (1 << 12)
70#define FL_OFFSET(va) (((va) & 0xFFF00000) >> 20)
71#define FL_NG (1 << 17)
72
73/* Second-level page table bits */
74#define SL_BASE_MASK_LARGE 0xFFFF0000
75#define SL_BASE_MASK_SMALL 0xFFFFF000
76#define SL_TYPE_LARGE (1 << 0)
77#define SL_TYPE_SMALL (2 << 0)
78#define SL_AP0 (1 << 4)
79#define SL_AP1 (2 << 4)
80#define SL_SHARED (1 << 10)
81#define SL_BUFFERABLE (1 << 2)
82#define SL_CACHEABLE (1 << 3)
83#define SL_TEX0 (1 << 6)
84#define SL_OFFSET(va) (((va) & 0xFF000) >> 12)
85#define SL_NG (1 << 11)
86
87/* Memory type and cache policy attributes */
88#define MT_SO 0
89#define MT_DEV 1
90#define MT_NORMAL 2
91#define CP_NONCACHED 0
92#define CP_WB_WA 1
93#define CP_WT 2
94#define CP_WB_NWA 3
95
96/* Global register setters / getters */
97#define SET_M2VCBR_N(b, N, v) SET_GLOBAL_REG_N(M2VCBR_N, N, (b), (v))
98#define SET_CBACR_N(b, N, v) SET_GLOBAL_REG_N(CBACR_N, N, (b), (v))
99#define SET_TLBRSW(b, v) SET_GLOBAL_REG(TLBRSW, (b), (v))
100#define SET_TLBTR0(b, v) SET_GLOBAL_REG(TLBTR0, (b), (v))
101#define SET_TLBTR1(b, v) SET_GLOBAL_REG(TLBTR1, (b), (v))
102#define SET_TLBTR2(b, v) SET_GLOBAL_REG(TLBTR2, (b), (v))
103#define SET_TESTBUSCR(b, v) SET_GLOBAL_REG(TESTBUSCR, (b), (v))
104#define SET_GLOBAL_TLBIALL(b, v) SET_GLOBAL_REG(GLOBAL_TLBIALL, (b), (v))
105#define SET_TLBIVMID(b, v) SET_GLOBAL_REG(TLBIVMID, (b), (v))
106#define SET_CR(b, v) SET_GLOBAL_REG(CR, (b), (v))
107#define SET_EAR(b, v) SET_GLOBAL_REG(EAR, (b), (v))
108#define SET_ESR(b, v) SET_GLOBAL_REG(ESR, (b), (v))
109#define SET_ESRRESTORE(b, v) SET_GLOBAL_REG(ESRRESTORE, (b), (v))
110#define SET_ESYNR0(b, v) SET_GLOBAL_REG(ESYNR0, (b), (v))
111#define SET_ESYNR1(b, v) SET_GLOBAL_REG(ESYNR1, (b), (v))
112#define SET_RPU_ACR(b, v) SET_GLOBAL_REG(RPU_ACR, (b), (v))
113
114#define GET_M2VCBR_N(b, N) GET_GLOBAL_REG_N(M2VCBR_N, N, (b))
115#define GET_CBACR_N(b, N) GET_GLOBAL_REG_N(CBACR_N, N, (b))
116#define GET_TLBTR0(b) GET_GLOBAL_REG(TLBTR0, (b))
117#define GET_TLBTR1(b) GET_GLOBAL_REG(TLBTR1, (b))
118#define GET_TLBTR2(b) GET_GLOBAL_REG(TLBTR2, (b))
119#define GET_TESTBUSCR(b) GET_GLOBAL_REG(TESTBUSCR, (b))
120#define GET_GLOBAL_TLBIALL(b) GET_GLOBAL_REG(GLOBAL_TLBIALL, (b))
121#define GET_TLBIVMID(b) GET_GLOBAL_REG(TLBIVMID, (b))
122#define GET_CR(b) GET_GLOBAL_REG(CR, (b))
123#define GET_EAR(b) GET_GLOBAL_REG(EAR, (b))
124#define GET_ESR(b) GET_GLOBAL_REG(ESR, (b))
125#define GET_ESRRESTORE(b) GET_GLOBAL_REG(ESRRESTORE, (b))
126#define GET_ESYNR0(b) GET_GLOBAL_REG(ESYNR0, (b))
127#define GET_ESYNR1(b) GET_GLOBAL_REG(ESYNR1, (b))
128#define GET_REV(b) GET_GLOBAL_REG(REV, (b))
129#define GET_IDR(b) GET_GLOBAL_REG(IDR, (b))
130#define GET_RPU_ACR(b) GET_GLOBAL_REG(RPU_ACR, (b))
131
132
133/* Context register setters/getters */
134#define SET_SCTLR(b, c, v) SET_CTX_REG(SCTLR, (b), (c), (v))
135#define SET_ACTLR(b, c, v) SET_CTX_REG(ACTLR, (b), (c), (v))
136#define SET_CONTEXTIDR(b, c, v) SET_CTX_REG(CONTEXTIDR, (b), (c), (v))
137#define SET_TTBR0(b, c, v) SET_CTX_REG(TTBR0, (b), (c), (v))
138#define SET_TTBR1(b, c, v) SET_CTX_REG(TTBR1, (b), (c), (v))
139#define SET_TTBCR(b, c, v) SET_CTX_REG(TTBCR, (b), (c), (v))
140#define SET_PAR(b, c, v) SET_CTX_REG(PAR, (b), (c), (v))
141#define SET_FSR(b, c, v) SET_CTX_REG(FSR, (b), (c), (v))
142#define SET_FSRRESTORE(b, c, v) SET_CTX_REG(FSRRESTORE, (b), (c), (v))
143#define SET_FAR(b, c, v) SET_CTX_REG(FAR, (b), (c), (v))
144#define SET_FSYNR0(b, c, v) SET_CTX_REG(FSYNR0, (b), (c), (v))
145#define SET_FSYNR1(b, c, v) SET_CTX_REG(FSYNR1, (b), (c), (v))
146#define SET_PRRR(b, c, v) SET_CTX_REG(PRRR, (b), (c), (v))
147#define SET_NMRR(b, c, v) SET_CTX_REG(NMRR, (b), (c), (v))
148#define SET_TLBLKCR(b, c, v) SET_CTX_REG(TLBLCKR, (b), (c), (v))
149#define SET_V2PSR(b, c, v) SET_CTX_REG(V2PSR, (b), (c), (v))
150#define SET_TLBFLPTER(b, c, v) SET_CTX_REG(TLBFLPTER, (b), (c), (v))
151#define SET_TLBSLPTER(b, c, v) SET_CTX_REG(TLBSLPTER, (b), (c), (v))
152#define SET_BFBCR(b, c, v) SET_CTX_REG(BFBCR, (b), (c), (v))
153#define SET_CTX_TLBIALL(b, c, v) SET_CTX_REG(CTX_TLBIALL, (b), (c), (v))
154#define SET_TLBIASID(b, c, v) SET_CTX_REG(TLBIASID, (b), (c), (v))
155#define SET_TLBIVA(b, c, v) SET_CTX_REG(TLBIVA, (b), (c), (v))
156#define SET_TLBIVAA(b, c, v) SET_CTX_REG(TLBIVAA, (b), (c), (v))
157#define SET_V2PPR(b, c, v) SET_CTX_REG(V2PPR, (b), (c), (v))
158#define SET_V2PPW(b, c, v) SET_CTX_REG(V2PPW, (b), (c), (v))
159#define SET_V2PUR(b, c, v) SET_CTX_REG(V2PUR, (b), (c), (v))
160#define SET_V2PUW(b, c, v) SET_CTX_REG(V2PUW, (b), (c), (v))
161#define SET_RESUME(b, c, v) SET_CTX_REG(RESUME, (b), (c), (v))
162
163#define GET_SCTLR(b, c) GET_CTX_REG(SCTLR, (b), (c))
164#define GET_ACTLR(b, c) GET_CTX_REG(ACTLR, (b), (c))
165#define GET_CONTEXTIDR(b, c) GET_CTX_REG(CONTEXTIDR, (b), (c))
166#define GET_TTBR0(b, c) GET_CTX_REG(TTBR0, (b), (c))
167#define GET_TTBR1(b, c) GET_CTX_REG(TTBR1, (b), (c))
168#define GET_TTBCR(b, c) GET_CTX_REG(TTBCR, (b), (c))
169#define GET_PAR(b, c) GET_CTX_REG(PAR, (b), (c))
170#define GET_FSR(b, c) GET_CTX_REG(FSR, (b), (c))
171#define GET_FSRRESTORE(b, c) GET_CTX_REG(FSRRESTORE, (b), (c))
172#define GET_FAR(b, c) GET_CTX_REG(FAR, (b), (c))
173#define GET_FSYNR0(b, c) GET_CTX_REG(FSYNR0, (b), (c))
174#define GET_FSYNR1(b, c) GET_CTX_REG(FSYNR1, (b), (c))
175#define GET_PRRR(b, c) GET_CTX_REG(PRRR, (b), (c))
176#define GET_NMRR(b, c) GET_CTX_REG(NMRR, (b), (c))
177#define GET_TLBLCKR(b, c) GET_CTX_REG(TLBLCKR, (b), (c))
178#define GET_V2PSR(b, c) GET_CTX_REG(V2PSR, (b), (c))
179#define GET_TLBFLPTER(b, c) GET_CTX_REG(TLBFLPTER, (b), (c))
180#define GET_TLBSLPTER(b, c) GET_CTX_REG(TLBSLPTER, (b), (c))
181#define GET_BFBCR(b, c) GET_CTX_REG(BFBCR, (b), (c))
182#define GET_CTX_TLBIALL(b, c) GET_CTX_REG(CTX_TLBIALL, (b), (c))
183#define GET_TLBIASID(b, c) GET_CTX_REG(TLBIASID, (b), (c))
184#define GET_TLBIVA(b, c) GET_CTX_REG(TLBIVA, (b), (c))
185#define GET_TLBIVAA(b, c) GET_CTX_REG(TLBIVAA, (b), (c))
186#define GET_V2PPR(b, c) GET_CTX_REG(V2PPR, (b), (c))
187#define GET_V2PPW(b, c) GET_CTX_REG(V2PPW, (b), (c))
188#define GET_V2PUR(b, c) GET_CTX_REG(V2PUR, (b), (c))
189#define GET_V2PUW(b, c) GET_CTX_REG(V2PUW, (b), (c))
190#define GET_RESUME(b, c) GET_CTX_REG(RESUME, (b), (c))
191
192
193/* Global field setters / getters */
194/* Global Field Setters: */
195/* CBACR_N */
196#define SET_RWVMID(b, n, v) SET_GLOBAL_FIELD(b, (n<<2)|(CBACR_N), RWVMID, v)
197#define SET_RWE(b, n, v) SET_GLOBAL_FIELD(b, (n<<2)|(CBACR_N), RWE, v)
198#define SET_RWGE(b, n, v) SET_GLOBAL_FIELD(b, (n<<2)|(CBACR_N), RWGE, v)
199#define SET_CBVMID(b, n, v) SET_GLOBAL_FIELD(b, (n<<2)|(CBACR_N), CBVMID, v)
200#define SET_IRPTNDX(b, n, v) SET_GLOBAL_FIELD(b, (n<<2)|(CBACR_N), IRPTNDX, v)
201
202
203/* M2VCBR_N */
204#define SET_VMID(b, n, v) SET_GLOBAL_FIELD(b, (n<<2)|(M2VCBR_N), VMID, v)
205#define SET_CBNDX(b, n, v) SET_GLOBAL_FIELD(b, (n<<2)|(M2VCBR_N), CBNDX, v)
206#define SET_BYPASSD(b, n, v) SET_GLOBAL_FIELD(b, (n<<2)|(M2VCBR_N), BYPASSD, v)
207#define SET_BPRCOSH(b, n, v) SET_GLOBAL_FIELD(b, (n<<2)|(M2VCBR_N), BPRCOSH, v)
208#define SET_BPRCISH(b, n, v) SET_GLOBAL_FIELD(b, (n<<2)|(M2VCBR_N), BPRCISH, v)
209#define SET_BPRCNSH(b, n, v) SET_GLOBAL_FIELD(b, (n<<2)|(M2VCBR_N), BPRCNSH, v)
210#define SET_BPSHCFG(b, n, v) SET_GLOBAL_FIELD(b, (n<<2)|(M2VCBR_N), BPSHCFG, v)
211#define SET_NSCFG(b, n, v) SET_GLOBAL_FIELD(b, (n<<2)|(M2VCBR_N), NSCFG, v)
212#define SET_BPMTCFG(b, n, v) SET_GLOBAL_FIELD(b, (n<<2)|(M2VCBR_N), BPMTCFG, v)
213#define SET_BPMEMTYPE(b, n, v) \
214 SET_GLOBAL_FIELD(b, (n<<2)|(M2VCBR_N), BPMEMTYPE, v)
215
216
217/* CR */
218#define SET_RPUE(b, v) SET_GLOBAL_FIELD(b, CR, RPUE, v)
219#define SET_RPUERE(b, v) SET_GLOBAL_FIELD(b, CR, RPUERE, v)
220#define SET_RPUEIE(b, v) SET_GLOBAL_FIELD(b, CR, RPUEIE, v)
221#define SET_DCDEE(b, v) SET_GLOBAL_FIELD(b, CR, DCDEE, v)
222#define SET_CLIENTPD(b, v) SET_GLOBAL_FIELD(b, CR, CLIENTPD, v)
223#define SET_STALLD(b, v) SET_GLOBAL_FIELD(b, CR, STALLD, v)
224#define SET_TLBLKCRWE(b, v) SET_GLOBAL_FIELD(b, CR, TLBLKCRWE, v)
225#define SET_CR_TLBIALLCFG(b, v) SET_GLOBAL_FIELD(b, CR, CR_TLBIALLCFG, v)
226#define SET_TLBIVMIDCFG(b, v) SET_GLOBAL_FIELD(b, CR, TLBIVMIDCFG, v)
227#define SET_CR_HUME(b, v) SET_GLOBAL_FIELD(b, CR, CR_HUME, v)
228
229
230/* ESR */
231#define SET_CFG(b, v) SET_GLOBAL_FIELD(b, ESR, CFG, v)
232#define SET_BYPASS(b, v) SET_GLOBAL_FIELD(b, ESR, BYPASS, v)
233#define SET_ESR_MULTI(b, v) SET_GLOBAL_FIELD(b, ESR, ESR_MULTI, v)
234
235
236/* ESYNR0 */
237#define SET_ESYNR0_AMID(b, v) SET_GLOBAL_FIELD(b, ESYNR0, ESYNR0_AMID, v)
238#define SET_ESYNR0_APID(b, v) SET_GLOBAL_FIELD(b, ESYNR0, ESYNR0_APID, v)
239#define SET_ESYNR0_ABID(b, v) SET_GLOBAL_FIELD(b, ESYNR0, ESYNR0_ABID, v)
240#define SET_ESYNR0_AVMID(b, v) SET_GLOBAL_FIELD(b, ESYNR0, ESYNR0_AVMID, v)
241#define SET_ESYNR0_ATID(b, v) SET_GLOBAL_FIELD(b, ESYNR0, ESYNR0_ATID, v)
242
243
244/* ESYNR1 */
245#define SET_ESYNR1_AMEMTYPE(b, v) \
246 SET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_AMEMTYPE, v)
247#define SET_ESYNR1_ASHARED(b, v) SET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_ASHARED, v)
248#define SET_ESYNR1_AINNERSHARED(b, v) \
249 SET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_AINNERSHARED, v)
250#define SET_ESYNR1_APRIV(b, v) SET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_APRIV, v)
251#define SET_ESYNR1_APROTNS(b, v) SET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_APROTNS, v)
252#define SET_ESYNR1_AINST(b, v) SET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_AINST, v)
253#define SET_ESYNR1_AWRITE(b, v) SET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_AWRITE, v)
254#define SET_ESYNR1_ABURST(b, v) SET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_ABURST, v)
255#define SET_ESYNR1_ALEN(b, v) SET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_ALEN, v)
256#define SET_ESYNR1_ASIZE(b, v) SET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_ASIZE, v)
257#define SET_ESYNR1_ALOCK(b, v) SET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_ALOCK, v)
258#define SET_ESYNR1_AOOO(b, v) SET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_AOOO, v)
259#define SET_ESYNR1_AFULL(b, v) SET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_AFULL, v)
260#define SET_ESYNR1_AC(b, v) SET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_AC, v)
261#define SET_ESYNR1_DCD(b, v) SET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_DCD, v)
262
263
264/* TESTBUSCR */
265#define SET_TBE(b, v) SET_GLOBAL_FIELD(b, TESTBUSCR, TBE, v)
266#define SET_SPDMBE(b, v) SET_GLOBAL_FIELD(b, TESTBUSCR, SPDMBE, v)
267#define SET_WGSEL(b, v) SET_GLOBAL_FIELD(b, TESTBUSCR, WGSEL, v)
268#define SET_TBLSEL(b, v) SET_GLOBAL_FIELD(b, TESTBUSCR, TBLSEL, v)
269#define SET_TBHSEL(b, v) SET_GLOBAL_FIELD(b, TESTBUSCR, TBHSEL, v)
270#define SET_SPDM0SEL(b, v) SET_GLOBAL_FIELD(b, TESTBUSCR, SPDM0SEL, v)
271#define SET_SPDM1SEL(b, v) SET_GLOBAL_FIELD(b, TESTBUSCR, SPDM1SEL, v)
272#define SET_SPDM2SEL(b, v) SET_GLOBAL_FIELD(b, TESTBUSCR, SPDM2SEL, v)
273#define SET_SPDM3SEL(b, v) SET_GLOBAL_FIELD(b, TESTBUSCR, SPDM3SEL, v)
274
275
276/* TLBIVMID */
277#define SET_TLBIVMID_VMID(b, v) SET_GLOBAL_FIELD(b, TLBIVMID, TLBIVMID_VMID, v)
278
279
280/* TLBRSW */
281#define SET_TLBRSW_INDEX(b, v) SET_GLOBAL_FIELD(b, TLBRSW, TLBRSW_INDEX, v)
282#define SET_TLBBFBS(b, v) SET_GLOBAL_FIELD(b, TLBRSW, TLBBFBS, v)
283
284
285/* TLBTR0 */
286#define SET_PR(b, v) SET_GLOBAL_FIELD(b, TLBTR0, PR, v)
287#define SET_PW(b, v) SET_GLOBAL_FIELD(b, TLBTR0, PW, v)
288#define SET_UR(b, v) SET_GLOBAL_FIELD(b, TLBTR0, UR, v)
289#define SET_UW(b, v) SET_GLOBAL_FIELD(b, TLBTR0, UW, v)
290#define SET_XN(b, v) SET_GLOBAL_FIELD(b, TLBTR0, XN, v)
291#define SET_NSDESC(b, v) SET_GLOBAL_FIELD(b, TLBTR0, NSDESC, v)
292#define SET_ISH(b, v) SET_GLOBAL_FIELD(b, TLBTR0, ISH, v)
293#define SET_SH(b, v) SET_GLOBAL_FIELD(b, TLBTR0, SH, v)
294#define SET_MT(b, v) SET_GLOBAL_FIELD(b, TLBTR0, MT, v)
295#define SET_DPSIZR(b, v) SET_GLOBAL_FIELD(b, TLBTR0, DPSIZR, v)
296#define SET_DPSIZC(b, v) SET_GLOBAL_FIELD(b, TLBTR0, DPSIZC, v)
297
298
299/* TLBTR1 */
300#define SET_TLBTR1_VMID(b, v) SET_GLOBAL_FIELD(b, TLBTR1, TLBTR1_VMID, v)
301#define SET_TLBTR1_PA(b, v) SET_GLOBAL_FIELD(b, TLBTR1, TLBTR1_PA, v)
302
303
304/* TLBTR2 */
305#define SET_TLBTR2_ASID(b, v) SET_GLOBAL_FIELD(b, TLBTR2, TLBTR2_ASID, v)
306#define SET_TLBTR2_V(b, v) SET_GLOBAL_FIELD(b, TLBTR2, TLBTR2_V, v)
307#define SET_TLBTR2_NSTID(b, v) SET_GLOBAL_FIELD(b, TLBTR2, TLBTR2_NSTID, v)
308#define SET_TLBTR2_NV(b, v) SET_GLOBAL_FIELD(b, TLBTR2, TLBTR2_NV, v)
309#define SET_TLBTR2_VA(b, v) SET_GLOBAL_FIELD(b, TLBTR2, TLBTR2_VA, v)
310
311
312/* Global Field Getters */
313/* CBACR_N */
314#define GET_RWVMID(b, n) GET_GLOBAL_FIELD(b, (n<<2)|(CBACR_N), RWVMID)
315#define GET_RWE(b, n) GET_GLOBAL_FIELD(b, (n<<2)|(CBACR_N), RWE)
316#define GET_RWGE(b, n) GET_GLOBAL_FIELD(b, (n<<2)|(CBACR_N), RWGE)
317#define GET_CBVMID(b, n) GET_GLOBAL_FIELD(b, (n<<2)|(CBACR_N), CBVMID)
318#define GET_IRPTNDX(b, n) GET_GLOBAL_FIELD(b, (n<<2)|(CBACR_N), IRPTNDX)
319
320
321/* M2VCBR_N */
322#define GET_VMID(b, n) GET_GLOBAL_FIELD(b, (n<<2)|(M2VCBR_N), VMID)
323#define GET_CBNDX(b, n) GET_GLOBAL_FIELD(b, (n<<2)|(M2VCBR_N), CBNDX)
324#define GET_BYPASSD(b, n) GET_GLOBAL_FIELD(b, (n<<2)|(M2VCBR_N), BYPASSD)
325#define GET_BPRCOSH(b, n) GET_GLOBAL_FIELD(b, (n<<2)|(M2VCBR_N), BPRCOSH)
326#define GET_BPRCISH(b, n) GET_GLOBAL_FIELD(b, (n<<2)|(M2VCBR_N), BPRCISH)
327#define GET_BPRCNSH(b, n) GET_GLOBAL_FIELD(b, (n<<2)|(M2VCBR_N), BPRCNSH)
328#define GET_BPSHCFG(b, n) GET_GLOBAL_FIELD(b, (n<<2)|(M2VCBR_N), BPSHCFG)
329#define GET_NSCFG(b, n) GET_GLOBAL_FIELD(b, (n<<2)|(M2VCBR_N), NSCFG)
330#define GET_BPMTCFG(b, n) GET_GLOBAL_FIELD(b, (n<<2)|(M2VCBR_N), BPMTCFG)
331#define GET_BPMEMTYPE(b, n) GET_GLOBAL_FIELD(b, (n<<2)|(M2VCBR_N), BPMEMTYPE)
332
333
334/* CR */
335#define GET_RPUE(b) GET_GLOBAL_FIELD(b, CR, RPUE)
336#define GET_RPUERE(b) GET_GLOBAL_FIELD(b, CR, RPUERE)
337#define GET_RPUEIE(b) GET_GLOBAL_FIELD(b, CR, RPUEIE)
338#define GET_DCDEE(b) GET_GLOBAL_FIELD(b, CR, DCDEE)
339#define GET_CLIENTPD(b) GET_GLOBAL_FIELD(b, CR, CLIENTPD)
340#define GET_STALLD(b) GET_GLOBAL_FIELD(b, CR, STALLD)
341#define GET_TLBLKCRWE(b) GET_GLOBAL_FIELD(b, CR, TLBLKCRWE)
342#define GET_CR_TLBIALLCFG(b) GET_GLOBAL_FIELD(b, CR, CR_TLBIALLCFG)
343#define GET_TLBIVMIDCFG(b) GET_GLOBAL_FIELD(b, CR, TLBIVMIDCFG)
344#define GET_CR_HUME(b) GET_GLOBAL_FIELD(b, CR, CR_HUME)
345
346
347/* ESR */
348#define GET_CFG(b) GET_GLOBAL_FIELD(b, ESR, CFG)
349#define GET_BYPASS(b) GET_GLOBAL_FIELD(b, ESR, BYPASS)
350#define GET_ESR_MULTI(b) GET_GLOBAL_FIELD(b, ESR, ESR_MULTI)
351
352
353/* ESYNR0 */
354#define GET_ESYNR0_AMID(b) GET_GLOBAL_FIELD(b, ESYNR0, ESYNR0_AMID)
355#define GET_ESYNR0_APID(b) GET_GLOBAL_FIELD(b, ESYNR0, ESYNR0_APID)
356#define GET_ESYNR0_ABID(b) GET_GLOBAL_FIELD(b, ESYNR0, ESYNR0_ABID)
357#define GET_ESYNR0_AVMID(b) GET_GLOBAL_FIELD(b, ESYNR0, ESYNR0_AVMID)
358#define GET_ESYNR0_ATID(b) GET_GLOBAL_FIELD(b, ESYNR0, ESYNR0_ATID)
359
360
361/* ESYNR1 */
362#define GET_ESYNR1_AMEMTYPE(b) GET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_AMEMTYPE)
363#define GET_ESYNR1_ASHARED(b) GET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_ASHARED)
364#define GET_ESYNR1_AINNERSHARED(b) \
365 GET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_AINNERSHARED)
366#define GET_ESYNR1_APRIV(b) GET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_APRIV)
367#define GET_ESYNR1_APROTNS(b) GET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_APROTNS)
368#define GET_ESYNR1_AINST(b) GET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_AINST)
369#define GET_ESYNR1_AWRITE(b) GET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_AWRITE)
370#define GET_ESYNR1_ABURST(b) GET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_ABURST)
371#define GET_ESYNR1_ALEN(b) GET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_ALEN)
372#define GET_ESYNR1_ASIZE(b) GET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_ASIZE)
373#define GET_ESYNR1_ALOCK(b) GET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_ALOCK)
374#define GET_ESYNR1_AOOO(b) GET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_AOOO)
375#define GET_ESYNR1_AFULL(b) GET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_AFULL)
376#define GET_ESYNR1_AC(b) GET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_AC)
377#define GET_ESYNR1_DCD(b) GET_GLOBAL_FIELD(b, ESYNR1, ESYNR1_DCD)
378
379
380/* IDR */
381#define GET_NM2VCBMT(b) GET_GLOBAL_FIELD(b, IDR, NM2VCBMT)
382#define GET_HTW(b) GET_GLOBAL_FIELD(b, IDR, HTW)
383#define GET_HUM(b) GET_GLOBAL_FIELD(b, IDR, HUM)
384#define GET_TLBSIZE(b) GET_GLOBAL_FIELD(b, IDR, TLBSIZE)
385#define GET_NCB(b) GET_GLOBAL_FIELD(b, IDR, NCB)
386#define GET_NIRPT(b) GET_GLOBAL_FIELD(b, IDR, NIRPT)
387
388
389/* REV */
390#define GET_MAJOR(b) GET_GLOBAL_FIELD(b, REV, MAJOR)
391#define GET_MINOR(b) GET_GLOBAL_FIELD(b, REV, MINOR)
392
393
394/* TESTBUSCR */
395#define GET_TBE(b) GET_GLOBAL_FIELD(b, TESTBUSCR, TBE)
396#define GET_SPDMBE(b) GET_GLOBAL_FIELD(b, TESTBUSCR, SPDMBE)
397#define GET_WGSEL(b) GET_GLOBAL_FIELD(b, TESTBUSCR, WGSEL)
398#define GET_TBLSEL(b) GET_GLOBAL_FIELD(b, TESTBUSCR, TBLSEL)
399#define GET_TBHSEL(b) GET_GLOBAL_FIELD(b, TESTBUSCR, TBHSEL)
400#define GET_SPDM0SEL(b) GET_GLOBAL_FIELD(b, TESTBUSCR, SPDM0SEL)
401#define GET_SPDM1SEL(b) GET_GLOBAL_FIELD(b, TESTBUSCR, SPDM1SEL)
402#define GET_SPDM2SEL(b) GET_GLOBAL_FIELD(b, TESTBUSCR, SPDM2SEL)
403#define GET_SPDM3SEL(b) GET_GLOBAL_FIELD(b, TESTBUSCR, SPDM3SEL)
404
405
406/* TLBIVMID */
407#define GET_TLBIVMID_VMID(b) GET_GLOBAL_FIELD(b, TLBIVMID, TLBIVMID_VMID)
408
409
410/* TLBTR0 */
411#define GET_PR(b) GET_GLOBAL_FIELD(b, TLBTR0, PR)
412#define GET_PW(b) GET_GLOBAL_FIELD(b, TLBTR0, PW)
413#define GET_UR(b) GET_GLOBAL_FIELD(b, TLBTR0, UR)
414#define GET_UW(b) GET_GLOBAL_FIELD(b, TLBTR0, UW)
415#define GET_XN(b) GET_GLOBAL_FIELD(b, TLBTR0, XN)
416#define GET_NSDESC(b) GET_GLOBAL_FIELD(b, TLBTR0, NSDESC)
417#define GET_ISH(b) GET_GLOBAL_FIELD(b, TLBTR0, ISH)
418#define GET_SH(b) GET_GLOBAL_FIELD(b, TLBTR0, SH)
419#define GET_MT(b) GET_GLOBAL_FIELD(b, TLBTR0, MT)
420#define GET_DPSIZR(b) GET_GLOBAL_FIELD(b, TLBTR0, DPSIZR)
421#define GET_DPSIZC(b) GET_GLOBAL_FIELD(b, TLBTR0, DPSIZC)
422
423
424/* TLBTR1 */
425#define GET_TLBTR1_VMID(b) GET_GLOBAL_FIELD(b, TLBTR1, TLBTR1_VMID)
426#define GET_TLBTR1_PA(b) GET_GLOBAL_FIELD(b, TLBTR1, TLBTR1_PA)
427
428
429/* TLBTR2 */
430#define GET_TLBTR2_ASID(b) GET_GLOBAL_FIELD(b, TLBTR2, TLBTR2_ASID)
431#define GET_TLBTR2_V(b) GET_GLOBAL_FIELD(b, TLBTR2, TLBTR2_V)
432#define GET_TLBTR2_NSTID(b) GET_GLOBAL_FIELD(b, TLBTR2, TLBTR2_NSTID)
433#define GET_TLBTR2_NV(b) GET_GLOBAL_FIELD(b, TLBTR2, TLBTR2_NV)
434#define GET_TLBTR2_VA(b) GET_GLOBAL_FIELD(b, TLBTR2, TLBTR2_VA)
435
436
437/* Context Register setters / getters */
438/* Context Register setters */
439/* ACTLR */
440#define SET_CFERE(b, c, v) SET_CONTEXT_FIELD(b, c, ACTLR, CFERE, v)
441#define SET_CFEIE(b, c, v) SET_CONTEXT_FIELD(b, c, ACTLR, CFEIE, v)
442#define SET_PTSHCFG(b, c, v) SET_CONTEXT_FIELD(b, c, ACTLR, PTSHCFG, v)
443#define SET_RCOSH(b, c, v) SET_CONTEXT_FIELD(b, c, ACTLR, RCOSH, v)
444#define SET_RCISH(b, c, v) SET_CONTEXT_FIELD(b, c, ACTLR, RCISH, v)
445#define SET_RCNSH(b, c, v) SET_CONTEXT_FIELD(b, c, ACTLR, RCNSH, v)
446#define SET_PRIVCFG(b, c, v) SET_CONTEXT_FIELD(b, c, ACTLR, PRIVCFG, v)
447#define SET_DNA(b, c, v) SET_CONTEXT_FIELD(b, c, ACTLR, DNA, v)
448#define SET_DNLV2PA(b, c, v) SET_CONTEXT_FIELD(b, c, ACTLR, DNLV2PA, v)
449#define SET_TLBMCFG(b, c, v) SET_CONTEXT_FIELD(b, c, ACTLR, TLBMCFG, v)
450#define SET_CFCFG(b, c, v) SET_CONTEXT_FIELD(b, c, ACTLR, CFCFG, v)
451#define SET_TIPCF(b, c, v) SET_CONTEXT_FIELD(b, c, ACTLR, TIPCF, v)
452#define SET_V2PCFG(b, c, v) SET_CONTEXT_FIELD(b, c, ACTLR, V2PCFG, v)
453#define SET_HUME(b, c, v) SET_CONTEXT_FIELD(b, c, ACTLR, HUME, v)
454#define SET_PTMTCFG(b, c, v) SET_CONTEXT_FIELD(b, c, ACTLR, PTMTCFG, v)
455#define SET_PTMEMTYPE(b, c, v) SET_CONTEXT_FIELD(b, c, ACTLR, PTMEMTYPE, v)
456
457
458/* BFBCR */
459#define SET_BFBDFE(b, c, v) SET_CONTEXT_FIELD(b, c, BFBCR, BFBDFE, v)
460#define SET_BFBSFE(b, c, v) SET_CONTEXT_FIELD(b, c, BFBCR, BFBSFE, v)
461#define SET_SFVS(b, c, v) SET_CONTEXT_FIELD(b, c, BFBCR, SFVS, v)
462#define SET_FLVIC(b, c, v) SET_CONTEXT_FIELD(b, c, BFBCR, FLVIC, v)
463#define SET_SLVIC(b, c, v) SET_CONTEXT_FIELD(b, c, BFBCR, SLVIC, v)
464
465
466/* CONTEXTIDR */
467#define SET_CONTEXTIDR_ASID(b, c, v) \
468 SET_CONTEXT_FIELD(b, c, CONTEXTIDR, CONTEXTIDR_ASID, v)
469#define SET_CONTEXTIDR_PROCID(b, c, v) \
470 SET_CONTEXT_FIELD(b, c, CONTEXTIDR, PROCID, v)
471
472
473/* FSR */
474#define SET_TF(b, c, v) SET_CONTEXT_FIELD(b, c, FSR, TF, v)
475#define SET_AFF(b, c, v) SET_CONTEXT_FIELD(b, c, FSR, AFF, v)
476#define SET_APF(b, c, v) SET_CONTEXT_FIELD(b, c, FSR, APF, v)
477#define SET_TLBMF(b, c, v) SET_CONTEXT_FIELD(b, c, FSR, TLBMF, v)
478#define SET_HTWDEEF(b, c, v) SET_CONTEXT_FIELD(b, c, FSR, HTWDEEF, v)
479#define SET_HTWSEEF(b, c, v) SET_CONTEXT_FIELD(b, c, FSR, HTWSEEF, v)
480#define SET_MHF(b, c, v) SET_CONTEXT_FIELD(b, c, FSR, MHF, v)
481#define SET_SL(b, c, v) SET_CONTEXT_FIELD(b, c, FSR, SL, v)
482#define SET_SS(b, c, v) SET_CONTEXT_FIELD(b, c, FSR, SS, v)
483#define SET_MULTI(b, c, v) SET_CONTEXT_FIELD(b, c, FSR, MULTI, v)
484
485
486/* FSYNR0 */
487#define SET_AMID(b, c, v) SET_CONTEXT_FIELD(b, c, FSYNR0, AMID, v)
488#define SET_APID(b, c, v) SET_CONTEXT_FIELD(b, c, FSYNR0, APID, v)
489#define SET_ABID(b, c, v) SET_CONTEXT_FIELD(b, c, FSYNR0, ABID, v)
490#define SET_ATID(b, c, v) SET_CONTEXT_FIELD(b, c, FSYNR0, ATID, v)
491
492
493/* FSYNR1 */
494#define SET_AMEMTYPE(b, c, v) SET_CONTEXT_FIELD(b, c, FSYNR1, AMEMTYPE, v)
495#define SET_ASHARED(b, c, v) SET_CONTEXT_FIELD(b, c, FSYNR1, ASHARED, v)
496#define SET_AINNERSHARED(b, c, v) \
497 SET_CONTEXT_FIELD(b, c, FSYNR1, AINNERSHARED, v)
498#define SET_APRIV(b, c, v) SET_CONTEXT_FIELD(b, c, FSYNR1, APRIV, v)
499#define SET_APROTNS(b, c, v) SET_CONTEXT_FIELD(b, c, FSYNR1, APROTNS, v)
500#define SET_AINST(b, c, v) SET_CONTEXT_FIELD(b, c, FSYNR1, AINST, v)
501#define SET_AWRITE(b, c, v) SET_CONTEXT_FIELD(b, c, FSYNR1, AWRITE, v)
502#define SET_ABURST(b, c, v) SET_CONTEXT_FIELD(b, c, FSYNR1, ABURST, v)
503#define SET_ALEN(b, c, v) SET_CONTEXT_FIELD(b, c, FSYNR1, ALEN, v)
504#define SET_FSYNR1_ASIZE(b, c, v) \
505 SET_CONTEXT_FIELD(b, c, FSYNR1, FSYNR1_ASIZE, v)
506#define SET_ALOCK(b, c, v) SET_CONTEXT_FIELD(b, c, FSYNR1, ALOCK, v)
507#define SET_AFULL(b, c, v) SET_CONTEXT_FIELD(b, c, FSYNR1, AFULL, v)
508
509
510/* NMRR */
511#define SET_ICPC0(b, c, v) SET_CONTEXT_FIELD(b, c, NMRR, ICPC0, v)
512#define SET_ICPC1(b, c, v) SET_CONTEXT_FIELD(b, c, NMRR, ICPC1, v)
513#define SET_ICPC2(b, c, v) SET_CONTEXT_FIELD(b, c, NMRR, ICPC2, v)
514#define SET_ICPC3(b, c, v) SET_CONTEXT_FIELD(b, c, NMRR, ICPC3, v)
515#define SET_ICPC4(b, c, v) SET_CONTEXT_FIELD(b, c, NMRR, ICPC4, v)
516#define SET_ICPC5(b, c, v) SET_CONTEXT_FIELD(b, c, NMRR, ICPC5, v)
517#define SET_ICPC6(b, c, v) SET_CONTEXT_FIELD(b, c, NMRR, ICPC6, v)
518#define SET_ICPC7(b, c, v) SET_CONTEXT_FIELD(b, c, NMRR, ICPC7, v)
519#define SET_OCPC0(b, c, v) SET_CONTEXT_FIELD(b, c, NMRR, OCPC0, v)
520#define SET_OCPC1(b, c, v) SET_CONTEXT_FIELD(b, c, NMRR, OCPC1, v)
521#define SET_OCPC2(b, c, v) SET_CONTEXT_FIELD(b, c, NMRR, OCPC2, v)
522#define SET_OCPC3(b, c, v) SET_CONTEXT_FIELD(b, c, NMRR, OCPC3, v)
523#define SET_OCPC4(b, c, v) SET_CONTEXT_FIELD(b, c, NMRR, OCPC4, v)
524#define SET_OCPC5(b, c, v) SET_CONTEXT_FIELD(b, c, NMRR, OCPC5, v)
525#define SET_OCPC6(b, c, v) SET_CONTEXT_FIELD(b, c, NMRR, OCPC6, v)
526#define SET_OCPC7(b, c, v) SET_CONTEXT_FIELD(b, c, NMRR, OCPC7, v)
527
528
529/* PAR */
530#define SET_FAULT(b, c, v) SET_CONTEXT_FIELD(b, c, PAR, FAULT, v)
531
532#define SET_FAULT_TF(b, c, v) SET_CONTEXT_FIELD(b, c, PAR, FAULT_TF, v)
533#define SET_FAULT_AFF(b, c, v) SET_CONTEXT_FIELD(b, c, PAR, FAULT_AFF, v)
534#define SET_FAULT_APF(b, c, v) SET_CONTEXT_FIELD(b, c, PAR, FAULT_APF, v)
535#define SET_FAULT_TLBMF(b, c, v) SET_CONTEXT_FIELD(b, c, PAR, FAULT_TLBMF, v)
536#define SET_FAULT_HTWDEEF(b, c, v) \
537 SET_CONTEXT_FIELD(b, c, PAR, FAULT_HTWDEEF, v)
538#define SET_FAULT_HTWSEEF(b, c, v) \
539 SET_CONTEXT_FIELD(b, c, PAR, FAULT_HTWSEEF, v)
540#define SET_FAULT_MHF(b, c, v) SET_CONTEXT_FIELD(b, c, PAR, FAULT_MHF, v)
541#define SET_FAULT_SL(b, c, v) SET_CONTEXT_FIELD(b, c, PAR, FAULT_SL, v)
542#define SET_FAULT_SS(b, c, v) SET_CONTEXT_FIELD(b, c, PAR, FAULT_SS, v)
543
544#define SET_NOFAULT_SS(b, c, v) SET_CONTEXT_FIELD(b, c, PAR, NOFAULT_SS, v)
545#define SET_NOFAULT_MT(b, c, v) SET_CONTEXT_FIELD(b, c, PAR, NOFAULT_MT, v)
546#define SET_NOFAULT_SH(b, c, v) SET_CONTEXT_FIELD(b, c, PAR, NOFAULT_SH, v)
547#define SET_NOFAULT_NS(b, c, v) SET_CONTEXT_FIELD(b, c, PAR, NOFAULT_NS, v)
548#define SET_NOFAULT_NOS(b, c, v) SET_CONTEXT_FIELD(b, c, PAR, NOFAULT_NOS, v)
549#define SET_NPFAULT_PA(b, c, v) SET_CONTEXT_FIELD(b, c, PAR, NPFAULT_PA, v)
550
551
552/* PRRR */
553#define SET_MTC0(b, c, v) SET_CONTEXT_FIELD(b, c, PRRR, MTC0, v)
554#define SET_MTC1(b, c, v) SET_CONTEXT_FIELD(b, c, PRRR, MTC1, v)
555#define SET_MTC2(b, c, v) SET_CONTEXT_FIELD(b, c, PRRR, MTC2, v)
556#define SET_MTC3(b, c, v) SET_CONTEXT_FIELD(b, c, PRRR, MTC3, v)
557#define SET_MTC4(b, c, v) SET_CONTEXT_FIELD(b, c, PRRR, MTC4, v)
558#define SET_MTC5(b, c, v) SET_CONTEXT_FIELD(b, c, PRRR, MTC5, v)
559#define SET_MTC6(b, c, v) SET_CONTEXT_FIELD(b, c, PRRR, MTC6, v)
560#define SET_MTC7(b, c, v) SET_CONTEXT_FIELD(b, c, PRRR, MTC7, v)
561#define SET_SHDSH0(b, c, v) SET_CONTEXT_FIELD(b, c, PRRR, SHDSH0, v)
562#define SET_SHDSH1(b, c, v) SET_CONTEXT_FIELD(b, c, PRRR, SHDSH1, v)
563#define SET_SHNMSH0(b, c, v) SET_CONTEXT_FIELD(b, c, PRRR, SHNMSH0, v)
564#define SET_SHNMSH1(b, c, v) SET_CONTEXT_FIELD(b, c, PRRR, SHNMSH1, v)
565#define SET_NOS0(b, c, v) SET_CONTEXT_FIELD(b, c, PRRR, NOS0, v)
566#define SET_NOS1(b, c, v) SET_CONTEXT_FIELD(b, c, PRRR, NOS1, v)
567#define SET_NOS2(b, c, v) SET_CONTEXT_FIELD(b, c, PRRR, NOS2, v)
568#define SET_NOS3(b, c, v) SET_CONTEXT_FIELD(b, c, PRRR, NOS3, v)
569#define SET_NOS4(b, c, v) SET_CONTEXT_FIELD(b, c, PRRR, NOS4, v)
570#define SET_NOS5(b, c, v) SET_CONTEXT_FIELD(b, c, PRRR, NOS5, v)
571#define SET_NOS6(b, c, v) SET_CONTEXT_FIELD(b, c, PRRR, NOS6, v)
572#define SET_NOS7(b, c, v) SET_CONTEXT_FIELD(b, c, PRRR, NOS7, v)
573
574
575/* RESUME */
576#define SET_TNR(b, c, v) SET_CONTEXT_FIELD(b, c, RESUME, TNR, v)
577
578
579/* SCTLR */
580#define SET_M(b, c, v) SET_CONTEXT_FIELD(b, c, SCTLR, M, v)
581#define SET_TRE(b, c, v) SET_CONTEXT_FIELD(b, c, SCTLR, TRE, v)
582#define SET_AFE(b, c, v) SET_CONTEXT_FIELD(b, c, SCTLR, AFE, v)
583#define SET_HAF(b, c, v) SET_CONTEXT_FIELD(b, c, SCTLR, HAF, v)
584#define SET_BE(b, c, v) SET_CONTEXT_FIELD(b, c, SCTLR, BE, v)
585#define SET_AFFD(b, c, v) SET_CONTEXT_FIELD(b, c, SCTLR, AFFD, v)
586
587
588/* TLBLKCR */
589#define SET_LKE(b, c, v) SET_CONTEXT_FIELD(b, c, TLBLKCR, LKE, v)
590#define SET_TLBLKCR_TLBIALLCFG(b, c, v) \
591 SET_CONTEXT_FIELD(b, c, TLBLKCR, TLBLCKR_TLBIALLCFG, v)
592#define SET_TLBIASIDCFG(b, c, v) \
593 SET_CONTEXT_FIELD(b, c, TLBLKCR, TLBIASIDCFG, v)
594#define SET_TLBIVAACFG(b, c, v) SET_CONTEXT_FIELD(b, c, TLBLKCR, TLBIVAACFG, v)
595#define SET_FLOOR(b, c, v) SET_CONTEXT_FIELD(b, c, TLBLKCR, FLOOR, v)
596#define SET_VICTIM(b, c, v) SET_CONTEXT_FIELD(b, c, TLBLKCR, VICTIM, v)
597
598
599/* TTBCR */
600#define SET_N(b, c, v) SET_CONTEXT_FIELD(b, c, TTBCR, N, v)
601#define SET_PD0(b, c, v) SET_CONTEXT_FIELD(b, c, TTBCR, PD0, v)
602#define SET_PD1(b, c, v) SET_CONTEXT_FIELD(b, c, TTBCR, PD1, v)
603
604
605/* TTBR0 */
606#define SET_TTBR0_IRGNH(b, c, v) SET_CONTEXT_FIELD(b, c, TTBR0, TTBR0_IRGNH, v)
607#define SET_TTBR0_SH(b, c, v) SET_CONTEXT_FIELD(b, c, TTBR0, TTBR0_SH, v)
608#define SET_TTBR0_ORGN(b, c, v) SET_CONTEXT_FIELD(b, c, TTBR0, TTBR0_ORGN, v)
609#define SET_TTBR0_NOS(b, c, v) SET_CONTEXT_FIELD(b, c, TTBR0, TTBR0_NOS, v)
610#define SET_TTBR0_IRGNL(b, c, v) SET_CONTEXT_FIELD(b, c, TTBR0, TTBR0_IRGNL, v)
611#define SET_TTBR0_PA(b, c, v) SET_CONTEXT_FIELD(b, c, TTBR0, TTBR0_PA, v)
612
613
614/* TTBR1 */
615#define SET_TTBR1_IRGNH(b, c, v) SET_CONTEXT_FIELD(b, c, TTBR1, TTBR1_IRGNH, v)
616#define SET_TTBR1_SH(b, c, v) SET_CONTEXT_FIELD(b, c, TTBR1, TTBR1_SH, v)
617#define SET_TTBR1_ORGN(b, c, v) SET_CONTEXT_FIELD(b, c, TTBR1, TTBR1_ORGN, v)
618#define SET_TTBR1_NOS(b, c, v) SET_CONTEXT_FIELD(b, c, TTBR1, TTBR1_NOS, v)
619#define SET_TTBR1_IRGNL(b, c, v) SET_CONTEXT_FIELD(b, c, TTBR1, TTBR1_IRGNL, v)
620#define SET_TTBR1_PA(b, c, v) SET_CONTEXT_FIELD(b, c, TTBR1, TTBR1_PA, v)
621
622
623/* V2PSR */
624#define SET_HIT(b, c, v) SET_CONTEXT_FIELD(b, c, V2PSR, HIT, v)
625#define SET_INDEX(b, c, v) SET_CONTEXT_FIELD(b, c, V2PSR, INDEX, v)
626
627
628/* Context Register getters */
629/* ACTLR */
630#define GET_CFERE(b, c) GET_CONTEXT_FIELD(b, c, ACTLR, CFERE)
631#define GET_CFEIE(b, c) GET_CONTEXT_FIELD(b, c, ACTLR, CFEIE)
632#define GET_PTSHCFG(b, c) GET_CONTEXT_FIELD(b, c, ACTLR, PTSHCFG)
633#define GET_RCOSH(b, c) GET_CONTEXT_FIELD(b, c, ACTLR, RCOSH)
634#define GET_RCISH(b, c) GET_CONTEXT_FIELD(b, c, ACTLR, RCISH)
635#define GET_RCNSH(b, c) GET_CONTEXT_FIELD(b, c, ACTLR, RCNSH)
636#define GET_PRIVCFG(b, c) GET_CONTEXT_FIELD(b, c, ACTLR, PRIVCFG)
637#define GET_DNA(b, c) GET_CONTEXT_FIELD(b, c, ACTLR, DNA)
638#define GET_DNLV2PA(b, c) GET_CONTEXT_FIELD(b, c, ACTLR, DNLV2PA)
639#define GET_TLBMCFG(b, c) GET_CONTEXT_FIELD(b, c, ACTLR, TLBMCFG)
640#define GET_CFCFG(b, c) GET_CONTEXT_FIELD(b, c, ACTLR, CFCFG)
641#define GET_TIPCF(b, c) GET_CONTEXT_FIELD(b, c, ACTLR, TIPCF)
642#define GET_V2PCFG(b, c) GET_CONTEXT_FIELD(b, c, ACTLR, V2PCFG)
643#define GET_HUME(b, c) GET_CONTEXT_FIELD(b, c, ACTLR, HUME)
644#define GET_PTMTCFG(b, c) GET_CONTEXT_FIELD(b, c, ACTLR, PTMTCFG)
645#define GET_PTMEMTYPE(b, c) GET_CONTEXT_FIELD(b, c, ACTLR, PTMEMTYPE)
646
647/* BFBCR */
648#define GET_BFBDFE(b, c) GET_CONTEXT_FIELD(b, c, BFBCR, BFBDFE)
649#define GET_BFBSFE(b, c) GET_CONTEXT_FIELD(b, c, BFBCR, BFBSFE)
650#define GET_SFVS(b, c) GET_CONTEXT_FIELD(b, c, BFBCR, SFVS)
651#define GET_FLVIC(b, c) GET_CONTEXT_FIELD(b, c, BFBCR, FLVIC)
652#define GET_SLVIC(b, c) GET_CONTEXT_FIELD(b, c, BFBCR, SLVIC)
653
654
655/* CONTEXTIDR */
656#define GET_CONTEXTIDR_ASID(b, c) \
657 GET_CONTEXT_FIELD(b, c, CONTEXTIDR, CONTEXTIDR_ASID)
658#define GET_CONTEXTIDR_PROCID(b, c) GET_CONTEXT_FIELD(b, c, CONTEXTIDR, PROCID)
659
660
661/* FSR */
662#define GET_TF(b, c) GET_CONTEXT_FIELD(b, c, FSR, TF)
663#define GET_AFF(b, c) GET_CONTEXT_FIELD(b, c, FSR, AFF)
664#define GET_APF(b, c) GET_CONTEXT_FIELD(b, c, FSR, APF)
665#define GET_TLBMF(b, c) GET_CONTEXT_FIELD(b, c, FSR, TLBMF)
666#define GET_HTWDEEF(b, c) GET_CONTEXT_FIELD(b, c, FSR, HTWDEEF)
667#define GET_HTWSEEF(b, c) GET_CONTEXT_FIELD(b, c, FSR, HTWSEEF)
668#define GET_MHF(b, c) GET_CONTEXT_FIELD(b, c, FSR, MHF)
669#define GET_SL(b, c) GET_CONTEXT_FIELD(b, c, FSR, SL)
670#define GET_SS(b, c) GET_CONTEXT_FIELD(b, c, FSR, SS)
671#define GET_MULTI(b, c) GET_CONTEXT_FIELD(b, c, FSR, MULTI)
672
673
674/* FSYNR0 */
675#define GET_AMID(b, c) GET_CONTEXT_FIELD(b, c, FSYNR0, AMID)
676#define GET_APID(b, c) GET_CONTEXT_FIELD(b, c, FSYNR0, APID)
677#define GET_ABID(b, c) GET_CONTEXT_FIELD(b, c, FSYNR0, ABID)
678#define GET_ATID(b, c) GET_CONTEXT_FIELD(b, c, FSYNR0, ATID)
679
680
681/* FSYNR1 */
682#define GET_AMEMTYPE(b, c) GET_CONTEXT_FIELD(b, c, FSYNR1, AMEMTYPE)
683#define GET_ASHARED(b, c) GET_CONTEXT_FIELD(b, c, FSYNR1, ASHARED)
684#define GET_AINNERSHARED(b, c) GET_CONTEXT_FIELD(b, c, FSYNR1, AINNERSHARED)
685#define GET_APRIV(b, c) GET_CONTEXT_FIELD(b, c, FSYNR1, APRIV)
686#define GET_APROTNS(b, c) GET_CONTEXT_FIELD(b, c, FSYNR1, APROTNS)
687#define GET_AINST(b, c) GET_CONTEXT_FIELD(b, c, FSYNR1, AINST)
688#define GET_AWRITE(b, c) GET_CONTEXT_FIELD(b, c, FSYNR1, AWRITE)
689#define GET_ABURST(b, c) GET_CONTEXT_FIELD(b, c, FSYNR1, ABURST)
690#define GET_ALEN(b, c) GET_CONTEXT_FIELD(b, c, FSYNR1, ALEN)
691#define GET_FSYNR1_ASIZE(b, c) GET_CONTEXT_FIELD(b, c, FSYNR1, FSYNR1_ASIZE)
692#define GET_ALOCK(b, c) GET_CONTEXT_FIELD(b, c, FSYNR1, ALOCK)
693#define GET_AFULL(b, c) GET_CONTEXT_FIELD(b, c, FSYNR1, AFULL)
694
695
696/* NMRR */
697#define GET_ICPC0(b, c) GET_CONTEXT_FIELD(b, c, NMRR, ICPC0)
698#define GET_ICPC1(b, c) GET_CONTEXT_FIELD(b, c, NMRR, ICPC1)
699#define GET_ICPC2(b, c) GET_CONTEXT_FIELD(b, c, NMRR, ICPC2)
700#define GET_ICPC3(b, c) GET_CONTEXT_FIELD(b, c, NMRR, ICPC3)
701#define GET_ICPC4(b, c) GET_CONTEXT_FIELD(b, c, NMRR, ICPC4)
702#define GET_ICPC5(b, c) GET_CONTEXT_FIELD(b, c, NMRR, ICPC5)
703#define GET_ICPC6(b, c) GET_CONTEXT_FIELD(b, c, NMRR, ICPC6)
704#define GET_ICPC7(b, c) GET_CONTEXT_FIELD(b, c, NMRR, ICPC7)
705#define GET_OCPC0(b, c) GET_CONTEXT_FIELD(b, c, NMRR, OCPC0)
706#define GET_OCPC1(b, c) GET_CONTEXT_FIELD(b, c, NMRR, OCPC1)
707#define GET_OCPC2(b, c) GET_CONTEXT_FIELD(b, c, NMRR, OCPC2)
708#define GET_OCPC3(b, c) GET_CONTEXT_FIELD(b, c, NMRR, OCPC3)
709#define GET_OCPC4(b, c) GET_CONTEXT_FIELD(b, c, NMRR, OCPC4)
710#define GET_OCPC5(b, c) GET_CONTEXT_FIELD(b, c, NMRR, OCPC5)
711#define GET_OCPC6(b, c) GET_CONTEXT_FIELD(b, c, NMRR, OCPC6)
712#define GET_OCPC7(b, c) GET_CONTEXT_FIELD(b, c, NMRR, OCPC7)
713#define NMRR_ICP(nmrr, n) (((nmrr) & (3 << ((n) * 2))) >> ((n) * 2))
714#define NMRR_OCP(nmrr, n) (((nmrr) & (3 << ((n) * 2 + 16))) >> \
715 ((n) * 2 + 16))
716
717/* PAR */
718#define GET_FAULT(b, c) GET_CONTEXT_FIELD(b, c, PAR, FAULT)
719
720#define GET_FAULT_TF(b, c) GET_CONTEXT_FIELD(b, c, PAR, FAULT_TF)
721#define GET_FAULT_AFF(b, c) GET_CONTEXT_FIELD(b, c, PAR, FAULT_AFF)
722#define GET_FAULT_APF(b, c) GET_CONTEXT_FIELD(b, c, PAR, FAULT_APF)
723#define GET_FAULT_TLBMF(b, c) GET_CONTEXT_FIELD(b, c, PAR, FAULT_TLBMF)
724#define GET_FAULT_HTWDEEF(b, c) GET_CONTEXT_FIELD(b, c, PAR, FAULT_HTWDEEF)
725#define GET_FAULT_HTWSEEF(b, c) GET_CONTEXT_FIELD(b, c, PAR, FAULT_HTWSEEF)
726#define GET_FAULT_MHF(b, c) GET_CONTEXT_FIELD(b, c, PAR, FAULT_MHF)
727#define GET_FAULT_SL(b, c) GET_CONTEXT_FIELD(b, c, PAR, FAULT_SL)
728#define GET_FAULT_SS(b, c) GET_CONTEXT_FIELD(b, c, PAR, FAULT_SS)
729
730#define GET_NOFAULT_SS(b, c) GET_CONTEXT_FIELD(b, c, PAR, PAR_NOFAULT_SS)
731#define GET_NOFAULT_MT(b, c) GET_CONTEXT_FIELD(b, c, PAR, PAR_NOFAULT_MT)
732#define GET_NOFAULT_SH(b, c) GET_CONTEXT_FIELD(b, c, PAR, PAR_NOFAULT_SH)
733#define GET_NOFAULT_NS(b, c) GET_CONTEXT_FIELD(b, c, PAR, PAR_NOFAULT_NS)
734#define GET_NOFAULT_NOS(b, c) GET_CONTEXT_FIELD(b, c, PAR, PAR_NOFAULT_NOS)
735#define GET_NPFAULT_PA(b, c) GET_CONTEXT_FIELD(b, c, PAR, PAR_NPFAULT_PA)
736
737
738/* PRRR */
739#define GET_MTC0(b, c) GET_CONTEXT_FIELD(b, c, PRRR, MTC0)
740#define GET_MTC1(b, c) GET_CONTEXT_FIELD(b, c, PRRR, MTC1)
741#define GET_MTC2(b, c) GET_CONTEXT_FIELD(b, c, PRRR, MTC2)
742#define GET_MTC3(b, c) GET_CONTEXT_FIELD(b, c, PRRR, MTC3)
743#define GET_MTC4(b, c) GET_CONTEXT_FIELD(b, c, PRRR, MTC4)
744#define GET_MTC5(b, c) GET_CONTEXT_FIELD(b, c, PRRR, MTC5)
745#define GET_MTC6(b, c) GET_CONTEXT_FIELD(b, c, PRRR, MTC6)
746#define GET_MTC7(b, c) GET_CONTEXT_FIELD(b, c, PRRR, MTC7)
747#define GET_SHDSH0(b, c) GET_CONTEXT_FIELD(b, c, PRRR, SHDSH0)
748#define GET_SHDSH1(b, c) GET_CONTEXT_FIELD(b, c, PRRR, SHDSH1)
749#define GET_SHNMSH0(b, c) GET_CONTEXT_FIELD(b, c, PRRR, SHNMSH0)
750#define GET_SHNMSH1(b, c) GET_CONTEXT_FIELD(b, c, PRRR, SHNMSH1)
751#define GET_NOS0(b, c) GET_CONTEXT_FIELD(b, c, PRRR, NOS0)
752#define GET_NOS1(b, c) GET_CONTEXT_FIELD(b, c, PRRR, NOS1)
753#define GET_NOS2(b, c) GET_CONTEXT_FIELD(b, c, PRRR, NOS2)
754#define GET_NOS3(b, c) GET_CONTEXT_FIELD(b, c, PRRR, NOS3)
755#define GET_NOS4(b, c) GET_CONTEXT_FIELD(b, c, PRRR, NOS4)
756#define GET_NOS5(b, c) GET_CONTEXT_FIELD(b, c, PRRR, NOS5)
757#define GET_NOS6(b, c) GET_CONTEXT_FIELD(b, c, PRRR, NOS6)
758#define GET_NOS7(b, c) GET_CONTEXT_FIELD(b, c, PRRR, NOS7)
759#define PRRR_NOS(prrr, n) ((prrr) & (1 << ((n) + 24)) ? 1 : 0)
760#define PRRR_MT(prrr, n) ((((prrr) & (3 << ((n) * 2))) >> ((n) * 2)))
761
762
763/* RESUME */
764#define GET_TNR(b, c) GET_CONTEXT_FIELD(b, c, RESUME, TNR)
765
766
767/* SCTLR */
768#define GET_M(b, c) GET_CONTEXT_FIELD(b, c, SCTLR, M)
769#define GET_TRE(b, c) GET_CONTEXT_FIELD(b, c, SCTLR, TRE)
770#define GET_AFE(b, c) GET_CONTEXT_FIELD(b, c, SCTLR, AFE)
771#define GET_HAF(b, c) GET_CONTEXT_FIELD(b, c, SCTLR, HAF)
772#define GET_BE(b, c) GET_CONTEXT_FIELD(b, c, SCTLR, BE)
773#define GET_AFFD(b, c) GET_CONTEXT_FIELD(b, c, SCTLR, AFFD)
774
775
776/* TLBLKCR */
777#define GET_LKE(b, c) GET_CONTEXT_FIELD(b, c, TLBLKCR, LKE)
778#define GET_TLBLCKR_TLBIALLCFG(b, c) \
779 GET_CONTEXT_FIELD(b, c, TLBLKCR, TLBLCKR_TLBIALLCFG)
780#define GET_TLBIASIDCFG(b, c) GET_CONTEXT_FIELD(b, c, TLBLKCR, TLBIASIDCFG)
781#define GET_TLBIVAACFG(b, c) GET_CONTEXT_FIELD(b, c, TLBLKCR, TLBIVAACFG)
782#define GET_FLOOR(b, c) GET_CONTEXT_FIELD(b, c, TLBLKCR, FLOOR)
783#define GET_VICTIM(b, c) GET_CONTEXT_FIELD(b, c, TLBLKCR, VICTIM)
784
785
786/* TTBCR */
787#define GET_N(b, c) GET_CONTEXT_FIELD(b, c, TTBCR, N)
788#define GET_PD0(b, c) GET_CONTEXT_FIELD(b, c, TTBCR, PD0)
789#define GET_PD1(b, c) GET_CONTEXT_FIELD(b, c, TTBCR, PD1)
790
791
792/* TTBR0 */
793#define GET_TTBR0_IRGNH(b, c) GET_CONTEXT_FIELD(b, c, TTBR0, TTBR0_IRGNH)
794#define GET_TTBR0_SH(b, c) GET_CONTEXT_FIELD(b, c, TTBR0, TTBR0_SH)
795#define GET_TTBR0_ORGN(b, c) GET_CONTEXT_FIELD(b, c, TTBR0, TTBR0_ORGN)
796#define GET_TTBR0_NOS(b, c) GET_CONTEXT_FIELD(b, c, TTBR0, TTBR0_NOS)
797#define GET_TTBR0_IRGNL(b, c) GET_CONTEXT_FIELD(b, c, TTBR0, TTBR0_IRGNL)
798#define GET_TTBR0_PA(b, c) GET_CONTEXT_FIELD(b, c, TTBR0, TTBR0_PA)
799
800
801/* TTBR1 */
802#define GET_TTBR1_IRGNH(b, c) GET_CONTEXT_FIELD(b, c, TTBR1, TTBR1_IRGNH)
803#define GET_TTBR1_SH(b, c) GET_CONTEXT_FIELD(b, c, TTBR1, TTBR1_SH)
804#define GET_TTBR1_ORGN(b, c) GET_CONTEXT_FIELD(b, c, TTBR1, TTBR1_ORGN)
805#define GET_TTBR1_NOS(b, c) GET_CONTEXT_FIELD(b, c, TTBR1, TTBR1_NOS)
806#define GET_TTBR1_IRGNL(b, c) GET_CONTEXT_FIELD(b, c, TTBR1, TTBR1_IRGNL)
807#define GET_TTBR1_PA(b, c) GET_CONTEXT_FIELD(b, c, TTBR1, TTBR1_PA)
808
809
810/* V2PSR */
811#define GET_HIT(b, c) GET_CONTEXT_FIELD(b, c, V2PSR, HIT)
812#define GET_INDEX(b, c) GET_CONTEXT_FIELD(b, c, V2PSR, INDEX)
813
814
815/* Global Registers */
816#define M2VCBR_N (0xFF000)
817#define CBACR_N (0xFF800)
818#define TLBRSW (0xFFE00)
819#define TLBTR0 (0xFFE80)
820#define TLBTR1 (0xFFE84)
821#define TLBTR2 (0xFFE88)
822#define TESTBUSCR (0xFFE8C)
823#define GLOBAL_TLBIALL (0xFFF00)
824#define TLBIVMID (0xFFF04)
825#define CR (0xFFF80)
826#define EAR (0xFFF84)
827#define ESR (0xFFF88)
828#define ESRRESTORE (0xFFF8C)
829#define ESYNR0 (0xFFF90)
830#define ESYNR1 (0xFFF94)
831#define REV (0xFFFF4)
832#define IDR (0xFFFF8)
833#define RPU_ACR (0xFFFFC)
834
835
836/* Context Bank Registers */
837#define SCTLR (0x000)
838#define ACTLR (0x004)
839#define CONTEXTIDR (0x008)
840#define TTBR0 (0x010)
841#define TTBR1 (0x014)
842#define TTBCR (0x018)
843#define PAR (0x01C)
844#define FSR (0x020)
845#define FSRRESTORE (0x024)
846#define FAR (0x028)
847#define FSYNR0 (0x02C)
848#define FSYNR1 (0x030)
849#define PRRR (0x034)
850#define NMRR (0x038)
851#define TLBLCKR (0x03C)
852#define V2PSR (0x040)
853#define TLBFLPTER (0x044)
854#define TLBSLPTER (0x048)
855#define BFBCR (0x04C)
856#define CTX_TLBIALL (0x800)
857#define TLBIASID (0x804)
858#define TLBIVA (0x808)
859#define TLBIVAA (0x80C)
860#define V2PPR (0x810)
861#define V2PPW (0x814)
862#define V2PUR (0x818)
863#define V2PUW (0x81C)
864#define RESUME (0x820)
865
866
867/* Global Register Fields */
868/* CBACRn */
869#define RWVMID (RWVMID_MASK << RWVMID_SHIFT)
870#define RWE (RWE_MASK << RWE_SHIFT)
871#define RWGE (RWGE_MASK << RWGE_SHIFT)
872#define CBVMID (CBVMID_MASK << CBVMID_SHIFT)
873#define IRPTNDX (IRPTNDX_MASK << IRPTNDX_SHIFT)
874
875
876/* CR */
877#define RPUE (RPUE_MASK << RPUE_SHIFT)
878#define RPUERE (RPUERE_MASK << RPUERE_SHIFT)
879#define RPUEIE (RPUEIE_MASK << RPUEIE_SHIFT)
880#define DCDEE (DCDEE_MASK << DCDEE_SHIFT)
881#define CLIENTPD (CLIENTPD_MASK << CLIENTPD_SHIFT)
882#define STALLD (STALLD_MASK << STALLD_SHIFT)
883#define TLBLKCRWE (TLBLKCRWE_MASK << TLBLKCRWE_SHIFT)
884#define CR_TLBIALLCFG (CR_TLBIALLCFG_MASK << CR_TLBIALLCFG_SHIFT)
885#define TLBIVMIDCFG (TLBIVMIDCFG_MASK << TLBIVMIDCFG_SHIFT)
886#define CR_HUME (CR_HUME_MASK << CR_HUME_SHIFT)
887
888
889/* ESR */
890#define CFG (CFG_MASK << CFG_SHIFT)
891#define BYPASS (BYPASS_MASK << BYPASS_SHIFT)
892#define ESR_MULTI (ESR_MULTI_MASK << ESR_MULTI_SHIFT)
893
894
895/* ESYNR0 */
896#define ESYNR0_AMID (ESYNR0_AMID_MASK << ESYNR0_AMID_SHIFT)
897#define ESYNR0_APID (ESYNR0_APID_MASK << ESYNR0_APID_SHIFT)
898#define ESYNR0_ABID (ESYNR0_ABID_MASK << ESYNR0_ABID_SHIFT)
899#define ESYNR0_AVMID (ESYNR0_AVMID_MASK << ESYNR0_AVMID_SHIFT)
900#define ESYNR0_ATID (ESYNR0_ATID_MASK << ESYNR0_ATID_SHIFT)
901
902
903/* ESYNR1 */
904#define ESYNR1_AMEMTYPE (ESYNR1_AMEMTYPE_MASK << ESYNR1_AMEMTYPE_SHIFT)
905#define ESYNR1_ASHARED (ESYNR1_ASHARED_MASK << ESYNR1_ASHARED_SHIFT)
906#define ESYNR1_AINNERSHARED (ESYNR1_AINNERSHARED_MASK<< \
907 ESYNR1_AINNERSHARED_SHIFT)
908#define ESYNR1_APRIV (ESYNR1_APRIV_MASK << ESYNR1_APRIV_SHIFT)
909#define ESYNR1_APROTNS (ESYNR1_APROTNS_MASK << ESYNR1_APROTNS_SHIFT)
910#define ESYNR1_AINST (ESYNR1_AINST_MASK << ESYNR1_AINST_SHIFT)
911#define ESYNR1_AWRITE (ESYNR1_AWRITE_MASK << ESYNR1_AWRITE_SHIFT)
912#define ESYNR1_ABURST (ESYNR1_ABURST_MASK << ESYNR1_ABURST_SHIFT)
913#define ESYNR1_ALEN (ESYNR1_ALEN_MASK << ESYNR1_ALEN_SHIFT)
914#define ESYNR1_ASIZE (ESYNR1_ASIZE_MASK << ESYNR1_ASIZE_SHIFT)
915#define ESYNR1_ALOCK (ESYNR1_ALOCK_MASK << ESYNR1_ALOCK_SHIFT)
916#define ESYNR1_AOOO (ESYNR1_AOOO_MASK << ESYNR1_AOOO_SHIFT)
917#define ESYNR1_AFULL (ESYNR1_AFULL_MASK << ESYNR1_AFULL_SHIFT)
918#define ESYNR1_AC (ESYNR1_AC_MASK << ESYNR1_AC_SHIFT)
919#define ESYNR1_DCD (ESYNR1_DCD_MASK << ESYNR1_DCD_SHIFT)
920
921
922/* IDR */
923#define NM2VCBMT (NM2VCBMT_MASK << NM2VCBMT_SHIFT)
924#define HTW (HTW_MASK << HTW_SHIFT)
925#define HUM (HUM_MASK << HUM_SHIFT)
926#define TLBSIZE (TLBSIZE_MASK << TLBSIZE_SHIFT)
927#define NCB (NCB_MASK << NCB_SHIFT)
928#define NIRPT (NIRPT_MASK << NIRPT_SHIFT)
929
930
931/* M2VCBRn */
932#define VMID (VMID_MASK << VMID_SHIFT)
933#define CBNDX (CBNDX_MASK << CBNDX_SHIFT)
934#define BYPASSD (BYPASSD_MASK << BYPASSD_SHIFT)
935#define BPRCOSH (BPRCOSH_MASK << BPRCOSH_SHIFT)
936#define BPRCISH (BPRCISH_MASK << BPRCISH_SHIFT)
937#define BPRCNSH (BPRCNSH_MASK << BPRCNSH_SHIFT)
938#define BPSHCFG (BPSHCFG_MASK << BPSHCFG_SHIFT)
939#define NSCFG (NSCFG_MASK << NSCFG_SHIFT)
940#define BPMTCFG (BPMTCFG_MASK << BPMTCFG_SHIFT)
941#define BPMEMTYPE (BPMEMTYPE_MASK << BPMEMTYPE_SHIFT)
942
943
944/* REV */
945#define IDR_MINOR (MINOR_MASK << MINOR_SHIFT)
946#define IDR_MAJOR (MAJOR_MASK << MAJOR_SHIFT)
947
948
949/* TESTBUSCR */
950#define TBE (TBE_MASK << TBE_SHIFT)
951#define SPDMBE (SPDMBE_MASK << SPDMBE_SHIFT)
952#define WGSEL (WGSEL_MASK << WGSEL_SHIFT)
953#define TBLSEL (TBLSEL_MASK << TBLSEL_SHIFT)
954#define TBHSEL (TBHSEL_MASK << TBHSEL_SHIFT)
955#define SPDM0SEL (SPDM0SEL_MASK << SPDM0SEL_SHIFT)
956#define SPDM1SEL (SPDM1SEL_MASK << SPDM1SEL_SHIFT)
957#define SPDM2SEL (SPDM2SEL_MASK << SPDM2SEL_SHIFT)
958#define SPDM3SEL (SPDM3SEL_MASK << SPDM3SEL_SHIFT)
959
960
961/* TLBIVMID */
962#define TLBIVMID_VMID (TLBIVMID_VMID_MASK << TLBIVMID_VMID_SHIFT)
963
964
965/* TLBRSW */
966#define TLBRSW_INDEX (TLBRSW_INDEX_MASK << TLBRSW_INDEX_SHIFT)
967#define TLBBFBS (TLBBFBS_MASK << TLBBFBS_SHIFT)
968
969
970/* TLBTR0 */
971#define PR (PR_MASK << PR_SHIFT)
972#define PW (PW_MASK << PW_SHIFT)
973#define UR (UR_MASK << UR_SHIFT)
974#define UW (UW_MASK << UW_SHIFT)
975#define XN (XN_MASK << XN_SHIFT)
976#define NSDESC (NSDESC_MASK << NSDESC_SHIFT)
977#define ISH (ISH_MASK << ISH_SHIFT)
978#define SH (SH_MASK << SH_SHIFT)
979#define MT (MT_MASK << MT_SHIFT)
980#define DPSIZR (DPSIZR_MASK << DPSIZR_SHIFT)
981#define DPSIZC (DPSIZC_MASK << DPSIZC_SHIFT)
982
983
984/* TLBTR1 */
985#define TLBTR1_VMID (TLBTR1_VMID_MASK << TLBTR1_VMID_SHIFT)
986#define TLBTR1_PA (TLBTR1_PA_MASK << TLBTR1_PA_SHIFT)
987
988
989/* TLBTR2 */
990#define TLBTR2_ASID (TLBTR2_ASID_MASK << TLBTR2_ASID_SHIFT)
991#define TLBTR2_V (TLBTR2_V_MASK << TLBTR2_V_SHIFT)
992#define TLBTR2_NSTID (TLBTR2_NSTID_MASK << TLBTR2_NSTID_SHIFT)
993#define TLBTR2_NV (TLBTR2_NV_MASK << TLBTR2_NV_SHIFT)
994#define TLBTR2_VA (TLBTR2_VA_MASK << TLBTR2_VA_SHIFT)
995
996
997/* Context Register Fields */
998/* ACTLR */
999#define CFERE (CFERE_MASK << CFERE_SHIFT)
1000#define CFEIE (CFEIE_MASK << CFEIE_SHIFT)
1001#define PTSHCFG (PTSHCFG_MASK << PTSHCFG_SHIFT)
1002#define RCOSH (RCOSH_MASK << RCOSH_SHIFT)
1003#define RCISH (RCISH_MASK << RCISH_SHIFT)
1004#define RCNSH (RCNSH_MASK << RCNSH_SHIFT)
1005#define PRIVCFG (PRIVCFG_MASK << PRIVCFG_SHIFT)
1006#define DNA (DNA_MASK << DNA_SHIFT)
1007#define DNLV2PA (DNLV2PA_MASK << DNLV2PA_SHIFT)
1008#define TLBMCFG (TLBMCFG_MASK << TLBMCFG_SHIFT)
1009#define CFCFG (CFCFG_MASK << CFCFG_SHIFT)
1010#define TIPCF (TIPCF_MASK << TIPCF_SHIFT)
1011#define V2PCFG (V2PCFG_MASK << V2PCFG_SHIFT)
1012#define HUME (HUME_MASK << HUME_SHIFT)
1013#define PTMTCFG (PTMTCFG_MASK << PTMTCFG_SHIFT)
1014#define PTMEMTYPE (PTMEMTYPE_MASK << PTMEMTYPE_SHIFT)
1015
1016
1017/* BFBCR */
1018#define BFBDFE (BFBDFE_MASK << BFBDFE_SHIFT)
1019#define BFBSFE (BFBSFE_MASK << BFBSFE_SHIFT)
1020#define SFVS (SFVS_MASK << SFVS_SHIFT)
1021#define FLVIC (FLVIC_MASK << FLVIC_SHIFT)
1022#define SLVIC (SLVIC_MASK << SLVIC_SHIFT)
1023
1024
1025/* CONTEXTIDR */
1026#define CONTEXTIDR_ASID (CONTEXTIDR_ASID_MASK << CONTEXTIDR_ASID_SHIFT)
1027#define PROCID (PROCID_MASK << PROCID_SHIFT)
1028
1029
1030/* FSR */
1031#define TF (TF_MASK << TF_SHIFT)
1032#define AFF (AFF_MASK << AFF_SHIFT)
1033#define APF (APF_MASK << APF_SHIFT)
1034#define TLBMF (TLBMF_MASK << TLBMF_SHIFT)
1035#define HTWDEEF (HTWDEEF_MASK << HTWDEEF_SHIFT)
1036#define HTWSEEF (HTWSEEF_MASK << HTWSEEF_SHIFT)
1037#define MHF (MHF_MASK << MHF_SHIFT)
1038#define SL (SL_MASK << SL_SHIFT)
1039#define SS (SS_MASK << SS_SHIFT)
1040#define MULTI (MULTI_MASK << MULTI_SHIFT)
1041
1042
1043/* FSYNR0 */
1044#define AMID (AMID_MASK << AMID_SHIFT)
1045#define APID (APID_MASK << APID_SHIFT)
1046#define ABID (ABID_MASK << ABID_SHIFT)
1047#define ATID (ATID_MASK << ATID_SHIFT)
1048
1049
1050/* FSYNR1 */
1051#define AMEMTYPE (AMEMTYPE_MASK << AMEMTYPE_SHIFT)
1052#define ASHARED (ASHARED_MASK << ASHARED_SHIFT)
1053#define AINNERSHARED (AINNERSHARED_MASK << AINNERSHARED_SHIFT)
1054#define APRIV (APRIV_MASK << APRIV_SHIFT)
1055#define APROTNS (APROTNS_MASK << APROTNS_SHIFT)
1056#define AINST (AINST_MASK << AINST_SHIFT)
1057#define AWRITE (AWRITE_MASK << AWRITE_SHIFT)
1058#define ABURST (ABURST_MASK << ABURST_SHIFT)
1059#define ALEN (ALEN_MASK << ALEN_SHIFT)
1060#define FSYNR1_ASIZE (FSYNR1_ASIZE_MASK << FSYNR1_ASIZE_SHIFT)
1061#define ALOCK (ALOCK_MASK << ALOCK_SHIFT)
1062#define AFULL (AFULL_MASK << AFULL_SHIFT)
1063
1064
1065/* NMRR */
1066#define ICPC0 (ICPC0_MASK << ICPC0_SHIFT)
1067#define ICPC1 (ICPC1_MASK << ICPC1_SHIFT)
1068#define ICPC2 (ICPC2_MASK << ICPC2_SHIFT)
1069#define ICPC3 (ICPC3_MASK << ICPC3_SHIFT)
1070#define ICPC4 (ICPC4_MASK << ICPC4_SHIFT)
1071#define ICPC5 (ICPC5_MASK << ICPC5_SHIFT)
1072#define ICPC6 (ICPC6_MASK << ICPC6_SHIFT)
1073#define ICPC7 (ICPC7_MASK << ICPC7_SHIFT)
1074#define OCPC0 (OCPC0_MASK << OCPC0_SHIFT)
1075#define OCPC1 (OCPC1_MASK << OCPC1_SHIFT)
1076#define OCPC2 (OCPC2_MASK << OCPC2_SHIFT)
1077#define OCPC3 (OCPC3_MASK << OCPC3_SHIFT)
1078#define OCPC4 (OCPC4_MASK << OCPC4_SHIFT)
1079#define OCPC5 (OCPC5_MASK << OCPC5_SHIFT)
1080#define OCPC6 (OCPC6_MASK << OCPC6_SHIFT)
1081#define OCPC7 (OCPC7_MASK << OCPC7_SHIFT)
1082
1083
1084/* PAR */
1085#define FAULT (FAULT_MASK << FAULT_SHIFT)
1086/* If a fault is present, these are the
1087same as the fault fields in the FAR */
1088#define FAULT_TF (FAULT_TF_MASK << FAULT_TF_SHIFT)
1089#define FAULT_AFF (FAULT_AFF_MASK << FAULT_AFF_SHIFT)
1090#define FAULT_APF (FAULT_APF_MASK << FAULT_APF_SHIFT)
1091#define FAULT_TLBMF (FAULT_TLBMF_MASK << FAULT_TLBMF_SHIFT)
1092#define FAULT_HTWDEEF (FAULT_HTWDEEF_MASK << FAULT_HTWDEEF_SHIFT)
1093#define FAULT_HTWSEEF (FAULT_HTWSEEF_MASK << FAULT_HTWSEEF_SHIFT)
1094#define FAULT_MHF (FAULT_MHF_MASK << FAULT_MHF_SHIFT)
1095#define FAULT_SL (FAULT_SL_MASK << FAULT_SL_SHIFT)
1096#define FAULT_SS (FAULT_SS_MASK << FAULT_SS_SHIFT)
1097
1098/* If NO fault is present, the following fields are in effect */
1099/* (FAULT remains as before) */
1100#define PAR_NOFAULT_SS (PAR_NOFAULT_SS_MASK << PAR_NOFAULT_SS_SHIFT)
1101#define PAR_NOFAULT_MT (PAR_NOFAULT_MT_MASK << PAR_NOFAULT_MT_SHIFT)
1102#define PAR_NOFAULT_SH (PAR_NOFAULT_SH_MASK << PAR_NOFAULT_SH_SHIFT)
1103#define PAR_NOFAULT_NS (PAR_NOFAULT_NS_MASK << PAR_NOFAULT_NS_SHIFT)
1104#define PAR_NOFAULT_NOS (PAR_NOFAULT_NOS_MASK << PAR_NOFAULT_NOS_SHIFT)
1105#define PAR_NPFAULT_PA (PAR_NPFAULT_PA_MASK << PAR_NPFAULT_PA_SHIFT)
1106
1107
1108/* PRRR */
1109#define MTC0 (MTC0_MASK << MTC0_SHIFT)
1110#define MTC1 (MTC1_MASK << MTC1_SHIFT)
1111#define MTC2 (MTC2_MASK << MTC2_SHIFT)
1112#define MTC3 (MTC3_MASK << MTC3_SHIFT)
1113#define MTC4 (MTC4_MASK << MTC4_SHIFT)
1114#define MTC5 (MTC5_MASK << MTC5_SHIFT)
1115#define MTC6 (MTC6_MASK << MTC6_SHIFT)
1116#define MTC7 (MTC7_MASK << MTC7_SHIFT)
1117#define SHDSH0 (SHDSH0_MASK << SHDSH0_SHIFT)
1118#define SHDSH1 (SHDSH1_MASK << SHDSH1_SHIFT)
1119#define SHNMSH0 (SHNMSH0_MASK << SHNMSH0_SHIFT)
1120#define SHNMSH1 (SHNMSH1_MASK << SHNMSH1_SHIFT)
1121#define NOS0 (NOS0_MASK << NOS0_SHIFT)
1122#define NOS1 (NOS1_MASK << NOS1_SHIFT)
1123#define NOS2 (NOS2_MASK << NOS2_SHIFT)
1124#define NOS3 (NOS3_MASK << NOS3_SHIFT)
1125#define NOS4 (NOS4_MASK << NOS4_SHIFT)
1126#define NOS5 (NOS5_MASK << NOS5_SHIFT)
1127#define NOS6 (NOS6_MASK << NOS6_SHIFT)
1128#define NOS7 (NOS7_MASK << NOS7_SHIFT)
1129
1130
1131/* RESUME */
1132#define TNR (TNR_MASK << TNR_SHIFT)
1133
1134
1135/* SCTLR */
1136#define M (M_MASK << M_SHIFT)
1137#define TRE (TRE_MASK << TRE_SHIFT)
1138#define AFE (AFE_MASK << AFE_SHIFT)
1139#define HAF (HAF_MASK << HAF_SHIFT)
1140#define BE (BE_MASK << BE_SHIFT)
1141#define AFFD (AFFD_MASK << AFFD_SHIFT)
1142
1143
1144/* TLBIASID */
1145#define TLBIASID_ASID (TLBIASID_ASID_MASK << TLBIASID_ASID_SHIFT)
1146
1147
1148/* TLBIVA */
1149#define TLBIVA_ASID (TLBIVA_ASID_MASK << TLBIVA_ASID_SHIFT)
1150#define TLBIVA_VA (TLBIVA_VA_MASK << TLBIVA_VA_SHIFT)
1151
1152
1153/* TLBIVAA */
1154#define TLBIVAA_VA (TLBIVAA_VA_MASK << TLBIVAA_VA_SHIFT)
1155
1156
1157/* TLBLCKR */
1158#define LKE (LKE_MASK << LKE_SHIFT)
1159#define TLBLCKR_TLBIALLCFG (TLBLCKR_TLBIALLCFG_MASK<<TLBLCKR_TLBIALLCFG_SHIFT)
1160#define TLBIASIDCFG (TLBIASIDCFG_MASK << TLBIASIDCFG_SHIFT)
1161#define TLBIVAACFG (TLBIVAACFG_MASK << TLBIVAACFG_SHIFT)
1162#define FLOOR (FLOOR_MASK << FLOOR_SHIFT)
1163#define VICTIM (VICTIM_MASK << VICTIM_SHIFT)
1164
1165
1166/* TTBCR */
1167#define N (N_MASK << N_SHIFT)
1168#define PD0 (PD0_MASK << PD0_SHIFT)
1169#define PD1 (PD1_MASK << PD1_SHIFT)
1170
1171
1172/* TTBR0 */
1173#define TTBR0_IRGNH (TTBR0_IRGNH_MASK << TTBR0_IRGNH_SHIFT)
1174#define TTBR0_SH (TTBR0_SH_MASK << TTBR0_SH_SHIFT)
1175#define TTBR0_ORGN (TTBR0_ORGN_MASK << TTBR0_ORGN_SHIFT)
1176#define TTBR0_NOS (TTBR0_NOS_MASK << TTBR0_NOS_SHIFT)
1177#define TTBR0_IRGNL (TTBR0_IRGNL_MASK << TTBR0_IRGNL_SHIFT)
1178#define TTBR0_PA (TTBR0_PA_MASK << TTBR0_PA_SHIFT)
1179
1180
1181/* TTBR1 */
1182#define TTBR1_IRGNH (TTBR1_IRGNH_MASK << TTBR1_IRGNH_SHIFT)
1183#define TTBR1_SH (TTBR1_SH_MASK << TTBR1_SH_SHIFT)
1184#define TTBR1_ORGN (TTBR1_ORGN_MASK << TTBR1_ORGN_SHIFT)
1185#define TTBR1_NOS (TTBR1_NOS_MASK << TTBR1_NOS_SHIFT)
1186#define TTBR1_IRGNL (TTBR1_IRGNL_MASK << TTBR1_IRGNL_SHIFT)
1187#define TTBR1_PA (TTBR1_PA_MASK << TTBR1_PA_SHIFT)
1188
1189
1190/* V2PSR */
1191#define HIT (HIT_MASK << HIT_SHIFT)
1192#define INDEX (INDEX_MASK << INDEX_SHIFT)
1193
1194
1195/* V2Pxx */
1196#define V2Pxx_INDEX (V2Pxx_INDEX_MASK << V2Pxx_INDEX_SHIFT)
1197#define V2Pxx_VA (V2Pxx_VA_MASK << V2Pxx_VA_SHIFT)
1198
1199
1200/* Global Register Masks */
1201/* CBACRn */
1202#define RWVMID_MASK 0x1F
1203#define RWE_MASK 0x01
1204#define RWGE_MASK 0x01
1205#define CBVMID_MASK 0x1F
1206#define IRPTNDX_MASK 0xFF
1207
1208
1209/* CR */
1210#define RPUE_MASK 0x01
1211#define RPUERE_MASK 0x01
1212#define RPUEIE_MASK 0x01
1213#define DCDEE_MASK 0x01
1214#define CLIENTPD_MASK 0x01
1215#define STALLD_MASK 0x01
1216#define TLBLKCRWE_MASK 0x01
1217#define CR_TLBIALLCFG_MASK 0x01
1218#define TLBIVMIDCFG_MASK 0x01
1219#define CR_HUME_MASK 0x01
1220
1221
1222/* ESR */
1223#define CFG_MASK 0x01
1224#define BYPASS_MASK 0x01
1225#define ESR_MULTI_MASK 0x01
1226
1227
1228/* ESYNR0 */
1229#define ESYNR0_AMID_MASK 0xFF
1230#define ESYNR0_APID_MASK 0x1F
1231#define ESYNR0_ABID_MASK 0x07
1232#define ESYNR0_AVMID_MASK 0x1F
1233#define ESYNR0_ATID_MASK 0xFF
1234
1235
1236/* ESYNR1 */
1237#define ESYNR1_AMEMTYPE_MASK 0x07
1238#define ESYNR1_ASHARED_MASK 0x01
1239#define ESYNR1_AINNERSHARED_MASK 0x01
1240#define ESYNR1_APRIV_MASK 0x01
1241#define ESYNR1_APROTNS_MASK 0x01
1242#define ESYNR1_AINST_MASK 0x01
1243#define ESYNR1_AWRITE_MASK 0x01
1244#define ESYNR1_ABURST_MASK 0x01
1245#define ESYNR1_ALEN_MASK 0x0F
1246#define ESYNR1_ASIZE_MASK 0x01
1247#define ESYNR1_ALOCK_MASK 0x03
1248#define ESYNR1_AOOO_MASK 0x01
1249#define ESYNR1_AFULL_MASK 0x01
1250#define ESYNR1_AC_MASK 0x01
1251#define ESYNR1_DCD_MASK 0x01
1252
1253
1254/* IDR */
1255#define NM2VCBMT_MASK 0x1FF
1256#define HTW_MASK 0x01
1257#define HUM_MASK 0x01
1258#define TLBSIZE_MASK 0x0F
1259#define NCB_MASK 0xFF
1260#define NIRPT_MASK 0xFF
1261
1262
1263/* M2VCBRn */
1264#define VMID_MASK 0x1F
1265#define CBNDX_MASK 0xFF
1266#define BYPASSD_MASK 0x01
1267#define BPRCOSH_MASK 0x01
1268#define BPRCISH_MASK 0x01
1269#define BPRCNSH_MASK 0x01
1270#define BPSHCFG_MASK 0x03
1271#define NSCFG_MASK 0x03
1272#define BPMTCFG_MASK 0x01
1273#define BPMEMTYPE_MASK 0x07
1274
1275
1276/* REV */
1277#define MINOR_MASK 0x0F
1278#define MAJOR_MASK 0x0F
1279
1280
1281/* TESTBUSCR */
1282#define TBE_MASK 0x01
1283#define SPDMBE_MASK 0x01
1284#define WGSEL_MASK 0x03
1285#define TBLSEL_MASK 0x03
1286#define TBHSEL_MASK 0x03
1287#define SPDM0SEL_MASK 0x0F
1288#define SPDM1SEL_MASK 0x0F
1289#define SPDM2SEL_MASK 0x0F
1290#define SPDM3SEL_MASK 0x0F
1291
1292
1293/* TLBIMID */
1294#define TLBIVMID_VMID_MASK 0x1F
1295
1296
1297/* TLBRSW */
1298#define TLBRSW_INDEX_MASK 0xFF
1299#define TLBBFBS_MASK 0x03
1300
1301
1302/* TLBTR0 */
1303#define PR_MASK 0x01
1304#define PW_MASK 0x01
1305#define UR_MASK 0x01
1306#define UW_MASK 0x01
1307#define XN_MASK 0x01
1308#define NSDESC_MASK 0x01
1309#define ISH_MASK 0x01
1310#define SH_MASK 0x01
1311#define MT_MASK 0x07
1312#define DPSIZR_MASK 0x07
1313#define DPSIZC_MASK 0x07
1314
1315
1316/* TLBTR1 */
1317#define TLBTR1_VMID_MASK 0x1F
1318#define TLBTR1_PA_MASK 0x000FFFFF
1319
1320
1321/* TLBTR2 */
1322#define TLBTR2_ASID_MASK 0xFF
1323#define TLBTR2_V_MASK 0x01
1324#define TLBTR2_NSTID_MASK 0x01
1325#define TLBTR2_NV_MASK 0x01
1326#define TLBTR2_VA_MASK 0x000FFFFF
1327
1328
1329/* Global Register Shifts */
1330/* CBACRn */
1331#define RWVMID_SHIFT 0
1332#define RWE_SHIFT 8
1333#define RWGE_SHIFT 9
1334#define CBVMID_SHIFT 16
1335#define IRPTNDX_SHIFT 24
1336
1337
1338/* CR */
1339#define RPUE_SHIFT 0
1340#define RPUERE_SHIFT 1
1341#define RPUEIE_SHIFT 2
1342#define DCDEE_SHIFT 3
1343#define CLIENTPD_SHIFT 4
1344#define STALLD_SHIFT 5
1345#define TLBLKCRWE_SHIFT 6
1346#define CR_TLBIALLCFG_SHIFT 7
1347#define TLBIVMIDCFG_SHIFT 8
1348#define CR_HUME_SHIFT 9
1349
1350
1351/* ESR */
1352#define CFG_SHIFT 0
1353#define BYPASS_SHIFT 1
1354#define ESR_MULTI_SHIFT 31
1355
1356
1357/* ESYNR0 */
1358#define ESYNR0_AMID_SHIFT 0
1359#define ESYNR0_APID_SHIFT 8
1360#define ESYNR0_ABID_SHIFT 13
1361#define ESYNR0_AVMID_SHIFT 16
1362#define ESYNR0_ATID_SHIFT 24
1363
1364
1365/* ESYNR1 */
1366#define ESYNR1_AMEMTYPE_SHIFT 0
1367#define ESYNR1_ASHARED_SHIFT 3
1368#define ESYNR1_AINNERSHARED_SHIFT 4
1369#define ESYNR1_APRIV_SHIFT 5
1370#define ESYNR1_APROTNS_SHIFT 6
1371#define ESYNR1_AINST_SHIFT 7
1372#define ESYNR1_AWRITE_SHIFT 8
1373#define ESYNR1_ABURST_SHIFT 10
1374#define ESYNR1_ALEN_SHIFT 12
1375#define ESYNR1_ASIZE_SHIFT 16
1376#define ESYNR1_ALOCK_SHIFT 20
1377#define ESYNR1_AOOO_SHIFT 22
1378#define ESYNR1_AFULL_SHIFT 24
1379#define ESYNR1_AC_SHIFT 30
1380#define ESYNR1_DCD_SHIFT 31
1381
1382
1383/* IDR */
1384#define NM2VCBMT_SHIFT 0
1385#define HTW_SHIFT 9
1386#define HUM_SHIFT 10
1387#define TLBSIZE_SHIFT 12
1388#define NCB_SHIFT 16
1389#define NIRPT_SHIFT 24
1390
1391
1392/* M2VCBRn */
1393#define VMID_SHIFT 0
1394#define CBNDX_SHIFT 8
1395#define BYPASSD_SHIFT 16
1396#define BPRCOSH_SHIFT 17
1397#define BPRCISH_SHIFT 18
1398#define BPRCNSH_SHIFT 19
1399#define BPSHCFG_SHIFT 20
1400#define NSCFG_SHIFT 22
1401#define BPMTCFG_SHIFT 24
1402#define BPMEMTYPE_SHIFT 25
1403
1404
1405/* REV */
1406#define MINOR_SHIFT 0
1407#define MAJOR_SHIFT 4
1408
1409
1410/* TESTBUSCR */
1411#define TBE_SHIFT 0
1412#define SPDMBE_SHIFT 1
1413#define WGSEL_SHIFT 8
1414#define TBLSEL_SHIFT 12
1415#define TBHSEL_SHIFT 14
1416#define SPDM0SEL_SHIFT 16
1417#define SPDM1SEL_SHIFT 20
1418#define SPDM2SEL_SHIFT 24
1419#define SPDM3SEL_SHIFT 28
1420
1421
1422/* TLBIMID */
1423#define TLBIVMID_VMID_SHIFT 0
1424
1425
1426/* TLBRSW */
1427#define TLBRSW_INDEX_SHIFT 0
1428#define TLBBFBS_SHIFT 8
1429
1430
1431/* TLBTR0 */
1432#define PR_SHIFT 0
1433#define PW_SHIFT 1
1434#define UR_SHIFT 2
1435#define UW_SHIFT 3
1436#define XN_SHIFT 4
1437#define NSDESC_SHIFT 6
1438#define ISH_SHIFT 7
1439#define SH_SHIFT 8
1440#define MT_SHIFT 9
1441#define DPSIZR_SHIFT 16
1442#define DPSIZC_SHIFT 20
1443
1444
1445/* TLBTR1 */
1446#define TLBTR1_VMID_SHIFT 0
1447#define TLBTR1_PA_SHIFT 12
1448
1449
1450/* TLBTR2 */
1451#define TLBTR2_ASID_SHIFT 0
1452#define TLBTR2_V_SHIFT 8
1453#define TLBTR2_NSTID_SHIFT 9
1454#define TLBTR2_NV_SHIFT 10
1455#define TLBTR2_VA_SHIFT 12
1456
1457
1458/* Context Register Masks */
1459/* ACTLR */
1460#define CFERE_MASK 0x01
1461#define CFEIE_MASK 0x01
1462#define PTSHCFG_MASK 0x03
1463#define RCOSH_MASK 0x01
1464#define RCISH_MASK 0x01
1465#define RCNSH_MASK 0x01
1466#define PRIVCFG_MASK 0x03
1467#define DNA_MASK 0x01
1468#define DNLV2PA_MASK 0x01
1469#define TLBMCFG_MASK 0x03
1470#define CFCFG_MASK 0x01
1471#define TIPCF_MASK 0x01
1472#define V2PCFG_MASK 0x03
1473#define HUME_MASK 0x01
1474#define PTMTCFG_MASK 0x01
1475#define PTMEMTYPE_MASK 0x07
1476
1477
1478/* BFBCR */
1479#define BFBDFE_MASK 0x01
1480#define BFBSFE_MASK 0x01
1481#define SFVS_MASK 0x01
1482#define FLVIC_MASK 0x0F
1483#define SLVIC_MASK 0x0F
1484
1485
1486/* CONTEXTIDR */
1487#define CONTEXTIDR_ASID_MASK 0xFF
1488#define PROCID_MASK 0x00FFFFFF
1489
1490
1491/* FSR */
1492#define TF_MASK 0x01
1493#define AFF_MASK 0x01
1494#define APF_MASK 0x01
1495#define TLBMF_MASK 0x01
1496#define HTWDEEF_MASK 0x01
1497#define HTWSEEF_MASK 0x01
1498#define MHF_MASK 0x01
1499#define SL_MASK 0x01
1500#define SS_MASK 0x01
1501#define MULTI_MASK 0x01
1502
1503
1504/* FSYNR0 */
1505#define AMID_MASK 0xFF
1506#define APID_MASK 0x1F
1507#define ABID_MASK 0x07
1508#define ATID_MASK 0xFF
1509
1510
1511/* FSYNR1 */
1512#define AMEMTYPE_MASK 0x07
1513#define ASHARED_MASK 0x01
1514#define AINNERSHARED_MASK 0x01
1515#define APRIV_MASK 0x01
1516#define APROTNS_MASK 0x01
1517#define AINST_MASK 0x01
1518#define AWRITE_MASK 0x01
1519#define ABURST_MASK 0x01
1520#define ALEN_MASK 0x0F
1521#define FSYNR1_ASIZE_MASK 0x07
1522#define ALOCK_MASK 0x03
1523#define AFULL_MASK 0x01
1524
1525
1526/* NMRR */
1527#define ICPC0_MASK 0x03
1528#define ICPC1_MASK 0x03
1529#define ICPC2_MASK 0x03
1530#define ICPC3_MASK 0x03
1531#define ICPC4_MASK 0x03
1532#define ICPC5_MASK 0x03
1533#define ICPC6_MASK 0x03
1534#define ICPC7_MASK 0x03
1535#define OCPC0_MASK 0x03
1536#define OCPC1_MASK 0x03
1537#define OCPC2_MASK 0x03
1538#define OCPC3_MASK 0x03
1539#define OCPC4_MASK 0x03
1540#define OCPC5_MASK 0x03
1541#define OCPC6_MASK 0x03
1542#define OCPC7_MASK 0x03
1543
1544
1545/* PAR */
1546#define FAULT_MASK 0x01
1547/* If a fault is present, these are the
1548same as the fault fields in the FAR */
1549#define FAULT_TF_MASK 0x01
1550#define FAULT_AFF_MASK 0x01
1551#define FAULT_APF_MASK 0x01
1552#define FAULT_TLBMF_MASK 0x01
1553#define FAULT_HTWDEEF_MASK 0x01
1554#define FAULT_HTWSEEF_MASK 0x01
1555#define FAULT_MHF_MASK 0x01
1556#define FAULT_SL_MASK 0x01
1557#define FAULT_SS_MASK 0x01
1558
1559/* If NO fault is present, the following
1560 * fields are in effect
1561 * (FAULT remains as before) */
1562#define PAR_NOFAULT_SS_MASK 0x01
1563#define PAR_NOFAULT_MT_MASK 0x07
1564#define PAR_NOFAULT_SH_MASK 0x01
1565#define PAR_NOFAULT_NS_MASK 0x01
1566#define PAR_NOFAULT_NOS_MASK 0x01
1567#define PAR_NPFAULT_PA_MASK 0x000FFFFF
1568
1569
1570/* PRRR */
1571#define MTC0_MASK 0x03
1572#define MTC1_MASK 0x03
1573#define MTC2_MASK 0x03
1574#define MTC3_MASK 0x03
1575#define MTC4_MASK 0x03
1576#define MTC5_MASK 0x03
1577#define MTC6_MASK 0x03
1578#define MTC7_MASK 0x03
1579#define SHDSH0_MASK 0x01
1580#define SHDSH1_MASK 0x01
1581#define SHNMSH0_MASK 0x01
1582#define SHNMSH1_MASK 0x01
1583#define NOS0_MASK 0x01
1584#define NOS1_MASK 0x01
1585#define NOS2_MASK 0x01
1586#define NOS3_MASK 0x01
1587#define NOS4_MASK 0x01
1588#define NOS5_MASK 0x01
1589#define NOS6_MASK 0x01
1590#define NOS7_MASK 0x01
1591
1592
1593/* RESUME */
1594#define TNR_MASK 0x01
1595
1596
1597/* SCTLR */
1598#define M_MASK 0x01
1599#define TRE_MASK 0x01
1600#define AFE_MASK 0x01
1601#define HAF_MASK 0x01
1602#define BE_MASK 0x01
1603#define AFFD_MASK 0x01
1604
1605
1606/* TLBIASID */
1607#define TLBIASID_ASID_MASK 0xFF
1608
1609
1610/* TLBIVA */
1611#define TLBIVA_ASID_MASK 0xFF
1612#define TLBIVA_VA_MASK 0x000FFFFF
1613
1614
1615/* TLBIVAA */
1616#define TLBIVAA_VA_MASK 0x000FFFFF
1617
1618
1619/* TLBLCKR */
1620#define LKE_MASK 0x01
1621#define TLBLCKR_TLBIALLCFG_MASK 0x01
1622#define TLBIASIDCFG_MASK 0x01
1623#define TLBIVAACFG_MASK 0x01
1624#define FLOOR_MASK 0xFF
1625#define VICTIM_MASK 0xFF
1626
1627
1628/* TTBCR */
1629#define N_MASK 0x07
1630#define PD0_MASK 0x01
1631#define PD1_MASK 0x01
1632
1633
1634/* TTBR0 */
1635#define TTBR0_IRGNH_MASK 0x01
1636#define TTBR0_SH_MASK 0x01
1637#define TTBR0_ORGN_MASK 0x03
1638#define TTBR0_NOS_MASK 0x01
1639#define TTBR0_IRGNL_MASK 0x01
1640#define TTBR0_PA_MASK 0x0003FFFF
1641
1642
1643/* TTBR1 */
1644#define TTBR1_IRGNH_MASK 0x01
1645#define TTBR1_SH_MASK 0x01
1646#define TTBR1_ORGN_MASK 0x03
1647#define TTBR1_NOS_MASK 0x01
1648#define TTBR1_IRGNL_MASK 0x01
1649#define TTBR1_PA_MASK 0x0003FFFF
1650
1651
1652/* V2PSR */
1653#define HIT_MASK 0x01
1654#define INDEX_MASK 0xFF
1655
1656
1657/* V2Pxx */
1658#define V2Pxx_INDEX_MASK 0xFF
1659#define V2Pxx_VA_MASK 0x000FFFFF
1660
1661
1662/* Context Register Shifts */
1663/* ACTLR */
1664#define CFERE_SHIFT 0
1665#define CFEIE_SHIFT 1
1666#define PTSHCFG_SHIFT 2
1667#define RCOSH_SHIFT 4
1668#define RCISH_SHIFT 5
1669#define RCNSH_SHIFT 6
1670#define PRIVCFG_SHIFT 8
1671#define DNA_SHIFT 10
1672#define DNLV2PA_SHIFT 11
1673#define TLBMCFG_SHIFT 12
1674#define CFCFG_SHIFT 14
1675#define TIPCF_SHIFT 15
1676#define V2PCFG_SHIFT 16
1677#define HUME_SHIFT 18
1678#define PTMTCFG_SHIFT 20
1679#define PTMEMTYPE_SHIFT 21
1680
1681
1682/* BFBCR */
1683#define BFBDFE_SHIFT 0
1684#define BFBSFE_SHIFT 1
1685#define SFVS_SHIFT 2
1686#define FLVIC_SHIFT 4
1687#define SLVIC_SHIFT 8
1688
1689
1690/* CONTEXTIDR */
1691#define CONTEXTIDR_ASID_SHIFT 0
1692#define PROCID_SHIFT 8
1693
1694
1695/* FSR */
1696#define TF_SHIFT 1
1697#define AFF_SHIFT 2
1698#define APF_SHIFT 3
1699#define TLBMF_SHIFT 4
1700#define HTWDEEF_SHIFT 5
1701#define HTWSEEF_SHIFT 6
1702#define MHF_SHIFT 7
1703#define SL_SHIFT 16
1704#define SS_SHIFT 30
1705#define MULTI_SHIFT 31
1706
1707
1708/* FSYNR0 */
1709#define AMID_SHIFT 0
1710#define APID_SHIFT 8
1711#define ABID_SHIFT 13
1712#define ATID_SHIFT 24
1713
1714
1715/* FSYNR1 */
1716#define AMEMTYPE_SHIFT 0
1717#define ASHARED_SHIFT 3
1718#define AINNERSHARED_SHIFT 4
1719#define APRIV_SHIFT 5
1720#define APROTNS_SHIFT 6
1721#define AINST_SHIFT 7
1722#define AWRITE_SHIFT 8
1723#define ABURST_SHIFT 10
1724#define ALEN_SHIFT 12
1725#define FSYNR1_ASIZE_SHIFT 16
1726#define ALOCK_SHIFT 20
1727#define AFULL_SHIFT 24
1728
1729
1730/* NMRR */
1731#define ICPC0_SHIFT 0
1732#define ICPC1_SHIFT 2
1733#define ICPC2_SHIFT 4
1734#define ICPC3_SHIFT 6
1735#define ICPC4_SHIFT 8
1736#define ICPC5_SHIFT 10
1737#define ICPC6_SHIFT 12
1738#define ICPC7_SHIFT 14
1739#define OCPC0_SHIFT 16
1740#define OCPC1_SHIFT 18
1741#define OCPC2_SHIFT 20
1742#define OCPC3_SHIFT 22
1743#define OCPC4_SHIFT 24
1744#define OCPC5_SHIFT 26
1745#define OCPC6_SHIFT 28
1746#define OCPC7_SHIFT 30
1747
1748
1749/* PAR */
1750#define FAULT_SHIFT 0
1751/* If a fault is present, these are the
1752same as the fault fields in the FAR */
1753#define FAULT_TF_SHIFT 1
1754#define FAULT_AFF_SHIFT 2
1755#define FAULT_APF_SHIFT 3
1756#define FAULT_TLBMF_SHIFT 4
1757#define FAULT_HTWDEEF_SHIFT 5
1758#define FAULT_HTWSEEF_SHIFT 6
1759#define FAULT_MHF_SHIFT 7
1760#define FAULT_SL_SHIFT 16
1761#define FAULT_SS_SHIFT 30
1762
1763/* If NO fault is present, the following
1764 * fields are in effect
1765 * (FAULT remains as before) */
1766#define PAR_NOFAULT_SS_SHIFT 1
1767#define PAR_NOFAULT_MT_SHIFT 4
1768#define PAR_NOFAULT_SH_SHIFT 7
1769#define PAR_NOFAULT_NS_SHIFT 9
1770#define PAR_NOFAULT_NOS_SHIFT 10
1771#define PAR_NPFAULT_PA_SHIFT 12
1772
1773
1774/* PRRR */
1775#define MTC0_SHIFT 0
1776#define MTC1_SHIFT 2
1777#define MTC2_SHIFT 4
1778#define MTC3_SHIFT 6
1779#define MTC4_SHIFT 8
1780#define MTC5_SHIFT 10
1781#define MTC6_SHIFT 12
1782#define MTC7_SHIFT 14
1783#define SHDSH0_SHIFT 16
1784#define SHDSH1_SHIFT 17
1785#define SHNMSH0_SHIFT 18
1786#define SHNMSH1_SHIFT 19
1787#define NOS0_SHIFT 24
1788#define NOS1_SHIFT 25
1789#define NOS2_SHIFT 26
1790#define NOS3_SHIFT 27
1791#define NOS4_SHIFT 28
1792#define NOS5_SHIFT 29
1793#define NOS6_SHIFT 30
1794#define NOS7_SHIFT 31
1795
1796
1797/* RESUME */
1798#define TNR_SHIFT 0
1799
1800
1801/* SCTLR */
1802#define M_SHIFT 0
1803#define TRE_SHIFT 1
1804#define AFE_SHIFT 2
1805#define HAF_SHIFT 3
1806#define BE_SHIFT 4
1807#define AFFD_SHIFT 5
1808
1809
1810/* TLBIASID */
1811#define TLBIASID_ASID_SHIFT 0
1812
1813
1814/* TLBIVA */
1815#define TLBIVA_ASID_SHIFT 0
1816#define TLBIVA_VA_SHIFT 12
1817
1818
1819/* TLBIVAA */
1820#define TLBIVAA_VA_SHIFT 12
1821
1822
1823/* TLBLCKR */
1824#define LKE_SHIFT 0
1825#define TLBLCKR_TLBIALLCFG_SHIFT 1
1826#define TLBIASIDCFG_SHIFT 2
1827#define TLBIVAACFG_SHIFT 3
1828#define FLOOR_SHIFT 8
1829#define VICTIM_SHIFT 8
1830
1831
1832/* TTBCR */
1833#define N_SHIFT 3
1834#define PD0_SHIFT 4
1835#define PD1_SHIFT 5
1836
1837
1838/* TTBR0 */
1839#define TTBR0_IRGNH_SHIFT 0
1840#define TTBR0_SH_SHIFT 1
1841#define TTBR0_ORGN_SHIFT 3
1842#define TTBR0_NOS_SHIFT 5
1843#define TTBR0_IRGNL_SHIFT 6
1844#define TTBR0_PA_SHIFT 14
1845
1846
1847/* TTBR1 */
1848#define TTBR1_IRGNH_SHIFT 0
1849#define TTBR1_SH_SHIFT 1
1850#define TTBR1_ORGN_SHIFT 3
1851#define TTBR1_NOS_SHIFT 5
1852#define TTBR1_IRGNL_SHIFT 6
1853#define TTBR1_PA_SHIFT 14
1854
1855
1856/* V2PSR */
1857#define HIT_SHIFT 0
1858#define INDEX_SHIFT 8
1859
1860
1861/* V2Pxx */
1862#define V2Pxx_INDEX_SHIFT 0
1863#define V2Pxx_VA_SHIFT 12
1864
1865#endif
diff --git a/arch/arm/mach-msm/include/mach/msm_iomap-8960.h b/arch/arm/mach-msm/include/mach/msm_iomap-8960.h
deleted file mode 100644
index 7bca8d7108d6..000000000000
--- a/arch/arm/mach-msm/include/mach/msm_iomap-8960.h
+++ /dev/null
@@ -1,46 +0,0 @@
1/*
2 * Copyright (C) 2007 Google, Inc.
3 * Copyright (c) 2008-2011, Code Aurora Forum. All rights reserved.
4 * Author: Brian Swetland <swetland@google.com>
5 *
6 * This software is licensed under the terms of the GNU General Public
7 * License version 2, as published by the Free Software Foundation, and
8 * may be copied, distributed, and modified under those terms.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 *
16 * The MSM peripherals are spread all over across 768MB of physical
17 * space, which makes just having a simple IO_ADDRESS macro to slide
18 * them into the right virtual location rough. Instead, we will
19 * provide a master phys->virt mapping for peripherals here.
20 *
21 */
22
23#ifndef __ASM_ARCH_MSM_IOMAP_8960_H
24#define __ASM_ARCH_MSM_IOMAP_8960_H
25
26/* Physical base address and size of peripherals.
27 * Ordered by the virtual base addresses they will be mapped at.
28 *
29 * If you add or remove entries here, you'll want to edit the
30 * msm_io_desc array in arch/arm/mach-msm/io.c to reflect your
31 * changes.
32 *
33 */
34
35#define MSM8960_TMR_PHYS 0x0200A000
36#define MSM8960_TMR_SIZE SZ_4K
37
38#define MSM8960_TMR0_PHYS 0x0208A000
39#define MSM8960_TMR0_SIZE SZ_4K
40
41#ifdef CONFIG_DEBUG_MSM8960_UART
42#define MSM_DEBUG_UART_BASE 0xF0040000
43#define MSM_DEBUG_UART_PHYS 0x16440000
44#endif
45
46#endif
diff --git a/arch/arm/mach-msm/include/mach/msm_iomap-8x60.h b/arch/arm/mach-msm/include/mach/msm_iomap-8x60.h
deleted file mode 100644
index 75a7b62c1c74..000000000000
--- a/arch/arm/mach-msm/include/mach/msm_iomap-8x60.h
+++ /dev/null
@@ -1,53 +0,0 @@
1/*
2 * Copyright (C) 2007 Google, Inc.
3 * Copyright (c) 2008-2011, Code Aurora Forum. All rights reserved.
4 * Author: Brian Swetland <swetland@google.com>
5 *
6 * This software is licensed under the terms of the GNU General Public
7 * License version 2, as published by the Free Software Foundation, and
8 * may be copied, distributed, and modified under those terms.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 *
16 * The MSM peripherals are spread all over across 768MB of physical
17 * space, which makes just having a simple IO_ADDRESS macro to slide
18 * them into the right virtual location rough. Instead, we will
19 * provide a master phys->virt mapping for peripherals here.
20 *
21 */
22
23#ifndef __ASM_ARCH_MSM_IOMAP_8X60_H
24#define __ASM_ARCH_MSM_IOMAP_8X60_H
25
26/* Physical base address and size of peripherals.
27 * Ordered by the virtual base addresses they will be mapped at.
28 *
29 * MSM_VIC_BASE must be an value that can be loaded via a "mov"
30 * instruction, otherwise entry-macro.S will not compile.
31 *
32 * If you add or remove entries here, you'll want to edit the
33 * msm_io_desc array in arch/arm/mach-msm/io.c to reflect your
34 * changes.
35 *
36 */
37
38#define MSM_TLMM_BASE IOMEM(0xF0004000)
39#define MSM_TLMM_PHYS 0x00800000
40#define MSM_TLMM_SIZE SZ_16K
41
42#define MSM8X60_TMR_PHYS 0x02000000
43#define MSM8X60_TMR_SIZE SZ_4K
44
45#define MSM8X60_TMR0_PHYS 0x02040000
46#define MSM8X60_TMR0_SIZE SZ_4K
47
48#ifdef CONFIG_DEBUG_MSM8660_UART
49#define MSM_DEBUG_UART_BASE 0xF0040000
50#define MSM_DEBUG_UART_PHYS 0x19C40000
51#endif
52
53#endif
diff --git a/arch/arm/mach-msm/include/mach/msm_iomap.h b/arch/arm/mach-msm/include/mach/msm_iomap.h
index c56e81ffdcde..0e4f49157684 100644
--- a/arch/arm/mach-msm/include/mach/msm_iomap.h
+++ b/arch/arm/mach-msm/include/mach/msm_iomap.h
@@ -45,25 +45,8 @@
45#include "msm_iomap-7x00.h" 45#include "msm_iomap-7x00.h"
46#endif 46#endif
47 47
48#include "msm_iomap-8x60.h"
49#include "msm_iomap-8960.h"
50
51#define MSM_DEBUG_UART_SIZE SZ_4K
52#if defined(CONFIG_DEBUG_MSM_UART1)
53#define MSM_DEBUG_UART_BASE 0xE1000000
54#define MSM_DEBUG_UART_PHYS MSM_UART1_PHYS
55#elif defined(CONFIG_DEBUG_MSM_UART2)
56#define MSM_DEBUG_UART_BASE 0xE1000000
57#define MSM_DEBUG_UART_PHYS MSM_UART2_PHYS
58#elif defined(CONFIG_DEBUG_MSM_UART3)
59#define MSM_DEBUG_UART_BASE 0xE1000000
60#define MSM_DEBUG_UART_PHYS MSM_UART3_PHYS
61#endif
62
63/* Virtual addresses shared across all MSM targets. */ 48/* Virtual addresses shared across all MSM targets. */
64#define MSM_CSR_BASE IOMEM(0xE0001000) 49#define MSM_CSR_BASE IOMEM(0xE0001000)
65#define MSM_TMR_BASE IOMEM(0xF0200000)
66#define MSM_TMR0_BASE IOMEM(0xF0201000)
67#define MSM_GPIO1_BASE IOMEM(0xE0003000) 50#define MSM_GPIO1_BASE IOMEM(0xE0003000)
68#define MSM_GPIO2_BASE IOMEM(0xE0004000) 51#define MSM_GPIO2_BASE IOMEM(0xE0004000)
69 52
diff --git a/arch/arm/mach-msm/include/mach/uncompress.h b/arch/arm/mach-msm/include/mach/uncompress.h
deleted file mode 100644
index 94324870fb04..000000000000
--- a/arch/arm/mach-msm/include/mach/uncompress.h
+++ /dev/null
@@ -1,63 +0,0 @@
1/*
2 * Copyright (C) 2007 Google, Inc.
3 * Copyright (c) 2011, Code Aurora Forum. All rights reserved.
4 *
5 * This software is licensed under the terms of the GNU General Public
6 * License version 2, as published by the Free Software Foundation, and
7 * may be copied, distributed, and modified under those terms.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 */
15
16#ifndef __ASM_ARCH_MSM_UNCOMPRESS_H
17#define __ASM_ARCH_MSM_UNCOMPRESS_H
18
19#include <asm/barrier.h>
20#include <asm/processor.h>
21#include <mach/msm_iomap.h>
22
23#define UART_CSR (*(volatile uint32_t *)(MSM_DEBUG_UART_PHYS + 0x08))
24#define UART_TF (*(volatile uint32_t *)(MSM_DEBUG_UART_PHYS + 0x0c))
25
26#define UART_DM_SR (*((volatile uint32_t *)(MSM_DEBUG_UART_PHYS + 0x08)))
27#define UART_DM_CR (*((volatile uint32_t *)(MSM_DEBUG_UART_PHYS + 0x10)))
28#define UART_DM_ISR (*((volatile uint32_t *)(MSM_DEBUG_UART_PHYS + 0x14)))
29#define UART_DM_NCHAR (*((volatile uint32_t *)(MSM_DEBUG_UART_PHYS + 0x40)))
30#define UART_DM_TF (*((volatile uint32_t *)(MSM_DEBUG_UART_PHYS + 0x70)))
31
32static void putc(int c)
33{
34#if defined(MSM_DEBUG_UART_PHYS)
35#ifdef CONFIG_MSM_HAS_DEBUG_UART_HS
36 /*
37 * Wait for TX_READY to be set; but skip it if we have a
38 * TX underrun.
39 */
40 if (!(UART_DM_SR & 0x08))
41 while (!(UART_DM_ISR & 0x80))
42 cpu_relax();
43
44 UART_DM_CR = 0x300;
45 UART_DM_NCHAR = 0x1;
46 UART_DM_TF = c;
47#else
48 while (!(UART_CSR & 0x04))
49 cpu_relax();
50 UART_TF = c;
51#endif
52#endif
53}
54
55static inline void flush(void)
56{
57}
58
59static inline void arch_decomp_setup(void)
60{
61}
62
63#endif
diff --git a/arch/arm/mach-msm/io.c b/arch/arm/mach-msm/io.c
index 3dc04ccaf59f..adc8971c7266 100644
--- a/arch/arm/mach-msm/io.c
+++ b/arch/arm/mach-msm/io.c
@@ -18,6 +18,7 @@
18 */ 18 */
19 19
20#include <linux/kernel.h> 20#include <linux/kernel.h>
21#include <linux/bug.h>
21#include <linux/init.h> 22#include <linux/init.h>
22#include <linux/io.h> 23#include <linux/io.h>
23#include <linux/export.h> 24#include <linux/export.h>
@@ -27,8 +28,6 @@
27#include <mach/msm_iomap.h> 28#include <mach/msm_iomap.h>
28#include <asm/mach/map.h> 29#include <asm/mach/map.h>
29 30
30#include <mach/board.h>
31
32#include "common.h" 31#include "common.h"
33 32
34#define MSM_CHIP_DEVICE_TYPE(name, chip, mem_type) { \ 33#define MSM_CHIP_DEVICE_TYPE(name, chip, mem_type) { \
@@ -52,26 +51,38 @@ static struct map_desc msm_io_desc[] __initdata = {
52 MSM_CHIP_DEVICE_TYPE(GPIO1, MSM7X00, MT_DEVICE_NONSHARED), 51 MSM_CHIP_DEVICE_TYPE(GPIO1, MSM7X00, MT_DEVICE_NONSHARED),
53 MSM_CHIP_DEVICE_TYPE(GPIO2, MSM7X00, MT_DEVICE_NONSHARED), 52 MSM_CHIP_DEVICE_TYPE(GPIO2, MSM7X00, MT_DEVICE_NONSHARED),
54 MSM_DEVICE_TYPE(CLK_CTL, MT_DEVICE_NONSHARED), 53 MSM_DEVICE_TYPE(CLK_CTL, MT_DEVICE_NONSHARED),
55#if defined(CONFIG_DEBUG_MSM_UART1) || defined(CONFIG_DEBUG_MSM_UART2) || \
56 defined(CONFIG_DEBUG_MSM_UART3)
57 MSM_DEVICE_TYPE(DEBUG_UART, MT_DEVICE_NONSHARED),
58#endif
59 { 54 {
60 .virtual = (unsigned long) MSM_SHARED_RAM_BASE, 55 .virtual = (unsigned long) MSM_SHARED_RAM_BASE,
61 .pfn = __phys_to_pfn(MSM_SHARED_RAM_PHYS), 56 .pfn = __phys_to_pfn(MSM_SHARED_RAM_PHYS),
62 .length = MSM_SHARED_RAM_SIZE, 57 .length = MSM_SHARED_RAM_SIZE,
63 .type = MT_DEVICE, 58 .type = MT_DEVICE,
64 }, 59 },
60#if defined(CONFIG_DEBUG_MSM_UART1) || defined(CONFIG_DEBUG_MSM_UART2) || \
61 defined(CONFIG_DEBUG_MSM_UART3)
62 {
63 /* Must be last: virtual and pfn filled in by debug_ll_addr() */
64 .length = SZ_4K,
65 .type = MT_DEVICE_NONSHARED,
66 }
67#endif
65}; 68};
66 69
67void __init msm_map_common_io(void) 70void __init msm_map_common_io(void)
68{ 71{
72 size_t size = ARRAY_SIZE(msm_io_desc);
73
69 /* Make sure the peripheral register window is closed, since 74 /* Make sure the peripheral register window is closed, since
70 * we will use PTE flags (TEX[1]=1,B=0,C=1) to determine which 75 * we will use PTE flags (TEX[1]=1,B=0,C=1) to determine which
71 * pages are peripheral interface or not. 76 * pages are peripheral interface or not.
72 */ 77 */
73 asm("mcr p15, 0, %0, c15, c2, 4" : : "r" (0)); 78 asm("mcr p15, 0, %0, c15, c2, 4" : : "r" (0));
74 iotable_init(msm_io_desc, ARRAY_SIZE(msm_io_desc)); 79#if defined(CONFIG_DEBUG_MSM_UART1) || defined(CONFIG_DEBUG_MSM_UART2) || \
80 defined(CONFIG_DEBUG_MSM_UART3)
81 debug_ll_addr(&msm_io_desc[size - 1].pfn,
82 &msm_io_desc[size - 1].virtual);
83 msm_io_desc[size - 1].pfn = __phys_to_pfn(msm_io_desc[size - 1].pfn);
84#endif
85 iotable_init(msm_io_desc, size);
75} 86}
76#endif 87#endif
77 88
@@ -87,10 +98,6 @@ static struct map_desc qsd8x50_io_desc[] __initdata = {
87 MSM_DEVICE(SCPLL), 98 MSM_DEVICE(SCPLL),
88 MSM_DEVICE(AD5), 99 MSM_DEVICE(AD5),
89 MSM_DEVICE(MDC), 100 MSM_DEVICE(MDC),
90#if defined(CONFIG_DEBUG_MSM_UART1) || defined(CONFIG_DEBUG_MSM_UART2) || \
91 defined(CONFIG_DEBUG_MSM_UART3)
92 MSM_DEVICE(DEBUG_UART),
93#endif
94 { 101 {
95 .virtual = (unsigned long) MSM_SHARED_RAM_BASE, 102 .virtual = (unsigned long) MSM_SHARED_RAM_BASE,
96 .pfn = __phys_to_pfn(MSM_SHARED_RAM_PHYS), 103 .pfn = __phys_to_pfn(MSM_SHARED_RAM_PHYS),
@@ -101,40 +108,11 @@ static struct map_desc qsd8x50_io_desc[] __initdata = {
101 108
102void __init msm_map_qsd8x50_io(void) 109void __init msm_map_qsd8x50_io(void)
103{ 110{
111 debug_ll_io_init();
104 iotable_init(qsd8x50_io_desc, ARRAY_SIZE(qsd8x50_io_desc)); 112 iotable_init(qsd8x50_io_desc, ARRAY_SIZE(qsd8x50_io_desc));
105} 113}
106#endif /* CONFIG_ARCH_QSD8X50 */ 114#endif /* CONFIG_ARCH_QSD8X50 */
107 115
108#ifdef CONFIG_ARCH_MSM8X60
109static struct map_desc msm8x60_io_desc[] __initdata = {
110 MSM_CHIP_DEVICE(TMR, MSM8X60),
111 MSM_CHIP_DEVICE(TMR0, MSM8X60),
112#ifdef CONFIG_DEBUG_MSM8660_UART
113 MSM_DEVICE(DEBUG_UART),
114#endif
115};
116
117void __init msm_map_msm8x60_io(void)
118{
119 iotable_init(msm8x60_io_desc, ARRAY_SIZE(msm8x60_io_desc));
120}
121#endif /* CONFIG_ARCH_MSM8X60 */
122
123#ifdef CONFIG_ARCH_MSM8960
124static struct map_desc msm8960_io_desc[] __initdata = {
125 MSM_CHIP_DEVICE(TMR, MSM8960),
126 MSM_CHIP_DEVICE(TMR0, MSM8960),
127#ifdef CONFIG_DEBUG_MSM8960_UART
128 MSM_DEVICE(DEBUG_UART),
129#endif
130};
131
132void __init msm_map_msm8960_io(void)
133{
134 iotable_init(msm8960_io_desc, ARRAY_SIZE(msm8960_io_desc));
135}
136#endif /* CONFIG_ARCH_MSM8960 */
137
138#ifdef CONFIG_ARCH_MSM7X30 116#ifdef CONFIG_ARCH_MSM7X30
139static struct map_desc msm7x30_io_desc[] __initdata = { 117static struct map_desc msm7x30_io_desc[] __initdata = {
140 MSM_DEVICE(VIC), 118 MSM_DEVICE(VIC),
@@ -150,10 +128,6 @@ static struct map_desc msm7x30_io_desc[] __initdata = {
150 MSM_DEVICE(SAW), 128 MSM_DEVICE(SAW),
151 MSM_DEVICE(GCC), 129 MSM_DEVICE(GCC),
152 MSM_DEVICE(TCSR), 130 MSM_DEVICE(TCSR),
153#if defined(CONFIG_DEBUG_MSM_UART1) || defined(CONFIG_DEBUG_MSM_UART2) || \
154 defined(CONFIG_DEBUG_MSM_UART3)
155 MSM_DEVICE(DEBUG_UART),
156#endif
157 { 131 {
158 .virtual = (unsigned long) MSM_SHARED_RAM_BASE, 132 .virtual = (unsigned long) MSM_SHARED_RAM_BASE,
159 .pfn = __phys_to_pfn(MSM_SHARED_RAM_PHYS), 133 .pfn = __phys_to_pfn(MSM_SHARED_RAM_PHYS),
@@ -164,10 +138,12 @@ static struct map_desc msm7x30_io_desc[] __initdata = {
164 138
165void __init msm_map_msm7x30_io(void) 139void __init msm_map_msm7x30_io(void)
166{ 140{
141 debug_ll_io_init();
167 iotable_init(msm7x30_io_desc, ARRAY_SIZE(msm7x30_io_desc)); 142 iotable_init(msm7x30_io_desc, ARRAY_SIZE(msm7x30_io_desc));
168} 143}
169#endif /* CONFIG_ARCH_MSM7X30 */ 144#endif /* CONFIG_ARCH_MSM7X30 */
170 145
146#ifdef CONFIG_ARCH_MSM7X00A
171void __iomem *__msm_ioremap_caller(phys_addr_t phys_addr, size_t size, 147void __iomem *__msm_ioremap_caller(phys_addr_t phys_addr, size_t size,
172 unsigned int mtype, void *caller) 148 unsigned int mtype, void *caller)
173{ 149{
@@ -182,3 +158,4 @@ void __iomem *__msm_ioremap_caller(phys_addr_t phys_addr, size_t size,
182 158
183 return __arm_ioremap_caller(phys_addr, size, mtype, caller); 159 return __arm_ioremap_caller(phys_addr, size, mtype, caller);
184} 160}
161#endif
diff --git a/arch/arm/mach-msm/timer.c b/arch/arm/mach-msm/timer.c
index 8697cfc0d0b6..696fb73296d0 100644
--- a/arch/arm/mach-msm/timer.c
+++ b/arch/arm/mach-msm/timer.c
@@ -16,6 +16,7 @@
16 16
17#include <linux/clocksource.h> 17#include <linux/clocksource.h>
18#include <linux/clockchips.h> 18#include <linux/clockchips.h>
19#include <linux/cpu.h>
19#include <linux/init.h> 20#include <linux/init.h>
20#include <linux/interrupt.h> 21#include <linux/interrupt.h>
21#include <linux/irq.h> 22#include <linux/irq.h>
@@ -26,7 +27,6 @@
26#include <linux/sched_clock.h> 27#include <linux/sched_clock.h>
27 28
28#include <asm/mach/time.h> 29#include <asm/mach/time.h>
29#include <asm/localtimer.h>
30 30
31#include "common.h" 31#include "common.h"
32 32
@@ -49,7 +49,7 @@ static void __iomem *sts_base;
49 49
50static irqreturn_t msm_timer_interrupt(int irq, void *dev_id) 50static irqreturn_t msm_timer_interrupt(int irq, void *dev_id)
51{ 51{
52 struct clock_event_device *evt = *(struct clock_event_device **)dev_id; 52 struct clock_event_device *evt = dev_id;
53 /* Stop the timer tick */ 53 /* Stop the timer tick */
54 if (evt->mode == CLOCK_EVT_MODE_ONESHOT) { 54 if (evt->mode == CLOCK_EVT_MODE_ONESHOT) {
55 u32 ctrl = readl_relaxed(event_base + TIMER_ENABLE); 55 u32 ctrl = readl_relaxed(event_base + TIMER_ENABLE);
@@ -101,18 +101,7 @@ static void msm_timer_set_mode(enum clock_event_mode mode,
101 writel_relaxed(ctrl, event_base + TIMER_ENABLE); 101 writel_relaxed(ctrl, event_base + TIMER_ENABLE);
102} 102}
103 103
104static struct clock_event_device msm_clockevent = { 104static struct clock_event_device __percpu *msm_evt;
105 .name = "gp_timer",
106 .features = CLOCK_EVT_FEAT_ONESHOT,
107 .rating = 200,
108 .set_next_event = msm_timer_set_next_event,
109 .set_mode = msm_timer_set_mode,
110};
111
112static union {
113 struct clock_event_device *evt;
114 struct clock_event_device * __percpu *percpu_evt;
115} msm_evt;
116 105
117static void __iomem *source_base; 106static void __iomem *source_base;
118 107
@@ -138,23 +127,34 @@ static struct clocksource msm_clocksource = {
138 .flags = CLOCK_SOURCE_IS_CONTINUOUS, 127 .flags = CLOCK_SOURCE_IS_CONTINUOUS,
139}; 128};
140 129
141#ifdef CONFIG_LOCAL_TIMERS 130static int msm_timer_irq;
131static int msm_timer_has_ppi;
132
142static int msm_local_timer_setup(struct clock_event_device *evt) 133static int msm_local_timer_setup(struct clock_event_device *evt)
143{ 134{
144 /* Use existing clock_event for cpu 0 */ 135 int cpu = smp_processor_id();
145 if (!smp_processor_id()) 136 int err;
146 return 0; 137
147 138 evt->irq = msm_timer_irq;
148 evt->irq = msm_clockevent.irq; 139 evt->name = "msm_timer";
149 evt->name = "local_timer"; 140 evt->features = CLOCK_EVT_FEAT_ONESHOT;
150 evt->features = msm_clockevent.features; 141 evt->rating = 200;
151 evt->rating = msm_clockevent.rating;
152 evt->set_mode = msm_timer_set_mode; 142 evt->set_mode = msm_timer_set_mode;
153 evt->set_next_event = msm_timer_set_next_event; 143 evt->set_next_event = msm_timer_set_next_event;
144 evt->cpumask = cpumask_of(cpu);
145
146 clockevents_config_and_register(evt, GPT_HZ, 4, 0xffffffff);
147
148 if (msm_timer_has_ppi) {
149 enable_percpu_irq(evt->irq, IRQ_TYPE_EDGE_RISING);
150 } else {
151 err = request_irq(evt->irq, msm_timer_interrupt,
152 IRQF_TIMER | IRQF_NOBALANCING |
153 IRQF_TRIGGER_RISING, "gp_timer", evt);
154 if (err)
155 pr_err("request_irq failed\n");
156 }
154 157
155 *__this_cpu_ptr(msm_evt.percpu_evt) = evt;
156 clockevents_config_and_register(evt, GPT_HZ, 4, 0xf0000000);
157 enable_percpu_irq(evt->irq, IRQ_TYPE_EDGE_RISING);
158 return 0; 158 return 0;
159} 159}
160 160
@@ -164,11 +164,28 @@ static void msm_local_timer_stop(struct clock_event_device *evt)
164 disable_percpu_irq(evt->irq); 164 disable_percpu_irq(evt->irq);
165} 165}
166 166
167static struct local_timer_ops msm_local_timer_ops = { 167static int msm_timer_cpu_notify(struct notifier_block *self,
168 .setup = msm_local_timer_setup, 168 unsigned long action, void *hcpu)
169 .stop = msm_local_timer_stop, 169{
170 /*
171 * Grab cpu pointer in each case to avoid spurious
172 * preemptible warnings
173 */
174 switch (action & ~CPU_TASKS_FROZEN) {
175 case CPU_STARTING:
176 msm_local_timer_setup(this_cpu_ptr(msm_evt));
177 break;
178 case CPU_DYING:
179 msm_local_timer_stop(this_cpu_ptr(msm_evt));
180 break;
181 }
182
183 return NOTIFY_OK;
184}
185
186static struct notifier_block msm_timer_cpu_nb = {
187 .notifier_call = msm_timer_cpu_notify,
170}; 188};
171#endif /* CONFIG_LOCAL_TIMERS */
172 189
173static notrace u32 msm_sched_clock_read(void) 190static notrace u32 msm_sched_clock_read(void)
174{ 191{
@@ -178,38 +195,35 @@ static notrace u32 msm_sched_clock_read(void)
178static void __init msm_timer_init(u32 dgt_hz, int sched_bits, int irq, 195static void __init msm_timer_init(u32 dgt_hz, int sched_bits, int irq,
179 bool percpu) 196 bool percpu)
180{ 197{
181 struct clock_event_device *ce = &msm_clockevent;
182 struct clocksource *cs = &msm_clocksource; 198 struct clocksource *cs = &msm_clocksource;
183 int res; 199 int res = 0;
200
201 msm_timer_irq = irq;
202 msm_timer_has_ppi = percpu;
203
204 msm_evt = alloc_percpu(struct clock_event_device);
205 if (!msm_evt) {
206 pr_err("memory allocation failed for clockevents\n");
207 goto err;
208 }
184 209
185 ce->cpumask = cpumask_of(0); 210 if (percpu)
186 ce->irq = irq; 211 res = request_percpu_irq(irq, msm_timer_interrupt,
212 "gp_timer", msm_evt);
187 213
188 clockevents_config_and_register(ce, GPT_HZ, 4, 0xffffffff); 214 if (res) {
189 if (percpu) { 215 pr_err("request_percpu_irq failed\n");
190 msm_evt.percpu_evt = alloc_percpu(struct clock_event_device *); 216 } else {
191 if (!msm_evt.percpu_evt) { 217 res = register_cpu_notifier(&msm_timer_cpu_nb);
192 pr_err("memory allocation failed for %s\n", ce->name); 218 if (res) {
219 free_percpu_irq(irq, msm_evt);
193 goto err; 220 goto err;
194 } 221 }
195 *__this_cpu_ptr(msm_evt.percpu_evt) = ce; 222
196 res = request_percpu_irq(ce->irq, msm_timer_interrupt, 223 /* Immediately configure the timer on the boot CPU */
197 ce->name, msm_evt.percpu_evt); 224 msm_local_timer_setup(__this_cpu_ptr(msm_evt));
198 if (!res) {
199 enable_percpu_irq(ce->irq, IRQ_TYPE_EDGE_RISING);
200#ifdef CONFIG_LOCAL_TIMERS
201 local_timer_register(&msm_local_timer_ops);
202#endif
203 }
204 } else {
205 msm_evt.evt = ce;
206 res = request_irq(ce->irq, msm_timer_interrupt,
207 IRQF_TIMER | IRQF_NOBALANCING |
208 IRQF_TRIGGER_RISING, ce->name, &msm_evt.evt);
209 } 225 }
210 226
211 if (res)
212 pr_err("request_irq failed for %s\n", ce->name);
213err: 227err:
214 writel_relaxed(TIMER_ENABLE_EN, source_base + TIMER_ENABLE); 228 writel_relaxed(TIMER_ENABLE_EN, source_base + TIMER_ENABLE);
215 res = clocksource_register_hz(cs, dgt_hz); 229 res = clocksource_register_hz(cs, dgt_hz);
@@ -219,15 +233,8 @@ err:
219} 233}
220 234
221#ifdef CONFIG_OF 235#ifdef CONFIG_OF
222static const struct of_device_id msm_timer_match[] __initconst = { 236static void __init msm_dt_timer_init(struct device_node *np)
223 { .compatible = "qcom,kpss-timer" },
224 { .compatible = "qcom,scss-timer" },
225 { },
226};
227
228void __init msm_dt_timer_init(void)
229{ 237{
230 struct device_node *np;
231 u32 freq; 238 u32 freq;
232 int irq; 239 int irq;
233 struct resource res; 240 struct resource res;
@@ -235,12 +242,6 @@ void __init msm_dt_timer_init(void)
235 void __iomem *base; 242 void __iomem *base;
236 void __iomem *cpu0_base; 243 void __iomem *cpu0_base;
237 244
238 np = of_find_matching_node(NULL, msm_timer_match);
239 if (!np) {
240 pr_err("Can't find msm timer DT node\n");
241 return;
242 }
243
244 base = of_iomap(np, 0); 245 base = of_iomap(np, 0);
245 if (!base) { 246 if (!base) {
246 pr_err("Failed to map event base\n"); 247 pr_err("Failed to map event base\n");
@@ -283,6 +284,8 @@ void __init msm_dt_timer_init(void)
283 284
284 msm_timer_init(freq, 32, irq, !!percpu_offset); 285 msm_timer_init(freq, 32, irq, !!percpu_offset);
285} 286}
287CLOCKSOURCE_OF_DECLARE(kpss_timer, "qcom,kpss-timer", msm_dt_timer_init);
288CLOCKSOURCE_OF_DECLARE(scss_timer, "qcom,scss-timer", msm_dt_timer_init);
286#endif 289#endif
287 290
288static int __init msm_timer_map(phys_addr_t addr, u32 event, u32 source, 291static int __init msm_timer_map(phys_addr_t addr, u32 event, u32 source,
diff --git a/arch/arm/mach-mv78xx0/include/mach/debug-macro.S b/arch/arm/mach-mv78xx0/include/mach/debug-macro.S
deleted file mode 100644
index a7df02b049b7..000000000000
--- a/arch/arm/mach-mv78xx0/include/mach/debug-macro.S
+++ /dev/null
@@ -1,19 +0,0 @@
1/*
2 * arch/arm/mach-mv78xx0/include/mach/debug-macro.S
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7*/
8
9#include <mach/mv78xx0.h>
10
11 .macro addruart, rp, rv, tmp
12 ldr \rp, =MV78XX0_REGS_PHYS_BASE
13 ldr \rv, =MV78XX0_REGS_VIRT_BASE
14 orr \rp, \rp, #0x00012000
15 orr \rv, \rv, #0x00012000
16 .endm
17
18#define UART_SHIFT 2
19#include <asm/hardware/debug-8250.S>
diff --git a/arch/arm/mach-mv78xx0/pcie.c b/arch/arm/mach-mv78xx0/pcie.c
index dc26a654c496..445e553f4a28 100644
--- a/arch/arm/mach-mv78xx0/pcie.c
+++ b/arch/arm/mach-mv78xx0/pcie.c
@@ -18,6 +18,11 @@
18#include <mach/mv78xx0.h> 18#include <mach/mv78xx0.h>
19#include "common.h" 19#include "common.h"
20 20
21#define MV78XX0_MBUS_PCIE_MEM_TARGET(port, lane) ((port) ? 8 : 4)
22#define MV78XX0_MBUS_PCIE_MEM_ATTR(port, lane) (0xf8 & ~(0x10 << (lane)))
23#define MV78XX0_MBUS_PCIE_IO_TARGET(port, lane) ((port) ? 8 : 4)
24#define MV78XX0_MBUS_PCIE_IO_ATTR(port, lane) (0xf0 & ~(0x10 << (lane)))
25
21struct pcie_port { 26struct pcie_port {
22 u8 maj; 27 u8 maj;
23 u8 min; 28 u8 min;
@@ -71,7 +76,6 @@ static void __init mv78xx0_pcie_preinit(void)
71 start = MV78XX0_PCIE_MEM_PHYS_BASE; 76 start = MV78XX0_PCIE_MEM_PHYS_BASE;
72 for (i = 0; i < num_pcie_ports; i++) { 77 for (i = 0; i < num_pcie_ports; i++) {
73 struct pcie_port *pp = pcie_port + i; 78 struct pcie_port *pp = pcie_port + i;
74 char winname[MVEBU_MBUS_MAX_WINNAME_SZ];
75 79
76 snprintf(pp->mem_space_name, sizeof(pp->mem_space_name), 80 snprintf(pp->mem_space_name, sizeof(pp->mem_space_name),
77 "PCIe %d.%d MEM", pp->maj, pp->min); 81 "PCIe %d.%d MEM", pp->maj, pp->min);
@@ -85,17 +89,12 @@ static void __init mv78xx0_pcie_preinit(void)
85 if (request_resource(&iomem_resource, &pp->res)) 89 if (request_resource(&iomem_resource, &pp->res))
86 panic("can't allocate PCIe MEM sub-space"); 90 panic("can't allocate PCIe MEM sub-space");
87 91
88 snprintf(winname, sizeof(winname), "pcie%d.%d", 92 mvebu_mbus_add_window_by_id(MV78XX0_MBUS_PCIE_MEM_TARGET(pp->maj, pp->min),
89 pp->maj, pp->min); 93 MV78XX0_MBUS_PCIE_MEM_ATTR(pp->maj, pp->min),
90 94 pp->res.start, resource_size(&pp->res));
91 mvebu_mbus_add_window_remap_flags(winname, 95 mvebu_mbus_add_window_remap_by_id(MV78XX0_MBUS_PCIE_IO_TARGET(pp->maj, pp->min),
92 pp->res.start, 96 MV78XX0_MBUS_PCIE_IO_ATTR(pp->maj, pp->min),
93 resource_size(&pp->res), 97 i * SZ_64K, SZ_64K, 0);
94 MVEBU_MBUS_NO_REMAP,
95 MVEBU_MBUS_PCI_MEM);
96 mvebu_mbus_add_window_remap_flags(winname,
97 i * SZ_64K, SZ_64K,
98 0, MVEBU_MBUS_PCI_IO);
99 } 98 }
100} 99}
101 100
diff --git a/arch/arm/mach-mvebu/armada-370-xp.c b/arch/arm/mach-mvebu/armada-370-xp.c
index 97cbb8021919..e2acff98e750 100644
--- a/arch/arm/mach-mvebu/armada-370-xp.c
+++ b/arch/arm/mach-mvebu/armada-370-xp.c
@@ -18,7 +18,7 @@
18#include <linux/of_address.h> 18#include <linux/of_address.h>
19#include <linux/of_platform.h> 19#include <linux/of_platform.h>
20#include <linux/io.h> 20#include <linux/io.h>
21#include <linux/time-armada-370-xp.h> 21#include <linux/clocksource.h>
22#include <linux/dma-mapping.h> 22#include <linux/dma-mapping.h>
23#include <linux/mbus.h> 23#include <linux/mbus.h>
24#include <asm/hardware/cache-l2x0.h> 24#include <asm/hardware/cache-l2x0.h>
@@ -34,44 +34,12 @@ static void __init armada_370_xp_map_io(void)
34 debug_ll_io_init(); 34 debug_ll_io_init();
35} 35}
36 36
37/*
38 * This initialization will be replaced by a DT-based
39 * initialization once the mvebu-mbus driver gains DT support.
40 */
41
42#define ARMADA_370_XP_MBUS_WINS_OFFS 0x20000
43#define ARMADA_370_XP_MBUS_WINS_SIZE 0x100
44#define ARMADA_370_XP_SDRAM_WINS_OFFS 0x20180
45#define ARMADA_370_XP_SDRAM_WINS_SIZE 0x20
46
47static void __init armada_370_xp_mbus_init(void)
48{
49 char *mbus_soc_name;
50 struct device_node *dn;
51 const __be32 mbus_wins_offs = cpu_to_be32(ARMADA_370_XP_MBUS_WINS_OFFS);
52 const __be32 sdram_wins_offs = cpu_to_be32(ARMADA_370_XP_SDRAM_WINS_OFFS);
53
54 if (of_machine_is_compatible("marvell,armada370"))
55 mbus_soc_name = "marvell,armada370-mbus";
56 else
57 mbus_soc_name = "marvell,armadaxp-mbus";
58
59 dn = of_find_node_by_name(NULL, "internal-regs");
60 BUG_ON(!dn);
61
62 mvebu_mbus_init(mbus_soc_name,
63 of_translate_address(dn, &mbus_wins_offs),
64 ARMADA_370_XP_MBUS_WINS_SIZE,
65 of_translate_address(dn, &sdram_wins_offs),
66 ARMADA_370_XP_SDRAM_WINS_SIZE);
67}
68
69static void __init armada_370_xp_timer_and_clk_init(void) 37static void __init armada_370_xp_timer_and_clk_init(void)
70{ 38{
71 of_clk_init(NULL); 39 of_clk_init(NULL);
72 armada_370_xp_timer_init(); 40 clocksource_of_init();
73 coherency_init(); 41 coherency_init();
74 armada_370_xp_mbus_init(); 42 BUG_ON(mvebu_mbus_dt_init());
75#ifdef CONFIG_CACHE_L2X0 43#ifdef CONFIG_CACHE_L2X0
76 l2x0_of_init(0, ~0UL); 44 l2x0_of_init(0, ~0UL);
77#endif 45#endif
diff --git a/arch/arm/mach-mvebu/platsmp.c b/arch/arm/mach-mvebu/platsmp.c
index ce81d3031405..ff69c2df298b 100644
--- a/arch/arm/mach-mvebu/platsmp.c
+++ b/arch/arm/mach-mvebu/platsmp.c
@@ -21,6 +21,7 @@
21#include <linux/smp.h> 21#include <linux/smp.h>
22#include <linux/clk.h> 22#include <linux/clk.h>
23#include <linux/of.h> 23#include <linux/of.h>
24#include <linux/of_address.h>
24#include <linux/mbus.h> 25#include <linux/mbus.h>
25#include <asm/cacheflush.h> 26#include <asm/cacheflush.h>
26#include <asm/smp_plat.h> 27#include <asm/smp_plat.h>
@@ -29,45 +30,43 @@
29#include "pmsu.h" 30#include "pmsu.h"
30#include "coherency.h" 31#include "coherency.h"
31 32
33#define AXP_BOOTROM_BASE 0xfff00000
34#define AXP_BOOTROM_SIZE 0x100000
35
36static struct clk *__init get_cpu_clk(int cpu)
37{
38 struct clk *cpu_clk;
39 struct device_node *np = of_get_cpu_node(cpu, NULL);
40
41 if (WARN(!np, "missing cpu node\n"))
42 return NULL;
43 cpu_clk = of_clk_get(np, 0);
44 if (WARN_ON(IS_ERR(cpu_clk)))
45 return NULL;
46 return cpu_clk;
47}
48
32void __init set_secondary_cpus_clock(void) 49void __init set_secondary_cpus_clock(void)
33{ 50{
34 int thiscpu; 51 int thiscpu, cpu;
35 unsigned long rate; 52 unsigned long rate;
36 struct clk *cpu_clk = NULL; 53 struct clk *cpu_clk;
37 struct device_node *np = NULL;
38 54
39 thiscpu = smp_processor_id(); 55 thiscpu = smp_processor_id();
40 for_each_node_by_type(np, "cpu") { 56 cpu_clk = get_cpu_clk(thiscpu);
41 int err; 57 if (!cpu_clk)
42 int cpu;
43
44 err = of_property_read_u32(np, "reg", &cpu);
45 if (WARN_ON(err))
46 return;
47
48 if (cpu == thiscpu) {
49 cpu_clk = of_clk_get(np, 0);
50 break;
51 }
52 }
53 if (WARN_ON(IS_ERR(cpu_clk)))
54 return; 58 return;
55 clk_prepare_enable(cpu_clk); 59 clk_prepare_enable(cpu_clk);
56 rate = clk_get_rate(cpu_clk); 60 rate = clk_get_rate(cpu_clk);
57 61
58 /* set all the other CPU clk to the same rate than the boot CPU */ 62 /* set all the other CPU clk to the same rate than the boot CPU */
59 for_each_node_by_type(np, "cpu") { 63 for_each_possible_cpu(cpu) {
60 int err; 64 if (cpu == thiscpu)
61 int cpu; 65 continue;
62 66 cpu_clk = get_cpu_clk(cpu);
63 err = of_property_read_u32(np, "reg", &cpu); 67 if (!cpu_clk)
64 if (WARN_ON(err))
65 return; 68 return;
66 69 clk_set_rate(cpu_clk, rate);
67 if (cpu != thiscpu) {
68 cpu_clk = of_clk_get(np, 0);
69 clk_set_rate(cpu_clk, rate);
70 }
71 } 70 }
72} 71}
73 72
@@ -87,37 +86,39 @@ static int armada_xp_boot_secondary(unsigned int cpu, struct task_struct *idle)
87 86
88static void __init armada_xp_smp_init_cpus(void) 87static void __init armada_xp_smp_init_cpus(void)
89{ 88{
90 struct device_node *np; 89 unsigned int ncores = num_possible_cpus();
91 unsigned int i, ncores;
92 90
93 np = of_find_node_by_name(NULL, "cpus");
94 if (!np)
95 panic("No 'cpus' node found\n");
96
97 ncores = of_get_child_count(np);
98 if (ncores == 0 || ncores > ARMADA_XP_MAX_CPUS) 91 if (ncores == 0 || ncores > ARMADA_XP_MAX_CPUS)
99 panic("Invalid number of CPUs in DT\n"); 92 panic("Invalid number of CPUs in DT\n");
100 93
101 /* Limit possible CPUs to defconfig */
102 if (ncores > nr_cpu_ids) {
103 pr_warn("SMP: %d CPUs physically present. Only %d configured.",
104 ncores, nr_cpu_ids);
105 pr_warn("Clipping CPU count to %d\n", nr_cpu_ids);
106 ncores = nr_cpu_ids;
107 }
108
109 for (i = 0; i < ncores; i++)
110 set_cpu_possible(i, true);
111
112 set_smp_cross_call(armada_mpic_send_doorbell); 94 set_smp_cross_call(armada_mpic_send_doorbell);
113} 95}
114 96
115void __init armada_xp_smp_prepare_cpus(unsigned int max_cpus) 97void __init armada_xp_smp_prepare_cpus(unsigned int max_cpus)
116{ 98{
99 struct device_node *node;
100 struct resource res;
101 int err;
102
117 set_secondary_cpus_clock(); 103 set_secondary_cpus_clock();
118 flush_cache_all(); 104 flush_cache_all();
119 set_cpu_coherent(cpu_logical_map(smp_processor_id()), 0); 105 set_cpu_coherent(cpu_logical_map(smp_processor_id()), 0);
120 mvebu_mbus_add_window("bootrom", 0xfff00000, SZ_1M); 106
107 /*
108 * In order to boot the secondary CPUs we need to ensure
109 * the bootROM is mapped at the correct address.
110 */
111 node = of_find_compatible_node(NULL, NULL, "marvell,bootrom");
112 if (!node)
113 panic("Cannot find 'marvell,bootrom' compatible node");
114
115 err = of_address_to_resource(node, 0, &res);
116 if (err < 0)
117 panic("Cannot get 'bootrom' node address");
118
119 if (res.start != AXP_BOOTROM_BASE ||
120 resource_size(&res) != AXP_BOOTROM_SIZE)
121 panic("The address for the BootROM is incorrect");
121} 122}
122 123
123struct smp_operations armada_xp_smp_ops __initdata = { 124struct smp_operations armada_xp_smp_ops __initdata = {
diff --git a/arch/arm/mach-mxs/mach-mxs.c b/arch/arm/mach-mxs/mach-mxs.c
index 4ce27b536dc9..98f6e2adb53e 100644
--- a/arch/arm/mach-mxs/mach-mxs.c
+++ b/arch/arm/mach-mxs/mach-mxs.c
@@ -14,6 +14,7 @@
14#include <linux/clk/mxs.h> 14#include <linux/clk/mxs.h>
15#include <linux/clkdev.h> 15#include <linux/clkdev.h>
16#include <linux/clocksource.h> 16#include <linux/clocksource.h>
17#include <linux/clk-provider.h>
17#include <linux/delay.h> 18#include <linux/delay.h>
18#include <linux/err.h> 19#include <linux/err.h>
19#include <linux/gpio.h> 20#include <linux/gpio.h>
@@ -61,6 +62,8 @@
61static u32 chipid; 62static u32 chipid;
62static u32 socid; 63static u32 socid;
63 64
65static void __iomem *reset_addr;
66
64static inline void __mxs_setl(u32 mask, void __iomem *reg) 67static inline void __mxs_setl(u32 mask, void __iomem *reg)
65{ 68{
66 __raw_writel(mask, reg + MXS_SET_ADDR); 69 __raw_writel(mask, reg + MXS_SET_ADDR);
@@ -393,12 +396,33 @@ static const char __init *mxs_get_revision(void)
393 u32 rev = mxs_get_cpu_rev(); 396 u32 rev = mxs_get_cpu_rev();
394 397
395 if (rev != MXS_CHIP_REV_UNKNOWN) 398 if (rev != MXS_CHIP_REV_UNKNOWN)
396 return kasprintf(GFP_KERNEL, "TO%d.%d", (rev >> 4) & 0xf, 399 return kasprintf(GFP_KERNEL, "%d.%d", (rev >> 4) & 0xf,
397 rev & 0xf); 400 rev & 0xf);
398 else 401 else
399 return kasprintf(GFP_KERNEL, "%s", "Unknown"); 402 return kasprintf(GFP_KERNEL, "%s", "Unknown");
400} 403}
401 404
405#define MX23_CLKCTRL_RESET_OFFSET 0x120
406#define MX28_CLKCTRL_RESET_OFFSET 0x1e0
407
408static int __init mxs_restart_init(void)
409{
410 struct device_node *np;
411
412 np = of_find_compatible_node(NULL, NULL, "fsl,clkctrl");
413 reset_addr = of_iomap(np, 0);
414 if (!reset_addr)
415 return -ENODEV;
416
417 if (of_device_is_compatible(np, "fsl,imx23-clkctrl"))
418 reset_addr += MX23_CLKCTRL_RESET_OFFSET;
419 else
420 reset_addr += MX28_CLKCTRL_RESET_OFFSET;
421 of_node_put(np);
422
423 return 0;
424}
425
402static void __init mxs_machine_init(void) 426static void __init mxs_machine_init(void)
403{ 427{
404 struct device_node *root; 428 struct device_node *root;
@@ -433,21 +457,18 @@ static void __init mxs_machine_init(void)
433 imx28_evk_init(); 457 imx28_evk_init();
434 else if (of_machine_is_compatible("bluegiga,apx4devkit")) 458 else if (of_machine_is_compatible("bluegiga,apx4devkit"))
435 apx4devkit_init(); 459 apx4devkit_init();
436 else if (of_machine_is_compatible("crystalfontz,cfa10037") || 460 else if (of_machine_is_compatible("crystalfontz,cfa10036"))
437 of_machine_is_compatible("crystalfontz,cfa10049") ||
438 of_machine_is_compatible("crystalfontz,cfa10055") ||
439 of_machine_is_compatible("crystalfontz,cfa10057"))
440 crystalfontz_init(); 461 crystalfontz_init();
441 462
442 of_platform_populate(NULL, of_default_bus_match_table, 463 of_platform_populate(NULL, of_default_bus_match_table,
443 NULL, parent); 464 NULL, parent);
444 465
466 mxs_restart_init();
467
445 if (of_machine_is_compatible("karo,tx28")) 468 if (of_machine_is_compatible("karo,tx28"))
446 tx28_post_init(); 469 tx28_post_init();
447} 470}
448 471
449#define MX23_CLKCTRL_RESET_OFFSET 0x120
450#define MX28_CLKCTRL_RESET_OFFSET 0x1e0
451#define MXS_CLKCTRL_RESET_CHIP (1 << 1) 472#define MXS_CLKCTRL_RESET_CHIP (1 << 1)
452 473
453/* 474/*
@@ -455,28 +476,16 @@ static void __init mxs_machine_init(void)
455 */ 476 */
456static void mxs_restart(enum reboot_mode mode, const char *cmd) 477static void mxs_restart(enum reboot_mode mode, const char *cmd)
457{ 478{
458 struct device_node *np; 479 if (reset_addr) {
459 void __iomem *reset_addr; 480 /* reset the chip */
481 __mxs_setl(MXS_CLKCTRL_RESET_CHIP, reset_addr);
460 482
461 np = of_find_compatible_node(NULL, NULL, "fsl,clkctrl"); 483 pr_err("Failed to assert the chip reset\n");
462 reset_addr = of_iomap(np, 0);
463 if (!reset_addr)
464 goto soft;
465 484
466 if (of_device_is_compatible(np, "fsl,imx23-clkctrl")) 485 /* Delay to allow the serial port to show the message */
467 reset_addr += MX23_CLKCTRL_RESET_OFFSET; 486 mdelay(50);
468 else 487 }
469 reset_addr += MX28_CLKCTRL_RESET_OFFSET;
470
471 /* reset the chip */
472 __mxs_setl(MXS_CLKCTRL_RESET_CHIP, reset_addr);
473
474 pr_err("Failed to assert the chip reset\n");
475
476 /* Delay to allow the serial port to show the message */
477 mdelay(50);
478 488
479soft:
480 /* We'll take a jump through zero as a poor second */ 489 /* We'll take a jump through zero as a poor second */
481 soft_restart(0); 490 soft_restart(0);
482} 491}
@@ -487,6 +496,7 @@ static void __init mxs_timer_init(void)
487 mx23_clocks_init(); 496 mx23_clocks_init();
488 else 497 else
489 mx28_clocks_init(); 498 mx28_clocks_init();
499 of_clk_init(NULL);
490 clocksource_of_init(); 500 clocksource_of_init();
491} 501}
492 502
diff --git a/arch/arm/mach-mxs/pm.c b/arch/arm/mach-mxs/pm.c
index b2494d2db2c4..0170e99fd70f 100644
--- a/arch/arm/mach-mxs/pm.c
+++ b/arch/arm/mach-mxs/pm.c
@@ -15,6 +15,7 @@
15#include <linux/kernel.h> 15#include <linux/kernel.h>
16#include <linux/suspend.h> 16#include <linux/suspend.h>
17#include <linux/io.h> 17#include <linux/io.h>
18#include "pm.h"
18 19
19static int mxs_suspend_enter(suspend_state_t state) 20static int mxs_suspend_enter(suspend_state_t state)
20{ 21{
diff --git a/arch/arm/mach-nomadik/Kconfig b/arch/arm/mach-nomadik/Kconfig
index 5981c3db9b41..4d42da49753c 100644
--- a/arch/arm/mach-nomadik/Kconfig
+++ b/arch/arm/mach-nomadik/Kconfig
@@ -27,6 +27,7 @@ config MACH_NOMADIK_8815NHK
27 select NOMADIK_8815 27 select NOMADIK_8815
28 select I2C 28 select I2C
29 select I2C_ALGOBIT 29 select I2C_ALGOBIT
30 select I2C_NOMADIK
30 31
31endmenu 32endmenu
32endif 33endif
diff --git a/arch/arm/mach-omap1/include/mach/soc.h b/arch/arm/mach-omap1/include/mach/soc.h
index 6cf9c1cc2bef..612bd1cc257c 100644
--- a/arch/arm/mach-omap1/include/mach/soc.h
+++ b/arch/arm/mach-omap1/include/mach/soc.h
@@ -195,6 +195,7 @@ IS_OMAP_TYPE(1710, 0x1710)
195#define cpu_is_omap34xx() 0 195#define cpu_is_omap34xx() 0
196#define cpu_is_omap44xx() 0 196#define cpu_is_omap44xx() 0
197#define soc_is_omap54xx() 0 197#define soc_is_omap54xx() 0
198#define soc_is_dra7xx() 0
198#define soc_is_am33xx() 0 199#define soc_is_am33xx() 0
199#define cpu_class_is_omap1() 1 200#define cpu_class_is_omap1() 1
200#define cpu_class_is_omap2() 0 201#define cpu_class_is_omap2() 0
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
index 3eed0006d189..b5fb5f7992df 100644
--- a/arch/arm/mach-omap2/Kconfig
+++ b/arch/arm/mach-omap2/Kconfig
@@ -37,9 +37,8 @@ config ARCH_OMAP4
37 select CACHE_L2X0 37 select CACHE_L2X0
38 select CPU_V7 38 select CPU_V7
39 select HAVE_ARM_SCU if SMP 39 select HAVE_ARM_SCU if SMP
40 select HAVE_ARM_TWD if LOCAL_TIMERS 40 select HAVE_ARM_TWD if SMP
41 select HAVE_SMP 41 select HAVE_SMP
42 select LOCAL_TIMERS if SMP
43 select OMAP_INTERCONNECT 42 select OMAP_INTERCONNECT
44 select PL310_ERRATA_588369 43 select PL310_ERRATA_588369
45 select PL310_ERRATA_727915 44 select PL310_ERRATA_727915
@@ -65,7 +64,7 @@ config SOC_OMAP5
65 select ARM_ERRATA_798181 if SMP 64 select ARM_ERRATA_798181 if SMP
66 65
67config SOC_AM33XX 66config SOC_AM33XX
68 bool "AM33XX support" 67 bool "TI AM33XX"
69 depends on ARCH_MULTI_V7 68 depends on ARCH_MULTI_V7
70 select ARCH_OMAP2PLUS 69 select ARCH_OMAP2PLUS
71 select ARM_CPU_SUSPEND if PM 70 select ARM_CPU_SUSPEND if PM
@@ -118,7 +117,7 @@ config ARCH_OMAP2PLUS_TYPICAL
118 select I2C 117 select I2C
119 select I2C_OMAP 118 select I2C_OMAP
120 select MENELAUS if ARCH_OMAP2 119 select MENELAUS if ARCH_OMAP2
121 select NEON if ARCH_OMAP3 || ARCH_OMAP4 || SOC_OMAP5 120 select NEON if CPU_V7
122 select PM_RUNTIME 121 select PM_RUNTIME
123 select REGULATOR 122 select REGULATOR
124 select TWL4030_CORE if ARCH_OMAP3 || ARCH_OMAP4 123 select TWL4030_CORE if ARCH_OMAP3 || ARCH_OMAP4
@@ -132,9 +131,17 @@ config SOC_HAS_OMAP2_SDRC
132 131
133config SOC_HAS_REALTIME_COUNTER 132config SOC_HAS_REALTIME_COUNTER
134 bool "Real time free running counter" 133 bool "Real time free running counter"
135 depends on SOC_OMAP5 134 depends on SOC_OMAP5 || SOC_DRA7XX
136 default y 135 default y
137 136
137config SOC_DRA7XX
138 bool "TI DRA7XX"
139 select ARM_ARCH_TIMER
140 select CPU_V7
141 select ARM_GIC
142 select HAVE_SMP
143 select COMMON_CLK
144
138comment "OMAP Core Type" 145comment "OMAP Core Type"
139 depends on ARCH_OMAP2 146 depends on ARCH_OMAP2
140 147
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
index d4f671547c37..afb457c3135b 100644
--- a/arch/arm/mach-omap2/Makefile
+++ b/arch/arm/mach-omap2/Makefile
@@ -23,6 +23,7 @@ obj-$(CONFIG_ARCH_OMAP4) += prm44xx.o $(hwmod-common) $(secure-common)
23obj-$(CONFIG_SOC_AM33XX) += irq.o $(hwmod-common) 23obj-$(CONFIG_SOC_AM33XX) += irq.o $(hwmod-common)
24obj-$(CONFIG_SOC_OMAP5) += prm44xx.o $(hwmod-common) $(secure-common) 24obj-$(CONFIG_SOC_OMAP5) += prm44xx.o $(hwmod-common) $(secure-common)
25obj-$(CONFIG_SOC_AM43XX) += $(hwmod-common) $(secure-common) 25obj-$(CONFIG_SOC_AM43XX) += $(hwmod-common) $(secure-common)
26obj-$(CONFIG_SOC_DRA7XX) += prm44xx.o $(hwmod-common) $(secure-common)
26 27
27ifneq ($(CONFIG_SND_OMAP_SOC_MCBSP),) 28ifneq ($(CONFIG_SND_OMAP_SOC_MCBSP),)
28obj-y += mcbsp.o 29obj-y += mcbsp.o
@@ -39,6 +40,7 @@ omap-4-5-common = omap4-common.o omap-wakeupgen.o
39obj-$(CONFIG_ARCH_OMAP4) += $(omap-4-5-common) $(smp-y) sleep44xx.o 40obj-$(CONFIG_ARCH_OMAP4) += $(omap-4-5-common) $(smp-y) sleep44xx.o
40obj-$(CONFIG_SOC_OMAP5) += $(omap-4-5-common) $(smp-y) sleep44xx.o 41obj-$(CONFIG_SOC_OMAP5) += $(omap-4-5-common) $(smp-y) sleep44xx.o
41obj-$(CONFIG_SOC_AM43XX) += $(omap-4-5-common) 42obj-$(CONFIG_SOC_AM43XX) += $(omap-4-5-common)
43obj-$(CONFIG_SOC_DRA7XX) += $(omap-4-5-common) $(smp-y)
42 44
43plus_sec := $(call as-instr,.arch_extension sec,+sec) 45plus_sec := $(call as-instr,.arch_extension sec,+sec)
44AFLAGS_omap-headsmp.o :=-Wa,-march=armv7-a$(plus_sec) 46AFLAGS_omap-headsmp.o :=-Wa,-march=armv7-a$(plus_sec)
@@ -61,6 +63,7 @@ obj-$(CONFIG_SOC_AM33XX) += am33xx-restart.o
61obj-$(CONFIG_ARCH_OMAP3) += omap3-restart.o 63obj-$(CONFIG_ARCH_OMAP3) += omap3-restart.o
62obj-$(CONFIG_ARCH_OMAP4) += omap4-restart.o 64obj-$(CONFIG_ARCH_OMAP4) += omap4-restart.o
63obj-$(CONFIG_SOC_OMAP5) += omap4-restart.o 65obj-$(CONFIG_SOC_OMAP5) += omap4-restart.o
66obj-$(CONFIG_SOC_DRA7XX) += omap4-restart.o
64 67
65# Pin multiplexing 68# Pin multiplexing
66obj-$(CONFIG_SOC_OMAP2420) += mux2420.o 69obj-$(CONFIG_SOC_OMAP2420) += mux2420.o
@@ -87,6 +90,7 @@ obj-$(CONFIG_ARCH_OMAP2) += sleep24xx.o
87obj-$(CONFIG_ARCH_OMAP3) += pm34xx.o sleep34xx.o 90obj-$(CONFIG_ARCH_OMAP3) += pm34xx.o sleep34xx.o
88obj-$(CONFIG_ARCH_OMAP4) += pm44xx.o omap-mpuss-lowpower.o 91obj-$(CONFIG_ARCH_OMAP4) += pm44xx.o omap-mpuss-lowpower.o
89obj-$(CONFIG_SOC_OMAP5) += omap-mpuss-lowpower.o 92obj-$(CONFIG_SOC_OMAP5) += omap-mpuss-lowpower.o
93obj-$(CONFIG_SOC_DRA7XX) += omap-mpuss-lowpower.o
90obj-$(CONFIG_PM_DEBUG) += pm-debug.o 94obj-$(CONFIG_PM_DEBUG) += pm-debug.o
91 95
92obj-$(CONFIG_POWER_AVS_OMAP) += sr_device.o 96obj-$(CONFIG_POWER_AVS_OMAP) += sr_device.o
@@ -114,6 +118,7 @@ omap-prcm-4-5-common = cminst44xx.o cm44xx.o prm44xx.o \
114 vc44xx_data.o vp44xx_data.o 118 vc44xx_data.o vp44xx_data.o
115obj-$(CONFIG_ARCH_OMAP4) += $(omap-prcm-4-5-common) 119obj-$(CONFIG_ARCH_OMAP4) += $(omap-prcm-4-5-common)
116obj-$(CONFIG_SOC_OMAP5) += $(omap-prcm-4-5-common) 120obj-$(CONFIG_SOC_OMAP5) += $(omap-prcm-4-5-common)
121obj-$(CONFIG_SOC_DRA7XX) += $(omap-prcm-4-5-common)
117 122
118# OMAP voltage domains 123# OMAP voltage domains
119voltagedomain-common := voltage.o vc.o vp.o 124voltagedomain-common := voltage.o vc.o vp.o
@@ -143,6 +148,8 @@ obj-$(CONFIG_SOC_AM33XX) += powerdomains33xx_data.o
143obj-$(CONFIG_SOC_AM43XX) += $(powerdomain-common) 148obj-$(CONFIG_SOC_AM43XX) += $(powerdomain-common)
144obj-$(CONFIG_SOC_OMAP5) += $(powerdomain-common) 149obj-$(CONFIG_SOC_OMAP5) += $(powerdomain-common)
145obj-$(CONFIG_SOC_OMAP5) += powerdomains54xx_data.o 150obj-$(CONFIG_SOC_OMAP5) += powerdomains54xx_data.o
151obj-$(CONFIG_SOC_DRA7XX) += $(powerdomain-common)
152obj-$(CONFIG_SOC_DRA7XX) += powerdomains7xx_data.o
146 153
147# PRCM clockdomain control 154# PRCM clockdomain control
148clockdomain-common += clockdomain.o 155clockdomain-common += clockdomain.o
@@ -160,6 +167,8 @@ obj-$(CONFIG_SOC_AM33XX) += clockdomains33xx_data.o
160obj-$(CONFIG_SOC_AM43XX) += $(clockdomain-common) 167obj-$(CONFIG_SOC_AM43XX) += $(clockdomain-common)
161obj-$(CONFIG_SOC_OMAP5) += $(clockdomain-common) 168obj-$(CONFIG_SOC_OMAP5) += $(clockdomain-common)
162obj-$(CONFIG_SOC_OMAP5) += clockdomains54xx_data.o 169obj-$(CONFIG_SOC_OMAP5) += clockdomains54xx_data.o
170obj-$(CONFIG_SOC_DRA7XX) += $(clockdomain-common)
171obj-$(CONFIG_SOC_DRA7XX) += clockdomains7xx_data.o
163 172
164# Clock framework 173# Clock framework
165obj-$(CONFIG_ARCH_OMAP2) += $(clock-common) clock2xxx.o 174obj-$(CONFIG_ARCH_OMAP2) += $(clock-common) clock2xxx.o
@@ -203,6 +212,7 @@ obj-$(CONFIG_ARCH_OMAP3) += omap_hwmod_3xxx_data.o
203obj-$(CONFIG_SOC_AM33XX) += omap_hwmod_33xx_data.o 212obj-$(CONFIG_SOC_AM33XX) += omap_hwmod_33xx_data.o
204obj-$(CONFIG_ARCH_OMAP4) += omap_hwmod_44xx_data.o 213obj-$(CONFIG_ARCH_OMAP4) += omap_hwmod_44xx_data.o
205obj-$(CONFIG_SOC_OMAP5) += omap_hwmod_54xx_data.o 214obj-$(CONFIG_SOC_OMAP5) += omap_hwmod_54xx_data.o
215obj-$(CONFIG_SOC_DRA7XX) += omap_hwmod_7xx_data.o
206 216
207# EMU peripherals 217# EMU peripherals
208obj-$(CONFIG_OMAP3_EMU) += emu.o 218obj-$(CONFIG_OMAP3_EMU) += emu.o
diff --git a/arch/arm/mach-omap2/am33xx-restart.c b/arch/arm/mach-omap2/am33xx-restart.c
index 1eae96212315..c88d8df753c2 100644
--- a/arch/arm/mach-omap2/am33xx-restart.c
+++ b/arch/arm/mach-omap2/am33xx-restart.c
@@ -24,8 +24,8 @@ void am33xx_restart(enum reboot_mode mode, const char *cmd)
24{ 24{
25 /* TODO: Handle mode and cmd if necessary */ 25 /* TODO: Handle mode and cmd if necessary */
26 26
27 am33xx_prm_rmw_reg_bits(AM33XX_GLOBAL_WARM_SW_RST_MASK, 27 am33xx_prm_rmw_reg_bits(AM33XX_RST_GLOBAL_WARM_SW_MASK,
28 AM33XX_GLOBAL_WARM_SW_RST_MASK, 28 AM33XX_RST_GLOBAL_WARM_SW_MASK,
29 AM33XX_PRM_DEVICE_MOD, 29 AM33XX_PRM_DEVICE_MOD,
30 AM33XX_PRM_RSTCTRL_OFFSET); 30 AM33XX_PRM_RSTCTRL_OFFSET);
31 31
diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c
index 244d8a5aa54b..c711ad6ac067 100644
--- a/arch/arm/mach-omap2/board-2430sdp.c
+++ b/arch/arm/mach-omap2/board-2430sdp.c
@@ -100,39 +100,52 @@ static struct platform_device sdp2430_flash_device = {
100 .resource = &sdp2430_flash_resource, 100 .resource = &sdp2430_flash_resource,
101}; 101};
102 102
103static struct platform_device *sdp2430_devices[] __initdata = {
104 &sdp2430_flash_device,
105};
106
107/* LCD */ 103/* LCD */
108#define SDP2430_LCD_PANEL_BACKLIGHT_GPIO 91 104#define SDP2430_LCD_PANEL_BACKLIGHT_GPIO 91
109#define SDP2430_LCD_PANEL_ENABLE_GPIO 154 105#define SDP2430_LCD_PANEL_ENABLE_GPIO 154
110 106
111static struct panel_generic_dpi_data sdp2430_panel_data = { 107static const struct display_timing sdp2430_lcd_videomode = {
112 .name = "nec_nl2432dr22-11b", 108 .pixelclock = { 0, 5400000, 0 },
113 .num_gpios = 2, 109
114 .gpios = { 110 .hactive = { 0, 240, 0 },
115 SDP2430_LCD_PANEL_ENABLE_GPIO, 111 .hfront_porch = { 0, 3, 0 },
116 SDP2430_LCD_PANEL_BACKLIGHT_GPIO, 112 .hback_porch = { 0, 39, 0 },
117 }, 113 .hsync_len = { 0, 3, 0 },
114
115 .vactive = { 0, 320, 0 },
116 .vfront_porch = { 0, 2, 0 },
117 .vback_porch = { 0, 7, 0 },
118 .vsync_len = { 0, 1, 0 },
119
120 .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
121 DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE,
118}; 122};
119 123
120static struct omap_dss_device sdp2430_lcd_device = { 124static struct panel_dpi_platform_data sdp2430_lcd_pdata = {
121 .name = "lcd", 125 .name = "lcd",
122 .driver_name = "generic_dpi_panel", 126 .source = "dpi.0",
123 .type = OMAP_DISPLAY_TYPE_DPI, 127
124 .phy.dpi.data_lines = 16, 128 .data_lines = 16,
125 .data = &sdp2430_panel_data, 129
130 .display_timing = &sdp2430_lcd_videomode,
131
132 .enable_gpio = SDP2430_LCD_PANEL_ENABLE_GPIO,
133 .backlight_gpio = SDP2430_LCD_PANEL_BACKLIGHT_GPIO,
126}; 134};
127 135
128static struct omap_dss_device *sdp2430_dss_devices[] = { 136static struct platform_device sdp2430_lcd_device = {
129 &sdp2430_lcd_device, 137 .name = "panel-dpi",
138 .id = 0,
139 .dev.platform_data = &sdp2430_lcd_pdata,
130}; 140};
131 141
132static struct omap_dss_board_info sdp2430_dss_data = { 142static struct omap_dss_board_info sdp2430_dss_data = {
133 .num_devices = ARRAY_SIZE(sdp2430_dss_devices), 143 .default_display_name = "lcd",
134 .devices = sdp2430_dss_devices, 144};
135 .default_device = &sdp2430_lcd_device, 145
146static struct platform_device *sdp2430_devices[] __initdata = {
147 &sdp2430_flash_device,
148 &sdp2430_lcd_device,
136}; 149};
137 150
138#if IS_ENABLED(CONFIG_SMC91X) 151#if IS_ENABLED(CONFIG_SMC91X)
diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c
index 23b004afa3f8..d95d0ef1354a 100644
--- a/arch/arm/mach-omap2/board-3430sdp.c
+++ b/arch/arm/mach-omap2/board-3430sdp.c
@@ -126,53 +126,65 @@ static void __init sdp3430_display_init(void)
126 126
127} 127}
128 128
129static struct panel_sharp_ls037v7dw01_data sdp3430_lcd_data = { 129static struct panel_sharp_ls037v7dw01_platform_data sdp3430_lcd_pdata = {
130 .resb_gpio = SDP3430_LCD_PANEL_ENABLE_GPIO, 130 .name = "lcd",
131 .ini_gpio = -1, 131 .source = "dpi.0",
132 .mo_gpio = -1, 132
133 .lr_gpio = -1, 133 .data_lines = 16,
134 .ud_gpio = -1, 134
135 .resb_gpio = SDP3430_LCD_PANEL_ENABLE_GPIO,
136 .ini_gpio = -1,
137 .mo_gpio = -1,
138 .lr_gpio = -1,
139 .ud_gpio = -1,
140};
141
142static struct platform_device sdp3430_lcd_device = {
143 .name = "panel-sharp-ls037v7dw01",
144 .id = 0,
145 .dev.platform_data = &sdp3430_lcd_pdata,
135}; 146};
136 147
137static struct omap_dss_device sdp3430_lcd_device = { 148static struct connector_dvi_platform_data sdp3430_dvi_connector_pdata = {
138 .name = "lcd", 149 .name = "dvi",
139 .driver_name = "sharp_ls_panel", 150 .source = "tfp410.0",
140 .type = OMAP_DISPLAY_TYPE_DPI, 151 .i2c_bus_num = -1,
141 .phy.dpi.data_lines = 16,
142 .data = &sdp3430_lcd_data,
143}; 152};
144 153
145static struct tfp410_platform_data dvi_panel = { 154static struct platform_device sdp3430_dvi_connector_device = {
146 .power_down_gpio = -1, 155 .name = "connector-dvi",
147 .i2c_bus_num = -1, 156 .id = 0,
157 .dev.platform_data = &sdp3430_dvi_connector_pdata,
148}; 158};
149 159
150static struct omap_dss_device sdp3430_dvi_device = { 160static struct encoder_tfp410_platform_data sdp3430_tfp410_pdata = {
151 .name = "dvi", 161 .name = "tfp410.0",
152 .type = OMAP_DISPLAY_TYPE_DPI, 162 .source = "dpi.0",
153 .driver_name = "tfp410", 163 .data_lines = 24,
154 .data = &dvi_panel, 164 .power_down_gpio = -1,
155 .phy.dpi.data_lines = 24,
156}; 165};
157 166
158static struct omap_dss_device sdp3430_tv_device = { 167static struct platform_device sdp3430_tfp410_device = {
159 .name = "tv", 168 .name = "tfp410",
160 .driver_name = "venc", 169 .id = 0,
161 .type = OMAP_DISPLAY_TYPE_VENC, 170 .dev.platform_data = &sdp3430_tfp410_pdata,
162 .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
163}; 171};
164 172
173static struct connector_atv_platform_data sdp3430_tv_pdata = {
174 .name = "tv",
175 .source = "venc.0",
176 .connector_type = OMAP_DSS_VENC_TYPE_SVIDEO,
177 .invert_polarity = false,
178};
165 179
166static struct omap_dss_device *sdp3430_dss_devices[] = { 180static struct platform_device sdp3430_tv_connector_device = {
167 &sdp3430_lcd_device, 181 .name = "connector-analog-tv",
168 &sdp3430_dvi_device, 182 .id = 0,
169 &sdp3430_tv_device, 183 .dev.platform_data = &sdp3430_tv_pdata,
170}; 184};
171 185
172static struct omap_dss_board_info sdp3430_dss_data = { 186static struct omap_dss_board_info sdp3430_dss_data = {
173 .num_devices = ARRAY_SIZE(sdp3430_dss_devices), 187 .default_display_name = "lcd",
174 .devices = sdp3430_dss_devices,
175 .default_device = &sdp3430_lcd_device,
176}; 188};
177 189
178static struct omap2_hsmmc_info mmc[] = { 190static struct omap2_hsmmc_info mmc[] = {
@@ -583,6 +595,11 @@ static void __init omap_3430sdp_init(void)
583 omap_hsmmc_init(mmc); 595 omap_hsmmc_init(mmc);
584 omap3430_i2c_init(); 596 omap3430_i2c_init();
585 omap_display_init(&sdp3430_dss_data); 597 omap_display_init(&sdp3430_dss_data);
598 platform_device_register(&sdp3430_lcd_device);
599 platform_device_register(&sdp3430_tfp410_device);
600 platform_device_register(&sdp3430_dvi_connector_device);
601 platform_device_register(&sdp3430_tv_connector_device);
602
586 if (omap_rev() > OMAP3430_REV_ES1_0) 603 if (omap_rev() > OMAP3430_REV_ES1_0)
587 gpio_pendown = SDP3430_TS_GPIO_IRQ_SDPV2; 604 gpio_pendown = SDP3430_TS_GPIO_IRQ_SDPV2;
588 else 605 else
diff --git a/arch/arm/mach-omap2/board-am3517crane.c b/arch/arm/mach-omap2/board-am3517crane.c
index fc53911d0d13..0d499a1878f6 100644
--- a/arch/arm/mach-omap2/board-am3517crane.c
+++ b/arch/arm/mach-omap2/board-am3517crane.c
@@ -110,8 +110,6 @@ static void __init am3517_crane_i2c_init(void)
110 110
111static void __init am3517_crane_init(void) 111static void __init am3517_crane_init(void)
112{ 112{
113 int ret;
114
115 omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); 113 omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
116 omap_serial_init(); 114 omap_serial_init();
117 omap_sdrc_init(NULL, NULL); 115 omap_sdrc_init(NULL, NULL);
diff --git a/arch/arm/mach-omap2/board-am3517evm.c b/arch/arm/mach-omap2/board-am3517evm.c
index d63f14b534b5..543d9a882de3 100644
--- a/arch/arm/mach-omap2/board-am3517evm.c
+++ b/arch/arm/mach-omap2/board-am3517evm.c
@@ -21,7 +21,7 @@
21#include <linux/clk.h> 21#include <linux/clk.h>
22#include <linux/platform_device.h> 22#include <linux/platform_device.h>
23#include <linux/gpio.h> 23#include <linux/gpio.h>
24#include <linux/i2c/pca953x.h> 24#include <linux/platform_data/pca953x.h>
25#include <linux/can/platform/ti_hecc.h> 25#include <linux/can/platform/ti_hecc.h>
26#include <linux/davinci_emac.h> 26#include <linux/davinci_emac.h>
27#include <linux/mmc/host.h> 27#include <linux/mmc/host.h>
@@ -120,56 +120,95 @@ static int __init am3517_evm_i2c_init(void)
120 return 0; 120 return 0;
121} 121}
122 122
123static struct panel_generic_dpi_data lcd_panel = { 123static const struct display_timing am3517_evm_lcd_videomode = {
124 .name = "sharp_lq", 124 .pixelclock = { 0, 9000000, 0 },
125 .num_gpios = 3, 125
126 .gpios = { 126 .hactive = { 0, 480, 0 },
127 LCD_PANEL_PWR, 127 .hfront_porch = { 0, 3, 0 },
128 LCD_PANEL_BKLIGHT_PWR, 128 .hback_porch = { 0, 2, 0 },
129 LCD_PANEL_PWM, 129 .hsync_len = { 0, 42, 0 },
130 }, 130
131 .vactive = { 0, 272, 0 },
132 .vfront_porch = { 0, 3, 0 },
133 .vback_porch = { 0, 2, 0 },
134 .vsync_len = { 0, 11, 0 },
135
136 .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
137 DISPLAY_FLAGS_DE_LOW | DISPLAY_FLAGS_PIXDATA_POSEDGE,
138};
139
140static struct panel_dpi_platform_data am3517_evm_lcd_pdata = {
141 .name = "lcd",
142 .source = "dpi.0",
143
144 .data_lines = 16,
145
146 .display_timing = &am3517_evm_lcd_videomode,
147
148 .enable_gpio = LCD_PANEL_PWR,
149 .backlight_gpio = LCD_PANEL_BKLIGHT_PWR,
150};
151
152static struct platform_device am3517_evm_lcd_device = {
153 .name = "panel-dpi",
154 .id = 0,
155 .dev.platform_data = &am3517_evm_lcd_pdata,
131}; 156};
132 157
133static struct omap_dss_device am3517_evm_lcd_device = { 158static struct connector_dvi_platform_data am3517_evm_dvi_connector_pdata = {
134 .type = OMAP_DISPLAY_TYPE_DPI, 159 .name = "dvi",
135 .name = "lcd", 160 .source = "tfp410.0",
136 .driver_name = "generic_dpi_panel", 161 .i2c_bus_num = -1,
137 .data = &lcd_panel,
138 .phy.dpi.data_lines = 16,
139}; 162};
140 163
141static struct omap_dss_device am3517_evm_tv_device = { 164static struct platform_device am3517_evm_dvi_connector_device = {
142 .type = OMAP_DISPLAY_TYPE_VENC, 165 .name = "connector-dvi",
143 .name = "tv", 166 .id = 0,
144 .driver_name = "venc", 167 .dev.platform_data = &am3517_evm_dvi_connector_pdata,
145 .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
146}; 168};
147 169
148static struct tfp410_platform_data dvi_panel = { 170static struct encoder_tfp410_platform_data am3517_evm_tfp410_pdata = {
149 .power_down_gpio = -1, 171 .name = "tfp410.0",
150 .i2c_bus_num = -1, 172 .source = "dpi.0",
173 .data_lines = 24,
174 .power_down_gpio = -1,
151}; 175};
152 176
153static struct omap_dss_device am3517_evm_dvi_device = { 177static struct platform_device am3517_evm_tfp410_device = {
154 .type = OMAP_DISPLAY_TYPE_DPI, 178 .name = "tfp410",
155 .name = "dvi", 179 .id = 0,
156 .driver_name = "tfp410", 180 .dev.platform_data = &am3517_evm_tfp410_pdata,
157 .data = &dvi_panel,
158 .phy.dpi.data_lines = 24,
159}; 181};
160 182
161static struct omap_dss_device *am3517_evm_dss_devices[] = { 183static struct connector_atv_platform_data am3517_evm_tv_pdata = {
162 &am3517_evm_lcd_device, 184 .name = "tv",
163 &am3517_evm_tv_device, 185 .source = "venc.0",
164 &am3517_evm_dvi_device, 186 .connector_type = OMAP_DSS_VENC_TYPE_SVIDEO,
187 .invert_polarity = false,
188};
189
190static struct platform_device am3517_evm_tv_connector_device = {
191 .name = "connector-analog-tv",
192 .id = 0,
193 .dev.platform_data = &am3517_evm_tv_pdata,
165}; 194};
166 195
167static struct omap_dss_board_info am3517_evm_dss_data = { 196static struct omap_dss_board_info am3517_evm_dss_data = {
168 .num_devices = ARRAY_SIZE(am3517_evm_dss_devices), 197 .default_display_name = "lcd",
169 .devices = am3517_evm_dss_devices,
170 .default_device = &am3517_evm_lcd_device,
171}; 198};
172 199
200static void __init am3517_evm_display_init(void)
201{
202 gpio_request_one(LCD_PANEL_PWM, GPIOF_OUT_INIT_HIGH, "lcd panel pwm");
203
204 omap_display_init(&am3517_evm_dss_data);
205
206 platform_device_register(&am3517_evm_tfp410_device);
207 platform_device_register(&am3517_evm_dvi_connector_device);
208 platform_device_register(&am3517_evm_lcd_device);
209 platform_device_register(&am3517_evm_tv_connector_device);
210}
211
173/* 212/*
174 * Board initialization 213 * Board initialization
175 */ 214 */
@@ -295,7 +334,9 @@ static void __init am3517_evm_init(void)
295 omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); 334 omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
296 335
297 am3517_evm_i2c_init(); 336 am3517_evm_i2c_init();
298 omap_display_init(&am3517_evm_dss_data); 337
338 am3517_evm_display_init();
339
299 omap_serial_init(); 340 omap_serial_init();
300 omap_sdrc_init(NULL, NULL); 341 omap_sdrc_init(NULL, NULL);
301 342
diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c
index d4622ed26252..33d159e2386e 100644
--- a/arch/arm/mach-omap2/board-cm-t35.c
+++ b/arch/arm/mach-omap2/board-cm-t35.c
@@ -190,52 +190,81 @@ static inline void cm_t35_init_nand(void) {}
190#define CM_T35_LCD_BL_GPIO 58 190#define CM_T35_LCD_BL_GPIO 58
191#define CM_T35_DVI_EN_GPIO 54 191#define CM_T35_DVI_EN_GPIO 54
192 192
193static struct panel_generic_dpi_data lcd_panel = { 193static const struct display_timing cm_t35_lcd_videomode = {
194 .name = "toppoly_tdo35s", 194 .pixelclock = { 0, 26000000, 0 },
195 .num_gpios = 1, 195
196 .gpios = { 196 .hactive = { 0, 480, 0 },
197 CM_T35_LCD_BL_GPIO, 197 .hfront_porch = { 0, 104, 0 },
198 }, 198 .hback_porch = { 0, 8, 0 },
199 .hsync_len = { 0, 8, 0 },
200
201 .vactive = { 0, 640, 0 },
202 .vfront_porch = { 0, 4, 0 },
203 .vback_porch = { 0, 2, 0 },
204 .vsync_len = { 0, 2, 0 },
205
206 .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
207 DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_NEGEDGE,
208};
209
210static struct panel_dpi_platform_data cm_t35_lcd_pdata = {
211 .name = "lcd",
212 .source = "dpi.0",
213
214 .data_lines = 18,
215
216 .display_timing = &cm_t35_lcd_videomode,
217
218 .enable_gpio = -1,
219 .backlight_gpio = CM_T35_LCD_BL_GPIO,
220};
221
222static struct platform_device cm_t35_lcd_device = {
223 .name = "panel-dpi",
224 .id = 0,
225 .dev.platform_data = &cm_t35_lcd_pdata,
199}; 226};
200 227
201static struct omap_dss_device cm_t35_lcd_device = { 228static struct connector_dvi_platform_data cm_t35_dvi_connector_pdata = {
202 .name = "lcd", 229 .name = "dvi",
203 .type = OMAP_DISPLAY_TYPE_DPI, 230 .source = "tfp410.0",
204 .driver_name = "generic_dpi_panel", 231 .i2c_bus_num = -1,
205 .data = &lcd_panel,
206 .phy.dpi.data_lines = 18,
207}; 232};
208 233
209static struct tfp410_platform_data dvi_panel = { 234static struct platform_device cm_t35_dvi_connector_device = {
210 .power_down_gpio = CM_T35_DVI_EN_GPIO, 235 .name = "connector-dvi",
211 .i2c_bus_num = -1, 236 .id = 0,
237 .dev.platform_data = &cm_t35_dvi_connector_pdata,
212}; 238};
213 239
214static struct omap_dss_device cm_t35_dvi_device = { 240static struct encoder_tfp410_platform_data cm_t35_tfp410_pdata = {
215 .name = "dvi", 241 .name = "tfp410.0",
216 .type = OMAP_DISPLAY_TYPE_DPI, 242 .source = "dpi.0",
217 .driver_name = "tfp410", 243 .data_lines = 24,
218 .data = &dvi_panel, 244 .power_down_gpio = CM_T35_DVI_EN_GPIO,
219 .phy.dpi.data_lines = 24,
220}; 245};
221 246
222static struct omap_dss_device cm_t35_tv_device = { 247static struct platform_device cm_t35_tfp410_device = {
223 .name = "tv", 248 .name = "tfp410",
224 .driver_name = "venc", 249 .id = 0,
225 .type = OMAP_DISPLAY_TYPE_VENC, 250 .dev.platform_data = &cm_t35_tfp410_pdata,
226 .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
227}; 251};
228 252
229static struct omap_dss_device *cm_t35_dss_devices[] = { 253static struct connector_atv_platform_data cm_t35_tv_pdata = {
230 &cm_t35_lcd_device, 254 .name = "tv",
231 &cm_t35_dvi_device, 255 .source = "venc.0",
232 &cm_t35_tv_device, 256 .connector_type = OMAP_DSS_VENC_TYPE_SVIDEO,
257 .invert_polarity = false,
258};
259
260static struct platform_device cm_t35_tv_connector_device = {
261 .name = "connector-analog-tv",
262 .id = 0,
263 .dev.platform_data = &cm_t35_tv_pdata,
233}; 264};
234 265
235static struct omap_dss_board_info cm_t35_dss_data = { 266static struct omap_dss_board_info cm_t35_dss_data = {
236 .num_devices = ARRAY_SIZE(cm_t35_dss_devices), 267 .default_display_name = "dvi",
237 .devices = cm_t35_dss_devices,
238 .default_device = &cm_t35_dvi_device,
239}; 268};
240 269
241static struct omap2_mcspi_device_config tdo24m_mcspi_config = { 270static struct omap2_mcspi_device_config tdo24m_mcspi_config = {
@@ -280,6 +309,11 @@ static void __init cm_t35_init_display(void)
280 pr_err("CM-T35: failed to register DSS device\n"); 309 pr_err("CM-T35: failed to register DSS device\n");
281 gpio_free(CM_T35_LCD_EN_GPIO); 310 gpio_free(CM_T35_LCD_EN_GPIO);
282 } 311 }
312
313 platform_device_register(&cm_t35_tfp410_device);
314 platform_device_register(&cm_t35_dvi_connector_device);
315 platform_device_register(&cm_t35_lcd_device);
316 platform_device_register(&cm_t35_tv_connector_device);
283} 317}
284 318
285static struct regulator_consumer_supply cm_t35_vmmc1_supply[] = { 319static struct regulator_consumer_supply cm_t35_vmmc1_supply[] = {
diff --git a/arch/arm/mach-omap2/board-devkit8000.c b/arch/arm/mach-omap2/board-devkit8000.c
index f1d91ba5d1ac..cdc4fb9960a9 100644
--- a/arch/arm/mach-omap2/board-devkit8000.c
+++ b/arch/arm/mach-omap2/board-devkit8000.c
@@ -112,50 +112,81 @@ static struct regulator_consumer_supply devkit8000_vio_supply[] = {
112 REGULATOR_SUPPLY("vcc", "spi2.0"), 112 REGULATOR_SUPPLY("vcc", "spi2.0"),
113}; 113};
114 114
115static struct panel_generic_dpi_data lcd_panel = { 115static const struct display_timing devkit8000_lcd_videomode = {
116 .name = "innolux_at070tn83", 116 .pixelclock = { 0, 40000000, 0 },
117 /* gpios filled in code */ 117
118 .hactive = { 0, 800, 0 },
119 .hfront_porch = { 0, 1, 0 },
120 .hback_porch = { 0, 1, 0 },
121 .hsync_len = { 0, 48, 0 },
122
123 .vactive = { 0, 480, 0 },
124 .vfront_porch = { 0, 12, 0 },
125 .vback_porch = { 0, 25, 0 },
126 .vsync_len = { 0, 3, 0 },
127
128 .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
129 DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE,
118}; 130};
119 131
120static struct omap_dss_device devkit8000_lcd_device = { 132static struct panel_dpi_platform_data devkit8000_lcd_pdata = {
121 .name = "lcd", 133 .name = "lcd",
122 .type = OMAP_DISPLAY_TYPE_DPI, 134 .source = "dpi.0",
123 .driver_name = "generic_dpi_panel", 135
124 .data = &lcd_panel, 136 .data_lines = 24,
125 .phy.dpi.data_lines = 24, 137
138 .display_timing = &devkit8000_lcd_videomode,
139
140 .enable_gpio = -1, /* filled in code */
141 .backlight_gpio = -1,
126}; 142};
127 143
128static struct tfp410_platform_data dvi_panel = { 144static struct platform_device devkit8000_lcd_device = {
129 .power_down_gpio = -1, 145 .name = "panel-dpi",
130 .i2c_bus_num = 1, 146 .id = 0,
147 .dev.platform_data = &devkit8000_lcd_pdata,
131}; 148};
132 149
133static struct omap_dss_device devkit8000_dvi_device = { 150static struct connector_dvi_platform_data devkit8000_dvi_connector_pdata = {
134 .name = "dvi", 151 .name = "dvi",
135 .type = OMAP_DISPLAY_TYPE_DPI, 152 .source = "tfp410.0",
136 .driver_name = "tfp410", 153 .i2c_bus_num = 1,
137 .data = &dvi_panel,
138 .phy.dpi.data_lines = 24,
139}; 154};
140 155
141static struct omap_dss_device devkit8000_tv_device = { 156static struct platform_device devkit8000_dvi_connector_device = {
142 .name = "tv", 157 .name = "connector-dvi",
143 .driver_name = "venc", 158 .id = 0,
144 .type = OMAP_DISPLAY_TYPE_VENC, 159 .dev.platform_data = &devkit8000_dvi_connector_pdata,
145 .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
146}; 160};
147 161
162static struct encoder_tfp410_platform_data devkit8000_tfp410_pdata = {
163 .name = "tfp410.0",
164 .source = "dpi.0",
165 .data_lines = 24,
166 .power_down_gpio = -1, /* filled in code */
167};
148 168
149static struct omap_dss_device *devkit8000_dss_devices[] = { 169static struct platform_device devkit8000_tfp410_device = {
150 &devkit8000_lcd_device, 170 .name = "tfp410",
151 &devkit8000_dvi_device, 171 .id = 0,
152 &devkit8000_tv_device, 172 .dev.platform_data = &devkit8000_tfp410_pdata,
173};
174
175static struct connector_atv_platform_data devkit8000_tv_pdata = {
176 .name = "tv",
177 .source = "venc.0",
178 .connector_type = OMAP_DSS_VENC_TYPE_SVIDEO,
179 .invert_polarity = false,
180};
181
182static struct platform_device devkit8000_tv_connector_device = {
183 .name = "connector-analog-tv",
184 .id = 0,
185 .dev.platform_data = &devkit8000_tv_pdata,
153}; 186};
154 187
155static struct omap_dss_board_info devkit8000_dss_data = { 188static struct omap_dss_board_info devkit8000_dss_data = {
156 .num_devices = ARRAY_SIZE(devkit8000_dss_devices), 189 .default_display_name = "lcd",
157 .devices = devkit8000_dss_devices,
158 .default_device = &devkit8000_lcd_device,
159}; 190};
160 191
161static uint32_t board_keymap[] = { 192static uint32_t board_keymap[] = {
@@ -204,11 +235,10 @@ static int devkit8000_twl_gpio_setup(struct device *dev,
204 gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; 235 gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
205 236
206 /* TWL4030_GPIO_MAX + 0 is "LCD_PWREN" (out, active high) */ 237 /* TWL4030_GPIO_MAX + 0 is "LCD_PWREN" (out, active high) */
207 lcd_panel.num_gpios = 1; 238 devkit8000_lcd_pdata.enable_gpio = gpio + TWL4030_GPIO_MAX + 0;
208 lcd_panel.gpios[0] = gpio + TWL4030_GPIO_MAX + 0;
209 239
210 /* gpio + 7 is "DVI_PD" (out, active low) */ 240 /* gpio + 7 is "DVI_PD" (out, active low) */
211 dvi_panel.power_down_gpio = gpio + 7; 241 devkit8000_tfp410_pdata.power_down_gpio = gpio + 7;
212 242
213 return 0; 243 return 0;
214} 244}
@@ -413,6 +443,10 @@ static struct platform_device *devkit8000_devices[] __initdata = {
413 &leds_gpio, 443 &leds_gpio,
414 &keys_gpio, 444 &keys_gpio,
415 &omap_dm9000_dev, 445 &omap_dm9000_dev,
446 &devkit8000_lcd_device,
447 &devkit8000_tfp410_device,
448 &devkit8000_dvi_connector_device,
449 &devkit8000_tv_connector_device,
416}; 450};
417 451
418static struct usbhs_omap_platform_data usbhs_bdata __initdata = { 452static struct usbhs_omap_platform_data usbhs_bdata __initdata = {
diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c
index be5d005ebad2..39c78387ddec 100644
--- a/arch/arm/mach-omap2/board-generic.c
+++ b/arch/arm/mach-omap2/board-generic.c
@@ -222,3 +222,22 @@ DT_MACHINE_START(AM43_DT, "Generic AM43 (Flattened Device Tree)")
222 .dt_compat = am43_boards_compat, 222 .dt_compat = am43_boards_compat,
223MACHINE_END 223MACHINE_END
224#endif 224#endif
225
226#ifdef CONFIG_SOC_DRA7XX
227static const char *dra7xx_boards_compat[] __initdata = {
228 "ti,dra7",
229 NULL,
230};
231
232DT_MACHINE_START(DRA7XX_DT, "Generic DRA7XX (Flattened Device Tree)")
233 .reserve = omap_reserve,
234 .smp = smp_ops(omap4_smp_ops),
235 .map_io = omap5_map_io,
236 .init_early = dra7xx_init_early,
237 .init_irq = omap_gic_of_init,
238 .init_machine = omap_generic_init,
239 .init_time = omap5_realtime_timer_init,
240 .dt_compat = dra7xx_boards_compat,
241 .restart = omap44xx_restart,
242MACHINE_END
243#endif
diff --git a/arch/arm/mach-omap2/board-h4.c b/arch/arm/mach-omap2/board-h4.c
index 69c0acf5aa63..87e41a8b8d46 100644
--- a/arch/arm/mach-omap2/board-h4.c
+++ b/arch/arm/mach-omap2/board-h4.c
@@ -194,30 +194,48 @@ static struct platform_device h4_flash_device = {
194 .resource = &h4_flash_resource, 194 .resource = &h4_flash_resource,
195}; 195};
196 196
197static struct platform_device *h4_devices[] __initdata = { 197static const struct display_timing cm_t35_lcd_videomode = {
198 &h4_flash_device, 198 .pixelclock = { 0, 6250000, 0 },
199
200 .hactive = { 0, 240, 0 },
201 .hfront_porch = { 0, 15, 0 },
202 .hback_porch = { 0, 60, 0 },
203 .hsync_len = { 0, 15, 0 },
204
205 .vactive = { 0, 320, 0 },
206 .vfront_porch = { 0, 1, 0 },
207 .vback_porch = { 0, 1, 0 },
208 .vsync_len = { 0, 1, 0 },
209
210 .flags = DISPLAY_FLAGS_HSYNC_HIGH | DISPLAY_FLAGS_VSYNC_HIGH |
211 DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE,
199}; 212};
200 213
201static struct panel_generic_dpi_data h4_panel_data = { 214static struct panel_dpi_platform_data cm_t35_lcd_pdata = {
202 .name = "h4", 215 .name = "lcd",
216 .source = "dpi.0",
217
218 .data_lines = 16,
219
220 .display_timing = &cm_t35_lcd_videomode,
221
222 .enable_gpio = -1,
223 .backlight_gpio = -1,
203}; 224};
204 225
205static struct omap_dss_device h4_lcd_device = { 226static struct platform_device cm_t35_lcd_device = {
206 .name = "lcd", 227 .name = "panel-dpi",
207 .driver_name = "generic_dpi_panel", 228 .id = 0,
208 .type = OMAP_DISPLAY_TYPE_DPI, 229 .dev.platform_data = &cm_t35_lcd_pdata,
209 .phy.dpi.data_lines = 16,
210 .data = &h4_panel_data,
211}; 230};
212 231
213static struct omap_dss_device *h4_dss_devices[] = { 232static struct platform_device *h4_devices[] __initdata = {
214 &h4_lcd_device, 233 &h4_flash_device,
234 &cm_t35_lcd_device,
215}; 235};
216 236
217static struct omap_dss_board_info h4_dss_data = { 237static struct omap_dss_board_info h4_dss_data = {
218 .num_devices = ARRAY_SIZE(h4_dss_devices), 238 .default_display_name = "lcd",
219 .devices = h4_dss_devices,
220 .default_device = &h4_lcd_device,
221}; 239};
222 240
223/* 2420 Sysboot setup (2430 is different) */ 241/* 2420 Sysboot setup (2430 is different) */
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c
index 87e65dde8e13..06dbb2d3d38b 100644
--- a/arch/arm/mach-omap2/board-igep0020.c
+++ b/arch/arm/mach-omap2/board-igep0020.c
@@ -429,31 +429,39 @@ static struct twl4030_gpio_platform_data igep_twl4030_gpio_pdata = {
429 .setup = igep_twl_gpio_setup, 429 .setup = igep_twl_gpio_setup,
430}; 430};
431 431
432static struct tfp410_platform_data dvi_panel = { 432static struct connector_dvi_platform_data omap3stalker_dvi_connector_pdata = {
433 .i2c_bus_num = 3, 433 .name = "dvi",
434 .power_down_gpio = IGEP2_GPIO_DVI_PUP, 434 .source = "tfp410.0",
435 .i2c_bus_num = 3,
435}; 436};
436 437
437static struct omap_dss_device igep2_dvi_device = { 438static struct platform_device omap3stalker_dvi_connector_device = {
438 .type = OMAP_DISPLAY_TYPE_DPI, 439 .name = "connector-dvi",
439 .name = "dvi", 440 .id = 0,
440 .driver_name = "tfp410", 441 .dev.platform_data = &omap3stalker_dvi_connector_pdata,
441 .data = &dvi_panel,
442 .phy.dpi.data_lines = 24,
443}; 442};
444 443
445static struct omap_dss_device *igep2_dss_devices[] = { 444static struct encoder_tfp410_platform_data omap3stalker_tfp410_pdata = {
446 &igep2_dvi_device 445 .name = "tfp410.0",
446 .source = "dpi.0",
447 .data_lines = 24,
448 .power_down_gpio = IGEP2_GPIO_DVI_PUP,
449};
450
451static struct platform_device omap3stalker_tfp410_device = {
452 .name = "tfp410",
453 .id = 0,
454 .dev.platform_data = &omap3stalker_tfp410_pdata,
447}; 455};
448 456
449static struct omap_dss_board_info igep2_dss_data = { 457static struct omap_dss_board_info igep2_dss_data = {
450 .num_devices = ARRAY_SIZE(igep2_dss_devices), 458 .default_display_name = "dvi",
451 .devices = igep2_dss_devices,
452 .default_device = &igep2_dvi_device,
453}; 459};
454 460
455static struct platform_device *igep_devices[] __initdata = { 461static struct platform_device *igep_devices[] __initdata = {
456 &igep_vwlan_device, 462 &igep_vwlan_device,
463 &omap3stalker_tfp410_device,
464 &omap3stalker_dvi_connector_device,
457}; 465};
458 466
459static int igep2_keymap[] = { 467static int igep2_keymap[] = {
diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c
index 62e4f701b63b..dd8da2c5399f 100644
--- a/arch/arm/mach-omap2/board-ldp.c
+++ b/arch/arm/mach-omap2/board-ldp.c
@@ -184,45 +184,70 @@ static inline void __init ldp_init_smsc911x(void)
184#define LCD_PANEL_RESET_GPIO 55 184#define LCD_PANEL_RESET_GPIO 55
185#define LCD_PANEL_QVGA_GPIO 56 185#define LCD_PANEL_QVGA_GPIO 56
186 186
187static struct panel_generic_dpi_data ldp_panel_data = { 187static const struct display_timing ldp_lcd_videomode = {
188 .name = "nec_nl2432dr22-11b", 188 .pixelclock = { 0, 5400000, 0 },
189 .num_gpios = 4, 189
190 /* gpios filled in code */ 190 .hactive = { 0, 240, 0 },
191 .hfront_porch = { 0, 3, 0 },
192 .hback_porch = { 0, 39, 0 },
193 .hsync_len = { 0, 3, 0 },
194
195 .vactive = { 0, 320, 0 },
196 .vfront_porch = { 0, 2, 0 },
197 .vback_porch = { 0, 7, 0 },
198 .vsync_len = { 0, 1, 0 },
199
200 .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
201 DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE,
191}; 202};
192 203
193static struct omap_dss_device ldp_lcd_device = { 204static struct panel_dpi_platform_data ldp_lcd_pdata = {
194 .name = "lcd", 205 .name = "lcd",
195 .driver_name = "generic_dpi_panel", 206 .source = "dpi.0",
196 .type = OMAP_DISPLAY_TYPE_DPI, 207
197 .phy.dpi.data_lines = 18, 208 .data_lines = 18,
198 .data = &ldp_panel_data, 209
210 .display_timing = &ldp_lcd_videomode,
211
212 .enable_gpio = -1, /* filled in code */
213 .backlight_gpio = -1, /* filled in code */
199}; 214};
200 215
201static struct omap_dss_device *ldp_dss_devices[] = { 216static struct platform_device ldp_lcd_device = {
202 &ldp_lcd_device, 217 .name = "panel-dpi",
218 .id = 0,
219 .dev.platform_data = &ldp_lcd_pdata,
203}; 220};
204 221
205static struct omap_dss_board_info ldp_dss_data = { 222static struct omap_dss_board_info ldp_dss_data = {
206 .num_devices = ARRAY_SIZE(ldp_dss_devices), 223 .default_display_name = "lcd",
207 .devices = ldp_dss_devices,
208 .default_device = &ldp_lcd_device,
209}; 224};
210 225
211static void __init ldp_display_init(void) 226static void __init ldp_display_init(void)
212{ 227{
213 ldp_panel_data.gpios[2] = LCD_PANEL_RESET_GPIO; 228 int r;
214 ldp_panel_data.gpios[3] = LCD_PANEL_QVGA_GPIO; 229
230 static struct gpio gpios[] __initdata = {
231 {LCD_PANEL_RESET_GPIO, GPIOF_OUT_INIT_HIGH, "LCD RESET"},
232 {LCD_PANEL_QVGA_GPIO, GPIOF_OUT_INIT_HIGH, "LCD QVGA"},
233 };
234
235 r = gpio_request_array(gpios, ARRAY_SIZE(gpios));
236 if (r) {
237 pr_err("Cannot request LCD GPIOs, error %d\n", r);
238 return;
239 }
215 240
216 omap_display_init(&ldp_dss_data); 241 omap_display_init(&ldp_dss_data);
217} 242}
218 243
219static int ldp_twl_gpio_setup(struct device *dev, unsigned gpio, unsigned ngpio) 244static int ldp_twl_gpio_setup(struct device *dev, unsigned gpio, unsigned ngpio)
220{ 245{
221 ldp_panel_data.gpios[0] = gpio + 7; 246 /* LCD enable GPIO */
222 ldp_panel_data.gpio_invert[0] = true; 247 ldp_lcd_pdata.enable_gpio = gpio + 7;
223 248
224 ldp_panel_data.gpios[1] = gpio + 15; 249 /* Backlight enable GPIO */
225 ldp_panel_data.gpio_invert[1] = true; 250 ldp_lcd_pdata.backlight_gpio = gpio + 15;
226 251
227 return 0; 252 return 0;
228} 253}
@@ -322,6 +347,7 @@ static struct omap2_hsmmc_info mmc[] __initdata = {
322 347
323static struct platform_device *ldp_devices[] __initdata = { 348static struct platform_device *ldp_devices[] __initdata = {
324 &ldp_gpio_keys_device, 349 &ldp_gpio_keys_device,
350 &ldp_lcd_device,
325}; 351};
326 352
327#ifdef CONFIG_OMAP_MUX 353#ifdef CONFIG_OMAP_MUX
diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
index 04c116555412..f26918467efc 100644
--- a/arch/arm/mach-omap2/board-omap3beagle.c
+++ b/arch/arm/mach-omap2/board-omap3beagle.c
@@ -33,7 +33,7 @@
33#include <linux/mtd/nand.h> 33#include <linux/mtd/nand.h>
34#include <linux/mmc/host.h> 34#include <linux/mmc/host.h>
35#include <linux/usb/phy.h> 35#include <linux/usb/phy.h>
36#include <linux/usb/nop-usb-xceiv.h> 36#include <linux/usb/usb_phy_gen_xceiv.h>
37 37
38#include <linux/regulator/machine.h> 38#include <linux/regulator/machine.h>
39#include <linux/i2c/twl.h> 39#include <linux/i2c/twl.h>
@@ -225,35 +225,46 @@ static struct mtd_partition omap3beagle_nand_partitions[] = {
225 225
226/* DSS */ 226/* DSS */
227 227
228static struct tfp410_platform_data dvi_panel = { 228static struct connector_dvi_platform_data beagle_dvi_connector_pdata = {
229 .i2c_bus_num = 3, 229 .name = "dvi",
230 .power_down_gpio = -1, 230 .source = "tfp410.0",
231 .i2c_bus_num = 3,
231}; 232};
232 233
233static struct omap_dss_device beagle_dvi_device = { 234static struct platform_device beagle_dvi_connector_device = {
234 .type = OMAP_DISPLAY_TYPE_DPI, 235 .name = "connector-dvi",
235 .name = "dvi", 236 .id = 0,
236 .driver_name = "tfp410", 237 .dev.platform_data = &beagle_dvi_connector_pdata,
237 .data = &dvi_panel,
238 .phy.dpi.data_lines = 24,
239}; 238};
240 239
241static struct omap_dss_device beagle_tv_device = { 240static struct encoder_tfp410_platform_data beagle_tfp410_pdata = {
241 .name = "tfp410.0",
242 .source = "dpi.0",
243 .data_lines = 24,
244 .power_down_gpio = -1,
245};
246
247static struct platform_device beagle_tfp410_device = {
248 .name = "tfp410",
249 .id = 0,
250 .dev.platform_data = &beagle_tfp410_pdata,
251};
252
253static struct connector_atv_platform_data beagle_tv_pdata = {
242 .name = "tv", 254 .name = "tv",
243 .driver_name = "venc", 255 .source = "venc.0",
244 .type = OMAP_DISPLAY_TYPE_VENC, 256 .connector_type = OMAP_DSS_VENC_TYPE_SVIDEO,
245 .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO, 257 .invert_polarity = false,
246}; 258};
247 259
248static struct omap_dss_device *beagle_dss_devices[] = { 260static struct platform_device beagle_tv_connector_device = {
249 &beagle_dvi_device, 261 .name = "connector-analog-tv",
250 &beagle_tv_device, 262 .id = 0,
263 .dev.platform_data = &beagle_tv_pdata,
251}; 264};
252 265
253static struct omap_dss_board_info beagle_dss_data = { 266static struct omap_dss_board_info beagle_dss_data = {
254 .num_devices = ARRAY_SIZE(beagle_dss_devices), 267 .default_display_name = "dvi",
255 .devices = beagle_dss_devices,
256 .default_device = &beagle_dvi_device,
257}; 268};
258 269
259#include "sdram-micron-mt46h32m32lf-6.h" 270#include "sdram-micron-mt46h32m32lf-6.h"
@@ -279,7 +290,7 @@ static struct regulator_consumer_supply beagle_vsim_supply[] = {
279static struct gpio_led gpio_leds[]; 290static struct gpio_led gpio_leds[];
280 291
281/* PHY's VCC regulator might be added later, so flag that we need it */ 292/* PHY's VCC regulator might be added later, so flag that we need it */
282static struct nop_usb_xceiv_platform_data hsusb2_phy_data = { 293static struct usb_phy_gen_xceiv_platform_data hsusb2_phy_data = {
283 .needs_vcc = true, 294 .needs_vcc = true,
284}; 295};
285 296
@@ -332,7 +343,11 @@ static int beagle_twl_gpio_setup(struct device *dev,
332 if (gpio_request_one(gpio + 1, GPIOF_IN, "EHCI_nOC")) 343 if (gpio_request_one(gpio + 1, GPIOF_IN, "EHCI_nOC"))
333 pr_err("%s: unable to configure EHCI_nOC\n", __func__); 344 pr_err("%s: unable to configure EHCI_nOC\n", __func__);
334 } 345 }
335 dvi_panel.power_down_gpio = beagle_config.dvi_pd_gpio; 346 beagle_tfp410_pdata.power_down_gpio = beagle_config.dvi_pd_gpio;
347
348 platform_device_register(&beagle_tfp410_device);
349 platform_device_register(&beagle_dvi_connector_device);
350 platform_device_register(&beagle_tv_connector_device);
336 351
337 /* TWL4030_GPIO_MAX i.e. LED_GPO controls HS USB Port 2 power */ 352 /* TWL4030_GPIO_MAX i.e. LED_GPO controls HS USB Port 2 power */
338 phy_data[0].vcc_gpio = gpio + TWL4030_GPIO_MAX; 353 phy_data[0].vcc_gpio = gpio + TWL4030_GPIO_MAX;
@@ -547,6 +562,7 @@ static void __init omap3_beagle_init(void)
547 if (gpio_is_valid(beagle_config.dvi_pd_gpio)) 562 if (gpio_is_valid(beagle_config.dvi_pd_gpio))
548 omap_mux_init_gpio(beagle_config.dvi_pd_gpio, OMAP_PIN_OUTPUT); 563 omap_mux_init_gpio(beagle_config.dvi_pd_gpio, OMAP_PIN_OUTPUT);
549 omap_display_init(&beagle_dss_data); 564 omap_display_init(&beagle_dss_data);
565
550 omap_serial_init(); 566 omap_serial_init();
551 omap_sdrc_init(mt46h32m32lf6_sdrc_params, 567 omap_sdrc_init(mt46h32m32lf6_sdrc_params,
552 mt46h32m32lf6_sdrc_params); 568 mt46h32m32lf6_sdrc_params);
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c
index 8c026269baca..18143873346c 100644
--- a/arch/arm/mach-omap2/board-omap3evm.c
+++ b/arch/arm/mach-omap2/board-omap3evm.c
@@ -33,7 +33,7 @@
33#include <linux/i2c/twl.h> 33#include <linux/i2c/twl.h>
34#include <linux/usb/otg.h> 34#include <linux/usb/otg.h>
35#include <linux/usb/musb.h> 35#include <linux/usb/musb.h>
36#include <linux/usb/nop-usb-xceiv.h> 36#include <linux/usb/usb_phy_gen_xceiv.h>
37#include <linux/smsc911x.h> 37#include <linux/smsc911x.h>
38 38
39#include <linux/wl12xx.h> 39#include <linux/wl12xx.h>
@@ -166,14 +166,6 @@ static inline void __init omap3evm_init_smsc911x(void) { return; }
166 */ 166 */
167#define OMAP3EVM_DVI_PANEL_EN_GPIO 199 167#define OMAP3EVM_DVI_PANEL_EN_GPIO 199
168 168
169static struct panel_sharp_ls037v7dw01_data omap3_evm_lcd_data = {
170 .resb_gpio = OMAP3EVM_LCD_PANEL_RESB,
171 .ini_gpio = OMAP3EVM_LCD_PANEL_INI,
172 .mo_gpio = OMAP3EVM_LCD_PANEL_QVGA,
173 .lr_gpio = OMAP3EVM_LCD_PANEL_LR,
174 .ud_gpio = OMAP3EVM_LCD_PANEL_UD,
175};
176
177#ifdef CONFIG_BROKEN 169#ifdef CONFIG_BROKEN
178static void __init omap3_evm_display_init(void) 170static void __init omap3_evm_display_init(void)
179{ 171{
@@ -196,44 +188,65 @@ static void __init omap3_evm_display_init(void)
196} 188}
197#endif 189#endif
198 190
199static struct omap_dss_device omap3_evm_lcd_device = { 191static struct panel_sharp_ls037v7dw01_platform_data omap3_evm_lcd_pdata = {
200 .name = "lcd", 192 .name = "lcd",
201 .driver_name = "sharp_ls_panel", 193 .source = "dpi.0",
202 .type = OMAP_DISPLAY_TYPE_DPI, 194
203 .phy.dpi.data_lines = 18, 195 .data_lines = 18,
204 .data = &omap3_evm_lcd_data, 196
197 .resb_gpio = OMAP3EVM_LCD_PANEL_RESB,
198 .ini_gpio = OMAP3EVM_LCD_PANEL_INI,
199 .mo_gpio = OMAP3EVM_LCD_PANEL_QVGA,
200 .lr_gpio = OMAP3EVM_LCD_PANEL_LR,
201 .ud_gpio = OMAP3EVM_LCD_PANEL_UD,
202};
203
204static struct platform_device omap3_evm_lcd_device = {
205 .name = "panel-sharp-ls037v7dw01",
206 .id = 0,
207 .dev.platform_data = &omap3_evm_lcd_pdata,
208};
209
210static struct connector_dvi_platform_data omap3_evm_dvi_connector_pdata = {
211 .name = "dvi",
212 .source = "tfp410.0",
213 .i2c_bus_num = -1,
214};
215
216static struct platform_device omap3_evm_dvi_connector_device = {
217 .name = "connector-dvi",
218 .id = 0,
219 .dev.platform_data = &omap3_evm_dvi_connector_pdata,
205}; 220};
206 221
207static struct omap_dss_device omap3_evm_tv_device = { 222static struct encoder_tfp410_platform_data omap3_evm_tfp410_pdata = {
208 .name = "tv", 223 .name = "tfp410.0",
209 .driver_name = "venc", 224 .source = "dpi.0",
210 .type = OMAP_DISPLAY_TYPE_VENC, 225 .data_lines = 24,
211 .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO, 226 .power_down_gpio = OMAP3EVM_DVI_PANEL_EN_GPIO,
212}; 227};
213 228
214static struct tfp410_platform_data dvi_panel = { 229static struct platform_device omap3_evm_tfp410_device = {
215 .power_down_gpio = OMAP3EVM_DVI_PANEL_EN_GPIO, 230 .name = "tfp410",
216 .i2c_bus_num = -1, 231 .id = 0,
232 .dev.platform_data = &omap3_evm_tfp410_pdata,
217}; 233};
218 234
219static struct omap_dss_device omap3_evm_dvi_device = { 235static struct connector_atv_platform_data omap3_evm_tv_pdata = {
220 .name = "dvi", 236 .name = "tv",
221 .type = OMAP_DISPLAY_TYPE_DPI, 237 .source = "venc.0",
222 .driver_name = "tfp410", 238 .connector_type = OMAP_DSS_VENC_TYPE_SVIDEO,
223 .data = &dvi_panel, 239 .invert_polarity = false,
224 .phy.dpi.data_lines = 24,
225}; 240};
226 241
227static struct omap_dss_device *omap3_evm_dss_devices[] = { 242static struct platform_device omap3_evm_tv_connector_device = {
228 &omap3_evm_lcd_device, 243 .name = "connector-analog-tv",
229 &omap3_evm_tv_device, 244 .id = 0,
230 &omap3_evm_dvi_device, 245 .dev.platform_data = &omap3_evm_tv_pdata,
231}; 246};
232 247
233static struct omap_dss_board_info omap3_evm_dss_data = { 248static struct omap_dss_board_info omap3_evm_dss_data = {
234 .num_devices = ARRAY_SIZE(omap3_evm_dss_devices), 249 .default_display_name = "lcd",
235 .devices = omap3_evm_dss_devices,
236 .default_device = &omap3_evm_lcd_device,
237}; 250};
238 251
239static struct regulator_consumer_supply omap3evm_vmmc1_supply[] = { 252static struct regulator_consumer_supply omap3evm_vmmc1_supply[] = {
@@ -468,7 +481,7 @@ struct wl12xx_platform_data omap3evm_wlan_data __initdata = {
468static struct regulator_consumer_supply omap3evm_vaux2_supplies[] = { 481static struct regulator_consumer_supply omap3evm_vaux2_supplies[] = {
469 REGULATOR_SUPPLY("VDD_CSIPHY1", "omap3isp"), /* OMAP ISP */ 482 REGULATOR_SUPPLY("VDD_CSIPHY1", "omap3isp"), /* OMAP ISP */
470 REGULATOR_SUPPLY("VDD_CSIPHY2", "omap3isp"), /* OMAP ISP */ 483 REGULATOR_SUPPLY("VDD_CSIPHY2", "omap3isp"), /* OMAP ISP */
471 REGULATOR_SUPPLY("vcc", "nop_usb_xceiv.2"), /* hsusb port 2 */ 484 REGULATOR_SUPPLY("vcc", "usb_phy_gen_xceiv.2"), /* hsusb port 2 */
472 REGULATOR_SUPPLY("vaux2", NULL), 485 REGULATOR_SUPPLY("vaux2", NULL),
473}; 486};
474 487
@@ -678,6 +691,10 @@ static void __init omap3_evm_init(void)
678 omap3_evm_i2c_init(); 691 omap3_evm_i2c_init();
679 692
680 omap_display_init(&omap3_evm_dss_data); 693 omap_display_init(&omap3_evm_dss_data);
694 platform_device_register(&omap3_evm_lcd_device);
695 platform_device_register(&omap3_evm_tfp410_device);
696 platform_device_register(&omap3_evm_dvi_connector_device);
697 platform_device_register(&omap3_evm_tv_connector_device);
681 698
682 omap_serial_init(); 699 omap_serial_init();
683 omap_sdrc_init(mt46h32m32lf6_sdrc_params, NULL); 700 omap_sdrc_init(mt46h32m32lf6_sdrc_params, NULL);
diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-omap2/board-omap3pandora.c
index b1547a0edfcd..de1bc6bbe585 100644
--- a/arch/arm/mach-omap2/board-omap3pandora.c
+++ b/arch/arm/mach-omap2/board-omap3pandora.c
@@ -231,34 +231,21 @@ static struct twl4030_keypad_data pandora_kp_data = {
231 .rep = 1, 231 .rep = 1,
232}; 232};
233 233
234static struct panel_tpo_td043_data lcd_data = { 234static struct connector_atv_platform_data pandora_tv_pdata = {
235 .nreset_gpio = 157, 235 .name = "tv",
236}; 236 .source = "venc.0",
237 237 .connector_type = OMAP_DSS_VENC_TYPE_SVIDEO,
238static struct omap_dss_device pandora_lcd_device = { 238 .invert_polarity = false,
239 .name = "lcd",
240 .driver_name = "tpo_td043mtea1_panel",
241 .type = OMAP_DISPLAY_TYPE_DPI,
242 .phy.dpi.data_lines = 24,
243 .data = &lcd_data,
244};
245
246static struct omap_dss_device pandora_tv_device = {
247 .name = "tv",
248 .driver_name = "venc",
249 .type = OMAP_DISPLAY_TYPE_VENC,
250 .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
251}; 239};
252 240
253static struct omap_dss_device *pandora_dss_devices[] = { 241static struct platform_device pandora_tv_connector_device = {
254 &pandora_lcd_device, 242 .name = "connector-analog-tv",
255 &pandora_tv_device, 243 .id = 0,
244 .dev.platform_data = &pandora_tv_pdata,
256}; 245};
257 246
258static struct omap_dss_board_info pandora_dss_data = { 247static struct omap_dss_board_info pandora_dss_data = {
259 .num_devices = ARRAY_SIZE(pandora_dss_devices), 248 .default_display_name = "lcd",
260 .devices = pandora_dss_devices,
261 .default_device = &pandora_lcd_device,
262}; 249};
263 250
264static void pandora_wl1251_init_card(struct mmc_card *card) 251static void pandora_wl1251_init_card(struct mmc_card *card)
@@ -348,11 +335,11 @@ static struct regulator_consumer_supply pandora_vdds_supplies[] = {
348}; 335};
349 336
350static struct regulator_consumer_supply pandora_vcc_lcd_supply[] = { 337static struct regulator_consumer_supply pandora_vcc_lcd_supply[] = {
351 REGULATOR_SUPPLY("vcc", "display0"), 338 REGULATOR_SUPPLY("vcc", "spi1.1"),
352}; 339};
353 340
354static struct regulator_consumer_supply pandora_usb_phy_supply[] = { 341static struct regulator_consumer_supply pandora_usb_phy_supply[] = {
355 REGULATOR_SUPPLY("vcc", "nop_usb_xceiv.2"), /* hsusb port 2 */ 342 REGULATOR_SUPPLY("vcc", "usb_phy_gen_xceiv.2"), /* hsusb port 2 */
356}; 343};
357 344
358/* ads7846 on SPI and 2 nub controllers on I2C */ 345/* ads7846 on SPI and 2 nub controllers on I2C */
@@ -529,13 +516,21 @@ static int __init omap3pandora_i2c_init(void)
529 return 0; 516 return 0;
530} 517}
531 518
519static struct panel_tpo_td043mtea1_platform_data pandora_lcd_pdata = {
520 .name = "lcd",
521 .source = "dpi.0",
522
523 .data_lines = 24,
524 .nreset_gpio = 157,
525};
526
532static struct spi_board_info omap3pandora_spi_board_info[] __initdata = { 527static struct spi_board_info omap3pandora_spi_board_info[] __initdata = {
533 { 528 {
534 .modalias = "tpo_td043mtea1_panel_spi", 529 .modalias = "panel-tpo-td043mtea1",
535 .bus_num = 1, 530 .bus_num = 1,
536 .chip_select = 1, 531 .chip_select = 1,
537 .max_speed_hz = 375000, 532 .max_speed_hz = 375000,
538 .platform_data = &pandora_lcd_device, 533 .platform_data = &pandora_lcd_pdata,
539 } 534 }
540}; 535};
541 536
@@ -580,6 +575,7 @@ static struct platform_device *omap3pandora_devices[] __initdata = {
580 &pandora_keys_gpio, 575 &pandora_keys_gpio,
581 &pandora_vwlan_device, 576 &pandora_vwlan_device,
582 &pandora_backlight, 577 &pandora_backlight,
578 &pandora_tv_connector_device,
583}; 579};
584 580
585static struct usbhs_omap_platform_data usbhs_bdata __initdata = { 581static struct usbhs_omap_platform_data usbhs_bdata __initdata = {
diff --git a/arch/arm/mach-omap2/board-omap3stalker.c b/arch/arm/mach-omap2/board-omap3stalker.c
index d37e6b187ae4..ba8342fef799 100644
--- a/arch/arm/mach-omap2/board-omap3stalker.c
+++ b/arch/arm/mach-omap2/board-omap3stalker.c
@@ -93,40 +93,50 @@ static void __init omap3_stalker_display_init(void)
93{ 93{
94 return; 94 return;
95} 95}
96static struct connector_dvi_platform_data omap3stalker_dvi_connector_pdata = {
97 .name = "dvi",
98 .source = "tfp410.0",
99 .i2c_bus_num = -1,
100};
96 101
97static struct omap_dss_device omap3_stalker_tv_device = { 102static struct platform_device omap3stalker_dvi_connector_device = {
98 .name = "tv", 103 .name = "connector-dvi",
99 .driver_name = "venc", 104 .id = 0,
100 .type = OMAP_DISPLAY_TYPE_VENC, 105 .dev.platform_data = &omap3stalker_dvi_connector_pdata,
101#if defined(CONFIG_OMAP2_VENC_OUT_TYPE_SVIDEO)
102 .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
103#elif defined(CONFIG_OMAP2_VENC_OUT_TYPE_COMPOSITE)
104 .u.venc.type = OMAP_DSS_VENC_TYPE_COMPOSITE,
105#endif
106}; 106};
107 107
108static struct tfp410_platform_data dvi_panel = { 108static struct encoder_tfp410_platform_data omap3stalker_tfp410_pdata = {
109 .power_down_gpio = DSS_ENABLE_GPIO, 109 .name = "tfp410.0",
110 .i2c_bus_num = -1, 110 .source = "dpi.0",
111 .data_lines = 24,
112 .power_down_gpio = DSS_ENABLE_GPIO,
111}; 113};
112 114
113static struct omap_dss_device omap3_stalker_dvi_device = { 115static struct platform_device omap3stalker_tfp410_device = {
114 .name = "dvi", 116 .name = "tfp410",
115 .type = OMAP_DISPLAY_TYPE_DPI, 117 .id = 0,
116 .driver_name = "tfp410", 118 .dev.platform_data = &omap3stalker_tfp410_pdata,
117 .data = &dvi_panel, 119};
118 .phy.dpi.data_lines = 24, 120
121static struct connector_atv_platform_data omap3stalker_tv_pdata = {
122 .name = "tv",
123 .source = "venc.0",
124#if defined(CONFIG_OMAP2_VENC_OUT_TYPE_SVIDEO)
125 .connector_type = OMAP_DSS_VENC_TYPE_SVIDEO,
126#elif defined(CONFIG_OMAP2_VENC_OUT_TYPE_COMPOSITE)
127 .connector_type = OMAP_DSS_VENC_TYPE_COMPOSITE,
128#endif
129 .invert_polarity = false,
119}; 130};
120 131
121static struct omap_dss_device *omap3_stalker_dss_devices[] = { 132static struct platform_device omap3stalker_tv_connector_device = {
122 &omap3_stalker_tv_device, 133 .name = "connector-analog-tv",
123 &omap3_stalker_dvi_device, 134 .id = 0,
135 .dev.platform_data = &omap3stalker_tv_pdata,
124}; 136};
125 137
126static struct omap_dss_board_info omap3_stalker_dss_data = { 138static struct omap_dss_board_info omap3_stalker_dss_data = {
127 .num_devices = ARRAY_SIZE(omap3_stalker_dss_devices), 139 .default_display_name = "dvi",
128 .devices = omap3_stalker_dss_devices,
129 .default_device = &omap3_stalker_dvi_device,
130}; 140};
131 141
132static struct regulator_consumer_supply omap3stalker_vmmc1_supply[] = { 142static struct regulator_consumer_supply omap3stalker_vmmc1_supply[] = {
@@ -356,6 +366,9 @@ static struct usbhs_phy_data phy_data[] __initdata = {
356 366
357static struct platform_device *omap3_stalker_devices[] __initdata = { 367static struct platform_device *omap3_stalker_devices[] __initdata = {
358 &keys_gpio, 368 &keys_gpio,
369 &omap3stalker_tfp410_device,
370 &omap3stalker_dvi_connector_device,
371 &omap3stalker_tv_connector_device,
359}; 372};
360 373
361static struct usbhs_omap_platform_data usbhs_bdata __initdata = { 374static struct usbhs_omap_platform_data usbhs_bdata __initdata = {
diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c
index 5748b5d06c23..f6d384111911 100644
--- a/arch/arm/mach-omap2/board-overo.c
+++ b/arch/arm/mach-omap2/board-overo.c
@@ -72,6 +72,9 @@
72#define OVERO_SMSC911X2_CS 4 72#define OVERO_SMSC911X2_CS 4
73#define OVERO_SMSC911X2_GPIO 65 73#define OVERO_SMSC911X2_GPIO 65
74 74
75/* whether to register LCD35 instead of LCD43 */
76static bool overo_use_lcd35;
77
75#if defined(CONFIG_TOUCHSCREEN_ADS7846) || \ 78#if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
76 defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE) 79 defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
77 80
@@ -149,78 +152,94 @@ static inline void __init overo_init_smsc911x(void) { return; }
149#define OVERO_GPIO_LCD_EN 144 152#define OVERO_GPIO_LCD_EN 144
150#define OVERO_GPIO_LCD_BL 145 153#define OVERO_GPIO_LCD_BL 145
151 154
152static struct tfp410_platform_data dvi_panel = { 155static struct connector_atv_platform_data overo_tv_pdata = {
153 .i2c_bus_num = 3, 156 .name = "tv",
154 .power_down_gpio = -1, 157 .source = "venc.0",
158 .connector_type = OMAP_DSS_VENC_TYPE_SVIDEO,
159 .invert_polarity = false,
155}; 160};
156 161
157static struct omap_dss_device overo_dvi_device = { 162static struct platform_device overo_tv_connector_device = {
158 .name = "dvi", 163 .name = "connector-analog-tv",
159 .type = OMAP_DISPLAY_TYPE_DPI, 164 .id = 0,
160 .driver_name = "tfp410", 165 .dev.platform_data = &overo_tv_pdata,
161 .data = &dvi_panel,
162 .phy.dpi.data_lines = 24,
163}; 166};
164 167
165static struct omap_dss_device overo_tv_device = { 168static const struct display_timing overo_lcd43_videomode = {
166 .name = "tv", 169 .pixelclock = { 0, 9200000, 0 },
167 .driver_name = "venc", 170
168 .type = OMAP_DISPLAY_TYPE_VENC, 171 .hactive = { 0, 480, 0 },
169 .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO, 172 .hfront_porch = { 0, 8, 0 },
173 .hback_porch = { 0, 4, 0 },
174 .hsync_len = { 0, 41, 0 },
175
176 .vactive = { 0, 272, 0 },
177 .vfront_porch = { 0, 4, 0 },
178 .vback_porch = { 0, 2, 0 },
179 .vsync_len = { 0, 10, 0 },
180
181 .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW |
182 DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE,
170}; 183};
171 184
172static struct panel_generic_dpi_data lcd43_panel = { 185static struct panel_dpi_platform_data overo_lcd43_pdata = {
173 .name = "samsung_lte430wq_f0c", 186 .name = "lcd43",
174 .num_gpios = 2, 187 .source = "dpi.0",
175 .gpios = { 188
176 OVERO_GPIO_LCD_EN, 189 .data_lines = 24,
177 OVERO_GPIO_LCD_BL 190
178 }, 191 .display_timing = &overo_lcd43_videomode,
192
193 .enable_gpio = OVERO_GPIO_LCD_EN,
194 .backlight_gpio = OVERO_GPIO_LCD_BL,
179}; 195};
180 196
181static struct omap_dss_device overo_lcd43_device = { 197static struct platform_device overo_lcd43_device = {
182 .name = "lcd43", 198 .name = "panel-dpi",
183 .type = OMAP_DISPLAY_TYPE_DPI, 199 .id = 0,
184 .driver_name = "generic_dpi_panel", 200 .dev.platform_data = &overo_lcd43_pdata,
185 .data = &lcd43_panel,
186 .phy.dpi.data_lines = 24,
187}; 201};
188 202
189#if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \ 203static struct connector_dvi_platform_data overo_dvi_connector_pdata = {
190 defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE) 204 .name = "dvi",
191static struct panel_generic_dpi_data lcd35_panel = { 205 .source = "tfp410.0",
192 .num_gpios = 2, 206 .i2c_bus_num = 3,
193 .gpios = {
194 OVERO_GPIO_LCD_EN,
195 OVERO_GPIO_LCD_BL
196 },
197}; 207};
198 208
199static struct omap_dss_device overo_lcd35_device = { 209static struct platform_device overo_dvi_connector_device = {
200 .type = OMAP_DISPLAY_TYPE_DPI, 210 .name = "connector-dvi",
201 .name = "lcd35", 211 .id = 0,
202 .driver_name = "lgphilips_lb035q02_panel", 212 .dev.platform_data = &overo_dvi_connector_pdata,
203 .phy.dpi.data_lines = 24,
204 .data = &lcd35_panel,
205}; 213};
206#endif
207 214
208static struct omap_dss_device *overo_dss_devices[] = { 215static struct encoder_tfp410_platform_data overo_tfp410_pdata = {
209 &overo_dvi_device, 216 .name = "tfp410.0",
210 &overo_tv_device, 217 .source = "dpi.0",
211#if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \ 218 .data_lines = 24,
212 defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE) 219 .power_down_gpio = -1,
213 &overo_lcd35_device, 220};
214#endif 221
215 &overo_lcd43_device, 222static struct platform_device overo_tfp410_device = {
223 .name = "tfp410",
224 .id = 0,
225 .dev.platform_data = &overo_tfp410_pdata,
216}; 226};
217 227
218static struct omap_dss_board_info overo_dss_data = { 228static struct omap_dss_board_info overo_dss_data = {
219 .num_devices = ARRAY_SIZE(overo_dss_devices), 229 .default_display_name = "lcd43",
220 .devices = overo_dss_devices,
221 .default_device = &overo_dvi_device,
222}; 230};
223 231
232static void __init overo_display_init(void)
233{
234 omap_display_init(&overo_dss_data);
235
236 if (!overo_use_lcd35)
237 platform_device_register(&overo_lcd43_device);
238 platform_device_register(&overo_tfp410_device);
239 platform_device_register(&overo_dvi_connector_device);
240 platform_device_register(&overo_tv_connector_device);
241}
242
224static struct mtd_partition overo_nand_partitions[] = { 243static struct mtd_partition overo_nand_partitions[] = {
225 { 244 {
226 .name = "xloader", 245 .name = "xloader",
@@ -408,24 +427,41 @@ static int __init overo_i2c_init(void)
408 return 0; 427 return 0;
409} 428}
410 429
430static struct panel_lb035q02_platform_data overo_lcd35_pdata = {
431 .name = "lcd35",
432 .source = "dpi.0",
433
434 .data_lines = 24,
435
436 .enable_gpio = OVERO_GPIO_LCD_EN,
437 .backlight_gpio = OVERO_GPIO_LCD_BL,
438};
439
440/*
441 * NOTE: We need to add either the lgphilips panel, or the lcd43 panel. The
442 * selection is done based on the overo_use_lcd35 field. If new SPI
443 * devices are added here, extra work is needed to make only the lgphilips panel
444 * affected by the overo_use_lcd35 field.
445 */
411static struct spi_board_info overo_spi_board_info[] __initdata = { 446static struct spi_board_info overo_spi_board_info[] __initdata = {
412#if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \
413 defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE)
414 { 447 {
415 .modalias = "lgphilips_lb035q02_panel-spi", 448 .modalias = "panel_lgphilips_lb035q02",
416 .bus_num = 1, 449 .bus_num = 1,
417 .chip_select = 1, 450 .chip_select = 1,
418 .max_speed_hz = 500000, 451 .max_speed_hz = 500000,
419 .mode = SPI_MODE_3, 452 .mode = SPI_MODE_3,
453 .platform_data = &overo_lcd35_pdata,
420 }, 454 },
421#endif
422}; 455};
423 456
424static int __init overo_spi_init(void) 457static int __init overo_spi_init(void)
425{ 458{
426 overo_ads7846_init(); 459 overo_ads7846_init();
427 spi_register_board_info(overo_spi_board_info, 460
428 ARRAY_SIZE(overo_spi_board_info)); 461 if (overo_use_lcd35) {
462 spi_register_board_info(overo_spi_board_info,
463 ARRAY_SIZE(overo_spi_board_info));
464 }
429 return 0; 465 return 0;
430} 466}
431 467
@@ -463,11 +499,13 @@ static void __init overo_init(void)
463{ 499{
464 int ret; 500 int ret;
465 501
502 if (strstr(boot_command_line, "omapdss.def_disp=lcd35"))
503 overo_use_lcd35 = true;
504
466 regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); 505 regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies));
467 omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); 506 omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
468 overo_i2c_init(); 507 overo_i2c_init();
469 omap_hsmmc_init(mmc); 508 omap_hsmmc_init(mmc);
470 omap_display_init(&overo_dss_data);
471 omap_serial_init(); 509 omap_serial_init();
472 omap_sdrc_init(mt46h32m32lf6_sdrc_params, 510 omap_sdrc_init(mt46h32m32lf6_sdrc_params,
473 mt46h32m32lf6_sdrc_params); 511 mt46h32m32lf6_sdrc_params);
@@ -484,6 +522,8 @@ static void __init overo_init(void)
484 overo_init_keys(); 522 overo_init_keys();
485 omap_twl4030_audio_init("overo", NULL); 523 omap_twl4030_audio_init("overo", NULL);
486 524
525 overo_display_init();
526
487 /* Ensure SDRC pins are mux'd for self-refresh */ 527 /* Ensure SDRC pins are mux'd for self-refresh */
488 omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT); 528 omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
489 omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT); 529 omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT);
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c
index 9c2dd102fbbb..c3270c0f1fce 100644
--- a/arch/arm/mach-omap2/board-rx51-peripherals.c
+++ b/arch/arm/mach-omap2/board-rx51-peripherals.c
@@ -45,6 +45,8 @@
45#include <linux/platform_data/tsl2563.h> 45#include <linux/platform_data/tsl2563.h>
46#include <linux/lis3lv02d.h> 46#include <linux/lis3lv02d.h>
47 47
48#include <video/omap-panel-data.h>
49
48#if defined(CONFIG_IR_RX51) || defined(CONFIG_IR_RX51_MODULE) 50#if defined(CONFIG_IR_RX51) || defined(CONFIG_IR_RX51_MODULE)
49#include <media/ir-rx51.h> 51#include <media/ir-rx51.h>
50#endif 52#endif
@@ -226,6 +228,15 @@ static struct lp55xx_platform_data rx51_lp5523_platform_data = {
226}; 228};
227#endif 229#endif
228 230
231#define RX51_LCD_RESET_GPIO 90
232
233static struct panel_acx565akm_platform_data acx_pdata = {
234 .name = "lcd",
235 .source = "sdi.0",
236 .reset_gpio = RX51_LCD_RESET_GPIO,
237 .datapairs = 2,
238};
239
229static struct omap2_mcspi_device_config wl1251_mcspi_config = { 240static struct omap2_mcspi_device_config wl1251_mcspi_config = {
230 .turbo_mode = 0, 241 .turbo_mode = 0,
231}; 242};
@@ -254,6 +265,7 @@ static struct spi_board_info rx51_peripherals_spi_board_info[] __initdata = {
254 .chip_select = 2, 265 .chip_select = 2,
255 .max_speed_hz = 6000000, 266 .max_speed_hz = 6000000,
256 .controller_data = &mipid_mcspi_config, 267 .controller_data = &mipid_mcspi_config,
268 .platform_data = &acx_pdata,
257 }, 269 },
258 [RX51_SPI_TSC2005] = { 270 [RX51_SPI_TSC2005] = {
259 .modalias = "tsc2005", 271 .modalias = "tsc2005",
diff --git a/arch/arm/mach-omap2/board-rx51-video.c b/arch/arm/mach-omap2/board-rx51-video.c
index bdd1e3a179e1..43a90c8d6837 100644
--- a/arch/arm/mach-omap2/board-rx51-video.c
+++ b/arch/arm/mach-omap2/board-rx51-video.c
@@ -29,34 +29,21 @@
29 29
30#if defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE) 30#if defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE)
31 31
32static struct panel_acx565akm_data lcd_data = { 32static struct connector_atv_platform_data rx51_tv_pdata = {
33 .reset_gpio = RX51_LCD_RESET_GPIO, 33 .name = "tv",
34 .source = "venc.0",
35 .connector_type = OMAP_DSS_VENC_TYPE_COMPOSITE,
36 .invert_polarity = false,
34}; 37};
35 38
36static struct omap_dss_device rx51_lcd_device = { 39static struct platform_device rx51_tv_connector_device = {
37 .name = "lcd", 40 .name = "connector-analog-tv",
38 .driver_name = "panel-acx565akm", 41 .id = 0,
39 .type = OMAP_DISPLAY_TYPE_SDI, 42 .dev.platform_data = &rx51_tv_pdata,
40 .phy.sdi.datapairs = 2,
41 .data = &lcd_data,
42};
43
44static struct omap_dss_device rx51_tv_device = {
45 .name = "tv",
46 .type = OMAP_DISPLAY_TYPE_VENC,
47 .driver_name = "venc",
48 .phy.venc.type = OMAP_DSS_VENC_TYPE_COMPOSITE,
49};
50
51static struct omap_dss_device *rx51_dss_devices[] = {
52 &rx51_lcd_device,
53 &rx51_tv_device,
54}; 43};
55 44
56static struct omap_dss_board_info rx51_dss_board_info = { 45static struct omap_dss_board_info rx51_dss_board_info = {
57 .num_devices = ARRAY_SIZE(rx51_dss_devices), 46 .default_display_name = "lcd",
58 .devices = rx51_dss_devices,
59 .default_device = &rx51_lcd_device,
60}; 47};
61 48
62static int __init rx51_video_init(void) 49static int __init rx51_video_init(void)
@@ -71,6 +58,8 @@ static int __init rx51_video_init(void)
71 58
72 omap_display_init(&rx51_dss_board_info); 59 omap_display_init(&rx51_dss_board_info);
73 60
61 platform_device_register(&rx51_tv_connector_device);
62
74 return 0; 63 return 0;
75} 64}
76 65
diff --git a/arch/arm/mach-omap2/board-zoom-display.c b/arch/arm/mach-omap2/board-zoom-display.c
index c2a079cb76fc..3d8ecc1e05bd 100644
--- a/arch/arm/mach-omap2/board-zoom-display.c
+++ b/arch/arm/mach-omap2/board-zoom-display.c
@@ -25,32 +25,23 @@
25#define LCD_PANEL_RESET_GPIO_PILOT 55 25#define LCD_PANEL_RESET_GPIO_PILOT 55
26#define LCD_PANEL_QVGA_GPIO 56 26#define LCD_PANEL_QVGA_GPIO 56
27 27
28static struct panel_nec_nl8048_data zoom_lcd_data = { 28static struct panel_nec_nl8048hl11_platform_data zoom_lcd_pdata = {
29 /* res_gpio filled in code */ 29 .name = "lcd",
30 .qvga_gpio = LCD_PANEL_QVGA_GPIO, 30 .source = "dpi.0",
31};
32 31
33static struct omap_dss_device zoom_lcd_device = { 32 .data_lines = 24,
34 .name = "lcd",
35 .driver_name = "NEC_8048_panel",
36 .type = OMAP_DISPLAY_TYPE_DPI,
37 .phy.dpi.data_lines = 24,
38 .data = &zoom_lcd_data,
39};
40 33
41static struct omap_dss_device *zoom_dss_devices[] = { 34 .res_gpio = -1, /* filled in code */
42 &zoom_lcd_device, 35 .qvga_gpio = LCD_PANEL_QVGA_GPIO,
43}; 36};
44 37
45static struct omap_dss_board_info zoom_dss_data = { 38static struct omap_dss_board_info zoom_dss_data = {
46 .num_devices = ARRAY_SIZE(zoom_dss_devices), 39 .default_display_name = "lcd",
47 .devices = zoom_dss_devices,
48 .default_device = &zoom_lcd_device,
49}; 40};
50 41
51static void __init zoom_lcd_panel_init(void) 42static void __init zoom_lcd_panel_init(void)
52{ 43{
53 zoom_lcd_data.res_gpio = (omap_rev() > OMAP3430_REV_ES3_0) ? 44 zoom_lcd_pdata.res_gpio = (omap_rev() > OMAP3430_REV_ES3_0) ?
54 LCD_PANEL_RESET_GPIO_PROD : 45 LCD_PANEL_RESET_GPIO_PROD :
55 LCD_PANEL_RESET_GPIO_PILOT; 46 LCD_PANEL_RESET_GPIO_PILOT;
56} 47}
@@ -61,19 +52,20 @@ static struct omap2_mcspi_device_config dss_lcd_mcspi_config = {
61 52
62static struct spi_board_info nec_8048_spi_board_info[] __initdata = { 53static struct spi_board_info nec_8048_spi_board_info[] __initdata = {
63 [0] = { 54 [0] = {
64 .modalias = "nec_8048_spi", 55 .modalias = "panel-nec-nl8048hl11",
65 .bus_num = 1, 56 .bus_num = 1,
66 .chip_select = 2, 57 .chip_select = 2,
67 .max_speed_hz = 375000, 58 .max_speed_hz = 375000,
68 .controller_data = &dss_lcd_mcspi_config, 59 .controller_data = &dss_lcd_mcspi_config,
60 .platform_data = &zoom_lcd_pdata,
69 }, 61 },
70}; 62};
71 63
72void __init zoom_display_init(void) 64void __init zoom_display_init(void)
73{ 65{
74 omap_display_init(&zoom_dss_data); 66 omap_display_init(&zoom_dss_data);
67 zoom_lcd_panel_init();
75 spi_register_board_info(nec_8048_spi_board_info, 68 spi_register_board_info(nec_8048_spi_board_info,
76 ARRAY_SIZE(nec_8048_spi_board_info)); 69 ARRAY_SIZE(nec_8048_spi_board_info));
77 zoom_lcd_panel_init();
78} 70}
79 71
diff --git a/arch/arm/mach-omap2/cclock33xx_data.c b/arch/arm/mach-omap2/cclock33xx_data.c
index ba6534d7f155..865d30ee812f 100644
--- a/arch/arm/mach-omap2/cclock33xx_data.c
+++ b/arch/arm/mach-omap2/cclock33xx_data.c
@@ -421,6 +421,10 @@ static struct clk aes0_fck;
421DEFINE_STRUCT_CLK_HW_OMAP(aes0_fck, NULL); 421DEFINE_STRUCT_CLK_HW_OMAP(aes0_fck, NULL);
422DEFINE_STRUCT_CLK(aes0_fck, dpll_core_ck_parents, clk_ops_null); 422DEFINE_STRUCT_CLK(aes0_fck, dpll_core_ck_parents, clk_ops_null);
423 423
424static struct clk rng_fck;
425DEFINE_STRUCT_CLK_HW_OMAP(rng_fck, NULL);
426DEFINE_STRUCT_CLK(rng_fck, dpll_core_ck_parents, clk_ops_null);
427
424/* 428/*
425 * Modules clock nodes 429 * Modules clock nodes
426 * 430 *
@@ -966,6 +970,7 @@ static struct omap_clk am33xx_clks[] = {
966 CLK(NULL, "smartreflex1_fck", &smartreflex1_fck), 970 CLK(NULL, "smartreflex1_fck", &smartreflex1_fck),
967 CLK(NULL, "sha0_fck", &sha0_fck), 971 CLK(NULL, "sha0_fck", &sha0_fck),
968 CLK(NULL, "aes0_fck", &aes0_fck), 972 CLK(NULL, "aes0_fck", &aes0_fck),
973 CLK(NULL, "rng_fck", &rng_fck),
969 CLK(NULL, "timer1_fck", &timer1_fck), 974 CLK(NULL, "timer1_fck", &timer1_fck),
970 CLK(NULL, "timer2_fck", &timer2_fck), 975 CLK(NULL, "timer2_fck", &timer2_fck),
971 CLK(NULL, "timer3_fck", &timer3_fck), 976 CLK(NULL, "timer3_fck", &timer3_fck),
diff --git a/arch/arm/mach-omap2/cclock44xx_data.c b/arch/arm/mach-omap2/cclock44xx_data.c
index 88e37a474334..b237950eb8a3 100644
--- a/arch/arm/mach-omap2/cclock44xx_data.c
+++ b/arch/arm/mach-omap2/cclock44xx_data.c
@@ -1632,7 +1632,7 @@ static struct omap_clk omap44xx_clks[] = {
1632 CLK(NULL, "auxclk5_src_ck", &auxclk5_src_ck), 1632 CLK(NULL, "auxclk5_src_ck", &auxclk5_src_ck),
1633 CLK(NULL, "auxclk5_ck", &auxclk5_ck), 1633 CLK(NULL, "auxclk5_ck", &auxclk5_ck),
1634 CLK(NULL, "auxclkreq5_ck", &auxclkreq5_ck), 1634 CLK(NULL, "auxclkreq5_ck", &auxclkreq5_ck),
1635 CLK("omap-gpmc", "fck", &dummy_ck), 1635 CLK("50000000.gpmc", "fck", &dummy_ck),
1636 CLK("omap_i2c.1", "ick", &dummy_ck), 1636 CLK("omap_i2c.1", "ick", &dummy_ck),
1637 CLK("omap_i2c.2", "ick", &dummy_ck), 1637 CLK("omap_i2c.2", "ick", &dummy_ck),
1638 CLK("omap_i2c.3", "ick", &dummy_ck), 1638 CLK("omap_i2c.3", "ick", &dummy_ck),
@@ -1707,6 +1707,18 @@ int __init omap4xxx_clk_init(void)
1707 omap2_clk_disable_autoidle_all(); 1707 omap2_clk_disable_autoidle_all();
1708 1708
1709 /* 1709 /*
1710 * A set rate of ABE DPLL inturn triggers a set rate of USB DPLL
1711 * when its in bypass. So always lock USB before ABE DPLL.
1712 */
1713 /*
1714 * Lock USB DPLL on OMAP4 devices so that the L3INIT power
1715 * domain can transition to retention state when not in use.
1716 */
1717 rc = clk_set_rate(&dpll_usb_ck, OMAP4_DPLL_USB_DEFFREQ);
1718 if (rc)
1719 pr_err("%s: failed to configure USB DPLL!\n", __func__);
1720
1721 /*
1710 * On OMAP4460 the ABE DPLL fails to turn on if in idle low-power 1722 * On OMAP4460 the ABE DPLL fails to turn on if in idle low-power
1711 * state when turning the ABE clock domain. Workaround this by 1723 * state when turning the ABE clock domain. Workaround this by
1712 * locking the ABE DPLL on boot. 1724 * locking the ABE DPLL on boot.
@@ -1718,13 +1730,5 @@ int __init omap4xxx_clk_init(void)
1718 if (rc) 1730 if (rc)
1719 pr_err("%s: failed to configure ABE DPLL!\n", __func__); 1731 pr_err("%s: failed to configure ABE DPLL!\n", __func__);
1720 1732
1721 /*
1722 * Lock USB DPLL on OMAP4 devices so that the L3INIT power
1723 * domain can transition to retention state when not in use.
1724 */
1725 rc = clk_set_rate(&dpll_usb_ck, OMAP4_DPLL_USB_DEFFREQ);
1726 if (rc)
1727 pr_err("%s: failed to configure USB DPLL!\n", __func__);
1728
1729 return 0; 1733 return 0;
1730} 1734}
diff --git a/arch/arm/mach-omap2/clockdomain.h b/arch/arm/mach-omap2/clockdomain.h
index daeecf1b89fa..4b03394fa0c5 100644
--- a/arch/arm/mach-omap2/clockdomain.h
+++ b/arch/arm/mach-omap2/clockdomain.h
@@ -217,6 +217,7 @@ extern void __init omap3xxx_clockdomains_init(void);
217extern void __init am33xx_clockdomains_init(void); 217extern void __init am33xx_clockdomains_init(void);
218extern void __init omap44xx_clockdomains_init(void); 218extern void __init omap44xx_clockdomains_init(void);
219extern void __init omap54xx_clockdomains_init(void); 219extern void __init omap54xx_clockdomains_init(void);
220extern void __init dra7xx_clockdomains_init(void);
220 221
221extern void clkdm_add_autodeps(struct clockdomain *clkdm); 222extern void clkdm_add_autodeps(struct clockdomain *clkdm);
222extern void clkdm_del_autodeps(struct clockdomain *clkdm); 223extern void clkdm_del_autodeps(struct clockdomain *clkdm);
diff --git a/arch/arm/mach-omap2/clockdomains7xx_data.c b/arch/arm/mach-omap2/clockdomains7xx_data.c
new file mode 100644
index 000000000000..57d5df0c1fbd
--- /dev/null
+++ b/arch/arm/mach-omap2/clockdomains7xx_data.c
@@ -0,0 +1,740 @@
1/*
2 * DRA7xx Clock domains framework
3 *
4 * Copyright (C) 2009-2013 Texas Instruments, Inc.
5 * Copyright (C) 2009-2011 Nokia Corporation
6 *
7 * Generated by code originally written by:
8 * Abhijit Pagare (abhijitpagare@ti.com)
9 * Benoit Cousson (b-cousson@ti.com)
10 * Paul Walmsley (paul@pwsan.com)
11 *
12 * This file is automatically generated from the OMAP hardware databases.
13 * We respectfully ask that any modifications to this file be coordinated
14 * with the public linux-omap@vger.kernel.org mailing list and the
15 * authors above to ensure that the autogeneration scripts are kept
16 * up-to-date with the file contents.
17 *
18 * This program is free software; you can redistribute it and/or modify
19 * it under the terms of the GNU General Public License version 2 as
20 * published by the Free Software Foundation.
21 */
22
23#include <linux/kernel.h>
24#include <linux/io.h>
25
26#include "clockdomain.h"
27#include "cm1_7xx.h"
28#include "cm2_7xx.h"
29
30#include "cm-regbits-7xx.h"
31#include "prm7xx.h"
32#include "prcm44xx.h"
33#include "prcm_mpu7xx.h"
34
35/* Static Dependencies for DRA7xx Clock Domains */
36
37static struct clkdm_dep cam_wkup_sleep_deps[] = {
38 { .clkdm_name = "emif_clkdm" },
39 { NULL },
40};
41
42static struct clkdm_dep dma_wkup_sleep_deps[] = {
43 { .clkdm_name = "dss_clkdm" },
44 { .clkdm_name = "emif_clkdm" },
45 { .clkdm_name = "ipu_clkdm" },
46 { .clkdm_name = "ipu1_clkdm" },
47 { .clkdm_name = "ipu2_clkdm" },
48 { .clkdm_name = "iva_clkdm" },
49 { .clkdm_name = "l3init_clkdm" },
50 { .clkdm_name = "l4cfg_clkdm" },
51 { .clkdm_name = "l4per_clkdm" },
52 { .clkdm_name = "l4per2_clkdm" },
53 { .clkdm_name = "l4per3_clkdm" },
54 { .clkdm_name = "l4sec_clkdm" },
55 { .clkdm_name = "pcie_clkdm" },
56 { .clkdm_name = "wkupaon_clkdm" },
57 { NULL },
58};
59
60static struct clkdm_dep dsp1_wkup_sleep_deps[] = {
61 { .clkdm_name = "atl_clkdm" },
62 { .clkdm_name = "cam_clkdm" },
63 { .clkdm_name = "dsp2_clkdm" },
64 { .clkdm_name = "dss_clkdm" },
65 { .clkdm_name = "emif_clkdm" },
66 { .clkdm_name = "eve1_clkdm" },
67 { .clkdm_name = "eve2_clkdm" },
68 { .clkdm_name = "eve3_clkdm" },
69 { .clkdm_name = "eve4_clkdm" },
70 { .clkdm_name = "gmac_clkdm" },
71 { .clkdm_name = "gpu_clkdm" },
72 { .clkdm_name = "ipu_clkdm" },
73 { .clkdm_name = "ipu1_clkdm" },
74 { .clkdm_name = "ipu2_clkdm" },
75 { .clkdm_name = "iva_clkdm" },
76 { .clkdm_name = "l3init_clkdm" },
77 { .clkdm_name = "l4per_clkdm" },
78 { .clkdm_name = "l4per2_clkdm" },
79 { .clkdm_name = "l4per3_clkdm" },
80 { .clkdm_name = "l4sec_clkdm" },
81 { .clkdm_name = "pcie_clkdm" },
82 { .clkdm_name = "vpe_clkdm" },
83 { .clkdm_name = "wkupaon_clkdm" },
84 { NULL },
85};
86
87static struct clkdm_dep dsp2_wkup_sleep_deps[] = {
88 { .clkdm_name = "atl_clkdm" },
89 { .clkdm_name = "cam_clkdm" },
90 { .clkdm_name = "dsp1_clkdm" },
91 { .clkdm_name = "dss_clkdm" },
92 { .clkdm_name = "emif_clkdm" },
93 { .clkdm_name = "eve1_clkdm" },
94 { .clkdm_name = "eve2_clkdm" },
95 { .clkdm_name = "eve3_clkdm" },
96 { .clkdm_name = "eve4_clkdm" },
97 { .clkdm_name = "gmac_clkdm" },
98 { .clkdm_name = "gpu_clkdm" },
99 { .clkdm_name = "ipu_clkdm" },
100 { .clkdm_name = "ipu1_clkdm" },
101 { .clkdm_name = "ipu2_clkdm" },
102 { .clkdm_name = "iva_clkdm" },
103 { .clkdm_name = "l3init_clkdm" },
104 { .clkdm_name = "l4per_clkdm" },
105 { .clkdm_name = "l4per2_clkdm" },
106 { .clkdm_name = "l4per3_clkdm" },
107 { .clkdm_name = "l4sec_clkdm" },
108 { .clkdm_name = "pcie_clkdm" },
109 { .clkdm_name = "vpe_clkdm" },
110 { .clkdm_name = "wkupaon_clkdm" },
111 { NULL },
112};
113
114static struct clkdm_dep dss_wkup_sleep_deps[] = {
115 { .clkdm_name = "emif_clkdm" },
116 { .clkdm_name = "iva_clkdm" },
117 { NULL },
118};
119
120static struct clkdm_dep eve1_wkup_sleep_deps[] = {
121 { .clkdm_name = "emif_clkdm" },
122 { .clkdm_name = "eve2_clkdm" },
123 { .clkdm_name = "eve3_clkdm" },
124 { .clkdm_name = "eve4_clkdm" },
125 { .clkdm_name = "iva_clkdm" },
126 { NULL },
127};
128
129static struct clkdm_dep eve2_wkup_sleep_deps[] = {
130 { .clkdm_name = "emif_clkdm" },
131 { .clkdm_name = "eve1_clkdm" },
132 { .clkdm_name = "eve3_clkdm" },
133 { .clkdm_name = "eve4_clkdm" },
134 { .clkdm_name = "iva_clkdm" },
135 { NULL },
136};
137
138static struct clkdm_dep eve3_wkup_sleep_deps[] = {
139 { .clkdm_name = "emif_clkdm" },
140 { .clkdm_name = "eve1_clkdm" },
141 { .clkdm_name = "eve2_clkdm" },
142 { .clkdm_name = "eve4_clkdm" },
143 { .clkdm_name = "iva_clkdm" },
144 { NULL },
145};
146
147static struct clkdm_dep eve4_wkup_sleep_deps[] = {
148 { .clkdm_name = "emif_clkdm" },
149 { .clkdm_name = "eve1_clkdm" },
150 { .clkdm_name = "eve2_clkdm" },
151 { .clkdm_name = "eve3_clkdm" },
152 { .clkdm_name = "iva_clkdm" },
153 { NULL },
154};
155
156static struct clkdm_dep gmac_wkup_sleep_deps[] = {
157 { .clkdm_name = "emif_clkdm" },
158 { .clkdm_name = "l4per2_clkdm" },
159 { NULL },
160};
161
162static struct clkdm_dep gpu_wkup_sleep_deps[] = {
163 { .clkdm_name = "emif_clkdm" },
164 { .clkdm_name = "iva_clkdm" },
165 { NULL },
166};
167
168static struct clkdm_dep ipu1_wkup_sleep_deps[] = {
169 { .clkdm_name = "atl_clkdm" },
170 { .clkdm_name = "dsp1_clkdm" },
171 { .clkdm_name = "dsp2_clkdm" },
172 { .clkdm_name = "dss_clkdm" },
173 { .clkdm_name = "emif_clkdm" },
174 { .clkdm_name = "eve1_clkdm" },
175 { .clkdm_name = "eve2_clkdm" },
176 { .clkdm_name = "eve3_clkdm" },
177 { .clkdm_name = "eve4_clkdm" },
178 { .clkdm_name = "gmac_clkdm" },
179 { .clkdm_name = "gpu_clkdm" },
180 { .clkdm_name = "ipu_clkdm" },
181 { .clkdm_name = "ipu2_clkdm" },
182 { .clkdm_name = "iva_clkdm" },
183 { .clkdm_name = "l3init_clkdm" },
184 { .clkdm_name = "l3main1_clkdm" },
185 { .clkdm_name = "l4cfg_clkdm" },
186 { .clkdm_name = "l4per_clkdm" },
187 { .clkdm_name = "l4per2_clkdm" },
188 { .clkdm_name = "l4per3_clkdm" },
189 { .clkdm_name = "l4sec_clkdm" },
190 { .clkdm_name = "pcie_clkdm" },
191 { .clkdm_name = "vpe_clkdm" },
192 { .clkdm_name = "wkupaon_clkdm" },
193 { NULL },
194};
195
196static struct clkdm_dep ipu2_wkup_sleep_deps[] = {
197 { .clkdm_name = "atl_clkdm" },
198 { .clkdm_name = "dsp1_clkdm" },
199 { .clkdm_name = "dsp2_clkdm" },
200 { .clkdm_name = "dss_clkdm" },
201 { .clkdm_name = "emif_clkdm" },
202 { .clkdm_name = "eve1_clkdm" },
203 { .clkdm_name = "eve2_clkdm" },
204 { .clkdm_name = "eve3_clkdm" },
205 { .clkdm_name = "eve4_clkdm" },
206 { .clkdm_name = "gmac_clkdm" },
207 { .clkdm_name = "gpu_clkdm" },
208 { .clkdm_name = "ipu_clkdm" },
209 { .clkdm_name = "ipu1_clkdm" },
210 { .clkdm_name = "iva_clkdm" },
211 { .clkdm_name = "l3init_clkdm" },
212 { .clkdm_name = "l3main1_clkdm" },
213 { .clkdm_name = "l4cfg_clkdm" },
214 { .clkdm_name = "l4per_clkdm" },
215 { .clkdm_name = "l4per2_clkdm" },
216 { .clkdm_name = "l4per3_clkdm" },
217 { .clkdm_name = "l4sec_clkdm" },
218 { .clkdm_name = "pcie_clkdm" },
219 { .clkdm_name = "vpe_clkdm" },
220 { .clkdm_name = "wkupaon_clkdm" },
221 { NULL },
222};
223
224static struct clkdm_dep iva_wkup_sleep_deps[] = {
225 { .clkdm_name = "emif_clkdm" },
226 { NULL },
227};
228
229static struct clkdm_dep l3init_wkup_sleep_deps[] = {
230 { .clkdm_name = "emif_clkdm" },
231 { .clkdm_name = "iva_clkdm" },
232 { .clkdm_name = "l4cfg_clkdm" },
233 { .clkdm_name = "l4per_clkdm" },
234 { .clkdm_name = "l4per3_clkdm" },
235 { .clkdm_name = "l4sec_clkdm" },
236 { .clkdm_name = "wkupaon_clkdm" },
237 { NULL },
238};
239
240static struct clkdm_dep l4per2_wkup_sleep_deps[] = {
241 { .clkdm_name = "dsp1_clkdm" },
242 { .clkdm_name = "dsp2_clkdm" },
243 { .clkdm_name = "ipu1_clkdm" },
244 { .clkdm_name = "ipu2_clkdm" },
245 { NULL },
246};
247
248static struct clkdm_dep l4sec_wkup_sleep_deps[] = {
249 { .clkdm_name = "emif_clkdm" },
250 { .clkdm_name = "l4per_clkdm" },
251 { NULL },
252};
253
254static struct clkdm_dep mpu_wkup_sleep_deps[] = {
255 { .clkdm_name = "cam_clkdm" },
256 { .clkdm_name = "dsp1_clkdm" },
257 { .clkdm_name = "dsp2_clkdm" },
258 { .clkdm_name = "dss_clkdm" },
259 { .clkdm_name = "emif_clkdm" },
260 { .clkdm_name = "eve1_clkdm" },
261 { .clkdm_name = "eve2_clkdm" },
262 { .clkdm_name = "eve3_clkdm" },
263 { .clkdm_name = "eve4_clkdm" },
264 { .clkdm_name = "gmac_clkdm" },
265 { .clkdm_name = "gpu_clkdm" },
266 { .clkdm_name = "ipu_clkdm" },
267 { .clkdm_name = "ipu1_clkdm" },
268 { .clkdm_name = "ipu2_clkdm" },
269 { .clkdm_name = "iva_clkdm" },
270 { .clkdm_name = "l3init_clkdm" },
271 { .clkdm_name = "l3main1_clkdm" },
272 { .clkdm_name = "l4cfg_clkdm" },
273 { .clkdm_name = "l4per_clkdm" },
274 { .clkdm_name = "l4per2_clkdm" },
275 { .clkdm_name = "l4per3_clkdm" },
276 { .clkdm_name = "l4sec_clkdm" },
277 { .clkdm_name = "pcie_clkdm" },
278 { .clkdm_name = "vpe_clkdm" },
279 { .clkdm_name = "wkupaon_clkdm" },
280 { NULL },
281};
282
283static struct clkdm_dep pcie_wkup_sleep_deps[] = {
284 { .clkdm_name = "atl_clkdm" },
285 { .clkdm_name = "cam_clkdm" },
286 { .clkdm_name = "dsp1_clkdm" },
287 { .clkdm_name = "dsp2_clkdm" },
288 { .clkdm_name = "dss_clkdm" },
289 { .clkdm_name = "emif_clkdm" },
290 { .clkdm_name = "eve1_clkdm" },
291 { .clkdm_name = "eve2_clkdm" },
292 { .clkdm_name = "eve3_clkdm" },
293 { .clkdm_name = "eve4_clkdm" },
294 { .clkdm_name = "gmac_clkdm" },
295 { .clkdm_name = "gpu_clkdm" },
296 { .clkdm_name = "ipu_clkdm" },
297 { .clkdm_name = "ipu1_clkdm" },
298 { .clkdm_name = "iva_clkdm" },
299 { .clkdm_name = "l3init_clkdm" },
300 { .clkdm_name = "l4cfg_clkdm" },
301 { .clkdm_name = "l4per_clkdm" },
302 { .clkdm_name = "l4per2_clkdm" },
303 { .clkdm_name = "l4per3_clkdm" },
304 { .clkdm_name = "l4sec_clkdm" },
305 { .clkdm_name = "vpe_clkdm" },
306 { NULL },
307};
308
309static struct clkdm_dep vpe_wkup_sleep_deps[] = {
310 { .clkdm_name = "emif_clkdm" },
311 { .clkdm_name = "l4per3_clkdm" },
312 { NULL },
313};
314
315static struct clockdomain l4per3_7xx_clkdm = {
316 .name = "l4per3_clkdm",
317 .pwrdm = { .name = "l4per_pwrdm" },
318 .prcm_partition = DRA7XX_CM_CORE_PARTITION,
319 .cm_inst = DRA7XX_CM_CORE_L4PER_INST,
320 .clkdm_offs = DRA7XX_CM_CORE_L4PER_L4PER3_CDOFFS,
321 .dep_bit = DRA7XX_L4PER3_STATDEP_SHIFT,
322 .flags = CLKDM_CAN_HWSUP_SWSUP,
323};
324
325static struct clockdomain l4per2_7xx_clkdm = {
326 .name = "l4per2_clkdm",
327 .pwrdm = { .name = "l4per_pwrdm" },
328 .prcm_partition = DRA7XX_CM_CORE_PARTITION,
329 .cm_inst = DRA7XX_CM_CORE_L4PER_INST,
330 .clkdm_offs = DRA7XX_CM_CORE_L4PER_L4PER2_CDOFFS,
331 .dep_bit = DRA7XX_L4PER2_STATDEP_SHIFT,
332 .wkdep_srcs = l4per2_wkup_sleep_deps,
333 .sleepdep_srcs = l4per2_wkup_sleep_deps,
334 .flags = CLKDM_CAN_HWSUP_SWSUP,
335};
336
337static struct clockdomain mpu0_7xx_clkdm = {
338 .name = "mpu0_clkdm",
339 .pwrdm = { .name = "cpu0_pwrdm" },
340 .prcm_partition = DRA7XX_MPU_PRCM_PARTITION,
341 .cm_inst = DRA7XX_MPU_PRCM_CM_C0_INST,
342 .clkdm_offs = DRA7XX_MPU_PRCM_CM_C0_CPU0_CDOFFS,
343 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
344};
345
346static struct clockdomain iva_7xx_clkdm = {
347 .name = "iva_clkdm",
348 .pwrdm = { .name = "iva_pwrdm" },
349 .prcm_partition = DRA7XX_CM_CORE_PARTITION,
350 .cm_inst = DRA7XX_CM_CORE_IVA_INST,
351 .clkdm_offs = DRA7XX_CM_CORE_IVA_IVA_CDOFFS,
352 .dep_bit = DRA7XX_IVA_STATDEP_SHIFT,
353 .wkdep_srcs = iva_wkup_sleep_deps,
354 .sleepdep_srcs = iva_wkup_sleep_deps,
355 .flags = CLKDM_CAN_HWSUP_SWSUP,
356};
357
358static struct clockdomain coreaon_7xx_clkdm = {
359 .name = "coreaon_clkdm",
360 .pwrdm = { .name = "coreaon_pwrdm" },
361 .prcm_partition = DRA7XX_CM_CORE_PARTITION,
362 .cm_inst = DRA7XX_CM_CORE_COREAON_INST,
363 .clkdm_offs = DRA7XX_CM_CORE_COREAON_COREAON_CDOFFS,
364 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
365};
366
367static struct clockdomain ipu1_7xx_clkdm = {
368 .name = "ipu1_clkdm",
369 .pwrdm = { .name = "ipu_pwrdm" },
370 .prcm_partition = DRA7XX_CM_CORE_AON_PARTITION,
371 .cm_inst = DRA7XX_CM_CORE_AON_IPU_INST,
372 .clkdm_offs = DRA7XX_CM_CORE_AON_IPU_IPU1_CDOFFS,
373 .dep_bit = DRA7XX_IPU1_STATDEP_SHIFT,
374 .wkdep_srcs = ipu1_wkup_sleep_deps,
375 .sleepdep_srcs = ipu1_wkup_sleep_deps,
376 .flags = CLKDM_CAN_HWSUP_SWSUP,
377};
378
379static struct clockdomain ipu2_7xx_clkdm = {
380 .name = "ipu2_clkdm",
381 .pwrdm = { .name = "core_pwrdm" },
382 .prcm_partition = DRA7XX_CM_CORE_PARTITION,
383 .cm_inst = DRA7XX_CM_CORE_CORE_INST,
384 .clkdm_offs = DRA7XX_CM_CORE_CORE_IPU2_CDOFFS,
385 .dep_bit = DRA7XX_IPU2_STATDEP_SHIFT,
386 .wkdep_srcs = ipu2_wkup_sleep_deps,
387 .sleepdep_srcs = ipu2_wkup_sleep_deps,
388 .flags = CLKDM_CAN_HWSUP_SWSUP,
389};
390
391static struct clockdomain l3init_7xx_clkdm = {
392 .name = "l3init_clkdm",
393 .pwrdm = { .name = "l3init_pwrdm" },
394 .prcm_partition = DRA7XX_CM_CORE_PARTITION,
395 .cm_inst = DRA7XX_CM_CORE_L3INIT_INST,
396 .clkdm_offs = DRA7XX_CM_CORE_L3INIT_L3INIT_CDOFFS,
397 .dep_bit = DRA7XX_L3INIT_STATDEP_SHIFT,
398 .wkdep_srcs = l3init_wkup_sleep_deps,
399 .sleepdep_srcs = l3init_wkup_sleep_deps,
400 .flags = CLKDM_CAN_HWSUP_SWSUP,
401};
402
403static struct clockdomain l4sec_7xx_clkdm = {
404 .name = "l4sec_clkdm",
405 .pwrdm = { .name = "l4per_pwrdm" },
406 .prcm_partition = DRA7XX_CM_CORE_PARTITION,
407 .cm_inst = DRA7XX_CM_CORE_L4PER_INST,
408 .clkdm_offs = DRA7XX_CM_CORE_L4PER_L4SEC_CDOFFS,
409 .dep_bit = DRA7XX_L4SEC_STATDEP_SHIFT,
410 .wkdep_srcs = l4sec_wkup_sleep_deps,
411 .sleepdep_srcs = l4sec_wkup_sleep_deps,
412 .flags = CLKDM_CAN_HWSUP_SWSUP,
413};
414
415static struct clockdomain l3main1_7xx_clkdm = {
416 .name = "l3main1_clkdm",
417 .pwrdm = { .name = "core_pwrdm" },
418 .prcm_partition = DRA7XX_CM_CORE_PARTITION,
419 .cm_inst = DRA7XX_CM_CORE_CORE_INST,
420 .clkdm_offs = DRA7XX_CM_CORE_CORE_L3MAIN1_CDOFFS,
421 .dep_bit = DRA7XX_L3MAIN1_STATDEP_SHIFT,
422 .flags = CLKDM_CAN_HWSUP,
423};
424
425static struct clockdomain vpe_7xx_clkdm = {
426 .name = "vpe_clkdm",
427 .pwrdm = { .name = "vpe_pwrdm" },
428 .prcm_partition = DRA7XX_CM_CORE_AON_PARTITION,
429 .cm_inst = DRA7XX_CM_CORE_AON_VPE_INST,
430 .clkdm_offs = DRA7XX_CM_CORE_AON_VPE_VPE_CDOFFS,
431 .dep_bit = DRA7XX_VPE_STATDEP_SHIFT,
432 .wkdep_srcs = vpe_wkup_sleep_deps,
433 .sleepdep_srcs = vpe_wkup_sleep_deps,
434 .flags = CLKDM_CAN_HWSUP_SWSUP,
435};
436
437static struct clockdomain mpu_7xx_clkdm = {
438 .name = "mpu_clkdm",
439 .pwrdm = { .name = "mpu_pwrdm" },
440 .prcm_partition = DRA7XX_CM_CORE_AON_PARTITION,
441 .cm_inst = DRA7XX_CM_CORE_AON_MPU_INST,
442 .clkdm_offs = DRA7XX_CM_CORE_AON_MPU_MPU_CDOFFS,
443 .wkdep_srcs = mpu_wkup_sleep_deps,
444 .sleepdep_srcs = mpu_wkup_sleep_deps,
445 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
446};
447
448static struct clockdomain custefuse_7xx_clkdm = {
449 .name = "custefuse_clkdm",
450 .pwrdm = { .name = "custefuse_pwrdm" },
451 .prcm_partition = DRA7XX_CM_CORE_PARTITION,
452 .cm_inst = DRA7XX_CM_CORE_CUSTEFUSE_INST,
453 .clkdm_offs = DRA7XX_CM_CORE_CUSTEFUSE_CUSTEFUSE_CDOFFS,
454 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
455};
456
457static struct clockdomain ipu_7xx_clkdm = {
458 .name = "ipu_clkdm",
459 .pwrdm = { .name = "ipu_pwrdm" },
460 .prcm_partition = DRA7XX_CM_CORE_AON_PARTITION,
461 .cm_inst = DRA7XX_CM_CORE_AON_IPU_INST,
462 .clkdm_offs = DRA7XX_CM_CORE_AON_IPU_IPU_CDOFFS,
463 .dep_bit = DRA7XX_IPU_STATDEP_SHIFT,
464 .flags = CLKDM_CAN_HWSUP_SWSUP,
465};
466
467static struct clockdomain mpu1_7xx_clkdm = {
468 .name = "mpu1_clkdm",
469 .pwrdm = { .name = "cpu1_pwrdm" },
470 .prcm_partition = DRA7XX_MPU_PRCM_PARTITION,
471 .cm_inst = DRA7XX_MPU_PRCM_CM_C1_INST,
472 .clkdm_offs = DRA7XX_MPU_PRCM_CM_C1_CPU1_CDOFFS,
473 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
474};
475
476static struct clockdomain gmac_7xx_clkdm = {
477 .name = "gmac_clkdm",
478 .pwrdm = { .name = "l3init_pwrdm" },
479 .prcm_partition = DRA7XX_CM_CORE_PARTITION,
480 .cm_inst = DRA7XX_CM_CORE_L3INIT_INST,
481 .clkdm_offs = DRA7XX_CM_CORE_L3INIT_GMAC_CDOFFS,
482 .dep_bit = DRA7XX_GMAC_STATDEP_SHIFT,
483 .wkdep_srcs = gmac_wkup_sleep_deps,
484 .sleepdep_srcs = gmac_wkup_sleep_deps,
485 .flags = CLKDM_CAN_HWSUP_SWSUP,
486};
487
488static struct clockdomain l4cfg_7xx_clkdm = {
489 .name = "l4cfg_clkdm",
490 .pwrdm = { .name = "core_pwrdm" },
491 .prcm_partition = DRA7XX_CM_CORE_PARTITION,
492 .cm_inst = DRA7XX_CM_CORE_CORE_INST,
493 .clkdm_offs = DRA7XX_CM_CORE_CORE_L4CFG_CDOFFS,
494 .dep_bit = DRA7XX_L4CFG_STATDEP_SHIFT,
495 .flags = CLKDM_CAN_HWSUP,
496};
497
498static struct clockdomain dma_7xx_clkdm = {
499 .name = "dma_clkdm",
500 .pwrdm = { .name = "core_pwrdm" },
501 .prcm_partition = DRA7XX_CM_CORE_PARTITION,
502 .cm_inst = DRA7XX_CM_CORE_CORE_INST,
503 .clkdm_offs = DRA7XX_CM_CORE_CORE_DMA_CDOFFS,
504 .wkdep_srcs = dma_wkup_sleep_deps,
505 .sleepdep_srcs = dma_wkup_sleep_deps,
506 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
507};
508
509static struct clockdomain rtc_7xx_clkdm = {
510 .name = "rtc_clkdm",
511 .pwrdm = { .name = "rtc_pwrdm" },
512 .prcm_partition = DRA7XX_CM_CORE_AON_PARTITION,
513 .cm_inst = DRA7XX_CM_CORE_AON_RTC_INST,
514 .clkdm_offs = DRA7XX_CM_CORE_AON_RTC_RTC_CDOFFS,
515 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
516};
517
518static struct clockdomain pcie_7xx_clkdm = {
519 .name = "pcie_clkdm",
520 .pwrdm = { .name = "l3init_pwrdm" },
521 .prcm_partition = DRA7XX_CM_CORE_PARTITION,
522 .cm_inst = DRA7XX_CM_CORE_L3INIT_INST,
523 .clkdm_offs = DRA7XX_CM_CORE_L3INIT_PCIE_CDOFFS,
524 .dep_bit = DRA7XX_PCIE_STATDEP_SHIFT,
525 .wkdep_srcs = pcie_wkup_sleep_deps,
526 .sleepdep_srcs = pcie_wkup_sleep_deps,
527 .flags = CLKDM_CAN_HWSUP_SWSUP,
528};
529
530static struct clockdomain atl_7xx_clkdm = {
531 .name = "atl_clkdm",
532 .pwrdm = { .name = "core_pwrdm" },
533 .prcm_partition = DRA7XX_CM_CORE_PARTITION,
534 .cm_inst = DRA7XX_CM_CORE_CORE_INST,
535 .clkdm_offs = DRA7XX_CM_CORE_CORE_ATL_CDOFFS,
536 .dep_bit = DRA7XX_ATL_STATDEP_SHIFT,
537 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
538};
539
540static struct clockdomain l3instr_7xx_clkdm = {
541 .name = "l3instr_clkdm",
542 .pwrdm = { .name = "core_pwrdm" },
543 .prcm_partition = DRA7XX_CM_CORE_PARTITION,
544 .cm_inst = DRA7XX_CM_CORE_CORE_INST,
545 .clkdm_offs = DRA7XX_CM_CORE_CORE_L3INSTR_CDOFFS,
546};
547
548static struct clockdomain dss_7xx_clkdm = {
549 .name = "dss_clkdm",
550 .pwrdm = { .name = "dss_pwrdm" },
551 .prcm_partition = DRA7XX_CM_CORE_PARTITION,
552 .cm_inst = DRA7XX_CM_CORE_DSS_INST,
553 .clkdm_offs = DRA7XX_CM_CORE_DSS_DSS_CDOFFS,
554 .dep_bit = DRA7XX_DSS_STATDEP_SHIFT,
555 .wkdep_srcs = dss_wkup_sleep_deps,
556 .sleepdep_srcs = dss_wkup_sleep_deps,
557 .flags = CLKDM_CAN_HWSUP_SWSUP,
558};
559
560static struct clockdomain emif_7xx_clkdm = {
561 .name = "emif_clkdm",
562 .pwrdm = { .name = "core_pwrdm" },
563 .prcm_partition = DRA7XX_CM_CORE_PARTITION,
564 .cm_inst = DRA7XX_CM_CORE_CORE_INST,
565 .clkdm_offs = DRA7XX_CM_CORE_CORE_EMIF_CDOFFS,
566 .dep_bit = DRA7XX_EMIF_STATDEP_SHIFT,
567 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
568};
569
570static struct clockdomain emu_7xx_clkdm = {
571 .name = "emu_clkdm",
572 .pwrdm = { .name = "emu_pwrdm" },
573 .prcm_partition = DRA7XX_PRM_PARTITION,
574 .cm_inst = DRA7XX_PRM_EMU_CM_INST,
575 .clkdm_offs = DRA7XX_PRM_EMU_CM_EMU_CDOFFS,
576 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
577};
578
579static struct clockdomain dsp2_7xx_clkdm = {
580 .name = "dsp2_clkdm",
581 .pwrdm = { .name = "dsp2_pwrdm" },
582 .prcm_partition = DRA7XX_CM_CORE_AON_PARTITION,
583 .cm_inst = DRA7XX_CM_CORE_AON_DSP2_INST,
584 .clkdm_offs = DRA7XX_CM_CORE_AON_DSP2_DSP2_CDOFFS,
585 .dep_bit = DRA7XX_DSP2_STATDEP_SHIFT,
586 .wkdep_srcs = dsp2_wkup_sleep_deps,
587 .sleepdep_srcs = dsp2_wkup_sleep_deps,
588 .flags = CLKDM_CAN_HWSUP_SWSUP,
589};
590
591static struct clockdomain dsp1_7xx_clkdm = {
592 .name = "dsp1_clkdm",
593 .pwrdm = { .name = "dsp1_pwrdm" },
594 .prcm_partition = DRA7XX_CM_CORE_AON_PARTITION,
595 .cm_inst = DRA7XX_CM_CORE_AON_DSP1_INST,
596 .clkdm_offs = DRA7XX_CM_CORE_AON_DSP1_DSP1_CDOFFS,
597 .dep_bit = DRA7XX_DSP1_STATDEP_SHIFT,
598 .wkdep_srcs = dsp1_wkup_sleep_deps,
599 .sleepdep_srcs = dsp1_wkup_sleep_deps,
600 .flags = CLKDM_CAN_HWSUP_SWSUP,
601};
602
603static struct clockdomain cam_7xx_clkdm = {
604 .name = "cam_clkdm",
605 .pwrdm = { .name = "cam_pwrdm" },
606 .prcm_partition = DRA7XX_CM_CORE_PARTITION,
607 .cm_inst = DRA7XX_CM_CORE_CAM_INST,
608 .clkdm_offs = DRA7XX_CM_CORE_CAM_CAM_CDOFFS,
609 .dep_bit = DRA7XX_CAM_STATDEP_SHIFT,
610 .wkdep_srcs = cam_wkup_sleep_deps,
611 .sleepdep_srcs = cam_wkup_sleep_deps,
612 .flags = CLKDM_CAN_HWSUP_SWSUP,
613};
614
615static struct clockdomain l4per_7xx_clkdm = {
616 .name = "l4per_clkdm",
617 .pwrdm = { .name = "l4per_pwrdm" },
618 .prcm_partition = DRA7XX_CM_CORE_PARTITION,
619 .cm_inst = DRA7XX_CM_CORE_L4PER_INST,
620 .clkdm_offs = DRA7XX_CM_CORE_L4PER_L4PER_CDOFFS,
621 .dep_bit = DRA7XX_L4PER_STATDEP_SHIFT,
622 .flags = CLKDM_CAN_HWSUP_SWSUP,
623};
624
625static struct clockdomain gpu_7xx_clkdm = {
626 .name = "gpu_clkdm",
627 .pwrdm = { .name = "gpu_pwrdm" },
628 .prcm_partition = DRA7XX_CM_CORE_PARTITION,
629 .cm_inst = DRA7XX_CM_CORE_GPU_INST,
630 .clkdm_offs = DRA7XX_CM_CORE_GPU_GPU_CDOFFS,
631 .dep_bit = DRA7XX_GPU_STATDEP_SHIFT,
632 .wkdep_srcs = gpu_wkup_sleep_deps,
633 .sleepdep_srcs = gpu_wkup_sleep_deps,
634 .flags = CLKDM_CAN_HWSUP_SWSUP,
635};
636
637static struct clockdomain eve4_7xx_clkdm = {
638 .name = "eve4_clkdm",
639 .pwrdm = { .name = "eve4_pwrdm" },
640 .prcm_partition = DRA7XX_CM_CORE_AON_PARTITION,
641 .cm_inst = DRA7XX_CM_CORE_AON_EVE4_INST,
642 .clkdm_offs = DRA7XX_CM_CORE_AON_EVE4_EVE4_CDOFFS,
643 .dep_bit = DRA7XX_EVE4_STATDEP_SHIFT,
644 .wkdep_srcs = eve4_wkup_sleep_deps,
645 .sleepdep_srcs = eve4_wkup_sleep_deps,
646 .flags = CLKDM_CAN_HWSUP_SWSUP,
647};
648
649static struct clockdomain eve2_7xx_clkdm = {
650 .name = "eve2_clkdm",
651 .pwrdm = { .name = "eve2_pwrdm" },
652 .prcm_partition = DRA7XX_CM_CORE_AON_PARTITION,
653 .cm_inst = DRA7XX_CM_CORE_AON_EVE2_INST,
654 .clkdm_offs = DRA7XX_CM_CORE_AON_EVE2_EVE2_CDOFFS,
655 .dep_bit = DRA7XX_EVE2_STATDEP_SHIFT,
656 .wkdep_srcs = eve2_wkup_sleep_deps,
657 .sleepdep_srcs = eve2_wkup_sleep_deps,
658 .flags = CLKDM_CAN_HWSUP_SWSUP,
659};
660
661static struct clockdomain eve3_7xx_clkdm = {
662 .name = "eve3_clkdm",
663 .pwrdm = { .name = "eve3_pwrdm" },
664 .prcm_partition = DRA7XX_CM_CORE_AON_PARTITION,
665 .cm_inst = DRA7XX_CM_CORE_AON_EVE3_INST,
666 .clkdm_offs = DRA7XX_CM_CORE_AON_EVE3_EVE3_CDOFFS,
667 .dep_bit = DRA7XX_EVE3_STATDEP_SHIFT,
668 .wkdep_srcs = eve3_wkup_sleep_deps,
669 .sleepdep_srcs = eve3_wkup_sleep_deps,
670 .flags = CLKDM_CAN_HWSUP_SWSUP,
671};
672
673static struct clockdomain wkupaon_7xx_clkdm = {
674 .name = "wkupaon_clkdm",
675 .pwrdm = { .name = "wkupaon_pwrdm" },
676 .prcm_partition = DRA7XX_PRM_PARTITION,
677 .cm_inst = DRA7XX_PRM_WKUPAON_CM_INST,
678 .clkdm_offs = DRA7XX_PRM_WKUPAON_CM_WKUPAON_CDOFFS,
679 .dep_bit = DRA7XX_WKUPAON_STATDEP_SHIFT,
680 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
681};
682
683static struct clockdomain eve1_7xx_clkdm = {
684 .name = "eve1_clkdm",
685 .pwrdm = { .name = "eve1_pwrdm" },
686 .prcm_partition = DRA7XX_CM_CORE_AON_PARTITION,
687 .cm_inst = DRA7XX_CM_CORE_AON_EVE1_INST,
688 .clkdm_offs = DRA7XX_CM_CORE_AON_EVE1_EVE1_CDOFFS,
689 .dep_bit = DRA7XX_EVE1_STATDEP_SHIFT,
690 .wkdep_srcs = eve1_wkup_sleep_deps,
691 .sleepdep_srcs = eve1_wkup_sleep_deps,
692 .flags = CLKDM_CAN_HWSUP_SWSUP,
693};
694
695/* As clockdomains are added or removed above, this list must also be changed */
696static struct clockdomain *clockdomains_dra7xx[] __initdata = {
697 &l4per3_7xx_clkdm,
698 &l4per2_7xx_clkdm,
699 &mpu0_7xx_clkdm,
700 &iva_7xx_clkdm,
701 &coreaon_7xx_clkdm,
702 &ipu1_7xx_clkdm,
703 &ipu2_7xx_clkdm,
704 &l3init_7xx_clkdm,
705 &l4sec_7xx_clkdm,
706 &l3main1_7xx_clkdm,
707 &vpe_7xx_clkdm,
708 &mpu_7xx_clkdm,
709 &custefuse_7xx_clkdm,
710 &ipu_7xx_clkdm,
711 &mpu1_7xx_clkdm,
712 &gmac_7xx_clkdm,
713 &l4cfg_7xx_clkdm,
714 &dma_7xx_clkdm,
715 &rtc_7xx_clkdm,
716 &pcie_7xx_clkdm,
717 &atl_7xx_clkdm,
718 &l3instr_7xx_clkdm,
719 &dss_7xx_clkdm,
720 &emif_7xx_clkdm,
721 &emu_7xx_clkdm,
722 &dsp2_7xx_clkdm,
723 &dsp1_7xx_clkdm,
724 &cam_7xx_clkdm,
725 &l4per_7xx_clkdm,
726 &gpu_7xx_clkdm,
727 &eve4_7xx_clkdm,
728 &eve2_7xx_clkdm,
729 &eve3_7xx_clkdm,
730 &wkupaon_7xx_clkdm,
731 &eve1_7xx_clkdm,
732 NULL
733};
734
735void __init dra7xx_clockdomains_init(void)
736{
737 clkdm_register_platform_funcs(&omap4_clkdm_operations);
738 clkdm_register_clkdms(clockdomains_dra7xx);
739 clkdm_complete_init();
740}
diff --git a/arch/arm/mach-omap2/cm-regbits-24xx.h b/arch/arm/mach-omap2/cm-regbits-24xx.h
index 669ef51b17a8..8538669cc2ad 100644
--- a/arch/arm/mach-omap2/cm-regbits-24xx.h
+++ b/arch/arm/mach-omap2/cm-regbits-24xx.h
@@ -14,439 +14,121 @@
14 * published by the Free Software Foundation. 14 * published by the Free Software Foundation.
15 */ 15 */
16 16
17/* Bits shared between registers */
18
19/* CM_FCLKEN1_CORE and CM_ICLKEN1_CORE shared bits */
20#define OMAP24XX_EN_CAM_SHIFT 31 17#define OMAP24XX_EN_CAM_SHIFT 31
21#define OMAP24XX_EN_CAM_MASK (1 << 31)
22#define OMAP24XX_EN_WDT4_SHIFT 29 18#define OMAP24XX_EN_WDT4_SHIFT 29
23#define OMAP24XX_EN_WDT4_MASK (1 << 29)
24#define OMAP2420_EN_WDT3_SHIFT 28 19#define OMAP2420_EN_WDT3_SHIFT 28
25#define OMAP2420_EN_WDT3_MASK (1 << 28)
26#define OMAP24XX_EN_MSPRO_SHIFT 27 20#define OMAP24XX_EN_MSPRO_SHIFT 27
27#define OMAP24XX_EN_MSPRO_MASK (1 << 27)
28#define OMAP24XX_EN_FAC_SHIFT 25 21#define OMAP24XX_EN_FAC_SHIFT 25
29#define OMAP24XX_EN_FAC_MASK (1 << 25)
30#define OMAP2420_EN_EAC_SHIFT 24 22#define OMAP2420_EN_EAC_SHIFT 24
31#define OMAP2420_EN_EAC_MASK (1 << 24)
32#define OMAP24XX_EN_HDQ_SHIFT 23 23#define OMAP24XX_EN_HDQ_SHIFT 23
33#define OMAP24XX_EN_HDQ_MASK (1 << 23)
34#define OMAP2420_EN_I2C2_SHIFT 20 24#define OMAP2420_EN_I2C2_SHIFT 20
35#define OMAP2420_EN_I2C2_MASK (1 << 20)
36#define OMAP2420_EN_I2C1_SHIFT 19 25#define OMAP2420_EN_I2C1_SHIFT 19
37#define OMAP2420_EN_I2C1_MASK (1 << 19)
38
39/* CM_FCLKEN2_CORE and CM_ICLKEN2_CORE shared bits */
40#define OMAP2430_EN_MCBSP5_SHIFT 5 26#define OMAP2430_EN_MCBSP5_SHIFT 5
41#define OMAP2430_EN_MCBSP5_MASK (1 << 5)
42#define OMAP2430_EN_MCBSP4_SHIFT 4 27#define OMAP2430_EN_MCBSP4_SHIFT 4
43#define OMAP2430_EN_MCBSP4_MASK (1 << 4)
44#define OMAP2430_EN_MCBSP3_SHIFT 3 28#define OMAP2430_EN_MCBSP3_SHIFT 3
45#define OMAP2430_EN_MCBSP3_MASK (1 << 3)
46#define OMAP24XX_EN_SSI_SHIFT 1 29#define OMAP24XX_EN_SSI_SHIFT 1
47#define OMAP24XX_EN_SSI_MASK (1 << 1)
48
49/* CM_FCLKEN_WKUP and CM_ICLKEN_WKUP shared bits */
50#define OMAP24XX_EN_MPU_WDT_SHIFT 3 30#define OMAP24XX_EN_MPU_WDT_SHIFT 3
51#define OMAP24XX_EN_MPU_WDT_MASK (1 << 3)
52
53/* Bits specific to each register */
54
55/* CM_IDLEST_MPU */
56/* 2430 only */
57#define OMAP2430_ST_MPU_MASK (1 << 0)
58
59/* CM_CLKSEL_MPU */
60#define OMAP24XX_CLKSEL_MPU_SHIFT 0 31#define OMAP24XX_CLKSEL_MPU_SHIFT 0
61#define OMAP24XX_CLKSEL_MPU_MASK (0x1f << 0)
62#define OMAP24XX_CLKSEL_MPU_WIDTH 5 32#define OMAP24XX_CLKSEL_MPU_WIDTH 5
63
64/* CM_CLKSTCTRL_MPU */
65#define OMAP24XX_AUTOSTATE_MPU_SHIFT 0
66#define OMAP24XX_AUTOSTATE_MPU_MASK (1 << 0) 33#define OMAP24XX_AUTOSTATE_MPU_MASK (1 << 0)
67
68/* CM_FCLKEN1_CORE specific bits*/
69#define OMAP24XX_EN_TV_SHIFT 2 34#define OMAP24XX_EN_TV_SHIFT 2
70#define OMAP24XX_EN_TV_MASK (1 << 2)
71#define OMAP24XX_EN_DSS2_SHIFT 1 35#define OMAP24XX_EN_DSS2_SHIFT 1
72#define OMAP24XX_EN_DSS2_MASK (1 << 1)
73#define OMAP24XX_EN_DSS1_SHIFT 0 36#define OMAP24XX_EN_DSS1_SHIFT 0
74#define OMAP24XX_EN_DSS1_MASK (1 << 0) 37#define OMAP24XX_EN_DSS1_MASK (1 << 0)
75
76/* CM_FCLKEN2_CORE specific bits */
77#define OMAP2430_EN_I2CHS2_SHIFT 20 38#define OMAP2430_EN_I2CHS2_SHIFT 20
78#define OMAP2430_EN_I2CHS2_MASK (1 << 20)
79#define OMAP2430_EN_I2CHS1_SHIFT 19 39#define OMAP2430_EN_I2CHS1_SHIFT 19
80#define OMAP2430_EN_I2CHS1_MASK (1 << 19)
81#define OMAP2430_EN_MMCHSDB2_SHIFT 17 40#define OMAP2430_EN_MMCHSDB2_SHIFT 17
82#define OMAP2430_EN_MMCHSDB2_MASK (1 << 17)
83#define OMAP2430_EN_MMCHSDB1_SHIFT 16 41#define OMAP2430_EN_MMCHSDB1_SHIFT 16
84#define OMAP2430_EN_MMCHSDB1_MASK (1 << 16)
85
86/* CM_ICLKEN1_CORE specific bits */
87#define OMAP24XX_EN_MAILBOXES_SHIFT 30 42#define OMAP24XX_EN_MAILBOXES_SHIFT 30
88#define OMAP24XX_EN_MAILBOXES_MASK (1 << 30)
89#define OMAP24XX_EN_DSS_SHIFT 0
90#define OMAP24XX_EN_DSS_MASK (1 << 0)
91
92/* CM_ICLKEN2_CORE specific bits */
93
94/* CM_ICLKEN3_CORE */
95/* 2430 only */
96#define OMAP2430_EN_SDRC_SHIFT 2 43#define OMAP2430_EN_SDRC_SHIFT 2
97#define OMAP2430_EN_SDRC_MASK (1 << 2)
98
99/* CM_ICLKEN4_CORE */
100#define OMAP24XX_EN_PKA_SHIFT 4 44#define OMAP24XX_EN_PKA_SHIFT 4
101#define OMAP24XX_EN_PKA_MASK (1 << 4)
102#define OMAP24XX_EN_AES_SHIFT 3 45#define OMAP24XX_EN_AES_SHIFT 3
103#define OMAP24XX_EN_AES_MASK (1 << 3)
104#define OMAP24XX_EN_RNG_SHIFT 2 46#define OMAP24XX_EN_RNG_SHIFT 2
105#define OMAP24XX_EN_RNG_MASK (1 << 2)
106#define OMAP24XX_EN_SHA_SHIFT 1 47#define OMAP24XX_EN_SHA_SHIFT 1
107#define OMAP24XX_EN_SHA_MASK (1 << 1)
108#define OMAP24XX_EN_DES_SHIFT 0 48#define OMAP24XX_EN_DES_SHIFT 0
109#define OMAP24XX_EN_DES_MASK (1 << 0)
110
111/* CM_IDLEST1_CORE specific bits */
112#define OMAP24XX_ST_MAILBOXES_SHIFT 30 49#define OMAP24XX_ST_MAILBOXES_SHIFT 30
113#define OMAP24XX_ST_MAILBOXES_MASK (1 << 30)
114#define OMAP24XX_ST_WDT4_SHIFT 29
115#define OMAP24XX_ST_WDT4_MASK (1 << 29)
116#define OMAP2420_ST_WDT3_SHIFT 28
117#define OMAP2420_ST_WDT3_MASK (1 << 28)
118#define OMAP24XX_ST_MSPRO_SHIFT 27
119#define OMAP24XX_ST_MSPRO_MASK (1 << 27)
120#define OMAP24XX_ST_FAC_SHIFT 25
121#define OMAP24XX_ST_FAC_MASK (1 << 25)
122#define OMAP2420_ST_EAC_SHIFT 24
123#define OMAP2420_ST_EAC_MASK (1 << 24)
124#define OMAP24XX_ST_HDQ_SHIFT 23 50#define OMAP24XX_ST_HDQ_SHIFT 23
125#define OMAP24XX_ST_HDQ_MASK (1 << 23)
126#define OMAP2420_ST_I2C2_SHIFT 20 51#define OMAP2420_ST_I2C2_SHIFT 20
127#define OMAP2420_ST_I2C2_MASK (1 << 20)
128#define OMAP2430_ST_I2CHS1_SHIFT 19 52#define OMAP2430_ST_I2CHS1_SHIFT 19
129#define OMAP2430_ST_I2CHS1_MASK (1 << 19)
130#define OMAP2420_ST_I2C1_SHIFT 19 53#define OMAP2420_ST_I2C1_SHIFT 19
131#define OMAP2420_ST_I2C1_MASK (1 << 19)
132#define OMAP2430_ST_I2CHS2_SHIFT 20 54#define OMAP2430_ST_I2CHS2_SHIFT 20
133#define OMAP2430_ST_I2CHS2_MASK (1 << 20)
134#define OMAP24XX_ST_MCBSP2_SHIFT 16 55#define OMAP24XX_ST_MCBSP2_SHIFT 16
135#define OMAP24XX_ST_MCBSP2_MASK (1 << 16)
136#define OMAP24XX_ST_MCBSP1_SHIFT 15 56#define OMAP24XX_ST_MCBSP1_SHIFT 15
137#define OMAP24XX_ST_MCBSP1_MASK (1 << 15)
138#define OMAP24XX_ST_DSS_SHIFT 0 57#define OMAP24XX_ST_DSS_SHIFT 0
139#define OMAP24XX_ST_DSS_MASK (1 << 0)
140
141/* CM_IDLEST2_CORE */
142#define OMAP2430_ST_MCBSP5_SHIFT 5 58#define OMAP2430_ST_MCBSP5_SHIFT 5
143#define OMAP2430_ST_MCBSP5_MASK (1 << 5)
144#define OMAP2430_ST_MCBSP4_SHIFT 4 59#define OMAP2430_ST_MCBSP4_SHIFT 4
145#define OMAP2430_ST_MCBSP4_MASK (1 << 4)
146#define OMAP2430_ST_MCBSP3_SHIFT 3 60#define OMAP2430_ST_MCBSP3_SHIFT 3
147#define OMAP2430_ST_MCBSP3_MASK (1 << 3)
148#define OMAP24XX_ST_SSI_SHIFT 1
149#define OMAP24XX_ST_SSI_MASK (1 << 1)
150
151/* CM_IDLEST3_CORE */
152/* 2430 only */
153#define OMAP2430_ST_SDRC_MASK (1 << 2)
154
155/* CM_IDLEST4_CORE */
156#define OMAP24XX_ST_PKA_SHIFT 4
157#define OMAP24XX_ST_PKA_MASK (1 << 4)
158#define OMAP24XX_ST_AES_SHIFT 3 61#define OMAP24XX_ST_AES_SHIFT 3
159#define OMAP24XX_ST_AES_MASK (1 << 3)
160#define OMAP24XX_ST_RNG_SHIFT 2 62#define OMAP24XX_ST_RNG_SHIFT 2
161#define OMAP24XX_ST_RNG_MASK (1 << 2)
162#define OMAP24XX_ST_SHA_SHIFT 1 63#define OMAP24XX_ST_SHA_SHIFT 1
163#define OMAP24XX_ST_SHA_MASK (1 << 1)
164#define OMAP24XX_ST_DES_SHIFT 0
165#define OMAP24XX_ST_DES_MASK (1 << 0)
166
167/* CM_AUTOIDLE1_CORE */
168#define OMAP24XX_AUTO_CAM_MASK (1 << 31)
169#define OMAP24XX_AUTO_MAILBOXES_MASK (1 << 30)
170#define OMAP24XX_AUTO_WDT4_MASK (1 << 29)
171#define OMAP2420_AUTO_WDT3_MASK (1 << 28)
172#define OMAP24XX_AUTO_MSPRO_MASK (1 << 27)
173#define OMAP2420_AUTO_MMC_MASK (1 << 26)
174#define OMAP24XX_AUTO_FAC_MASK (1 << 25)
175#define OMAP2420_AUTO_EAC_MASK (1 << 24)
176#define OMAP24XX_AUTO_HDQ_MASK (1 << 23)
177#define OMAP24XX_AUTO_UART2_MASK (1 << 22)
178#define OMAP24XX_AUTO_UART1_MASK (1 << 21)
179#define OMAP24XX_AUTO_I2C2_MASK (1 << 20)
180#define OMAP24XX_AUTO_I2C1_MASK (1 << 19)
181#define OMAP24XX_AUTO_MCSPI2_MASK (1 << 18)
182#define OMAP24XX_AUTO_MCSPI1_MASK (1 << 17)
183#define OMAP24XX_AUTO_MCBSP2_MASK (1 << 16)
184#define OMAP24XX_AUTO_MCBSP1_MASK (1 << 15)
185#define OMAP24XX_AUTO_GPT12_MASK (1 << 14)
186#define OMAP24XX_AUTO_GPT11_MASK (1 << 13)
187#define OMAP24XX_AUTO_GPT10_MASK (1 << 12)
188#define OMAP24XX_AUTO_GPT9_MASK (1 << 11)
189#define OMAP24XX_AUTO_GPT8_MASK (1 << 10)
190#define OMAP24XX_AUTO_GPT7_MASK (1 << 9)
191#define OMAP24XX_AUTO_GPT6_MASK (1 << 8)
192#define OMAP24XX_AUTO_GPT5_MASK (1 << 7)
193#define OMAP24XX_AUTO_GPT4_MASK (1 << 6)
194#define OMAP24XX_AUTO_GPT3_MASK (1 << 5)
195#define OMAP24XX_AUTO_GPT2_MASK (1 << 4)
196#define OMAP2420_AUTO_VLYNQ_MASK (1 << 3)
197#define OMAP24XX_AUTO_DSS_MASK (1 << 0)
198
199/* CM_AUTOIDLE2_CORE */
200#define OMAP2430_AUTO_MDM_INTC_MASK (1 << 11)
201#define OMAP2430_AUTO_GPIO5_MASK (1 << 10)
202#define OMAP2430_AUTO_MCSPI3_MASK (1 << 9)
203#define OMAP2430_AUTO_MMCHS2_MASK (1 << 8)
204#define OMAP2430_AUTO_MMCHS1_MASK (1 << 7)
205#define OMAP2430_AUTO_USBHS_MASK (1 << 6)
206#define OMAP2430_AUTO_MCBSP5_MASK (1 << 5)
207#define OMAP2430_AUTO_MCBSP4_MASK (1 << 4)
208#define OMAP2430_AUTO_MCBSP3_MASK (1 << 3)
209#define OMAP24XX_AUTO_UART3_MASK (1 << 2)
210#define OMAP24XX_AUTO_SSI_MASK (1 << 1)
211#define OMAP24XX_AUTO_USB_MASK (1 << 0)
212
213/* CM_AUTOIDLE3_CORE */
214#define OMAP24XX_AUTO_SDRC_SHIFT 2 64#define OMAP24XX_AUTO_SDRC_SHIFT 2
215#define OMAP24XX_AUTO_SDRC_MASK (1 << 2)
216#define OMAP24XX_AUTO_GPMC_SHIFT 1 65#define OMAP24XX_AUTO_GPMC_SHIFT 1
217#define OMAP24XX_AUTO_GPMC_MASK (1 << 1)
218#define OMAP24XX_AUTO_SDMA_SHIFT 0 66#define OMAP24XX_AUTO_SDMA_SHIFT 0
219#define OMAP24XX_AUTO_SDMA_MASK (1 << 0)
220
221/* CM_AUTOIDLE4_CORE */
222#define OMAP24XX_AUTO_PKA_MASK (1 << 4)
223#define OMAP24XX_AUTO_AES_MASK (1 << 3)
224#define OMAP24XX_AUTO_RNG_MASK (1 << 2)
225#define OMAP24XX_AUTO_SHA_MASK (1 << 1)
226#define OMAP24XX_AUTO_DES_MASK (1 << 0)
227
228/* CM_CLKSEL1_CORE */
229#define OMAP24XX_CLKSEL_USB_SHIFT 25
230#define OMAP24XX_CLKSEL_USB_MASK (0x7 << 25) 67#define OMAP24XX_CLKSEL_USB_MASK (0x7 << 25)
231#define OMAP24XX_CLKSEL_SSI_SHIFT 20
232#define OMAP24XX_CLKSEL_SSI_MASK (0x1f << 20) 68#define OMAP24XX_CLKSEL_SSI_MASK (0x1f << 20)
233#define OMAP2420_CLKSEL_VLYNQ_SHIFT 15
234#define OMAP2420_CLKSEL_VLYNQ_MASK (0x1f << 15) 69#define OMAP2420_CLKSEL_VLYNQ_MASK (0x1f << 15)
235#define OMAP24XX_CLKSEL_DSS2_SHIFT 13
236#define OMAP24XX_CLKSEL_DSS2_MASK (0x1 << 13) 70#define OMAP24XX_CLKSEL_DSS2_MASK (0x1 << 13)
237#define OMAP24XX_CLKSEL_DSS1_SHIFT 8
238#define OMAP24XX_CLKSEL_DSS1_MASK (0x1f << 8) 71#define OMAP24XX_CLKSEL_DSS1_MASK (0x1f << 8)
239#define OMAP24XX_CLKSEL_L4_SHIFT 5 72#define OMAP24XX_CLKSEL_L4_SHIFT 5
240#define OMAP24XX_CLKSEL_L4_MASK (0x3 << 5)
241#define OMAP24XX_CLKSEL_L4_WIDTH 2 73#define OMAP24XX_CLKSEL_L4_WIDTH 2
242#define OMAP24XX_CLKSEL_L3_SHIFT 0 74#define OMAP24XX_CLKSEL_L3_SHIFT 0
243#define OMAP24XX_CLKSEL_L3_MASK (0x1f << 0)
244#define OMAP24XX_CLKSEL_L3_WIDTH 5 75#define OMAP24XX_CLKSEL_L3_WIDTH 5
245
246/* CM_CLKSEL2_CORE */
247#define OMAP24XX_CLKSEL_GPT12_SHIFT 22
248#define OMAP24XX_CLKSEL_GPT12_MASK (0x3 << 22) 76#define OMAP24XX_CLKSEL_GPT12_MASK (0x3 << 22)
249#define OMAP24XX_CLKSEL_GPT11_SHIFT 20
250#define OMAP24XX_CLKSEL_GPT11_MASK (0x3 << 20) 77#define OMAP24XX_CLKSEL_GPT11_MASK (0x3 << 20)
251#define OMAP24XX_CLKSEL_GPT10_SHIFT 18
252#define OMAP24XX_CLKSEL_GPT10_MASK (0x3 << 18) 78#define OMAP24XX_CLKSEL_GPT10_MASK (0x3 << 18)
253#define OMAP24XX_CLKSEL_GPT9_SHIFT 16
254#define OMAP24XX_CLKSEL_GPT9_MASK (0x3 << 16) 79#define OMAP24XX_CLKSEL_GPT9_MASK (0x3 << 16)
255#define OMAP24XX_CLKSEL_GPT8_SHIFT 14
256#define OMAP24XX_CLKSEL_GPT8_MASK (0x3 << 14) 80#define OMAP24XX_CLKSEL_GPT8_MASK (0x3 << 14)
257#define OMAP24XX_CLKSEL_GPT7_SHIFT 12
258#define OMAP24XX_CLKSEL_GPT7_MASK (0x3 << 12) 81#define OMAP24XX_CLKSEL_GPT7_MASK (0x3 << 12)
259#define OMAP24XX_CLKSEL_GPT6_SHIFT 10
260#define OMAP24XX_CLKSEL_GPT6_MASK (0x3 << 10) 82#define OMAP24XX_CLKSEL_GPT6_MASK (0x3 << 10)
261#define OMAP24XX_CLKSEL_GPT5_SHIFT 8
262#define OMAP24XX_CLKSEL_GPT5_MASK (0x3 << 8) 83#define OMAP24XX_CLKSEL_GPT5_MASK (0x3 << 8)
263#define OMAP24XX_CLKSEL_GPT4_SHIFT 6
264#define OMAP24XX_CLKSEL_GPT4_MASK (0x3 << 6) 84#define OMAP24XX_CLKSEL_GPT4_MASK (0x3 << 6)
265#define OMAP24XX_CLKSEL_GPT3_SHIFT 4
266#define OMAP24XX_CLKSEL_GPT3_MASK (0x3 << 4) 85#define OMAP24XX_CLKSEL_GPT3_MASK (0x3 << 4)
267#define OMAP24XX_CLKSEL_GPT2_SHIFT 2
268#define OMAP24XX_CLKSEL_GPT2_MASK (0x3 << 2) 86#define OMAP24XX_CLKSEL_GPT2_MASK (0x3 << 2)
269
270/* CM_CLKSTCTRL_CORE */
271#define OMAP24XX_AUTOSTATE_DSS_SHIFT 2
272#define OMAP24XX_AUTOSTATE_DSS_MASK (1 << 2) 87#define OMAP24XX_AUTOSTATE_DSS_MASK (1 << 2)
273#define OMAP24XX_AUTOSTATE_L4_SHIFT 1
274#define OMAP24XX_AUTOSTATE_L4_MASK (1 << 1) 88#define OMAP24XX_AUTOSTATE_L4_MASK (1 << 1)
275#define OMAP24XX_AUTOSTATE_L3_SHIFT 0
276#define OMAP24XX_AUTOSTATE_L3_MASK (1 << 0) 89#define OMAP24XX_AUTOSTATE_L3_MASK (1 << 0)
277
278/* CM_FCLKEN_GFX */
279#define OMAP24XX_EN_3D_SHIFT 2 90#define OMAP24XX_EN_3D_SHIFT 2
280#define OMAP24XX_EN_3D_MASK (1 << 2)
281#define OMAP24XX_EN_2D_SHIFT 1 91#define OMAP24XX_EN_2D_SHIFT 1
282#define OMAP24XX_EN_2D_MASK (1 << 1)
283
284/* CM_ICLKEN_GFX specific bits */
285
286/* CM_IDLEST_GFX specific bits */
287
288/* CM_CLKSEL_GFX specific bits */
289
290/* CM_CLKSTCTRL_GFX */
291#define OMAP24XX_AUTOSTATE_GFX_SHIFT 0
292#define OMAP24XX_AUTOSTATE_GFX_MASK (1 << 0) 92#define OMAP24XX_AUTOSTATE_GFX_MASK (1 << 0)
293
294/* CM_FCLKEN_WKUP specific bits */
295
296/* CM_ICLKEN_WKUP specific bits */
297#define OMAP2430_EN_ICR_SHIFT 6 93#define OMAP2430_EN_ICR_SHIFT 6
298#define OMAP2430_EN_ICR_MASK (1 << 6)
299#define OMAP24XX_EN_OMAPCTRL_SHIFT 5 94#define OMAP24XX_EN_OMAPCTRL_SHIFT 5
300#define OMAP24XX_EN_OMAPCTRL_MASK (1 << 5)
301#define OMAP24XX_EN_WDT1_SHIFT 4 95#define OMAP24XX_EN_WDT1_SHIFT 4
302#define OMAP24XX_EN_WDT1_MASK (1 << 4)
303#define OMAP24XX_EN_32KSYNC_SHIFT 1 96#define OMAP24XX_EN_32KSYNC_SHIFT 1
304#define OMAP24XX_EN_32KSYNC_MASK (1 << 1)
305
306/* CM_IDLEST_WKUP specific bits */
307#define OMAP2430_ST_ICR_SHIFT 6
308#define OMAP2430_ST_ICR_MASK (1 << 6)
309#define OMAP24XX_ST_OMAPCTRL_SHIFT 5
310#define OMAP24XX_ST_OMAPCTRL_MASK (1 << 5)
311#define OMAP24XX_ST_WDT1_SHIFT 4
312#define OMAP24XX_ST_WDT1_MASK (1 << 4)
313#define OMAP24XX_ST_MPU_WDT_SHIFT 3 97#define OMAP24XX_ST_MPU_WDT_SHIFT 3
314#define OMAP24XX_ST_MPU_WDT_MASK (1 << 3)
315#define OMAP24XX_ST_32KSYNC_SHIFT 1 98#define OMAP24XX_ST_32KSYNC_SHIFT 1
316#define OMAP24XX_ST_32KSYNC_MASK (1 << 1)
317
318/* CM_AUTOIDLE_WKUP */
319#define OMAP24XX_AUTO_OMAPCTRL_MASK (1 << 5)
320#define OMAP24XX_AUTO_WDT1_MASK (1 << 4)
321#define OMAP24XX_AUTO_MPU_WDT_MASK (1 << 3)
322#define OMAP24XX_AUTO_GPIOS_MASK (1 << 2)
323#define OMAP24XX_AUTO_32KSYNC_MASK (1 << 1)
324#define OMAP24XX_AUTO_GPT1_MASK (1 << 0)
325
326/* CM_CLKSEL_WKUP */
327#define OMAP24XX_CLKSEL_GPT1_SHIFT 0
328#define OMAP24XX_CLKSEL_GPT1_MASK (0x3 << 0) 99#define OMAP24XX_CLKSEL_GPT1_MASK (0x3 << 0)
329
330/* CM_CLKEN_PLL */
331#define OMAP24XX_EN_54M_PLL_SHIFT 6 100#define OMAP24XX_EN_54M_PLL_SHIFT 6
332#define OMAP24XX_EN_54M_PLL_MASK (0x3 << 6)
333#define OMAP24XX_EN_96M_PLL_SHIFT 2 101#define OMAP24XX_EN_96M_PLL_SHIFT 2
334#define OMAP24XX_EN_96M_PLL_MASK (0x3 << 2)
335#define OMAP24XX_EN_DPLL_SHIFT 0
336#define OMAP24XX_EN_DPLL_MASK (0x3 << 0) 102#define OMAP24XX_EN_DPLL_MASK (0x3 << 0)
337
338/* CM_IDLEST_CKGEN */
339#define OMAP24XX_ST_54M_APLL_SHIFT 9 103#define OMAP24XX_ST_54M_APLL_SHIFT 9
340#define OMAP24XX_ST_54M_APLL_MASK (1 << 9)
341#define OMAP24XX_ST_96M_APLL_SHIFT 8 104#define OMAP24XX_ST_96M_APLL_SHIFT 8
342#define OMAP24XX_ST_96M_APLL_MASK (1 << 8)
343#define OMAP24XX_ST_54M_CLK_MASK (1 << 6)
344#define OMAP24XX_ST_12M_CLK_MASK (1 << 5)
345#define OMAP24XX_ST_48M_CLK_MASK (1 << 4)
346#define OMAP24XX_ST_96M_CLK_MASK (1 << 2)
347#define OMAP24XX_ST_CORE_CLK_SHIFT 0
348#define OMAP24XX_ST_CORE_CLK_MASK (0x3 << 0)
349
350/* CM_AUTOIDLE_PLL */
351#define OMAP24XX_AUTO_54M_SHIFT 6
352#define OMAP24XX_AUTO_54M_MASK (0x3 << 6) 105#define OMAP24XX_AUTO_54M_MASK (0x3 << 6)
353#define OMAP24XX_AUTO_96M_SHIFT 2
354#define OMAP24XX_AUTO_96M_MASK (0x3 << 2) 106#define OMAP24XX_AUTO_96M_MASK (0x3 << 2)
355#define OMAP24XX_AUTO_DPLL_SHIFT 0 107#define OMAP24XX_AUTO_DPLL_SHIFT 0
356#define OMAP24XX_AUTO_DPLL_MASK (0x3 << 0) 108#define OMAP24XX_AUTO_DPLL_MASK (0x3 << 0)
357
358/* CM_CLKSEL1_PLL */
359#define OMAP2430_MAXDPLLFASTLOCK_SHIFT 28
360#define OMAP2430_MAXDPLLFASTLOCK_MASK (0x7 << 28)
361#define OMAP24XX_APLLS_CLKIN_SHIFT 23 109#define OMAP24XX_APLLS_CLKIN_SHIFT 23
362#define OMAP24XX_APLLS_CLKIN_MASK (0x7 << 23) 110#define OMAP24XX_APLLS_CLKIN_MASK (0x7 << 23)
363#define OMAP24XX_DPLL_MULT_SHIFT 12
364#define OMAP24XX_DPLL_MULT_MASK (0x3ff << 12) 111#define OMAP24XX_DPLL_MULT_MASK (0x3ff << 12)
365#define OMAP24XX_DPLL_DIV_SHIFT 8
366#define OMAP24XX_DPLL_DIV_MASK (0xf << 8) 112#define OMAP24XX_DPLL_DIV_MASK (0xf << 8)
367#define OMAP24XX_54M_SOURCE_SHIFT 5 113#define OMAP24XX_54M_SOURCE_SHIFT 5
368#define OMAP24XX_54M_SOURCE_MASK (1 << 5)
369#define OMAP24XX_54M_SOURCE_WIDTH 1 114#define OMAP24XX_54M_SOURCE_WIDTH 1
370#define OMAP2430_96M_SOURCE_SHIFT 4 115#define OMAP2430_96M_SOURCE_SHIFT 4
371#define OMAP2430_96M_SOURCE_MASK (1 << 4)
372#define OMAP2430_96M_SOURCE_WIDTH 1 116#define OMAP2430_96M_SOURCE_WIDTH 1
373#define OMAP24XX_48M_SOURCE_SHIFT 3
374#define OMAP24XX_48M_SOURCE_MASK (1 << 3) 117#define OMAP24XX_48M_SOURCE_MASK (1 << 3)
375#define OMAP2430_ALTCLK_SOURCE_SHIFT 0
376#define OMAP2430_ALTCLK_SOURCE_MASK (0x7 << 0)
377
378/* CM_CLKSEL2_PLL */
379#define OMAP24XX_CORE_CLK_SRC_SHIFT 0
380#define OMAP24XX_CORE_CLK_SRC_MASK (0x3 << 0) 118#define OMAP24XX_CORE_CLK_SRC_MASK (0x3 << 0)
381
382/* CM_FCLKEN_DSP */
383#define OMAP2420_EN_IVA_COP_SHIFT 10 119#define OMAP2420_EN_IVA_COP_SHIFT 10
384#define OMAP2420_EN_IVA_COP_MASK (1 << 10)
385#define OMAP2420_EN_IVA_MPU_SHIFT 8 120#define OMAP2420_EN_IVA_MPU_SHIFT 8
386#define OMAP2420_EN_IVA_MPU_MASK (1 << 8)
387#define OMAP24XX_CM_FCLKEN_DSP_EN_DSP_SHIFT 0 121#define OMAP24XX_CM_FCLKEN_DSP_EN_DSP_SHIFT 0
388#define OMAP24XX_CM_FCLKEN_DSP_EN_DSP_MASK (1 << 0)
389
390/* CM_ICLKEN_DSP */
391#define OMAP2420_EN_DSP_IPI_SHIFT 1 122#define OMAP2420_EN_DSP_IPI_SHIFT 1
392#define OMAP2420_EN_DSP_IPI_MASK (1 << 1)
393
394/* CM_IDLEST_DSP */
395#define OMAP2420_ST_IVA_MASK (1 << 8)
396#define OMAP2420_ST_IPI_MASK (1 << 1)
397#define OMAP24XX_ST_DSP_MASK (1 << 0)
398
399/* CM_AUTOIDLE_DSP */
400#define OMAP2420_AUTO_DSP_IPI_MASK (1 << 1)
401
402/* CM_CLKSEL_DSP */
403#define OMAP2420_SYNC_IVA_MASK (1 << 13)
404#define OMAP2420_CLKSEL_IVA_SHIFT 8
405#define OMAP2420_CLKSEL_IVA_MASK (0x1f << 8) 123#define OMAP2420_CLKSEL_IVA_MASK (0x1f << 8)
406#define OMAP24XX_SYNC_DSP_MASK (1 << 7)
407#define OMAP24XX_CLKSEL_DSP_IF_SHIFT 5
408#define OMAP24XX_CLKSEL_DSP_IF_MASK (0x3 << 5) 124#define OMAP24XX_CLKSEL_DSP_IF_MASK (0x3 << 5)
409#define OMAP24XX_CLKSEL_DSP_SHIFT 0
410#define OMAP24XX_CLKSEL_DSP_MASK (0x1f << 0) 125#define OMAP24XX_CLKSEL_DSP_MASK (0x1f << 0)
411
412/* CM_CLKSTCTRL_DSP */
413#define OMAP2420_AUTOSTATE_IVA_SHIFT 8
414#define OMAP2420_AUTOSTATE_IVA_MASK (1 << 8) 126#define OMAP2420_AUTOSTATE_IVA_MASK (1 << 8)
415#define OMAP24XX_AUTOSTATE_DSP_SHIFT 0
416#define OMAP24XX_AUTOSTATE_DSP_MASK (1 << 0) 127#define OMAP24XX_AUTOSTATE_DSP_MASK (1 << 0)
417
418/* CM_FCLKEN_MDM */
419/* 2430 only */
420#define OMAP2430_EN_OSC_SHIFT 1 128#define OMAP2430_EN_OSC_SHIFT 1
421#define OMAP2430_EN_OSC_MASK (1 << 1)
422
423/* CM_ICLKEN_MDM */
424/* 2430 only */
425#define OMAP2430_CM_ICLKEN_MDM_EN_MDM_SHIFT 0 129#define OMAP2430_CM_ICLKEN_MDM_EN_MDM_SHIFT 0
426#define OMAP2430_CM_ICLKEN_MDM_EN_MDM_MASK (1 << 0)
427
428/* CM_IDLEST_MDM specific bits */
429/* 2430 only */
430
431/* CM_AUTOIDLE_MDM */
432/* 2430 only */
433#define OMAP2430_AUTO_OSC_MASK (1 << 1)
434#define OMAP2430_AUTO_MDM_MASK (1 << 0)
435
436/* CM_CLKSEL_MDM */
437/* 2430 only */
438#define OMAP2430_SYNC_MDM_MASK (1 << 4)
439#define OMAP2430_CLKSEL_MDM_SHIFT 0
440#define OMAP2430_CLKSEL_MDM_MASK (0xf << 0) 130#define OMAP2430_CLKSEL_MDM_MASK (0xf << 0)
441
442/* CM_CLKSTCTRL_MDM */
443/* 2430 only */
444#define OMAP2430_AUTOSTATE_MDM_SHIFT 0
445#define OMAP2430_AUTOSTATE_MDM_MASK (1 << 0) 131#define OMAP2430_AUTOSTATE_MDM_MASK (1 << 0)
446
447/* OMAP24XX CM_CLKSTCTRL_*.AUTOSTATE_* register bit values */
448#define OMAP24XX_CLKSTCTRL_DISABLE_AUTO 0x0 132#define OMAP24XX_CLKSTCTRL_DISABLE_AUTO 0x0
449#define OMAP24XX_CLKSTCTRL_ENABLE_AUTO 0x1 133#define OMAP24XX_CLKSTCTRL_ENABLE_AUTO 0x1
450
451
452#endif 134#endif
diff --git a/arch/arm/mach-omap2/cm-regbits-33xx.h b/arch/arm/mach-omap2/cm-regbits-33xx.h
index adf7bb79b18f..c0823fd6d5e0 100644
--- a/arch/arm/mach-omap2/cm-regbits-33xx.h
+++ b/arch/arm/mach-omap2/cm-regbits-33xx.h
@@ -20,798 +20,49 @@
20#ifndef __ARCH_ARM_MACH_OMAP2_CM_REGBITS_33XX_H 20#ifndef __ARCH_ARM_MACH_OMAP2_CM_REGBITS_33XX_H
21#define __ARCH_ARM_MACH_OMAP2_CM_REGBITS_33XX_H 21#define __ARCH_ARM_MACH_OMAP2_CM_REGBITS_33XX_H
22 22
23/*
24 * Used by CM_AUTOIDLE_DPLL_CORE, CM_AUTOIDLE_DPLL_DDR, CM_AUTOIDLE_DPLL_DISP,
25 * CM_AUTOIDLE_DPLL_MPU, CM_AUTOIDLE_DPLL_PER
26 */
27#define AM33XX_AUTO_DPLL_MODE_SHIFT 0
28#define AM33XX_AUTO_DPLL_MODE_WIDTH 3
29#define AM33XX_AUTO_DPLL_MODE_MASK (0x7 << 0)
30
31/* Used by CM_WKUP_CLKSTCTRL */
32#define AM33XX_CLKACTIVITY_ADC_FCLK_SHIFT 14
33#define AM33XX_CLKACTIVITY_ADC_FCLK_WIDTH 1
34#define AM33XX_CLKACTIVITY_ADC_FCLK_MASK (1 << 16)
35
36/* Used by CM_PER_L4LS_CLKSTCTRL */
37#define AM33XX_CLKACTIVITY_CAN_CLK_SHIFT 11
38#define AM33XX_CLKACTIVITY_CAN_CLK_WIDTH 1
39#define AM33XX_CLKACTIVITY_CAN_CLK_MASK (1 << 11)
40
41/* Used by CM_PER_CLK_24MHZ_CLKSTCTRL */
42#define AM33XX_CLKACTIVITY_CLK_24MHZ_GCLK_SHIFT 4
43#define AM33XX_CLKACTIVITY_CLK_24MHZ_GCLK_WIDTH 1
44#define AM33XX_CLKACTIVITY_CLK_24MHZ_GCLK_MASK (1 << 4)
45
46/* Used by CM_PER_CPSW_CLKSTCTRL */
47#define AM33XX_CLKACTIVITY_CPSW_125MHZ_GCLK_SHIFT 4
48#define AM33XX_CLKACTIVITY_CPSW_125MHZ_GCLK_WIDTH 1
49#define AM33XX_CLKACTIVITY_CPSW_125MHZ_GCLK_MASK (1 << 4)
50
51/* Used by CM_PER_L4HS_CLKSTCTRL */
52#define AM33XX_CLKACTIVITY_CPSW_250MHZ_GCLK_SHIFT 4
53#define AM33XX_CLKACTIVITY_CPSW_250MHZ_GCLK_WIDTH 1
54#define AM33XX_CLKACTIVITY_CPSW_250MHZ_GCLK_MASK (1 << 4)
55
56/* Used by CM_PER_L4HS_CLKSTCTRL */
57#define AM33XX_CLKACTIVITY_CPSW_50MHZ_GCLK_SHIFT 5
58#define AM33XX_CLKACTIVITY_CPSW_50MHZ_GCLK_WIDTH 1
59#define AM33XX_CLKACTIVITY_CPSW_50MHZ_GCLK_MASK (1 << 5)
60
61/* Used by CM_PER_L4HS_CLKSTCTRL */
62#define AM33XX_CLKACTIVITY_CPSW_5MHZ_GCLK_SHIFT 6
63#define AM33XX_CLKACTIVITY_CPSW_5MHZ_GCLK_WIDTH 1
64#define AM33XX_CLKACTIVITY_CPSW_5MHZ_GCLK_MASK (1 << 6)
65
66/* Used by CM_PER_L3_CLKSTCTRL */
67#define AM33XX_CLKACTIVITY_CPTS_RFT_GCLK_SHIFT 6
68#define AM33XX_CLKACTIVITY_CPTS_RFT_GCLK_WIDTH 1
69#define AM33XX_CLKACTIVITY_CPTS_RFT_GCLK_MASK (1 << 6)
70
71/* Used by CM_CEFUSE_CLKSTCTRL */
72#define AM33XX_CLKACTIVITY_CUST_EFUSE_SYS_CLK_SHIFT 9
73#define AM33XX_CLKACTIVITY_CUST_EFUSE_SYS_CLK_WIDTH 1
74#define AM33XX_CLKACTIVITY_CUST_EFUSE_SYS_CLK_MASK (1 << 9)
75
76/* Used by CM_L3_AON_CLKSTCTRL */
77#define AM33XX_CLKACTIVITY_DBGSYSCLK_SHIFT 2
78#define AM33XX_CLKACTIVITY_DBGSYSCLK_WIDTH 1
79#define AM33XX_CLKACTIVITY_DBGSYSCLK_MASK (1 << 2)
80
81/* Used by CM_L3_AON_CLKSTCTRL */
82#define AM33XX_CLKACTIVITY_DEBUG_CLKA_SHIFT 4
83#define AM33XX_CLKACTIVITY_DEBUG_CLKA_WIDTH 1
84#define AM33XX_CLKACTIVITY_DEBUG_CLKA_MASK (1 << 4)
85
86/* Used by CM_PER_L3_CLKSTCTRL */
87#define AM33XX_CLKACTIVITY_EMIF_GCLK_SHIFT 2
88#define AM33XX_CLKACTIVITY_EMIF_GCLK_WIDTH 1
89#define AM33XX_CLKACTIVITY_EMIF_GCLK_MASK (1 << 2)
90
91/* Used by CM_GFX_L3_CLKSTCTRL */
92#define AM33XX_CLKACTIVITY_GFX_FCLK_SHIFT 9
93#define AM33XX_CLKACTIVITY_GFX_FCLK_WIDTH 1
94#define AM33XX_CLKACTIVITY_GFX_FCLK_MASK (1 << 9)
95
96/* Used by CM_GFX_L3_CLKSTCTRL */
97#define AM33XX_CLKACTIVITY_GFX_L3_GCLK_SHIFT 8
98#define AM33XX_CLKACTIVITY_GFX_L3_GCLK_WIDTH 1
99#define AM33XX_CLKACTIVITY_GFX_L3_GCLK_MASK (1 << 8)
100
101/* Used by CM_WKUP_CLKSTCTRL */
102#define AM33XX_CLKACTIVITY_GPIO0_GDBCLK_SHIFT 8
103#define AM33XX_CLKACTIVITY_GPIO0_GDBCLK_WIDTH 1
104#define AM33XX_CLKACTIVITY_GPIO0_GDBCLK_MASK (1 << 8)
105
106/* Used by CM_PER_L4LS_CLKSTCTRL */
107#define AM33XX_CLKACTIVITY_GPIO_1_GDBCLK_SHIFT 19
108#define AM33XX_CLKACTIVITY_GPIO_1_GDBCLK_WIDTH 1
109#define AM33XX_CLKACTIVITY_GPIO_1_GDBCLK_MASK (1 << 19)
110
111/* Used by CM_PER_L4LS_CLKSTCTRL */
112#define AM33XX_CLKACTIVITY_GPIO_2_GDBCLK_SHIFT 20
113#define AM33XX_CLKACTIVITY_GPIO_2_GDBCLK_WIDTH 1
114#define AM33XX_CLKACTIVITY_GPIO_2_GDBCLK_MASK (1 << 20)
115
116/* Used by CM_PER_L4LS_CLKSTCTRL */
117#define AM33XX_CLKACTIVITY_GPIO_3_GDBCLK_SHIFT 21
118#define AM33XX_CLKACTIVITY_GPIO_3_GDBCLK_WIDTH 1
119#define AM33XX_CLKACTIVITY_GPIO_3_GDBCLK_MASK (1 << 21)
120
121/* Used by CM_PER_L4LS_CLKSTCTRL */
122#define AM33XX_CLKACTIVITY_GPIO_4_GDBCLK_SHIFT 22
123#define AM33XX_CLKACTIVITY_GPIO_4_GDBCLK_WIDTH 1
124#define AM33XX_CLKACTIVITY_GPIO_4_GDBCLK_MASK (1 << 22)
125
126/* Used by CM_PER_L4LS_CLKSTCTRL */
127#define AM33XX_CLKACTIVITY_GPIO_5_GDBCLK_SHIFT 26
128#define AM33XX_CLKACTIVITY_GPIO_5_GDBCLK_WIDTH 1
129#define AM33XX_CLKACTIVITY_GPIO_5_GDBCLK_MASK (1 << 26)
130
131/* Used by CM_PER_L4LS_CLKSTCTRL */
132#define AM33XX_CLKACTIVITY_GPIO_6_GDBCLK_SHIFT 18
133#define AM33XX_CLKACTIVITY_GPIO_6_GDBCLK_WIDTH 1
134#define AM33XX_CLKACTIVITY_GPIO_6_GDBCLK_MASK (1 << 18)
135
136/* Used by CM_WKUP_CLKSTCTRL */
137#define AM33XX_CLKACTIVITY_I2C0_GFCLK_SHIFT 11
138#define AM33XX_CLKACTIVITY_I2C0_GFCLK_WIDTH 1
139#define AM33XX_CLKACTIVITY_I2C0_GFCLK_MASK (1 << 11)
140
141/* Used by CM_PER_L4LS_CLKSTCTRL */
142#define AM33XX_CLKACTIVITY_I2C_FCLK_SHIFT 24
143#define AM33XX_CLKACTIVITY_I2C_FCLK_WIDTH 1
144#define AM33XX_CLKACTIVITY_I2C_FCLK_MASK (1 << 24)
145
146/* Used by CM_PER_PRUSS_CLKSTCTRL */
147#define AM33XX_CLKACTIVITY_PRUSS_IEP_GCLK_SHIFT 5
148#define AM33XX_CLKACTIVITY_PRUSS_IEP_GCLK_WIDTH 1
149#define AM33XX_CLKACTIVITY_PRUSS_IEP_GCLK_MASK (1 << 5)
150
151/* Used by CM_PER_PRUSS_CLKSTCTRL */
152#define AM33XX_CLKACTIVITY_PRUSS_OCP_GCLK_SHIFT 4
153#define AM33XX_CLKACTIVITY_PRUSS_OCP_GCLK_WIDTH 1
154#define AM33XX_CLKACTIVITY_PRUSS_OCP_GCLK_MASK (1 << 4)
155
156/* Used by CM_PER_PRUSS_CLKSTCTRL */
157#define AM33XX_CLKACTIVITY_PRUSS_UART_GCLK_SHIFT 6
158#define AM33XX_CLKACTIVITY_PRUSS_UART_GCLK_WIDTH 1
159#define AM33XX_CLKACTIVITY_PRUSS_UART_GCLK_MASK (1 << 6)
160
161/* Used by CM_PER_L3S_CLKSTCTRL */
162#define AM33XX_CLKACTIVITY_L3S_GCLK_SHIFT 3
163#define AM33XX_CLKACTIVITY_L3S_GCLK_WIDTH 1
164#define AM33XX_CLKACTIVITY_L3S_GCLK_MASK (1 << 3)
165
166/* Used by CM_L3_AON_CLKSTCTRL */
167#define AM33XX_CLKACTIVITY_L3_AON_GCLK_SHIFT 3
168#define AM33XX_CLKACTIVITY_L3_AON_GCLK_WIDTH 1
169#define AM33XX_CLKACTIVITY_L3_AON_GCLK_MASK (1 << 3)
170
171/* Used by CM_PER_L3_CLKSTCTRL */
172#define AM33XX_CLKACTIVITY_L3_GCLK_SHIFT 4
173#define AM33XX_CLKACTIVITY_L3_GCLK_WIDTH 1
174#define AM33XX_CLKACTIVITY_L3_GCLK_MASK (1 << 4)
175
176/* Used by CM_PER_L4FW_CLKSTCTRL */
177#define AM33XX_CLKACTIVITY_L4FW_GCLK_SHIFT 8
178#define AM33XX_CLKACTIVITY_L4FW_GCLK_WIDTH 1
179#define AM33XX_CLKACTIVITY_L4FW_GCLK_MASK (1 << 8)
180
181/* Used by CM_PER_L4HS_CLKSTCTRL */
182#define AM33XX_CLKACTIVITY_L4HS_GCLK_SHIFT 3
183#define AM33XX_CLKACTIVITY_L4HS_GCLK_WIDTH 1
184#define AM33XX_CLKACTIVITY_L4HS_GCLK_MASK (1 << 3)
185
186/* Used by CM_PER_L4LS_CLKSTCTRL */
187#define AM33XX_CLKACTIVITY_L4LS_GCLK_SHIFT 8
188#define AM33XX_CLKACTIVITY_L4LS_GCLK_WIDTH 1
189#define AM33XX_CLKACTIVITY_L4LS_GCLK_MASK (1 << 8)
190
191/* Used by CM_GFX_L4LS_GFX_CLKSTCTRL__1 */
192#define AM33XX_CLKACTIVITY_L4LS_GFX_GCLK_SHIFT 8
193#define AM33XX_CLKACTIVITY_L4LS_GFX_GCLK_WIDTH 1
194#define AM33XX_CLKACTIVITY_L4LS_GFX_GCLK_MASK (1 << 8)
195
196/* Used by CM_CEFUSE_CLKSTCTRL */
197#define AM33XX_CLKACTIVITY_L4_CEFUSE_GICLK_SHIFT 8
198#define AM33XX_CLKACTIVITY_L4_CEFUSE_GICLK_WIDTH 1
199#define AM33XX_CLKACTIVITY_L4_CEFUSE_GICLK_MASK (1 << 8)
200
201/* Used by CM_RTC_CLKSTCTRL */
202#define AM33XX_CLKACTIVITY_L4_RTC_GCLK_SHIFT 8
203#define AM33XX_CLKACTIVITY_L4_RTC_GCLK_WIDTH 1
204#define AM33XX_CLKACTIVITY_L4_RTC_GCLK_MASK (1 << 8)
205
206/* Used by CM_L4_WKUP_AON_CLKSTCTRL */
207#define AM33XX_CLKACTIVITY_L4_WKUP_AON_GCLK_SHIFT 2
208#define AM33XX_CLKACTIVITY_L4_WKUP_AON_GCLK_WIDTH 1
209#define AM33XX_CLKACTIVITY_L4_WKUP_AON_GCLK_MASK (1 << 2)
210
211/* Used by CM_WKUP_CLKSTCTRL */
212#define AM33XX_CLKACTIVITY_L4_WKUP_GCLK_SHIFT 2
213#define AM33XX_CLKACTIVITY_L4_WKUP_GCLK_WIDTH 1
214#define AM33XX_CLKACTIVITY_L4_WKUP_GCLK_MASK (1 << 2)
215
216/* Used by CM_PER_L4LS_CLKSTCTRL */
217#define AM33XX_CLKACTIVITY_LCDC_GCLK_SHIFT 17
218#define AM33XX_CLKACTIVITY_LCDC_GCLK_WIDTH 1
219#define AM33XX_CLKACTIVITY_LCDC_GCLK_MASK (1 << 17)
220
221/* Used by CM_PER_LCDC_CLKSTCTRL */
222#define AM33XX_CLKACTIVITY_LCDC_L3_OCP_GCLK_SHIFT 4
223#define AM33XX_CLKACTIVITY_LCDC_L3_OCP_GCLK_WIDTH 1
224#define AM33XX_CLKACTIVITY_LCDC_L3_OCP_GCLK_MASK (1 << 4)
225
226/* Used by CM_PER_LCDC_CLKSTCTRL */
227#define AM33XX_CLKACTIVITY_LCDC_L4_OCP_GCLK_SHIFT 5
228#define AM33XX_CLKACTIVITY_LCDC_L4_OCP_GCLK_WIDTH 1
229#define AM33XX_CLKACTIVITY_LCDC_L4_OCP_GCLK_MASK (1 << 5)
230
231/* Used by CM_PER_L3_CLKSTCTRL */
232#define AM33XX_CLKACTIVITY_MCASP_GCLK_SHIFT 7
233#define AM33XX_CLKACTIVITY_MCASP_GCLK_WIDTH 1
234#define AM33XX_CLKACTIVITY_MCASP_GCLK_MASK (1 << 7)
235
236/* Used by CM_PER_L3_CLKSTCTRL */
237#define AM33XX_CLKACTIVITY_MMC_FCLK_SHIFT 3
238#define AM33XX_CLKACTIVITY_MMC_FCLK_WIDTH 1
239#define AM33XX_CLKACTIVITY_MMC_FCLK_MASK (1 << 3)
240
241/* Used by CM_MPU_CLKSTCTRL */
242#define AM33XX_CLKACTIVITY_MPU_CLK_SHIFT 2
243#define AM33XX_CLKACTIVITY_MPU_CLK_WIDTH 1
244#define AM33XX_CLKACTIVITY_MPU_CLK_MASK (1 << 2)
245
246/* Used by CM_PER_OCPWP_L3_CLKSTCTRL */
247#define AM33XX_CLKACTIVITY_OCPWP_L3_GCLK_SHIFT 4
248#define AM33XX_CLKACTIVITY_OCPWP_L3_GCLK_WIDTH 1
249#define AM33XX_CLKACTIVITY_OCPWP_L3_GCLK_MASK (1 << 4)
250
251/* Used by CM_PER_OCPWP_L3_CLKSTCTRL */
252#define AM33XX_CLKACTIVITY_OCPWP_L4_GCLK_SHIFT 5
253#define AM33XX_CLKACTIVITY_OCPWP_L4_GCLK_WIDTH 1
254#define AM33XX_CLKACTIVITY_OCPWP_L4_GCLK_MASK (1 << 5)
255
256/* Used by CM_RTC_CLKSTCTRL */
257#define AM33XX_CLKACTIVITY_RTC_32KCLK_SHIFT 9
258#define AM33XX_CLKACTIVITY_RTC_32KCLK_WIDTH 1
259#define AM33XX_CLKACTIVITY_RTC_32KCLK_MASK (1 << 9)
260
261/* Used by CM_PER_L4LS_CLKSTCTRL */
262#define AM33XX_CLKACTIVITY_SPI_GCLK_SHIFT 25
263#define AM33XX_CLKACTIVITY_SPI_GCLK_WIDTH 1
264#define AM33XX_CLKACTIVITY_SPI_GCLK_MASK (1 << 25)
265
266/* Used by CM_WKUP_CLKSTCTRL */
267#define AM33XX_CLKACTIVITY_SR_SYSCLK_SHIFT 3
268#define AM33XX_CLKACTIVITY_SR_SYSCLK_WIDTH 1
269#define AM33XX_CLKACTIVITY_SR_SYSCLK_MASK (1 << 3)
270
271/* Used by CM_WKUP_CLKSTCTRL */
272#define AM33XX_CLKACTIVITY_TIMER0_GCLK_SHIFT 10
273#define AM33XX_CLKACTIVITY_TIMER0_GCLK_WIDTH 1
274#define AM33XX_CLKACTIVITY_TIMER0_GCLK_MASK (1 << 10)
275
276/* Used by CM_WKUP_CLKSTCTRL */
277#define AM33XX_CLKACTIVITY_TIMER1_GCLK_SHIFT 13
278#define AM33XX_CLKACTIVITY_TIMER1_GCLK_WIDTH 1
279#define AM33XX_CLKACTIVITY_TIMER1_GCLK_MASK (1 << 13)
280
281/* Used by CM_PER_L4LS_CLKSTCTRL */
282#define AM33XX_CLKACTIVITY_TIMER2_GCLK_SHIFT 14
283#define AM33XX_CLKACTIVITY_TIMER2_GCLK_WIDTH 1
284#define AM33XX_CLKACTIVITY_TIMER2_GCLK_MASK (1 << 14)
285
286/* Used by CM_PER_L4LS_CLKSTCTRL */
287#define AM33XX_CLKACTIVITY_TIMER3_GCLK_SHIFT 15
288#define AM33XX_CLKACTIVITY_TIMER3_GCLK_WIDTH 1
289#define AM33XX_CLKACTIVITY_TIMER3_GCLK_MASK (1 << 15)
290
291/* Used by CM_PER_L4LS_CLKSTCTRL */
292#define AM33XX_CLKACTIVITY_TIMER4_GCLK_SHIFT 16
293#define AM33XX_CLKACTIVITY_TIMER4_GCLK_WIDTH 1
294#define AM33XX_CLKACTIVITY_TIMER4_GCLK_MASK (1 << 16)
295
296/* Used by CM_PER_L4LS_CLKSTCTRL */
297#define AM33XX_CLKACTIVITY_TIMER5_GCLK_SHIFT 27
298#define AM33XX_CLKACTIVITY_TIMER5_GCLK_WIDTH 1
299#define AM33XX_CLKACTIVITY_TIMER5_GCLK_MASK (1 << 27)
300
301/* Used by CM_PER_L4LS_CLKSTCTRL */
302#define AM33XX_CLKACTIVITY_TIMER6_GCLK_SHIFT 28
303#define AM33XX_CLKACTIVITY_TIMER6_GCLK_WIDTH 1
304#define AM33XX_CLKACTIVITY_TIMER6_GCLK_MASK (1 << 28)
305
306/* Used by CM_PER_L4LS_CLKSTCTRL */
307#define AM33XX_CLKACTIVITY_TIMER7_GCLK_SHIFT 13
308#define AM33XX_CLKACTIVITY_TIMER7_GCLK_WIDTH 1
309#define AM33XX_CLKACTIVITY_TIMER7_GCLK_MASK (1 << 13)
310
311/* Used by CM_WKUP_CLKSTCTRL */
312#define AM33XX_CLKACTIVITY_UART0_GFCLK_SHIFT 12
313#define AM33XX_CLKACTIVITY_UART0_GFCLK_WIDTH 1
314#define AM33XX_CLKACTIVITY_UART0_GFCLK_MASK (1 << 12)
315
316/* Used by CM_PER_L4LS_CLKSTCTRL */
317#define AM33XX_CLKACTIVITY_UART_GFCLK_SHIFT 10
318#define AM33XX_CLKACTIVITY_UART_GFCLK_WIDTH 1
319#define AM33XX_CLKACTIVITY_UART_GFCLK_MASK (1 << 10)
320
321/* Used by CM_WKUP_CLKSTCTRL */
322#define AM33XX_CLKACTIVITY_WDT0_GCLK_SHIFT 9
323#define AM33XX_CLKACTIVITY_WDT0_GCLK_WIDTH 1
324#define AM33XX_CLKACTIVITY_WDT0_GCLK_MASK (1 << 9)
325
326/* Used by CM_WKUP_CLKSTCTRL */
327#define AM33XX_CLKACTIVITY_WDT1_GCLK_SHIFT 4
328#define AM33XX_CLKACTIVITY_WDT1_GCLK_WIDTH 1
329#define AM33XX_CLKACTIVITY_WDT1_GCLK_MASK (1 << 4)
330
331/* Used by CLKSEL_GFX_FCLK */
332#define AM33XX_CLKDIV_SEL_GFX_FCLK_SHIFT 0
333#define AM33XX_CLKDIV_SEL_GFX_FCLK_WIDTH 1
334#define AM33XX_CLKDIV_SEL_GFX_FCLK_MASK (1 << 0)
335
336/* Used by CM_CLKOUT_CTRL */
337#define AM33XX_CLKOUT2DIV_SHIFT 3 23#define AM33XX_CLKOUT2DIV_SHIFT 3
338#define AM33XX_CLKOUT2DIV_WIDTH 3 24#define AM33XX_CLKOUT2DIV_WIDTH 3
339#define AM33XX_CLKOUT2DIV_MASK (0x7 << 3)
340
341/* Used by CM_CLKOUT_CTRL */
342#define AM33XX_CLKOUT2EN_SHIFT 7 25#define AM33XX_CLKOUT2EN_SHIFT 7
343#define AM33XX_CLKOUT2EN_WIDTH 1
344#define AM33XX_CLKOUT2EN_MASK (1 << 7)
345
346/* Used by CM_CLKOUT_CTRL */
347#define AM33XX_CLKOUT2SOURCE_SHIFT 0
348#define AM33XX_CLKOUT2SOURCE_WIDTH 3
349#define AM33XX_CLKOUT2SOURCE_MASK (0x7 << 0) 26#define AM33XX_CLKOUT2SOURCE_MASK (0x7 << 0)
350
351/*
352 * Used by CLKSEL_GPIO0_DBCLK, CLKSEL_LCDC_PIXEL_CLK, CLKSEL_TIMER2_CLK,
353 * CLKSEL_TIMER3_CLK, CLKSEL_TIMER4_CLK, CLKSEL_TIMER5_CLK, CLKSEL_TIMER6_CLK,
354 * CLKSEL_TIMER7_CLK
355 */
356#define AM33XX_CLKSEL_SHIFT 0
357#define AM33XX_CLKSEL_WIDTH 1
358#define AM33XX_CLKSEL_MASK (0x01 << 0)
359
360/*
361 * Renamed from CLKSEL Used by CLKSEL_PRUSS_OCP_CLK, CLKSEL_WDT1_CLK,
362 * CM_CPTS_RFT_CLKSEL
363 */
364#define AM33XX_CLKSEL_0_0_SHIFT 0 27#define AM33XX_CLKSEL_0_0_SHIFT 0
365#define AM33XX_CLKSEL_0_0_WIDTH 1 28#define AM33XX_CLKSEL_0_0_WIDTH 1
366#define AM33XX_CLKSEL_0_0_MASK (1 << 0) 29#define AM33XX_CLKSEL_0_0_MASK (1 << 0)
367
368#define AM33XX_CLKSEL_0_1_SHIFT 0
369#define AM33XX_CLKSEL_0_1_WIDTH 2
370#define AM33XX_CLKSEL_0_1_MASK (3 << 0) 30#define AM33XX_CLKSEL_0_1_MASK (3 << 0)
371
372/* Renamed from CLKSEL Used by CLKSEL_TIMER1MS_CLK */
373#define AM33XX_CLKSEL_0_2_SHIFT 0
374#define AM33XX_CLKSEL_0_2_WIDTH 3
375#define AM33XX_CLKSEL_0_2_MASK (7 << 0) 31#define AM33XX_CLKSEL_0_2_MASK (7 << 0)
376
377/* Used by CLKSEL_GFX_FCLK */
378#define AM33XX_CLKSEL_GFX_FCLK_SHIFT 1
379#define AM33XX_CLKSEL_GFX_FCLK_WIDTH 1
380#define AM33XX_CLKSEL_GFX_FCLK_MASK (1 << 1) 32#define AM33XX_CLKSEL_GFX_FCLK_MASK (1 << 1)
381
382/*
383 * Used by CM_MPU_CLKSTCTRL, CM_RTC_CLKSTCTRL, CM_PER_CLK_24MHZ_CLKSTCTRL,
384 * CM_PER_CPSW_CLKSTCTRL, CM_PER_PRUSS_CLKSTCTRL, CM_PER_L3S_CLKSTCTRL,
385 * CM_PER_L3_CLKSTCTRL, CM_PER_L4FW_CLKSTCTRL, CM_PER_L4HS_CLKSTCTRL,
386 * CM_PER_L4LS_CLKSTCTRL, CM_PER_LCDC_CLKSTCTRL, CM_PER_OCPWP_L3_CLKSTCTRL,
387 * CM_L3_AON_CLKSTCTRL, CM_L4_WKUP_AON_CLKSTCTRL, CM_WKUP_CLKSTCTRL,
388 * CM_GFX_L3_CLKSTCTRL, CM_GFX_L4LS_GFX_CLKSTCTRL__1, CM_CEFUSE_CLKSTCTRL
389 */
390#define AM33XX_CLKTRCTRL_SHIFT 0 33#define AM33XX_CLKTRCTRL_SHIFT 0
391#define AM33XX_CLKTRCTRL_WIDTH 2
392#define AM33XX_CLKTRCTRL_MASK (0x3 << 0) 34#define AM33XX_CLKTRCTRL_MASK (0x3 << 0)
393
394/*
395 * Used by CM_SSC_DELTAMSTEP_DPLL_CORE, CM_SSC_DELTAMSTEP_DPLL_DDR,
396 * CM_SSC_DELTAMSTEP_DPLL_DISP, CM_SSC_DELTAMSTEP_DPLL_MPU,
397 * CM_SSC_DELTAMSTEP_DPLL_PER
398 */
399#define AM33XX_DELTAMSTEP_SHIFT 0
400#define AM33XX_DELTAMSTEP_WIDTH 20
401#define AM33XX_DELTAMSTEP_MASK (0xfffff << 0)
402
403/* Used by CM_CLKSEL_DPLL_DDR, CM_CLKSEL_DPLL_DISP, CM_CLKSEL_DPLL_MPU */
404#define AM33XX_DPLL_BYP_CLKSEL_SHIFT 23
405#define AM33XX_DPLL_BYP_CLKSEL_WIDTH 1
406#define AM33XX_DPLL_BYP_CLKSEL_MASK (1 << 23)
407
408/* Used by CM_CLKDCOLDO_DPLL_PER */
409#define AM33XX_DPLL_CLKDCOLDO_GATE_CTRL_SHIFT 8
410#define AM33XX_DPLL_CLKDCOLDO_GATE_CTRL_WIDTH 1
411#define AM33XX_DPLL_CLKDCOLDO_GATE_CTRL_MASK (1 << 8)
412
413/* Used by CM_CLKDCOLDO_DPLL_PER */
414#define AM33XX_DPLL_CLKDCOLDO_PWDN_SHIFT 12
415#define AM33XX_DPLL_CLKDCOLDO_PWDN_WIDTH 1
416#define AM33XX_DPLL_CLKDCOLDO_PWDN_MASK (1 << 12)
417
418/* Used by CM_DIV_M2_DPLL_DDR, CM_DIV_M2_DPLL_DISP, CM_DIV_M2_DPLL_MPU */
419#define AM33XX_DPLL_CLKOUT_DIV_SHIFT 0 35#define AM33XX_DPLL_CLKOUT_DIV_SHIFT 0
420#define AM33XX_DPLL_CLKOUT_DIV_WIDTH 5 36#define AM33XX_DPLL_CLKOUT_DIV_WIDTH 5
421#define AM33XX_DPLL_CLKOUT_DIV_MASK (0x1f << 0)
422
423/* Renamed from DPLL_CLKOUT_DIV Used by CM_DIV_M2_DPLL_PER */
424#define AM33XX_DPLL_CLKOUT_DIV_0_6_SHIFT 0
425#define AM33XX_DPLL_CLKOUT_DIV_0_6_WIDTH 7
426#define AM33XX_DPLL_CLKOUT_DIV_0_6_MASK (0x7f << 0)
427
428/* Used by CM_DIV_M2_DPLL_DDR, CM_DIV_M2_DPLL_DISP, CM_DIV_M2_DPLL_MPU */
429#define AM33XX_DPLL_CLKOUT_DIVCHACK_SHIFT 5
430#define AM33XX_DPLL_CLKOUT_DIVCHACK_WIDTH 1
431#define AM33XX_DPLL_CLKOUT_DIVCHACK_MASK (1 << 5)
432
433/* Renamed from DPLL_CLKOUT_DIVCHACK Used by CM_DIV_M2_DPLL_PER */
434#define AM33XX_DPLL_CLKOUT_DIVCHACK_M2_PER_SHIFT 7
435#define AM33XX_DPLL_CLKOUT_DIVCHACK_M2_PER_WIDTH 1
436#define AM33XX_DPLL_CLKOUT_DIVCHACK_M2_PER_MASK (1 << 7)
437
438/*
439 * Used by CM_DIV_M2_DPLL_DDR, CM_DIV_M2_DPLL_DISP, CM_DIV_M2_DPLL_MPU,
440 * CM_DIV_M2_DPLL_PER
441 */
442#define AM33XX_DPLL_CLKOUT_GATE_CTRL_SHIFT 8
443#define AM33XX_DPLL_CLKOUT_GATE_CTRL_WIDTH 1
444#define AM33XX_DPLL_CLKOUT_GATE_CTRL_MASK (1 << 8)
445
446/*
447 * Used by CM_CLKSEL_DPLL_CORE, CM_CLKSEL_DPLL_DDR, CM_CLKSEL_DPLL_DISP,
448 * CM_CLKSEL_DPLL_MPU
449 */
450#define AM33XX_DPLL_DIV_SHIFT 0
451#define AM33XX_DPLL_DIV_WIDTH 7
452#define AM33XX_DPLL_DIV_MASK (0x7f << 0) 37#define AM33XX_DPLL_DIV_MASK (0x7f << 0)
453
454#define AM33XX_DPLL_PER_DIV_MASK (0xff << 0) 38#define AM33XX_DPLL_PER_DIV_MASK (0xff << 0)
455
456/* Renamed from DPLL_DIV Used by CM_CLKSEL_DPLL_PERIPH */
457#define AM33XX_DPLL_DIV_0_7_SHIFT 0
458#define AM33XX_DPLL_DIV_0_7_WIDTH 8
459#define AM33XX_DPLL_DIV_0_7_MASK (0xff << 0)
460
461/*
462 * Used by CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_DDR, CM_CLKMODE_DPLL_DISP,
463 * CM_CLKMODE_DPLL_MPU
464 */
465#define AM33XX_DPLL_DRIFTGUARD_EN_SHIFT 8
466#define AM33XX_DPLL_DRIFTGUARD_EN_WIDTH 1
467#define AM33XX_DPLL_DRIFTGUARD_EN_MASK (1 << 8)
468
469/*
470 * Used by CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_DDR, CM_CLKMODE_DPLL_DISP,
471 * CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER
472 */
473#define AM33XX_DPLL_EN_SHIFT 0
474#define AM33XX_DPLL_EN_WIDTH 3
475#define AM33XX_DPLL_EN_MASK (0x7 << 0) 39#define AM33XX_DPLL_EN_MASK (0x7 << 0)
476
477/*
478 * Used by CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_DDR, CM_CLKMODE_DPLL_DISP,
479 * CM_CLKMODE_DPLL_MPU
480 */
481#define AM33XX_DPLL_LPMODE_EN_SHIFT 10
482#define AM33XX_DPLL_LPMODE_EN_WIDTH 1
483#define AM33XX_DPLL_LPMODE_EN_MASK (1 << 10)
484
485/*
486 * Used by CM_CLKSEL_DPLL_CORE, CM_CLKSEL_DPLL_DDR, CM_CLKSEL_DPLL_DISP,
487 * CM_CLKSEL_DPLL_MPU
488 */
489#define AM33XX_DPLL_MULT_SHIFT 8
490#define AM33XX_DPLL_MULT_WIDTH 11
491#define AM33XX_DPLL_MULT_MASK (0x7ff << 8) 40#define AM33XX_DPLL_MULT_MASK (0x7ff << 8)
492
493/* Renamed from DPLL_MULT Used by CM_CLKSEL_DPLL_PERIPH */
494#define AM33XX_DPLL_MULT_PERIPH_SHIFT 8
495#define AM33XX_DPLL_MULT_PERIPH_WIDTH 12
496#define AM33XX_DPLL_MULT_PERIPH_MASK (0xfff << 8) 41#define AM33XX_DPLL_MULT_PERIPH_MASK (0xfff << 8)
497
498/*
499 * Used by CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_DDR, CM_CLKMODE_DPLL_DISP,
500 * CM_CLKMODE_DPLL_MPU
501 */
502#define AM33XX_DPLL_REGM4XEN_SHIFT 11
503#define AM33XX_DPLL_REGM4XEN_WIDTH 1
504#define AM33XX_DPLL_REGM4XEN_MASK (1 << 11)
505
506/* Used by CM_CLKSEL_DPLL_PERIPH */
507#define AM33XX_DPLL_SD_DIV_SHIFT 24
508#define AM33XX_DPLL_SD_DIV_WIDTH 8
509#define AM33XX_DPLL_SD_DIV_MASK (0xff << 24)
510
511/*
512 * Used by CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_DDR, CM_CLKMODE_DPLL_DISP,
513 * CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER
514 */
515#define AM33XX_DPLL_SSC_ACK_SHIFT 13
516#define AM33XX_DPLL_SSC_ACK_WIDTH 1
517#define AM33XX_DPLL_SSC_ACK_MASK (1 << 13)
518
519/*
520 * Used by CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_DDR, CM_CLKMODE_DPLL_DISP,
521 * CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER
522 */
523#define AM33XX_DPLL_SSC_DOWNSPREAD_SHIFT 14
524#define AM33XX_DPLL_SSC_DOWNSPREAD_WIDTH 1
525#define AM33XX_DPLL_SSC_DOWNSPREAD_MASK (1 << 14)
526
527/*
528 * Used by CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_DDR, CM_CLKMODE_DPLL_DISP,
529 * CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER
530 */
531#define AM33XX_DPLL_SSC_EN_SHIFT 12
532#define AM33XX_DPLL_SSC_EN_WIDTH 1
533#define AM33XX_DPLL_SSC_EN_MASK (1 << 12)
534
535/* Used by CM_DIV_M4_DPLL_CORE */
536#define AM33XX_HSDIVIDER_CLKOUT1_DIV_SHIFT 0 42#define AM33XX_HSDIVIDER_CLKOUT1_DIV_SHIFT 0
537#define AM33XX_HSDIVIDER_CLKOUT1_DIV_WIDTH 5 43#define AM33XX_HSDIVIDER_CLKOUT1_DIV_WIDTH 5
538#define AM33XX_HSDIVIDER_CLKOUT1_DIV_MASK (0x1f << 0)
539
540/* Used by CM_DIV_M4_DPLL_CORE */
541#define AM33XX_HSDIVIDER_CLKOUT1_DIVCHACK_SHIFT 5
542#define AM33XX_HSDIVIDER_CLKOUT1_DIVCHACK_WIDTH 1
543#define AM33XX_HSDIVIDER_CLKOUT1_DIVCHACK_MASK (1 << 5)
544
545/* Used by CM_DIV_M4_DPLL_CORE */
546#define AM33XX_HSDIVIDER_CLKOUT1_GATE_CTRL_SHIFT 8
547#define AM33XX_HSDIVIDER_CLKOUT1_GATE_CTRL_WIDTH 1
548#define AM33XX_HSDIVIDER_CLKOUT1_GATE_CTRL_MASK (1 << 8)
549
550/* Used by CM_DIV_M4_DPLL_CORE */
551#define AM33XX_HSDIVIDER_CLKOUT1_PWDN_SHIFT 12
552#define AM33XX_HSDIVIDER_CLKOUT1_PWDN_WIDTH 1
553#define AM33XX_HSDIVIDER_CLKOUT1_PWDN_MASK (1 << 12)
554
555/* Used by CM_DIV_M5_DPLL_CORE */
556#define AM33XX_HSDIVIDER_CLKOUT2_DIV_SHIFT 0 44#define AM33XX_HSDIVIDER_CLKOUT2_DIV_SHIFT 0
557#define AM33XX_HSDIVIDER_CLKOUT2_DIV_WIDTH 5 45#define AM33XX_HSDIVIDER_CLKOUT2_DIV_WIDTH 5
558#define AM33XX_HSDIVIDER_CLKOUT2_DIV_MASK (0x1f << 0)
559
560/* Used by CM_DIV_M5_DPLL_CORE */
561#define AM33XX_HSDIVIDER_CLKOUT2_DIVCHACK_SHIFT 5
562#define AM33XX_HSDIVIDER_CLKOUT2_DIVCHACK_WIDTH 1
563#define AM33XX_HSDIVIDER_CLKOUT2_DIVCHACK_MASK (1 << 5)
564
565/* Used by CM_DIV_M5_DPLL_CORE */
566#define AM33XX_HSDIVIDER_CLKOUT2_GATE_CTRL_SHIFT 8
567#define AM33XX_HSDIVIDER_CLKOUT2_GATE_CTRL_WIDTH 1
568#define AM33XX_HSDIVIDER_CLKOUT2_GATE_CTRL_MASK (1 << 8)
569
570/* Used by CM_DIV_M5_DPLL_CORE */
571#define AM33XX_HSDIVIDER_CLKOUT2_PWDN_SHIFT 12
572#define AM33XX_HSDIVIDER_CLKOUT2_PWDN_WIDTH 1
573#define AM33XX_HSDIVIDER_CLKOUT2_PWDN_MASK (1 << 12)
574
575/* Used by CM_DIV_M6_DPLL_CORE */
576#define AM33XX_HSDIVIDER_CLKOUT3_DIV_SHIFT 0 46#define AM33XX_HSDIVIDER_CLKOUT3_DIV_SHIFT 0
577#define AM33XX_HSDIVIDER_CLKOUT3_DIV_WIDTH 5 47#define AM33XX_HSDIVIDER_CLKOUT3_DIV_WIDTH 5
578#define AM33XX_HSDIVIDER_CLKOUT3_DIV_MASK (0x1f << 0)
579
580/* Used by CM_DIV_M6_DPLL_CORE */
581#define AM33XX_HSDIVIDER_CLKOUT3_DIVCHACK_SHIFT 5
582#define AM33XX_HSDIVIDER_CLKOUT3_DIVCHACK_WIDTH 1
583#define AM33XX_HSDIVIDER_CLKOUT3_DIVCHACK_MASK (1 << 5)
584
585/* Used by CM_DIV_M6_DPLL_CORE */
586#define AM33XX_HSDIVIDER_CLKOUT3_GATE_CTRL_SHIFT 8
587#define AM33XX_HSDIVIDER_CLKOUT3_GATE_CTRL_WIDTH 1
588#define AM33XX_HSDIVIDER_CLKOUT3_GATE_CTRL_MASK (1 << 8)
589
590/* Used by CM_DIV_M6_DPLL_CORE */
591#define AM33XX_HSDIVIDER_CLKOUT3_PWDN_SHIFT 12
592#define AM33XX_HSDIVIDER_CLKOUT3_PWDN_WIDTH 1
593#define AM33XX_HSDIVIDER_CLKOUT3_PWDN_MASK (1 << 12)
594
595/*
596 * Used by CM_MPU_MPU_CLKCTRL, CM_RTC_RTC_CLKCTRL, CM_PER_AES0_CLKCTRL,
597 * CM_PER_AES1_CLKCTRL, CM_PER_CLKDIV32K_CLKCTRL, CM_PER_CPGMAC0_CLKCTRL,
598 * CM_PER_DCAN0_CLKCTRL, CM_PER_DCAN1_CLKCTRL, CM_PER_DES_CLKCTRL,
599 * CM_PER_ELM_CLKCTRL, CM_PER_EMIF_CLKCTRL, CM_PER_EMIF_FW_CLKCTRL,
600 * CM_PER_EPWMSS0_CLKCTRL, CM_PER_EPWMSS1_CLKCTRL, CM_PER_EPWMSS2_CLKCTRL,
601 * CM_PER_GPIO1_CLKCTRL, CM_PER_GPIO2_CLKCTRL, CM_PER_GPIO3_CLKCTRL,
602 * CM_PER_GPIO4_CLKCTRL, CM_PER_GPIO5_CLKCTRL, CM_PER_GPIO6_CLKCTRL,
603 * CM_PER_GPMC_CLKCTRL, CM_PER_I2C1_CLKCTRL, CM_PER_I2C2_CLKCTRL,
604 * CM_PER_PRUSS_CLKCTRL, CM_PER_IEEE5000_CLKCTRL, CM_PER_L3_CLKCTRL,
605 * CM_PER_L3_INSTR_CLKCTRL, CM_PER_L4FW_CLKCTRL, CM_PER_L4HS_CLKCTRL,
606 * CM_PER_L4LS_CLKCTRL, CM_PER_LCDC_CLKCTRL, CM_PER_MAILBOX0_CLKCTRL,
607 * CM_PER_MAILBOX1_CLKCTRL, CM_PER_MCASP0_CLKCTRL, CM_PER_MCASP1_CLKCTRL,
608 * CM_PER_MCASP2_CLKCTRL, CM_PER_MLB_CLKCTRL, CM_PER_MMC0_CLKCTRL,
609 * CM_PER_MMC1_CLKCTRL, CM_PER_MMC2_CLKCTRL, CM_PER_MSTR_EXPS_CLKCTRL,
610 * CM_PER_OCMCRAM_CLKCTRL, CM_PER_OCPWP_CLKCTRL, CM_PER_PCIE_CLKCTRL,
611 * CM_PER_PKA_CLKCTRL, CM_PER_RNG_CLKCTRL, CM_PER_SHA0_CLKCTRL,
612 * CM_PER_SLV_EXPS_CLKCTRL, CM_PER_SPARE0_CLKCTRL, CM_PER_SPARE1_CLKCTRL,
613 * CM_PER_SPARE_CLKCTRL, CM_PER_SPI0_CLKCTRL, CM_PER_SPI1_CLKCTRL,
614 * CM_PER_SPI2_CLKCTRL, CM_PER_SPI3_CLKCTRL, CM_PER_SPINLOCK_CLKCTRL,
615 * CM_PER_TIMER2_CLKCTRL, CM_PER_TIMER3_CLKCTRL, CM_PER_TIMER4_CLKCTRL,
616 * CM_PER_TIMER5_CLKCTRL, CM_PER_TIMER6_CLKCTRL, CM_PER_TIMER7_CLKCTRL,
617 * CM_PER_TPCC_CLKCTRL, CM_PER_TPTC0_CLKCTRL, CM_PER_TPTC1_CLKCTRL,
618 * CM_PER_TPTC2_CLKCTRL, CM_PER_UART1_CLKCTRL, CM_PER_UART2_CLKCTRL,
619 * CM_PER_UART3_CLKCTRL, CM_PER_UART4_CLKCTRL, CM_PER_UART5_CLKCTRL,
620 * CM_PER_USB0_CLKCTRL, CM_WKUP_ADC_TSC_CLKCTRL, CM_WKUP_CONTROL_CLKCTRL,
621 * CM_WKUP_DEBUGSS_CLKCTRL, CM_WKUP_GPIO0_CLKCTRL, CM_WKUP_I2C0_CLKCTRL,
622 * CM_WKUP_L4WKUP_CLKCTRL, CM_WKUP_SMARTREFLEX0_CLKCTRL,
623 * CM_WKUP_SMARTREFLEX1_CLKCTRL, CM_WKUP_TIMER0_CLKCTRL,
624 * CM_WKUP_TIMER1_CLKCTRL, CM_WKUP_UART0_CLKCTRL, CM_WKUP_WDT0_CLKCTRL,
625 * CM_WKUP_WDT1_CLKCTRL, CM_GFX_BITBLT_CLKCTRL, CM_GFX_GFX_CLKCTRL,
626 * CM_GFX_MMUCFG_CLKCTRL, CM_GFX_MMUDATA_CLKCTRL, CM_CEFUSE_CEFUSE_CLKCTRL
627 */
628#define AM33XX_IDLEST_SHIFT 16 48#define AM33XX_IDLEST_SHIFT 16
629#define AM33XX_IDLEST_WIDTH 2
630#define AM33XX_IDLEST_MASK (0x3 << 16) 49#define AM33XX_IDLEST_MASK (0x3 << 16)
631
632/* Used by CM_MAC_CLKSEL */
633#define AM33XX_MII_CLK_SEL_SHIFT 2
634#define AM33XX_MII_CLK_SEL_WIDTH 1
635#define AM33XX_MII_CLK_SEL_MASK (1 << 2)
636
637/*
638 * Used by CM_SSC_MODFREQDIV_DPLL_CORE, CM_SSC_MODFREQDIV_DPLL_DDR,
639 * CM_SSC_MODFREQDIV_DPLL_DISP, CM_SSC_MODFREQDIV_DPLL_MPU,
640 * CM_SSC_MODFREQDIV_DPLL_PER
641 */
642#define AM33XX_MODFREQDIV_EXPONENT_SHIFT 8
643#define AM33XX_MODFREQDIV_EXPONENT_WIDTH 3
644#define AM33XX_MODFREQDIV_EXPONENT_MASK (0x7 << 8)
645
646/*
647 * Used by CM_SSC_MODFREQDIV_DPLL_CORE, CM_SSC_MODFREQDIV_DPLL_DDR,
648 * CM_SSC_MODFREQDIV_DPLL_DISP, CM_SSC_MODFREQDIV_DPLL_MPU,
649 * CM_SSC_MODFREQDIV_DPLL_PER
650 */
651#define AM33XX_MODFREQDIV_MANTISSA_SHIFT 0
652#define AM33XX_MODFREQDIV_MANTISSA_WIDTH 7
653#define AM33XX_MODFREQDIV_MANTISSA_MASK (0x7f << 0)
654
655/*
656 * Used by CM_MPU_MPU_CLKCTRL, CM_RTC_RTC_CLKCTRL, CM_PER_AES0_CLKCTRL,
657 * CM_PER_AES1_CLKCTRL, CM_PER_CLKDIV32K_CLKCTRL, CM_PER_CPGMAC0_CLKCTRL,
658 * CM_PER_DCAN0_CLKCTRL, CM_PER_DCAN1_CLKCTRL, CM_PER_DES_CLKCTRL,
659 * CM_PER_ELM_CLKCTRL, CM_PER_EMIF_CLKCTRL, CM_PER_EMIF_FW_CLKCTRL,
660 * CM_PER_EPWMSS0_CLKCTRL, CM_PER_EPWMSS1_CLKCTRL, CM_PER_EPWMSS2_CLKCTRL,
661 * CM_PER_GPIO1_CLKCTRL, CM_PER_GPIO2_CLKCTRL, CM_PER_GPIO3_CLKCTRL,
662 * CM_PER_GPIO4_CLKCTRL, CM_PER_GPIO5_CLKCTRL, CM_PER_GPIO6_CLKCTRL,
663 * CM_PER_GPMC_CLKCTRL, CM_PER_I2C1_CLKCTRL, CM_PER_I2C2_CLKCTRL,
664 * CM_PER_PRUSS_CLKCTRL, CM_PER_IEEE5000_CLKCTRL, CM_PER_L3_CLKCTRL,
665 * CM_PER_L3_INSTR_CLKCTRL, CM_PER_L4FW_CLKCTRL, CM_PER_L4HS_CLKCTRL,
666 * CM_PER_L4LS_CLKCTRL, CM_PER_LCDC_CLKCTRL, CM_PER_MAILBOX0_CLKCTRL,
667 * CM_PER_MAILBOX1_CLKCTRL, CM_PER_MCASP0_CLKCTRL, CM_PER_MCASP1_CLKCTRL,
668 * CM_PER_MCASP2_CLKCTRL, CM_PER_MLB_CLKCTRL, CM_PER_MMC0_CLKCTRL,
669 * CM_PER_MMC1_CLKCTRL, CM_PER_MMC2_CLKCTRL, CM_PER_MSTR_EXPS_CLKCTRL,
670 * CM_PER_OCMCRAM_CLKCTRL, CM_PER_OCPWP_CLKCTRL, CM_PER_PCIE_CLKCTRL,
671 * CM_PER_PKA_CLKCTRL, CM_PER_RNG_CLKCTRL, CM_PER_SHA0_CLKCTRL,
672 * CM_PER_SLV_EXPS_CLKCTRL, CM_PER_SPARE0_CLKCTRL, CM_PER_SPARE1_CLKCTRL,
673 * CM_PER_SPARE_CLKCTRL, CM_PER_SPI0_CLKCTRL, CM_PER_SPI1_CLKCTRL,
674 * CM_PER_SPI2_CLKCTRL, CM_PER_SPI3_CLKCTRL, CM_PER_SPINLOCK_CLKCTRL,
675 * CM_PER_TIMER2_CLKCTRL, CM_PER_TIMER3_CLKCTRL, CM_PER_TIMER4_CLKCTRL,
676 * CM_PER_TIMER5_CLKCTRL, CM_PER_TIMER6_CLKCTRL, CM_PER_TIMER7_CLKCTRL,
677 * CM_PER_TPCC_CLKCTRL, CM_PER_TPTC0_CLKCTRL, CM_PER_TPTC1_CLKCTRL,
678 * CM_PER_TPTC2_CLKCTRL, CM_PER_UART1_CLKCTRL, CM_PER_UART2_CLKCTRL,
679 * CM_PER_UART3_CLKCTRL, CM_PER_UART4_CLKCTRL, CM_PER_UART5_CLKCTRL,
680 * CM_PER_USB0_CLKCTRL, CM_WKUP_ADC_TSC_CLKCTRL, CM_WKUP_CONTROL_CLKCTRL,
681 * CM_WKUP_DEBUGSS_CLKCTRL, CM_WKUP_GPIO0_CLKCTRL, CM_WKUP_I2C0_CLKCTRL,
682 * CM_WKUP_L4WKUP_CLKCTRL, CM_WKUP_SMARTREFLEX0_CLKCTRL,
683 * CM_WKUP_SMARTREFLEX1_CLKCTRL, CM_WKUP_TIMER0_CLKCTRL,
684 * CM_WKUP_TIMER1_CLKCTRL, CM_WKUP_UART0_CLKCTRL, CM_WKUP_WDT0_CLKCTRL,
685 * CM_WKUP_WDT1_CLKCTRL, CM_WKUP_WKUP_M3_CLKCTRL, CM_GFX_BITBLT_CLKCTRL,
686 * CM_GFX_GFX_CLKCTRL, CM_GFX_MMUCFG_CLKCTRL, CM_GFX_MMUDATA_CLKCTRL,
687 * CM_CEFUSE_CEFUSE_CLKCTRL
688 */
689#define AM33XX_MODULEMODE_SHIFT 0 50#define AM33XX_MODULEMODE_SHIFT 0
690#define AM33XX_MODULEMODE_WIDTH 2
691#define AM33XX_MODULEMODE_MASK (0x3 << 0) 51#define AM33XX_MODULEMODE_MASK (0x3 << 0)
692
693/* Used by CM_WKUP_DEBUGSS_CLKCTRL */
694#define AM33XX_OPTCLK_DEBUG_CLKA_SHIFT 30 52#define AM33XX_OPTCLK_DEBUG_CLKA_SHIFT 30
695#define AM33XX_OPTCLK_DEBUG_CLKA_WIDTH 1
696#define AM33XX_OPTCLK_DEBUG_CLKA_MASK (1 << 30)
697
698/* Used by CM_WKUP_DEBUGSS_CLKCTRL */
699#define AM33XX_OPTFCLKEN_DBGSYSCLK_SHIFT 19 53#define AM33XX_OPTFCLKEN_DBGSYSCLK_SHIFT 19
700#define AM33XX_OPTFCLKEN_DBGSYSCLK_WIDTH 1
701#define AM33XX_OPTFCLKEN_DBGSYSCLK_MASK (1 << 19)
702
703/* Used by CM_WKUP_GPIO0_CLKCTRL */
704#define AM33XX_OPTFCLKEN_GPIO0_GDBCLK_SHIFT 18 54#define AM33XX_OPTFCLKEN_GPIO0_GDBCLK_SHIFT 18
705#define AM33XX_OPTFCLKEN_GPIO0_GDBCLK_WIDTH 1
706#define AM33XX_OPTFCLKEN_GPIO0_GDBCLK_MASK (1 << 18)
707
708/* Used by CM_PER_GPIO1_CLKCTRL */
709#define AM33XX_OPTFCLKEN_GPIO_1_GDBCLK_SHIFT 18 55#define AM33XX_OPTFCLKEN_GPIO_1_GDBCLK_SHIFT 18
710#define AM33XX_OPTFCLKEN_GPIO_1_GDBCLK_WIDTH 1
711#define AM33XX_OPTFCLKEN_GPIO_1_GDBCLK_MASK (1 << 18)
712
713/* Used by CM_PER_GPIO2_CLKCTRL */
714#define AM33XX_OPTFCLKEN_GPIO_2_GDBCLK_SHIFT 18 56#define AM33XX_OPTFCLKEN_GPIO_2_GDBCLK_SHIFT 18
715#define AM33XX_OPTFCLKEN_GPIO_2_GDBCLK_WIDTH 1
716#define AM33XX_OPTFCLKEN_GPIO_2_GDBCLK_MASK (1 << 18)
717
718/* Used by CM_PER_GPIO3_CLKCTRL */
719#define AM33XX_OPTFCLKEN_GPIO_3_GDBCLK_SHIFT 18 57#define AM33XX_OPTFCLKEN_GPIO_3_GDBCLK_SHIFT 18
720#define AM33XX_OPTFCLKEN_GPIO_3_GDBCLK_WIDTH 1
721#define AM33XX_OPTFCLKEN_GPIO_3_GDBCLK_MASK (1 << 18)
722
723/* Used by CM_PER_GPIO4_CLKCTRL */
724#define AM33XX_OPTFCLKEN_GPIO_4_GDBCLK_SHIFT 18
725#define AM33XX_OPTFCLKEN_GPIO_4_GDBCLK_WIDTH 1
726#define AM33XX_OPTFCLKEN_GPIO_4_GDBCLK_MASK (1 << 18)
727
728/* Used by CM_PER_GPIO5_CLKCTRL */
729#define AM33XX_OPTFCLKEN_GPIO_5_GDBCLK_SHIFT 18
730#define AM33XX_OPTFCLKEN_GPIO_5_GDBCLK_WIDTH 1
731#define AM33XX_OPTFCLKEN_GPIO_5_GDBCLK_MASK (1 << 18)
732
733/* Used by CM_PER_GPIO6_CLKCTRL */
734#define AM33XX_OPTFCLKEN_GPIO_6_GDBCLK_SHIFT 18
735#define AM33XX_OPTFCLKEN_GPIO_6_GDBCLK_WIDTH 1
736#define AM33XX_OPTFCLKEN_GPIO_6_GDBCLK_MASK (1 << 18)
737
738/*
739 * Used by CM_MPU_MPU_CLKCTRL, CM_PER_CPGMAC0_CLKCTRL, CM_PER_PRUSS_CLKCTRL,
740 * CM_PER_IEEE5000_CLKCTRL, CM_PER_LCDC_CLKCTRL, CM_PER_MLB_CLKCTRL,
741 * CM_PER_MSTR_EXPS_CLKCTRL, CM_PER_OCPWP_CLKCTRL, CM_PER_PCIE_CLKCTRL,
742 * CM_PER_SPARE_CLKCTRL, CM_PER_TPTC0_CLKCTRL, CM_PER_TPTC1_CLKCTRL,
743 * CM_PER_TPTC2_CLKCTRL, CM_PER_USB0_CLKCTRL, CM_WKUP_DEBUGSS_CLKCTRL,
744 * CM_WKUP_WKUP_M3_CLKCTRL, CM_GFX_BITBLT_CLKCTRL, CM_GFX_GFX_CLKCTRL
745 */
746#define AM33XX_STBYST_SHIFT 18
747#define AM33XX_STBYST_WIDTH 1
748#define AM33XX_STBYST_MASK (1 << 18)
749
750/* Used by CM_WKUP_DEBUGSS_CLKCTRL */
751#define AM33XX_STM_PMD_CLKDIVSEL_SHIFT 27 58#define AM33XX_STM_PMD_CLKDIVSEL_SHIFT 27
752#define AM33XX_STM_PMD_CLKDIVSEL_WIDTH 3 59#define AM33XX_STM_PMD_CLKDIVSEL_WIDTH 3
753#define AM33XX_STM_PMD_CLKDIVSEL_MASK (0x7 << 27)
754
755/* Used by CM_WKUP_DEBUGSS_CLKCTRL */
756#define AM33XX_STM_PMD_CLKSEL_SHIFT 22 60#define AM33XX_STM_PMD_CLKSEL_SHIFT 22
757#define AM33XX_STM_PMD_CLKSEL_WIDTH 2 61#define AM33XX_STM_PMD_CLKSEL_WIDTH 2
758#define AM33XX_STM_PMD_CLKSEL_MASK (0x3 << 22)
759
760/*
761 * Used by CM_IDLEST_DPLL_CORE, CM_IDLEST_DPLL_DDR, CM_IDLEST_DPLL_DISP,
762 * CM_IDLEST_DPLL_MPU, CM_IDLEST_DPLL_PER
763 */
764#define AM33XX_ST_DPLL_CLK_SHIFT 0
765#define AM33XX_ST_DPLL_CLK_WIDTH 1
766#define AM33XX_ST_DPLL_CLK_MASK (1 << 0) 62#define AM33XX_ST_DPLL_CLK_MASK (1 << 0)
767
768/* Used by CM_CLKDCOLDO_DPLL_PER */
769#define AM33XX_ST_DPLL_CLKDCOLDO_SHIFT 8 63#define AM33XX_ST_DPLL_CLKDCOLDO_SHIFT 8
770#define AM33XX_ST_DPLL_CLKDCOLDO_WIDTH 1
771#define AM33XX_ST_DPLL_CLKDCOLDO_MASK (1 << 8)
772
773/*
774 * Used by CM_DIV_M2_DPLL_DDR, CM_DIV_M2_DPLL_DISP, CM_DIV_M2_DPLL_MPU,
775 * CM_DIV_M2_DPLL_PER
776 */
777#define AM33XX_ST_DPLL_CLKOUT_SHIFT 9
778#define AM33XX_ST_DPLL_CLKOUT_WIDTH 1
779#define AM33XX_ST_DPLL_CLKOUT_MASK (1 << 9)
780
781/* Used by CM_DIV_M4_DPLL_CORE */
782#define AM33XX_ST_HSDIVIDER_CLKOUT1_SHIFT 9
783#define AM33XX_ST_HSDIVIDER_CLKOUT1_WIDTH 1
784#define AM33XX_ST_HSDIVIDER_CLKOUT1_MASK (1 << 9)
785
786/* Used by CM_DIV_M5_DPLL_CORE */
787#define AM33XX_ST_HSDIVIDER_CLKOUT2_SHIFT 9
788#define AM33XX_ST_HSDIVIDER_CLKOUT2_WIDTH 1
789#define AM33XX_ST_HSDIVIDER_CLKOUT2_MASK (1 << 9)
790
791/* Used by CM_DIV_M6_DPLL_CORE */
792#define AM33XX_ST_HSDIVIDER_CLKOUT3_SHIFT 9
793#define AM33XX_ST_HSDIVIDER_CLKOUT3_WIDTH 1
794#define AM33XX_ST_HSDIVIDER_CLKOUT3_MASK (1 << 9)
795
796/*
797 * Used by CM_IDLEST_DPLL_CORE, CM_IDLEST_DPLL_DDR, CM_IDLEST_DPLL_DISP,
798 * CM_IDLEST_DPLL_MPU, CM_IDLEST_DPLL_PER
799 */
800#define AM33XX_ST_MN_BYPASS_SHIFT 8
801#define AM33XX_ST_MN_BYPASS_WIDTH 1
802#define AM33XX_ST_MN_BYPASS_MASK (1 << 8)
803
804/* Used by CM_WKUP_DEBUGSS_CLKCTRL */
805#define AM33XX_TRC_PMD_CLKDIVSEL_SHIFT 24 64#define AM33XX_TRC_PMD_CLKDIVSEL_SHIFT 24
806#define AM33XX_TRC_PMD_CLKDIVSEL_WIDTH 3 65#define AM33XX_TRC_PMD_CLKDIVSEL_WIDTH 3
807#define AM33XX_TRC_PMD_CLKDIVSEL_MASK (0x7 << 24)
808
809/* Used by CM_WKUP_DEBUGSS_CLKCTRL */
810#define AM33XX_TRC_PMD_CLKSEL_SHIFT 20 66#define AM33XX_TRC_PMD_CLKSEL_SHIFT 20
811#define AM33XX_TRC_PMD_CLKSEL_WIDTH 2 67#define AM33XX_TRC_PMD_CLKSEL_WIDTH 2
812#define AM33XX_TRC_PMD_CLKSEL_MASK (0x3 << 20)
813
814/* Used by CONTROL_SEC_CLK_CTRL */
815#define AM33XX_TIMER0_CLKSEL_WIDTH 2
816#define AM33XX_TIMER0_CLKSEL_MASK (0x3 << 4)
817#endif 68#endif
diff --git a/arch/arm/mach-omap2/cm-regbits-34xx.h b/arch/arm/mach-omap2/cm-regbits-34xx.h
index adf78d325804..04dab2fcf862 100644
--- a/arch/arm/mach-omap2/cm-regbits-34xx.h
+++ b/arch/arm/mach-omap2/cm-regbits-34xx.h
@@ -14,833 +14,201 @@
14 * published by the Free Software Foundation. 14 * published by the Free Software Foundation.
15 */ 15 */
16 16
17/* Bits shared between registers */
18
19/* CM_FCLKEN1_CORE and CM_ICLKEN1_CORE shared bits */
20#define OMAP3430ES2_EN_MMC3_MASK (1 << 30)
21#define OMAP3430ES2_EN_MMC3_SHIFT 30 17#define OMAP3430ES2_EN_MMC3_SHIFT 30
22#define OMAP3430_EN_MSPRO_MASK (1 << 23)
23#define OMAP3430_EN_MSPRO_SHIFT 23 18#define OMAP3430_EN_MSPRO_SHIFT 23
24#define OMAP3430_EN_HDQ_MASK (1 << 22)
25#define OMAP3430_EN_HDQ_SHIFT 22 19#define OMAP3430_EN_HDQ_SHIFT 22
26#define OMAP3430ES1_EN_FSHOSTUSB_MASK (1 << 5)
27#define OMAP3430ES1_EN_FSHOSTUSB_SHIFT 5 20#define OMAP3430ES1_EN_FSHOSTUSB_SHIFT 5
28#define OMAP3430ES1_EN_D2D_MASK (1 << 3)
29#define OMAP3430ES1_EN_D2D_SHIFT 3 21#define OMAP3430ES1_EN_D2D_SHIFT 3
30#define OMAP3430_EN_SSI_MASK (1 << 0)
31#define OMAP3430_EN_SSI_SHIFT 0 22#define OMAP3430_EN_SSI_SHIFT 0
32
33/* CM_FCLKEN3_CORE and CM_ICLKEN3_CORE shared bits */
34#define OMAP3430ES2_EN_USBTLL_SHIFT 2 23#define OMAP3430ES2_EN_USBTLL_SHIFT 2
35#define OMAP3430ES2_EN_USBTLL_MASK (1 << 2)
36
37/* CM_FCLKEN_WKUP and CM_ICLKEN_WKUP shared bits */
38#define OMAP3430_EN_WDT2_MASK (1 << 5)
39#define OMAP3430_EN_WDT2_SHIFT 5 24#define OMAP3430_EN_WDT2_SHIFT 5
40
41/* CM_ICLKEN_CAM, CM_FCLKEN_CAM shared bits */
42#define OMAP3430_EN_CAM_MASK (1 << 0)
43#define OMAP3430_EN_CAM_SHIFT 0 25#define OMAP3430_EN_CAM_SHIFT 0
44
45/* CM_FCLKEN_PER, CM_ICLKEN_PER shared bits */
46#define OMAP3430_EN_WDT3_MASK (1 << 12)
47#define OMAP3430_EN_WDT3_SHIFT 12 26#define OMAP3430_EN_WDT3_SHIFT 12
48
49/* CM_CLKSEL2_EMU, CM_CLKSEL3_EMU shared bits */
50#define OMAP3430_OVERRIDE_ENABLE_MASK (1 << 19)
51
52
53/* Bits specific to each register */
54
55/* CM_FCLKEN_IVA2 */
56#define OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_MASK (1 << 0) 27#define OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_MASK (1 << 0)
57#define OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_SHIFT 0 28#define OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_SHIFT 0
58
59/* CM_CLKEN_PLL_IVA2 */
60#define OMAP3430_IVA2_DPLL_RAMPTIME_SHIFT 8
61#define OMAP3430_IVA2_DPLL_RAMPTIME_MASK (0x3 << 8)
62#define OMAP3430_IVA2_DPLL_FREQSEL_SHIFT 4
63#define OMAP3430_IVA2_DPLL_FREQSEL_MASK (0xf << 4) 29#define OMAP3430_IVA2_DPLL_FREQSEL_MASK (0xf << 4)
64#define OMAP3430_EN_IVA2_DPLL_DRIFTGUARD_SHIFT 3 30#define OMAP3430_EN_IVA2_DPLL_DRIFTGUARD_SHIFT 3
65#define OMAP3430_EN_IVA2_DPLL_DRIFTGUARD_MASK (1 << 3)
66#define OMAP3430_EN_IVA2_DPLL_SHIFT 0
67#define OMAP3430_EN_IVA2_DPLL_MASK (0x7 << 0) 31#define OMAP3430_EN_IVA2_DPLL_MASK (0x7 << 0)
68
69/* CM_IDLEST_IVA2 */
70#define OMAP3430_ST_IVA2_SHIFT 0 32#define OMAP3430_ST_IVA2_SHIFT 0
71#define OMAP3430_ST_IVA2_MASK (1 << 0)
72
73/* CM_IDLEST_PLL_IVA2 */
74#define OMAP3430_ST_IVA2_CLK_SHIFT 0
75#define OMAP3430_ST_IVA2_CLK_MASK (1 << 0) 33#define OMAP3430_ST_IVA2_CLK_MASK (1 << 0)
76
77/* CM_AUTOIDLE_PLL_IVA2 */
78#define OMAP3430_AUTO_IVA2_DPLL_SHIFT 0
79#define OMAP3430_AUTO_IVA2_DPLL_MASK (0x7 << 0) 34#define OMAP3430_AUTO_IVA2_DPLL_MASK (0x7 << 0)
80
81/* CM_CLKSEL1_PLL_IVA2 */
82#define OMAP3430_IVA2_CLK_SRC_SHIFT 19 35#define OMAP3430_IVA2_CLK_SRC_SHIFT 19
83#define OMAP3430_IVA2_CLK_SRC_MASK (0x7 << 19)
84#define OMAP3430_IVA2_CLK_SRC_WIDTH 3 36#define OMAP3430_IVA2_CLK_SRC_WIDTH 3
85#define OMAP3430_IVA2_DPLL_MULT_SHIFT 8
86#define OMAP3430_IVA2_DPLL_MULT_MASK (0x7ff << 8) 37#define OMAP3430_IVA2_DPLL_MULT_MASK (0x7ff << 8)
87#define OMAP3430_IVA2_DPLL_DIV_SHIFT 0
88#define OMAP3430_IVA2_DPLL_DIV_MASK (0x7f << 0) 38#define OMAP3430_IVA2_DPLL_DIV_MASK (0x7f << 0)
89
90/* CM_CLKSEL2_PLL_IVA2 */
91#define OMAP3430_IVA2_DPLL_CLKOUT_DIV_SHIFT 0 39#define OMAP3430_IVA2_DPLL_CLKOUT_DIV_SHIFT 0
92#define OMAP3430_IVA2_DPLL_CLKOUT_DIV_MASK (0x1f << 0)
93#define OMAP3430_IVA2_DPLL_CLKOUT_DIV_WIDTH 5 40#define OMAP3430_IVA2_DPLL_CLKOUT_DIV_WIDTH 5
94
95/* CM_CLKSTCTRL_IVA2 */
96#define OMAP3430_CLKTRCTRL_IVA2_SHIFT 0
97#define OMAP3430_CLKTRCTRL_IVA2_MASK (0x3 << 0) 41#define OMAP3430_CLKTRCTRL_IVA2_MASK (0x3 << 0)
98
99/* CM_CLKSTST_IVA2 */
100#define OMAP3430_CLKACTIVITY_IVA2_SHIFT 0
101#define OMAP3430_CLKACTIVITY_IVA2_MASK (1 << 0) 42#define OMAP3430_CLKACTIVITY_IVA2_MASK (1 << 0)
102
103/* CM_REVISION specific bits */
104
105/* CM_SYSCONFIG specific bits */
106
107/* CM_CLKEN_PLL_MPU */
108#define OMAP3430_MPU_DPLL_RAMPTIME_SHIFT 8
109#define OMAP3430_MPU_DPLL_RAMPTIME_MASK (0x3 << 8)
110#define OMAP3430_MPU_DPLL_FREQSEL_SHIFT 4
111#define OMAP3430_MPU_DPLL_FREQSEL_MASK (0xf << 4) 43#define OMAP3430_MPU_DPLL_FREQSEL_MASK (0xf << 4)
112#define OMAP3430_EN_MPU_DPLL_DRIFTGUARD_SHIFT 3 44#define OMAP3430_EN_MPU_DPLL_DRIFTGUARD_SHIFT 3
113#define OMAP3430_EN_MPU_DPLL_DRIFTGUARD_MASK (1 << 3)
114#define OMAP3430_EN_MPU_DPLL_SHIFT 0
115#define OMAP3430_EN_MPU_DPLL_MASK (0x7 << 0) 45#define OMAP3430_EN_MPU_DPLL_MASK (0x7 << 0)
116
117/* CM_IDLEST_MPU */
118#define OMAP3430_ST_MPU_MASK (1 << 0)
119
120/* CM_IDLEST_PLL_MPU */
121#define OMAP3430_ST_MPU_CLK_SHIFT 0 46#define OMAP3430_ST_MPU_CLK_SHIFT 0
122#define OMAP3430_ST_MPU_CLK_MASK (1 << 0) 47#define OMAP3430_ST_MPU_CLK_MASK (1 << 0)
123#define OMAP3430_ST_MPU_CLK_WIDTH 1 48#define OMAP3430_ST_MPU_CLK_WIDTH 1
124
125/* CM_AUTOIDLE_PLL_MPU */
126#define OMAP3430_AUTO_MPU_DPLL_SHIFT 0
127#define OMAP3430_AUTO_MPU_DPLL_MASK (0x7 << 0) 49#define OMAP3430_AUTO_MPU_DPLL_MASK (0x7 << 0)
128
129/* CM_CLKSEL1_PLL_MPU */
130#define OMAP3430_MPU_CLK_SRC_SHIFT 19 50#define OMAP3430_MPU_CLK_SRC_SHIFT 19
131#define OMAP3430_MPU_CLK_SRC_MASK (0x7 << 19)
132#define OMAP3430_MPU_CLK_SRC_WIDTH 3 51#define OMAP3430_MPU_CLK_SRC_WIDTH 3
133#define OMAP3430_MPU_DPLL_MULT_SHIFT 8
134#define OMAP3430_MPU_DPLL_MULT_MASK (0x7ff << 8) 52#define OMAP3430_MPU_DPLL_MULT_MASK (0x7ff << 8)
135#define OMAP3430_MPU_DPLL_DIV_SHIFT 0
136#define OMAP3430_MPU_DPLL_DIV_MASK (0x7f << 0) 53#define OMAP3430_MPU_DPLL_DIV_MASK (0x7f << 0)
137
138/* CM_CLKSEL2_PLL_MPU */
139#define OMAP3430_MPU_DPLL_CLKOUT_DIV_SHIFT 0 54#define OMAP3430_MPU_DPLL_CLKOUT_DIV_SHIFT 0
140#define OMAP3430_MPU_DPLL_CLKOUT_DIV_MASK (0x1f << 0)
141#define OMAP3430_MPU_DPLL_CLKOUT_DIV_WIDTH 5 55#define OMAP3430_MPU_DPLL_CLKOUT_DIV_WIDTH 5
142
143/* CM_CLKSTCTRL_MPU */
144#define OMAP3430_CLKTRCTRL_MPU_SHIFT 0
145#define OMAP3430_CLKTRCTRL_MPU_MASK (0x3 << 0) 56#define OMAP3430_CLKTRCTRL_MPU_MASK (0x3 << 0)
146
147/* CM_CLKSTST_MPU */
148#define OMAP3430_CLKACTIVITY_MPU_SHIFT 0
149#define OMAP3430_CLKACTIVITY_MPU_MASK (1 << 0)
150
151/* CM_FCLKEN1_CORE specific bits */
152#define OMAP3430_EN_MODEM_MASK (1 << 31)
153#define OMAP3430_EN_MODEM_SHIFT 31 57#define OMAP3430_EN_MODEM_SHIFT 31
154
155/* CM_ICLKEN1_CORE specific bits */
156#define OMAP3430_EN_ICR_MASK (1 << 29)
157#define OMAP3430_EN_ICR_SHIFT 29 58#define OMAP3430_EN_ICR_SHIFT 29
158#define OMAP3430_EN_AES2_MASK (1 << 28)
159#define OMAP3430_EN_AES2_SHIFT 28 59#define OMAP3430_EN_AES2_SHIFT 28
160#define OMAP3430_EN_SHA12_MASK (1 << 27)
161#define OMAP3430_EN_SHA12_SHIFT 27 60#define OMAP3430_EN_SHA12_SHIFT 27
162#define OMAP3430_EN_DES2_MASK (1 << 26)
163#define OMAP3430_EN_DES2_SHIFT 26 61#define OMAP3430_EN_DES2_SHIFT 26
164#define OMAP3430ES1_EN_FAC_MASK (1 << 8)
165#define OMAP3430ES1_EN_FAC_SHIFT 8 62#define OMAP3430ES1_EN_FAC_SHIFT 8
166#define OMAP3430_EN_MAILBOXES_MASK (1 << 7)
167#define OMAP3430_EN_MAILBOXES_SHIFT 7 63#define OMAP3430_EN_MAILBOXES_SHIFT 7
168#define OMAP3430_EN_OMAPCTRL_MASK (1 << 6)
169#define OMAP3430_EN_OMAPCTRL_SHIFT 6 64#define OMAP3430_EN_OMAPCTRL_SHIFT 6
170#define OMAP3430_EN_SAD2D_MASK (1 << 3)
171#define OMAP3430_EN_SAD2D_SHIFT 3 65#define OMAP3430_EN_SAD2D_SHIFT 3
172#define OMAP3430_EN_SDRC_MASK (1 << 1)
173#define OMAP3430_EN_SDRC_SHIFT 1 66#define OMAP3430_EN_SDRC_SHIFT 1
174
175/* AM35XX specific CM_ICLKEN1_CORE bits */
176#define AM35XX_EN_IPSS_MASK (1 << 4)
177#define AM35XX_EN_IPSS_SHIFT 4 67#define AM35XX_EN_IPSS_SHIFT 4
178
179/* CM_ICLKEN2_CORE */
180#define OMAP3430_EN_PKA_MASK (1 << 4)
181#define OMAP3430_EN_PKA_SHIFT 4 68#define OMAP3430_EN_PKA_SHIFT 4
182#define OMAP3430_EN_AES1_MASK (1 << 3)
183#define OMAP3430_EN_AES1_SHIFT 3 69#define OMAP3430_EN_AES1_SHIFT 3
184#define OMAP3430_EN_RNG_MASK (1 << 2)
185#define OMAP3430_EN_RNG_SHIFT 2 70#define OMAP3430_EN_RNG_SHIFT 2
186#define OMAP3430_EN_SHA11_MASK (1 << 1)
187#define OMAP3430_EN_SHA11_SHIFT 1 71#define OMAP3430_EN_SHA11_SHIFT 1
188#define OMAP3430_EN_DES1_MASK (1 << 0)
189#define OMAP3430_EN_DES1_SHIFT 0 72#define OMAP3430_EN_DES1_SHIFT 0
190
191/* CM_ICLKEN3_CORE */
192#define OMAP3430_EN_MAD2D_SHIFT 3 73#define OMAP3430_EN_MAD2D_SHIFT 3
193#define OMAP3430_EN_MAD2D_MASK (1 << 3)
194
195/* CM_FCLKEN3_CORE specific bits */
196#define OMAP3430ES2_EN_TS_SHIFT 1 74#define OMAP3430ES2_EN_TS_SHIFT 1
197#define OMAP3430ES2_EN_TS_MASK (1 << 1)
198#define OMAP3430ES2_EN_CPEFUSE_SHIFT 0 75#define OMAP3430ES2_EN_CPEFUSE_SHIFT 0
199#define OMAP3430ES2_EN_CPEFUSE_MASK (1 << 0)
200
201/* CM_IDLEST1_CORE specific bits */
202#define OMAP3430ES2_ST_MMC3_SHIFT 30
203#define OMAP3430ES2_ST_MMC3_MASK (1 << 30)
204#define OMAP3430_ST_ICR_SHIFT 29
205#define OMAP3430_ST_ICR_MASK (1 << 29)
206#define OMAP3430_ST_AES2_SHIFT 28 76#define OMAP3430_ST_AES2_SHIFT 28
207#define OMAP3430_ST_AES2_MASK (1 << 28)
208#define OMAP3430_ST_SHA12_SHIFT 27 77#define OMAP3430_ST_SHA12_SHIFT 27
209#define OMAP3430_ST_SHA12_MASK (1 << 27)
210#define OMAP3430_ST_DES2_SHIFT 26
211#define OMAP3430_ST_DES2_MASK (1 << 26)
212#define OMAP3430_ST_MSPRO_SHIFT 23
213#define OMAP3430_ST_MSPRO_MASK (1 << 23)
214#define AM35XX_ST_UART4_SHIFT 23 78#define AM35XX_ST_UART4_SHIFT 23
215#define AM35XX_ST_UART4_MASK (1 << 23)
216#define OMAP3430_ST_HDQ_SHIFT 22 79#define OMAP3430_ST_HDQ_SHIFT 22
217#define OMAP3430_ST_HDQ_MASK (1 << 22)
218#define OMAP3430ES1_ST_FAC_SHIFT 8
219#define OMAP3430ES1_ST_FAC_MASK (1 << 8)
220#define OMAP3430ES2_ST_SSI_IDLE_SHIFT 8 80#define OMAP3430ES2_ST_SSI_IDLE_SHIFT 8
221#define OMAP3430ES2_ST_SSI_IDLE_MASK (1 << 8)
222#define OMAP3430_ST_MAILBOXES_SHIFT 7 81#define OMAP3430_ST_MAILBOXES_SHIFT 7
223#define OMAP3430_ST_MAILBOXES_MASK (1 << 7)
224#define OMAP3430_ST_OMAPCTRL_SHIFT 6
225#define OMAP3430_ST_OMAPCTRL_MASK (1 << 6)
226#define OMAP3430_ST_SAD2D_SHIFT 3 82#define OMAP3430_ST_SAD2D_SHIFT 3
227#define OMAP3430_ST_SAD2D_MASK (1 << 3)
228#define OMAP3430_ST_SDMA_SHIFT 2 83#define OMAP3430_ST_SDMA_SHIFT 2
229#define OMAP3430_ST_SDMA_MASK (1 << 2)
230#define OMAP3430_ST_SDRC_SHIFT 1
231#define OMAP3430_ST_SDRC_MASK (1 << 1)
232#define OMAP3430_ST_SSI_STDBY_SHIFT 0
233#define OMAP3430_ST_SSI_STDBY_MASK (1 << 0)
234
235/* AM35xx specific CM_IDLEST1_CORE bits */
236#define AM35XX_ST_IPSS_SHIFT 5 84#define AM35XX_ST_IPSS_SHIFT 5
237#define AM35XX_ST_IPSS_MASK (1 << 5)
238
239/* CM_IDLEST2_CORE */
240#define OMAP3430_ST_PKA_SHIFT 4
241#define OMAP3430_ST_PKA_MASK (1 << 4)
242#define OMAP3430_ST_AES1_SHIFT 3
243#define OMAP3430_ST_AES1_MASK (1 << 3)
244#define OMAP3430_ST_RNG_SHIFT 2
245#define OMAP3430_ST_RNG_MASK (1 << 2)
246#define OMAP3430_ST_SHA11_SHIFT 1
247#define OMAP3430_ST_SHA11_MASK (1 << 1)
248#define OMAP3430_ST_DES1_SHIFT 0
249#define OMAP3430_ST_DES1_MASK (1 << 0)
250
251/* CM_IDLEST3_CORE */
252#define OMAP3430ES2_ST_USBTLL_SHIFT 2 85#define OMAP3430ES2_ST_USBTLL_SHIFT 2
253#define OMAP3430ES2_ST_USBTLL_MASK (1 << 2)
254#define OMAP3430ES2_ST_CPEFUSE_SHIFT 0
255#define OMAP3430ES2_ST_CPEFUSE_MASK (1 << 0)
256
257/* CM_AUTOIDLE1_CORE */
258#define OMAP3430_AUTO_MODEM_MASK (1 << 31)
259#define OMAP3430_AUTO_MODEM_SHIFT 31
260#define OMAP3430ES2_AUTO_MMC3_MASK (1 << 30)
261#define OMAP3430ES2_AUTO_MMC3_SHIFT 30
262#define OMAP3430ES2_AUTO_ICR_MASK (1 << 29)
263#define OMAP3430ES2_AUTO_ICR_SHIFT 29
264#define OMAP3430_AUTO_AES2_MASK (1 << 28)
265#define OMAP3430_AUTO_AES2_SHIFT 28
266#define OMAP3430_AUTO_SHA12_MASK (1 << 27)
267#define OMAP3430_AUTO_SHA12_SHIFT 27
268#define OMAP3430_AUTO_DES2_MASK (1 << 26)
269#define OMAP3430_AUTO_DES2_SHIFT 26
270#define OMAP3430_AUTO_MMC2_MASK (1 << 25)
271#define OMAP3430_AUTO_MMC2_SHIFT 25
272#define OMAP3430_AUTO_MMC1_MASK (1 << 24)
273#define OMAP3430_AUTO_MMC1_SHIFT 24
274#define OMAP3430_AUTO_MSPRO_MASK (1 << 23)
275#define OMAP3430_AUTO_MSPRO_SHIFT 23
276#define OMAP3430_AUTO_HDQ_MASK (1 << 22)
277#define OMAP3430_AUTO_HDQ_SHIFT 22
278#define OMAP3430_AUTO_MCSPI4_MASK (1 << 21)
279#define OMAP3430_AUTO_MCSPI4_SHIFT 21
280#define OMAP3430_AUTO_MCSPI3_MASK (1 << 20)
281#define OMAP3430_AUTO_MCSPI3_SHIFT 20
282#define OMAP3430_AUTO_MCSPI2_MASK (1 << 19)
283#define OMAP3430_AUTO_MCSPI2_SHIFT 19
284#define OMAP3430_AUTO_MCSPI1_MASK (1 << 18)
285#define OMAP3430_AUTO_MCSPI1_SHIFT 18
286#define OMAP3430_AUTO_I2C3_MASK (1 << 17)
287#define OMAP3430_AUTO_I2C3_SHIFT 17
288#define OMAP3430_AUTO_I2C2_MASK (1 << 16)
289#define OMAP3430_AUTO_I2C2_SHIFT 16
290#define OMAP3430_AUTO_I2C1_MASK (1 << 15)
291#define OMAP3430_AUTO_I2C1_SHIFT 15
292#define OMAP3430_AUTO_UART2_MASK (1 << 14)
293#define OMAP3430_AUTO_UART2_SHIFT 14
294#define OMAP3430_AUTO_UART1_MASK (1 << 13)
295#define OMAP3430_AUTO_UART1_SHIFT 13
296#define OMAP3430_AUTO_GPT11_MASK (1 << 12)
297#define OMAP3430_AUTO_GPT11_SHIFT 12
298#define OMAP3430_AUTO_GPT10_MASK (1 << 11)
299#define OMAP3430_AUTO_GPT10_SHIFT 11
300#define OMAP3430_AUTO_MCBSP5_MASK (1 << 10)
301#define OMAP3430_AUTO_MCBSP5_SHIFT 10
302#define OMAP3430_AUTO_MCBSP1_MASK (1 << 9)
303#define OMAP3430_AUTO_MCBSP1_SHIFT 9
304#define OMAP3430ES1_AUTO_FAC_MASK (1 << 8)
305#define OMAP3430ES1_AUTO_FAC_SHIFT 8
306#define OMAP3430_AUTO_MAILBOXES_MASK (1 << 7)
307#define OMAP3430_AUTO_MAILBOXES_SHIFT 7
308#define OMAP3430_AUTO_OMAPCTRL_MASK (1 << 6)
309#define OMAP3430_AUTO_OMAPCTRL_SHIFT 6
310#define OMAP3430ES1_AUTO_FSHOSTUSB_MASK (1 << 5)
311#define OMAP3430ES1_AUTO_FSHOSTUSB_SHIFT 5
312#define OMAP3430_AUTO_HSOTGUSB_MASK (1 << 4)
313#define OMAP3430_AUTO_HSOTGUSB_SHIFT 4
314#define OMAP3430ES1_AUTO_D2D_MASK (1 << 3)
315#define OMAP3430ES1_AUTO_D2D_SHIFT 3
316#define OMAP3430_AUTO_SAD2D_MASK (1 << 3)
317#define OMAP3430_AUTO_SAD2D_SHIFT 3
318#define OMAP3430_AUTO_SSI_MASK (1 << 0)
319#define OMAP3430_AUTO_SSI_SHIFT 0
320
321/* CM_AUTOIDLE2_CORE */
322#define OMAP3430_AUTO_PKA_MASK (1 << 4)
323#define OMAP3430_AUTO_PKA_SHIFT 4
324#define OMAP3430_AUTO_AES1_MASK (1 << 3)
325#define OMAP3430_AUTO_AES1_SHIFT 3
326#define OMAP3430_AUTO_RNG_MASK (1 << 2)
327#define OMAP3430_AUTO_RNG_SHIFT 2
328#define OMAP3430_AUTO_SHA11_MASK (1 << 1)
329#define OMAP3430_AUTO_SHA11_SHIFT 1
330#define OMAP3430_AUTO_DES1_MASK (1 << 0)
331#define OMAP3430_AUTO_DES1_SHIFT 0
332
333/* CM_AUTOIDLE3_CORE */
334#define OMAP3430ES2_AUTO_USBHOST (1 << 0)
335#define OMAP3430ES2_AUTO_USBHOST_SHIFT 0
336#define OMAP3430ES2_AUTO_USBTLL (1 << 2)
337#define OMAP3430ES2_AUTO_USBTLL_SHIFT 2
338#define OMAP3430ES2_AUTO_USBTLL_MASK (1 << 2)
339#define OMAP3430_AUTO_MAD2D_SHIFT 3
340#define OMAP3430_AUTO_MAD2D_MASK (1 << 3)
341
342/* CM_CLKSEL_CORE */
343#define OMAP3430_CLKSEL_SSI_SHIFT 8
344#define OMAP3430_CLKSEL_SSI_MASK (0xf << 8) 86#define OMAP3430_CLKSEL_SSI_MASK (0xf << 8)
345#define OMAP3430_CLKSEL_GPT11_MASK (1 << 7) 87#define OMAP3430_CLKSEL_GPT11_MASK (1 << 7)
346#define OMAP3430_CLKSEL_GPT11_SHIFT 7
347#define OMAP3430_CLKSEL_GPT10_MASK (1 << 6) 88#define OMAP3430_CLKSEL_GPT10_MASK (1 << 6)
348#define OMAP3430_CLKSEL_GPT10_SHIFT 6
349#define OMAP3430ES1_CLKSEL_FSHOSTUSB_SHIFT 4
350#define OMAP3430ES1_CLKSEL_FSHOSTUSB_MASK (0x3 << 4) 89#define OMAP3430ES1_CLKSEL_FSHOSTUSB_MASK (0x3 << 4)
351#define OMAP3430_CLKSEL_L4_SHIFT 2 90#define OMAP3430_CLKSEL_L4_SHIFT 2
352#define OMAP3430_CLKSEL_L4_MASK (0x3 << 2)
353#define OMAP3430_CLKSEL_L4_WIDTH 2 91#define OMAP3430_CLKSEL_L4_WIDTH 2
354#define OMAP3430_CLKSEL_L3_SHIFT 0 92#define OMAP3430_CLKSEL_L3_SHIFT 0
355#define OMAP3430_CLKSEL_L3_MASK (0x3 << 0)
356#define OMAP3430_CLKSEL_L3_WIDTH 2 93#define OMAP3430_CLKSEL_L3_WIDTH 2
357#define OMAP3630_CLKSEL_96M_SHIFT 12
358#define OMAP3630_CLKSEL_96M_MASK (0x3 << 12) 94#define OMAP3630_CLKSEL_96M_MASK (0x3 << 12)
359#define OMAP3630_CLKSEL_96M_WIDTH 2
360
361/* CM_CLKSTCTRL_CORE */
362#define OMAP3430ES1_CLKTRCTRL_D2D_SHIFT 4
363#define OMAP3430ES1_CLKTRCTRL_D2D_MASK (0x3 << 4) 95#define OMAP3430ES1_CLKTRCTRL_D2D_MASK (0x3 << 4)
364#define OMAP3430_CLKTRCTRL_L4_SHIFT 2
365#define OMAP3430_CLKTRCTRL_L4_MASK (0x3 << 2) 96#define OMAP3430_CLKTRCTRL_L4_MASK (0x3 << 2)
366#define OMAP3430_CLKTRCTRL_L3_SHIFT 0
367#define OMAP3430_CLKTRCTRL_L3_MASK (0x3 << 0) 97#define OMAP3430_CLKTRCTRL_L3_MASK (0x3 << 0)
368
369/* CM_CLKSTST_CORE */
370#define OMAP3430ES1_CLKACTIVITY_D2D_SHIFT 2
371#define OMAP3430ES1_CLKACTIVITY_D2D_MASK (1 << 2)
372#define OMAP3430_CLKACTIVITY_L4_SHIFT 1
373#define OMAP3430_CLKACTIVITY_L4_MASK (1 << 1)
374#define OMAP3430_CLKACTIVITY_L3_SHIFT 0
375#define OMAP3430_CLKACTIVITY_L3_MASK (1 << 0)
376
377/* CM_FCLKEN_GFX */
378#define OMAP3430ES1_EN_3D_MASK (1 << 2)
379#define OMAP3430ES1_EN_3D_SHIFT 2 98#define OMAP3430ES1_EN_3D_SHIFT 2
380#define OMAP3430ES1_EN_2D_MASK (1 << 1)
381#define OMAP3430ES1_EN_2D_SHIFT 1 99#define OMAP3430ES1_EN_2D_SHIFT 1
382
383/* CM_ICLKEN_GFX specific bits */
384
385/* CM_IDLEST_GFX specific bits */
386
387/* CM_CLKSEL_GFX specific bits */
388
389/* CM_SLEEPDEP_GFX specific bits */
390
391/* CM_CLKSTCTRL_GFX */
392#define OMAP3430ES1_CLKTRCTRL_GFX_SHIFT 0
393#define OMAP3430ES1_CLKTRCTRL_GFX_MASK (0x3 << 0) 100#define OMAP3430ES1_CLKTRCTRL_GFX_MASK (0x3 << 0)
394
395/* CM_CLKSTST_GFX */
396#define OMAP3430ES1_CLKACTIVITY_GFX_SHIFT 0
397#define OMAP3430ES1_CLKACTIVITY_GFX_MASK (1 << 0)
398
399/* CM_FCLKEN_SGX */
400#define OMAP3430ES2_CM_FCLKEN_SGX_EN_SGX_SHIFT 1 101#define OMAP3430ES2_CM_FCLKEN_SGX_EN_SGX_SHIFT 1
401#define OMAP3430ES2_CM_FCLKEN_SGX_EN_SGX_MASK (1 << 1)
402
403/* CM_IDLEST_SGX */
404#define OMAP3430ES2_ST_SGX_SHIFT 1
405#define OMAP3430ES2_ST_SGX_MASK (1 << 1)
406
407/* CM_ICLKEN_SGX */
408#define OMAP3430ES2_CM_ICLKEN_SGX_EN_SGX_SHIFT 0 102#define OMAP3430ES2_CM_ICLKEN_SGX_EN_SGX_SHIFT 0
409#define OMAP3430ES2_CM_ICLKEN_SGX_EN_SGX_MASK (1 << 0)
410
411/* CM_CLKSEL_SGX */
412#define OMAP3430ES2_CLKSEL_SGX_SHIFT 0
413#define OMAP3430ES2_CLKSEL_SGX_MASK (0x7 << 0) 103#define OMAP3430ES2_CLKSEL_SGX_MASK (0x7 << 0)
414
415/* CM_CLKSTCTRL_SGX */
416#define OMAP3430ES2_CLKTRCTRL_SGX_SHIFT 0
417#define OMAP3430ES2_CLKTRCTRL_SGX_MASK (0x3 << 0) 104#define OMAP3430ES2_CLKTRCTRL_SGX_MASK (0x3 << 0)
418
419/* CM_CLKSTST_SGX */
420#define OMAP3430ES2_CLKACTIVITY_SGX_SHIFT 0
421#define OMAP3430ES2_CLKACTIVITY_SGX_MASK (1 << 0)
422
423/* CM_FCLKEN_WKUP specific bits */
424#define OMAP3430ES2_EN_USIMOCP_SHIFT 9 105#define OMAP3430ES2_EN_USIMOCP_SHIFT 9
425#define OMAP3430ES2_EN_USIMOCP_MASK (1 << 9)
426
427/* CM_ICLKEN_WKUP specific bits */
428#define OMAP3430_EN_WDT1_MASK (1 << 4)
429#define OMAP3430_EN_WDT1_SHIFT 4 106#define OMAP3430_EN_WDT1_SHIFT 4
430#define OMAP3430_EN_32KSYNC_MASK (1 << 2)
431#define OMAP3430_EN_32KSYNC_SHIFT 2 107#define OMAP3430_EN_32KSYNC_SHIFT 2
432
433/* CM_IDLEST_WKUP specific bits */
434#define OMAP3430ES2_ST_USIMOCP_SHIFT 9
435#define OMAP3430ES2_ST_USIMOCP_MASK (1 << 9)
436#define OMAP3430_ST_WDT2_SHIFT 5 108#define OMAP3430_ST_WDT2_SHIFT 5
437#define OMAP3430_ST_WDT2_MASK (1 << 5)
438#define OMAP3430_ST_WDT1_SHIFT 4
439#define OMAP3430_ST_WDT1_MASK (1 << 4)
440#define OMAP3430_ST_32KSYNC_SHIFT 2 109#define OMAP3430_ST_32KSYNC_SHIFT 2
441#define OMAP3430_ST_32KSYNC_MASK (1 << 2)
442
443/* CM_AUTOIDLE_WKUP */
444#define OMAP3430ES2_AUTO_USIMOCP_MASK (1 << 9)
445#define OMAP3430ES2_AUTO_USIMOCP_SHIFT 9
446#define OMAP3430_AUTO_WDT2_MASK (1 << 5)
447#define OMAP3430_AUTO_WDT2_SHIFT 5
448#define OMAP3430_AUTO_WDT1_MASK (1 << 4)
449#define OMAP3430_AUTO_WDT1_SHIFT 4
450#define OMAP3430_AUTO_GPIO1_MASK (1 << 3)
451#define OMAP3430_AUTO_GPIO1_SHIFT 3
452#define OMAP3430_AUTO_32KSYNC_MASK (1 << 2)
453#define OMAP3430_AUTO_32KSYNC_SHIFT 2
454#define OMAP3430_AUTO_GPT12_MASK (1 << 1)
455#define OMAP3430_AUTO_GPT12_SHIFT 1
456#define OMAP3430_AUTO_GPT1_MASK (1 << 0)
457#define OMAP3430_AUTO_GPT1_SHIFT 0
458
459/* CM_CLKSEL_WKUP */
460#define OMAP3430ES2_CLKSEL_USIMOCP_MASK (0xf << 3) 110#define OMAP3430ES2_CLKSEL_USIMOCP_MASK (0xf << 3)
461#define OMAP3430_CLKSEL_RM_SHIFT 1 111#define OMAP3430_CLKSEL_RM_SHIFT 1
462#define OMAP3430_CLKSEL_RM_MASK (0x3 << 1)
463#define OMAP3430_CLKSEL_RM_WIDTH 2 112#define OMAP3430_CLKSEL_RM_WIDTH 2
464#define OMAP3430_CLKSEL_GPT1_SHIFT 0
465#define OMAP3430_CLKSEL_GPT1_MASK (1 << 0) 113#define OMAP3430_CLKSEL_GPT1_MASK (1 << 0)
466
467/* CM_CLKEN_PLL */
468#define OMAP3430_PWRDN_EMU_PERIPH_SHIFT 31 114#define OMAP3430_PWRDN_EMU_PERIPH_SHIFT 31
469#define OMAP3430_PWRDN_CAM_SHIFT 30 115#define OMAP3430_PWRDN_CAM_SHIFT 30
470#define OMAP3430_PWRDN_DSS1_SHIFT 29 116#define OMAP3430_PWRDN_DSS1_SHIFT 29
471#define OMAP3430_PWRDN_TV_SHIFT 28 117#define OMAP3430_PWRDN_TV_SHIFT 28
472#define OMAP3430_PWRDN_96M_SHIFT 27 118#define OMAP3430_PWRDN_96M_SHIFT 27
473#define OMAP3430_PERIPH_DPLL_RAMPTIME_SHIFT 24
474#define OMAP3430_PERIPH_DPLL_RAMPTIME_MASK (0x3 << 24)
475#define OMAP3430_PERIPH_DPLL_FREQSEL_SHIFT 20
476#define OMAP3430_PERIPH_DPLL_FREQSEL_MASK (0xf << 20) 119#define OMAP3430_PERIPH_DPLL_FREQSEL_MASK (0xf << 20)
477#define OMAP3430_EN_PERIPH_DPLL_DRIFTGUARD_SHIFT 19 120#define OMAP3430_EN_PERIPH_DPLL_DRIFTGUARD_SHIFT 19
478#define OMAP3430_EN_PERIPH_DPLL_DRIFTGUARD_MASK (1 << 19)
479#define OMAP3430_EN_PERIPH_DPLL_SHIFT 16
480#define OMAP3430_EN_PERIPH_DPLL_MASK (0x7 << 16) 121#define OMAP3430_EN_PERIPH_DPLL_MASK (0x7 << 16)
481#define OMAP3430_PWRDN_EMU_CORE_SHIFT 12 122#define OMAP3430_PWRDN_EMU_CORE_SHIFT 12
482#define OMAP3430_CORE_DPLL_RAMPTIME_SHIFT 8
483#define OMAP3430_CORE_DPLL_RAMPTIME_MASK (0x3 << 8)
484#define OMAP3430_CORE_DPLL_FREQSEL_SHIFT 4
485#define OMAP3430_CORE_DPLL_FREQSEL_MASK (0xf << 4) 123#define OMAP3430_CORE_DPLL_FREQSEL_MASK (0xf << 4)
486#define OMAP3430_EN_CORE_DPLL_DRIFTGUARD_SHIFT 3 124#define OMAP3430_EN_CORE_DPLL_DRIFTGUARD_SHIFT 3
487#define OMAP3430_EN_CORE_DPLL_DRIFTGUARD_MASK (1 << 3)
488#define OMAP3430_EN_CORE_DPLL_SHIFT 0
489#define OMAP3430_EN_CORE_DPLL_MASK (0x7 << 0) 125#define OMAP3430_EN_CORE_DPLL_MASK (0x7 << 0)
490
491/* CM_CLKEN2_PLL */
492#define OMAP3430ES2_EN_PERIPH2_DPLL_LPMODE_SHIFT 10
493#define OMAP3430ES2_PERIPH2_DPLL_RAMPTIME_MASK (0x3 << 8)
494#define OMAP3430ES2_PERIPH2_DPLL_FREQSEL_SHIFT 4
495#define OMAP3430ES2_PERIPH2_DPLL_FREQSEL_MASK (0xf << 4) 126#define OMAP3430ES2_PERIPH2_DPLL_FREQSEL_MASK (0xf << 4)
496#define OMAP3430ES2_EN_PERIPH2_DPLL_DRIFTGUARD_SHIFT 3 127#define OMAP3430ES2_EN_PERIPH2_DPLL_DRIFTGUARD_SHIFT 3
497#define OMAP3430ES2_EN_PERIPH2_DPLL_SHIFT 0
498#define OMAP3430ES2_EN_PERIPH2_DPLL_MASK (0x7 << 0) 128#define OMAP3430ES2_EN_PERIPH2_DPLL_MASK (0x7 << 0)
499
500/* CM_IDLEST_CKGEN */
501#define OMAP3430_ST_54M_CLK_MASK (1 << 5)
502#define OMAP3430_ST_12M_CLK_MASK (1 << 4)
503#define OMAP3430_ST_48M_CLK_MASK (1 << 3)
504#define OMAP3430_ST_96M_CLK_MASK (1 << 2)
505#define OMAP3430_ST_PERIPH_CLK_SHIFT 1
506#define OMAP3430_ST_PERIPH_CLK_MASK (1 << 1) 129#define OMAP3430_ST_PERIPH_CLK_MASK (1 << 1)
507#define OMAP3430_ST_CORE_CLK_SHIFT 0
508#define OMAP3430_ST_CORE_CLK_MASK (1 << 0) 130#define OMAP3430_ST_CORE_CLK_MASK (1 << 0)
509
510/* CM_IDLEST2_CKGEN */
511#define OMAP3430ES2_ST_USIM_CLK_SHIFT 2
512#define OMAP3430ES2_ST_USIM_CLK_MASK (1 << 2)
513#define OMAP3430ES2_ST_120M_CLK_SHIFT 1
514#define OMAP3430ES2_ST_120M_CLK_MASK (1 << 1)
515#define OMAP3430ES2_ST_PERIPH2_CLK_SHIFT 0
516#define OMAP3430ES2_ST_PERIPH2_CLK_MASK (1 << 0) 131#define OMAP3430ES2_ST_PERIPH2_CLK_MASK (1 << 0)
517
518/* CM_AUTOIDLE_PLL */
519#define OMAP3430_AUTO_PERIPH_DPLL_SHIFT 3
520#define OMAP3430_AUTO_PERIPH_DPLL_MASK (0x7 << 3) 132#define OMAP3430_AUTO_PERIPH_DPLL_MASK (0x7 << 3)
521#define OMAP3430_AUTO_CORE_DPLL_SHIFT 0
522#define OMAP3430_AUTO_CORE_DPLL_MASK (0x7 << 0) 133#define OMAP3430_AUTO_CORE_DPLL_MASK (0x7 << 0)
523
524/* CM_AUTOIDLE2_PLL */
525#define OMAP3430ES2_AUTO_PERIPH2_DPLL_SHIFT 0
526#define OMAP3430ES2_AUTO_PERIPH2_DPLL_MASK (0x7 << 0) 134#define OMAP3430ES2_AUTO_PERIPH2_DPLL_MASK (0x7 << 0)
527
528/* CM_CLKSEL1_PLL */
529/* Note that OMAP3430_CORE_DPLL_CLKOUT_DIV_MASK was (0x3 << 27) on 3430ES1 */
530#define OMAP3430_CORE_DPLL_CLKOUT_DIV_SHIFT 27 135#define OMAP3430_CORE_DPLL_CLKOUT_DIV_SHIFT 27
531#define OMAP3430_CORE_DPLL_CLKOUT_DIV_MASK (0x1f << 27)
532#define OMAP3430_CORE_DPLL_CLKOUT_DIV_WIDTH 5 136#define OMAP3430_CORE_DPLL_CLKOUT_DIV_WIDTH 5
533#define OMAP3430_CORE_DPLL_MULT_SHIFT 16
534#define OMAP3430_CORE_DPLL_MULT_MASK (0x7ff << 16) 137#define OMAP3430_CORE_DPLL_MULT_MASK (0x7ff << 16)
535#define OMAP3430_CORE_DPLL_DIV_SHIFT 8
536#define OMAP3430_CORE_DPLL_DIV_MASK (0x7f << 8) 138#define OMAP3430_CORE_DPLL_DIV_MASK (0x7f << 8)
537#define OMAP3430_SOURCE_96M_SHIFT 6 139#define OMAP3430_SOURCE_96M_SHIFT 6
538#define OMAP3430_SOURCE_96M_MASK (1 << 6)
539#define OMAP3430_SOURCE_96M_WIDTH 1 140#define OMAP3430_SOURCE_96M_WIDTH 1
540#define OMAP3430_SOURCE_54M_SHIFT 5 141#define OMAP3430_SOURCE_54M_SHIFT 5
541#define OMAP3430_SOURCE_54M_MASK (1 << 5)
542#define OMAP3430_SOURCE_54M_WIDTH 1 142#define OMAP3430_SOURCE_54M_WIDTH 1
543#define OMAP3430_SOURCE_48M_SHIFT 3
544#define OMAP3430_SOURCE_48M_MASK (1 << 3) 143#define OMAP3430_SOURCE_48M_MASK (1 << 3)
545
546/* CM_CLKSEL2_PLL */
547#define OMAP3430_PERIPH_DPLL_MULT_SHIFT 8
548#define OMAP3430_PERIPH_DPLL_MULT_MASK (0x7ff << 8) 144#define OMAP3430_PERIPH_DPLL_MULT_MASK (0x7ff << 8)
549#define OMAP3630_PERIPH_DPLL_MULT_MASK (0xfff << 8) 145#define OMAP3630_PERIPH_DPLL_MULT_MASK (0xfff << 8)
550#define OMAP3430_PERIPH_DPLL_DIV_SHIFT 0
551#define OMAP3430_PERIPH_DPLL_DIV_MASK (0x7f << 0) 146#define OMAP3430_PERIPH_DPLL_DIV_MASK (0x7f << 0)
552#define OMAP3630_PERIPH_DPLL_DCO_SEL_SHIFT 21
553#define OMAP3630_PERIPH_DPLL_DCO_SEL_MASK (0x7 << 21) 147#define OMAP3630_PERIPH_DPLL_DCO_SEL_MASK (0x7 << 21)
554#define OMAP3630_PERIPH_DPLL_SD_DIV_SHIFT 24
555#define OMAP3630_PERIPH_DPLL_SD_DIV_MASK (0xff << 24) 148#define OMAP3630_PERIPH_DPLL_SD_DIV_MASK (0xff << 24)
556
557/* CM_CLKSEL3_PLL */
558#define OMAP3430_DIV_96M_SHIFT 0 149#define OMAP3430_DIV_96M_SHIFT 0
559#define OMAP3430_DIV_96M_MASK (0x1f << 0)
560#define OMAP3430_DIV_96M_WIDTH 5
561#define OMAP3630_DIV_96M_MASK (0x3f << 0)
562#define OMAP3630_DIV_96M_WIDTH 6 150#define OMAP3630_DIV_96M_WIDTH 6
563
564/* CM_CLKSEL4_PLL */
565#define OMAP3430ES2_PERIPH2_DPLL_MULT_SHIFT 8
566#define OMAP3430ES2_PERIPH2_DPLL_MULT_MASK (0x7ff << 8) 151#define OMAP3430ES2_PERIPH2_DPLL_MULT_MASK (0x7ff << 8)
567#define OMAP3430ES2_PERIPH2_DPLL_DIV_SHIFT 0
568#define OMAP3430ES2_PERIPH2_DPLL_DIV_MASK (0x7f << 0) 152#define OMAP3430ES2_PERIPH2_DPLL_DIV_MASK (0x7f << 0)
569
570/* CM_CLKSEL5_PLL */
571#define OMAP3430ES2_DIV_120M_SHIFT 0 153#define OMAP3430ES2_DIV_120M_SHIFT 0
572#define OMAP3430ES2_DIV_120M_MASK (0x1f << 0)
573#define OMAP3430ES2_DIV_120M_WIDTH 5 154#define OMAP3430ES2_DIV_120M_WIDTH 5
574
575/* CM_CLKOUT_CTRL */
576#define OMAP3430_CLKOUT2_EN_SHIFT 7 155#define OMAP3430_CLKOUT2_EN_SHIFT 7
577#define OMAP3430_CLKOUT2_EN_MASK (1 << 7)
578#define OMAP3430_CLKOUT2_DIV_SHIFT 3 156#define OMAP3430_CLKOUT2_DIV_SHIFT 3
579#define OMAP3430_CLKOUT2_DIV_MASK (0x7 << 3)
580#define OMAP3430_CLKOUT2_DIV_WIDTH 3 157#define OMAP3430_CLKOUT2_DIV_WIDTH 3
581#define OMAP3430_CLKOUT2SOURCE_SHIFT 0
582#define OMAP3430_CLKOUT2SOURCE_MASK (0x3 << 0) 158#define OMAP3430_CLKOUT2SOURCE_MASK (0x3 << 0)
583
584/* CM_FCLKEN_DSS */
585#define OMAP3430_EN_TV_MASK (1 << 2)
586#define OMAP3430_EN_TV_SHIFT 2 159#define OMAP3430_EN_TV_SHIFT 2
587#define OMAP3430_EN_DSS2_MASK (1 << 1)
588#define OMAP3430_EN_DSS2_SHIFT 1 160#define OMAP3430_EN_DSS2_SHIFT 1
589#define OMAP3430_EN_DSS1_MASK (1 << 0)
590#define OMAP3430_EN_DSS1_SHIFT 0 161#define OMAP3430_EN_DSS1_SHIFT 0
591
592/* CM_ICLKEN_DSS */
593#define OMAP3430_CM_ICLKEN_DSS_EN_DSS_MASK (1 << 0)
594#define OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT 0 162#define OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT 0
595
596/* CM_IDLEST_DSS */
597#define OMAP3430ES2_ST_DSS_IDLE_SHIFT 1 163#define OMAP3430ES2_ST_DSS_IDLE_SHIFT 1
598#define OMAP3430ES2_ST_DSS_IDLE_MASK (1 << 1)
599#define OMAP3430ES2_ST_DSS_STDBY_SHIFT 0 164#define OMAP3430ES2_ST_DSS_STDBY_SHIFT 0
600#define OMAP3430ES2_ST_DSS_STDBY_MASK (1 << 0)
601#define OMAP3430ES1_ST_DSS_SHIFT 0 165#define OMAP3430ES1_ST_DSS_SHIFT 0
602#define OMAP3430ES1_ST_DSS_MASK (1 << 0)
603
604/* CM_AUTOIDLE_DSS */
605#define OMAP3430_AUTO_DSS_MASK (1 << 0)
606#define OMAP3430_AUTO_DSS_SHIFT 0
607
608/* CM_CLKSEL_DSS */
609#define OMAP3430_CLKSEL_TV_SHIFT 8 166#define OMAP3430_CLKSEL_TV_SHIFT 8
610#define OMAP3430_CLKSEL_TV_MASK (0x1f << 8)
611#define OMAP3430_CLKSEL_TV_WIDTH 5
612#define OMAP3630_CLKSEL_TV_MASK (0x3f << 8)
613#define OMAP3630_CLKSEL_TV_WIDTH 6 167#define OMAP3630_CLKSEL_TV_WIDTH 6
614#define OMAP3430_CLKSEL_DSS1_SHIFT 0 168#define OMAP3430_CLKSEL_DSS1_SHIFT 0
615#define OMAP3430_CLKSEL_DSS1_MASK (0x1f << 0)
616#define OMAP3430_CLKSEL_DSS1_WIDTH 5
617#define OMAP3630_CLKSEL_DSS1_MASK (0x3f << 0)
618#define OMAP3630_CLKSEL_DSS1_WIDTH 6 169#define OMAP3630_CLKSEL_DSS1_WIDTH 6
619
620/* CM_SLEEPDEP_DSS specific bits */
621
622/* CM_CLKSTCTRL_DSS */
623#define OMAP3430_CLKTRCTRL_DSS_SHIFT 0
624#define OMAP3430_CLKTRCTRL_DSS_MASK (0x3 << 0) 170#define OMAP3430_CLKTRCTRL_DSS_MASK (0x3 << 0)
625
626/* CM_CLKSTST_DSS */
627#define OMAP3430_CLKACTIVITY_DSS_SHIFT 0
628#define OMAP3430_CLKACTIVITY_DSS_MASK (1 << 0)
629
630/* CM_FCLKEN_CAM specific bits */
631#define OMAP3430_EN_CSI2_MASK (1 << 1)
632#define OMAP3430_EN_CSI2_SHIFT 1 171#define OMAP3430_EN_CSI2_SHIFT 1
633
634/* CM_ICLKEN_CAM specific bits */
635
636/* CM_IDLEST_CAM */
637#define OMAP3430_ST_CAM_MASK (1 << 0)
638
639/* CM_AUTOIDLE_CAM */
640#define OMAP3430_AUTO_CAM_MASK (1 << 0)
641#define OMAP3430_AUTO_CAM_SHIFT 0
642
643/* CM_CLKSEL_CAM */
644#define OMAP3430_CLKSEL_CAM_SHIFT 0 172#define OMAP3430_CLKSEL_CAM_SHIFT 0
645#define OMAP3430_CLKSEL_CAM_MASK (0x1f << 0)
646#define OMAP3430_CLKSEL_CAM_WIDTH 5
647#define OMAP3630_CLKSEL_CAM_MASK (0x3f << 0)
648#define OMAP3630_CLKSEL_CAM_WIDTH 6 173#define OMAP3630_CLKSEL_CAM_WIDTH 6
649
650/* CM_SLEEPDEP_CAM specific bits */
651
652/* CM_CLKSTCTRL_CAM */
653#define OMAP3430_CLKTRCTRL_CAM_SHIFT 0
654#define OMAP3430_CLKTRCTRL_CAM_MASK (0x3 << 0) 174#define OMAP3430_CLKTRCTRL_CAM_MASK (0x3 << 0)
655
656/* CM_CLKSTST_CAM */
657#define OMAP3430_CLKACTIVITY_CAM_SHIFT 0
658#define OMAP3430_CLKACTIVITY_CAM_MASK (1 << 0)
659
660/* CM_FCLKEN_PER specific bits */
661
662/* CM_ICLKEN_PER specific bits */
663
664/* CM_IDLEST_PER */
665#define OMAP3430_ST_WDT3_SHIFT 12
666#define OMAP3430_ST_WDT3_MASK (1 << 12)
667#define OMAP3430_ST_MCBSP4_SHIFT 2 175#define OMAP3430_ST_MCBSP4_SHIFT 2
668#define OMAP3430_ST_MCBSP4_MASK (1 << 2)
669#define OMAP3430_ST_MCBSP3_SHIFT 1 176#define OMAP3430_ST_MCBSP3_SHIFT 1
670#define OMAP3430_ST_MCBSP3_MASK (1 << 1)
671#define OMAP3430_ST_MCBSP2_SHIFT 0 177#define OMAP3430_ST_MCBSP2_SHIFT 0
672#define OMAP3430_ST_MCBSP2_MASK (1 << 0)
673
674/* CM_AUTOIDLE_PER */
675#define OMAP3630_AUTO_UART4_MASK (1 << 18)
676#define OMAP3630_AUTO_UART4_SHIFT 18
677#define OMAP3430_AUTO_GPIO6_MASK (1 << 17)
678#define OMAP3430_AUTO_GPIO6_SHIFT 17
679#define OMAP3430_AUTO_GPIO5_MASK (1 << 16)
680#define OMAP3430_AUTO_GPIO5_SHIFT 16
681#define OMAP3430_AUTO_GPIO4_MASK (1 << 15)
682#define OMAP3430_AUTO_GPIO4_SHIFT 15
683#define OMAP3430_AUTO_GPIO3_MASK (1 << 14)
684#define OMAP3430_AUTO_GPIO3_SHIFT 14
685#define OMAP3430_AUTO_GPIO2_MASK (1 << 13)
686#define OMAP3430_AUTO_GPIO2_SHIFT 13
687#define OMAP3430_AUTO_WDT3_MASK (1 << 12)
688#define OMAP3430_AUTO_WDT3_SHIFT 12
689#define OMAP3430_AUTO_UART3_MASK (1 << 11)
690#define OMAP3430_AUTO_UART3_SHIFT 11
691#define OMAP3430_AUTO_GPT9_MASK (1 << 10)
692#define OMAP3430_AUTO_GPT9_SHIFT 10
693#define OMAP3430_AUTO_GPT8_MASK (1 << 9)
694#define OMAP3430_AUTO_GPT8_SHIFT 9
695#define OMAP3430_AUTO_GPT7_MASK (1 << 8)
696#define OMAP3430_AUTO_GPT7_SHIFT 8
697#define OMAP3430_AUTO_GPT6_MASK (1 << 7)
698#define OMAP3430_AUTO_GPT6_SHIFT 7
699#define OMAP3430_AUTO_GPT5_MASK (1 << 6)
700#define OMAP3430_AUTO_GPT5_SHIFT 6
701#define OMAP3430_AUTO_GPT4_MASK (1 << 5)
702#define OMAP3430_AUTO_GPT4_SHIFT 5
703#define OMAP3430_AUTO_GPT3_MASK (1 << 4)
704#define OMAP3430_AUTO_GPT3_SHIFT 4
705#define OMAP3430_AUTO_GPT2_MASK (1 << 3)
706#define OMAP3430_AUTO_GPT2_SHIFT 3
707#define OMAP3430_AUTO_MCBSP4_MASK (1 << 2)
708#define OMAP3430_AUTO_MCBSP4_SHIFT 2
709#define OMAP3430_AUTO_MCBSP3_MASK (1 << 1)
710#define OMAP3430_AUTO_MCBSP3_SHIFT 1
711#define OMAP3430_AUTO_MCBSP2_MASK (1 << 0)
712#define OMAP3430_AUTO_MCBSP2_SHIFT 0
713
714/* CM_CLKSEL_PER */
715#define OMAP3430_CLKSEL_GPT9_MASK (1 << 7) 178#define OMAP3430_CLKSEL_GPT9_MASK (1 << 7)
716#define OMAP3430_CLKSEL_GPT9_SHIFT 7
717#define OMAP3430_CLKSEL_GPT8_MASK (1 << 6) 179#define OMAP3430_CLKSEL_GPT8_MASK (1 << 6)
718#define OMAP3430_CLKSEL_GPT8_SHIFT 6
719#define OMAP3430_CLKSEL_GPT7_MASK (1 << 5) 180#define OMAP3430_CLKSEL_GPT7_MASK (1 << 5)
720#define OMAP3430_CLKSEL_GPT7_SHIFT 5
721#define OMAP3430_CLKSEL_GPT6_MASK (1 << 4) 181#define OMAP3430_CLKSEL_GPT6_MASK (1 << 4)
722#define OMAP3430_CLKSEL_GPT6_SHIFT 4
723#define OMAP3430_CLKSEL_GPT5_MASK (1 << 3) 182#define OMAP3430_CLKSEL_GPT5_MASK (1 << 3)
724#define OMAP3430_CLKSEL_GPT5_SHIFT 3
725#define OMAP3430_CLKSEL_GPT4_MASK (1 << 2) 183#define OMAP3430_CLKSEL_GPT4_MASK (1 << 2)
726#define OMAP3430_CLKSEL_GPT4_SHIFT 2
727#define OMAP3430_CLKSEL_GPT3_MASK (1 << 1) 184#define OMAP3430_CLKSEL_GPT3_MASK (1 << 1)
728#define OMAP3430_CLKSEL_GPT3_SHIFT 1
729#define OMAP3430_CLKSEL_GPT2_MASK (1 << 0) 185#define OMAP3430_CLKSEL_GPT2_MASK (1 << 0)
730#define OMAP3430_CLKSEL_GPT2_SHIFT 0
731
732/* CM_SLEEPDEP_PER specific bits */
733#define OMAP3430_CM_SLEEPDEP_PER_EN_IVA2_MASK (1 << 2)
734
735/* CM_CLKSTCTRL_PER */
736#define OMAP3430_CLKTRCTRL_PER_SHIFT 0
737#define OMAP3430_CLKTRCTRL_PER_MASK (0x3 << 0) 186#define OMAP3430_CLKTRCTRL_PER_MASK (0x3 << 0)
738
739/* CM_CLKSTST_PER */
740#define OMAP3430_CLKACTIVITY_PER_SHIFT 0
741#define OMAP3430_CLKACTIVITY_PER_MASK (1 << 0)
742
743/* CM_CLKSEL1_EMU */
744#define OMAP3430_DIV_DPLL4_SHIFT 24 187#define OMAP3430_DIV_DPLL4_SHIFT 24
745#define OMAP3430_DIV_DPLL4_MASK (0x1f << 24)
746#define OMAP3430_DIV_DPLL4_WIDTH 5
747#define OMAP3630_DIV_DPLL4_MASK (0x3f << 24)
748#define OMAP3630_DIV_DPLL4_WIDTH 6 188#define OMAP3630_DIV_DPLL4_WIDTH 6
749#define OMAP3430_DIV_DPLL3_SHIFT 16 189#define OMAP3430_DIV_DPLL3_SHIFT 16
750#define OMAP3430_DIV_DPLL3_MASK (0x1f << 16)
751#define OMAP3430_DIV_DPLL3_WIDTH 5 190#define OMAP3430_DIV_DPLL3_WIDTH 5
752#define OMAP3430_CLKSEL_TRACECLK_SHIFT 11 191#define OMAP3430_CLKSEL_TRACECLK_SHIFT 11
753#define OMAP3430_CLKSEL_TRACECLK_MASK (0x7 << 11)
754#define OMAP3430_CLKSEL_TRACECLK_WIDTH 3 192#define OMAP3430_CLKSEL_TRACECLK_WIDTH 3
755#define OMAP3430_CLKSEL_PCLK_SHIFT 8 193#define OMAP3430_CLKSEL_PCLK_SHIFT 8
756#define OMAP3430_CLKSEL_PCLK_MASK (0x7 << 8)
757#define OMAP3430_CLKSEL_PCLK_WIDTH 3 194#define OMAP3430_CLKSEL_PCLK_WIDTH 3
758#define OMAP3430_CLKSEL_PCLKX2_SHIFT 6 195#define OMAP3430_CLKSEL_PCLKX2_SHIFT 6
759#define OMAP3430_CLKSEL_PCLKX2_MASK (0x3 << 6)
760#define OMAP3430_CLKSEL_PCLKX2_WIDTH 2 196#define OMAP3430_CLKSEL_PCLKX2_WIDTH 2
761#define OMAP3430_CLKSEL_ATCLK_SHIFT 4 197#define OMAP3430_CLKSEL_ATCLK_SHIFT 4
762#define OMAP3430_CLKSEL_ATCLK_MASK (0x3 << 4)
763#define OMAP3430_CLKSEL_ATCLK_WIDTH 2 198#define OMAP3430_CLKSEL_ATCLK_WIDTH 2
764#define OMAP3430_TRACE_MUX_CTRL_SHIFT 2 199#define OMAP3430_TRACE_MUX_CTRL_SHIFT 2
765#define OMAP3430_TRACE_MUX_CTRL_MASK (0x3 << 2)
766#define OMAP3430_TRACE_MUX_CTRL_WIDTH 2 200#define OMAP3430_TRACE_MUX_CTRL_WIDTH 2
767#define OMAP3430_MUX_CTRL_SHIFT 0
768#define OMAP3430_MUX_CTRL_MASK (0x3 << 0) 201#define OMAP3430_MUX_CTRL_MASK (0x3 << 0)
769#define OMAP3430_MUX_CTRL_WIDTH 2
770
771/* CM_CLKSTCTRL_EMU */
772#define OMAP3430_CLKTRCTRL_EMU_SHIFT 0
773#define OMAP3430_CLKTRCTRL_EMU_MASK (0x3 << 0) 202#define OMAP3430_CLKTRCTRL_EMU_MASK (0x3 << 0)
774
775/* CM_CLKSTST_EMU */
776#define OMAP3430_CLKACTIVITY_EMU_SHIFT 0
777#define OMAP3430_CLKACTIVITY_EMU_MASK (1 << 0)
778
779/* CM_CLKSEL2_EMU specific bits */
780#define OMAP3430_CORE_DPLL_EMU_MULT_SHIFT 8
781#define OMAP3430_CORE_DPLL_EMU_MULT_MASK (0x7ff << 8)
782#define OMAP3430_CORE_DPLL_EMU_DIV_SHIFT 0
783#define OMAP3430_CORE_DPLL_EMU_DIV_MASK (0x7f << 0)
784
785/* CM_CLKSEL3_EMU specific bits */
786#define OMAP3430_PERIPH_DPLL_EMU_MULT_SHIFT 8
787#define OMAP3430_PERIPH_DPLL_EMU_MULT_MASK (0x7ff << 8)
788#define OMAP3430_PERIPH_DPLL_EMU_DIV_SHIFT 0
789#define OMAP3430_PERIPH_DPLL_EMU_DIV_MASK (0x7f << 0)
790
791/* CM_POLCTRL */
792#define OMAP3430_CLKOUT2_POL_MASK (1 << 0)
793
794/* CM_IDLEST_NEON */
795#define OMAP3430_ST_NEON_MASK (1 << 0)
796
797/* CM_CLKSTCTRL_NEON */
798#define OMAP3430_CLKTRCTRL_NEON_SHIFT 0
799#define OMAP3430_CLKTRCTRL_NEON_MASK (0x3 << 0) 203#define OMAP3430_CLKTRCTRL_NEON_MASK (0x3 << 0)
800
801/* CM_FCLKEN_USBHOST */
802#define OMAP3430ES2_EN_USBHOST2_SHIFT 1 204#define OMAP3430ES2_EN_USBHOST2_SHIFT 1
803#define OMAP3430ES2_EN_USBHOST2_MASK (1 << 1)
804#define OMAP3430ES2_EN_USBHOST1_SHIFT 0 205#define OMAP3430ES2_EN_USBHOST1_SHIFT 0
805#define OMAP3430ES2_EN_USBHOST1_MASK (1 << 0)
806
807/* CM_ICLKEN_USBHOST */
808#define OMAP3430ES2_EN_USBHOST_SHIFT 0 206#define OMAP3430ES2_EN_USBHOST_SHIFT 0
809#define OMAP3430ES2_EN_USBHOST_MASK (1 << 0)
810
811/* CM_IDLEST_USBHOST */
812#define OMAP3430ES2_ST_USBHOST_IDLE_SHIFT 1 207#define OMAP3430ES2_ST_USBHOST_IDLE_SHIFT 1
813#define OMAP3430ES2_ST_USBHOST_IDLE_MASK (1 << 1)
814#define OMAP3430ES2_ST_USBHOST_STDBY_SHIFT 0 208#define OMAP3430ES2_ST_USBHOST_STDBY_SHIFT 0
815#define OMAP3430ES2_ST_USBHOST_STDBY_MASK (1 << 0)
816
817/* CM_AUTOIDLE_USBHOST */
818#define OMAP3430ES2_AUTO_USBHOST_SHIFT 0
819#define OMAP3430ES2_AUTO_USBHOST_MASK (1 << 0)
820
821/* CM_SLEEPDEP_USBHOST */
822#define OMAP3430ES2_EN_MPU_SHIFT 1
823#define OMAP3430ES2_EN_MPU_MASK (1 << 1)
824#define OMAP3430ES2_EN_IVA2_SHIFT 2
825#define OMAP3430ES2_EN_IVA2_MASK (1 << 2)
826
827/* CM_CLKSTCTRL_USBHOST */
828#define OMAP3430ES2_CLKTRCTRL_USBHOST_SHIFT 0
829#define OMAP3430ES2_CLKTRCTRL_USBHOST_MASK (3 << 0) 209#define OMAP3430ES2_CLKTRCTRL_USBHOST_MASK (3 << 0)
830
831/* CM_CLKSTST_USBHOST */
832#define OMAP3430ES2_CLKACTIVITY_USBHOST_SHIFT 0
833#define OMAP3430ES2_CLKACTIVITY_USBHOST_MASK (1 << 0)
834
835/*
836 *
837 */
838
839/* OMAP3XXX CM_CLKSTCTRL_*.CLKTRCTRL_* register bit values */
840#define OMAP34XX_CLKSTCTRL_DISABLE_AUTO 0x0 210#define OMAP34XX_CLKSTCTRL_DISABLE_AUTO 0x0
841#define OMAP34XX_CLKSTCTRL_FORCE_SLEEP 0x1 211#define OMAP34XX_CLKSTCTRL_FORCE_SLEEP 0x1
842#define OMAP34XX_CLKSTCTRL_FORCE_WAKEUP 0x2 212#define OMAP34XX_CLKSTCTRL_FORCE_WAKEUP 0x2
843#define OMAP34XX_CLKSTCTRL_ENABLE_AUTO 0x3 213#define OMAP34XX_CLKSTCTRL_ENABLE_AUTO 0x3
844
845
846#endif 214#endif
diff --git a/arch/arm/mach-omap2/cm-regbits-44xx.h b/arch/arm/mach-omap2/cm-regbits-44xx.h
index 4c6c2f7de65b..4dbbd99b6e1e 100644
--- a/arch/arm/mach-omap2/cm-regbits-44xx.h
+++ b/arch/arm/mach-omap2/cm-regbits-44xx.h
@@ -22,1683 +22,125 @@
22#ifndef __ARCH_ARM_MACH_OMAP2_CM_REGBITS_44XX_H 22#ifndef __ARCH_ARM_MACH_OMAP2_CM_REGBITS_44XX_H
23#define __ARCH_ARM_MACH_OMAP2_CM_REGBITS_44XX_H 23#define __ARCH_ARM_MACH_OMAP2_CM_REGBITS_44XX_H
24 24
25/* Used by CM_L3_1_DYNAMICDEP, CM_MPU_DYNAMICDEP, CM_TESLA_DYNAMICDEP */
26#define OMAP4430_ABE_DYNDEP_SHIFT 3
27#define OMAP4430_ABE_DYNDEP_WIDTH 0x1
28#define OMAP4430_ABE_DYNDEP_MASK (1 << 3)
29
30/*
31 * Used by CM_D2D_STATICDEP, CM_DUCATI_STATICDEP, CM_L3INIT_STATICDEP,
32 * CM_MPU_STATICDEP, CM_SDMA_STATICDEP, CM_TESLA_STATICDEP
33 */
34#define OMAP4430_ABE_STATDEP_SHIFT 3 25#define OMAP4430_ABE_STATDEP_SHIFT 3
35#define OMAP4430_ABE_STATDEP_WIDTH 0x1
36#define OMAP4430_ABE_STATDEP_MASK (1 << 3)
37
38/* Used by CM_L4CFG_DYNAMICDEP */
39#define OMAP4430_ALWONCORE_DYNDEP_SHIFT 16
40#define OMAP4430_ALWONCORE_DYNDEP_WIDTH 0x1
41#define OMAP4430_ALWONCORE_DYNDEP_MASK (1 << 16)
42
43/* Used by CM_DUCATI_STATICDEP, CM_MPU_STATICDEP, CM_TESLA_STATICDEP */
44#define OMAP4430_ALWONCORE_STATDEP_SHIFT 16
45#define OMAP4430_ALWONCORE_STATDEP_WIDTH 0x1
46#define OMAP4430_ALWONCORE_STATDEP_MASK (1 << 16)
47
48/*
49 * Used by CM_AUTOIDLE_DPLL_ABE, CM_AUTOIDLE_DPLL_CORE,
50 * CM_AUTOIDLE_DPLL_DDRPHY, CM_AUTOIDLE_DPLL_IVA, CM_AUTOIDLE_DPLL_MPU,
51 * CM_AUTOIDLE_DPLL_PER, CM_AUTOIDLE_DPLL_UNIPRO, CM_AUTOIDLE_DPLL_USB
52 */
53#define OMAP4430_AUTO_DPLL_MODE_SHIFT 0
54#define OMAP4430_AUTO_DPLL_MODE_WIDTH 0x3
55#define OMAP4430_AUTO_DPLL_MODE_MASK (0x7 << 0) 26#define OMAP4430_AUTO_DPLL_MODE_MASK (0x7 << 0)
56
57/* Used by CM_L4CFG_DYNAMICDEP */
58#define OMAP4430_CEFUSE_DYNDEP_SHIFT 17
59#define OMAP4430_CEFUSE_DYNDEP_WIDTH 0x1
60#define OMAP4430_CEFUSE_DYNDEP_MASK (1 << 17)
61
62/* Used by CM_DUCATI_STATICDEP, CM_MPU_STATICDEP, CM_TESLA_STATICDEP */
63#define OMAP4430_CEFUSE_STATDEP_SHIFT 17
64#define OMAP4430_CEFUSE_STATDEP_WIDTH 0x1
65#define OMAP4430_CEFUSE_STATDEP_MASK (1 << 17)
66
67/* Used by CM1_ABE_CLKSTCTRL */
68#define OMAP4430_CLKACTIVITY_ABE_24M_GFCLK_SHIFT 13
69#define OMAP4430_CLKACTIVITY_ABE_24M_GFCLK_WIDTH 0x1
70#define OMAP4430_CLKACTIVITY_ABE_24M_GFCLK_MASK (1 << 13)
71
72/* Used by CM1_ABE_CLKSTCTRL */
73#define OMAP4430_CLKACTIVITY_ABE_ALWON_32K_CLK_SHIFT 12
74#define OMAP4430_CLKACTIVITY_ABE_ALWON_32K_CLK_WIDTH 0x1
75#define OMAP4430_CLKACTIVITY_ABE_ALWON_32K_CLK_MASK (1 << 12)
76
77/* Used by CM_WKUP_CLKSTCTRL */
78#define OMAP4430_CLKACTIVITY_ABE_LP_CLK_SHIFT 9
79#define OMAP4430_CLKACTIVITY_ABE_LP_CLK_WIDTH 0x1
80#define OMAP4430_CLKACTIVITY_ABE_LP_CLK_MASK (1 << 9)
81
82/* Used by CM1_ABE_CLKSTCTRL */
83#define OMAP4430_CLKACTIVITY_ABE_SYSCLK_SHIFT 11
84#define OMAP4430_CLKACTIVITY_ABE_SYSCLK_WIDTH 0x1
85#define OMAP4430_CLKACTIVITY_ABE_SYSCLK_MASK (1 << 11)
86
87/* Used by CM1_ABE_CLKSTCTRL */
88#define OMAP4430_CLKACTIVITY_ABE_X2_CLK_SHIFT 8
89#define OMAP4430_CLKACTIVITY_ABE_X2_CLK_WIDTH 0x1
90#define OMAP4430_CLKACTIVITY_ABE_X2_CLK_MASK (1 << 8)
91
92/* Used by CM_MEMIF_CLKSTCTRL */
93#define OMAP4430_CLKACTIVITY_ASYNC_DLL_CLK_SHIFT 11
94#define OMAP4430_CLKACTIVITY_ASYNC_DLL_CLK_WIDTH 0x1
95#define OMAP4430_CLKACTIVITY_ASYNC_DLL_CLK_MASK (1 << 11)
96
97/* Used by CM_MEMIF_CLKSTCTRL */
98#define OMAP4430_CLKACTIVITY_ASYNC_PHY1_CLK_SHIFT 12
99#define OMAP4430_CLKACTIVITY_ASYNC_PHY1_CLK_WIDTH 0x1
100#define OMAP4430_CLKACTIVITY_ASYNC_PHY1_CLK_MASK (1 << 12)
101
102/* Used by CM_MEMIF_CLKSTCTRL */
103#define OMAP4430_CLKACTIVITY_ASYNC_PHY2_CLK_SHIFT 13
104#define OMAP4430_CLKACTIVITY_ASYNC_PHY2_CLK_WIDTH 0x1
105#define OMAP4430_CLKACTIVITY_ASYNC_PHY2_CLK_MASK (1 << 13)
106
107/* Used by CM_CAM_CLKSTCTRL */
108#define OMAP4430_CLKACTIVITY_CAM_PHY_CTRL_GCLK_SHIFT 9
109#define OMAP4430_CLKACTIVITY_CAM_PHY_CTRL_GCLK_WIDTH 0x1
110#define OMAP4430_CLKACTIVITY_CAM_PHY_CTRL_GCLK_MASK (1 << 9)
111
112/* Used by CM_ALWON_CLKSTCTRL */
113#define OMAP4430_CLKACTIVITY_CORE_ALWON_32K_GFCLK_SHIFT 12
114#define OMAP4430_CLKACTIVITY_CORE_ALWON_32K_GFCLK_WIDTH 0x1
115#define OMAP4430_CLKACTIVITY_CORE_ALWON_32K_GFCLK_MASK (1 << 12)
116
117/* Used by CM_EMU_CLKSTCTRL */
118#define OMAP4430_CLKACTIVITY_CORE_DPLL_EMU_CLK_SHIFT 9
119#define OMAP4430_CLKACTIVITY_CORE_DPLL_EMU_CLK_WIDTH 0x1
120#define OMAP4430_CLKACTIVITY_CORE_DPLL_EMU_CLK_MASK (1 << 9)
121
122/* Used by CM_L4CFG_CLKSTCTRL */
123#define OMAP4460_CLKACTIVITY_CORE_TS_GFCLK_SHIFT 9
124#define OMAP4460_CLKACTIVITY_CORE_TS_GFCLK_WIDTH 0x1
125#define OMAP4460_CLKACTIVITY_CORE_TS_GFCLK_MASK (1 << 9)
126
127/* Used by CM_CEFUSE_CLKSTCTRL */
128#define OMAP4430_CLKACTIVITY_CUST_EFUSE_SYS_CLK_SHIFT 9
129#define OMAP4430_CLKACTIVITY_CUST_EFUSE_SYS_CLK_WIDTH 0x1
130#define OMAP4430_CLKACTIVITY_CUST_EFUSE_SYS_CLK_MASK (1 << 9)
131
132/* Used by CM_MEMIF_CLKSTCTRL */
133#define OMAP4430_CLKACTIVITY_DLL_CLK_SHIFT 9
134#define OMAP4430_CLKACTIVITY_DLL_CLK_WIDTH 0x1
135#define OMAP4430_CLKACTIVITY_DLL_CLK_MASK (1 << 9)
136
137/* Used by CM_L4PER_CLKSTCTRL */
138#define OMAP4430_CLKACTIVITY_DMT10_GFCLK_SHIFT 9
139#define OMAP4430_CLKACTIVITY_DMT10_GFCLK_WIDTH 0x1
140#define OMAP4430_CLKACTIVITY_DMT10_GFCLK_MASK (1 << 9)
141
142/* Used by CM_L4PER_CLKSTCTRL */
143#define OMAP4430_CLKACTIVITY_DMT11_GFCLK_SHIFT 10
144#define OMAP4430_CLKACTIVITY_DMT11_GFCLK_WIDTH 0x1
145#define OMAP4430_CLKACTIVITY_DMT11_GFCLK_MASK (1 << 10)
146
147/* Used by CM_L4PER_CLKSTCTRL */
148#define OMAP4430_CLKACTIVITY_DMT2_GFCLK_SHIFT 11
149#define OMAP4430_CLKACTIVITY_DMT2_GFCLK_WIDTH 0x1
150#define OMAP4430_CLKACTIVITY_DMT2_GFCLK_MASK (1 << 11)
151
152/* Used by CM_L4PER_CLKSTCTRL */
153#define OMAP4430_CLKACTIVITY_DMT3_GFCLK_SHIFT 12
154#define OMAP4430_CLKACTIVITY_DMT3_GFCLK_WIDTH 0x1
155#define OMAP4430_CLKACTIVITY_DMT3_GFCLK_MASK (1 << 12)
156
157/* Used by CM_L4PER_CLKSTCTRL */
158#define OMAP4430_CLKACTIVITY_DMT4_GFCLK_SHIFT 13
159#define OMAP4430_CLKACTIVITY_DMT4_GFCLK_WIDTH 0x1
160#define OMAP4430_CLKACTIVITY_DMT4_GFCLK_MASK (1 << 13)
161
162/* Used by CM_L4PER_CLKSTCTRL */
163#define OMAP4430_CLKACTIVITY_DMT9_GFCLK_SHIFT 14
164#define OMAP4430_CLKACTIVITY_DMT9_GFCLK_WIDTH 0x1
165#define OMAP4430_CLKACTIVITY_DMT9_GFCLK_MASK (1 << 14)
166
167/* Used by CM_DSS_CLKSTCTRL */
168#define OMAP4430_CLKACTIVITY_DSS_ALWON_SYS_CLK_SHIFT 10
169#define OMAP4430_CLKACTIVITY_DSS_ALWON_SYS_CLK_WIDTH 0x1
170#define OMAP4430_CLKACTIVITY_DSS_ALWON_SYS_CLK_MASK (1 << 10)
171
172/* Used by CM_DSS_CLKSTCTRL */
173#define OMAP4430_CLKACTIVITY_DSS_FCLK_SHIFT 9
174#define OMAP4430_CLKACTIVITY_DSS_FCLK_WIDTH 0x1
175#define OMAP4430_CLKACTIVITY_DSS_FCLK_MASK (1 << 9)
176
177/* Used by CM_DUCATI_CLKSTCTRL */
178#define OMAP4430_CLKACTIVITY_DUCATI_GCLK_SHIFT 8
179#define OMAP4430_CLKACTIVITY_DUCATI_GCLK_WIDTH 0x1
180#define OMAP4430_CLKACTIVITY_DUCATI_GCLK_MASK (1 << 8)
181
182/* Used by CM_EMU_CLKSTCTRL */
183#define OMAP4430_CLKACTIVITY_EMU_SYS_CLK_SHIFT 8
184#define OMAP4430_CLKACTIVITY_EMU_SYS_CLK_WIDTH 0x1
185#define OMAP4430_CLKACTIVITY_EMU_SYS_CLK_MASK (1 << 8)
186
187/* Used by CM_CAM_CLKSTCTRL */
188#define OMAP4430_CLKACTIVITY_FDIF_GFCLK_SHIFT 10
189#define OMAP4430_CLKACTIVITY_FDIF_GFCLK_WIDTH 0x1
190#define OMAP4430_CLKACTIVITY_FDIF_GFCLK_MASK (1 << 10)
191
192/* Used by CM_L4PER_CLKSTCTRL */
193#define OMAP4430_CLKACTIVITY_FUNC_12M_GFCLK_SHIFT 15
194#define OMAP4430_CLKACTIVITY_FUNC_12M_GFCLK_WIDTH 0x1
195#define OMAP4430_CLKACTIVITY_FUNC_12M_GFCLK_MASK (1 << 15)
196
197/* Used by CM1_ABE_CLKSTCTRL */
198#define OMAP4430_CLKACTIVITY_FUNC_24M_GFCLK_SHIFT 10
199#define OMAP4430_CLKACTIVITY_FUNC_24M_GFCLK_WIDTH 0x1
200#define OMAP4430_CLKACTIVITY_FUNC_24M_GFCLK_MASK (1 << 10)
201
202/* Used by CM_DSS_CLKSTCTRL */
203#define OMAP4430_CLKACTIVITY_HDMI_PHY_48MHZ_GFCLK_SHIFT 11
204#define OMAP4430_CLKACTIVITY_HDMI_PHY_48MHZ_GFCLK_WIDTH 0x1
205#define OMAP4430_CLKACTIVITY_HDMI_PHY_48MHZ_GFCLK_MASK (1 << 11)
206
207/* Used by CM_L3INIT_CLKSTCTRL */
208#define OMAP4430_CLKACTIVITY_HSIC_P1_480M_GFCLK_SHIFT 20
209#define OMAP4430_CLKACTIVITY_HSIC_P1_480M_GFCLK_WIDTH 0x1
210#define OMAP4430_CLKACTIVITY_HSIC_P1_480M_GFCLK_MASK (1 << 20)
211
212/* Used by CM_L3INIT_CLKSTCTRL */
213#define OMAP4430_CLKACTIVITY_HSIC_P1_GFCLK_SHIFT 26
214#define OMAP4430_CLKACTIVITY_HSIC_P1_GFCLK_WIDTH 0x1
215#define OMAP4430_CLKACTIVITY_HSIC_P1_GFCLK_MASK (1 << 26)
216
217/* Used by CM_L3INIT_CLKSTCTRL */
218#define OMAP4430_CLKACTIVITY_HSIC_P2_480M_GFCLK_SHIFT 21
219#define OMAP4430_CLKACTIVITY_HSIC_P2_480M_GFCLK_WIDTH 0x1
220#define OMAP4430_CLKACTIVITY_HSIC_P2_480M_GFCLK_MASK (1 << 21)
221
222/* Used by CM_L3INIT_CLKSTCTRL */
223#define OMAP4430_CLKACTIVITY_HSIC_P2_GFCLK_SHIFT 27
224#define OMAP4430_CLKACTIVITY_HSIC_P2_GFCLK_WIDTH 0x1
225#define OMAP4430_CLKACTIVITY_HSIC_P2_GFCLK_MASK (1 << 27)
226
227/* Used by CM_L3INIT_CLKSTCTRL */
228#define OMAP4430_CLKACTIVITY_INIT_48MC_GFCLK_SHIFT 13
229#define OMAP4430_CLKACTIVITY_INIT_48MC_GFCLK_WIDTH 0x1
230#define OMAP4430_CLKACTIVITY_INIT_48MC_GFCLK_MASK (1 << 13)
231
232/* Used by CM_L3INIT_CLKSTCTRL */
233#define OMAP4430_CLKACTIVITY_INIT_48M_GFCLK_SHIFT 12
234#define OMAP4430_CLKACTIVITY_INIT_48M_GFCLK_WIDTH 0x1
235#define OMAP4430_CLKACTIVITY_INIT_48M_GFCLK_MASK (1 << 12)
236
237/* Used by CM_L3INIT_CLKSTCTRL */
238#define OMAP4430_CLKACTIVITY_INIT_60M_P1_GFCLK_SHIFT 28
239#define OMAP4430_CLKACTIVITY_INIT_60M_P1_GFCLK_WIDTH 0x1
240#define OMAP4430_CLKACTIVITY_INIT_60M_P1_GFCLK_MASK (1 << 28)
241
242/* Used by CM_L3INIT_CLKSTCTRL */
243#define OMAP4430_CLKACTIVITY_INIT_60M_P2_GFCLK_SHIFT 29
244#define OMAP4430_CLKACTIVITY_INIT_60M_P2_GFCLK_WIDTH 0x1
245#define OMAP4430_CLKACTIVITY_INIT_60M_P2_GFCLK_MASK (1 << 29)
246
247/* Used by CM_L3INIT_CLKSTCTRL */
248#define OMAP4430_CLKACTIVITY_INIT_96M_GFCLK_SHIFT 11
249#define OMAP4430_CLKACTIVITY_INIT_96M_GFCLK_WIDTH 0x1
250#define OMAP4430_CLKACTIVITY_INIT_96M_GFCLK_MASK (1 << 11)
251
252/* Used by CM_L3INIT_CLKSTCTRL */
253#define OMAP4430_CLKACTIVITY_INIT_HSI_GFCLK_SHIFT 16
254#define OMAP4430_CLKACTIVITY_INIT_HSI_GFCLK_WIDTH 0x1
255#define OMAP4430_CLKACTIVITY_INIT_HSI_GFCLK_MASK (1 << 16)
256
257/* Used by CM_L3INIT_CLKSTCTRL */
258#define OMAP4430_CLKACTIVITY_INIT_HSMMC1_GFCLK_SHIFT 17
259#define OMAP4430_CLKACTIVITY_INIT_HSMMC1_GFCLK_WIDTH 0x1
260#define OMAP4430_CLKACTIVITY_INIT_HSMMC1_GFCLK_MASK (1 << 17)
261
262/* Used by CM_L3INIT_CLKSTCTRL */
263#define OMAP4430_CLKACTIVITY_INIT_HSMMC2_GFCLK_SHIFT 18
264#define OMAP4430_CLKACTIVITY_INIT_HSMMC2_GFCLK_WIDTH 0x1
265#define OMAP4430_CLKACTIVITY_INIT_HSMMC2_GFCLK_MASK (1 << 18)
266
267/* Used by CM_L3INIT_CLKSTCTRL */
268#define OMAP4430_CLKACTIVITY_INIT_HSMMC6_GFCLK_SHIFT 19
269#define OMAP4430_CLKACTIVITY_INIT_HSMMC6_GFCLK_WIDTH 0x1
270#define OMAP4430_CLKACTIVITY_INIT_HSMMC6_GFCLK_MASK (1 << 19)
271
272/* Used by CM_CAM_CLKSTCTRL */
273#define OMAP4430_CLKACTIVITY_ISS_GCLK_SHIFT 8
274#define OMAP4430_CLKACTIVITY_ISS_GCLK_WIDTH 0x1
275#define OMAP4430_CLKACTIVITY_ISS_GCLK_MASK (1 << 8)
276
277/* Used by CM_IVAHD_CLKSTCTRL */
278#define OMAP4430_CLKACTIVITY_IVAHD_ROOT_CLK_SHIFT 8
279#define OMAP4430_CLKACTIVITY_IVAHD_ROOT_CLK_WIDTH 0x1
280#define OMAP4430_CLKACTIVITY_IVAHD_ROOT_CLK_MASK (1 << 8)
281
282/* Used by CM_D2D_CLKSTCTRL */
283#define OMAP4430_CLKACTIVITY_L3X2_D2D_GICLK_SHIFT 10
284#define OMAP4430_CLKACTIVITY_L3X2_D2D_GICLK_WIDTH 0x1
285#define OMAP4430_CLKACTIVITY_L3X2_D2D_GICLK_MASK (1 << 10)
286
287/* Used by CM_L3_1_CLKSTCTRL */
288#define OMAP4430_CLKACTIVITY_L3_1_GICLK_SHIFT 8
289#define OMAP4430_CLKACTIVITY_L3_1_GICLK_WIDTH 0x1
290#define OMAP4430_CLKACTIVITY_L3_1_GICLK_MASK (1 << 8)
291
292/* Used by CM_L3_2_CLKSTCTRL */
293#define OMAP4430_CLKACTIVITY_L3_2_GICLK_SHIFT 8
294#define OMAP4430_CLKACTIVITY_L3_2_GICLK_WIDTH 0x1
295#define OMAP4430_CLKACTIVITY_L3_2_GICLK_MASK (1 << 8)
296
297/* Used by CM_D2D_CLKSTCTRL */
298#define OMAP4430_CLKACTIVITY_L3_D2D_GICLK_SHIFT 8
299#define OMAP4430_CLKACTIVITY_L3_D2D_GICLK_WIDTH 0x1
300#define OMAP4430_CLKACTIVITY_L3_D2D_GICLK_MASK (1 << 8)
301
302/* Used by CM_SDMA_CLKSTCTRL */
303#define OMAP4430_CLKACTIVITY_L3_DMA_GICLK_SHIFT 8
304#define OMAP4430_CLKACTIVITY_L3_DMA_GICLK_WIDTH 0x1
305#define OMAP4430_CLKACTIVITY_L3_DMA_GICLK_MASK (1 << 8)
306
307/* Used by CM_DSS_CLKSTCTRL */
308#define OMAP4430_CLKACTIVITY_L3_DSS_GICLK_SHIFT 8
309#define OMAP4430_CLKACTIVITY_L3_DSS_GICLK_WIDTH 0x1
310#define OMAP4430_CLKACTIVITY_L3_DSS_GICLK_MASK (1 << 8)
311
312/* Used by CM_MEMIF_CLKSTCTRL */
313#define OMAP4430_CLKACTIVITY_L3_EMIF_GICLK_SHIFT 8
314#define OMAP4430_CLKACTIVITY_L3_EMIF_GICLK_WIDTH 0x1
315#define OMAP4430_CLKACTIVITY_L3_EMIF_GICLK_MASK (1 << 8)
316
317/* Used by CM_GFX_CLKSTCTRL */
318#define OMAP4430_CLKACTIVITY_L3_GFX_GICLK_SHIFT 8
319#define OMAP4430_CLKACTIVITY_L3_GFX_GICLK_WIDTH 0x1
320#define OMAP4430_CLKACTIVITY_L3_GFX_GICLK_MASK (1 << 8)
321
322/* Used by CM_L3INIT_CLKSTCTRL */
323#define OMAP4430_CLKACTIVITY_L3_INIT_GICLK_SHIFT 8
324#define OMAP4430_CLKACTIVITY_L3_INIT_GICLK_WIDTH 0x1
325#define OMAP4430_CLKACTIVITY_L3_INIT_GICLK_MASK (1 << 8)
326
327/* Used by CM_L3INSTR_CLKSTCTRL */
328#define OMAP4430_CLKACTIVITY_L3_INSTR_GICLK_SHIFT 8
329#define OMAP4430_CLKACTIVITY_L3_INSTR_GICLK_WIDTH 0x1
330#define OMAP4430_CLKACTIVITY_L3_INSTR_GICLK_MASK (1 << 8)
331
332/* Used by CM_L4SEC_CLKSTCTRL */
333#define OMAP4430_CLKACTIVITY_L3_SECURE_GICLK_SHIFT 8
334#define OMAP4430_CLKACTIVITY_L3_SECURE_GICLK_WIDTH 0x1
335#define OMAP4430_CLKACTIVITY_L3_SECURE_GICLK_MASK (1 << 8)
336
337/* Used by CM_ALWON_CLKSTCTRL */
338#define OMAP4430_CLKACTIVITY_L4_AO_ICLK_SHIFT 8
339#define OMAP4430_CLKACTIVITY_L4_AO_ICLK_WIDTH 0x1
340#define OMAP4430_CLKACTIVITY_L4_AO_ICLK_MASK (1 << 8)
341
342/* Used by CM_CEFUSE_CLKSTCTRL */
343#define OMAP4430_CLKACTIVITY_L4_CEFUSE_GICLK_SHIFT 8
344#define OMAP4430_CLKACTIVITY_L4_CEFUSE_GICLK_WIDTH 0x1
345#define OMAP4430_CLKACTIVITY_L4_CEFUSE_GICLK_MASK (1 << 8)
346
347/* Used by CM_L4CFG_CLKSTCTRL */
348#define OMAP4430_CLKACTIVITY_L4_CFG_GICLK_SHIFT 8
349#define OMAP4430_CLKACTIVITY_L4_CFG_GICLK_WIDTH 0x1
350#define OMAP4430_CLKACTIVITY_L4_CFG_GICLK_MASK (1 << 8)
351
352/* Used by CM_D2D_CLKSTCTRL */
353#define OMAP4430_CLKACTIVITY_L4_D2D_GICLK_SHIFT 9
354#define OMAP4430_CLKACTIVITY_L4_D2D_GICLK_WIDTH 0x1
355#define OMAP4430_CLKACTIVITY_L4_D2D_GICLK_MASK (1 << 9)
356
357/* Used by CM_L3INIT_CLKSTCTRL */
358#define OMAP4430_CLKACTIVITY_L4_INIT_GICLK_SHIFT 9
359#define OMAP4430_CLKACTIVITY_L4_INIT_GICLK_WIDTH 0x1
360#define OMAP4430_CLKACTIVITY_L4_INIT_GICLK_MASK (1 << 9)
361
362/* Used by CM_L4PER_CLKSTCTRL */
363#define OMAP4430_CLKACTIVITY_L4_PER_GICLK_SHIFT 8
364#define OMAP4430_CLKACTIVITY_L4_PER_GICLK_WIDTH 0x1
365#define OMAP4430_CLKACTIVITY_L4_PER_GICLK_MASK (1 << 8)
366
367/* Used by CM_L4SEC_CLKSTCTRL */
368#define OMAP4430_CLKACTIVITY_L4_SECURE_GICLK_SHIFT 9
369#define OMAP4430_CLKACTIVITY_L4_SECURE_GICLK_WIDTH 0x1
370#define OMAP4430_CLKACTIVITY_L4_SECURE_GICLK_MASK (1 << 9)
371
372/* Used by CM_WKUP_CLKSTCTRL */
373#define OMAP4430_CLKACTIVITY_L4_WKUP_GICLK_SHIFT 12
374#define OMAP4430_CLKACTIVITY_L4_WKUP_GICLK_WIDTH 0x1
375#define OMAP4430_CLKACTIVITY_L4_WKUP_GICLK_MASK (1 << 12)
376
377/* Used by CM_MPU_CLKSTCTRL */
378#define OMAP4430_CLKACTIVITY_MPU_DPLL_CLK_SHIFT 8
379#define OMAP4430_CLKACTIVITY_MPU_DPLL_CLK_WIDTH 0x1
380#define OMAP4430_CLKACTIVITY_MPU_DPLL_CLK_MASK (1 << 8)
381
382/* Used by CM1_ABE_CLKSTCTRL */
383#define OMAP4430_CLKACTIVITY_OCP_ABE_GICLK_SHIFT 9
384#define OMAP4430_CLKACTIVITY_OCP_ABE_GICLK_WIDTH 0x1
385#define OMAP4430_CLKACTIVITY_OCP_ABE_GICLK_MASK (1 << 9)
386
387/* Used by CM_L4PER_CLKSTCTRL */
388#define OMAP4430_CLKACTIVITY_PER_24MC_GFCLK_SHIFT 16
389#define OMAP4430_CLKACTIVITY_PER_24MC_GFCLK_WIDTH 0x1
390#define OMAP4430_CLKACTIVITY_PER_24MC_GFCLK_MASK (1 << 16)
391
392/* Used by CM_L4PER_CLKSTCTRL */
393#define OMAP4430_CLKACTIVITY_PER_32K_GFCLK_SHIFT 17
394#define OMAP4430_CLKACTIVITY_PER_32K_GFCLK_WIDTH 0x1
395#define OMAP4430_CLKACTIVITY_PER_32K_GFCLK_MASK (1 << 17)
396
397/* Used by CM_L4PER_CLKSTCTRL */
398#define OMAP4430_CLKACTIVITY_PER_48M_GFCLK_SHIFT 18
399#define OMAP4430_CLKACTIVITY_PER_48M_GFCLK_WIDTH 0x1
400#define OMAP4430_CLKACTIVITY_PER_48M_GFCLK_MASK (1 << 18)
401
402/* Used by CM_L4PER_CLKSTCTRL */
403#define OMAP4430_CLKACTIVITY_PER_96M_GFCLK_SHIFT 19
404#define OMAP4430_CLKACTIVITY_PER_96M_GFCLK_WIDTH 0x1
405#define OMAP4430_CLKACTIVITY_PER_96M_GFCLK_MASK (1 << 19)
406
407/* Used by CM_L4PER_CLKSTCTRL */
408#define OMAP4430_CLKACTIVITY_PER_ABE_24M_GFCLK_SHIFT 25
409#define OMAP4430_CLKACTIVITY_PER_ABE_24M_GFCLK_WIDTH 0x1
410#define OMAP4430_CLKACTIVITY_PER_ABE_24M_GFCLK_MASK (1 << 25)
411
412/* Used by CM_L4PER_CLKSTCTRL */
413#define OMAP4430_CLKACTIVITY_PER_MCASP2_GFCLK_SHIFT 20
414#define OMAP4430_CLKACTIVITY_PER_MCASP2_GFCLK_WIDTH 0x1
415#define OMAP4430_CLKACTIVITY_PER_MCASP2_GFCLK_MASK (1 << 20)
416
417/* Used by CM_L4PER_CLKSTCTRL */
418#define OMAP4430_CLKACTIVITY_PER_MCASP3_GFCLK_SHIFT 21
419#define OMAP4430_CLKACTIVITY_PER_MCASP3_GFCLK_MASK (1 << 21)
420
421/* Used by CM_L4PER_CLKSTCTRL */
422#define OMAP4430_CLKACTIVITY_PER_MCBSP4_GFCLK_SHIFT 22
423#define OMAP4430_CLKACTIVITY_PER_MCBSP4_GFCLK_WIDTH 0x1
424#define OMAP4430_CLKACTIVITY_PER_MCBSP4_GFCLK_MASK (1 << 22)
425
426/* Used by CM_L4PER_CLKSTCTRL */
427#define OMAP4430_CLKACTIVITY_PER_SYS_GFCLK_SHIFT 24
428#define OMAP4430_CLKACTIVITY_PER_SYS_GFCLK_WIDTH 0x1
429#define OMAP4430_CLKACTIVITY_PER_SYS_GFCLK_MASK (1 << 24)
430
431/* Used by CM_MEMIF_CLKSTCTRL */
432#define OMAP4430_CLKACTIVITY_PHY_ROOT_CLK_SHIFT 10
433#define OMAP4430_CLKACTIVITY_PHY_ROOT_CLK_WIDTH 0x1
434#define OMAP4430_CLKACTIVITY_PHY_ROOT_CLK_MASK (1 << 10)
435
436/* Used by CM_GFX_CLKSTCTRL */
437#define OMAP4430_CLKACTIVITY_SGX_GFCLK_SHIFT 9
438#define OMAP4430_CLKACTIVITY_SGX_GFCLK_WIDTH 0x1
439#define OMAP4430_CLKACTIVITY_SGX_GFCLK_MASK (1 << 9)
440
441/* Used by CM_ALWON_CLKSTCTRL */
442#define OMAP4430_CLKACTIVITY_SR_CORE_SYSCLK_SHIFT 11
443#define OMAP4430_CLKACTIVITY_SR_CORE_SYSCLK_WIDTH 0x1
444#define OMAP4430_CLKACTIVITY_SR_CORE_SYSCLK_MASK (1 << 11)
445
446/* Used by CM_ALWON_CLKSTCTRL */
447#define OMAP4430_CLKACTIVITY_SR_IVA_SYSCLK_SHIFT 10
448#define OMAP4430_CLKACTIVITY_SR_IVA_SYSCLK_WIDTH 0x1
449#define OMAP4430_CLKACTIVITY_SR_IVA_SYSCLK_MASK (1 << 10)
450
451/* Used by CM_ALWON_CLKSTCTRL */
452#define OMAP4430_CLKACTIVITY_SR_MPU_SYSCLK_SHIFT 9
453#define OMAP4430_CLKACTIVITY_SR_MPU_SYSCLK_WIDTH 0x1
454#define OMAP4430_CLKACTIVITY_SR_MPU_SYSCLK_MASK (1 << 9)
455
456/* Used by CM_WKUP_CLKSTCTRL */
457#define OMAP4430_CLKACTIVITY_SYS_CLK_SHIFT 8
458#define OMAP4430_CLKACTIVITY_SYS_CLK_WIDTH 0x1
459#define OMAP4430_CLKACTIVITY_SYS_CLK_MASK (1 << 8)
460
461/* Used by CM_TESLA_CLKSTCTRL */
462#define OMAP4430_CLKACTIVITY_TESLA_ROOT_CLK_SHIFT 8
463#define OMAP4430_CLKACTIVITY_TESLA_ROOT_CLK_WIDTH 0x1
464#define OMAP4430_CLKACTIVITY_TESLA_ROOT_CLK_MASK (1 << 8)
465
466/* Used by CM_L3INIT_CLKSTCTRL */
467#define OMAP4430_CLKACTIVITY_TLL_CH0_GFCLK_SHIFT 22
468#define OMAP4430_CLKACTIVITY_TLL_CH0_GFCLK_WIDTH 0x1
469#define OMAP4430_CLKACTIVITY_TLL_CH0_GFCLK_MASK (1 << 22)
470
471/* Used by CM_L3INIT_CLKSTCTRL */
472#define OMAP4430_CLKACTIVITY_TLL_CH1_GFCLK_SHIFT 23
473#define OMAP4430_CLKACTIVITY_TLL_CH1_GFCLK_WIDTH 0x1
474#define OMAP4430_CLKACTIVITY_TLL_CH1_GFCLK_MASK (1 << 23)
475
476/* Used by CM_L3INIT_CLKSTCTRL */
477#define OMAP4430_CLKACTIVITY_TLL_CH2_GFCLK_SHIFT 24
478#define OMAP4430_CLKACTIVITY_TLL_CH2_GFCLK_WIDTH 0x1
479#define OMAP4430_CLKACTIVITY_TLL_CH2_GFCLK_MASK (1 << 24)
480
481/* Used by CM_L3INIT_CLKSTCTRL */
482#define OMAP4430_CLKACTIVITY_UNIPRO_DPLL_CLK_SHIFT 10
483#define OMAP4430_CLKACTIVITY_UNIPRO_DPLL_CLK_WIDTH 0x1
484#define OMAP4430_CLKACTIVITY_UNIPRO_DPLL_CLK_MASK (1 << 10)
485
486/* Used by CM_L3INIT_CLKSTCTRL */
487#define OMAP4430_CLKACTIVITY_USB_DPLL_CLK_SHIFT 14
488#define OMAP4430_CLKACTIVITY_USB_DPLL_CLK_WIDTH 0x1
489#define OMAP4430_CLKACTIVITY_USB_DPLL_CLK_MASK (1 << 14)
490
491/* Used by CM_L3INIT_CLKSTCTRL */
492#define OMAP4430_CLKACTIVITY_USB_DPLL_HS_CLK_SHIFT 15
493#define OMAP4430_CLKACTIVITY_USB_DPLL_HS_CLK_WIDTH 0x1
494#define OMAP4430_CLKACTIVITY_USB_DPLL_HS_CLK_MASK (1 << 15)
495
496/* Used by CM_WKUP_CLKSTCTRL */
497#define OMAP4430_CLKACTIVITY_USIM_GFCLK_SHIFT 10
498#define OMAP4430_CLKACTIVITY_USIM_GFCLK_WIDTH 0x1
499#define OMAP4430_CLKACTIVITY_USIM_GFCLK_MASK (1 << 10)
500
501/* Used by CM_L3INIT_CLKSTCTRL */
502#define OMAP4430_CLKACTIVITY_UTMI_P3_GFCLK_SHIFT 30
503#define OMAP4430_CLKACTIVITY_UTMI_P3_GFCLK_WIDTH 0x1
504#define OMAP4430_CLKACTIVITY_UTMI_P3_GFCLK_MASK (1 << 30)
505
506/* Used by CM_L3INIT_CLKSTCTRL */
507#define OMAP4430_CLKACTIVITY_UTMI_ROOT_GFCLK_SHIFT 25
508#define OMAP4430_CLKACTIVITY_UTMI_ROOT_GFCLK_WIDTH 0x1
509#define OMAP4430_CLKACTIVITY_UTMI_ROOT_GFCLK_MASK (1 << 25)
510
511/* Used by CM_WKUP_CLKSTCTRL */
512#define OMAP4430_CLKACTIVITY_WKUP_32K_GFCLK_SHIFT 11
513#define OMAP4430_CLKACTIVITY_WKUP_32K_GFCLK_WIDTH 0x1
514#define OMAP4430_CLKACTIVITY_WKUP_32K_GFCLK_MASK (1 << 11)
515
516/* Used by CM_WKUP_CLKSTCTRL */
517#define OMAP4460_CLKACTIVITY_WKUP_TS_GFCLK_SHIFT 13
518#define OMAP4460_CLKACTIVITY_WKUP_TS_GFCLK_WIDTH 0x1
519#define OMAP4460_CLKACTIVITY_WKUP_TS_GFCLK_MASK (1 << 13)
520
521/*
522 * Used by CM1_ABE_TIMER5_CLKCTRL, CM1_ABE_TIMER6_CLKCTRL,
523 * CM1_ABE_TIMER7_CLKCTRL, CM1_ABE_TIMER8_CLKCTRL, CM_L3INIT_MMC1_CLKCTRL,
524 * CM_L3INIT_MMC2_CLKCTRL, CM_L4PER_DMTIMER10_CLKCTRL,
525 * CM_L4PER_DMTIMER11_CLKCTRL, CM_L4PER_DMTIMER2_CLKCTRL,
526 * CM_L4PER_DMTIMER3_CLKCTRL, CM_L4PER_DMTIMER4_CLKCTRL,
527 * CM_L4PER_DMTIMER9_CLKCTRL, CM_WKUP_TIMER1_CLKCTRL
528 */
529#define OMAP4430_CLKSEL_SHIFT 24 27#define OMAP4430_CLKSEL_SHIFT 24
530#define OMAP4430_CLKSEL_WIDTH 0x1 28#define OMAP4430_CLKSEL_WIDTH 0x1
531#define OMAP4430_CLKSEL_MASK (1 << 24) 29#define OMAP4430_CLKSEL_MASK (1 << 24)
532
533/*
534 * Renamed from CLKSEL Used by CM_ABE_DSS_SYS_CLKSEL, CM_ABE_PLL_REF_CLKSEL,
535 * CM_CLKSEL_DUCATI_ISS_ROOT, CM_CLKSEL_USB_60MHZ, CM_L4_WKUP_CLKSEL
536 */
537#define OMAP4430_CLKSEL_0_0_SHIFT 0 30#define OMAP4430_CLKSEL_0_0_SHIFT 0
538#define OMAP4430_CLKSEL_0_0_WIDTH 0x1 31#define OMAP4430_CLKSEL_0_0_WIDTH 0x1
539#define OMAP4430_CLKSEL_0_0_MASK (1 << 0)
540
541/* Renamed from CLKSEL Used by CM_BYPCLK_DPLL_IVA, CM_BYPCLK_DPLL_MPU */
542#define OMAP4430_CLKSEL_0_1_SHIFT 0 32#define OMAP4430_CLKSEL_0_1_SHIFT 0
543#define OMAP4430_CLKSEL_0_1_WIDTH 0x2 33#define OMAP4430_CLKSEL_0_1_WIDTH 0x2
544#define OMAP4430_CLKSEL_0_1_MASK (0x3 << 0)
545
546/* Renamed from CLKSEL Used by CM_L3INIT_HSI_CLKCTRL */
547#define OMAP4430_CLKSEL_24_25_SHIFT 24 34#define OMAP4430_CLKSEL_24_25_SHIFT 24
548#define OMAP4430_CLKSEL_24_25_WIDTH 0x2 35#define OMAP4430_CLKSEL_24_25_WIDTH 0x2
549#define OMAP4430_CLKSEL_24_25_MASK (0x3 << 24)
550
551/* Used by CM_L3INIT_USB_OTG_CLKCTRL */
552#define OMAP4430_CLKSEL_60M_SHIFT 24 36#define OMAP4430_CLKSEL_60M_SHIFT 24
553#define OMAP4430_CLKSEL_60M_WIDTH 0x1 37#define OMAP4430_CLKSEL_60M_WIDTH 0x1
554#define OMAP4430_CLKSEL_60M_MASK (1 << 24)
555
556/* Used by CM_MPU_MPU_CLKCTRL */
557#define OMAP4460_CLKSEL_ABE_DIV_MODE_SHIFT 25
558#define OMAP4460_CLKSEL_ABE_DIV_MODE_WIDTH 0x1
559#define OMAP4460_CLKSEL_ABE_DIV_MODE_MASK (1 << 25)
560
561/* Used by CM1_ABE_AESS_CLKCTRL */
562#define OMAP4430_CLKSEL_AESS_FCLK_SHIFT 24 38#define OMAP4430_CLKSEL_AESS_FCLK_SHIFT 24
563#define OMAP4430_CLKSEL_AESS_FCLK_WIDTH 0x1 39#define OMAP4430_CLKSEL_AESS_FCLK_WIDTH 0x1
564#define OMAP4430_CLKSEL_AESS_FCLK_MASK (1 << 24)
565
566/* Used by CM_CLKSEL_CORE */
567#define OMAP4430_CLKSEL_CORE_SHIFT 0 40#define OMAP4430_CLKSEL_CORE_SHIFT 0
568#define OMAP4430_CLKSEL_CORE_WIDTH 0x1 41#define OMAP4430_CLKSEL_CORE_WIDTH 0x1
569#define OMAP4430_CLKSEL_CORE_MASK (1 << 0)
570
571/* Renamed from CLKSEL_CORE Used by CM_SHADOW_FREQ_CONFIG2 */
572#define OMAP4430_CLKSEL_CORE_1_1_SHIFT 1
573#define OMAP4430_CLKSEL_CORE_1_1_WIDTH 0x1
574#define OMAP4430_CLKSEL_CORE_1_1_MASK (1 << 1)
575
576/* Used by CM_WKUP_USIM_CLKCTRL */
577#define OMAP4430_CLKSEL_DIV_SHIFT 24 42#define OMAP4430_CLKSEL_DIV_SHIFT 24
578#define OMAP4430_CLKSEL_DIV_WIDTH 0x1 43#define OMAP4430_CLKSEL_DIV_WIDTH 0x1
579#define OMAP4430_CLKSEL_DIV_MASK (1 << 24)
580
581/* Used by CM_MPU_MPU_CLKCTRL */
582#define OMAP4460_CLKSEL_EMIF_DIV_MODE_SHIFT 24
583#define OMAP4460_CLKSEL_EMIF_DIV_MODE_WIDTH 0x1
584#define OMAP4460_CLKSEL_EMIF_DIV_MODE_MASK (1 << 24)
585
586/* Used by CM_CAM_FDIF_CLKCTRL */
587#define OMAP4430_CLKSEL_FCLK_SHIFT 24 44#define OMAP4430_CLKSEL_FCLK_SHIFT 24
588#define OMAP4430_CLKSEL_FCLK_WIDTH 0x2 45#define OMAP4430_CLKSEL_FCLK_WIDTH 0x2
589#define OMAP4430_CLKSEL_FCLK_MASK (0x3 << 24)
590
591/* Used by CM_L4PER_MCBSP4_CLKCTRL */
592#define OMAP4430_CLKSEL_INTERNAL_SOURCE_SHIFT 25 46#define OMAP4430_CLKSEL_INTERNAL_SOURCE_SHIFT 25
593#define OMAP4430_CLKSEL_INTERNAL_SOURCE_WIDTH 0x1 47#define OMAP4430_CLKSEL_INTERNAL_SOURCE_WIDTH 0x1
594#define OMAP4430_CLKSEL_INTERNAL_SOURCE_MASK (1 << 25)
595
596/*
597 * Renamed from CLKSEL_INTERNAL_SOURCE Used by CM1_ABE_DMIC_CLKCTRL,
598 * CM1_ABE_MCASP_CLKCTRL, CM1_ABE_MCBSP1_CLKCTRL, CM1_ABE_MCBSP2_CLKCTRL,
599 * CM1_ABE_MCBSP3_CLKCTRL
600 */
601#define OMAP4430_CLKSEL_INTERNAL_SOURCE_CM1_ABE_DMIC_SHIFT 26
602#define OMAP4430_CLKSEL_INTERNAL_SOURCE_CM1_ABE_DMIC_WIDTH 0x2
603#define OMAP4430_CLKSEL_INTERNAL_SOURCE_CM1_ABE_DMIC_MASK (0x3 << 26)
604
605/* Used by CM_CLKSEL_CORE */
606#define OMAP4430_CLKSEL_L3_SHIFT 4 48#define OMAP4430_CLKSEL_L3_SHIFT 4
607#define OMAP4430_CLKSEL_L3_WIDTH 0x1 49#define OMAP4430_CLKSEL_L3_WIDTH 0x1
608#define OMAP4430_CLKSEL_L3_MASK (1 << 4)
609
610/* Renamed from CLKSEL_L3 Used by CM_SHADOW_FREQ_CONFIG2 */
611#define OMAP4430_CLKSEL_L3_SHADOW_SHIFT 2
612#define OMAP4430_CLKSEL_L3_SHADOW_WIDTH 0x1
613#define OMAP4430_CLKSEL_L3_SHADOW_MASK (1 << 2)
614
615/* Used by CM_CLKSEL_CORE */
616#define OMAP4430_CLKSEL_L4_SHIFT 8 50#define OMAP4430_CLKSEL_L4_SHIFT 8
617#define OMAP4430_CLKSEL_L4_WIDTH 0x1 51#define OMAP4430_CLKSEL_L4_WIDTH 0x1
618#define OMAP4430_CLKSEL_L4_MASK (1 << 8)
619
620/* Used by CM_CLKSEL_ABE */
621#define OMAP4430_CLKSEL_OPP_SHIFT 0 52#define OMAP4430_CLKSEL_OPP_SHIFT 0
622#define OMAP4430_CLKSEL_OPP_WIDTH 0x2 53#define OMAP4430_CLKSEL_OPP_WIDTH 0x2
623#define OMAP4430_CLKSEL_OPP_MASK (0x3 << 0)
624
625/* Used by CM_EMU_DEBUGSS_CLKCTRL */
626#define OMAP4430_CLKSEL_PMD_STM_CLK_SHIFT 27 54#define OMAP4430_CLKSEL_PMD_STM_CLK_SHIFT 27
627#define OMAP4430_CLKSEL_PMD_STM_CLK_WIDTH 0x3 55#define OMAP4430_CLKSEL_PMD_STM_CLK_WIDTH 0x3
628#define OMAP4430_CLKSEL_PMD_STM_CLK_MASK (0x7 << 27)
629
630/* Used by CM_EMU_DEBUGSS_CLKCTRL */
631#define OMAP4430_CLKSEL_PMD_TRACE_CLK_SHIFT 24
632#define OMAP4430_CLKSEL_PMD_TRACE_CLK_WIDTH 0x3
633#define OMAP4430_CLKSEL_PMD_TRACE_CLK_MASK (0x7 << 24) 56#define OMAP4430_CLKSEL_PMD_TRACE_CLK_MASK (0x7 << 24)
634
635/* Used by CM_GFX_GFX_CLKCTRL */
636#define OMAP4430_CLKSEL_SGX_FCLK_SHIFT 24
637#define OMAP4430_CLKSEL_SGX_FCLK_WIDTH 0x1
638#define OMAP4430_CLKSEL_SGX_FCLK_MASK (1 << 24) 57#define OMAP4430_CLKSEL_SGX_FCLK_MASK (1 << 24)
639
640/*
641 * Used by CM1_ABE_DMIC_CLKCTRL, CM1_ABE_MCASP_CLKCTRL, CM1_ABE_MCBSP1_CLKCTRL,
642 * CM1_ABE_MCBSP2_CLKCTRL, CM1_ABE_MCBSP3_CLKCTRL
643 */
644#define OMAP4430_CLKSEL_SOURCE_SHIFT 24
645#define OMAP4430_CLKSEL_SOURCE_WIDTH 0x2
646#define OMAP4430_CLKSEL_SOURCE_MASK (0x3 << 24) 58#define OMAP4430_CLKSEL_SOURCE_MASK (0x3 << 24)
647
648/* Renamed from CLKSEL_SOURCE Used by CM_L4PER_MCBSP4_CLKCTRL */
649#define OMAP4430_CLKSEL_SOURCE_24_24_SHIFT 24
650#define OMAP4430_CLKSEL_SOURCE_24_24_WIDTH 0x1
651#define OMAP4430_CLKSEL_SOURCE_24_24_MASK (1 << 24) 59#define OMAP4430_CLKSEL_SOURCE_24_24_MASK (1 << 24)
652
653/* Used by CM_L3INIT_USB_HOST_CLKCTRL */
654#define OMAP4430_CLKSEL_UTMI_P1_SHIFT 24 60#define OMAP4430_CLKSEL_UTMI_P1_SHIFT 24
655#define OMAP4430_CLKSEL_UTMI_P1_WIDTH 0x1 61#define OMAP4430_CLKSEL_UTMI_P1_WIDTH 0x1
656#define OMAP4430_CLKSEL_UTMI_P1_MASK (1 << 24)
657
658/* Used by CM_L3INIT_USB_HOST_CLKCTRL */
659#define OMAP4430_CLKSEL_UTMI_P2_SHIFT 25 62#define OMAP4430_CLKSEL_UTMI_P2_SHIFT 25
660#define OMAP4430_CLKSEL_UTMI_P2_WIDTH 0x1 63#define OMAP4430_CLKSEL_UTMI_P2_WIDTH 0x1
661#define OMAP4430_CLKSEL_UTMI_P2_MASK (1 << 25)
662
663/*
664 * Used by CM1_ABE_CLKSTCTRL, CM_ALWON_CLKSTCTRL, CM_CAM_CLKSTCTRL,
665 * CM_CEFUSE_CLKSTCTRL, CM_D2D_CLKSTCTRL, CM_DSS_CLKSTCTRL,
666 * CM_DUCATI_CLKSTCTRL, CM_EMU_CLKSTCTRL, CM_GFX_CLKSTCTRL, CM_IVAHD_CLKSTCTRL,
667 * CM_L3INIT_CLKSTCTRL, CM_L3INSTR_CLKSTCTRL, CM_L3_1_CLKSTCTRL,
668 * CM_L3_2_CLKSTCTRL, CM_L4CFG_CLKSTCTRL, CM_L4PER_CLKSTCTRL,
669 * CM_L4SEC_CLKSTCTRL, CM_MEMIF_CLKSTCTRL, CM_MPU_CLKSTCTRL, CM_SDMA_CLKSTCTRL,
670 * CM_TESLA_CLKSTCTRL, CM_WKUP_CLKSTCTRL
671 */
672#define OMAP4430_CLKTRCTRL_SHIFT 0 64#define OMAP4430_CLKTRCTRL_SHIFT 0
673#define OMAP4430_CLKTRCTRL_WIDTH 0x2
674#define OMAP4430_CLKTRCTRL_MASK (0x3 << 0) 65#define OMAP4430_CLKTRCTRL_MASK (0x3 << 0)
675
676/* Used by CM_EMU_OVERRIDE_DPLL_CORE */
677#define OMAP4430_CORE_DPLL_EMU_DIV_SHIFT 0
678#define OMAP4430_CORE_DPLL_EMU_DIV_WIDTH 0x7
679#define OMAP4430_CORE_DPLL_EMU_DIV_MASK (0x7f << 0)
680
681/* Used by CM_EMU_OVERRIDE_DPLL_CORE */
682#define OMAP4430_CORE_DPLL_EMU_MULT_SHIFT 8
683#define OMAP4430_CORE_DPLL_EMU_MULT_WIDTH 0xb
684#define OMAP4430_CORE_DPLL_EMU_MULT_MASK (0x7ff << 8)
685
686/* Used by REVISION_CM1, REVISION_CM2 */
687#define OMAP4430_CUSTOM_SHIFT 6
688#define OMAP4430_CUSTOM_WIDTH 0x2
689#define OMAP4430_CUSTOM_MASK (0x3 << 6)
690
691/* Used by CM_L3_2_DYNAMICDEP, CM_L4CFG_DYNAMICDEP */
692#define OMAP4430_D2D_DYNDEP_SHIFT 18
693#define OMAP4430_D2D_DYNDEP_WIDTH 0x1
694#define OMAP4430_D2D_DYNDEP_MASK (1 << 18)
695
696/* Used by CM_MPU_STATICDEP */
697#define OMAP4430_D2D_STATDEP_SHIFT 18
698#define OMAP4430_D2D_STATDEP_WIDTH 0x1
699#define OMAP4430_D2D_STATDEP_MASK (1 << 18)
700
701/* Used by CM_CLKSEL_DPLL_MPU */
702#define OMAP4460_DCC_COUNT_MAX_SHIFT 24
703#define OMAP4460_DCC_COUNT_MAX_WIDTH 0x8
704#define OMAP4460_DCC_COUNT_MAX_MASK (0xff << 24)
705
706/* Used by CM_CLKSEL_DPLL_MPU */
707#define OMAP4460_DCC_EN_SHIFT 22
708#define OMAP4460_DCC_EN_MASK (1 << 22)
709
710/*
711 * Used by CM_SSC_DELTAMSTEP_DPLL_ABE, CM_SSC_DELTAMSTEP_DPLL_CORE,
712 * CM_SSC_DELTAMSTEP_DPLL_DDRPHY, CM_SSC_DELTAMSTEP_DPLL_IVA,
713 * CM_SSC_DELTAMSTEP_DPLL_MPU, CM_SSC_DELTAMSTEP_DPLL_PER,
714 * CM_SSC_DELTAMSTEP_DPLL_UNIPRO, CM_SSC_DELTAMSTEP_DPLL_USB
715 */
716#define OMAP4430_DELTAMSTEP_SHIFT 0
717#define OMAP4430_DELTAMSTEP_WIDTH 0x14
718#define OMAP4430_DELTAMSTEP_MASK (0xfffff << 0)
719
720/* Renamed from DELTAMSTEP Used by CM_SSC_DELTAMSTEP_DPLL_USB */
721#define OMAP4460_DELTAMSTEP_0_20_SHIFT 0
722#define OMAP4460_DELTAMSTEP_0_20_WIDTH 0x15
723#define OMAP4460_DELTAMSTEP_0_20_MASK (0x1fffff << 0)
724
725/* Used by CM_DLL_CTRL */
726#define OMAP4430_DLL_OVERRIDE_SHIFT 0
727#define OMAP4430_DLL_OVERRIDE_WIDTH 0x1
728#define OMAP4430_DLL_OVERRIDE_MASK (1 << 0)
729
730/* Renamed from DLL_OVERRIDE Used by CM_SHADOW_FREQ_CONFIG1 */
731#define OMAP4430_DLL_OVERRIDE_2_2_SHIFT 2
732#define OMAP4430_DLL_OVERRIDE_2_2_WIDTH 0x1
733#define OMAP4430_DLL_OVERRIDE_2_2_MASK (1 << 2)
734
735/* Used by CM_SHADOW_FREQ_CONFIG1 */
736#define OMAP4430_DLL_RESET_SHIFT 3
737#define OMAP4430_DLL_RESET_WIDTH 0x1
738#define OMAP4430_DLL_RESET_MASK (1 << 3)
739
740/*
741 * Used by CM_CLKSEL_DPLL_ABE, CM_CLKSEL_DPLL_CORE, CM_CLKSEL_DPLL_DDRPHY,
742 * CM_CLKSEL_DPLL_IVA, CM_CLKSEL_DPLL_MPU, CM_CLKSEL_DPLL_PER,
743 * CM_CLKSEL_DPLL_UNIPRO, CM_CLKSEL_DPLL_USB
744 */
745#define OMAP4430_DPLL_BYP_CLKSEL_SHIFT 23 66#define OMAP4430_DPLL_BYP_CLKSEL_SHIFT 23
746#define OMAP4430_DPLL_BYP_CLKSEL_WIDTH 0x1 67#define OMAP4430_DPLL_BYP_CLKSEL_WIDTH 0x1
747#define OMAP4430_DPLL_BYP_CLKSEL_MASK (1 << 23)
748
749/* Used by CM_CLKDCOLDO_DPLL_USB */
750#define OMAP4430_DPLL_CLKDCOLDO_GATE_CTRL_SHIFT 8
751#define OMAP4430_DPLL_CLKDCOLDO_GATE_CTRL_WIDTH 0x1
752#define OMAP4430_DPLL_CLKDCOLDO_GATE_CTRL_MASK (1 << 8)
753
754/* Used by CM_CLKSEL_DPLL_CORE */
755#define OMAP4430_DPLL_CLKOUTHIF_CLKSEL_SHIFT 20
756#define OMAP4430_DPLL_CLKOUTHIF_CLKSEL_WIDTH 0x1
757#define OMAP4430_DPLL_CLKOUTHIF_CLKSEL_MASK (1 << 20)
758
759/* Used by CM_DIV_M3_DPLL_ABE, CM_DIV_M3_DPLL_CORE, CM_DIV_M3_DPLL_PER */
760#define OMAP4430_DPLL_CLKOUTHIF_DIV_SHIFT 0
761#define OMAP4430_DPLL_CLKOUTHIF_DIV_WIDTH 0x5
762#define OMAP4430_DPLL_CLKOUTHIF_DIV_MASK (0x1f << 0) 68#define OMAP4430_DPLL_CLKOUTHIF_DIV_MASK (0x1f << 0)
763
764/* Used by CM_DIV_M3_DPLL_ABE, CM_DIV_M3_DPLL_CORE, CM_DIV_M3_DPLL_PER */
765#define OMAP4430_DPLL_CLKOUTHIF_DIVCHACK_SHIFT 5
766#define OMAP4430_DPLL_CLKOUTHIF_DIVCHACK_WIDTH 0x1
767#define OMAP4430_DPLL_CLKOUTHIF_DIVCHACK_MASK (1 << 5)
768
769/* Used by CM_DIV_M3_DPLL_ABE, CM_DIV_M3_DPLL_CORE, CM_DIV_M3_DPLL_PER */
770#define OMAP4430_DPLL_CLKOUTHIF_GATE_CTRL_SHIFT 8 69#define OMAP4430_DPLL_CLKOUTHIF_GATE_CTRL_SHIFT 8
771#define OMAP4430_DPLL_CLKOUTHIF_GATE_CTRL_WIDTH 0x1
772#define OMAP4430_DPLL_CLKOUTHIF_GATE_CTRL_MASK (1 << 8)
773
774/* Used by CM_DIV_M2_DPLL_ABE, CM_DIV_M2_DPLL_PER, CM_DIV_M2_DPLL_UNIPRO */
775#define OMAP4430_DPLL_CLKOUTX2_GATE_CTRL_SHIFT 10
776#define OMAP4430_DPLL_CLKOUTX2_GATE_CTRL_WIDTH 0x1
777#define OMAP4430_DPLL_CLKOUTX2_GATE_CTRL_MASK (1 << 10) 70#define OMAP4430_DPLL_CLKOUTX2_GATE_CTRL_MASK (1 << 10)
778
779/*
780 * Used by CM_DIV_M2_DPLL_ABE, CM_DIV_M2_DPLL_CORE, CM_DIV_M2_DPLL_DDRPHY,
781 * CM_DIV_M2_DPLL_MPU, CM_DIV_M2_DPLL_PER, CM_DIV_M2_DPLL_UNIPRO
782 */
783#define OMAP4430_DPLL_CLKOUT_DIV_SHIFT 0 71#define OMAP4430_DPLL_CLKOUT_DIV_SHIFT 0
784#define OMAP4430_DPLL_CLKOUT_DIV_WIDTH 0x5 72#define OMAP4430_DPLL_CLKOUT_DIV_WIDTH 0x5
785#define OMAP4430_DPLL_CLKOUT_DIV_MASK (0x1f << 0) 73#define OMAP4430_DPLL_CLKOUT_DIV_MASK (0x1f << 0)
786
787/* Renamed from DPLL_CLKOUT_DIV Used by CM_DIV_M2_DPLL_USB */
788#define OMAP4430_DPLL_CLKOUT_DIV_0_6_SHIFT 0
789#define OMAP4430_DPLL_CLKOUT_DIV_0_6_WIDTH 0x7
790#define OMAP4430_DPLL_CLKOUT_DIV_0_6_MASK (0x7f << 0) 74#define OMAP4430_DPLL_CLKOUT_DIV_0_6_MASK (0x7f << 0)
791
792/*
793 * Used by CM_DIV_M2_DPLL_ABE, CM_DIV_M2_DPLL_CORE, CM_DIV_M2_DPLL_DDRPHY,
794 * CM_DIV_M2_DPLL_MPU, CM_DIV_M2_DPLL_PER, CM_DIV_M2_DPLL_UNIPRO
795 */
796#define OMAP4430_DPLL_CLKOUT_DIVCHACK_SHIFT 5
797#define OMAP4430_DPLL_CLKOUT_DIVCHACK_WIDTH 0x1
798#define OMAP4430_DPLL_CLKOUT_DIVCHACK_MASK (1 << 5)
799
800/* Renamed from DPLL_CLKOUT_DIVCHACK Used by CM_DIV_M2_DPLL_USB */
801#define OMAP4430_DPLL_CLKOUT_DIVCHACK_M2_USB_SHIFT 7
802#define OMAP4430_DPLL_CLKOUT_DIVCHACK_M2_USB_WIDTH 0x1
803#define OMAP4430_DPLL_CLKOUT_DIVCHACK_M2_USB_MASK (1 << 7)
804
805/*
806 * Used by CM_DIV_M2_DPLL_ABE, CM_DIV_M2_DPLL_CORE, CM_DIV_M2_DPLL_DDRPHY,
807 * CM_DIV_M2_DPLL_MPU, CM_DIV_M2_DPLL_PER, CM_DIV_M2_DPLL_USB
808 */
809#define OMAP4430_DPLL_CLKOUT_GATE_CTRL_SHIFT 8
810#define OMAP4430_DPLL_CLKOUT_GATE_CTRL_WIDTH 0x1
811#define OMAP4430_DPLL_CLKOUT_GATE_CTRL_MASK (1 << 8) 75#define OMAP4430_DPLL_CLKOUT_GATE_CTRL_MASK (1 << 8)
812
813/* Used by CM_SHADOW_FREQ_CONFIG1 */
814#define OMAP4430_DPLL_CORE_DPLL_EN_SHIFT 8
815#define OMAP4430_DPLL_CORE_DPLL_EN_WIDTH 0x3
816#define OMAP4430_DPLL_CORE_DPLL_EN_MASK (0x7 << 8)
817
818/* Used by CM_SHADOW_FREQ_CONFIG1 */
819#define OMAP4430_DPLL_CORE_M2_DIV_SHIFT 11
820#define OMAP4430_DPLL_CORE_M2_DIV_WIDTH 0x5
821#define OMAP4430_DPLL_CORE_M2_DIV_MASK (0x1f << 11)
822
823/* Used by CM_SHADOW_FREQ_CONFIG2 */
824#define OMAP4430_DPLL_CORE_M5_DIV_SHIFT 3
825#define OMAP4430_DPLL_CORE_M5_DIV_WIDTH 0x5
826#define OMAP4430_DPLL_CORE_M5_DIV_MASK (0x1f << 3)
827
828/*
829 * Used by CM_CLKSEL_DPLL_ABE, CM_CLKSEL_DPLL_CORE, CM_CLKSEL_DPLL_DDRPHY,
830 * CM_CLKSEL_DPLL_IVA, CM_CLKSEL_DPLL_MPU, CM_CLKSEL_DPLL_PER,
831 * CM_CLKSEL_DPLL_UNIPRO
832 */
833#define OMAP4430_DPLL_DIV_SHIFT 0
834#define OMAP4430_DPLL_DIV_WIDTH 0x7
835#define OMAP4430_DPLL_DIV_MASK (0x7f << 0) 76#define OMAP4430_DPLL_DIV_MASK (0x7f << 0)
836
837/* Renamed from DPLL_DIV Used by CM_CLKSEL_DPLL_USB */
838#define OMAP4430_DPLL_DIV_0_7_SHIFT 0
839#define OMAP4430_DPLL_DIV_0_7_WIDTH 0x8
840#define OMAP4430_DPLL_DIV_0_7_MASK (0xff << 0) 77#define OMAP4430_DPLL_DIV_0_7_MASK (0xff << 0)
841
842/*
843 * Used by CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_DDRPHY,
844 * CM_CLKMODE_DPLL_IVA, CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER
845 */
846#define OMAP4430_DPLL_DRIFTGUARD_EN_SHIFT 8
847#define OMAP4430_DPLL_DRIFTGUARD_EN_WIDTH 0x1
848#define OMAP4430_DPLL_DRIFTGUARD_EN_MASK (1 << 8)
849
850/* Renamed from DPLL_DRIFTGUARD_EN Used by CM_CLKMODE_DPLL_UNIPRO */
851#define OMAP4430_DPLL_DRIFTGUARD_EN_3_3_SHIFT 3
852#define OMAP4430_DPLL_DRIFTGUARD_EN_3_3_WIDTH 0x1
853#define OMAP4430_DPLL_DRIFTGUARD_EN_3_3_MASK (1 << 3)
854
855/*
856 * Used by CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_DDRPHY,
857 * CM_CLKMODE_DPLL_IVA, CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER,
858 * CM_CLKMODE_DPLL_UNIPRO, CM_CLKMODE_DPLL_USB
859 */
860#define OMAP4430_DPLL_EN_SHIFT 0
861#define OMAP4430_DPLL_EN_WIDTH 0x3
862#define OMAP4430_DPLL_EN_MASK (0x7 << 0) 78#define OMAP4430_DPLL_EN_MASK (0x7 << 0)
863
864/*
865 * Used by CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_DDRPHY,
866 * CM_CLKMODE_DPLL_IVA, CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER,
867 * CM_CLKMODE_DPLL_UNIPRO
868 */
869#define OMAP4430_DPLL_LPMODE_EN_SHIFT 10
870#define OMAP4430_DPLL_LPMODE_EN_WIDTH 0x1
871#define OMAP4430_DPLL_LPMODE_EN_MASK (1 << 10) 79#define OMAP4430_DPLL_LPMODE_EN_MASK (1 << 10)
872
873/*
874 * Used by CM_CLKSEL_DPLL_ABE, CM_CLKSEL_DPLL_CORE, CM_CLKSEL_DPLL_DDRPHY,
875 * CM_CLKSEL_DPLL_IVA, CM_CLKSEL_DPLL_MPU, CM_CLKSEL_DPLL_PER,
876 * CM_CLKSEL_DPLL_UNIPRO
877 */
878#define OMAP4430_DPLL_MULT_SHIFT 8
879#define OMAP4430_DPLL_MULT_WIDTH 0xb
880#define OMAP4430_DPLL_MULT_MASK (0x7ff << 8) 80#define OMAP4430_DPLL_MULT_MASK (0x7ff << 8)
881
882/* Renamed from DPLL_MULT Used by CM_CLKSEL_DPLL_USB */
883#define OMAP4430_DPLL_MULT_USB_SHIFT 8
884#define OMAP4430_DPLL_MULT_USB_WIDTH 0xc
885#define OMAP4430_DPLL_MULT_USB_MASK (0xfff << 8) 81#define OMAP4430_DPLL_MULT_USB_MASK (0xfff << 8)
886
887/*
888 * Used by CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_DDRPHY,
889 * CM_CLKMODE_DPLL_IVA, CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER,
890 * CM_CLKMODE_DPLL_UNIPRO
891 */
892#define OMAP4430_DPLL_REGM4XEN_SHIFT 11
893#define OMAP4430_DPLL_REGM4XEN_WIDTH 0x1
894#define OMAP4430_DPLL_REGM4XEN_MASK (1 << 11) 82#define OMAP4430_DPLL_REGM4XEN_MASK (1 << 11)
895
896/* Used by CM_CLKSEL_DPLL_USB */
897#define OMAP4430_DPLL_SD_DIV_SHIFT 24
898#define OMAP4430_DPLL_SD_DIV_WIDTH 0x8
899#define OMAP4430_DPLL_SD_DIV_MASK (0xff << 24) 83#define OMAP4430_DPLL_SD_DIV_MASK (0xff << 24)
900
901/*
902 * Used by CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_DDRPHY,
903 * CM_CLKMODE_DPLL_IVA, CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER,
904 * CM_CLKMODE_DPLL_UNIPRO, CM_CLKMODE_DPLL_USB
905 */
906#define OMAP4430_DPLL_SSC_ACK_SHIFT 13
907#define OMAP4430_DPLL_SSC_ACK_WIDTH 0x1
908#define OMAP4430_DPLL_SSC_ACK_MASK (1 << 13)
909
910/*
911 * Used by CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_DDRPHY,
912 * CM_CLKMODE_DPLL_IVA, CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER,
913 * CM_CLKMODE_DPLL_UNIPRO, CM_CLKMODE_DPLL_USB
914 */
915#define OMAP4430_DPLL_SSC_DOWNSPREAD_SHIFT 14
916#define OMAP4430_DPLL_SSC_DOWNSPREAD_WIDTH 0x1
917#define OMAP4430_DPLL_SSC_DOWNSPREAD_MASK (1 << 14)
918
919/*
920 * Used by CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_DDRPHY,
921 * CM_CLKMODE_DPLL_IVA, CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER,
922 * CM_CLKMODE_DPLL_UNIPRO, CM_CLKMODE_DPLL_USB
923 */
924#define OMAP4430_DPLL_SSC_EN_SHIFT 12
925#define OMAP4430_DPLL_SSC_EN_WIDTH 0x1
926#define OMAP4430_DPLL_SSC_EN_MASK (1 << 12)
927
928/* Used by CM_L3_2_DYNAMICDEP, CM_L4CFG_DYNAMICDEP, CM_L4PER_DYNAMICDEP */
929#define OMAP4430_DSS_DYNDEP_SHIFT 8
930#define OMAP4430_DSS_DYNDEP_WIDTH 0x1
931#define OMAP4430_DSS_DYNDEP_MASK (1 << 8)
932
933/* Used by CM_DUCATI_STATICDEP, CM_MPU_STATICDEP, CM_SDMA_STATICDEP */
934#define OMAP4430_DSS_STATDEP_SHIFT 8 84#define OMAP4430_DSS_STATDEP_SHIFT 8
935#define OMAP4430_DSS_STATDEP_WIDTH 0x1
936#define OMAP4430_DSS_STATDEP_MASK (1 << 8)
937
938/* Used by CM_L3_2_DYNAMICDEP */
939#define OMAP4430_DUCATI_DYNDEP_SHIFT 0
940#define OMAP4430_DUCATI_DYNDEP_WIDTH 0x1
941#define OMAP4430_DUCATI_DYNDEP_MASK (1 << 0)
942
943/* Used by CM_MPU_STATICDEP, CM_SDMA_STATICDEP */
944#define OMAP4430_DUCATI_STATDEP_SHIFT 0 85#define OMAP4430_DUCATI_STATDEP_SHIFT 0
945#define OMAP4430_DUCATI_STATDEP_WIDTH 0x1
946#define OMAP4430_DUCATI_STATDEP_MASK (1 << 0)
947
948/* Used by CM_SHADOW_FREQ_CONFIG1 */
949#define OMAP4430_FREQ_UPDATE_SHIFT 0
950#define OMAP4430_FREQ_UPDATE_WIDTH 0x1
951#define OMAP4430_FREQ_UPDATE_MASK (1 << 0)
952
953/* Used by REVISION_CM1, REVISION_CM2 */
954#define OMAP4430_FUNC_SHIFT 16
955#define OMAP4430_FUNC_WIDTH 0xc
956#define OMAP4430_FUNC_MASK (0xfff << 16)
957
958/* Used by CM_L3_2_DYNAMICDEP */
959#define OMAP4430_GFX_DYNDEP_SHIFT 10
960#define OMAP4430_GFX_DYNDEP_WIDTH 0x1
961#define OMAP4430_GFX_DYNDEP_MASK (1 << 10)
962
963/* Used by CM_DUCATI_STATICDEP, CM_MPU_STATICDEP */
964#define OMAP4430_GFX_STATDEP_SHIFT 10 86#define OMAP4430_GFX_STATDEP_SHIFT 10
965#define OMAP4430_GFX_STATDEP_WIDTH 0x1
966#define OMAP4430_GFX_STATDEP_MASK (1 << 10)
967
968/* Used by CM_SHADOW_FREQ_CONFIG2 */
969#define OMAP4430_GPMC_FREQ_UPDATE_SHIFT 0
970#define OMAP4430_GPMC_FREQ_UPDATE_WIDTH 0x1
971#define OMAP4430_GPMC_FREQ_UPDATE_MASK (1 << 0)
972
973/*
974 * Used by CM_DIV_M4_DPLL_CORE, CM_DIV_M4_DPLL_DDRPHY, CM_DIV_M4_DPLL_IVA,
975 * CM_DIV_M4_DPLL_PER
976 */
977#define OMAP4430_HSDIVIDER_CLKOUT1_DIV_SHIFT 0
978#define OMAP4430_HSDIVIDER_CLKOUT1_DIV_WIDTH 0x5
979#define OMAP4430_HSDIVIDER_CLKOUT1_DIV_MASK (0x1f << 0) 87#define OMAP4430_HSDIVIDER_CLKOUT1_DIV_MASK (0x1f << 0)
980
981/*
982 * Used by CM_DIV_M4_DPLL_CORE, CM_DIV_M4_DPLL_DDRPHY, CM_DIV_M4_DPLL_IVA,
983 * CM_DIV_M4_DPLL_PER
984 */
985#define OMAP4430_HSDIVIDER_CLKOUT1_DIVCHACK_SHIFT 5
986#define OMAP4430_HSDIVIDER_CLKOUT1_DIVCHACK_WIDTH 0x1
987#define OMAP4430_HSDIVIDER_CLKOUT1_DIVCHACK_MASK (1 << 5)
988
989/*
990 * Used by CM_DIV_M4_DPLL_CORE, CM_DIV_M4_DPLL_DDRPHY, CM_DIV_M4_DPLL_IVA,
991 * CM_DIV_M4_DPLL_PER
992 */
993#define OMAP4430_HSDIVIDER_CLKOUT1_GATE_CTRL_SHIFT 8
994#define OMAP4430_HSDIVIDER_CLKOUT1_GATE_CTRL_WIDTH 0x1
995#define OMAP4430_HSDIVIDER_CLKOUT1_GATE_CTRL_MASK (1 << 8)
996
997/*
998 * Used by CM_DIV_M4_DPLL_CORE, CM_DIV_M4_DPLL_DDRPHY, CM_DIV_M4_DPLL_IVA,
999 * CM_DIV_M4_DPLL_PER
1000 */
1001#define OMAP4430_HSDIVIDER_CLKOUT1_PWDN_SHIFT 12
1002#define OMAP4430_HSDIVIDER_CLKOUT1_PWDN_WIDTH 0x1
1003#define OMAP4430_HSDIVIDER_CLKOUT1_PWDN_MASK (1 << 12)
1004
1005/*
1006 * Used by CM_DIV_M5_DPLL_CORE, CM_DIV_M5_DPLL_DDRPHY, CM_DIV_M5_DPLL_IVA,
1007 * CM_DIV_M5_DPLL_PER
1008 */
1009#define OMAP4430_HSDIVIDER_CLKOUT2_DIV_SHIFT 0
1010#define OMAP4430_HSDIVIDER_CLKOUT2_DIV_WIDTH 0x5
1011#define OMAP4430_HSDIVIDER_CLKOUT2_DIV_MASK (0x1f << 0) 88#define OMAP4430_HSDIVIDER_CLKOUT2_DIV_MASK (0x1f << 0)
1012
1013/*
1014 * Used by CM_DIV_M5_DPLL_CORE, CM_DIV_M5_DPLL_DDRPHY, CM_DIV_M5_DPLL_IVA,
1015 * CM_DIV_M5_DPLL_PER
1016 */
1017#define OMAP4430_HSDIVIDER_CLKOUT2_DIVCHACK_SHIFT 5
1018#define OMAP4430_HSDIVIDER_CLKOUT2_DIVCHACK_WIDTH 0x1
1019#define OMAP4430_HSDIVIDER_CLKOUT2_DIVCHACK_MASK (1 << 5)
1020
1021/*
1022 * Used by CM_DIV_M5_DPLL_CORE, CM_DIV_M5_DPLL_DDRPHY, CM_DIV_M5_DPLL_IVA,
1023 * CM_DIV_M5_DPLL_PER
1024 */
1025#define OMAP4430_HSDIVIDER_CLKOUT2_GATE_CTRL_SHIFT 8
1026#define OMAP4430_HSDIVIDER_CLKOUT2_GATE_CTRL_WIDTH 0x1
1027#define OMAP4430_HSDIVIDER_CLKOUT2_GATE_CTRL_MASK (1 << 8)
1028
1029/*
1030 * Used by CM_DIV_M5_DPLL_CORE, CM_DIV_M5_DPLL_DDRPHY, CM_DIV_M5_DPLL_IVA,
1031 * CM_DIV_M5_DPLL_PER
1032 */
1033#define OMAP4430_HSDIVIDER_CLKOUT2_PWDN_SHIFT 12
1034#define OMAP4430_HSDIVIDER_CLKOUT2_PWDN_WIDTH 0x1
1035#define OMAP4430_HSDIVIDER_CLKOUT2_PWDN_MASK (1 << 12)
1036
1037/* Used by CM_DIV_M6_DPLL_CORE, CM_DIV_M6_DPLL_DDRPHY, CM_DIV_M6_DPLL_PER */
1038#define OMAP4430_HSDIVIDER_CLKOUT3_DIV_SHIFT 0
1039#define OMAP4430_HSDIVIDER_CLKOUT3_DIV_WIDTH 0x5
1040#define OMAP4430_HSDIVIDER_CLKOUT3_DIV_MASK (0x1f << 0) 89#define OMAP4430_HSDIVIDER_CLKOUT3_DIV_MASK (0x1f << 0)
1041
1042/* Used by CM_DIV_M6_DPLL_CORE, CM_DIV_M6_DPLL_DDRPHY, CM_DIV_M6_DPLL_PER */
1043#define OMAP4430_HSDIVIDER_CLKOUT3_DIVCHACK_SHIFT 5
1044#define OMAP4430_HSDIVIDER_CLKOUT3_DIVCHACK_WIDTH 0x1
1045#define OMAP4430_HSDIVIDER_CLKOUT3_DIVCHACK_MASK (1 << 5)
1046
1047/* Used by CM_DIV_M6_DPLL_CORE, CM_DIV_M6_DPLL_DDRPHY, CM_DIV_M6_DPLL_PER */
1048#define OMAP4430_HSDIVIDER_CLKOUT3_GATE_CTRL_SHIFT 8
1049#define OMAP4430_HSDIVIDER_CLKOUT3_GATE_CTRL_WIDTH 0x1
1050#define OMAP4430_HSDIVIDER_CLKOUT3_GATE_CTRL_MASK (1 << 8)
1051
1052/* Used by CM_DIV_M6_DPLL_CORE, CM_DIV_M6_DPLL_DDRPHY, CM_DIV_M6_DPLL_PER */
1053#define OMAP4430_HSDIVIDER_CLKOUT3_PWDN_SHIFT 12
1054#define OMAP4430_HSDIVIDER_CLKOUT3_PWDN_WIDTH 0x1
1055#define OMAP4430_HSDIVIDER_CLKOUT3_PWDN_MASK (1 << 12)
1056
1057/* Used by CM_DIV_M7_DPLL_CORE, CM_DIV_M7_DPLL_PER */
1058#define OMAP4430_HSDIVIDER_CLKOUT4_DIV_SHIFT 0
1059#define OMAP4430_HSDIVIDER_CLKOUT4_DIV_WIDTH 0x5
1060#define OMAP4430_HSDIVIDER_CLKOUT4_DIV_MASK (0x1f << 0) 90#define OMAP4430_HSDIVIDER_CLKOUT4_DIV_MASK (0x1f << 0)
1061
1062/* Used by CM_DIV_M7_DPLL_CORE, CM_DIV_M7_DPLL_PER */
1063#define OMAP4430_HSDIVIDER_CLKOUT4_DIVCHACK_SHIFT 5
1064#define OMAP4430_HSDIVIDER_CLKOUT4_DIVCHACK_WIDTH 0x1
1065#define OMAP4430_HSDIVIDER_CLKOUT4_DIVCHACK_MASK (1 << 5)
1066
1067/* Used by CM_DIV_M7_DPLL_CORE, CM_DIV_M7_DPLL_PER */
1068#define OMAP4430_HSDIVIDER_CLKOUT4_GATE_CTRL_SHIFT 8
1069#define OMAP4430_HSDIVIDER_CLKOUT4_GATE_CTRL_WIDTH 0x1
1070#define OMAP4430_HSDIVIDER_CLKOUT4_GATE_CTRL_MASK (1 << 8)
1071
1072/* Used by CM_DIV_M7_DPLL_CORE, CM_DIV_M7_DPLL_PER */
1073#define OMAP4430_HSDIVIDER_CLKOUT4_PWDN_SHIFT 12
1074#define OMAP4430_HSDIVIDER_CLKOUT4_PWDN_WIDTH 0x1
1075#define OMAP4430_HSDIVIDER_CLKOUT4_PWDN_MASK (1 << 12)
1076
1077/*
1078 * Used by CM1_ABE_AESS_CLKCTRL, CM1_ABE_DMIC_CLKCTRL, CM1_ABE_L4ABE_CLKCTRL,
1079 * CM1_ABE_MCASP_CLKCTRL, CM1_ABE_MCBSP1_CLKCTRL, CM1_ABE_MCBSP2_CLKCTRL,
1080 * CM1_ABE_MCBSP3_CLKCTRL, CM1_ABE_PDM_CLKCTRL, CM1_ABE_SLIMBUS_CLKCTRL,
1081 * CM1_ABE_TIMER5_CLKCTRL, CM1_ABE_TIMER6_CLKCTRL, CM1_ABE_TIMER7_CLKCTRL,
1082 * CM1_ABE_TIMER8_CLKCTRL, CM1_ABE_WDT3_CLKCTRL, CM_ALWON_SR_CORE_CLKCTRL,
1083 * CM_ALWON_SR_IVA_CLKCTRL, CM_ALWON_SR_MPU_CLKCTRL, CM_CAM_FDIF_CLKCTRL,
1084 * CM_CAM_ISS_CLKCTRL, CM_CEFUSE_CEFUSE_CLKCTRL, CM_CM1_PROFILING_CLKCTRL,
1085 * CM_CM2_PROFILING_CLKCTRL, CM_D2D_MODEM_ICR_CLKCTRL, CM_D2D_SAD2D_CLKCTRL,
1086 * CM_D2D_SAD2D_FW_CLKCTRL, CM_DSS_DSS_CLKCTRL, CM_DUCATI_DUCATI_CLKCTRL,
1087 * CM_EMU_DEBUGSS_CLKCTRL, CM_GFX_GFX_CLKCTRL, CM_IVAHD_IVAHD_CLKCTRL,
1088 * CM_IVAHD_SL2_CLKCTRL, CM_L3INIT_HSI_CLKCTRL, CM_L3INIT_MMC1_CLKCTRL,
1089 * CM_L3INIT_MMC2_CLKCTRL, CM_L3INIT_USBPHYOCP2SCP_CLKCTRL,
1090 * CM_L3INIT_USB_HOST_CLKCTRL, CM_L3INIT_USB_HOST_FS_CLKCTRL,
1091 * CM_L3INIT_USB_OTG_CLKCTRL, CM_L3INIT_USB_TLL_CLKCTRL,
1092 * CM_L3INSTR_L3_3_CLKCTRL, CM_L3INSTR_L3_INSTR_CLKCTRL,
1093 * CM_L3INSTR_OCP_WP1_CLKCTRL, CM_L3_1_L3_1_CLKCTRL, CM_L3_2_GPMC_CLKCTRL,
1094 * CM_L3_2_L3_2_CLKCTRL, CM_L3_2_OCMC_RAM_CLKCTRL, CM_L4CFG_HW_SEM_CLKCTRL,
1095 * CM_L4CFG_L4_CFG_CLKCTRL, CM_L4CFG_MAILBOX_CLKCTRL, CM_L4CFG_SAR_ROM_CLKCTRL,
1096 * CM_L4PER_DMTIMER10_CLKCTRL, CM_L4PER_DMTIMER11_CLKCTRL,
1097 * CM_L4PER_DMTIMER2_CLKCTRL, CM_L4PER_DMTIMER3_CLKCTRL,
1098 * CM_L4PER_DMTIMER4_CLKCTRL, CM_L4PER_DMTIMER9_CLKCTRL, CM_L4PER_ELM_CLKCTRL,
1099 * CM_L4PER_GPIO2_CLKCTRL, CM_L4PER_GPIO3_CLKCTRL, CM_L4PER_GPIO4_CLKCTRL,
1100 * CM_L4PER_GPIO5_CLKCTRL, CM_L4PER_GPIO6_CLKCTRL, CM_L4PER_HDQ1W_CLKCTRL,
1101 * CM_L4PER_I2C1_CLKCTRL, CM_L4PER_I2C2_CLKCTRL, CM_L4PER_I2C3_CLKCTRL,
1102 * CM_L4PER_I2C4_CLKCTRL, CM_L4PER_I2C5_CLKCTRL, CM_L4PER_L4PER_CLKCTRL,
1103 * CM_L4PER_MCBSP4_CLKCTRL, CM_L4PER_MCSPI1_CLKCTRL, CM_L4PER_MCSPI2_CLKCTRL,
1104 * CM_L4PER_MCSPI3_CLKCTRL, CM_L4PER_MCSPI4_CLKCTRL, CM_L4PER_MMCSD3_CLKCTRL,
1105 * CM_L4PER_MMCSD4_CLKCTRL, CM_L4PER_MMCSD5_CLKCTRL, CM_L4PER_SLIMBUS2_CLKCTRL,
1106 * CM_L4PER_UART1_CLKCTRL, CM_L4PER_UART2_CLKCTRL, CM_L4PER_UART3_CLKCTRL,
1107 * CM_L4PER_UART4_CLKCTRL, CM_L4SEC_AES1_CLKCTRL, CM_L4SEC_AES2_CLKCTRL,
1108 * CM_L4SEC_CRYPTODMA_CLKCTRL, CM_L4SEC_DES3DES_CLKCTRL,
1109 * CM_L4SEC_PKAEIP29_CLKCTRL, CM_L4SEC_RNG_CLKCTRL, CM_L4SEC_SHA2MD51_CLKCTRL,
1110 * CM_MEMIF_DMM_CLKCTRL, CM_MEMIF_EMIF_1_CLKCTRL, CM_MEMIF_EMIF_2_CLKCTRL,
1111 * CM_MEMIF_EMIF_FW_CLKCTRL, CM_MPU_MPU_CLKCTRL, CM_SDMA_SDMA_CLKCTRL,
1112 * CM_TESLA_TESLA_CLKCTRL, CM_WKUP_GPIO1_CLKCTRL, CM_WKUP_KEYBOARD_CLKCTRL,
1113 * CM_WKUP_L4WKUP_CLKCTRL, CM_WKUP_SARRAM_CLKCTRL, CM_WKUP_SYNCTIMER_CLKCTRL,
1114 * CM_WKUP_TIMER12_CLKCTRL, CM_WKUP_TIMER1_CLKCTRL, CM_WKUP_USIM_CLKCTRL,
1115 * CM_WKUP_WDT1_CLKCTRL, CM_WKUP_WDT2_CLKCTRL
1116 */
1117#define OMAP4430_IDLEST_SHIFT 16 91#define OMAP4430_IDLEST_SHIFT 16
1118#define OMAP4430_IDLEST_WIDTH 0x2
1119#define OMAP4430_IDLEST_MASK (0x3 << 16) 92#define OMAP4430_IDLEST_MASK (0x3 << 16)
1120
1121/* Used by CM_DUCATI_DYNAMICDEP, CM_L3_2_DYNAMICDEP, CM_L4CFG_DYNAMICDEP */
1122#define OMAP4430_ISS_DYNDEP_SHIFT 9
1123#define OMAP4430_ISS_DYNDEP_WIDTH 0x1
1124#define OMAP4430_ISS_DYNDEP_MASK (1 << 9)
1125
1126/*
1127 * Used by CM_DUCATI_STATICDEP, CM_MPU_STATICDEP, CM_SDMA_STATICDEP,
1128 * CM_TESLA_STATICDEP
1129 */
1130#define OMAP4430_ISS_STATDEP_SHIFT 9
1131#define OMAP4430_ISS_STATDEP_WIDTH 0x1
1132#define OMAP4430_ISS_STATDEP_MASK (1 << 9)
1133
1134/* Used by CM_L3_2_DYNAMICDEP, CM_TESLA_DYNAMICDEP */
1135#define OMAP4430_IVAHD_DYNDEP_SHIFT 2
1136#define OMAP4430_IVAHD_DYNDEP_WIDTH 0x1
1137#define OMAP4430_IVAHD_DYNDEP_MASK (1 << 2)
1138
1139/*
1140 * Used by CM_CAM_STATICDEP, CM_D2D_STATICDEP, CM_DSS_STATICDEP,
1141 * CM_DUCATI_STATICDEP, CM_GFX_STATICDEP, CM_L3INIT_STATICDEP,
1142 * CM_MPU_STATICDEP, CM_SDMA_STATICDEP, CM_TESLA_STATICDEP
1143 */
1144#define OMAP4430_IVAHD_STATDEP_SHIFT 2 93#define OMAP4430_IVAHD_STATDEP_SHIFT 2
1145#define OMAP4430_IVAHD_STATDEP_WIDTH 0x1
1146#define OMAP4430_IVAHD_STATDEP_MASK (1 << 2)
1147
1148/* Used by CM_L3_2_DYNAMICDEP, CM_L4CFG_DYNAMICDEP, CM_L4PER_DYNAMICDEP */
1149#define OMAP4430_L3INIT_DYNDEP_SHIFT 7
1150#define OMAP4430_L3INIT_DYNDEP_WIDTH 0x1
1151#define OMAP4430_L3INIT_DYNDEP_MASK (1 << 7)
1152
1153/*
1154 * Used by CM_D2D_STATICDEP, CM_DUCATI_STATICDEP, CM_MPU_STATICDEP,
1155 * CM_SDMA_STATICDEP, CM_TESLA_STATICDEP
1156 */
1157#define OMAP4430_L3INIT_STATDEP_SHIFT 7 94#define OMAP4430_L3INIT_STATDEP_SHIFT 7
1158#define OMAP4430_L3INIT_STATDEP_WIDTH 0x1
1159#define OMAP4430_L3INIT_STATDEP_MASK (1 << 7)
1160
1161/*
1162 * Used by CM_DSS_DYNAMICDEP, CM_L3INIT_DYNAMICDEP, CM_L3_2_DYNAMICDEP,
1163 * CM_L4CFG_DYNAMICDEP, CM_MPU_DYNAMICDEP, CM_TESLA_DYNAMICDEP
1164 */
1165#define OMAP4430_L3_1_DYNDEP_SHIFT 5
1166#define OMAP4430_L3_1_DYNDEP_WIDTH 0x1
1167#define OMAP4430_L3_1_DYNDEP_MASK (1 << 5)
1168
1169/*
1170 * Used by CM_CAM_STATICDEP, CM_D2D_STATICDEP, CM_DSS_STATICDEP,
1171 * CM_DUCATI_STATICDEP, CM_GFX_STATICDEP, CM_IVAHD_STATICDEP,
1172 * CM_L3INIT_STATICDEP, CM_L4SEC_STATICDEP, CM_MPU_STATICDEP,
1173 * CM_SDMA_STATICDEP, CM_TESLA_STATICDEP
1174 */
1175#define OMAP4430_L3_1_STATDEP_SHIFT 5 95#define OMAP4430_L3_1_STATDEP_SHIFT 5
1176#define OMAP4430_L3_1_STATDEP_WIDTH 0x1
1177#define OMAP4430_L3_1_STATDEP_MASK (1 << 5)
1178
1179/*
1180 * Used by CM_CAM_DYNAMICDEP, CM_D2D_DYNAMICDEP, CM_DUCATI_DYNAMICDEP,
1181 * CM_EMU_DYNAMICDEP, CM_GFX_DYNAMICDEP, CM_IVAHD_DYNAMICDEP,
1182 * CM_L3INIT_DYNAMICDEP, CM_L3_1_DYNAMICDEP, CM_L4CFG_DYNAMICDEP,
1183 * CM_L4SEC_DYNAMICDEP, CM_SDMA_DYNAMICDEP
1184 */
1185#define OMAP4430_L3_2_DYNDEP_SHIFT 6
1186#define OMAP4430_L3_2_DYNDEP_WIDTH 0x1
1187#define OMAP4430_L3_2_DYNDEP_MASK (1 << 6)
1188
1189/*
1190 * Used by CM_CAM_STATICDEP, CM_D2D_STATICDEP, CM_DSS_STATICDEP,
1191 * CM_DUCATI_STATICDEP, CM_GFX_STATICDEP, CM_IVAHD_STATICDEP,
1192 * CM_L3INIT_STATICDEP, CM_L4SEC_STATICDEP, CM_MPU_STATICDEP,
1193 * CM_SDMA_STATICDEP, CM_TESLA_STATICDEP
1194 */
1195#define OMAP4430_L3_2_STATDEP_SHIFT 6 96#define OMAP4430_L3_2_STATDEP_SHIFT 6
1196#define OMAP4430_L3_2_STATDEP_WIDTH 0x1
1197#define OMAP4430_L3_2_STATDEP_MASK (1 << 6)
1198
1199/* Used by CM_L3_1_DYNAMICDEP */
1200#define OMAP4430_L4CFG_DYNDEP_SHIFT 12
1201#define OMAP4430_L4CFG_DYNDEP_WIDTH 0x1
1202#define OMAP4430_L4CFG_DYNDEP_MASK (1 << 12)
1203
1204/*
1205 * Used by CM_D2D_STATICDEP, CM_DUCATI_STATICDEP, CM_L3INIT_STATICDEP,
1206 * CM_MPU_STATICDEP, CM_SDMA_STATICDEP, CM_TESLA_STATICDEP
1207 */
1208#define OMAP4430_L4CFG_STATDEP_SHIFT 12 97#define OMAP4430_L4CFG_STATDEP_SHIFT 12
1209#define OMAP4430_L4CFG_STATDEP_WIDTH 0x1
1210#define OMAP4430_L4CFG_STATDEP_MASK (1 << 12)
1211
1212/* Used by CM_L3_2_DYNAMICDEP */
1213#define OMAP4430_L4PER_DYNDEP_SHIFT 13
1214#define OMAP4430_L4PER_DYNDEP_WIDTH 0x1
1215#define OMAP4430_L4PER_DYNDEP_MASK (1 << 13)
1216
1217/*
1218 * Used by CM_D2D_STATICDEP, CM_DUCATI_STATICDEP, CM_L3INIT_STATICDEP,
1219 * CM_L4SEC_STATICDEP, CM_MPU_STATICDEP, CM_SDMA_STATICDEP, CM_TESLA_STATICDEP
1220 */
1221#define OMAP4430_L4PER_STATDEP_SHIFT 13 98#define OMAP4430_L4PER_STATDEP_SHIFT 13
1222#define OMAP4430_L4PER_STATDEP_WIDTH 0x1
1223#define OMAP4430_L4PER_STATDEP_MASK (1 << 13)
1224
1225/* Used by CM_L3_2_DYNAMICDEP, CM_L4PER_DYNAMICDEP */
1226#define OMAP4430_L4SEC_DYNDEP_SHIFT 14
1227#define OMAP4430_L4SEC_DYNDEP_WIDTH 0x1
1228#define OMAP4430_L4SEC_DYNDEP_MASK (1 << 14)
1229
1230/*
1231 * Used by CM_DUCATI_STATICDEP, CM_L3INIT_STATICDEP, CM_MPU_STATICDEP,
1232 * CM_SDMA_STATICDEP
1233 */
1234#define OMAP4430_L4SEC_STATDEP_SHIFT 14 99#define OMAP4430_L4SEC_STATDEP_SHIFT 14
1235#define OMAP4430_L4SEC_STATDEP_WIDTH 0x1
1236#define OMAP4430_L4SEC_STATDEP_MASK (1 << 14)
1237
1238/* Used by CM_L4CFG_DYNAMICDEP */
1239#define OMAP4430_L4WKUP_DYNDEP_SHIFT 15
1240#define OMAP4430_L4WKUP_DYNDEP_WIDTH 0x1
1241#define OMAP4430_L4WKUP_DYNDEP_MASK (1 << 15)
1242
1243/*
1244 * Used by CM_DUCATI_STATICDEP, CM_L3INIT_STATICDEP, CM_MPU_STATICDEP,
1245 * CM_SDMA_STATICDEP, CM_TESLA_STATICDEP
1246 */
1247#define OMAP4430_L4WKUP_STATDEP_SHIFT 15 100#define OMAP4430_L4WKUP_STATDEP_SHIFT 15
1248#define OMAP4430_L4WKUP_STATDEP_WIDTH 0x1
1249#define OMAP4430_L4WKUP_STATDEP_MASK (1 << 15)
1250
1251/*
1252 * Used by CM_D2D_DYNAMICDEP, CM_L3_1_DYNAMICDEP, CM_L4CFG_DYNAMICDEP,
1253 * CM_MPU_DYNAMICDEP
1254 */
1255#define OMAP4430_MEMIF_DYNDEP_SHIFT 4
1256#define OMAP4430_MEMIF_DYNDEP_WIDTH 0x1
1257#define OMAP4430_MEMIF_DYNDEP_MASK (1 << 4)
1258
1259/*
1260 * Used by CM_CAM_STATICDEP, CM_D2D_STATICDEP, CM_DSS_STATICDEP,
1261 * CM_DUCATI_STATICDEP, CM_GFX_STATICDEP, CM_IVAHD_STATICDEP,
1262 * CM_L3INIT_STATICDEP, CM_L4SEC_STATICDEP, CM_MPU_STATICDEP,
1263 * CM_SDMA_STATICDEP, CM_TESLA_STATICDEP
1264 */
1265#define OMAP4430_MEMIF_STATDEP_SHIFT 4 101#define OMAP4430_MEMIF_STATDEP_SHIFT 4
1266#define OMAP4430_MEMIF_STATDEP_WIDTH 0x1
1267#define OMAP4430_MEMIF_STATDEP_MASK (1 << 4)
1268
1269/*
1270 * Used by CM_SSC_MODFREQDIV_DPLL_ABE, CM_SSC_MODFREQDIV_DPLL_CORE,
1271 * CM_SSC_MODFREQDIV_DPLL_DDRPHY, CM_SSC_MODFREQDIV_DPLL_IVA,
1272 * CM_SSC_MODFREQDIV_DPLL_MPU, CM_SSC_MODFREQDIV_DPLL_PER,
1273 * CM_SSC_MODFREQDIV_DPLL_UNIPRO, CM_SSC_MODFREQDIV_DPLL_USB
1274 */
1275#define OMAP4430_MODFREQDIV_EXPONENT_SHIFT 8
1276#define OMAP4430_MODFREQDIV_EXPONENT_WIDTH 0x3
1277#define OMAP4430_MODFREQDIV_EXPONENT_MASK (0x7 << 8)
1278
1279/*
1280 * Used by CM_SSC_MODFREQDIV_DPLL_ABE, CM_SSC_MODFREQDIV_DPLL_CORE,
1281 * CM_SSC_MODFREQDIV_DPLL_DDRPHY, CM_SSC_MODFREQDIV_DPLL_IVA,
1282 * CM_SSC_MODFREQDIV_DPLL_MPU, CM_SSC_MODFREQDIV_DPLL_PER,
1283 * CM_SSC_MODFREQDIV_DPLL_UNIPRO, CM_SSC_MODFREQDIV_DPLL_USB
1284 */
1285#define OMAP4430_MODFREQDIV_MANTISSA_SHIFT 0
1286#define OMAP4430_MODFREQDIV_MANTISSA_WIDTH 0x7
1287#define OMAP4430_MODFREQDIV_MANTISSA_MASK (0x7f << 0)
1288
1289/*
1290 * Used by CM1_ABE_AESS_CLKCTRL, CM1_ABE_DMIC_CLKCTRL, CM1_ABE_L4ABE_CLKCTRL,
1291 * CM1_ABE_MCASP_CLKCTRL, CM1_ABE_MCBSP1_CLKCTRL, CM1_ABE_MCBSP2_CLKCTRL,
1292 * CM1_ABE_MCBSP3_CLKCTRL, CM1_ABE_PDM_CLKCTRL, CM1_ABE_SLIMBUS_CLKCTRL,
1293 * CM1_ABE_TIMER5_CLKCTRL, CM1_ABE_TIMER6_CLKCTRL, CM1_ABE_TIMER7_CLKCTRL,
1294 * CM1_ABE_TIMER8_CLKCTRL, CM1_ABE_WDT3_CLKCTRL, CM_ALWON_SR_CORE_CLKCTRL,
1295 * CM_ALWON_SR_IVA_CLKCTRL, CM_ALWON_SR_MPU_CLKCTRL, CM_CAM_FDIF_CLKCTRL,
1296 * CM_CAM_ISS_CLKCTRL, CM_CEFUSE_CEFUSE_CLKCTRL, CM_CM1_PROFILING_CLKCTRL,
1297 * CM_CM2_PROFILING_CLKCTRL, CM_D2D_MODEM_ICR_CLKCTRL, CM_D2D_SAD2D_CLKCTRL,
1298 * CM_D2D_SAD2D_FW_CLKCTRL, CM_DSS_DSS_CLKCTRL, CM_DUCATI_DUCATI_CLKCTRL,
1299 * CM_EMU_DEBUGSS_CLKCTRL, CM_GFX_GFX_CLKCTRL, CM_IVAHD_IVAHD_CLKCTRL,
1300 * CM_IVAHD_SL2_CLKCTRL, CM_L3INIT_HSI_CLKCTRL, CM_L3INIT_MMC1_CLKCTRL,
1301 * CM_L3INIT_MMC2_CLKCTRL, CM_L3INIT_USBPHYOCP2SCP_CLKCTRL,
1302 * CM_L3INIT_USB_HOST_CLKCTRL, CM_L3INIT_USB_HOST_FS_CLKCTRL,
1303 * CM_L3INIT_USB_OTG_CLKCTRL, CM_L3INIT_USB_TLL_CLKCTRL,
1304 * CM_L3INSTR_L3_3_CLKCTRL, CM_L3INSTR_L3_INSTR_CLKCTRL,
1305 * CM_L3INSTR_OCP_WP1_CLKCTRL, CM_L3_1_L3_1_CLKCTRL, CM_L3_2_GPMC_CLKCTRL,
1306 * CM_L3_2_L3_2_CLKCTRL, CM_L3_2_OCMC_RAM_CLKCTRL, CM_L4CFG_HW_SEM_CLKCTRL,
1307 * CM_L4CFG_L4_CFG_CLKCTRL, CM_L4CFG_MAILBOX_CLKCTRL, CM_L4CFG_SAR_ROM_CLKCTRL,
1308 * CM_L4PER_DMTIMER10_CLKCTRL, CM_L4PER_DMTIMER11_CLKCTRL,
1309 * CM_L4PER_DMTIMER2_CLKCTRL, CM_L4PER_DMTIMER3_CLKCTRL,
1310 * CM_L4PER_DMTIMER4_CLKCTRL, CM_L4PER_DMTIMER9_CLKCTRL, CM_L4PER_ELM_CLKCTRL,
1311 * CM_L4PER_GPIO2_CLKCTRL, CM_L4PER_GPIO3_CLKCTRL, CM_L4PER_GPIO4_CLKCTRL,
1312 * CM_L4PER_GPIO5_CLKCTRL, CM_L4PER_GPIO6_CLKCTRL, CM_L4PER_HDQ1W_CLKCTRL,
1313 * CM_L4PER_I2C1_CLKCTRL, CM_L4PER_I2C2_CLKCTRL, CM_L4PER_I2C3_CLKCTRL,
1314 * CM_L4PER_I2C4_CLKCTRL, CM_L4PER_I2C5_CLKCTRL, CM_L4PER_L4PER_CLKCTRL,
1315 * CM_L4PER_MCBSP4_CLKCTRL, CM_L4PER_MCSPI1_CLKCTRL, CM_L4PER_MCSPI2_CLKCTRL,
1316 * CM_L4PER_MCSPI3_CLKCTRL, CM_L4PER_MCSPI4_CLKCTRL, CM_L4PER_MMCSD3_CLKCTRL,
1317 * CM_L4PER_MMCSD4_CLKCTRL, CM_L4PER_MMCSD5_CLKCTRL, CM_L4PER_SLIMBUS2_CLKCTRL,
1318 * CM_L4PER_UART1_CLKCTRL, CM_L4PER_UART2_CLKCTRL, CM_L4PER_UART3_CLKCTRL,
1319 * CM_L4PER_UART4_CLKCTRL, CM_L4SEC_AES1_CLKCTRL, CM_L4SEC_AES2_CLKCTRL,
1320 * CM_L4SEC_CRYPTODMA_CLKCTRL, CM_L4SEC_DES3DES_CLKCTRL,
1321 * CM_L4SEC_PKAEIP29_CLKCTRL, CM_L4SEC_RNG_CLKCTRL, CM_L4SEC_SHA2MD51_CLKCTRL,
1322 * CM_MEMIF_DMM_CLKCTRL, CM_MEMIF_EMIF_1_CLKCTRL, CM_MEMIF_EMIF_2_CLKCTRL,
1323 * CM_MEMIF_EMIF_FW_CLKCTRL, CM_MPU_MPU_CLKCTRL, CM_SDMA_SDMA_CLKCTRL,
1324 * CM_TESLA_TESLA_CLKCTRL, CM_WKUP_GPIO1_CLKCTRL, CM_WKUP_KEYBOARD_CLKCTRL,
1325 * CM_WKUP_L4WKUP_CLKCTRL, CM_WKUP_SARRAM_CLKCTRL, CM_WKUP_SYNCTIMER_CLKCTRL,
1326 * CM_WKUP_TIMER12_CLKCTRL, CM_WKUP_TIMER1_CLKCTRL, CM_WKUP_USIM_CLKCTRL,
1327 * CM_WKUP_WDT1_CLKCTRL, CM_WKUP_WDT2_CLKCTRL
1328 */
1329#define OMAP4430_MODULEMODE_SHIFT 0 102#define OMAP4430_MODULEMODE_SHIFT 0
1330#define OMAP4430_MODULEMODE_WIDTH 0x2
1331#define OMAP4430_MODULEMODE_MASK (0x3 << 0) 103#define OMAP4430_MODULEMODE_MASK (0x3 << 0)
1332
1333/* Used by CM_L4CFG_DYNAMICDEP */
1334#define OMAP4460_MPU_DYNDEP_SHIFT 19
1335#define OMAP4460_MPU_DYNDEP_WIDTH 0x1
1336#define OMAP4460_MPU_DYNDEP_MASK (1 << 19)
1337
1338/* Used by CM_DSS_DSS_CLKCTRL */
1339#define OMAP4430_OPTFCLKEN_48MHZ_CLK_SHIFT 9 104#define OMAP4430_OPTFCLKEN_48MHZ_CLK_SHIFT 9
1340#define OMAP4430_OPTFCLKEN_48MHZ_CLK_WIDTH 0x1
1341#define OMAP4430_OPTFCLKEN_48MHZ_CLK_MASK (1 << 9)
1342
1343/* Used by CM_WKUP_BANDGAP_CLKCTRL */
1344#define OMAP4430_OPTFCLKEN_BGAP_32K_SHIFT 8 105#define OMAP4430_OPTFCLKEN_BGAP_32K_SHIFT 8
1345#define OMAP4430_OPTFCLKEN_BGAP_32K_WIDTH 0x1
1346#define OMAP4430_OPTFCLKEN_BGAP_32K_MASK (1 << 8)
1347
1348/* Used by CM_ALWON_USBPHY_CLKCTRL */
1349#define OMAP4430_OPTFCLKEN_CLK32K_SHIFT 8 106#define OMAP4430_OPTFCLKEN_CLK32K_SHIFT 8
1350#define OMAP4430_OPTFCLKEN_CLK32K_WIDTH 0x1
1351#define OMAP4430_OPTFCLKEN_CLK32K_MASK (1 << 8)
1352
1353/* Used by CM_CAM_ISS_CLKCTRL */
1354#define OMAP4430_OPTFCLKEN_CTRLCLK_SHIFT 8 107#define OMAP4430_OPTFCLKEN_CTRLCLK_SHIFT 8
1355#define OMAP4430_OPTFCLKEN_CTRLCLK_WIDTH 0x1
1356#define OMAP4430_OPTFCLKEN_CTRLCLK_MASK (1 << 8)
1357
1358/*
1359 * Used by CM_L4PER_GPIO2_CLKCTRL, CM_L4PER_GPIO3_CLKCTRL,
1360 * CM_L4PER_GPIO4_CLKCTRL, CM_L4PER_GPIO5_CLKCTRL, CM_L4PER_GPIO6_CLKCTRL,
1361 * CM_WKUP_GPIO1_CLKCTRL
1362 */
1363#define OMAP4430_OPTFCLKEN_DBCLK_SHIFT 8 108#define OMAP4430_OPTFCLKEN_DBCLK_SHIFT 8
1364#define OMAP4430_OPTFCLKEN_DBCLK_WIDTH 0x1
1365#define OMAP4430_OPTFCLKEN_DBCLK_MASK (1 << 8)
1366
1367/* Used by CM_MEMIF_DLL_CLKCTRL, CM_MEMIF_DLL_H_CLKCTRL */
1368#define OMAP4430_OPTFCLKEN_DLL_CLK_SHIFT 8
1369#define OMAP4430_OPTFCLKEN_DLL_CLK_WIDTH 0x1
1370#define OMAP4430_OPTFCLKEN_DLL_CLK_MASK (1 << 8)
1371
1372/* Used by CM_DSS_DSS_CLKCTRL */
1373#define OMAP4430_OPTFCLKEN_DSSCLK_SHIFT 8 109#define OMAP4430_OPTFCLKEN_DSSCLK_SHIFT 8
1374#define OMAP4430_OPTFCLKEN_DSSCLK_WIDTH 0x1
1375#define OMAP4430_OPTFCLKEN_DSSCLK_MASK (1 << 8)
1376
1377/* Used by CM_WKUP_USIM_CLKCTRL */
1378#define OMAP4430_OPTFCLKEN_FCLK_SHIFT 8 110#define OMAP4430_OPTFCLKEN_FCLK_SHIFT 8
1379#define OMAP4430_OPTFCLKEN_FCLK_WIDTH 0x1
1380#define OMAP4430_OPTFCLKEN_FCLK_MASK (1 << 8)
1381
1382/* Used by CM1_ABE_SLIMBUS_CLKCTRL */
1383#define OMAP4430_OPTFCLKEN_FCLK0_SHIFT 8 111#define OMAP4430_OPTFCLKEN_FCLK0_SHIFT 8
1384#define OMAP4430_OPTFCLKEN_FCLK0_WIDTH 0x1
1385#define OMAP4430_OPTFCLKEN_FCLK0_MASK (1 << 8)
1386
1387/* Used by CM1_ABE_SLIMBUS_CLKCTRL */
1388#define OMAP4430_OPTFCLKEN_FCLK1_SHIFT 9 112#define OMAP4430_OPTFCLKEN_FCLK1_SHIFT 9
1389#define OMAP4430_OPTFCLKEN_FCLK1_WIDTH 0x1
1390#define OMAP4430_OPTFCLKEN_FCLK1_MASK (1 << 9)
1391
1392/* Used by CM1_ABE_SLIMBUS_CLKCTRL */
1393#define OMAP4430_OPTFCLKEN_FCLK2_SHIFT 10 113#define OMAP4430_OPTFCLKEN_FCLK2_SHIFT 10
1394#define OMAP4430_OPTFCLKEN_FCLK2_WIDTH 0x1
1395#define OMAP4430_OPTFCLKEN_FCLK2_MASK (1 << 10)
1396
1397/* Used by CM_L3INIT_USB_HOST_CLKCTRL */
1398#define OMAP4430_OPTFCLKEN_FUNC48MCLK_SHIFT 15 114#define OMAP4430_OPTFCLKEN_FUNC48MCLK_SHIFT 15
1399#define OMAP4430_OPTFCLKEN_FUNC48MCLK_WIDTH 0x1
1400#define OMAP4430_OPTFCLKEN_FUNC48MCLK_MASK (1 << 15)
1401
1402/* Used by CM_L3INIT_USB_HOST_CLKCTRL */
1403#define OMAP4430_OPTFCLKEN_HSIC480M_P1_CLK_SHIFT 13 115#define OMAP4430_OPTFCLKEN_HSIC480M_P1_CLK_SHIFT 13
1404#define OMAP4430_OPTFCLKEN_HSIC480M_P1_CLK_WIDTH 0x1
1405#define OMAP4430_OPTFCLKEN_HSIC480M_P1_CLK_MASK (1 << 13)
1406
1407/* Used by CM_L3INIT_USB_HOST_CLKCTRL */
1408#define OMAP4430_OPTFCLKEN_HSIC480M_P2_CLK_SHIFT 14 116#define OMAP4430_OPTFCLKEN_HSIC480M_P2_CLK_SHIFT 14
1409#define OMAP4430_OPTFCLKEN_HSIC480M_P2_CLK_WIDTH 0x1
1410#define OMAP4430_OPTFCLKEN_HSIC480M_P2_CLK_MASK (1 << 14)
1411
1412/* Used by CM_L3INIT_USB_HOST_CLKCTRL */
1413#define OMAP4430_OPTFCLKEN_HSIC60M_P1_CLK_SHIFT 11 117#define OMAP4430_OPTFCLKEN_HSIC60M_P1_CLK_SHIFT 11
1414#define OMAP4430_OPTFCLKEN_HSIC60M_P1_CLK_WIDTH 0x1
1415#define OMAP4430_OPTFCLKEN_HSIC60M_P1_CLK_MASK (1 << 11)
1416
1417/* Used by CM_L3INIT_USB_HOST_CLKCTRL */
1418#define OMAP4430_OPTFCLKEN_HSIC60M_P2_CLK_SHIFT 12 118#define OMAP4430_OPTFCLKEN_HSIC60M_P2_CLK_SHIFT 12
1419#define OMAP4430_OPTFCLKEN_HSIC60M_P2_CLK_WIDTH 0x1
1420#define OMAP4430_OPTFCLKEN_HSIC60M_P2_CLK_MASK (1 << 12)
1421
1422/* Used by CM_L4PER_SLIMBUS2_CLKCTRL */
1423#define OMAP4430_OPTFCLKEN_PER24MC_GFCLK_SHIFT 8 119#define OMAP4430_OPTFCLKEN_PER24MC_GFCLK_SHIFT 8
1424#define OMAP4430_OPTFCLKEN_PER24MC_GFCLK_WIDTH 0x1
1425#define OMAP4430_OPTFCLKEN_PER24MC_GFCLK_MASK (1 << 8)
1426
1427/* Used by CM_L4PER_SLIMBUS2_CLKCTRL */
1428#define OMAP4430_OPTFCLKEN_PERABE24M_GFCLK_SHIFT 9 120#define OMAP4430_OPTFCLKEN_PERABE24M_GFCLK_SHIFT 9
1429#define OMAP4430_OPTFCLKEN_PERABE24M_GFCLK_WIDTH 0x1
1430#define OMAP4430_OPTFCLKEN_PERABE24M_GFCLK_MASK (1 << 9)
1431
1432/* Used by CM_L3INIT_USBPHYOCP2SCP_CLKCTRL */
1433#define OMAP4430_OPTFCLKEN_PHY_48M_SHIFT 8 121#define OMAP4430_OPTFCLKEN_PHY_48M_SHIFT 8
1434#define OMAP4430_OPTFCLKEN_PHY_48M_WIDTH 0x1
1435#define OMAP4430_OPTFCLKEN_PHY_48M_MASK (1 << 8)
1436
1437/* Used by CM_L4PER_SLIMBUS2_CLKCTRL */
1438#define OMAP4430_OPTFCLKEN_SLIMBUS_CLK_SHIFT 10 122#define OMAP4430_OPTFCLKEN_SLIMBUS_CLK_SHIFT 10
1439#define OMAP4430_OPTFCLKEN_SLIMBUS_CLK_WIDTH 0x1
1440#define OMAP4430_OPTFCLKEN_SLIMBUS_CLK_MASK (1 << 10)
1441
1442/* Renamed from OPTFCLKEN_SLIMBUS_CLK Used by CM1_ABE_SLIMBUS_CLKCTRL */
1443#define OMAP4430_OPTFCLKEN_SLIMBUS_CLK_11_11_SHIFT 11 123#define OMAP4430_OPTFCLKEN_SLIMBUS_CLK_11_11_SHIFT 11
1444#define OMAP4430_OPTFCLKEN_SLIMBUS_CLK_11_11_WIDTH 0x1
1445#define OMAP4430_OPTFCLKEN_SLIMBUS_CLK_11_11_MASK (1 << 11)
1446
1447/* Used by CM_DSS_DSS_CLKCTRL */
1448#define OMAP4430_OPTFCLKEN_SYS_CLK_SHIFT 10 124#define OMAP4430_OPTFCLKEN_SYS_CLK_SHIFT 10
1449#define OMAP4430_OPTFCLKEN_SYS_CLK_WIDTH 0x1
1450#define OMAP4430_OPTFCLKEN_SYS_CLK_MASK (1 << 10)
1451
1452/* Used by CM_WKUP_BANDGAP_CLKCTRL */
1453#define OMAP4460_OPTFCLKEN_TS_FCLK_SHIFT 8 125#define OMAP4460_OPTFCLKEN_TS_FCLK_SHIFT 8
1454#define OMAP4460_OPTFCLKEN_TS_FCLK_WIDTH 0x1
1455#define OMAP4460_OPTFCLKEN_TS_FCLK_MASK (1 << 8)
1456
1457/* Used by CM_DSS_DSS_CLKCTRL */
1458#define OMAP4430_OPTFCLKEN_TV_CLK_SHIFT 11 126#define OMAP4430_OPTFCLKEN_TV_CLK_SHIFT 11
1459#define OMAP4430_OPTFCLKEN_TV_CLK_WIDTH 0x1
1460#define OMAP4430_OPTFCLKEN_TV_CLK_MASK (1 << 11)
1461
1462/* Used by CM_L3INIT_UNIPRO1_CLKCTRL */
1463#define OMAP4430_OPTFCLKEN_TXPHYCLK_SHIFT 8
1464#define OMAP4430_OPTFCLKEN_TXPHYCLK_WIDTH 0x1
1465#define OMAP4430_OPTFCLKEN_TXPHYCLK_MASK (1 << 8)
1466
1467/* Used by CM_L3INIT_USB_TLL_CLKCTRL */
1468#define OMAP4430_OPTFCLKEN_USB_CH0_CLK_SHIFT 8 127#define OMAP4430_OPTFCLKEN_USB_CH0_CLK_SHIFT 8
1469#define OMAP4430_OPTFCLKEN_USB_CH0_CLK_WIDTH 0x1
1470#define OMAP4430_OPTFCLKEN_USB_CH0_CLK_MASK (1 << 8)
1471
1472/* Used by CM_L3INIT_USB_TLL_CLKCTRL */
1473#define OMAP4430_OPTFCLKEN_USB_CH1_CLK_SHIFT 9 128#define OMAP4430_OPTFCLKEN_USB_CH1_CLK_SHIFT 9
1474#define OMAP4430_OPTFCLKEN_USB_CH1_CLK_WIDTH 0x1
1475#define OMAP4430_OPTFCLKEN_USB_CH1_CLK_MASK (1 << 9)
1476
1477/* Used by CM_L3INIT_USB_TLL_CLKCTRL */
1478#define OMAP4430_OPTFCLKEN_USB_CH2_CLK_SHIFT 10 129#define OMAP4430_OPTFCLKEN_USB_CH2_CLK_SHIFT 10
1479#define OMAP4430_OPTFCLKEN_USB_CH2_CLK_WIDTH 0x1
1480#define OMAP4430_OPTFCLKEN_USB_CH2_CLK_MASK (1 << 10)
1481
1482/* Used by CM_L3INIT_USB_HOST_CLKCTRL */
1483#define OMAP4430_OPTFCLKEN_UTMI_P1_CLK_SHIFT 8 130#define OMAP4430_OPTFCLKEN_UTMI_P1_CLK_SHIFT 8
1484#define OMAP4430_OPTFCLKEN_UTMI_P1_CLK_WIDTH 0x1
1485#define OMAP4430_OPTFCLKEN_UTMI_P1_CLK_MASK (1 << 8)
1486
1487/* Used by CM_L3INIT_USB_HOST_CLKCTRL */
1488#define OMAP4430_OPTFCLKEN_UTMI_P2_CLK_SHIFT 9 131#define OMAP4430_OPTFCLKEN_UTMI_P2_CLK_SHIFT 9
1489#define OMAP4430_OPTFCLKEN_UTMI_P2_CLK_WIDTH 0x1
1490#define OMAP4430_OPTFCLKEN_UTMI_P2_CLK_MASK (1 << 9)
1491
1492/* Used by CM_L3INIT_USB_HOST_CLKCTRL */
1493#define OMAP4430_OPTFCLKEN_UTMI_P3_CLK_SHIFT 10 132#define OMAP4430_OPTFCLKEN_UTMI_P3_CLK_SHIFT 10
1494#define OMAP4430_OPTFCLKEN_UTMI_P3_CLK_WIDTH 0x1
1495#define OMAP4430_OPTFCLKEN_UTMI_P3_CLK_MASK (1 << 10)
1496
1497/* Used by CM_L3INIT_USB_OTG_CLKCTRL */
1498#define OMAP4430_OPTFCLKEN_XCLK_SHIFT 8 133#define OMAP4430_OPTFCLKEN_XCLK_SHIFT 8
1499#define OMAP4430_OPTFCLKEN_XCLK_WIDTH 0x1
1500#define OMAP4430_OPTFCLKEN_XCLK_MASK (1 << 8)
1501
1502/* Used by CM_EMU_OVERRIDE_DPLL_CORE */
1503#define OMAP4430_OVERRIDE_ENABLE_SHIFT 19
1504#define OMAP4430_OVERRIDE_ENABLE_WIDTH 0x1
1505#define OMAP4430_OVERRIDE_ENABLE_MASK (1 << 19)
1506
1507/* Used by CM_CLKSEL_ABE */
1508#define OMAP4430_PAD_CLKS_GATE_SHIFT 8 134#define OMAP4430_PAD_CLKS_GATE_SHIFT 8
1509#define OMAP4430_PAD_CLKS_GATE_WIDTH 0x1
1510#define OMAP4430_PAD_CLKS_GATE_MASK (1 << 8)
1511
1512/* Used by CM_CORE_DVFS_CURRENT, CM_IVA_DVFS_CURRENT */
1513#define OMAP4430_PERF_CURRENT_SHIFT 0
1514#define OMAP4430_PERF_CURRENT_WIDTH 0x8
1515#define OMAP4430_PERF_CURRENT_MASK (0xff << 0)
1516
1517/*
1518 * Used by CM_CORE_DVFS_PERF1, CM_CORE_DVFS_PERF2, CM_CORE_DVFS_PERF3,
1519 * CM_CORE_DVFS_PERF4, CM_IVA_DVFS_PERF_ABE, CM_IVA_DVFS_PERF_IVAHD,
1520 * CM_IVA_DVFS_PERF_TESLA
1521 */
1522#define OMAP4430_PERF_REQ_SHIFT 0
1523#define OMAP4430_PERF_REQ_WIDTH 0x8
1524#define OMAP4430_PERF_REQ_MASK (0xff << 0)
1525
1526/* Used by CM_RESTORE_ST */
1527#define OMAP4430_PHASE1_COMPLETED_SHIFT 0
1528#define OMAP4430_PHASE1_COMPLETED_WIDTH 0x1
1529#define OMAP4430_PHASE1_COMPLETED_MASK (1 << 0)
1530
1531/* Used by CM_RESTORE_ST */
1532#define OMAP4430_PHASE2A_COMPLETED_SHIFT 1
1533#define OMAP4430_PHASE2A_COMPLETED_WIDTH 0x1
1534#define OMAP4430_PHASE2A_COMPLETED_MASK (1 << 1)
1535
1536/* Used by CM_RESTORE_ST */
1537#define OMAP4430_PHASE2B_COMPLETED_SHIFT 2
1538#define OMAP4430_PHASE2B_COMPLETED_WIDTH 0x1
1539#define OMAP4430_PHASE2B_COMPLETED_MASK (1 << 2)
1540
1541/* Used by CM_EMU_DEBUGSS_CLKCTRL */
1542#define OMAP4430_PMD_STM_MUX_CTRL_SHIFT 20 135#define OMAP4430_PMD_STM_MUX_CTRL_SHIFT 20
1543#define OMAP4430_PMD_STM_MUX_CTRL_WIDTH 0x2 136#define OMAP4430_PMD_STM_MUX_CTRL_WIDTH 0x2
1544#define OMAP4430_PMD_STM_MUX_CTRL_MASK (0x3 << 20)
1545
1546/* Used by CM_EMU_DEBUGSS_CLKCTRL */
1547#define OMAP4430_PMD_TRACE_MUX_CTRL_SHIFT 22 137#define OMAP4430_PMD_TRACE_MUX_CTRL_SHIFT 22
1548#define OMAP4430_PMD_TRACE_MUX_CTRL_WIDTH 0x2 138#define OMAP4430_PMD_TRACE_MUX_CTRL_WIDTH 0x2
1549#define OMAP4430_PMD_TRACE_MUX_CTRL_MASK (0x3 << 22)
1550
1551/* Used by CM_DYN_DEP_PRESCAL */
1552#define OMAP4430_PRESCAL_SHIFT 0
1553#define OMAP4430_PRESCAL_WIDTH 0x6
1554#define OMAP4430_PRESCAL_MASK (0x3f << 0)
1555
1556/* Used by REVISION_CM1, REVISION_CM2 */
1557#define OMAP4430_R_RTL_SHIFT 11
1558#define OMAP4430_R_RTL_WIDTH 0x5
1559#define OMAP4430_R_RTL_MASK (0x1f << 11)
1560
1561/* Used by CM_L3INIT_USB_HOST_CLKCTRL, CM_L3INIT_USB_TLL_CLKCTRL */
1562#define OMAP4430_SAR_MODE_SHIFT 4
1563#define OMAP4430_SAR_MODE_WIDTH 0x1
1564#define OMAP4430_SAR_MODE_MASK (1 << 4)
1565
1566/* Used by CM_SCALE_FCLK */
1567#define OMAP4430_SCALE_FCLK_SHIFT 0 139#define OMAP4430_SCALE_FCLK_SHIFT 0
1568#define OMAP4430_SCALE_FCLK_WIDTH 0x1 140#define OMAP4430_SCALE_FCLK_WIDTH 0x1
1569#define OMAP4430_SCALE_FCLK_MASK (1 << 0)
1570
1571/* Used by REVISION_CM1, REVISION_CM2 */
1572#define OMAP4430_SCHEME_SHIFT 30
1573#define OMAP4430_SCHEME_WIDTH 0x2
1574#define OMAP4430_SCHEME_MASK (0x3 << 30)
1575
1576/* Used by CM_L4CFG_DYNAMICDEP */
1577#define OMAP4430_SDMA_DYNDEP_SHIFT 11
1578#define OMAP4430_SDMA_DYNDEP_WIDTH 0x1
1579#define OMAP4430_SDMA_DYNDEP_MASK (1 << 11)
1580
1581/* Used by CM_DUCATI_STATICDEP, CM_MPU_STATICDEP */
1582#define OMAP4430_SDMA_STATDEP_SHIFT 11
1583#define OMAP4430_SDMA_STATDEP_WIDTH 0x1
1584#define OMAP4430_SDMA_STATDEP_MASK (1 << 11)
1585
1586/* Used by CM_CLKSEL_ABE */
1587#define OMAP4430_SLIMBUS_CLK_GATE_SHIFT 10 141#define OMAP4430_SLIMBUS_CLK_GATE_SHIFT 10
1588#define OMAP4430_SLIMBUS_CLK_GATE_WIDTH 0x1
1589#define OMAP4430_SLIMBUS_CLK_GATE_MASK (1 << 10)
1590
1591/*
1592 * Used by CM1_ABE_AESS_CLKCTRL, CM_CAM_FDIF_CLKCTRL, CM_CAM_ISS_CLKCTRL,
1593 * CM_D2D_SAD2D_CLKCTRL, CM_DSS_DSS_CLKCTRL, CM_DUCATI_DUCATI_CLKCTRL,
1594 * CM_EMU_DEBUGSS_CLKCTRL, CM_GFX_GFX_CLKCTRL, CM_IVAHD_IVAHD_CLKCTRL,
1595 * CM_L3INIT_HSI_CLKCTRL, CM_L3INIT_MMC1_CLKCTRL, CM_L3INIT_MMC2_CLKCTRL,
1596 * CM_L3INIT_USB_HOST_CLKCTRL, CM_L3INIT_USB_HOST_FS_CLKCTRL,
1597 * CM_L3INIT_USB_OTG_CLKCTRL, CM_L4SEC_CRYPTODMA_CLKCTRL, CM_MPU_MPU_CLKCTRL,
1598 * CM_SDMA_SDMA_CLKCTRL, CM_TESLA_TESLA_CLKCTRL
1599 */
1600#define OMAP4430_STBYST_SHIFT 18
1601#define OMAP4430_STBYST_WIDTH 0x1
1602#define OMAP4430_STBYST_MASK (1 << 18)
1603
1604/*
1605 * Used by CM_IDLEST_DPLL_ABE, CM_IDLEST_DPLL_CORE, CM_IDLEST_DPLL_DDRPHY,
1606 * CM_IDLEST_DPLL_IVA, CM_IDLEST_DPLL_MPU, CM_IDLEST_DPLL_PER,
1607 * CM_IDLEST_DPLL_UNIPRO, CM_IDLEST_DPLL_USB
1608 */
1609#define OMAP4430_ST_DPLL_CLK_SHIFT 0
1610#define OMAP4430_ST_DPLL_CLK_WIDTH 0x1
1611#define OMAP4430_ST_DPLL_CLK_MASK (1 << 0) 142#define OMAP4430_ST_DPLL_CLK_MASK (1 << 0)
1612
1613/* Used by CM_CLKDCOLDO_DPLL_USB */
1614#define OMAP4430_ST_DPLL_CLKDCOLDO_SHIFT 9
1615#define OMAP4430_ST_DPLL_CLKDCOLDO_WIDTH 0x1
1616#define OMAP4430_ST_DPLL_CLKDCOLDO_MASK (1 << 9)
1617
1618/*
1619 * Used by CM_DIV_M2_DPLL_ABE, CM_DIV_M2_DPLL_CORE, CM_DIV_M2_DPLL_DDRPHY,
1620 * CM_DIV_M2_DPLL_MPU, CM_DIV_M2_DPLL_PER, CM_DIV_M2_DPLL_USB
1621 */
1622#define OMAP4430_ST_DPLL_CLKOUT_SHIFT 9
1623#define OMAP4430_ST_DPLL_CLKOUT_WIDTH 0x1
1624#define OMAP4430_ST_DPLL_CLKOUT_MASK (1 << 9)
1625
1626/* Used by CM_DIV_M3_DPLL_ABE, CM_DIV_M3_DPLL_CORE, CM_DIV_M3_DPLL_PER */
1627#define OMAP4430_ST_DPLL_CLKOUTHIF_SHIFT 9
1628#define OMAP4430_ST_DPLL_CLKOUTHIF_WIDTH 0x1
1629#define OMAP4430_ST_DPLL_CLKOUTHIF_MASK (1 << 9)
1630
1631/* Used by CM_DIV_M2_DPLL_ABE, CM_DIV_M2_DPLL_PER, CM_DIV_M2_DPLL_UNIPRO */
1632#define OMAP4430_ST_DPLL_CLKOUTX2_SHIFT 11
1633#define OMAP4430_ST_DPLL_CLKOUTX2_WIDTH 0x1
1634#define OMAP4430_ST_DPLL_CLKOUTX2_MASK (1 << 11)
1635
1636/*
1637 * Used by CM_DIV_M4_DPLL_CORE, CM_DIV_M4_DPLL_DDRPHY, CM_DIV_M4_DPLL_IVA,
1638 * CM_DIV_M4_DPLL_PER
1639 */
1640#define OMAP4430_ST_HSDIVIDER_CLKOUT1_SHIFT 9
1641#define OMAP4430_ST_HSDIVIDER_CLKOUT1_WIDTH 0x1
1642#define OMAP4430_ST_HSDIVIDER_CLKOUT1_MASK (1 << 9)
1643
1644/*
1645 * Used by CM_DIV_M5_DPLL_CORE, CM_DIV_M5_DPLL_DDRPHY, CM_DIV_M5_DPLL_IVA,
1646 * CM_DIV_M5_DPLL_PER
1647 */
1648#define OMAP4430_ST_HSDIVIDER_CLKOUT2_SHIFT 9
1649#define OMAP4430_ST_HSDIVIDER_CLKOUT2_WIDTH 0x1
1650#define OMAP4430_ST_HSDIVIDER_CLKOUT2_MASK (1 << 9)
1651
1652/* Used by CM_DIV_M6_DPLL_CORE, CM_DIV_M6_DPLL_DDRPHY, CM_DIV_M6_DPLL_PER */
1653#define OMAP4430_ST_HSDIVIDER_CLKOUT3_SHIFT 9
1654#define OMAP4430_ST_HSDIVIDER_CLKOUT3_WIDTH 0x1
1655#define OMAP4430_ST_HSDIVIDER_CLKOUT3_MASK (1 << 9)
1656
1657/* Used by CM_DIV_M7_DPLL_CORE, CM_DIV_M7_DPLL_PER */
1658#define OMAP4430_ST_HSDIVIDER_CLKOUT4_SHIFT 9
1659#define OMAP4430_ST_HSDIVIDER_CLKOUT4_WIDTH 0x1
1660#define OMAP4430_ST_HSDIVIDER_CLKOUT4_MASK (1 << 9)
1661
1662/*
1663 * Used by CM_IDLEST_DPLL_ABE, CM_IDLEST_DPLL_CORE, CM_IDLEST_DPLL_DDRPHY,
1664 * CM_IDLEST_DPLL_IVA, CM_IDLEST_DPLL_MPU, CM_IDLEST_DPLL_PER,
1665 * CM_IDLEST_DPLL_UNIPRO, CM_IDLEST_DPLL_USB
1666 */
1667#define OMAP4430_ST_MN_BYPASS_SHIFT 8
1668#define OMAP4430_ST_MN_BYPASS_WIDTH 0x1
1669#define OMAP4430_ST_MN_BYPASS_MASK (1 << 8)
1670
1671/* Used by CM_SYS_CLKSEL */
1672#define OMAP4430_SYS_CLKSEL_SHIFT 0 143#define OMAP4430_SYS_CLKSEL_SHIFT 0
1673#define OMAP4430_SYS_CLKSEL_WIDTH 0x3 144#define OMAP4430_SYS_CLKSEL_WIDTH 0x3
1674#define OMAP4430_SYS_CLKSEL_MASK (0x7 << 0)
1675
1676/* Used by CM_L4CFG_DYNAMICDEP */
1677#define OMAP4430_TESLA_DYNDEP_SHIFT 1
1678#define OMAP4430_TESLA_DYNDEP_WIDTH 0x1
1679#define OMAP4430_TESLA_DYNDEP_MASK (1 << 1)
1680
1681/* Used by CM_DUCATI_STATICDEP, CM_MPU_STATICDEP */
1682#define OMAP4430_TESLA_STATDEP_SHIFT 1 145#define OMAP4430_TESLA_STATDEP_SHIFT 1
1683#define OMAP4430_TESLA_STATDEP_WIDTH 0x1
1684#define OMAP4430_TESLA_STATDEP_MASK (1 << 1)
1685
1686/*
1687 * Used by CM_D2D_DYNAMICDEP, CM_DUCATI_DYNAMICDEP, CM_EMU_DYNAMICDEP,
1688 * CM_L3_1_DYNAMICDEP, CM_L3_2_DYNAMICDEP, CM_L4CFG_DYNAMICDEP,
1689 * CM_L4PER_DYNAMICDEP, CM_MPU_DYNAMICDEP, CM_TESLA_DYNAMICDEP
1690 */
1691#define OMAP4430_WINDOWSIZE_SHIFT 24
1692#define OMAP4430_WINDOWSIZE_WIDTH 0x4
1693#define OMAP4430_WINDOWSIZE_MASK (0xf << 24)
1694
1695/* Used by REVISION_CM1, REVISION_CM2 */
1696#define OMAP4430_X_MAJOR_SHIFT 8
1697#define OMAP4430_X_MAJOR_WIDTH 0x3
1698#define OMAP4430_X_MAJOR_MASK (0x7 << 8)
1699
1700/* Used by REVISION_CM1, REVISION_CM2 */
1701#define OMAP4430_Y_MINOR_SHIFT 0
1702#define OMAP4430_Y_MINOR_WIDTH 0x6
1703#define OMAP4430_Y_MINOR_MASK (0x3f << 0)
1704#endif 146#endif
diff --git a/arch/arm/mach-omap2/cm-regbits-54xx.h b/arch/arm/mach-omap2/cm-regbits-54xx.h
index e83b8e352b6e..896ae9fc4cfb 100644
--- a/arch/arm/mach-omap2/cm-regbits-54xx.h
+++ b/arch/arm/mach-omap2/cm-regbits-54xx.h
@@ -21,1717 +21,84 @@
21#ifndef __ARCH_ARM_MACH_OMAP2_CM_REGBITS_54XX_H 21#ifndef __ARCH_ARM_MACH_OMAP2_CM_REGBITS_54XX_H
22#define __ARCH_ARM_MACH_OMAP2_CM_REGBITS_54XX_H 22#define __ARCH_ARM_MACH_OMAP2_CM_REGBITS_54XX_H
23 23
24/* Used by CM_DSP_DYNAMICDEP, CM_L3MAIN1_DYNAMICDEP, CM_MPU_DYNAMICDEP */
25#define OMAP54XX_ABE_DYNDEP_SHIFT 3
26#define OMAP54XX_ABE_DYNDEP_WIDTH 0x1
27#define OMAP54XX_ABE_DYNDEP_MASK (1 << 3)
28
29/*
30 * Used by CM_C2C_STATICDEP, CM_DMA_STATICDEP, CM_DSP_STATICDEP,
31 * CM_IPU_STATICDEP, CM_L3INIT_STATICDEP, CM_MIPIEXT_STATICDEP, CM_MPU_STATICDEP
32 */
33#define OMAP54XX_ABE_STATDEP_SHIFT 3 24#define OMAP54XX_ABE_STATDEP_SHIFT 3
34#define OMAP54XX_ABE_STATDEP_WIDTH 0x1
35#define OMAP54XX_ABE_STATDEP_MASK (1 << 3)
36
37/*
38 * Used by CM_AUTOIDLE_DPLL_ABE, CM_AUTOIDLE_DPLL_CORE, CM_AUTOIDLE_DPLL_IVA,
39 * CM_AUTOIDLE_DPLL_MPU, CM_AUTOIDLE_DPLL_PER, CM_AUTOIDLE_DPLL_UNIPRO1,
40 * CM_AUTOIDLE_DPLL_UNIPRO2, CM_AUTOIDLE_DPLL_USB
41 */
42#define OMAP54XX_AUTO_DPLL_MODE_SHIFT 0
43#define OMAP54XX_AUTO_DPLL_MODE_WIDTH 0x3
44#define OMAP54XX_AUTO_DPLL_MODE_MASK (0x7 << 0) 25#define OMAP54XX_AUTO_DPLL_MODE_MASK (0x7 << 0)
45
46/* Used by CM_L3MAIN2_DYNAMICDEP, CM_L4CFG_DYNAMICDEP */
47#define OMAP54XX_C2C_DYNDEP_SHIFT 18
48#define OMAP54XX_C2C_DYNDEP_WIDTH 0x1
49#define OMAP54XX_C2C_DYNDEP_MASK (1 << 18)
50
51/* Used by CM_MPU_STATICDEP */
52#define OMAP54XX_C2C_STATDEP_SHIFT 18
53#define OMAP54XX_C2C_STATDEP_WIDTH 0x1
54#define OMAP54XX_C2C_STATDEP_MASK (1 << 18)
55
56/* Used by CM_IPU_DYNAMICDEP, CM_L3MAIN2_DYNAMICDEP, CM_L4CFG_DYNAMICDEP */
57#define OMAP54XX_CAM_DYNDEP_SHIFT 9
58#define OMAP54XX_CAM_DYNDEP_WIDTH 0x1
59#define OMAP54XX_CAM_DYNDEP_MASK (1 << 9)
60
61/*
62 * Used by CM_DMA_STATICDEP, CM_DSP_STATICDEP, CM_IPU_STATICDEP,
63 * CM_MPU_STATICDEP
64 */
65#define OMAP54XX_CAM_STATDEP_SHIFT 9
66#define OMAP54XX_CAM_STATDEP_WIDTH 0x1
67#define OMAP54XX_CAM_STATDEP_MASK (1 << 9)
68
69/* Used by CM_ABE_CLKSTCTRL */
70#define OMAP54XX_CLKACTIVITY_ABE_24M_GFCLK_SHIFT 13
71#define OMAP54XX_CLKACTIVITY_ABE_24M_GFCLK_WIDTH 0x1
72#define OMAP54XX_CLKACTIVITY_ABE_24M_GFCLK_MASK (1 << 13)
73
74/* Used by CM_ABE_CLKSTCTRL */
75#define OMAP54XX_CLKACTIVITY_ABE_32K_CLK_SHIFT 12
76#define OMAP54XX_CLKACTIVITY_ABE_32K_CLK_WIDTH 0x1
77#define OMAP54XX_CLKACTIVITY_ABE_32K_CLK_MASK (1 << 12)
78
79/* Used by CM_ABE_CLKSTCTRL */
80#define OMAP54XX_CLKACTIVITY_ABE_GICLK_SHIFT 9
81#define OMAP54XX_CLKACTIVITY_ABE_GICLK_WIDTH 0x1
82#define OMAP54XX_CLKACTIVITY_ABE_GICLK_MASK (1 << 9)
83
84/* Used by CM_WKUPAON_CLKSTCTRL */
85#define OMAP54XX_CLKACTIVITY_ABE_LP_CLK_SHIFT 9
86#define OMAP54XX_CLKACTIVITY_ABE_LP_CLK_WIDTH 0x1
87#define OMAP54XX_CLKACTIVITY_ABE_LP_CLK_MASK (1 << 9)
88
89/* Used by CM_ABE_CLKSTCTRL */
90#define OMAP54XX_CLKACTIVITY_ABE_SYS_CLK_SHIFT 11
91#define OMAP54XX_CLKACTIVITY_ABE_SYS_CLK_WIDTH 0x1
92#define OMAP54XX_CLKACTIVITY_ABE_SYS_CLK_MASK (1 << 11)
93
94/* Used by CM_ABE_CLKSTCTRL */
95#define OMAP54XX_CLKACTIVITY_ABE_X2_CLK_SHIFT 8
96#define OMAP54XX_CLKACTIVITY_ABE_X2_CLK_WIDTH 0x1
97#define OMAP54XX_CLKACTIVITY_ABE_X2_CLK_MASK (1 << 8)
98
99/* Used by CM_DSS_CLKSTCTRL */
100#define OMAP54XX_CLKACTIVITY_BB2D_GFCLK_SHIFT 13
101#define OMAP54XX_CLKACTIVITY_BB2D_GFCLK_WIDTH 0x1
102#define OMAP54XX_CLKACTIVITY_BB2D_GFCLK_MASK (1 << 13)
103
104/* Used by CM_C2C_CLKSTCTRL */
105#define OMAP54XX_CLKACTIVITY_C2C_GFCLK_SHIFT 9
106#define OMAP54XX_CLKACTIVITY_C2C_GFCLK_WIDTH 0x1
107#define OMAP54XX_CLKACTIVITY_C2C_GFCLK_MASK (1 << 9)
108
109/* Used by CM_C2C_CLKSTCTRL */
110#define OMAP54XX_CLKACTIVITY_C2C_GICLK_SHIFT 10
111#define OMAP54XX_CLKACTIVITY_C2C_GICLK_WIDTH 0x1
112#define OMAP54XX_CLKACTIVITY_C2C_GICLK_MASK (1 << 10)
113
114/* Used by CM_C2C_CLKSTCTRL */
115#define OMAP54XX_CLKACTIVITY_C2C_L4_GICLK_SHIFT 8
116#define OMAP54XX_CLKACTIVITY_C2C_L4_GICLK_WIDTH 0x1
117#define OMAP54XX_CLKACTIVITY_C2C_L4_GICLK_MASK (1 << 8)
118
119/* Used by CM_CAM_CLKSTCTRL */
120#define OMAP54XX_CLKACTIVITY_CAM_BOOST_GCLK_SHIFT 11
121#define OMAP54XX_CLKACTIVITY_CAM_BOOST_GCLK_WIDTH 0x1
122#define OMAP54XX_CLKACTIVITY_CAM_BOOST_GCLK_MASK (1 << 11)
123
124/* Used by CM_CAM_CLKSTCTRL */
125#define OMAP54XX_CLKACTIVITY_CAM_GCLK_SHIFT 8
126#define OMAP54XX_CLKACTIVITY_CAM_GCLK_WIDTH 0x1
127#define OMAP54XX_CLKACTIVITY_CAM_GCLK_MASK (1 << 8)
128
129/* Used by CM_CAM_CLKSTCTRL */
130#define OMAP54XX_CLKACTIVITY_CAM_L3_GICLK_SHIFT 12
131#define OMAP54XX_CLKACTIVITY_CAM_L3_GICLK_WIDTH 0x1
132#define OMAP54XX_CLKACTIVITY_CAM_L3_GICLK_MASK (1 << 12)
133
134/* Used by CM_COREAON_CLKSTCTRL */
135#define OMAP54XX_CLKACTIVITY_COREAON_32K_GFCLK_SHIFT 12
136#define OMAP54XX_CLKACTIVITY_COREAON_32K_GFCLK_WIDTH 0x1
137#define OMAP54XX_CLKACTIVITY_COREAON_32K_GFCLK_MASK (1 << 12)
138
139/* Used by CM_COREAON_CLKSTCTRL */
140#define OMAP54XX_CLKACTIVITY_COREAON_IO_SRCOMP_GFCLK_SHIFT 14
141#define OMAP54XX_CLKACTIVITY_COREAON_IO_SRCOMP_GFCLK_WIDTH 0x1
142#define OMAP54XX_CLKACTIVITY_COREAON_IO_SRCOMP_GFCLK_MASK (1 << 14)
143
144/* Used by CM_COREAON_CLKSTCTRL */
145#define OMAP54XX_CLKACTIVITY_COREAON_L4_GICLK_SHIFT 8
146#define OMAP54XX_CLKACTIVITY_COREAON_L4_GICLK_WIDTH 0x1
147#define OMAP54XX_CLKACTIVITY_COREAON_L4_GICLK_MASK (1 << 8)
148
149/* Used by CM_CAM_CLKSTCTRL */
150#define OMAP54XX_CLKACTIVITY_CSI_PHY_GFCLK_SHIFT 9
151#define OMAP54XX_CLKACTIVITY_CSI_PHY_GFCLK_WIDTH 0x1
152#define OMAP54XX_CLKACTIVITY_CSI_PHY_GFCLK_MASK (1 << 9)
153
154/* Used by CM_CUSTEFUSE_CLKSTCTRL */
155#define OMAP54XX_CLKACTIVITY_CUSTEFUSE_L4_GICLK_SHIFT 8
156#define OMAP54XX_CLKACTIVITY_CUSTEFUSE_L4_GICLK_WIDTH 0x1
157#define OMAP54XX_CLKACTIVITY_CUSTEFUSE_L4_GICLK_MASK (1 << 8)
158
159/* Used by CM_CUSTEFUSE_CLKSTCTRL */
160#define OMAP54XX_CLKACTIVITY_CUSTEFUSE_SYS_GFCLK_SHIFT 9
161#define OMAP54XX_CLKACTIVITY_CUSTEFUSE_SYS_GFCLK_WIDTH 0x1
162#define OMAP54XX_CLKACTIVITY_CUSTEFUSE_SYS_GFCLK_MASK (1 << 9)
163
164/* Used by CM_EMIF_CLKSTCTRL */
165#define OMAP54XX_CLKACTIVITY_DLL_GCLK_SHIFT 9
166#define OMAP54XX_CLKACTIVITY_DLL_GCLK_WIDTH 0x1
167#define OMAP54XX_CLKACTIVITY_DLL_GCLK_MASK (1 << 9)
168
169/* Used by CM_DMA_CLKSTCTRL */
170#define OMAP54XX_CLKACTIVITY_DMA_L3_GICLK_SHIFT 8
171#define OMAP54XX_CLKACTIVITY_DMA_L3_GICLK_WIDTH 0x1
172#define OMAP54XX_CLKACTIVITY_DMA_L3_GICLK_MASK (1 << 8)
173
174/* Used by CM_DSP_CLKSTCTRL */
175#define OMAP54XX_CLKACTIVITY_DSP_GCLK_SHIFT 8
176#define OMAP54XX_CLKACTIVITY_DSP_GCLK_WIDTH 0x1
177#define OMAP54XX_CLKACTIVITY_DSP_GCLK_MASK (1 << 8)
178
179/* Used by CM_DSS_CLKSTCTRL */
180#define OMAP54XX_CLKACTIVITY_DSS_GFCLK_SHIFT 9
181#define OMAP54XX_CLKACTIVITY_DSS_GFCLK_WIDTH 0x1
182#define OMAP54XX_CLKACTIVITY_DSS_GFCLK_MASK (1 << 9)
183
184/* Used by CM_DSS_CLKSTCTRL */
185#define OMAP54XX_CLKACTIVITY_DSS_L3_GICLK_SHIFT 8
186#define OMAP54XX_CLKACTIVITY_DSS_L3_GICLK_WIDTH 0x1
187#define OMAP54XX_CLKACTIVITY_DSS_L3_GICLK_MASK (1 << 8)
188
189/* Used by CM_DSS_CLKSTCTRL */
190#define OMAP54XX_CLKACTIVITY_DSS_SYS_GFCLK_SHIFT 10
191#define OMAP54XX_CLKACTIVITY_DSS_SYS_GFCLK_WIDTH 0x1
192#define OMAP54XX_CLKACTIVITY_DSS_SYS_GFCLK_MASK (1 << 10)
193
194/* Used by CM_EMIF_CLKSTCTRL */
195#define OMAP54XX_CLKACTIVITY_EMIF_L3_GICLK_SHIFT 8
196#define OMAP54XX_CLKACTIVITY_EMIF_L3_GICLK_WIDTH 0x1
197#define OMAP54XX_CLKACTIVITY_EMIF_L3_GICLK_MASK (1 << 8)
198
199/* Used by CM_EMIF_CLKSTCTRL */
200#define OMAP54XX_CLKACTIVITY_EMIF_LL_GCLK_SHIFT 11
201#define OMAP54XX_CLKACTIVITY_EMIF_LL_GCLK_WIDTH 0x1
202#define OMAP54XX_CLKACTIVITY_EMIF_LL_GCLK_MASK (1 << 11)
203
204/* Used by CM_EMIF_CLKSTCTRL */
205#define OMAP54XX_CLKACTIVITY_EMIF_PHY_GCLK_SHIFT 10
206#define OMAP54XX_CLKACTIVITY_EMIF_PHY_GCLK_WIDTH 0x1
207#define OMAP54XX_CLKACTIVITY_EMIF_PHY_GCLK_MASK (1 << 10)
208
209/* Used by CM_EMU_CLKSTCTRL */
210#define OMAP54XX_CLKACTIVITY_EMU_SYS_GCLK_SHIFT 8
211#define OMAP54XX_CLKACTIVITY_EMU_SYS_GCLK_WIDTH 0x1
212#define OMAP54XX_CLKACTIVITY_EMU_SYS_GCLK_MASK (1 << 8)
213
214/* Used by CM_CAM_CLKSTCTRL */
215#define OMAP54XX_CLKACTIVITY_FDIF_GCLK_SHIFT 10
216#define OMAP54XX_CLKACTIVITY_FDIF_GCLK_WIDTH 0x1
217#define OMAP54XX_CLKACTIVITY_FDIF_GCLK_MASK (1 << 10)
218
219/* Used by CM_ABE_CLKSTCTRL */
220#define OMAP54XX_CLKACTIVITY_FUNC_24M_GFCLK_SHIFT 10
221#define OMAP54XX_CLKACTIVITY_FUNC_24M_GFCLK_WIDTH 0x1
222#define OMAP54XX_CLKACTIVITY_FUNC_24M_GFCLK_MASK (1 << 10)
223
224/* Used by CM_GPU_CLKSTCTRL */
225#define OMAP54XX_CLKACTIVITY_GPU_CORE_GCLK_SHIFT 9
226#define OMAP54XX_CLKACTIVITY_GPU_CORE_GCLK_WIDTH 0x1
227#define OMAP54XX_CLKACTIVITY_GPU_CORE_GCLK_MASK (1 << 9)
228
229/* Used by CM_GPU_CLKSTCTRL */
230#define OMAP54XX_CLKACTIVITY_GPU_HYD_GCLK_SHIFT 10
231#define OMAP54XX_CLKACTIVITY_GPU_HYD_GCLK_WIDTH 0x1
232#define OMAP54XX_CLKACTIVITY_GPU_HYD_GCLK_MASK (1 << 10)
233
234/* Used by CM_GPU_CLKSTCTRL */
235#define OMAP54XX_CLKACTIVITY_GPU_SYS_GCLK_SHIFT 8
236#define OMAP54XX_CLKACTIVITY_GPU_SYS_GCLK_WIDTH 0x1
237#define OMAP54XX_CLKACTIVITY_GPU_SYS_GCLK_MASK (1 << 8)
238
239/* Used by CM_DSS_CLKSTCTRL */
240#define OMAP54XX_CLKACTIVITY_HDMI_CEC_GFCLK_SHIFT 12
241#define OMAP54XX_CLKACTIVITY_HDMI_CEC_GFCLK_WIDTH 0x1
242#define OMAP54XX_CLKACTIVITY_HDMI_CEC_GFCLK_MASK (1 << 12)
243
244/* Used by CM_DSS_CLKSTCTRL */
245#define OMAP54XX_CLKACTIVITY_HDMI_PHY_GFCLK_SHIFT 11
246#define OMAP54XX_CLKACTIVITY_HDMI_PHY_GFCLK_WIDTH 0x1
247#define OMAP54XX_CLKACTIVITY_HDMI_PHY_GFCLK_MASK (1 << 11)
248
249/* Used by CM_L3INIT_CLKSTCTRL */
250#define OMAP54XX_CLKACTIVITY_HSIC_P1_480M_GFCLK_SHIFT 20
251#define OMAP54XX_CLKACTIVITY_HSIC_P1_480M_GFCLK_WIDTH 0x1
252#define OMAP54XX_CLKACTIVITY_HSIC_P1_480M_GFCLK_MASK (1 << 20)
253
254/* Used by CM_L3INIT_CLKSTCTRL */
255#define OMAP54XX_CLKACTIVITY_HSIC_P1_GFCLK_SHIFT 26
256#define OMAP54XX_CLKACTIVITY_HSIC_P1_GFCLK_WIDTH 0x1
257#define OMAP54XX_CLKACTIVITY_HSIC_P1_GFCLK_MASK (1 << 26)
258
259/* Used by CM_L3INIT_CLKSTCTRL */
260#define OMAP54XX_CLKACTIVITY_HSIC_P2_480M_GFCLK_SHIFT 21
261#define OMAP54XX_CLKACTIVITY_HSIC_P2_480M_GFCLK_WIDTH 0x1
262#define OMAP54XX_CLKACTIVITY_HSIC_P2_480M_GFCLK_MASK (1 << 21)
263
264/* Used by CM_L3INIT_CLKSTCTRL */
265#define OMAP54XX_CLKACTIVITY_HSIC_P2_GFCLK_SHIFT 27
266#define OMAP54XX_CLKACTIVITY_HSIC_P2_GFCLK_WIDTH 0x1
267#define OMAP54XX_CLKACTIVITY_HSIC_P2_GFCLK_MASK (1 << 27)
268
269/* Used by CM_L3INIT_CLKSTCTRL */
270#define OMAP54XX_CLKACTIVITY_HSIC_P3_480M_GFCLK_SHIFT 6
271#define OMAP54XX_CLKACTIVITY_HSIC_P3_480M_GFCLK_WIDTH 0x1
272#define OMAP54XX_CLKACTIVITY_HSIC_P3_480M_GFCLK_MASK (1 << 6)
273
274/* Used by CM_L3INIT_CLKSTCTRL */
275#define OMAP54XX_CLKACTIVITY_HSIC_P3_GFCLK_SHIFT 7
276#define OMAP54XX_CLKACTIVITY_HSIC_P3_GFCLK_WIDTH 0x1
277#define OMAP54XX_CLKACTIVITY_HSIC_P3_GFCLK_MASK (1 << 7)
278
279/* Used by CM_L3INIT_CLKSTCTRL */
280#define OMAP54XX_CLKACTIVITY_HSI_GFCLK_SHIFT 16
281#define OMAP54XX_CLKACTIVITY_HSI_GFCLK_WIDTH 0x1
282#define OMAP54XX_CLKACTIVITY_HSI_GFCLK_MASK (1 << 16)
283
284/* Used by CM_IPU_CLKSTCTRL */
285#define OMAP54XX_CLKACTIVITY_IPU_GCLK_SHIFT 8
286#define OMAP54XX_CLKACTIVITY_IPU_GCLK_WIDTH 0x1
287#define OMAP54XX_CLKACTIVITY_IPU_GCLK_MASK (1 << 8)
288
289/* Used by CM_IVA_CLKSTCTRL */
290#define OMAP54XX_CLKACTIVITY_IVA_GCLK_SHIFT 8
291#define OMAP54XX_CLKACTIVITY_IVA_GCLK_WIDTH 0x1
292#define OMAP54XX_CLKACTIVITY_IVA_GCLK_MASK (1 << 8)
293
294/* Used by CM_L3INIT_CLKSTCTRL */
295#define OMAP54XX_CLKACTIVITY_L3INIT_48M_GFCLK_SHIFT 12
296#define OMAP54XX_CLKACTIVITY_L3INIT_48M_GFCLK_WIDTH 0x1
297#define OMAP54XX_CLKACTIVITY_L3INIT_48M_GFCLK_MASK (1 << 12)
298
299/* Used by CM_L3INIT_CLKSTCTRL */
300#define OMAP54XX_CLKACTIVITY_L3INIT_60M_P1_GFCLK_SHIFT 28
301#define OMAP54XX_CLKACTIVITY_L3INIT_60M_P1_GFCLK_WIDTH 0x1
302#define OMAP54XX_CLKACTIVITY_L3INIT_60M_P1_GFCLK_MASK (1 << 28)
303
304/* Used by CM_L3INIT_CLKSTCTRL */
305#define OMAP54XX_CLKACTIVITY_L3INIT_60M_P2_GFCLK_SHIFT 29
306#define OMAP54XX_CLKACTIVITY_L3INIT_60M_P2_GFCLK_WIDTH 0x1
307#define OMAP54XX_CLKACTIVITY_L3INIT_60M_P2_GFCLK_MASK (1 << 29)
308
309/* Used by CM_L3INIT_CLKSTCTRL */
310#define OMAP54XX_CLKACTIVITY_L3INIT_L3_GICLK_SHIFT 8
311#define OMAP54XX_CLKACTIVITY_L3INIT_L3_GICLK_WIDTH 0x1
312#define OMAP54XX_CLKACTIVITY_L3INIT_L3_GICLK_MASK (1 << 8)
313
314/* Used by CM_L3INIT_CLKSTCTRL */
315#define OMAP54XX_CLKACTIVITY_L3INIT_L4_GICLK_SHIFT 9
316#define OMAP54XX_CLKACTIVITY_L3INIT_L4_GICLK_WIDTH 0x1
317#define OMAP54XX_CLKACTIVITY_L3INIT_L4_GICLK_MASK (1 << 9)
318
319/* Used by CM_L3INIT_CLKSTCTRL */
320#define OMAP54XX_CLKACTIVITY_L3INIT_USB_OTG_SS_LFPS_TX_GFCLK_SHIFT 11
321#define OMAP54XX_CLKACTIVITY_L3INIT_USB_OTG_SS_LFPS_TX_GFCLK_WIDTH 0x1
322#define OMAP54XX_CLKACTIVITY_L3INIT_USB_OTG_SS_LFPS_TX_GFCLK_MASK (1 << 11)
323
324/* Used by CM_L3INSTR_CLKSTCTRL */
325#define OMAP54XX_CLKACTIVITY_L3INSTR_DLL_AGING_GCLK_SHIFT 9
326#define OMAP54XX_CLKACTIVITY_L3INSTR_DLL_AGING_GCLK_WIDTH 0x1
327#define OMAP54XX_CLKACTIVITY_L3INSTR_DLL_AGING_GCLK_MASK (1 << 9)
328
329/* Used by CM_L3INSTR_CLKSTCTRL */
330#define OMAP54XX_CLKACTIVITY_L3INSTR_L3_GICLK_SHIFT 8
331#define OMAP54XX_CLKACTIVITY_L3INSTR_L3_GICLK_WIDTH 0x1
332#define OMAP54XX_CLKACTIVITY_L3INSTR_L3_GICLK_MASK (1 << 8)
333
334/* Used by CM_L3INSTR_CLKSTCTRL */
335#define OMAP54XX_CLKACTIVITY_L3INSTR_TS_GCLK_SHIFT 10
336#define OMAP54XX_CLKACTIVITY_L3INSTR_TS_GCLK_WIDTH 0x1
337#define OMAP54XX_CLKACTIVITY_L3INSTR_TS_GCLK_MASK (1 << 10)
338
339/* Used by CM_L3MAIN1_CLKSTCTRL */
340#define OMAP54XX_CLKACTIVITY_L3MAIN1_L3_GICLK_SHIFT 8
341#define OMAP54XX_CLKACTIVITY_L3MAIN1_L3_GICLK_WIDTH 0x1
342#define OMAP54XX_CLKACTIVITY_L3MAIN1_L3_GICLK_MASK (1 << 8)
343
344/* Used by CM_L3MAIN2_CLKSTCTRL */
345#define OMAP54XX_CLKACTIVITY_L3MAIN2_L3_GICLK_SHIFT 8
346#define OMAP54XX_CLKACTIVITY_L3MAIN2_L3_GICLK_WIDTH 0x1
347#define OMAP54XX_CLKACTIVITY_L3MAIN2_L3_GICLK_MASK (1 << 8)
348
349/* Used by CM_L4CFG_CLKSTCTRL */
350#define OMAP54XX_CLKACTIVITY_L4CFG_L4_GICLK_SHIFT 8
351#define OMAP54XX_CLKACTIVITY_L4CFG_L4_GICLK_WIDTH 0x1
352#define OMAP54XX_CLKACTIVITY_L4CFG_L4_GICLK_MASK (1 << 8)
353
354/* Used by CM_L4PER_CLKSTCTRL */
355#define OMAP54XX_CLKACTIVITY_L4PER_L4_GICLK_SHIFT 8
356#define OMAP54XX_CLKACTIVITY_L4PER_L4_GICLK_WIDTH 0x1
357#define OMAP54XX_CLKACTIVITY_L4PER_L4_GICLK_MASK (1 << 8)
358
359/* Used by CM_L4SEC_CLKSTCTRL */
360#define OMAP54XX_CLKACTIVITY_L4SEC_L3_GICLK_SHIFT 8
361#define OMAP54XX_CLKACTIVITY_L4SEC_L3_GICLK_WIDTH 0x1
362#define OMAP54XX_CLKACTIVITY_L4SEC_L3_GICLK_MASK (1 << 8)
363
364/* Used by CM_L4SEC_CLKSTCTRL */
365#define OMAP54XX_CLKACTIVITY_L4SEC_L4_GICLK_SHIFT 9
366#define OMAP54XX_CLKACTIVITY_L4SEC_L4_GICLK_WIDTH 0x1
367#define OMAP54XX_CLKACTIVITY_L4SEC_L4_GICLK_MASK (1 << 9)
368
369/* Used by CM_MIPIEXT_CLKSTCTRL */
370#define OMAP54XX_CLKACTIVITY_MIPIEXT_L3_GICLK_SHIFT 8
371#define OMAP54XX_CLKACTIVITY_MIPIEXT_L3_GICLK_WIDTH 0x1
372#define OMAP54XX_CLKACTIVITY_MIPIEXT_L3_GICLK_MASK (1 << 8)
373
374/* Used by CM_MIPIEXT_CLKSTCTRL */
375#define OMAP54XX_CLKACTIVITY_MIPIEXT_PHY_REF_GFCLK_SHIFT 11
376#define OMAP54XX_CLKACTIVITY_MIPIEXT_PHY_REF_GFCLK_WIDTH 0x1
377#define OMAP54XX_CLKACTIVITY_MIPIEXT_PHY_REF_GFCLK_MASK (1 << 11)
378
379/* Used by CM_L3INIT_CLKSTCTRL */
380#define OMAP54XX_CLKACTIVITY_MMC1_32K_GFCLK_SHIFT 2
381#define OMAP54XX_CLKACTIVITY_MMC1_32K_GFCLK_WIDTH 0x1
382#define OMAP54XX_CLKACTIVITY_MMC1_32K_GFCLK_MASK (1 << 2)
383
384/* Used by CM_L3INIT_CLKSTCTRL */
385#define OMAP54XX_CLKACTIVITY_MMC1_GFCLK_SHIFT 17
386#define OMAP54XX_CLKACTIVITY_MMC1_GFCLK_WIDTH 0x1
387#define OMAP54XX_CLKACTIVITY_MMC1_GFCLK_MASK (1 << 17)
388
389/* Used by CM_L3INIT_CLKSTCTRL */
390#define OMAP54XX_CLKACTIVITY_MMC2_GFCLK_SHIFT 18
391#define OMAP54XX_CLKACTIVITY_MMC2_GFCLK_WIDTH 0x1
392#define OMAP54XX_CLKACTIVITY_MMC2_GFCLK_MASK (1 << 18)
393
394/* Used by CM_MPU_CLKSTCTRL */
395#define OMAP54XX_CLKACTIVITY_MPU_GCLK_SHIFT 8
396#define OMAP54XX_CLKACTIVITY_MPU_GCLK_WIDTH 0x1
397#define OMAP54XX_CLKACTIVITY_MPU_GCLK_MASK (1 << 8)
398
399/* Used by CM_ABE_CLKSTCTRL */
400#define OMAP54XX_CLKACTIVITY_PAD_CLKS_SHIFT 14
401#define OMAP54XX_CLKACTIVITY_PAD_CLKS_WIDTH 0x1
402#define OMAP54XX_CLKACTIVITY_PAD_CLKS_MASK (1 << 14)
403
404/* Used by CM_ABE_CLKSTCTRL */
405#define OMAP54XX_CLKACTIVITY_PAD_SLIMBUS1_CLK_SHIFT 15
406#define OMAP54XX_CLKACTIVITY_PAD_SLIMBUS1_CLK_WIDTH 0x1
407#define OMAP54XX_CLKACTIVITY_PAD_SLIMBUS1_CLK_MASK (1 << 15)
408
409/* Used by CM_L3INIT_CLKSTCTRL */
410#define OMAP54XX_CLKACTIVITY_PAD_XCLK60MHSP1_SHIFT 3
411#define OMAP54XX_CLKACTIVITY_PAD_XCLK60MHSP1_WIDTH 0x1
412#define OMAP54XX_CLKACTIVITY_PAD_XCLK60MHSP1_MASK (1 << 3)
413
414/* Used by CM_L3INIT_CLKSTCTRL */
415#define OMAP54XX_CLKACTIVITY_PAD_XCLK60MHSP2_SHIFT 4
416#define OMAP54XX_CLKACTIVITY_PAD_XCLK60MHSP2_WIDTH 0x1
417#define OMAP54XX_CLKACTIVITY_PAD_XCLK60MHSP2_MASK (1 << 4)
418
419/* Used by CM_L4PER_CLKSTCTRL */
420#define OMAP54XX_CLKACTIVITY_PER_12M_GFCLK_SHIFT 15
421#define OMAP54XX_CLKACTIVITY_PER_12M_GFCLK_WIDTH 0x1
422#define OMAP54XX_CLKACTIVITY_PER_12M_GFCLK_MASK (1 << 15)
423
424/* Used by CM_L4PER_CLKSTCTRL */
425#define OMAP54XX_CLKACTIVITY_PER_32K_GFCLK_SHIFT 17
426#define OMAP54XX_CLKACTIVITY_PER_32K_GFCLK_WIDTH 0x1
427#define OMAP54XX_CLKACTIVITY_PER_32K_GFCLK_MASK (1 << 17)
428
429/* Used by CM_L4PER_CLKSTCTRL */
430#define OMAP54XX_CLKACTIVITY_PER_48M_GFCLK_SHIFT 18
431#define OMAP54XX_CLKACTIVITY_PER_48M_GFCLK_WIDTH 0x1
432#define OMAP54XX_CLKACTIVITY_PER_48M_GFCLK_MASK (1 << 18)
433
434/* Used by CM_L4PER_CLKSTCTRL */
435#define OMAP54XX_CLKACTIVITY_PER_96M_GFCLK_SHIFT 19
436#define OMAP54XX_CLKACTIVITY_PER_96M_GFCLK_WIDTH 0x1
437#define OMAP54XX_CLKACTIVITY_PER_96M_GFCLK_MASK (1 << 19)
438
439/* Used by CM_L3INIT_CLKSTCTRL */
440#define OMAP54XX_CLKACTIVITY_SATA_REF_GFCLK_SHIFT 19
441#define OMAP54XX_CLKACTIVITY_SATA_REF_GFCLK_WIDTH 0x1
442#define OMAP54XX_CLKACTIVITY_SATA_REF_GFCLK_MASK (1 << 19)
443
444/* Used by CM_COREAON_CLKSTCTRL */
445#define OMAP54XX_CLKACTIVITY_SR_CORE_SYS_GFCLK_SHIFT 11
446#define OMAP54XX_CLKACTIVITY_SR_CORE_SYS_GFCLK_WIDTH 0x1
447#define OMAP54XX_CLKACTIVITY_SR_CORE_SYS_GFCLK_MASK (1 << 11)
448
449/* Used by CM_COREAON_CLKSTCTRL */
450#define OMAP54XX_CLKACTIVITY_SR_MM_SYS_GFCLK_SHIFT 10
451#define OMAP54XX_CLKACTIVITY_SR_MM_SYS_GFCLK_WIDTH 0x1
452#define OMAP54XX_CLKACTIVITY_SR_MM_SYS_GFCLK_MASK (1 << 10)
453
454/* Used by CM_COREAON_CLKSTCTRL */
455#define OMAP54XX_CLKACTIVITY_SR_MPU_SYS_GFCLK_SHIFT 9
456#define OMAP54XX_CLKACTIVITY_SR_MPU_SYS_GFCLK_WIDTH 0x1
457#define OMAP54XX_CLKACTIVITY_SR_MPU_SYS_GFCLK_MASK (1 << 9)
458
459/* Used by CM_WKUPAON_CLKSTCTRL */
460#define OMAP54XX_CLKACTIVITY_SYS_CLK_SHIFT 8
461#define OMAP54XX_CLKACTIVITY_SYS_CLK_WIDTH 0x1
462#define OMAP54XX_CLKACTIVITY_SYS_CLK_MASK (1 << 8)
463
464/* Used by CM_WKUPAON_CLKSTCTRL */
465#define OMAP54XX_CLKACTIVITY_SYS_CLK_ALL_SHIFT 15
466#define OMAP54XX_CLKACTIVITY_SYS_CLK_ALL_WIDTH 0x1
467#define OMAP54XX_CLKACTIVITY_SYS_CLK_ALL_MASK (1 << 15)
468
469/* Used by CM_WKUPAON_CLKSTCTRL */
470#define OMAP54XX_CLKACTIVITY_SYS_CLK_FUNC_SHIFT 14
471#define OMAP54XX_CLKACTIVITY_SYS_CLK_FUNC_WIDTH 0x1
472#define OMAP54XX_CLKACTIVITY_SYS_CLK_FUNC_MASK (1 << 14)
473
474/* Used by CM_L4PER_CLKSTCTRL */
475#define OMAP54XX_CLKACTIVITY_TIMER10_GFCLK_SHIFT 9
476#define OMAP54XX_CLKACTIVITY_TIMER10_GFCLK_WIDTH 0x1
477#define OMAP54XX_CLKACTIVITY_TIMER10_GFCLK_MASK (1 << 9)
478
479/* Used by CM_L4PER_CLKSTCTRL */
480#define OMAP54XX_CLKACTIVITY_TIMER11_GFCLK_SHIFT 10
481#define OMAP54XX_CLKACTIVITY_TIMER11_GFCLK_WIDTH 0x1
482#define OMAP54XX_CLKACTIVITY_TIMER11_GFCLK_MASK (1 << 10)
483
484/* Used by CM_L4PER_CLKSTCTRL */
485#define OMAP54XX_CLKACTIVITY_TIMER2_GFCLK_SHIFT 11
486#define OMAP54XX_CLKACTIVITY_TIMER2_GFCLK_WIDTH 0x1
487#define OMAP54XX_CLKACTIVITY_TIMER2_GFCLK_MASK (1 << 11)
488
489/* Used by CM_L4PER_CLKSTCTRL */
490#define OMAP54XX_CLKACTIVITY_TIMER3_GFCLK_SHIFT 12
491#define OMAP54XX_CLKACTIVITY_TIMER3_GFCLK_WIDTH 0x1
492#define OMAP54XX_CLKACTIVITY_TIMER3_GFCLK_MASK (1 << 12)
493
494/* Used by CM_L4PER_CLKSTCTRL */
495#define OMAP54XX_CLKACTIVITY_TIMER4_GFCLK_SHIFT 13
496#define OMAP54XX_CLKACTIVITY_TIMER4_GFCLK_WIDTH 0x1
497#define OMAP54XX_CLKACTIVITY_TIMER4_GFCLK_MASK (1 << 13)
498
499/* Used by CM_L4PER_CLKSTCTRL */
500#define OMAP54XX_CLKACTIVITY_TIMER9_GFCLK_SHIFT 14
501#define OMAP54XX_CLKACTIVITY_TIMER9_GFCLK_WIDTH 0x1
502#define OMAP54XX_CLKACTIVITY_TIMER9_GFCLK_MASK (1 << 14)
503
504/* Used by CM_L3INIT_CLKSTCTRL */
505#define OMAP54XX_CLKACTIVITY_TLL_CH0_GFCLK_SHIFT 22
506#define OMAP54XX_CLKACTIVITY_TLL_CH0_GFCLK_WIDTH 0x1
507#define OMAP54XX_CLKACTIVITY_TLL_CH0_GFCLK_MASK (1 << 22)
508
509/* Used by CM_L3INIT_CLKSTCTRL */
510#define OMAP54XX_CLKACTIVITY_TLL_CH1_GFCLK_SHIFT 23
511#define OMAP54XX_CLKACTIVITY_TLL_CH1_GFCLK_WIDTH 0x1
512#define OMAP54XX_CLKACTIVITY_TLL_CH1_GFCLK_MASK (1 << 23)
513
514/* Used by CM_L3INIT_CLKSTCTRL */
515#define OMAP54XX_CLKACTIVITY_TLL_CH2_GFCLK_SHIFT 24
516#define OMAP54XX_CLKACTIVITY_TLL_CH2_GFCLK_WIDTH 0x1
517#define OMAP54XX_CLKACTIVITY_TLL_CH2_GFCLK_MASK (1 << 24)
518
519/* Used by CM_MIPIEXT_CLKSTCTRL */
520#define OMAP54XX_CLKACTIVITY_UNIPRO1_DPLL_CLK_SHIFT 10
521#define OMAP54XX_CLKACTIVITY_UNIPRO1_DPLL_CLK_WIDTH 0x1
522#define OMAP54XX_CLKACTIVITY_UNIPRO1_DPLL_CLK_MASK (1 << 10)
523
524/* Used by CM_MIPIEXT_CLKSTCTRL */
525#define OMAP54XX_CLKACTIVITY_UNIPRO1_PHY_GFCLK_SHIFT 13
526#define OMAP54XX_CLKACTIVITY_UNIPRO1_PHY_GFCLK_WIDTH 0x1
527#define OMAP54XX_CLKACTIVITY_UNIPRO1_PHY_GFCLK_MASK (1 << 13)
528
529/* Used by CM_MIPIEXT_CLKSTCTRL */
530#define OMAP54XX_CLKACTIVITY_UNIPRO1_TXPHY_LS_GFCLK_SHIFT 12
531#define OMAP54XX_CLKACTIVITY_UNIPRO1_TXPHY_LS_GFCLK_WIDTH 0x1
532#define OMAP54XX_CLKACTIVITY_UNIPRO1_TXPHY_LS_GFCLK_MASK (1 << 12)
533
534/* Used by CM_L3INIT_CLKSTCTRL */
535#define OMAP54XX_CLKACTIVITY_UNIPRO2_DPLL_CLK_SHIFT 10
536#define OMAP54XX_CLKACTIVITY_UNIPRO2_DPLL_CLK_WIDTH 0x1
537#define OMAP54XX_CLKACTIVITY_UNIPRO2_DPLL_CLK_MASK (1 << 10)
538
539/* Used by CM_L3INIT_CLKSTCTRL */
540#define OMAP54XX_CLKACTIVITY_UNIPRO2_PHY_GFCLK_SHIFT 13
541#define OMAP54XX_CLKACTIVITY_UNIPRO2_PHY_GFCLK_WIDTH 0x1
542#define OMAP54XX_CLKACTIVITY_UNIPRO2_PHY_GFCLK_MASK (1 << 13)
543
544/* Used by CM_L3INIT_CLKSTCTRL */
545#define OMAP54XX_CLKACTIVITY_UNIPRO2_PHY_REF_GFCLK_SHIFT 5
546#define OMAP54XX_CLKACTIVITY_UNIPRO2_PHY_REF_GFCLK_WIDTH 0x1
547#define OMAP54XX_CLKACTIVITY_UNIPRO2_PHY_REF_GFCLK_MASK (1 << 5)
548
549/* Used by CM_L3INIT_CLKSTCTRL */
550#define OMAP54XX_CLKACTIVITY_USB_DPLL_CLK_SHIFT 14
551#define OMAP54XX_CLKACTIVITY_USB_DPLL_CLK_WIDTH 0x1
552#define OMAP54XX_CLKACTIVITY_USB_DPLL_CLK_MASK (1 << 14)
553
554/* Used by CM_L3INIT_CLKSTCTRL */
555#define OMAP54XX_CLKACTIVITY_USB_DPLL_HS_CLK_SHIFT 15
556#define OMAP54XX_CLKACTIVITY_USB_DPLL_HS_CLK_WIDTH 0x1
557#define OMAP54XX_CLKACTIVITY_USB_DPLL_HS_CLK_MASK (1 << 15)
558
559/* Used by CM_L3INIT_CLKSTCTRL */
560#define OMAP54XX_CLKACTIVITY_USB_OTG_SS_REF_CLK_SHIFT 31
561#define OMAP54XX_CLKACTIVITY_USB_OTG_SS_REF_CLK_WIDTH 0x1
562#define OMAP54XX_CLKACTIVITY_USB_OTG_SS_REF_CLK_MASK (1 << 31)
563
564/* Used by CM_L3INIT_CLKSTCTRL */
565#define OMAP54XX_CLKACTIVITY_UTMI_P3_GFCLK_SHIFT 30
566#define OMAP54XX_CLKACTIVITY_UTMI_P3_GFCLK_WIDTH 0x1
567#define OMAP54XX_CLKACTIVITY_UTMI_P3_GFCLK_MASK (1 << 30)
568
569/* Used by CM_L3INIT_CLKSTCTRL */
570#define OMAP54XX_CLKACTIVITY_UTMI_ROOT_GFCLK_SHIFT 25
571#define OMAP54XX_CLKACTIVITY_UTMI_ROOT_GFCLK_WIDTH 0x1
572#define OMAP54XX_CLKACTIVITY_UTMI_ROOT_GFCLK_MASK (1 << 25)
573
574/* Used by CM_WKUPAON_CLKSTCTRL */
575#define OMAP54XX_CLKACTIVITY_WKUPAON_32K_GFCLK_SHIFT 11
576#define OMAP54XX_CLKACTIVITY_WKUPAON_32K_GFCLK_WIDTH 0x1
577#define OMAP54XX_CLKACTIVITY_WKUPAON_32K_GFCLK_MASK (1 << 11)
578
579/* Used by CM_WKUPAON_CLKSTCTRL */
580#define OMAP54XX_CLKACTIVITY_WKUPAON_GICLK_SHIFT 12
581#define OMAP54XX_CLKACTIVITY_WKUPAON_GICLK_WIDTH 0x1
582#define OMAP54XX_CLKACTIVITY_WKUPAON_GICLK_MASK (1 << 12)
583
584/* Used by CM_WKUPAON_CLKSTCTRL */
585#define OMAP54XX_CLKACTIVITY_WKUPAON_IO_SRCOMP_GFCLK_SHIFT 13
586#define OMAP54XX_CLKACTIVITY_WKUPAON_IO_SRCOMP_GFCLK_WIDTH 0x1
587#define OMAP54XX_CLKACTIVITY_WKUPAON_IO_SRCOMP_GFCLK_MASK (1 << 13)
588
589/* Used by CM_COREAON_IO_SRCOMP_CLKCTRL, CM_WKUPAON_IO_SRCOMP_CLKCTRL */
590#define OMAP54XX_CLKEN_SRCOMP_FCLK_SHIFT 8
591#define OMAP54XX_CLKEN_SRCOMP_FCLK_WIDTH 0x1
592#define OMAP54XX_CLKEN_SRCOMP_FCLK_MASK (1 << 8)
593
594/*
595 * Used by CM_ABE_TIMER5_CLKCTRL, CM_ABE_TIMER6_CLKCTRL, CM_ABE_TIMER7_CLKCTRL,
596 * CM_ABE_TIMER8_CLKCTRL, CM_L3INIT_HSI_CLKCTRL, CM_L4PER_TIMER10_CLKCTRL,
597 * CM_L4PER_TIMER11_CLKCTRL, CM_L4PER_TIMER2_CLKCTRL, CM_L4PER_TIMER3_CLKCTRL,
598 * CM_L4PER_TIMER4_CLKCTRL, CM_L4PER_TIMER9_CLKCTRL, CM_WKUPAON_TIMER1_CLKCTRL
599 */
600#define OMAP54XX_CLKSEL_SHIFT 24 26#define OMAP54XX_CLKSEL_SHIFT 24
601#define OMAP54XX_CLKSEL_WIDTH 0x1 27#define OMAP54XX_CLKSEL_WIDTH 0x1
602#define OMAP54XX_CLKSEL_MASK (1 << 24)
603
604/*
605 * Renamed from CLKSEL Used by CM_CLKSEL_ABE_DSS_SYS, CM_CLKSEL_ABE_PLL_REF,
606 * CM_CLKSEL_USB_60MHZ, CM_CLKSEL_WKUPAON
607 */
608#define OMAP54XX_CLKSEL_0_0_SHIFT 0 28#define OMAP54XX_CLKSEL_0_0_SHIFT 0
609#define OMAP54XX_CLKSEL_0_0_WIDTH 0x1 29#define OMAP54XX_CLKSEL_0_0_WIDTH 0x1
610#define OMAP54XX_CLKSEL_0_0_MASK (1 << 0)
611
612/* Renamed from CLKSEL Used by CM_BYPCLK_DPLL_IVA, CM_BYPCLK_DPLL_MPU */
613#define OMAP54XX_CLKSEL_0_1_SHIFT 0
614#define OMAP54XX_CLKSEL_0_1_WIDTH 0x2
615#define OMAP54XX_CLKSEL_0_1_MASK (0x3 << 0)
616
617/* Renamed from CLKSEL Used by CM_L3INSTR_CTRL_MODULE_BANDGAP_CLKCTRL */
618#define OMAP54XX_CLKSEL_24_25_SHIFT 24
619#define OMAP54XX_CLKSEL_24_25_WIDTH 0x2
620#define OMAP54XX_CLKSEL_24_25_MASK (0x3 << 24)
621
622/* Used by CM_MPU_MPU_CLKCTRL */
623#define OMAP54XX_CLKSEL_ABE_DIV_MODE_SHIFT 26
624#define OMAP54XX_CLKSEL_ABE_DIV_MODE_WIDTH 0x1
625#define OMAP54XX_CLKSEL_ABE_DIV_MODE_MASK (1 << 26)
626
627/* Used by CM_ABE_AESS_CLKCTRL */
628#define OMAP54XX_CLKSEL_AESS_FCLK_SHIFT 24 30#define OMAP54XX_CLKSEL_AESS_FCLK_SHIFT 24
629#define OMAP54XX_CLKSEL_AESS_FCLK_WIDTH 0x1 31#define OMAP54XX_CLKSEL_AESS_FCLK_WIDTH 0x1
630#define OMAP54XX_CLKSEL_AESS_FCLK_MASK (1 << 24)
631
632/* Used by CM_L3INIT_MMC1_CLKCTRL, CM_L3INIT_MMC2_CLKCTRL */
633#define OMAP54XX_CLKSEL_DIV_SHIFT 25 32#define OMAP54XX_CLKSEL_DIV_SHIFT 25
634#define OMAP54XX_CLKSEL_DIV_WIDTH 0x1 33#define OMAP54XX_CLKSEL_DIV_WIDTH 0x1
635#define OMAP54XX_CLKSEL_DIV_MASK (1 << 25)
636
637/* Used by CM_MPU_MPU_CLKCTRL */
638#define OMAP54XX_CLKSEL_EMIF_DIV_MODE_SHIFT 24
639#define OMAP54XX_CLKSEL_EMIF_DIV_MODE_WIDTH 0x2
640#define OMAP54XX_CLKSEL_EMIF_DIV_MODE_MASK (0x3 << 24)
641
642/* Used by CM_CAM_FDIF_CLKCTRL */
643#define OMAP54XX_CLKSEL_FCLK_SHIFT 24 34#define OMAP54XX_CLKSEL_FCLK_SHIFT 24
644#define OMAP54XX_CLKSEL_FCLK_WIDTH 0x1 35#define OMAP54XX_CLKSEL_FCLK_WIDTH 0x1
645#define OMAP54XX_CLKSEL_FCLK_MASK (1 << 24)
646
647/* Used by CM_GPU_GPU_CLKCTRL */
648#define OMAP54XX_CLKSEL_GPU_CORE_GCLK_SHIFT 24 36#define OMAP54XX_CLKSEL_GPU_CORE_GCLK_SHIFT 24
649#define OMAP54XX_CLKSEL_GPU_CORE_GCLK_WIDTH 0x1 37#define OMAP54XX_CLKSEL_GPU_CORE_GCLK_WIDTH 0x1
650#define OMAP54XX_CLKSEL_GPU_CORE_GCLK_MASK (1 << 24)
651
652/* Used by CM_GPU_GPU_CLKCTRL */
653#define OMAP54XX_CLKSEL_GPU_HYD_GCLK_SHIFT 25 38#define OMAP54XX_CLKSEL_GPU_HYD_GCLK_SHIFT 25
654#define OMAP54XX_CLKSEL_GPU_HYD_GCLK_WIDTH 0x1 39#define OMAP54XX_CLKSEL_GPU_HYD_GCLK_WIDTH 0x1
655#define OMAP54XX_CLKSEL_GPU_HYD_GCLK_MASK (1 << 25)
656
657/* Used by CM_GPU_GPU_CLKCTRL */
658#define OMAP54XX_CLKSEL_GPU_SYS_CLK_SHIFT 26
659#define OMAP54XX_CLKSEL_GPU_SYS_CLK_WIDTH 0x1
660#define OMAP54XX_CLKSEL_GPU_SYS_CLK_MASK (1 << 26)
661
662/*
663 * Used by CM_ABE_DMIC_CLKCTRL, CM_ABE_MCASP_CLKCTRL, CM_ABE_MCBSP1_CLKCTRL,
664 * CM_ABE_MCBSP2_CLKCTRL, CM_ABE_MCBSP3_CLKCTRL
665 */
666#define OMAP54XX_CLKSEL_INTERNAL_SOURCE_SHIFT 26 40#define OMAP54XX_CLKSEL_INTERNAL_SOURCE_SHIFT 26
667#define OMAP54XX_CLKSEL_INTERNAL_SOURCE_WIDTH 0x2 41#define OMAP54XX_CLKSEL_INTERNAL_SOURCE_WIDTH 0x2
668#define OMAP54XX_CLKSEL_INTERNAL_SOURCE_MASK (0x3 << 26)
669
670/* Used by CM_CLKSEL_CORE */
671#define OMAP54XX_CLKSEL_L3_SHIFT 4
672#define OMAP54XX_CLKSEL_L3_WIDTH 0x1
673#define OMAP54XX_CLKSEL_L3_MASK (1 << 4)
674
675/* Renamed from CLKSEL_L3 Used by CM_SHADOW_FREQ_CONFIG2 */
676#define OMAP54XX_CLKSEL_L3_1_1_SHIFT 1
677#define OMAP54XX_CLKSEL_L3_1_1_WIDTH 0x1
678#define OMAP54XX_CLKSEL_L3_1_1_MASK (1 << 1)
679
680/* Used by CM_CLKSEL_CORE */
681#define OMAP54XX_CLKSEL_L4_SHIFT 8
682#define OMAP54XX_CLKSEL_L4_WIDTH 0x1
683#define OMAP54XX_CLKSEL_L4_MASK (1 << 8)
684
685/* Used by CM_EMIF_EMIF1_CLKCTRL */
686#define OMAP54XX_CLKSEL_LL_SHIFT 24
687#define OMAP54XX_CLKSEL_LL_WIDTH 0x1
688#define OMAP54XX_CLKSEL_LL_MASK (1 << 24)
689
690/* Used by CM_CLKSEL_ABE */
691#define OMAP54XX_CLKSEL_OPP_SHIFT 0 42#define OMAP54XX_CLKSEL_OPP_SHIFT 0
692#define OMAP54XX_CLKSEL_OPP_WIDTH 0x2 43#define OMAP54XX_CLKSEL_OPP_WIDTH 0x2
693#define OMAP54XX_CLKSEL_OPP_MASK (0x3 << 0)
694
695/* Renamed from CLKSEL_OPP Used by CM_L3INIT_UNIPRO2_CLKCTRL */
696#define OMAP54XX_CLKSEL_OPP_24_24_SHIFT 24
697#define OMAP54XX_CLKSEL_OPP_24_24_WIDTH 0x1
698#define OMAP54XX_CLKSEL_OPP_24_24_MASK (1 << 24)
699
700/*
701 * Used by CM_ABE_DMIC_CLKCTRL, CM_ABE_MCASP_CLKCTRL, CM_ABE_MCBSP1_CLKCTRL,
702 * CM_ABE_MCBSP2_CLKCTRL, CM_ABE_MCBSP3_CLKCTRL
703 */
704#define OMAP54XX_CLKSEL_SOURCE_SHIFT 24 44#define OMAP54XX_CLKSEL_SOURCE_SHIFT 24
705#define OMAP54XX_CLKSEL_SOURCE_WIDTH 0x2 45#define OMAP54XX_CLKSEL_SOURCE_WIDTH 0x2
706#define OMAP54XX_CLKSEL_SOURCE_MASK (0x3 << 24)
707
708/*
709 * Renamed from CLKSEL_SOURCE Used by CM_L3INIT_MMC1_CLKCTRL,
710 * CM_L3INIT_MMC2_CLKCTRL
711 */
712#define OMAP54XX_CLKSEL_SOURCE_L3INIT_MMC1_SHIFT 24 46#define OMAP54XX_CLKSEL_SOURCE_L3INIT_MMC1_SHIFT 24
713#define OMAP54XX_CLKSEL_SOURCE_L3INIT_MMC1_WIDTH 0x1 47#define OMAP54XX_CLKSEL_SOURCE_L3INIT_MMC1_WIDTH 0x1
714#define OMAP54XX_CLKSEL_SOURCE_L3INIT_MMC1_MASK (1 << 24)
715
716/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL */
717#define OMAP54XX_CLKSEL_UTMI_P1_SHIFT 24 48#define OMAP54XX_CLKSEL_UTMI_P1_SHIFT 24
718#define OMAP54XX_CLKSEL_UTMI_P1_WIDTH 0x1 49#define OMAP54XX_CLKSEL_UTMI_P1_WIDTH 0x1
719#define OMAP54XX_CLKSEL_UTMI_P1_MASK (1 << 24)
720
721/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL */
722#define OMAP54XX_CLKSEL_UTMI_P2_SHIFT 25 50#define OMAP54XX_CLKSEL_UTMI_P2_SHIFT 25
723#define OMAP54XX_CLKSEL_UTMI_P2_WIDTH 0x1 51#define OMAP54XX_CLKSEL_UTMI_P2_WIDTH 0x1
724#define OMAP54XX_CLKSEL_UTMI_P2_MASK (1 << 25)
725
726/*
727 * Used by CM_DIV_H11_DPLL_CORE, CM_DIV_H11_DPLL_IVA, CM_DIV_H11_DPLL_PER,
728 * CM_DIV_H12_DPLL_CORE, CM_DIV_H12_DPLL_IVA, CM_DIV_H12_DPLL_PER,
729 * CM_DIV_H13_DPLL_CORE, CM_DIV_H13_DPLL_PER, CM_DIV_H14_DPLL_CORE,
730 * CM_DIV_H14_DPLL_PER, CM_DIV_H21_DPLL_CORE, CM_DIV_H22_DPLL_CORE,
731 * CM_DIV_H23_DPLL_CORE, CM_DIV_H24_DPLL_CORE, CM_DIV_M2_DPLL_ABE,
732 * CM_DIV_M2_DPLL_CORE, CM_DIV_M2_DPLL_MPU, CM_DIV_M2_DPLL_PER,
733 * CM_DIV_M2_DPLL_UNIPRO1, CM_DIV_M2_DPLL_UNIPRO2, CM_DIV_M2_DPLL_USB,
734 * CM_DIV_M3_DPLL_ABE, CM_DIV_M3_DPLL_CORE, CM_DIV_M3_DPLL_PER
735 */
736#define OMAP54XX_CLKST_SHIFT 9
737#define OMAP54XX_CLKST_WIDTH 0x1
738#define OMAP54XX_CLKST_MASK (1 << 9)
739
740/*
741 * Used by CM_ABE_CLKSTCTRL, CM_C2C_CLKSTCTRL, CM_CAM_CLKSTCTRL,
742 * CM_COREAON_CLKSTCTRL, CM_CUSTEFUSE_CLKSTCTRL, CM_DMA_CLKSTCTRL,
743 * CM_DSP_CLKSTCTRL, CM_DSS_CLKSTCTRL, CM_EMIF_CLKSTCTRL, CM_EMU_CLKSTCTRL,
744 * CM_GPU_CLKSTCTRL, CM_IPU_CLKSTCTRL, CM_IVA_CLKSTCTRL, CM_L3INIT_CLKSTCTRL,
745 * CM_L3INSTR_CLKSTCTRL, CM_L3MAIN1_CLKSTCTRL, CM_L3MAIN2_CLKSTCTRL,
746 * CM_L4CFG_CLKSTCTRL, CM_L4PER_CLKSTCTRL, CM_L4SEC_CLKSTCTRL,
747 * CM_MIPIEXT_CLKSTCTRL, CM_MPU_CLKSTCTRL, CM_WKUPAON_CLKSTCTRL
748 */
749#define OMAP54XX_CLKTRCTRL_SHIFT 0
750#define OMAP54XX_CLKTRCTRL_WIDTH 0x2
751#define OMAP54XX_CLKTRCTRL_MASK (0x3 << 0)
752
753/* Used by CM_DIV_M2_DPLL_ABE, CM_DIV_M2_DPLL_PER */
754#define OMAP54XX_CLKX2ST_SHIFT 11
755#define OMAP54XX_CLKX2ST_WIDTH 0x1
756#define OMAP54XX_CLKX2ST_MASK (1 << 11)
757
758/* Used by CM_L4CFG_DYNAMICDEP */
759#define OMAP54XX_COREAON_DYNDEP_SHIFT 16
760#define OMAP54XX_COREAON_DYNDEP_WIDTH 0x1
761#define OMAP54XX_COREAON_DYNDEP_MASK (1 << 16)
762
763/* Used by CM_DSP_STATICDEP, CM_IPU_STATICDEP, CM_MPU_STATICDEP */
764#define OMAP54XX_COREAON_STATDEP_SHIFT 16
765#define OMAP54XX_COREAON_STATDEP_WIDTH 0x1
766#define OMAP54XX_COREAON_STATDEP_MASK (1 << 16)
767
768/* Used by CM_L4CFG_DYNAMICDEP */
769#define OMAP54XX_CUSTEFUSE_DYNDEP_SHIFT 17
770#define OMAP54XX_CUSTEFUSE_DYNDEP_WIDTH 0x1
771#define OMAP54XX_CUSTEFUSE_DYNDEP_MASK (1 << 17)
772
773/* Used by CM_DSP_STATICDEP, CM_IPU_STATICDEP, CM_MPU_STATICDEP */
774#define OMAP54XX_CUSTEFUSE_STATDEP_SHIFT 17
775#define OMAP54XX_CUSTEFUSE_STATDEP_WIDTH 0x1
776#define OMAP54XX_CUSTEFUSE_STATDEP_MASK (1 << 17)
777
778/* Used by REVISION_CM_CORE, REVISION_CM_CORE_AON */
779#define OMAP54XX_CUSTOM_SHIFT 6
780#define OMAP54XX_CUSTOM_WIDTH 0x2
781#define OMAP54XX_CUSTOM_MASK (0x3 << 6)
782
783/*
784 * Used by CM_CLKSEL_DPLL_ABE, CM_CLKSEL_DPLL_CORE, CM_CLKSEL_DPLL_IVA,
785 * CM_CLKSEL_DPLL_MPU, CM_CLKSEL_DPLL_PER, CM_CLKSEL_DPLL_UNIPRO1,
786 * CM_CLKSEL_DPLL_UNIPRO2, CM_CLKSEL_DPLL_USB
787 */
788#define OMAP54XX_DCC_EN_SHIFT 22
789#define OMAP54XX_DCC_EN_WIDTH 0x1
790#define OMAP54XX_DCC_EN_MASK (1 << 22)
791
792/*
793 * Used by CM_CORE_AON_DEBUG_CM_CORE_AON_FD_TRANS,
794 * CM_CORE_AON_DEBUG_DSS_FD_TRANS, CM_CORE_AON_DEBUG_EMIF_FD_TRANS,
795 * CM_CORE_AON_DEBUG_L4SEC_FD_TRANS
796 */
797#define OMAP54XX_CM_DEBUG_OUT_SHIFT 0
798#define OMAP54XX_CM_DEBUG_OUT_WIDTH 0xd
799#define OMAP54XX_CM_DEBUG_OUT_MASK (0x1fff << 0)
800
801/*
802 * Renamed from DEBUG_OUT Used by CM_CORE_AON_DEBUG_ABE_FD_TRANS,
803 * CM_CORE_AON_DEBUG_L3INIT_FD_TRANS, CM_CORE_AON_DEBUG_L4PER_FD_TRANS
804 */
805#define OMAP54XX_DEBUG_OUT_0_31_SHIFT 0
806#define OMAP54XX_DEBUG_OUT_0_31_WIDTH 0x20
807#define OMAP54XX_DEBUG_OUT_0_31_MASK (0xffffffff << 0)
808
809/*
810 * Renamed from DEBUG_OUT Used by CM_CORE_AON_DEBUG_C2C_FD_TRANS,
811 * CM_CORE_AON_DEBUG_COREAON_FD_TRANS, CM_CORE_AON_DEBUG_L4CFG_FD_TRANS
812 */
813#define OMAP54XX_DEBUG_OUT_0_8_SHIFT 0
814#define OMAP54XX_DEBUG_OUT_0_8_WIDTH 0x9
815#define OMAP54XX_DEBUG_OUT_0_8_MASK (0x1ff << 0)
816
817/*
818 * Renamed from DEBUG_OUT Used by CM_CORE_AON_DEBUG_CUSTEFUSE_FD_TRANS,
819 * CM_CORE_AON_DEBUG_DMA_FD_TRANS, CM_CORE_AON_DEBUG_L3MAIN1_FD_TRANS
820 */
821#define OMAP54XX_DEBUG_OUT_0_4_SHIFT 0
822#define OMAP54XX_DEBUG_OUT_0_4_WIDTH 0x5
823#define OMAP54XX_DEBUG_OUT_0_4_MASK (0x1f << 0)
824
825/*
826 * Renamed from DEBUG_OUT Used by CM_CORE_AON_DEBUG_DSP_FD_TRANS,
827 * CM_CORE_AON_DEBUG_IPU_FD_TRANS, CM_CORE_AON_DEBUG_MPU_FD_TRANS
828 */
829#define OMAP54XX_DEBUG_OUT_0_5_SHIFT 0
830#define OMAP54XX_DEBUG_OUT_0_5_WIDTH 0x6
831#define OMAP54XX_DEBUG_OUT_0_5_MASK (0x3f << 0)
832
833/*
834 * Renamed from DEBUG_OUT Used by CM_CORE_AON_DEBUG_CAM_FD_TRANS,
835 * CM_CORE_AON_DEBUG_MIPIEXT_FD_TRANS
836 */
837#define OMAP54XX_DEBUG_OUT_0_10_SHIFT 0
838#define OMAP54XX_DEBUG_OUT_0_10_WIDTH 0xb
839#define OMAP54XX_DEBUG_OUT_0_10_MASK (0x7ff << 0)
840
841/*
842 * Renamed from DEBUG_OUT Used by CM_CORE_AON_DEBUG_IVA_FD_TRANS,
843 * CM_CORE_AON_DEBUG_L3MAIN2_FD_TRANS
844 */
845#define OMAP54XX_DEBUG_OUT_0_6_SHIFT 0
846#define OMAP54XX_DEBUG_OUT_0_6_WIDTH 0x7
847#define OMAP54XX_DEBUG_OUT_0_6_MASK (0x7f << 0)
848
849/* Renamed from DEBUG_OUT Used by CM_CORE_AON_DEBUG_ABE_FD_TRANS2 */
850#define OMAP54XX_DEBUG_OUT_0_19_SHIFT 0
851#define OMAP54XX_DEBUG_OUT_0_19_WIDTH 0x14
852#define OMAP54XX_DEBUG_OUT_0_19_MASK (0xfffff << 0)
853
854/* Renamed from DEBUG_OUT Used by CM_CORE_AON_DEBUG_GPU_FD_TRANS */
855#define OMAP54XX_DEBUG_OUT_0_9_SHIFT 0
856#define OMAP54XX_DEBUG_OUT_0_9_WIDTH 0xa
857#define OMAP54XX_DEBUG_OUT_0_9_MASK (0x3ff << 0)
858
859/* Renamed from DEBUG_OUT Used by CM_CORE_AON_DEBUG_L3INIT_FD_TRANS2 */
860#define OMAP54XX_DEBUG_OUT_0_26_SHIFT 0
861#define OMAP54XX_DEBUG_OUT_0_26_WIDTH 0x1b
862#define OMAP54XX_DEBUG_OUT_0_26_MASK (0x7ffffff << 0)
863
864/* Renamed from DEBUG_OUT Used by CM_CORE_AON_DEBUG_L3INSTR_FD_TRANS */
865#define OMAP54XX_DEBUG_OUT_0_13_SHIFT 0
866#define OMAP54XX_DEBUG_OUT_0_13_WIDTH 0xe
867#define OMAP54XX_DEBUG_OUT_0_13_MASK (0x3fff << 0)
868
869/* Renamed from DEBUG_OUT Used by CM_CORE_AON_DEBUG_L4PER_FD_TRANS2 */
870#define OMAP54XX_DEBUG_OUT_0_21_SHIFT 0
871#define OMAP54XX_DEBUG_OUT_0_21_WIDTH 0x16
872#define OMAP54XX_DEBUG_OUT_0_21_MASK (0x3fffff << 0)
873
874/*
875 * Used by CM_SSC_DELTAMSTEP_DPLL_ABE, CM_SSC_DELTAMSTEP_DPLL_CORE,
876 * CM_SSC_DELTAMSTEP_DPLL_IVA, CM_SSC_DELTAMSTEP_DPLL_MPU,
877 * CM_SSC_DELTAMSTEP_DPLL_PER
878 */
879#define OMAP54XX_DELTAMSTEP_SHIFT 0
880#define OMAP54XX_DELTAMSTEP_WIDTH 0x14
881#define OMAP54XX_DELTAMSTEP_MASK (0xfffff << 0)
882
883/*
884 * Renamed from DELTAMSTEP Used by CM_SSC_DELTAMSTEP_DPLL_UNIPRO1,
885 * CM_SSC_DELTAMSTEP_DPLL_UNIPRO2, CM_SSC_DELTAMSTEP_DPLL_USB
886 */
887#define OMAP54XX_DELTAMSTEP_0_20_SHIFT 0
888#define OMAP54XX_DELTAMSTEP_0_20_WIDTH 0x15
889#define OMAP54XX_DELTAMSTEP_0_20_MASK (0x1fffff << 0)
890
891/*
892 * Used by CM_DIV_H11_DPLL_CORE, CM_DIV_H11_DPLL_IVA, CM_DIV_H11_DPLL_PER,
893 * CM_DIV_H12_DPLL_CORE, CM_DIV_H12_DPLL_IVA, CM_DIV_H12_DPLL_PER,
894 * CM_DIV_H13_DPLL_CORE, CM_DIV_H13_DPLL_PER, CM_DIV_H14_DPLL_CORE,
895 * CM_DIV_H14_DPLL_PER, CM_DIV_H21_DPLL_CORE, CM_DIV_H22_DPLL_CORE,
896 * CM_DIV_H23_DPLL_CORE, CM_DIV_H24_DPLL_CORE
897 */
898#define OMAP54XX_DIVHS_SHIFT 0
899#define OMAP54XX_DIVHS_WIDTH 0x6
900#define OMAP54XX_DIVHS_MASK (0x3f << 0) 52#define OMAP54XX_DIVHS_MASK (0x3f << 0)
901
902/*
903 * Renamed from DIVHS Used by CM_DIV_M2_DPLL_ABE, CM_DIV_M2_DPLL_CORE,
904 * CM_DIV_M2_DPLL_MPU, CM_DIV_M2_DPLL_PER, CM_DIV_M3_DPLL_ABE,
905 * CM_DIV_M3_DPLL_CORE, CM_DIV_M3_DPLL_PER
906 */
907#define OMAP54XX_DIVHS_0_4_SHIFT 0
908#define OMAP54XX_DIVHS_0_4_WIDTH 0x5
909#define OMAP54XX_DIVHS_0_4_MASK (0x1f << 0) 53#define OMAP54XX_DIVHS_0_4_MASK (0x1f << 0)
910
911/*
912 * Renamed from DIVHS Used by CM_DIV_M2_DPLL_UNIPRO1, CM_DIV_M2_DPLL_UNIPRO2,
913 * CM_DIV_M2_DPLL_USB
914 */
915#define OMAP54XX_DIVHS_0_6_SHIFT 0
916#define OMAP54XX_DIVHS_0_6_WIDTH 0x7
917#define OMAP54XX_DIVHS_0_6_MASK (0x7f << 0) 54#define OMAP54XX_DIVHS_0_6_MASK (0x7f << 0)
918
919/* Used by CM_DLL_CTRL */
920#define OMAP54XX_DLL_OVERRIDE_SHIFT 0
921#define OMAP54XX_DLL_OVERRIDE_WIDTH 0x1
922#define OMAP54XX_DLL_OVERRIDE_MASK (1 << 0)
923
924/* Renamed from DLL_OVERRIDE Used by CM_SHADOW_FREQ_CONFIG1 */
925#define OMAP54XX_DLL_OVERRIDE_2_2_SHIFT 2
926#define OMAP54XX_DLL_OVERRIDE_2_2_WIDTH 0x1
927#define OMAP54XX_DLL_OVERRIDE_2_2_MASK (1 << 2)
928
929/* Used by CM_SHADOW_FREQ_CONFIG1 */
930#define OMAP54XX_DLL_RESET_SHIFT 3
931#define OMAP54XX_DLL_RESET_WIDTH 0x1
932#define OMAP54XX_DLL_RESET_MASK (1 << 3)
933
934/*
935 * Used by CM_CLKSEL_DPLL_ABE, CM_CLKSEL_DPLL_CORE, CM_CLKSEL_DPLL_IVA,
936 * CM_CLKSEL_DPLL_MPU, CM_CLKSEL_DPLL_PER, CM_CLKSEL_DPLL_UNIPRO1,
937 * CM_CLKSEL_DPLL_UNIPRO2, CM_CLKSEL_DPLL_USB
938 */
939#define OMAP54XX_DPLL_BYP_CLKSEL_SHIFT 23
940#define OMAP54XX_DPLL_BYP_CLKSEL_WIDTH 0x1
941#define OMAP54XX_DPLL_BYP_CLKSEL_MASK (1 << 23)
942
943/* Used by CM_CLKSEL_DPLL_CORE */
944#define OMAP54XX_DPLL_CLKOUTHIF_CLKSEL_SHIFT 20
945#define OMAP54XX_DPLL_CLKOUTHIF_CLKSEL_WIDTH 0x1
946#define OMAP54XX_DPLL_CLKOUTHIF_CLKSEL_MASK (1 << 20)
947
948/* Used by CM_SHADOW_FREQ_CONFIG1 */
949#define OMAP54XX_DPLL_CORE_DPLL_EN_SHIFT 8
950#define OMAP54XX_DPLL_CORE_DPLL_EN_WIDTH 0x3
951#define OMAP54XX_DPLL_CORE_DPLL_EN_MASK (0x7 << 8)
952
953/* Used by CM_SHADOW_FREQ_CONFIG2 */
954#define OMAP54XX_DPLL_CORE_H12_DIV_SHIFT 2
955#define OMAP54XX_DPLL_CORE_H12_DIV_WIDTH 0x6
956#define OMAP54XX_DPLL_CORE_H12_DIV_MASK (0x3f << 2)
957
958/* Used by CM_SHADOW_FREQ_CONFIG1 */
959#define OMAP54XX_DPLL_CORE_M2_DIV_SHIFT 11
960#define OMAP54XX_DPLL_CORE_M2_DIV_WIDTH 0x5
961#define OMAP54XX_DPLL_CORE_M2_DIV_MASK (0x1f << 11)
962
963/*
964 * Used by CM_CLKSEL_DPLL_ABE, CM_CLKSEL_DPLL_CORE, CM_CLKSEL_DPLL_IVA,
965 * CM_CLKSEL_DPLL_MPU, CM_CLKSEL_DPLL_PER
966 */
967#define OMAP54XX_DPLL_DIV_SHIFT 0
968#define OMAP54XX_DPLL_DIV_WIDTH 0x7
969#define OMAP54XX_DPLL_DIV_MASK (0x7f << 0) 55#define OMAP54XX_DPLL_DIV_MASK (0x7f << 0)
970
971/*
972 * Renamed from DPLL_DIV Used by CM_CLKSEL_DPLL_UNIPRO1,
973 * CM_CLKSEL_DPLL_UNIPRO2, CM_CLKSEL_DPLL_USB
974 */
975#define OMAP54XX_DPLL_DIV_0_7_SHIFT 0
976#define OMAP54XX_DPLL_DIV_0_7_WIDTH 0x8
977#define OMAP54XX_DPLL_DIV_0_7_MASK (0xff << 0)
978
979/*
980 * Used by CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_IVA,
981 * CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER
982 */
983#define OMAP54XX_DPLL_DRIFTGUARD_EN_SHIFT 8
984#define OMAP54XX_DPLL_DRIFTGUARD_EN_WIDTH 0x1
985#define OMAP54XX_DPLL_DRIFTGUARD_EN_MASK (1 << 8)
986
987/*
988 * Used by CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_IVA,
989 * CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER, CM_CLKMODE_DPLL_UNIPRO1,
990 * CM_CLKMODE_DPLL_UNIPRO2, CM_CLKMODE_DPLL_USB
991 */
992#define OMAP54XX_DPLL_EN_SHIFT 0
993#define OMAP54XX_DPLL_EN_WIDTH 0x3
994#define OMAP54XX_DPLL_EN_MASK (0x7 << 0) 56#define OMAP54XX_DPLL_EN_MASK (0x7 << 0)
995
996/*
997 * Used by CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_IVA,
998 * CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER
999 */
1000#define OMAP54XX_DPLL_LPMODE_EN_SHIFT 10
1001#define OMAP54XX_DPLL_LPMODE_EN_WIDTH 0x1
1002#define OMAP54XX_DPLL_LPMODE_EN_MASK (1 << 10) 57#define OMAP54XX_DPLL_LPMODE_EN_MASK (1 << 10)
1003
1004/*
1005 * Used by CM_CLKSEL_DPLL_ABE, CM_CLKSEL_DPLL_CORE, CM_CLKSEL_DPLL_IVA,
1006 * CM_CLKSEL_DPLL_MPU, CM_CLKSEL_DPLL_PER
1007 */
1008#define OMAP54XX_DPLL_MULT_SHIFT 8
1009#define OMAP54XX_DPLL_MULT_WIDTH 0xb
1010#define OMAP54XX_DPLL_MULT_MASK (0x7ff << 8) 58#define OMAP54XX_DPLL_MULT_MASK (0x7ff << 8)
1011
1012/*
1013 * Renamed from DPLL_MULT Used by CM_CLKSEL_DPLL_UNIPRO1,
1014 * CM_CLKSEL_DPLL_UNIPRO2, CM_CLKSEL_DPLL_USB
1015 */
1016#define OMAP54XX_DPLL_MULT_UNIPRO1_SHIFT 8
1017#define OMAP54XX_DPLL_MULT_UNIPRO1_WIDTH 0xc
1018#define OMAP54XX_DPLL_MULT_UNIPRO1_MASK (0xfff << 8)
1019
1020/*
1021 * Used by CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_IVA,
1022 * CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER
1023 */
1024#define OMAP54XX_DPLL_REGM4XEN_SHIFT 11
1025#define OMAP54XX_DPLL_REGM4XEN_WIDTH 0x1
1026#define OMAP54XX_DPLL_REGM4XEN_MASK (1 << 11) 59#define OMAP54XX_DPLL_REGM4XEN_MASK (1 << 11)
1027
1028/* Used by CM_CLKSEL_DPLL_UNIPRO1, CM_CLKSEL_DPLL_UNIPRO2, CM_CLKSEL_DPLL_USB */
1029#define OMAP54XX_DPLL_SD_DIV_SHIFT 24
1030#define OMAP54XX_DPLL_SD_DIV_WIDTH 0x8
1031#define OMAP54XX_DPLL_SD_DIV_MASK (0xff << 24) 60#define OMAP54XX_DPLL_SD_DIV_MASK (0xff << 24)
1032
1033/* Used by CM_CLKSEL_DPLL_UNIPRO1, CM_CLKSEL_DPLL_UNIPRO2, CM_CLKSEL_DPLL_USB */
1034#define OMAP54XX_DPLL_SELFREQDCO_SHIFT 21
1035#define OMAP54XX_DPLL_SELFREQDCO_WIDTH 0x1
1036#define OMAP54XX_DPLL_SELFREQDCO_MASK (1 << 21)
1037
1038/*
1039 * Used by CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_IVA,
1040 * CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER, CM_CLKMODE_DPLL_UNIPRO1,
1041 * CM_CLKMODE_DPLL_UNIPRO2, CM_CLKMODE_DPLL_USB
1042 */
1043#define OMAP54XX_DPLL_SSC_ACK_SHIFT 13
1044#define OMAP54XX_DPLL_SSC_ACK_WIDTH 0x1
1045#define OMAP54XX_DPLL_SSC_ACK_MASK (1 << 13)
1046
1047/*
1048 * Used by CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_IVA,
1049 * CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER, CM_CLKMODE_DPLL_UNIPRO1,
1050 * CM_CLKMODE_DPLL_UNIPRO2, CM_CLKMODE_DPLL_USB
1051 */
1052#define OMAP54XX_DPLL_SSC_DOWNSPREAD_SHIFT 14
1053#define OMAP54XX_DPLL_SSC_DOWNSPREAD_WIDTH 0x1
1054#define OMAP54XX_DPLL_SSC_DOWNSPREAD_MASK (1 << 14)
1055
1056/*
1057 * Used by CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE, CM_CLKMODE_DPLL_IVA,
1058 * CM_CLKMODE_DPLL_MPU, CM_CLKMODE_DPLL_PER, CM_CLKMODE_DPLL_UNIPRO1,
1059 * CM_CLKMODE_DPLL_UNIPRO2, CM_CLKMODE_DPLL_USB
1060 */
1061#define OMAP54XX_DPLL_SSC_EN_SHIFT 12
1062#define OMAP54XX_DPLL_SSC_EN_WIDTH 0x1
1063#define OMAP54XX_DPLL_SSC_EN_MASK (1 << 12)
1064
1065/* Used by CM_L4CFG_DYNAMICDEP */
1066#define OMAP54XX_DSP_DYNDEP_SHIFT 1
1067#define OMAP54XX_DSP_DYNDEP_WIDTH 0x1
1068#define OMAP54XX_DSP_DYNDEP_MASK (1 << 1)
1069
1070/* Used by CM_IPU_STATICDEP, CM_MPU_STATICDEP */
1071#define OMAP54XX_DSP_STATDEP_SHIFT 1 61#define OMAP54XX_DSP_STATDEP_SHIFT 1
1072#define OMAP54XX_DSP_STATDEP_WIDTH 0x1
1073#define OMAP54XX_DSP_STATDEP_MASK (1 << 1)
1074
1075/* Used by CM_L3MAIN2_DYNAMICDEP, CM_L4PER_DYNAMICDEP */
1076#define OMAP54XX_DSS_DYNDEP_SHIFT 8
1077#define OMAP54XX_DSS_DYNDEP_WIDTH 0x1
1078#define OMAP54XX_DSS_DYNDEP_MASK (1 << 8)
1079
1080/* Used by CM_DMA_STATICDEP, CM_IPU_STATICDEP, CM_MPU_STATICDEP */
1081#define OMAP54XX_DSS_STATDEP_SHIFT 8 62#define OMAP54XX_DSS_STATDEP_SHIFT 8
1082#define OMAP54XX_DSS_STATDEP_WIDTH 0x1
1083#define OMAP54XX_DSS_STATDEP_MASK (1 << 8)
1084
1085/*
1086 * Used by CM_C2C_DYNAMICDEP, CM_L3MAIN1_DYNAMICDEP, CM_L4CFG_DYNAMICDEP,
1087 * CM_MIPIEXT_DYNAMICDEP, CM_MPU_DYNAMICDEP
1088 */
1089#define OMAP54XX_EMIF_DYNDEP_SHIFT 4
1090#define OMAP54XX_EMIF_DYNDEP_WIDTH 0x1
1091#define OMAP54XX_EMIF_DYNDEP_MASK (1 << 4)
1092
1093/*
1094 * Used by CM_C2C_STATICDEP, CM_CAM_STATICDEP, CM_DMA_STATICDEP,
1095 * CM_DSP_STATICDEP, CM_DSS_STATICDEP, CM_GPU_STATICDEP, CM_IPU_STATICDEP,
1096 * CM_IVA_STATICDEP, CM_L3INIT_STATICDEP, CM_L4SEC_STATICDEP,
1097 * CM_MIPIEXT_STATICDEP, CM_MPU_STATICDEP
1098 */
1099#define OMAP54XX_EMIF_STATDEP_SHIFT 4 63#define OMAP54XX_EMIF_STATDEP_SHIFT 4
1100#define OMAP54XX_EMIF_STATDEP_WIDTH 0x1
1101#define OMAP54XX_EMIF_STATDEP_MASK (1 << 4)
1102
1103/* Used by CM_SHADOW_FREQ_CONFIG1 */
1104#define OMAP54XX_FREQ_UPDATE_SHIFT 0
1105#define OMAP54XX_FREQ_UPDATE_WIDTH 0x1
1106#define OMAP54XX_FREQ_UPDATE_MASK (1 << 0)
1107
1108/* Used by REVISION_CM_CORE, REVISION_CM_CORE_AON */
1109#define OMAP54XX_FUNC_SHIFT 16
1110#define OMAP54XX_FUNC_WIDTH 0xc
1111#define OMAP54XX_FUNC_MASK (0xfff << 16)
1112
1113/* Used by CM_SHADOW_FREQ_CONFIG2 */
1114#define OMAP54XX_GPMC_FREQ_UPDATE_SHIFT 0
1115#define OMAP54XX_GPMC_FREQ_UPDATE_WIDTH 0x1
1116#define OMAP54XX_GPMC_FREQ_UPDATE_MASK (1 << 0)
1117
1118/* Used by CM_L3MAIN2_DYNAMICDEP */
1119#define OMAP54XX_GPU_DYNDEP_SHIFT 10
1120#define OMAP54XX_GPU_DYNDEP_WIDTH 0x1
1121#define OMAP54XX_GPU_DYNDEP_MASK (1 << 10)
1122
1123/* Used by CM_IPU_STATICDEP, CM_MPU_STATICDEP */
1124#define OMAP54XX_GPU_STATDEP_SHIFT 10 64#define OMAP54XX_GPU_STATDEP_SHIFT 10
1125#define OMAP54XX_GPU_STATDEP_WIDTH 0x1
1126#define OMAP54XX_GPU_STATDEP_MASK (1 << 10)
1127
1128/*
1129 * Used by CM_ABE_AESS_CLKCTRL, CM_ABE_DMIC_CLKCTRL, CM_ABE_L4_ABE_CLKCTRL,
1130 * CM_ABE_MCASP_CLKCTRL, CM_ABE_MCBSP1_CLKCTRL, CM_ABE_MCBSP2_CLKCTRL,
1131 * CM_ABE_MCBSP3_CLKCTRL, CM_ABE_MCPDM_CLKCTRL, CM_ABE_SLIMBUS1_CLKCTRL,
1132 * CM_ABE_TIMER5_CLKCTRL, CM_ABE_TIMER6_CLKCTRL, CM_ABE_TIMER7_CLKCTRL,
1133 * CM_ABE_TIMER8_CLKCTRL, CM_ABE_WD_TIMER3_CLKCTRL, CM_C2C_C2C_CLKCTRL,
1134 * CM_C2C_C2C_OCP_FW_CLKCTRL, CM_C2C_MODEM_ICR_CLKCTRL, CM_CAM_CAL_CLKCTRL,
1135 * CM_CAM_FDIF_CLKCTRL, CM_CAM_ISS_CLKCTRL, CM_CM_CORE_AON_PROFILING_CLKCTRL,
1136 * CM_CM_CORE_PROFILING_CLKCTRL, CM_COREAON_SMARTREFLEX_CORE_CLKCTRL,
1137 * CM_COREAON_SMARTREFLEX_MM_CLKCTRL, CM_COREAON_SMARTREFLEX_MPU_CLKCTRL,
1138 * CM_CUSTEFUSE_EFUSE_CTRL_CUST_CLKCTRL, CM_DMA_DMA_SYSTEM_CLKCTRL,
1139 * CM_DSP_DSP_CLKCTRL, CM_DSS_BB2D_CLKCTRL, CM_DSS_DSS_CLKCTRL,
1140 * CM_EMIF_DMM_CLKCTRL, CM_EMIF_EMIF1_CLKCTRL, CM_EMIF_EMIF2_CLKCTRL,
1141 * CM_EMIF_EMIF_OCP_FW_CLKCTRL, CM_EMU_DEBUGSS_CLKCTRL,
1142 * CM_EMU_MPU_EMU_DBG_CLKCTRL, CM_GPU_GPU_CLKCTRL, CM_IPU_IPU_CLKCTRL,
1143 * CM_IVA_IVA_CLKCTRL, CM_IVA_SL2_CLKCTRL, CM_L3INIT_HSI_CLKCTRL,
1144 * CM_L3INIT_IEEE1500_2_OCP_CLKCTRL, CM_L3INIT_MMC1_CLKCTRL,
1145 * CM_L3INIT_MMC2_CLKCTRL, CM_L3INIT_MPHY_UNIPRO2_CLKCTRL,
1146 * CM_L3INIT_OCP2SCP1_CLKCTRL, CM_L3INIT_OCP2SCP3_CLKCTRL,
1147 * CM_L3INIT_SATA_CLKCTRL, CM_L3INIT_UNIPRO2_CLKCTRL,
1148 * CM_L3INIT_USB_HOST_HS_CLKCTRL, CM_L3INIT_USB_OTG_SS_CLKCTRL,
1149 * CM_L3INIT_USB_TLL_HS_CLKCTRL, CM_L3INSTR_CTRL_MODULE_BANDGAP_CLKCTRL,
1150 * CM_L3INSTR_DLL_AGING_CLKCTRL, CM_L3INSTR_L3_INSTR_CLKCTRL,
1151 * CM_L3INSTR_L3_MAIN_3_CLKCTRL, CM_L3INSTR_OCP_WP_NOC_CLKCTRL,
1152 * CM_L3MAIN1_L3_MAIN_1_CLKCTRL, CM_L3MAIN2_GPMC_CLKCTRL,
1153 * CM_L3MAIN2_L3_MAIN_2_CLKCTRL, CM_L3MAIN2_OCMC_RAM_CLKCTRL,
1154 * CM_L4CFG_L4_CFG_CLKCTRL, CM_L4CFG_MAILBOX_CLKCTRL,
1155 * CM_L4CFG_OCP2SCP2_CLKCTRL, CM_L4CFG_SAR_ROM_CLKCTRL,
1156 * CM_L4CFG_SPINLOCK_CLKCTRL, CM_L4PER_ELM_CLKCTRL, CM_L4PER_GPIO2_CLKCTRL,
1157 * CM_L4PER_GPIO3_CLKCTRL, CM_L4PER_GPIO4_CLKCTRL, CM_L4PER_GPIO5_CLKCTRL,
1158 * CM_L4PER_GPIO6_CLKCTRL, CM_L4PER_GPIO7_CLKCTRL, CM_L4PER_GPIO8_CLKCTRL,
1159 * CM_L4PER_HDQ1W_CLKCTRL, CM_L4PER_I2C1_CLKCTRL, CM_L4PER_I2C2_CLKCTRL,
1160 * CM_L4PER_I2C3_CLKCTRL, CM_L4PER_I2C4_CLKCTRL, CM_L4PER_I2C5_CLKCTRL,
1161 * CM_L4PER_L4_PER_CLKCTRL, CM_L4PER_MCSPI1_CLKCTRL, CM_L4PER_MCSPI2_CLKCTRL,
1162 * CM_L4PER_MCSPI3_CLKCTRL, CM_L4PER_MCSPI4_CLKCTRL, CM_L4PER_MMC3_CLKCTRL,
1163 * CM_L4PER_MMC4_CLKCTRL, CM_L4PER_MMC5_CLKCTRL, CM_L4PER_TIMER10_CLKCTRL,
1164 * CM_L4PER_TIMER11_CLKCTRL, CM_L4PER_TIMER2_CLKCTRL, CM_L4PER_TIMER3_CLKCTRL,
1165 * CM_L4PER_TIMER4_CLKCTRL, CM_L4PER_TIMER9_CLKCTRL, CM_L4PER_UART1_CLKCTRL,
1166 * CM_L4PER_UART2_CLKCTRL, CM_L4PER_UART3_CLKCTRL, CM_L4PER_UART4_CLKCTRL,
1167 * CM_L4PER_UART5_CLKCTRL, CM_L4PER_UART6_CLKCTRL, CM_L4SEC_AES1_CLKCTRL,
1168 * CM_L4SEC_AES2_CLKCTRL, CM_L4SEC_DES3DES_CLKCTRL,
1169 * CM_L4SEC_DMA_CRYPTO_CLKCTRL, CM_L4SEC_FPKA_CLKCTRL, CM_L4SEC_RNG_CLKCTRL,
1170 * CM_L4SEC_SHA2MD5_CLKCTRL, CM_MIPIEXT_LLI_CLKCTRL,
1171 * CM_MIPIEXT_LLI_OCP_FW_CLKCTRL, CM_MIPIEXT_MPHY_CLKCTRL, CM_MPU_MPU_CLKCTRL,
1172 * CM_MPU_MPU_MPU_DBG_CLKCTRL, CM_WKUPAON_COUNTER_32K_CLKCTRL,
1173 * CM_WKUPAON_GPIO1_CLKCTRL, CM_WKUPAON_KBD_CLKCTRL,
1174 * CM_WKUPAON_L4_WKUP_CLKCTRL, CM_WKUPAON_SAR_RAM_CLKCTRL,
1175 * CM_WKUPAON_TIMER12_CLKCTRL, CM_WKUPAON_TIMER1_CLKCTRL,
1176 * CM_WKUPAON_WD_TIMER1_CLKCTRL, CM_WKUPAON_WD_TIMER2_CLKCTRL
1177 */
1178#define OMAP54XX_IDLEST_SHIFT 16
1179#define OMAP54XX_IDLEST_WIDTH 0x2
1180#define OMAP54XX_IDLEST_MASK (0x3 << 16)
1181
1182/* Used by CM_L3MAIN2_DYNAMICDEP */
1183#define OMAP54XX_IPU_DYNDEP_SHIFT 0
1184#define OMAP54XX_IPU_DYNDEP_WIDTH 0x1
1185#define OMAP54XX_IPU_DYNDEP_MASK (1 << 0)
1186
1187/* Used by CM_DMA_STATICDEP, CM_MPU_STATICDEP */
1188#define OMAP54XX_IPU_STATDEP_SHIFT 0 65#define OMAP54XX_IPU_STATDEP_SHIFT 0
1189#define OMAP54XX_IPU_STATDEP_WIDTH 0x1
1190#define OMAP54XX_IPU_STATDEP_MASK (1 << 0)
1191
1192/* Used by CM_DSP_DYNAMICDEP, CM_L3MAIN2_DYNAMICDEP */
1193#define OMAP54XX_IVA_DYNDEP_SHIFT 2
1194#define OMAP54XX_IVA_DYNDEP_WIDTH 0x1
1195#define OMAP54XX_IVA_DYNDEP_MASK (1 << 2)
1196
1197/*
1198 * Used by CM_C2C_STATICDEP, CM_CAM_STATICDEP, CM_DMA_STATICDEP,
1199 * CM_DSP_STATICDEP, CM_DSS_STATICDEP, CM_GPU_STATICDEP, CM_IPU_STATICDEP,
1200 * CM_L3INIT_STATICDEP, CM_MIPIEXT_STATICDEP, CM_MPU_STATICDEP
1201 */
1202#define OMAP54XX_IVA_STATDEP_SHIFT 2 66#define OMAP54XX_IVA_STATDEP_SHIFT 2
1203#define OMAP54XX_IVA_STATDEP_WIDTH 0x1
1204#define OMAP54XX_IVA_STATDEP_MASK (1 << 2)
1205
1206/* Used by CM_L4CFG_DYNAMICDEP, CM_L4PER_DYNAMICDEP */
1207#define OMAP54XX_L3INIT_DYNDEP_SHIFT 7
1208#define OMAP54XX_L3INIT_DYNDEP_WIDTH 0x1
1209#define OMAP54XX_L3INIT_DYNDEP_MASK (1 << 7)
1210
1211/*
1212 * Used by CM_C2C_STATICDEP, CM_DMA_STATICDEP, CM_DSP_STATICDEP,
1213 * CM_IPU_STATICDEP, CM_MIPIEXT_STATICDEP, CM_MPU_STATICDEP
1214 */
1215#define OMAP54XX_L3INIT_STATDEP_SHIFT 7 67#define OMAP54XX_L3INIT_STATDEP_SHIFT 7
1216#define OMAP54XX_L3INIT_STATDEP_WIDTH 0x1
1217#define OMAP54XX_L3INIT_STATDEP_MASK (1 << 7)
1218
1219/*
1220 * Used by CM_DSP_DYNAMICDEP, CM_DSS_DYNAMICDEP, CM_L3INIT_DYNAMICDEP,
1221 * CM_L3MAIN2_DYNAMICDEP, CM_L4CFG_DYNAMICDEP, CM_MPU_DYNAMICDEP
1222 */
1223#define OMAP54XX_L3MAIN1_DYNDEP_SHIFT 5
1224#define OMAP54XX_L3MAIN1_DYNDEP_WIDTH 0x1
1225#define OMAP54XX_L3MAIN1_DYNDEP_MASK (1 << 5)
1226
1227/*
1228 * Used by CM_C2C_STATICDEP, CM_CAM_STATICDEP, CM_DMA_STATICDEP,
1229 * CM_DSP_STATICDEP, CM_DSS_STATICDEP, CM_GPU_STATICDEP, CM_IPU_STATICDEP,
1230 * CM_IVA_STATICDEP, CM_L3INIT_STATICDEP, CM_L4SEC_STATICDEP,
1231 * CM_MIPIEXT_STATICDEP, CM_MPU_STATICDEP
1232 */
1233#define OMAP54XX_L3MAIN1_STATDEP_SHIFT 5 68#define OMAP54XX_L3MAIN1_STATDEP_SHIFT 5
1234#define OMAP54XX_L3MAIN1_STATDEP_WIDTH 0x1
1235#define OMAP54XX_L3MAIN1_STATDEP_MASK (1 << 5)
1236
1237/*
1238 * Used by CM_C2C_DYNAMICDEP, CM_CAM_DYNAMICDEP, CM_DMA_DYNAMICDEP,
1239 * CM_DSS_DYNAMICDEP, CM_EMU_DYNAMICDEP, CM_GPU_DYNAMICDEP, CM_IPU_DYNAMICDEP,
1240 * CM_IVA_DYNAMICDEP, CM_L3INIT_DYNAMICDEP, CM_L3MAIN1_DYNAMICDEP,
1241 * CM_L4CFG_DYNAMICDEP, CM_L4SEC_DYNAMICDEP, CM_MIPIEXT_DYNAMICDEP
1242 */
1243#define OMAP54XX_L3MAIN2_DYNDEP_SHIFT 6
1244#define OMAP54XX_L3MAIN2_DYNDEP_WIDTH 0x1
1245#define OMAP54XX_L3MAIN2_DYNDEP_MASK (1 << 6)
1246
1247/*
1248 * Used by CM_C2C_STATICDEP, CM_CAM_STATICDEP, CM_DMA_STATICDEP,
1249 * CM_DSP_STATICDEP, CM_DSS_STATICDEP, CM_GPU_STATICDEP, CM_IPU_STATICDEP,
1250 * CM_IVA_STATICDEP, CM_L3INIT_STATICDEP, CM_L4SEC_STATICDEP,
1251 * CM_MIPIEXT_STATICDEP, CM_MPU_STATICDEP
1252 */
1253#define OMAP54XX_L3MAIN2_STATDEP_SHIFT 6 69#define OMAP54XX_L3MAIN2_STATDEP_SHIFT 6
1254#define OMAP54XX_L3MAIN2_STATDEP_WIDTH 0x1
1255#define OMAP54XX_L3MAIN2_STATDEP_MASK (1 << 6)
1256
1257/* Used by CM_L3MAIN1_DYNAMICDEP */
1258#define OMAP54XX_L4CFG_DYNDEP_SHIFT 12
1259#define OMAP54XX_L4CFG_DYNDEP_WIDTH 0x1
1260#define OMAP54XX_L4CFG_DYNDEP_MASK (1 << 12)
1261
1262/*
1263 * Used by CM_C2C_STATICDEP, CM_DMA_STATICDEP, CM_DSP_STATICDEP,
1264 * CM_IPU_STATICDEP, CM_L3INIT_STATICDEP, CM_MIPIEXT_STATICDEP, CM_MPU_STATICDEP
1265 */
1266#define OMAP54XX_L4CFG_STATDEP_SHIFT 12 70#define OMAP54XX_L4CFG_STATDEP_SHIFT 12
1267#define OMAP54XX_L4CFG_STATDEP_WIDTH 0x1
1268#define OMAP54XX_L4CFG_STATDEP_MASK (1 << 12)
1269
1270/* Used by CM_L3MAIN2_DYNAMICDEP */
1271#define OMAP54XX_L4PER_DYNDEP_SHIFT 13
1272#define OMAP54XX_L4PER_DYNDEP_WIDTH 0x1
1273#define OMAP54XX_L4PER_DYNDEP_MASK (1 << 13)
1274
1275/*
1276 * Used by CM_C2C_STATICDEP, CM_DMA_STATICDEP, CM_DSP_STATICDEP,
1277 * CM_IPU_STATICDEP, CM_L3INIT_STATICDEP, CM_L4SEC_STATICDEP,
1278 * CM_MIPIEXT_STATICDEP, CM_MPU_STATICDEP
1279 */
1280#define OMAP54XX_L4PER_STATDEP_SHIFT 13 71#define OMAP54XX_L4PER_STATDEP_SHIFT 13
1281#define OMAP54XX_L4PER_STATDEP_WIDTH 0x1
1282#define OMAP54XX_L4PER_STATDEP_MASK (1 << 13)
1283
1284/* Used by CM_L3MAIN2_DYNAMICDEP, CM_L4PER_DYNAMICDEP */
1285#define OMAP54XX_L4SEC_DYNDEP_SHIFT 14
1286#define OMAP54XX_L4SEC_DYNDEP_WIDTH 0x1
1287#define OMAP54XX_L4SEC_DYNDEP_MASK (1 << 14)
1288
1289/*
1290 * Used by CM_DMA_STATICDEP, CM_IPU_STATICDEP, CM_L3INIT_STATICDEP,
1291 * CM_MPU_STATICDEP
1292 */
1293#define OMAP54XX_L4SEC_STATDEP_SHIFT 14 72#define OMAP54XX_L4SEC_STATDEP_SHIFT 14
1294#define OMAP54XX_L4SEC_STATDEP_WIDTH 0x1
1295#define OMAP54XX_L4SEC_STATDEP_MASK (1 << 14)
1296
1297/* Used by CM_L3MAIN2_DYNAMICDEP, CM_L4CFG_DYNAMICDEP */
1298#define OMAP54XX_MIPIEXT_DYNDEP_SHIFT 21
1299#define OMAP54XX_MIPIEXT_DYNDEP_WIDTH 0x1
1300#define OMAP54XX_MIPIEXT_DYNDEP_MASK (1 << 21)
1301
1302/* Used by CM_MPU_STATICDEP */
1303#define OMAP54XX_MIPIEXT_STATDEP_SHIFT 21
1304#define OMAP54XX_MIPIEXT_STATDEP_WIDTH 0x1
1305#define OMAP54XX_MIPIEXT_STATDEP_MASK (1 << 21)
1306
1307/*
1308 * Used by CM_SSC_MODFREQDIV_DPLL_ABE, CM_SSC_MODFREQDIV_DPLL_CORE,
1309 * CM_SSC_MODFREQDIV_DPLL_IVA, CM_SSC_MODFREQDIV_DPLL_MPU,
1310 * CM_SSC_MODFREQDIV_DPLL_PER, CM_SSC_MODFREQDIV_DPLL_UNIPRO1,
1311 * CM_SSC_MODFREQDIV_DPLL_UNIPRO2, CM_SSC_MODFREQDIV_DPLL_USB
1312 */
1313#define OMAP54XX_MODFREQDIV_EXPONENT_SHIFT 8
1314#define OMAP54XX_MODFREQDIV_EXPONENT_WIDTH 0x3
1315#define OMAP54XX_MODFREQDIV_EXPONENT_MASK (0x7 << 8)
1316
1317/*
1318 * Used by CM_SSC_MODFREQDIV_DPLL_ABE, CM_SSC_MODFREQDIV_DPLL_CORE,
1319 * CM_SSC_MODFREQDIV_DPLL_IVA, CM_SSC_MODFREQDIV_DPLL_MPU,
1320 * CM_SSC_MODFREQDIV_DPLL_PER, CM_SSC_MODFREQDIV_DPLL_UNIPRO1,
1321 * CM_SSC_MODFREQDIV_DPLL_UNIPRO2, CM_SSC_MODFREQDIV_DPLL_USB
1322 */
1323#define OMAP54XX_MODFREQDIV_MANTISSA_SHIFT 0
1324#define OMAP54XX_MODFREQDIV_MANTISSA_WIDTH 0x7
1325#define OMAP54XX_MODFREQDIV_MANTISSA_MASK (0x7f << 0)
1326
1327/*
1328 * Used by CM_ABE_AESS_CLKCTRL, CM_ABE_DMIC_CLKCTRL, CM_ABE_L4_ABE_CLKCTRL,
1329 * CM_ABE_MCASP_CLKCTRL, CM_ABE_MCBSP1_CLKCTRL, CM_ABE_MCBSP2_CLKCTRL,
1330 * CM_ABE_MCBSP3_CLKCTRL, CM_ABE_MCPDM_CLKCTRL, CM_ABE_SLIMBUS1_CLKCTRL,
1331 * CM_ABE_TIMER5_CLKCTRL, CM_ABE_TIMER6_CLKCTRL, CM_ABE_TIMER7_CLKCTRL,
1332 * CM_ABE_TIMER8_CLKCTRL, CM_ABE_WD_TIMER3_CLKCTRL, CM_C2C_C2C_CLKCTRL,
1333 * CM_C2C_C2C_OCP_FW_CLKCTRL, CM_C2C_MODEM_ICR_CLKCTRL, CM_CAM_CAL_CLKCTRL,
1334 * CM_CAM_FDIF_CLKCTRL, CM_CAM_ISS_CLKCTRL, CM_CM_CORE_AON_PROFILING_CLKCTRL,
1335 * CM_CM_CORE_PROFILING_CLKCTRL, CM_COREAON_SMARTREFLEX_CORE_CLKCTRL,
1336 * CM_COREAON_SMARTREFLEX_MM_CLKCTRL, CM_COREAON_SMARTREFLEX_MPU_CLKCTRL,
1337 * CM_CUSTEFUSE_EFUSE_CTRL_CUST_CLKCTRL, CM_DMA_DMA_SYSTEM_CLKCTRL,
1338 * CM_DSP_DSP_CLKCTRL, CM_DSS_BB2D_CLKCTRL, CM_DSS_DSS_CLKCTRL,
1339 * CM_EMIF_DMM_CLKCTRL, CM_EMIF_EMIF1_CLKCTRL, CM_EMIF_EMIF2_CLKCTRL,
1340 * CM_EMIF_EMIF_OCP_FW_CLKCTRL, CM_EMU_DEBUGSS_CLKCTRL,
1341 * CM_EMU_MPU_EMU_DBG_CLKCTRL, CM_GPU_GPU_CLKCTRL, CM_IPU_IPU_CLKCTRL,
1342 * CM_IVA_IVA_CLKCTRL, CM_IVA_SL2_CLKCTRL, CM_L3INIT_HSI_CLKCTRL,
1343 * CM_L3INIT_IEEE1500_2_OCP_CLKCTRL, CM_L3INIT_MMC1_CLKCTRL,
1344 * CM_L3INIT_MMC2_CLKCTRL, CM_L3INIT_MPHY_UNIPRO2_CLKCTRL,
1345 * CM_L3INIT_OCP2SCP1_CLKCTRL, CM_L3INIT_OCP2SCP3_CLKCTRL,
1346 * CM_L3INIT_SATA_CLKCTRL, CM_L3INIT_UNIPRO2_CLKCTRL,
1347 * CM_L3INIT_USB_HOST_HS_CLKCTRL, CM_L3INIT_USB_OTG_SS_CLKCTRL,
1348 * CM_L3INIT_USB_TLL_HS_CLKCTRL, CM_L3INSTR_CTRL_MODULE_BANDGAP_CLKCTRL,
1349 * CM_L3INSTR_DLL_AGING_CLKCTRL, CM_L3INSTR_L3_INSTR_CLKCTRL,
1350 * CM_L3INSTR_L3_MAIN_3_CLKCTRL, CM_L3INSTR_OCP_WP_NOC_CLKCTRL,
1351 * CM_L3MAIN1_L3_MAIN_1_CLKCTRL, CM_L3MAIN2_GPMC_CLKCTRL,
1352 * CM_L3MAIN2_L3_MAIN_2_CLKCTRL, CM_L3MAIN2_OCMC_RAM_CLKCTRL,
1353 * CM_L4CFG_L4_CFG_CLKCTRL, CM_L4CFG_MAILBOX_CLKCTRL,
1354 * CM_L4CFG_OCP2SCP2_CLKCTRL, CM_L4CFG_SAR_ROM_CLKCTRL,
1355 * CM_L4CFG_SPINLOCK_CLKCTRL, CM_L4PER_ELM_CLKCTRL, CM_L4PER_GPIO2_CLKCTRL,
1356 * CM_L4PER_GPIO3_CLKCTRL, CM_L4PER_GPIO4_CLKCTRL, CM_L4PER_GPIO5_CLKCTRL,
1357 * CM_L4PER_GPIO6_CLKCTRL, CM_L4PER_GPIO7_CLKCTRL, CM_L4PER_GPIO8_CLKCTRL,
1358 * CM_L4PER_HDQ1W_CLKCTRL, CM_L4PER_I2C1_CLKCTRL, CM_L4PER_I2C2_CLKCTRL,
1359 * CM_L4PER_I2C3_CLKCTRL, CM_L4PER_I2C4_CLKCTRL, CM_L4PER_I2C5_CLKCTRL,
1360 * CM_L4PER_L4_PER_CLKCTRL, CM_L4PER_MCSPI1_CLKCTRL, CM_L4PER_MCSPI2_CLKCTRL,
1361 * CM_L4PER_MCSPI3_CLKCTRL, CM_L4PER_MCSPI4_CLKCTRL, CM_L4PER_MMC3_CLKCTRL,
1362 * CM_L4PER_MMC4_CLKCTRL, CM_L4PER_MMC5_CLKCTRL, CM_L4PER_TIMER10_CLKCTRL,
1363 * CM_L4PER_TIMER11_CLKCTRL, CM_L4PER_TIMER2_CLKCTRL, CM_L4PER_TIMER3_CLKCTRL,
1364 * CM_L4PER_TIMER4_CLKCTRL, CM_L4PER_TIMER9_CLKCTRL, CM_L4PER_UART1_CLKCTRL,
1365 * CM_L4PER_UART2_CLKCTRL, CM_L4PER_UART3_CLKCTRL, CM_L4PER_UART4_CLKCTRL,
1366 * CM_L4PER_UART5_CLKCTRL, CM_L4PER_UART6_CLKCTRL, CM_L4SEC_AES1_CLKCTRL,
1367 * CM_L4SEC_AES2_CLKCTRL, CM_L4SEC_DES3DES_CLKCTRL,
1368 * CM_L4SEC_DMA_CRYPTO_CLKCTRL, CM_L4SEC_FPKA_CLKCTRL, CM_L4SEC_RNG_CLKCTRL,
1369 * CM_L4SEC_SHA2MD5_CLKCTRL, CM_MIPIEXT_LLI_CLKCTRL,
1370 * CM_MIPIEXT_LLI_OCP_FW_CLKCTRL, CM_MIPIEXT_MPHY_CLKCTRL, CM_MPU_MPU_CLKCTRL,
1371 * CM_MPU_MPU_MPU_DBG_CLKCTRL, CM_WKUPAON_COUNTER_32K_CLKCTRL,
1372 * CM_WKUPAON_GPIO1_CLKCTRL, CM_WKUPAON_KBD_CLKCTRL,
1373 * CM_WKUPAON_L4_WKUP_CLKCTRL, CM_WKUPAON_SAR_RAM_CLKCTRL,
1374 * CM_WKUPAON_TIMER12_CLKCTRL, CM_WKUPAON_TIMER1_CLKCTRL,
1375 * CM_WKUPAON_WD_TIMER1_CLKCTRL, CM_WKUPAON_WD_TIMER2_CLKCTRL
1376 */
1377#define OMAP54XX_MODULEMODE_SHIFT 0
1378#define OMAP54XX_MODULEMODE_WIDTH 0x2
1379#define OMAP54XX_MODULEMODE_MASK (0x3 << 0)
1380
1381/* Used by CM_L4CFG_DYNAMICDEP */
1382#define OMAP54XX_MPU_DYNDEP_SHIFT 19
1383#define OMAP54XX_MPU_DYNDEP_WIDTH 0x1
1384#define OMAP54XX_MPU_DYNDEP_MASK (1 << 19)
1385
1386/* Used by CM_DSS_DSS_CLKCTRL */
1387#define OMAP54XX_OPTFCLKEN_32KHZ_CLK_SHIFT 11 73#define OMAP54XX_OPTFCLKEN_32KHZ_CLK_SHIFT 11
1388#define OMAP54XX_OPTFCLKEN_32KHZ_CLK_WIDTH 0x1
1389#define OMAP54XX_OPTFCLKEN_32KHZ_CLK_MASK (1 << 11)
1390
1391/* Renamed from OPTFCLKEN_32KHZ_CLK Used by CM_L3INIT_MMC1_CLKCTRL */
1392#define OMAP54XX_OPTFCLKEN_32KHZ_CLK_8_8_SHIFT 8 74#define OMAP54XX_OPTFCLKEN_32KHZ_CLK_8_8_SHIFT 8
1393#define OMAP54XX_OPTFCLKEN_32KHZ_CLK_8_8_WIDTH 0x1
1394#define OMAP54XX_OPTFCLKEN_32KHZ_CLK_8_8_MASK (1 << 8)
1395
1396/* Used by CM_DSS_DSS_CLKCTRL */
1397#define OMAP54XX_OPTFCLKEN_48MHZ_CLK_SHIFT 9 75#define OMAP54XX_OPTFCLKEN_48MHZ_CLK_SHIFT 9
1398#define OMAP54XX_OPTFCLKEN_48MHZ_CLK_WIDTH 0x1
1399#define OMAP54XX_OPTFCLKEN_48MHZ_CLK_MASK (1 << 9)
1400
1401/* Used by CM_COREAON_USB_PHY_CORE_CLKCTRL */
1402#define OMAP54XX_OPTFCLKEN_CLK32K_SHIFT 8 76#define OMAP54XX_OPTFCLKEN_CLK32K_SHIFT 8
1403#define OMAP54XX_OPTFCLKEN_CLK32K_WIDTH 0x1
1404#define OMAP54XX_OPTFCLKEN_CLK32K_MASK (1 << 8)
1405
1406/* Used by CM_CAM_ISS_CLKCTRL */
1407#define OMAP54XX_OPTFCLKEN_CTRLCLK_SHIFT 8 77#define OMAP54XX_OPTFCLKEN_CTRLCLK_SHIFT 8
1408#define OMAP54XX_OPTFCLKEN_CTRLCLK_WIDTH 0x1
1409#define OMAP54XX_OPTFCLKEN_CTRLCLK_MASK (1 << 8)
1410
1411/*
1412 * Used by CM_L4PER_GPIO2_CLKCTRL, CM_L4PER_GPIO3_CLKCTRL,
1413 * CM_L4PER_GPIO4_CLKCTRL, CM_L4PER_GPIO5_CLKCTRL, CM_L4PER_GPIO6_CLKCTRL,
1414 * CM_L4PER_GPIO7_CLKCTRL, CM_L4PER_GPIO8_CLKCTRL, CM_WKUPAON_GPIO1_CLKCTRL
1415 */
1416#define OMAP54XX_OPTFCLKEN_DBCLK_SHIFT 8 78#define OMAP54XX_OPTFCLKEN_DBCLK_SHIFT 8
1417#define OMAP54XX_OPTFCLKEN_DBCLK_WIDTH 0x1
1418#define OMAP54XX_OPTFCLKEN_DBCLK_MASK (1 << 8)
1419
1420/* Used by CM_EMIF_EMIF_DLL_CLKCTRL */
1421#define OMAP54XX_OPTFCLKEN_DLL_CLK_SHIFT 8
1422#define OMAP54XX_OPTFCLKEN_DLL_CLK_WIDTH 0x1
1423#define OMAP54XX_OPTFCLKEN_DLL_CLK_MASK (1 << 8)
1424
1425/* Used by CM_DSS_DSS_CLKCTRL */
1426#define OMAP54XX_OPTFCLKEN_DSSCLK_SHIFT 8 79#define OMAP54XX_OPTFCLKEN_DSSCLK_SHIFT 8
1427#define OMAP54XX_OPTFCLKEN_DSSCLK_WIDTH 0x1
1428#define OMAP54XX_OPTFCLKEN_DSSCLK_MASK (1 << 8)
1429
1430/* Used by CM_ABE_SLIMBUS1_CLKCTRL */
1431#define OMAP54XX_OPTFCLKEN_FCLK0_SHIFT 8
1432#define OMAP54XX_OPTFCLKEN_FCLK0_WIDTH 0x1
1433#define OMAP54XX_OPTFCLKEN_FCLK0_MASK (1 << 8)
1434
1435/* Used by CM_ABE_SLIMBUS1_CLKCTRL */
1436#define OMAP54XX_OPTFCLKEN_FCLK1_SHIFT 9
1437#define OMAP54XX_OPTFCLKEN_FCLK1_WIDTH 0x1
1438#define OMAP54XX_OPTFCLKEN_FCLK1_MASK (1 << 9)
1439
1440/* Used by CM_ABE_SLIMBUS1_CLKCTRL */
1441#define OMAP54XX_OPTFCLKEN_FCLK2_SHIFT 10
1442#define OMAP54XX_OPTFCLKEN_FCLK2_WIDTH 0x1
1443#define OMAP54XX_OPTFCLKEN_FCLK2_MASK (1 << 10)
1444
1445/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL */
1446#define OMAP54XX_OPTFCLKEN_FUNC48M_CLK_SHIFT 15
1447#define OMAP54XX_OPTFCLKEN_FUNC48M_CLK_WIDTH 0x1
1448#define OMAP54XX_OPTFCLKEN_FUNC48M_CLK_MASK (1 << 15)
1449
1450/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL */
1451#define OMAP54XX_OPTFCLKEN_HSIC480M_P1_CLK_SHIFT 13 80#define OMAP54XX_OPTFCLKEN_HSIC480M_P1_CLK_SHIFT 13
1452#define OMAP54XX_OPTFCLKEN_HSIC480M_P1_CLK_WIDTH 0x1
1453#define OMAP54XX_OPTFCLKEN_HSIC480M_P1_CLK_MASK (1 << 13)
1454
1455/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL */
1456#define OMAP54XX_OPTFCLKEN_HSIC480M_P2_CLK_SHIFT 14 81#define OMAP54XX_OPTFCLKEN_HSIC480M_P2_CLK_SHIFT 14
1457#define OMAP54XX_OPTFCLKEN_HSIC480M_P2_CLK_WIDTH 0x1
1458#define OMAP54XX_OPTFCLKEN_HSIC480M_P2_CLK_MASK (1 << 14)
1459
1460/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL */
1461#define OMAP54XX_OPTFCLKEN_HSIC480M_P3_CLK_SHIFT 7 82#define OMAP54XX_OPTFCLKEN_HSIC480M_P3_CLK_SHIFT 7
1462#define OMAP54XX_OPTFCLKEN_HSIC480M_P3_CLK_WIDTH 0x1
1463#define OMAP54XX_OPTFCLKEN_HSIC480M_P3_CLK_MASK (1 << 7)
1464
1465/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL */
1466#define OMAP54XX_OPTFCLKEN_HSIC60M_P1_CLK_SHIFT 11 83#define OMAP54XX_OPTFCLKEN_HSIC60M_P1_CLK_SHIFT 11
1467#define OMAP54XX_OPTFCLKEN_HSIC60M_P1_CLK_WIDTH 0x1
1468#define OMAP54XX_OPTFCLKEN_HSIC60M_P1_CLK_MASK (1 << 11)
1469
1470/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL */
1471#define OMAP54XX_OPTFCLKEN_HSIC60M_P2_CLK_SHIFT 12 84#define OMAP54XX_OPTFCLKEN_HSIC60M_P2_CLK_SHIFT 12
1472#define OMAP54XX_OPTFCLKEN_HSIC60M_P2_CLK_WIDTH 0x1
1473#define OMAP54XX_OPTFCLKEN_HSIC60M_P2_CLK_MASK (1 << 12)
1474
1475/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL */
1476#define OMAP54XX_OPTFCLKEN_HSIC60M_P3_CLK_SHIFT 6 85#define OMAP54XX_OPTFCLKEN_HSIC60M_P3_CLK_SHIFT 6
1477#define OMAP54XX_OPTFCLKEN_HSIC60M_P3_CLK_WIDTH 0x1
1478#define OMAP54XX_OPTFCLKEN_HSIC60M_P3_CLK_MASK (1 << 6)
1479
1480/* Used by CM_L3INIT_USB_OTG_SS_CLKCTRL */
1481#define OMAP54XX_OPTFCLKEN_REFCLK960M_SHIFT 8 86#define OMAP54XX_OPTFCLKEN_REFCLK960M_SHIFT 8
1482#define OMAP54XX_OPTFCLKEN_REFCLK960M_WIDTH 0x1
1483#define OMAP54XX_OPTFCLKEN_REFCLK960M_MASK (1 << 8)
1484
1485/* Used by CM_L3INIT_SATA_CLKCTRL */
1486#define OMAP54XX_OPTFCLKEN_REF_CLK_SHIFT 8 87#define OMAP54XX_OPTFCLKEN_REF_CLK_SHIFT 8
1487#define OMAP54XX_OPTFCLKEN_REF_CLK_WIDTH 0x1
1488#define OMAP54XX_OPTFCLKEN_REF_CLK_MASK (1 << 8)
1489
1490/* Used by CM_WKUPAON_SCRM_CLKCTRL */
1491#define OMAP54XX_OPTFCLKEN_SCRM_CORE_SHIFT 8
1492#define OMAP54XX_OPTFCLKEN_SCRM_CORE_WIDTH 0x1
1493#define OMAP54XX_OPTFCLKEN_SCRM_CORE_MASK (1 << 8)
1494
1495/* Used by CM_WKUPAON_SCRM_CLKCTRL */
1496#define OMAP54XX_OPTFCLKEN_SCRM_PER_SHIFT 9
1497#define OMAP54XX_OPTFCLKEN_SCRM_PER_WIDTH 0x1
1498#define OMAP54XX_OPTFCLKEN_SCRM_PER_MASK (1 << 9)
1499
1500/* Used by CM_ABE_SLIMBUS1_CLKCTRL */
1501#define OMAP54XX_OPTFCLKEN_SLIMBUS_CLK_SHIFT 11 88#define OMAP54XX_OPTFCLKEN_SLIMBUS_CLK_SHIFT 11
1502#define OMAP54XX_OPTFCLKEN_SLIMBUS_CLK_WIDTH 0x1
1503#define OMAP54XX_OPTFCLKEN_SLIMBUS_CLK_MASK (1 << 11)
1504
1505/* Used by CM_DSS_DSS_CLKCTRL */
1506#define OMAP54XX_OPTFCLKEN_SYS_CLK_SHIFT 10 89#define OMAP54XX_OPTFCLKEN_SYS_CLK_SHIFT 10
1507#define OMAP54XX_OPTFCLKEN_SYS_CLK_WIDTH 0x1
1508#define OMAP54XX_OPTFCLKEN_SYS_CLK_MASK (1 << 10)
1509
1510/* Used by CM_MIPIEXT_LLI_CLKCTRL */
1511#define OMAP54XX_OPTFCLKEN_TXPHY_CLK_SHIFT 8 90#define OMAP54XX_OPTFCLKEN_TXPHY_CLK_SHIFT 8
1512#define OMAP54XX_OPTFCLKEN_TXPHY_CLK_WIDTH 0x1
1513#define OMAP54XX_OPTFCLKEN_TXPHY_CLK_MASK (1 << 8)
1514
1515/* Used by CM_MIPIEXT_LLI_CLKCTRL */
1516#define OMAP54XX_OPTFCLKEN_TXPHY_LS_CLK_SHIFT 9 91#define OMAP54XX_OPTFCLKEN_TXPHY_LS_CLK_SHIFT 9
1517#define OMAP54XX_OPTFCLKEN_TXPHY_LS_CLK_WIDTH 0x1
1518#define OMAP54XX_OPTFCLKEN_TXPHY_LS_CLK_MASK (1 << 9)
1519
1520/* Used by CM_L3INIT_USB_TLL_HS_CLKCTRL */
1521#define OMAP54XX_OPTFCLKEN_USB_CH0_CLK_SHIFT 8 92#define OMAP54XX_OPTFCLKEN_USB_CH0_CLK_SHIFT 8
1522#define OMAP54XX_OPTFCLKEN_USB_CH0_CLK_WIDTH 0x1
1523#define OMAP54XX_OPTFCLKEN_USB_CH0_CLK_MASK (1 << 8)
1524
1525/* Used by CM_L3INIT_USB_TLL_HS_CLKCTRL */
1526#define OMAP54XX_OPTFCLKEN_USB_CH1_CLK_SHIFT 9 93#define OMAP54XX_OPTFCLKEN_USB_CH1_CLK_SHIFT 9
1527#define OMAP54XX_OPTFCLKEN_USB_CH1_CLK_WIDTH 0x1
1528#define OMAP54XX_OPTFCLKEN_USB_CH1_CLK_MASK (1 << 9)
1529
1530/* Used by CM_L3INIT_USB_TLL_HS_CLKCTRL */
1531#define OMAP54XX_OPTFCLKEN_USB_CH2_CLK_SHIFT 10 94#define OMAP54XX_OPTFCLKEN_USB_CH2_CLK_SHIFT 10
1532#define OMAP54XX_OPTFCLKEN_USB_CH2_CLK_WIDTH 0x1
1533#define OMAP54XX_OPTFCLKEN_USB_CH2_CLK_MASK (1 << 10)
1534
1535/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL */
1536#define OMAP54XX_OPTFCLKEN_UTMI_P1_CLK_SHIFT 8 95#define OMAP54XX_OPTFCLKEN_UTMI_P1_CLK_SHIFT 8
1537#define OMAP54XX_OPTFCLKEN_UTMI_P1_CLK_WIDTH 0x1
1538#define OMAP54XX_OPTFCLKEN_UTMI_P1_CLK_MASK (1 << 8)
1539
1540/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL */
1541#define OMAP54XX_OPTFCLKEN_UTMI_P2_CLK_SHIFT 9 96#define OMAP54XX_OPTFCLKEN_UTMI_P2_CLK_SHIFT 9
1542#define OMAP54XX_OPTFCLKEN_UTMI_P2_CLK_WIDTH 0x1
1543#define OMAP54XX_OPTFCLKEN_UTMI_P2_CLK_MASK (1 << 9)
1544
1545/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL */
1546#define OMAP54XX_OPTFCLKEN_UTMI_P3_CLK_SHIFT 10 97#define OMAP54XX_OPTFCLKEN_UTMI_P3_CLK_SHIFT 10
1547#define OMAP54XX_OPTFCLKEN_UTMI_P3_CLK_WIDTH 0x1
1548#define OMAP54XX_OPTFCLKEN_UTMI_P3_CLK_MASK (1 << 10)
1549
1550/* Used by CM_CORE_AON_DEBUG_OUT, CM_CORE_DEBUG_OUT */
1551#define OMAP54XX_OUTPUT_SHIFT 0
1552#define OMAP54XX_OUTPUT_WIDTH 0x20
1553#define OMAP54XX_OUTPUT_MASK (0xffffffff << 0)
1554
1555/* Used by CM_CLKSEL_ABE */
1556#define OMAP54XX_PAD_CLKS_GATE_SHIFT 8 98#define OMAP54XX_PAD_CLKS_GATE_SHIFT 8
1557#define OMAP54XX_PAD_CLKS_GATE_WIDTH 0x1
1558#define OMAP54XX_PAD_CLKS_GATE_MASK (1 << 8)
1559
1560/* Used by CM_RESTORE_ST */
1561#define OMAP54XX_PHASE1_COMPLETED_SHIFT 0
1562#define OMAP54XX_PHASE1_COMPLETED_WIDTH 0x1
1563#define OMAP54XX_PHASE1_COMPLETED_MASK (1 << 0)
1564
1565/* Used by CM_RESTORE_ST */
1566#define OMAP54XX_PHASE2A_COMPLETED_SHIFT 1
1567#define OMAP54XX_PHASE2A_COMPLETED_WIDTH 0x1
1568#define OMAP54XX_PHASE2A_COMPLETED_MASK (1 << 1)
1569
1570/* Used by CM_RESTORE_ST */
1571#define OMAP54XX_PHASE2B_COMPLETED_SHIFT 2
1572#define OMAP54XX_PHASE2B_COMPLETED_WIDTH 0x1
1573#define OMAP54XX_PHASE2B_COMPLETED_MASK (1 << 2)
1574
1575/* Used by CM_DYN_DEP_PRESCAL */
1576#define OMAP54XX_PRESCAL_SHIFT 0
1577#define OMAP54XX_PRESCAL_WIDTH 0x6
1578#define OMAP54XX_PRESCAL_MASK (0x3f << 0)
1579
1580/* Used by REVISION_CM_CORE, REVISION_CM_CORE_AON */
1581#define OMAP54XX_R_RTL_SHIFT 11
1582#define OMAP54XX_R_RTL_WIDTH 0x5
1583#define OMAP54XX_R_RTL_MASK (0x1f << 11)
1584
1585/* Used by CM_L3INIT_USB_HOST_HS_CLKCTRL, CM_L3INIT_USB_TLL_HS_CLKCTRL */
1586#define OMAP54XX_SAR_MODE_SHIFT 4
1587#define OMAP54XX_SAR_MODE_WIDTH 0x1
1588#define OMAP54XX_SAR_MODE_MASK (1 << 4)
1589
1590/* Used by REVISION_CM_CORE, REVISION_CM_CORE_AON */
1591#define OMAP54XX_SCHEME_SHIFT 30
1592#define OMAP54XX_SCHEME_WIDTH 0x2
1593#define OMAP54XX_SCHEME_MASK (0x3 << 30)
1594
1595/* Used by CM_L4CFG_DYNAMICDEP */
1596#define OMAP54XX_SDMA_DYNDEP_SHIFT 11
1597#define OMAP54XX_SDMA_DYNDEP_WIDTH 0x1
1598#define OMAP54XX_SDMA_DYNDEP_MASK (1 << 11)
1599
1600/* Used by CM_IPU_STATICDEP, CM_MPU_STATICDEP */
1601#define OMAP54XX_SDMA_STATDEP_SHIFT 11
1602#define OMAP54XX_SDMA_STATDEP_WIDTH 0x1
1603#define OMAP54XX_SDMA_STATDEP_MASK (1 << 11)
1604
1605/* Used by CM_CORE_AON_DEBUG_CFG */
1606#define OMAP54XX_SEL0_SHIFT 0
1607#define OMAP54XX_SEL0_WIDTH 0x7
1608#define OMAP54XX_SEL0_MASK (0x7f << 0)
1609
1610/* Renamed from SEL0 Used by CM_CORE_DEBUG_CFG */
1611#define OMAP54XX_SEL0_0_7_SHIFT 0
1612#define OMAP54XX_SEL0_0_7_WIDTH 0x8
1613#define OMAP54XX_SEL0_0_7_MASK (0xff << 0)
1614
1615/* Used by CM_CORE_AON_DEBUG_CFG */
1616#define OMAP54XX_SEL1_SHIFT 8
1617#define OMAP54XX_SEL1_WIDTH 0x7
1618#define OMAP54XX_SEL1_MASK (0x7f << 8)
1619
1620/* Renamed from SEL1 Used by CM_CORE_DEBUG_CFG */
1621#define OMAP54XX_SEL1_CORE_DEBUG_CFG_SHIFT 8
1622#define OMAP54XX_SEL1_CORE_DEBUG_CFG_WIDTH 0x8
1623#define OMAP54XX_SEL1_CORE_DEBUG_CFG_MASK (0xff << 8)
1624
1625/* Used by CM_CORE_AON_DEBUG_CFG */
1626#define OMAP54XX_SEL2_SHIFT 16
1627#define OMAP54XX_SEL2_WIDTH 0x7
1628#define OMAP54XX_SEL2_MASK (0x7f << 16)
1629
1630/* Renamed from SEL2 Used by CM_CORE_DEBUG_CFG */
1631#define OMAP54XX_SEL2_CORE_DEBUG_CFG_SHIFT 16
1632#define OMAP54XX_SEL2_CORE_DEBUG_CFG_WIDTH 0x8
1633#define OMAP54XX_SEL2_CORE_DEBUG_CFG_MASK (0xff << 16)
1634
1635/* Used by CM_CORE_AON_DEBUG_CFG */
1636#define OMAP54XX_SEL3_SHIFT 24
1637#define OMAP54XX_SEL3_WIDTH 0x7
1638#define OMAP54XX_SEL3_MASK (0x7f << 24)
1639
1640/* Renamed from SEL3 Used by CM_CORE_DEBUG_CFG */
1641#define OMAP54XX_SEL3_CORE_DEBUG_CFG_SHIFT 24
1642#define OMAP54XX_SEL3_CORE_DEBUG_CFG_WIDTH 0x8
1643#define OMAP54XX_SEL3_CORE_DEBUG_CFG_MASK (0xff << 24)
1644
1645/* Used by CM_CLKSEL_ABE */
1646#define OMAP54XX_SLIMBUS1_CLK_GATE_SHIFT 10 99#define OMAP54XX_SLIMBUS1_CLK_GATE_SHIFT 10
1647#define OMAP54XX_SLIMBUS1_CLK_GATE_WIDTH 0x1
1648#define OMAP54XX_SLIMBUS1_CLK_GATE_MASK (1 << 10)
1649
1650/*
1651 * Used by CM_ABE_AESS_CLKCTRL, CM_C2C_C2C_CLKCTRL, CM_CAM_FDIF_CLKCTRL,
1652 * CM_CAM_ISS_CLKCTRL, CM_DMA_DMA_SYSTEM_CLKCTRL, CM_DSP_DSP_CLKCTRL,
1653 * CM_DSS_BB2D_CLKCTRL, CM_DSS_DSS_CLKCTRL, CM_EMU_DEBUGSS_CLKCTRL,
1654 * CM_GPU_GPU_CLKCTRL, CM_IPU_IPU_CLKCTRL, CM_IVA_IVA_CLKCTRL,
1655 * CM_L3INIT_HSI_CLKCTRL, CM_L3INIT_IEEE1500_2_OCP_CLKCTRL,
1656 * CM_L3INIT_MMC1_CLKCTRL, CM_L3INIT_MMC2_CLKCTRL, CM_L3INIT_SATA_CLKCTRL,
1657 * CM_L3INIT_UNIPRO2_CLKCTRL, CM_L3INIT_USB_HOST_HS_CLKCTRL,
1658 * CM_L3INIT_USB_OTG_SS_CLKCTRL, CM_L4SEC_DMA_CRYPTO_CLKCTRL,
1659 * CM_MIPIEXT_LLI_CLKCTRL, CM_MPU_MPU_CLKCTRL
1660 */
1661#define OMAP54XX_STBYST_SHIFT 18
1662#define OMAP54XX_STBYST_WIDTH 0x1
1663#define OMAP54XX_STBYST_MASK (1 << 18)
1664
1665/*
1666 * Used by CM_IDLEST_DPLL_ABE, CM_IDLEST_DPLL_CORE, CM_IDLEST_DPLL_IVA,
1667 * CM_IDLEST_DPLL_MPU, CM_IDLEST_DPLL_PER, CM_IDLEST_DPLL_UNIPRO1,
1668 * CM_IDLEST_DPLL_UNIPRO2, CM_IDLEST_DPLL_USB
1669 */
1670#define OMAP54XX_ST_DPLL_CLK_SHIFT 0
1671#define OMAP54XX_ST_DPLL_CLK_WIDTH 0x1
1672#define OMAP54XX_ST_DPLL_CLK_MASK (1 << 0) 100#define OMAP54XX_ST_DPLL_CLK_MASK (1 << 0)
1673
1674/*
1675 * Used by CM_CLKDCOLDO_DPLL_UNIPRO1, CM_CLKDCOLDO_DPLL_UNIPRO2,
1676 * CM_CLKDCOLDO_DPLL_USB
1677 */
1678#define OMAP54XX_ST_DPLL_CLKDCOLDO_SHIFT 9
1679#define OMAP54XX_ST_DPLL_CLKDCOLDO_WIDTH 0x1
1680#define OMAP54XX_ST_DPLL_CLKDCOLDO_MASK (1 << 9)
1681
1682/*
1683 * Used by CM_IDLEST_DPLL_ABE, CM_IDLEST_DPLL_CORE, CM_IDLEST_DPLL_IVA,
1684 * CM_IDLEST_DPLL_MPU, CM_IDLEST_DPLL_PER, CM_IDLEST_DPLL_UNIPRO1,
1685 * CM_IDLEST_DPLL_UNIPRO2, CM_IDLEST_DPLL_USB
1686 */
1687#define OMAP54XX_ST_DPLL_INIT_SHIFT 4
1688#define OMAP54XX_ST_DPLL_INIT_WIDTH 0x1
1689#define OMAP54XX_ST_DPLL_INIT_MASK (1 << 4)
1690
1691/*
1692 * Used by CM_IDLEST_DPLL_ABE, CM_IDLEST_DPLL_CORE, CM_IDLEST_DPLL_IVA,
1693 * CM_IDLEST_DPLL_MPU, CM_IDLEST_DPLL_PER, CM_IDLEST_DPLL_UNIPRO1,
1694 * CM_IDLEST_DPLL_UNIPRO2, CM_IDLEST_DPLL_USB
1695 */
1696#define OMAP54XX_ST_DPLL_MODE_SHIFT 1
1697#define OMAP54XX_ST_DPLL_MODE_WIDTH 0x3
1698#define OMAP54XX_ST_DPLL_MODE_MASK (0x7 << 1)
1699
1700/* Used by CM_CLKSEL_SYS */
1701#define OMAP54XX_SYS_CLKSEL_SHIFT 0 101#define OMAP54XX_SYS_CLKSEL_SHIFT 0
1702#define OMAP54XX_SYS_CLKSEL_WIDTH 0x3 102#define OMAP54XX_SYS_CLKSEL_WIDTH 0x3
1703#define OMAP54XX_SYS_CLKSEL_MASK (0x7 << 0)
1704
1705/*
1706 * Used by CM_C2C_DYNAMICDEP, CM_DSP_DYNAMICDEP, CM_EMU_DYNAMICDEP,
1707 * CM_IPU_DYNAMICDEP, CM_L3MAIN1_DYNAMICDEP, CM_L3MAIN2_DYNAMICDEP,
1708 * CM_L4CFG_DYNAMICDEP, CM_L4PER_DYNAMICDEP, CM_MIPIEXT_DYNAMICDEP,
1709 * CM_MPU_DYNAMICDEP
1710 */
1711#define OMAP54XX_WINDOWSIZE_SHIFT 24
1712#define OMAP54XX_WINDOWSIZE_WIDTH 0x4
1713#define OMAP54XX_WINDOWSIZE_MASK (0xf << 24)
1714
1715/* Used by CM_L3MAIN1_DYNAMICDEP */
1716#define OMAP54XX_WKUPAON_DYNDEP_SHIFT 15
1717#define OMAP54XX_WKUPAON_DYNDEP_WIDTH 0x1
1718#define OMAP54XX_WKUPAON_DYNDEP_MASK (1 << 15)
1719
1720/*
1721 * Used by CM_DMA_STATICDEP, CM_DSP_STATICDEP, CM_IPU_STATICDEP,
1722 * CM_L3INIT_STATICDEP, CM_MPU_STATICDEP
1723 */
1724#define OMAP54XX_WKUPAON_STATDEP_SHIFT 15 103#define OMAP54XX_WKUPAON_STATDEP_SHIFT 15
1725#define OMAP54XX_WKUPAON_STATDEP_WIDTH 0x1
1726#define OMAP54XX_WKUPAON_STATDEP_MASK (1 << 15)
1727
1728/* Used by REVISION_CM_CORE, REVISION_CM_CORE_AON */
1729#define OMAP54XX_X_MAJOR_SHIFT 8
1730#define OMAP54XX_X_MAJOR_WIDTH 0x3
1731#define OMAP54XX_X_MAJOR_MASK (0x7 << 8)
1732
1733/* Used by REVISION_CM_CORE, REVISION_CM_CORE_AON */
1734#define OMAP54XX_Y_MINOR_SHIFT 0
1735#define OMAP54XX_Y_MINOR_WIDTH 0x6
1736#define OMAP54XX_Y_MINOR_MASK (0x3f << 0)
1737#endif 104#endif
diff --git a/arch/arm/mach-omap2/cm-regbits-7xx.h b/arch/arm/mach-omap2/cm-regbits-7xx.h
new file mode 100644
index 000000000000..ad8f81ce9b16
--- /dev/null
+++ b/arch/arm/mach-omap2/cm-regbits-7xx.h
@@ -0,0 +1,51 @@
1/*
2 * DRA7xx Clock Management register bits
3 *
4 * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
5 *
6 * Generated by code originally written by:
7 * Paul Walmsley (paul@pwsan.com)
8 * Rajendra Nayak (rnayak@ti.com)
9 * Benoit Cousson (b-cousson@ti.com)
10 *
11 * This file is automatically generated from the OMAP hardware databases.
12 * We respectfully ask that any modifications to this file be coordinated
13 * with the public linux-omap@vger.kernel.org mailing list and the
14 * authors above to ensure that the autogeneration scripts are kept
15 * up-to-date with the file contents.
16 *
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License version 2 as
19 * published by the Free Software Foundation.
20 */
21
22#ifndef __ARCH_ARM_MACH_OMAP2_CM_REGBITS_7XX_H
23#define __ARCH_ARM_MACH_OMAP2_CM_REGBITS_7XX_H
24
25#define DRA7XX_ATL_STATDEP_SHIFT 30
26#define DRA7XX_CAM_STATDEP_SHIFT 9
27#define DRA7XX_DSP1_STATDEP_SHIFT 1
28#define DRA7XX_DSP2_STATDEP_SHIFT 18
29#define DRA7XX_DSS_STATDEP_SHIFT 8
30#define DRA7XX_EMIF_STATDEP_SHIFT 4
31#define DRA7XX_EVE1_STATDEP_SHIFT 19
32#define DRA7XX_EVE2_STATDEP_SHIFT 20
33#define DRA7XX_EVE3_STATDEP_SHIFT 21
34#define DRA7XX_EVE4_STATDEP_SHIFT 22
35#define DRA7XX_GMAC_STATDEP_SHIFT 25
36#define DRA7XX_GPU_STATDEP_SHIFT 10
37#define DRA7XX_IPU1_STATDEP_SHIFT 23
38#define DRA7XX_IPU2_STATDEP_SHIFT 0
39#define DRA7XX_IPU_STATDEP_SHIFT 24
40#define DRA7XX_IVA_STATDEP_SHIFT 2
41#define DRA7XX_L3INIT_STATDEP_SHIFT 7
42#define DRA7XX_L3MAIN1_STATDEP_SHIFT 5
43#define DRA7XX_L4CFG_STATDEP_SHIFT 12
44#define DRA7XX_L4PER2_STATDEP_SHIFT 26
45#define DRA7XX_L4PER3_STATDEP_SHIFT 27
46#define DRA7XX_L4PER_STATDEP_SHIFT 13
47#define DRA7XX_L4SEC_STATDEP_SHIFT 14
48#define DRA7XX_PCIE_STATDEP_SHIFT 29
49#define DRA7XX_VPE_STATDEP_SHIFT 28
50#define DRA7XX_WKUPAON_STATDEP_SHIFT 15
51#endif
diff --git a/arch/arm/mach-omap2/cm1_7xx.h b/arch/arm/mach-omap2/cm1_7xx.h
new file mode 100644
index 000000000000..ca6fa1febaac
--- /dev/null
+++ b/arch/arm/mach-omap2/cm1_7xx.h
@@ -0,0 +1,324 @@
1/*
2 * DRA7xx CM1 instance offset macros
3 *
4 * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
5 *
6 * Generated by code originally written by:
7 * Paul Walmsley (paul@pwsan.com)
8 * Rajendra Nayak (rnayak@ti.com)
9 * Benoit Cousson (b-cousson@ti.com)
10 *
11 * This file is automatically generated from the OMAP hardware databases.
12 * We respectfully ask that any modifications to this file be coordinated
13 * with the public linux-omap@vger.kernel.org mailing list and the
14 * authors above to ensure that the autogeneration scripts are kept
15 * up-to-date with the file contents.
16 *
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License version 2 as
19 * published by the Free Software Foundation.
20 *
21 */
22
23#ifndef __ARCH_ARM_MACH_OMAP2_CM1_7XX_H
24#define __ARCH_ARM_MACH_OMAP2_CM1_7XX_H
25
26#include "cm_44xx_54xx.h"
27
28/* CM1 base address */
29#define DRA7XX_CM_CORE_AON_BASE 0x4a005000
30
31#define DRA7XX_CM_CORE_AON_REGADDR(inst, reg) \
32 OMAP2_L4_IO_ADDRESS(DRA7XX_CM_CORE_AON_BASE + (inst) + (reg))
33
34/* CM_CORE_AON instances */
35#define DRA7XX_CM_CORE_AON_OCP_SOCKET_INST 0x0000
36#define DRA7XX_CM_CORE_AON_CKGEN_INST 0x0100
37#define DRA7XX_CM_CORE_AON_MPU_INST 0x0300
38#define DRA7XX_CM_CORE_AON_DSP1_INST 0x0400
39#define DRA7XX_CM_CORE_AON_IPU_INST 0x0500
40#define DRA7XX_CM_CORE_AON_DSP2_INST 0x0600
41#define DRA7XX_CM_CORE_AON_EVE1_INST 0x0640
42#define DRA7XX_CM_CORE_AON_EVE2_INST 0x0680
43#define DRA7XX_CM_CORE_AON_EVE3_INST 0x06c0
44#define DRA7XX_CM_CORE_AON_EVE4_INST 0x0700
45#define DRA7XX_CM_CORE_AON_RTC_INST 0x0740
46#define DRA7XX_CM_CORE_AON_VPE_INST 0x0760
47#define DRA7XX_CM_CORE_AON_RESTORE_INST 0x0e00
48#define DRA7XX_CM_CORE_AON_INSTR_INST 0x0f00
49
50/* CM_CORE_AON clockdomain register offsets (from instance start) */
51#define DRA7XX_CM_CORE_AON_MPU_MPU_CDOFFS 0x0000
52#define DRA7XX_CM_CORE_AON_DSP1_DSP1_CDOFFS 0x0000
53#define DRA7XX_CM_CORE_AON_IPU_IPU1_CDOFFS 0x0000
54#define DRA7XX_CM_CORE_AON_IPU_IPU_CDOFFS 0x0040
55#define DRA7XX_CM_CORE_AON_DSP2_DSP2_CDOFFS 0x0000
56#define DRA7XX_CM_CORE_AON_EVE1_EVE1_CDOFFS 0x0000
57#define DRA7XX_CM_CORE_AON_EVE2_EVE2_CDOFFS 0x0000
58#define DRA7XX_CM_CORE_AON_EVE3_EVE3_CDOFFS 0x0000
59#define DRA7XX_CM_CORE_AON_EVE4_EVE4_CDOFFS 0x0000
60#define DRA7XX_CM_CORE_AON_RTC_RTC_CDOFFS 0x0000
61#define DRA7XX_CM_CORE_AON_VPE_VPE_CDOFFS 0x0000
62
63/* CM_CORE_AON */
64
65/* CM_CORE_AON.OCP_SOCKET_CM_CORE_AON register offsets */
66#define DRA7XX_REVISION_CM_CORE_AON_OFFSET 0x0000
67#define DRA7XX_CM_CM_CORE_AON_PROFILING_CLKCTRL_OFFSET 0x0040
68#define DRA7XX_CM_CM_CORE_AON_PROFILING_CLKCTRL DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_OCP_SOCKET_INST, 0x0040)
69#define DRA7XX_CM_CORE_AON_DEBUG_OUT_OFFSET 0x00ec
70#define DRA7XX_CM_CORE_AON_DEBUG_CFG0_OFFSET 0x00f0
71#define DRA7XX_CM_CORE_AON_DEBUG_CFG1_OFFSET 0x00f4
72#define DRA7XX_CM_CORE_AON_DEBUG_CFG2_OFFSET 0x00f8
73#define DRA7XX_CM_CORE_AON_DEBUG_CFG3_OFFSET 0x00fc
74
75/* CM_CORE_AON.CKGEN_CM_CORE_AON register offsets */
76#define DRA7XX_CM_CLKSEL_CORE_OFFSET 0x0000
77#define DRA7XX_CM_CLKSEL_CORE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0000)
78#define DRA7XX_CM_CLKSEL_ABE_OFFSET 0x0008
79#define DRA7XX_CM_CLKSEL_ABE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0008)
80#define DRA7XX_CM_DLL_CTRL_OFFSET 0x0010
81#define DRA7XX_CM_CLKMODE_DPLL_CORE_OFFSET 0x0020
82#define DRA7XX_CM_CLKMODE_DPLL_CORE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0020)
83#define DRA7XX_CM_IDLEST_DPLL_CORE_OFFSET 0x0024
84#define DRA7XX_CM_IDLEST_DPLL_CORE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0024)
85#define DRA7XX_CM_AUTOIDLE_DPLL_CORE_OFFSET 0x0028
86#define DRA7XX_CM_AUTOIDLE_DPLL_CORE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0028)
87#define DRA7XX_CM_CLKSEL_DPLL_CORE_OFFSET 0x002c
88#define DRA7XX_CM_CLKSEL_DPLL_CORE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x002c)
89#define DRA7XX_CM_DIV_M2_DPLL_CORE_OFFSET 0x0030
90#define DRA7XX_CM_DIV_M2_DPLL_CORE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0030)
91#define DRA7XX_CM_DIV_M3_DPLL_CORE_OFFSET 0x0034
92#define DRA7XX_CM_DIV_M3_DPLL_CORE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0034)
93#define DRA7XX_CM_DIV_H11_DPLL_CORE_OFFSET 0x0038
94#define DRA7XX_CM_DIV_H11_DPLL_CORE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0038)
95#define DRA7XX_CM_DIV_H12_DPLL_CORE_OFFSET 0x003c
96#define DRA7XX_CM_DIV_H12_DPLL_CORE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x003c)
97#define DRA7XX_CM_DIV_H13_DPLL_CORE_OFFSET 0x0040
98#define DRA7XX_CM_DIV_H13_DPLL_CORE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0040)
99#define DRA7XX_CM_DIV_H14_DPLL_CORE_OFFSET 0x0044
100#define DRA7XX_CM_DIV_H14_DPLL_CORE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0044)
101#define DRA7XX_CM_SSC_DELTAMSTEP_DPLL_CORE_OFFSET 0x0048
102#define DRA7XX_CM_SSC_MODFREQDIV_DPLL_CORE_OFFSET 0x004c
103#define DRA7XX_CM_DIV_H21_DPLL_CORE_OFFSET 0x0050
104#define DRA7XX_CM_DIV_H21_DPLL_CORE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0050)
105#define DRA7XX_CM_DIV_H22_DPLL_CORE_OFFSET 0x0054
106#define DRA7XX_CM_DIV_H22_DPLL_CORE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0054)
107#define DRA7XX_CM_DIV_H23_DPLL_CORE_OFFSET 0x0058
108#define DRA7XX_CM_DIV_H23_DPLL_CORE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0058)
109#define DRA7XX_CM_DIV_H24_DPLL_CORE_OFFSET 0x005c
110#define DRA7XX_CM_DIV_H24_DPLL_CORE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x005c)
111#define DRA7XX_CM_CLKMODE_DPLL_MPU_OFFSET 0x0060
112#define DRA7XX_CM_CLKMODE_DPLL_MPU DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0060)
113#define DRA7XX_CM_IDLEST_DPLL_MPU_OFFSET 0x0064
114#define DRA7XX_CM_IDLEST_DPLL_MPU DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0064)
115#define DRA7XX_CM_AUTOIDLE_DPLL_MPU_OFFSET 0x0068
116#define DRA7XX_CM_AUTOIDLE_DPLL_MPU DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0068)
117#define DRA7XX_CM_CLKSEL_DPLL_MPU_OFFSET 0x006c
118#define DRA7XX_CM_CLKSEL_DPLL_MPU DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x006c)
119#define DRA7XX_CM_DIV_M2_DPLL_MPU_OFFSET 0x0070
120#define DRA7XX_CM_DIV_M2_DPLL_MPU DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0070)
121#define DRA7XX_CM_SSC_DELTAMSTEP_DPLL_MPU_OFFSET 0x0088
122#define DRA7XX_CM_SSC_MODFREQDIV_DPLL_MPU_OFFSET 0x008c
123#define DRA7XX_CM_BYPCLK_DPLL_MPU_OFFSET 0x009c
124#define DRA7XX_CM_BYPCLK_DPLL_MPU DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x009c)
125#define DRA7XX_CM_CLKMODE_DPLL_IVA_OFFSET 0x00a0
126#define DRA7XX_CM_CLKMODE_DPLL_IVA DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x00a0)
127#define DRA7XX_CM_IDLEST_DPLL_IVA_OFFSET 0x00a4
128#define DRA7XX_CM_IDLEST_DPLL_IVA DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x00a4)
129#define DRA7XX_CM_AUTOIDLE_DPLL_IVA_OFFSET 0x00a8
130#define DRA7XX_CM_AUTOIDLE_DPLL_IVA DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x00a8)
131#define DRA7XX_CM_CLKSEL_DPLL_IVA_OFFSET 0x00ac
132#define DRA7XX_CM_CLKSEL_DPLL_IVA DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x00ac)
133#define DRA7XX_CM_DIV_M2_DPLL_IVA_OFFSET 0x00b0
134#define DRA7XX_CM_DIV_M2_DPLL_IVA DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x00b0)
135#define DRA7XX_CM_DIV_M3_DPLL_IVA_OFFSET 0x00b4
136#define DRA7XX_CM_DIV_M3_DPLL_IVA DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x00b4)
137#define DRA7XX_CM_SSC_DELTAMSTEP_DPLL_IVA_OFFSET 0x00c8
138#define DRA7XX_CM_SSC_MODFREQDIV_DPLL_IVA_OFFSET 0x00cc
139#define DRA7XX_CM_BYPCLK_DPLL_IVA_OFFSET 0x00dc
140#define DRA7XX_CM_BYPCLK_DPLL_IVA DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x00dc)
141#define DRA7XX_CM_CLKMODE_DPLL_ABE_OFFSET 0x00e0
142#define DRA7XX_CM_CLKMODE_DPLL_ABE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x00e0)
143#define DRA7XX_CM_IDLEST_DPLL_ABE_OFFSET 0x00e4
144#define DRA7XX_CM_IDLEST_DPLL_ABE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x00e4)
145#define DRA7XX_CM_AUTOIDLE_DPLL_ABE_OFFSET 0x00e8
146#define DRA7XX_CM_AUTOIDLE_DPLL_ABE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x00e8)
147#define DRA7XX_CM_CLKSEL_DPLL_ABE_OFFSET 0x00ec
148#define DRA7XX_CM_CLKSEL_DPLL_ABE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x00ec)
149#define DRA7XX_CM_DIV_M2_DPLL_ABE_OFFSET 0x00f0
150#define DRA7XX_CM_DIV_M2_DPLL_ABE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x00f0)
151#define DRA7XX_CM_DIV_M3_DPLL_ABE_OFFSET 0x00f4
152#define DRA7XX_CM_DIV_M3_DPLL_ABE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x00f4)
153#define DRA7XX_CM_SSC_DELTAMSTEP_DPLL_ABE_OFFSET 0x0108
154#define DRA7XX_CM_SSC_MODFREQDIV_DPLL_ABE_OFFSET 0x010c
155#define DRA7XX_CM_CLKMODE_DPLL_DDR_OFFSET 0x0110
156#define DRA7XX_CM_CLKMODE_DPLL_DDR DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0110)
157#define DRA7XX_CM_IDLEST_DPLL_DDR_OFFSET 0x0114
158#define DRA7XX_CM_IDLEST_DPLL_DDR DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0114)
159#define DRA7XX_CM_AUTOIDLE_DPLL_DDR_OFFSET 0x0118
160#define DRA7XX_CM_AUTOIDLE_DPLL_DDR DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0118)
161#define DRA7XX_CM_CLKSEL_DPLL_DDR_OFFSET 0x011c
162#define DRA7XX_CM_CLKSEL_DPLL_DDR DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x011c)
163#define DRA7XX_CM_DIV_M2_DPLL_DDR_OFFSET 0x0120
164#define DRA7XX_CM_DIV_M2_DPLL_DDR DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0120)
165#define DRA7XX_CM_DIV_M3_DPLL_DDR_OFFSET 0x0124
166#define DRA7XX_CM_DIV_M3_DPLL_DDR DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0124)
167#define DRA7XX_CM_DIV_H11_DPLL_DDR_OFFSET 0x0128
168#define DRA7XX_CM_DIV_H11_DPLL_DDR DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0128)
169#define DRA7XX_CM_SSC_DELTAMSTEP_DPLL_DDR_OFFSET 0x012c
170#define DRA7XX_CM_SSC_MODFREQDIV_DPLL_DDR_OFFSET 0x0130
171#define DRA7XX_CM_CLKMODE_DPLL_DSP_OFFSET 0x0134
172#define DRA7XX_CM_CLKMODE_DPLL_DSP DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0134)
173#define DRA7XX_CM_IDLEST_DPLL_DSP_OFFSET 0x0138
174#define DRA7XX_CM_IDLEST_DPLL_DSP DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0138)
175#define DRA7XX_CM_AUTOIDLE_DPLL_DSP_OFFSET 0x013c
176#define DRA7XX_CM_AUTOIDLE_DPLL_DSP DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x013c)
177#define DRA7XX_CM_CLKSEL_DPLL_DSP_OFFSET 0x0140
178#define DRA7XX_CM_CLKSEL_DPLL_DSP DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0140)
179#define DRA7XX_CM_DIV_M2_DPLL_DSP_OFFSET 0x0144
180#define DRA7XX_CM_DIV_M2_DPLL_DSP DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0144)
181#define DRA7XX_CM_DIV_M3_DPLL_DSP_OFFSET 0x0148
182#define DRA7XX_CM_DIV_M3_DPLL_DSP DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0148)
183#define DRA7XX_CM_SSC_DELTAMSTEP_DPLL_DSP_OFFSET 0x014c
184#define DRA7XX_CM_SSC_MODFREQDIV_DPLL_DSP_OFFSET 0x0150
185#define DRA7XX_CM_BYPCLK_DPLL_DSP_OFFSET 0x0154
186#define DRA7XX_CM_BYPCLK_DPLL_DSP DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0154)
187#define DRA7XX_CM_SHADOW_FREQ_CONFIG1_OFFSET 0x0160
188#define DRA7XX_CM_SHADOW_FREQ_CONFIG2_OFFSET 0x0164
189#define DRA7XX_CM_DYN_DEP_PRESCAL_OFFSET 0x0170
190#define DRA7XX_CM_RESTORE_ST_OFFSET 0x0180
191#define DRA7XX_CM_CLKMODE_DPLL_EVE_OFFSET 0x0184
192#define DRA7XX_CM_CLKMODE_DPLL_EVE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0184)
193#define DRA7XX_CM_IDLEST_DPLL_EVE_OFFSET 0x0188
194#define DRA7XX_CM_IDLEST_DPLL_EVE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0188)
195#define DRA7XX_CM_AUTOIDLE_DPLL_EVE_OFFSET 0x018c
196#define DRA7XX_CM_AUTOIDLE_DPLL_EVE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x018c)
197#define DRA7XX_CM_CLKSEL_DPLL_EVE_OFFSET 0x0190
198#define DRA7XX_CM_CLKSEL_DPLL_EVE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0190)
199#define DRA7XX_CM_DIV_M2_DPLL_EVE_OFFSET 0x0194
200#define DRA7XX_CM_DIV_M2_DPLL_EVE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0194)
201#define DRA7XX_CM_DIV_M3_DPLL_EVE_OFFSET 0x0198
202#define DRA7XX_CM_DIV_M3_DPLL_EVE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x0198)
203#define DRA7XX_CM_SSC_DELTAMSTEP_DPLL_EVE_OFFSET 0x019c
204#define DRA7XX_CM_SSC_MODFREQDIV_DPLL_EVE_OFFSET 0x01a0
205#define DRA7XX_CM_BYPCLK_DPLL_EVE_OFFSET 0x01a4
206#define DRA7XX_CM_BYPCLK_DPLL_EVE DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x01a4)
207#define DRA7XX_CM_CLKMODE_DPLL_GMAC_OFFSET 0x01a8
208#define DRA7XX_CM_CLKMODE_DPLL_GMAC DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x01a8)
209#define DRA7XX_CM_IDLEST_DPLL_GMAC_OFFSET 0x01ac
210#define DRA7XX_CM_IDLEST_DPLL_GMAC DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x01ac)
211#define DRA7XX_CM_AUTOIDLE_DPLL_GMAC_OFFSET 0x01b0
212#define DRA7XX_CM_AUTOIDLE_DPLL_GMAC DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x01b0)
213#define DRA7XX_CM_CLKSEL_DPLL_GMAC_OFFSET 0x01b4
214#define DRA7XX_CM_CLKSEL_DPLL_GMAC DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x01b4)
215#define DRA7XX_CM_DIV_M2_DPLL_GMAC_OFFSET 0x01b8
216#define DRA7XX_CM_DIV_M2_DPLL_GMAC DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x01b8)
217#define DRA7XX_CM_DIV_M3_DPLL_GMAC_OFFSET 0x01bc
218#define DRA7XX_CM_DIV_M3_DPLL_GMAC DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x01bc)
219#define DRA7XX_CM_DIV_H11_DPLL_GMAC_OFFSET 0x01c0
220#define DRA7XX_CM_DIV_H11_DPLL_GMAC DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x01c0)
221#define DRA7XX_CM_DIV_H12_DPLL_GMAC_OFFSET 0x01c4
222#define DRA7XX_CM_DIV_H12_DPLL_GMAC DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x01c4)
223#define DRA7XX_CM_DIV_H13_DPLL_GMAC_OFFSET 0x01c8
224#define DRA7XX_CM_DIV_H13_DPLL_GMAC DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x01c8)
225#define DRA7XX_CM_DIV_H14_DPLL_GMAC_OFFSET 0x01cc
226#define DRA7XX_CM_DIV_H14_DPLL_GMAC DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x01cc)
227#define DRA7XX_CM_SSC_DELTAMSTEP_DPLL_GMAC_OFFSET 0x01d0
228#define DRA7XX_CM_SSC_MODFREQDIV_DPLL_GMAC_OFFSET 0x01d4
229#define DRA7XX_CM_CLKMODE_DPLL_GPU_OFFSET 0x01d8
230#define DRA7XX_CM_CLKMODE_DPLL_GPU DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x01d8)
231#define DRA7XX_CM_IDLEST_DPLL_GPU_OFFSET 0x01dc
232#define DRA7XX_CM_IDLEST_DPLL_GPU DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x01dc)
233#define DRA7XX_CM_AUTOIDLE_DPLL_GPU_OFFSET 0x01e0
234#define DRA7XX_CM_AUTOIDLE_DPLL_GPU DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x01e0)
235#define DRA7XX_CM_CLKSEL_DPLL_GPU_OFFSET 0x01e4
236#define DRA7XX_CM_CLKSEL_DPLL_GPU DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x01e4)
237#define DRA7XX_CM_DIV_M2_DPLL_GPU_OFFSET 0x01e8
238#define DRA7XX_CM_DIV_M2_DPLL_GPU DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x01e8)
239#define DRA7XX_CM_DIV_M3_DPLL_GPU_OFFSET 0x01ec
240#define DRA7XX_CM_DIV_M3_DPLL_GPU DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_CKGEN_INST, 0x01ec)
241#define DRA7XX_CM_SSC_DELTAMSTEP_DPLL_GPU_OFFSET 0x01f0
242#define DRA7XX_CM_SSC_MODFREQDIV_DPLL_GPU_OFFSET 0x01f4
243
244/* CM_CORE_AON.MPU_CM_CORE_AON register offsets */
245#define DRA7XX_CM_MPU_CLKSTCTRL_OFFSET 0x0000
246#define DRA7XX_CM_MPU_STATICDEP_OFFSET 0x0004
247#define DRA7XX_CM_MPU_DYNAMICDEP_OFFSET 0x0008
248#define DRA7XX_CM_MPU_MPU_CLKCTRL_OFFSET 0x0020
249#define DRA7XX_CM_MPU_MPU_CLKCTRL DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_MPU_INST, 0x0020)
250#define DRA7XX_CM_MPU_MPU_MPU_DBG_CLKCTRL_OFFSET 0x0028
251#define DRA7XX_CM_MPU_MPU_MPU_DBG_CLKCTRL DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_MPU_INST, 0x0028)
252
253/* CM_CORE_AON.DSP1_CM_CORE_AON register offsets */
254#define DRA7XX_CM_DSP1_CLKSTCTRL_OFFSET 0x0000
255#define DRA7XX_CM_DSP1_STATICDEP_OFFSET 0x0004
256#define DRA7XX_CM_DSP1_DYNAMICDEP_OFFSET 0x0008
257#define DRA7XX_CM_DSP1_DSP1_CLKCTRL_OFFSET 0x0020
258#define DRA7XX_CM_DSP1_DSP1_CLKCTRL DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_DSP1_INST, 0x0020)
259
260/* CM_CORE_AON.IPU_CM_CORE_AON register offsets */
261#define DRA7XX_CM_IPU1_CLKSTCTRL_OFFSET 0x0000
262#define DRA7XX_CM_IPU1_STATICDEP_OFFSET 0x0004
263#define DRA7XX_CM_IPU1_DYNAMICDEP_OFFSET 0x0008
264#define DRA7XX_CM_IPU1_IPU1_CLKCTRL_OFFSET 0x0020
265#define DRA7XX_CM_IPU1_IPU1_CLKCTRL DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_IPU_INST, 0x0020)
266#define DRA7XX_CM_IPU_CLKSTCTRL_OFFSET 0x0040
267#define DRA7XX_CM_IPU_MCASP1_CLKCTRL_OFFSET 0x0050
268#define DRA7XX_CM_IPU_MCASP1_CLKCTRL DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_IPU_INST, 0x0050)
269#define DRA7XX_CM_IPU_TIMER5_CLKCTRL_OFFSET 0x0058
270#define DRA7XX_CM_IPU_TIMER5_CLKCTRL DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_IPU_INST, 0x0058)
271#define DRA7XX_CM_IPU_TIMER6_CLKCTRL_OFFSET 0x0060
272#define DRA7XX_CM_IPU_TIMER6_CLKCTRL DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_IPU_INST, 0x0060)
273#define DRA7XX_CM_IPU_TIMER7_CLKCTRL_OFFSET 0x0068
274#define DRA7XX_CM_IPU_TIMER7_CLKCTRL DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_IPU_INST, 0x0068)
275#define DRA7XX_CM_IPU_TIMER8_CLKCTRL_OFFSET 0x0070
276#define DRA7XX_CM_IPU_TIMER8_CLKCTRL DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_IPU_INST, 0x0070)
277#define DRA7XX_CM_IPU_I2C5_CLKCTRL_OFFSET 0x0078
278#define DRA7XX_CM_IPU_I2C5_CLKCTRL DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_IPU_INST, 0x0078)
279#define DRA7XX_CM_IPU_UART6_CLKCTRL_OFFSET 0x0080
280#define DRA7XX_CM_IPU_UART6_CLKCTRL DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_IPU_INST, 0x0080)
281
282/* CM_CORE_AON.DSP2_CM_CORE_AON register offsets */
283#define DRA7XX_CM_DSP2_CLKSTCTRL_OFFSET 0x0000
284#define DRA7XX_CM_DSP2_STATICDEP_OFFSET 0x0004
285#define DRA7XX_CM_DSP2_DYNAMICDEP_OFFSET 0x0008
286#define DRA7XX_CM_DSP2_DSP2_CLKCTRL_OFFSET 0x0020
287#define DRA7XX_CM_DSP2_DSP2_CLKCTRL DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_DSP2_INST, 0x0020)
288
289/* CM_CORE_AON.EVE1_CM_CORE_AON register offsets */
290#define DRA7XX_CM_EVE1_CLKSTCTRL_OFFSET 0x0000
291#define DRA7XX_CM_EVE1_STATICDEP_OFFSET 0x0004
292#define DRA7XX_CM_EVE1_EVE1_CLKCTRL_OFFSET 0x0020
293#define DRA7XX_CM_EVE1_EVE1_CLKCTRL DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_EVE1_INST, 0x0020)
294
295/* CM_CORE_AON.EVE2_CM_CORE_AON register offsets */
296#define DRA7XX_CM_EVE2_CLKSTCTRL_OFFSET 0x0000
297#define DRA7XX_CM_EVE2_STATICDEP_OFFSET 0x0004
298#define DRA7XX_CM_EVE2_EVE2_CLKCTRL_OFFSET 0x0020
299#define DRA7XX_CM_EVE2_EVE2_CLKCTRL DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_EVE2_INST, 0x0020)
300
301/* CM_CORE_AON.EVE3_CM_CORE_AON register offsets */
302#define DRA7XX_CM_EVE3_CLKSTCTRL_OFFSET 0x0000
303#define DRA7XX_CM_EVE3_STATICDEP_OFFSET 0x0004
304#define DRA7XX_CM_EVE3_EVE3_CLKCTRL_OFFSET 0x0020
305#define DRA7XX_CM_EVE3_EVE3_CLKCTRL DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_EVE3_INST, 0x0020)
306
307/* CM_CORE_AON.EVE4_CM_CORE_AON register offsets */
308#define DRA7XX_CM_EVE4_CLKSTCTRL_OFFSET 0x0000
309#define DRA7XX_CM_EVE4_STATICDEP_OFFSET 0x0004
310#define DRA7XX_CM_EVE4_EVE4_CLKCTRL_OFFSET 0x0020
311#define DRA7XX_CM_EVE4_EVE4_CLKCTRL DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_EVE4_INST, 0x0020)
312
313/* CM_CORE_AON.RTC_CM_CORE_AON register offsets */
314#define DRA7XX_CM_RTC_CLKSTCTRL_OFFSET 0x0000
315#define DRA7XX_CM_RTC_RTCSS_CLKCTRL_OFFSET 0x0004
316#define DRA7XX_CM_RTC_RTCSS_CLKCTRL DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_RTC_INST, 0x0004)
317
318/* CM_CORE_AON.VPE_CM_CORE_AON register offsets */
319#define DRA7XX_CM_VPE_CLKSTCTRL_OFFSET 0x0000
320#define DRA7XX_CM_VPE_VPE_CLKCTRL_OFFSET 0x0004
321#define DRA7XX_CM_VPE_VPE_CLKCTRL DRA7XX_CM_CORE_AON_REGADDR(DRA7XX_CM_CORE_AON_VPE_INST, 0x0004)
322#define DRA7XX_CM_VPE_STATICDEP_OFFSET 0x0008
323
324#endif
diff --git a/arch/arm/mach-omap2/cm2_7xx.h b/arch/arm/mach-omap2/cm2_7xx.h
new file mode 100644
index 000000000000..9ad7594e7622
--- /dev/null
+++ b/arch/arm/mach-omap2/cm2_7xx.h
@@ -0,0 +1,513 @@
1/*
2 * DRA7xx CM2 instance offset macros
3 *
4 * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
5 *
6 * Generated by code originally written by:
7 * Paul Walmsley (paul@pwsan.com)
8 * Rajendra Nayak (rnayak@ti.com)
9 * Benoit Cousson (b-cousson@ti.com)
10 *
11 * This file is automatically generated from the OMAP hardware databases.
12 * We respectfully ask that any modifications to this file be coordinated
13 * with the public linux-omap@vger.kernel.org mailing list and the
14 * authors above to ensure that the autogeneration scripts are kept
15 * up-to-date with the file contents.
16 *
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License version 2 as
19 * published by the Free Software Foundation.
20 */
21
22#ifndef __ARCH_ARM_MACH_OMAP2_CM2_7XX_H
23#define __ARCH_ARM_MACH_OMAP2_CM2_7XX_H
24
25#include "cm_44xx_54xx.h"
26
27/* CM2 base address */
28#define DRA7XX_CM_CORE_BASE 0x4a008000
29
30#define DRA7XX_CM_CORE_REGADDR(inst, reg) \
31 OMAP2_L4_IO_ADDRESS(DRA7XX_CM_CORE_BASE + (inst) + (reg))
32
33/* CM_CORE instances */
34#define DRA7XX_CM_CORE_OCP_SOCKET_INST 0x0000
35#define DRA7XX_CM_CORE_CKGEN_INST 0x0104
36#define DRA7XX_CM_CORE_COREAON_INST 0x0600
37#define DRA7XX_CM_CORE_CORE_INST 0x0700
38#define DRA7XX_CM_CORE_IVA_INST 0x0f00
39#define DRA7XX_CM_CORE_CAM_INST 0x1000
40#define DRA7XX_CM_CORE_DSS_INST 0x1100
41#define DRA7XX_CM_CORE_GPU_INST 0x1200
42#define DRA7XX_CM_CORE_L3INIT_INST 0x1300
43#define DRA7XX_CM_CORE_CUSTEFUSE_INST 0x1600
44#define DRA7XX_CM_CORE_L4PER_INST 0x1700
45#define DRA7XX_CM_CORE_RESTORE_INST 0x1e18
46
47/* CM_CORE clockdomain register offsets (from instance start) */
48#define DRA7XX_CM_CORE_COREAON_COREAON_CDOFFS 0x0000
49#define DRA7XX_CM_CORE_CORE_L3MAIN1_CDOFFS 0x0000
50#define DRA7XX_CM_CORE_CORE_IPU2_CDOFFS 0x0200
51#define DRA7XX_CM_CORE_CORE_DMA_CDOFFS 0x0300
52#define DRA7XX_CM_CORE_CORE_EMIF_CDOFFS 0x0400
53#define DRA7XX_CM_CORE_CORE_ATL_CDOFFS 0x0520
54#define DRA7XX_CM_CORE_CORE_L4CFG_CDOFFS 0x0600
55#define DRA7XX_CM_CORE_CORE_L3INSTR_CDOFFS 0x0700
56#define DRA7XX_CM_CORE_IVA_IVA_CDOFFS 0x0000
57#define DRA7XX_CM_CORE_CAM_CAM_CDOFFS 0x0000
58#define DRA7XX_CM_CORE_DSS_DSS_CDOFFS 0x0000
59#define DRA7XX_CM_CORE_GPU_GPU_CDOFFS 0x0000
60#define DRA7XX_CM_CORE_L3INIT_L3INIT_CDOFFS 0x0000
61#define DRA7XX_CM_CORE_L3INIT_PCIE_CDOFFS 0x00a0
62#define DRA7XX_CM_CORE_L3INIT_GMAC_CDOFFS 0x00c0
63#define DRA7XX_CM_CORE_CUSTEFUSE_CUSTEFUSE_CDOFFS 0x0000
64#define DRA7XX_CM_CORE_L4PER_L4PER_CDOFFS 0x0000
65#define DRA7XX_CM_CORE_L4PER_L4SEC_CDOFFS 0x0180
66#define DRA7XX_CM_CORE_L4PER_L4PER2_CDOFFS 0x01fc
67#define DRA7XX_CM_CORE_L4PER_L4PER3_CDOFFS 0x0210
68
69/* CM_CORE */
70
71/* CM_CORE.OCP_SOCKET_CM_CORE register offsets */
72#define DRA7XX_REVISION_CM_CORE_OFFSET 0x0000
73#define DRA7XX_CM_CM_CORE_PROFILING_CLKCTRL_OFFSET 0x0040
74#define DRA7XX_CM_CM_CORE_PROFILING_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_OCP_SOCKET_INST, 0x0040)
75#define DRA7XX_CM_CORE_DEBUG_CFG_OFFSET 0x00f0
76
77/* CM_CORE.CKGEN_CM_CORE register offsets */
78#define DRA7XX_CM_CLKSEL_USB_60MHZ_OFFSET 0x0000
79#define DRA7XX_CM_CLKSEL_USB_60MHZ DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x0000)
80#define DRA7XX_CM_CLKMODE_DPLL_PER_OFFSET 0x003c
81#define DRA7XX_CM_CLKMODE_DPLL_PER DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x003c)
82#define DRA7XX_CM_IDLEST_DPLL_PER_OFFSET 0x0040
83#define DRA7XX_CM_IDLEST_DPLL_PER DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x0040)
84#define DRA7XX_CM_AUTOIDLE_DPLL_PER_OFFSET 0x0044
85#define DRA7XX_CM_AUTOIDLE_DPLL_PER DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x0044)
86#define DRA7XX_CM_CLKSEL_DPLL_PER_OFFSET 0x0048
87#define DRA7XX_CM_CLKSEL_DPLL_PER DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x0048)
88#define DRA7XX_CM_DIV_M2_DPLL_PER_OFFSET 0x004c
89#define DRA7XX_CM_DIV_M2_DPLL_PER DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x004c)
90#define DRA7XX_CM_DIV_M3_DPLL_PER_OFFSET 0x0050
91#define DRA7XX_CM_DIV_M3_DPLL_PER DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x0050)
92#define DRA7XX_CM_DIV_H11_DPLL_PER_OFFSET 0x0054
93#define DRA7XX_CM_DIV_H11_DPLL_PER DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x0054)
94#define DRA7XX_CM_DIV_H12_DPLL_PER_OFFSET 0x0058
95#define DRA7XX_CM_DIV_H12_DPLL_PER DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x0058)
96#define DRA7XX_CM_DIV_H13_DPLL_PER_OFFSET 0x005c
97#define DRA7XX_CM_DIV_H13_DPLL_PER DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x005c)
98#define DRA7XX_CM_DIV_H14_DPLL_PER_OFFSET 0x0060
99#define DRA7XX_CM_DIV_H14_DPLL_PER DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x0060)
100#define DRA7XX_CM_SSC_DELTAMSTEP_DPLL_PER_OFFSET 0x0064
101#define DRA7XX_CM_SSC_MODFREQDIV_DPLL_PER_OFFSET 0x0068
102#define DRA7XX_CM_CLKMODE_DPLL_USB_OFFSET 0x007c
103#define DRA7XX_CM_CLKMODE_DPLL_USB DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x007c)
104#define DRA7XX_CM_IDLEST_DPLL_USB_OFFSET 0x0080
105#define DRA7XX_CM_IDLEST_DPLL_USB DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x0080)
106#define DRA7XX_CM_AUTOIDLE_DPLL_USB_OFFSET 0x0084
107#define DRA7XX_CM_AUTOIDLE_DPLL_USB DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x0084)
108#define DRA7XX_CM_CLKSEL_DPLL_USB_OFFSET 0x0088
109#define DRA7XX_CM_CLKSEL_DPLL_USB DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x0088)
110#define DRA7XX_CM_DIV_M2_DPLL_USB_OFFSET 0x008c
111#define DRA7XX_CM_DIV_M2_DPLL_USB DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x008c)
112#define DRA7XX_CM_SSC_DELTAMSTEP_DPLL_USB_OFFSET 0x00a4
113#define DRA7XX_CM_SSC_MODFREQDIV_DPLL_USB_OFFSET 0x00a8
114#define DRA7XX_CM_CLKDCOLDO_DPLL_USB_OFFSET 0x00b0
115#define DRA7XX_CM_CLKDCOLDO_DPLL_USB DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x00b0)
116#define DRA7XX_CM_CLKMODE_DPLL_PCIE_REF_OFFSET 0x00fc
117#define DRA7XX_CM_CLKMODE_DPLL_PCIE_REF DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x00fc)
118#define DRA7XX_CM_IDLEST_DPLL_PCIE_REF_OFFSET 0x0100
119#define DRA7XX_CM_IDLEST_DPLL_PCIE_REF DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x0100)
120#define DRA7XX_CM_AUTOIDLE_DPLL_PCIE_REF_OFFSET 0x0104
121#define DRA7XX_CM_AUTOIDLE_DPLL_PCIE_REF DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x0104)
122#define DRA7XX_CM_CLKSEL_DPLL_PCIE_REF_OFFSET 0x0108
123#define DRA7XX_CM_CLKSEL_DPLL_PCIE_REF DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x0108)
124#define DRA7XX_CM_DIV_M2_DPLL_PCIE_REF_OFFSET 0x010c
125#define DRA7XX_CM_DIV_M2_DPLL_PCIE_REF DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x010c)
126#define DRA7XX_CM_SSC_DELTAMSTEP_DPLL_PCIE_REF_OFFSET 0x0110
127#define DRA7XX_CM_SSC_MODFREQDIV_DPLL_PCIE_REF_OFFSET 0x0114
128#define DRA7XX_CM_CLKMODE_APLL_PCIE_OFFSET 0x0118
129#define DRA7XX_CM_CLKMODE_APLL_PCIE DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x0118)
130#define DRA7XX_CM_IDLEST_APLL_PCIE_OFFSET 0x011c
131#define DRA7XX_CM_IDLEST_APLL_PCIE DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x011c)
132#define DRA7XX_CM_DIV_M2_APLL_PCIE_OFFSET 0x0120
133#define DRA7XX_CM_DIV_M2_APLL_PCIE DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x0120)
134#define DRA7XX_CM_CLKVCOLDO_APLL_PCIE_OFFSET 0x0124
135#define DRA7XX_CM_CLKVCOLDO_APLL_PCIE DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CKGEN_INST, 0x0124)
136
137/* CM_CORE.COREAON_CM_CORE register offsets */
138#define DRA7XX_CM_COREAON_CLKSTCTRL_OFFSET 0x0000
139#define DRA7XX_CM_COREAON_SMARTREFLEX_MPU_CLKCTRL_OFFSET 0x0028
140#define DRA7XX_CM_COREAON_SMARTREFLEX_MPU_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_COREAON_INST, 0x0028)
141#define DRA7XX_CM_COREAON_SMARTREFLEX_CORE_CLKCTRL_OFFSET 0x0038
142#define DRA7XX_CM_COREAON_SMARTREFLEX_CORE_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_COREAON_INST, 0x0038)
143#define DRA7XX_CM_COREAON_USB_PHY1_CORE_CLKCTRL_OFFSET 0x0040
144#define DRA7XX_CM_COREAON_USB_PHY1_CORE_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_COREAON_INST, 0x0040)
145#define DRA7XX_CM_COREAON_IO_SRCOMP_CLKCTRL_OFFSET 0x0050
146#define DRA7XX_CM_COREAON_IO_SRCOMP_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_COREAON_INST, 0x0050)
147#define DRA7XX_CM_COREAON_SMARTREFLEX_GPU_CLKCTRL_OFFSET 0x0058
148#define DRA7XX_CM_COREAON_SMARTREFLEX_GPU_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_COREAON_INST, 0x0058)
149#define DRA7XX_CM_COREAON_SMARTREFLEX_DSPEVE_CLKCTRL_OFFSET 0x0068
150#define DRA7XX_CM_COREAON_SMARTREFLEX_DSPEVE_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_COREAON_INST, 0x0068)
151#define DRA7XX_CM_COREAON_SMARTREFLEX_IVAHD_CLKCTRL_OFFSET 0x0078
152#define DRA7XX_CM_COREAON_SMARTREFLEX_IVAHD_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_COREAON_INST, 0x0078)
153#define DRA7XX_CM_COREAON_USB_PHY2_CORE_CLKCTRL_OFFSET 0x0088
154#define DRA7XX_CM_COREAON_USB_PHY2_CORE_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_COREAON_INST, 0x0088)
155#define DRA7XX_CM_COREAON_USB_PHY3_CORE_CLKCTRL_OFFSET 0x0098
156#define DRA7XX_CM_COREAON_USB_PHY3_CORE_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_COREAON_INST, 0x0098)
157#define DRA7XX_CM_COREAON_DUMMY_MODULE1_CLKCTRL_OFFSET 0x00a0
158#define DRA7XX_CM_COREAON_DUMMY_MODULE1_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_COREAON_INST, 0x00a0)
159#define DRA7XX_CM_COREAON_DUMMY_MODULE2_CLKCTRL_OFFSET 0x00b0
160#define DRA7XX_CM_COREAON_DUMMY_MODULE2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_COREAON_INST, 0x00b0)
161#define DRA7XX_CM_COREAON_DUMMY_MODULE3_CLKCTRL_OFFSET 0x00c0
162#define DRA7XX_CM_COREAON_DUMMY_MODULE3_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_COREAON_INST, 0x00c0)
163#define DRA7XX_CM_COREAON_DUMMY_MODULE4_CLKCTRL_OFFSET 0x00d0
164#define DRA7XX_CM_COREAON_DUMMY_MODULE4_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_COREAON_INST, 0x00d0)
165
166/* CM_CORE.CORE_CM_CORE register offsets */
167#define DRA7XX_CM_L3MAIN1_CLKSTCTRL_OFFSET 0x0000
168#define DRA7XX_CM_L3MAIN1_DYNAMICDEP_OFFSET 0x0008
169#define DRA7XX_CM_L3MAIN1_L3_MAIN_1_CLKCTRL_OFFSET 0x0020
170#define DRA7XX_CM_L3MAIN1_L3_MAIN_1_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0020)
171#define DRA7XX_CM_L3MAIN1_GPMC_CLKCTRL_OFFSET 0x0028
172#define DRA7XX_CM_L3MAIN1_GPMC_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0028)
173#define DRA7XX_CM_L3MAIN1_MMU_EDMA_CLKCTRL_OFFSET 0x0030
174#define DRA7XX_CM_L3MAIN1_MMU_EDMA_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0030)
175#define DRA7XX_CM_L3MAIN1_OCMC_RAM1_CLKCTRL_OFFSET 0x0050
176#define DRA7XX_CM_L3MAIN1_OCMC_RAM1_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0050)
177#define DRA7XX_CM_L3MAIN1_OCMC_RAM2_CLKCTRL_OFFSET 0x0058
178#define DRA7XX_CM_L3MAIN1_OCMC_RAM2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0058)
179#define DRA7XX_CM_L3MAIN1_OCMC_RAM3_CLKCTRL_OFFSET 0x0060
180#define DRA7XX_CM_L3MAIN1_OCMC_RAM3_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0060)
181#define DRA7XX_CM_L3MAIN1_OCMC_ROM_CLKCTRL_OFFSET 0x0068
182#define DRA7XX_CM_L3MAIN1_OCMC_ROM_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0068)
183#define DRA7XX_CM_L3MAIN1_TPCC_CLKCTRL_OFFSET 0x0070
184#define DRA7XX_CM_L3MAIN1_TPCC_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0070)
185#define DRA7XX_CM_L3MAIN1_TPTC1_CLKCTRL_OFFSET 0x0078
186#define DRA7XX_CM_L3MAIN1_TPTC1_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0078)
187#define DRA7XX_CM_L3MAIN1_TPTC2_CLKCTRL_OFFSET 0x0080
188#define DRA7XX_CM_L3MAIN1_TPTC2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0080)
189#define DRA7XX_CM_L3MAIN1_VCP1_CLKCTRL_OFFSET 0x0088
190#define DRA7XX_CM_L3MAIN1_VCP1_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0088)
191#define DRA7XX_CM_L3MAIN1_VCP2_CLKCTRL_OFFSET 0x0090
192#define DRA7XX_CM_L3MAIN1_VCP2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0090)
193#define DRA7XX_CM_L3MAIN1_SPARE_CME_CLKCTRL_OFFSET 0x0098
194#define DRA7XX_CM_L3MAIN1_SPARE_CME_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0098)
195#define DRA7XX_CM_L3MAIN1_SPARE_HDMI_CLKCTRL_OFFSET 0x00a0
196#define DRA7XX_CM_L3MAIN1_SPARE_HDMI_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x00a0)
197#define DRA7XX_CM_L3MAIN1_SPARE_ICM_CLKCTRL_OFFSET 0x00a8
198#define DRA7XX_CM_L3MAIN1_SPARE_ICM_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x00a8)
199#define DRA7XX_CM_L3MAIN1_SPARE_IVA2_CLKCTRL_OFFSET 0x00b0
200#define DRA7XX_CM_L3MAIN1_SPARE_IVA2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x00b0)
201#define DRA7XX_CM_L3MAIN1_SPARE_SATA2_CLKCTRL_OFFSET 0x00b8
202#define DRA7XX_CM_L3MAIN1_SPARE_SATA2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x00b8)
203#define DRA7XX_CM_L3MAIN1_SPARE_UNKNOWN4_CLKCTRL_OFFSET 0x00c0
204#define DRA7XX_CM_L3MAIN1_SPARE_UNKNOWN4_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x00c0)
205#define DRA7XX_CM_L3MAIN1_SPARE_UNKNOWN5_CLKCTRL_OFFSET 0x00c8
206#define DRA7XX_CM_L3MAIN1_SPARE_UNKNOWN5_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x00c8)
207#define DRA7XX_CM_L3MAIN1_SPARE_UNKNOWN6_CLKCTRL_OFFSET 0x00d0
208#define DRA7XX_CM_L3MAIN1_SPARE_UNKNOWN6_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x00d0)
209#define DRA7XX_CM_L3MAIN1_SPARE_VIDEOPLL1_CLKCTRL_OFFSET 0x00d8
210#define DRA7XX_CM_L3MAIN1_SPARE_VIDEOPLL1_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x00d8)
211#define DRA7XX_CM_L3MAIN1_SPARE_VIDEOPLL2_CLKCTRL_OFFSET 0x00f0
212#define DRA7XX_CM_L3MAIN1_SPARE_VIDEOPLL2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x00f0)
213#define DRA7XX_CM_L3MAIN1_SPARE_VIDEOPLL3_CLKCTRL_OFFSET 0x00f8
214#define DRA7XX_CM_L3MAIN1_SPARE_VIDEOPLL3_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x00f8)
215#define DRA7XX_CM_IPU2_CLKSTCTRL_OFFSET 0x0200
216#define DRA7XX_CM_IPU2_STATICDEP_OFFSET 0x0204
217#define DRA7XX_CM_IPU2_DYNAMICDEP_OFFSET 0x0208
218#define DRA7XX_CM_IPU2_IPU2_CLKCTRL_OFFSET 0x0220
219#define DRA7XX_CM_IPU2_IPU2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0220)
220#define DRA7XX_CM_DMA_CLKSTCTRL_OFFSET 0x0300
221#define DRA7XX_CM_DMA_STATICDEP_OFFSET 0x0304
222#define DRA7XX_CM_DMA_DYNAMICDEP_OFFSET 0x0308
223#define DRA7XX_CM_DMA_DMA_SYSTEM_CLKCTRL_OFFSET 0x0320
224#define DRA7XX_CM_DMA_DMA_SYSTEM_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0320)
225#define DRA7XX_CM_EMIF_CLKSTCTRL_OFFSET 0x0400
226#define DRA7XX_CM_EMIF_DMM_CLKCTRL_OFFSET 0x0420
227#define DRA7XX_CM_EMIF_DMM_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0420)
228#define DRA7XX_CM_EMIF_EMIF_OCP_FW_CLKCTRL_OFFSET 0x0428
229#define DRA7XX_CM_EMIF_EMIF_OCP_FW_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0428)
230#define DRA7XX_CM_EMIF_EMIF1_CLKCTRL_OFFSET 0x0430
231#define DRA7XX_CM_EMIF_EMIF1_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0430)
232#define DRA7XX_CM_EMIF_EMIF2_CLKCTRL_OFFSET 0x0438
233#define DRA7XX_CM_EMIF_EMIF2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0438)
234#define DRA7XX_CM_EMIF_EMIF_DLL_CLKCTRL_OFFSET 0x0440
235#define DRA7XX_CM_EMIF_EMIF_DLL_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0440)
236#define DRA7XX_CM_ATL_ATL_CLKCTRL_OFFSET 0x0500
237#define DRA7XX_CM_ATL_ATL_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0500)
238#define DRA7XX_CM_ATL_CLKSTCTRL_OFFSET 0x0520
239#define DRA7XX_CM_L4CFG_CLKSTCTRL_OFFSET 0x0600
240#define DRA7XX_CM_L4CFG_DYNAMICDEP_OFFSET 0x0608
241#define DRA7XX_CM_L4CFG_L4_CFG_CLKCTRL_OFFSET 0x0620
242#define DRA7XX_CM_L4CFG_L4_CFG_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0620)
243#define DRA7XX_CM_L4CFG_SPINLOCK_CLKCTRL_OFFSET 0x0628
244#define DRA7XX_CM_L4CFG_SPINLOCK_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0628)
245#define DRA7XX_CM_L4CFG_MAILBOX1_CLKCTRL_OFFSET 0x0630
246#define DRA7XX_CM_L4CFG_MAILBOX1_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0630)
247#define DRA7XX_CM_L4CFG_SAR_ROM_CLKCTRL_OFFSET 0x0638
248#define DRA7XX_CM_L4CFG_SAR_ROM_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0638)
249#define DRA7XX_CM_L4CFG_OCP2SCP2_CLKCTRL_OFFSET 0x0640
250#define DRA7XX_CM_L4CFG_OCP2SCP2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0640)
251#define DRA7XX_CM_L4CFG_MAILBOX2_CLKCTRL_OFFSET 0x0648
252#define DRA7XX_CM_L4CFG_MAILBOX2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0648)
253#define DRA7XX_CM_L4CFG_MAILBOX3_CLKCTRL_OFFSET 0x0650
254#define DRA7XX_CM_L4CFG_MAILBOX3_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0650)
255#define DRA7XX_CM_L4CFG_MAILBOX4_CLKCTRL_OFFSET 0x0658
256#define DRA7XX_CM_L4CFG_MAILBOX4_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0658)
257#define DRA7XX_CM_L4CFG_MAILBOX5_CLKCTRL_OFFSET 0x0660
258#define DRA7XX_CM_L4CFG_MAILBOX5_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0660)
259#define DRA7XX_CM_L4CFG_MAILBOX6_CLKCTRL_OFFSET 0x0668
260#define DRA7XX_CM_L4CFG_MAILBOX6_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0668)
261#define DRA7XX_CM_L4CFG_MAILBOX7_CLKCTRL_OFFSET 0x0670
262#define DRA7XX_CM_L4CFG_MAILBOX7_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0670)
263#define DRA7XX_CM_L4CFG_MAILBOX8_CLKCTRL_OFFSET 0x0678
264#define DRA7XX_CM_L4CFG_MAILBOX8_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0678)
265#define DRA7XX_CM_L4CFG_MAILBOX9_CLKCTRL_OFFSET 0x0680
266#define DRA7XX_CM_L4CFG_MAILBOX9_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0680)
267#define DRA7XX_CM_L4CFG_MAILBOX10_CLKCTRL_OFFSET 0x0688
268#define DRA7XX_CM_L4CFG_MAILBOX10_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0688)
269#define DRA7XX_CM_L4CFG_MAILBOX11_CLKCTRL_OFFSET 0x0690
270#define DRA7XX_CM_L4CFG_MAILBOX11_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0690)
271#define DRA7XX_CM_L4CFG_MAILBOX12_CLKCTRL_OFFSET 0x0698
272#define DRA7XX_CM_L4CFG_MAILBOX12_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0698)
273#define DRA7XX_CM_L4CFG_MAILBOX13_CLKCTRL_OFFSET 0x06a0
274#define DRA7XX_CM_L4CFG_MAILBOX13_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x06a0)
275#define DRA7XX_CM_L4CFG_SPARE_SMARTREFLEX_RTC_CLKCTRL_OFFSET 0x06a8
276#define DRA7XX_CM_L4CFG_SPARE_SMARTREFLEX_RTC_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x06a8)
277#define DRA7XX_CM_L4CFG_SPARE_SMARTREFLEX_SDRAM_CLKCTRL_OFFSET 0x06b0
278#define DRA7XX_CM_L4CFG_SPARE_SMARTREFLEX_SDRAM_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x06b0)
279#define DRA7XX_CM_L4CFG_SPARE_SMARTREFLEX_WKUP_CLKCTRL_OFFSET 0x06b8
280#define DRA7XX_CM_L4CFG_SPARE_SMARTREFLEX_WKUP_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x06b8)
281#define DRA7XX_CM_L4CFG_IO_DELAY_BLOCK_CLKCTRL_OFFSET 0x06c0
282#define DRA7XX_CM_L4CFG_IO_DELAY_BLOCK_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x06c0)
283#define DRA7XX_CM_L3INSTR_CLKSTCTRL_OFFSET 0x0700
284#define DRA7XX_CM_L3INSTR_L3_MAIN_2_CLKCTRL_OFFSET 0x0720
285#define DRA7XX_CM_L3INSTR_L3_MAIN_2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0720)
286#define DRA7XX_CM_L3INSTR_L3_INSTR_CLKCTRL_OFFSET 0x0728
287#define DRA7XX_CM_L3INSTR_L3_INSTR_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0728)
288#define DRA7XX_CM_L3INSTR_OCP_WP_NOC_CLKCTRL_OFFSET 0x0740
289#define DRA7XX_CM_L3INSTR_OCP_WP_NOC_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0740)
290#define DRA7XX_CM_L3INSTR_DLL_AGING_CLKCTRL_OFFSET 0x0748
291#define DRA7XX_CM_L3INSTR_DLL_AGING_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0748)
292#define DRA7XX_CM_L3INSTR_CTRL_MODULE_BANDGAP_CLKCTRL_OFFSET 0x0750
293#define DRA7XX_CM_L3INSTR_CTRL_MODULE_BANDGAP_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CORE_INST, 0x0750)
294
295/* CM_CORE.IVA_CM_CORE register offsets */
296#define DRA7XX_CM_IVA_CLKSTCTRL_OFFSET 0x0000
297#define DRA7XX_CM_IVA_STATICDEP_OFFSET 0x0004
298#define DRA7XX_CM_IVA_DYNAMICDEP_OFFSET 0x0008
299#define DRA7XX_CM_IVA_IVA_CLKCTRL_OFFSET 0x0020
300#define DRA7XX_CM_IVA_IVA_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_IVA_INST, 0x0020)
301#define DRA7XX_CM_IVA_SL2_CLKCTRL_OFFSET 0x0028
302#define DRA7XX_CM_IVA_SL2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_IVA_INST, 0x0028)
303
304/* CM_CORE.CAM_CM_CORE register offsets */
305#define DRA7XX_CM_CAM_CLKSTCTRL_OFFSET 0x0000
306#define DRA7XX_CM_CAM_STATICDEP_OFFSET 0x0004
307#define DRA7XX_CM_CAM_VIP1_CLKCTRL_OFFSET 0x0020
308#define DRA7XX_CM_CAM_VIP1_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CAM_INST, 0x0020)
309#define DRA7XX_CM_CAM_VIP2_CLKCTRL_OFFSET 0x0028
310#define DRA7XX_CM_CAM_VIP2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CAM_INST, 0x0028)
311#define DRA7XX_CM_CAM_VIP3_CLKCTRL_OFFSET 0x0030
312#define DRA7XX_CM_CAM_VIP3_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CAM_INST, 0x0030)
313#define DRA7XX_CM_CAM_LVDSRX_CLKCTRL_OFFSET 0x0038
314#define DRA7XX_CM_CAM_LVDSRX_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CAM_INST, 0x0038)
315#define DRA7XX_CM_CAM_CSI1_CLKCTRL_OFFSET 0x0040
316#define DRA7XX_CM_CAM_CSI1_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CAM_INST, 0x0040)
317#define DRA7XX_CM_CAM_CSI2_CLKCTRL_OFFSET 0x0048
318#define DRA7XX_CM_CAM_CSI2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CAM_INST, 0x0048)
319
320/* CM_CORE.DSS_CM_CORE register offsets */
321#define DRA7XX_CM_DSS_CLKSTCTRL_OFFSET 0x0000
322#define DRA7XX_CM_DSS_STATICDEP_OFFSET 0x0004
323#define DRA7XX_CM_DSS_DYNAMICDEP_OFFSET 0x0008
324#define DRA7XX_CM_DSS_DSS_CLKCTRL_OFFSET 0x0020
325#define DRA7XX_CM_DSS_DSS_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_DSS_INST, 0x0020)
326#define DRA7XX_CM_DSS_BB2D_CLKCTRL_OFFSET 0x0030
327#define DRA7XX_CM_DSS_BB2D_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_DSS_INST, 0x0030)
328#define DRA7XX_CM_DSS_SDVENC_CLKCTRL_OFFSET 0x003c
329#define DRA7XX_CM_DSS_SDVENC_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_DSS_INST, 0x003c)
330
331/* CM_CORE.GPU_CM_CORE register offsets */
332#define DRA7XX_CM_GPU_CLKSTCTRL_OFFSET 0x0000
333#define DRA7XX_CM_GPU_STATICDEP_OFFSET 0x0004
334#define DRA7XX_CM_GPU_DYNAMICDEP_OFFSET 0x0008
335#define DRA7XX_CM_GPU_GPU_CLKCTRL_OFFSET 0x0020
336#define DRA7XX_CM_GPU_GPU_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_GPU_INST, 0x0020)
337
338/* CM_CORE.L3INIT_CM_CORE register offsets */
339#define DRA7XX_CM_L3INIT_CLKSTCTRL_OFFSET 0x0000
340#define DRA7XX_CM_L3INIT_STATICDEP_OFFSET 0x0004
341#define DRA7XX_CM_L3INIT_DYNAMICDEP_OFFSET 0x0008
342#define DRA7XX_CM_L3INIT_MMC1_CLKCTRL_OFFSET 0x0028
343#define DRA7XX_CM_L3INIT_MMC1_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L3INIT_INST, 0x0028)
344#define DRA7XX_CM_L3INIT_MMC2_CLKCTRL_OFFSET 0x0030
345#define DRA7XX_CM_L3INIT_MMC2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L3INIT_INST, 0x0030)
346#define DRA7XX_CM_L3INIT_USB_OTG_SS2_CLKCTRL_OFFSET 0x0040
347#define DRA7XX_CM_L3INIT_USB_OTG_SS2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L3INIT_INST, 0x0040)
348#define DRA7XX_CM_L3INIT_USB_OTG_SS3_CLKCTRL_OFFSET 0x0048
349#define DRA7XX_CM_L3INIT_USB_OTG_SS3_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L3INIT_INST, 0x0048)
350#define DRA7XX_CM_L3INIT_USB_OTG_SS4_CLKCTRL_OFFSET 0x0050
351#define DRA7XX_CM_L3INIT_USB_OTG_SS4_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L3INIT_INST, 0x0050)
352#define DRA7XX_CM_L3INIT_MLB_SS_CLKCTRL_OFFSET 0x0058
353#define DRA7XX_CM_L3INIT_MLB_SS_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L3INIT_INST, 0x0058)
354#define DRA7XX_CM_L3INIT_IEEE1500_2_OCP_CLKCTRL_OFFSET 0x0078
355#define DRA7XX_CM_L3INIT_IEEE1500_2_OCP_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L3INIT_INST, 0x0078)
356#define DRA7XX_CM_L3INIT_SATA_CLKCTRL_OFFSET 0x0088
357#define DRA7XX_CM_L3INIT_SATA_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L3INIT_INST, 0x0088)
358#define DRA7XX_CM_PCIE_CLKSTCTRL_OFFSET 0x00a0
359#define DRA7XX_CM_PCIE_STATICDEP_OFFSET 0x00a4
360#define DRA7XX_CM_GMAC_CLKSTCTRL_OFFSET 0x00c0
361#define DRA7XX_CM_GMAC_STATICDEP_OFFSET 0x00c4
362#define DRA7XX_CM_GMAC_DYNAMICDEP_OFFSET 0x00c8
363#define DRA7XX_CM_GMAC_GMAC_CLKCTRL_OFFSET 0x00d0
364#define DRA7XX_CM_GMAC_GMAC_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L3INIT_INST, 0x00d0)
365#define DRA7XX_CM_L3INIT_OCP2SCP1_CLKCTRL_OFFSET 0x00e0
366#define DRA7XX_CM_L3INIT_OCP2SCP1_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L3INIT_INST, 0x00e0)
367#define DRA7XX_CM_L3INIT_OCP2SCP3_CLKCTRL_OFFSET 0x00e8
368#define DRA7XX_CM_L3INIT_OCP2SCP3_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L3INIT_INST, 0x00e8)
369#define DRA7XX_CM_L3INIT_USB_OTG_SS1_CLKCTRL_OFFSET 0x00f0
370#define DRA7XX_CM_L3INIT_USB_OTG_SS1_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L3INIT_INST, 0x00f0)
371
372/* CM_CORE.CUSTEFUSE_CM_CORE register offsets */
373#define DRA7XX_CM_CUSTEFUSE_CLKSTCTRL_OFFSET 0x0000
374#define DRA7XX_CM_CUSTEFUSE_EFUSE_CTRL_CUST_CLKCTRL_OFFSET 0x0020
375#define DRA7XX_CM_CUSTEFUSE_EFUSE_CTRL_CUST_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_CUSTEFUSE_INST, 0x0020)
376
377/* CM_CORE.L4PER_CM_CORE register offsets */
378#define DRA7XX_CM_L4PER_CLKSTCTRL_OFFSET 0x0000
379#define DRA7XX_CM_L4PER_DYNAMICDEP_OFFSET 0x0008
380#define DRA7XX_CM_L4PER2_L4_PER2_CLKCTRL_OFFSET 0x000c
381#define DRA7XX_CM_L4PER2_L4_PER2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x000c)
382#define DRA7XX_CM_L4PER3_L4_PER3_CLKCTRL_OFFSET 0x0014
383#define DRA7XX_CM_L4PER3_L4_PER3_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0014)
384#define DRA7XX_CM_L4PER2_PRUSS1_CLKCTRL_OFFSET 0x0018
385#define DRA7XX_CM_L4PER2_PRUSS1_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0018)
386#define DRA7XX_CM_L4PER2_PRUSS2_CLKCTRL_OFFSET 0x0020
387#define DRA7XX_CM_L4PER2_PRUSS2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0020)
388#define DRA7XX_CM_L4PER_TIMER10_CLKCTRL_OFFSET 0x0028
389#define DRA7XX_CM_L4PER_TIMER10_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0028)
390#define DRA7XX_CM_L4PER_TIMER11_CLKCTRL_OFFSET 0x0030
391#define DRA7XX_CM_L4PER_TIMER11_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0030)
392#define DRA7XX_CM_L4PER_TIMER2_CLKCTRL_OFFSET 0x0038
393#define DRA7XX_CM_L4PER_TIMER2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0038)
394#define DRA7XX_CM_L4PER_TIMER3_CLKCTRL_OFFSET 0x0040
395#define DRA7XX_CM_L4PER_TIMER3_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0040)
396#define DRA7XX_CM_L4PER_TIMER4_CLKCTRL_OFFSET 0x0048
397#define DRA7XX_CM_L4PER_TIMER4_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0048)
398#define DRA7XX_CM_L4PER_TIMER9_CLKCTRL_OFFSET 0x0050
399#define DRA7XX_CM_L4PER_TIMER9_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0050)
400#define DRA7XX_CM_L4PER_ELM_CLKCTRL_OFFSET 0x0058
401#define DRA7XX_CM_L4PER_ELM_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0058)
402#define DRA7XX_CM_L4PER_GPIO2_CLKCTRL_OFFSET 0x0060
403#define DRA7XX_CM_L4PER_GPIO2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0060)
404#define DRA7XX_CM_L4PER_GPIO3_CLKCTRL_OFFSET 0x0068
405#define DRA7XX_CM_L4PER_GPIO3_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0068)
406#define DRA7XX_CM_L4PER_GPIO4_CLKCTRL_OFFSET 0x0070
407#define DRA7XX_CM_L4PER_GPIO4_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0070)
408#define DRA7XX_CM_L4PER_GPIO5_CLKCTRL_OFFSET 0x0078
409#define DRA7XX_CM_L4PER_GPIO5_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0078)
410#define DRA7XX_CM_L4PER_GPIO6_CLKCTRL_OFFSET 0x0080
411#define DRA7XX_CM_L4PER_GPIO6_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0080)
412#define DRA7XX_CM_L4PER_HDQ1W_CLKCTRL_OFFSET 0x0088
413#define DRA7XX_CM_L4PER_HDQ1W_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0088)
414#define DRA7XX_CM_L4PER2_PWMSS2_CLKCTRL_OFFSET 0x0090
415#define DRA7XX_CM_L4PER2_PWMSS2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0090)
416#define DRA7XX_CM_L4PER2_PWMSS3_CLKCTRL_OFFSET 0x0098
417#define DRA7XX_CM_L4PER2_PWMSS3_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0098)
418#define DRA7XX_CM_L4PER_I2C1_CLKCTRL_OFFSET 0x00a0
419#define DRA7XX_CM_L4PER_I2C1_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x00a0)
420#define DRA7XX_CM_L4PER_I2C2_CLKCTRL_OFFSET 0x00a8
421#define DRA7XX_CM_L4PER_I2C2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x00a8)
422#define DRA7XX_CM_L4PER_I2C3_CLKCTRL_OFFSET 0x00b0
423#define DRA7XX_CM_L4PER_I2C3_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x00b0)
424#define DRA7XX_CM_L4PER_I2C4_CLKCTRL_OFFSET 0x00b8
425#define DRA7XX_CM_L4PER_I2C4_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x00b8)
426#define DRA7XX_CM_L4PER_L4_PER1_CLKCTRL_OFFSET 0x00c0
427#define DRA7XX_CM_L4PER_L4_PER1_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x00c0)
428#define DRA7XX_CM_L4PER2_PWMSS1_CLKCTRL_OFFSET 0x00c4
429#define DRA7XX_CM_L4PER2_PWMSS1_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x00c4)
430#define DRA7XX_CM_L4PER3_TIMER13_CLKCTRL_OFFSET 0x00c8
431#define DRA7XX_CM_L4PER3_TIMER13_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x00c8)
432#define DRA7XX_CM_L4PER3_TIMER14_CLKCTRL_OFFSET 0x00d0
433#define DRA7XX_CM_L4PER3_TIMER14_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x00d0)
434#define DRA7XX_CM_L4PER3_TIMER15_CLKCTRL_OFFSET 0x00d8
435#define DRA7XX_CM_L4PER3_TIMER15_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x00d8)
436#define DRA7XX_CM_L4PER_MCSPI1_CLKCTRL_OFFSET 0x00f0
437#define DRA7XX_CM_L4PER_MCSPI1_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x00f0)
438#define DRA7XX_CM_L4PER_MCSPI2_CLKCTRL_OFFSET 0x00f8
439#define DRA7XX_CM_L4PER_MCSPI2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x00f8)
440#define DRA7XX_CM_L4PER_MCSPI3_CLKCTRL_OFFSET 0x0100
441#define DRA7XX_CM_L4PER_MCSPI3_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0100)
442#define DRA7XX_CM_L4PER_MCSPI4_CLKCTRL_OFFSET 0x0108
443#define DRA7XX_CM_L4PER_MCSPI4_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0108)
444#define DRA7XX_CM_L4PER_GPIO7_CLKCTRL_OFFSET 0x0110
445#define DRA7XX_CM_L4PER_GPIO7_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0110)
446#define DRA7XX_CM_L4PER_GPIO8_CLKCTRL_OFFSET 0x0118
447#define DRA7XX_CM_L4PER_GPIO8_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0118)
448#define DRA7XX_CM_L4PER_MMC3_CLKCTRL_OFFSET 0x0120
449#define DRA7XX_CM_L4PER_MMC3_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0120)
450#define DRA7XX_CM_L4PER_MMC4_CLKCTRL_OFFSET 0x0128
451#define DRA7XX_CM_L4PER_MMC4_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0128)
452#define DRA7XX_CM_L4PER3_TIMER16_CLKCTRL_OFFSET 0x0130
453#define DRA7XX_CM_L4PER3_TIMER16_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0130)
454#define DRA7XX_CM_L4PER2_QSPI_CLKCTRL_OFFSET 0x0138
455#define DRA7XX_CM_L4PER2_QSPI_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0138)
456#define DRA7XX_CM_L4PER_UART1_CLKCTRL_OFFSET 0x0140
457#define DRA7XX_CM_L4PER_UART1_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0140)
458#define DRA7XX_CM_L4PER_UART2_CLKCTRL_OFFSET 0x0148
459#define DRA7XX_CM_L4PER_UART2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0148)
460#define DRA7XX_CM_L4PER_UART3_CLKCTRL_OFFSET 0x0150
461#define DRA7XX_CM_L4PER_UART3_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0150)
462#define DRA7XX_CM_L4PER_UART4_CLKCTRL_OFFSET 0x0158
463#define DRA7XX_CM_L4PER_UART4_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0158)
464#define DRA7XX_CM_L4PER2_MCASP2_CLKCTRL_OFFSET 0x0160
465#define DRA7XX_CM_L4PER2_MCASP2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0160)
466#define DRA7XX_CM_L4PER2_MCASP3_CLKCTRL_OFFSET 0x0168
467#define DRA7XX_CM_L4PER2_MCASP3_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0168)
468#define DRA7XX_CM_L4PER_UART5_CLKCTRL_OFFSET 0x0170
469#define DRA7XX_CM_L4PER_UART5_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0170)
470#define DRA7XX_CM_L4PER2_MCASP5_CLKCTRL_OFFSET 0x0178
471#define DRA7XX_CM_L4PER2_MCASP5_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0178)
472#define DRA7XX_CM_L4SEC_CLKSTCTRL_OFFSET 0x0180
473#define DRA7XX_CM_L4SEC_STATICDEP_OFFSET 0x0184
474#define DRA7XX_CM_L4SEC_DYNAMICDEP_OFFSET 0x0188
475#define DRA7XX_CM_L4PER2_MCASP8_CLKCTRL_OFFSET 0x0190
476#define DRA7XX_CM_L4PER2_MCASP8_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0190)
477#define DRA7XX_CM_L4PER2_MCASP4_CLKCTRL_OFFSET 0x0198
478#define DRA7XX_CM_L4PER2_MCASP4_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0198)
479#define DRA7XX_CM_L4SEC_AES1_CLKCTRL_OFFSET 0x01a0
480#define DRA7XX_CM_L4SEC_AES1_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x01a0)
481#define DRA7XX_CM_L4SEC_AES2_CLKCTRL_OFFSET 0x01a8
482#define DRA7XX_CM_L4SEC_AES2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x01a8)
483#define DRA7XX_CM_L4SEC_DES3DES_CLKCTRL_OFFSET 0x01b0
484#define DRA7XX_CM_L4SEC_DES3DES_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x01b0)
485#define DRA7XX_CM_L4SEC_FPKA_CLKCTRL_OFFSET 0x01b8
486#define DRA7XX_CM_L4SEC_FPKA_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x01b8)
487#define DRA7XX_CM_L4SEC_RNG_CLKCTRL_OFFSET 0x01c0
488#define DRA7XX_CM_L4SEC_RNG_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x01c0)
489#define DRA7XX_CM_L4SEC_SHA2MD51_CLKCTRL_OFFSET 0x01c8
490#define DRA7XX_CM_L4SEC_SHA2MD51_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x01c8)
491#define DRA7XX_CM_L4PER2_UART7_CLKCTRL_OFFSET 0x01d0
492#define DRA7XX_CM_L4PER2_UART7_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x01d0)
493#define DRA7XX_CM_L4SEC_DMA_CRYPTO_CLKCTRL_OFFSET 0x01d8
494#define DRA7XX_CM_L4SEC_DMA_CRYPTO_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x01d8)
495#define DRA7XX_CM_L4PER2_UART8_CLKCTRL_OFFSET 0x01e0
496#define DRA7XX_CM_L4PER2_UART8_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x01e0)
497#define DRA7XX_CM_L4PER2_UART9_CLKCTRL_OFFSET 0x01e8
498#define DRA7XX_CM_L4PER2_UART9_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x01e8)
499#define DRA7XX_CM_L4PER2_DCAN2_CLKCTRL_OFFSET 0x01f0
500#define DRA7XX_CM_L4PER2_DCAN2_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x01f0)
501#define DRA7XX_CM_L4SEC_SHA2MD52_CLKCTRL_OFFSET 0x01f8
502#define DRA7XX_CM_L4SEC_SHA2MD52_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x01f8)
503#define DRA7XX_CM_L4PER2_CLKSTCTRL_OFFSET 0x01fc
504#define DRA7XX_CM_L4PER2_DYNAMICDEP_OFFSET 0x0200
505#define DRA7XX_CM_L4PER2_MCASP6_CLKCTRL_OFFSET 0x0204
506#define DRA7XX_CM_L4PER2_MCASP6_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0204)
507#define DRA7XX_CM_L4PER2_MCASP7_CLKCTRL_OFFSET 0x0208
508#define DRA7XX_CM_L4PER2_MCASP7_CLKCTRL DRA7XX_CM_CORE_REGADDR(DRA7XX_CM_CORE_L4PER_INST, 0x0208)
509#define DRA7XX_CM_L4PER2_STATICDEP_OFFSET 0x020c
510#define DRA7XX_CM_L4PER3_CLKSTCTRL_OFFSET 0x0210
511#define DRA7XX_CM_L4PER3_DYNAMICDEP_OFFSET 0x0214
512
513#endif
diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h
index dfcc182ecff9..4a5684b96492 100644
--- a/arch/arm/mach-omap2/common.h
+++ b/arch/arm/mach-omap2/common.h
@@ -110,6 +110,7 @@ void omap3630_init_late(void);
110void am35xx_init_late(void); 110void am35xx_init_late(void);
111void ti81xx_init_late(void); 111void ti81xx_init_late(void);
112int omap2_common_pm_late_init(void); 112int omap2_common_pm_late_init(void);
113void dra7xx_init_early(void);
113 114
114#ifdef CONFIG_SOC_BUS 115#ifdef CONFIG_SOC_BUS
115void omap_soc_device_init(void); 116void omap_soc_device_init(void);
diff --git a/arch/arm/mach-omap2/cpuidle44xx.c b/arch/arm/mach-omap2/cpuidle44xx.c
index c443f2e97e10..4c8982ae9529 100644
--- a/arch/arm/mach-omap2/cpuidle44xx.c
+++ b/arch/arm/mach-omap2/cpuidle44xx.c
@@ -143,7 +143,7 @@ static int omap_enter_idle_coupled(struct cpuidle_device *dev,
143 * Call idle CPU cluster PM exit notifier chain 143 * Call idle CPU cluster PM exit notifier chain
144 * to restore GIC and wakeupgen context. 144 * to restore GIC and wakeupgen context.
145 */ 145 */
146 if ((cx->mpu_state == PWRDM_POWER_RET) && 146 if (dev->cpu == 0 && (cx->mpu_state == PWRDM_POWER_RET) &&
147 (cx->mpu_logic_state == PWRDM_POWER_OFF)) 147 (cx->mpu_logic_state == PWRDM_POWER_OFF))
148 cpu_cluster_pm_exit(); 148 cpu_cluster_pm_exit();
149 149
diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c
index 3c1279f27d1f..5c5315ba129b 100644
--- a/arch/arm/mach-omap2/devices.c
+++ b/arch/arm/mach-omap2/devices.c
@@ -327,44 +327,6 @@ static void omap_init_audio(void)
327static inline void omap_init_audio(void) {} 327static inline void omap_init_audio(void) {}
328#endif 328#endif
329 329
330#if defined(CONFIG_SND_OMAP_SOC_MCPDM) || \
331 defined(CONFIG_SND_OMAP_SOC_MCPDM_MODULE)
332
333static void __init omap_init_mcpdm(void)
334{
335 struct omap_hwmod *oh;
336 struct platform_device *pdev;
337
338 oh = omap_hwmod_lookup("mcpdm");
339 if (!oh)
340 return;
341
342 pdev = omap_device_build("omap-mcpdm", -1, oh, NULL, 0);
343 WARN(IS_ERR(pdev), "Can't build omap_device for omap-mcpdm.\n");
344}
345#else
346static inline void omap_init_mcpdm(void) {}
347#endif
348
349#if defined(CONFIG_SND_OMAP_SOC_DMIC) || \
350 defined(CONFIG_SND_OMAP_SOC_DMIC_MODULE)
351
352static void __init omap_init_dmic(void)
353{
354 struct omap_hwmod *oh;
355 struct platform_device *pdev;
356
357 oh = omap_hwmod_lookup("dmic");
358 if (!oh)
359 return;
360
361 pdev = omap_device_build("omap-dmic", -1, oh, NULL, 0);
362 WARN(IS_ERR(pdev), "Can't build omap_device for omap-dmic.\n");
363}
364#else
365static inline void omap_init_dmic(void) {}
366#endif
367
368#if defined(CONFIG_SND_OMAP_SOC_OMAP_HDMI) || \ 330#if defined(CONFIG_SND_OMAP_SOC_OMAP_HDMI) || \
369 defined(CONFIG_SND_OMAP_SOC_OMAP_HDMI_MODULE) 331 defined(CONFIG_SND_OMAP_SOC_OMAP_HDMI_MODULE)
370 332
@@ -565,17 +527,15 @@ static int __init omap2_init_devices(void)
565 omap_init_mbox(); 527 omap_init_mbox();
566 /* If dtb is there, the devices will be created dynamically */ 528 /* If dtb is there, the devices will be created dynamically */
567 if (!of_have_populated_dt()) { 529 if (!of_have_populated_dt()) {
568 omap_init_dmic();
569 omap_init_mcpdm();
570 omap_init_mcspi(); 530 omap_init_mcspi();
571 omap_init_sham(); 531 omap_init_sham();
572 omap_init_aes(); 532 omap_init_aes();
533 omap_init_rng();
573 } else { 534 } else {
574 /* These can be removed when bindings are done */ 535 /* These can be removed when bindings are done */
575 omap_init_wl12xx_of(); 536 omap_init_wl12xx_of();
576 } 537 }
577 omap_init_sti(); 538 omap_init_sti();
578 omap_init_rng();
579 omap_init_vout(); 539 omap_init_vout();
580 540
581 return 0; 541 return 0;
diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c
index ff37be1f6f93..03a0516c7f67 100644
--- a/arch/arm/mach-omap2/display.c
+++ b/arch/arm/mach-omap2/display.c
@@ -400,7 +400,7 @@ int __init omap_display_init(struct omap_dss_board_info *board_data)
400 400
401 /* Create devices for DPI and SDI */ 401 /* Create devices for DPI and SDI */
402 402
403 pdev = create_simple_dss_pdev("omapdss_dpi", -1, 403 pdev = create_simple_dss_pdev("omapdss_dpi", 0,
404 board_data, sizeof(*board_data), dss_pdev); 404 board_data, sizeof(*board_data), dss_pdev);
405 if (IS_ERR(pdev)) { 405 if (IS_ERR(pdev)) {
406 pr_err("Could not build platform_device for omapdss_dpi\n"); 406 pr_err("Could not build platform_device for omapdss_dpi\n");
@@ -408,7 +408,7 @@ int __init omap_display_init(struct omap_dss_board_info *board_data)
408 } 408 }
409 409
410 if (cpu_is_omap34xx()) { 410 if (cpu_is_omap34xx()) {
411 pdev = create_simple_dss_pdev("omapdss_sdi", -1, 411 pdev = create_simple_dss_pdev("omapdss_sdi", 0,
412 board_data, sizeof(*board_data), dss_pdev); 412 board_data, sizeof(*board_data), dss_pdev);
413 if (IS_ERR(pdev)) { 413 if (IS_ERR(pdev)) {
414 pr_err("Could not build platform_device for omapdss_sdi\n"); 414 pr_err("Could not build platform_device for omapdss_sdi\n");
diff --git a/arch/arm/mach-omap2/dss-common.c b/arch/arm/mach-omap2/dss-common.c
index 043e5705f2a6..bf89effa4c99 100644
--- a/arch/arm/mach-omap2/dss-common.c
+++ b/arch/arm/mach-omap2/dss-common.c
@@ -25,6 +25,7 @@
25 25
26#include <linux/kernel.h> 26#include <linux/kernel.h>
27#include <linux/gpio.h> 27#include <linux/gpio.h>
28#include <linux/platform_device.h>
28 29
29#include <video/omapdss.h> 30#include <video/omapdss.h>
30#include <video/omap-panel-data.h> 31#include <video/omap-panel-data.h>
@@ -37,70 +38,76 @@
37#define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */ 38#define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */
38#define HDMI_GPIO_HPD 63 /* Hotplug detect */ 39#define HDMI_GPIO_HPD 63 /* Hotplug detect */
39 40
40/* Display DVI */
41#define PANDA_DVI_TFP410_POWER_DOWN_GPIO 0 41#define PANDA_DVI_TFP410_POWER_DOWN_GPIO 0
42 42
43/* Using generic display panel */ 43/* DVI Connector */
44static struct tfp410_platform_data omap4_dvi_panel = { 44static struct connector_dvi_platform_data omap4_panda_dvi_connector_pdata = {
45 .i2c_bus_num = 2, 45 .name = "dvi",
46 .power_down_gpio = PANDA_DVI_TFP410_POWER_DOWN_GPIO, 46 .source = "tfp410.0",
47 .i2c_bus_num = 2,
47}; 48};
48 49
49static struct omap_dss_device omap4_panda_dvi_device = { 50static struct platform_device omap4_panda_dvi_connector_device = {
50 .type = OMAP_DISPLAY_TYPE_DPI, 51 .name = "connector-dvi",
51 .name = "dvi", 52 .id = 0,
52 .driver_name = "tfp410", 53 .dev.platform_data = &omap4_panda_dvi_connector_pdata,
53 .data = &omap4_dvi_panel,
54 .phy.dpi.data_lines = 24,
55 .channel = OMAP_DSS_CHANNEL_LCD2,
56}; 54};
57 55
58static struct omap_dss_hdmi_data omap4_panda_hdmi_data = { 56/* TFP410 DPI-to-DVI chip */
57static struct encoder_tfp410_platform_data omap4_panda_tfp410_pdata = {
58 .name = "tfp410.0",
59 .source = "dpi.0",
60 .data_lines = 24,
61 .power_down_gpio = PANDA_DVI_TFP410_POWER_DOWN_GPIO,
62};
63
64static struct platform_device omap4_panda_tfp410_device = {
65 .name = "tfp410",
66 .id = 0,
67 .dev.platform_data = &omap4_panda_tfp410_pdata,
68};
69
70/* HDMI Connector */
71static struct connector_hdmi_platform_data omap4_panda_hdmi_connector_pdata = {
72 .name = "hdmi",
73 .source = "tpd12s015.0",
74};
75
76static struct platform_device omap4_panda_hdmi_connector_device = {
77 .name = "connector-hdmi",
78 .id = 0,
79 .dev.platform_data = &omap4_panda_hdmi_connector_pdata,
80};
81
82/* TPD12S015 HDMI ESD protection & level shifter chip */
83static struct encoder_tpd12s015_platform_data omap4_panda_tpd_pdata = {
84 .name = "tpd12s015.0",
85 .source = "hdmi.0",
86
59 .ct_cp_hpd_gpio = HDMI_GPIO_CT_CP_HPD, 87 .ct_cp_hpd_gpio = HDMI_GPIO_CT_CP_HPD,
60 .ls_oe_gpio = HDMI_GPIO_LS_OE, 88 .ls_oe_gpio = HDMI_GPIO_LS_OE,
61 .hpd_gpio = HDMI_GPIO_HPD, 89 .hpd_gpio = HDMI_GPIO_HPD,
62}; 90};
63 91
64static struct omap_dss_device omap4_panda_hdmi_device = { 92static struct platform_device omap4_panda_tpd_device = {
65 .name = "hdmi", 93 .name = "tpd12s015",
66 .driver_name = "hdmi_panel", 94 .id = 0,
67 .type = OMAP_DISPLAY_TYPE_HDMI, 95 .dev.platform_data = &omap4_panda_tpd_pdata,
68 .channel = OMAP_DSS_CHANNEL_DIGIT,
69 .data = &omap4_panda_hdmi_data,
70};
71
72static struct omap_dss_device *omap4_panda_dss_devices[] = {
73 &omap4_panda_dvi_device,
74 &omap4_panda_hdmi_device,
75}; 96};
76 97
77static struct omap_dss_board_info omap4_panda_dss_data = { 98static struct omap_dss_board_info omap4_panda_dss_data = {
78 .num_devices = ARRAY_SIZE(omap4_panda_dss_devices), 99 .default_display_name = "dvi",
79 .devices = omap4_panda_dss_devices,
80 .default_device = &omap4_panda_dvi_device,
81}; 100};
82 101
83void __init omap4_panda_display_init(void) 102void __init omap4_panda_display_init_of(void)
84{ 103{
85 omap_display_init(&omap4_panda_dss_data); 104 omap_display_init(&omap4_panda_dss_data);
86 105
87 /* 106 platform_device_register(&omap4_panda_tfp410_device);
88 * OMAP4460SDP/Blaze and OMAP4430 ES2.3 SDP/Blaze boards and 107 platform_device_register(&omap4_panda_dvi_connector_device);
89 * later have external pull up on the HDMI I2C lines
90 */
91 if (cpu_is_omap446x() || omap_rev() > OMAP4430_REV_ES2_2)
92 omap_hdmi_init(OMAP_HDMI_SDA_SCL_EXTERNAL_PULLUP);
93 else
94 omap_hdmi_init(0);
95
96 omap_mux_init_gpio(HDMI_GPIO_LS_OE, OMAP_PIN_OUTPUT);
97 omap_mux_init_gpio(HDMI_GPIO_CT_CP_HPD, OMAP_PIN_OUTPUT);
98 omap_mux_init_gpio(HDMI_GPIO_HPD, OMAP_PIN_INPUT_PULLDOWN);
99}
100 108
101void __init omap4_panda_display_init_of(void) 109 platform_device_register(&omap4_panda_tpd_device);
102{ 110 platform_device_register(&omap4_panda_hdmi_connector_device);
103 omap_display_init(&omap4_panda_dss_data);
104} 111}
105 112
106 113
@@ -109,93 +116,73 @@ void __init omap4_panda_display_init_of(void)
109#define DISPLAY_SEL_GPIO 59 /* LCD2/PicoDLP switch */ 116#define DISPLAY_SEL_GPIO 59 /* LCD2/PicoDLP switch */
110#define DLP_POWER_ON_GPIO 40 117#define DLP_POWER_ON_GPIO 40
111 118
112static struct nokia_dsi_panel_data dsi1_panel = { 119static struct panel_dsicm_platform_data dsi1_panel = {
113 .name = "taal", 120 .name = "lcd",
114 .reset_gpio = 102, 121 .source = "dsi.0",
115 .use_ext_te = false, 122 .reset_gpio = 102,
116 .ext_te_gpio = 101, 123 .use_ext_te = false,
117 .esd_interval = 0, 124 .ext_te_gpio = 101,
118 .pin_config = { 125 .pin_config = {
119 .num_pins = 6, 126 .num_pins = 6,
120 .pins = { 0, 1, 2, 3, 4, 5 }, 127 .pins = { 0, 1, 2, 3, 4, 5 },
121 },
122};
123
124static struct omap_dss_device sdp4430_lcd_device = {
125 .name = "lcd",
126 .driver_name = "taal",
127 .type = OMAP_DISPLAY_TYPE_DSI,
128 .data = &dsi1_panel,
129 .phy.dsi = {
130 .module = 0,
131 }, 128 },
132 .channel = OMAP_DSS_CHANNEL_LCD,
133}; 129};
134 130
135static struct nokia_dsi_panel_data dsi2_panel = { 131static struct platform_device sdp4430_lcd_device = {
136 .name = "taal", 132 .name = "panel-dsi-cm",
137 .reset_gpio = 104, 133 .id = 0,
138 .use_ext_te = false, 134 .dev.platform_data = &dsi1_panel,
139 .ext_te_gpio = 103,
140 .esd_interval = 0,
141 .pin_config = {
142 .num_pins = 6,
143 .pins = { 0, 1, 2, 3, 4, 5 },
144 },
145}; 135};
146 136
147static struct omap_dss_device sdp4430_lcd2_device = { 137static struct panel_dsicm_platform_data dsi2_panel = {
148 .name = "lcd2", 138 .name = "lcd2",
149 .driver_name = "taal", 139 .source = "dsi.1",
150 .type = OMAP_DISPLAY_TYPE_DSI, 140 .reset_gpio = 104,
151 .data = &dsi2_panel, 141 .use_ext_te = false,
152 .phy.dsi = { 142 .ext_te_gpio = 103,
153 143 .pin_config = {
154 .module = 1, 144 .num_pins = 6,
145 .pins = { 0, 1, 2, 3, 4, 5 },
155 }, 146 },
156 .channel = OMAP_DSS_CHANNEL_LCD2,
157}; 147};
158 148
159static struct omap_dss_hdmi_data sdp4430_hdmi_data = { 149static struct platform_device sdp4430_lcd2_device = {
160 .ct_cp_hpd_gpio = HDMI_GPIO_CT_CP_HPD, 150 .name = "panel-dsi-cm",
161 .ls_oe_gpio = HDMI_GPIO_LS_OE, 151 .id = 1,
162 .hpd_gpio = HDMI_GPIO_HPD, 152 .dev.platform_data = &dsi2_panel,
163}; 153};
164 154
165static struct omap_dss_device sdp4430_hdmi_device = { 155/* HDMI Connector */
166 .name = "hdmi", 156static struct connector_hdmi_platform_data sdp4430_hdmi_connector_pdata = {
167 .driver_name = "hdmi_panel", 157 .name = "hdmi",
168 .type = OMAP_DISPLAY_TYPE_HDMI, 158 .source = "tpd12s015.0",
169 .channel = OMAP_DSS_CHANNEL_DIGIT,
170 .data = &sdp4430_hdmi_data,
171}; 159};
172 160
173static struct picodlp_panel_data sdp4430_picodlp_pdata = { 161static struct platform_device sdp4430_hdmi_connector_device = {
174 .picodlp_adapter_id = 2, 162 .name = "connector-hdmi",
175 .emu_done_gpio = 44, 163 .id = 0,
176 .pwrgood_gpio = 45, 164 .dev.platform_data = &sdp4430_hdmi_connector_pdata,
177}; 165};
178 166
179static struct omap_dss_device sdp4430_picodlp_device = { 167/* TPD12S015 HDMI ESD protection & level shifter chip */
180 .name = "picodlp", 168static struct encoder_tpd12s015_platform_data sdp4430_tpd_pdata = {
181 .driver_name = "picodlp_panel", 169 .name = "tpd12s015.0",
182 .type = OMAP_DISPLAY_TYPE_DPI, 170 .source = "hdmi.0",
183 .phy.dpi.data_lines = 24, 171
184 .channel = OMAP_DSS_CHANNEL_LCD2, 172 .ct_cp_hpd_gpio = HDMI_GPIO_CT_CP_HPD,
185 .data = &sdp4430_picodlp_pdata, 173 .ls_oe_gpio = HDMI_GPIO_LS_OE,
174 .hpd_gpio = HDMI_GPIO_HPD,
186}; 175};
187 176
188static struct omap_dss_device *sdp4430_dss_devices[] = { 177static struct platform_device sdp4430_tpd_device = {
189 &sdp4430_lcd_device, 178 .name = "tpd12s015",
190 &sdp4430_lcd2_device, 179 .id = 0,
191 &sdp4430_hdmi_device, 180 .dev.platform_data = &sdp4430_tpd_pdata,
192 &sdp4430_picodlp_device,
193}; 181};
194 182
183
195static struct omap_dss_board_info sdp4430_dss_data = { 184static struct omap_dss_board_info sdp4430_dss_data = {
196 .num_devices = ARRAY_SIZE(sdp4430_dss_devices), 185 .default_display_name = "lcd",
197 .devices = sdp4430_dss_devices,
198 .default_device = &sdp4430_lcd_device,
199}; 186};
200 187
201/* 188/*
@@ -204,7 +191,7 @@ static struct omap_dss_board_info sdp4430_dss_data = {
204 * used by picodlp on the 4430sdp platform. Keep this gpio disabled as LCD2 is 191 * used by picodlp on the 4430sdp platform. Keep this gpio disabled as LCD2 is
205 * selected by default 192 * selected by default
206 */ 193 */
207void __init omap_4430sdp_display_init(void) 194void __init omap_4430sdp_display_init_of(void)
208{ 195{
209 int r; 196 int r;
210 197
@@ -219,33 +206,10 @@ void __init omap_4430sdp_display_init(void)
219 pr_err("%s: Could not get DLP POWER ON GPIO\n", __func__); 206 pr_err("%s: Could not get DLP POWER ON GPIO\n", __func__);
220 207
221 omap_display_init(&sdp4430_dss_data); 208 omap_display_init(&sdp4430_dss_data);
222 /*
223 * OMAP4460SDP/Blaze and OMAP4430 ES2.3 SDP/Blaze boards and
224 * later have external pull up on the HDMI I2C lines
225 */
226 if (cpu_is_omap446x() || omap_rev() > OMAP4430_REV_ES2_2)
227 omap_hdmi_init(OMAP_HDMI_SDA_SCL_EXTERNAL_PULLUP);
228 else
229 omap_hdmi_init(0);
230
231 omap_mux_init_gpio(HDMI_GPIO_LS_OE, OMAP_PIN_OUTPUT);
232 omap_mux_init_gpio(HDMI_GPIO_CT_CP_HPD, OMAP_PIN_OUTPUT);
233 omap_mux_init_gpio(HDMI_GPIO_HPD, OMAP_PIN_INPUT_PULLDOWN);
234}
235
236void __init omap_4430sdp_display_init_of(void)
237{
238 int r;
239 209
240 r = gpio_request_one(DISPLAY_SEL_GPIO, GPIOF_OUT_INIT_HIGH, 210 platform_device_register(&sdp4430_lcd_device);
241 "display_sel"); 211 platform_device_register(&sdp4430_lcd2_device);
242 if (r)
243 pr_err("%s: Could not get display_sel GPIO\n", __func__);
244
245 r = gpio_request_one(DLP_POWER_ON_GPIO, GPIOF_OUT_INIT_LOW,
246 "DLP POWER ON");
247 if (r)
248 pr_err("%s: Could not get DLP POWER ON GPIO\n", __func__);
249 212
250 omap_display_init(&sdp4430_dss_data); 213 platform_device_register(&sdp4430_tpd_device);
214 platform_device_register(&sdp4430_hdmi_connector_device);
251} 215}
diff --git a/arch/arm/mach-omap2/dss-common.h b/arch/arm/mach-omap2/dss-common.h
index 915f6fff5106..c28fe3c03588 100644
--- a/arch/arm/mach-omap2/dss-common.h
+++ b/arch/arm/mach-omap2/dss-common.h
@@ -6,9 +6,7 @@
6 * This file will be removed when DSS supports DT. 6 * This file will be removed when DSS supports DT.
7 */ 7 */
8 8
9void __init omap4_panda_display_init(void);
10void __init omap4_panda_display_init_of(void); 9void __init omap4_panda_display_init_of(void);
11void __init omap_4430sdp_display_init(void);
12void __init omap_4430sdp_display_init_of(void); 10void __init omap_4430sdp_display_init_of(void);
13 11
14#endif 12#endif
diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c
index f3fdd6afa213..579697adaae7 100644
--- a/arch/arm/mach-omap2/gpmc.c
+++ b/arch/arm/mach-omap2/gpmc.c
@@ -149,7 +149,7 @@ struct omap3_gpmc_regs {
149 149
150static struct gpmc_client_irq gpmc_client_irq[GPMC_NR_IRQ]; 150static struct gpmc_client_irq gpmc_client_irq[GPMC_NR_IRQ];
151static struct irq_chip gpmc_irq_chip; 151static struct irq_chip gpmc_irq_chip;
152static unsigned gpmc_irq_start; 152static int gpmc_irq_start;
153 153
154static struct resource gpmc_mem_root; 154static struct resource gpmc_mem_root;
155static struct resource gpmc_cs_mem[GPMC_CS_NUM]; 155static struct resource gpmc_cs_mem[GPMC_CS_NUM];
@@ -1491,8 +1491,8 @@ static int gpmc_probe_generic_child(struct platform_device *pdev,
1491 */ 1491 */
1492 ret = gpmc_cs_remap(cs, res.start); 1492 ret = gpmc_cs_remap(cs, res.start);
1493 if (ret < 0) { 1493 if (ret < 0) {
1494 dev_err(&pdev->dev, "cannot remap GPMC CS %d to 0x%x\n", 1494 dev_err(&pdev->dev, "cannot remap GPMC CS %d to %pa\n",
1495 cs, res.start); 1495 cs, &res.start);
1496 goto err; 1496 goto err;
1497 } 1497 }
1498 1498
diff --git a/arch/arm/mach-omap2/i2c.c b/arch/arm/mach-omap2/i2c.c
index d940e53dd9f2..b456b4471f35 100644
--- a/arch/arm/mach-omap2/i2c.c
+++ b/arch/arm/mach-omap2/i2c.c
@@ -181,7 +181,7 @@ int __init omap_i2c_add_bus(struct omap_i2c_bus_platform_data *i2c_pdata,
181 sizeof(struct omap_i2c_bus_platform_data)); 181 sizeof(struct omap_i2c_bus_platform_data));
182 WARN(IS_ERR(pdev), "Could not build omap_device for %s\n", name); 182 WARN(IS_ERR(pdev), "Could not build omap_device for %s\n", name);
183 183
184 return PTR_RET(pdev); 184 return PTR_ERR_OR_ZERO(pdev);
185} 185}
186 186
187static int __init omap_i2c_cmdline(void) 187static int __init omap_i2c_cmdline(void)
diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c
index 2dc62a25f2c3..0289adcb6efb 100644
--- a/arch/arm/mach-omap2/id.c
+++ b/arch/arm/mach-omap2/id.c
@@ -61,7 +61,7 @@ int omap_type(void)
61 val = omap_ctrl_readl(OMAP343X_CONTROL_STATUS); 61 val = omap_ctrl_readl(OMAP343X_CONTROL_STATUS);
62 } else if (cpu_is_omap44xx()) { 62 } else if (cpu_is_omap44xx()) {
63 val = omap_ctrl_readl(OMAP4_CTRL_MODULE_CORE_STATUS); 63 val = omap_ctrl_readl(OMAP4_CTRL_MODULE_CORE_STATUS);
64 } else if (soc_is_omap54xx()) { 64 } else if (soc_is_omap54xx() || soc_is_dra7xx()) {
65 val = omap_ctrl_readl(OMAP5XXX_CONTROL_STATUS); 65 val = omap_ctrl_readl(OMAP5XXX_CONTROL_STATUS);
66 val &= OMAP5_DEVICETYPE_MASK; 66 val &= OMAP5_DEVICETYPE_MASK;
67 val >>= 6; 67 val >>= 6;
@@ -116,7 +116,7 @@ static u16 tap_prod_id;
116 116
117void omap_get_die_id(struct omap_die_id *odi) 117void omap_get_die_id(struct omap_die_id *odi)
118{ 118{
119 if (cpu_is_omap44xx() || soc_is_omap54xx()) { 119 if (cpu_is_omap44xx() || soc_is_omap54xx() || soc_is_dra7xx()) {
120 odi->id_0 = read_tap_reg(OMAP_TAP_DIE_ID_44XX_0); 120 odi->id_0 = read_tap_reg(OMAP_TAP_DIE_ID_44XX_0);
121 odi->id_1 = read_tap_reg(OMAP_TAP_DIE_ID_44XX_1); 121 odi->id_1 = read_tap_reg(OMAP_TAP_DIE_ID_44XX_1);
122 odi->id_2 = read_tap_reg(OMAP_TAP_DIE_ID_44XX_2); 122 odi->id_2 = read_tap_reg(OMAP_TAP_DIE_ID_44XX_2);
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c
index 4a3f06f02859..ff2113ce4014 100644
--- a/arch/arm/mach-omap2/io.c
+++ b/arch/arm/mach-omap2/io.c
@@ -251,7 +251,7 @@ static struct map_desc omap44xx_io_desc[] __initdata = {
251}; 251};
252#endif 252#endif
253 253
254#ifdef CONFIG_SOC_OMAP5 254#if defined(CONFIG_SOC_OMAP5) || defined(CONFIG_SOC_DRA7XX)
255static struct map_desc omap54xx_io_desc[] __initdata = { 255static struct map_desc omap54xx_io_desc[] __initdata = {
256 { 256 {
257 .virtual = L3_54XX_VIRT, 257 .virtual = L3_54XX_VIRT,
@@ -333,7 +333,7 @@ void __init omap4_map_io(void)
333} 333}
334#endif 334#endif
335 335
336#ifdef CONFIG_SOC_OMAP5 336#if defined(CONFIG_SOC_OMAP5) || defined(CONFIG_SOC_DRA7XX)
337void __init omap5_map_io(void) 337void __init omap5_map_io(void)
338{ 338{
339 iotable_init(omap54xx_io_desc, ARRAY_SIZE(omap54xx_io_desc)); 339 iotable_init(omap54xx_io_desc, ARRAY_SIZE(omap54xx_io_desc));
@@ -653,6 +653,27 @@ void __init omap5_init_early(void)
653} 653}
654#endif 654#endif
655 655
656#ifdef CONFIG_SOC_DRA7XX
657void __init dra7xx_init_early(void)
658{
659 omap2_set_globals_tap(-1, OMAP2_L4_IO_ADDRESS(DRA7XX_TAP_BASE));
660 omap2_set_globals_control(OMAP2_L4_IO_ADDRESS(OMAP54XX_SCM_BASE),
661 OMAP2_L4_IO_ADDRESS(DRA7XX_CTRL_BASE));
662 omap2_set_globals_prm(OMAP2_L4_IO_ADDRESS(OMAP54XX_PRM_BASE));
663 omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(DRA7XX_CM_CORE_AON_BASE),
664 OMAP2_L4_IO_ADDRESS(OMAP54XX_CM_CORE_BASE));
665 omap2_set_globals_prcm_mpu(OMAP2_L4_IO_ADDRESS(OMAP54XX_PRCM_MPU_BASE));
666 omap_prm_base_init();
667 omap_cm_base_init();
668 omap44xx_prm_init();
669 dra7xx_powerdomains_init();
670 dra7xx_clockdomains_init();
671 dra7xx_hwmod_init();
672 omap_hwmod_init_postsetup();
673}
674#endif
675
676
656void __init omap_sdrc_init(struct omap_sdrc_params *sdrc_cs0, 677void __init omap_sdrc_init(struct omap_sdrc_params *sdrc_cs0,
657 struct omap_sdrc_params *sdrc_cs1) 678 struct omap_sdrc_params *sdrc_cs1)
658{ 679{
diff --git a/arch/arm/mach-omap2/mux34xx.c b/arch/arm/mach-omap2/mux34xx.c
index c53609f46294..be271f1d585b 100644
--- a/arch/arm/mach-omap2/mux34xx.c
+++ b/arch/arm/mach-omap2/mux34xx.c
@@ -620,7 +620,7 @@ static struct omap_mux __initdata omap3_muxmodes[] = {
620 "uart1_rts", "ssi1_flag_tx", NULL, NULL, 620 "uart1_rts", "ssi1_flag_tx", NULL, NULL,
621 "gpio_149", NULL, NULL, "safe_mode"), 621 "gpio_149", NULL, NULL, "safe_mode"),
622 _OMAP3_MUXENTRY(UART1_RX, 151, 622 _OMAP3_MUXENTRY(UART1_RX, 151,
623 "uart1_rx", "ss1_wake_tx", "mcbsp1_clkr", "mcspi4_clk", 623 "uart1_rx", "ssi1_wake_tx", "mcbsp1_clkr", "mcspi4_clk",
624 "gpio_151", NULL, NULL, "safe_mode"), 624 "gpio_151", NULL, NULL, "safe_mode"),
625 _OMAP3_MUXENTRY(UART1_TX, 148, 625 _OMAP3_MUXENTRY(UART1_TX, 148,
626 "uart1_tx", "ssi1_dat_tx", NULL, NULL, 626 "uart1_tx", "ssi1_dat_tx", NULL, NULL,
diff --git a/arch/arm/mach-omap2/omap-smp.c b/arch/arm/mach-omap2/omap-smp.c
index 8708b2a9da45..891211093295 100644
--- a/arch/arm/mach-omap2/omap-smp.c
+++ b/arch/arm/mach-omap2/omap-smp.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * OMAP4 SMP source file. It contains platform specific fucntions 2 * OMAP4 SMP source file. It contains platform specific functions
3 * needed for the linux smp kernel. 3 * needed for the linux smp kernel.
4 * 4 *
5 * Copyright (C) 2009 Texas Instruments, Inc. 5 * Copyright (C) 2009 Texas Instruments, Inc.
diff --git a/arch/arm/mach-omap2/omap54xx.h b/arch/arm/mach-omap2/omap54xx.h
index a086ba15868b..2d35c5709408 100644
--- a/arch/arm/mach-omap2/omap54xx.h
+++ b/arch/arm/mach-omap2/omap54xx.h
@@ -30,4 +30,8 @@
30#define OMAP54XX_CTRL_BASE 0x4a002800 30#define OMAP54XX_CTRL_BASE 0x4a002800
31#define OMAP54XX_SAR_RAM_BASE 0x4ae26000 31#define OMAP54XX_SAR_RAM_BASE 0x4ae26000
32 32
33#define DRA7XX_CM_CORE_AON_BASE 0x4a005000
34#define DRA7XX_CTRL_BASE 0x4a003400
35#define DRA7XX_TAP_BASE 0x4ae0c000
36
33#endif /* __ASM_SOC_OMAP555554XX_H */ 37#endif /* __ASM_SOC_OMAP555554XX_H */
diff --git a/arch/arm/mach-omap2/omap_device.c b/arch/arm/mach-omap2/omap_device.c
index f99f68e1e85b..b69dd9abb50a 100644
--- a/arch/arm/mach-omap2/omap_device.c
+++ b/arch/arm/mach-omap2/omap_device.c
@@ -158,7 +158,7 @@ static int omap_device_build_from_dt(struct platform_device *pdev)
158 } 158 }
159 159
160 od = omap_device_alloc(pdev, hwmods, oh_cnt); 160 od = omap_device_alloc(pdev, hwmods, oh_cnt);
161 if (!od) { 161 if (IS_ERR(od)) {
162 dev_err(&pdev->dev, "Cannot allocate omap_device for :%s\n", 162 dev_err(&pdev->dev, "Cannot allocate omap_device for :%s\n",
163 oh_name); 163 oh_name);
164 ret = PTR_ERR(od); 164 ret = PTR_ERR(od);
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
index 7f4db12b1459..d9ee0ff094d4 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -1405,7 +1405,9 @@ static void _enable_sysc(struct omap_hwmod *oh)
1405 (sf & SYSC_HAS_CLOCKACTIVITY)) 1405 (sf & SYSC_HAS_CLOCKACTIVITY))
1406 _set_clockactivity(oh, oh->class->sysc->clockact, &v); 1406 _set_clockactivity(oh, oh->class->sysc->clockact, &v);
1407 1407
1408 _write_sysconfig(v, oh); 1408 /* If the cached value is the same as the new value, skip the write */
1409 if (oh->_sysc_cache != v)
1410 _write_sysconfig(v, oh);
1409 1411
1410 /* 1412 /*
1411 * Set the autoidle bit only after setting the smartidle bit 1413 * Set the autoidle bit only after setting the smartidle bit
@@ -4113,7 +4115,7 @@ void __init omap_hwmod_init(void)
4113 soc_ops.assert_hardreset = _omap2_assert_hardreset; 4115 soc_ops.assert_hardreset = _omap2_assert_hardreset;
4114 soc_ops.deassert_hardreset = _omap2_deassert_hardreset; 4116 soc_ops.deassert_hardreset = _omap2_deassert_hardreset;
4115 soc_ops.is_hardreset_asserted = _omap2_is_hardreset_asserted; 4117 soc_ops.is_hardreset_asserted = _omap2_is_hardreset_asserted;
4116 } else if (cpu_is_omap44xx() || soc_is_omap54xx()) { 4118 } else if (cpu_is_omap44xx() || soc_is_omap54xx() || soc_is_dra7xx()) {
4117 soc_ops.enable_module = _omap4_enable_module; 4119 soc_ops.enable_module = _omap4_enable_module;
4118 soc_ops.disable_module = _omap4_disable_module; 4120 soc_ops.disable_module = _omap4_disable_module;
4119 soc_ops.wait_target_ready = _omap4_wait_target_ready; 4121 soc_ops.wait_target_ready = _omap4_wait_target_ready;
diff --git a/arch/arm/mach-omap2/omap_hwmod.h b/arch/arm/mach-omap2/omap_hwmod.h
index e1482a9b3bc2..d02acf9308d3 100644
--- a/arch/arm/mach-omap2/omap_hwmod.h
+++ b/arch/arm/mach-omap2/omap_hwmod.h
@@ -751,6 +751,7 @@ extern int omap3xxx_hwmod_init(void);
751extern int omap44xx_hwmod_init(void); 751extern int omap44xx_hwmod_init(void);
752extern int omap54xx_hwmod_init(void); 752extern int omap54xx_hwmod_init(void);
753extern int am33xx_hwmod_init(void); 753extern int am33xx_hwmod_init(void);
754extern int dra7xx_hwmod_init(void);
754 755
755extern int __init omap_hwmod_register_links(struct omap_hwmod_ocp_if **ois); 756extern int __init omap_hwmod_register_links(struct omap_hwmod_ocp_if **ois);
756 757
diff --git a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c
index eb2f3b93b51c..215894f8910d 100644
--- a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c
@@ -325,7 +325,6 @@ static struct omap_hwmod am33xx_adc_tsc_hwmod = {
325 * 325 *
326 * - cEFUSE (doesn't fall under any ocp_if) 326 * - cEFUSE (doesn't fall under any ocp_if)
327 * - clkdiv32k 327 * - clkdiv32k
328 * - debugss
329 * - ocp watch point 328 * - ocp watch point
330 */ 329 */
331#if 0 330#if 0
@@ -369,27 +368,6 @@ static struct omap_hwmod am33xx_clkdiv32k_hwmod = {
369 }, 368 },
370}; 369};
371 370
372/*
373 * 'debugss' class
374 * debug sub system
375 */
376static struct omap_hwmod_class am33xx_debugss_hwmod_class = {
377 .name = "debugss",
378};
379
380static struct omap_hwmod am33xx_debugss_hwmod = {
381 .name = "debugss",
382 .class = &am33xx_debugss_hwmod_class,
383 .clkdm_name = "l3_aon_clkdm",
384 .main_clk = "debugss_ick",
385 .prcm = {
386 .omap4 = {
387 .clkctrl_offs = AM33XX_CM_WKUP_DEBUGSS_CLKCTRL_OFFSET,
388 .modulemode = MODULEMODE_SWCTRL,
389 },
390 },
391};
392
393/* ocpwp */ 371/* ocpwp */
394static struct omap_hwmod_class am33xx_ocpwp_hwmod_class = { 372static struct omap_hwmod_class am33xx_ocpwp_hwmod_class = {
395 .name = "ocpwp", 373 .name = "ocpwp",
@@ -482,6 +460,34 @@ static struct omap_hwmod am33xx_ocmcram_hwmod = {
482 }, 460 },
483}; 461};
484 462
463/*
464 * 'debugss' class
465 * debug sub system
466 */
467static struct omap_hwmod_opt_clk debugss_opt_clks[] = {
468 { .role = "dbg_sysclk", .clk = "dbg_sysclk_ck" },
469 { .role = "dbg_clka", .clk = "dbg_clka_ck" },
470};
471
472static struct omap_hwmod_class am33xx_debugss_hwmod_class = {
473 .name = "debugss",
474};
475
476static struct omap_hwmod am33xx_debugss_hwmod = {
477 .name = "debugss",
478 .class = &am33xx_debugss_hwmod_class,
479 .clkdm_name = "l3_aon_clkdm",
480 .main_clk = "trace_clk_div_ck",
481 .prcm = {
482 .omap4 = {
483 .clkctrl_offs = AM33XX_CM_WKUP_DEBUGSS_CLKCTRL_OFFSET,
484 .modulemode = MODULEMODE_SWCTRL,
485 },
486 },
487 .opt_clks = debugss_opt_clks,
488 .opt_clks_cnt = ARRAY_SIZE(debugss_opt_clks),
489};
490
485/* 'smartreflex' class */ 491/* 'smartreflex' class */
486static struct omap_hwmod_class am33xx_smartreflex_hwmod_class = { 492static struct omap_hwmod_class am33xx_smartreflex_hwmod_class = {
487 .name = "smartreflex", 493 .name = "smartreflex",
@@ -1796,6 +1802,24 @@ static struct omap_hwmod_ocp_if am33xx_l3_main__gfx = {
1796 .user = OCP_USER_MPU | OCP_USER_SDMA, 1802 .user = OCP_USER_MPU | OCP_USER_SDMA,
1797}; 1803};
1798 1804
1805/* l3_main -> debugss */
1806static struct omap_hwmod_addr_space am33xx_debugss_addrs[] = {
1807 {
1808 .pa_start = 0x4b000000,
1809 .pa_end = 0x4b000000 + SZ_16M - 1,
1810 .flags = ADDR_TYPE_RT
1811 },
1812 { }
1813};
1814
1815static struct omap_hwmod_ocp_if am33xx_l3_main__debugss = {
1816 .master = &am33xx_l3_main_hwmod,
1817 .slave = &am33xx_debugss_hwmod,
1818 .clk = "dpll_core_m4_ck",
1819 .addr = am33xx_debugss_addrs,
1820 .user = OCP_USER_MPU,
1821};
1822
1799/* l4 wkup -> smartreflex0 */ 1823/* l4 wkup -> smartreflex0 */
1800static struct omap_hwmod_ocp_if am33xx_l4_wkup__smartreflex0 = { 1824static struct omap_hwmod_ocp_if am33xx_l4_wkup__smartreflex0 = {
1801 .master = &am33xx_l4_wkup_hwmod, 1825 .master = &am33xx_l4_wkup_hwmod,
@@ -2470,6 +2494,7 @@ static struct omap_hwmod_ocp_if *am33xx_hwmod_ocp_ifs[] __initdata = {
2470 &am33xx_pruss__l3_main, 2494 &am33xx_pruss__l3_main,
2471 &am33xx_wkup_m3__l4_wkup, 2495 &am33xx_wkup_m3__l4_wkup,
2472 &am33xx_gfx__l3_main, 2496 &am33xx_gfx__l3_main,
2497 &am33xx_l3_main__debugss,
2473 &am33xx_l4_wkup__wkup_m3, 2498 &am33xx_l4_wkup__wkup_m3,
2474 &am33xx_l4_wkup__control, 2499 &am33xx_l4_wkup__control,
2475 &am33xx_l4_wkup__smartreflex0, 2500 &am33xx_l4_wkup__smartreflex0,
diff --git a/arch/arm/mach-omap2/omap_hwmod_54xx_data.c b/arch/arm/mach-omap2/omap_hwmod_54xx_data.c
index 3c70f5c1860f..cde415570e04 100644
--- a/arch/arm/mach-omap2/omap_hwmod_54xx_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_54xx_data.c
@@ -32,7 +32,6 @@
32#include "cm1_54xx.h" 32#include "cm1_54xx.h"
33#include "cm2_54xx.h" 33#include "cm2_54xx.h"
34#include "prm54xx.h" 34#include "prm54xx.h"
35#include "prm-regbits-54xx.h"
36#include "i2c.h" 35#include "i2c.h"
37#include "mmc.h" 36#include "mmc.h"
38#include "wd_timer.h" 37#include "wd_timer.h"
@@ -741,6 +740,39 @@ static struct omap_hwmod omap54xx_kbd_hwmod = {
741}; 740};
742 741
743/* 742/*
743 * 'mailbox' class
744 * mailbox module allowing communication between the on-chip processors using a
745 * queued mailbox-interrupt mechanism.
746 */
747
748static struct omap_hwmod_class_sysconfig omap54xx_mailbox_sysc = {
749 .rev_offs = 0x0000,
750 .sysc_offs = 0x0010,
751 .sysc_flags = (SYSC_HAS_RESET_STATUS | SYSC_HAS_SIDLEMODE |
752 SYSC_HAS_SOFTRESET),
753 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
754 .sysc_fields = &omap_hwmod_sysc_type2,
755};
756
757static struct omap_hwmod_class omap54xx_mailbox_hwmod_class = {
758 .name = "mailbox",
759 .sysc = &omap54xx_mailbox_sysc,
760};
761
762/* mailbox */
763static struct omap_hwmod omap54xx_mailbox_hwmod = {
764 .name = "mailbox",
765 .class = &omap54xx_mailbox_hwmod_class,
766 .clkdm_name = "l4cfg_clkdm",
767 .prcm = {
768 .omap4 = {
769 .clkctrl_offs = OMAP54XX_CM_L4CFG_MAILBOX_CLKCTRL_OFFSET,
770 .context_offs = OMAP54XX_RM_L4CFG_MAILBOX_CONTEXT_OFFSET,
771 },
772 },
773};
774
775/*
744 * 'mcbsp' class 776 * 'mcbsp' class
745 * multi channel buffered serial port controller 777 * multi channel buffered serial port controller
746 */ 778 */
@@ -1808,6 +1840,14 @@ static struct omap_hwmod_ocp_if omap54xx_l4_wkup__kbd = {
1808 .user = OCP_USER_MPU | OCP_USER_SDMA, 1840 .user = OCP_USER_MPU | OCP_USER_SDMA,
1809}; 1841};
1810 1842
1843/* l4_cfg -> mailbox */
1844static struct omap_hwmod_ocp_if omap54xx_l4_cfg__mailbox = {
1845 .master = &omap54xx_l4_cfg_hwmod,
1846 .slave = &omap54xx_mailbox_hwmod,
1847 .clk = "l4_root_clk_div",
1848 .user = OCP_USER_MPU | OCP_USER_SDMA,
1849};
1850
1811/* l4_abe -> mcbsp1 */ 1851/* l4_abe -> mcbsp1 */
1812static struct omap_hwmod_ocp_if omap54xx_l4_abe__mcbsp1 = { 1852static struct omap_hwmod_ocp_if omap54xx_l4_abe__mcbsp1 = {
1813 .master = &omap54xx_l4_abe_hwmod, 1853 .master = &omap54xx_l4_abe_hwmod,
@@ -2108,6 +2148,7 @@ static struct omap_hwmod_ocp_if *omap54xx_hwmod_ocp_ifs[] __initdata = {
2108 &omap54xx_l4_per__i2c4, 2148 &omap54xx_l4_per__i2c4,
2109 &omap54xx_l4_per__i2c5, 2149 &omap54xx_l4_per__i2c5,
2110 &omap54xx_l4_wkup__kbd, 2150 &omap54xx_l4_wkup__kbd,
2151 &omap54xx_l4_cfg__mailbox,
2111 &omap54xx_l4_abe__mcbsp1, 2152 &omap54xx_l4_abe__mcbsp1,
2112 &omap54xx_l4_abe__mcbsp2, 2153 &omap54xx_l4_abe__mcbsp2,
2113 &omap54xx_l4_abe__mcbsp3, 2154 &omap54xx_l4_abe__mcbsp3,
diff --git a/arch/arm/mach-omap2/omap_hwmod_7xx_data.c b/arch/arm/mach-omap2/omap_hwmod_7xx_data.c
new file mode 100644
index 000000000000..db32d5380b11
--- /dev/null
+++ b/arch/arm/mach-omap2/omap_hwmod_7xx_data.c
@@ -0,0 +1,2724 @@
1/*
2 * Hardware modules present on the DRA7xx chips
3 *
4 * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
5 *
6 * Paul Walmsley
7 * Benoit Cousson
8 *
9 * This file is automatically generated from the OMAP hardware databases.
10 * We respectfully ask that any modifications to this file be coordinated
11 * with the public linux-omap@vger.kernel.org mailing list and the
12 * authors above to ensure that the autogeneration scripts are kept
13 * up-to-date with the file contents.
14 *
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License version 2 as
17 * published by the Free Software Foundation.
18 */
19
20#include <linux/io.h>
21#include <linux/platform_data/gpio-omap.h>
22#include <linux/power/smartreflex.h>
23#include <linux/i2c-omap.h>
24
25#include <linux/omap-dma.h>
26#include <linux/platform_data/spi-omap2-mcspi.h>
27#include <linux/platform_data/asoc-ti-mcbsp.h>
28#include <plat/dmtimer.h>
29
30#include "omap_hwmod.h"
31#include "omap_hwmod_common_data.h"
32#include "cm1_7xx.h"
33#include "cm2_7xx.h"
34#include "prm7xx.h"
35#include "i2c.h"
36#include "mmc.h"
37#include "wd_timer.h"
38
39/* Base offset for all DRA7XX interrupts external to MPUSS */
40#define DRA7XX_IRQ_GIC_START 32
41
42/* Base offset for all DRA7XX dma requests */
43#define DRA7XX_DMA_REQ_START 1
44
45
46/*
47 * IP blocks
48 */
49
50/*
51 * 'l3' class
52 * instance(s): l3_instr, l3_main_1, l3_main_2
53 */
54static struct omap_hwmod_class dra7xx_l3_hwmod_class = {
55 .name = "l3",
56};
57
58/* l3_instr */
59static struct omap_hwmod dra7xx_l3_instr_hwmod = {
60 .name = "l3_instr",
61 .class = &dra7xx_l3_hwmod_class,
62 .clkdm_name = "l3instr_clkdm",
63 .prcm = {
64 .omap4 = {
65 .clkctrl_offs = DRA7XX_CM_L3INSTR_L3_INSTR_CLKCTRL_OFFSET,
66 .context_offs = DRA7XX_RM_L3INSTR_L3_INSTR_CONTEXT_OFFSET,
67 .modulemode = MODULEMODE_HWCTRL,
68 },
69 },
70};
71
72/* l3_main_1 */
73static struct omap_hwmod dra7xx_l3_main_1_hwmod = {
74 .name = "l3_main_1",
75 .class = &dra7xx_l3_hwmod_class,
76 .clkdm_name = "l3main1_clkdm",
77 .prcm = {
78 .omap4 = {
79 .clkctrl_offs = DRA7XX_CM_L3MAIN1_L3_MAIN_1_CLKCTRL_OFFSET,
80 .context_offs = DRA7XX_RM_L3MAIN1_L3_MAIN_1_CONTEXT_OFFSET,
81 },
82 },
83};
84
85/* l3_main_2 */
86static struct omap_hwmod dra7xx_l3_main_2_hwmod = {
87 .name = "l3_main_2",
88 .class = &dra7xx_l3_hwmod_class,
89 .clkdm_name = "l3instr_clkdm",
90 .prcm = {
91 .omap4 = {
92 .clkctrl_offs = DRA7XX_CM_L3INSTR_L3_MAIN_2_CLKCTRL_OFFSET,
93 .context_offs = DRA7XX_RM_L3INSTR_L3_MAIN_2_CONTEXT_OFFSET,
94 .modulemode = MODULEMODE_HWCTRL,
95 },
96 },
97};
98
99/*
100 * 'l4' class
101 * instance(s): l4_cfg, l4_per1, l4_per2, l4_per3, l4_wkup
102 */
103static struct omap_hwmod_class dra7xx_l4_hwmod_class = {
104 .name = "l4",
105};
106
107/* l4_cfg */
108static struct omap_hwmod dra7xx_l4_cfg_hwmod = {
109 .name = "l4_cfg",
110 .class = &dra7xx_l4_hwmod_class,
111 .clkdm_name = "l4cfg_clkdm",
112 .prcm = {
113 .omap4 = {
114 .clkctrl_offs = DRA7XX_CM_L4CFG_L4_CFG_CLKCTRL_OFFSET,
115 .context_offs = DRA7XX_RM_L4CFG_L4_CFG_CONTEXT_OFFSET,
116 },
117 },
118};
119
120/* l4_per1 */
121static struct omap_hwmod dra7xx_l4_per1_hwmod = {
122 .name = "l4_per1",
123 .class = &dra7xx_l4_hwmod_class,
124 .clkdm_name = "l4per_clkdm",
125 .prcm = {
126 .omap4 = {
127 .clkctrl_offs = DRA7XX_CM_L4PER_L4_PER1_CLKCTRL_OFFSET,
128 .flags = HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT,
129 },
130 },
131};
132
133/* l4_per2 */
134static struct omap_hwmod dra7xx_l4_per2_hwmod = {
135 .name = "l4_per2",
136 .class = &dra7xx_l4_hwmod_class,
137 .clkdm_name = "l4per2_clkdm",
138 .prcm = {
139 .omap4 = {
140 .clkctrl_offs = DRA7XX_CM_L4PER2_L4_PER2_CLKCTRL_OFFSET,
141 .flags = HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT,
142 },
143 },
144};
145
146/* l4_per3 */
147static struct omap_hwmod dra7xx_l4_per3_hwmod = {
148 .name = "l4_per3",
149 .class = &dra7xx_l4_hwmod_class,
150 .clkdm_name = "l4per3_clkdm",
151 .prcm = {
152 .omap4 = {
153 .clkctrl_offs = DRA7XX_CM_L4PER3_L4_PER3_CLKCTRL_OFFSET,
154 .flags = HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT,
155 },
156 },
157};
158
159/* l4_wkup */
160static struct omap_hwmod dra7xx_l4_wkup_hwmod = {
161 .name = "l4_wkup",
162 .class = &dra7xx_l4_hwmod_class,
163 .clkdm_name = "wkupaon_clkdm",
164 .prcm = {
165 .omap4 = {
166 .clkctrl_offs = DRA7XX_CM_WKUPAON_L4_WKUP_CLKCTRL_OFFSET,
167 .context_offs = DRA7XX_RM_WKUPAON_L4_WKUP_CONTEXT_OFFSET,
168 },
169 },
170};
171
172/*
173 * 'atl' class
174 *
175 */
176
177static struct omap_hwmod_class dra7xx_atl_hwmod_class = {
178 .name = "atl",
179};
180
181/* atl */
182static struct omap_hwmod dra7xx_atl_hwmod = {
183 .name = "atl",
184 .class = &dra7xx_atl_hwmod_class,
185 .clkdm_name = "atl_clkdm",
186 .main_clk = "atl_gfclk_mux",
187 .prcm = {
188 .omap4 = {
189 .clkctrl_offs = DRA7XX_CM_ATL_ATL_CLKCTRL_OFFSET,
190 .context_offs = DRA7XX_RM_ATL_ATL_CONTEXT_OFFSET,
191 .modulemode = MODULEMODE_SWCTRL,
192 },
193 },
194};
195
196/*
197 * 'bb2d' class
198 *
199 */
200
201static struct omap_hwmod_class dra7xx_bb2d_hwmod_class = {
202 .name = "bb2d",
203};
204
205/* bb2d */
206static struct omap_hwmod dra7xx_bb2d_hwmod = {
207 .name = "bb2d",
208 .class = &dra7xx_bb2d_hwmod_class,
209 .clkdm_name = "dss_clkdm",
210 .main_clk = "dpll_core_h24x2_ck",
211 .prcm = {
212 .omap4 = {
213 .clkctrl_offs = DRA7XX_CM_DSS_BB2D_CLKCTRL_OFFSET,
214 .context_offs = DRA7XX_RM_DSS_BB2D_CONTEXT_OFFSET,
215 .modulemode = MODULEMODE_SWCTRL,
216 },
217 },
218};
219
220/*
221 * 'counter' class
222 *
223 */
224
225static struct omap_hwmod_class_sysconfig dra7xx_counter_sysc = {
226 .rev_offs = 0x0000,
227 .sysc_offs = 0x0010,
228 .sysc_flags = SYSC_HAS_SIDLEMODE,
229 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
230 SIDLE_SMART_WKUP),
231 .sysc_fields = &omap_hwmod_sysc_type1,
232};
233
234static struct omap_hwmod_class dra7xx_counter_hwmod_class = {
235 .name = "counter",
236 .sysc = &dra7xx_counter_sysc,
237};
238
239/* counter_32k */
240static struct omap_hwmod dra7xx_counter_32k_hwmod = {
241 .name = "counter_32k",
242 .class = &dra7xx_counter_hwmod_class,
243 .clkdm_name = "wkupaon_clkdm",
244 .flags = HWMOD_SWSUP_SIDLE,
245 .main_clk = "wkupaon_iclk_mux",
246 .prcm = {
247 .omap4 = {
248 .clkctrl_offs = DRA7XX_CM_WKUPAON_COUNTER_32K_CLKCTRL_OFFSET,
249 .context_offs = DRA7XX_RM_WKUPAON_COUNTER_32K_CONTEXT_OFFSET,
250 },
251 },
252};
253
254/*
255 * 'ctrl_module' class
256 *
257 */
258
259static struct omap_hwmod_class dra7xx_ctrl_module_hwmod_class = {
260 .name = "ctrl_module",
261};
262
263/* ctrl_module_wkup */
264static struct omap_hwmod dra7xx_ctrl_module_wkup_hwmod = {
265 .name = "ctrl_module_wkup",
266 .class = &dra7xx_ctrl_module_hwmod_class,
267 .clkdm_name = "wkupaon_clkdm",
268 .prcm = {
269 .omap4 = {
270 .flags = HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT,
271 },
272 },
273};
274
275/*
276 * 'dcan' class
277 *
278 */
279
280static struct omap_hwmod_class dra7xx_dcan_hwmod_class = {
281 .name = "dcan",
282};
283
284/* dcan1 */
285static struct omap_hwmod dra7xx_dcan1_hwmod = {
286 .name = "dcan1",
287 .class = &dra7xx_dcan_hwmod_class,
288 .clkdm_name = "wkupaon_clkdm",
289 .main_clk = "dcan1_sys_clk_mux",
290 .prcm = {
291 .omap4 = {
292 .clkctrl_offs = DRA7XX_CM_WKUPAON_DCAN1_CLKCTRL_OFFSET,
293 .context_offs = DRA7XX_RM_WKUPAON_DCAN1_CONTEXT_OFFSET,
294 .modulemode = MODULEMODE_SWCTRL,
295 },
296 },
297};
298
299/* dcan2 */
300static struct omap_hwmod dra7xx_dcan2_hwmod = {
301 .name = "dcan2",
302 .class = &dra7xx_dcan_hwmod_class,
303 .clkdm_name = "l4per2_clkdm",
304 .main_clk = "sys_clkin1",
305 .prcm = {
306 .omap4 = {
307 .clkctrl_offs = DRA7XX_CM_L4PER2_DCAN2_CLKCTRL_OFFSET,
308 .context_offs = DRA7XX_RM_L4PER2_DCAN2_CONTEXT_OFFSET,
309 .modulemode = MODULEMODE_SWCTRL,
310 },
311 },
312};
313
314/*
315 * 'dma' class
316 *
317 */
318
319static struct omap_hwmod_class_sysconfig dra7xx_dma_sysc = {
320 .rev_offs = 0x0000,
321 .sysc_offs = 0x002c,
322 .syss_offs = 0x0028,
323 .sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY |
324 SYSC_HAS_EMUFREE | SYSC_HAS_MIDLEMODE |
325 SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
326 SYSS_HAS_RESET_STATUS),
327 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
328 SIDLE_SMART_WKUP | MSTANDBY_FORCE | MSTANDBY_NO |
329 MSTANDBY_SMART | MSTANDBY_SMART_WKUP),
330 .sysc_fields = &omap_hwmod_sysc_type1,
331};
332
333static struct omap_hwmod_class dra7xx_dma_hwmod_class = {
334 .name = "dma",
335 .sysc = &dra7xx_dma_sysc,
336};
337
338/* dma dev_attr */
339static struct omap_dma_dev_attr dma_dev_attr = {
340 .dev_caps = RESERVE_CHANNEL | DMA_LINKED_LCH | GLOBAL_PRIORITY |
341 IS_CSSA_32 | IS_CDSA_32 | IS_RW_PRIORITY,
342 .lch_count = 32,
343};
344
345/* dma_system */
346static struct omap_hwmod_irq_info dra7xx_dma_system_irqs[] = {
347 { .name = "0", .irq = 12 + DRA7XX_IRQ_GIC_START },
348 { .name = "1", .irq = 13 + DRA7XX_IRQ_GIC_START },
349 { .name = "2", .irq = 14 + DRA7XX_IRQ_GIC_START },
350 { .name = "3", .irq = 15 + DRA7XX_IRQ_GIC_START },
351 { .irq = -1 }
352};
353
354static struct omap_hwmod dra7xx_dma_system_hwmod = {
355 .name = "dma_system",
356 .class = &dra7xx_dma_hwmod_class,
357 .clkdm_name = "dma_clkdm",
358 .mpu_irqs = dra7xx_dma_system_irqs,
359 .main_clk = "l3_iclk_div",
360 .prcm = {
361 .omap4 = {
362 .clkctrl_offs = DRA7XX_CM_DMA_DMA_SYSTEM_CLKCTRL_OFFSET,
363 .context_offs = DRA7XX_RM_DMA_DMA_SYSTEM_CONTEXT_OFFSET,
364 },
365 },
366 .dev_attr = &dma_dev_attr,
367};
368
369/*
370 * 'dss' class
371 *
372 */
373
374static struct omap_hwmod_class_sysconfig dra7xx_dss_sysc = {
375 .rev_offs = 0x0000,
376 .syss_offs = 0x0014,
377 .sysc_flags = SYSS_HAS_RESET_STATUS,
378};
379
380static struct omap_hwmod_class dra7xx_dss_hwmod_class = {
381 .name = "dss",
382 .sysc = &dra7xx_dss_sysc,
383 .reset = omap_dss_reset,
384};
385
386/* dss */
387static struct omap_hwmod_dma_info dra7xx_dss_sdma_reqs[] = {
388 { .dma_req = 75 + DRA7XX_DMA_REQ_START },
389 { .dma_req = -1 }
390};
391
392static struct omap_hwmod_opt_clk dss_opt_clks[] = {
393 { .role = "dss_clk", .clk = "dss_dss_clk" },
394 { .role = "hdmi_phy_clk", .clk = "dss_48mhz_clk" },
395 { .role = "32khz_clk", .clk = "dss_32khz_clk" },
396 { .role = "video2_clk", .clk = "dss_video2_clk" },
397 { .role = "video1_clk", .clk = "dss_video1_clk" },
398 { .role = "hdmi_clk", .clk = "dss_hdmi_clk" },
399};
400
401static struct omap_hwmod dra7xx_dss_hwmod = {
402 .name = "dss_core",
403 .class = &dra7xx_dss_hwmod_class,
404 .clkdm_name = "dss_clkdm",
405 .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
406 .sdma_reqs = dra7xx_dss_sdma_reqs,
407 .main_clk = "dss_dss_clk",
408 .prcm = {
409 .omap4 = {
410 .clkctrl_offs = DRA7XX_CM_DSS_DSS_CLKCTRL_OFFSET,
411 .context_offs = DRA7XX_RM_DSS_DSS_CONTEXT_OFFSET,
412 .modulemode = MODULEMODE_SWCTRL,
413 },
414 },
415 .opt_clks = dss_opt_clks,
416 .opt_clks_cnt = ARRAY_SIZE(dss_opt_clks),
417};
418
419/*
420 * 'dispc' class
421 * display controller
422 */
423
424static struct omap_hwmod_class_sysconfig dra7xx_dispc_sysc = {
425 .rev_offs = 0x0000,
426 .sysc_offs = 0x0010,
427 .syss_offs = 0x0014,
428 .sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY |
429 SYSC_HAS_ENAWAKEUP | SYSC_HAS_MIDLEMODE |
430 SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
431 SYSS_HAS_RESET_STATUS),
432 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
433 MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
434 .sysc_fields = &omap_hwmod_sysc_type1,
435};
436
437static struct omap_hwmod_class dra7xx_dispc_hwmod_class = {
438 .name = "dispc",
439 .sysc = &dra7xx_dispc_sysc,
440};
441
442/* dss_dispc */
443/* dss_dispc dev_attr */
444static struct omap_dss_dispc_dev_attr dss_dispc_dev_attr = {
445 .has_framedonetv_irq = 1,
446 .manager_count = 4,
447};
448
449static struct omap_hwmod dra7xx_dss_dispc_hwmod = {
450 .name = "dss_dispc",
451 .class = &dra7xx_dispc_hwmod_class,
452 .clkdm_name = "dss_clkdm",
453 .main_clk = "dss_dss_clk",
454 .prcm = {
455 .omap4 = {
456 .clkctrl_offs = DRA7XX_CM_DSS_DSS_CLKCTRL_OFFSET,
457 .flags = HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT,
458 },
459 },
460 .dev_attr = &dss_dispc_dev_attr,
461};
462
463/*
464 * 'hdmi' class
465 * hdmi controller
466 */
467
468static struct omap_hwmod_class_sysconfig dra7xx_hdmi_sysc = {
469 .rev_offs = 0x0000,
470 .sysc_offs = 0x0010,
471 .sysc_flags = (SYSC_HAS_RESET_STATUS | SYSC_HAS_SIDLEMODE |
472 SYSC_HAS_SOFTRESET),
473 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
474 SIDLE_SMART_WKUP),
475 .sysc_fields = &omap_hwmod_sysc_type2,
476};
477
478static struct omap_hwmod_class dra7xx_hdmi_hwmod_class = {
479 .name = "hdmi",
480 .sysc = &dra7xx_hdmi_sysc,
481};
482
483/* dss_hdmi */
484
485static struct omap_hwmod_opt_clk dss_hdmi_opt_clks[] = {
486 { .role = "sys_clk", .clk = "dss_hdmi_clk" },
487};
488
489static struct omap_hwmod dra7xx_dss_hdmi_hwmod = {
490 .name = "dss_hdmi",
491 .class = &dra7xx_hdmi_hwmod_class,
492 .clkdm_name = "dss_clkdm",
493 .main_clk = "dss_48mhz_clk",
494 .prcm = {
495 .omap4 = {
496 .clkctrl_offs = DRA7XX_CM_DSS_DSS_CLKCTRL_OFFSET,
497 .flags = HWMOD_OMAP4_NO_CONTEXT_LOSS_BIT,
498 },
499 },
500 .opt_clks = dss_hdmi_opt_clks,
501 .opt_clks_cnt = ARRAY_SIZE(dss_hdmi_opt_clks),
502};
503
504/*
505 * 'elm' class
506 *
507 */
508
509static struct omap_hwmod_class_sysconfig dra7xx_elm_sysc = {
510 .rev_offs = 0x0000,
511 .sysc_offs = 0x0010,
512 .syss_offs = 0x0014,
513 .sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY |
514 SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
515 SYSS_HAS_RESET_STATUS),
516 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
517 SIDLE_SMART_WKUP),
518 .sysc_fields = &omap_hwmod_sysc_type1,
519};
520
521static struct omap_hwmod_class dra7xx_elm_hwmod_class = {
522 .name = "elm",
523 .sysc = &dra7xx_elm_sysc,
524};
525
526/* elm */
527
528static struct omap_hwmod dra7xx_elm_hwmod = {
529 .name = "elm",
530 .class = &dra7xx_elm_hwmod_class,
531 .clkdm_name = "l4per_clkdm",
532 .main_clk = "l3_iclk_div",
533 .prcm = {
534 .omap4 = {
535 .clkctrl_offs = DRA7XX_CM_L4PER_ELM_CLKCTRL_OFFSET,
536 .context_offs = DRA7XX_RM_L4PER_ELM_CONTEXT_OFFSET,
537 },
538 },
539};
540
541/*
542 * 'gpio' class
543 *
544 */
545
546static struct omap_hwmod_class_sysconfig dra7xx_gpio_sysc = {
547 .rev_offs = 0x0000,
548 .sysc_offs = 0x0010,
549 .syss_offs = 0x0114,
550 .sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_ENAWAKEUP |
551 SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
552 SYSS_HAS_RESET_STATUS),
553 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
554 SIDLE_SMART_WKUP),
555 .sysc_fields = &omap_hwmod_sysc_type1,
556};
557
558static struct omap_hwmod_class dra7xx_gpio_hwmod_class = {
559 .name = "gpio",
560 .sysc = &dra7xx_gpio_sysc,
561 .rev = 2,
562};
563
564/* gpio dev_attr */
565static struct omap_gpio_dev_attr gpio_dev_attr = {
566 .bank_width = 32,
567 .dbck_flag = true,
568};
569
570/* gpio1 */
571static struct omap_hwmod_opt_clk gpio1_opt_clks[] = {
572 { .role = "dbclk", .clk = "gpio1_dbclk" },
573};
574
575static struct omap_hwmod dra7xx_gpio1_hwmod = {
576 .name = "gpio1",
577 .class = &dra7xx_gpio_hwmod_class,
578 .clkdm_name = "wkupaon_clkdm",
579 .main_clk = "wkupaon_iclk_mux",
580 .prcm = {
581 .omap4 = {
582 .clkctrl_offs = DRA7XX_CM_WKUPAON_GPIO1_CLKCTRL_OFFSET,
583 .context_offs = DRA7XX_RM_WKUPAON_GPIO1_CONTEXT_OFFSET,
584 .modulemode = MODULEMODE_HWCTRL,
585 },
586 },
587 .opt_clks = gpio1_opt_clks,
588 .opt_clks_cnt = ARRAY_SIZE(gpio1_opt_clks),
589 .dev_attr = &gpio_dev_attr,
590};
591
592/* gpio2 */
593static struct omap_hwmod_opt_clk gpio2_opt_clks[] = {
594 { .role = "dbclk", .clk = "gpio2_dbclk" },
595};
596
597static struct omap_hwmod dra7xx_gpio2_hwmod = {
598 .name = "gpio2",
599 .class = &dra7xx_gpio_hwmod_class,
600 .clkdm_name = "l4per_clkdm",
601 .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
602 .main_clk = "l3_iclk_div",
603 .prcm = {
604 .omap4 = {
605 .clkctrl_offs = DRA7XX_CM_L4PER_GPIO2_CLKCTRL_OFFSET,
606 .context_offs = DRA7XX_RM_L4PER_GPIO2_CONTEXT_OFFSET,
607 .modulemode = MODULEMODE_HWCTRL,
608 },
609 },
610 .opt_clks = gpio2_opt_clks,
611 .opt_clks_cnt = ARRAY_SIZE(gpio2_opt_clks),
612 .dev_attr = &gpio_dev_attr,
613};
614
615/* gpio3 */
616static struct omap_hwmod_opt_clk gpio3_opt_clks[] = {
617 { .role = "dbclk", .clk = "gpio3_dbclk" },
618};
619
620static struct omap_hwmod dra7xx_gpio3_hwmod = {
621 .name = "gpio3",
622 .class = &dra7xx_gpio_hwmod_class,
623 .clkdm_name = "l4per_clkdm",
624 .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
625 .main_clk = "l3_iclk_div",
626 .prcm = {
627 .omap4 = {
628 .clkctrl_offs = DRA7XX_CM_L4PER_GPIO3_CLKCTRL_OFFSET,
629 .context_offs = DRA7XX_RM_L4PER_GPIO3_CONTEXT_OFFSET,
630 .modulemode = MODULEMODE_HWCTRL,
631 },
632 },
633 .opt_clks = gpio3_opt_clks,
634 .opt_clks_cnt = ARRAY_SIZE(gpio3_opt_clks),
635 .dev_attr = &gpio_dev_attr,
636};
637
638/* gpio4 */
639static struct omap_hwmod_opt_clk gpio4_opt_clks[] = {
640 { .role = "dbclk", .clk = "gpio4_dbclk" },
641};
642
643static struct omap_hwmod dra7xx_gpio4_hwmod = {
644 .name = "gpio4",
645 .class = &dra7xx_gpio_hwmod_class,
646 .clkdm_name = "l4per_clkdm",
647 .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
648 .main_clk = "l3_iclk_div",
649 .prcm = {
650 .omap4 = {
651 .clkctrl_offs = DRA7XX_CM_L4PER_GPIO4_CLKCTRL_OFFSET,
652 .context_offs = DRA7XX_RM_L4PER_GPIO4_CONTEXT_OFFSET,
653 .modulemode = MODULEMODE_HWCTRL,
654 },
655 },
656 .opt_clks = gpio4_opt_clks,
657 .opt_clks_cnt = ARRAY_SIZE(gpio4_opt_clks),
658 .dev_attr = &gpio_dev_attr,
659};
660
661/* gpio5 */
662static struct omap_hwmod_opt_clk gpio5_opt_clks[] = {
663 { .role = "dbclk", .clk = "gpio5_dbclk" },
664};
665
666static struct omap_hwmod dra7xx_gpio5_hwmod = {
667 .name = "gpio5",
668 .class = &dra7xx_gpio_hwmod_class,
669 .clkdm_name = "l4per_clkdm",
670 .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
671 .main_clk = "l3_iclk_div",
672 .prcm = {
673 .omap4 = {
674 .clkctrl_offs = DRA7XX_CM_L4PER_GPIO5_CLKCTRL_OFFSET,
675 .context_offs = DRA7XX_RM_L4PER_GPIO5_CONTEXT_OFFSET,
676 .modulemode = MODULEMODE_HWCTRL,
677 },
678 },
679 .opt_clks = gpio5_opt_clks,
680 .opt_clks_cnt = ARRAY_SIZE(gpio5_opt_clks),
681 .dev_attr = &gpio_dev_attr,
682};
683
684/* gpio6 */
685static struct omap_hwmod_opt_clk gpio6_opt_clks[] = {
686 { .role = "dbclk", .clk = "gpio6_dbclk" },
687};
688
689static struct omap_hwmod dra7xx_gpio6_hwmod = {
690 .name = "gpio6",
691 .class = &dra7xx_gpio_hwmod_class,
692 .clkdm_name = "l4per_clkdm",
693 .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
694 .main_clk = "l3_iclk_div",
695 .prcm = {
696 .omap4 = {
697 .clkctrl_offs = DRA7XX_CM_L4PER_GPIO6_CLKCTRL_OFFSET,
698 .context_offs = DRA7XX_RM_L4PER_GPIO6_CONTEXT_OFFSET,
699 .modulemode = MODULEMODE_HWCTRL,
700 },
701 },
702 .opt_clks = gpio6_opt_clks,
703 .opt_clks_cnt = ARRAY_SIZE(gpio6_opt_clks),
704 .dev_attr = &gpio_dev_attr,
705};
706
707/* gpio7 */
708static struct omap_hwmod_opt_clk gpio7_opt_clks[] = {
709 { .role = "dbclk", .clk = "gpio7_dbclk" },
710};
711
712static struct omap_hwmod dra7xx_gpio7_hwmod = {
713 .name = "gpio7",
714 .class = &dra7xx_gpio_hwmod_class,
715 .clkdm_name = "l4per_clkdm",
716 .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
717 .main_clk = "l3_iclk_div",
718 .prcm = {
719 .omap4 = {
720 .clkctrl_offs = DRA7XX_CM_L4PER_GPIO7_CLKCTRL_OFFSET,
721 .context_offs = DRA7XX_RM_L4PER_GPIO7_CONTEXT_OFFSET,
722 .modulemode = MODULEMODE_HWCTRL,
723 },
724 },
725 .opt_clks = gpio7_opt_clks,
726 .opt_clks_cnt = ARRAY_SIZE(gpio7_opt_clks),
727 .dev_attr = &gpio_dev_attr,
728};
729
730/* gpio8 */
731static struct omap_hwmod_opt_clk gpio8_opt_clks[] = {
732 { .role = "dbclk", .clk = "gpio8_dbclk" },
733};
734
735static struct omap_hwmod dra7xx_gpio8_hwmod = {
736 .name = "gpio8",
737 .class = &dra7xx_gpio_hwmod_class,
738 .clkdm_name = "l4per_clkdm",
739 .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
740 .main_clk = "l3_iclk_div",
741 .prcm = {
742 .omap4 = {
743 .clkctrl_offs = DRA7XX_CM_L4PER_GPIO8_CLKCTRL_OFFSET,
744 .context_offs = DRA7XX_RM_L4PER_GPIO8_CONTEXT_OFFSET,
745 .modulemode = MODULEMODE_HWCTRL,
746 },
747 },
748 .opt_clks = gpio8_opt_clks,
749 .opt_clks_cnt = ARRAY_SIZE(gpio8_opt_clks),
750 .dev_attr = &gpio_dev_attr,
751};
752
753/*
754 * 'gpmc' class
755 *
756 */
757
758static struct omap_hwmod_class_sysconfig dra7xx_gpmc_sysc = {
759 .rev_offs = 0x0000,
760 .sysc_offs = 0x0010,
761 .syss_offs = 0x0014,
762 .sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_SIDLEMODE |
763 SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
764 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
765 SIDLE_SMART_WKUP),
766 .sysc_fields = &omap_hwmod_sysc_type1,
767};
768
769static struct omap_hwmod_class dra7xx_gpmc_hwmod_class = {
770 .name = "gpmc",
771 .sysc = &dra7xx_gpmc_sysc,
772};
773
774/* gpmc */
775
776static struct omap_hwmod dra7xx_gpmc_hwmod = {
777 .name = "gpmc",
778 .class = &dra7xx_gpmc_hwmod_class,
779 .clkdm_name = "l3main1_clkdm",
780 .flags = HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET,
781 .main_clk = "l3_iclk_div",
782 .prcm = {
783 .omap4 = {
784 .clkctrl_offs = DRA7XX_CM_L3MAIN1_GPMC_CLKCTRL_OFFSET,
785 .context_offs = DRA7XX_RM_L3MAIN1_GPMC_CONTEXT_OFFSET,
786 .modulemode = MODULEMODE_HWCTRL,
787 },
788 },
789};
790
791/*
792 * 'hdq1w' class
793 *
794 */
795
796static struct omap_hwmod_class_sysconfig dra7xx_hdq1w_sysc = {
797 .rev_offs = 0x0000,
798 .sysc_offs = 0x0014,
799 .syss_offs = 0x0018,
800 .sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_SOFTRESET |
801 SYSS_HAS_RESET_STATUS),
802 .sysc_fields = &omap_hwmod_sysc_type1,
803};
804
805static struct omap_hwmod_class dra7xx_hdq1w_hwmod_class = {
806 .name = "hdq1w",
807 .sysc = &dra7xx_hdq1w_sysc,
808};
809
810/* hdq1w */
811
812static struct omap_hwmod dra7xx_hdq1w_hwmod = {
813 .name = "hdq1w",
814 .class = &dra7xx_hdq1w_hwmod_class,
815 .clkdm_name = "l4per_clkdm",
816 .flags = HWMOD_INIT_NO_RESET,
817 .main_clk = "func_12m_fclk",
818 .prcm = {
819 .omap4 = {
820 .clkctrl_offs = DRA7XX_CM_L4PER_HDQ1W_CLKCTRL_OFFSET,
821 .context_offs = DRA7XX_RM_L4PER_HDQ1W_CONTEXT_OFFSET,
822 .modulemode = MODULEMODE_SWCTRL,
823 },
824 },
825};
826
827/*
828 * 'i2c' class
829 *
830 */
831
832static struct omap_hwmod_class_sysconfig dra7xx_i2c_sysc = {
833 .sysc_offs = 0x0010,
834 .syss_offs = 0x0090,
835 .sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY |
836 SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE |
837 SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
838 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
839 SIDLE_SMART_WKUP),
840 .clockact = CLOCKACT_TEST_ICLK,
841 .sysc_fields = &omap_hwmod_sysc_type1,
842};
843
844static struct omap_hwmod_class dra7xx_i2c_hwmod_class = {
845 .name = "i2c",
846 .sysc = &dra7xx_i2c_sysc,
847 .reset = &omap_i2c_reset,
848 .rev = OMAP_I2C_IP_VERSION_2,
849};
850
851/* i2c dev_attr */
852static struct omap_i2c_dev_attr i2c_dev_attr = {
853 .flags = OMAP_I2C_FLAG_BUS_SHIFT_NONE,
854};
855
856/* i2c1 */
857static struct omap_hwmod dra7xx_i2c1_hwmod = {
858 .name = "i2c1",
859 .class = &dra7xx_i2c_hwmod_class,
860 .clkdm_name = "l4per_clkdm",
861 .flags = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
862 .main_clk = "func_96m_fclk",
863 .prcm = {
864 .omap4 = {
865 .clkctrl_offs = DRA7XX_CM_L4PER_I2C1_CLKCTRL_OFFSET,
866 .context_offs = DRA7XX_RM_L4PER_I2C1_CONTEXT_OFFSET,
867 .modulemode = MODULEMODE_SWCTRL,
868 },
869 },
870 .dev_attr = &i2c_dev_attr,
871};
872
873/* i2c2 */
874static struct omap_hwmod dra7xx_i2c2_hwmod = {
875 .name = "i2c2",
876 .class = &dra7xx_i2c_hwmod_class,
877 .clkdm_name = "l4per_clkdm",
878 .flags = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
879 .main_clk = "func_96m_fclk",
880 .prcm = {
881 .omap4 = {
882 .clkctrl_offs = DRA7XX_CM_L4PER_I2C2_CLKCTRL_OFFSET,
883 .context_offs = DRA7XX_RM_L4PER_I2C2_CONTEXT_OFFSET,
884 .modulemode = MODULEMODE_SWCTRL,
885 },
886 },
887 .dev_attr = &i2c_dev_attr,
888};
889
890/* i2c3 */
891static struct omap_hwmod dra7xx_i2c3_hwmod = {
892 .name = "i2c3",
893 .class = &dra7xx_i2c_hwmod_class,
894 .clkdm_name = "l4per_clkdm",
895 .flags = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
896 .main_clk = "func_96m_fclk",
897 .prcm = {
898 .omap4 = {
899 .clkctrl_offs = DRA7XX_CM_L4PER_I2C3_CLKCTRL_OFFSET,
900 .context_offs = DRA7XX_RM_L4PER_I2C3_CONTEXT_OFFSET,
901 .modulemode = MODULEMODE_SWCTRL,
902 },
903 },
904 .dev_attr = &i2c_dev_attr,
905};
906
907/* i2c4 */
908static struct omap_hwmod dra7xx_i2c4_hwmod = {
909 .name = "i2c4",
910 .class = &dra7xx_i2c_hwmod_class,
911 .clkdm_name = "l4per_clkdm",
912 .flags = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
913 .main_clk = "func_96m_fclk",
914 .prcm = {
915 .omap4 = {
916 .clkctrl_offs = DRA7XX_CM_L4PER_I2C4_CLKCTRL_OFFSET,
917 .context_offs = DRA7XX_RM_L4PER_I2C4_CONTEXT_OFFSET,
918 .modulemode = MODULEMODE_SWCTRL,
919 },
920 },
921 .dev_attr = &i2c_dev_attr,
922};
923
924/* i2c5 */
925static struct omap_hwmod dra7xx_i2c5_hwmod = {
926 .name = "i2c5",
927 .class = &dra7xx_i2c_hwmod_class,
928 .clkdm_name = "ipu_clkdm",
929 .flags = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
930 .main_clk = "func_96m_fclk",
931 .prcm = {
932 .omap4 = {
933 .clkctrl_offs = DRA7XX_CM_IPU_I2C5_CLKCTRL_OFFSET,
934 .context_offs = DRA7XX_RM_IPU_I2C5_CONTEXT_OFFSET,
935 .modulemode = MODULEMODE_SWCTRL,
936 },
937 },
938 .dev_attr = &i2c_dev_attr,
939};
940
941/*
942 * 'mcspi' class
943 *
944 */
945
946static struct omap_hwmod_class_sysconfig dra7xx_mcspi_sysc = {
947 .rev_offs = 0x0000,
948 .sysc_offs = 0x0010,
949 .sysc_flags = (SYSC_HAS_EMUFREE | SYSC_HAS_RESET_STATUS |
950 SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
951 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
952 SIDLE_SMART_WKUP),
953 .sysc_fields = &omap_hwmod_sysc_type2,
954};
955
956static struct omap_hwmod_class dra7xx_mcspi_hwmod_class = {
957 .name = "mcspi",
958 .sysc = &dra7xx_mcspi_sysc,
959 .rev = OMAP4_MCSPI_REV,
960};
961
962/* mcspi1 */
963/* mcspi1 dev_attr */
964static struct omap2_mcspi_dev_attr mcspi1_dev_attr = {
965 .num_chipselect = 4,
966};
967
968static struct omap_hwmod dra7xx_mcspi1_hwmod = {
969 .name = "mcspi1",
970 .class = &dra7xx_mcspi_hwmod_class,
971 .clkdm_name = "l4per_clkdm",
972 .main_clk = "func_48m_fclk",
973 .prcm = {
974 .omap4 = {
975 .clkctrl_offs = DRA7XX_CM_L4PER_MCSPI1_CLKCTRL_OFFSET,
976 .context_offs = DRA7XX_RM_L4PER_MCSPI1_CONTEXT_OFFSET,
977 .modulemode = MODULEMODE_SWCTRL,
978 },
979 },
980 .dev_attr = &mcspi1_dev_attr,
981};
982
983/* mcspi2 */
984/* mcspi2 dev_attr */
985static struct omap2_mcspi_dev_attr mcspi2_dev_attr = {
986 .num_chipselect = 2,
987};
988
989static struct omap_hwmod dra7xx_mcspi2_hwmod = {
990 .name = "mcspi2",
991 .class = &dra7xx_mcspi_hwmod_class,
992 .clkdm_name = "l4per_clkdm",
993 .main_clk = "func_48m_fclk",
994 .prcm = {
995 .omap4 = {
996 .clkctrl_offs = DRA7XX_CM_L4PER_MCSPI2_CLKCTRL_OFFSET,
997 .context_offs = DRA7XX_RM_L4PER_MCSPI2_CONTEXT_OFFSET,
998 .modulemode = MODULEMODE_SWCTRL,
999 },
1000 },
1001 .dev_attr = &mcspi2_dev_attr,
1002};
1003
1004/* mcspi3 */
1005/* mcspi3 dev_attr */
1006static struct omap2_mcspi_dev_attr mcspi3_dev_attr = {
1007 .num_chipselect = 2,
1008};
1009
1010static struct omap_hwmod dra7xx_mcspi3_hwmod = {
1011 .name = "mcspi3",
1012 .class = &dra7xx_mcspi_hwmod_class,
1013 .clkdm_name = "l4per_clkdm",
1014 .main_clk = "func_48m_fclk",
1015 .prcm = {
1016 .omap4 = {
1017 .clkctrl_offs = DRA7XX_CM_L4PER_MCSPI3_CLKCTRL_OFFSET,
1018 .context_offs = DRA7XX_RM_L4PER_MCSPI3_CONTEXT_OFFSET,
1019 .modulemode = MODULEMODE_SWCTRL,
1020 },
1021 },
1022 .dev_attr = &mcspi3_dev_attr,
1023};
1024
1025/* mcspi4 */
1026/* mcspi4 dev_attr */
1027static struct omap2_mcspi_dev_attr mcspi4_dev_attr = {
1028 .num_chipselect = 1,
1029};
1030
1031static struct omap_hwmod dra7xx_mcspi4_hwmod = {
1032 .name = "mcspi4",
1033 .class = &dra7xx_mcspi_hwmod_class,
1034 .clkdm_name = "l4per_clkdm",
1035 .main_clk = "func_48m_fclk",
1036 .prcm = {
1037 .omap4 = {
1038 .clkctrl_offs = DRA7XX_CM_L4PER_MCSPI4_CLKCTRL_OFFSET,
1039 .context_offs = DRA7XX_RM_L4PER_MCSPI4_CONTEXT_OFFSET,
1040 .modulemode = MODULEMODE_SWCTRL,
1041 },
1042 },
1043 .dev_attr = &mcspi4_dev_attr,
1044};
1045
1046/*
1047 * 'mmc' class
1048 *
1049 */
1050
1051static struct omap_hwmod_class_sysconfig dra7xx_mmc_sysc = {
1052 .rev_offs = 0x0000,
1053 .sysc_offs = 0x0010,
1054 .sysc_flags = (SYSC_HAS_EMUFREE | SYSC_HAS_MIDLEMODE |
1055 SYSC_HAS_RESET_STATUS | SYSC_HAS_SIDLEMODE |
1056 SYSC_HAS_SOFTRESET),
1057 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
1058 SIDLE_SMART_WKUP | MSTANDBY_FORCE | MSTANDBY_NO |
1059 MSTANDBY_SMART | MSTANDBY_SMART_WKUP),
1060 .sysc_fields = &omap_hwmod_sysc_type2,
1061};
1062
1063static struct omap_hwmod_class dra7xx_mmc_hwmod_class = {
1064 .name = "mmc",
1065 .sysc = &dra7xx_mmc_sysc,
1066};
1067
1068/* mmc1 */
1069static struct omap_hwmod_opt_clk mmc1_opt_clks[] = {
1070 { .role = "clk32k", .clk = "mmc1_clk32k" },
1071};
1072
1073/* mmc1 dev_attr */
1074static struct omap_mmc_dev_attr mmc1_dev_attr = {
1075 .flags = OMAP_HSMMC_SUPPORTS_DUAL_VOLT,
1076};
1077
1078static struct omap_hwmod dra7xx_mmc1_hwmod = {
1079 .name = "mmc1",
1080 .class = &dra7xx_mmc_hwmod_class,
1081 .clkdm_name = "l3init_clkdm",
1082 .main_clk = "mmc1_fclk_div",
1083 .prcm = {
1084 .omap4 = {
1085 .clkctrl_offs = DRA7XX_CM_L3INIT_MMC1_CLKCTRL_OFFSET,
1086 .context_offs = DRA7XX_RM_L3INIT_MMC1_CONTEXT_OFFSET,
1087 .modulemode = MODULEMODE_SWCTRL,
1088 },
1089 },
1090 .opt_clks = mmc1_opt_clks,
1091 .opt_clks_cnt = ARRAY_SIZE(mmc1_opt_clks),
1092 .dev_attr = &mmc1_dev_attr,
1093};
1094
1095/* mmc2 */
1096static struct omap_hwmod_opt_clk mmc2_opt_clks[] = {
1097 { .role = "clk32k", .clk = "mmc2_clk32k" },
1098};
1099
1100static struct omap_hwmod dra7xx_mmc2_hwmod = {
1101 .name = "mmc2",
1102 .class = &dra7xx_mmc_hwmod_class,
1103 .clkdm_name = "l3init_clkdm",
1104 .main_clk = "mmc2_fclk_div",
1105 .prcm = {
1106 .omap4 = {
1107 .clkctrl_offs = DRA7XX_CM_L3INIT_MMC2_CLKCTRL_OFFSET,
1108 .context_offs = DRA7XX_RM_L3INIT_MMC2_CONTEXT_OFFSET,
1109 .modulemode = MODULEMODE_SWCTRL,
1110 },
1111 },
1112 .opt_clks = mmc2_opt_clks,
1113 .opt_clks_cnt = ARRAY_SIZE(mmc2_opt_clks),
1114};
1115
1116/* mmc3 */
1117static struct omap_hwmod_opt_clk mmc3_opt_clks[] = {
1118 { .role = "clk32k", .clk = "mmc3_clk32k" },
1119};
1120
1121static struct omap_hwmod dra7xx_mmc3_hwmod = {
1122 .name = "mmc3",
1123 .class = &dra7xx_mmc_hwmod_class,
1124 .clkdm_name = "l4per_clkdm",
1125 .main_clk = "mmc3_gfclk_div",
1126 .prcm = {
1127 .omap4 = {
1128 .clkctrl_offs = DRA7XX_CM_L4PER_MMC3_CLKCTRL_OFFSET,
1129 .context_offs = DRA7XX_RM_L4PER_MMC3_CONTEXT_OFFSET,
1130 .modulemode = MODULEMODE_SWCTRL,
1131 },
1132 },
1133 .opt_clks = mmc3_opt_clks,
1134 .opt_clks_cnt = ARRAY_SIZE(mmc3_opt_clks),
1135};
1136
1137/* mmc4 */
1138static struct omap_hwmod_opt_clk mmc4_opt_clks[] = {
1139 { .role = "clk32k", .clk = "mmc4_clk32k" },
1140};
1141
1142static struct omap_hwmod dra7xx_mmc4_hwmod = {
1143 .name = "mmc4",
1144 .class = &dra7xx_mmc_hwmod_class,
1145 .clkdm_name = "l4per_clkdm",
1146 .main_clk = "mmc4_gfclk_div",
1147 .prcm = {
1148 .omap4 = {
1149 .clkctrl_offs = DRA7XX_CM_L4PER_MMC4_CLKCTRL_OFFSET,
1150 .context_offs = DRA7XX_RM_L4PER_MMC4_CONTEXT_OFFSET,
1151 .modulemode = MODULEMODE_SWCTRL,
1152 },
1153 },
1154 .opt_clks = mmc4_opt_clks,
1155 .opt_clks_cnt = ARRAY_SIZE(mmc4_opt_clks),
1156};
1157
1158/*
1159 * 'mpu' class
1160 *
1161 */
1162
1163static struct omap_hwmod_class dra7xx_mpu_hwmod_class = {
1164 .name = "mpu",
1165};
1166
1167/* mpu */
1168static struct omap_hwmod dra7xx_mpu_hwmod = {
1169 .name = "mpu",
1170 .class = &dra7xx_mpu_hwmod_class,
1171 .clkdm_name = "mpu_clkdm",
1172 .flags = HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET,
1173 .main_clk = "dpll_mpu_m2_ck",
1174 .prcm = {
1175 .omap4 = {
1176 .clkctrl_offs = DRA7XX_CM_MPU_MPU_CLKCTRL_OFFSET,
1177 .context_offs = DRA7XX_RM_MPU_MPU_CONTEXT_OFFSET,
1178 },
1179 },
1180};
1181
1182/*
1183 * 'ocp2scp' class
1184 *
1185 */
1186
1187static struct omap_hwmod_class_sysconfig dra7xx_ocp2scp_sysc = {
1188 .rev_offs = 0x0000,
1189 .sysc_offs = 0x0010,
1190 .syss_offs = 0x0014,
1191 .sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_SIDLEMODE |
1192 SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
1193 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
1194 SIDLE_SMART_WKUP),
1195 .sysc_fields = &omap_hwmod_sysc_type1,
1196};
1197
1198static struct omap_hwmod_class dra7xx_ocp2scp_hwmod_class = {
1199 .name = "ocp2scp",
1200 .sysc = &dra7xx_ocp2scp_sysc,
1201};
1202
1203/* ocp2scp1 */
1204static struct omap_hwmod dra7xx_ocp2scp1_hwmod = {
1205 .name = "ocp2scp1",
1206 .class = &dra7xx_ocp2scp_hwmod_class,
1207 .clkdm_name = "l3init_clkdm",
1208 .main_clk = "l4_root_clk_div",
1209 .prcm = {
1210 .omap4 = {
1211 .clkctrl_offs = DRA7XX_CM_L3INIT_OCP2SCP1_CLKCTRL_OFFSET,
1212 .context_offs = DRA7XX_RM_L3INIT_OCP2SCP1_CONTEXT_OFFSET,
1213 .modulemode = MODULEMODE_HWCTRL,
1214 },
1215 },
1216};
1217
1218/*
1219 * 'qspi' class
1220 *
1221 */
1222
1223static struct omap_hwmod_class_sysconfig dra7xx_qspi_sysc = {
1224 .sysc_offs = 0x0010,
1225 .sysc_flags = SYSC_HAS_SIDLEMODE,
1226 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
1227 SIDLE_SMART_WKUP),
1228 .sysc_fields = &omap_hwmod_sysc_type2,
1229};
1230
1231static struct omap_hwmod_class dra7xx_qspi_hwmod_class = {
1232 .name = "qspi",
1233 .sysc = &dra7xx_qspi_sysc,
1234};
1235
1236/* qspi */
1237static struct omap_hwmod dra7xx_qspi_hwmod = {
1238 .name = "qspi",
1239 .class = &dra7xx_qspi_hwmod_class,
1240 .clkdm_name = "l4per2_clkdm",
1241 .main_clk = "qspi_gfclk_div",
1242 .prcm = {
1243 .omap4 = {
1244 .clkctrl_offs = DRA7XX_CM_L4PER2_QSPI_CLKCTRL_OFFSET,
1245 .context_offs = DRA7XX_RM_L4PER2_QSPI_CONTEXT_OFFSET,
1246 .modulemode = MODULEMODE_SWCTRL,
1247 },
1248 },
1249};
1250
1251/*
1252 * 'sata' class
1253 *
1254 */
1255
1256static struct omap_hwmod_class_sysconfig dra7xx_sata_sysc = {
1257 .sysc_offs = 0x0000,
1258 .sysc_flags = (SYSC_HAS_MIDLEMODE | SYSC_HAS_SIDLEMODE),
1259 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
1260 SIDLE_SMART_WKUP | MSTANDBY_FORCE | MSTANDBY_NO |
1261 MSTANDBY_SMART | MSTANDBY_SMART_WKUP),
1262 .sysc_fields = &omap_hwmod_sysc_type2,
1263};
1264
1265static struct omap_hwmod_class dra7xx_sata_hwmod_class = {
1266 .name = "sata",
1267 .sysc = &dra7xx_sata_sysc,
1268};
1269
1270/* sata */
1271static struct omap_hwmod_opt_clk sata_opt_clks[] = {
1272 { .role = "ref_clk", .clk = "sata_ref_clk" },
1273};
1274
1275static struct omap_hwmod dra7xx_sata_hwmod = {
1276 .name = "sata",
1277 .class = &dra7xx_sata_hwmod_class,
1278 .clkdm_name = "l3init_clkdm",
1279 .flags = HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY,
1280 .main_clk = "func_48m_fclk",
1281 .prcm = {
1282 .omap4 = {
1283 .clkctrl_offs = DRA7XX_CM_L3INIT_SATA_CLKCTRL_OFFSET,
1284 .context_offs = DRA7XX_RM_L3INIT_SATA_CONTEXT_OFFSET,
1285 .modulemode = MODULEMODE_SWCTRL,
1286 },
1287 },
1288 .opt_clks = sata_opt_clks,
1289 .opt_clks_cnt = ARRAY_SIZE(sata_opt_clks),
1290};
1291
1292/*
1293 * 'smartreflex' class
1294 *
1295 */
1296
1297/* The IP is not compliant to type1 / type2 scheme */
1298static struct omap_hwmod_sysc_fields omap_hwmod_sysc_type_smartreflex = {
1299 .sidle_shift = 24,
1300 .enwkup_shift = 26,
1301};
1302
1303static struct omap_hwmod_class_sysconfig dra7xx_smartreflex_sysc = {
1304 .sysc_offs = 0x0038,
1305 .sysc_flags = (SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE),
1306 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
1307 SIDLE_SMART_WKUP),
1308 .sysc_fields = &omap_hwmod_sysc_type_smartreflex,
1309};
1310
1311static struct omap_hwmod_class dra7xx_smartreflex_hwmod_class = {
1312 .name = "smartreflex",
1313 .sysc = &dra7xx_smartreflex_sysc,
1314 .rev = 2,
1315};
1316
1317/* smartreflex_core */
1318/* smartreflex_core dev_attr */
1319static struct omap_smartreflex_dev_attr smartreflex_core_dev_attr = {
1320 .sensor_voltdm_name = "core",
1321};
1322
1323static struct omap_hwmod dra7xx_smartreflex_core_hwmod = {
1324 .name = "smartreflex_core",
1325 .class = &dra7xx_smartreflex_hwmod_class,
1326 .clkdm_name = "coreaon_clkdm",
1327 .main_clk = "wkupaon_iclk_mux",
1328 .prcm = {
1329 .omap4 = {
1330 .clkctrl_offs = DRA7XX_CM_COREAON_SMARTREFLEX_CORE_CLKCTRL_OFFSET,
1331 .context_offs = DRA7XX_RM_COREAON_SMARTREFLEX_CORE_CONTEXT_OFFSET,
1332 .modulemode = MODULEMODE_SWCTRL,
1333 },
1334 },
1335 .dev_attr = &smartreflex_core_dev_attr,
1336};
1337
1338/* smartreflex_mpu */
1339/* smartreflex_mpu dev_attr */
1340static struct omap_smartreflex_dev_attr smartreflex_mpu_dev_attr = {
1341 .sensor_voltdm_name = "mpu",
1342};
1343
1344static struct omap_hwmod dra7xx_smartreflex_mpu_hwmod = {
1345 .name = "smartreflex_mpu",
1346 .class = &dra7xx_smartreflex_hwmod_class,
1347 .clkdm_name = "coreaon_clkdm",
1348 .main_clk = "wkupaon_iclk_mux",
1349 .prcm = {
1350 .omap4 = {
1351 .clkctrl_offs = DRA7XX_CM_COREAON_SMARTREFLEX_MPU_CLKCTRL_OFFSET,
1352 .context_offs = DRA7XX_RM_COREAON_SMARTREFLEX_MPU_CONTEXT_OFFSET,
1353 .modulemode = MODULEMODE_SWCTRL,
1354 },
1355 },
1356 .dev_attr = &smartreflex_mpu_dev_attr,
1357};
1358
1359/*
1360 * 'spinlock' class
1361 *
1362 */
1363
1364static struct omap_hwmod_class_sysconfig dra7xx_spinlock_sysc = {
1365 .rev_offs = 0x0000,
1366 .sysc_offs = 0x0010,
1367 .syss_offs = 0x0014,
1368 .sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY |
1369 SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE |
1370 SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
1371 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
1372 SIDLE_SMART_WKUP),
1373 .sysc_fields = &omap_hwmod_sysc_type1,
1374};
1375
1376static struct omap_hwmod_class dra7xx_spinlock_hwmod_class = {
1377 .name = "spinlock",
1378 .sysc = &dra7xx_spinlock_sysc,
1379};
1380
1381/* spinlock */
1382static struct omap_hwmod dra7xx_spinlock_hwmod = {
1383 .name = "spinlock",
1384 .class = &dra7xx_spinlock_hwmod_class,
1385 .clkdm_name = "l4cfg_clkdm",
1386 .main_clk = "l3_iclk_div",
1387 .prcm = {
1388 .omap4 = {
1389 .clkctrl_offs = DRA7XX_CM_L4CFG_SPINLOCK_CLKCTRL_OFFSET,
1390 .context_offs = DRA7XX_RM_L4CFG_SPINLOCK_CONTEXT_OFFSET,
1391 },
1392 },
1393};
1394
1395/*
1396 * 'timer' class
1397 *
1398 * This class contains several variants: ['timer_1ms', 'timer_secure',
1399 * 'timer']
1400 */
1401
1402static struct omap_hwmod_class_sysconfig dra7xx_timer_1ms_sysc = {
1403 .rev_offs = 0x0000,
1404 .sysc_offs = 0x0010,
1405 .sysc_flags = (SYSC_HAS_EMUFREE | SYSC_HAS_RESET_STATUS |
1406 SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
1407 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
1408 SIDLE_SMART_WKUP),
1409 .sysc_fields = &omap_hwmod_sysc_type2,
1410};
1411
1412static struct omap_hwmod_class dra7xx_timer_1ms_hwmod_class = {
1413 .name = "timer",
1414 .sysc = &dra7xx_timer_1ms_sysc,
1415};
1416
1417static struct omap_hwmod_class_sysconfig dra7xx_timer_secure_sysc = {
1418 .rev_offs = 0x0000,
1419 .sysc_offs = 0x0010,
1420 .sysc_flags = (SYSC_HAS_EMUFREE | SYSC_HAS_RESET_STATUS |
1421 SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
1422 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
1423 SIDLE_SMART_WKUP),
1424 .sysc_fields = &omap_hwmod_sysc_type2,
1425};
1426
1427static struct omap_hwmod_class dra7xx_timer_secure_hwmod_class = {
1428 .name = "timer",
1429 .sysc = &dra7xx_timer_secure_sysc,
1430};
1431
1432static struct omap_hwmod_class_sysconfig dra7xx_timer_sysc = {
1433 .rev_offs = 0x0000,
1434 .sysc_offs = 0x0010,
1435 .sysc_flags = (SYSC_HAS_EMUFREE | SYSC_HAS_RESET_STATUS |
1436 SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
1437 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
1438 SIDLE_SMART_WKUP),
1439 .sysc_fields = &omap_hwmod_sysc_type2,
1440};
1441
1442static struct omap_hwmod_class dra7xx_timer_hwmod_class = {
1443 .name = "timer",
1444 .sysc = &dra7xx_timer_sysc,
1445};
1446
1447/* timer1 */
1448static struct omap_hwmod dra7xx_timer1_hwmod = {
1449 .name = "timer1",
1450 .class = &dra7xx_timer_1ms_hwmod_class,
1451 .clkdm_name = "wkupaon_clkdm",
1452 .main_clk = "timer1_gfclk_mux",
1453 .prcm = {
1454 .omap4 = {
1455 .clkctrl_offs = DRA7XX_CM_WKUPAON_TIMER1_CLKCTRL_OFFSET,
1456 .context_offs = DRA7XX_RM_WKUPAON_TIMER1_CONTEXT_OFFSET,
1457 .modulemode = MODULEMODE_SWCTRL,
1458 },
1459 },
1460};
1461
1462/* timer2 */
1463static struct omap_hwmod dra7xx_timer2_hwmod = {
1464 .name = "timer2",
1465 .class = &dra7xx_timer_1ms_hwmod_class,
1466 .clkdm_name = "l4per_clkdm",
1467 .main_clk = "timer2_gfclk_mux",
1468 .prcm = {
1469 .omap4 = {
1470 .clkctrl_offs = DRA7XX_CM_L4PER_TIMER2_CLKCTRL_OFFSET,
1471 .context_offs = DRA7XX_RM_L4PER_TIMER2_CONTEXT_OFFSET,
1472 .modulemode = MODULEMODE_SWCTRL,
1473 },
1474 },
1475};
1476
1477/* timer3 */
1478static struct omap_hwmod dra7xx_timer3_hwmod = {
1479 .name = "timer3",
1480 .class = &dra7xx_timer_hwmod_class,
1481 .clkdm_name = "l4per_clkdm",
1482 .main_clk = "timer3_gfclk_mux",
1483 .prcm = {
1484 .omap4 = {
1485 .clkctrl_offs = DRA7XX_CM_L4PER_TIMER3_CLKCTRL_OFFSET,
1486 .context_offs = DRA7XX_RM_L4PER_TIMER3_CONTEXT_OFFSET,
1487 .modulemode = MODULEMODE_SWCTRL,
1488 },
1489 },
1490};
1491
1492/* timer4 */
1493static struct omap_hwmod dra7xx_timer4_hwmod = {
1494 .name = "timer4",
1495 .class = &dra7xx_timer_secure_hwmod_class,
1496 .clkdm_name = "l4per_clkdm",
1497 .main_clk = "timer4_gfclk_mux",
1498 .prcm = {
1499 .omap4 = {
1500 .clkctrl_offs = DRA7XX_CM_L4PER_TIMER4_CLKCTRL_OFFSET,
1501 .context_offs = DRA7XX_RM_L4PER_TIMER4_CONTEXT_OFFSET,
1502 .modulemode = MODULEMODE_SWCTRL,
1503 },
1504 },
1505};
1506
1507/* timer5 */
1508static struct omap_hwmod dra7xx_timer5_hwmod = {
1509 .name = "timer5",
1510 .class = &dra7xx_timer_hwmod_class,
1511 .clkdm_name = "ipu_clkdm",
1512 .main_clk = "timer5_gfclk_mux",
1513 .prcm = {
1514 .omap4 = {
1515 .clkctrl_offs = DRA7XX_CM_IPU_TIMER5_CLKCTRL_OFFSET,
1516 .context_offs = DRA7XX_RM_IPU_TIMER5_CONTEXT_OFFSET,
1517 .modulemode = MODULEMODE_SWCTRL,
1518 },
1519 },
1520};
1521
1522/* timer6 */
1523static struct omap_hwmod dra7xx_timer6_hwmod = {
1524 .name = "timer6",
1525 .class = &dra7xx_timer_hwmod_class,
1526 .clkdm_name = "ipu_clkdm",
1527 .main_clk = "timer6_gfclk_mux",
1528 .prcm = {
1529 .omap4 = {
1530 .clkctrl_offs = DRA7XX_CM_IPU_TIMER6_CLKCTRL_OFFSET,
1531 .context_offs = DRA7XX_RM_IPU_TIMER6_CONTEXT_OFFSET,
1532 .modulemode = MODULEMODE_SWCTRL,
1533 },
1534 },
1535};
1536
1537/* timer7 */
1538static struct omap_hwmod dra7xx_timer7_hwmod = {
1539 .name = "timer7",
1540 .class = &dra7xx_timer_hwmod_class,
1541 .clkdm_name = "ipu_clkdm",
1542 .main_clk = "timer7_gfclk_mux",
1543 .prcm = {
1544 .omap4 = {
1545 .clkctrl_offs = DRA7XX_CM_IPU_TIMER7_CLKCTRL_OFFSET,
1546 .context_offs = DRA7XX_RM_IPU_TIMER7_CONTEXT_OFFSET,
1547 .modulemode = MODULEMODE_SWCTRL,
1548 },
1549 },
1550};
1551
1552/* timer8 */
1553static struct omap_hwmod dra7xx_timer8_hwmod = {
1554 .name = "timer8",
1555 .class = &dra7xx_timer_hwmod_class,
1556 .clkdm_name = "ipu_clkdm",
1557 .main_clk = "timer8_gfclk_mux",
1558 .prcm = {
1559 .omap4 = {
1560 .clkctrl_offs = DRA7XX_CM_IPU_TIMER8_CLKCTRL_OFFSET,
1561 .context_offs = DRA7XX_RM_IPU_TIMER8_CONTEXT_OFFSET,
1562 .modulemode = MODULEMODE_SWCTRL,
1563 },
1564 },
1565};
1566
1567/* timer9 */
1568static struct omap_hwmod dra7xx_timer9_hwmod = {
1569 .name = "timer9",
1570 .class = &dra7xx_timer_hwmod_class,
1571 .clkdm_name = "l4per_clkdm",
1572 .main_clk = "timer9_gfclk_mux",
1573 .prcm = {
1574 .omap4 = {
1575 .clkctrl_offs = DRA7XX_CM_L4PER_TIMER9_CLKCTRL_OFFSET,
1576 .context_offs = DRA7XX_RM_L4PER_TIMER9_CONTEXT_OFFSET,
1577 .modulemode = MODULEMODE_SWCTRL,
1578 },
1579 },
1580};
1581
1582/* timer10 */
1583static struct omap_hwmod dra7xx_timer10_hwmod = {
1584 .name = "timer10",
1585 .class = &dra7xx_timer_1ms_hwmod_class,
1586 .clkdm_name = "l4per_clkdm",
1587 .main_clk = "timer10_gfclk_mux",
1588 .prcm = {
1589 .omap4 = {
1590 .clkctrl_offs = DRA7XX_CM_L4PER_TIMER10_CLKCTRL_OFFSET,
1591 .context_offs = DRA7XX_RM_L4PER_TIMER10_CONTEXT_OFFSET,
1592 .modulemode = MODULEMODE_SWCTRL,
1593 },
1594 },
1595};
1596
1597/* timer11 */
1598static struct omap_hwmod dra7xx_timer11_hwmod = {
1599 .name = "timer11",
1600 .class = &dra7xx_timer_hwmod_class,
1601 .clkdm_name = "l4per_clkdm",
1602 .main_clk = "timer11_gfclk_mux",
1603 .prcm = {
1604 .omap4 = {
1605 .clkctrl_offs = DRA7XX_CM_L4PER_TIMER11_CLKCTRL_OFFSET,
1606 .context_offs = DRA7XX_RM_L4PER_TIMER11_CONTEXT_OFFSET,
1607 .modulemode = MODULEMODE_SWCTRL,
1608 },
1609 },
1610};
1611
1612/*
1613 * 'uart' class
1614 *
1615 */
1616
1617static struct omap_hwmod_class_sysconfig dra7xx_uart_sysc = {
1618 .rev_offs = 0x0050,
1619 .sysc_offs = 0x0054,
1620 .syss_offs = 0x0058,
1621 .sysc_flags = (SYSC_HAS_AUTOIDLE | SYSC_HAS_ENAWAKEUP |
1622 SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
1623 SYSS_HAS_RESET_STATUS),
1624 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
1625 SIDLE_SMART_WKUP),
1626 .sysc_fields = &omap_hwmod_sysc_type1,
1627};
1628
1629static struct omap_hwmod_class dra7xx_uart_hwmod_class = {
1630 .name = "uart",
1631 .sysc = &dra7xx_uart_sysc,
1632};
1633
1634/* uart1 */
1635static struct omap_hwmod dra7xx_uart1_hwmod = {
1636 .name = "uart1",
1637 .class = &dra7xx_uart_hwmod_class,
1638 .clkdm_name = "l4per_clkdm",
1639 .main_clk = "uart1_gfclk_mux",
1640 .flags = HWMOD_SWSUP_SIDLE_ACT,
1641 .prcm = {
1642 .omap4 = {
1643 .clkctrl_offs = DRA7XX_CM_L4PER_UART1_CLKCTRL_OFFSET,
1644 .context_offs = DRA7XX_RM_L4PER_UART1_CONTEXT_OFFSET,
1645 .modulemode = MODULEMODE_SWCTRL,
1646 },
1647 },
1648};
1649
1650/* uart2 */
1651static struct omap_hwmod dra7xx_uart2_hwmod = {
1652 .name = "uart2",
1653 .class = &dra7xx_uart_hwmod_class,
1654 .clkdm_name = "l4per_clkdm",
1655 .main_clk = "uart2_gfclk_mux",
1656 .flags = HWMOD_SWSUP_SIDLE_ACT,
1657 .prcm = {
1658 .omap4 = {
1659 .clkctrl_offs = DRA7XX_CM_L4PER_UART2_CLKCTRL_OFFSET,
1660 .context_offs = DRA7XX_RM_L4PER_UART2_CONTEXT_OFFSET,
1661 .modulemode = MODULEMODE_SWCTRL,
1662 },
1663 },
1664};
1665
1666/* uart3 */
1667static struct omap_hwmod dra7xx_uart3_hwmod = {
1668 .name = "uart3",
1669 .class = &dra7xx_uart_hwmod_class,
1670 .clkdm_name = "l4per_clkdm",
1671 .main_clk = "uart3_gfclk_mux",
1672 .flags = HWMOD_SWSUP_SIDLE_ACT,
1673 .prcm = {
1674 .omap4 = {
1675 .clkctrl_offs = DRA7XX_CM_L4PER_UART3_CLKCTRL_OFFSET,
1676 .context_offs = DRA7XX_RM_L4PER_UART3_CONTEXT_OFFSET,
1677 .modulemode = MODULEMODE_SWCTRL,
1678 },
1679 },
1680};
1681
1682/* uart4 */
1683static struct omap_hwmod dra7xx_uart4_hwmod = {
1684 .name = "uart4",
1685 .class = &dra7xx_uart_hwmod_class,
1686 .clkdm_name = "l4per_clkdm",
1687 .main_clk = "uart4_gfclk_mux",
1688 .flags = HWMOD_SWSUP_SIDLE_ACT,
1689 .prcm = {
1690 .omap4 = {
1691 .clkctrl_offs = DRA7XX_CM_L4PER_UART4_CLKCTRL_OFFSET,
1692 .context_offs = DRA7XX_RM_L4PER_UART4_CONTEXT_OFFSET,
1693 .modulemode = MODULEMODE_SWCTRL,
1694 },
1695 },
1696};
1697
1698/* uart5 */
1699static struct omap_hwmod dra7xx_uart5_hwmod = {
1700 .name = "uart5",
1701 .class = &dra7xx_uart_hwmod_class,
1702 .clkdm_name = "l4per_clkdm",
1703 .main_clk = "uart5_gfclk_mux",
1704 .flags = HWMOD_SWSUP_SIDLE_ACT,
1705 .prcm = {
1706 .omap4 = {
1707 .clkctrl_offs = DRA7XX_CM_L4PER_UART5_CLKCTRL_OFFSET,
1708 .context_offs = DRA7XX_RM_L4PER_UART5_CONTEXT_OFFSET,
1709 .modulemode = MODULEMODE_SWCTRL,
1710 },
1711 },
1712};
1713
1714/* uart6 */
1715static struct omap_hwmod dra7xx_uart6_hwmod = {
1716 .name = "uart6",
1717 .class = &dra7xx_uart_hwmod_class,
1718 .clkdm_name = "ipu_clkdm",
1719 .main_clk = "uart6_gfclk_mux",
1720 .flags = HWMOD_SWSUP_SIDLE_ACT,
1721 .prcm = {
1722 .omap4 = {
1723 .clkctrl_offs = DRA7XX_CM_IPU_UART6_CLKCTRL_OFFSET,
1724 .context_offs = DRA7XX_RM_IPU_UART6_CONTEXT_OFFSET,
1725 .modulemode = MODULEMODE_SWCTRL,
1726 },
1727 },
1728};
1729
1730/*
1731 * 'usb_otg_ss' class
1732 *
1733 */
1734
1735static struct omap_hwmod_class dra7xx_usb_otg_ss_hwmod_class = {
1736 .name = "usb_otg_ss",
1737};
1738
1739/* usb_otg_ss1 */
1740static struct omap_hwmod_opt_clk usb_otg_ss1_opt_clks[] = {
1741 { .role = "refclk960m", .clk = "usb_otg_ss1_refclk960m" },
1742};
1743
1744static struct omap_hwmod dra7xx_usb_otg_ss1_hwmod = {
1745 .name = "usb_otg_ss1",
1746 .class = &dra7xx_usb_otg_ss_hwmod_class,
1747 .clkdm_name = "l3init_clkdm",
1748 .main_clk = "dpll_core_h13x2_ck",
1749 .prcm = {
1750 .omap4 = {
1751 .clkctrl_offs = DRA7XX_CM_L3INIT_USB_OTG_SS1_CLKCTRL_OFFSET,
1752 .context_offs = DRA7XX_RM_L3INIT_USB_OTG_SS1_CONTEXT_OFFSET,
1753 .modulemode = MODULEMODE_HWCTRL,
1754 },
1755 },
1756 .opt_clks = usb_otg_ss1_opt_clks,
1757 .opt_clks_cnt = ARRAY_SIZE(usb_otg_ss1_opt_clks),
1758};
1759
1760/* usb_otg_ss2 */
1761static struct omap_hwmod_opt_clk usb_otg_ss2_opt_clks[] = {
1762 { .role = "refclk960m", .clk = "usb_otg_ss2_refclk960m" },
1763};
1764
1765static struct omap_hwmod dra7xx_usb_otg_ss2_hwmod = {
1766 .name = "usb_otg_ss2",
1767 .class = &dra7xx_usb_otg_ss_hwmod_class,
1768 .clkdm_name = "l3init_clkdm",
1769 .main_clk = "dpll_core_h13x2_ck",
1770 .prcm = {
1771 .omap4 = {
1772 .clkctrl_offs = DRA7XX_CM_L3INIT_USB_OTG_SS2_CLKCTRL_OFFSET,
1773 .context_offs = DRA7XX_RM_L3INIT_USB_OTG_SS2_CONTEXT_OFFSET,
1774 .modulemode = MODULEMODE_HWCTRL,
1775 },
1776 },
1777 .opt_clks = usb_otg_ss2_opt_clks,
1778 .opt_clks_cnt = ARRAY_SIZE(usb_otg_ss2_opt_clks),
1779};
1780
1781/* usb_otg_ss3 */
1782static struct omap_hwmod dra7xx_usb_otg_ss3_hwmod = {
1783 .name = "usb_otg_ss3",
1784 .class = &dra7xx_usb_otg_ss_hwmod_class,
1785 .clkdm_name = "l3init_clkdm",
1786 .main_clk = "dpll_core_h13x2_ck",
1787 .prcm = {
1788 .omap4 = {
1789 .clkctrl_offs = DRA7XX_CM_L3INIT_USB_OTG_SS3_CLKCTRL_OFFSET,
1790 .context_offs = DRA7XX_RM_L3INIT_USB_OTG_SS3_CONTEXT_OFFSET,
1791 .modulemode = MODULEMODE_HWCTRL,
1792 },
1793 },
1794};
1795
1796/* usb_otg_ss4 */
1797static struct omap_hwmod dra7xx_usb_otg_ss4_hwmod = {
1798 .name = "usb_otg_ss4",
1799 .class = &dra7xx_usb_otg_ss_hwmod_class,
1800 .clkdm_name = "l3init_clkdm",
1801 .main_clk = "dpll_core_h13x2_ck",
1802 .prcm = {
1803 .omap4 = {
1804 .clkctrl_offs = DRA7XX_CM_L3INIT_USB_OTG_SS4_CLKCTRL_OFFSET,
1805 .context_offs = DRA7XX_RM_L3INIT_USB_OTG_SS4_CONTEXT_OFFSET,
1806 .modulemode = MODULEMODE_HWCTRL,
1807 },
1808 },
1809};
1810
1811/*
1812 * 'vcp' class
1813 *
1814 */
1815
1816static struct omap_hwmod_class dra7xx_vcp_hwmod_class = {
1817 .name = "vcp",
1818};
1819
1820/* vcp1 */
1821static struct omap_hwmod dra7xx_vcp1_hwmod = {
1822 .name = "vcp1",
1823 .class = &dra7xx_vcp_hwmod_class,
1824 .clkdm_name = "l3main1_clkdm",
1825 .main_clk = "l3_iclk_div",
1826 .prcm = {
1827 .omap4 = {
1828 .clkctrl_offs = DRA7XX_CM_L3MAIN1_VCP1_CLKCTRL_OFFSET,
1829 .context_offs = DRA7XX_RM_L3MAIN1_VCP1_CONTEXT_OFFSET,
1830 },
1831 },
1832};
1833
1834/* vcp2 */
1835static struct omap_hwmod dra7xx_vcp2_hwmod = {
1836 .name = "vcp2",
1837 .class = &dra7xx_vcp_hwmod_class,
1838 .clkdm_name = "l3main1_clkdm",
1839 .main_clk = "l3_iclk_div",
1840 .prcm = {
1841 .omap4 = {
1842 .clkctrl_offs = DRA7XX_CM_L3MAIN1_VCP2_CLKCTRL_OFFSET,
1843 .context_offs = DRA7XX_RM_L3MAIN1_VCP2_CONTEXT_OFFSET,
1844 },
1845 },
1846};
1847
1848/*
1849 * 'wd_timer' class
1850 *
1851 */
1852
1853static struct omap_hwmod_class_sysconfig dra7xx_wd_timer_sysc = {
1854 .rev_offs = 0x0000,
1855 .sysc_offs = 0x0010,
1856 .syss_offs = 0x0014,
1857 .sysc_flags = (SYSC_HAS_EMUFREE | SYSC_HAS_SIDLEMODE |
1858 SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
1859 .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
1860 SIDLE_SMART_WKUP),
1861 .sysc_fields = &omap_hwmod_sysc_type1,
1862};
1863
1864static struct omap_hwmod_class dra7xx_wd_timer_hwmod_class = {
1865 .name = "wd_timer",
1866 .sysc = &dra7xx_wd_timer_sysc,
1867 .pre_shutdown = &omap2_wd_timer_disable,
1868 .reset = &omap2_wd_timer_reset,
1869};
1870
1871/* wd_timer2 */
1872static struct omap_hwmod dra7xx_wd_timer2_hwmod = {
1873 .name = "wd_timer2",
1874 .class = &dra7xx_wd_timer_hwmod_class,
1875 .clkdm_name = "wkupaon_clkdm",
1876 .main_clk = "sys_32k_ck",
1877 .prcm = {
1878 .omap4 = {
1879 .clkctrl_offs = DRA7XX_CM_WKUPAON_WD_TIMER2_CLKCTRL_OFFSET,
1880 .context_offs = DRA7XX_RM_WKUPAON_WD_TIMER2_CONTEXT_OFFSET,
1881 .modulemode = MODULEMODE_SWCTRL,
1882 },
1883 },
1884};
1885
1886
1887/*
1888 * Interfaces
1889 */
1890
1891/* l3_main_2 -> l3_instr */
1892static struct omap_hwmod_ocp_if dra7xx_l3_main_2__l3_instr = {
1893 .master = &dra7xx_l3_main_2_hwmod,
1894 .slave = &dra7xx_l3_instr_hwmod,
1895 .clk = "l3_iclk_div",
1896 .user = OCP_USER_MPU | OCP_USER_SDMA,
1897};
1898
1899/* l4_cfg -> l3_main_1 */
1900static struct omap_hwmod_ocp_if dra7xx_l4_cfg__l3_main_1 = {
1901 .master = &dra7xx_l4_cfg_hwmod,
1902 .slave = &dra7xx_l3_main_1_hwmod,
1903 .clk = "l3_iclk_div",
1904 .user = OCP_USER_MPU | OCP_USER_SDMA,
1905};
1906
1907/* mpu -> l3_main_1 */
1908static struct omap_hwmod_ocp_if dra7xx_mpu__l3_main_1 = {
1909 .master = &dra7xx_mpu_hwmod,
1910 .slave = &dra7xx_l3_main_1_hwmod,
1911 .clk = "l3_iclk_div",
1912 .user = OCP_USER_MPU,
1913};
1914
1915/* l3_main_1 -> l3_main_2 */
1916static struct omap_hwmod_ocp_if dra7xx_l3_main_1__l3_main_2 = {
1917 .master = &dra7xx_l3_main_1_hwmod,
1918 .slave = &dra7xx_l3_main_2_hwmod,
1919 .clk = "l3_iclk_div",
1920 .user = OCP_USER_MPU,
1921};
1922
1923/* l4_cfg -> l3_main_2 */
1924static struct omap_hwmod_ocp_if dra7xx_l4_cfg__l3_main_2 = {
1925 .master = &dra7xx_l4_cfg_hwmod,
1926 .slave = &dra7xx_l3_main_2_hwmod,
1927 .clk = "l3_iclk_div",
1928 .user = OCP_USER_MPU | OCP_USER_SDMA,
1929};
1930
1931/* l3_main_1 -> l4_cfg */
1932static struct omap_hwmod_ocp_if dra7xx_l3_main_1__l4_cfg = {
1933 .master = &dra7xx_l3_main_1_hwmod,
1934 .slave = &dra7xx_l4_cfg_hwmod,
1935 .clk = "l3_iclk_div",
1936 .user = OCP_USER_MPU | OCP_USER_SDMA,
1937};
1938
1939/* l3_main_1 -> l4_per1 */
1940static struct omap_hwmod_ocp_if dra7xx_l3_main_1__l4_per1 = {
1941 .master = &dra7xx_l3_main_1_hwmod,
1942 .slave = &dra7xx_l4_per1_hwmod,
1943 .clk = "l3_iclk_div",
1944 .user = OCP_USER_MPU | OCP_USER_SDMA,
1945};
1946
1947/* l3_main_1 -> l4_per2 */
1948static struct omap_hwmod_ocp_if dra7xx_l3_main_1__l4_per2 = {
1949 .master = &dra7xx_l3_main_1_hwmod,
1950 .slave = &dra7xx_l4_per2_hwmod,
1951 .clk = "l3_iclk_div",
1952 .user = OCP_USER_MPU | OCP_USER_SDMA,
1953};
1954
1955/* l3_main_1 -> l4_per3 */
1956static struct omap_hwmod_ocp_if dra7xx_l3_main_1__l4_per3 = {
1957 .master = &dra7xx_l3_main_1_hwmod,
1958 .slave = &dra7xx_l4_per3_hwmod,
1959 .clk = "l3_iclk_div",
1960 .user = OCP_USER_MPU | OCP_USER_SDMA,
1961};
1962
1963/* l3_main_1 -> l4_wkup */
1964static struct omap_hwmod_ocp_if dra7xx_l3_main_1__l4_wkup = {
1965 .master = &dra7xx_l3_main_1_hwmod,
1966 .slave = &dra7xx_l4_wkup_hwmod,
1967 .clk = "wkupaon_iclk_mux",
1968 .user = OCP_USER_MPU | OCP_USER_SDMA,
1969};
1970
1971/* l4_per2 -> atl */
1972static struct omap_hwmod_ocp_if dra7xx_l4_per2__atl = {
1973 .master = &dra7xx_l4_per2_hwmod,
1974 .slave = &dra7xx_atl_hwmod,
1975 .clk = "l3_iclk_div",
1976 .user = OCP_USER_MPU | OCP_USER_SDMA,
1977};
1978
1979/* l3_main_1 -> bb2d */
1980static struct omap_hwmod_ocp_if dra7xx_l3_main_1__bb2d = {
1981 .master = &dra7xx_l3_main_1_hwmod,
1982 .slave = &dra7xx_bb2d_hwmod,
1983 .clk = "l3_iclk_div",
1984 .user = OCP_USER_MPU | OCP_USER_SDMA,
1985};
1986
1987/* l4_wkup -> counter_32k */
1988static struct omap_hwmod_ocp_if dra7xx_l4_wkup__counter_32k = {
1989 .master = &dra7xx_l4_wkup_hwmod,
1990 .slave = &dra7xx_counter_32k_hwmod,
1991 .clk = "wkupaon_iclk_mux",
1992 .user = OCP_USER_MPU | OCP_USER_SDMA,
1993};
1994
1995/* l4_wkup -> ctrl_module_wkup */
1996static struct omap_hwmod_ocp_if dra7xx_l4_wkup__ctrl_module_wkup = {
1997 .master = &dra7xx_l4_wkup_hwmod,
1998 .slave = &dra7xx_ctrl_module_wkup_hwmod,
1999 .clk = "wkupaon_iclk_mux",
2000 .user = OCP_USER_MPU | OCP_USER_SDMA,
2001};
2002
2003/* l4_wkup -> dcan1 */
2004static struct omap_hwmod_ocp_if dra7xx_l4_wkup__dcan1 = {
2005 .master = &dra7xx_l4_wkup_hwmod,
2006 .slave = &dra7xx_dcan1_hwmod,
2007 .clk = "wkupaon_iclk_mux",
2008 .user = OCP_USER_MPU | OCP_USER_SDMA,
2009};
2010
2011/* l4_per2 -> dcan2 */
2012static struct omap_hwmod_ocp_if dra7xx_l4_per2__dcan2 = {
2013 .master = &dra7xx_l4_per2_hwmod,
2014 .slave = &dra7xx_dcan2_hwmod,
2015 .clk = "l3_iclk_div",
2016 .user = OCP_USER_MPU | OCP_USER_SDMA,
2017};
2018
2019static struct omap_hwmod_addr_space dra7xx_dma_system_addrs[] = {
2020 {
2021 .pa_start = 0x4a056000,
2022 .pa_end = 0x4a056fff,
2023 .flags = ADDR_TYPE_RT
2024 },
2025 { }
2026};
2027
2028/* l4_cfg -> dma_system */
2029static struct omap_hwmod_ocp_if dra7xx_l4_cfg__dma_system = {
2030 .master = &dra7xx_l4_cfg_hwmod,
2031 .slave = &dra7xx_dma_system_hwmod,
2032 .clk = "l3_iclk_div",
2033 .addr = dra7xx_dma_system_addrs,
2034 .user = OCP_USER_MPU | OCP_USER_SDMA,
2035};
2036
2037static struct omap_hwmod_addr_space dra7xx_dss_addrs[] = {
2038 {
2039 .name = "family",
2040 .pa_start = 0x58000000,
2041 .pa_end = 0x5800007f,
2042 .flags = ADDR_TYPE_RT
2043 },
2044};
2045
2046/* l3_main_1 -> dss */
2047static struct omap_hwmod_ocp_if dra7xx_l3_main_1__dss = {
2048 .master = &dra7xx_l3_main_1_hwmod,
2049 .slave = &dra7xx_dss_hwmod,
2050 .clk = "l3_iclk_div",
2051 .addr = dra7xx_dss_addrs,
2052 .user = OCP_USER_MPU | OCP_USER_SDMA,
2053};
2054
2055static struct omap_hwmod_addr_space dra7xx_dss_dispc_addrs[] = {
2056 {
2057 .name = "dispc",
2058 .pa_start = 0x58001000,
2059 .pa_end = 0x58001fff,
2060 .flags = ADDR_TYPE_RT
2061 },
2062};
2063
2064/* l3_main_1 -> dispc */
2065static struct omap_hwmod_ocp_if dra7xx_l3_main_1__dispc = {
2066 .master = &dra7xx_l3_main_1_hwmod,
2067 .slave = &dra7xx_dss_dispc_hwmod,
2068 .clk = "l3_iclk_div",
2069 .addr = dra7xx_dss_dispc_addrs,
2070 .user = OCP_USER_MPU | OCP_USER_SDMA,
2071};
2072
2073static struct omap_hwmod_addr_space dra7xx_dss_hdmi_addrs[] = {
2074 {
2075 .name = "hdmi_wp",
2076 .pa_start = 0x58040000,
2077 .pa_end = 0x580400ff,
2078 .flags = ADDR_TYPE_RT
2079 },
2080 { }
2081};
2082
2083/* l3_main_1 -> dispc */
2084static struct omap_hwmod_ocp_if dra7xx_l3_main_1__hdmi = {
2085 .master = &dra7xx_l3_main_1_hwmod,
2086 .slave = &dra7xx_dss_hdmi_hwmod,
2087 .clk = "l3_iclk_div",
2088 .addr = dra7xx_dss_hdmi_addrs,
2089 .user = OCP_USER_MPU | OCP_USER_SDMA,
2090};
2091
2092static struct omap_hwmod_addr_space dra7xx_elm_addrs[] = {
2093 {
2094 .pa_start = 0x48078000,
2095 .pa_end = 0x48078fff,
2096 .flags = ADDR_TYPE_RT
2097 },
2098 { }
2099};
2100
2101/* l4_per1 -> elm */
2102static struct omap_hwmod_ocp_if dra7xx_l4_per1__elm = {
2103 .master = &dra7xx_l4_per1_hwmod,
2104 .slave = &dra7xx_elm_hwmod,
2105 .clk = "l3_iclk_div",
2106 .addr = dra7xx_elm_addrs,
2107 .user = OCP_USER_MPU | OCP_USER_SDMA,
2108};
2109
2110/* l4_wkup -> gpio1 */
2111static struct omap_hwmod_ocp_if dra7xx_l4_wkup__gpio1 = {
2112 .master = &dra7xx_l4_wkup_hwmod,
2113 .slave = &dra7xx_gpio1_hwmod,
2114 .clk = "wkupaon_iclk_mux",
2115 .user = OCP_USER_MPU | OCP_USER_SDMA,
2116};
2117
2118/* l4_per1 -> gpio2 */
2119static struct omap_hwmod_ocp_if dra7xx_l4_per1__gpio2 = {
2120 .master = &dra7xx_l4_per1_hwmod,
2121 .slave = &dra7xx_gpio2_hwmod,
2122 .clk = "l3_iclk_div",
2123 .user = OCP_USER_MPU | OCP_USER_SDMA,
2124};
2125
2126/* l4_per1 -> gpio3 */
2127static struct omap_hwmod_ocp_if dra7xx_l4_per1__gpio3 = {
2128 .master = &dra7xx_l4_per1_hwmod,
2129 .slave = &dra7xx_gpio3_hwmod,
2130 .clk = "l3_iclk_div",
2131 .user = OCP_USER_MPU | OCP_USER_SDMA,
2132};
2133
2134/* l4_per1 -> gpio4 */
2135static struct omap_hwmod_ocp_if dra7xx_l4_per1__gpio4 = {
2136 .master = &dra7xx_l4_per1_hwmod,
2137 .slave = &dra7xx_gpio4_hwmod,
2138 .clk = "l3_iclk_div",
2139 .user = OCP_USER_MPU | OCP_USER_SDMA,
2140};
2141
2142/* l4_per1 -> gpio5 */
2143static struct omap_hwmod_ocp_if dra7xx_l4_per1__gpio5 = {
2144 .master = &dra7xx_l4_per1_hwmod,
2145 .slave = &dra7xx_gpio5_hwmod,
2146 .clk = "l3_iclk_div",
2147 .user = OCP_USER_MPU | OCP_USER_SDMA,
2148};
2149
2150/* l4_per1 -> gpio6 */
2151static struct omap_hwmod_ocp_if dra7xx_l4_per1__gpio6 = {
2152 .master = &dra7xx_l4_per1_hwmod,
2153 .slave = &dra7xx_gpio6_hwmod,
2154 .clk = "l3_iclk_div",
2155 .user = OCP_USER_MPU | OCP_USER_SDMA,
2156};
2157
2158/* l4_per1 -> gpio7 */
2159static struct omap_hwmod_ocp_if dra7xx_l4_per1__gpio7 = {
2160 .master = &dra7xx_l4_per1_hwmod,
2161 .slave = &dra7xx_gpio7_hwmod,
2162 .clk = "l3_iclk_div",
2163 .user = OCP_USER_MPU | OCP_USER_SDMA,
2164};
2165
2166/* l4_per1 -> gpio8 */
2167static struct omap_hwmod_ocp_if dra7xx_l4_per1__gpio8 = {
2168 .master = &dra7xx_l4_per1_hwmod,
2169 .slave = &dra7xx_gpio8_hwmod,
2170 .clk = "l3_iclk_div",
2171 .user = OCP_USER_MPU | OCP_USER_SDMA,
2172};
2173
2174static struct omap_hwmod_addr_space dra7xx_gpmc_addrs[] = {
2175 {
2176 .pa_start = 0x50000000,
2177 .pa_end = 0x500003ff,
2178 .flags = ADDR_TYPE_RT
2179 },
2180 { }
2181};
2182
2183/* l3_main_1 -> gpmc */
2184static struct omap_hwmod_ocp_if dra7xx_l3_main_1__gpmc = {
2185 .master = &dra7xx_l3_main_1_hwmod,
2186 .slave = &dra7xx_gpmc_hwmod,
2187 .clk = "l3_iclk_div",
2188 .addr = dra7xx_gpmc_addrs,
2189 .user = OCP_USER_MPU | OCP_USER_SDMA,
2190};
2191
2192static struct omap_hwmod_addr_space dra7xx_hdq1w_addrs[] = {
2193 {
2194 .pa_start = 0x480b2000,
2195 .pa_end = 0x480b201f,
2196 .flags = ADDR_TYPE_RT
2197 },
2198 { }
2199};
2200
2201/* l4_per1 -> hdq1w */
2202static struct omap_hwmod_ocp_if dra7xx_l4_per1__hdq1w = {
2203 .master = &dra7xx_l4_per1_hwmod,
2204 .slave = &dra7xx_hdq1w_hwmod,
2205 .clk = "l3_iclk_div",
2206 .addr = dra7xx_hdq1w_addrs,
2207 .user = OCP_USER_MPU | OCP_USER_SDMA,
2208};
2209
2210/* l4_per1 -> i2c1 */
2211static struct omap_hwmod_ocp_if dra7xx_l4_per1__i2c1 = {
2212 .master = &dra7xx_l4_per1_hwmod,
2213 .slave = &dra7xx_i2c1_hwmod,
2214 .clk = "l3_iclk_div",
2215 .user = OCP_USER_MPU | OCP_USER_SDMA,
2216};
2217
2218/* l4_per1 -> i2c2 */
2219static struct omap_hwmod_ocp_if dra7xx_l4_per1__i2c2 = {
2220 .master = &dra7xx_l4_per1_hwmod,
2221 .slave = &dra7xx_i2c2_hwmod,
2222 .clk = "l3_iclk_div",
2223 .user = OCP_USER_MPU | OCP_USER_SDMA,
2224};
2225
2226/* l4_per1 -> i2c3 */
2227static struct omap_hwmod_ocp_if dra7xx_l4_per1__i2c3 = {
2228 .master = &dra7xx_l4_per1_hwmod,
2229 .slave = &dra7xx_i2c3_hwmod,
2230 .clk = "l3_iclk_div",
2231 .user = OCP_USER_MPU | OCP_USER_SDMA,
2232};
2233
2234/* l4_per1 -> i2c4 */
2235static struct omap_hwmod_ocp_if dra7xx_l4_per1__i2c4 = {
2236 .master = &dra7xx_l4_per1_hwmod,
2237 .slave = &dra7xx_i2c4_hwmod,
2238 .clk = "l3_iclk_div",
2239 .user = OCP_USER_MPU | OCP_USER_SDMA,
2240};
2241
2242/* l4_per1 -> i2c5 */
2243static struct omap_hwmod_ocp_if dra7xx_l4_per1__i2c5 = {
2244 .master = &dra7xx_l4_per1_hwmod,
2245 .slave = &dra7xx_i2c5_hwmod,
2246 .clk = "l3_iclk_div",
2247 .user = OCP_USER_MPU | OCP_USER_SDMA,
2248};
2249
2250/* l4_per1 -> mcspi1 */
2251static struct omap_hwmod_ocp_if dra7xx_l4_per1__mcspi1 = {
2252 .master = &dra7xx_l4_per1_hwmod,
2253 .slave = &dra7xx_mcspi1_hwmod,
2254 .clk = "l3_iclk_div",
2255 .user = OCP_USER_MPU | OCP_USER_SDMA,
2256};
2257
2258/* l4_per1 -> mcspi2 */
2259static struct omap_hwmod_ocp_if dra7xx_l4_per1__mcspi2 = {
2260 .master = &dra7xx_l4_per1_hwmod,
2261 .slave = &dra7xx_mcspi2_hwmod,
2262 .clk = "l3_iclk_div",
2263 .user = OCP_USER_MPU | OCP_USER_SDMA,
2264};
2265
2266/* l4_per1 -> mcspi3 */
2267static struct omap_hwmod_ocp_if dra7xx_l4_per1__mcspi3 = {
2268 .master = &dra7xx_l4_per1_hwmod,
2269 .slave = &dra7xx_mcspi3_hwmod,
2270 .clk = "l3_iclk_div",
2271 .user = OCP_USER_MPU | OCP_USER_SDMA,
2272};
2273
2274/* l4_per1 -> mcspi4 */
2275static struct omap_hwmod_ocp_if dra7xx_l4_per1__mcspi4 = {
2276 .master = &dra7xx_l4_per1_hwmod,
2277 .slave = &dra7xx_mcspi4_hwmod,
2278 .clk = "l3_iclk_div",
2279 .user = OCP_USER_MPU | OCP_USER_SDMA,
2280};
2281
2282/* l4_per1 -> mmc1 */
2283static struct omap_hwmod_ocp_if dra7xx_l4_per1__mmc1 = {
2284 .master = &dra7xx_l4_per1_hwmod,
2285 .slave = &dra7xx_mmc1_hwmod,
2286 .clk = "l3_iclk_div",
2287 .user = OCP_USER_MPU | OCP_USER_SDMA,
2288};
2289
2290/* l4_per1 -> mmc2 */
2291static struct omap_hwmod_ocp_if dra7xx_l4_per1__mmc2 = {
2292 .master = &dra7xx_l4_per1_hwmod,
2293 .slave = &dra7xx_mmc2_hwmod,
2294 .clk = "l3_iclk_div",
2295 .user = OCP_USER_MPU | OCP_USER_SDMA,
2296};
2297
2298/* l4_per1 -> mmc3 */
2299static struct omap_hwmod_ocp_if dra7xx_l4_per1__mmc3 = {
2300 .master = &dra7xx_l4_per1_hwmod,
2301 .slave = &dra7xx_mmc3_hwmod,
2302 .clk = "l3_iclk_div",
2303 .user = OCP_USER_MPU | OCP_USER_SDMA,
2304};
2305
2306/* l4_per1 -> mmc4 */
2307static struct omap_hwmod_ocp_if dra7xx_l4_per1__mmc4 = {
2308 .master = &dra7xx_l4_per1_hwmod,
2309 .slave = &dra7xx_mmc4_hwmod,
2310 .clk = "l3_iclk_div",
2311 .user = OCP_USER_MPU | OCP_USER_SDMA,
2312};
2313
2314/* l4_cfg -> mpu */
2315static struct omap_hwmod_ocp_if dra7xx_l4_cfg__mpu = {
2316 .master = &dra7xx_l4_cfg_hwmod,
2317 .slave = &dra7xx_mpu_hwmod,
2318 .clk = "l3_iclk_div",
2319 .user = OCP_USER_MPU | OCP_USER_SDMA,
2320};
2321
2322static struct omap_hwmod_addr_space dra7xx_ocp2scp1_addrs[] = {
2323 {
2324 .pa_start = 0x4a080000,
2325 .pa_end = 0x4a08001f,
2326 .flags = ADDR_TYPE_RT
2327 },
2328 { }
2329};
2330
2331/* l4_cfg -> ocp2scp1 */
2332static struct omap_hwmod_ocp_if dra7xx_l4_cfg__ocp2scp1 = {
2333 .master = &dra7xx_l4_cfg_hwmod,
2334 .slave = &dra7xx_ocp2scp1_hwmod,
2335 .clk = "l4_root_clk_div",
2336 .addr = dra7xx_ocp2scp1_addrs,
2337 .user = OCP_USER_MPU | OCP_USER_SDMA,
2338};
2339
2340static struct omap_hwmod_addr_space dra7xx_qspi_addrs[] = {
2341 {
2342 .pa_start = 0x4b300000,
2343 .pa_end = 0x4b30007f,
2344 .flags = ADDR_TYPE_RT
2345 },
2346 { }
2347};
2348
2349/* l3_main_1 -> qspi */
2350static struct omap_hwmod_ocp_if dra7xx_l3_main_1__qspi = {
2351 .master = &dra7xx_l3_main_1_hwmod,
2352 .slave = &dra7xx_qspi_hwmod,
2353 .clk = "l3_iclk_div",
2354 .addr = dra7xx_qspi_addrs,
2355 .user = OCP_USER_MPU | OCP_USER_SDMA,
2356};
2357
2358static struct omap_hwmod_addr_space dra7xx_sata_addrs[] = {
2359 {
2360 .name = "sysc",
2361 .pa_start = 0x4a141100,
2362 .pa_end = 0x4a141107,
2363 .flags = ADDR_TYPE_RT
2364 },
2365 { }
2366};
2367
2368/* l4_cfg -> sata */
2369static struct omap_hwmod_ocp_if dra7xx_l4_cfg__sata = {
2370 .master = &dra7xx_l4_cfg_hwmod,
2371 .slave = &dra7xx_sata_hwmod,
2372 .clk = "l3_iclk_div",
2373 .addr = dra7xx_sata_addrs,
2374 .user = OCP_USER_MPU | OCP_USER_SDMA,
2375};
2376
2377static struct omap_hwmod_addr_space dra7xx_smartreflex_core_addrs[] = {
2378 {
2379 .pa_start = 0x4a0dd000,
2380 .pa_end = 0x4a0dd07f,
2381 .flags = ADDR_TYPE_RT
2382 },
2383 { }
2384};
2385
2386/* l4_cfg -> smartreflex_core */
2387static struct omap_hwmod_ocp_if dra7xx_l4_cfg__smartreflex_core = {
2388 .master = &dra7xx_l4_cfg_hwmod,
2389 .slave = &dra7xx_smartreflex_core_hwmod,
2390 .clk = "l4_root_clk_div",
2391 .addr = dra7xx_smartreflex_core_addrs,
2392 .user = OCP_USER_MPU | OCP_USER_SDMA,
2393};
2394
2395static struct omap_hwmod_addr_space dra7xx_smartreflex_mpu_addrs[] = {
2396 {
2397 .pa_start = 0x4a0d9000,
2398 .pa_end = 0x4a0d907f,
2399 .flags = ADDR_TYPE_RT
2400 },
2401 { }
2402};
2403
2404/* l4_cfg -> smartreflex_mpu */
2405static struct omap_hwmod_ocp_if dra7xx_l4_cfg__smartreflex_mpu = {
2406 .master = &dra7xx_l4_cfg_hwmod,
2407 .slave = &dra7xx_smartreflex_mpu_hwmod,
2408 .clk = "l4_root_clk_div",
2409 .addr = dra7xx_smartreflex_mpu_addrs,
2410 .user = OCP_USER_MPU | OCP_USER_SDMA,
2411};
2412
2413static struct omap_hwmod_addr_space dra7xx_spinlock_addrs[] = {
2414 {
2415 .pa_start = 0x4a0f6000,
2416 .pa_end = 0x4a0f6fff,
2417 .flags = ADDR_TYPE_RT
2418 },
2419 { }
2420};
2421
2422/* l4_cfg -> spinlock */
2423static struct omap_hwmod_ocp_if dra7xx_l4_cfg__spinlock = {
2424 .master = &dra7xx_l4_cfg_hwmod,
2425 .slave = &dra7xx_spinlock_hwmod,
2426 .clk = "l3_iclk_div",
2427 .addr = dra7xx_spinlock_addrs,
2428 .user = OCP_USER_MPU | OCP_USER_SDMA,
2429};
2430
2431/* l4_wkup -> timer1 */
2432static struct omap_hwmod_ocp_if dra7xx_l4_wkup__timer1 = {
2433 .master = &dra7xx_l4_wkup_hwmod,
2434 .slave = &dra7xx_timer1_hwmod,
2435 .clk = "wkupaon_iclk_mux",
2436 .user = OCP_USER_MPU | OCP_USER_SDMA,
2437};
2438
2439/* l4_per1 -> timer2 */
2440static struct omap_hwmod_ocp_if dra7xx_l4_per1__timer2 = {
2441 .master = &dra7xx_l4_per1_hwmod,
2442 .slave = &dra7xx_timer2_hwmod,
2443 .clk = "l3_iclk_div",
2444 .user = OCP_USER_MPU | OCP_USER_SDMA,
2445};
2446
2447/* l4_per1 -> timer3 */
2448static struct omap_hwmod_ocp_if dra7xx_l4_per1__timer3 = {
2449 .master = &dra7xx_l4_per1_hwmod,
2450 .slave = &dra7xx_timer3_hwmod,
2451 .clk = "l3_iclk_div",
2452 .user = OCP_USER_MPU | OCP_USER_SDMA,
2453};
2454
2455/* l4_per1 -> timer4 */
2456static struct omap_hwmod_ocp_if dra7xx_l4_per1__timer4 = {
2457 .master = &dra7xx_l4_per1_hwmod,
2458 .slave = &dra7xx_timer4_hwmod,
2459 .clk = "l3_iclk_div",
2460 .user = OCP_USER_MPU | OCP_USER_SDMA,
2461};
2462
2463/* l4_per3 -> timer5 */
2464static struct omap_hwmod_ocp_if dra7xx_l4_per3__timer5 = {
2465 .master = &dra7xx_l4_per3_hwmod,
2466 .slave = &dra7xx_timer5_hwmod,
2467 .clk = "l3_iclk_div",
2468 .user = OCP_USER_MPU | OCP_USER_SDMA,
2469};
2470
2471/* l4_per3 -> timer6 */
2472static struct omap_hwmod_ocp_if dra7xx_l4_per3__timer6 = {
2473 .master = &dra7xx_l4_per3_hwmod,
2474 .slave = &dra7xx_timer6_hwmod,
2475 .clk = "l3_iclk_div",
2476 .user = OCP_USER_MPU | OCP_USER_SDMA,
2477};
2478
2479/* l4_per3 -> timer7 */
2480static struct omap_hwmod_ocp_if dra7xx_l4_per3__timer7 = {
2481 .master = &dra7xx_l4_per3_hwmod,
2482 .slave = &dra7xx_timer7_hwmod,
2483 .clk = "l3_iclk_div",
2484 .user = OCP_USER_MPU | OCP_USER_SDMA,
2485};
2486
2487/* l4_per3 -> timer8 */
2488static struct omap_hwmod_ocp_if dra7xx_l4_per3__timer8 = {
2489 .master = &dra7xx_l4_per3_hwmod,
2490 .slave = &dra7xx_timer8_hwmod,
2491 .clk = "l3_iclk_div",
2492 .user = OCP_USER_MPU | OCP_USER_SDMA,
2493};
2494
2495/* l4_per1 -> timer9 */
2496static struct omap_hwmod_ocp_if dra7xx_l4_per1__timer9 = {
2497 .master = &dra7xx_l4_per1_hwmod,
2498 .slave = &dra7xx_timer9_hwmod,
2499 .clk = "l3_iclk_div",
2500 .user = OCP_USER_MPU | OCP_USER_SDMA,
2501};
2502
2503/* l4_per1 -> timer10 */
2504static struct omap_hwmod_ocp_if dra7xx_l4_per1__timer10 = {
2505 .master = &dra7xx_l4_per1_hwmod,
2506 .slave = &dra7xx_timer10_hwmod,
2507 .clk = "l3_iclk_div",
2508 .user = OCP_USER_MPU | OCP_USER_SDMA,
2509};
2510
2511/* l4_per1 -> timer11 */
2512static struct omap_hwmod_ocp_if dra7xx_l4_per1__timer11 = {
2513 .master = &dra7xx_l4_per1_hwmod,
2514 .slave = &dra7xx_timer11_hwmod,
2515 .clk = "l3_iclk_div",
2516 .user = OCP_USER_MPU | OCP_USER_SDMA,
2517};
2518
2519/* l4_per1 -> uart1 */
2520static struct omap_hwmod_ocp_if dra7xx_l4_per1__uart1 = {
2521 .master = &dra7xx_l4_per1_hwmod,
2522 .slave = &dra7xx_uart1_hwmod,
2523 .clk = "l3_iclk_div",
2524 .user = OCP_USER_MPU | OCP_USER_SDMA,
2525};
2526
2527/* l4_per1 -> uart2 */
2528static struct omap_hwmod_ocp_if dra7xx_l4_per1__uart2 = {
2529 .master = &dra7xx_l4_per1_hwmod,
2530 .slave = &dra7xx_uart2_hwmod,
2531 .clk = "l3_iclk_div",
2532 .user = OCP_USER_MPU | OCP_USER_SDMA,
2533};
2534
2535/* l4_per1 -> uart3 */
2536static struct omap_hwmod_ocp_if dra7xx_l4_per1__uart3 = {
2537 .master = &dra7xx_l4_per1_hwmod,
2538 .slave = &dra7xx_uart3_hwmod,
2539 .clk = "l3_iclk_div",
2540 .user = OCP_USER_MPU | OCP_USER_SDMA,
2541};
2542
2543/* l4_per1 -> uart4 */
2544static struct omap_hwmod_ocp_if dra7xx_l4_per1__uart4 = {
2545 .master = &dra7xx_l4_per1_hwmod,
2546 .slave = &dra7xx_uart4_hwmod,
2547 .clk = "l3_iclk_div",
2548 .user = OCP_USER_MPU | OCP_USER_SDMA,
2549};
2550
2551/* l4_per1 -> uart5 */
2552static struct omap_hwmod_ocp_if dra7xx_l4_per1__uart5 = {
2553 .master = &dra7xx_l4_per1_hwmod,
2554 .slave = &dra7xx_uart5_hwmod,
2555 .clk = "l3_iclk_div",
2556 .user = OCP_USER_MPU | OCP_USER_SDMA,
2557};
2558
2559/* l4_per1 -> uart6 */
2560static struct omap_hwmod_ocp_if dra7xx_l4_per1__uart6 = {
2561 .master = &dra7xx_l4_per1_hwmod,
2562 .slave = &dra7xx_uart6_hwmod,
2563 .clk = "l3_iclk_div",
2564 .user = OCP_USER_MPU | OCP_USER_SDMA,
2565};
2566
2567/* l4_per3 -> usb_otg_ss1 */
2568static struct omap_hwmod_ocp_if dra7xx_l4_per3__usb_otg_ss1 = {
2569 .master = &dra7xx_l4_per3_hwmod,
2570 .slave = &dra7xx_usb_otg_ss1_hwmod,
2571 .clk = "dpll_core_h13x2_ck",
2572 .user = OCP_USER_MPU | OCP_USER_SDMA,
2573};
2574
2575/* l4_per3 -> usb_otg_ss2 */
2576static struct omap_hwmod_ocp_if dra7xx_l4_per3__usb_otg_ss2 = {
2577 .master = &dra7xx_l4_per3_hwmod,
2578 .slave = &dra7xx_usb_otg_ss2_hwmod,
2579 .clk = "dpll_core_h13x2_ck",
2580 .user = OCP_USER_MPU | OCP_USER_SDMA,
2581};
2582
2583/* l4_per3 -> usb_otg_ss3 */
2584static struct omap_hwmod_ocp_if dra7xx_l4_per3__usb_otg_ss3 = {
2585 .master = &dra7xx_l4_per3_hwmod,
2586 .slave = &dra7xx_usb_otg_ss3_hwmod,
2587 .clk = "dpll_core_h13x2_ck",
2588 .user = OCP_USER_MPU | OCP_USER_SDMA,
2589};
2590
2591/* l4_per3 -> usb_otg_ss4 */
2592static struct omap_hwmod_ocp_if dra7xx_l4_per3__usb_otg_ss4 = {
2593 .master = &dra7xx_l4_per3_hwmod,
2594 .slave = &dra7xx_usb_otg_ss4_hwmod,
2595 .clk = "dpll_core_h13x2_ck",
2596 .user = OCP_USER_MPU | OCP_USER_SDMA,
2597};
2598
2599/* l3_main_1 -> vcp1 */
2600static struct omap_hwmod_ocp_if dra7xx_l3_main_1__vcp1 = {
2601 .master = &dra7xx_l3_main_1_hwmod,
2602 .slave = &dra7xx_vcp1_hwmod,
2603 .clk = "l3_iclk_div",
2604 .user = OCP_USER_MPU | OCP_USER_SDMA,
2605};
2606
2607/* l4_per2 -> vcp1 */
2608static struct omap_hwmod_ocp_if dra7xx_l4_per2__vcp1 = {
2609 .master = &dra7xx_l4_per2_hwmod,
2610 .slave = &dra7xx_vcp1_hwmod,
2611 .clk = "l3_iclk_div",
2612 .user = OCP_USER_MPU | OCP_USER_SDMA,
2613};
2614
2615/* l3_main_1 -> vcp2 */
2616static struct omap_hwmod_ocp_if dra7xx_l3_main_1__vcp2 = {
2617 .master = &dra7xx_l3_main_1_hwmod,
2618 .slave = &dra7xx_vcp2_hwmod,
2619 .clk = "l3_iclk_div",
2620 .user = OCP_USER_MPU | OCP_USER_SDMA,
2621};
2622
2623/* l4_per2 -> vcp2 */
2624static struct omap_hwmod_ocp_if dra7xx_l4_per2__vcp2 = {
2625 .master = &dra7xx_l4_per2_hwmod,
2626 .slave = &dra7xx_vcp2_hwmod,
2627 .clk = "l3_iclk_div",
2628 .user = OCP_USER_MPU | OCP_USER_SDMA,
2629};
2630
2631/* l4_wkup -> wd_timer2 */
2632static struct omap_hwmod_ocp_if dra7xx_l4_wkup__wd_timer2 = {
2633 .master = &dra7xx_l4_wkup_hwmod,
2634 .slave = &dra7xx_wd_timer2_hwmod,
2635 .clk = "wkupaon_iclk_mux",
2636 .user = OCP_USER_MPU | OCP_USER_SDMA,
2637};
2638
2639static struct omap_hwmod_ocp_if *dra7xx_hwmod_ocp_ifs[] __initdata = {
2640 &dra7xx_l3_main_2__l3_instr,
2641 &dra7xx_l4_cfg__l3_main_1,
2642 &dra7xx_mpu__l3_main_1,
2643 &dra7xx_l3_main_1__l3_main_2,
2644 &dra7xx_l4_cfg__l3_main_2,
2645 &dra7xx_l3_main_1__l4_cfg,
2646 &dra7xx_l3_main_1__l4_per1,
2647 &dra7xx_l3_main_1__l4_per2,
2648 &dra7xx_l3_main_1__l4_per3,
2649 &dra7xx_l3_main_1__l4_wkup,
2650 &dra7xx_l4_per2__atl,
2651 &dra7xx_l3_main_1__bb2d,
2652 &dra7xx_l4_wkup__counter_32k,
2653 &dra7xx_l4_wkup__ctrl_module_wkup,
2654 &dra7xx_l4_wkup__dcan1,
2655 &dra7xx_l4_per2__dcan2,
2656 &dra7xx_l4_cfg__dma_system,
2657 &dra7xx_l3_main_1__dss,
2658 &dra7xx_l3_main_1__dispc,
2659 &dra7xx_l3_main_1__hdmi,
2660 &dra7xx_l4_per1__elm,
2661 &dra7xx_l4_wkup__gpio1,
2662 &dra7xx_l4_per1__gpio2,
2663 &dra7xx_l4_per1__gpio3,
2664 &dra7xx_l4_per1__gpio4,
2665 &dra7xx_l4_per1__gpio5,
2666 &dra7xx_l4_per1__gpio6,
2667 &dra7xx_l4_per1__gpio7,
2668 &dra7xx_l4_per1__gpio8,
2669 &dra7xx_l3_main_1__gpmc,
2670 &dra7xx_l4_per1__hdq1w,
2671 &dra7xx_l4_per1__i2c1,
2672 &dra7xx_l4_per1__i2c2,
2673 &dra7xx_l4_per1__i2c3,
2674 &dra7xx_l4_per1__i2c4,
2675 &dra7xx_l4_per1__i2c5,
2676 &dra7xx_l4_per1__mcspi1,
2677 &dra7xx_l4_per1__mcspi2,
2678 &dra7xx_l4_per1__mcspi3,
2679 &dra7xx_l4_per1__mcspi4,
2680 &dra7xx_l4_per1__mmc1,
2681 &dra7xx_l4_per1__mmc2,
2682 &dra7xx_l4_per1__mmc3,
2683 &dra7xx_l4_per1__mmc4,
2684 &dra7xx_l4_cfg__mpu,
2685 &dra7xx_l4_cfg__ocp2scp1,
2686 &dra7xx_l3_main_1__qspi,
2687 &dra7xx_l4_cfg__sata,
2688 &dra7xx_l4_cfg__smartreflex_core,
2689 &dra7xx_l4_cfg__smartreflex_mpu,
2690 &dra7xx_l4_cfg__spinlock,
2691 &dra7xx_l4_wkup__timer1,
2692 &dra7xx_l4_per1__timer2,
2693 &dra7xx_l4_per1__timer3,
2694 &dra7xx_l4_per1__timer4,
2695 &dra7xx_l4_per3__timer5,
2696 &dra7xx_l4_per3__timer6,
2697 &dra7xx_l4_per3__timer7,
2698 &dra7xx_l4_per3__timer8,
2699 &dra7xx_l4_per1__timer9,
2700 &dra7xx_l4_per1__timer10,
2701 &dra7xx_l4_per1__timer11,
2702 &dra7xx_l4_per1__uart1,
2703 &dra7xx_l4_per1__uart2,
2704 &dra7xx_l4_per1__uart3,
2705 &dra7xx_l4_per1__uart4,
2706 &dra7xx_l4_per1__uart5,
2707 &dra7xx_l4_per1__uart6,
2708 &dra7xx_l4_per3__usb_otg_ss1,
2709 &dra7xx_l4_per3__usb_otg_ss2,
2710 &dra7xx_l4_per3__usb_otg_ss3,
2711 &dra7xx_l4_per3__usb_otg_ss4,
2712 &dra7xx_l3_main_1__vcp1,
2713 &dra7xx_l4_per2__vcp1,
2714 &dra7xx_l3_main_1__vcp2,
2715 &dra7xx_l4_per2__vcp2,
2716 &dra7xx_l4_wkup__wd_timer2,
2717 NULL,
2718};
2719
2720int __init dra7xx_hwmod_init(void)
2721{
2722 omap_hwmod_init();
2723 return omap_hwmod_register_links(dra7xx_hwmod_ocp_ifs);
2724}
diff --git a/arch/arm/mach-omap2/powerdomain.h b/arch/arm/mach-omap2/powerdomain.h
index e4d7bd6f94b8..baf3d8bf6bea 100644
--- a/arch/arm/mach-omap2/powerdomain.h
+++ b/arch/arm/mach-omap2/powerdomain.h
@@ -256,6 +256,7 @@ extern void omap3xxx_powerdomains_init(void);
256extern void am33xx_powerdomains_init(void); 256extern void am33xx_powerdomains_init(void);
257extern void omap44xx_powerdomains_init(void); 257extern void omap44xx_powerdomains_init(void);
258extern void omap54xx_powerdomains_init(void); 258extern void omap54xx_powerdomains_init(void);
259extern void dra7xx_powerdomains_init(void);
259 260
260extern struct pwrdm_ops omap2_pwrdm_operations; 261extern struct pwrdm_ops omap2_pwrdm_operations;
261extern struct pwrdm_ops omap3_pwrdm_operations; 262extern struct pwrdm_ops omap3_pwrdm_operations;
diff --git a/arch/arm/mach-omap2/powerdomains3xxx_data.c b/arch/arm/mach-omap2/powerdomains3xxx_data.c
index e2d4bd804523..328c1037cb60 100644
--- a/arch/arm/mach-omap2/powerdomains3xxx_data.c
+++ b/arch/arm/mach-omap2/powerdomains3xxx_data.c
@@ -336,6 +336,13 @@ static struct powerdomain dpll5_pwrdm = {
336 .voltdm = { .name = "core" }, 336 .voltdm = { .name = "core" },
337}; 337};
338 338
339static struct powerdomain alwon_81xx_pwrdm = {
340 .name = "alwon_pwrdm",
341 .prcm_offs = TI81XX_PRM_ALWON_MOD,
342 .pwrsts = PWRSTS_OFF_ON,
343 .voltdm = { .name = "core" },
344};
345
339static struct powerdomain device_81xx_pwrdm = { 346static struct powerdomain device_81xx_pwrdm = {
340 .name = "device_pwrdm", 347 .name = "device_pwrdm",
341 .prcm_offs = TI81XX_PRM_DEVICE_MOD, 348 .prcm_offs = TI81XX_PRM_DEVICE_MOD,
@@ -442,6 +449,7 @@ static struct powerdomain *powerdomains_am35x[] __initdata = {
442}; 449};
443 450
444static struct powerdomain *powerdomains_ti81xx[] __initdata = { 451static struct powerdomain *powerdomains_ti81xx[] __initdata = {
452 &alwon_81xx_pwrdm,
445 &device_81xx_pwrdm, 453 &device_81xx_pwrdm,
446 &active_816x_pwrdm, 454 &active_816x_pwrdm,
447 &default_816x_pwrdm, 455 &default_816x_pwrdm,
diff --git a/arch/arm/mach-omap2/powerdomains54xx_data.c b/arch/arm/mach-omap2/powerdomains54xx_data.c
index 81f8a7cc26ee..ce1d752af991 100644
--- a/arch/arm/mach-omap2/powerdomains54xx_data.c
+++ b/arch/arm/mach-omap2/powerdomains54xx_data.c
@@ -25,7 +25,6 @@
25 25
26#include "prcm-common.h" 26#include "prcm-common.h"
27#include "prcm44xx.h" 27#include "prcm44xx.h"
28#include "prm-regbits-54xx.h"
29#include "prm54xx.h" 28#include "prm54xx.h"
30#include "prcm_mpu54xx.h" 29#include "prcm_mpu54xx.h"
31 30
diff --git a/arch/arm/mach-omap2/powerdomains7xx_data.c b/arch/arm/mach-omap2/powerdomains7xx_data.c
new file mode 100644
index 000000000000..48151d1cfde0
--- /dev/null
+++ b/arch/arm/mach-omap2/powerdomains7xx_data.c
@@ -0,0 +1,454 @@
1/*
2 * DRA7xx Power domains framework
3 *
4 * Copyright (C) 2009-2013 Texas Instruments, Inc.
5 * Copyright (C) 2009-2011 Nokia Corporation
6 *
7 * Generated by code originally written by:
8 * Abhijit Pagare (abhijitpagare@ti.com)
9 * Benoit Cousson (b-cousson@ti.com)
10 * Paul Walmsley (paul@pwsan.com)
11 *
12 * This file is automatically generated from the OMAP hardware databases.
13 * We respectfully ask that any modifications to this file be coordinated
14 * with the public linux-omap@vger.kernel.org mailing list and the
15 * authors above to ensure that the autogeneration scripts are kept
16 * up-to-date with the file contents.
17 *
18 * This program is free software; you can redistribute it and/or modify
19 * it under the terms of the GNU General Public License version 2 as
20 * published by the Free Software Foundation.
21 */
22
23#include <linux/kernel.h>
24#include <linux/init.h>
25
26#include "powerdomain.h"
27
28#include "prcm-common.h"
29#include "prcm44xx.h"
30#include "prm7xx.h"
31#include "prcm_mpu7xx.h"
32
33/* iva_7xx_pwrdm: IVA-HD power domain */
34static struct powerdomain iva_7xx_pwrdm = {
35 .name = "iva_pwrdm",
36 .prcm_offs = DRA7XX_PRM_IVA_INST,
37 .prcm_partition = DRA7XX_PRM_PARTITION,
38 .pwrsts = PWRSTS_OFF_RET_ON,
39 .pwrsts_logic_ret = PWRSTS_OFF,
40 .banks = 4,
41 .pwrsts_mem_ret = {
42 [0] = PWRSTS_OFF_RET, /* hwa_mem */
43 [1] = PWRSTS_OFF_RET, /* sl2_mem */
44 [2] = PWRSTS_OFF_RET, /* tcm1_mem */
45 [3] = PWRSTS_OFF_RET, /* tcm2_mem */
46 },
47 .pwrsts_mem_on = {
48 [0] = PWRSTS_OFF_RET, /* hwa_mem */
49 [1] = PWRSTS_OFF_RET, /* sl2_mem */
50 [2] = PWRSTS_OFF_RET, /* tcm1_mem */
51 [3] = PWRSTS_OFF_RET, /* tcm2_mem */
52 },
53 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
54};
55
56/* rtc_7xx_pwrdm: */
57static struct powerdomain rtc_7xx_pwrdm = {
58 .name = "rtc_pwrdm",
59 .prcm_offs = DRA7XX_PRM_RTC_INST,
60 .prcm_partition = DRA7XX_PRM_PARTITION,
61 .pwrsts = PWRSTS_ON,
62};
63
64/* custefuse_7xx_pwrdm: Customer efuse controller power domain */
65static struct powerdomain custefuse_7xx_pwrdm = {
66 .name = "custefuse_pwrdm",
67 .prcm_offs = DRA7XX_PRM_CUSTEFUSE_INST,
68 .prcm_partition = DRA7XX_PRM_PARTITION,
69 .pwrsts = PWRSTS_OFF_ON,
70 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
71};
72
73/* ipu_7xx_pwrdm: Audio back end power domain */
74static struct powerdomain ipu_7xx_pwrdm = {
75 .name = "ipu_pwrdm",
76 .prcm_offs = DRA7XX_PRM_IPU_INST,
77 .prcm_partition = DRA7XX_PRM_PARTITION,
78 .pwrsts = PWRSTS_OFF_RET_ON,
79 .pwrsts_logic_ret = PWRSTS_OFF,
80 .banks = 2,
81 .pwrsts_mem_ret = {
82 [0] = PWRSTS_OFF_RET, /* aessmem */
83 [1] = PWRSTS_OFF_RET, /* periphmem */
84 },
85 .pwrsts_mem_on = {
86 [0] = PWRSTS_OFF_RET, /* aessmem */
87 [1] = PWRSTS_OFF_RET, /* periphmem */
88 },
89 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
90};
91
92/* dss_7xx_pwrdm: Display subsystem power domain */
93static struct powerdomain dss_7xx_pwrdm = {
94 .name = "dss_pwrdm",
95 .prcm_offs = DRA7XX_PRM_DSS_INST,
96 .prcm_partition = DRA7XX_PRM_PARTITION,
97 .pwrsts = PWRSTS_OFF_RET_ON,
98 .pwrsts_logic_ret = PWRSTS_OFF,
99 .banks = 1,
100 .pwrsts_mem_ret = {
101 [0] = PWRSTS_OFF_RET, /* dss_mem */
102 },
103 .pwrsts_mem_on = {
104 [0] = PWRSTS_OFF_RET, /* dss_mem */
105 },
106 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
107};
108
109/* l4per_7xx_pwrdm: Target peripherals power domain */
110static struct powerdomain l4per_7xx_pwrdm = {
111 .name = "l4per_pwrdm",
112 .prcm_offs = DRA7XX_PRM_L4PER_INST,
113 .prcm_partition = DRA7XX_PRM_PARTITION,
114 .pwrsts = PWRSTS_RET_ON,
115 .pwrsts_logic_ret = PWRSTS_OFF_RET,
116 .banks = 2,
117 .pwrsts_mem_ret = {
118 [0] = PWRSTS_OFF_RET, /* nonretained_bank */
119 [1] = PWRSTS_OFF_RET, /* retained_bank */
120 },
121 .pwrsts_mem_on = {
122 [0] = PWRSTS_OFF_RET, /* nonretained_bank */
123 [1] = PWRSTS_OFF_RET, /* retained_bank */
124 },
125 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
126};
127
128/* gpu_7xx_pwrdm: 3D accelerator power domain */
129static struct powerdomain gpu_7xx_pwrdm = {
130 .name = "gpu_pwrdm",
131 .prcm_offs = DRA7XX_PRM_GPU_INST,
132 .prcm_partition = DRA7XX_PRM_PARTITION,
133 .pwrsts = PWRSTS_OFF_ON,
134 .banks = 1,
135 .pwrsts_mem_ret = {
136 [0] = PWRSTS_OFF_RET, /* gpu_mem */
137 },
138 .pwrsts_mem_on = {
139 [0] = PWRSTS_OFF_RET, /* gpu_mem */
140 },
141 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
142};
143
144/* wkupaon_7xx_pwrdm: Wake-up power domain */
145static struct powerdomain wkupaon_7xx_pwrdm = {
146 .name = "wkupaon_pwrdm",
147 .prcm_offs = DRA7XX_PRM_WKUPAON_INST,
148 .prcm_partition = DRA7XX_PRM_PARTITION,
149 .pwrsts = PWRSTS_ON,
150 .banks = 1,
151 .pwrsts_mem_ret = {
152 },
153 .pwrsts_mem_on = {
154 [0] = PWRSTS_ON, /* wkup_bank */
155 },
156};
157
158/* core_7xx_pwrdm: CORE power domain */
159static struct powerdomain core_7xx_pwrdm = {
160 .name = "core_pwrdm",
161 .prcm_offs = DRA7XX_PRM_CORE_INST,
162 .prcm_partition = DRA7XX_PRM_PARTITION,
163 .pwrsts = PWRSTS_RET_ON,
164 .pwrsts_logic_ret = PWRSTS_OFF_RET,
165 .banks = 5,
166 .pwrsts_mem_ret = {
167 [0] = PWRSTS_OFF_RET, /* core_nret_bank */
168 [1] = PWRSTS_OFF_RET, /* core_ocmram */
169 [2] = PWRSTS_OFF_RET, /* core_other_bank */
170 [3] = PWRSTS_OFF_RET, /* ipu_l2ram */
171 [4] = PWRSTS_OFF_RET, /* ipu_unicache */
172 },
173 .pwrsts_mem_on = {
174 [0] = PWRSTS_OFF_RET, /* core_nret_bank */
175 [1] = PWRSTS_OFF_RET, /* core_ocmram */
176 [2] = PWRSTS_OFF_RET, /* core_other_bank */
177 [3] = PWRSTS_OFF_RET, /* ipu_l2ram */
178 [4] = PWRSTS_OFF_RET, /* ipu_unicache */
179 },
180 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
181};
182
183/* coreaon_7xx_pwrdm: Always ON logic that sits in VDD_CORE voltage domain */
184static struct powerdomain coreaon_7xx_pwrdm = {
185 .name = "coreaon_pwrdm",
186 .prcm_offs = DRA7XX_PRM_COREAON_INST,
187 .prcm_partition = DRA7XX_PRM_PARTITION,
188 .pwrsts = PWRSTS_ON,
189};
190
191/* cpu0_7xx_pwrdm: MPU0 processor and Neon coprocessor power domain */
192static struct powerdomain cpu0_7xx_pwrdm = {
193 .name = "cpu0_pwrdm",
194 .prcm_offs = DRA7XX_MPU_PRCM_PRM_C0_INST,
195 .prcm_partition = DRA7XX_MPU_PRCM_PARTITION,
196 .pwrsts = PWRSTS_OFF_RET_ON,
197 .pwrsts_logic_ret = PWRSTS_OFF_RET,
198 .banks = 1,
199 .pwrsts_mem_ret = {
200 [0] = PWRSTS_OFF_RET, /* cpu0_l1 */
201 },
202 .pwrsts_mem_on = {
203 [0] = PWRSTS_ON, /* cpu0_l1 */
204 },
205};
206
207/* cpu1_7xx_pwrdm: MPU1 processor and Neon coprocessor power domain */
208static struct powerdomain cpu1_7xx_pwrdm = {
209 .name = "cpu1_pwrdm",
210 .prcm_offs = DRA7XX_MPU_PRCM_PRM_C1_INST,
211 .prcm_partition = DRA7XX_MPU_PRCM_PARTITION,
212 .pwrsts = PWRSTS_OFF_RET_ON,
213 .pwrsts_logic_ret = PWRSTS_OFF_RET,
214 .banks = 1,
215 .pwrsts_mem_ret = {
216 [0] = PWRSTS_OFF_RET, /* cpu1_l1 */
217 },
218 .pwrsts_mem_on = {
219 [0] = PWRSTS_ON, /* cpu1_l1 */
220 },
221};
222
223/* vpe_7xx_pwrdm: */
224static struct powerdomain vpe_7xx_pwrdm = {
225 .name = "vpe_pwrdm",
226 .prcm_offs = DRA7XX_PRM_VPE_INST,
227 .prcm_partition = DRA7XX_PRM_PARTITION,
228 .pwrsts = PWRSTS_OFF_RET_ON,
229 .pwrsts_logic_ret = PWRSTS_OFF_RET,
230 .banks = 1,
231 .pwrsts_mem_ret = {
232 [0] = PWRSTS_OFF_RET, /* vpe_bank */
233 },
234 .pwrsts_mem_on = {
235 [0] = PWRSTS_OFF_RET, /* vpe_bank */
236 },
237 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
238};
239
240/* mpu_7xx_pwrdm: Modena processor and the Neon coprocessor power domain */
241static struct powerdomain mpu_7xx_pwrdm = {
242 .name = "mpu_pwrdm",
243 .prcm_offs = DRA7XX_PRM_MPU_INST,
244 .prcm_partition = DRA7XX_PRM_PARTITION,
245 .pwrsts = PWRSTS_RET_ON,
246 .pwrsts_logic_ret = PWRSTS_OFF_RET,
247 .banks = 2,
248 .pwrsts_mem_ret = {
249 [0] = PWRSTS_OFF_RET, /* mpu_l2 */
250 [1] = PWRSTS_RET, /* mpu_ram */
251 },
252 .pwrsts_mem_on = {
253 [0] = PWRSTS_OFF_RET, /* mpu_l2 */
254 [1] = PWRSTS_OFF_RET, /* mpu_ram */
255 },
256};
257
258/* l3init_7xx_pwrdm: L3 initators pheripherals power domain */
259static struct powerdomain l3init_7xx_pwrdm = {
260 .name = "l3init_pwrdm",
261 .prcm_offs = DRA7XX_PRM_L3INIT_INST,
262 .prcm_partition = DRA7XX_PRM_PARTITION,
263 .pwrsts = PWRSTS_RET_ON,
264 .pwrsts_logic_ret = PWRSTS_OFF_RET,
265 .banks = 3,
266 .pwrsts_mem_ret = {
267 [0] = PWRSTS_OFF_RET, /* gmac_bank */
268 [1] = PWRSTS_OFF_RET, /* l3init_bank1 */
269 [2] = PWRSTS_OFF_RET, /* l3init_bank2 */
270 },
271 .pwrsts_mem_on = {
272 [0] = PWRSTS_OFF_RET, /* gmac_bank */
273 [1] = PWRSTS_OFF_RET, /* l3init_bank1 */
274 [2] = PWRSTS_OFF_RET, /* l3init_bank2 */
275 },
276 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
277};
278
279/* eve3_7xx_pwrdm: */
280static struct powerdomain eve3_7xx_pwrdm = {
281 .name = "eve3_pwrdm",
282 .prcm_offs = DRA7XX_PRM_EVE3_INST,
283 .prcm_partition = DRA7XX_PRM_PARTITION,
284 .pwrsts = PWRSTS_OFF_ON,
285 .banks = 1,
286 .pwrsts_mem_ret = {
287 [0] = PWRSTS_OFF_RET, /* eve3_bank */
288 },
289 .pwrsts_mem_on = {
290 [0] = PWRSTS_OFF_RET, /* eve3_bank */
291 },
292 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
293};
294
295/* emu_7xx_pwrdm: Emulation power domain */
296static struct powerdomain emu_7xx_pwrdm = {
297 .name = "emu_pwrdm",
298 .prcm_offs = DRA7XX_PRM_EMU_INST,
299 .prcm_partition = DRA7XX_PRM_PARTITION,
300 .pwrsts = PWRSTS_OFF_ON,
301 .banks = 1,
302 .pwrsts_mem_ret = {
303 [0] = PWRSTS_OFF_RET, /* emu_bank */
304 },
305 .pwrsts_mem_on = {
306 [0] = PWRSTS_OFF_RET, /* emu_bank */
307 },
308};
309
310/* dsp2_7xx_pwrdm: */
311static struct powerdomain dsp2_7xx_pwrdm = {
312 .name = "dsp2_pwrdm",
313 .prcm_offs = DRA7XX_PRM_DSP2_INST,
314 .prcm_partition = DRA7XX_PRM_PARTITION,
315 .pwrsts = PWRSTS_OFF_ON,
316 .banks = 3,
317 .pwrsts_mem_ret = {
318 [0] = PWRSTS_OFF_RET, /* dsp2_edma */
319 [1] = PWRSTS_OFF_RET, /* dsp2_l1 */
320 [2] = PWRSTS_OFF_RET, /* dsp2_l2 */
321 },
322 .pwrsts_mem_on = {
323 [0] = PWRSTS_OFF_RET, /* dsp2_edma */
324 [1] = PWRSTS_OFF_RET, /* dsp2_l1 */
325 [2] = PWRSTS_OFF_RET, /* dsp2_l2 */
326 },
327 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
328};
329
330/* dsp1_7xx_pwrdm: Tesla processor power domain */
331static struct powerdomain dsp1_7xx_pwrdm = {
332 .name = "dsp1_pwrdm",
333 .prcm_offs = DRA7XX_PRM_DSP1_INST,
334 .prcm_partition = DRA7XX_PRM_PARTITION,
335 .pwrsts = PWRSTS_OFF_ON,
336 .banks = 3,
337 .pwrsts_mem_ret = {
338 [0] = PWRSTS_OFF_RET, /* dsp1_edma */
339 [1] = PWRSTS_OFF_RET, /* dsp1_l1 */
340 [2] = PWRSTS_OFF_RET, /* dsp1_l2 */
341 },
342 .pwrsts_mem_on = {
343 [0] = PWRSTS_OFF_RET, /* dsp1_edma */
344 [1] = PWRSTS_OFF_RET, /* dsp1_l1 */
345 [2] = PWRSTS_OFF_RET, /* dsp1_l2 */
346 },
347 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
348};
349
350/* cam_7xx_pwrdm: Camera subsystem power domain */
351static struct powerdomain cam_7xx_pwrdm = {
352 .name = "cam_pwrdm",
353 .prcm_offs = DRA7XX_PRM_CAM_INST,
354 .prcm_partition = DRA7XX_PRM_PARTITION,
355 .pwrsts = PWRSTS_OFF_ON,
356 .banks = 1,
357 .pwrsts_mem_ret = {
358 [0] = PWRSTS_OFF_RET, /* vip_bank */
359 },
360 .pwrsts_mem_on = {
361 [0] = PWRSTS_OFF_RET, /* vip_bank */
362 },
363 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
364};
365
366/* eve4_7xx_pwrdm: */
367static struct powerdomain eve4_7xx_pwrdm = {
368 .name = "eve4_pwrdm",
369 .prcm_offs = DRA7XX_PRM_EVE4_INST,
370 .prcm_partition = DRA7XX_PRM_PARTITION,
371 .pwrsts = PWRSTS_OFF_ON,
372 .banks = 1,
373 .pwrsts_mem_ret = {
374 [0] = PWRSTS_OFF_RET, /* eve4_bank */
375 },
376 .pwrsts_mem_on = {
377 [0] = PWRSTS_OFF_RET, /* eve4_bank */
378 },
379 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
380};
381
382/* eve2_7xx_pwrdm: */
383static struct powerdomain eve2_7xx_pwrdm = {
384 .name = "eve2_pwrdm",
385 .prcm_offs = DRA7XX_PRM_EVE2_INST,
386 .prcm_partition = DRA7XX_PRM_PARTITION,
387 .pwrsts = PWRSTS_OFF_ON,
388 .banks = 1,
389 .pwrsts_mem_ret = {
390 [0] = PWRSTS_OFF_RET, /* eve2_bank */
391 },
392 .pwrsts_mem_on = {
393 [0] = PWRSTS_OFF_RET, /* eve2_bank */
394 },
395 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
396};
397
398/* eve1_7xx_pwrdm: */
399static struct powerdomain eve1_7xx_pwrdm = {
400 .name = "eve1_pwrdm",
401 .prcm_offs = DRA7XX_PRM_EVE1_INST,
402 .prcm_partition = DRA7XX_PRM_PARTITION,
403 .pwrsts = PWRSTS_OFF_ON,
404 .banks = 1,
405 .pwrsts_mem_ret = {
406 [0] = PWRSTS_OFF_RET, /* eve1_bank */
407 },
408 .pwrsts_mem_on = {
409 [0] = PWRSTS_OFF_RET, /* eve1_bank */
410 },
411 .flags = PWRDM_HAS_LOWPOWERSTATECHANGE,
412};
413
414/*
415 * The following power domains are not under SW control
416 *
417 * mpuaon
418 * mmaon
419 */
420
421/* As powerdomains are added or removed above, this list must also be changed */
422static struct powerdomain *powerdomains_dra7xx[] __initdata = {
423 &iva_7xx_pwrdm,
424 &rtc_7xx_pwrdm,
425 &custefuse_7xx_pwrdm,
426 &ipu_7xx_pwrdm,
427 &dss_7xx_pwrdm,
428 &l4per_7xx_pwrdm,
429 &gpu_7xx_pwrdm,
430 &wkupaon_7xx_pwrdm,
431 &core_7xx_pwrdm,
432 &coreaon_7xx_pwrdm,
433 &cpu0_7xx_pwrdm,
434 &cpu1_7xx_pwrdm,
435 &vpe_7xx_pwrdm,
436 &mpu_7xx_pwrdm,
437 &l3init_7xx_pwrdm,
438 &eve3_7xx_pwrdm,
439 &emu_7xx_pwrdm,
440 &dsp2_7xx_pwrdm,
441 &dsp1_7xx_pwrdm,
442 &cam_7xx_pwrdm,
443 &eve4_7xx_pwrdm,
444 &eve2_7xx_pwrdm,
445 &eve1_7xx_pwrdm,
446 NULL
447};
448
449void __init dra7xx_powerdomains_init(void)
450{
451 pwrdm_register_platform_funcs(&omap4_pwrdm_operations);
452 pwrdm_register_pwrdms(powerdomains_dra7xx);
453 pwrdm_complete_init();
454}
diff --git a/arch/arm/mach-omap2/prcm-common.h b/arch/arm/mach-omap2/prcm-common.h
index ff1ac4a82a04..0e841fd9498a 100644
--- a/arch/arm/mach-omap2/prcm-common.h
+++ b/arch/arm/mach-omap2/prcm-common.h
@@ -58,6 +58,7 @@
58#define TI816X_PRM_IVAHD1_MOD 0x0d00 58#define TI816X_PRM_IVAHD1_MOD 0x0d00
59#define TI816X_PRM_IVAHD2_MOD 0x0e00 59#define TI816X_PRM_IVAHD2_MOD 0x0e00
60#define TI816X_PRM_SGX_MOD 0x0f00 60#define TI816X_PRM_SGX_MOD 0x0f00
61#define TI81XX_PRM_ALWON_MOD 0x1800
61 62
62/* 24XX register bits shared between CM & PRM registers */ 63/* 24XX register bits shared between CM & PRM registers */
63 64
diff --git a/arch/arm/mach-omap2/prcm44xx.h b/arch/arm/mach-omap2/prcm44xx.h
index f429cdd5a118..4fea2cfdf2c3 100644
--- a/arch/arm/mach-omap2/prcm44xx.h
+++ b/arch/arm/mach-omap2/prcm44xx.h
@@ -38,6 +38,11 @@
38#define OMAP54XX_SCRM_PARTITION 4 38#define OMAP54XX_SCRM_PARTITION 4
39#define OMAP54XX_PRCM_MPU_PARTITION 5 39#define OMAP54XX_PRCM_MPU_PARTITION 5
40 40
41#define DRA7XX_PRM_PARTITION 1
42#define DRA7XX_CM_CORE_AON_PARTITION 2
43#define DRA7XX_CM_CORE_PARTITION 3
44#define DRA7XX_MPU_PRCM_PARTITION 5
45
41/* 46/*
42 * OMAP4_MAX_PRCM_PARTITIONS: set to the highest value of the PRCM partition 47 * OMAP4_MAX_PRCM_PARTITIONS: set to the highest value of the PRCM partition
43 * IDs, plus one 48 * IDs, plus one
diff --git a/arch/arm/mach-omap2/prcm_mpu7xx.h b/arch/arm/mach-omap2/prcm_mpu7xx.h
new file mode 100644
index 000000000000..9ebb5ce0878f
--- /dev/null
+++ b/arch/arm/mach-omap2/prcm_mpu7xx.h
@@ -0,0 +1,78 @@
1/*
2 * DRA7xx PRCM MPU instance offset macros
3 *
4 * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
5 *
6 * Generated by code originally written by:
7 * Paul Walmsley (paul@pwsan.com)
8 * Rajendra Nayak (rnayak@ti.com)
9 * Benoit Cousson (b-cousson@ti.com)
10 *
11 * This file is automatically generated from the OMAP hardware databases.
12 * We respectfully ask that any modifications to this file be coordinated
13 * with the public linux-omap@vger.kernel.org mailing list and the
14 * authors above to ensure that the autogeneration scripts are kept
15 * up-to-date with the file contents.
16 *
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License version 2 as
19 * published by the Free Software Foundation.
20 */
21
22#ifndef __ARCH_ARM_MACH_OMAP2_PRCM_MPU7XX_H
23#define __ARCH_ARM_MACH_OMAP2_PRCM_MPU7XX_H
24
25#include "prcm_mpu_44xx_54xx.h"
26
27#define DRA7XX_PRCM_MPU_BASE 0x48243000
28
29#define DRA7XX_PRCM_MPU_REGADDR(inst, reg) \
30 OMAP2_L4_IO_ADDRESS(DRA7XX_PRCM_MPU_BASE + (inst) + (reg))
31
32/* MPU_PRCM instances */
33#define DRA7XX_MPU_PRCM_OCP_SOCKET_INST 0x0000
34#define DRA7XX_MPU_PRCM_DEVICE_INST 0x0200
35#define DRA7XX_MPU_PRCM_PRM_C0_INST 0x0400
36#define DRA7XX_MPU_PRCM_CM_C0_INST 0x0600
37#define DRA7XX_MPU_PRCM_PRM_C1_INST 0x0800
38#define DRA7XX_MPU_PRCM_CM_C1_INST 0x0a00
39
40/* PRCM_MPU clockdomain register offsets (from instance start) */
41#define DRA7XX_MPU_PRCM_CM_C0_CPU0_CDOFFS 0x0000
42#define DRA7XX_MPU_PRCM_CM_C1_CPU1_CDOFFS 0x0000
43
44
45/* MPU_PRCM */
46
47/* MPU_PRCM.PRCM_MPU_OCP_SOCKET register offsets */
48#define DRA7XX_REVISION_PRCM_MPU_OFFSET 0x0000
49
50/* MPU_PRCM.PRCM_MPU_DEVICE register offsets */
51#define DRA7XX_PRM_FRAC_INCREMENTER_NUMERATOR_OFFSET 0x0010
52#define DRA7XX_PRM_FRAC_INCREMENTER_DENUMERATOR_RELOAD_OFFSET 0x0014
53
54/* MPU_PRCM.PRCM_MPU_PRM_C0 register offsets */
55#define DRA7XX_PM_CPU0_PWRSTCTRL_OFFSET 0x0000
56#define DRA7XX_PM_CPU0_PWRSTST_OFFSET 0x0004
57#define DRA7XX_RM_CPU0_CPU0_RSTCTRL_OFFSET 0x0010
58#define DRA7XX_RM_CPU0_CPU0_RSTST_OFFSET 0x0014
59#define DRA7XX_RM_CPU0_CPU0_CONTEXT_OFFSET 0x0024
60
61/* MPU_PRCM.PRCM_MPU_CM_C0 register offsets */
62#define DRA7XX_CM_CPU0_CLKSTCTRL_OFFSET 0x0000
63#define DRA7XX_CM_CPU0_CPU0_CLKCTRL_OFFSET 0x0020
64#define DRA7XX_CM_CPU0_CPU0_CLKCTRL DRA7XX_MPU_PRCM_REGADDR(DRA7XX_MPU_PRCM_CM_C0_INST, 0x0020)
65
66/* MPU_PRCM.PRCM_MPU_PRM_C1 register offsets */
67#define DRA7XX_PM_CPU1_PWRSTCTRL_OFFSET 0x0000
68#define DRA7XX_PM_CPU1_PWRSTST_OFFSET 0x0004
69#define DRA7XX_RM_CPU1_CPU1_RSTCTRL_OFFSET 0x0010
70#define DRA7XX_RM_CPU1_CPU1_RSTST_OFFSET 0x0014
71#define DRA7XX_RM_CPU1_CPU1_CONTEXT_OFFSET 0x0024
72
73/* MPU_PRCM.PRCM_MPU_CM_C1 register offsets */
74#define DRA7XX_CM_CPU1_CLKSTCTRL_OFFSET 0x0000
75#define DRA7XX_CM_CPU1_CPU1_CLKCTRL_OFFSET 0x0020
76#define DRA7XX_CM_CPU1_CPU1_CLKCTRL DRA7XX_MPU_PRCM_REGADDR(DRA7XX_MPU_PRCM_CM_C1_INST, 0x0020)
77
78#endif
diff --git a/arch/arm/mach-omap2/prm-regbits-24xx.h b/arch/arm/mach-omap2/prm-regbits-24xx.h
index 91aa5106d637..37fc905c9636 100644
--- a/arch/arm/mach-omap2/prm-regbits-24xx.h
+++ b/arch/arm/mach-omap2/prm-regbits-24xx.h
@@ -16,274 +16,27 @@
16 16
17#include "prm2xxx.h" 17#include "prm2xxx.h"
18 18
19/* Bits shared between registers */
20
21/* PRCM_IRQSTATUS_MPU, PM_IRQSTATUS_DSP, PRCM_IRQSTATUS_IVA shared bits */
22#define OMAP24XX_VOLTTRANS_ST_MASK (1 << 2)
23#define OMAP24XX_WKUP2_ST_MASK (1 << 1)
24#define OMAP24XX_WKUP1_ST_MASK (1 << 0)
25
26/* PRCM_IRQENABLE_MPU, PM_IRQENABLE_DSP, PRCM_IRQENABLE_IVA shared bits */
27#define OMAP24XX_VOLTTRANS_EN_MASK (1 << 2)
28#define OMAP24XX_WKUP2_EN_MASK (1 << 1)
29#define OMAP24XX_WKUP1_EN_MASK (1 << 0)
30
31/* PM_WKDEP_GFX, PM_WKDEP_MPU, PM_WKDEP_DSP, PM_WKDEP_MDM shared bits */
32#define OMAP24XX_EN_MPU_SHIFT 1
33#define OMAP24XX_EN_MPU_MASK (1 << 1)
34#define OMAP24XX_EN_CORE_SHIFT 0 19#define OMAP24XX_EN_CORE_SHIFT 0
35#define OMAP24XX_EN_CORE_MASK (1 << 0)
36
37/*
38 * PM_PWSTCTRL_MPU, PM_PWSTCTRL_GFX, PM_PWSTCTRL_DSP, PM_PWSTCTRL_MDM
39 * shared bits
40 */
41#define OMAP24XX_MEMONSTATE_SHIFT 10
42#define OMAP24XX_MEMONSTATE_MASK (0x3 << 10)
43#define OMAP24XX_MEMRETSTATE_MASK (1 << 3)
44
45/* PM_PWSTCTRL_GFX, PM_PWSTCTRL_DSP, PM_PWSTCTRL_MDM shared bits */
46#define OMAP24XX_FORCESTATE_MASK (1 << 18) 20#define OMAP24XX_FORCESTATE_MASK (1 << 18)
47
48/*
49 * PM_PWSTST_CORE, PM_PWSTST_GFX, PM_PWSTST_MPU, PM_PWSTST_DSP,
50 * PM_PWSTST_MDM shared bits
51 */
52#define OMAP24XX_CLKACTIVITY_MASK (1 << 19)
53
54/* PM_PWSTST_MPU, PM_PWSTST_CORE, PM_PWSTST_DSP shared bits */
55#define OMAP24XX_LASTSTATEENTERED_SHIFT 4
56#define OMAP24XX_LASTSTATEENTERED_MASK (0x3 << 4)
57
58/* PM_PWSTST_MPU and PM_PWSTST_DSP shared bits */
59#define OMAP2430_MEMSTATEST_SHIFT 10
60#define OMAP2430_MEMSTATEST_MASK (0x3 << 10)
61
62/* PM_PWSTST_GFX, PM_PWSTST_DSP, PM_PWSTST_MDM shared bits */
63#define OMAP24XX_POWERSTATEST_SHIFT 0
64#define OMAP24XX_POWERSTATEST_MASK (0x3 << 0)
65
66
67/* Bits specific to each register */
68
69/* PRCM_REVISION */
70#define OMAP24XX_REV_SHIFT 0
71#define OMAP24XX_REV_MASK (0xff << 0)
72
73/* PRCM_SYSCONFIG */
74#define OMAP24XX_AUTOIDLE_MASK (1 << 0) 21#define OMAP24XX_AUTOIDLE_MASK (1 << 0)
75
76/* PRCM_IRQSTATUS_MPU specific bits */
77#define OMAP2430_DPLL_RECAL_ST_MASK (1 << 6)
78#define OMAP24XX_TRANSITION_ST_MASK (1 << 5)
79#define OMAP24XX_EVGENOFF_ST_MASK (1 << 4)
80#define OMAP24XX_EVGENON_ST_MASK (1 << 3)
81
82/* PRCM_IRQENABLE_MPU specific bits */
83#define OMAP2430_DPLL_RECAL_EN_MASK (1 << 6)
84#define OMAP24XX_TRANSITION_EN_MASK (1 << 5)
85#define OMAP24XX_EVGENOFF_EN_MASK (1 << 4)
86#define OMAP24XX_EVGENON_EN_MASK (1 << 3)
87
88/* PRCM_VOLTCTRL */
89#define OMAP24XX_AUTO_EXTVOLT_MASK (1 << 15) 22#define OMAP24XX_AUTO_EXTVOLT_MASK (1 << 15)
90#define OMAP24XX_FORCE_EXTVOLT_MASK (1 << 14)
91#define OMAP24XX_SETOFF_LEVEL_SHIFT 12 23#define OMAP24XX_SETOFF_LEVEL_SHIFT 12
92#define OMAP24XX_SETOFF_LEVEL_MASK (0x3 << 12)
93#define OMAP24XX_MEMRETCTRL_MASK (1 << 8) 24#define OMAP24XX_MEMRETCTRL_MASK (1 << 8)
94#define OMAP24XX_SETRET_LEVEL_SHIFT 6 25#define OMAP24XX_SETRET_LEVEL_SHIFT 6
95#define OMAP24XX_SETRET_LEVEL_MASK (0x3 << 6)
96#define OMAP24XX_VOLT_LEVEL_SHIFT 0 26#define OMAP24XX_VOLT_LEVEL_SHIFT 0
97#define OMAP24XX_VOLT_LEVEL_MASK (0x3 << 0)
98
99/* PRCM_VOLTST */
100#define OMAP24XX_ST_VOLTLEVEL_SHIFT 0
101#define OMAP24XX_ST_VOLTLEVEL_MASK (0x3 << 0)
102
103/* PRCM_CLKSRC_CTRL specific bits */
104
105/* PRCM_CLKOUT_CTRL */
106#define OMAP2420_CLKOUT2_EN_SHIFT 15 27#define OMAP2420_CLKOUT2_EN_SHIFT 15
107#define OMAP2420_CLKOUT2_EN_MASK (1 << 15)
108#define OMAP2420_CLKOUT2_DIV_SHIFT 11 28#define OMAP2420_CLKOUT2_DIV_SHIFT 11
109#define OMAP2420_CLKOUT2_DIV_MASK (0x7 << 11)
110#define OMAP2420_CLKOUT2_DIV_WIDTH 3 29#define OMAP2420_CLKOUT2_DIV_WIDTH 3
111#define OMAP2420_CLKOUT2_SOURCE_SHIFT 8
112#define OMAP2420_CLKOUT2_SOURCE_MASK (0x3 << 8) 30#define OMAP2420_CLKOUT2_SOURCE_MASK (0x3 << 8)
113#define OMAP24XX_CLKOUT_EN_SHIFT 7 31#define OMAP24XX_CLKOUT_EN_SHIFT 7
114#define OMAP24XX_CLKOUT_EN_MASK (1 << 7)
115#define OMAP24XX_CLKOUT_DIV_SHIFT 3 32#define OMAP24XX_CLKOUT_DIV_SHIFT 3
116#define OMAP24XX_CLKOUT_DIV_MASK (0x7 << 3)
117#define OMAP24XX_CLKOUT_DIV_WIDTH 3 33#define OMAP24XX_CLKOUT_DIV_WIDTH 3
118#define OMAP24XX_CLKOUT_SOURCE_SHIFT 0
119#define OMAP24XX_CLKOUT_SOURCE_MASK (0x3 << 0) 34#define OMAP24XX_CLKOUT_SOURCE_MASK (0x3 << 0)
120
121/* PRCM_CLKEMUL_CTRL */
122#define OMAP24XX_EMULATION_EN_SHIFT 0 35#define OMAP24XX_EMULATION_EN_SHIFT 0
123#define OMAP24XX_EMULATION_EN_MASK (1 << 0)
124
125/* PRCM_CLKCFG_CTRL */
126#define OMAP24XX_VALID_CONFIG_MASK (1 << 0)
127
128/* PRCM_CLKCFG_STATUS */
129#define OMAP24XX_CONFIG_STATUS_MASK (1 << 0)
130
131/* PRCM_VOLTSETUP specific bits */
132
133/* PRCM_CLKSSETUP specific bits */
134
135/* PRCM_POLCTRL */
136#define OMAP2420_CLKOUT2_POL_MASK (1 << 10)
137#define OMAP24XX_CLKOUT_POL_MASK (1 << 9)
138#define OMAP24XX_CLKREQ_POL_MASK (1 << 8)
139#define OMAP2430_USE_POWEROK_MASK (1 << 2)
140#define OMAP2430_POWEROK_POL_MASK (1 << 1)
141#define OMAP24XX_EXTVOL_POL_MASK (1 << 0)
142
143/* RM_RSTST_MPU specific bits */
144/* 2430 calls GLOBALWMPU_RST "GLOBALWARM_RST" instead */
145
146/* PM_WKDEP_MPU specific bits */
147#define OMAP2430_PM_WKDEP_MPU_EN_MDM_SHIFT 5 36#define OMAP2430_PM_WKDEP_MPU_EN_MDM_SHIFT 5
148#define OMAP2430_PM_WKDEP_MPU_EN_MDM_MASK (1 << 5)
149#define OMAP24XX_PM_WKDEP_MPU_EN_DSP_SHIFT 2 37#define OMAP24XX_PM_WKDEP_MPU_EN_DSP_SHIFT 2
150#define OMAP24XX_PM_WKDEP_MPU_EN_DSP_MASK (1 << 2)
151
152/* PM_EVGENCTRL_MPU specific bits */
153
154/* PM_EVEGENONTIM_MPU specific bits */
155
156/* PM_EVEGENOFFTIM_MPU specific bits */
157
158/* PM_PWSTCTRL_MPU specific bits */
159#define OMAP2430_FORCESTATE_MASK (1 << 18)
160
161/* PM_PWSTST_MPU specific bits */
162/* INTRANSITION, CLKACTIVITY, POWERSTATE, MEMSTATEST are 2430 only */
163
164/* PM_WKEN1_CORE specific bits */
165
166/* PM_WKEN2_CORE specific bits */
167
168/* PM_WKST1_CORE specific bits*/
169
170/* PM_WKST2_CORE specific bits */
171
172/* PM_WKDEP_CORE specific bits*/
173#define OMAP2430_PM_WKDEP_CORE_EN_MDM_MASK (1 << 5)
174#define OMAP24XX_PM_WKDEP_CORE_EN_GFX_MASK (1 << 3)
175#define OMAP24XX_PM_WKDEP_CORE_EN_DSP_MASK (1 << 2)
176
177/* PM_PWSTCTRL_CORE specific bits */
178#define OMAP24XX_MEMORYCHANGE_MASK (1 << 20)
179#define OMAP24XX_MEM3ONSTATE_SHIFT 14
180#define OMAP24XX_MEM3ONSTATE_MASK (0x3 << 14)
181#define OMAP24XX_MEM2ONSTATE_SHIFT 12
182#define OMAP24XX_MEM2ONSTATE_MASK (0x3 << 12)
183#define OMAP24XX_MEM1ONSTATE_SHIFT 10
184#define OMAP24XX_MEM1ONSTATE_MASK (0x3 << 10)
185#define OMAP24XX_MEM3RETSTATE_MASK (1 << 5)
186#define OMAP24XX_MEM2RETSTATE_MASK (1 << 4)
187#define OMAP24XX_MEM1RETSTATE_MASK (1 << 3)
188
189/* PM_PWSTST_CORE specific bits */
190#define OMAP24XX_MEM3STATEST_SHIFT 14
191#define OMAP24XX_MEM3STATEST_MASK (0x3 << 14)
192#define OMAP24XX_MEM2STATEST_SHIFT 12
193#define OMAP24XX_MEM2STATEST_MASK (0x3 << 12)
194#define OMAP24XX_MEM1STATEST_SHIFT 10
195#define OMAP24XX_MEM1STATEST_MASK (0x3 << 10)
196
197/* RM_RSTCTRL_GFX */
198#define OMAP24XX_GFX_RST_MASK (1 << 0)
199
200/* RM_RSTST_GFX specific bits */
201#define OMAP24XX_GFX_SW_RST_MASK (1 << 4)
202
203/* PM_PWSTCTRL_GFX specific bits */
204
205/* PM_WKDEP_GFX specific bits */
206/* 2430 often calls EN_WAKEUP "EN_WKUP" */
207
208/* RM_RSTCTRL_WKUP specific bits */
209
210/* RM_RSTTIME_WKUP specific bits */
211
212/* RM_RSTST_WKUP specific bits */
213/* 2430 calls EXTWMPU_RST "EXTWARM_RST" and GLOBALWMPU_RST "GLOBALWARM_RST" */
214#define OMAP24XX_EXTWMPU_RST_SHIFT 6 38#define OMAP24XX_EXTWMPU_RST_SHIFT 6
215#define OMAP24XX_EXTWMPU_RST_MASK (1 << 6)
216#define OMAP24XX_SECU_WD_RST_SHIFT 5 39#define OMAP24XX_SECU_WD_RST_SHIFT 5
217#define OMAP24XX_SECU_WD_RST_MASK (1 << 5)
218#define OMAP24XX_MPU_WD_RST_SHIFT 4 40#define OMAP24XX_MPU_WD_RST_SHIFT 4
219#define OMAP24XX_MPU_WD_RST_MASK (1 << 4)
220#define OMAP24XX_SECU_VIOL_RST_SHIFT 3 41#define OMAP24XX_SECU_VIOL_RST_SHIFT 3
221#define OMAP24XX_SECU_VIOL_RST_MASK (1 << 3)
222
223/* PM_WKEN_WKUP specific bits */
224
225/* PM_WKST_WKUP specific bits */
226
227/* RM_RSTCTRL_DSP */
228#define OMAP2420_RST_IVA_MASK (1 << 8)
229#define OMAP24XX_RST2_DSP_MASK (1 << 1)
230#define OMAP24XX_RST1_DSP_MASK (1 << 0)
231
232/* RM_RSTST_DSP specific bits */
233/* 2430 calls GLOBALWMPU_RST "GLOBALWARM_RST" */
234#define OMAP2420_IVA_SW_RST_MASK (1 << 8)
235#define OMAP24XX_DSP_SW_RST2_MASK (1 << 5)
236#define OMAP24XX_DSP_SW_RST1_MASK (1 << 4)
237
238/* PM_WKDEP_DSP specific bits */
239
240/* PM_PWSTCTRL_DSP specific bits */
241/* 2430 only: MEMONSTATE, MEMRETSTATE */
242#define OMAP2420_MEMIONSTATE_SHIFT 12
243#define OMAP2420_MEMIONSTATE_MASK (0x3 << 12)
244#define OMAP2420_MEMIRETSTATE_MASK (1 << 4)
245
246/* PM_PWSTST_DSP specific bits */
247/* MEMSTATEST is 2430 only */
248#define OMAP2420_MEMISTATEST_SHIFT 12
249#define OMAP2420_MEMISTATEST_MASK (0x3 << 12)
250
251/* PRCM_IRQSTATUS_DSP specific bits */
252
253/* PRCM_IRQENABLE_DSP specific bits */
254
255/* RM_RSTCTRL_MDM */
256/* 2430 only */
257#define OMAP2430_PWRON1_MDM_MASK (1 << 1)
258#define OMAP2430_RST1_MDM_MASK (1 << 0)
259
260/* RM_RSTST_MDM specific bits */
261/* 2430 only */
262#define OMAP2430_MDM_SECU_VIOL_MASK (1 << 6)
263#define OMAP2430_MDM_SW_PWRON1_MASK (1 << 5)
264#define OMAP2430_MDM_SW_RST1_MASK (1 << 4)
265
266/* PM_WKEN_MDM */
267/* 2430 only */
268#define OMAP2430_PM_WKEN_MDM_EN_MDM_MASK (1 << 0)
269
270/* PM_WKST_MDM specific bits */
271/* 2430 only */
272
273/* PM_WKDEP_MDM specific bits */
274/* 2430 only */
275
276/* PM_PWSTCTRL_MDM specific bits */
277/* 2430 only */
278#define OMAP2430_KILLDOMAINWKUP_MASK (1 << 19)
279
280/* PM_PWSTST_MDM specific bits */
281/* 2430 only */
282
283/* PRCM_IRQSTATUS_IVA */
284/* 2420 only */
285
286/* PRCM_IRQENABLE_IVA */
287/* 2420 only */
288
289#endif 42#endif
diff --git a/arch/arm/mach-omap2/prm-regbits-33xx.h b/arch/arm/mach-omap2/prm-regbits-33xx.h
index 0221b5c20e87..84feecee4fe6 100644
--- a/arch/arm/mach-omap2/prm-regbits-33xx.h
+++ b/arch/arm/mach-omap2/prm-regbits-33xx.h
@@ -18,340 +18,35 @@
18 18
19#include "prm.h" 19#include "prm.h"
20 20
21/* Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_MPU_SETUP */
22#define AM33XX_ABBOFF_ACT_EXPORT_SHIFT 1
23#define AM33XX_ABBOFF_ACT_EXPORT_MASK (1 << 1)
24
25/* Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_MPU_SETUP */
26#define AM33XX_ABBOFF_SLEEP_EXPORT_SHIFT 2
27#define AM33XX_ABBOFF_SLEEP_EXPORT_MASK (1 << 2)
28
29/* Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_MPU_SETUP */
30#define AM33XX_AIPOFF_SHIFT 8
31#define AM33XX_AIPOFF_MASK (1 << 8)
32
33/* Used by PM_WKUP_PWRSTST */
34#define AM33XX_DEBUGSS_MEM_STATEST_SHIFT 17
35#define AM33XX_DEBUGSS_MEM_STATEST_MASK (0x3 << 17)
36
37/* Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_MPU_SETUP */
38#define AM33XX_DISABLE_RTA_EXPORT_SHIFT 0
39#define AM33XX_DISABLE_RTA_EXPORT_MASK (1 << 0)
40
41/* Used by PRM_IRQENABLE_M3, PRM_IRQENABLE_MPU */
42#define AM33XX_DPLL_CORE_RECAL_EN_SHIFT 12
43#define AM33XX_DPLL_CORE_RECAL_EN_MASK (1 << 12)
44
45/* Used by PRM_IRQSTATUS_M3, PRM_IRQSTATUS_MPU */
46#define AM33XX_DPLL_CORE_RECAL_ST_SHIFT 12
47#define AM33XX_DPLL_CORE_RECAL_ST_MASK (1 << 12)
48
49/* Used by PRM_IRQENABLE_M3, PRM_IRQENABLE_MPU */
50#define AM33XX_DPLL_DDR_RECAL_EN_SHIFT 14
51#define AM33XX_DPLL_DDR_RECAL_EN_MASK (1 << 14)
52
53/* Used by PRM_IRQSTATUS_M3, PRM_IRQSTATUS_MPU */
54#define AM33XX_DPLL_DDR_RECAL_ST_SHIFT 14
55#define AM33XX_DPLL_DDR_RECAL_ST_MASK (1 << 14)
56
57/* Used by PRM_IRQENABLE_M3, PRM_IRQENABLE_MPU */
58#define AM33XX_DPLL_DISP_RECAL_EN_SHIFT 15
59#define AM33XX_DPLL_DISP_RECAL_EN_MASK (1 << 15)
60
61/* Used by PRM_IRQSTATUS_M3, PRM_IRQSTATUS_MPU */
62#define AM33XX_DPLL_DISP_RECAL_ST_SHIFT 13
63#define AM33XX_DPLL_DISP_RECAL_ST_MASK (1 << 13)
64
65/* Used by PRM_IRQENABLE_M3, PRM_IRQENABLE_MPU */
66#define AM33XX_DPLL_MPU_RECAL_EN_SHIFT 11
67#define AM33XX_DPLL_MPU_RECAL_EN_MASK (1 << 11)
68
69/* Used by PRM_IRQSTATUS_M3, PRM_IRQSTATUS_MPU */
70#define AM33XX_DPLL_MPU_RECAL_ST_SHIFT 11
71#define AM33XX_DPLL_MPU_RECAL_ST_MASK (1 << 11)
72
73/* Used by PRM_IRQENABLE_M3, PRM_IRQENABLE_MPU */
74#define AM33XX_DPLL_PER_RECAL_EN_SHIFT 13
75#define AM33XX_DPLL_PER_RECAL_EN_MASK (1 << 13)
76
77/* Used by PRM_IRQSTATUS_M3, PRM_IRQSTATUS_MPU */
78#define AM33XX_DPLL_PER_RECAL_ST_SHIFT 15
79#define AM33XX_DPLL_PER_RECAL_ST_MASK (1 << 15)
80
81/* Used by RM_WKUP_RSTST */
82#define AM33XX_EMULATION_M3_RST_SHIFT 6
83#define AM33XX_EMULATION_M3_RST_MASK (1 << 6)
84
85/* Used by RM_MPU_RSTST */
86#define AM33XX_EMULATION_MPU_RST_SHIFT 5
87#define AM33XX_EMULATION_MPU_RST_MASK (1 << 5)
88
89/* Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_MPU_SETUP */
90#define AM33XX_ENFUNC1_EXPORT_SHIFT 3
91#define AM33XX_ENFUNC1_EXPORT_MASK (1 << 3)
92
93/* Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_MPU_SETUP */
94#define AM33XX_ENFUNC3_EXPORT_SHIFT 5
95#define AM33XX_ENFUNC3_EXPORT_MASK (1 << 5)
96
97/* Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_MPU_SETUP */
98#define AM33XX_ENFUNC4_SHIFT 6
99#define AM33XX_ENFUNC4_MASK (1 << 6)
100
101/* Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_MPU_SETUP */
102#define AM33XX_ENFUNC5_SHIFT 7
103#define AM33XX_ENFUNC5_MASK (1 << 7)
104
105/* Used by PRM_RSTST */
106#define AM33XX_EXTERNAL_WARM_RST_SHIFT 5
107#define AM33XX_EXTERNAL_WARM_RST_MASK (1 << 5)
108
109/* Used by PRM_IRQENABLE_M3, PRM_IRQENABLE_MPU */
110#define AM33XX_FORCEWKUP_EN_SHIFT 10
111#define AM33XX_FORCEWKUP_EN_MASK (1 << 10)
112
113/* Used by PRM_IRQSTATUS_M3, PRM_IRQSTATUS_MPU */
114#define AM33XX_FORCEWKUP_ST_SHIFT 10
115#define AM33XX_FORCEWKUP_ST_MASK (1 << 10)
116
117/* Used by PM_GFX_PWRSTCTRL */
118#define AM33XX_GFX_MEM_ONSTATE_SHIFT 17
119#define AM33XX_GFX_MEM_ONSTATE_MASK (0x3 << 17) 21#define AM33XX_GFX_MEM_ONSTATE_MASK (0x3 << 17)
120
121/* Used by PM_GFX_PWRSTCTRL */
122#define AM33XX_GFX_MEM_RETSTATE_SHIFT 6
123#define AM33XX_GFX_MEM_RETSTATE_MASK (1 << 6) 22#define AM33XX_GFX_MEM_RETSTATE_MASK (1 << 6)
124
125/* Used by PM_GFX_PWRSTST */
126#define AM33XX_GFX_MEM_STATEST_SHIFT 4
127#define AM33XX_GFX_MEM_STATEST_MASK (0x3 << 4) 23#define AM33XX_GFX_MEM_STATEST_MASK (0x3 << 4)
128
129/* Used by RM_GFX_RSTCTRL, RM_GFX_RSTST */
130#define AM33XX_GFX_RST_SHIFT 0
131#define AM33XX_GFX_RST_MASK (1 << 0)
132
133/* Used by PRM_RSTST */
134#define AM33XX_GLOBAL_COLD_RST_SHIFT 0
135#define AM33XX_GLOBAL_COLD_RST_MASK (1 << 0)
136
137/* Used by PRM_RSTST */
138#define AM33XX_GLOBAL_WARM_SW_RST_SHIFT 1
139#define AM33XX_GLOBAL_WARM_SW_RST_MASK (1 << 1) 24#define AM33XX_GLOBAL_WARM_SW_RST_MASK (1 << 1)
140 25#define AM33XX_RST_GLOBAL_WARM_SW_MASK (1 << 0)
141/* Used by RM_WKUP_RSTST */
142#define AM33XX_ICECRUSHER_M3_RST_SHIFT 7
143#define AM33XX_ICECRUSHER_M3_RST_MASK (1 << 7)
144
145/* Used by RM_MPU_RSTST */
146#define AM33XX_ICECRUSHER_MPU_RST_SHIFT 6
147#define AM33XX_ICECRUSHER_MPU_RST_MASK (1 << 6)
148
149/* Used by PRM_RSTST */
150#define AM33XX_ICEPICK_RST_SHIFT 9
151#define AM33XX_ICEPICK_RST_MASK (1 << 9)
152
153/* Used by RM_PER_RSTCTRL */
154#define AM33XX_PRUSS_LRST_SHIFT 1
155#define AM33XX_PRUSS_LRST_MASK (1 << 1)
156
157/* Used by PM_PER_PWRSTCTRL */
158#define AM33XX_PRUSS_MEM_ONSTATE_SHIFT 5
159#define AM33XX_PRUSS_MEM_ONSTATE_MASK (0x3 << 5) 26#define AM33XX_PRUSS_MEM_ONSTATE_MASK (0x3 << 5)
160
161/* Used by PM_PER_PWRSTCTRL */
162#define AM33XX_PRUSS_MEM_RETSTATE_SHIFT 7
163#define AM33XX_PRUSS_MEM_RETSTATE_MASK (1 << 7) 27#define AM33XX_PRUSS_MEM_RETSTATE_MASK (1 << 7)
164
165/* Used by PM_PER_PWRSTST */
166#define AM33XX_PRUSS_MEM_STATEST_SHIFT 23
167#define AM33XX_PRUSS_MEM_STATEST_MASK (0x3 << 23) 28#define AM33XX_PRUSS_MEM_STATEST_MASK (0x3 << 23)
168
169/*
170 * Used by PM_GFX_PWRSTST, PM_CEFUSE_PWRSTST, PM_PER_PWRSTST, PM_MPU_PWRSTST,
171 * PM_WKUP_PWRSTST, PM_RTC_PWRSTST
172 */
173#define AM33XX_INTRANSITION_SHIFT 20
174#define AM33XX_INTRANSITION_MASK (1 << 20)
175
176/* Used by PM_CEFUSE_PWRSTST */
177#define AM33XX_LASTPOWERSTATEENTERED_SHIFT 24 29#define AM33XX_LASTPOWERSTATEENTERED_SHIFT 24
178#define AM33XX_LASTPOWERSTATEENTERED_MASK (0x3 << 24) 30#define AM33XX_LASTPOWERSTATEENTERED_MASK (0x3 << 24)
179
180/* Used by PM_GFX_PWRSTCTRL, PM_MPU_PWRSTCTRL, PM_RTC_PWRSTCTRL */
181#define AM33XX_LOGICRETSTATE_SHIFT 2
182#define AM33XX_LOGICRETSTATE_MASK (1 << 2) 31#define AM33XX_LOGICRETSTATE_MASK (1 << 2)
183
184/* Renamed from LOGICRETSTATE Used by PM_PER_PWRSTCTRL, PM_WKUP_PWRSTCTRL */
185#define AM33XX_LOGICRETSTATE_3_3_SHIFT 3
186#define AM33XX_LOGICRETSTATE_3_3_MASK (1 << 3) 32#define AM33XX_LOGICRETSTATE_3_3_MASK (1 << 3)
187
188/*
189 * Used by PM_GFX_PWRSTST, PM_CEFUSE_PWRSTST, PM_PER_PWRSTST, PM_MPU_PWRSTST,
190 * PM_WKUP_PWRSTST, PM_RTC_PWRSTST
191 */
192#define AM33XX_LOGICSTATEST_SHIFT 2 33#define AM33XX_LOGICSTATEST_SHIFT 2
193#define AM33XX_LOGICSTATEST_MASK (1 << 2) 34#define AM33XX_LOGICSTATEST_MASK (1 << 2)
194
195/*
196 * Used by PM_GFX_PWRSTCTRL, PM_CEFUSE_PWRSTCTRL, PM_PER_PWRSTCTRL,
197 * PM_MPU_PWRSTCTRL, PM_WKUP_PWRSTCTRL, PM_RTC_PWRSTCTRL
198 */
199#define AM33XX_LOWPOWERSTATECHANGE_SHIFT 4 35#define AM33XX_LOWPOWERSTATECHANGE_SHIFT 4
200#define AM33XX_LOWPOWERSTATECHANGE_MASK (1 << 4) 36#define AM33XX_LOWPOWERSTATECHANGE_MASK (1 << 4)
201
202/* Used by PM_MPU_PWRSTCTRL */
203#define AM33XX_MPU_L1_ONSTATE_SHIFT 18
204#define AM33XX_MPU_L1_ONSTATE_MASK (0x3 << 18) 37#define AM33XX_MPU_L1_ONSTATE_MASK (0x3 << 18)
205
206/* Used by PM_MPU_PWRSTCTRL */
207#define AM33XX_MPU_L1_RETSTATE_SHIFT 22
208#define AM33XX_MPU_L1_RETSTATE_MASK (1 << 22) 38#define AM33XX_MPU_L1_RETSTATE_MASK (1 << 22)
209
210/* Used by PM_MPU_PWRSTST */
211#define AM33XX_MPU_L1_STATEST_SHIFT 6
212#define AM33XX_MPU_L1_STATEST_MASK (0x3 << 6) 39#define AM33XX_MPU_L1_STATEST_MASK (0x3 << 6)
213
214/* Used by PM_MPU_PWRSTCTRL */
215#define AM33XX_MPU_L2_ONSTATE_SHIFT 20
216#define AM33XX_MPU_L2_ONSTATE_MASK (0x3 << 20) 40#define AM33XX_MPU_L2_ONSTATE_MASK (0x3 << 20)
217
218/* Used by PM_MPU_PWRSTCTRL */
219#define AM33XX_MPU_L2_RETSTATE_SHIFT 23
220#define AM33XX_MPU_L2_RETSTATE_MASK (1 << 23) 41#define AM33XX_MPU_L2_RETSTATE_MASK (1 << 23)
221
222/* Used by PM_MPU_PWRSTST */
223#define AM33XX_MPU_L2_STATEST_SHIFT 8
224#define AM33XX_MPU_L2_STATEST_MASK (0x3 << 8) 42#define AM33XX_MPU_L2_STATEST_MASK (0x3 << 8)
225
226/* Used by PM_MPU_PWRSTCTRL */
227#define AM33XX_MPU_RAM_ONSTATE_SHIFT 16
228#define AM33XX_MPU_RAM_ONSTATE_MASK (0x3 << 16) 43#define AM33XX_MPU_RAM_ONSTATE_MASK (0x3 << 16)
229
230/* Used by PM_MPU_PWRSTCTRL */
231#define AM33XX_MPU_RAM_RETSTATE_SHIFT 24
232#define AM33XX_MPU_RAM_RETSTATE_MASK (1 << 24) 44#define AM33XX_MPU_RAM_RETSTATE_MASK (1 << 24)
233
234/* Used by PM_MPU_PWRSTST */
235#define AM33XX_MPU_RAM_STATEST_SHIFT 4
236#define AM33XX_MPU_RAM_STATEST_MASK (0x3 << 4) 45#define AM33XX_MPU_RAM_STATEST_MASK (0x3 << 4)
237
238/* Used by PRM_RSTST */
239#define AM33XX_MPU_SECURITY_VIOL_RST_SHIFT 2
240#define AM33XX_MPU_SECURITY_VIOL_RST_MASK (1 << 2)
241
242/* Used by PRM_SRAM_COUNT */
243#define AM33XX_PCHARGECNT_VALUE_SHIFT 0
244#define AM33XX_PCHARGECNT_VALUE_MASK (0x3f << 0)
245
246/* Used by RM_PER_RSTCTRL */
247#define AM33XX_PCI_LRST_SHIFT 0
248#define AM33XX_PCI_LRST_MASK (1 << 0)
249
250/* Renamed from PCI_LRST Used by RM_PER_RSTST */
251#define AM33XX_PCI_LRST_5_5_SHIFT 5
252#define AM33XX_PCI_LRST_5_5_MASK (1 << 5)
253
254/* Used by PM_PER_PWRSTCTRL */
255#define AM33XX_PER_MEM_ONSTATE_SHIFT 25
256#define AM33XX_PER_MEM_ONSTATE_MASK (0x3 << 25) 46#define AM33XX_PER_MEM_ONSTATE_MASK (0x3 << 25)
257
258/* Used by PM_PER_PWRSTCTRL */
259#define AM33XX_PER_MEM_RETSTATE_SHIFT 29
260#define AM33XX_PER_MEM_RETSTATE_MASK (1 << 29) 47#define AM33XX_PER_MEM_RETSTATE_MASK (1 << 29)
261
262/* Used by PM_PER_PWRSTST */
263#define AM33XX_PER_MEM_STATEST_SHIFT 17
264#define AM33XX_PER_MEM_STATEST_MASK (0x3 << 17) 48#define AM33XX_PER_MEM_STATEST_MASK (0x3 << 17)
265
266/*
267 * Used by PM_GFX_PWRSTCTRL, PM_CEFUSE_PWRSTCTRL, PM_PER_PWRSTCTRL,
268 * PM_MPU_PWRSTCTRL
269 */
270#define AM33XX_POWERSTATE_SHIFT 0
271#define AM33XX_POWERSTATE_MASK (0x3 << 0)
272
273/* Used by PM_GFX_PWRSTST, PM_CEFUSE_PWRSTST, PM_PER_PWRSTST, PM_MPU_PWRSTST */
274#define AM33XX_POWERSTATEST_SHIFT 0
275#define AM33XX_POWERSTATEST_MASK (0x3 << 0)
276
277/* Used by PM_PER_PWRSTCTRL */
278#define AM33XX_RAM_MEM_ONSTATE_SHIFT 30
279#define AM33XX_RAM_MEM_ONSTATE_MASK (0x3 << 30) 49#define AM33XX_RAM_MEM_ONSTATE_MASK (0x3 << 30)
280
281/* Used by PM_PER_PWRSTCTRL */
282#define AM33XX_RAM_MEM_RETSTATE_SHIFT 27
283#define AM33XX_RAM_MEM_RETSTATE_MASK (1 << 27) 50#define AM33XX_RAM_MEM_RETSTATE_MASK (1 << 27)
284
285/* Used by PM_PER_PWRSTST */
286#define AM33XX_RAM_MEM_STATEST_SHIFT 21
287#define AM33XX_RAM_MEM_STATEST_MASK (0x3 << 21) 51#define AM33XX_RAM_MEM_STATEST_MASK (0x3 << 21)
288
289/* Used by PRM_LDO_SRAM_CORE_CTRL, PRM_LDO_SRAM_MPU_CTRL */
290#define AM33XX_RETMODE_ENABLE_SHIFT 0
291#define AM33XX_RETMODE_ENABLE_MASK (1 << 0)
292
293/* Used by REVISION_PRM */
294#define AM33XX_REV_SHIFT 0
295#define AM33XX_REV_MASK (0xff << 0)
296
297/* Used by PRM_RSTTIME */
298#define AM33XX_RSTTIME1_SHIFT 0
299#define AM33XX_RSTTIME1_MASK (0xff << 0)
300
301/* Used by PRM_RSTTIME */
302#define AM33XX_RSTTIME2_SHIFT 8
303#define AM33XX_RSTTIME2_MASK (0x1f << 8)
304
305/* Used by PRM_RSTCTRL */
306#define AM33XX_RST_GLOBAL_COLD_SW_SHIFT 1
307#define AM33XX_RST_GLOBAL_COLD_SW_MASK (1 << 1)
308
309/* Used by PRM_RSTCTRL */
310#define AM33XX_RST_GLOBAL_WARM_SW_SHIFT 0
311#define AM33XX_RST_GLOBAL_WARM_SW_MASK (1 << 0)
312
313/* Used by PRM_SRAM_COUNT */
314#define AM33XX_SLPCNT_VALUE_SHIFT 16
315#define AM33XX_SLPCNT_VALUE_MASK (0xff << 16)
316
317/* Used by PRM_LDO_SRAM_CORE_CTRL, PRM_LDO_SRAM_MPU_CTRL */
318#define AM33XX_SRAMLDO_STATUS_SHIFT 8
319#define AM33XX_SRAMLDO_STATUS_MASK (1 << 8)
320
321/* Used by PRM_LDO_SRAM_CORE_CTRL, PRM_LDO_SRAM_MPU_CTRL */
322#define AM33XX_SRAM_IN_TRANSITION_SHIFT 9
323#define AM33XX_SRAM_IN_TRANSITION_MASK (1 << 9)
324
325/* Used by PRM_SRAM_COUNT */
326#define AM33XX_STARTUP_COUNT_SHIFT 24
327#define AM33XX_STARTUP_COUNT_MASK (0xff << 24)
328
329/* Used by PRM_IRQENABLE_M3, PRM_IRQENABLE_MPU */
330#define AM33XX_TRANSITION_EN_SHIFT 8
331#define AM33XX_TRANSITION_EN_MASK (1 << 8)
332
333/* Used by PRM_IRQSTATUS_M3, PRM_IRQSTATUS_MPU */
334#define AM33XX_TRANSITION_ST_SHIFT 8
335#define AM33XX_TRANSITION_ST_MASK (1 << 8)
336
337/* Used by PRM_SRAM_COUNT */
338#define AM33XX_VSETUPCNT_VALUE_SHIFT 8
339#define AM33XX_VSETUPCNT_VALUE_MASK (0xff << 8)
340
341/* Used by PRM_RSTST */
342#define AM33XX_WDT0_RST_SHIFT 3
343#define AM33XX_WDT0_RST_MASK (1 << 3)
344
345/* Used by PRM_RSTST */
346#define AM33XX_WDT1_RST_SHIFT 4
347#define AM33XX_WDT1_RST_MASK (1 << 4)
348
349/* Used by RM_WKUP_RSTCTRL */
350#define AM33XX_WKUP_M3_LRST_SHIFT 3
351#define AM33XX_WKUP_M3_LRST_MASK (1 << 3)
352
353/* Renamed from WKUP_M3_LRST Used by RM_WKUP_RSTST */
354#define AM33XX_WKUP_M3_LRST_5_5_SHIFT 5
355#define AM33XX_WKUP_M3_LRST_5_5_MASK (1 << 5)
356
357#endif 52#endif
diff --git a/arch/arm/mach-omap2/prm-regbits-34xx.h b/arch/arm/mach-omap2/prm-regbits-34xx.h
index b0a2142eeb91..cebad565ed37 100644
--- a/arch/arm/mach-omap2/prm-regbits-34xx.h
+++ b/arch/arm/mach-omap2/prm-regbits-34xx.h
@@ -16,115 +16,25 @@
16 16
17#include "prm3xxx.h" 17#include "prm3xxx.h"
18 18
19/* Shared register bits */
20
21/* PRM_VC_CMD_VAL_0, PRM_VC_CMD_VAL_1 shared bits */
22#define OMAP3430_ON_SHIFT 24
23#define OMAP3430_ON_MASK (0xff << 24)
24#define OMAP3430_ONLP_SHIFT 16
25#define OMAP3430_ONLP_MASK (0xff << 16)
26#define OMAP3430_RET_SHIFT 8
27#define OMAP3430_RET_MASK (0xff << 8)
28#define OMAP3430_OFF_SHIFT 0
29#define OMAP3430_OFF_MASK (0xff << 0)
30
31/* PRM_VP1_CONFIG, PRM_VP2_CONFIG shared bits */
32#define OMAP3430_ERROROFFSET_SHIFT 24
33#define OMAP3430_ERROROFFSET_MASK (0xff << 24) 19#define OMAP3430_ERROROFFSET_MASK (0xff << 24)
34#define OMAP3430_ERRORGAIN_SHIFT 16
35#define OMAP3430_ERRORGAIN_MASK (0xff << 16) 20#define OMAP3430_ERRORGAIN_MASK (0xff << 16)
36#define OMAP3430_INITVOLTAGE_SHIFT 8
37#define OMAP3430_INITVOLTAGE_MASK (0xff << 8) 21#define OMAP3430_INITVOLTAGE_MASK (0xff << 8)
38#define OMAP3430_TIMEOUTEN_MASK (1 << 3) 22#define OMAP3430_TIMEOUTEN_MASK (1 << 3)
39#define OMAP3430_INITVDD_MASK (1 << 2) 23#define OMAP3430_INITVDD_MASK (1 << 2)
40#define OMAP3430_FORCEUPDATE_MASK (1 << 1) 24#define OMAP3430_FORCEUPDATE_MASK (1 << 1)
41#define OMAP3430_VPENABLE_MASK (1 << 0) 25#define OMAP3430_VPENABLE_MASK (1 << 0)
42
43/* PRM_VP1_VSTEPMIN, PRM_VP2_VSTEPMIN shared bits */
44#define OMAP3430_SMPSWAITTIMEMIN_SHIFT 8 26#define OMAP3430_SMPSWAITTIMEMIN_SHIFT 8
45#define OMAP3430_SMPSWAITTIMEMIN_MASK (0xffff << 8)
46#define OMAP3430_VSTEPMIN_SHIFT 0 27#define OMAP3430_VSTEPMIN_SHIFT 0
47#define OMAP3430_VSTEPMIN_MASK (0xff << 0)
48
49/* PRM_VP1_VSTEPMAX, PRM_VP2_VSTEPMAX shared bits */
50#define OMAP3430_SMPSWAITTIMEMAX_SHIFT 8 28#define OMAP3430_SMPSWAITTIMEMAX_SHIFT 8
51#define OMAP3430_SMPSWAITTIMEMAX_MASK (0xffff << 8)
52#define OMAP3430_VSTEPMAX_SHIFT 0 29#define OMAP3430_VSTEPMAX_SHIFT 0
53#define OMAP3430_VSTEPMAX_MASK (0xff << 0)
54
55/* PRM_VP1_VLIMITTO, PRM_VP2_VLIMITTO shared bits */
56#define OMAP3430_VDDMAX_SHIFT 24 30#define OMAP3430_VDDMAX_SHIFT 24
57#define OMAP3430_VDDMAX_MASK (0xff << 24)
58#define OMAP3430_VDDMIN_SHIFT 16 31#define OMAP3430_VDDMIN_SHIFT 16
59#define OMAP3430_VDDMIN_MASK (0xff << 16)
60#define OMAP3430_TIMEOUT_SHIFT 0 32#define OMAP3430_TIMEOUT_SHIFT 0
61#define OMAP3430_TIMEOUT_MASK (0xffff << 0)
62
63/* PRM_VP1_VOLTAGE, PRM_VP2_VOLTAGE shared bits */
64#define OMAP3430_VPVOLTAGE_SHIFT 0
65#define OMAP3430_VPVOLTAGE_MASK (0xff << 0) 33#define OMAP3430_VPVOLTAGE_MASK (0xff << 0)
66
67/* PRM_VP1_STATUS, PRM_VP2_STATUS shared bits */
68#define OMAP3430_VPINIDLE_MASK (1 << 0)
69
70/* PM_WKDEP_IVA2, PM_WKDEP_MPU shared bits */
71#define OMAP3430_EN_PER_SHIFT 7 34#define OMAP3430_EN_PER_SHIFT 7
72#define OMAP3430_EN_PER_MASK (1 << 7)
73
74/* PM_PWSTCTRL_IVA2, PM_PWSTCTRL_MPU, PM_PWSTCTRL_CORE shared bits */
75#define OMAP3430_MEMORYCHANGE_MASK (1 << 3)
76
77/* PM_PWSTST_IVA2, PM_PWSTST_CORE shared bits */
78#define OMAP3430_LOGICSTATEST_MASK (1 << 2) 35#define OMAP3430_LOGICSTATEST_MASK (1 << 2)
79
80/* PM_PREPWSTST_IVA2, PM_PREPWSTST_CORE shared bits */
81#define OMAP3430_LASTLOGICSTATEENTERED_MASK (1 << 2) 36#define OMAP3430_LASTLOGICSTATEENTERED_MASK (1 << 2)
82
83/*
84 * PM_PREPWSTST_IVA2, PM_PREPWSTST_MPU, PM_PREPWSTST_CORE,
85 * PM_PREPWSTST_GFX, PM_PREPWSTST_DSS, PM_PREPWSTST_CAM,
86 * PM_PREPWSTST_PER, PM_PREPWSTST_NEON shared bits
87 */
88#define OMAP3430_LASTPOWERSTATEENTERED_SHIFT 0
89#define OMAP3430_LASTPOWERSTATEENTERED_MASK (0x3 << 0) 37#define OMAP3430_LASTPOWERSTATEENTERED_MASK (0x3 << 0)
90
91/* PRM_IRQSTATUS_IVA2, PRM_IRQSTATUS_MPU shared bits */
92#define OMAP3430_WKUP_ST_MASK (1 << 0)
93
94/* PRM_IRQENABLE_IVA2, PRM_IRQENABLE_MPU shared bits */
95#define OMAP3430_WKUP_EN_MASK (1 << 0)
96
97/* PM_MPUGRPSEL1_CORE, PM_IVA2GRPSEL1_CORE shared bits */
98#define OMAP3430_GRPSEL_MMC2_MASK (1 << 25)
99#define OMAP3430_GRPSEL_MMC1_MASK (1 << 24)
100#define OMAP3430_GRPSEL_MCSPI4_MASK (1 << 21)
101#define OMAP3430_GRPSEL_MCSPI3_MASK (1 << 20)
102#define OMAP3430_GRPSEL_MCSPI2_MASK (1 << 19)
103#define OMAP3430_GRPSEL_MCSPI1_MASK (1 << 18)
104#define OMAP3430_GRPSEL_I2C3_SHIFT 17
105#define OMAP3430_GRPSEL_I2C3_MASK (1 << 17)
106#define OMAP3430_GRPSEL_I2C2_SHIFT 16
107#define OMAP3430_GRPSEL_I2C2_MASK (1 << 16)
108#define OMAP3430_GRPSEL_I2C1_SHIFT 15
109#define OMAP3430_GRPSEL_I2C1_MASK (1 << 15)
110#define OMAP3430_GRPSEL_UART2_MASK (1 << 14)
111#define OMAP3430_GRPSEL_UART1_MASK (1 << 13)
112#define OMAP3430_GRPSEL_GPT11_MASK (1 << 12)
113#define OMAP3430_GRPSEL_GPT10_MASK (1 << 11)
114#define OMAP3430_GRPSEL_MCBSP5_MASK (1 << 10)
115#define OMAP3430_GRPSEL_MCBSP1_MASK (1 << 9)
116#define OMAP3430_GRPSEL_HSOTGUSB_MASK (1 << 4)
117#define OMAP3430_GRPSEL_D2D_MASK (1 << 3)
118
119/*
120 * PM_PWSTCTRL_GFX, PM_PWSTCTRL_DSS, PM_PWSTCTRL_CAM,
121 * PM_PWSTCTRL_PER shared bits
122 */
123#define OMAP3430_MEMONSTATE_SHIFT 16
124#define OMAP3430_MEMONSTATE_MASK (0x3 << 16)
125#define OMAP3430_MEMRETSTATE_MASK (1 << 8)
126
127/* PM_MPUGRPSEL_PER, PM_IVA2GRPSEL_PER shared bits */
128#define OMAP3630_GRPSEL_UART4_MASK (1 << 18) 38#define OMAP3630_GRPSEL_UART4_MASK (1 << 18)
129#define OMAP3430_GRPSEL_GPIO6_MASK (1 << 17) 39#define OMAP3430_GRPSEL_GPIO6_MASK (1 << 17)
130#define OMAP3430_GRPSEL_GPIO5_MASK (1 << 16) 40#define OMAP3430_GRPSEL_GPIO5_MASK (1 << 16)
@@ -132,480 +42,89 @@
132#define OMAP3430_GRPSEL_GPIO3_MASK (1 << 14) 42#define OMAP3430_GRPSEL_GPIO3_MASK (1 << 14)
133#define OMAP3430_GRPSEL_GPIO2_MASK (1 << 13) 43#define OMAP3430_GRPSEL_GPIO2_MASK (1 << 13)
134#define OMAP3430_GRPSEL_UART3_MASK (1 << 11) 44#define OMAP3430_GRPSEL_UART3_MASK (1 << 11)
135#define OMAP3430_GRPSEL_GPT9_MASK (1 << 10)
136#define OMAP3430_GRPSEL_GPT8_MASK (1 << 9)
137#define OMAP3430_GRPSEL_GPT7_MASK (1 << 8)
138#define OMAP3430_GRPSEL_GPT6_MASK (1 << 7)
139#define OMAP3430_GRPSEL_GPT5_MASK (1 << 6)
140#define OMAP3430_GRPSEL_GPT4_MASK (1 << 5)
141#define OMAP3430_GRPSEL_GPT3_MASK (1 << 4)
142#define OMAP3430_GRPSEL_GPT2_MASK (1 << 3)
143#define OMAP3430_GRPSEL_MCBSP4_MASK (1 << 2) 45#define OMAP3430_GRPSEL_MCBSP4_MASK (1 << 2)
144#define OMAP3430_GRPSEL_MCBSP3_MASK (1 << 1) 46#define OMAP3430_GRPSEL_MCBSP3_MASK (1 << 1)
145#define OMAP3430_GRPSEL_MCBSP2_MASK (1 << 0) 47#define OMAP3430_GRPSEL_MCBSP2_MASK (1 << 0)
146
147/* PM_MPUGRPSEL_WKUP, PM_IVA2GRPSEL_WKUP shared bits */
148#define OMAP3430_GRPSEL_IO_MASK (1 << 8)
149#define OMAP3430_GRPSEL_SR2_MASK (1 << 7)
150#define OMAP3430_GRPSEL_SR1_MASK (1 << 6)
151#define OMAP3430_GRPSEL_GPIO1_MASK (1 << 3) 48#define OMAP3430_GRPSEL_GPIO1_MASK (1 << 3)
152#define OMAP3430_GRPSEL_GPT12_MASK (1 << 1) 49#define OMAP3430_GRPSEL_GPT12_MASK (1 << 1)
153#define OMAP3430_GRPSEL_GPT1_MASK (1 << 0) 50#define OMAP3430_GRPSEL_GPT1_MASK (1 << 0)
154
155/* Bits specific to each register */
156
157/* RM_RSTCTRL_IVA2 */
158#define OMAP3430_RST3_IVA2_MASK (1 << 2) 51#define OMAP3430_RST3_IVA2_MASK (1 << 2)
159#define OMAP3430_RST2_IVA2_MASK (1 << 1) 52#define OMAP3430_RST2_IVA2_MASK (1 << 1)
160#define OMAP3430_RST1_IVA2_MASK (1 << 0) 53#define OMAP3430_RST1_IVA2_MASK (1 << 0)
161
162/* RM_RSTST_IVA2 specific bits */
163#define OMAP3430_EMULATION_VSEQ_RST_MASK (1 << 13)
164#define OMAP3430_EMULATION_VHWA_RST_MASK (1 << 12)
165#define OMAP3430_EMULATION_IVA2_RST_MASK (1 << 11)
166#define OMAP3430_IVA2_SW_RST3_MASK (1 << 10)
167#define OMAP3430_IVA2_SW_RST2_MASK (1 << 9)
168#define OMAP3430_IVA2_SW_RST1_MASK (1 << 8)
169
170/* PM_WKDEP_IVA2 specific bits */
171
172/* PM_PWSTCTRL_IVA2 specific bits */
173#define OMAP3430_L2FLATMEMONSTATE_SHIFT 22
174#define OMAP3430_L2FLATMEMONSTATE_MASK (0x3 << 22) 54#define OMAP3430_L2FLATMEMONSTATE_MASK (0x3 << 22)
175#define OMAP3430_SHAREDL2CACHEFLATONSTATE_SHIFT 20
176#define OMAP3430_SHAREDL2CACHEFLATONSTATE_MASK (0x3 << 20) 55#define OMAP3430_SHAREDL2CACHEFLATONSTATE_MASK (0x3 << 20)
177#define OMAP3430_L1FLATMEMONSTATE_SHIFT 18
178#define OMAP3430_L1FLATMEMONSTATE_MASK (0x3 << 18) 56#define OMAP3430_L1FLATMEMONSTATE_MASK (0x3 << 18)
179#define OMAP3430_SHAREDL1CACHEFLATONSTATE_SHIFT 16
180#define OMAP3430_SHAREDL1CACHEFLATONSTATE_MASK (0x3 << 16) 57#define OMAP3430_SHAREDL1CACHEFLATONSTATE_MASK (0x3 << 16)
181#define OMAP3430_L2FLATMEMRETSTATE_MASK (1 << 11) 58#define OMAP3430_L2FLATMEMRETSTATE_MASK (1 << 11)
182#define OMAP3430_SHAREDL2CACHEFLATRETSTATE_MASK (1 << 10) 59#define OMAP3430_SHAREDL2CACHEFLATRETSTATE_MASK (1 << 10)
183#define OMAP3430_L1FLATMEMRETSTATE_MASK (1 << 9) 60#define OMAP3430_L1FLATMEMRETSTATE_MASK (1 << 9)
184#define OMAP3430_SHAREDL1CACHEFLATRETSTATE_MASK (1 << 8) 61#define OMAP3430_SHAREDL1CACHEFLATRETSTATE_MASK (1 << 8)
185
186/* PM_PWSTST_IVA2 specific bits */
187#define OMAP3430_L2FLATMEMSTATEST_SHIFT 10
188#define OMAP3430_L2FLATMEMSTATEST_MASK (0x3 << 10) 62#define OMAP3430_L2FLATMEMSTATEST_MASK (0x3 << 10)
189#define OMAP3430_SHAREDL2CACHEFLATSTATEST_SHIFT 8
190#define OMAP3430_SHAREDL2CACHEFLATSTATEST_MASK (0x3 << 8) 63#define OMAP3430_SHAREDL2CACHEFLATSTATEST_MASK (0x3 << 8)
191#define OMAP3430_L1FLATMEMSTATEST_SHIFT 6
192#define OMAP3430_L1FLATMEMSTATEST_MASK (0x3 << 6) 64#define OMAP3430_L1FLATMEMSTATEST_MASK (0x3 << 6)
193#define OMAP3430_SHAREDL1CACHEFLATSTATEST_SHIFT 4
194#define OMAP3430_SHAREDL1CACHEFLATSTATEST_MASK (0x3 << 4) 65#define OMAP3430_SHAREDL1CACHEFLATSTATEST_MASK (0x3 << 4)
195
196/* PM_PREPWSTST_IVA2 specific bits */
197#define OMAP3430_LASTL2FLATMEMSTATEENTERED_SHIFT 10
198#define OMAP3430_LASTL2FLATMEMSTATEENTERED_MASK (0x3 << 10) 66#define OMAP3430_LASTL2FLATMEMSTATEENTERED_MASK (0x3 << 10)
199#define OMAP3430_LASTSHAREDL2CACHEFLATSTATEENTERED_SHIFT 8
200#define OMAP3430_LASTSHAREDL2CACHEFLATSTATEENTERED_MASK (0x3 << 8) 67#define OMAP3430_LASTSHAREDL2CACHEFLATSTATEENTERED_MASK (0x3 << 8)
201#define OMAP3430_LASTL1FLATMEMSTATEENTERED_SHIFT 6
202#define OMAP3430_LASTL1FLATMEMSTATEENTERED_MASK (0x3 << 6)
203#define OMAP3430_LASTSHAREDL1CACHEFLATSTATEENTERED_SHIFT 4
204#define OMAP3430_LASTSHAREDL1CACHEFLATSTATEENTERED_MASK (0x3 << 4)
205
206/* PRM_IRQSTATUS_IVA2 specific bits */
207#define OMAP3430_PRM_IRQSTATUS_IVA2_IVA2_DPLL_ST_MASK (1 << 2)
208#define OMAP3430_FORCEWKUP_ST_MASK (1 << 1)
209
210/* PRM_IRQENABLE_IVA2 specific bits */
211#define OMAP3430_PRM_IRQENABLE_IVA2_IVA2_DPLL_RECAL_EN_MASK (1 << 2)
212#define OMAP3430_FORCEWKUP_EN_MASK (1 << 1)
213
214/* PRM_REVISION specific bits */
215
216/* PRM_SYSCONFIG specific bits */
217
218/* PRM_IRQSTATUS_MPU specific bits */
219#define OMAP3430ES2_SND_PERIPH_DPLL_ST_SHIFT 25 68#define OMAP3430ES2_SND_PERIPH_DPLL_ST_SHIFT 25
220#define OMAP3430ES2_SND_PERIPH_DPLL_ST_MASK (1 << 25)
221#define OMAP3430_VC_TIMEOUTERR_ST_MASK (1 << 24)
222#define OMAP3430_VC_RAERR_ST_MASK (1 << 23)
223#define OMAP3430_VC_SAERR_ST_MASK (1 << 22)
224#define OMAP3430_VP2_TRANXDONE_ST_MASK (1 << 21) 69#define OMAP3430_VP2_TRANXDONE_ST_MASK (1 << 21)
225#define OMAP3430_VP2_EQVALUE_ST_MASK (1 << 20)
226#define OMAP3430_VP2_NOSMPSACK_ST_MASK (1 << 19)
227#define OMAP3430_VP2_MAXVDD_ST_MASK (1 << 18)
228#define OMAP3430_VP2_MINVDD_ST_MASK (1 << 17)
229#define OMAP3430_VP2_OPPCHANGEDONE_ST_MASK (1 << 16)
230#define OMAP3430_VP1_TRANXDONE_ST_MASK (1 << 15) 70#define OMAP3430_VP1_TRANXDONE_ST_MASK (1 << 15)
231#define OMAP3430_VP1_EQVALUE_ST_MASK (1 << 14)
232#define OMAP3430_VP1_NOSMPSACK_ST_MASK (1 << 13)
233#define OMAP3430_VP1_MAXVDD_ST_MASK (1 << 12)
234#define OMAP3430_VP1_MINVDD_ST_MASK (1 << 11)
235#define OMAP3430_VP1_OPPCHANGEDONE_ST_MASK (1 << 10)
236#define OMAP3430_IO_ST_MASK (1 << 9)
237#define OMAP3430_PRM_IRQSTATUS_MPU_IVA2_DPLL_ST_MASK (1 << 8)
238#define OMAP3430_PRM_IRQSTATUS_MPU_IVA2_DPLL_ST_SHIFT 8 71#define OMAP3430_PRM_IRQSTATUS_MPU_IVA2_DPLL_ST_SHIFT 8
239#define OMAP3430_MPU_DPLL_ST_MASK (1 << 7)
240#define OMAP3430_MPU_DPLL_ST_SHIFT 7 72#define OMAP3430_MPU_DPLL_ST_SHIFT 7
241#define OMAP3430_PERIPH_DPLL_ST_MASK (1 << 6)
242#define OMAP3430_PERIPH_DPLL_ST_SHIFT 6 73#define OMAP3430_PERIPH_DPLL_ST_SHIFT 6
243#define OMAP3430_CORE_DPLL_ST_MASK (1 << 5)
244#define OMAP3430_CORE_DPLL_ST_SHIFT 5 74#define OMAP3430_CORE_DPLL_ST_SHIFT 5
245#define OMAP3430_TRANSITION_ST_MASK (1 << 4)
246#define OMAP3430_EVGENOFF_ST_MASK (1 << 3)
247#define OMAP3430_EVGENON_ST_MASK (1 << 2)
248#define OMAP3430_FS_USB_WKUP_ST_MASK (1 << 1)
249
250/* PRM_IRQENABLE_MPU specific bits */
251#define OMAP3430ES2_SND_PERIPH_DPLL_RECAL_EN_SHIFT 25 75#define OMAP3430ES2_SND_PERIPH_DPLL_RECAL_EN_SHIFT 25
252#define OMAP3430ES2_SND_PERIPH_DPLL_RECAL_EN_MASK (1 << 25)
253#define OMAP3430_VC_TIMEOUTERR_EN_MASK (1 << 24)
254#define OMAP3430_VC_RAERR_EN_MASK (1 << 23)
255#define OMAP3430_VC_SAERR_EN_MASK (1 << 22)
256#define OMAP3430_VP2_TRANXDONE_EN_MASK (1 << 21)
257#define OMAP3430_VP2_EQVALUE_EN_MASK (1 << 20)
258#define OMAP3430_VP2_NOSMPSACK_EN_MASK (1 << 19)
259#define OMAP3430_VP2_MAXVDD_EN_MASK (1 << 18)
260#define OMAP3430_VP2_MINVDD_EN_MASK (1 << 17)
261#define OMAP3430_VP2_OPPCHANGEDONE_EN_MASK (1 << 16)
262#define OMAP3430_VP1_TRANXDONE_EN_MASK (1 << 15)
263#define OMAP3430_VP1_EQVALUE_EN_MASK (1 << 14)
264#define OMAP3430_VP1_NOSMPSACK_EN_MASK (1 << 13)
265#define OMAP3430_VP1_MAXVDD_EN_MASK (1 << 12)
266#define OMAP3430_VP1_MINVDD_EN_MASK (1 << 11)
267#define OMAP3430_VP1_OPPCHANGEDONE_EN_MASK (1 << 10)
268#define OMAP3430_IO_EN_MASK (1 << 9)
269#define OMAP3430_PRM_IRQENABLE_MPU_IVA2_DPLL_RECAL_EN_MASK (1 << 8)
270#define OMAP3430_PRM_IRQENABLE_MPU_IVA2_DPLL_RECAL_EN_SHIFT 8 76#define OMAP3430_PRM_IRQENABLE_MPU_IVA2_DPLL_RECAL_EN_SHIFT 8
271#define OMAP3430_MPU_DPLL_RECAL_EN_MASK (1 << 7)
272#define OMAP3430_MPU_DPLL_RECAL_EN_SHIFT 7 77#define OMAP3430_MPU_DPLL_RECAL_EN_SHIFT 7
273#define OMAP3430_PERIPH_DPLL_RECAL_EN_MASK (1 << 6)
274#define OMAP3430_PERIPH_DPLL_RECAL_EN_SHIFT 6 78#define OMAP3430_PERIPH_DPLL_RECAL_EN_SHIFT 6
275#define OMAP3430_CORE_DPLL_RECAL_EN_MASK (1 << 5)
276#define OMAP3430_CORE_DPLL_RECAL_EN_SHIFT 5 79#define OMAP3430_CORE_DPLL_RECAL_EN_SHIFT 5
277#define OMAP3430_TRANSITION_EN_MASK (1 << 4)
278#define OMAP3430_EVGENOFF_EN_MASK (1 << 3)
279#define OMAP3430_EVGENON_EN_MASK (1 << 2)
280#define OMAP3430_FS_USB_WKUP_EN_MASK (1 << 1)
281
282/* RM_RSTST_MPU specific bits */
283#define OMAP3430_EMULATION_MPU_RST_MASK (1 << 11)
284
285/* PM_WKDEP_MPU specific bits */
286#define OMAP3430_PM_WKDEP_MPU_EN_DSS_SHIFT 5 80#define OMAP3430_PM_WKDEP_MPU_EN_DSS_SHIFT 5
287#define OMAP3430_PM_WKDEP_MPU_EN_DSS_MASK (1 << 5)
288#define OMAP3430_PM_WKDEP_MPU_EN_IVA2_SHIFT 2 81#define OMAP3430_PM_WKDEP_MPU_EN_IVA2_SHIFT 2
289#define OMAP3430_PM_WKDEP_MPU_EN_IVA2_MASK (1 << 2)
290
291/* PM_EVGENCTRL_MPU */
292#define OMAP3430_OFFLOADMODE_SHIFT 3
293#define OMAP3430_OFFLOADMODE_MASK (0x3 << 3)
294#define OMAP3430_ONLOADMODE_SHIFT 1
295#define OMAP3430_ONLOADMODE_MASK (0x3 << 1)
296#define OMAP3430_ENABLE_MASK (1 << 0)
297
298/* PM_EVGENONTIM_MPU */
299#define OMAP3430_ONTIMEVAL_SHIFT 0
300#define OMAP3430_ONTIMEVAL_MASK (0xffffffff << 0)
301
302/* PM_EVGENOFFTIM_MPU */
303#define OMAP3430_OFFTIMEVAL_SHIFT 0
304#define OMAP3430_OFFTIMEVAL_MASK (0xffffffff << 0)
305
306/* PM_PWSTCTRL_MPU specific bits */
307#define OMAP3430_L2CACHEONSTATE_SHIFT 16
308#define OMAP3430_L2CACHEONSTATE_MASK (0x3 << 16)
309#define OMAP3430_L2CACHERETSTATE_MASK (1 << 8)
310#define OMAP3430_LOGICL1CACHERETSTATE_MASK (1 << 2)
311
312/* PM_PWSTST_MPU specific bits */
313#define OMAP3430_L2CACHESTATEST_SHIFT 6
314#define OMAP3430_L2CACHESTATEST_MASK (0x3 << 6)
315#define OMAP3430_LOGICL1CACHESTATEST_MASK (1 << 2)
316
317/* PM_PREPWSTST_MPU specific bits */
318#define OMAP3430_LASTL2CACHESTATEENTERED_SHIFT 6
319#define OMAP3430_LASTL2CACHESTATEENTERED_MASK (0x3 << 6)
320#define OMAP3430_LASTLOGICL1CACHESTATEENTERED_MASK (1 << 2)
321
322/* RM_RSTCTRL_CORE */
323#define OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RSTPWRON_MASK (1 << 1) 82#define OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RSTPWRON_MASK (1 << 1)
324#define OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RST_MASK (1 << 0) 83#define OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RST_MASK (1 << 0)
325
326/* RM_RSTST_CORE specific bits */
327#define OMAP3430_MODEM_SECURITY_VIOL_RST_MASK (1 << 10)
328#define OMAP3430_RM_RSTST_CORE_MODEM_SW_RSTPWRON_MASK (1 << 9)
329#define OMAP3430_RM_RSTST_CORE_MODEM_SW_RST_MASK (1 << 8)
330
331/* PM_WKEN1_CORE specific bits */
332
333/* PM_MPUGRPSEL1_CORE specific bits */
334#define OMAP3430_GRPSEL_FSHOSTUSB_MASK (1 << 5)
335
336/* PM_IVA2GRPSEL1_CORE specific bits */
337
338/* PM_WKST1_CORE specific bits */
339
340/* PM_PWSTCTRL_CORE specific bits */
341#define OMAP3430_MEM2ONSTATE_SHIFT 18
342#define OMAP3430_MEM2ONSTATE_MASK (0x3 << 18)
343#define OMAP3430_MEM1ONSTATE_SHIFT 16
344#define OMAP3430_MEM1ONSTATE_MASK (0x3 << 16)
345#define OMAP3430_MEM2RETSTATE_MASK (1 << 9)
346#define OMAP3430_MEM1RETSTATE_MASK (1 << 8)
347
348/* PM_PWSTST_CORE specific bits */
349#define OMAP3430_MEM2STATEST_SHIFT 6
350#define OMAP3430_MEM2STATEST_MASK (0x3 << 6)
351#define OMAP3430_MEM1STATEST_SHIFT 4
352#define OMAP3430_MEM1STATEST_MASK (0x3 << 4)
353
354/* PM_PREPWSTST_CORE specific bits */
355#define OMAP3430_LASTMEM2STATEENTERED_SHIFT 6
356#define OMAP3430_LASTMEM2STATEENTERED_MASK (0x3 << 6) 84#define OMAP3430_LASTMEM2STATEENTERED_MASK (0x3 << 6)
357#define OMAP3430_LASTMEM1STATEENTERED_SHIFT 4
358#define OMAP3430_LASTMEM1STATEENTERED_MASK (0x3 << 4) 85#define OMAP3430_LASTMEM1STATEENTERED_MASK (0x3 << 4)
359
360/* RM_RSTST_GFX specific bits */
361
362/* PM_WKDEP_GFX specific bits */
363#define OMAP3430_PM_WKDEP_GFX_EN_IVA2_MASK (1 << 2)
364
365/* PM_PWSTCTRL_GFX specific bits */
366
367/* PM_PWSTST_GFX specific bits */
368
369/* PM_PREPWSTST_GFX specific bits */
370
371/* PM_WKEN_WKUP specific bits */
372#define OMAP3430_EN_IO_CHAIN_MASK (1 << 16) 86#define OMAP3430_EN_IO_CHAIN_MASK (1 << 16)
373#define OMAP3430_EN_IO_MASK (1 << 8) 87#define OMAP3430_EN_IO_MASK (1 << 8)
374#define OMAP3430_EN_GPIO1_MASK (1 << 3) 88#define OMAP3430_EN_GPIO1_MASK (1 << 3)
375
376/* PM_MPUGRPSEL_WKUP specific bits */
377
378/* PM_IVA2GRPSEL_WKUP specific bits */
379
380/* PM_WKST_WKUP specific bits */
381#define OMAP3430_ST_IO_CHAIN_MASK (1 << 16) 89#define OMAP3430_ST_IO_CHAIN_MASK (1 << 16)
382#define OMAP3430_ST_IO_MASK (1 << 8) 90#define OMAP3430_ST_IO_MASK (1 << 8)
383
384/* PRM_CLKSEL */
385#define OMAP3430_SYS_CLKIN_SEL_SHIFT 0 91#define OMAP3430_SYS_CLKIN_SEL_SHIFT 0
386#define OMAP3430_SYS_CLKIN_SEL_MASK (0x7 << 0)
387#define OMAP3430_SYS_CLKIN_SEL_WIDTH 3 92#define OMAP3430_SYS_CLKIN_SEL_WIDTH 3
388
389/* PRM_CLKOUT_CTRL */
390#define OMAP3430_CLKOUT_EN_MASK (1 << 7)
391#define OMAP3430_CLKOUT_EN_SHIFT 7 93#define OMAP3430_CLKOUT_EN_SHIFT 7
392
393/* RM_RSTST_DSS specific bits */
394
395/* PM_WKEN_DSS */
396#define OMAP3430_PM_WKEN_DSS_EN_DSS_MASK (1 << 0) 94#define OMAP3430_PM_WKEN_DSS_EN_DSS_MASK (1 << 0)
397
398/* PM_WKDEP_DSS specific bits */
399#define OMAP3430_PM_WKDEP_DSS_EN_IVA2_MASK (1 << 2)
400
401/* PM_PWSTCTRL_DSS specific bits */
402
403/* PM_PWSTST_DSS specific bits */
404
405/* PM_PREPWSTST_DSS specific bits */
406
407/* RM_RSTST_CAM specific bits */
408
409/* PM_WKDEP_CAM specific bits */
410#define OMAP3430_PM_WKDEP_CAM_EN_IVA2_MASK (1 << 2)
411
412/* PM_PWSTCTRL_CAM specific bits */
413
414/* PM_PWSTST_CAM specific bits */
415
416/* PM_PREPWSTST_CAM specific bits */
417
418/* PM_PWSTCTRL_USBHOST specific bits */
419#define OMAP3430ES2_SAVEANDRESTORE_SHIFT 4 95#define OMAP3430ES2_SAVEANDRESTORE_SHIFT 4
420
421/* RM_RSTST_PER specific bits */
422
423/* PM_WKEN_PER specific bits */
424
425/* PM_MPUGRPSEL_PER specific bits */
426
427/* PM_IVA2GRPSEL_PER specific bits */
428
429/* PM_WKST_PER specific bits */
430
431/* PM_WKDEP_PER specific bits */
432#define OMAP3430_PM_WKDEP_PER_EN_IVA2_MASK (1 << 2)
433
434/* PM_PWSTCTRL_PER specific bits */
435
436/* PM_PWSTST_PER specific bits */
437
438/* PM_PREPWSTST_PER specific bits */
439
440/* RM_RSTST_EMU specific bits */
441
442/* PM_PWSTST_EMU specific bits */
443
444/* PRM_VC_SMPS_SA */
445#define OMAP3430_PRM_VC_SMPS_SA_SA1_SHIFT 16 96#define OMAP3430_PRM_VC_SMPS_SA_SA1_SHIFT 16
446#define OMAP3430_PRM_VC_SMPS_SA_SA1_MASK (0x7f << 16) 97#define OMAP3430_PRM_VC_SMPS_SA_SA1_MASK (0x7f << 16)
447#define OMAP3430_PRM_VC_SMPS_SA_SA0_SHIFT 0 98#define OMAP3430_PRM_VC_SMPS_SA_SA0_SHIFT 0
448#define OMAP3430_PRM_VC_SMPS_SA_SA0_MASK (0x7f << 0) 99#define OMAP3430_PRM_VC_SMPS_SA_SA0_MASK (0x7f << 0)
449
450/* PRM_VC_SMPS_VOL_RA */
451#define OMAP3430_VOLRA1_SHIFT 16
452#define OMAP3430_VOLRA1_MASK (0xff << 16) 100#define OMAP3430_VOLRA1_MASK (0xff << 16)
453#define OMAP3430_VOLRA0_SHIFT 0
454#define OMAP3430_VOLRA0_MASK (0xff << 0) 101#define OMAP3430_VOLRA0_MASK (0xff << 0)
455
456/* PRM_VC_SMPS_CMD_RA */
457#define OMAP3430_CMDRA1_SHIFT 16
458#define OMAP3430_CMDRA1_MASK (0xff << 16) 102#define OMAP3430_CMDRA1_MASK (0xff << 16)
459#define OMAP3430_CMDRA0_SHIFT 0
460#define OMAP3430_CMDRA0_MASK (0xff << 0) 103#define OMAP3430_CMDRA0_MASK (0xff << 0)
461
462/* PRM_VC_CMD_VAL_0 specific bits */
463#define OMAP3430_VC_CMD_ON_SHIFT 24 104#define OMAP3430_VC_CMD_ON_SHIFT 24
464#define OMAP3430_VC_CMD_ON_MASK (0xFF << 24) 105#define OMAP3430_VC_CMD_ON_MASK (0xFF << 24)
465#define OMAP3430_VC_CMD_ONLP_SHIFT 16 106#define OMAP3430_VC_CMD_ONLP_SHIFT 16
466#define OMAP3430_VC_CMD_ONLP_MASK (0xFF << 16)
467#define OMAP3430_VC_CMD_RET_SHIFT 8 107#define OMAP3430_VC_CMD_RET_SHIFT 8
468#define OMAP3430_VC_CMD_RET_MASK (0xFF << 8)
469#define OMAP3430_VC_CMD_OFF_SHIFT 0 108#define OMAP3430_VC_CMD_OFF_SHIFT 0
470#define OMAP3430_VC_CMD_OFF_MASK (0xFF << 0)
471
472/* PRM_VC_CMD_VAL_1 specific bits */
473
474/* PRM_VC_CH_CONF */
475#define OMAP3430_CMD1_MASK (1 << 20)
476#define OMAP3430_RACEN1_MASK (1 << 19)
477#define OMAP3430_RAC1_MASK (1 << 18)
478#define OMAP3430_RAV1_MASK (1 << 17)
479#define OMAP3430_PRM_VC_CH_CONF_SA1_MASK (1 << 16)
480#define OMAP3430_CMD0_MASK (1 << 4)
481#define OMAP3430_RACEN0_MASK (1 << 3)
482#define OMAP3430_RAC0_MASK (1 << 2)
483#define OMAP3430_RAV0_MASK (1 << 1)
484#define OMAP3430_PRM_VC_CH_CONF_SA0_MASK (1 << 0)
485
486/* PRM_VC_I2C_CFG */
487#define OMAP3430_HSMASTER_MASK (1 << 5)
488#define OMAP3430_SREN_MASK (1 << 4)
489#define OMAP3430_HSEN_MASK (1 << 3) 109#define OMAP3430_HSEN_MASK (1 << 3)
490#define OMAP3430_MCODE_SHIFT 0
491#define OMAP3430_MCODE_MASK (0x7 << 0) 110#define OMAP3430_MCODE_MASK (0x7 << 0)
492
493/* PRM_VC_BYPASS_VAL */
494#define OMAP3430_VALID_MASK (1 << 24) 111#define OMAP3430_VALID_MASK (1 << 24)
495#define OMAP3430_DATA_SHIFT 16 112#define OMAP3430_DATA_SHIFT 16
496#define OMAP3430_DATA_MASK (0xff << 16)
497#define OMAP3430_REGADDR_SHIFT 8 113#define OMAP3430_REGADDR_SHIFT 8
498#define OMAP3430_REGADDR_MASK (0xff << 8)
499#define OMAP3430_SLAVEADDR_SHIFT 0 114#define OMAP3430_SLAVEADDR_SHIFT 0
500#define OMAP3430_SLAVEADDR_MASK (0x7f << 0)
501
502/* PRM_RSTCTRL */
503#define OMAP3430_RST_DPLL3_MASK (1 << 2)
504#define OMAP3430_RST_GS_MASK (1 << 1)
505
506/* PRM_RSTTIME */
507#define OMAP3430_RSTTIME2_SHIFT 8
508#define OMAP3430_RSTTIME2_MASK (0x1f << 8)
509#define OMAP3430_RSTTIME1_SHIFT 0
510#define OMAP3430_RSTTIME1_MASK (0xff << 0)
511
512/* PRM_RSTST */
513#define OMAP3430_ICECRUSHER_RST_SHIFT 10 115#define OMAP3430_ICECRUSHER_RST_SHIFT 10
514#define OMAP3430_ICECRUSHER_RST_MASK (1 << 10)
515#define OMAP3430_ICEPICK_RST_SHIFT 9 116#define OMAP3430_ICEPICK_RST_SHIFT 9
516#define OMAP3430_ICEPICK_RST_MASK (1 << 9)
517#define OMAP3430_VDD2_VOLTAGE_MANAGER_RST_SHIFT 8 117#define OMAP3430_VDD2_VOLTAGE_MANAGER_RST_SHIFT 8
518#define OMAP3430_VDD2_VOLTAGE_MANAGER_RST_MASK (1 << 8)
519#define OMAP3430_VDD1_VOLTAGE_MANAGER_RST_SHIFT 7 118#define OMAP3430_VDD1_VOLTAGE_MANAGER_RST_SHIFT 7
520#define OMAP3430_VDD1_VOLTAGE_MANAGER_RST_MASK (1 << 7)
521#define OMAP3430_EXTERNAL_WARM_RST_SHIFT 6 119#define OMAP3430_EXTERNAL_WARM_RST_SHIFT 6
522#define OMAP3430_EXTERNAL_WARM_RST_MASK (1 << 6)
523#define OMAP3430_SECURE_WD_RST_SHIFT 5 120#define OMAP3430_SECURE_WD_RST_SHIFT 5
524#define OMAP3430_SECURE_WD_RST_MASK (1 << 5)
525#define OMAP3430_MPU_WD_RST_SHIFT 4 121#define OMAP3430_MPU_WD_RST_SHIFT 4
526#define OMAP3430_MPU_WD_RST_MASK (1 << 4)
527#define OMAP3430_SECURITY_VIOL_RST_SHIFT 3 122#define OMAP3430_SECURITY_VIOL_RST_SHIFT 3
528#define OMAP3430_SECURITY_VIOL_RST_MASK (1 << 3)
529#define OMAP3430_GLOBAL_SW_RST_SHIFT 1 123#define OMAP3430_GLOBAL_SW_RST_SHIFT 1
530#define OMAP3430_GLOBAL_SW_RST_MASK (1 << 1)
531#define OMAP3430_GLOBAL_COLD_RST_SHIFT 0 124#define OMAP3430_GLOBAL_COLD_RST_SHIFT 0
532#define OMAP3430_GLOBAL_COLD_RST_MASK (1 << 0) 125#define OMAP3430_GLOBAL_COLD_RST_MASK (1 << 0)
533
534/* PRM_VOLTCTRL */
535#define OMAP3430_SEL_VMODE_MASK (1 << 4)
536#define OMAP3430_SEL_OFF_MASK (1 << 3) 126#define OMAP3430_SEL_OFF_MASK (1 << 3)
537#define OMAP3430_AUTO_OFF_MASK (1 << 2) 127#define OMAP3430_AUTO_OFF_MASK (1 << 2)
538#define OMAP3430_AUTO_RET_MASK (1 << 1)
539#define OMAP3430_AUTO_SLEEP_MASK (1 << 0)
540
541/* PRM_SRAM_PCHARGE */
542#define OMAP3430_PCHARGE_TIME_SHIFT 0
543#define OMAP3430_PCHARGE_TIME_MASK (0xff << 0)
544
545/* PRM_CLKSRC_CTRL */
546#define OMAP3430_SYSCLKDIV_SHIFT 6
547#define OMAP3430_SYSCLKDIV_MASK (0x3 << 6)
548#define OMAP3430_AUTOEXTCLKMODE_SHIFT 3
549#define OMAP3430_AUTOEXTCLKMODE_MASK (0x3 << 3)
550#define OMAP3430_SYSCLKSEL_SHIFT 0
551#define OMAP3430_SYSCLKSEL_MASK (0x3 << 0)
552
553/* PRM_VOLTSETUP1 */
554#define OMAP3430_SETUP_TIME2_SHIFT 16
555#define OMAP3430_SETUP_TIME2_MASK (0xffff << 16) 128#define OMAP3430_SETUP_TIME2_MASK (0xffff << 16)
556#define OMAP3430_SETUP_TIME1_SHIFT 0
557#define OMAP3430_SETUP_TIME1_MASK (0xffff << 0) 129#define OMAP3430_SETUP_TIME1_MASK (0xffff << 0)
558
559/* PRM_VOLTOFFSET */
560#define OMAP3430_OFFSET_TIME_SHIFT 0
561#define OMAP3430_OFFSET_TIME_MASK (0xffff << 0)
562
563/* PRM_CLKSETUP */
564#define OMAP3430_SETUP_TIME_SHIFT 0
565#define OMAP3430_SETUP_TIME_MASK (0xffff << 0)
566
567/* PRM_POLCTRL */
568#define OMAP3430_OFFMODE_POL_MASK (1 << 3)
569#define OMAP3430_CLKOUT_POL_MASK (1 << 2)
570#define OMAP3430_CLKREQ_POL_MASK (1 << 1)
571#define OMAP3430_EXTVOL_POL_MASK (1 << 0)
572
573/* PRM_VOLTSETUP2 */
574#define OMAP3430_OFFMODESETUPTIME_SHIFT 0
575#define OMAP3430_OFFMODESETUPTIME_MASK (0xffff << 0)
576
577/* PRM_VP1_CONFIG specific bits */
578
579/* PRM_VP1_VSTEPMIN specific bits */
580
581/* PRM_VP1_VSTEPMAX specific bits */
582
583/* PRM_VP1_VLIMITTO specific bits */
584
585/* PRM_VP1_VOLTAGE specific bits */
586
587/* PRM_VP1_STATUS specific bits */
588
589/* PRM_VP2_CONFIG specific bits */
590
591/* PRM_VP2_VSTEPMIN specific bits */
592
593/* PRM_VP2_VSTEPMAX specific bits */
594
595/* PRM_VP2_VLIMITTO specific bits */
596
597/* PRM_VP2_VOLTAGE specific bits */
598
599/* PRM_VP2_STATUS specific bits */
600
601/* RM_RSTST_NEON specific bits */
602
603/* PM_WKDEP_NEON specific bits */
604
605/* PM_PWSTCTRL_NEON specific bits */
606
607/* PM_PWSTST_NEON specific bits */
608
609/* PM_PREPWSTST_NEON specific bits */
610
611#endif 130#endif
diff --git a/arch/arm/mach-omap2/prm-regbits-44xx.h b/arch/arm/mach-omap2/prm-regbits-44xx.h
index 3cb247bebdaa..b1c7a33e00e7 100644
--- a/arch/arm/mach-omap2/prm-regbits-44xx.h
+++ b/arch/arm/mach-omap2/prm-regbits-44xx.h
@@ -22,2306 +22,80 @@
22#ifndef __ARCH_ARM_MACH_OMAP2_PRM_REGBITS_44XX_H 22#ifndef __ARCH_ARM_MACH_OMAP2_PRM_REGBITS_44XX_H
23#define __ARCH_ARM_MACH_OMAP2_PRM_REGBITS_44XX_H 23#define __ARCH_ARM_MACH_OMAP2_PRM_REGBITS_44XX_H
24 24
25
26/*
27 * Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_IVA_SETUP,
28 * PRM_LDO_SRAM_MPU_SETUP
29 */
30#define OMAP4430_ABBOFF_ACT_EXPORT_SHIFT 1
31#define OMAP4430_ABBOFF_ACT_EXPORT_MASK (1 << 1)
32
33/*
34 * Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_IVA_SETUP,
35 * PRM_LDO_SRAM_MPU_SETUP
36 */
37#define OMAP4430_ABBOFF_SLEEP_EXPORT_SHIFT 2
38#define OMAP4430_ABBOFF_SLEEP_EXPORT_MASK (1 << 2)
39
40/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
41#define OMAP4430_ABB_IVA_DONE_EN_SHIFT 31
42#define OMAP4430_ABB_IVA_DONE_EN_MASK (1 << 31)
43
44/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
45#define OMAP4430_ABB_IVA_DONE_ST_SHIFT 31
46#define OMAP4430_ABB_IVA_DONE_ST_MASK (1 << 31)
47
48/* Used by PRM_IRQENABLE_MPU_2 */
49#define OMAP4430_ABB_MPU_DONE_EN_SHIFT 7
50#define OMAP4430_ABB_MPU_DONE_EN_MASK (1 << 7)
51
52/* Used by PRM_IRQSTATUS_MPU_2 */
53#define OMAP4430_ABB_MPU_DONE_ST_SHIFT 7
54#define OMAP4430_ABB_MPU_DONE_ST_MASK (1 << 7)
55
56/* Used by PRM_LDO_ABB_IVA_SETUP, PRM_LDO_ABB_MPU_SETUP */
57#define OMAP4430_ACTIVE_FBB_SEL_SHIFT 2
58#define OMAP4430_ACTIVE_FBB_SEL_MASK (1 << 2)
59
60/* Used by PRM_LDO_ABB_IVA_SETUP, PRM_LDO_ABB_MPU_SETUP */
61#define OMAP4430_ACTIVE_RBB_SEL_SHIFT 1
62#define OMAP4430_ACTIVE_RBB_SEL_MASK (1 << 1)
63
64/* Used by PM_ABE_PWRSTCTRL */
65#define OMAP4430_AESSMEM_ONSTATE_SHIFT 16
66#define OMAP4430_AESSMEM_ONSTATE_MASK (0x3 << 16)
67
68/* Used by PM_ABE_PWRSTCTRL */
69#define OMAP4430_AESSMEM_RETSTATE_SHIFT 8
70#define OMAP4430_AESSMEM_RETSTATE_MASK (1 << 8)
71
72/* Used by PM_ABE_PWRSTST */
73#define OMAP4430_AESSMEM_STATEST_SHIFT 4
74#define OMAP4430_AESSMEM_STATEST_MASK (0x3 << 4)
75
76/*
77 * Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_IVA_SETUP,
78 * PRM_LDO_SRAM_MPU_SETUP
79 */
80#define OMAP4430_AIPOFF_SHIFT 8
81#define OMAP4430_AIPOFF_MASK (1 << 8)
82
83/* Used by PRM_VOLTCTRL */
84#define OMAP4430_AUTO_CTRL_VDD_CORE_L_SHIFT 0
85#define OMAP4430_AUTO_CTRL_VDD_CORE_L_MASK (0x3 << 0)
86
87/* Used by PRM_VOLTCTRL */
88#define OMAP4430_AUTO_CTRL_VDD_IVA_L_SHIFT 4
89#define OMAP4430_AUTO_CTRL_VDD_IVA_L_MASK (0x3 << 4)
90
91/* Used by PRM_VOLTCTRL */
92#define OMAP4430_AUTO_CTRL_VDD_MPU_L_SHIFT 2
93#define OMAP4430_AUTO_CTRL_VDD_MPU_L_MASK (0x3 << 2)
94
95/* Used by PRM_VC_ERRST */
96#define OMAP4430_BYPS_RA_ERR_SHIFT 25
97#define OMAP4430_BYPS_RA_ERR_MASK (1 << 25)
98
99/* Used by PRM_VC_ERRST */
100#define OMAP4430_BYPS_SA_ERR_SHIFT 24
101#define OMAP4430_BYPS_SA_ERR_MASK (1 << 24)
102
103/* Used by PRM_VC_ERRST */
104#define OMAP4430_BYPS_TIMEOUT_ERR_SHIFT 26
105#define OMAP4430_BYPS_TIMEOUT_ERR_MASK (1 << 26)
106
107/* Used by PRM_RSTST */
108#define OMAP4430_C2C_RST_SHIFT 10 25#define OMAP4430_C2C_RST_SHIFT 10
109#define OMAP4430_C2C_RST_MASK (1 << 10)
110
111/* Used by PM_CAM_PWRSTCTRL */
112#define OMAP4430_CAM_MEM_ONSTATE_SHIFT 16
113#define OMAP4430_CAM_MEM_ONSTATE_MASK (0x3 << 16)
114
115/* Used by PM_CAM_PWRSTST */
116#define OMAP4430_CAM_MEM_STATEST_SHIFT 4
117#define OMAP4430_CAM_MEM_STATEST_MASK (0x3 << 4)
118
119/* Used by PRM_CLKREQCTRL */
120#define OMAP4430_CLKREQ_COND_SHIFT 0
121#define OMAP4430_CLKREQ_COND_MASK (0x7 << 0)
122
123/* Used by PRM_VC_VAL_SMPS_RA_CMD */
124#define OMAP4430_CMDRA_VDD_CORE_L_SHIFT 0
125#define OMAP4430_CMDRA_VDD_CORE_L_MASK (0xff << 0) 26#define OMAP4430_CMDRA_VDD_CORE_L_MASK (0xff << 0)
126
127/* Used by PRM_VC_VAL_SMPS_RA_CMD */
128#define OMAP4430_CMDRA_VDD_IVA_L_SHIFT 8
129#define OMAP4430_CMDRA_VDD_IVA_L_MASK (0xff << 8) 27#define OMAP4430_CMDRA_VDD_IVA_L_MASK (0xff << 8)
130
131/* Used by PRM_VC_VAL_SMPS_RA_CMD */
132#define OMAP4430_CMDRA_VDD_MPU_L_SHIFT 16
133#define OMAP4430_CMDRA_VDD_MPU_L_MASK (0xff << 16) 28#define OMAP4430_CMDRA_VDD_MPU_L_MASK (0xff << 16)
134
135/* Used by PRM_VC_CFG_CHANNEL */
136#define OMAP4430_CMD_VDD_CORE_L_SHIFT 4
137#define OMAP4430_CMD_VDD_CORE_L_MASK (1 << 4)
138
139/* Used by PRM_VC_CFG_CHANNEL */
140#define OMAP4430_CMD_VDD_IVA_L_SHIFT 12
141#define OMAP4430_CMD_VDD_IVA_L_MASK (1 << 12)
142
143/* Used by PRM_VC_CFG_CHANNEL */
144#define OMAP4430_CMD_VDD_MPU_L_SHIFT 17
145#define OMAP4430_CMD_VDD_MPU_L_MASK (1 << 17)
146
147/* Used by PM_CORE_PWRSTCTRL */
148#define OMAP4430_CORE_OCMRAM_ONSTATE_SHIFT 18
149#define OMAP4430_CORE_OCMRAM_ONSTATE_MASK (0x3 << 18)
150
151/* Used by PM_CORE_PWRSTCTRL */
152#define OMAP4430_CORE_OCMRAM_RETSTATE_SHIFT 9
153#define OMAP4430_CORE_OCMRAM_RETSTATE_MASK (1 << 9)
154
155/* Used by PM_CORE_PWRSTST */
156#define OMAP4430_CORE_OCMRAM_STATEST_SHIFT 6
157#define OMAP4430_CORE_OCMRAM_STATEST_MASK (0x3 << 6)
158
159/* Used by PM_CORE_PWRSTCTRL */
160#define OMAP4430_CORE_OTHER_BANK_ONSTATE_SHIFT 16
161#define OMAP4430_CORE_OTHER_BANK_ONSTATE_MASK (0x3 << 16)
162
163/* Used by PM_CORE_PWRSTCTRL */
164#define OMAP4430_CORE_OTHER_BANK_RETSTATE_SHIFT 8
165#define OMAP4430_CORE_OTHER_BANK_RETSTATE_MASK (1 << 8)
166
167/* Used by PM_CORE_PWRSTST */
168#define OMAP4430_CORE_OTHER_BANK_STATEST_SHIFT 4
169#define OMAP4430_CORE_OTHER_BANK_STATEST_MASK (0x3 << 4)
170
171/* Used by REVISION_PRM */
172#define OMAP4430_CUSTOM_SHIFT 6
173#define OMAP4430_CUSTOM_MASK (0x3 << 6)
174
175/* Used by PRM_VC_VAL_BYPASS */
176#define OMAP4430_DATA_SHIFT 16 29#define OMAP4430_DATA_SHIFT 16
177#define OMAP4430_DATA_MASK (0xff << 16)
178
179/* Used by PRM_DEVICE_OFF_CTRL */
180#define OMAP4430_DEVICE_OFF_ENABLE_SHIFT 0
181#define OMAP4430_DEVICE_OFF_ENABLE_MASK (1 << 0)
182
183/* Used by PRM_VC_CFG_I2C_MODE */
184#define OMAP4430_DFILTEREN_SHIFT 6
185#define OMAP4430_DFILTEREN_MASK (1 << 6)
186
187/*
188 * Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_IVA_SETUP,
189 * PRM_LDO_SRAM_MPU_SETUP, PRM_SRAM_WKUP_SETUP
190 */
191#define OMAP4430_DISABLE_RTA_EXPORT_SHIFT 0
192#define OMAP4430_DISABLE_RTA_EXPORT_MASK (1 << 0)
193
194/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU, PRM_IRQENABLE_TESLA */
195#define OMAP4430_DPLL_ABE_RECAL_EN_SHIFT 4
196#define OMAP4430_DPLL_ABE_RECAL_EN_MASK (1 << 4)
197
198/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU, PRM_IRQSTATUS_TESLA */
199#define OMAP4430_DPLL_ABE_RECAL_ST_SHIFT 4
200#define OMAP4430_DPLL_ABE_RECAL_ST_MASK (1 << 4)
201
202/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
203#define OMAP4430_DPLL_CORE_RECAL_EN_SHIFT 0
204#define OMAP4430_DPLL_CORE_RECAL_EN_MASK (1 << 0)
205
206/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
207#define OMAP4430_DPLL_CORE_RECAL_ST_SHIFT 0
208#define OMAP4430_DPLL_CORE_RECAL_ST_MASK (1 << 0)
209
210/* Used by PRM_IRQENABLE_MPU */
211#define OMAP4430_DPLL_DDRPHY_RECAL_EN_SHIFT 6
212#define OMAP4430_DPLL_DDRPHY_RECAL_EN_MASK (1 << 6)
213
214/* Used by PRM_IRQSTATUS_MPU */
215#define OMAP4430_DPLL_DDRPHY_RECAL_ST_SHIFT 6
216#define OMAP4430_DPLL_DDRPHY_RECAL_ST_MASK (1 << 6)
217
218/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU, PRM_IRQENABLE_TESLA */
219#define OMAP4430_DPLL_IVA_RECAL_EN_SHIFT 2
220#define OMAP4430_DPLL_IVA_RECAL_EN_MASK (1 << 2)
221
222/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU, PRM_IRQSTATUS_TESLA */
223#define OMAP4430_DPLL_IVA_RECAL_ST_SHIFT 2
224#define OMAP4430_DPLL_IVA_RECAL_ST_MASK (1 << 2)
225
226/* Used by PRM_IRQENABLE_MPU */
227#define OMAP4430_DPLL_MPU_RECAL_EN_SHIFT 1
228#define OMAP4430_DPLL_MPU_RECAL_EN_MASK (1 << 1)
229
230/* Used by PRM_IRQSTATUS_MPU */
231#define OMAP4430_DPLL_MPU_RECAL_ST_SHIFT 1
232#define OMAP4430_DPLL_MPU_RECAL_ST_MASK (1 << 1)
233
234/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
235#define OMAP4430_DPLL_PER_RECAL_EN_SHIFT 3
236#define OMAP4430_DPLL_PER_RECAL_EN_MASK (1 << 3)
237
238/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
239#define OMAP4430_DPLL_PER_RECAL_ST_SHIFT 3
240#define OMAP4430_DPLL_PER_RECAL_ST_MASK (1 << 3)
241
242/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
243#define OMAP4430_DPLL_UNIPRO_RECAL_EN_SHIFT 7
244#define OMAP4430_DPLL_UNIPRO_RECAL_EN_MASK (1 << 7)
245
246/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
247#define OMAP4430_DPLL_UNIPRO_RECAL_ST_SHIFT 7
248#define OMAP4430_DPLL_UNIPRO_RECAL_ST_MASK (1 << 7)
249
250/* Used by PM_DSS_PWRSTCTRL */
251#define OMAP4430_DSS_MEM_ONSTATE_SHIFT 16
252#define OMAP4430_DSS_MEM_ONSTATE_MASK (0x3 << 16)
253
254/* Used by PM_DSS_PWRSTCTRL */
255#define OMAP4430_DSS_MEM_RETSTATE_SHIFT 8
256#define OMAP4430_DSS_MEM_RETSTATE_MASK (1 << 8)
257
258/* Used by PM_DSS_PWRSTST */
259#define OMAP4430_DSS_MEM_STATEST_SHIFT 4
260#define OMAP4430_DSS_MEM_STATEST_MASK (0x3 << 4)
261
262/* Used by PM_CORE_PWRSTCTRL */
263#define OMAP4430_DUCATI_L2RAM_ONSTATE_SHIFT 20
264#define OMAP4430_DUCATI_L2RAM_ONSTATE_MASK (0x3 << 20)
265
266/* Used by PM_CORE_PWRSTCTRL */
267#define OMAP4430_DUCATI_L2RAM_RETSTATE_SHIFT 10
268#define OMAP4430_DUCATI_L2RAM_RETSTATE_MASK (1 << 10)
269
270/* Used by PM_CORE_PWRSTST */
271#define OMAP4430_DUCATI_L2RAM_STATEST_SHIFT 8
272#define OMAP4430_DUCATI_L2RAM_STATEST_MASK (0x3 << 8)
273
274/* Used by PM_CORE_PWRSTCTRL */
275#define OMAP4430_DUCATI_UNICACHE_ONSTATE_SHIFT 22
276#define OMAP4430_DUCATI_UNICACHE_ONSTATE_MASK (0x3 << 22)
277
278/* Used by PM_CORE_PWRSTCTRL */
279#define OMAP4430_DUCATI_UNICACHE_RETSTATE_SHIFT 11
280#define OMAP4430_DUCATI_UNICACHE_RETSTATE_MASK (1 << 11)
281
282/* Used by PM_CORE_PWRSTST */
283#define OMAP4430_DUCATI_UNICACHE_STATEST_SHIFT 10
284#define OMAP4430_DUCATI_UNICACHE_STATEST_MASK (0x3 << 10)
285
286/* Used by PRM_DEVICE_OFF_CTRL */
287#define OMAP4460_EMIF1_OFFWKUP_DISABLE_SHIFT 8
288#define OMAP4460_EMIF1_OFFWKUP_DISABLE_MASK (1 << 8)
289
290/* Used by PRM_DEVICE_OFF_CTRL */
291#define OMAP4460_EMIF2_OFFWKUP_DISABLE_SHIFT 9
292#define OMAP4460_EMIF2_OFFWKUP_DISABLE_MASK (1 << 9)
293
294/* Used by RM_MPU_RSTST */
295#define OMAP4430_EMULATION_RST_SHIFT 0
296#define OMAP4430_EMULATION_RST_MASK (1 << 0)
297
298/* Used by RM_DUCATI_RSTST */
299#define OMAP4430_EMULATION_RST1ST_SHIFT 3
300#define OMAP4430_EMULATION_RST1ST_MASK (1 << 3)
301
302/* Used by RM_DUCATI_RSTST */
303#define OMAP4430_EMULATION_RST2ST_SHIFT 4
304#define OMAP4430_EMULATION_RST2ST_MASK (1 << 4)
305
306/* Used by RM_IVAHD_RSTST */
307#define OMAP4430_EMULATION_SEQ1_RST1ST_SHIFT 3
308#define OMAP4430_EMULATION_SEQ1_RST1ST_MASK (1 << 3)
309
310/* Used by RM_IVAHD_RSTST */
311#define OMAP4430_EMULATION_SEQ2_RST2ST_SHIFT 4
312#define OMAP4430_EMULATION_SEQ2_RST2ST_MASK (1 << 4)
313
314/* Used by PM_EMU_PWRSTCTRL */
315#define OMAP4430_EMU_BANK_ONSTATE_SHIFT 16
316#define OMAP4430_EMU_BANK_ONSTATE_MASK (0x3 << 16)
317
318/* Used by PM_EMU_PWRSTST */
319#define OMAP4430_EMU_BANK_STATEST_SHIFT 4
320#define OMAP4430_EMU_BANK_STATEST_MASK (0x3 << 4)
321
322/*
323 * Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_IVA_SETUP,
324 * PRM_LDO_SRAM_MPU_SETUP
325 */
326#define OMAP4430_ENFUNC1_EXPORT_SHIFT 3
327#define OMAP4430_ENFUNC1_EXPORT_MASK (1 << 3)
328
329/*
330 * Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_IVA_SETUP,
331 * PRM_LDO_SRAM_MPU_SETUP
332 */
333#define OMAP4430_ENFUNC3_EXPORT_SHIFT 5
334#define OMAP4430_ENFUNC3_EXPORT_MASK (1 << 5)
335
336/*
337 * Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_IVA_SETUP,
338 * PRM_LDO_SRAM_MPU_SETUP
339 */
340#define OMAP4430_ENFUNC4_SHIFT 6
341#define OMAP4430_ENFUNC4_MASK (1 << 6)
342
343/*
344 * Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_IVA_SETUP,
345 * PRM_LDO_SRAM_MPU_SETUP
346 */
347#define OMAP4430_ENFUNC5_SHIFT 7
348#define OMAP4430_ENFUNC5_MASK (1 << 7)
349
350/* Used by PRM_VP_CORE_CONFIG, PRM_VP_IVA_CONFIG, PRM_VP_MPU_CONFIG */
351#define OMAP4430_ERRORGAIN_SHIFT 16
352#define OMAP4430_ERRORGAIN_MASK (0xff << 16) 30#define OMAP4430_ERRORGAIN_MASK (0xff << 16)
353
354/* Used by PRM_VP_CORE_CONFIG, PRM_VP_IVA_CONFIG, PRM_VP_MPU_CONFIG */
355#define OMAP4430_ERROROFFSET_SHIFT 24
356#define OMAP4430_ERROROFFSET_MASK (0xff << 24) 31#define OMAP4430_ERROROFFSET_MASK (0xff << 24)
357
358/* Used by PRM_RSTST */
359#define OMAP4430_EXTERNAL_WARM_RST_SHIFT 5 32#define OMAP4430_EXTERNAL_WARM_RST_SHIFT 5
360#define OMAP4430_EXTERNAL_WARM_RST_MASK (1 << 5)
361
362/* Used by PRM_VP_CORE_CONFIG, PRM_VP_IVA_CONFIG, PRM_VP_MPU_CONFIG */
363#define OMAP4430_FORCEUPDATE_SHIFT 1
364#define OMAP4430_FORCEUPDATE_MASK (1 << 1) 33#define OMAP4430_FORCEUPDATE_MASK (1 << 1)
365
366/* Used by PRM_VP_CORE_VOLTAGE, PRM_VP_IVA_VOLTAGE, PRM_VP_MPU_VOLTAGE */
367#define OMAP4430_FORCEUPDATEWAIT_SHIFT 8
368#define OMAP4430_FORCEUPDATEWAIT_MASK (0xffffff << 8)
369
370/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_TESLA */
371#define OMAP4430_FORCEWKUP_EN_SHIFT 10
372#define OMAP4430_FORCEWKUP_EN_MASK (1 << 10)
373
374/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_TESLA */
375#define OMAP4430_FORCEWKUP_ST_SHIFT 10
376#define OMAP4430_FORCEWKUP_ST_MASK (1 << 10)
377
378/* Used by REVISION_PRM */
379#define OMAP4430_FUNC_SHIFT 16
380#define OMAP4430_FUNC_MASK (0xfff << 16)
381
382/* Used by PM_GFX_PWRSTCTRL */
383#define OMAP4430_GFX_MEM_ONSTATE_SHIFT 16
384#define OMAP4430_GFX_MEM_ONSTATE_MASK (0x3 << 16)
385
386/* Used by PM_GFX_PWRSTST */
387#define OMAP4430_GFX_MEM_STATEST_SHIFT 4
388#define OMAP4430_GFX_MEM_STATEST_MASK (0x3 << 4)
389
390/* Used by PRM_RSTST */
391#define OMAP4430_GLOBAL_COLD_RST_SHIFT 0 34#define OMAP4430_GLOBAL_COLD_RST_SHIFT 0
392#define OMAP4430_GLOBAL_COLD_RST_MASK (1 << 0)
393
394/* Used by PRM_RSTST */
395#define OMAP4430_GLOBAL_WARM_SW_RST_SHIFT 1 35#define OMAP4430_GLOBAL_WARM_SW_RST_SHIFT 1
396#define OMAP4430_GLOBAL_WARM_SW_RST_MASK (1 << 1)
397
398/* Used by PRM_IO_PMCTRL */
399#define OMAP4430_GLOBAL_WUEN_SHIFT 16
400#define OMAP4430_GLOBAL_WUEN_MASK (1 << 16) 36#define OMAP4430_GLOBAL_WUEN_MASK (1 << 16)
401
402/* Used by PRM_VC_CFG_I2C_MODE */
403#define OMAP4430_HSMCODE_SHIFT 0
404#define OMAP4430_HSMCODE_MASK (0x7 << 0) 37#define OMAP4430_HSMCODE_MASK (0x7 << 0)
405
406/* Used by PRM_VC_CFG_I2C_MODE */
407#define OMAP4430_HSMODEEN_SHIFT 3
408#define OMAP4430_HSMODEEN_MASK (1 << 3) 38#define OMAP4430_HSMODEEN_MASK (1 << 3)
409
410/* Used by PRM_VC_CFG_I2C_CLK */
411#define OMAP4430_HSSCLH_SHIFT 16
412#define OMAP4430_HSSCLH_MASK (0xff << 16)
413
414/* Used by PRM_VC_CFG_I2C_CLK */
415#define OMAP4430_HSSCLL_SHIFT 24 39#define OMAP4430_HSSCLL_SHIFT 24
416#define OMAP4430_HSSCLL_MASK (0xff << 24)
417
418/* Used by PM_IVAHD_PWRSTCTRL */
419#define OMAP4430_HWA_MEM_ONSTATE_SHIFT 16
420#define OMAP4430_HWA_MEM_ONSTATE_MASK (0x3 << 16)
421
422/* Used by PM_IVAHD_PWRSTCTRL */
423#define OMAP4430_HWA_MEM_RETSTATE_SHIFT 8
424#define OMAP4430_HWA_MEM_RETSTATE_MASK (1 << 8)
425
426/* Used by PM_IVAHD_PWRSTST */
427#define OMAP4430_HWA_MEM_STATEST_SHIFT 4
428#define OMAP4430_HWA_MEM_STATEST_MASK (0x3 << 4)
429
430/* Used by RM_MPU_RSTST */
431#define OMAP4430_ICECRUSHER_MPU_RST_SHIFT 1
432#define OMAP4430_ICECRUSHER_MPU_RST_MASK (1 << 1)
433
434/* Used by RM_DUCATI_RSTST */
435#define OMAP4430_ICECRUSHER_RST1ST_SHIFT 5
436#define OMAP4430_ICECRUSHER_RST1ST_MASK (1 << 5)
437
438/* Used by RM_DUCATI_RSTST */
439#define OMAP4430_ICECRUSHER_RST2ST_SHIFT 6
440#define OMAP4430_ICECRUSHER_RST2ST_MASK (1 << 6)
441
442/* Used by RM_IVAHD_RSTST */
443#define OMAP4430_ICECRUSHER_SEQ1_RST1ST_SHIFT 5
444#define OMAP4430_ICECRUSHER_SEQ1_RST1ST_MASK (1 << 5)
445
446/* Used by RM_IVAHD_RSTST */
447#define OMAP4430_ICECRUSHER_SEQ2_RST2ST_SHIFT 6
448#define OMAP4430_ICECRUSHER_SEQ2_RST2ST_MASK (1 << 6)
449
450/* Used by PRM_RSTST */
451#define OMAP4430_ICEPICK_RST_SHIFT 9 40#define OMAP4430_ICEPICK_RST_SHIFT 9
452#define OMAP4430_ICEPICK_RST_MASK (1 << 9)
453
454/* Used by PRM_VP_CORE_CONFIG, PRM_VP_IVA_CONFIG, PRM_VP_MPU_CONFIG */
455#define OMAP4430_INITVDD_SHIFT 2
456#define OMAP4430_INITVDD_MASK (1 << 2) 41#define OMAP4430_INITVDD_MASK (1 << 2)
457
458/* Used by PRM_VP_CORE_CONFIG, PRM_VP_IVA_CONFIG, PRM_VP_MPU_CONFIG */
459#define OMAP4430_INITVOLTAGE_SHIFT 8
460#define OMAP4430_INITVOLTAGE_MASK (0xff << 8) 42#define OMAP4430_INITVOLTAGE_MASK (0xff << 8)
461
462/*
463 * Used by PM_ABE_PWRSTST, PM_CAM_PWRSTST, PM_CEFUSE_PWRSTST, PM_CORE_PWRSTST,
464 * PM_DSS_PWRSTST, PM_EMU_PWRSTST, PM_GFX_PWRSTST, PM_IVAHD_PWRSTST,
465 * PM_L3INIT_PWRSTST, PM_L4PER_PWRSTST, PM_MPU_PWRSTST, PM_TESLA_PWRSTST
466 */
467#define OMAP4430_INTRANSITION_SHIFT 20
468#define OMAP4430_INTRANSITION_MASK (1 << 20)
469
470/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
471#define OMAP4430_IO_EN_SHIFT 9
472#define OMAP4430_IO_EN_MASK (1 << 9)
473
474/* Used by PRM_IO_PMCTRL */
475#define OMAP4430_IO_ON_STATUS_SHIFT 5
476#define OMAP4430_IO_ON_STATUS_MASK (1 << 5)
477
478/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
479#define OMAP4430_IO_ST_SHIFT 9
480#define OMAP4430_IO_ST_MASK (1 << 9)
481
482/* Used by PRM_IO_PMCTRL */
483#define OMAP4430_ISOCLK_OVERRIDE_SHIFT 0
484#define OMAP4430_ISOCLK_OVERRIDE_MASK (1 << 0)
485
486/* Used by PRM_IO_PMCTRL */
487#define OMAP4430_ISOCLK_STATUS_SHIFT 1
488#define OMAP4430_ISOCLK_STATUS_MASK (1 << 1)
489
490/* Used by PRM_IO_PMCTRL */
491#define OMAP4430_ISOOVR_EXTEND_SHIFT 4
492#define OMAP4430_ISOOVR_EXTEND_MASK (1 << 4)
493
494/* Used by PRM_IO_COUNT */
495#define OMAP4430_ISO_2_ON_TIME_SHIFT 0
496#define OMAP4430_ISO_2_ON_TIME_MASK (0xff << 0)
497
498/* Used by PM_L3INIT_PWRSTCTRL */
499#define OMAP4430_L3INIT_BANK1_ONSTATE_SHIFT 16
500#define OMAP4430_L3INIT_BANK1_ONSTATE_MASK (0x3 << 16)
501
502/* Used by PM_L3INIT_PWRSTCTRL */
503#define OMAP4430_L3INIT_BANK1_RETSTATE_SHIFT 8
504#define OMAP4430_L3INIT_BANK1_RETSTATE_MASK (1 << 8)
505
506/* Used by PM_L3INIT_PWRSTST */
507#define OMAP4430_L3INIT_BANK1_STATEST_SHIFT 4
508#define OMAP4430_L3INIT_BANK1_STATEST_MASK (0x3 << 4)
509
510/*
511 * Used by PM_ABE_PWRSTST, PM_CORE_PWRSTST, PM_IVAHD_PWRSTST,
512 * PM_L3INIT_PWRSTST, PM_L4PER_PWRSTST, PM_MPU_PWRSTST, PM_TESLA_PWRSTST
513 */
514#define OMAP4430_LASTPOWERSTATEENTERED_SHIFT 24 43#define OMAP4430_LASTPOWERSTATEENTERED_SHIFT 24
515#define OMAP4430_LASTPOWERSTATEENTERED_MASK (0x3 << 24) 44#define OMAP4430_LASTPOWERSTATEENTERED_MASK (0x3 << 24)
516
517/*
518 * Used by PM_ABE_PWRSTCTRL, PM_CORE_PWRSTCTRL, PM_DSS_PWRSTCTRL,
519 * PM_IVAHD_PWRSTCTRL, PM_L3INIT_PWRSTCTRL, PM_L4PER_PWRSTCTRL,
520 * PM_MPU_PWRSTCTRL, PM_TESLA_PWRSTCTRL
521 */
522#define OMAP4430_LOGICRETSTATE_SHIFT 2 45#define OMAP4430_LOGICRETSTATE_SHIFT 2
523#define OMAP4430_LOGICRETSTATE_MASK (1 << 2) 46#define OMAP4430_LOGICRETSTATE_MASK (1 << 2)
524
525/*
526 * Used by PM_ABE_PWRSTST, PM_CAM_PWRSTST, PM_CEFUSE_PWRSTST, PM_CORE_PWRSTST,
527 * PM_DSS_PWRSTST, PM_EMU_PWRSTST, PM_GFX_PWRSTST, PM_IVAHD_PWRSTST,
528 * PM_L3INIT_PWRSTST, PM_L4PER_PWRSTST, PM_MPU_PWRSTST, PM_TESLA_PWRSTST
529 */
530#define OMAP4430_LOGICSTATEST_SHIFT 2 47#define OMAP4430_LOGICSTATEST_SHIFT 2
531#define OMAP4430_LOGICSTATEST_MASK (1 << 2) 48#define OMAP4430_LOGICSTATEST_MASK (1 << 2)
532
533/*
534 * Used by RM_ABE_AESS_CONTEXT, RM_ABE_DMIC_CONTEXT, RM_ABE_MCASP_CONTEXT,
535 * RM_ABE_MCBSP1_CONTEXT, RM_ABE_MCBSP2_CONTEXT, RM_ABE_MCBSP3_CONTEXT,
536 * RM_ABE_PDM_CONTEXT, RM_ABE_SLIMBUS_CONTEXT, RM_ABE_TIMER5_CONTEXT,
537 * RM_ABE_TIMER6_CONTEXT, RM_ABE_TIMER7_CONTEXT, RM_ABE_TIMER8_CONTEXT,
538 * RM_ABE_WDT3_CONTEXT, RM_ALWON_MDMINTC_CONTEXT, RM_ALWON_SR_CORE_CONTEXT,
539 * RM_ALWON_SR_IVA_CONTEXT, RM_ALWON_SR_MPU_CONTEXT, RM_CAM_FDIF_CONTEXT,
540 * RM_CAM_ISS_CONTEXT, RM_CEFUSE_CEFUSE_CONTEXT, RM_D2D_SAD2D_CONTEXT,
541 * RM_D2D_SAD2D_FW_CONTEXT, RM_DSS_DEISS_CONTEXT, RM_DSS_DSS_CONTEXT,
542 * RM_DUCATI_DUCATI_CONTEXT, RM_EMU_DEBUGSS_CONTEXT, RM_GFX_GFX_CONTEXT,
543 * RM_IVAHD_IVAHD_CONTEXT, RM_IVAHD_SL2_CONTEXT, RM_L3INIT_CCPTX_CONTEXT,
544 * RM_L3INIT_EMAC_CONTEXT, RM_L3INIT_P1500_CONTEXT, RM_L3INIT_PCIESS_CONTEXT,
545 * RM_L3INIT_SATA_CONTEXT, RM_L3INIT_TPPSS_CONTEXT, RM_L3INIT_UNIPRO1_CONTEXT,
546 * RM_L3INIT_USBPHYOCP2SCP_CONTEXT, RM_L3INIT_XHPI_CONTEXT,
547 * RM_L3INSTR_L3_3_CONTEXT, RM_L3INSTR_L3_INSTR_CONTEXT,
548 * RM_L3INSTR_OCP_WP1_CONTEXT, RM_L3_1_L3_1_CONTEXT, RM_L3_2_L3_2_CONTEXT,
549 * RM_L3_2_OCMC_RAM_CONTEXT, RM_L4CFG_L4_CFG_CONTEXT, RM_L4CFG_SAR_ROM_CONTEXT,
550 * RM_L4PER_ADC_CONTEXT, RM_L4PER_DMTIMER10_CONTEXT,
551 * RM_L4PER_DMTIMER11_CONTEXT, RM_L4PER_DMTIMER2_CONTEXT,
552 * RM_L4PER_DMTIMER3_CONTEXT, RM_L4PER_DMTIMER4_CONTEXT,
553 * RM_L4PER_DMTIMER9_CONTEXT, RM_L4PER_ELM_CONTEXT, RM_L4PER_HDQ1W_CONTEXT,
554 * RM_L4PER_HECC1_CONTEXT, RM_L4PER_HECC2_CONTEXT, RM_L4PER_I2C2_CONTEXT,
555 * RM_L4PER_I2C3_CONTEXT, RM_L4PER_I2C4_CONTEXT, RM_L4PER_I2C5_CONTEXT,
556 * RM_L4PER_L4_PER_CONTEXT, RM_L4PER_MCASP2_CONTEXT, RM_L4PER_MCASP3_CONTEXT,
557 * RM_L4PER_MCBSP4_CONTEXT, RM_L4PER_MCSPI1_CONTEXT, RM_L4PER_MCSPI2_CONTEXT,
558 * RM_L4PER_MCSPI3_CONTEXT, RM_L4PER_MCSPI4_CONTEXT, RM_L4PER_MGATE_CONTEXT,
559 * RM_L4PER_MMCSD3_CONTEXT, RM_L4PER_MMCSD4_CONTEXT, RM_L4PER_MMCSD5_CONTEXT,
560 * RM_L4PER_MSPROHG_CONTEXT, RM_L4PER_SLIMBUS2_CONTEXT,
561 * RM_L4SEC_PKAEIP29_CONTEXT, RM_MEMIF_DLL_CONTEXT, RM_MEMIF_DLL_H_CONTEXT,
562 * RM_MEMIF_DMM_CONTEXT, RM_MEMIF_EMIF_1_CONTEXT, RM_MEMIF_EMIF_2_CONTEXT,
563 * RM_MEMIF_EMIF_FW_CONTEXT, RM_MPU_MPU_CONTEXT, RM_TESLA_TESLA_CONTEXT,
564 * RM_WKUP_GPIO1_CONTEXT, RM_WKUP_KEYBOARD_CONTEXT, RM_WKUP_L4WKUP_CONTEXT,
565 * RM_WKUP_RTC_CONTEXT, RM_WKUP_SARRAM_CONTEXT, RM_WKUP_SYNCTIMER_CONTEXT,
566 * RM_WKUP_TIMER12_CONTEXT, RM_WKUP_TIMER1_CONTEXT, RM_WKUP_USIM_CONTEXT,
567 * RM_WKUP_WDT1_CONTEXT, RM_WKUP_WDT2_CONTEXT
568 */
569#define OMAP4430_LOSTCONTEXT_DFF_SHIFT 0
570#define OMAP4430_LOSTCONTEXT_DFF_MASK (1 << 0) 49#define OMAP4430_LOSTCONTEXT_DFF_MASK (1 << 0)
571
572/*
573 * Used by RM_D2D_MODEM_ICR_CONTEXT, RM_D2D_SAD2D_CONTEXT,
574 * RM_D2D_SAD2D_FW_CONTEXT, RM_DSS_DSS_CONTEXT, RM_DUCATI_DUCATI_CONTEXT,
575 * RM_L3INIT_HSI_CONTEXT, RM_L3INIT_MMC1_CONTEXT, RM_L3INIT_MMC2_CONTEXT,
576 * RM_L3INIT_MMC6_CONTEXT, RM_L3INIT_USB_HOST_CONTEXT,
577 * RM_L3INIT_USB_HOST_FS_CONTEXT, RM_L3INIT_USB_OTG_CONTEXT,
578 * RM_L3INIT_USB_TLL_CONTEXT, RM_L3INSTR_L3_3_CONTEXT,
579 * RM_L3INSTR_OCP_WP1_CONTEXT, RM_L3_1_L3_1_CONTEXT, RM_L3_2_GPMC_CONTEXT,
580 * RM_L3_2_L3_2_CONTEXT, RM_L4CFG_HW_SEM_CONTEXT, RM_L4CFG_L4_CFG_CONTEXT,
581 * RM_L4CFG_MAILBOX_CONTEXT, RM_L4PER_GPIO2_CONTEXT, RM_L4PER_GPIO3_CONTEXT,
582 * RM_L4PER_GPIO4_CONTEXT, RM_L4PER_GPIO5_CONTEXT, RM_L4PER_GPIO6_CONTEXT,
583 * RM_L4PER_I2C1_CONTEXT, RM_L4PER_L4_PER_CONTEXT, RM_L4PER_UART1_CONTEXT,
584 * RM_L4PER_UART2_CONTEXT, RM_L4PER_UART3_CONTEXT, RM_L4PER_UART4_CONTEXT,
585 * RM_L4SEC_AES1_CONTEXT, RM_L4SEC_AES2_CONTEXT, RM_L4SEC_CRYPTODMA_CONTEXT,
586 * RM_L4SEC_DES3DES_CONTEXT, RM_L4SEC_RNG_CONTEXT, RM_L4SEC_SHA2MD51_CONTEXT,
587 * RM_MEMIF_DMM_CONTEXT, RM_MEMIF_EMIF_1_CONTEXT, RM_MEMIF_EMIF_2_CONTEXT,
588 * RM_MEMIF_EMIF_FW_CONTEXT, RM_MEMIF_EMIF_H1_CONTEXT,
589 * RM_MEMIF_EMIF_H2_CONTEXT, RM_SDMA_SDMA_CONTEXT, RM_TESLA_TESLA_CONTEXT
590 */
591#define OMAP4430_LOSTCONTEXT_RFF_SHIFT 1
592#define OMAP4430_LOSTCONTEXT_RFF_MASK (1 << 1)
593
594/* Used by RM_ABE_AESS_CONTEXT */
595#define OMAP4430_LOSTMEM_AESSMEM_SHIFT 8
596#define OMAP4430_LOSTMEM_AESSMEM_MASK (1 << 8) 50#define OMAP4430_LOSTMEM_AESSMEM_MASK (1 << 8)
597
598/* Used by RM_CAM_FDIF_CONTEXT, RM_CAM_ISS_CONTEXT */
599#define OMAP4430_LOSTMEM_CAM_MEM_SHIFT 8
600#define OMAP4430_LOSTMEM_CAM_MEM_MASK (1 << 8)
601
602/* Used by RM_L3INSTR_OCP_WP1_CONTEXT */
603#define OMAP4430_LOSTMEM_CORE_NRET_BANK_SHIFT 8
604#define OMAP4430_LOSTMEM_CORE_NRET_BANK_MASK (1 << 8)
605
606/* Renamed from LOSTMEM_CORE_NRET_BANK Used by RM_MEMIF_DMM_CONTEXT */
607#define OMAP4430_LOSTMEM_CORE_NRET_BANK_9_9_SHIFT 9
608#define OMAP4430_LOSTMEM_CORE_NRET_BANK_9_9_MASK (1 << 9)
609
610/* Used by RM_L3_2_OCMC_RAM_CONTEXT */
611#define OMAP4430_LOSTMEM_CORE_OCMRAM_SHIFT 8
612#define OMAP4430_LOSTMEM_CORE_OCMRAM_MASK (1 << 8)
613
614/*
615 * Used by RM_D2D_MODEM_ICR_CONTEXT, RM_MEMIF_DMM_CONTEXT,
616 * RM_SDMA_SDMA_CONTEXT
617 */
618#define OMAP4430_LOSTMEM_CORE_OTHER_BANK_SHIFT 8
619#define OMAP4430_LOSTMEM_CORE_OTHER_BANK_MASK (1 << 8)
620
621/* Used by RM_DSS_DEISS_CONTEXT, RM_DSS_DSS_CONTEXT */
622#define OMAP4430_LOSTMEM_DSS_MEM_SHIFT 8
623#define OMAP4430_LOSTMEM_DSS_MEM_MASK (1 << 8)
624
625/* Used by RM_DUCATI_DUCATI_CONTEXT */
626#define OMAP4430_LOSTMEM_DUCATI_L2RAM_SHIFT 9
627#define OMAP4430_LOSTMEM_DUCATI_L2RAM_MASK (1 << 9)
628
629/* Used by RM_DUCATI_DUCATI_CONTEXT */
630#define OMAP4430_LOSTMEM_DUCATI_UNICACHE_SHIFT 8
631#define OMAP4430_LOSTMEM_DUCATI_UNICACHE_MASK (1 << 8)
632
633/* Used by RM_EMU_DEBUGSS_CONTEXT */
634#define OMAP4430_LOSTMEM_EMU_BANK_SHIFT 8
635#define OMAP4430_LOSTMEM_EMU_BANK_MASK (1 << 8)
636
637/* Used by RM_GFX_GFX_CONTEXT */
638#define OMAP4430_LOSTMEM_GFX_MEM_SHIFT 8
639#define OMAP4430_LOSTMEM_GFX_MEM_MASK (1 << 8)
640
641/* Used by RM_IVAHD_IVAHD_CONTEXT */
642#define OMAP4430_LOSTMEM_HWA_MEM_SHIFT 10
643#define OMAP4430_LOSTMEM_HWA_MEM_MASK (1 << 10)
644
645/*
646 * Used by RM_L3INIT_CCPTX_CONTEXT, RM_L3INIT_EMAC_CONTEXT,
647 * RM_L3INIT_HSI_CONTEXT, RM_L3INIT_MMC1_CONTEXT, RM_L3INIT_MMC2_CONTEXT,
648 * RM_L3INIT_MMC6_CONTEXT, RM_L3INIT_PCIESS_CONTEXT, RM_L3INIT_SATA_CONTEXT,
649 * RM_L3INIT_TPPSS_CONTEXT, RM_L3INIT_UNIPRO1_CONTEXT,
650 * RM_L3INIT_USB_OTG_CONTEXT, RM_L3INIT_XHPI_CONTEXT
651 */
652#define OMAP4430_LOSTMEM_L3INIT_BANK1_SHIFT 8
653#define OMAP4430_LOSTMEM_L3INIT_BANK1_MASK (1 << 8)
654
655/* Used by RM_MPU_MPU_CONTEXT */
656#define OMAP4430_LOSTMEM_MPU_L1_SHIFT 8
657#define OMAP4430_LOSTMEM_MPU_L1_MASK (1 << 8)
658
659/* Used by RM_MPU_MPU_CONTEXT */
660#define OMAP4430_LOSTMEM_MPU_L2_SHIFT 9
661#define OMAP4430_LOSTMEM_MPU_L2_MASK (1 << 9)
662
663/* Used by RM_MPU_MPU_CONTEXT */
664#define OMAP4430_LOSTMEM_MPU_RAM_SHIFT 10
665#define OMAP4430_LOSTMEM_MPU_RAM_MASK (1 << 10)
666
667/*
668 * Used by RM_L4PER_HECC1_CONTEXT, RM_L4PER_HECC2_CONTEXT,
669 * RM_L4PER_MCBSP4_CONTEXT, RM_L4PER_MMCSD3_CONTEXT, RM_L4PER_MMCSD4_CONTEXT,
670 * RM_L4PER_MMCSD5_CONTEXT, RM_L4PER_SLIMBUS2_CONTEXT, RM_L4SEC_PKAEIP29_CONTEXT
671 */
672#define OMAP4430_LOSTMEM_NONRETAINED_BANK_SHIFT 8
673#define OMAP4430_LOSTMEM_NONRETAINED_BANK_MASK (1 << 8)
674
675/*
676 * Used by RM_ABE_DMIC_CONTEXT, RM_ABE_MCBSP1_CONTEXT, RM_ABE_MCBSP2_CONTEXT,
677 * RM_ABE_MCBSP3_CONTEXT, RM_ABE_PDM_CONTEXT, RM_ABE_SLIMBUS_CONTEXT
678 */
679#define OMAP4430_LOSTMEM_PERIHPMEM_SHIFT 8
680#define OMAP4430_LOSTMEM_PERIHPMEM_MASK (1 << 8)
681
682/*
683 * Used by RM_L4PER_MSPROHG_CONTEXT, RM_L4PER_UART1_CONTEXT,
684 * RM_L4PER_UART2_CONTEXT, RM_L4PER_UART3_CONTEXT, RM_L4PER_UART4_CONTEXT,
685 * RM_L4SEC_CRYPTODMA_CONTEXT
686 */
687#define OMAP4430_LOSTMEM_RETAINED_BANK_SHIFT 8
688#define OMAP4430_LOSTMEM_RETAINED_BANK_MASK (1 << 8)
689
690/* Used by RM_IVAHD_SL2_CONTEXT */
691#define OMAP4430_LOSTMEM_SL2_MEM_SHIFT 8
692#define OMAP4430_LOSTMEM_SL2_MEM_MASK (1 << 8)
693
694/* Used by RM_IVAHD_IVAHD_CONTEXT */
695#define OMAP4430_LOSTMEM_TCM1_MEM_SHIFT 8
696#define OMAP4430_LOSTMEM_TCM1_MEM_MASK (1 << 8)
697
698/* Used by RM_IVAHD_IVAHD_CONTEXT */
699#define OMAP4430_LOSTMEM_TCM2_MEM_SHIFT 9
700#define OMAP4430_LOSTMEM_TCM2_MEM_MASK (1 << 9)
701
702/* Used by RM_TESLA_TESLA_CONTEXT */
703#define OMAP4430_LOSTMEM_TESLA_EDMA_SHIFT 10
704#define OMAP4430_LOSTMEM_TESLA_EDMA_MASK (1 << 10)
705
706/* Used by RM_TESLA_TESLA_CONTEXT */
707#define OMAP4430_LOSTMEM_TESLA_L1_SHIFT 8
708#define OMAP4430_LOSTMEM_TESLA_L1_MASK (1 << 8)
709
710/* Used by RM_TESLA_TESLA_CONTEXT */
711#define OMAP4430_LOSTMEM_TESLA_L2_SHIFT 9
712#define OMAP4430_LOSTMEM_TESLA_L2_MASK (1 << 9)
713
714/* Used by RM_WKUP_SARRAM_CONTEXT */
715#define OMAP4430_LOSTMEM_WKUP_BANK_SHIFT 8
716#define OMAP4430_LOSTMEM_WKUP_BANK_MASK (1 << 8)
717
718/*
719 * Used by PM_ABE_PWRSTCTRL, PM_CAM_PWRSTCTRL, PM_CEFUSE_PWRSTCTRL,
720 * PM_CORE_PWRSTCTRL, PM_DSS_PWRSTCTRL, PM_GFX_PWRSTCTRL, PM_IVAHD_PWRSTCTRL,
721 * PM_L3INIT_PWRSTCTRL, PM_L4PER_PWRSTCTRL, PM_MPU_PWRSTCTRL, PM_TESLA_PWRSTCTRL
722 */
723#define OMAP4430_LOWPOWERSTATECHANGE_SHIFT 4 51#define OMAP4430_LOWPOWERSTATECHANGE_SHIFT 4
724#define OMAP4430_LOWPOWERSTATECHANGE_MASK (1 << 4) 52#define OMAP4430_LOWPOWERSTATECHANGE_MASK (1 << 4)
725
726/* Used by PRM_MODEM_IF_CTRL */
727#define OMAP4430_MODEM_READY_SHIFT 1
728#define OMAP4430_MODEM_READY_MASK (1 << 1)
729
730/* Used by PRM_MODEM_IF_CTRL */
731#define OMAP4430_MODEM_SHUTDOWN_IRQ_SHIFT 9
732#define OMAP4430_MODEM_SHUTDOWN_IRQ_MASK (1 << 9)
733
734/* Used by PRM_MODEM_IF_CTRL */
735#define OMAP4430_MODEM_SLEEP_ST_SHIFT 16
736#define OMAP4430_MODEM_SLEEP_ST_MASK (1 << 16)
737
738/* Used by PRM_MODEM_IF_CTRL */
739#define OMAP4430_MODEM_WAKE_IRQ_SHIFT 8
740#define OMAP4430_MODEM_WAKE_IRQ_MASK (1 << 8)
741
742/* Used by PM_MPU_PWRSTCTRL */
743#define OMAP4430_MPU_L1_ONSTATE_SHIFT 16
744#define OMAP4430_MPU_L1_ONSTATE_MASK (0x3 << 16)
745
746/* Used by PM_MPU_PWRSTCTRL */
747#define OMAP4430_MPU_L1_RETSTATE_SHIFT 8
748#define OMAP4430_MPU_L1_RETSTATE_MASK (1 << 8)
749
750/* Used by PM_MPU_PWRSTST */
751#define OMAP4430_MPU_L1_STATEST_SHIFT 4
752#define OMAP4430_MPU_L1_STATEST_MASK (0x3 << 4)
753
754/* Used by PM_MPU_PWRSTCTRL */
755#define OMAP4430_MPU_L2_ONSTATE_SHIFT 18
756#define OMAP4430_MPU_L2_ONSTATE_MASK (0x3 << 18)
757
758/* Used by PM_MPU_PWRSTCTRL */
759#define OMAP4430_MPU_L2_RETSTATE_SHIFT 9
760#define OMAP4430_MPU_L2_RETSTATE_MASK (1 << 9)
761
762/* Used by PM_MPU_PWRSTST */
763#define OMAP4430_MPU_L2_STATEST_SHIFT 6
764#define OMAP4430_MPU_L2_STATEST_MASK (0x3 << 6)
765
766/* Used by PM_MPU_PWRSTCTRL */
767#define OMAP4430_MPU_RAM_ONSTATE_SHIFT 20
768#define OMAP4430_MPU_RAM_ONSTATE_MASK (0x3 << 20)
769
770/* Used by PM_MPU_PWRSTCTRL */
771#define OMAP4430_MPU_RAM_RETSTATE_SHIFT 10
772#define OMAP4430_MPU_RAM_RETSTATE_MASK (1 << 10)
773
774/* Used by PM_MPU_PWRSTST */
775#define OMAP4430_MPU_RAM_STATEST_SHIFT 8
776#define OMAP4430_MPU_RAM_STATEST_MASK (0x3 << 8)
777
778/* Used by PRM_RSTST */
779#define OMAP4430_MPU_SECURITY_VIOL_RST_SHIFT 2 53#define OMAP4430_MPU_SECURITY_VIOL_RST_SHIFT 2
780#define OMAP4430_MPU_SECURITY_VIOL_RST_MASK (1 << 2)
781
782/* Used by PRM_RSTST */
783#define OMAP4430_MPU_WDT_RST_SHIFT 3 54#define OMAP4430_MPU_WDT_RST_SHIFT 3
784#define OMAP4430_MPU_WDT_RST_MASK (1 << 3)
785
786/* Used by PM_L4PER_PWRSTCTRL */
787#define OMAP4430_NONRETAINED_BANK_ONSTATE_SHIFT 18
788#define OMAP4430_NONRETAINED_BANK_ONSTATE_MASK (0x3 << 18)
789
790/* Used by PM_L4PER_PWRSTCTRL */
791#define OMAP4430_NONRETAINED_BANK_RETSTATE_SHIFT 9
792#define OMAP4430_NONRETAINED_BANK_RETSTATE_MASK (1 << 9)
793
794/* Used by PM_L4PER_PWRSTST */
795#define OMAP4430_NONRETAINED_BANK_STATEST_SHIFT 6
796#define OMAP4430_NONRETAINED_BANK_STATEST_MASK (0x3 << 6)
797
798/* Used by PM_CORE_PWRSTCTRL */
799#define OMAP4430_OCP_NRET_BANK_ONSTATE_SHIFT 24
800#define OMAP4430_OCP_NRET_BANK_ONSTATE_MASK (0x3 << 24) 55#define OMAP4430_OCP_NRET_BANK_ONSTATE_MASK (0x3 << 24)
801
802/* Used by PM_CORE_PWRSTCTRL */
803#define OMAP4430_OCP_NRET_BANK_RETSTATE_SHIFT 12
804#define OMAP4430_OCP_NRET_BANK_RETSTATE_MASK (1 << 12) 56#define OMAP4430_OCP_NRET_BANK_RETSTATE_MASK (1 << 12)
805
806/* Used by PM_CORE_PWRSTST */
807#define OMAP4430_OCP_NRET_BANK_STATEST_SHIFT 12
808#define OMAP4430_OCP_NRET_BANK_STATEST_MASK (0x3 << 12) 57#define OMAP4430_OCP_NRET_BANK_STATEST_MASK (0x3 << 12)
809
810/*
811 * Used by PRM_VC_VAL_CMD_VDD_CORE_L, PRM_VC_VAL_CMD_VDD_IVA_L,
812 * PRM_VC_VAL_CMD_VDD_MPU_L
813 */
814#define OMAP4430_OFF_SHIFT 0 58#define OMAP4430_OFF_SHIFT 0
815#define OMAP4430_OFF_MASK (0xff << 0)
816
817/*
818 * Used by PRM_VC_VAL_CMD_VDD_CORE_L, PRM_VC_VAL_CMD_VDD_IVA_L,
819 * PRM_VC_VAL_CMD_VDD_MPU_L
820 */
821#define OMAP4430_ON_SHIFT 24 59#define OMAP4430_ON_SHIFT 24
822#define OMAP4430_ON_MASK (0xff << 24) 60#define OMAP4430_ON_MASK (0xff << 24)
823
824/*
825 * Used by PRM_VC_VAL_CMD_VDD_CORE_L, PRM_VC_VAL_CMD_VDD_IVA_L,
826 * PRM_VC_VAL_CMD_VDD_MPU_L
827 */
828#define OMAP4430_ONLP_SHIFT 16 61#define OMAP4430_ONLP_SHIFT 16
829#define OMAP4430_ONLP_MASK (0xff << 16)
830
831/* Used by PRM_LDO_ABB_IVA_CTRL, PRM_LDO_ABB_MPU_CTRL */
832#define OMAP4430_OPP_CHANGE_SHIFT 2
833#define OMAP4430_OPP_CHANGE_MASK (1 << 2)
834
835/* Used by PRM_LDO_ABB_IVA_CTRL, PRM_LDO_ABB_MPU_CTRL */
836#define OMAP4430_OPP_SEL_SHIFT 0
837#define OMAP4430_OPP_SEL_MASK (0x3 << 0)
838
839/* Used by PRM_SRAM_COUNT */
840#define OMAP4430_PCHARGECNT_VALUE_SHIFT 0
841#define OMAP4430_PCHARGECNT_VALUE_MASK (0x3f << 0)
842
843/* Used by PRM_PSCON_COUNT */
844#define OMAP4430_PCHARGE_TIME_SHIFT 0
845#define OMAP4430_PCHARGE_TIME_MASK (0xff << 0)
846
847/* Used by PM_ABE_PWRSTCTRL */
848#define OMAP4430_PERIPHMEM_ONSTATE_SHIFT 20
849#define OMAP4430_PERIPHMEM_ONSTATE_MASK (0x3 << 20)
850
851/* Used by PM_ABE_PWRSTCTRL */
852#define OMAP4430_PERIPHMEM_RETSTATE_SHIFT 10
853#define OMAP4430_PERIPHMEM_RETSTATE_MASK (1 << 10)
854
855/* Used by PM_ABE_PWRSTST */
856#define OMAP4430_PERIPHMEM_STATEST_SHIFT 8
857#define OMAP4430_PERIPHMEM_STATEST_MASK (0x3 << 8)
858
859/* Used by PRM_PHASE1_CNDP */
860#define OMAP4430_PHASE1_CNDP_SHIFT 0
861#define OMAP4430_PHASE1_CNDP_MASK (0xffffffff << 0)
862
863/* Used by PRM_PHASE2A_CNDP */
864#define OMAP4430_PHASE2A_CNDP_SHIFT 0
865#define OMAP4430_PHASE2A_CNDP_MASK (0xffffffff << 0)
866
867/* Used by PRM_PHASE2B_CNDP */
868#define OMAP4430_PHASE2B_CNDP_SHIFT 0
869#define OMAP4430_PHASE2B_CNDP_MASK (0xffffffff << 0)
870
871/* Used by PRM_PSCON_COUNT */
872#define OMAP4430_PONOUT_2_PGOODIN_TIME_SHIFT 8
873#define OMAP4430_PONOUT_2_PGOODIN_TIME_MASK (0xff << 8)
874
875/*
876 * Used by PM_ABE_PWRSTCTRL, PM_CAM_PWRSTCTRL, PM_CEFUSE_PWRSTCTRL,
877 * PM_CORE_PWRSTCTRL, PM_DSS_PWRSTCTRL, PM_EMU_PWRSTCTRL, PM_GFX_PWRSTCTRL,
878 * PM_IVAHD_PWRSTCTRL, PM_L3INIT_PWRSTCTRL, PM_L4PER_PWRSTCTRL,
879 * PM_MPU_PWRSTCTRL, PM_TESLA_PWRSTCTRL
880 */
881#define OMAP4430_POWERSTATE_SHIFT 0
882#define OMAP4430_POWERSTATE_MASK (0x3 << 0)
883
884/*
885 * Used by PM_ABE_PWRSTST, PM_CAM_PWRSTST, PM_CEFUSE_PWRSTST, PM_CORE_PWRSTST,
886 * PM_DSS_PWRSTST, PM_EMU_PWRSTST, PM_GFX_PWRSTST, PM_IVAHD_PWRSTST,
887 * PM_L3INIT_PWRSTST, PM_L4PER_PWRSTST, PM_MPU_PWRSTST, PM_TESLA_PWRSTST
888 */
889#define OMAP4430_POWERSTATEST_SHIFT 0
890#define OMAP4430_POWERSTATEST_MASK (0x3 << 0)
891
892/* Used by PRM_PWRREQCTRL */
893#define OMAP4430_PWRREQ_COND_SHIFT 0
894#define OMAP4430_PWRREQ_COND_MASK (0x3 << 0)
895
896/* Used by PRM_VC_CFG_CHANNEL */
897#define OMAP4430_RACEN_VDD_CORE_L_SHIFT 3
898#define OMAP4430_RACEN_VDD_CORE_L_MASK (1 << 3)
899
900/* Used by PRM_VC_CFG_CHANNEL */
901#define OMAP4430_RACEN_VDD_IVA_L_SHIFT 11
902#define OMAP4430_RACEN_VDD_IVA_L_MASK (1 << 11)
903
904/* Used by PRM_VC_CFG_CHANNEL */
905#define OMAP4430_RACEN_VDD_MPU_L_SHIFT 20
906#define OMAP4430_RACEN_VDD_MPU_L_MASK (1 << 20)
907
908/* Used by PRM_VC_CFG_CHANNEL */
909#define OMAP4430_RAC_VDD_CORE_L_SHIFT 2
910#define OMAP4430_RAC_VDD_CORE_L_MASK (1 << 2)
911
912/* Used by PRM_VC_CFG_CHANNEL */
913#define OMAP4430_RAC_VDD_IVA_L_SHIFT 10
914#define OMAP4430_RAC_VDD_IVA_L_MASK (1 << 10)
915
916/* Used by PRM_VC_CFG_CHANNEL */
917#define OMAP4430_RAC_VDD_MPU_L_SHIFT 19
918#define OMAP4430_RAC_VDD_MPU_L_MASK (1 << 19)
919
920/*
921 * Used by PRM_VOLTSETUP_CORE_OFF, PRM_VOLTSETUP_CORE_RET_SLEEP,
922 * PRM_VOLTSETUP_IVA_OFF, PRM_VOLTSETUP_IVA_RET_SLEEP, PRM_VOLTSETUP_MPU_OFF,
923 * PRM_VOLTSETUP_MPU_RET_SLEEP
924 */
925#define OMAP4430_RAMP_DOWN_COUNT_SHIFT 16 62#define OMAP4430_RAMP_DOWN_COUNT_SHIFT 16
926#define OMAP4430_RAMP_DOWN_COUNT_MASK (0x3f << 16)
927
928/*
929 * Used by PRM_VOLTSETUP_CORE_OFF, PRM_VOLTSETUP_CORE_RET_SLEEP,
930 * PRM_VOLTSETUP_IVA_OFF, PRM_VOLTSETUP_IVA_RET_SLEEP, PRM_VOLTSETUP_MPU_OFF,
931 * PRM_VOLTSETUP_MPU_RET_SLEEP
932 */
933#define OMAP4430_RAMP_DOWN_PRESCAL_SHIFT 24
934#define OMAP4430_RAMP_DOWN_PRESCAL_MASK (0x3 << 24)
935
936/*
937 * Used by PRM_VOLTSETUP_CORE_OFF, PRM_VOLTSETUP_CORE_RET_SLEEP,
938 * PRM_VOLTSETUP_IVA_OFF, PRM_VOLTSETUP_IVA_RET_SLEEP, PRM_VOLTSETUP_MPU_OFF,
939 * PRM_VOLTSETUP_MPU_RET_SLEEP
940 */
941#define OMAP4430_RAMP_UP_COUNT_SHIFT 0 63#define OMAP4430_RAMP_UP_COUNT_SHIFT 0
942#define OMAP4430_RAMP_UP_COUNT_MASK (0x3f << 0)
943
944/*
945 * Used by PRM_VOLTSETUP_CORE_OFF, PRM_VOLTSETUP_CORE_RET_SLEEP,
946 * PRM_VOLTSETUP_IVA_OFF, PRM_VOLTSETUP_IVA_RET_SLEEP, PRM_VOLTSETUP_MPU_OFF,
947 * PRM_VOLTSETUP_MPU_RET_SLEEP
948 */
949#define OMAP4430_RAMP_UP_PRESCAL_SHIFT 8 64#define OMAP4430_RAMP_UP_PRESCAL_SHIFT 8
950#define OMAP4430_RAMP_UP_PRESCAL_MASK (0x3 << 8)
951
952/* Used by PRM_VC_CFG_CHANNEL */
953#define OMAP4430_RAV_VDD_CORE_L_SHIFT 1
954#define OMAP4430_RAV_VDD_CORE_L_MASK (1 << 1)
955
956/* Used by PRM_VC_CFG_CHANNEL */
957#define OMAP4430_RAV_VDD_IVA_L_SHIFT 9
958#define OMAP4430_RAV_VDD_IVA_L_MASK (1 << 9)
959
960/* Used by PRM_VC_CFG_CHANNEL */
961#define OMAP4430_RAV_VDD_MPU_L_SHIFT 18
962#define OMAP4430_RAV_VDD_MPU_L_MASK (1 << 18)
963
964/* Used by PRM_VC_VAL_BYPASS */
965#define OMAP4430_REGADDR_SHIFT 8 65#define OMAP4430_REGADDR_SHIFT 8
966#define OMAP4430_REGADDR_MASK (0xff << 8)
967
968/*
969 * Used by PRM_VC_VAL_CMD_VDD_CORE_L, PRM_VC_VAL_CMD_VDD_IVA_L,
970 * PRM_VC_VAL_CMD_VDD_MPU_L
971 */
972#define OMAP4430_RET_SHIFT 8 66#define OMAP4430_RET_SHIFT 8
973#define OMAP4430_RET_MASK (0xff << 8)
974
975/* Used by PM_L4PER_PWRSTCTRL */
976#define OMAP4430_RETAINED_BANK_ONSTATE_SHIFT 16
977#define OMAP4430_RETAINED_BANK_ONSTATE_MASK (0x3 << 16)
978
979/* Used by PM_L4PER_PWRSTCTRL */
980#define OMAP4430_RETAINED_BANK_RETSTATE_SHIFT 8
981#define OMAP4430_RETAINED_BANK_RETSTATE_MASK (1 << 8)
982
983/* Used by PM_L4PER_PWRSTST */
984#define OMAP4430_RETAINED_BANK_STATEST_SHIFT 4
985#define OMAP4430_RETAINED_BANK_STATEST_MASK (0x3 << 4)
986
987/*
988 * Used by PRM_LDO_SRAM_CORE_CTRL, PRM_LDO_SRAM_IVA_CTRL,
989 * PRM_LDO_SRAM_MPU_CTRL
990 */
991#define OMAP4430_RETMODE_ENABLE_SHIFT 0
992#define OMAP4430_RETMODE_ENABLE_MASK (1 << 0)
993
994/* Used by RM_DUCATI_RSTCTRL, RM_IVAHD_RSTCTRL, RM_TESLA_RSTCTRL */
995#define OMAP4430_RST1_SHIFT 0
996#define OMAP4430_RST1_MASK (1 << 0)
997
998/* Used by RM_DUCATI_RSTST, RM_IVAHD_RSTST, RM_TESLA_RSTST */
999#define OMAP4430_RST1ST_SHIFT 0
1000#define OMAP4430_RST1ST_MASK (1 << 0)
1001
1002/* Used by RM_DUCATI_RSTCTRL, RM_IVAHD_RSTCTRL, RM_TESLA_RSTCTRL */
1003#define OMAP4430_RST2_SHIFT 1
1004#define OMAP4430_RST2_MASK (1 << 1)
1005
1006/* Used by RM_DUCATI_RSTST, RM_IVAHD_RSTST, RM_TESLA_RSTST */
1007#define OMAP4430_RST2ST_SHIFT 1
1008#define OMAP4430_RST2ST_MASK (1 << 1)
1009
1010/* Used by RM_DUCATI_RSTCTRL, RM_IVAHD_RSTCTRL */
1011#define OMAP4430_RST3_SHIFT 2
1012#define OMAP4430_RST3_MASK (1 << 2)
1013
1014/* Used by RM_DUCATI_RSTST, RM_IVAHD_RSTST */
1015#define OMAP4430_RST3ST_SHIFT 2
1016#define OMAP4430_RST3ST_MASK (1 << 2)
1017
1018/* Used by PRM_RSTTIME */
1019#define OMAP4430_RSTTIME1_SHIFT 0
1020#define OMAP4430_RSTTIME1_MASK (0x3ff << 0)
1021
1022/* Used by PRM_RSTTIME */
1023#define OMAP4430_RSTTIME2_SHIFT 10
1024#define OMAP4430_RSTTIME2_MASK (0x1f << 10)
1025
1026/* Used by PRM_RSTCTRL */
1027#define OMAP4430_RST_GLOBAL_COLD_SW_SHIFT 1
1028#define OMAP4430_RST_GLOBAL_COLD_SW_MASK (1 << 1)
1029
1030/* Used by PRM_RSTCTRL */
1031#define OMAP4430_RST_GLOBAL_WARM_SW_SHIFT 0
1032#define OMAP4430_RST_GLOBAL_WARM_SW_MASK (1 << 0) 67#define OMAP4430_RST_GLOBAL_WARM_SW_MASK (1 << 0)
1033
1034/* Used by REVISION_PRM */
1035#define OMAP4430_R_RTL_SHIFT 11
1036#define OMAP4430_R_RTL_MASK (0x1f << 11)
1037
1038/* Used by PRM_VC_CFG_CHANNEL */
1039#define OMAP4430_SA_VDD_CORE_L_SHIFT 0 68#define OMAP4430_SA_VDD_CORE_L_SHIFT 0
1040#define OMAP4430_SA_VDD_CORE_L_MASK (1 << 0)
1041
1042/* Renamed from SA_VDD_CORE_L Used by PRM_VC_SMPS_SA */
1043#define OMAP4430_SA_VDD_CORE_L_0_6_SHIFT 0
1044#define OMAP4430_SA_VDD_CORE_L_0_6_MASK (0x7f << 0) 69#define OMAP4430_SA_VDD_CORE_L_0_6_MASK (0x7f << 0)
1045
1046/* Used by PRM_VC_CFG_CHANNEL */
1047#define OMAP4430_SA_VDD_IVA_L_SHIFT 8 70#define OMAP4430_SA_VDD_IVA_L_SHIFT 8
1048#define OMAP4430_SA_VDD_IVA_L_MASK (1 << 8)
1049
1050/* Renamed from SA_VDD_IVA_L Used by PRM_VC_SMPS_SA */
1051#define OMAP4430_SA_VDD_IVA_L_PRM_VC_SMPS_SA_SHIFT 8
1052#define OMAP4430_SA_VDD_IVA_L_PRM_VC_SMPS_SA_MASK (0x7f << 8) 71#define OMAP4430_SA_VDD_IVA_L_PRM_VC_SMPS_SA_MASK (0x7f << 8)
1053
1054/* Used by PRM_VC_CFG_CHANNEL */
1055#define OMAP4430_SA_VDD_MPU_L_SHIFT 16 72#define OMAP4430_SA_VDD_MPU_L_SHIFT 16
1056#define OMAP4430_SA_VDD_MPU_L_MASK (1 << 16)
1057
1058/* Renamed from SA_VDD_MPU_L Used by PRM_VC_SMPS_SA */
1059#define OMAP4430_SA_VDD_MPU_L_PRM_VC_SMPS_SA_SHIFT 16
1060#define OMAP4430_SA_VDD_MPU_L_PRM_VC_SMPS_SA_MASK (0x7f << 16) 73#define OMAP4430_SA_VDD_MPU_L_PRM_VC_SMPS_SA_MASK (0x7f << 16)
1061
1062/* Used by REVISION_PRM */
1063#define OMAP4430_SCHEME_SHIFT 30
1064#define OMAP4430_SCHEME_MASK (0x3 << 30)
1065
1066/* Used by PRM_VC_CFG_I2C_CLK */
1067#define OMAP4430_SCLH_SHIFT 0 74#define OMAP4430_SCLH_SHIFT 0
1068#define OMAP4430_SCLH_MASK (0xff << 0)
1069
1070/* Used by PRM_VC_CFG_I2C_CLK */
1071#define OMAP4430_SCLL_SHIFT 8 75#define OMAP4430_SCLL_SHIFT 8
1072#define OMAP4430_SCLL_MASK (0xff << 8)
1073
1074/* Used by PRM_RSTST */
1075#define OMAP4430_SECURE_WDT_RST_SHIFT 4 76#define OMAP4430_SECURE_WDT_RST_SHIFT 4
1076#define OMAP4430_SECURE_WDT_RST_MASK (1 << 4)
1077
1078/* Used by PM_IVAHD_PWRSTCTRL */
1079#define OMAP4430_SL2_MEM_ONSTATE_SHIFT 18
1080#define OMAP4430_SL2_MEM_ONSTATE_MASK (0x3 << 18)
1081
1082/* Used by PM_IVAHD_PWRSTCTRL */
1083#define OMAP4430_SL2_MEM_RETSTATE_SHIFT 9
1084#define OMAP4430_SL2_MEM_RETSTATE_MASK (1 << 9)
1085
1086/* Used by PM_IVAHD_PWRSTST */
1087#define OMAP4430_SL2_MEM_STATEST_SHIFT 6
1088#define OMAP4430_SL2_MEM_STATEST_MASK (0x3 << 6)
1089
1090/* Used by PRM_VC_VAL_BYPASS */
1091#define OMAP4430_SLAVEADDR_SHIFT 0 77#define OMAP4430_SLAVEADDR_SHIFT 0
1092#define OMAP4430_SLAVEADDR_MASK (0x7f << 0)
1093
1094/* Used by PRM_LDO_ABB_IVA_SETUP, PRM_LDO_ABB_MPU_SETUP */
1095#define OMAP4430_SLEEP_RBB_SEL_SHIFT 3
1096#define OMAP4430_SLEEP_RBB_SEL_MASK (1 << 3)
1097
1098/* Used by PRM_SRAM_COUNT */
1099#define OMAP4430_SLPCNT_VALUE_SHIFT 16
1100#define OMAP4430_SLPCNT_VALUE_MASK (0xff << 16)
1101
1102/* Used by PRM_VP_CORE_VSTEPMAX, PRM_VP_IVA_VSTEPMAX, PRM_VP_MPU_VSTEPMAX */
1103#define OMAP4430_SMPSWAITTIMEMAX_SHIFT 8 78#define OMAP4430_SMPSWAITTIMEMAX_SHIFT 8
1104#define OMAP4430_SMPSWAITTIMEMAX_MASK (0xffff << 8)
1105
1106/* Used by PRM_VP_CORE_VSTEPMIN, PRM_VP_IVA_VSTEPMIN, PRM_VP_MPU_VSTEPMIN */
1107#define OMAP4430_SMPSWAITTIMEMIN_SHIFT 8 79#define OMAP4430_SMPSWAITTIMEMIN_SHIFT 8
1108#define OMAP4430_SMPSWAITTIMEMIN_MASK (0xffff << 8)
1109
1110/* Used by PRM_VC_ERRST */
1111#define OMAP4430_SMPS_RA_ERR_CORE_SHIFT 1
1112#define OMAP4430_SMPS_RA_ERR_CORE_MASK (1 << 1)
1113
1114/* Used by PRM_VC_ERRST */
1115#define OMAP4430_SMPS_RA_ERR_IVA_SHIFT 9
1116#define OMAP4430_SMPS_RA_ERR_IVA_MASK (1 << 9)
1117
1118/* Used by PRM_VC_ERRST */
1119#define OMAP4430_SMPS_RA_ERR_MPU_SHIFT 17
1120#define OMAP4430_SMPS_RA_ERR_MPU_MASK (1 << 17)
1121
1122/* Used by PRM_VC_ERRST */
1123#define OMAP4430_SMPS_SA_ERR_CORE_SHIFT 0
1124#define OMAP4430_SMPS_SA_ERR_CORE_MASK (1 << 0)
1125
1126/* Used by PRM_VC_ERRST */
1127#define OMAP4430_SMPS_SA_ERR_IVA_SHIFT 8
1128#define OMAP4430_SMPS_SA_ERR_IVA_MASK (1 << 8)
1129
1130/* Used by PRM_VC_ERRST */
1131#define OMAP4430_SMPS_SA_ERR_MPU_SHIFT 16
1132#define OMAP4430_SMPS_SA_ERR_MPU_MASK (1 << 16)
1133
1134/* Used by PRM_VC_ERRST */
1135#define OMAP4430_SMPS_TIMEOUT_ERR_CORE_SHIFT 2
1136#define OMAP4430_SMPS_TIMEOUT_ERR_CORE_MASK (1 << 2)
1137
1138/* Used by PRM_VC_ERRST */
1139#define OMAP4430_SMPS_TIMEOUT_ERR_IVA_SHIFT 10
1140#define OMAP4430_SMPS_TIMEOUT_ERR_IVA_MASK (1 << 10)
1141
1142/* Used by PRM_VC_ERRST */
1143#define OMAP4430_SMPS_TIMEOUT_ERR_MPU_SHIFT 18
1144#define OMAP4430_SMPS_TIMEOUT_ERR_MPU_MASK (1 << 18)
1145
1146/* Used by PRM_LDO_ABB_IVA_SETUP, PRM_LDO_ABB_MPU_SETUP */
1147#define OMAP4430_SR2EN_SHIFT 0
1148#define OMAP4430_SR2EN_MASK (1 << 0)
1149
1150/* Used by PRM_LDO_ABB_IVA_CTRL, PRM_LDO_ABB_MPU_CTRL */
1151#define OMAP4430_SR2_IN_TRANSITION_SHIFT 6
1152#define OMAP4430_SR2_IN_TRANSITION_MASK (1 << 6)
1153
1154/* Used by PRM_LDO_ABB_IVA_CTRL, PRM_LDO_ABB_MPU_CTRL */
1155#define OMAP4430_SR2_STATUS_SHIFT 3
1156#define OMAP4430_SR2_STATUS_MASK (0x3 << 3)
1157
1158/* Used by PRM_LDO_ABB_IVA_SETUP, PRM_LDO_ABB_MPU_SETUP */
1159#define OMAP4430_SR2_WTCNT_VALUE_SHIFT 8
1160#define OMAP4430_SR2_WTCNT_VALUE_MASK (0xff << 8)
1161
1162/*
1163 * Used by PRM_LDO_SRAM_CORE_CTRL, PRM_LDO_SRAM_IVA_CTRL,
1164 * PRM_LDO_SRAM_MPU_CTRL
1165 */
1166#define OMAP4430_SRAMLDO_STATUS_SHIFT 8
1167#define OMAP4430_SRAMLDO_STATUS_MASK (1 << 8)
1168
1169/*
1170 * Used by PRM_LDO_SRAM_CORE_CTRL, PRM_LDO_SRAM_IVA_CTRL,
1171 * PRM_LDO_SRAM_MPU_CTRL
1172 */
1173#define OMAP4430_SRAM_IN_TRANSITION_SHIFT 9
1174#define OMAP4430_SRAM_IN_TRANSITION_MASK (1 << 9)
1175
1176/* Used by PRM_VC_CFG_I2C_MODE */
1177#define OMAP4430_SRMODEEN_SHIFT 4
1178#define OMAP4430_SRMODEEN_MASK (1 << 4)
1179
1180/* Used by PRM_VOLTSETUP_WARMRESET */
1181#define OMAP4430_STABLE_COUNT_SHIFT 0
1182#define OMAP4430_STABLE_COUNT_MASK (0x3f << 0)
1183
1184/* Used by PRM_VOLTSETUP_WARMRESET */
1185#define OMAP4430_STABLE_PRESCAL_SHIFT 8
1186#define OMAP4430_STABLE_PRESCAL_MASK (0x3 << 8)
1187
1188/* Used by PRM_LDO_BANDGAP_SETUP */
1189#define OMAP4430_STARTUP_COUNT_SHIFT 0
1190#define OMAP4430_STARTUP_COUNT_MASK (0xff << 0)
1191
1192/* Renamed from STARTUP_COUNT Used by PRM_SRAM_COUNT */
1193#define OMAP4430_STARTUP_COUNT_24_31_SHIFT 24
1194#define OMAP4430_STARTUP_COUNT_24_31_MASK (0xff << 24)
1195
1196/* Used by PM_IVAHD_PWRSTCTRL */
1197#define OMAP4430_TCM1_MEM_ONSTATE_SHIFT 20
1198#define OMAP4430_TCM1_MEM_ONSTATE_MASK (0x3 << 20)
1199
1200/* Used by PM_IVAHD_PWRSTCTRL */
1201#define OMAP4430_TCM1_MEM_RETSTATE_SHIFT 10
1202#define OMAP4430_TCM1_MEM_RETSTATE_MASK (1 << 10)
1203
1204/* Used by PM_IVAHD_PWRSTST */
1205#define OMAP4430_TCM1_MEM_STATEST_SHIFT 8
1206#define OMAP4430_TCM1_MEM_STATEST_MASK (0x3 << 8)
1207
1208/* Used by PM_IVAHD_PWRSTCTRL */
1209#define OMAP4430_TCM2_MEM_ONSTATE_SHIFT 22
1210#define OMAP4430_TCM2_MEM_ONSTATE_MASK (0x3 << 22)
1211
1212/* Used by PM_IVAHD_PWRSTCTRL */
1213#define OMAP4430_TCM2_MEM_RETSTATE_SHIFT 11
1214#define OMAP4430_TCM2_MEM_RETSTATE_MASK (1 << 11)
1215
1216/* Used by PM_IVAHD_PWRSTST */
1217#define OMAP4430_TCM2_MEM_STATEST_SHIFT 10
1218#define OMAP4430_TCM2_MEM_STATEST_MASK (0x3 << 10)
1219
1220/* Used by RM_TESLA_RSTST */
1221#define OMAP4430_TESLASS_EMU_RSTST_SHIFT 2
1222#define OMAP4430_TESLASS_EMU_RSTST_MASK (1 << 2)
1223
1224/* Used by RM_TESLA_RSTST */
1225#define OMAP4430_TESLA_DSP_EMU_REQ_RSTST_SHIFT 3
1226#define OMAP4430_TESLA_DSP_EMU_REQ_RSTST_MASK (1 << 3)
1227
1228/* Used by PM_TESLA_PWRSTCTRL */
1229#define OMAP4430_TESLA_EDMA_ONSTATE_SHIFT 20
1230#define OMAP4430_TESLA_EDMA_ONSTATE_MASK (0x3 << 20)
1231
1232/* Used by PM_TESLA_PWRSTCTRL */
1233#define OMAP4430_TESLA_EDMA_RETSTATE_SHIFT 10
1234#define OMAP4430_TESLA_EDMA_RETSTATE_MASK (1 << 10)
1235
1236/* Used by PM_TESLA_PWRSTST */
1237#define OMAP4430_TESLA_EDMA_STATEST_SHIFT 8
1238#define OMAP4430_TESLA_EDMA_STATEST_MASK (0x3 << 8)
1239
1240/* Used by PM_TESLA_PWRSTCTRL */
1241#define OMAP4430_TESLA_L1_ONSTATE_SHIFT 16
1242#define OMAP4430_TESLA_L1_ONSTATE_MASK (0x3 << 16)
1243
1244/* Used by PM_TESLA_PWRSTCTRL */
1245#define OMAP4430_TESLA_L1_RETSTATE_SHIFT 8
1246#define OMAP4430_TESLA_L1_RETSTATE_MASK (1 << 8)
1247
1248/* Used by PM_TESLA_PWRSTST */
1249#define OMAP4430_TESLA_L1_STATEST_SHIFT 4
1250#define OMAP4430_TESLA_L1_STATEST_MASK (0x3 << 4)
1251
1252/* Used by PM_TESLA_PWRSTCTRL */
1253#define OMAP4430_TESLA_L2_ONSTATE_SHIFT 18
1254#define OMAP4430_TESLA_L2_ONSTATE_MASK (0x3 << 18)
1255
1256/* Used by PM_TESLA_PWRSTCTRL */
1257#define OMAP4430_TESLA_L2_RETSTATE_SHIFT 9
1258#define OMAP4430_TESLA_L2_RETSTATE_MASK (1 << 9)
1259
1260/* Used by PM_TESLA_PWRSTST */
1261#define OMAP4430_TESLA_L2_STATEST_SHIFT 6
1262#define OMAP4430_TESLA_L2_STATEST_MASK (0x3 << 6)
1263
1264/* Used by PRM_VP_CORE_VLIMITTO, PRM_VP_IVA_VLIMITTO, PRM_VP_MPU_VLIMITTO */
1265#define OMAP4430_TIMEOUT_SHIFT 0 80#define OMAP4430_TIMEOUT_SHIFT 0
1266#define OMAP4430_TIMEOUT_MASK (0xffff << 0)
1267
1268/* Used by PRM_VP_CORE_CONFIG, PRM_VP_IVA_CONFIG, PRM_VP_MPU_CONFIG */
1269#define OMAP4430_TIMEOUTEN_SHIFT 3
1270#define OMAP4430_TIMEOUTEN_MASK (1 << 3) 81#define OMAP4430_TIMEOUTEN_MASK (1 << 3)
1271
1272/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1273#define OMAP4430_TRANSITION_EN_SHIFT 8
1274#define OMAP4430_TRANSITION_EN_MASK (1 << 8)
1275
1276/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1277#define OMAP4430_TRANSITION_ST_SHIFT 8
1278#define OMAP4430_TRANSITION_ST_MASK (1 << 8)
1279
1280/* Used by PRM_VC_VAL_BYPASS */
1281#define OMAP4430_VALID_SHIFT 24
1282#define OMAP4430_VALID_MASK (1 << 24) 82#define OMAP4430_VALID_MASK (1 << 24)
1283
1284/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1285#define OMAP4430_VC_BYPASSACK_EN_SHIFT 14
1286#define OMAP4430_VC_BYPASSACK_EN_MASK (1 << 14)
1287
1288/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1289#define OMAP4430_VC_BYPASSACK_ST_SHIFT 14
1290#define OMAP4430_VC_BYPASSACK_ST_MASK (1 << 14)
1291
1292/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1293#define OMAP4430_VC_CORE_VPACK_EN_SHIFT 22
1294#define OMAP4430_VC_CORE_VPACK_EN_MASK (1 << 22)
1295
1296/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1297#define OMAP4430_VC_CORE_VPACK_ST_SHIFT 22
1298#define OMAP4430_VC_CORE_VPACK_ST_MASK (1 << 22)
1299
1300/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1301#define OMAP4430_VC_IVA_VPACK_EN_SHIFT 30
1302#define OMAP4430_VC_IVA_VPACK_EN_MASK (1 << 30)
1303
1304/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1305#define OMAP4430_VC_IVA_VPACK_ST_SHIFT 30
1306#define OMAP4430_VC_IVA_VPACK_ST_MASK (1 << 30)
1307
1308/* Used by PRM_IRQENABLE_MPU_2 */
1309#define OMAP4430_VC_MPU_VPACK_EN_SHIFT 6
1310#define OMAP4430_VC_MPU_VPACK_EN_MASK (1 << 6)
1311
1312/* Used by PRM_IRQSTATUS_MPU_2 */
1313#define OMAP4430_VC_MPU_VPACK_ST_SHIFT 6
1314#define OMAP4430_VC_MPU_VPACK_ST_MASK (1 << 6)
1315
1316/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1317#define OMAP4430_VC_RAERR_EN_SHIFT 12
1318#define OMAP4430_VC_RAERR_EN_MASK (1 << 12)
1319
1320/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1321#define OMAP4430_VC_RAERR_ST_SHIFT 12
1322#define OMAP4430_VC_RAERR_ST_MASK (1 << 12)
1323
1324/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1325#define OMAP4430_VC_SAERR_EN_SHIFT 11
1326#define OMAP4430_VC_SAERR_EN_MASK (1 << 11)
1327
1328/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1329#define OMAP4430_VC_SAERR_ST_SHIFT 11
1330#define OMAP4430_VC_SAERR_ST_MASK (1 << 11)
1331
1332/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1333#define OMAP4430_VC_TOERR_EN_SHIFT 13
1334#define OMAP4430_VC_TOERR_EN_MASK (1 << 13)
1335
1336/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1337#define OMAP4430_VC_TOERR_ST_SHIFT 13
1338#define OMAP4430_VC_TOERR_ST_MASK (1 << 13)
1339
1340/* Used by PRM_VP_CORE_VLIMITTO, PRM_VP_IVA_VLIMITTO, PRM_VP_MPU_VLIMITTO */
1341#define OMAP4430_VDDMAX_SHIFT 24 83#define OMAP4430_VDDMAX_SHIFT 24
1342#define OMAP4430_VDDMAX_MASK (0xff << 24)
1343
1344/* Used by PRM_VP_CORE_VLIMITTO, PRM_VP_IVA_VLIMITTO, PRM_VP_MPU_VLIMITTO */
1345#define OMAP4430_VDDMIN_SHIFT 16 84#define OMAP4430_VDDMIN_SHIFT 16
1346#define OMAP4430_VDDMIN_MASK (0xff << 16)
1347
1348/* Used by PRM_VOLTCTRL */
1349#define OMAP4430_VDD_CORE_I2C_DISABLE_SHIFT 12
1350#define OMAP4430_VDD_CORE_I2C_DISABLE_MASK (1 << 12)
1351
1352/* Used by PRM_RSTST */
1353#define OMAP4430_VDD_CORE_VOLT_MGR_RST_SHIFT 8 85#define OMAP4430_VDD_CORE_VOLT_MGR_RST_SHIFT 8
1354#define OMAP4430_VDD_CORE_VOLT_MGR_RST_MASK (1 << 8)
1355
1356/* Used by PRM_VOLTCTRL */
1357#define OMAP4430_VDD_IVA_I2C_DISABLE_SHIFT 14
1358#define OMAP4430_VDD_IVA_I2C_DISABLE_MASK (1 << 14)
1359
1360/* Used by PRM_VOLTCTRL */
1361#define OMAP4430_VDD_IVA_PRESENCE_SHIFT 9
1362#define OMAP4430_VDD_IVA_PRESENCE_MASK (1 << 9)
1363
1364/* Used by PRM_RSTST */
1365#define OMAP4430_VDD_IVA_VOLT_MGR_RST_SHIFT 7 86#define OMAP4430_VDD_IVA_VOLT_MGR_RST_SHIFT 7
1366#define OMAP4430_VDD_IVA_VOLT_MGR_RST_MASK (1 << 7)
1367
1368/* Used by PRM_VOLTCTRL */
1369#define OMAP4430_VDD_MPU_I2C_DISABLE_SHIFT 13
1370#define OMAP4430_VDD_MPU_I2C_DISABLE_MASK (1 << 13)
1371
1372/* Used by PRM_VOLTCTRL */
1373#define OMAP4430_VDD_MPU_PRESENCE_SHIFT 8
1374#define OMAP4430_VDD_MPU_PRESENCE_MASK (1 << 8)
1375
1376/* Used by PRM_RSTST */
1377#define OMAP4430_VDD_MPU_VOLT_MGR_RST_SHIFT 6 87#define OMAP4430_VDD_MPU_VOLT_MGR_RST_SHIFT 6
1378#define OMAP4430_VDD_MPU_VOLT_MGR_RST_MASK (1 << 6)
1379
1380/* Used by PRM_VC_ERRST */
1381#define OMAP4430_VFSM_RA_ERR_CORE_SHIFT 4
1382#define OMAP4430_VFSM_RA_ERR_CORE_MASK (1 << 4)
1383
1384/* Used by PRM_VC_ERRST */
1385#define OMAP4430_VFSM_RA_ERR_IVA_SHIFT 12
1386#define OMAP4430_VFSM_RA_ERR_IVA_MASK (1 << 12)
1387
1388/* Used by PRM_VC_ERRST */
1389#define OMAP4430_VFSM_RA_ERR_MPU_SHIFT 20
1390#define OMAP4430_VFSM_RA_ERR_MPU_MASK (1 << 20)
1391
1392/* Used by PRM_VC_ERRST */
1393#define OMAP4430_VFSM_SA_ERR_CORE_SHIFT 3
1394#define OMAP4430_VFSM_SA_ERR_CORE_MASK (1 << 3)
1395
1396/* Used by PRM_VC_ERRST */
1397#define OMAP4430_VFSM_SA_ERR_IVA_SHIFT 11
1398#define OMAP4430_VFSM_SA_ERR_IVA_MASK (1 << 11)
1399
1400/* Used by PRM_VC_ERRST */
1401#define OMAP4430_VFSM_SA_ERR_MPU_SHIFT 19
1402#define OMAP4430_VFSM_SA_ERR_MPU_MASK (1 << 19)
1403
1404/* Used by PRM_VC_ERRST */
1405#define OMAP4430_VFSM_TIMEOUT_ERR_CORE_SHIFT 5
1406#define OMAP4430_VFSM_TIMEOUT_ERR_CORE_MASK (1 << 5)
1407
1408/* Used by PRM_VC_ERRST */
1409#define OMAP4430_VFSM_TIMEOUT_ERR_IVA_SHIFT 13
1410#define OMAP4430_VFSM_TIMEOUT_ERR_IVA_MASK (1 << 13)
1411
1412/* Used by PRM_VC_ERRST */
1413#define OMAP4430_VFSM_TIMEOUT_ERR_MPU_SHIFT 21
1414#define OMAP4430_VFSM_TIMEOUT_ERR_MPU_MASK (1 << 21)
1415
1416/* Used by PRM_VC_VAL_SMPS_RA_VOL */
1417#define OMAP4430_VOLRA_VDD_CORE_L_SHIFT 0
1418#define OMAP4430_VOLRA_VDD_CORE_L_MASK (0xff << 0) 88#define OMAP4430_VOLRA_VDD_CORE_L_MASK (0xff << 0)
1419
1420/* Used by PRM_VC_VAL_SMPS_RA_VOL */
1421#define OMAP4430_VOLRA_VDD_IVA_L_SHIFT 8
1422#define OMAP4430_VOLRA_VDD_IVA_L_MASK (0xff << 8) 89#define OMAP4430_VOLRA_VDD_IVA_L_MASK (0xff << 8)
1423
1424/* Used by PRM_VC_VAL_SMPS_RA_VOL */
1425#define OMAP4430_VOLRA_VDD_MPU_L_SHIFT 16
1426#define OMAP4430_VOLRA_VDD_MPU_L_MASK (0xff << 16) 90#define OMAP4430_VOLRA_VDD_MPU_L_MASK (0xff << 16)
1427
1428/* Used by PRM_VP_CORE_CONFIG, PRM_VP_IVA_CONFIG, PRM_VP_MPU_CONFIG */
1429#define OMAP4430_VPENABLE_SHIFT 0
1430#define OMAP4430_VPENABLE_MASK (1 << 0) 91#define OMAP4430_VPENABLE_MASK (1 << 0)
1431
1432/* Used by PRM_VP_CORE_STATUS, PRM_VP_IVA_STATUS, PRM_VP_MPU_STATUS */
1433#define OMAP4430_VPINIDLE_SHIFT 0
1434#define OMAP4430_VPINIDLE_MASK (1 << 0)
1435
1436/* Used by PRM_VP_CORE_VOLTAGE, PRM_VP_IVA_VOLTAGE, PRM_VP_MPU_VOLTAGE */
1437#define OMAP4430_VPVOLTAGE_SHIFT 0
1438#define OMAP4430_VPVOLTAGE_MASK (0xff << 0) 92#define OMAP4430_VPVOLTAGE_MASK (0xff << 0)
1439
1440/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1441#define OMAP4430_VP_CORE_EQVALUE_EN_SHIFT 20
1442#define OMAP4430_VP_CORE_EQVALUE_EN_MASK (1 << 20)
1443
1444/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1445#define OMAP4430_VP_CORE_EQVALUE_ST_SHIFT 20
1446#define OMAP4430_VP_CORE_EQVALUE_ST_MASK (1 << 20)
1447
1448/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1449#define OMAP4430_VP_CORE_MAXVDD_EN_SHIFT 18
1450#define OMAP4430_VP_CORE_MAXVDD_EN_MASK (1 << 18)
1451
1452/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1453#define OMAP4430_VP_CORE_MAXVDD_ST_SHIFT 18
1454#define OMAP4430_VP_CORE_MAXVDD_ST_MASK (1 << 18)
1455
1456/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1457#define OMAP4430_VP_CORE_MINVDD_EN_SHIFT 17
1458#define OMAP4430_VP_CORE_MINVDD_EN_MASK (1 << 17)
1459
1460/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1461#define OMAP4430_VP_CORE_MINVDD_ST_SHIFT 17
1462#define OMAP4430_VP_CORE_MINVDD_ST_MASK (1 << 17)
1463
1464/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1465#define OMAP4430_VP_CORE_NOSMPSACK_EN_SHIFT 19
1466#define OMAP4430_VP_CORE_NOSMPSACK_EN_MASK (1 << 19)
1467
1468/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1469#define OMAP4430_VP_CORE_NOSMPSACK_ST_SHIFT 19
1470#define OMAP4430_VP_CORE_NOSMPSACK_ST_MASK (1 << 19)
1471
1472/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1473#define OMAP4430_VP_CORE_OPPCHANGEDONE_EN_SHIFT 16
1474#define OMAP4430_VP_CORE_OPPCHANGEDONE_EN_MASK (1 << 16)
1475
1476/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1477#define OMAP4430_VP_CORE_OPPCHANGEDONE_ST_SHIFT 16
1478#define OMAP4430_VP_CORE_OPPCHANGEDONE_ST_MASK (1 << 16)
1479
1480/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1481#define OMAP4430_VP_CORE_TRANXDONE_EN_SHIFT 21
1482#define OMAP4430_VP_CORE_TRANXDONE_EN_MASK (1 << 21)
1483
1484/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1485#define OMAP4430_VP_CORE_TRANXDONE_ST_SHIFT 21
1486#define OMAP4430_VP_CORE_TRANXDONE_ST_MASK (1 << 21) 93#define OMAP4430_VP_CORE_TRANXDONE_ST_MASK (1 << 21)
1487
1488/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1489#define OMAP4430_VP_IVA_EQVALUE_EN_SHIFT 28
1490#define OMAP4430_VP_IVA_EQVALUE_EN_MASK (1 << 28)
1491
1492/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1493#define OMAP4430_VP_IVA_EQVALUE_ST_SHIFT 28
1494#define OMAP4430_VP_IVA_EQVALUE_ST_MASK (1 << 28)
1495
1496/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1497#define OMAP4430_VP_IVA_MAXVDD_EN_SHIFT 26
1498#define OMAP4430_VP_IVA_MAXVDD_EN_MASK (1 << 26)
1499
1500/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1501#define OMAP4430_VP_IVA_MAXVDD_ST_SHIFT 26
1502#define OMAP4430_VP_IVA_MAXVDD_ST_MASK (1 << 26)
1503
1504/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1505#define OMAP4430_VP_IVA_MINVDD_EN_SHIFT 25
1506#define OMAP4430_VP_IVA_MINVDD_EN_MASK (1 << 25)
1507
1508/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1509#define OMAP4430_VP_IVA_MINVDD_ST_SHIFT 25
1510#define OMAP4430_VP_IVA_MINVDD_ST_MASK (1 << 25)
1511
1512/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1513#define OMAP4430_VP_IVA_NOSMPSACK_EN_SHIFT 27
1514#define OMAP4430_VP_IVA_NOSMPSACK_EN_MASK (1 << 27)
1515
1516/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1517#define OMAP4430_VP_IVA_NOSMPSACK_ST_SHIFT 27
1518#define OMAP4430_VP_IVA_NOSMPSACK_ST_MASK (1 << 27)
1519
1520/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1521#define OMAP4430_VP_IVA_OPPCHANGEDONE_EN_SHIFT 24
1522#define OMAP4430_VP_IVA_OPPCHANGEDONE_EN_MASK (1 << 24)
1523
1524/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1525#define OMAP4430_VP_IVA_OPPCHANGEDONE_ST_SHIFT 24
1526#define OMAP4430_VP_IVA_OPPCHANGEDONE_ST_MASK (1 << 24)
1527
1528/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1529#define OMAP4430_VP_IVA_TRANXDONE_EN_SHIFT 29
1530#define OMAP4430_VP_IVA_TRANXDONE_EN_MASK (1 << 29)
1531
1532/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1533#define OMAP4430_VP_IVA_TRANXDONE_ST_SHIFT 29
1534#define OMAP4430_VP_IVA_TRANXDONE_ST_MASK (1 << 29) 94#define OMAP4430_VP_IVA_TRANXDONE_ST_MASK (1 << 29)
1535
1536/* Used by PRM_IRQENABLE_MPU_2 */
1537#define OMAP4430_VP_MPU_EQVALUE_EN_SHIFT 4
1538#define OMAP4430_VP_MPU_EQVALUE_EN_MASK (1 << 4)
1539
1540/* Used by PRM_IRQSTATUS_MPU_2 */
1541#define OMAP4430_VP_MPU_EQVALUE_ST_SHIFT 4
1542#define OMAP4430_VP_MPU_EQVALUE_ST_MASK (1 << 4)
1543
1544/* Used by PRM_IRQENABLE_MPU_2 */
1545#define OMAP4430_VP_MPU_MAXVDD_EN_SHIFT 2
1546#define OMAP4430_VP_MPU_MAXVDD_EN_MASK (1 << 2)
1547
1548/* Used by PRM_IRQSTATUS_MPU_2 */
1549#define OMAP4430_VP_MPU_MAXVDD_ST_SHIFT 2
1550#define OMAP4430_VP_MPU_MAXVDD_ST_MASK (1 << 2)
1551
1552/* Used by PRM_IRQENABLE_MPU_2 */
1553#define OMAP4430_VP_MPU_MINVDD_EN_SHIFT 1
1554#define OMAP4430_VP_MPU_MINVDD_EN_MASK (1 << 1)
1555
1556/* Used by PRM_IRQSTATUS_MPU_2 */
1557#define OMAP4430_VP_MPU_MINVDD_ST_SHIFT 1
1558#define OMAP4430_VP_MPU_MINVDD_ST_MASK (1 << 1)
1559
1560/* Used by PRM_IRQENABLE_MPU_2 */
1561#define OMAP4430_VP_MPU_NOSMPSACK_EN_SHIFT 3
1562#define OMAP4430_VP_MPU_NOSMPSACK_EN_MASK (1 << 3)
1563
1564/* Used by PRM_IRQSTATUS_MPU_2 */
1565#define OMAP4430_VP_MPU_NOSMPSACK_ST_SHIFT 3
1566#define OMAP4430_VP_MPU_NOSMPSACK_ST_MASK (1 << 3)
1567
1568/* Used by PRM_IRQENABLE_MPU_2 */
1569#define OMAP4430_VP_MPU_OPPCHANGEDONE_EN_SHIFT 0
1570#define OMAP4430_VP_MPU_OPPCHANGEDONE_EN_MASK (1 << 0)
1571
1572/* Used by PRM_IRQSTATUS_MPU_2 */
1573#define OMAP4430_VP_MPU_OPPCHANGEDONE_ST_SHIFT 0
1574#define OMAP4430_VP_MPU_OPPCHANGEDONE_ST_MASK (1 << 0)
1575
1576/* Used by PRM_IRQENABLE_MPU_2 */
1577#define OMAP4430_VP_MPU_TRANXDONE_EN_SHIFT 5
1578#define OMAP4430_VP_MPU_TRANXDONE_EN_MASK (1 << 5)
1579
1580/* Used by PRM_IRQSTATUS_MPU_2 */
1581#define OMAP4430_VP_MPU_TRANXDONE_ST_SHIFT 5
1582#define OMAP4430_VP_MPU_TRANXDONE_ST_MASK (1 << 5) 95#define OMAP4430_VP_MPU_TRANXDONE_ST_MASK (1 << 5)
1583
1584/* Used by PRM_SRAM_COUNT */
1585#define OMAP4430_VSETUPCNT_VALUE_SHIFT 8
1586#define OMAP4430_VSETUPCNT_VALUE_MASK (0xff << 8)
1587
1588/* Used by PRM_VP_CORE_VSTEPMAX, PRM_VP_IVA_VSTEPMAX, PRM_VP_MPU_VSTEPMAX */
1589#define OMAP4430_VSTEPMAX_SHIFT 0 96#define OMAP4430_VSTEPMAX_SHIFT 0
1590#define OMAP4430_VSTEPMAX_MASK (0xff << 0)
1591
1592/* Used by PRM_VP_CORE_VSTEPMIN, PRM_VP_IVA_VSTEPMIN, PRM_VP_MPU_VSTEPMIN */
1593#define OMAP4430_VSTEPMIN_SHIFT 0 97#define OMAP4430_VSTEPMIN_SHIFT 0
1594#define OMAP4430_VSTEPMIN_MASK (0xff << 0)
1595
1596/* Used by PRM_MODEM_IF_CTRL */
1597#define OMAP4430_WAKE_MODEM_SHIFT 0
1598#define OMAP4430_WAKE_MODEM_MASK (1 << 0)
1599
1600/* Used by PM_DSS_DSS_WKDEP */
1601#define OMAP4430_WKUPDEP_DISPC_DUCATI_SHIFT 1
1602#define OMAP4430_WKUPDEP_DISPC_DUCATI_MASK (1 << 1)
1603
1604/* Used by PM_DSS_DSS_WKDEP */
1605#define OMAP4430_WKUPDEP_DISPC_MPU_SHIFT 0
1606#define OMAP4430_WKUPDEP_DISPC_MPU_MASK (1 << 0)
1607
1608/* Used by PM_DSS_DSS_WKDEP */
1609#define OMAP4430_WKUPDEP_DISPC_SDMA_SHIFT 3
1610#define OMAP4430_WKUPDEP_DISPC_SDMA_MASK (1 << 3)
1611
1612/* Used by PM_DSS_DSS_WKDEP */
1613#define OMAP4430_WKUPDEP_DISPC_TESLA_SHIFT 2
1614#define OMAP4430_WKUPDEP_DISPC_TESLA_MASK (1 << 2)
1615
1616/* Used by PM_ABE_DMIC_WKDEP */
1617#define OMAP4430_WKUPDEP_DMIC_DMA_SDMA_SHIFT 7
1618#define OMAP4430_WKUPDEP_DMIC_DMA_SDMA_MASK (1 << 7)
1619
1620/* Used by PM_ABE_DMIC_WKDEP */
1621#define OMAP4430_WKUPDEP_DMIC_DMA_TESLA_SHIFT 6
1622#define OMAP4430_WKUPDEP_DMIC_DMA_TESLA_MASK (1 << 6)
1623
1624/* Used by PM_ABE_DMIC_WKDEP */
1625#define OMAP4430_WKUPDEP_DMIC_IRQ_MPU_SHIFT 0
1626#define OMAP4430_WKUPDEP_DMIC_IRQ_MPU_MASK (1 << 0)
1627
1628/* Used by PM_ABE_DMIC_WKDEP */
1629#define OMAP4430_WKUPDEP_DMIC_IRQ_TESLA_SHIFT 2
1630#define OMAP4430_WKUPDEP_DMIC_IRQ_TESLA_MASK (1 << 2)
1631
1632/* Used by PM_L4PER_DMTIMER10_WKDEP */
1633#define OMAP4430_WKUPDEP_DMTIMER10_MPU_SHIFT 0
1634#define OMAP4430_WKUPDEP_DMTIMER10_MPU_MASK (1 << 0)
1635
1636/* Used by PM_L4PER_DMTIMER11_WKDEP */
1637#define OMAP4430_WKUPDEP_DMTIMER11_DUCATI_SHIFT 1
1638#define OMAP4430_WKUPDEP_DMTIMER11_DUCATI_MASK (1 << 1)
1639
1640/* Used by PM_L4PER_DMTIMER11_WKDEP */
1641#define OMAP4430_WKUPDEP_DMTIMER11_MPU_SHIFT 0
1642#define OMAP4430_WKUPDEP_DMTIMER11_MPU_MASK (1 << 0)
1643
1644/* Used by PM_L4PER_DMTIMER2_WKDEP */
1645#define OMAP4430_WKUPDEP_DMTIMER2_MPU_SHIFT 0
1646#define OMAP4430_WKUPDEP_DMTIMER2_MPU_MASK (1 << 0)
1647
1648/* Used by PM_L4PER_DMTIMER3_WKDEP */
1649#define OMAP4430_WKUPDEP_DMTIMER3_DUCATI_SHIFT 1
1650#define OMAP4430_WKUPDEP_DMTIMER3_DUCATI_MASK (1 << 1)
1651
1652/* Used by PM_L4PER_DMTIMER3_WKDEP */
1653#define OMAP4430_WKUPDEP_DMTIMER3_MPU_SHIFT 0
1654#define OMAP4430_WKUPDEP_DMTIMER3_MPU_MASK (1 << 0)
1655
1656/* Used by PM_L4PER_DMTIMER4_WKDEP */
1657#define OMAP4430_WKUPDEP_DMTIMER4_DUCATI_SHIFT 1
1658#define OMAP4430_WKUPDEP_DMTIMER4_DUCATI_MASK (1 << 1)
1659
1660/* Used by PM_L4PER_DMTIMER4_WKDEP */
1661#define OMAP4430_WKUPDEP_DMTIMER4_MPU_SHIFT 0
1662#define OMAP4430_WKUPDEP_DMTIMER4_MPU_MASK (1 << 0)
1663
1664/* Used by PM_L4PER_DMTIMER9_WKDEP */
1665#define OMAP4430_WKUPDEP_DMTIMER9_DUCATI_SHIFT 1
1666#define OMAP4430_WKUPDEP_DMTIMER9_DUCATI_MASK (1 << 1)
1667
1668/* Used by PM_L4PER_DMTIMER9_WKDEP */
1669#define OMAP4430_WKUPDEP_DMTIMER9_MPU_SHIFT 0
1670#define OMAP4430_WKUPDEP_DMTIMER9_MPU_MASK (1 << 0)
1671
1672/* Used by PM_DSS_DSS_WKDEP */
1673#define OMAP4430_WKUPDEP_DSI1_DUCATI_SHIFT 5
1674#define OMAP4430_WKUPDEP_DSI1_DUCATI_MASK (1 << 5)
1675
1676/* Used by PM_DSS_DSS_WKDEP */
1677#define OMAP4430_WKUPDEP_DSI1_MPU_SHIFT 4
1678#define OMAP4430_WKUPDEP_DSI1_MPU_MASK (1 << 4)
1679
1680/* Used by PM_DSS_DSS_WKDEP */
1681#define OMAP4430_WKUPDEP_DSI1_SDMA_SHIFT 7
1682#define OMAP4430_WKUPDEP_DSI1_SDMA_MASK (1 << 7)
1683
1684/* Used by PM_DSS_DSS_WKDEP */
1685#define OMAP4430_WKUPDEP_DSI1_TESLA_SHIFT 6
1686#define OMAP4430_WKUPDEP_DSI1_TESLA_MASK (1 << 6)
1687
1688/* Used by PM_DSS_DSS_WKDEP */
1689#define OMAP4430_WKUPDEP_DSI2_DUCATI_SHIFT 9
1690#define OMAP4430_WKUPDEP_DSI2_DUCATI_MASK (1 << 9)
1691
1692/* Used by PM_DSS_DSS_WKDEP */
1693#define OMAP4430_WKUPDEP_DSI2_MPU_SHIFT 8
1694#define OMAP4430_WKUPDEP_DSI2_MPU_MASK (1 << 8)
1695
1696/* Used by PM_DSS_DSS_WKDEP */
1697#define OMAP4430_WKUPDEP_DSI2_SDMA_SHIFT 11
1698#define OMAP4430_WKUPDEP_DSI2_SDMA_MASK (1 << 11)
1699
1700/* Used by PM_DSS_DSS_WKDEP */
1701#define OMAP4430_WKUPDEP_DSI2_TESLA_SHIFT 10
1702#define OMAP4430_WKUPDEP_DSI2_TESLA_MASK (1 << 10)
1703
1704/* Used by PM_WKUP_GPIO1_WKDEP */
1705#define OMAP4430_WKUPDEP_GPIO1_IRQ1_DUCATI_SHIFT 1
1706#define OMAP4430_WKUPDEP_GPIO1_IRQ1_DUCATI_MASK (1 << 1)
1707
1708/* Used by PM_WKUP_GPIO1_WKDEP */
1709#define OMAP4430_WKUPDEP_GPIO1_IRQ1_MPU_SHIFT 0
1710#define OMAP4430_WKUPDEP_GPIO1_IRQ1_MPU_MASK (1 << 0)
1711
1712/* Used by PM_WKUP_GPIO1_WKDEP */
1713#define OMAP4430_WKUPDEP_GPIO1_IRQ2_TESLA_SHIFT 6
1714#define OMAP4430_WKUPDEP_GPIO1_IRQ2_TESLA_MASK (1 << 6)
1715
1716/* Used by PM_L4PER_GPIO2_WKDEP */
1717#define OMAP4430_WKUPDEP_GPIO2_IRQ1_DUCATI_SHIFT 1
1718#define OMAP4430_WKUPDEP_GPIO2_IRQ1_DUCATI_MASK (1 << 1)
1719
1720/* Used by PM_L4PER_GPIO2_WKDEP */
1721#define OMAP4430_WKUPDEP_GPIO2_IRQ1_MPU_SHIFT 0
1722#define OMAP4430_WKUPDEP_GPIO2_IRQ1_MPU_MASK (1 << 0)
1723
1724/* Used by PM_L4PER_GPIO2_WKDEP */
1725#define OMAP4430_WKUPDEP_GPIO2_IRQ2_TESLA_SHIFT 6
1726#define OMAP4430_WKUPDEP_GPIO2_IRQ2_TESLA_MASK (1 << 6)
1727
1728/* Used by PM_L4PER_GPIO3_WKDEP */
1729#define OMAP4430_WKUPDEP_GPIO3_IRQ1_MPU_SHIFT 0
1730#define OMAP4430_WKUPDEP_GPIO3_IRQ1_MPU_MASK (1 << 0)
1731
1732/* Used by PM_L4PER_GPIO3_WKDEP */
1733#define OMAP4430_WKUPDEP_GPIO3_IRQ2_TESLA_SHIFT 6
1734#define OMAP4430_WKUPDEP_GPIO3_IRQ2_TESLA_MASK (1 << 6)
1735
1736/* Used by PM_L4PER_GPIO4_WKDEP */
1737#define OMAP4430_WKUPDEP_GPIO4_IRQ1_MPU_SHIFT 0
1738#define OMAP4430_WKUPDEP_GPIO4_IRQ1_MPU_MASK (1 << 0)
1739
1740/* Used by PM_L4PER_GPIO4_WKDEP */
1741#define OMAP4430_WKUPDEP_GPIO4_IRQ2_TESLA_SHIFT 6
1742#define OMAP4430_WKUPDEP_GPIO4_IRQ2_TESLA_MASK (1 << 6)
1743
1744/* Used by PM_L4PER_GPIO5_WKDEP */
1745#define OMAP4430_WKUPDEP_GPIO5_IRQ1_MPU_SHIFT 0
1746#define OMAP4430_WKUPDEP_GPIO5_IRQ1_MPU_MASK (1 << 0)
1747
1748/* Used by PM_L4PER_GPIO5_WKDEP */
1749#define OMAP4430_WKUPDEP_GPIO5_IRQ2_TESLA_SHIFT 6
1750#define OMAP4430_WKUPDEP_GPIO5_IRQ2_TESLA_MASK (1 << 6)
1751
1752/* Used by PM_L4PER_GPIO6_WKDEP */
1753#define OMAP4430_WKUPDEP_GPIO6_IRQ1_MPU_SHIFT 0
1754#define OMAP4430_WKUPDEP_GPIO6_IRQ1_MPU_MASK (1 << 0)
1755
1756/* Used by PM_L4PER_GPIO6_WKDEP */
1757#define OMAP4430_WKUPDEP_GPIO6_IRQ2_TESLA_SHIFT 6
1758#define OMAP4430_WKUPDEP_GPIO6_IRQ2_TESLA_MASK (1 << 6)
1759
1760/* Used by PM_DSS_DSS_WKDEP */
1761#define OMAP4430_WKUPDEP_HDMIDMA_SDMA_SHIFT 19
1762#define OMAP4430_WKUPDEP_HDMIDMA_SDMA_MASK (1 << 19)
1763
1764/* Used by PM_DSS_DSS_WKDEP */
1765#define OMAP4430_WKUPDEP_HDMIIRQ_DUCATI_SHIFT 13
1766#define OMAP4430_WKUPDEP_HDMIIRQ_DUCATI_MASK (1 << 13)
1767
1768/* Used by PM_DSS_DSS_WKDEP */
1769#define OMAP4430_WKUPDEP_HDMIIRQ_MPU_SHIFT 12
1770#define OMAP4430_WKUPDEP_HDMIIRQ_MPU_MASK (1 << 12)
1771
1772/* Used by PM_DSS_DSS_WKDEP */
1773#define OMAP4430_WKUPDEP_HDMIIRQ_TESLA_SHIFT 14
1774#define OMAP4430_WKUPDEP_HDMIIRQ_TESLA_MASK (1 << 14)
1775
1776/* Used by PM_L4PER_HECC1_WKDEP */
1777#define OMAP4430_WKUPDEP_HECC1_MPU_SHIFT 0
1778#define OMAP4430_WKUPDEP_HECC1_MPU_MASK (1 << 0)
1779
1780/* Used by PM_L4PER_HECC2_WKDEP */
1781#define OMAP4430_WKUPDEP_HECC2_MPU_SHIFT 0
1782#define OMAP4430_WKUPDEP_HECC2_MPU_MASK (1 << 0)
1783
1784/* Used by PM_L3INIT_HSI_WKDEP */
1785#define OMAP4430_WKUPDEP_HSI_DSP_TESLA_SHIFT 6
1786#define OMAP4430_WKUPDEP_HSI_DSP_TESLA_MASK (1 << 6)
1787
1788/* Used by PM_L3INIT_HSI_WKDEP */
1789#define OMAP4430_WKUPDEP_HSI_MCU_DUCATI_SHIFT 1
1790#define OMAP4430_WKUPDEP_HSI_MCU_DUCATI_MASK (1 << 1)
1791
1792/* Used by PM_L3INIT_HSI_WKDEP */
1793#define OMAP4430_WKUPDEP_HSI_MCU_MPU_SHIFT 0
1794#define OMAP4430_WKUPDEP_HSI_MCU_MPU_MASK (1 << 0)
1795
1796/* Used by PM_L4PER_I2C1_WKDEP */
1797#define OMAP4430_WKUPDEP_I2C1_DMA_SDMA_SHIFT 7
1798#define OMAP4430_WKUPDEP_I2C1_DMA_SDMA_MASK (1 << 7)
1799
1800/* Used by PM_L4PER_I2C1_WKDEP */
1801#define OMAP4430_WKUPDEP_I2C1_IRQ_DUCATI_SHIFT 1
1802#define OMAP4430_WKUPDEP_I2C1_IRQ_DUCATI_MASK (1 << 1)
1803
1804/* Used by PM_L4PER_I2C1_WKDEP */
1805#define OMAP4430_WKUPDEP_I2C1_IRQ_MPU_SHIFT 0
1806#define OMAP4430_WKUPDEP_I2C1_IRQ_MPU_MASK (1 << 0)
1807
1808/* Used by PM_L4PER_I2C2_WKDEP */
1809#define OMAP4430_WKUPDEP_I2C2_DMA_SDMA_SHIFT 7
1810#define OMAP4430_WKUPDEP_I2C2_DMA_SDMA_MASK (1 << 7)
1811
1812/* Used by PM_L4PER_I2C2_WKDEP */
1813#define OMAP4430_WKUPDEP_I2C2_IRQ_DUCATI_SHIFT 1
1814#define OMAP4430_WKUPDEP_I2C2_IRQ_DUCATI_MASK (1 << 1)
1815
1816/* Used by PM_L4PER_I2C2_WKDEP */
1817#define OMAP4430_WKUPDEP_I2C2_IRQ_MPU_SHIFT 0
1818#define OMAP4430_WKUPDEP_I2C2_IRQ_MPU_MASK (1 << 0)
1819
1820/* Used by PM_L4PER_I2C3_WKDEP */
1821#define OMAP4430_WKUPDEP_I2C3_DMA_SDMA_SHIFT 7
1822#define OMAP4430_WKUPDEP_I2C3_DMA_SDMA_MASK (1 << 7)
1823
1824/* Used by PM_L4PER_I2C3_WKDEP */
1825#define OMAP4430_WKUPDEP_I2C3_IRQ_DUCATI_SHIFT 1
1826#define OMAP4430_WKUPDEP_I2C3_IRQ_DUCATI_MASK (1 << 1)
1827
1828/* Used by PM_L4PER_I2C3_WKDEP */
1829#define OMAP4430_WKUPDEP_I2C3_IRQ_MPU_SHIFT 0
1830#define OMAP4430_WKUPDEP_I2C3_IRQ_MPU_MASK (1 << 0)
1831
1832/* Used by PM_L4PER_I2C4_WKDEP */
1833#define OMAP4430_WKUPDEP_I2C4_DMA_SDMA_SHIFT 7
1834#define OMAP4430_WKUPDEP_I2C4_DMA_SDMA_MASK (1 << 7)
1835
1836/* Used by PM_L4PER_I2C4_WKDEP */
1837#define OMAP4430_WKUPDEP_I2C4_IRQ_DUCATI_SHIFT 1
1838#define OMAP4430_WKUPDEP_I2C4_IRQ_DUCATI_MASK (1 << 1)
1839
1840/* Used by PM_L4PER_I2C4_WKDEP */
1841#define OMAP4430_WKUPDEP_I2C4_IRQ_MPU_SHIFT 0
1842#define OMAP4430_WKUPDEP_I2C4_IRQ_MPU_MASK (1 << 0)
1843
1844/* Used by PM_L4PER_I2C5_WKDEP */
1845#define OMAP4430_WKUPDEP_I2C5_DMA_SDMA_SHIFT 7
1846#define OMAP4430_WKUPDEP_I2C5_DMA_SDMA_MASK (1 << 7)
1847
1848/* Used by PM_L4PER_I2C5_WKDEP */
1849#define OMAP4430_WKUPDEP_I2C5_IRQ_MPU_SHIFT 0
1850#define OMAP4430_WKUPDEP_I2C5_IRQ_MPU_MASK (1 << 0)
1851
1852/* Used by PM_WKUP_KEYBOARD_WKDEP */
1853#define OMAP4430_WKUPDEP_KEYBOARD_MPU_SHIFT 0
1854#define OMAP4430_WKUPDEP_KEYBOARD_MPU_MASK (1 << 0)
1855
1856/* Used by PM_ABE_MCASP_WKDEP */
1857#define OMAP4430_WKUPDEP_MCASP1_DMA_SDMA_SHIFT 7
1858#define OMAP4430_WKUPDEP_MCASP1_DMA_SDMA_MASK (1 << 7)
1859
1860/* Used by PM_ABE_MCASP_WKDEP */
1861#define OMAP4430_WKUPDEP_MCASP1_DMA_TESLA_SHIFT 6
1862#define OMAP4430_WKUPDEP_MCASP1_DMA_TESLA_MASK (1 << 6)
1863
1864/* Used by PM_ABE_MCASP_WKDEP */
1865#define OMAP4430_WKUPDEP_MCASP1_IRQ_MPU_SHIFT 0
1866#define OMAP4430_WKUPDEP_MCASP1_IRQ_MPU_MASK (1 << 0)
1867
1868/* Used by PM_ABE_MCASP_WKDEP */
1869#define OMAP4430_WKUPDEP_MCASP1_IRQ_TESLA_SHIFT 2
1870#define OMAP4430_WKUPDEP_MCASP1_IRQ_TESLA_MASK (1 << 2)
1871
1872/* Used by PM_L4PER_MCASP2_WKDEP */
1873#define OMAP4430_WKUPDEP_MCASP2_DMA_SDMA_SHIFT 7
1874#define OMAP4430_WKUPDEP_MCASP2_DMA_SDMA_MASK (1 << 7)
1875
1876/* Used by PM_L4PER_MCASP2_WKDEP */
1877#define OMAP4430_WKUPDEP_MCASP2_DMA_TESLA_SHIFT 6
1878#define OMAP4430_WKUPDEP_MCASP2_DMA_TESLA_MASK (1 << 6)
1879
1880/* Used by PM_L4PER_MCASP2_WKDEP */
1881#define OMAP4430_WKUPDEP_MCASP2_IRQ_MPU_SHIFT 0
1882#define OMAP4430_WKUPDEP_MCASP2_IRQ_MPU_MASK (1 << 0)
1883
1884/* Used by PM_L4PER_MCASP2_WKDEP */
1885#define OMAP4430_WKUPDEP_MCASP2_IRQ_TESLA_SHIFT 2
1886#define OMAP4430_WKUPDEP_MCASP2_IRQ_TESLA_MASK (1 << 2)
1887
1888/* Used by PM_L4PER_MCASP3_WKDEP */
1889#define OMAP4430_WKUPDEP_MCASP3_DMA_SDMA_SHIFT 7
1890#define OMAP4430_WKUPDEP_MCASP3_DMA_SDMA_MASK (1 << 7)
1891
1892/* Used by PM_L4PER_MCASP3_WKDEP */
1893#define OMAP4430_WKUPDEP_MCASP3_DMA_TESLA_SHIFT 6
1894#define OMAP4430_WKUPDEP_MCASP3_DMA_TESLA_MASK (1 << 6)
1895
1896/* Used by PM_L4PER_MCASP3_WKDEP */
1897#define OMAP4430_WKUPDEP_MCASP3_IRQ_MPU_SHIFT 0
1898#define OMAP4430_WKUPDEP_MCASP3_IRQ_MPU_MASK (1 << 0)
1899
1900/* Used by PM_L4PER_MCASP3_WKDEP */
1901#define OMAP4430_WKUPDEP_MCASP3_IRQ_TESLA_SHIFT 2
1902#define OMAP4430_WKUPDEP_MCASP3_IRQ_TESLA_MASK (1 << 2)
1903
1904/* Used by PM_ABE_MCBSP1_WKDEP */
1905#define OMAP4430_WKUPDEP_MCBSP1_MPU_SHIFT 0
1906#define OMAP4430_WKUPDEP_MCBSP1_MPU_MASK (1 << 0)
1907
1908/* Used by PM_ABE_MCBSP1_WKDEP */
1909#define OMAP4430_WKUPDEP_MCBSP1_SDMA_SHIFT 3
1910#define OMAP4430_WKUPDEP_MCBSP1_SDMA_MASK (1 << 3)
1911
1912/* Used by PM_ABE_MCBSP1_WKDEP */
1913#define OMAP4430_WKUPDEP_MCBSP1_TESLA_SHIFT 2
1914#define OMAP4430_WKUPDEP_MCBSP1_TESLA_MASK (1 << 2)
1915
1916/* Used by PM_ABE_MCBSP2_WKDEP */
1917#define OMAP4430_WKUPDEP_MCBSP2_MPU_SHIFT 0
1918#define OMAP4430_WKUPDEP_MCBSP2_MPU_MASK (1 << 0)
1919
1920/* Used by PM_ABE_MCBSP2_WKDEP */
1921#define OMAP4430_WKUPDEP_MCBSP2_SDMA_SHIFT 3
1922#define OMAP4430_WKUPDEP_MCBSP2_SDMA_MASK (1 << 3)
1923
1924/* Used by PM_ABE_MCBSP2_WKDEP */
1925#define OMAP4430_WKUPDEP_MCBSP2_TESLA_SHIFT 2
1926#define OMAP4430_WKUPDEP_MCBSP2_TESLA_MASK (1 << 2)
1927
1928/* Used by PM_ABE_MCBSP3_WKDEP */
1929#define OMAP4430_WKUPDEP_MCBSP3_MPU_SHIFT 0
1930#define OMAP4430_WKUPDEP_MCBSP3_MPU_MASK (1 << 0)
1931
1932/* Used by PM_ABE_MCBSP3_WKDEP */
1933#define OMAP4430_WKUPDEP_MCBSP3_SDMA_SHIFT 3
1934#define OMAP4430_WKUPDEP_MCBSP3_SDMA_MASK (1 << 3)
1935
1936/* Used by PM_ABE_MCBSP3_WKDEP */
1937#define OMAP4430_WKUPDEP_MCBSP3_TESLA_SHIFT 2
1938#define OMAP4430_WKUPDEP_MCBSP3_TESLA_MASK (1 << 2)
1939
1940/* Used by PM_L4PER_MCBSP4_WKDEP */
1941#define OMAP4430_WKUPDEP_MCBSP4_MPU_SHIFT 0
1942#define OMAP4430_WKUPDEP_MCBSP4_MPU_MASK (1 << 0)
1943
1944/* Used by PM_L4PER_MCBSP4_WKDEP */
1945#define OMAP4430_WKUPDEP_MCBSP4_SDMA_SHIFT 3
1946#define OMAP4430_WKUPDEP_MCBSP4_SDMA_MASK (1 << 3)
1947
1948/* Used by PM_L4PER_MCBSP4_WKDEP */
1949#define OMAP4430_WKUPDEP_MCBSP4_TESLA_SHIFT 2
1950#define OMAP4430_WKUPDEP_MCBSP4_TESLA_MASK (1 << 2)
1951
1952/* Used by PM_L4PER_MCSPI1_WKDEP */
1953#define OMAP4430_WKUPDEP_MCSPI1_DUCATI_SHIFT 1
1954#define OMAP4430_WKUPDEP_MCSPI1_DUCATI_MASK (1 << 1)
1955
1956/* Used by PM_L4PER_MCSPI1_WKDEP */
1957#define OMAP4430_WKUPDEP_MCSPI1_MPU_SHIFT 0
1958#define OMAP4430_WKUPDEP_MCSPI1_MPU_MASK (1 << 0)
1959
1960/* Used by PM_L4PER_MCSPI1_WKDEP */
1961#define OMAP4430_WKUPDEP_MCSPI1_SDMA_SHIFT 3
1962#define OMAP4430_WKUPDEP_MCSPI1_SDMA_MASK (1 << 3)
1963
1964/* Used by PM_L4PER_MCSPI1_WKDEP */
1965#define OMAP4430_WKUPDEP_MCSPI1_TESLA_SHIFT 2
1966#define OMAP4430_WKUPDEP_MCSPI1_TESLA_MASK (1 << 2)
1967
1968/* Used by PM_L4PER_MCSPI2_WKDEP */
1969#define OMAP4430_WKUPDEP_MCSPI2_DUCATI_SHIFT 1
1970#define OMAP4430_WKUPDEP_MCSPI2_DUCATI_MASK (1 << 1)
1971
1972/* Used by PM_L4PER_MCSPI2_WKDEP */
1973#define OMAP4430_WKUPDEP_MCSPI2_MPU_SHIFT 0
1974#define OMAP4430_WKUPDEP_MCSPI2_MPU_MASK (1 << 0)
1975
1976/* Used by PM_L4PER_MCSPI2_WKDEP */
1977#define OMAP4430_WKUPDEP_MCSPI2_SDMA_SHIFT 3
1978#define OMAP4430_WKUPDEP_MCSPI2_SDMA_MASK (1 << 3)
1979
1980/* Used by PM_L4PER_MCSPI3_WKDEP */
1981#define OMAP4430_WKUPDEP_MCSPI3_MPU_SHIFT 0
1982#define OMAP4430_WKUPDEP_MCSPI3_MPU_MASK (1 << 0)
1983
1984/* Used by PM_L4PER_MCSPI3_WKDEP */
1985#define OMAP4430_WKUPDEP_MCSPI3_SDMA_SHIFT 3
1986#define OMAP4430_WKUPDEP_MCSPI3_SDMA_MASK (1 << 3)
1987
1988/* Used by PM_L4PER_MCSPI4_WKDEP */
1989#define OMAP4430_WKUPDEP_MCSPI4_MPU_SHIFT 0
1990#define OMAP4430_WKUPDEP_MCSPI4_MPU_MASK (1 << 0)
1991
1992/* Used by PM_L4PER_MCSPI4_WKDEP */
1993#define OMAP4430_WKUPDEP_MCSPI4_SDMA_SHIFT 3
1994#define OMAP4430_WKUPDEP_MCSPI4_SDMA_MASK (1 << 3)
1995
1996/* Used by PM_L3INIT_MMC1_WKDEP */
1997#define OMAP4430_WKUPDEP_MMC1_DUCATI_SHIFT 1
1998#define OMAP4430_WKUPDEP_MMC1_DUCATI_MASK (1 << 1)
1999
2000/* Used by PM_L3INIT_MMC1_WKDEP */
2001#define OMAP4430_WKUPDEP_MMC1_MPU_SHIFT 0
2002#define OMAP4430_WKUPDEP_MMC1_MPU_MASK (1 << 0)
2003
2004/* Used by PM_L3INIT_MMC1_WKDEP */
2005#define OMAP4430_WKUPDEP_MMC1_SDMA_SHIFT 3
2006#define OMAP4430_WKUPDEP_MMC1_SDMA_MASK (1 << 3)
2007
2008/* Used by PM_L3INIT_MMC1_WKDEP */
2009#define OMAP4430_WKUPDEP_MMC1_TESLA_SHIFT 2
2010#define OMAP4430_WKUPDEP_MMC1_TESLA_MASK (1 << 2)
2011
2012/* Used by PM_L3INIT_MMC2_WKDEP */
2013#define OMAP4430_WKUPDEP_MMC2_DUCATI_SHIFT 1
2014#define OMAP4430_WKUPDEP_MMC2_DUCATI_MASK (1 << 1)
2015
2016/* Used by PM_L3INIT_MMC2_WKDEP */
2017#define OMAP4430_WKUPDEP_MMC2_MPU_SHIFT 0
2018#define OMAP4430_WKUPDEP_MMC2_MPU_MASK (1 << 0)
2019
2020/* Used by PM_L3INIT_MMC2_WKDEP */
2021#define OMAP4430_WKUPDEP_MMC2_SDMA_SHIFT 3
2022#define OMAP4430_WKUPDEP_MMC2_SDMA_MASK (1 << 3)
2023
2024/* Used by PM_L3INIT_MMC2_WKDEP */
2025#define OMAP4430_WKUPDEP_MMC2_TESLA_SHIFT 2
2026#define OMAP4430_WKUPDEP_MMC2_TESLA_MASK (1 << 2)
2027
2028/* Used by PM_L3INIT_MMC6_WKDEP */
2029#define OMAP4430_WKUPDEP_MMC6_DUCATI_SHIFT 1
2030#define OMAP4430_WKUPDEP_MMC6_DUCATI_MASK (1 << 1)
2031
2032/* Used by PM_L3INIT_MMC6_WKDEP */
2033#define OMAP4430_WKUPDEP_MMC6_MPU_SHIFT 0
2034#define OMAP4430_WKUPDEP_MMC6_MPU_MASK (1 << 0)
2035
2036/* Used by PM_L3INIT_MMC6_WKDEP */
2037#define OMAP4430_WKUPDEP_MMC6_TESLA_SHIFT 2
2038#define OMAP4430_WKUPDEP_MMC6_TESLA_MASK (1 << 2)
2039
2040/* Used by PM_L4PER_MMCSD3_WKDEP */
2041#define OMAP4430_WKUPDEP_MMCSD3_DUCATI_SHIFT 1
2042#define OMAP4430_WKUPDEP_MMCSD3_DUCATI_MASK (1 << 1)
2043
2044/* Used by PM_L4PER_MMCSD3_WKDEP */
2045#define OMAP4430_WKUPDEP_MMCSD3_MPU_SHIFT 0
2046#define OMAP4430_WKUPDEP_MMCSD3_MPU_MASK (1 << 0)
2047
2048/* Used by PM_L4PER_MMCSD3_WKDEP */
2049#define OMAP4430_WKUPDEP_MMCSD3_SDMA_SHIFT 3
2050#define OMAP4430_WKUPDEP_MMCSD3_SDMA_MASK (1 << 3)
2051
2052/* Used by PM_L4PER_MMCSD4_WKDEP */
2053#define OMAP4430_WKUPDEP_MMCSD4_DUCATI_SHIFT 1
2054#define OMAP4430_WKUPDEP_MMCSD4_DUCATI_MASK (1 << 1)
2055
2056/* Used by PM_L4PER_MMCSD4_WKDEP */
2057#define OMAP4430_WKUPDEP_MMCSD4_MPU_SHIFT 0
2058#define OMAP4430_WKUPDEP_MMCSD4_MPU_MASK (1 << 0)
2059
2060/* Used by PM_L4PER_MMCSD4_WKDEP */
2061#define OMAP4430_WKUPDEP_MMCSD4_SDMA_SHIFT 3
2062#define OMAP4430_WKUPDEP_MMCSD4_SDMA_MASK (1 << 3)
2063
2064/* Used by PM_L4PER_MMCSD5_WKDEP */
2065#define OMAP4430_WKUPDEP_MMCSD5_DUCATI_SHIFT 1
2066#define OMAP4430_WKUPDEP_MMCSD5_DUCATI_MASK (1 << 1)
2067
2068/* Used by PM_L4PER_MMCSD5_WKDEP */
2069#define OMAP4430_WKUPDEP_MMCSD5_MPU_SHIFT 0
2070#define OMAP4430_WKUPDEP_MMCSD5_MPU_MASK (1 << 0)
2071
2072/* Used by PM_L4PER_MMCSD5_WKDEP */
2073#define OMAP4430_WKUPDEP_MMCSD5_SDMA_SHIFT 3
2074#define OMAP4430_WKUPDEP_MMCSD5_SDMA_MASK (1 << 3)
2075
2076/* Used by PM_L3INIT_PCIESS_WKDEP */
2077#define OMAP4430_WKUPDEP_PCIESS_MPU_SHIFT 0
2078#define OMAP4430_WKUPDEP_PCIESS_MPU_MASK (1 << 0)
2079
2080/* Used by PM_L3INIT_PCIESS_WKDEP */
2081#define OMAP4430_WKUPDEP_PCIESS_TESLA_SHIFT 2
2082#define OMAP4430_WKUPDEP_PCIESS_TESLA_MASK (1 << 2)
2083
2084/* Used by PM_ABE_PDM_WKDEP */
2085#define OMAP4430_WKUPDEP_PDM_DMA_SDMA_SHIFT 7
2086#define OMAP4430_WKUPDEP_PDM_DMA_SDMA_MASK (1 << 7)
2087
2088/* Used by PM_ABE_PDM_WKDEP */
2089#define OMAP4430_WKUPDEP_PDM_DMA_TESLA_SHIFT 6
2090#define OMAP4430_WKUPDEP_PDM_DMA_TESLA_MASK (1 << 6)
2091
2092/* Used by PM_ABE_PDM_WKDEP */
2093#define OMAP4430_WKUPDEP_PDM_IRQ_MPU_SHIFT 0
2094#define OMAP4430_WKUPDEP_PDM_IRQ_MPU_MASK (1 << 0)
2095
2096/* Used by PM_ABE_PDM_WKDEP */
2097#define OMAP4430_WKUPDEP_PDM_IRQ_TESLA_SHIFT 2
2098#define OMAP4430_WKUPDEP_PDM_IRQ_TESLA_MASK (1 << 2)
2099
2100/* Used by PM_WKUP_RTC_WKDEP */
2101#define OMAP4430_WKUPDEP_RTC_MPU_SHIFT 0
2102#define OMAP4430_WKUPDEP_RTC_MPU_MASK (1 << 0)
2103
2104/* Used by PM_L3INIT_SATA_WKDEP */
2105#define OMAP4430_WKUPDEP_SATA_MPU_SHIFT 0
2106#define OMAP4430_WKUPDEP_SATA_MPU_MASK (1 << 0)
2107
2108/* Used by PM_L3INIT_SATA_WKDEP */
2109#define OMAP4430_WKUPDEP_SATA_TESLA_SHIFT 2
2110#define OMAP4430_WKUPDEP_SATA_TESLA_MASK (1 << 2)
2111
2112/* Used by PM_ABE_SLIMBUS_WKDEP */
2113#define OMAP4430_WKUPDEP_SLIMBUS1_DMA_SDMA_SHIFT 7
2114#define OMAP4430_WKUPDEP_SLIMBUS1_DMA_SDMA_MASK (1 << 7)
2115
2116/* Used by PM_ABE_SLIMBUS_WKDEP */
2117#define OMAP4430_WKUPDEP_SLIMBUS1_DMA_TESLA_SHIFT 6
2118#define OMAP4430_WKUPDEP_SLIMBUS1_DMA_TESLA_MASK (1 << 6)
2119
2120/* Used by PM_ABE_SLIMBUS_WKDEP */
2121#define OMAP4430_WKUPDEP_SLIMBUS1_IRQ_MPU_SHIFT 0
2122#define OMAP4430_WKUPDEP_SLIMBUS1_IRQ_MPU_MASK (1 << 0)
2123
2124/* Used by PM_ABE_SLIMBUS_WKDEP */
2125#define OMAP4430_WKUPDEP_SLIMBUS1_IRQ_TESLA_SHIFT 2
2126#define OMAP4430_WKUPDEP_SLIMBUS1_IRQ_TESLA_MASK (1 << 2)
2127
2128/* Used by PM_L4PER_SLIMBUS2_WKDEP */
2129#define OMAP4430_WKUPDEP_SLIMBUS2_DMA_SDMA_SHIFT 7
2130#define OMAP4430_WKUPDEP_SLIMBUS2_DMA_SDMA_MASK (1 << 7)
2131
2132/* Used by PM_L4PER_SLIMBUS2_WKDEP */
2133#define OMAP4430_WKUPDEP_SLIMBUS2_DMA_TESLA_SHIFT 6
2134#define OMAP4430_WKUPDEP_SLIMBUS2_DMA_TESLA_MASK (1 << 6)
2135
2136/* Used by PM_L4PER_SLIMBUS2_WKDEP */
2137#define OMAP4430_WKUPDEP_SLIMBUS2_IRQ_MPU_SHIFT 0
2138#define OMAP4430_WKUPDEP_SLIMBUS2_IRQ_MPU_MASK (1 << 0)
2139
2140/* Used by PM_L4PER_SLIMBUS2_WKDEP */
2141#define OMAP4430_WKUPDEP_SLIMBUS2_IRQ_TESLA_SHIFT 2
2142#define OMAP4430_WKUPDEP_SLIMBUS2_IRQ_TESLA_MASK (1 << 2)
2143
2144/* Used by PM_ALWON_SR_CORE_WKDEP */
2145#define OMAP4430_WKUPDEP_SR_CORE_DUCATI_SHIFT 1
2146#define OMAP4430_WKUPDEP_SR_CORE_DUCATI_MASK (1 << 1)
2147
2148/* Used by PM_ALWON_SR_CORE_WKDEP */
2149#define OMAP4430_WKUPDEP_SR_CORE_MPU_SHIFT 0
2150#define OMAP4430_WKUPDEP_SR_CORE_MPU_MASK (1 << 0)
2151
2152/* Used by PM_ALWON_SR_IVA_WKDEP */
2153#define OMAP4430_WKUPDEP_SR_IVA_DUCATI_SHIFT 1
2154#define OMAP4430_WKUPDEP_SR_IVA_DUCATI_MASK (1 << 1)
2155
2156/* Used by PM_ALWON_SR_IVA_WKDEP */
2157#define OMAP4430_WKUPDEP_SR_IVA_MPU_SHIFT 0
2158#define OMAP4430_WKUPDEP_SR_IVA_MPU_MASK (1 << 0)
2159
2160/* Used by PM_ALWON_SR_MPU_WKDEP */
2161#define OMAP4430_WKUPDEP_SR_MPU_MPU_SHIFT 0
2162#define OMAP4430_WKUPDEP_SR_MPU_MPU_MASK (1 << 0)
2163
2164/* Used by PM_WKUP_TIMER12_WKDEP */
2165#define OMAP4430_WKUPDEP_TIMER12_MPU_SHIFT 0
2166#define OMAP4430_WKUPDEP_TIMER12_MPU_MASK (1 << 0)
2167
2168/* Used by PM_WKUP_TIMER1_WKDEP */
2169#define OMAP4430_WKUPDEP_TIMER1_MPU_SHIFT 0
2170#define OMAP4430_WKUPDEP_TIMER1_MPU_MASK (1 << 0)
2171
2172/* Used by PM_ABE_TIMER5_WKDEP */
2173#define OMAP4430_WKUPDEP_TIMER5_MPU_SHIFT 0
2174#define OMAP4430_WKUPDEP_TIMER5_MPU_MASK (1 << 0)
2175
2176/* Used by PM_ABE_TIMER5_WKDEP */
2177#define OMAP4430_WKUPDEP_TIMER5_TESLA_SHIFT 2
2178#define OMAP4430_WKUPDEP_TIMER5_TESLA_MASK (1 << 2)
2179
2180/* Used by PM_ABE_TIMER6_WKDEP */
2181#define OMAP4430_WKUPDEP_TIMER6_MPU_SHIFT 0
2182#define OMAP4430_WKUPDEP_TIMER6_MPU_MASK (1 << 0)
2183
2184/* Used by PM_ABE_TIMER6_WKDEP */
2185#define OMAP4430_WKUPDEP_TIMER6_TESLA_SHIFT 2
2186#define OMAP4430_WKUPDEP_TIMER6_TESLA_MASK (1 << 2)
2187
2188/* Used by PM_ABE_TIMER7_WKDEP */
2189#define OMAP4430_WKUPDEP_TIMER7_MPU_SHIFT 0
2190#define OMAP4430_WKUPDEP_TIMER7_MPU_MASK (1 << 0)
2191
2192/* Used by PM_ABE_TIMER7_WKDEP */
2193#define OMAP4430_WKUPDEP_TIMER7_TESLA_SHIFT 2
2194#define OMAP4430_WKUPDEP_TIMER7_TESLA_MASK (1 << 2)
2195
2196/* Used by PM_ABE_TIMER8_WKDEP */
2197#define OMAP4430_WKUPDEP_TIMER8_MPU_SHIFT 0
2198#define OMAP4430_WKUPDEP_TIMER8_MPU_MASK (1 << 0)
2199
2200/* Used by PM_ABE_TIMER8_WKDEP */
2201#define OMAP4430_WKUPDEP_TIMER8_TESLA_SHIFT 2
2202#define OMAP4430_WKUPDEP_TIMER8_TESLA_MASK (1 << 2)
2203
2204/* Used by PM_L4PER_UART1_WKDEP */
2205#define OMAP4430_WKUPDEP_UART1_MPU_SHIFT 0
2206#define OMAP4430_WKUPDEP_UART1_MPU_MASK (1 << 0)
2207
2208/* Used by PM_L4PER_UART1_WKDEP */
2209#define OMAP4430_WKUPDEP_UART1_SDMA_SHIFT 3
2210#define OMAP4430_WKUPDEP_UART1_SDMA_MASK (1 << 3)
2211
2212/* Used by PM_L4PER_UART2_WKDEP */
2213#define OMAP4430_WKUPDEP_UART2_MPU_SHIFT 0
2214#define OMAP4430_WKUPDEP_UART2_MPU_MASK (1 << 0)
2215
2216/* Used by PM_L4PER_UART2_WKDEP */
2217#define OMAP4430_WKUPDEP_UART2_SDMA_SHIFT 3
2218#define OMAP4430_WKUPDEP_UART2_SDMA_MASK (1 << 3)
2219
2220/* Used by PM_L4PER_UART3_WKDEP */
2221#define OMAP4430_WKUPDEP_UART3_DUCATI_SHIFT 1
2222#define OMAP4430_WKUPDEP_UART3_DUCATI_MASK (1 << 1)
2223
2224/* Used by PM_L4PER_UART3_WKDEP */
2225#define OMAP4430_WKUPDEP_UART3_MPU_SHIFT 0
2226#define OMAP4430_WKUPDEP_UART3_MPU_MASK (1 << 0)
2227
2228/* Used by PM_L4PER_UART3_WKDEP */
2229#define OMAP4430_WKUPDEP_UART3_SDMA_SHIFT 3
2230#define OMAP4430_WKUPDEP_UART3_SDMA_MASK (1 << 3)
2231
2232/* Used by PM_L4PER_UART3_WKDEP */
2233#define OMAP4430_WKUPDEP_UART3_TESLA_SHIFT 2
2234#define OMAP4430_WKUPDEP_UART3_TESLA_MASK (1 << 2)
2235
2236/* Used by PM_L4PER_UART4_WKDEP */
2237#define OMAP4430_WKUPDEP_UART4_MPU_SHIFT 0
2238#define OMAP4430_WKUPDEP_UART4_MPU_MASK (1 << 0)
2239
2240/* Used by PM_L4PER_UART4_WKDEP */
2241#define OMAP4430_WKUPDEP_UART4_SDMA_SHIFT 3
2242#define OMAP4430_WKUPDEP_UART4_SDMA_MASK (1 << 3)
2243
2244/* Used by PM_L3INIT_UNIPRO1_WKDEP */
2245#define OMAP4430_WKUPDEP_UNIPRO1_DUCATI_SHIFT 1
2246#define OMAP4430_WKUPDEP_UNIPRO1_DUCATI_MASK (1 << 1)
2247
2248/* Used by PM_L3INIT_UNIPRO1_WKDEP */
2249#define OMAP4430_WKUPDEP_UNIPRO1_MPU_SHIFT 0
2250#define OMAP4430_WKUPDEP_UNIPRO1_MPU_MASK (1 << 0)
2251
2252/* Used by PM_L3INIT_USB_HOST_WKDEP */
2253#define OMAP4430_WKUPDEP_USB_HOST_DUCATI_SHIFT 1
2254#define OMAP4430_WKUPDEP_USB_HOST_DUCATI_MASK (1 << 1)
2255
2256/* Used by PM_L3INIT_USB_HOST_FS_WKDEP */
2257#define OMAP4430_WKUPDEP_USB_HOST_FS_DUCATI_SHIFT 1
2258#define OMAP4430_WKUPDEP_USB_HOST_FS_DUCATI_MASK (1 << 1)
2259
2260/* Used by PM_L3INIT_USB_HOST_FS_WKDEP */
2261#define OMAP4430_WKUPDEP_USB_HOST_FS_MPU_SHIFT 0
2262#define OMAP4430_WKUPDEP_USB_HOST_FS_MPU_MASK (1 << 0)
2263
2264/* Used by PM_L3INIT_USB_HOST_WKDEP */
2265#define OMAP4430_WKUPDEP_USB_HOST_MPU_SHIFT 0
2266#define OMAP4430_WKUPDEP_USB_HOST_MPU_MASK (1 << 0)
2267
2268/* Used by PM_L3INIT_USB_OTG_WKDEP */
2269#define OMAP4430_WKUPDEP_USB_OTG_DUCATI_SHIFT 1
2270#define OMAP4430_WKUPDEP_USB_OTG_DUCATI_MASK (1 << 1)
2271
2272/* Used by PM_L3INIT_USB_OTG_WKDEP */
2273#define OMAP4430_WKUPDEP_USB_OTG_MPU_SHIFT 0
2274#define OMAP4430_WKUPDEP_USB_OTG_MPU_MASK (1 << 0)
2275
2276/* Used by PM_L3INIT_USB_TLL_WKDEP */
2277#define OMAP4430_WKUPDEP_USB_TLL_DUCATI_SHIFT 1
2278#define OMAP4430_WKUPDEP_USB_TLL_DUCATI_MASK (1 << 1)
2279
2280/* Used by PM_L3INIT_USB_TLL_WKDEP */
2281#define OMAP4430_WKUPDEP_USB_TLL_MPU_SHIFT 0
2282#define OMAP4430_WKUPDEP_USB_TLL_MPU_MASK (1 << 0)
2283
2284/* Used by PM_WKUP_USIM_WKDEP */
2285#define OMAP4430_WKUPDEP_USIM_MPU_SHIFT 0
2286#define OMAP4430_WKUPDEP_USIM_MPU_MASK (1 << 0)
2287
2288/* Used by PM_WKUP_USIM_WKDEP */
2289#define OMAP4430_WKUPDEP_USIM_SDMA_SHIFT 3
2290#define OMAP4430_WKUPDEP_USIM_SDMA_MASK (1 << 3)
2291
2292/* Used by PM_WKUP_WDT2_WKDEP */
2293#define OMAP4430_WKUPDEP_WDT2_DUCATI_SHIFT 1
2294#define OMAP4430_WKUPDEP_WDT2_DUCATI_MASK (1 << 1)
2295
2296/* Used by PM_WKUP_WDT2_WKDEP */
2297#define OMAP4430_WKUPDEP_WDT2_MPU_SHIFT 0
2298#define OMAP4430_WKUPDEP_WDT2_MPU_MASK (1 << 0)
2299
2300/* Used by PM_ABE_WDT3_WKDEP */
2301#define OMAP4430_WKUPDEP_WDT3_MPU_SHIFT 0
2302#define OMAP4430_WKUPDEP_WDT3_MPU_MASK (1 << 0)
2303
2304/* Used by PM_L3INIT_HSI_WKDEP */
2305#define OMAP4430_WKUPDEP_WGM_HSI_WAKE_MPU_SHIFT 8
2306#define OMAP4430_WKUPDEP_WGM_HSI_WAKE_MPU_MASK (1 << 8)
2307
2308/* Used by PM_L3INIT_XHPI_WKDEP */
2309#define OMAP4430_WKUPDEP_XHPI_DUCATI_SHIFT 1
2310#define OMAP4430_WKUPDEP_XHPI_DUCATI_MASK (1 << 1)
2311
2312/* Used by PRM_IO_PMCTRL */
2313#define OMAP4430_WUCLK_CTRL_SHIFT 8
2314#define OMAP4430_WUCLK_CTRL_MASK (1 << 8) 98#define OMAP4430_WUCLK_CTRL_MASK (1 << 8)
2315
2316/* Used by PRM_IO_PMCTRL */
2317#define OMAP4430_WUCLK_STATUS_SHIFT 9 99#define OMAP4430_WUCLK_STATUS_SHIFT 9
2318#define OMAP4430_WUCLK_STATUS_MASK (1 << 9) 100#define OMAP4430_WUCLK_STATUS_MASK (1 << 9)
2319
2320/* Used by REVISION_PRM */
2321#define OMAP4430_X_MAJOR_SHIFT 8
2322#define OMAP4430_X_MAJOR_MASK (0x7 << 8)
2323
2324/* Used by REVISION_PRM */
2325#define OMAP4430_Y_MINOR_SHIFT 0
2326#define OMAP4430_Y_MINOR_MASK (0x3f << 0)
2327#endif 101#endif
diff --git a/arch/arm/mach-omap2/prm-regbits-54xx.h b/arch/arm/mach-omap2/prm-regbits-54xx.h
deleted file mode 100644
index be31b21aa9c6..000000000000
--- a/arch/arm/mach-omap2/prm-regbits-54xx.h
+++ /dev/null
@@ -1,2701 +0,0 @@
1/*
2 * OMAP54xx Power Management register bits
3 *
4 * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
5 *
6 * Paul Walmsley (paul@pwsan.com)
7 * Rajendra Nayak (rnayak@ti.com)
8 * Benoit Cousson (b-cousson@ti.com)
9 *
10 * This file is automatically generated from the OMAP hardware databases.
11 * We respectfully ask that any modifications to this file be coordinated
12 * with the public linux-omap@vger.kernel.org mailing list and the
13 * authors above to ensure that the autogeneration scripts are kept
14 * up-to-date with the file contents.
15 *
16 * This program is free software; you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License version 2 as
18 * published by the Free Software Foundation.
19 */
20
21#ifndef __ARCH_ARM_MACH_OMAP2_PRM_REGBITS_54XX_H
22#define __ARCH_ARM_MACH_OMAP2_PRM_REGBITS_54XX_H
23
24/* Used by PRM_SLDO_CORE_SETUP, PRM_SLDO_MM_SETUP, PRM_SLDO_MPU_SETUP */
25#define OMAP54XX_ABBOFF_ACT_SHIFT 1
26#define OMAP54XX_ABBOFF_ACT_WIDTH 0x1
27#define OMAP54XX_ABBOFF_ACT_MASK (1 << 1)
28
29/* Used by PRM_SLDO_CORE_SETUP, PRM_SLDO_MM_SETUP, PRM_SLDO_MPU_SETUP */
30#define OMAP54XX_ABBOFF_SLEEP_SHIFT 2
31#define OMAP54XX_ABBOFF_SLEEP_WIDTH 0x1
32#define OMAP54XX_ABBOFF_SLEEP_MASK (1 << 2)
33
34/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
35#define OMAP54XX_ABB_MM_DONE_EN_SHIFT 31
36#define OMAP54XX_ABB_MM_DONE_EN_WIDTH 0x1
37#define OMAP54XX_ABB_MM_DONE_EN_MASK (1 << 31)
38
39/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
40#define OMAP54XX_ABB_MM_DONE_ST_SHIFT 31
41#define OMAP54XX_ABB_MM_DONE_ST_WIDTH 0x1
42#define OMAP54XX_ABB_MM_DONE_ST_MASK (1 << 31)
43
44/* Used by PRM_IRQENABLE_MPU_2 */
45#define OMAP54XX_ABB_MPU_DONE_EN_SHIFT 7
46#define OMAP54XX_ABB_MPU_DONE_EN_WIDTH 0x1
47#define OMAP54XX_ABB_MPU_DONE_EN_MASK (1 << 7)
48
49/* Used by PRM_IRQSTATUS_MPU_2 */
50#define OMAP54XX_ABB_MPU_DONE_ST_SHIFT 7
51#define OMAP54XX_ABB_MPU_DONE_ST_WIDTH 0x1
52#define OMAP54XX_ABB_MPU_DONE_ST_MASK (1 << 7)
53
54/* Used by PRM_ABBLDO_MM_SETUP, PRM_ABBLDO_MPU_SETUP */
55#define OMAP54XX_ACTIVE_FBB_SEL_SHIFT 2
56#define OMAP54XX_ACTIVE_FBB_SEL_WIDTH 0x1
57#define OMAP54XX_ACTIVE_FBB_SEL_MASK (1 << 2)
58
59/* Used by PM_ABE_PWRSTCTRL */
60#define OMAP54XX_AESSMEM_ONSTATE_SHIFT 16
61#define OMAP54XX_AESSMEM_ONSTATE_WIDTH 0x2
62#define OMAP54XX_AESSMEM_ONSTATE_MASK (0x3 << 16)
63
64/* Used by PM_ABE_PWRSTCTRL */
65#define OMAP54XX_AESSMEM_RETSTATE_SHIFT 8
66#define OMAP54XX_AESSMEM_RETSTATE_WIDTH 0x1
67#define OMAP54XX_AESSMEM_RETSTATE_MASK (1 << 8)
68
69/* Used by PM_ABE_PWRSTST */
70#define OMAP54XX_AESSMEM_STATEST_SHIFT 4
71#define OMAP54XX_AESSMEM_STATEST_WIDTH 0x2
72#define OMAP54XX_AESSMEM_STATEST_MASK (0x3 << 4)
73
74/* Used by PRM_SLDO_CORE_SETUP, PRM_SLDO_MM_SETUP, PRM_SLDO_MPU_SETUP */
75#define OMAP54XX_AIPOFF_SHIFT 8
76#define OMAP54XX_AIPOFF_WIDTH 0x1
77#define OMAP54XX_AIPOFF_MASK (1 << 8)
78
79/* Used by PRM_VOLTCTRL */
80#define OMAP54XX_AUTO_CTRL_VDD_CORE_L_SHIFT 0
81#define OMAP54XX_AUTO_CTRL_VDD_CORE_L_WIDTH 0x2
82#define OMAP54XX_AUTO_CTRL_VDD_CORE_L_MASK (0x3 << 0)
83
84/* Used by PRM_VOLTCTRL */
85#define OMAP54XX_AUTO_CTRL_VDD_MM_L_SHIFT 4
86#define OMAP54XX_AUTO_CTRL_VDD_MM_L_WIDTH 0x2
87#define OMAP54XX_AUTO_CTRL_VDD_MM_L_MASK (0x3 << 4)
88
89/* Used by PRM_VOLTCTRL */
90#define OMAP54XX_AUTO_CTRL_VDD_MPU_L_SHIFT 2
91#define OMAP54XX_AUTO_CTRL_VDD_MPU_L_WIDTH 0x2
92#define OMAP54XX_AUTO_CTRL_VDD_MPU_L_MASK (0x3 << 2)
93
94/* Used by PRM_VC_BYPASS_ERRST */
95#define OMAP54XX_BYPS_RA_ERR_SHIFT 1
96#define OMAP54XX_BYPS_RA_ERR_WIDTH 0x1
97#define OMAP54XX_BYPS_RA_ERR_MASK (1 << 1)
98
99/* Used by PRM_VC_BYPASS_ERRST */
100#define OMAP54XX_BYPS_SA_ERR_SHIFT 0
101#define OMAP54XX_BYPS_SA_ERR_WIDTH 0x1
102#define OMAP54XX_BYPS_SA_ERR_MASK (1 << 0)
103
104/* Used by PRM_VC_BYPASS_ERRST */
105#define OMAP54XX_BYPS_TIMEOUT_ERR_SHIFT 2
106#define OMAP54XX_BYPS_TIMEOUT_ERR_WIDTH 0x1
107#define OMAP54XX_BYPS_TIMEOUT_ERR_MASK (1 << 2)
108
109/* Used by PRM_RSTST */
110#define OMAP54XX_C2C_RST_SHIFT 10
111#define OMAP54XX_C2C_RST_WIDTH 0x1
112#define OMAP54XX_C2C_RST_MASK (1 << 10)
113
114/* Used by PM_CAM_PWRSTCTRL */
115#define OMAP54XX_CAM_MEM_ONSTATE_SHIFT 16
116#define OMAP54XX_CAM_MEM_ONSTATE_WIDTH 0x2
117#define OMAP54XX_CAM_MEM_ONSTATE_MASK (0x3 << 16)
118
119/* Used by PM_CAM_PWRSTST */
120#define OMAP54XX_CAM_MEM_STATEST_SHIFT 4
121#define OMAP54XX_CAM_MEM_STATEST_WIDTH 0x2
122#define OMAP54XX_CAM_MEM_STATEST_MASK (0x3 << 4)
123
124/* Used by PRM_CLKREQCTRL */
125#define OMAP54XX_CLKREQ_COND_SHIFT 0
126#define OMAP54XX_CLKREQ_COND_WIDTH 0x3
127#define OMAP54XX_CLKREQ_COND_MASK (0x7 << 0)
128
129/* Used by PRM_VC_SMPS_CORE_CONFIG */
130#define OMAP54XX_CMDRA_VDD_CORE_L_SHIFT 16
131#define OMAP54XX_CMDRA_VDD_CORE_L_WIDTH 0x8
132#define OMAP54XX_CMDRA_VDD_CORE_L_MASK (0xff << 16)
133
134/* Used by PRM_VC_SMPS_MM_CONFIG */
135#define OMAP54XX_CMDRA_VDD_MM_L_SHIFT 16
136#define OMAP54XX_CMDRA_VDD_MM_L_WIDTH 0x8
137#define OMAP54XX_CMDRA_VDD_MM_L_MASK (0xff << 16)
138
139/* Used by PRM_VC_SMPS_MPU_CONFIG */
140#define OMAP54XX_CMDRA_VDD_MPU_L_SHIFT 16
141#define OMAP54XX_CMDRA_VDD_MPU_L_WIDTH 0x8
142#define OMAP54XX_CMDRA_VDD_MPU_L_MASK (0xff << 16)
143
144/* Used by PRM_VC_SMPS_CORE_CONFIG */
145#define OMAP54XX_CMD_VDD_CORE_L_SHIFT 28
146#define OMAP54XX_CMD_VDD_CORE_L_WIDTH 0x1
147#define OMAP54XX_CMD_VDD_CORE_L_MASK (1 << 28)
148
149/* Used by PRM_VC_SMPS_MM_CONFIG */
150#define OMAP54XX_CMD_VDD_MM_L_SHIFT 28
151#define OMAP54XX_CMD_VDD_MM_L_WIDTH 0x1
152#define OMAP54XX_CMD_VDD_MM_L_MASK (1 << 28)
153
154/* Used by PRM_VC_SMPS_MPU_CONFIG */
155#define OMAP54XX_CMD_VDD_MPU_L_SHIFT 28
156#define OMAP54XX_CMD_VDD_MPU_L_WIDTH 0x1
157#define OMAP54XX_CMD_VDD_MPU_L_MASK (1 << 28)
158
159/* Used by PM_CORE_PWRSTCTRL */
160#define OMAP54XX_CORE_OCMRAM_ONSTATE_SHIFT 18
161#define OMAP54XX_CORE_OCMRAM_ONSTATE_WIDTH 0x2
162#define OMAP54XX_CORE_OCMRAM_ONSTATE_MASK (0x3 << 18)
163
164/* Used by PM_CORE_PWRSTCTRL */
165#define OMAP54XX_CORE_OCMRAM_RETSTATE_SHIFT 9
166#define OMAP54XX_CORE_OCMRAM_RETSTATE_WIDTH 0x1
167#define OMAP54XX_CORE_OCMRAM_RETSTATE_MASK (1 << 9)
168
169/* Used by PM_CORE_PWRSTST */
170#define OMAP54XX_CORE_OCMRAM_STATEST_SHIFT 6
171#define OMAP54XX_CORE_OCMRAM_STATEST_WIDTH 0x2
172#define OMAP54XX_CORE_OCMRAM_STATEST_MASK (0x3 << 6)
173
174/* Used by PM_CORE_PWRSTCTRL */
175#define OMAP54XX_CORE_OTHER_BANK_ONSTATE_SHIFT 16
176#define OMAP54XX_CORE_OTHER_BANK_ONSTATE_WIDTH 0x2
177#define OMAP54XX_CORE_OTHER_BANK_ONSTATE_MASK (0x3 << 16)
178
179/* Used by PM_CORE_PWRSTCTRL */
180#define OMAP54XX_CORE_OTHER_BANK_RETSTATE_SHIFT 8
181#define OMAP54XX_CORE_OTHER_BANK_RETSTATE_WIDTH 0x1
182#define OMAP54XX_CORE_OTHER_BANK_RETSTATE_MASK (1 << 8)
183
184/* Used by PM_CORE_PWRSTST */
185#define OMAP54XX_CORE_OTHER_BANK_STATEST_SHIFT 4
186#define OMAP54XX_CORE_OTHER_BANK_STATEST_WIDTH 0x2
187#define OMAP54XX_CORE_OTHER_BANK_STATEST_MASK (0x3 << 4)
188
189/* Used by REVISION_PRM */
190#define OMAP54XX_CUSTOM_SHIFT 6
191#define OMAP54XX_CUSTOM_WIDTH 0x2
192#define OMAP54XX_CUSTOM_MASK (0x3 << 6)
193
194/* Used by PRM_VC_VAL_BYPASS */
195#define OMAP54XX_DATA_SHIFT 16
196#define OMAP54XX_DATA_WIDTH 0x8
197#define OMAP54XX_DATA_MASK (0xff << 16)
198
199/* Used by PRM_DEBUG_CORE_RET_TRANS */
200#define OMAP54XX_PRM_DEBUG_OUT_SHIFT 0
201#define OMAP54XX_PRM_DEBUG_OUT_WIDTH 0x1c
202#define OMAP54XX_PRM_DEBUG_OUT_MASK (0xfffffff << 0)
203
204/* Renamed from DEBUG_OUT Used by PRM_DEBUG_MM_RET_TRANS */
205#define OMAP54XX_DEBUG_OUT_0_9_SHIFT 0
206#define OMAP54XX_DEBUG_OUT_0_9_WIDTH 0xa
207#define OMAP54XX_DEBUG_OUT_0_9_MASK (0x3ff << 0)
208
209/* Renamed from DEBUG_OUT Used by PRM_DEBUG_MPU_RET_TRANS */
210#define OMAP54XX_DEBUG_OUT_0_6_SHIFT 0
211#define OMAP54XX_DEBUG_OUT_0_6_WIDTH 0x7
212#define OMAP54XX_DEBUG_OUT_0_6_MASK (0x7f << 0)
213
214/* Renamed from DEBUG_OUT Used by PRM_DEBUG_OFF_TRANS */
215#define OMAP54XX_DEBUG_OUT_0_31_SHIFT 0
216#define OMAP54XX_DEBUG_OUT_0_31_WIDTH 0x20
217#define OMAP54XX_DEBUG_OUT_0_31_MASK (0xffffffff << 0)
218
219/* Renamed from DEBUG_OUT Used by PRM_DEBUG_WKUPAON_FD_TRANS */
220#define OMAP54XX_DEBUG_OUT_0_11_SHIFT 0
221#define OMAP54XX_DEBUG_OUT_0_11_WIDTH 0xc
222#define OMAP54XX_DEBUG_OUT_0_11_MASK (0xfff << 0)
223
224/* Used by PRM_DEVICE_OFF_CTRL */
225#define OMAP54XX_DEVICE_OFF_ENABLE_SHIFT 0
226#define OMAP54XX_DEVICE_OFF_ENABLE_WIDTH 0x1
227#define OMAP54XX_DEVICE_OFF_ENABLE_MASK (1 << 0)
228
229/* Used by PRM_VC_CFG_I2C_MODE */
230#define OMAP54XX_DFILTEREN_SHIFT 6
231#define OMAP54XX_DFILTEREN_WIDTH 0x1
232#define OMAP54XX_DFILTEREN_MASK (1 << 6)
233
234/* Used by PRM_IRQENABLE_DSP, PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
235#define OMAP54XX_DPLL_ABE_RECAL_EN_SHIFT 4
236#define OMAP54XX_DPLL_ABE_RECAL_EN_WIDTH 0x1
237#define OMAP54XX_DPLL_ABE_RECAL_EN_MASK (1 << 4)
238
239/* Used by PRM_IRQSTATUS_DSP, PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
240#define OMAP54XX_DPLL_ABE_RECAL_ST_SHIFT 4
241#define OMAP54XX_DPLL_ABE_RECAL_ST_WIDTH 0x1
242#define OMAP54XX_DPLL_ABE_RECAL_ST_MASK (1 << 4)
243
244/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
245#define OMAP54XX_DPLL_CORE_RECAL_EN_SHIFT 0
246#define OMAP54XX_DPLL_CORE_RECAL_EN_WIDTH 0x1
247#define OMAP54XX_DPLL_CORE_RECAL_EN_MASK (1 << 0)
248
249/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
250#define OMAP54XX_DPLL_CORE_RECAL_ST_SHIFT 0
251#define OMAP54XX_DPLL_CORE_RECAL_ST_WIDTH 0x1
252#define OMAP54XX_DPLL_CORE_RECAL_ST_MASK (1 << 0)
253
254/* Used by PRM_IRQENABLE_DSP, PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
255#define OMAP54XX_DPLL_IVA_RECAL_EN_SHIFT 2
256#define OMAP54XX_DPLL_IVA_RECAL_EN_WIDTH 0x1
257#define OMAP54XX_DPLL_IVA_RECAL_EN_MASK (1 << 2)
258
259/* Used by PRM_IRQSTATUS_DSP, PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
260#define OMAP54XX_DPLL_IVA_RECAL_ST_SHIFT 2
261#define OMAP54XX_DPLL_IVA_RECAL_ST_WIDTH 0x1
262#define OMAP54XX_DPLL_IVA_RECAL_ST_MASK (1 << 2)
263
264/* Used by PRM_IRQENABLE_MPU */
265#define OMAP54XX_DPLL_MPU_RECAL_EN_SHIFT 1
266#define OMAP54XX_DPLL_MPU_RECAL_EN_WIDTH 0x1
267#define OMAP54XX_DPLL_MPU_RECAL_EN_MASK (1 << 1)
268
269/* Used by PRM_IRQSTATUS_MPU */
270#define OMAP54XX_DPLL_MPU_RECAL_ST_SHIFT 1
271#define OMAP54XX_DPLL_MPU_RECAL_ST_WIDTH 0x1
272#define OMAP54XX_DPLL_MPU_RECAL_ST_MASK (1 << 1)
273
274/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
275#define OMAP54XX_DPLL_PER_RECAL_EN_SHIFT 3
276#define OMAP54XX_DPLL_PER_RECAL_EN_WIDTH 0x1
277#define OMAP54XX_DPLL_PER_RECAL_EN_MASK (1 << 3)
278
279/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
280#define OMAP54XX_DPLL_PER_RECAL_ST_SHIFT 3
281#define OMAP54XX_DPLL_PER_RECAL_ST_WIDTH 0x1
282#define OMAP54XX_DPLL_PER_RECAL_ST_MASK (1 << 3)
283
284/* Used by PM_DSP_PWRSTCTRL */
285#define OMAP54XX_DSP_EDMA_ONSTATE_SHIFT 20
286#define OMAP54XX_DSP_EDMA_ONSTATE_WIDTH 0x2
287#define OMAP54XX_DSP_EDMA_ONSTATE_MASK (0x3 << 20)
288
289/* Used by PM_DSP_PWRSTCTRL */
290#define OMAP54XX_DSP_EDMA_RETSTATE_SHIFT 10
291#define OMAP54XX_DSP_EDMA_RETSTATE_WIDTH 0x1
292#define OMAP54XX_DSP_EDMA_RETSTATE_MASK (1 << 10)
293
294/* Used by PM_DSP_PWRSTST */
295#define OMAP54XX_DSP_EDMA_STATEST_SHIFT 8
296#define OMAP54XX_DSP_EDMA_STATEST_WIDTH 0x2
297#define OMAP54XX_DSP_EDMA_STATEST_MASK (0x3 << 8)
298
299/* Used by PM_DSP_PWRSTCTRL */
300#define OMAP54XX_DSP_L1_ONSTATE_SHIFT 16
301#define OMAP54XX_DSP_L1_ONSTATE_WIDTH 0x2
302#define OMAP54XX_DSP_L1_ONSTATE_MASK (0x3 << 16)
303
304/* Used by PM_DSP_PWRSTCTRL */
305#define OMAP54XX_DSP_L1_RETSTATE_SHIFT 8
306#define OMAP54XX_DSP_L1_RETSTATE_WIDTH 0x1
307#define OMAP54XX_DSP_L1_RETSTATE_MASK (1 << 8)
308
309/* Used by PM_DSP_PWRSTST */
310#define OMAP54XX_DSP_L1_STATEST_SHIFT 4
311#define OMAP54XX_DSP_L1_STATEST_WIDTH 0x2
312#define OMAP54XX_DSP_L1_STATEST_MASK (0x3 << 4)
313
314/* Used by PM_DSP_PWRSTCTRL */
315#define OMAP54XX_DSP_L2_ONSTATE_SHIFT 18
316#define OMAP54XX_DSP_L2_ONSTATE_WIDTH 0x2
317#define OMAP54XX_DSP_L2_ONSTATE_MASK (0x3 << 18)
318
319/* Used by PM_DSP_PWRSTCTRL */
320#define OMAP54XX_DSP_L2_RETSTATE_SHIFT 9
321#define OMAP54XX_DSP_L2_RETSTATE_WIDTH 0x1
322#define OMAP54XX_DSP_L2_RETSTATE_MASK (1 << 9)
323
324/* Used by PM_DSP_PWRSTST */
325#define OMAP54XX_DSP_L2_STATEST_SHIFT 6
326#define OMAP54XX_DSP_L2_STATEST_WIDTH 0x2
327#define OMAP54XX_DSP_L2_STATEST_MASK (0x3 << 6)
328
329/* Used by PM_DSS_PWRSTCTRL */
330#define OMAP54XX_DSS_MEM_ONSTATE_SHIFT 16
331#define OMAP54XX_DSS_MEM_ONSTATE_WIDTH 0x2
332#define OMAP54XX_DSS_MEM_ONSTATE_MASK (0x3 << 16)
333
334/* Used by PM_DSS_PWRSTCTRL */
335#define OMAP54XX_DSS_MEM_RETSTATE_SHIFT 8
336#define OMAP54XX_DSS_MEM_RETSTATE_WIDTH 0x1
337#define OMAP54XX_DSS_MEM_RETSTATE_MASK (1 << 8)
338
339/* Used by PM_DSS_PWRSTST */
340#define OMAP54XX_DSS_MEM_STATEST_SHIFT 4
341#define OMAP54XX_DSS_MEM_STATEST_WIDTH 0x2
342#define OMAP54XX_DSS_MEM_STATEST_MASK (0x3 << 4)
343
344/* Used by PRM_DEVICE_OFF_CTRL */
345#define OMAP54XX_EMIF1_OFFWKUP_DISABLE_SHIFT 8
346#define OMAP54XX_EMIF1_OFFWKUP_DISABLE_WIDTH 0x1
347#define OMAP54XX_EMIF1_OFFWKUP_DISABLE_MASK (1 << 8)
348
349/* Used by PRM_DEVICE_OFF_CTRL */
350#define OMAP54XX_EMIF2_OFFWKUP_DISABLE_SHIFT 9
351#define OMAP54XX_EMIF2_OFFWKUP_DISABLE_WIDTH 0x1
352#define OMAP54XX_EMIF2_OFFWKUP_DISABLE_MASK (1 << 9)
353
354/* Used by PM_EMU_PWRSTCTRL */
355#define OMAP54XX_EMU_BANK_ONSTATE_SHIFT 16
356#define OMAP54XX_EMU_BANK_ONSTATE_WIDTH 0x2
357#define OMAP54XX_EMU_BANK_ONSTATE_MASK (0x3 << 16)
358
359/* Used by PM_EMU_PWRSTST */
360#define OMAP54XX_EMU_BANK_STATEST_SHIFT 4
361#define OMAP54XX_EMU_BANK_STATEST_WIDTH 0x2
362#define OMAP54XX_EMU_BANK_STATEST_MASK (0x3 << 4)
363
364/*
365 * Used by PRM_SLDO_CORE_SETUP, PRM_SLDO_MM_SETUP, PRM_SLDO_MPU_SETUP,
366 * PRM_SRAM_WKUP_SETUP
367 */
368#define OMAP54XX_ENABLE_RTA_SHIFT 0
369#define OMAP54XX_ENABLE_RTA_WIDTH 0x1
370#define OMAP54XX_ENABLE_RTA_MASK (1 << 0)
371
372/* Used by PRM_SLDO_CORE_SETUP, PRM_SLDO_MM_SETUP, PRM_SLDO_MPU_SETUP */
373#define OMAP54XX_ENFUNC1_SHIFT 3
374#define OMAP54XX_ENFUNC1_WIDTH 0x1
375#define OMAP54XX_ENFUNC1_MASK (1 << 3)
376
377/* Used by PRM_SLDO_CORE_SETUP, PRM_SLDO_MM_SETUP, PRM_SLDO_MPU_SETUP */
378#define OMAP54XX_ENFUNC2_SHIFT 4
379#define OMAP54XX_ENFUNC2_WIDTH 0x1
380#define OMAP54XX_ENFUNC2_MASK (1 << 4)
381
382/* Used by PRM_SLDO_CORE_SETUP, PRM_SLDO_MM_SETUP, PRM_SLDO_MPU_SETUP */
383#define OMAP54XX_ENFUNC3_SHIFT 5
384#define OMAP54XX_ENFUNC3_WIDTH 0x1
385#define OMAP54XX_ENFUNC3_MASK (1 << 5)
386
387/* Used by PRM_SLDO_CORE_SETUP, PRM_SLDO_MM_SETUP, PRM_SLDO_MPU_SETUP */
388#define OMAP54XX_ENFUNC4_SHIFT 6
389#define OMAP54XX_ENFUNC4_WIDTH 0x1
390#define OMAP54XX_ENFUNC4_MASK (1 << 6)
391
392/* Used by PRM_SLDO_CORE_SETUP, PRM_SLDO_MM_SETUP, PRM_SLDO_MPU_SETUP */
393#define OMAP54XX_ENFUNC5_SHIFT 7
394#define OMAP54XX_ENFUNC5_WIDTH 0x1
395#define OMAP54XX_ENFUNC5_MASK (1 << 7)
396
397/* Used by PRM_VP_CORE_CONFIG, PRM_VP_MM_CONFIG, PRM_VP_MPU_CONFIG */
398#define OMAP54XX_ERRORGAIN_SHIFT 16
399#define OMAP54XX_ERRORGAIN_WIDTH 0x8
400#define OMAP54XX_ERRORGAIN_MASK (0xff << 16)
401
402/* Used by PRM_VP_CORE_CONFIG, PRM_VP_MM_CONFIG, PRM_VP_MPU_CONFIG */
403#define OMAP54XX_ERROROFFSET_SHIFT 24
404#define OMAP54XX_ERROROFFSET_WIDTH 0x8
405#define OMAP54XX_ERROROFFSET_MASK (0xff << 24)
406
407/* Used by PRM_RSTST */
408#define OMAP54XX_EXTERNAL_WARM_RST_SHIFT 5
409#define OMAP54XX_EXTERNAL_WARM_RST_WIDTH 0x1
410#define OMAP54XX_EXTERNAL_WARM_RST_MASK (1 << 5)
411
412/* Used by PRM_VP_CORE_CONFIG, PRM_VP_MM_CONFIG, PRM_VP_MPU_CONFIG */
413#define OMAP54XX_FORCEUPDATE_SHIFT 1
414#define OMAP54XX_FORCEUPDATE_WIDTH 0x1
415#define OMAP54XX_FORCEUPDATE_MASK (1 << 1)
416
417/* Used by PRM_VP_CORE_VOLTAGE, PRM_VP_MM_VOLTAGE, PRM_VP_MPU_VOLTAGE */
418#define OMAP54XX_FORCEUPDATEWAIT_SHIFT 8
419#define OMAP54XX_FORCEUPDATEWAIT_WIDTH 0x18
420#define OMAP54XX_FORCEUPDATEWAIT_MASK (0xffffff << 8)
421
422/* Used by PRM_IRQENABLE_DSP, PRM_IRQENABLE_IPU */
423#define OMAP54XX_FORCEWKUP_EN_SHIFT 10
424#define OMAP54XX_FORCEWKUP_EN_WIDTH 0x1
425#define OMAP54XX_FORCEWKUP_EN_MASK (1 << 10)
426
427/* Used by PRM_IRQSTATUS_DSP, PRM_IRQSTATUS_IPU */
428#define OMAP54XX_FORCEWKUP_ST_SHIFT 10
429#define OMAP54XX_FORCEWKUP_ST_WIDTH 0x1
430#define OMAP54XX_FORCEWKUP_ST_MASK (1 << 10)
431
432/* Used by REVISION_PRM */
433#define OMAP54XX_FUNC_SHIFT 16
434#define OMAP54XX_FUNC_WIDTH 0xc
435#define OMAP54XX_FUNC_MASK (0xfff << 16)
436
437/* Used by PRM_RSTST */
438#define OMAP54XX_GLOBAL_COLD_RST_SHIFT 0
439#define OMAP54XX_GLOBAL_COLD_RST_WIDTH 0x1
440#define OMAP54XX_GLOBAL_COLD_RST_MASK (1 << 0)
441
442/* Used by PRM_RSTST */
443#define OMAP54XX_GLOBAL_WARM_SW_RST_SHIFT 1
444#define OMAP54XX_GLOBAL_WARM_SW_RST_WIDTH 0x1
445#define OMAP54XX_GLOBAL_WARM_SW_RST_MASK (1 << 1)
446
447/* Used by PRM_IO_PMCTRL */
448#define OMAP54XX_GLOBAL_WUEN_SHIFT 16
449#define OMAP54XX_GLOBAL_WUEN_WIDTH 0x1
450#define OMAP54XX_GLOBAL_WUEN_MASK (1 << 16)
451
452/* Used by PM_GPU_PWRSTCTRL */
453#define OMAP54XX_GPU_MEM_ONSTATE_SHIFT 16
454#define OMAP54XX_GPU_MEM_ONSTATE_WIDTH 0x2
455#define OMAP54XX_GPU_MEM_ONSTATE_MASK (0x3 << 16)
456
457/* Used by PM_GPU_PWRSTST */
458#define OMAP54XX_GPU_MEM_STATEST_SHIFT 4
459#define OMAP54XX_GPU_MEM_STATEST_WIDTH 0x2
460#define OMAP54XX_GPU_MEM_STATEST_MASK (0x3 << 4)
461
462/* Used by PRM_VC_CFG_I2C_MODE */
463#define OMAP54XX_HSMCODE_SHIFT 0
464#define OMAP54XX_HSMCODE_WIDTH 0x3
465#define OMAP54XX_HSMCODE_MASK (0x7 << 0)
466
467/* Used by PRM_VC_CFG_I2C_MODE */
468#define OMAP54XX_HSMODEEN_SHIFT 3
469#define OMAP54XX_HSMODEEN_WIDTH 0x1
470#define OMAP54XX_HSMODEEN_MASK (1 << 3)
471
472/* Used by PRM_VC_CFG_I2C_CLK */
473#define OMAP54XX_HSSCLH_SHIFT 16
474#define OMAP54XX_HSSCLH_WIDTH 0x8
475#define OMAP54XX_HSSCLH_MASK (0xff << 16)
476
477/* Used by PRM_VC_CFG_I2C_CLK */
478#define OMAP54XX_HSSCLL_SHIFT 24
479#define OMAP54XX_HSSCLL_WIDTH 0x8
480#define OMAP54XX_HSSCLL_MASK (0xff << 24)
481
482/* Used by PM_IVA_PWRSTCTRL */
483#define OMAP54XX_HWA_MEM_ONSTATE_SHIFT 16
484#define OMAP54XX_HWA_MEM_ONSTATE_WIDTH 0x2
485#define OMAP54XX_HWA_MEM_ONSTATE_MASK (0x3 << 16)
486
487/* Used by PM_IVA_PWRSTCTRL */
488#define OMAP54XX_HWA_MEM_RETSTATE_SHIFT 8
489#define OMAP54XX_HWA_MEM_RETSTATE_WIDTH 0x1
490#define OMAP54XX_HWA_MEM_RETSTATE_MASK (1 << 8)
491
492/* Used by PM_IVA_PWRSTST */
493#define OMAP54XX_HWA_MEM_STATEST_SHIFT 4
494#define OMAP54XX_HWA_MEM_STATEST_WIDTH 0x2
495#define OMAP54XX_HWA_MEM_STATEST_MASK (0x3 << 4)
496
497/* Used by PRM_RSTST */
498#define OMAP54XX_ICEPICK_RST_SHIFT 9
499#define OMAP54XX_ICEPICK_RST_WIDTH 0x1
500#define OMAP54XX_ICEPICK_RST_MASK (1 << 9)
501
502/* Used by PRM_VP_CORE_CONFIG, PRM_VP_MM_CONFIG, PRM_VP_MPU_CONFIG */
503#define OMAP54XX_INITVDD_SHIFT 2
504#define OMAP54XX_INITVDD_WIDTH 0x1
505#define OMAP54XX_INITVDD_MASK (1 << 2)
506
507/* Used by PRM_VP_CORE_CONFIG, PRM_VP_MM_CONFIG, PRM_VP_MPU_CONFIG */
508#define OMAP54XX_INITVOLTAGE_SHIFT 8
509#define OMAP54XX_INITVOLTAGE_WIDTH 0x8
510#define OMAP54XX_INITVOLTAGE_MASK (0xff << 8)
511
512/*
513 * Used by PM_ABE_PWRSTST, PM_CAM_PWRSTST, PM_CORE_PWRSTST,
514 * PM_CUSTEFUSE_PWRSTST, PM_DSP_PWRSTST, PM_DSS_PWRSTST, PM_EMU_PWRSTST,
515 * PM_GPU_PWRSTST, PM_IVA_PWRSTST, PM_L3INIT_PWRSTST, PM_MPU_PWRSTST,
516 * PRM_VOLTST_MM, PRM_VOLTST_MPU
517 */
518#define OMAP54XX_INTRANSITION_SHIFT 20
519#define OMAP54XX_INTRANSITION_WIDTH 0x1
520#define OMAP54XX_INTRANSITION_MASK (1 << 20)
521
522/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
523#define OMAP54XX_IO_EN_SHIFT 9
524#define OMAP54XX_IO_EN_WIDTH 0x1
525#define OMAP54XX_IO_EN_MASK (1 << 9)
526
527/* Used by PRM_IO_PMCTRL */
528#define OMAP54XX_IO_ON_STATUS_SHIFT 5
529#define OMAP54XX_IO_ON_STATUS_WIDTH 0x1
530#define OMAP54XX_IO_ON_STATUS_MASK (1 << 5)
531
532/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
533#define OMAP54XX_IO_ST_SHIFT 9
534#define OMAP54XX_IO_ST_WIDTH 0x1
535#define OMAP54XX_IO_ST_MASK (1 << 9)
536
537/* Used by PM_CORE_PWRSTCTRL */
538#define OMAP54XX_IPU_L2RAM_ONSTATE_SHIFT 20
539#define OMAP54XX_IPU_L2RAM_ONSTATE_WIDTH 0x2
540#define OMAP54XX_IPU_L2RAM_ONSTATE_MASK (0x3 << 20)
541
542/* Used by PM_CORE_PWRSTCTRL */
543#define OMAP54XX_IPU_L2RAM_RETSTATE_SHIFT 10
544#define OMAP54XX_IPU_L2RAM_RETSTATE_WIDTH 0x1
545#define OMAP54XX_IPU_L2RAM_RETSTATE_MASK (1 << 10)
546
547/* Used by PM_CORE_PWRSTST */
548#define OMAP54XX_IPU_L2RAM_STATEST_SHIFT 8
549#define OMAP54XX_IPU_L2RAM_STATEST_WIDTH 0x2
550#define OMAP54XX_IPU_L2RAM_STATEST_MASK (0x3 << 8)
551
552/* Used by PM_CORE_PWRSTCTRL */
553#define OMAP54XX_IPU_UNICACHE_ONSTATE_SHIFT 22
554#define OMAP54XX_IPU_UNICACHE_ONSTATE_WIDTH 0x2
555#define OMAP54XX_IPU_UNICACHE_ONSTATE_MASK (0x3 << 22)
556
557/* Used by PM_CORE_PWRSTCTRL */
558#define OMAP54XX_IPU_UNICACHE_RETSTATE_SHIFT 11
559#define OMAP54XX_IPU_UNICACHE_RETSTATE_WIDTH 0x1
560#define OMAP54XX_IPU_UNICACHE_RETSTATE_MASK (1 << 11)
561
562/* Used by PM_CORE_PWRSTST */
563#define OMAP54XX_IPU_UNICACHE_STATEST_SHIFT 10
564#define OMAP54XX_IPU_UNICACHE_STATEST_WIDTH 0x2
565#define OMAP54XX_IPU_UNICACHE_STATEST_MASK (0x3 << 10)
566
567/* Used by PRM_IO_PMCTRL */
568#define OMAP54XX_ISOCLK_OVERRIDE_SHIFT 0
569#define OMAP54XX_ISOCLK_OVERRIDE_WIDTH 0x1
570#define OMAP54XX_ISOCLK_OVERRIDE_MASK (1 << 0)
571
572/* Used by PRM_IO_PMCTRL */
573#define OMAP54XX_ISOCLK_STATUS_SHIFT 1
574#define OMAP54XX_ISOCLK_STATUS_WIDTH 0x1
575#define OMAP54XX_ISOCLK_STATUS_MASK (1 << 1)
576
577/* Used by PRM_IO_PMCTRL */
578#define OMAP54XX_ISOOVR_EXTEND_SHIFT 4
579#define OMAP54XX_ISOOVR_EXTEND_WIDTH 0x1
580#define OMAP54XX_ISOOVR_EXTEND_MASK (1 << 4)
581
582/* Used by PRM_IO_COUNT */
583#define OMAP54XX_ISO_2_ON_TIME_SHIFT 0
584#define OMAP54XX_ISO_2_ON_TIME_WIDTH 0x8
585#define OMAP54XX_ISO_2_ON_TIME_MASK (0xff << 0)
586
587/* Used by PM_L3INIT_PWRSTCTRL */
588#define OMAP54XX_L3INIT_BANK1_ONSTATE_SHIFT 16
589#define OMAP54XX_L3INIT_BANK1_ONSTATE_WIDTH 0x2
590#define OMAP54XX_L3INIT_BANK1_ONSTATE_MASK (0x3 << 16)
591
592/* Used by PM_L3INIT_PWRSTCTRL */
593#define OMAP54XX_L3INIT_BANK1_RETSTATE_SHIFT 8
594#define OMAP54XX_L3INIT_BANK1_RETSTATE_WIDTH 0x1
595#define OMAP54XX_L3INIT_BANK1_RETSTATE_MASK (1 << 8)
596
597/* Used by PM_L3INIT_PWRSTST */
598#define OMAP54XX_L3INIT_BANK1_STATEST_SHIFT 4
599#define OMAP54XX_L3INIT_BANK1_STATEST_WIDTH 0x2
600#define OMAP54XX_L3INIT_BANK1_STATEST_MASK (0x3 << 4)
601
602/* Used by PM_L3INIT_PWRSTCTRL */
603#define OMAP54XX_L3INIT_BANK2_ONSTATE_SHIFT 18
604#define OMAP54XX_L3INIT_BANK2_ONSTATE_WIDTH 0x2
605#define OMAP54XX_L3INIT_BANK2_ONSTATE_MASK (0x3 << 18)
606
607/* Used by PM_L3INIT_PWRSTCTRL */
608#define OMAP54XX_L3INIT_BANK2_RETSTATE_SHIFT 9
609#define OMAP54XX_L3INIT_BANK2_RETSTATE_WIDTH 0x1
610#define OMAP54XX_L3INIT_BANK2_RETSTATE_MASK (1 << 9)
611
612/* Used by PM_L3INIT_PWRSTST */
613#define OMAP54XX_L3INIT_BANK2_STATEST_SHIFT 6
614#define OMAP54XX_L3INIT_BANK2_STATEST_WIDTH 0x2
615#define OMAP54XX_L3INIT_BANK2_STATEST_MASK (0x3 << 6)
616
617/*
618 * Used by PM_ABE_PWRSTST, PM_CAM_PWRSTST, PM_CORE_PWRSTST,
619 * PM_CUSTEFUSE_PWRSTST, PM_DSP_PWRSTST, PM_DSS_PWRSTST, PM_EMU_PWRSTST,
620 * PM_GPU_PWRSTST, PM_IVA_PWRSTST, PM_L3INIT_PWRSTST, PM_MPU_PWRSTST
621 */
622#define OMAP54XX_LASTPOWERSTATEENTERED_SHIFT 24
623#define OMAP54XX_LASTPOWERSTATEENTERED_WIDTH 0x2
624#define OMAP54XX_LASTPOWERSTATEENTERED_MASK (0x3 << 24)
625
626/* Used by PRM_RSTST */
627#define OMAP54XX_LLI_RST_SHIFT 14
628#define OMAP54XX_LLI_RST_WIDTH 0x1
629#define OMAP54XX_LLI_RST_MASK (1 << 14)
630
631/*
632 * Used by PM_ABE_PWRSTCTRL, PM_CORE_PWRSTCTRL, PM_DSP_PWRSTCTRL,
633 * PM_DSS_PWRSTCTRL, PM_IVA_PWRSTCTRL, PM_L3INIT_PWRSTCTRL, PM_MPU_PWRSTCTRL
634 */
635#define OMAP54XX_LOGICRETSTATE_SHIFT 2
636#define OMAP54XX_LOGICRETSTATE_WIDTH 0x1
637#define OMAP54XX_LOGICRETSTATE_MASK (1 << 2)
638
639/*
640 * Used by PM_ABE_PWRSTST, PM_CAM_PWRSTST, PM_CORE_PWRSTST,
641 * PM_CUSTEFUSE_PWRSTST, PM_DSP_PWRSTST, PM_DSS_PWRSTST, PM_EMU_PWRSTST,
642 * PM_GPU_PWRSTST, PM_IVA_PWRSTST, PM_L3INIT_PWRSTST, PM_MPU_PWRSTST
643 */
644#define OMAP54XX_LOGICSTATEST_SHIFT 2
645#define OMAP54XX_LOGICSTATEST_WIDTH 0x1
646#define OMAP54XX_LOGICSTATEST_MASK (1 << 2)
647
648/*
649 * Used by RM_ABE_AESS_CONTEXT, RM_ABE_DMIC_CONTEXT, RM_ABE_MCASP_CONTEXT,
650 * RM_ABE_MCBSP1_CONTEXT, RM_ABE_MCBSP2_CONTEXT, RM_ABE_MCBSP3_CONTEXT,
651 * RM_ABE_MCPDM_CONTEXT, RM_ABE_SLIMBUS1_CONTEXT, RM_ABE_TIMER5_CONTEXT,
652 * RM_ABE_TIMER6_CONTEXT, RM_ABE_TIMER7_CONTEXT, RM_ABE_TIMER8_CONTEXT,
653 * RM_ABE_WD_TIMER3_CONTEXT, RM_C2C_C2C_CONTEXT, RM_C2C_C2C_OCP_FW_CONTEXT,
654 * RM_CAM_CAL_CONTEXT, RM_CAM_FDIF_CONTEXT, RM_CAM_ISS_CONTEXT,
655 * RM_COREAON_SMARTREFLEX_CORE_CONTEXT, RM_COREAON_SMARTREFLEX_MM_CONTEXT,
656 * RM_COREAON_SMARTREFLEX_MPU_CONTEXT, RM_CUSTEFUSE_EFUSE_CTRL_CUST_CONTEXT,
657 * RM_DSP_DSP_CONTEXT, RM_DSS_BB2D_CONTEXT, RM_DSS_DSS_CONTEXT,
658 * RM_EMIF_DMM_CONTEXT, RM_EMIF_EMIF1_CONTEXT, RM_EMIF_EMIF2_CONTEXT,
659 * RM_EMIF_EMIF_DLL_CONTEXT, RM_EMIF_EMIF_OCP_FW_CONTEXT,
660 * RM_EMU_DEBUGSS_CONTEXT, RM_GPU_GPU_CONTEXT, RM_IPU_IPU_CONTEXT,
661 * RM_IVA_IVA_CONTEXT, RM_IVA_SL2_CONTEXT, RM_L3INIT_IEEE1500_2_OCP_CONTEXT,
662 * RM_L3INIT_OCP2SCP1_CONTEXT, RM_L3INIT_OCP2SCP3_CONTEXT,
663 * RM_L3INIT_SATA_CONTEXT, RM_L3INIT_UNIPRO2_CONTEXT,
664 * RM_L3INSTR_L3_INSTR_CONTEXT, RM_L3INSTR_L3_MAIN_3_CONTEXT,
665 * RM_L3INSTR_OCP_WP_NOC_CONTEXT, RM_L3MAIN1_L3_MAIN_1_CONTEXT,
666 * RM_L3MAIN2_L3_MAIN_2_CONTEXT, RM_L3MAIN2_OCMC_RAM_CONTEXT,
667 * RM_L4CFG_L4_CFG_CONTEXT, RM_L4CFG_OCP2SCP2_CONTEXT,
668 * RM_L4CFG_SAR_ROM_CONTEXT, RM_L4PER_ELM_CONTEXT, RM_L4PER_HDQ1W_CONTEXT,
669 * RM_L4PER_I2C2_CONTEXT, RM_L4PER_I2C3_CONTEXT, RM_L4PER_I2C4_CONTEXT,
670 * RM_L4PER_I2C5_CONTEXT, RM_L4PER_L4_PER_CONTEXT, RM_L4PER_MCSPI1_CONTEXT,
671 * RM_L4PER_MCSPI2_CONTEXT, RM_L4PER_MCSPI3_CONTEXT, RM_L4PER_MCSPI4_CONTEXT,
672 * RM_L4PER_MMC3_CONTEXT, RM_L4PER_MMC4_CONTEXT, RM_L4PER_MMC5_CONTEXT,
673 * RM_L4PER_TIMER10_CONTEXT, RM_L4PER_TIMER11_CONTEXT, RM_L4PER_TIMER2_CONTEXT,
674 * RM_L4PER_TIMER3_CONTEXT, RM_L4PER_TIMER4_CONTEXT, RM_L4PER_TIMER9_CONTEXT,
675 * RM_L4SEC_FPKA_CONTEXT, RM_MIPIEXT_LLI_CONTEXT,
676 * RM_MIPIEXT_LLI_OCP_FW_CONTEXT, RM_MIPIEXT_MPHY_CONTEXT, RM_MPU_MPU_CONTEXT,
677 * RM_WKUPAON_COUNTER_32K_CONTEXT, RM_WKUPAON_GPIO1_CONTEXT,
678 * RM_WKUPAON_KBD_CONTEXT, RM_WKUPAON_L4_WKUP_CONTEXT,
679 * RM_WKUPAON_SAR_RAM_CONTEXT, RM_WKUPAON_TIMER12_CONTEXT,
680 * RM_WKUPAON_TIMER1_CONTEXT, RM_WKUPAON_WD_TIMER1_CONTEXT,
681 * RM_WKUPAON_WD_TIMER2_CONTEXT
682 */
683#define OMAP54XX_LOSTCONTEXT_DFF_SHIFT 0
684#define OMAP54XX_LOSTCONTEXT_DFF_WIDTH 0x1
685#define OMAP54XX_LOSTCONTEXT_DFF_MASK (1 << 0)
686
687/*
688 * Used by RM_C2C_C2C_CONTEXT, RM_C2C_C2C_OCP_FW_CONTEXT,
689 * RM_C2C_MODEM_ICR_CONTEXT, RM_DMA_DMA_SYSTEM_CONTEXT, RM_DSP_DSP_CONTEXT,
690 * RM_DSS_DSS_CONTEXT, RM_EMIF_DMM_CONTEXT, RM_EMIF_EMIF1_CONTEXT,
691 * RM_EMIF_EMIF2_CONTEXT, RM_EMIF_EMIF_OCP_FW_CONTEXT, RM_IPU_IPU_CONTEXT,
692 * RM_L3INIT_HSI_CONTEXT, RM_L3INIT_MMC1_CONTEXT, RM_L3INIT_MMC2_CONTEXT,
693 * RM_L3INIT_USB_HOST_HS_CONTEXT, RM_L3INIT_USB_OTG_SS_CONTEXT,
694 * RM_L3INIT_USB_TLL_HS_CONTEXT, RM_L3INSTR_L3_MAIN_3_CONTEXT,
695 * RM_L3INSTR_OCP_WP_NOC_CONTEXT, RM_L3MAIN1_L3_MAIN_1_CONTEXT,
696 * RM_L3MAIN2_GPMC_CONTEXT, RM_L3MAIN2_L3_MAIN_2_CONTEXT,
697 * RM_L4CFG_L4_CFG_CONTEXT, RM_L4CFG_MAILBOX_CONTEXT,
698 * RM_L4CFG_SPINLOCK_CONTEXT, RM_L4PER_GPIO2_CONTEXT, RM_L4PER_GPIO3_CONTEXT,
699 * RM_L4PER_GPIO4_CONTEXT, RM_L4PER_GPIO5_CONTEXT, RM_L4PER_GPIO6_CONTEXT,
700 * RM_L4PER_GPIO7_CONTEXT, RM_L4PER_GPIO8_CONTEXT, RM_L4PER_I2C1_CONTEXT,
701 * RM_L4PER_L4_PER_CONTEXT, RM_L4PER_UART1_CONTEXT, RM_L4PER_UART2_CONTEXT,
702 * RM_L4PER_UART3_CONTEXT, RM_L4PER_UART4_CONTEXT, RM_L4PER_UART5_CONTEXT,
703 * RM_L4PER_UART6_CONTEXT, RM_L4SEC_AES1_CONTEXT, RM_L4SEC_AES2_CONTEXT,
704 * RM_L4SEC_DES3DES_CONTEXT, RM_L4SEC_DMA_CRYPTO_CONTEXT, RM_L4SEC_RNG_CONTEXT,
705 * RM_L4SEC_SHA2MD5_CONTEXT, RM_MIPIEXT_LLI_CONTEXT,
706 * RM_MIPIEXT_LLI_OCP_FW_CONTEXT, RM_MIPIEXT_MPHY_CONTEXT, RM_MPU_MPU_CONTEXT
707 */
708#define OMAP54XX_LOSTCONTEXT_RFF_SHIFT 1
709#define OMAP54XX_LOSTCONTEXT_RFF_WIDTH 0x1
710#define OMAP54XX_LOSTCONTEXT_RFF_MASK (1 << 1)
711
712/* Used by RM_ABE_AESS_CONTEXT */
713#define OMAP54XX_LOSTMEM_AESSMEM_SHIFT 8
714#define OMAP54XX_LOSTMEM_AESSMEM_WIDTH 0x1
715#define OMAP54XX_LOSTMEM_AESSMEM_MASK (1 << 8)
716
717/* Used by RM_CAM_CAL_CONTEXT */
718#define OMAP54XX_LOSTMEM_CAL_MEM_SHIFT 8
719#define OMAP54XX_LOSTMEM_CAL_MEM_WIDTH 0x1
720#define OMAP54XX_LOSTMEM_CAL_MEM_MASK (1 << 8)
721
722/* Used by RM_CAM_FDIF_CONTEXT, RM_CAM_ISS_CONTEXT */
723#define OMAP54XX_LOSTMEM_CAM_MEM_SHIFT 8
724#define OMAP54XX_LOSTMEM_CAM_MEM_WIDTH 0x1
725#define OMAP54XX_LOSTMEM_CAM_MEM_MASK (1 << 8)
726
727/* Used by RM_EMIF_DMM_CONTEXT */
728#define OMAP54XX_LOSTMEM_CORE_NRET_BANK_SHIFT 9
729#define OMAP54XX_LOSTMEM_CORE_NRET_BANK_WIDTH 0x1
730#define OMAP54XX_LOSTMEM_CORE_NRET_BANK_MASK (1 << 9)
731
732/* Renamed from LOSTMEM_CORE_NRET_BANK Used by RM_L3INSTR_OCP_WP_NOC_CONTEXT */
733#define OMAP54XX_LOSTMEM_CORE_NRET_BANK_8_8_SHIFT 8
734#define OMAP54XX_LOSTMEM_CORE_NRET_BANK_8_8_WIDTH 0x1
735#define OMAP54XX_LOSTMEM_CORE_NRET_BANK_8_8_MASK (1 << 8)
736
737/* Used by RM_L3MAIN2_OCMC_RAM_CONTEXT */
738#define OMAP54XX_LOSTMEM_CORE_OCMRAM_SHIFT 8
739#define OMAP54XX_LOSTMEM_CORE_OCMRAM_WIDTH 0x1
740#define OMAP54XX_LOSTMEM_CORE_OCMRAM_MASK (1 << 8)
741
742/* Used by RM_DMA_DMA_SYSTEM_CONTEXT, RM_EMIF_DMM_CONTEXT */
743#define OMAP54XX_LOSTMEM_CORE_OTHER_BANK_SHIFT 8
744#define OMAP54XX_LOSTMEM_CORE_OTHER_BANK_WIDTH 0x1
745#define OMAP54XX_LOSTMEM_CORE_OTHER_BANK_MASK (1 << 8)
746
747/* Used by RM_DSP_DSP_CONTEXT */
748#define OMAP54XX_LOSTMEM_DSP_EDMA_SHIFT 10
749#define OMAP54XX_LOSTMEM_DSP_EDMA_WIDTH 0x1
750#define OMAP54XX_LOSTMEM_DSP_EDMA_MASK (1 << 10)
751
752/* Used by RM_DSP_DSP_CONTEXT */
753#define OMAP54XX_LOSTMEM_DSP_L1_SHIFT 8
754#define OMAP54XX_LOSTMEM_DSP_L1_WIDTH 0x1
755#define OMAP54XX_LOSTMEM_DSP_L1_MASK (1 << 8)
756
757/* Used by RM_DSP_DSP_CONTEXT */
758#define OMAP54XX_LOSTMEM_DSP_L2_SHIFT 9
759#define OMAP54XX_LOSTMEM_DSP_L2_WIDTH 0x1
760#define OMAP54XX_LOSTMEM_DSP_L2_MASK (1 << 9)
761
762/* Used by RM_DSS_BB2D_CONTEXT, RM_DSS_DSS_CONTEXT */
763#define OMAP54XX_LOSTMEM_DSS_MEM_SHIFT 8
764#define OMAP54XX_LOSTMEM_DSS_MEM_WIDTH 0x1
765#define OMAP54XX_LOSTMEM_DSS_MEM_MASK (1 << 8)
766
767/* Used by RM_EMU_DEBUGSS_CONTEXT */
768#define OMAP54XX_LOSTMEM_EMU_BANK_SHIFT 8
769#define OMAP54XX_LOSTMEM_EMU_BANK_WIDTH 0x1
770#define OMAP54XX_LOSTMEM_EMU_BANK_MASK (1 << 8)
771
772/* Used by RM_GPU_GPU_CONTEXT */
773#define OMAP54XX_LOSTMEM_GPU_MEM_SHIFT 8
774#define OMAP54XX_LOSTMEM_GPU_MEM_WIDTH 0x1
775#define OMAP54XX_LOSTMEM_GPU_MEM_MASK (1 << 8)
776
777/* Used by RM_IVA_IVA_CONTEXT */
778#define OMAP54XX_LOSTMEM_HWA_MEM_SHIFT 10
779#define OMAP54XX_LOSTMEM_HWA_MEM_WIDTH 0x1
780#define OMAP54XX_LOSTMEM_HWA_MEM_MASK (1 << 10)
781
782/* Used by RM_IPU_IPU_CONTEXT */
783#define OMAP54XX_LOSTMEM_IPU_L2RAM_SHIFT 9
784#define OMAP54XX_LOSTMEM_IPU_L2RAM_WIDTH 0x1
785#define OMAP54XX_LOSTMEM_IPU_L2RAM_MASK (1 << 9)
786
787/* Used by RM_IPU_IPU_CONTEXT */
788#define OMAP54XX_LOSTMEM_IPU_UNICACHE_SHIFT 8
789#define OMAP54XX_LOSTMEM_IPU_UNICACHE_WIDTH 0x1
790#define OMAP54XX_LOSTMEM_IPU_UNICACHE_MASK (1 << 8)
791
792/*
793 * Used by RM_L3INIT_HSI_CONTEXT, RM_L3INIT_MMC1_CONTEXT,
794 * RM_L3INIT_MMC2_CONTEXT, RM_L3INIT_SATA_CONTEXT, RM_L3INIT_UNIPRO2_CONTEXT,
795 * RM_L3INIT_USB_OTG_SS_CONTEXT
796 */
797#define OMAP54XX_LOSTMEM_L3INIT_BANK1_SHIFT 8
798#define OMAP54XX_LOSTMEM_L3INIT_BANK1_WIDTH 0x1
799#define OMAP54XX_LOSTMEM_L3INIT_BANK1_MASK (1 << 8)
800
801/* Used by RM_MPU_MPU_CONTEXT */
802#define OMAP54XX_LOSTMEM_MPU_L2_SHIFT 9
803#define OMAP54XX_LOSTMEM_MPU_L2_WIDTH 0x1
804#define OMAP54XX_LOSTMEM_MPU_L2_MASK (1 << 9)
805
806/* Used by RM_MPU_MPU_CONTEXT */
807#define OMAP54XX_LOSTMEM_MPU_RAM_SHIFT 10
808#define OMAP54XX_LOSTMEM_MPU_RAM_WIDTH 0x1
809#define OMAP54XX_LOSTMEM_MPU_RAM_MASK (1 << 10)
810
811/*
812 * Used by RM_L4PER_MMC3_CONTEXT, RM_L4PER_MMC4_CONTEXT, RM_L4PER_MMC5_CONTEXT,
813 * RM_L4SEC_FPKA_CONTEXT
814 */
815#define OMAP54XX_LOSTMEM_NONRETAINED_BANK_SHIFT 8
816#define OMAP54XX_LOSTMEM_NONRETAINED_BANK_WIDTH 0x1
817#define OMAP54XX_LOSTMEM_NONRETAINED_BANK_MASK (1 << 8)
818
819/*
820 * Used by RM_ABE_DMIC_CONTEXT, RM_ABE_MCBSP1_CONTEXT, RM_ABE_MCBSP2_CONTEXT,
821 * RM_ABE_MCBSP3_CONTEXT, RM_ABE_MCPDM_CONTEXT, RM_ABE_SLIMBUS1_CONTEXT
822 */
823#define OMAP54XX_LOSTMEM_PERIHPMEM_SHIFT 8
824#define OMAP54XX_LOSTMEM_PERIHPMEM_WIDTH 0x1
825#define OMAP54XX_LOSTMEM_PERIHPMEM_MASK (1 << 8)
826
827/*
828 * Used by RM_L4PER_UART1_CONTEXT, RM_L4PER_UART2_CONTEXT,
829 * RM_L4PER_UART3_CONTEXT, RM_L4PER_UART4_CONTEXT, RM_L4PER_UART5_CONTEXT,
830 * RM_L4PER_UART6_CONTEXT, RM_L4SEC_DMA_CRYPTO_CONTEXT
831 */
832#define OMAP54XX_LOSTMEM_RETAINED_BANK_SHIFT 8
833#define OMAP54XX_LOSTMEM_RETAINED_BANK_WIDTH 0x1
834#define OMAP54XX_LOSTMEM_RETAINED_BANK_MASK (1 << 8)
835
836/* Used by RM_IVA_SL2_CONTEXT */
837#define OMAP54XX_LOSTMEM_SL2_MEM_SHIFT 8
838#define OMAP54XX_LOSTMEM_SL2_MEM_WIDTH 0x1
839#define OMAP54XX_LOSTMEM_SL2_MEM_MASK (1 << 8)
840
841/* Used by RM_IVA_IVA_CONTEXT */
842#define OMAP54XX_LOSTMEM_TCM1_MEM_SHIFT 8
843#define OMAP54XX_LOSTMEM_TCM1_MEM_WIDTH 0x1
844#define OMAP54XX_LOSTMEM_TCM1_MEM_MASK (1 << 8)
845
846/* Used by RM_IVA_IVA_CONTEXT */
847#define OMAP54XX_LOSTMEM_TCM2_MEM_SHIFT 9
848#define OMAP54XX_LOSTMEM_TCM2_MEM_WIDTH 0x1
849#define OMAP54XX_LOSTMEM_TCM2_MEM_MASK (1 << 9)
850
851/* Used by RM_WKUPAON_SAR_RAM_CONTEXT */
852#define OMAP54XX_LOSTMEM_WKUP_BANK_SHIFT 8
853#define OMAP54XX_LOSTMEM_WKUP_BANK_WIDTH 0x1
854#define OMAP54XX_LOSTMEM_WKUP_BANK_MASK (1 << 8)
855
856/*
857 * Used by PM_ABE_PWRSTCTRL, PM_CAM_PWRSTCTRL, PM_CORE_PWRSTCTRL,
858 * PM_CUSTEFUSE_PWRSTCTRL, PM_DSP_PWRSTCTRL, PM_DSS_PWRSTCTRL,
859 * PM_GPU_PWRSTCTRL, PM_IVA_PWRSTCTRL, PM_L3INIT_PWRSTCTRL, PM_MPU_PWRSTCTRL
860 */
861#define OMAP54XX_LOWPOWERSTATECHANGE_SHIFT 4
862#define OMAP54XX_LOWPOWERSTATECHANGE_WIDTH 0x1
863#define OMAP54XX_LOWPOWERSTATECHANGE_MASK (1 << 4)
864
865/* Used by PRM_DEBUG_TRANS_CFG */
866#define OMAP54XX_MODE_SHIFT 0
867#define OMAP54XX_MODE_WIDTH 0x2
868#define OMAP54XX_MODE_MASK (0x3 << 0)
869
870/* Used by PRM_MODEM_IF_CTRL */
871#define OMAP54XX_MODEM_SHUTDOWN_IRQ_SHIFT 9
872#define OMAP54XX_MODEM_SHUTDOWN_IRQ_WIDTH 0x1
873#define OMAP54XX_MODEM_SHUTDOWN_IRQ_MASK (1 << 9)
874
875/* Used by PRM_MODEM_IF_CTRL */
876#define OMAP54XX_MODEM_WAKE_IRQ_SHIFT 8
877#define OMAP54XX_MODEM_WAKE_IRQ_WIDTH 0x1
878#define OMAP54XX_MODEM_WAKE_IRQ_MASK (1 << 8)
879
880/* Used by PM_MPU_PWRSTCTRL */
881#define OMAP54XX_MPU_L2_ONSTATE_SHIFT 18
882#define OMAP54XX_MPU_L2_ONSTATE_WIDTH 0x2
883#define OMAP54XX_MPU_L2_ONSTATE_MASK (0x3 << 18)
884
885/* Used by PM_MPU_PWRSTCTRL */
886#define OMAP54XX_MPU_L2_RETSTATE_SHIFT 9
887#define OMAP54XX_MPU_L2_RETSTATE_WIDTH 0x1
888#define OMAP54XX_MPU_L2_RETSTATE_MASK (1 << 9)
889
890/* Used by PM_MPU_PWRSTST */
891#define OMAP54XX_MPU_L2_STATEST_SHIFT 6
892#define OMAP54XX_MPU_L2_STATEST_WIDTH 0x2
893#define OMAP54XX_MPU_L2_STATEST_MASK (0x3 << 6)
894
895/* Used by PM_MPU_PWRSTCTRL */
896#define OMAP54XX_MPU_RAM_ONSTATE_SHIFT 20
897#define OMAP54XX_MPU_RAM_ONSTATE_WIDTH 0x2
898#define OMAP54XX_MPU_RAM_ONSTATE_MASK (0x3 << 20)
899
900/* Used by PM_MPU_PWRSTCTRL */
901#define OMAP54XX_MPU_RAM_RETSTATE_SHIFT 10
902#define OMAP54XX_MPU_RAM_RETSTATE_WIDTH 0x1
903#define OMAP54XX_MPU_RAM_RETSTATE_MASK (1 << 10)
904
905/* Used by PM_MPU_PWRSTST */
906#define OMAP54XX_MPU_RAM_STATEST_SHIFT 8
907#define OMAP54XX_MPU_RAM_STATEST_WIDTH 0x2
908#define OMAP54XX_MPU_RAM_STATEST_MASK (0x3 << 8)
909
910/* Used by PRM_RSTST */
911#define OMAP54XX_MPU_SECURITY_VIOL_RST_SHIFT 2
912#define OMAP54XX_MPU_SECURITY_VIOL_RST_WIDTH 0x1
913#define OMAP54XX_MPU_SECURITY_VIOL_RST_MASK (1 << 2)
914
915/* Used by PRM_RSTST */
916#define OMAP54XX_MPU_WDT_RST_SHIFT 3
917#define OMAP54XX_MPU_WDT_RST_WIDTH 0x1
918#define OMAP54XX_MPU_WDT_RST_MASK (1 << 3)
919
920/* Used by PRM_ABBLDO_MM_SETUP, PRM_ABBLDO_MPU_SETUP */
921#define OMAP54XX_NOCAP_SHIFT 4
922#define OMAP54XX_NOCAP_WIDTH 0x1
923#define OMAP54XX_NOCAP_MASK (1 << 4)
924
925/* Used by PM_CORE_PWRSTCTRL */
926#define OMAP54XX_OCP_NRET_BANK_ONSTATE_SHIFT 24
927#define OMAP54XX_OCP_NRET_BANK_ONSTATE_WIDTH 0x2
928#define OMAP54XX_OCP_NRET_BANK_ONSTATE_MASK (0x3 << 24)
929
930/* Used by PM_CORE_PWRSTCTRL */
931#define OMAP54XX_OCP_NRET_BANK_RETSTATE_SHIFT 12
932#define OMAP54XX_OCP_NRET_BANK_RETSTATE_WIDTH 0x1
933#define OMAP54XX_OCP_NRET_BANK_RETSTATE_MASK (1 << 12)
934
935/* Used by PM_CORE_PWRSTST */
936#define OMAP54XX_OCP_NRET_BANK_STATEST_SHIFT 12
937#define OMAP54XX_OCP_NRET_BANK_STATEST_WIDTH 0x2
938#define OMAP54XX_OCP_NRET_BANK_STATEST_MASK (0x3 << 12)
939
940/*
941 * Used by PRM_VC_VAL_CMD_VDD_CORE_L, PRM_VC_VAL_CMD_VDD_MM_L,
942 * PRM_VC_VAL_CMD_VDD_MPU_L
943 */
944#define OMAP54XX_OFF_SHIFT 0
945#define OMAP54XX_OFF_WIDTH 0x8
946#define OMAP54XX_OFF_MASK (0xff << 0)
947
948/*
949 * Used by PRM_VC_VAL_CMD_VDD_CORE_L, PRM_VC_VAL_CMD_VDD_MM_L,
950 * PRM_VC_VAL_CMD_VDD_MPU_L
951 */
952#define OMAP54XX_ON_SHIFT 24
953#define OMAP54XX_ON_WIDTH 0x8
954#define OMAP54XX_ON_MASK (0xff << 24)
955
956/*
957 * Used by PRM_VC_VAL_CMD_VDD_CORE_L, PRM_VC_VAL_CMD_VDD_MM_L,
958 * PRM_VC_VAL_CMD_VDD_MPU_L
959 */
960#define OMAP54XX_ONLP_SHIFT 16
961#define OMAP54XX_ONLP_WIDTH 0x8
962#define OMAP54XX_ONLP_MASK (0xff << 16)
963
964/* Used by PRM_ABBLDO_MM_CTRL, PRM_ABBLDO_MPU_CTRL */
965#define OMAP54XX_OPP_CHANGE_SHIFT 2
966#define OMAP54XX_OPP_CHANGE_WIDTH 0x1
967#define OMAP54XX_OPP_CHANGE_MASK (1 << 2)
968
969/* Used by PRM_VC_VAL_BYPASS */
970#define OMAP54XX_OPP_CHANGE_EMIF_LVL_SHIFT 25
971#define OMAP54XX_OPP_CHANGE_EMIF_LVL_WIDTH 0x1
972#define OMAP54XX_OPP_CHANGE_EMIF_LVL_MASK (1 << 25)
973
974/* Used by PRM_ABBLDO_MM_CTRL, PRM_ABBLDO_MPU_CTRL */
975#define OMAP54XX_OPP_SEL_SHIFT 0
976#define OMAP54XX_OPP_SEL_WIDTH 0x2
977#define OMAP54XX_OPP_SEL_MASK (0x3 << 0)
978
979/* Used by PRM_DEBUG_OUT */
980#define OMAP54XX_OUTPUT_SHIFT 0
981#define OMAP54XX_OUTPUT_WIDTH 0x20
982#define OMAP54XX_OUTPUT_MASK (0xffffffff << 0)
983
984/* Used by PRM_SRAM_COUNT */
985#define OMAP54XX_PCHARGECNT_VALUE_SHIFT 0
986#define OMAP54XX_PCHARGECNT_VALUE_WIDTH 0x6
987#define OMAP54XX_PCHARGECNT_VALUE_MASK (0x3f << 0)
988
989/* Used by PRM_PSCON_COUNT */
990#define OMAP54XX_PCHARGE_TIME_SHIFT 0
991#define OMAP54XX_PCHARGE_TIME_WIDTH 0x8
992#define OMAP54XX_PCHARGE_TIME_MASK (0xff << 0)
993
994/* Used by PM_ABE_PWRSTCTRL */
995#define OMAP54XX_PERIPHMEM_ONSTATE_SHIFT 20
996#define OMAP54XX_PERIPHMEM_ONSTATE_WIDTH 0x2
997#define OMAP54XX_PERIPHMEM_ONSTATE_MASK (0x3 << 20)
998
999/* Used by PM_ABE_PWRSTCTRL */
1000#define OMAP54XX_PERIPHMEM_RETSTATE_SHIFT 10
1001#define OMAP54XX_PERIPHMEM_RETSTATE_WIDTH 0x1
1002#define OMAP54XX_PERIPHMEM_RETSTATE_MASK (1 << 10)
1003
1004/* Used by PM_ABE_PWRSTST */
1005#define OMAP54XX_PERIPHMEM_STATEST_SHIFT 8
1006#define OMAP54XX_PERIPHMEM_STATEST_WIDTH 0x2
1007#define OMAP54XX_PERIPHMEM_STATEST_MASK (0x3 << 8)
1008
1009/* Used by PRM_PHASE1_CNDP */
1010#define OMAP54XX_PHASE1_CNDP_SHIFT 0
1011#define OMAP54XX_PHASE1_CNDP_WIDTH 0x20
1012#define OMAP54XX_PHASE1_CNDP_MASK (0xffffffff << 0)
1013
1014/* Used by PRM_PHASE2A_CNDP */
1015#define OMAP54XX_PHASE2A_CNDP_SHIFT 0
1016#define OMAP54XX_PHASE2A_CNDP_WIDTH 0x20
1017#define OMAP54XX_PHASE2A_CNDP_MASK (0xffffffff << 0)
1018
1019/* Used by PRM_PHASE2B_CNDP */
1020#define OMAP54XX_PHASE2B_CNDP_SHIFT 0
1021#define OMAP54XX_PHASE2B_CNDP_WIDTH 0x20
1022#define OMAP54XX_PHASE2B_CNDP_MASK (0xffffffff << 0)
1023
1024/* Used by PRM_PSCON_COUNT */
1025#define OMAP54XX_PONOUT_2_PGOODIN_TIME_SHIFT 8
1026#define OMAP54XX_PONOUT_2_PGOODIN_TIME_WIDTH 0x8
1027#define OMAP54XX_PONOUT_2_PGOODIN_TIME_MASK (0xff << 8)
1028
1029/*
1030 * Used by PM_ABE_PWRSTCTRL, PM_CAM_PWRSTCTRL, PM_CORE_PWRSTCTRL,
1031 * PM_CUSTEFUSE_PWRSTCTRL, PM_DSP_PWRSTCTRL, PM_DSS_PWRSTCTRL,
1032 * PM_EMU_PWRSTCTRL, PM_GPU_PWRSTCTRL, PM_IVA_PWRSTCTRL, PM_L3INIT_PWRSTCTRL,
1033 * PM_MPU_PWRSTCTRL
1034 */
1035#define OMAP54XX_POWERSTATE_SHIFT 0
1036#define OMAP54XX_POWERSTATE_WIDTH 0x2
1037#define OMAP54XX_POWERSTATE_MASK (0x3 << 0)
1038
1039/*
1040 * Used by PM_ABE_PWRSTST, PM_CAM_PWRSTST, PM_CORE_PWRSTST,
1041 * PM_CUSTEFUSE_PWRSTST, PM_DSP_PWRSTST, PM_DSS_PWRSTST, PM_EMU_PWRSTST,
1042 * PM_GPU_PWRSTST, PM_IVA_PWRSTST, PM_L3INIT_PWRSTST, PM_MPU_PWRSTST
1043 */
1044#define OMAP54XX_POWERSTATEST_SHIFT 0
1045#define OMAP54XX_POWERSTATEST_WIDTH 0x2
1046#define OMAP54XX_POWERSTATEST_MASK (0x3 << 0)
1047
1048/* Used by PRM_PWRREQCTRL */
1049#define OMAP54XX_PWRREQ_COND_SHIFT 0
1050#define OMAP54XX_PWRREQ_COND_WIDTH 0x2
1051#define OMAP54XX_PWRREQ_COND_MASK (0x3 << 0)
1052
1053/* Used by PRM_VC_SMPS_CORE_CONFIG */
1054#define OMAP54XX_RACEN_VDD_CORE_L_SHIFT 27
1055#define OMAP54XX_RACEN_VDD_CORE_L_WIDTH 0x1
1056#define OMAP54XX_RACEN_VDD_CORE_L_MASK (1 << 27)
1057
1058/* Used by PRM_VC_SMPS_MM_CONFIG */
1059#define OMAP54XX_RACEN_VDD_MM_L_SHIFT 27
1060#define OMAP54XX_RACEN_VDD_MM_L_WIDTH 0x1
1061#define OMAP54XX_RACEN_VDD_MM_L_MASK (1 << 27)
1062
1063/* Used by PRM_VC_SMPS_MPU_CONFIG */
1064#define OMAP54XX_RACEN_VDD_MPU_L_SHIFT 27
1065#define OMAP54XX_RACEN_VDD_MPU_L_WIDTH 0x1
1066#define OMAP54XX_RACEN_VDD_MPU_L_MASK (1 << 27)
1067
1068/* Used by PRM_VC_SMPS_CORE_CONFIG */
1069#define OMAP54XX_RAC_VDD_CORE_L_SHIFT 26
1070#define OMAP54XX_RAC_VDD_CORE_L_WIDTH 0x1
1071#define OMAP54XX_RAC_VDD_CORE_L_MASK (1 << 26)
1072
1073/* Used by PRM_VC_SMPS_MM_CONFIG */
1074#define OMAP54XX_RAC_VDD_MM_L_SHIFT 26
1075#define OMAP54XX_RAC_VDD_MM_L_WIDTH 0x1
1076#define OMAP54XX_RAC_VDD_MM_L_MASK (1 << 26)
1077
1078/* Used by PRM_VC_SMPS_MPU_CONFIG */
1079#define OMAP54XX_RAC_VDD_MPU_L_SHIFT 26
1080#define OMAP54XX_RAC_VDD_MPU_L_WIDTH 0x1
1081#define OMAP54XX_RAC_VDD_MPU_L_MASK (1 << 26)
1082
1083/*
1084 * Used by PRM_VOLTSETUP_CORE_OFF, PRM_VOLTSETUP_CORE_RET_SLEEP,
1085 * PRM_VOLTSETUP_MM_OFF, PRM_VOLTSETUP_MM_RET_SLEEP, PRM_VOLTSETUP_MPU_OFF,
1086 * PRM_VOLTSETUP_MPU_RET_SLEEP
1087 */
1088#define OMAP54XX_RAMP_DOWN_COUNT_SHIFT 16
1089#define OMAP54XX_RAMP_DOWN_COUNT_WIDTH 0x6
1090#define OMAP54XX_RAMP_DOWN_COUNT_MASK (0x3f << 16)
1091
1092/*
1093 * Used by PRM_VOLTSETUP_CORE_OFF, PRM_VOLTSETUP_CORE_RET_SLEEP,
1094 * PRM_VOLTSETUP_MM_OFF, PRM_VOLTSETUP_MM_RET_SLEEP, PRM_VOLTSETUP_MPU_OFF,
1095 * PRM_VOLTSETUP_MPU_RET_SLEEP
1096 */
1097#define OMAP54XX_RAMP_DOWN_PRESCAL_SHIFT 24
1098#define OMAP54XX_RAMP_DOWN_PRESCAL_WIDTH 0x2
1099#define OMAP54XX_RAMP_DOWN_PRESCAL_MASK (0x3 << 24)
1100
1101/*
1102 * Used by PRM_VOLTSETUP_CORE_OFF, PRM_VOLTSETUP_CORE_RET_SLEEP,
1103 * PRM_VOLTSETUP_MM_OFF, PRM_VOLTSETUP_MM_RET_SLEEP, PRM_VOLTSETUP_MPU_OFF,
1104 * PRM_VOLTSETUP_MPU_RET_SLEEP
1105 */
1106#define OMAP54XX_RAMP_UP_COUNT_SHIFT 0
1107#define OMAP54XX_RAMP_UP_COUNT_WIDTH 0x6
1108#define OMAP54XX_RAMP_UP_COUNT_MASK (0x3f << 0)
1109
1110/*
1111 * Used by PRM_VOLTSETUP_CORE_OFF, PRM_VOLTSETUP_CORE_RET_SLEEP,
1112 * PRM_VOLTSETUP_MM_OFF, PRM_VOLTSETUP_MM_RET_SLEEP, PRM_VOLTSETUP_MPU_OFF,
1113 * PRM_VOLTSETUP_MPU_RET_SLEEP
1114 */
1115#define OMAP54XX_RAMP_UP_PRESCAL_SHIFT 8
1116#define OMAP54XX_RAMP_UP_PRESCAL_WIDTH 0x2
1117#define OMAP54XX_RAMP_UP_PRESCAL_MASK (0x3 << 8)
1118
1119/* Used by PRM_VC_SMPS_CORE_CONFIG */
1120#define OMAP54XX_RAV_VDD_CORE_L_SHIFT 25
1121#define OMAP54XX_RAV_VDD_CORE_L_WIDTH 0x1
1122#define OMAP54XX_RAV_VDD_CORE_L_MASK (1 << 25)
1123
1124/* Used by PRM_VC_SMPS_MM_CONFIG */
1125#define OMAP54XX_RAV_VDD_MM_L_SHIFT 25
1126#define OMAP54XX_RAV_VDD_MM_L_WIDTH 0x1
1127#define OMAP54XX_RAV_VDD_MM_L_MASK (1 << 25)
1128
1129/* Used by PRM_VC_SMPS_MPU_CONFIG */
1130#define OMAP54XX_RAV_VDD_MPU_L_SHIFT 25
1131#define OMAP54XX_RAV_VDD_MPU_L_WIDTH 0x1
1132#define OMAP54XX_RAV_VDD_MPU_L_MASK (1 << 25)
1133
1134/* Used by PRM_VC_VAL_BYPASS */
1135#define OMAP54XX_REGADDR_SHIFT 8
1136#define OMAP54XX_REGADDR_WIDTH 0x8
1137#define OMAP54XX_REGADDR_MASK (0xff << 8)
1138
1139/*
1140 * Used by PRM_VC_VAL_CMD_VDD_CORE_L, PRM_VC_VAL_CMD_VDD_MM_L,
1141 * PRM_VC_VAL_CMD_VDD_MPU_L
1142 */
1143#define OMAP54XX_RET_SHIFT 8
1144#define OMAP54XX_RET_WIDTH 0x8
1145#define OMAP54XX_RET_MASK (0xff << 8)
1146
1147/* Used by PRM_SLDO_CORE_CTRL, PRM_SLDO_MM_CTRL, PRM_SLDO_MPU_CTRL */
1148#define OMAP54XX_RETMODE_ENABLE_SHIFT 0
1149#define OMAP54XX_RETMODE_ENABLE_WIDTH 0x1
1150#define OMAP54XX_RETMODE_ENABLE_MASK (1 << 0)
1151
1152/* Used by PRM_RSTTIME */
1153#define OMAP54XX_RSTTIME1_SHIFT 0
1154#define OMAP54XX_RSTTIME1_WIDTH 0xa
1155#define OMAP54XX_RSTTIME1_MASK (0x3ff << 0)
1156
1157/* Used by PRM_RSTTIME */
1158#define OMAP54XX_RSTTIME2_SHIFT 10
1159#define OMAP54XX_RSTTIME2_WIDTH 0x5
1160#define OMAP54XX_RSTTIME2_MASK (0x1f << 10)
1161
1162/* Used by RM_IPU_RSTCTRL, RM_IPU_RSTST */
1163#define OMAP54XX_RST_CPU0_SHIFT 0
1164#define OMAP54XX_RST_CPU0_WIDTH 0x1
1165#define OMAP54XX_RST_CPU0_MASK (1 << 0)
1166
1167/* Used by RM_IPU_RSTCTRL, RM_IPU_RSTST */
1168#define OMAP54XX_RST_CPU1_SHIFT 1
1169#define OMAP54XX_RST_CPU1_WIDTH 0x1
1170#define OMAP54XX_RST_CPU1_MASK (1 << 1)
1171
1172/* Used by RM_DSP_RSTCTRL, RM_DSP_RSTST */
1173#define OMAP54XX_RST_DSP_SHIFT 0
1174#define OMAP54XX_RST_DSP_WIDTH 0x1
1175#define OMAP54XX_RST_DSP_MASK (1 << 0)
1176
1177/* Used by RM_DSP_RSTST */
1178#define OMAP54XX_RST_DSP_EMU_SHIFT 2
1179#define OMAP54XX_RST_DSP_EMU_WIDTH 0x1
1180#define OMAP54XX_RST_DSP_EMU_MASK (1 << 2)
1181
1182/* Used by RM_DSP_RSTST */
1183#define OMAP54XX_RST_DSP_EMU_REQ_SHIFT 3
1184#define OMAP54XX_RST_DSP_EMU_REQ_WIDTH 0x1
1185#define OMAP54XX_RST_DSP_EMU_REQ_MASK (1 << 3)
1186
1187/* Used by RM_DSP_RSTCTRL, RM_DSP_RSTST */
1188#define OMAP54XX_RST_DSP_MMU_CACHE_SHIFT 1
1189#define OMAP54XX_RST_DSP_MMU_CACHE_WIDTH 0x1
1190#define OMAP54XX_RST_DSP_MMU_CACHE_MASK (1 << 1)
1191
1192/* Used by RM_IPU_RSTST */
1193#define OMAP54XX_RST_EMULATION_CPU0_SHIFT 3
1194#define OMAP54XX_RST_EMULATION_CPU0_WIDTH 0x1
1195#define OMAP54XX_RST_EMULATION_CPU0_MASK (1 << 3)
1196
1197/* Used by RM_IPU_RSTST */
1198#define OMAP54XX_RST_EMULATION_CPU1_SHIFT 4
1199#define OMAP54XX_RST_EMULATION_CPU1_WIDTH 0x1
1200#define OMAP54XX_RST_EMULATION_CPU1_MASK (1 << 4)
1201
1202/* Used by RM_IVA_RSTST */
1203#define OMAP54XX_RST_EMULATION_SEQ1_SHIFT 3
1204#define OMAP54XX_RST_EMULATION_SEQ1_WIDTH 0x1
1205#define OMAP54XX_RST_EMULATION_SEQ1_MASK (1 << 3)
1206
1207/* Used by RM_IVA_RSTST */
1208#define OMAP54XX_RST_EMULATION_SEQ2_SHIFT 4
1209#define OMAP54XX_RST_EMULATION_SEQ2_WIDTH 0x1
1210#define OMAP54XX_RST_EMULATION_SEQ2_MASK (1 << 4)
1211
1212/* Used by PRM_RSTCTRL */
1213#define OMAP54XX_RST_GLOBAL_COLD_SW_SHIFT 1
1214#define OMAP54XX_RST_GLOBAL_COLD_SW_WIDTH 0x1
1215#define OMAP54XX_RST_GLOBAL_COLD_SW_MASK (1 << 1)
1216
1217/* Used by PRM_RSTCTRL */
1218#define OMAP54XX_RST_GLOBAL_WARM_SW_SHIFT 0
1219#define OMAP54XX_RST_GLOBAL_WARM_SW_WIDTH 0x1
1220#define OMAP54XX_RST_GLOBAL_WARM_SW_MASK (1 << 0)
1221
1222/* Used by RM_IPU_RSTST */
1223#define OMAP54XX_RST_ICECRUSHER_CPU0_SHIFT 5
1224#define OMAP54XX_RST_ICECRUSHER_CPU0_WIDTH 0x1
1225#define OMAP54XX_RST_ICECRUSHER_CPU0_MASK (1 << 5)
1226
1227/* Used by RM_IPU_RSTST */
1228#define OMAP54XX_RST_ICECRUSHER_CPU1_SHIFT 6
1229#define OMAP54XX_RST_ICECRUSHER_CPU1_WIDTH 0x1
1230#define OMAP54XX_RST_ICECRUSHER_CPU1_MASK (1 << 6)
1231
1232/* Used by RM_IVA_RSTST */
1233#define OMAP54XX_RST_ICECRUSHER_SEQ1_SHIFT 5
1234#define OMAP54XX_RST_ICECRUSHER_SEQ1_WIDTH 0x1
1235#define OMAP54XX_RST_ICECRUSHER_SEQ1_MASK (1 << 5)
1236
1237/* Used by RM_IVA_RSTST */
1238#define OMAP54XX_RST_ICECRUSHER_SEQ2_SHIFT 6
1239#define OMAP54XX_RST_ICECRUSHER_SEQ2_WIDTH 0x1
1240#define OMAP54XX_RST_ICECRUSHER_SEQ2_MASK (1 << 6)
1241
1242/* Used by RM_IPU_RSTCTRL, RM_IPU_RSTST */
1243#define OMAP54XX_RST_IPU_MMU_CACHE_SHIFT 2
1244#define OMAP54XX_RST_IPU_MMU_CACHE_WIDTH 0x1
1245#define OMAP54XX_RST_IPU_MMU_CACHE_MASK (1 << 2)
1246
1247/* Used by RM_IVA_RSTCTRL, RM_IVA_RSTST */
1248#define OMAP54XX_RST_LOGIC_SHIFT 2
1249#define OMAP54XX_RST_LOGIC_WIDTH 0x1
1250#define OMAP54XX_RST_LOGIC_MASK (1 << 2)
1251
1252/* Used by RM_IVA_RSTCTRL, RM_IVA_RSTST */
1253#define OMAP54XX_RST_SEQ1_SHIFT 0
1254#define OMAP54XX_RST_SEQ1_WIDTH 0x1
1255#define OMAP54XX_RST_SEQ1_MASK (1 << 0)
1256
1257/* Used by RM_IVA_RSTCTRL, RM_IVA_RSTST */
1258#define OMAP54XX_RST_SEQ2_SHIFT 1
1259#define OMAP54XX_RST_SEQ2_WIDTH 0x1
1260#define OMAP54XX_RST_SEQ2_MASK (1 << 1)
1261
1262/* Used by REVISION_PRM */
1263#define OMAP54XX_R_RTL_SHIFT 11
1264#define OMAP54XX_R_RTL_WIDTH 0x5
1265#define OMAP54XX_R_RTL_MASK (0x1f << 11)
1266
1267/* Used by PRM_VC_SMPS_CORE_CONFIG */
1268#define OMAP54XX_SA_VDD_CORE_L_SHIFT 0
1269#define OMAP54XX_SA_VDD_CORE_L_WIDTH 0x7
1270#define OMAP54XX_SA_VDD_CORE_L_MASK (0x7f << 0)
1271
1272/* Used by PRM_VC_SMPS_MM_CONFIG */
1273#define OMAP54XX_SA_VDD_MM_L_SHIFT 0
1274#define OMAP54XX_SA_VDD_MM_L_WIDTH 0x7
1275#define OMAP54XX_SA_VDD_MM_L_MASK (0x7f << 0)
1276
1277/* Used by PRM_VC_SMPS_MPU_CONFIG */
1278#define OMAP54XX_SA_VDD_MPU_L_SHIFT 0
1279#define OMAP54XX_SA_VDD_MPU_L_WIDTH 0x7
1280#define OMAP54XX_SA_VDD_MPU_L_MASK (0x7f << 0)
1281
1282/* Used by REVISION_PRM */
1283#define OMAP54XX_SCHEME_SHIFT 30
1284#define OMAP54XX_SCHEME_WIDTH 0x2
1285#define OMAP54XX_SCHEME_MASK (0x3 << 30)
1286
1287/* Used by PRM_VC_CFG_I2C_CLK */
1288#define OMAP54XX_SCLH_SHIFT 0
1289#define OMAP54XX_SCLH_WIDTH 0x8
1290#define OMAP54XX_SCLH_MASK (0xff << 0)
1291
1292/* Used by PRM_VC_CFG_I2C_CLK */
1293#define OMAP54XX_SCLL_SHIFT 8
1294#define OMAP54XX_SCLL_WIDTH 0x8
1295#define OMAP54XX_SCLL_MASK (0xff << 8)
1296
1297/* Used by PRM_RSTST */
1298#define OMAP54XX_SECURE_WDT_RST_SHIFT 4
1299#define OMAP54XX_SECURE_WDT_RST_WIDTH 0x1
1300#define OMAP54XX_SECURE_WDT_RST_MASK (1 << 4)
1301
1302/* Used by PRM_VC_SMPS_CORE_CONFIG */
1303#define OMAP54XX_SEL_SA_VDD_CORE_L_SHIFT 24
1304#define OMAP54XX_SEL_SA_VDD_CORE_L_WIDTH 0x1
1305#define OMAP54XX_SEL_SA_VDD_CORE_L_MASK (1 << 24)
1306
1307/* Used by PRM_VC_SMPS_MM_CONFIG */
1308#define OMAP54XX_SEL_SA_VDD_MM_L_SHIFT 24
1309#define OMAP54XX_SEL_SA_VDD_MM_L_WIDTH 0x1
1310#define OMAP54XX_SEL_SA_VDD_MM_L_MASK (1 << 24)
1311
1312/* Used by PRM_VC_SMPS_MPU_CONFIG */
1313#define OMAP54XX_SEL_SA_VDD_MPU_L_SHIFT 24
1314#define OMAP54XX_SEL_SA_VDD_MPU_L_WIDTH 0x1
1315#define OMAP54XX_SEL_SA_VDD_MPU_L_MASK (1 << 24)
1316
1317/* Used by PM_IVA_PWRSTCTRL */
1318#define OMAP54XX_SL2_MEM_ONSTATE_SHIFT 18
1319#define OMAP54XX_SL2_MEM_ONSTATE_WIDTH 0x2
1320#define OMAP54XX_SL2_MEM_ONSTATE_MASK (0x3 << 18)
1321
1322/* Used by PM_IVA_PWRSTCTRL */
1323#define OMAP54XX_SL2_MEM_RETSTATE_SHIFT 9
1324#define OMAP54XX_SL2_MEM_RETSTATE_WIDTH 0x1
1325#define OMAP54XX_SL2_MEM_RETSTATE_MASK (1 << 9)
1326
1327/* Used by PM_IVA_PWRSTST */
1328#define OMAP54XX_SL2_MEM_STATEST_SHIFT 6
1329#define OMAP54XX_SL2_MEM_STATEST_WIDTH 0x2
1330#define OMAP54XX_SL2_MEM_STATEST_MASK (0x3 << 6)
1331
1332/* Used by PRM_VC_VAL_BYPASS */
1333#define OMAP54XX_SLAVEADDR_SHIFT 0
1334#define OMAP54XX_SLAVEADDR_WIDTH 0x7
1335#define OMAP54XX_SLAVEADDR_MASK (0x7f << 0)
1336
1337/* Used by PRM_SRAM_COUNT */
1338#define OMAP54XX_SLPCNT_VALUE_SHIFT 16
1339#define OMAP54XX_SLPCNT_VALUE_WIDTH 0x8
1340#define OMAP54XX_SLPCNT_VALUE_MASK (0xff << 16)
1341
1342/* Used by PRM_VP_CORE_VSTEPMAX, PRM_VP_MM_VSTEPMAX, PRM_VP_MPU_VSTEPMAX */
1343#define OMAP54XX_SMPSWAITTIMEMAX_SHIFT 8
1344#define OMAP54XX_SMPSWAITTIMEMAX_WIDTH 0x10
1345#define OMAP54XX_SMPSWAITTIMEMAX_MASK (0xffff << 8)
1346
1347/* Used by PRM_VP_CORE_VSTEPMIN, PRM_VP_MM_VSTEPMIN, PRM_VP_MPU_VSTEPMIN */
1348#define OMAP54XX_SMPSWAITTIMEMIN_SHIFT 8
1349#define OMAP54XX_SMPSWAITTIMEMIN_WIDTH 0x10
1350#define OMAP54XX_SMPSWAITTIMEMIN_MASK (0xffff << 8)
1351
1352/* Used by PRM_VC_CORE_ERRST */
1353#define OMAP54XX_SMPS_RA_ERR_CORE_SHIFT 1
1354#define OMAP54XX_SMPS_RA_ERR_CORE_WIDTH 0x1
1355#define OMAP54XX_SMPS_RA_ERR_CORE_MASK (1 << 1)
1356
1357/* Used by PRM_VC_MM_ERRST */
1358#define OMAP54XX_SMPS_RA_ERR_MM_SHIFT 1
1359#define OMAP54XX_SMPS_RA_ERR_MM_WIDTH 0x1
1360#define OMAP54XX_SMPS_RA_ERR_MM_MASK (1 << 1)
1361
1362/* Used by PRM_VC_MPU_ERRST */
1363#define OMAP54XX_SMPS_RA_ERR_MPU_SHIFT 1
1364#define OMAP54XX_SMPS_RA_ERR_MPU_WIDTH 0x1
1365#define OMAP54XX_SMPS_RA_ERR_MPU_MASK (1 << 1)
1366
1367/* Used by PRM_VC_CORE_ERRST */
1368#define OMAP54XX_SMPS_SA_ERR_CORE_SHIFT 0
1369#define OMAP54XX_SMPS_SA_ERR_CORE_WIDTH 0x1
1370#define OMAP54XX_SMPS_SA_ERR_CORE_MASK (1 << 0)
1371
1372/* Used by PRM_VC_MM_ERRST */
1373#define OMAP54XX_SMPS_SA_ERR_MM_SHIFT 0
1374#define OMAP54XX_SMPS_SA_ERR_MM_WIDTH 0x1
1375#define OMAP54XX_SMPS_SA_ERR_MM_MASK (1 << 0)
1376
1377/* Used by PRM_VC_MPU_ERRST */
1378#define OMAP54XX_SMPS_SA_ERR_MPU_SHIFT 0
1379#define OMAP54XX_SMPS_SA_ERR_MPU_WIDTH 0x1
1380#define OMAP54XX_SMPS_SA_ERR_MPU_MASK (1 << 0)
1381
1382/* Used by PRM_VC_CORE_ERRST */
1383#define OMAP54XX_SMPS_TIMEOUT_ERR_CORE_SHIFT 2
1384#define OMAP54XX_SMPS_TIMEOUT_ERR_CORE_WIDTH 0x1
1385#define OMAP54XX_SMPS_TIMEOUT_ERR_CORE_MASK (1 << 2)
1386
1387/* Used by PRM_VC_MM_ERRST */
1388#define OMAP54XX_SMPS_TIMEOUT_ERR_MM_SHIFT 2
1389#define OMAP54XX_SMPS_TIMEOUT_ERR_MM_WIDTH 0x1
1390#define OMAP54XX_SMPS_TIMEOUT_ERR_MM_MASK (1 << 2)
1391
1392/* Used by PRM_VC_MPU_ERRST */
1393#define OMAP54XX_SMPS_TIMEOUT_ERR_MPU_SHIFT 2
1394#define OMAP54XX_SMPS_TIMEOUT_ERR_MPU_WIDTH 0x1
1395#define OMAP54XX_SMPS_TIMEOUT_ERR_MPU_MASK (1 << 2)
1396
1397/* Used by PRM_ABBLDO_MM_SETUP, PRM_ABBLDO_MPU_SETUP */
1398#define OMAP54XX_SR2EN_SHIFT 0
1399#define OMAP54XX_SR2EN_WIDTH 0x1
1400#define OMAP54XX_SR2EN_MASK (1 << 0)
1401
1402/* Used by PRM_ABBLDO_MM_CTRL, PRM_ABBLDO_MPU_CTRL */
1403#define OMAP54XX_SR2_IN_TRANSITION_SHIFT 6
1404#define OMAP54XX_SR2_IN_TRANSITION_WIDTH 0x1
1405#define OMAP54XX_SR2_IN_TRANSITION_MASK (1 << 6)
1406
1407/* Used by PRM_ABBLDO_MM_CTRL, PRM_ABBLDO_MPU_CTRL */
1408#define OMAP54XX_SR2_STATUS_SHIFT 3
1409#define OMAP54XX_SR2_STATUS_WIDTH 0x2
1410#define OMAP54XX_SR2_STATUS_MASK (0x3 << 3)
1411
1412/* Used by PRM_ABBLDO_MM_SETUP, PRM_ABBLDO_MPU_SETUP */
1413#define OMAP54XX_SR2_WTCNT_VALUE_SHIFT 8
1414#define OMAP54XX_SR2_WTCNT_VALUE_WIDTH 0x8
1415#define OMAP54XX_SR2_WTCNT_VALUE_MASK (0xff << 8)
1416
1417/* Used by PRM_SLDO_CORE_CTRL, PRM_SLDO_MM_CTRL, PRM_SLDO_MPU_CTRL */
1418#define OMAP54XX_SRAMLDO_STATUS_SHIFT 8
1419#define OMAP54XX_SRAMLDO_STATUS_WIDTH 0x1
1420#define OMAP54XX_SRAMLDO_STATUS_MASK (1 << 8)
1421
1422/* Used by PRM_SLDO_CORE_CTRL, PRM_SLDO_MM_CTRL, PRM_SLDO_MPU_CTRL */
1423#define OMAP54XX_SRAM_IN_TRANSITION_SHIFT 9
1424#define OMAP54XX_SRAM_IN_TRANSITION_WIDTH 0x1
1425#define OMAP54XX_SRAM_IN_TRANSITION_MASK (1 << 9)
1426
1427/* Used by PRM_VC_CFG_I2C_MODE */
1428#define OMAP54XX_SRMODEEN_SHIFT 4
1429#define OMAP54XX_SRMODEEN_WIDTH 0x1
1430#define OMAP54XX_SRMODEEN_MASK (1 << 4)
1431
1432/* Used by PRM_VOLTSETUP_WARMRESET */
1433#define OMAP54XX_STABLE_COUNT_SHIFT 0
1434#define OMAP54XX_STABLE_COUNT_WIDTH 0x6
1435#define OMAP54XX_STABLE_COUNT_MASK (0x3f << 0)
1436
1437/* Used by PRM_VOLTSETUP_WARMRESET */
1438#define OMAP54XX_STABLE_PRESCAL_SHIFT 8
1439#define OMAP54XX_STABLE_PRESCAL_WIDTH 0x2
1440#define OMAP54XX_STABLE_PRESCAL_MASK (0x3 << 8)
1441
1442/* Used by PRM_BANDGAP_SETUP */
1443#define OMAP54XX_STARTUP_COUNT_SHIFT 0
1444#define OMAP54XX_STARTUP_COUNT_WIDTH 0x8
1445#define OMAP54XX_STARTUP_COUNT_MASK (0xff << 0)
1446
1447/* Renamed from STARTUP_COUNT Used by PRM_SRAM_COUNT */
1448#define OMAP54XX_STARTUP_COUNT_24_31_SHIFT 24
1449#define OMAP54XX_STARTUP_COUNT_24_31_WIDTH 0x8
1450#define OMAP54XX_STARTUP_COUNT_24_31_MASK (0xff << 24)
1451
1452/* Used by PM_IVA_PWRSTCTRL */
1453#define OMAP54XX_TCM1_MEM_ONSTATE_SHIFT 20
1454#define OMAP54XX_TCM1_MEM_ONSTATE_WIDTH 0x2
1455#define OMAP54XX_TCM1_MEM_ONSTATE_MASK (0x3 << 20)
1456
1457/* Used by PM_IVA_PWRSTCTRL */
1458#define OMAP54XX_TCM1_MEM_RETSTATE_SHIFT 10
1459#define OMAP54XX_TCM1_MEM_RETSTATE_WIDTH 0x1
1460#define OMAP54XX_TCM1_MEM_RETSTATE_MASK (1 << 10)
1461
1462/* Used by PM_IVA_PWRSTST */
1463#define OMAP54XX_TCM1_MEM_STATEST_SHIFT 8
1464#define OMAP54XX_TCM1_MEM_STATEST_WIDTH 0x2
1465#define OMAP54XX_TCM1_MEM_STATEST_MASK (0x3 << 8)
1466
1467/* Used by PM_IVA_PWRSTCTRL */
1468#define OMAP54XX_TCM2_MEM_ONSTATE_SHIFT 22
1469#define OMAP54XX_TCM2_MEM_ONSTATE_WIDTH 0x2
1470#define OMAP54XX_TCM2_MEM_ONSTATE_MASK (0x3 << 22)
1471
1472/* Used by PM_IVA_PWRSTCTRL */
1473#define OMAP54XX_TCM2_MEM_RETSTATE_SHIFT 11
1474#define OMAP54XX_TCM2_MEM_RETSTATE_WIDTH 0x1
1475#define OMAP54XX_TCM2_MEM_RETSTATE_MASK (1 << 11)
1476
1477/* Used by PM_IVA_PWRSTST */
1478#define OMAP54XX_TCM2_MEM_STATEST_SHIFT 10
1479#define OMAP54XX_TCM2_MEM_STATEST_WIDTH 0x2
1480#define OMAP54XX_TCM2_MEM_STATEST_MASK (0x3 << 10)
1481
1482/* Used by PRM_VP_CORE_VLIMITTO, PRM_VP_MM_VLIMITTO, PRM_VP_MPU_VLIMITTO */
1483#define OMAP54XX_TIMEOUT_SHIFT 0
1484#define OMAP54XX_TIMEOUT_WIDTH 0x10
1485#define OMAP54XX_TIMEOUT_MASK (0xffff << 0)
1486
1487/* Used by PRM_VP_CORE_CONFIG, PRM_VP_MM_CONFIG, PRM_VP_MPU_CONFIG */
1488#define OMAP54XX_TIMEOUTEN_SHIFT 3
1489#define OMAP54XX_TIMEOUTEN_WIDTH 0x1
1490#define OMAP54XX_TIMEOUTEN_MASK (1 << 3)
1491
1492/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
1493#define OMAP54XX_TRANSITION_EN_SHIFT 8
1494#define OMAP54XX_TRANSITION_EN_WIDTH 0x1
1495#define OMAP54XX_TRANSITION_EN_MASK (1 << 8)
1496
1497/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
1498#define OMAP54XX_TRANSITION_ST_SHIFT 8
1499#define OMAP54XX_TRANSITION_ST_WIDTH 0x1
1500#define OMAP54XX_TRANSITION_ST_MASK (1 << 8)
1501
1502/* Used by PRM_DEBUG_TRANS_CFG */
1503#define OMAP54XX_TRIGGER_CLEAR_SHIFT 2
1504#define OMAP54XX_TRIGGER_CLEAR_WIDTH 0x1
1505#define OMAP54XX_TRIGGER_CLEAR_MASK (1 << 2)
1506
1507/* Used by PRM_RSTST */
1508#define OMAP54XX_TSHUT_CORE_RST_SHIFT 13
1509#define OMAP54XX_TSHUT_CORE_RST_WIDTH 0x1
1510#define OMAP54XX_TSHUT_CORE_RST_MASK (1 << 13)
1511
1512/* Used by PRM_RSTST */
1513#define OMAP54XX_TSHUT_MM_RST_SHIFT 12
1514#define OMAP54XX_TSHUT_MM_RST_WIDTH 0x1
1515#define OMAP54XX_TSHUT_MM_RST_MASK (1 << 12)
1516
1517/* Used by PRM_RSTST */
1518#define OMAP54XX_TSHUT_MPU_RST_SHIFT 11
1519#define OMAP54XX_TSHUT_MPU_RST_WIDTH 0x1
1520#define OMAP54XX_TSHUT_MPU_RST_MASK (1 << 11)
1521
1522/* Used by PRM_VC_VAL_BYPASS */
1523#define OMAP54XX_VALID_SHIFT 24
1524#define OMAP54XX_VALID_WIDTH 0x1
1525#define OMAP54XX_VALID_MASK (1 << 24)
1526
1527/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
1528#define OMAP54XX_VC_BYPASSACK_EN_SHIFT 14
1529#define OMAP54XX_VC_BYPASSACK_EN_WIDTH 0x1
1530#define OMAP54XX_VC_BYPASSACK_EN_MASK (1 << 14)
1531
1532/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
1533#define OMAP54XX_VC_BYPASSACK_ST_SHIFT 14
1534#define OMAP54XX_VC_BYPASSACK_ST_WIDTH 0x1
1535#define OMAP54XX_VC_BYPASSACK_ST_MASK (1 << 14)
1536
1537/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
1538#define OMAP54XX_VC_CORE_VPACK_EN_SHIFT 22
1539#define OMAP54XX_VC_CORE_VPACK_EN_WIDTH 0x1
1540#define OMAP54XX_VC_CORE_VPACK_EN_MASK (1 << 22)
1541
1542/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
1543#define OMAP54XX_VC_CORE_VPACK_ST_SHIFT 22
1544#define OMAP54XX_VC_CORE_VPACK_ST_WIDTH 0x1
1545#define OMAP54XX_VC_CORE_VPACK_ST_MASK (1 << 22)
1546
1547/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
1548#define OMAP54XX_VC_MM_VPACK_EN_SHIFT 30
1549#define OMAP54XX_VC_MM_VPACK_EN_WIDTH 0x1
1550#define OMAP54XX_VC_MM_VPACK_EN_MASK (1 << 30)
1551
1552/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
1553#define OMAP54XX_VC_MM_VPACK_ST_SHIFT 30
1554#define OMAP54XX_VC_MM_VPACK_ST_WIDTH 0x1
1555#define OMAP54XX_VC_MM_VPACK_ST_MASK (1 << 30)
1556
1557/* Used by PRM_IRQENABLE_MPU_2 */
1558#define OMAP54XX_VC_MPU_VPACK_EN_SHIFT 6
1559#define OMAP54XX_VC_MPU_VPACK_EN_WIDTH 0x1
1560#define OMAP54XX_VC_MPU_VPACK_EN_MASK (1 << 6)
1561
1562/* Used by PRM_IRQSTATUS_MPU_2 */
1563#define OMAP54XX_VC_MPU_VPACK_ST_SHIFT 6
1564#define OMAP54XX_VC_MPU_VPACK_ST_WIDTH 0x1
1565#define OMAP54XX_VC_MPU_VPACK_ST_MASK (1 << 6)
1566
1567/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
1568#define OMAP54XX_VC_RAERR_EN_SHIFT 12
1569#define OMAP54XX_VC_RAERR_EN_WIDTH 0x1
1570#define OMAP54XX_VC_RAERR_EN_MASK (1 << 12)
1571
1572/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
1573#define OMAP54XX_VC_RAERR_ST_SHIFT 12
1574#define OMAP54XX_VC_RAERR_ST_WIDTH 0x1
1575#define OMAP54XX_VC_RAERR_ST_MASK (1 << 12)
1576
1577/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
1578#define OMAP54XX_VC_SAERR_EN_SHIFT 11
1579#define OMAP54XX_VC_SAERR_EN_WIDTH 0x1
1580#define OMAP54XX_VC_SAERR_EN_MASK (1 << 11)
1581
1582/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
1583#define OMAP54XX_VC_SAERR_ST_SHIFT 11
1584#define OMAP54XX_VC_SAERR_ST_WIDTH 0x1
1585#define OMAP54XX_VC_SAERR_ST_MASK (1 << 11)
1586
1587/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
1588#define OMAP54XX_VC_TOERR_EN_SHIFT 13
1589#define OMAP54XX_VC_TOERR_EN_WIDTH 0x1
1590#define OMAP54XX_VC_TOERR_EN_MASK (1 << 13)
1591
1592/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
1593#define OMAP54XX_VC_TOERR_ST_SHIFT 13
1594#define OMAP54XX_VC_TOERR_ST_WIDTH 0x1
1595#define OMAP54XX_VC_TOERR_ST_MASK (1 << 13)
1596
1597/* Used by PRM_VP_CORE_VLIMITTO, PRM_VP_MM_VLIMITTO, PRM_VP_MPU_VLIMITTO */
1598#define OMAP54XX_VDDMAX_SHIFT 24
1599#define OMAP54XX_VDDMAX_WIDTH 0x8
1600#define OMAP54XX_VDDMAX_MASK (0xff << 24)
1601
1602/* Used by PRM_VP_CORE_VLIMITTO, PRM_VP_MM_VLIMITTO, PRM_VP_MPU_VLIMITTO */
1603#define OMAP54XX_VDDMIN_SHIFT 16
1604#define OMAP54XX_VDDMIN_WIDTH 0x8
1605#define OMAP54XX_VDDMIN_MASK (0xff << 16)
1606
1607/* Used by PRM_VOLTCTRL */
1608#define OMAP54XX_VDD_CORE_I2C_DISABLE_SHIFT 12
1609#define OMAP54XX_VDD_CORE_I2C_DISABLE_WIDTH 0x1
1610#define OMAP54XX_VDD_CORE_I2C_DISABLE_MASK (1 << 12)
1611
1612/* Used by PRM_RSTST */
1613#define OMAP54XX_VDD_CORE_VOLT_MGR_RST_SHIFT 8
1614#define OMAP54XX_VDD_CORE_VOLT_MGR_RST_WIDTH 0x1
1615#define OMAP54XX_VDD_CORE_VOLT_MGR_RST_MASK (1 << 8)
1616
1617/* Used by PRM_VOLTCTRL */
1618#define OMAP54XX_VDD_MM_I2C_DISABLE_SHIFT 14
1619#define OMAP54XX_VDD_MM_I2C_DISABLE_WIDTH 0x1
1620#define OMAP54XX_VDD_MM_I2C_DISABLE_MASK (1 << 14)
1621
1622/* Used by PRM_VOLTCTRL */
1623#define OMAP54XX_VDD_MM_PRESENCE_SHIFT 9
1624#define OMAP54XX_VDD_MM_PRESENCE_WIDTH 0x1
1625#define OMAP54XX_VDD_MM_PRESENCE_MASK (1 << 9)
1626
1627/* Used by PRM_RSTST */
1628#define OMAP54XX_VDD_MM_VOLT_MGR_RST_SHIFT 7
1629#define OMAP54XX_VDD_MM_VOLT_MGR_RST_WIDTH 0x1
1630#define OMAP54XX_VDD_MM_VOLT_MGR_RST_MASK (1 << 7)
1631
1632/* Used by PRM_VOLTCTRL */
1633#define OMAP54XX_VDD_MPU_I2C_DISABLE_SHIFT 13
1634#define OMAP54XX_VDD_MPU_I2C_DISABLE_WIDTH 0x1
1635#define OMAP54XX_VDD_MPU_I2C_DISABLE_MASK (1 << 13)
1636
1637/* Used by PRM_VOLTCTRL */
1638#define OMAP54XX_VDD_MPU_PRESENCE_SHIFT 8
1639#define OMAP54XX_VDD_MPU_PRESENCE_WIDTH 0x1
1640#define OMAP54XX_VDD_MPU_PRESENCE_MASK (1 << 8)
1641
1642/* Used by PRM_RSTST */
1643#define OMAP54XX_VDD_MPU_VOLT_MGR_RST_SHIFT 6
1644#define OMAP54XX_VDD_MPU_VOLT_MGR_RST_WIDTH 0x1
1645#define OMAP54XX_VDD_MPU_VOLT_MGR_RST_MASK (1 << 6)
1646
1647/* Used by PRM_VC_CORE_ERRST */
1648#define OMAP54XX_VFSM_RA_ERR_CORE_SHIFT 4
1649#define OMAP54XX_VFSM_RA_ERR_CORE_WIDTH 0x1
1650#define OMAP54XX_VFSM_RA_ERR_CORE_MASK (1 << 4)
1651
1652/* Used by PRM_VC_MM_ERRST */
1653#define OMAP54XX_VFSM_RA_ERR_MM_SHIFT 4
1654#define OMAP54XX_VFSM_RA_ERR_MM_WIDTH 0x1
1655#define OMAP54XX_VFSM_RA_ERR_MM_MASK (1 << 4)
1656
1657/* Used by PRM_VC_MPU_ERRST */
1658#define OMAP54XX_VFSM_RA_ERR_MPU_SHIFT 4
1659#define OMAP54XX_VFSM_RA_ERR_MPU_WIDTH 0x1
1660#define OMAP54XX_VFSM_RA_ERR_MPU_MASK (1 << 4)
1661
1662/* Used by PRM_VC_CORE_ERRST */
1663#define OMAP54XX_VFSM_SA_ERR_CORE_SHIFT 3
1664#define OMAP54XX_VFSM_SA_ERR_CORE_WIDTH 0x1
1665#define OMAP54XX_VFSM_SA_ERR_CORE_MASK (1 << 3)
1666
1667/* Used by PRM_VC_MM_ERRST */
1668#define OMAP54XX_VFSM_SA_ERR_MM_SHIFT 3
1669#define OMAP54XX_VFSM_SA_ERR_MM_WIDTH 0x1
1670#define OMAP54XX_VFSM_SA_ERR_MM_MASK (1 << 3)
1671
1672/* Used by PRM_VC_MPU_ERRST */
1673#define OMAP54XX_VFSM_SA_ERR_MPU_SHIFT 3
1674#define OMAP54XX_VFSM_SA_ERR_MPU_WIDTH 0x1
1675#define OMAP54XX_VFSM_SA_ERR_MPU_MASK (1 << 3)
1676
1677/* Used by PRM_VC_CORE_ERRST */
1678#define OMAP54XX_VFSM_TIMEOUT_ERR_CORE_SHIFT 5
1679#define OMAP54XX_VFSM_TIMEOUT_ERR_CORE_WIDTH 0x1
1680#define OMAP54XX_VFSM_TIMEOUT_ERR_CORE_MASK (1 << 5)
1681
1682/* Used by PRM_VC_MM_ERRST */
1683#define OMAP54XX_VFSM_TIMEOUT_ERR_MM_SHIFT 5
1684#define OMAP54XX_VFSM_TIMEOUT_ERR_MM_WIDTH 0x1
1685#define OMAP54XX_VFSM_TIMEOUT_ERR_MM_MASK (1 << 5)
1686
1687/* Used by PRM_VC_MPU_ERRST */
1688#define OMAP54XX_VFSM_TIMEOUT_ERR_MPU_SHIFT 5
1689#define OMAP54XX_VFSM_TIMEOUT_ERR_MPU_WIDTH 0x1
1690#define OMAP54XX_VFSM_TIMEOUT_ERR_MPU_MASK (1 << 5)
1691
1692/* Used by PRM_VC_SMPS_CORE_CONFIG */
1693#define OMAP54XX_VOLRA_VDD_CORE_L_SHIFT 8
1694#define OMAP54XX_VOLRA_VDD_CORE_L_WIDTH 0x8
1695#define OMAP54XX_VOLRA_VDD_CORE_L_MASK (0xff << 8)
1696
1697/* Used by PRM_VC_SMPS_MM_CONFIG */
1698#define OMAP54XX_VOLRA_VDD_MM_L_SHIFT 8
1699#define OMAP54XX_VOLRA_VDD_MM_L_WIDTH 0x8
1700#define OMAP54XX_VOLRA_VDD_MM_L_MASK (0xff << 8)
1701
1702/* Used by PRM_VC_SMPS_MPU_CONFIG */
1703#define OMAP54XX_VOLRA_VDD_MPU_L_SHIFT 8
1704#define OMAP54XX_VOLRA_VDD_MPU_L_WIDTH 0x8
1705#define OMAP54XX_VOLRA_VDD_MPU_L_MASK (0xff << 8)
1706
1707/* Used by PRM_VOLTST_MM, PRM_VOLTST_MPU */
1708#define OMAP54XX_VOLTSTATEST_SHIFT 0
1709#define OMAP54XX_VOLTSTATEST_WIDTH 0x2
1710#define OMAP54XX_VOLTSTATEST_MASK (0x3 << 0)
1711
1712/* Used by PRM_VP_CORE_CONFIG, PRM_VP_MM_CONFIG, PRM_VP_MPU_CONFIG */
1713#define OMAP54XX_VPENABLE_SHIFT 0
1714#define OMAP54XX_VPENABLE_WIDTH 0x1
1715#define OMAP54XX_VPENABLE_MASK (1 << 0)
1716
1717/* Used by PRM_VP_CORE_STATUS, PRM_VP_MM_STATUS, PRM_VP_MPU_STATUS */
1718#define OMAP54XX_VPINIDLE_SHIFT 0
1719#define OMAP54XX_VPINIDLE_WIDTH 0x1
1720#define OMAP54XX_VPINIDLE_MASK (1 << 0)
1721
1722/* Used by PRM_VP_CORE_VOLTAGE, PRM_VP_MM_VOLTAGE, PRM_VP_MPU_VOLTAGE */
1723#define OMAP54XX_VPVOLTAGE_SHIFT 0
1724#define OMAP54XX_VPVOLTAGE_WIDTH 0x8
1725#define OMAP54XX_VPVOLTAGE_MASK (0xff << 0)
1726
1727/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
1728#define OMAP54XX_VP_CORE_EQVALUE_EN_SHIFT 20
1729#define OMAP54XX_VP_CORE_EQVALUE_EN_WIDTH 0x1
1730#define OMAP54XX_VP_CORE_EQVALUE_EN_MASK (1 << 20)
1731
1732/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
1733#define OMAP54XX_VP_CORE_EQVALUE_ST_SHIFT 20
1734#define OMAP54XX_VP_CORE_EQVALUE_ST_WIDTH 0x1
1735#define OMAP54XX_VP_CORE_EQVALUE_ST_MASK (1 << 20)
1736
1737/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
1738#define OMAP54XX_VP_CORE_MAXVDD_EN_SHIFT 18
1739#define OMAP54XX_VP_CORE_MAXVDD_EN_WIDTH 0x1
1740#define OMAP54XX_VP_CORE_MAXVDD_EN_MASK (1 << 18)
1741
1742/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
1743#define OMAP54XX_VP_CORE_MAXVDD_ST_SHIFT 18
1744#define OMAP54XX_VP_CORE_MAXVDD_ST_WIDTH 0x1
1745#define OMAP54XX_VP_CORE_MAXVDD_ST_MASK (1 << 18)
1746
1747/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
1748#define OMAP54XX_VP_CORE_MINVDD_EN_SHIFT 17
1749#define OMAP54XX_VP_CORE_MINVDD_EN_WIDTH 0x1
1750#define OMAP54XX_VP_CORE_MINVDD_EN_MASK (1 << 17)
1751
1752/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
1753#define OMAP54XX_VP_CORE_MINVDD_ST_SHIFT 17
1754#define OMAP54XX_VP_CORE_MINVDD_ST_WIDTH 0x1
1755#define OMAP54XX_VP_CORE_MINVDD_ST_MASK (1 << 17)
1756
1757/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
1758#define OMAP54XX_VP_CORE_NOSMPSACK_EN_SHIFT 19
1759#define OMAP54XX_VP_CORE_NOSMPSACK_EN_WIDTH 0x1
1760#define OMAP54XX_VP_CORE_NOSMPSACK_EN_MASK (1 << 19)
1761
1762/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
1763#define OMAP54XX_VP_CORE_NOSMPSACK_ST_SHIFT 19
1764#define OMAP54XX_VP_CORE_NOSMPSACK_ST_WIDTH 0x1
1765#define OMAP54XX_VP_CORE_NOSMPSACK_ST_MASK (1 << 19)
1766
1767/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
1768#define OMAP54XX_VP_CORE_OPPCHANGEDONE_EN_SHIFT 16
1769#define OMAP54XX_VP_CORE_OPPCHANGEDONE_EN_WIDTH 0x1
1770#define OMAP54XX_VP_CORE_OPPCHANGEDONE_EN_MASK (1 << 16)
1771
1772/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
1773#define OMAP54XX_VP_CORE_OPPCHANGEDONE_ST_SHIFT 16
1774#define OMAP54XX_VP_CORE_OPPCHANGEDONE_ST_WIDTH 0x1
1775#define OMAP54XX_VP_CORE_OPPCHANGEDONE_ST_MASK (1 << 16)
1776
1777/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
1778#define OMAP54XX_VP_CORE_TRANXDONE_EN_SHIFT 21
1779#define OMAP54XX_VP_CORE_TRANXDONE_EN_WIDTH 0x1
1780#define OMAP54XX_VP_CORE_TRANXDONE_EN_MASK (1 << 21)
1781
1782/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
1783#define OMAP54XX_VP_CORE_TRANXDONE_ST_SHIFT 21
1784#define OMAP54XX_VP_CORE_TRANXDONE_ST_WIDTH 0x1
1785#define OMAP54XX_VP_CORE_TRANXDONE_ST_MASK (1 << 21)
1786
1787/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
1788#define OMAP54XX_VP_MM_EQVALUE_EN_SHIFT 28
1789#define OMAP54XX_VP_MM_EQVALUE_EN_WIDTH 0x1
1790#define OMAP54XX_VP_MM_EQVALUE_EN_MASK (1 << 28)
1791
1792/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
1793#define OMAP54XX_VP_MM_EQVALUE_ST_SHIFT 28
1794#define OMAP54XX_VP_MM_EQVALUE_ST_WIDTH 0x1
1795#define OMAP54XX_VP_MM_EQVALUE_ST_MASK (1 << 28)
1796
1797/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
1798#define OMAP54XX_VP_MM_MAXVDD_EN_SHIFT 26
1799#define OMAP54XX_VP_MM_MAXVDD_EN_WIDTH 0x1
1800#define OMAP54XX_VP_MM_MAXVDD_EN_MASK (1 << 26)
1801
1802/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
1803#define OMAP54XX_VP_MM_MAXVDD_ST_SHIFT 26
1804#define OMAP54XX_VP_MM_MAXVDD_ST_WIDTH 0x1
1805#define OMAP54XX_VP_MM_MAXVDD_ST_MASK (1 << 26)
1806
1807/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
1808#define OMAP54XX_VP_MM_MINVDD_EN_SHIFT 25
1809#define OMAP54XX_VP_MM_MINVDD_EN_WIDTH 0x1
1810#define OMAP54XX_VP_MM_MINVDD_EN_MASK (1 << 25)
1811
1812/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
1813#define OMAP54XX_VP_MM_MINVDD_ST_SHIFT 25
1814#define OMAP54XX_VP_MM_MINVDD_ST_WIDTH 0x1
1815#define OMAP54XX_VP_MM_MINVDD_ST_MASK (1 << 25)
1816
1817/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
1818#define OMAP54XX_VP_MM_NOSMPSACK_EN_SHIFT 27
1819#define OMAP54XX_VP_MM_NOSMPSACK_EN_WIDTH 0x1
1820#define OMAP54XX_VP_MM_NOSMPSACK_EN_MASK (1 << 27)
1821
1822/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
1823#define OMAP54XX_VP_MM_NOSMPSACK_ST_SHIFT 27
1824#define OMAP54XX_VP_MM_NOSMPSACK_ST_WIDTH 0x1
1825#define OMAP54XX_VP_MM_NOSMPSACK_ST_MASK (1 << 27)
1826
1827/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
1828#define OMAP54XX_VP_MM_OPPCHANGEDONE_EN_SHIFT 24
1829#define OMAP54XX_VP_MM_OPPCHANGEDONE_EN_WIDTH 0x1
1830#define OMAP54XX_VP_MM_OPPCHANGEDONE_EN_MASK (1 << 24)
1831
1832/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
1833#define OMAP54XX_VP_MM_OPPCHANGEDONE_ST_SHIFT 24
1834#define OMAP54XX_VP_MM_OPPCHANGEDONE_ST_WIDTH 0x1
1835#define OMAP54XX_VP_MM_OPPCHANGEDONE_ST_MASK (1 << 24)
1836
1837/* Used by PRM_IRQENABLE_IPU, PRM_IRQENABLE_MPU */
1838#define OMAP54XX_VP_MM_TRANXDONE_EN_SHIFT 29
1839#define OMAP54XX_VP_MM_TRANXDONE_EN_WIDTH 0x1
1840#define OMAP54XX_VP_MM_TRANXDONE_EN_MASK (1 << 29)
1841
1842/* Used by PRM_IRQSTATUS_IPU, PRM_IRQSTATUS_MPU */
1843#define OMAP54XX_VP_MM_TRANXDONE_ST_SHIFT 29
1844#define OMAP54XX_VP_MM_TRANXDONE_ST_WIDTH 0x1
1845#define OMAP54XX_VP_MM_TRANXDONE_ST_MASK (1 << 29)
1846
1847/* Used by PRM_IRQENABLE_MPU_2 */
1848#define OMAP54XX_VP_MPU_EQVALUE_EN_SHIFT 4
1849#define OMAP54XX_VP_MPU_EQVALUE_EN_WIDTH 0x1
1850#define OMAP54XX_VP_MPU_EQVALUE_EN_MASK (1 << 4)
1851
1852/* Used by PRM_IRQSTATUS_MPU_2 */
1853#define OMAP54XX_VP_MPU_EQVALUE_ST_SHIFT 4
1854#define OMAP54XX_VP_MPU_EQVALUE_ST_WIDTH 0x1
1855#define OMAP54XX_VP_MPU_EQVALUE_ST_MASK (1 << 4)
1856
1857/* Used by PRM_IRQENABLE_MPU_2 */
1858#define OMAP54XX_VP_MPU_MAXVDD_EN_SHIFT 2
1859#define OMAP54XX_VP_MPU_MAXVDD_EN_WIDTH 0x1
1860#define OMAP54XX_VP_MPU_MAXVDD_EN_MASK (1 << 2)
1861
1862/* Used by PRM_IRQSTATUS_MPU_2 */
1863#define OMAP54XX_VP_MPU_MAXVDD_ST_SHIFT 2
1864#define OMAP54XX_VP_MPU_MAXVDD_ST_WIDTH 0x1
1865#define OMAP54XX_VP_MPU_MAXVDD_ST_MASK (1 << 2)
1866
1867/* Used by PRM_IRQENABLE_MPU_2 */
1868#define OMAP54XX_VP_MPU_MINVDD_EN_SHIFT 1
1869#define OMAP54XX_VP_MPU_MINVDD_EN_WIDTH 0x1
1870#define OMAP54XX_VP_MPU_MINVDD_EN_MASK (1 << 1)
1871
1872/* Used by PRM_IRQSTATUS_MPU_2 */
1873#define OMAP54XX_VP_MPU_MINVDD_ST_SHIFT 1
1874#define OMAP54XX_VP_MPU_MINVDD_ST_WIDTH 0x1
1875#define OMAP54XX_VP_MPU_MINVDD_ST_MASK (1 << 1)
1876
1877/* Used by PRM_IRQENABLE_MPU_2 */
1878#define OMAP54XX_VP_MPU_NOSMPSACK_EN_SHIFT 3
1879#define OMAP54XX_VP_MPU_NOSMPSACK_EN_WIDTH 0x1
1880#define OMAP54XX_VP_MPU_NOSMPSACK_EN_MASK (1 << 3)
1881
1882/* Used by PRM_IRQSTATUS_MPU_2 */
1883#define OMAP54XX_VP_MPU_NOSMPSACK_ST_SHIFT 3
1884#define OMAP54XX_VP_MPU_NOSMPSACK_ST_WIDTH 0x1
1885#define OMAP54XX_VP_MPU_NOSMPSACK_ST_MASK (1 << 3)
1886
1887/* Used by PRM_IRQENABLE_MPU_2 */
1888#define OMAP54XX_VP_MPU_OPPCHANGEDONE_EN_SHIFT 0
1889#define OMAP54XX_VP_MPU_OPPCHANGEDONE_EN_WIDTH 0x1
1890#define OMAP54XX_VP_MPU_OPPCHANGEDONE_EN_MASK (1 << 0)
1891
1892/* Used by PRM_IRQSTATUS_MPU_2 */
1893#define OMAP54XX_VP_MPU_OPPCHANGEDONE_ST_SHIFT 0
1894#define OMAP54XX_VP_MPU_OPPCHANGEDONE_ST_WIDTH 0x1
1895#define OMAP54XX_VP_MPU_OPPCHANGEDONE_ST_MASK (1 << 0)
1896
1897/* Used by PRM_IRQENABLE_MPU_2 */
1898#define OMAP54XX_VP_MPU_TRANXDONE_EN_SHIFT 5
1899#define OMAP54XX_VP_MPU_TRANXDONE_EN_WIDTH 0x1
1900#define OMAP54XX_VP_MPU_TRANXDONE_EN_MASK (1 << 5)
1901
1902/* Used by PRM_IRQSTATUS_MPU_2 */
1903#define OMAP54XX_VP_MPU_TRANXDONE_ST_SHIFT 5
1904#define OMAP54XX_VP_MPU_TRANXDONE_ST_WIDTH 0x1
1905#define OMAP54XX_VP_MPU_TRANXDONE_ST_MASK (1 << 5)
1906
1907/* Used by PRM_SRAM_COUNT */
1908#define OMAP54XX_VSETUPCNT_VALUE_SHIFT 8
1909#define OMAP54XX_VSETUPCNT_VALUE_WIDTH 0x8
1910#define OMAP54XX_VSETUPCNT_VALUE_MASK (0xff << 8)
1911
1912/* Used by PRM_VP_CORE_VSTEPMAX, PRM_VP_MM_VSTEPMAX, PRM_VP_MPU_VSTEPMAX */
1913#define OMAP54XX_VSTEPMAX_SHIFT 0
1914#define OMAP54XX_VSTEPMAX_WIDTH 0x8
1915#define OMAP54XX_VSTEPMAX_MASK (0xff << 0)
1916
1917/* Used by PRM_VP_CORE_VSTEPMIN, PRM_VP_MM_VSTEPMIN, PRM_VP_MPU_VSTEPMIN */
1918#define OMAP54XX_VSTEPMIN_SHIFT 0
1919#define OMAP54XX_VSTEPMIN_WIDTH 0x8
1920#define OMAP54XX_VSTEPMIN_MASK (0xff << 0)
1921
1922/* Used by PM_DSS_DSS_WKDEP */
1923#define OMAP54XX_WKUPDEP_DISPC_DSP_SHIFT 2
1924#define OMAP54XX_WKUPDEP_DISPC_DSP_WIDTH 0x1
1925#define OMAP54XX_WKUPDEP_DISPC_DSP_MASK (1 << 2)
1926
1927/* Used by PM_DSS_DSS_WKDEP */
1928#define OMAP54XX_WKUPDEP_DISPC_IPU_SHIFT 1
1929#define OMAP54XX_WKUPDEP_DISPC_IPU_WIDTH 0x1
1930#define OMAP54XX_WKUPDEP_DISPC_IPU_MASK (1 << 1)
1931
1932/* Used by PM_DSS_DSS_WKDEP */
1933#define OMAP54XX_WKUPDEP_DISPC_MPU_SHIFT 0
1934#define OMAP54XX_WKUPDEP_DISPC_MPU_WIDTH 0x1
1935#define OMAP54XX_WKUPDEP_DISPC_MPU_MASK (1 << 0)
1936
1937/* Used by PM_DSS_DSS_WKDEP */
1938#define OMAP54XX_WKUPDEP_DISPC_SDMA_SHIFT 3
1939#define OMAP54XX_WKUPDEP_DISPC_SDMA_WIDTH 0x1
1940#define OMAP54XX_WKUPDEP_DISPC_SDMA_MASK (1 << 3)
1941
1942/* Used by PM_ABE_DMIC_WKDEP */
1943#define OMAP54XX_WKUPDEP_DMIC_DMA_DSP_SHIFT 6
1944#define OMAP54XX_WKUPDEP_DMIC_DMA_DSP_WIDTH 0x1
1945#define OMAP54XX_WKUPDEP_DMIC_DMA_DSP_MASK (1 << 6)
1946
1947/* Used by PM_ABE_DMIC_WKDEP */
1948#define OMAP54XX_WKUPDEP_DMIC_DMA_SDMA_SHIFT 7
1949#define OMAP54XX_WKUPDEP_DMIC_DMA_SDMA_WIDTH 0x1
1950#define OMAP54XX_WKUPDEP_DMIC_DMA_SDMA_MASK (1 << 7)
1951
1952/* Used by PM_ABE_DMIC_WKDEP */
1953#define OMAP54XX_WKUPDEP_DMIC_IRQ_DSP_SHIFT 2
1954#define OMAP54XX_WKUPDEP_DMIC_IRQ_DSP_WIDTH 0x1
1955#define OMAP54XX_WKUPDEP_DMIC_IRQ_DSP_MASK (1 << 2)
1956
1957/* Used by PM_ABE_DMIC_WKDEP */
1958#define OMAP54XX_WKUPDEP_DMIC_IRQ_MPU_SHIFT 0
1959#define OMAP54XX_WKUPDEP_DMIC_IRQ_MPU_WIDTH 0x1
1960#define OMAP54XX_WKUPDEP_DMIC_IRQ_MPU_MASK (1 << 0)
1961
1962/* Used by PM_DSS_DSS_WKDEP */
1963#define OMAP54XX_WKUPDEP_DSI1_A_DSP_SHIFT 6
1964#define OMAP54XX_WKUPDEP_DSI1_A_DSP_WIDTH 0x1
1965#define OMAP54XX_WKUPDEP_DSI1_A_DSP_MASK (1 << 6)
1966
1967/* Used by PM_DSS_DSS_WKDEP */
1968#define OMAP54XX_WKUPDEP_DSI1_A_IPU_SHIFT 5
1969#define OMAP54XX_WKUPDEP_DSI1_A_IPU_WIDTH 0x1
1970#define OMAP54XX_WKUPDEP_DSI1_A_IPU_MASK (1 << 5)
1971
1972/* Used by PM_DSS_DSS_WKDEP */
1973#define OMAP54XX_WKUPDEP_DSI1_A_MPU_SHIFT 4
1974#define OMAP54XX_WKUPDEP_DSI1_A_MPU_WIDTH 0x1
1975#define OMAP54XX_WKUPDEP_DSI1_A_MPU_MASK (1 << 4)
1976
1977/* Used by PM_DSS_DSS_WKDEP */
1978#define OMAP54XX_WKUPDEP_DSI1_A_SDMA_SHIFT 7
1979#define OMAP54XX_WKUPDEP_DSI1_A_SDMA_WIDTH 0x1
1980#define OMAP54XX_WKUPDEP_DSI1_A_SDMA_MASK (1 << 7)
1981
1982/* Used by PM_DSS_DSS_WKDEP */
1983#define OMAP54XX_WKUPDEP_DSI1_B_DSP_SHIFT 10
1984#define OMAP54XX_WKUPDEP_DSI1_B_DSP_WIDTH 0x1
1985#define OMAP54XX_WKUPDEP_DSI1_B_DSP_MASK (1 << 10)
1986
1987/* Used by PM_DSS_DSS_WKDEP */
1988#define OMAP54XX_WKUPDEP_DSI1_B_IPU_SHIFT 9
1989#define OMAP54XX_WKUPDEP_DSI1_B_IPU_WIDTH 0x1
1990#define OMAP54XX_WKUPDEP_DSI1_B_IPU_MASK (1 << 9)
1991
1992/* Used by PM_DSS_DSS_WKDEP */
1993#define OMAP54XX_WKUPDEP_DSI1_B_MPU_SHIFT 8
1994#define OMAP54XX_WKUPDEP_DSI1_B_MPU_WIDTH 0x1
1995#define OMAP54XX_WKUPDEP_DSI1_B_MPU_MASK (1 << 8)
1996
1997/* Used by PM_DSS_DSS_WKDEP */
1998#define OMAP54XX_WKUPDEP_DSI1_B_SDMA_SHIFT 11
1999#define OMAP54XX_WKUPDEP_DSI1_B_SDMA_WIDTH 0x1
2000#define OMAP54XX_WKUPDEP_DSI1_B_SDMA_MASK (1 << 11)
2001
2002/* Used by PM_DSS_DSS_WKDEP */
2003#define OMAP54XX_WKUPDEP_DSI1_C_DSP_SHIFT 17
2004#define OMAP54XX_WKUPDEP_DSI1_C_DSP_WIDTH 0x1
2005#define OMAP54XX_WKUPDEP_DSI1_C_DSP_MASK (1 << 17)
2006
2007/* Used by PM_DSS_DSS_WKDEP */
2008#define OMAP54XX_WKUPDEP_DSI1_C_IPU_SHIFT 16
2009#define OMAP54XX_WKUPDEP_DSI1_C_IPU_WIDTH 0x1
2010#define OMAP54XX_WKUPDEP_DSI1_C_IPU_MASK (1 << 16)
2011
2012/* Used by PM_DSS_DSS_WKDEP */
2013#define OMAP54XX_WKUPDEP_DSI1_C_MPU_SHIFT 15
2014#define OMAP54XX_WKUPDEP_DSI1_C_MPU_WIDTH 0x1
2015#define OMAP54XX_WKUPDEP_DSI1_C_MPU_MASK (1 << 15)
2016
2017/* Used by PM_DSS_DSS_WKDEP */
2018#define OMAP54XX_WKUPDEP_DSI1_C_SDMA_SHIFT 18
2019#define OMAP54XX_WKUPDEP_DSI1_C_SDMA_WIDTH 0x1
2020#define OMAP54XX_WKUPDEP_DSI1_C_SDMA_MASK (1 << 18)
2021
2022/* Used by PM_WKUPAON_GPIO1_WKDEP */
2023#define OMAP54XX_WKUPDEP_GPIO1_IRQ1_IPU_SHIFT 1
2024#define OMAP54XX_WKUPDEP_GPIO1_IRQ1_IPU_WIDTH 0x1
2025#define OMAP54XX_WKUPDEP_GPIO1_IRQ1_IPU_MASK (1 << 1)
2026
2027/* Used by PM_WKUPAON_GPIO1_WKDEP */
2028#define OMAP54XX_WKUPDEP_GPIO1_IRQ1_MPU_SHIFT 0
2029#define OMAP54XX_WKUPDEP_GPIO1_IRQ1_MPU_WIDTH 0x1
2030#define OMAP54XX_WKUPDEP_GPIO1_IRQ1_MPU_MASK (1 << 0)
2031
2032/* Used by PM_WKUPAON_GPIO1_WKDEP */
2033#define OMAP54XX_WKUPDEP_GPIO1_IRQ2_DSP_SHIFT 6
2034#define OMAP54XX_WKUPDEP_GPIO1_IRQ2_DSP_WIDTH 0x1
2035#define OMAP54XX_WKUPDEP_GPIO1_IRQ2_DSP_MASK (1 << 6)
2036
2037/* Used by PM_L4PER_GPIO2_WKDEP */
2038#define OMAP54XX_WKUPDEP_GPIO2_IRQ1_IPU_SHIFT 1
2039#define OMAP54XX_WKUPDEP_GPIO2_IRQ1_IPU_WIDTH 0x1
2040#define OMAP54XX_WKUPDEP_GPIO2_IRQ1_IPU_MASK (1 << 1)
2041
2042/* Used by PM_L4PER_GPIO2_WKDEP */
2043#define OMAP54XX_WKUPDEP_GPIO2_IRQ1_MPU_SHIFT 0
2044#define OMAP54XX_WKUPDEP_GPIO2_IRQ1_MPU_WIDTH 0x1
2045#define OMAP54XX_WKUPDEP_GPIO2_IRQ1_MPU_MASK (1 << 0)
2046
2047/* Used by PM_L4PER_GPIO2_WKDEP */
2048#define OMAP54XX_WKUPDEP_GPIO2_IRQ2_DSP_SHIFT 6
2049#define OMAP54XX_WKUPDEP_GPIO2_IRQ2_DSP_WIDTH 0x1
2050#define OMAP54XX_WKUPDEP_GPIO2_IRQ2_DSP_MASK (1 << 6)
2051
2052/* Used by PM_L4PER_GPIO3_WKDEP */
2053#define OMAP54XX_WKUPDEP_GPIO3_IRQ1_MPU_SHIFT 0
2054#define OMAP54XX_WKUPDEP_GPIO3_IRQ1_MPU_WIDTH 0x1
2055#define OMAP54XX_WKUPDEP_GPIO3_IRQ1_MPU_MASK (1 << 0)
2056
2057/* Used by PM_L4PER_GPIO3_WKDEP */
2058#define OMAP54XX_WKUPDEP_GPIO3_IRQ2_DSP_SHIFT 6
2059#define OMAP54XX_WKUPDEP_GPIO3_IRQ2_DSP_WIDTH 0x1
2060#define OMAP54XX_WKUPDEP_GPIO3_IRQ2_DSP_MASK (1 << 6)
2061
2062/* Used by PM_L4PER_GPIO4_WKDEP */
2063#define OMAP54XX_WKUPDEP_GPIO4_IRQ1_MPU_SHIFT 0
2064#define OMAP54XX_WKUPDEP_GPIO4_IRQ1_MPU_WIDTH 0x1
2065#define OMAP54XX_WKUPDEP_GPIO4_IRQ1_MPU_MASK (1 << 0)
2066
2067/* Used by PM_L4PER_GPIO4_WKDEP */
2068#define OMAP54XX_WKUPDEP_GPIO4_IRQ2_DSP_SHIFT 6
2069#define OMAP54XX_WKUPDEP_GPIO4_IRQ2_DSP_WIDTH 0x1
2070#define OMAP54XX_WKUPDEP_GPIO4_IRQ2_DSP_MASK (1 << 6)
2071
2072/* Used by PM_L4PER_GPIO5_WKDEP */
2073#define OMAP54XX_WKUPDEP_GPIO5_IRQ1_MPU_SHIFT 0
2074#define OMAP54XX_WKUPDEP_GPIO5_IRQ1_MPU_WIDTH 0x1
2075#define OMAP54XX_WKUPDEP_GPIO5_IRQ1_MPU_MASK (1 << 0)
2076
2077/* Used by PM_L4PER_GPIO5_WKDEP */
2078#define OMAP54XX_WKUPDEP_GPIO5_IRQ2_DSP_SHIFT 6
2079#define OMAP54XX_WKUPDEP_GPIO5_IRQ2_DSP_WIDTH 0x1
2080#define OMAP54XX_WKUPDEP_GPIO5_IRQ2_DSP_MASK (1 << 6)
2081
2082/* Used by PM_L4PER_GPIO6_WKDEP */
2083#define OMAP54XX_WKUPDEP_GPIO6_IRQ1_MPU_SHIFT 0
2084#define OMAP54XX_WKUPDEP_GPIO6_IRQ1_MPU_WIDTH 0x1
2085#define OMAP54XX_WKUPDEP_GPIO6_IRQ1_MPU_MASK (1 << 0)
2086
2087/* Used by PM_L4PER_GPIO6_WKDEP */
2088#define OMAP54XX_WKUPDEP_GPIO6_IRQ2_DSP_SHIFT 6
2089#define OMAP54XX_WKUPDEP_GPIO6_IRQ2_DSP_WIDTH 0x1
2090#define OMAP54XX_WKUPDEP_GPIO6_IRQ2_DSP_MASK (1 << 6)
2091
2092/* Used by PM_L4PER_GPIO7_WKDEP */
2093#define OMAP54XX_WKUPDEP_GPIO7_IRQ1_MPU_SHIFT 0
2094#define OMAP54XX_WKUPDEP_GPIO7_IRQ1_MPU_WIDTH 0x1
2095#define OMAP54XX_WKUPDEP_GPIO7_IRQ1_MPU_MASK (1 << 0)
2096
2097/* Used by PM_L4PER_GPIO8_WKDEP */
2098#define OMAP54XX_WKUPDEP_GPIO8_IRQ1_MPU_SHIFT 0
2099#define OMAP54XX_WKUPDEP_GPIO8_IRQ1_MPU_WIDTH 0x1
2100#define OMAP54XX_WKUPDEP_GPIO8_IRQ1_MPU_MASK (1 << 0)
2101
2102/* Used by PM_DSS_DSS_WKDEP */
2103#define OMAP54XX_WKUPDEP_HDMIDMA_SDMA_SHIFT 19
2104#define OMAP54XX_WKUPDEP_HDMIDMA_SDMA_WIDTH 0x1
2105#define OMAP54XX_WKUPDEP_HDMIDMA_SDMA_MASK (1 << 19)
2106
2107/* Used by PM_DSS_DSS_WKDEP */
2108#define OMAP54XX_WKUPDEP_HDMIIRQ_DSP_SHIFT 14
2109#define OMAP54XX_WKUPDEP_HDMIIRQ_DSP_WIDTH 0x1
2110#define OMAP54XX_WKUPDEP_HDMIIRQ_DSP_MASK (1 << 14)
2111
2112/* Used by PM_DSS_DSS_WKDEP */
2113#define OMAP54XX_WKUPDEP_HDMIIRQ_IPU_SHIFT 13
2114#define OMAP54XX_WKUPDEP_HDMIIRQ_IPU_WIDTH 0x1
2115#define OMAP54XX_WKUPDEP_HDMIIRQ_IPU_MASK (1 << 13)
2116
2117/* Used by PM_DSS_DSS_WKDEP */
2118#define OMAP54XX_WKUPDEP_HDMIIRQ_MPU_SHIFT 12
2119#define OMAP54XX_WKUPDEP_HDMIIRQ_MPU_WIDTH 0x1
2120#define OMAP54XX_WKUPDEP_HDMIIRQ_MPU_MASK (1 << 12)
2121
2122/* Used by PM_L3INIT_HSI_WKDEP */
2123#define OMAP54XX_WKUPDEP_HSI_DSP_DSP_SHIFT 6
2124#define OMAP54XX_WKUPDEP_HSI_DSP_DSP_WIDTH 0x1
2125#define OMAP54XX_WKUPDEP_HSI_DSP_DSP_MASK (1 << 6)
2126
2127/* Used by PM_L3INIT_HSI_WKDEP */
2128#define OMAP54XX_WKUPDEP_HSI_MCU_IPU_SHIFT 1
2129#define OMAP54XX_WKUPDEP_HSI_MCU_IPU_WIDTH 0x1
2130#define OMAP54XX_WKUPDEP_HSI_MCU_IPU_MASK (1 << 1)
2131
2132/* Used by PM_L3INIT_HSI_WKDEP */
2133#define OMAP54XX_WKUPDEP_HSI_MCU_MPU_SHIFT 0
2134#define OMAP54XX_WKUPDEP_HSI_MCU_MPU_WIDTH 0x1
2135#define OMAP54XX_WKUPDEP_HSI_MCU_MPU_MASK (1 << 0)
2136
2137/* Used by PM_L4PER_I2C1_WKDEP */
2138#define OMAP54XX_WKUPDEP_I2C1_DMA_SDMA_SHIFT 7
2139#define OMAP54XX_WKUPDEP_I2C1_DMA_SDMA_WIDTH 0x1
2140#define OMAP54XX_WKUPDEP_I2C1_DMA_SDMA_MASK (1 << 7)
2141
2142/* Used by PM_L4PER_I2C1_WKDEP */
2143#define OMAP54XX_WKUPDEP_I2C1_IRQ_IPU_SHIFT 1
2144#define OMAP54XX_WKUPDEP_I2C1_IRQ_IPU_WIDTH 0x1
2145#define OMAP54XX_WKUPDEP_I2C1_IRQ_IPU_MASK (1 << 1)
2146
2147/* Used by PM_L4PER_I2C1_WKDEP */
2148#define OMAP54XX_WKUPDEP_I2C1_IRQ_MPU_SHIFT 0
2149#define OMAP54XX_WKUPDEP_I2C1_IRQ_MPU_WIDTH 0x1
2150#define OMAP54XX_WKUPDEP_I2C1_IRQ_MPU_MASK (1 << 0)
2151
2152/* Used by PM_L4PER_I2C2_WKDEP */
2153#define OMAP54XX_WKUPDEP_I2C2_DMA_SDMA_SHIFT 7
2154#define OMAP54XX_WKUPDEP_I2C2_DMA_SDMA_WIDTH 0x1
2155#define OMAP54XX_WKUPDEP_I2C2_DMA_SDMA_MASK (1 << 7)
2156
2157/* Used by PM_L4PER_I2C2_WKDEP */
2158#define OMAP54XX_WKUPDEP_I2C2_IRQ_IPU_SHIFT 1
2159#define OMAP54XX_WKUPDEP_I2C2_IRQ_IPU_WIDTH 0x1
2160#define OMAP54XX_WKUPDEP_I2C2_IRQ_IPU_MASK (1 << 1)
2161
2162/* Used by PM_L4PER_I2C2_WKDEP */
2163#define OMAP54XX_WKUPDEP_I2C2_IRQ_MPU_SHIFT 0
2164#define OMAP54XX_WKUPDEP_I2C2_IRQ_MPU_WIDTH 0x1
2165#define OMAP54XX_WKUPDEP_I2C2_IRQ_MPU_MASK (1 << 0)
2166
2167/* Used by PM_L4PER_I2C3_WKDEP */
2168#define OMAP54XX_WKUPDEP_I2C3_DMA_SDMA_SHIFT 7
2169#define OMAP54XX_WKUPDEP_I2C3_DMA_SDMA_WIDTH 0x1
2170#define OMAP54XX_WKUPDEP_I2C3_DMA_SDMA_MASK (1 << 7)
2171
2172/* Used by PM_L4PER_I2C3_WKDEP */
2173#define OMAP54XX_WKUPDEP_I2C3_IRQ_IPU_SHIFT 1
2174#define OMAP54XX_WKUPDEP_I2C3_IRQ_IPU_WIDTH 0x1
2175#define OMAP54XX_WKUPDEP_I2C3_IRQ_IPU_MASK (1 << 1)
2176
2177/* Used by PM_L4PER_I2C3_WKDEP */
2178#define OMAP54XX_WKUPDEP_I2C3_IRQ_MPU_SHIFT 0
2179#define OMAP54XX_WKUPDEP_I2C3_IRQ_MPU_WIDTH 0x1
2180#define OMAP54XX_WKUPDEP_I2C3_IRQ_MPU_MASK (1 << 0)
2181
2182/* Used by PM_L4PER_I2C4_WKDEP */
2183#define OMAP54XX_WKUPDEP_I2C4_DMA_SDMA_SHIFT 7
2184#define OMAP54XX_WKUPDEP_I2C4_DMA_SDMA_WIDTH 0x1
2185#define OMAP54XX_WKUPDEP_I2C4_DMA_SDMA_MASK (1 << 7)
2186
2187/* Used by PM_L4PER_I2C4_WKDEP */
2188#define OMAP54XX_WKUPDEP_I2C4_IRQ_IPU_SHIFT 1
2189#define OMAP54XX_WKUPDEP_I2C4_IRQ_IPU_WIDTH 0x1
2190#define OMAP54XX_WKUPDEP_I2C4_IRQ_IPU_MASK (1 << 1)
2191
2192/* Used by PM_L4PER_I2C4_WKDEP */
2193#define OMAP54XX_WKUPDEP_I2C4_IRQ_MPU_SHIFT 0
2194#define OMAP54XX_WKUPDEP_I2C4_IRQ_MPU_WIDTH 0x1
2195#define OMAP54XX_WKUPDEP_I2C4_IRQ_MPU_MASK (1 << 0)
2196
2197/* Used by PM_L4PER_I2C5_WKDEP */
2198#define OMAP54XX_WKUPDEP_I2C5_IRQ_MPU_SHIFT 0
2199#define OMAP54XX_WKUPDEP_I2C5_IRQ_MPU_WIDTH 0x1
2200#define OMAP54XX_WKUPDEP_I2C5_IRQ_MPU_MASK (1 << 0)
2201
2202/* Used by PM_WKUPAON_KBD_WKDEP */
2203#define OMAP54XX_WKUPDEP_KBD_MPU_SHIFT 0
2204#define OMAP54XX_WKUPDEP_KBD_MPU_WIDTH 0x1
2205#define OMAP54XX_WKUPDEP_KBD_MPU_MASK (1 << 0)
2206
2207/* Used by PM_ABE_MCASP_WKDEP */
2208#define OMAP54XX_WKUPDEP_MCASP_DMA_DSP_SHIFT 6
2209#define OMAP54XX_WKUPDEP_MCASP_DMA_DSP_WIDTH 0x1
2210#define OMAP54XX_WKUPDEP_MCASP_DMA_DSP_MASK (1 << 6)
2211
2212/* Used by PM_ABE_MCASP_WKDEP */
2213#define OMAP54XX_WKUPDEP_MCASP_DMA_SDMA_SHIFT 7
2214#define OMAP54XX_WKUPDEP_MCASP_DMA_SDMA_WIDTH 0x1
2215#define OMAP54XX_WKUPDEP_MCASP_DMA_SDMA_MASK (1 << 7)
2216
2217/* Used by PM_ABE_MCASP_WKDEP */
2218#define OMAP54XX_WKUPDEP_MCASP_IRQ_DSP_SHIFT 2
2219#define OMAP54XX_WKUPDEP_MCASP_IRQ_DSP_WIDTH 0x1
2220#define OMAP54XX_WKUPDEP_MCASP_IRQ_DSP_MASK (1 << 2)
2221
2222/* Used by PM_ABE_MCASP_WKDEP */
2223#define OMAP54XX_WKUPDEP_MCASP_IRQ_MPU_SHIFT 0
2224#define OMAP54XX_WKUPDEP_MCASP_IRQ_MPU_WIDTH 0x1
2225#define OMAP54XX_WKUPDEP_MCASP_IRQ_MPU_MASK (1 << 0)
2226
2227/* Used by PM_ABE_MCBSP1_WKDEP */
2228#define OMAP54XX_WKUPDEP_MCBSP1_DSP_SHIFT 2
2229#define OMAP54XX_WKUPDEP_MCBSP1_DSP_WIDTH 0x1
2230#define OMAP54XX_WKUPDEP_MCBSP1_DSP_MASK (1 << 2)
2231
2232/* Used by PM_ABE_MCBSP1_WKDEP */
2233#define OMAP54XX_WKUPDEP_MCBSP1_MPU_SHIFT 0
2234#define OMAP54XX_WKUPDEP_MCBSP1_MPU_WIDTH 0x1
2235#define OMAP54XX_WKUPDEP_MCBSP1_MPU_MASK (1 << 0)
2236
2237/* Used by PM_ABE_MCBSP1_WKDEP */
2238#define OMAP54XX_WKUPDEP_MCBSP1_SDMA_SHIFT 3
2239#define OMAP54XX_WKUPDEP_MCBSP1_SDMA_WIDTH 0x1
2240#define OMAP54XX_WKUPDEP_MCBSP1_SDMA_MASK (1 << 3)
2241
2242/* Used by PM_ABE_MCBSP2_WKDEP */
2243#define OMAP54XX_WKUPDEP_MCBSP2_DSP_SHIFT 2
2244#define OMAP54XX_WKUPDEP_MCBSP2_DSP_WIDTH 0x1
2245#define OMAP54XX_WKUPDEP_MCBSP2_DSP_MASK (1 << 2)
2246
2247/* Used by PM_ABE_MCBSP2_WKDEP */
2248#define OMAP54XX_WKUPDEP_MCBSP2_MPU_SHIFT 0
2249#define OMAP54XX_WKUPDEP_MCBSP2_MPU_WIDTH 0x1
2250#define OMAP54XX_WKUPDEP_MCBSP2_MPU_MASK (1 << 0)
2251
2252/* Used by PM_ABE_MCBSP2_WKDEP */
2253#define OMAP54XX_WKUPDEP_MCBSP2_SDMA_SHIFT 3
2254#define OMAP54XX_WKUPDEP_MCBSP2_SDMA_WIDTH 0x1
2255#define OMAP54XX_WKUPDEP_MCBSP2_SDMA_MASK (1 << 3)
2256
2257/* Used by PM_ABE_MCBSP3_WKDEP */
2258#define OMAP54XX_WKUPDEP_MCBSP3_DSP_SHIFT 2
2259#define OMAP54XX_WKUPDEP_MCBSP3_DSP_WIDTH 0x1
2260#define OMAP54XX_WKUPDEP_MCBSP3_DSP_MASK (1 << 2)
2261
2262/* Used by PM_ABE_MCBSP3_WKDEP */
2263#define OMAP54XX_WKUPDEP_MCBSP3_MPU_SHIFT 0
2264#define OMAP54XX_WKUPDEP_MCBSP3_MPU_WIDTH 0x1
2265#define OMAP54XX_WKUPDEP_MCBSP3_MPU_MASK (1 << 0)
2266
2267/* Used by PM_ABE_MCBSP3_WKDEP */
2268#define OMAP54XX_WKUPDEP_MCBSP3_SDMA_SHIFT 3
2269#define OMAP54XX_WKUPDEP_MCBSP3_SDMA_WIDTH 0x1
2270#define OMAP54XX_WKUPDEP_MCBSP3_SDMA_MASK (1 << 3)
2271
2272/* Used by PM_ABE_MCPDM_WKDEP */
2273#define OMAP54XX_WKUPDEP_MCPDM_DMA_DSP_SHIFT 6
2274#define OMAP54XX_WKUPDEP_MCPDM_DMA_DSP_WIDTH 0x1
2275#define OMAP54XX_WKUPDEP_MCPDM_DMA_DSP_MASK (1 << 6)
2276
2277/* Used by PM_ABE_MCPDM_WKDEP */
2278#define OMAP54XX_WKUPDEP_MCPDM_DMA_SDMA_SHIFT 7
2279#define OMAP54XX_WKUPDEP_MCPDM_DMA_SDMA_WIDTH 0x1
2280#define OMAP54XX_WKUPDEP_MCPDM_DMA_SDMA_MASK (1 << 7)
2281
2282/* Used by PM_ABE_MCPDM_WKDEP */
2283#define OMAP54XX_WKUPDEP_MCPDM_IRQ_DSP_SHIFT 2
2284#define OMAP54XX_WKUPDEP_MCPDM_IRQ_DSP_WIDTH 0x1
2285#define OMAP54XX_WKUPDEP_MCPDM_IRQ_DSP_MASK (1 << 2)
2286
2287/* Used by PM_ABE_MCPDM_WKDEP */
2288#define OMAP54XX_WKUPDEP_MCPDM_IRQ_MPU_SHIFT 0
2289#define OMAP54XX_WKUPDEP_MCPDM_IRQ_MPU_WIDTH 0x1
2290#define OMAP54XX_WKUPDEP_MCPDM_IRQ_MPU_MASK (1 << 0)
2291
2292/* Used by PM_L4PER_MCSPI1_WKDEP */
2293#define OMAP54XX_WKUPDEP_MCSPI1_DSP_SHIFT 2
2294#define OMAP54XX_WKUPDEP_MCSPI1_DSP_WIDTH 0x1
2295#define OMAP54XX_WKUPDEP_MCSPI1_DSP_MASK (1 << 2)
2296
2297/* Used by PM_L4PER_MCSPI1_WKDEP */
2298#define OMAP54XX_WKUPDEP_MCSPI1_IPU_SHIFT 1
2299#define OMAP54XX_WKUPDEP_MCSPI1_IPU_WIDTH 0x1
2300#define OMAP54XX_WKUPDEP_MCSPI1_IPU_MASK (1 << 1)
2301
2302/* Used by PM_L4PER_MCSPI1_WKDEP */
2303#define OMAP54XX_WKUPDEP_MCSPI1_MPU_SHIFT 0
2304#define OMAP54XX_WKUPDEP_MCSPI1_MPU_WIDTH 0x1
2305#define OMAP54XX_WKUPDEP_MCSPI1_MPU_MASK (1 << 0)
2306
2307/* Used by PM_L4PER_MCSPI1_WKDEP */
2308#define OMAP54XX_WKUPDEP_MCSPI1_SDMA_SHIFT 3
2309#define OMAP54XX_WKUPDEP_MCSPI1_SDMA_WIDTH 0x1
2310#define OMAP54XX_WKUPDEP_MCSPI1_SDMA_MASK (1 << 3)
2311
2312/* Used by PM_L4PER_MCSPI2_WKDEP */
2313#define OMAP54XX_WKUPDEP_MCSPI2_IPU_SHIFT 1
2314#define OMAP54XX_WKUPDEP_MCSPI2_IPU_WIDTH 0x1
2315#define OMAP54XX_WKUPDEP_MCSPI2_IPU_MASK (1 << 1)
2316
2317/* Used by PM_L4PER_MCSPI2_WKDEP */
2318#define OMAP54XX_WKUPDEP_MCSPI2_MPU_SHIFT 0
2319#define OMAP54XX_WKUPDEP_MCSPI2_MPU_WIDTH 0x1
2320#define OMAP54XX_WKUPDEP_MCSPI2_MPU_MASK (1 << 0)
2321
2322/* Used by PM_L4PER_MCSPI2_WKDEP */
2323#define OMAP54XX_WKUPDEP_MCSPI2_SDMA_SHIFT 3
2324#define OMAP54XX_WKUPDEP_MCSPI2_SDMA_WIDTH 0x1
2325#define OMAP54XX_WKUPDEP_MCSPI2_SDMA_MASK (1 << 3)
2326
2327/* Used by PM_L4PER_MCSPI3_WKDEP */
2328#define OMAP54XX_WKUPDEP_MCSPI3_MPU_SHIFT 0
2329#define OMAP54XX_WKUPDEP_MCSPI3_MPU_WIDTH 0x1
2330#define OMAP54XX_WKUPDEP_MCSPI3_MPU_MASK (1 << 0)
2331
2332/* Used by PM_L4PER_MCSPI3_WKDEP */
2333#define OMAP54XX_WKUPDEP_MCSPI3_SDMA_SHIFT 3
2334#define OMAP54XX_WKUPDEP_MCSPI3_SDMA_WIDTH 0x1
2335#define OMAP54XX_WKUPDEP_MCSPI3_SDMA_MASK (1 << 3)
2336
2337/* Used by PM_L4PER_MCSPI4_WKDEP */
2338#define OMAP54XX_WKUPDEP_MCSPI4_MPU_SHIFT 0
2339#define OMAP54XX_WKUPDEP_MCSPI4_MPU_WIDTH 0x1
2340#define OMAP54XX_WKUPDEP_MCSPI4_MPU_MASK (1 << 0)
2341
2342/* Used by PM_L4PER_MCSPI4_WKDEP */
2343#define OMAP54XX_WKUPDEP_MCSPI4_SDMA_SHIFT 3
2344#define OMAP54XX_WKUPDEP_MCSPI4_SDMA_WIDTH 0x1
2345#define OMAP54XX_WKUPDEP_MCSPI4_SDMA_MASK (1 << 3)
2346
2347/* Used by PM_L3INIT_MMC1_WKDEP */
2348#define OMAP54XX_WKUPDEP_MMC1_DSP_SHIFT 2
2349#define OMAP54XX_WKUPDEP_MMC1_DSP_WIDTH 0x1
2350#define OMAP54XX_WKUPDEP_MMC1_DSP_MASK (1 << 2)
2351
2352/* Used by PM_L3INIT_MMC1_WKDEP */
2353#define OMAP54XX_WKUPDEP_MMC1_IPU_SHIFT 1
2354#define OMAP54XX_WKUPDEP_MMC1_IPU_WIDTH 0x1
2355#define OMAP54XX_WKUPDEP_MMC1_IPU_MASK (1 << 1)
2356
2357/* Used by PM_L3INIT_MMC1_WKDEP */
2358#define OMAP54XX_WKUPDEP_MMC1_MPU_SHIFT 0
2359#define OMAP54XX_WKUPDEP_MMC1_MPU_WIDTH 0x1
2360#define OMAP54XX_WKUPDEP_MMC1_MPU_MASK (1 << 0)
2361
2362/* Used by PM_L3INIT_MMC1_WKDEP */
2363#define OMAP54XX_WKUPDEP_MMC1_SDMA_SHIFT 3
2364#define OMAP54XX_WKUPDEP_MMC1_SDMA_WIDTH 0x1
2365#define OMAP54XX_WKUPDEP_MMC1_SDMA_MASK (1 << 3)
2366
2367/* Used by PM_L3INIT_MMC2_WKDEP */
2368#define OMAP54XX_WKUPDEP_MMC2_DSP_SHIFT 2
2369#define OMAP54XX_WKUPDEP_MMC2_DSP_WIDTH 0x1
2370#define OMAP54XX_WKUPDEP_MMC2_DSP_MASK (1 << 2)
2371
2372/* Used by PM_L3INIT_MMC2_WKDEP */
2373#define OMAP54XX_WKUPDEP_MMC2_IPU_SHIFT 1
2374#define OMAP54XX_WKUPDEP_MMC2_IPU_WIDTH 0x1
2375#define OMAP54XX_WKUPDEP_MMC2_IPU_MASK (1 << 1)
2376
2377/* Used by PM_L3INIT_MMC2_WKDEP */
2378#define OMAP54XX_WKUPDEP_MMC2_MPU_SHIFT 0
2379#define OMAP54XX_WKUPDEP_MMC2_MPU_WIDTH 0x1
2380#define OMAP54XX_WKUPDEP_MMC2_MPU_MASK (1 << 0)
2381
2382/* Used by PM_L3INIT_MMC2_WKDEP */
2383#define OMAP54XX_WKUPDEP_MMC2_SDMA_SHIFT 3
2384#define OMAP54XX_WKUPDEP_MMC2_SDMA_WIDTH 0x1
2385#define OMAP54XX_WKUPDEP_MMC2_SDMA_MASK (1 << 3)
2386
2387/* Used by PM_L4PER_MMC3_WKDEP */
2388#define OMAP54XX_WKUPDEP_MMC3_IPU_SHIFT 1
2389#define OMAP54XX_WKUPDEP_MMC3_IPU_WIDTH 0x1
2390#define OMAP54XX_WKUPDEP_MMC3_IPU_MASK (1 << 1)
2391
2392/* Used by PM_L4PER_MMC3_WKDEP */
2393#define OMAP54XX_WKUPDEP_MMC3_MPU_SHIFT 0
2394#define OMAP54XX_WKUPDEP_MMC3_MPU_WIDTH 0x1
2395#define OMAP54XX_WKUPDEP_MMC3_MPU_MASK (1 << 0)
2396
2397/* Used by PM_L4PER_MMC3_WKDEP */
2398#define OMAP54XX_WKUPDEP_MMC3_SDMA_SHIFT 3
2399#define OMAP54XX_WKUPDEP_MMC3_SDMA_WIDTH 0x1
2400#define OMAP54XX_WKUPDEP_MMC3_SDMA_MASK (1 << 3)
2401
2402/* Used by PM_L4PER_MMC4_WKDEP */
2403#define OMAP54XX_WKUPDEP_MMC4_MPU_SHIFT 0
2404#define OMAP54XX_WKUPDEP_MMC4_MPU_WIDTH 0x1
2405#define OMAP54XX_WKUPDEP_MMC4_MPU_MASK (1 << 0)
2406
2407/* Used by PM_L4PER_MMC4_WKDEP */
2408#define OMAP54XX_WKUPDEP_MMC4_SDMA_SHIFT 3
2409#define OMAP54XX_WKUPDEP_MMC4_SDMA_WIDTH 0x1
2410#define OMAP54XX_WKUPDEP_MMC4_SDMA_MASK (1 << 3)
2411
2412/* Used by PM_L4PER_MMC5_WKDEP */
2413#define OMAP54XX_WKUPDEP_MMC5_MPU_SHIFT 0
2414#define OMAP54XX_WKUPDEP_MMC5_MPU_WIDTH 0x1
2415#define OMAP54XX_WKUPDEP_MMC5_MPU_MASK (1 << 0)
2416
2417/* Used by PM_L4PER_MMC5_WKDEP */
2418#define OMAP54XX_WKUPDEP_MMC5_SDMA_SHIFT 3
2419#define OMAP54XX_WKUPDEP_MMC5_SDMA_WIDTH 0x1
2420#define OMAP54XX_WKUPDEP_MMC5_SDMA_MASK (1 << 3)
2421
2422/* Used by PM_L3INIT_SATA_WKDEP */
2423#define OMAP54XX_WKUPDEP_SATA_MPU_SHIFT 0
2424#define OMAP54XX_WKUPDEP_SATA_MPU_WIDTH 0x1
2425#define OMAP54XX_WKUPDEP_SATA_MPU_MASK (1 << 0)
2426
2427/* Used by PM_ABE_SLIMBUS1_WKDEP */
2428#define OMAP54XX_WKUPDEP_SLIMBUS1_DMA_DSP_SHIFT 6
2429#define OMAP54XX_WKUPDEP_SLIMBUS1_DMA_DSP_WIDTH 0x1
2430#define OMAP54XX_WKUPDEP_SLIMBUS1_DMA_DSP_MASK (1 << 6)
2431
2432/* Used by PM_ABE_SLIMBUS1_WKDEP */
2433#define OMAP54XX_WKUPDEP_SLIMBUS1_DMA_SDMA_SHIFT 7
2434#define OMAP54XX_WKUPDEP_SLIMBUS1_DMA_SDMA_WIDTH 0x1
2435#define OMAP54XX_WKUPDEP_SLIMBUS1_DMA_SDMA_MASK (1 << 7)
2436
2437/* Used by PM_ABE_SLIMBUS1_WKDEP */
2438#define OMAP54XX_WKUPDEP_SLIMBUS1_IRQ_DSP_SHIFT 2
2439#define OMAP54XX_WKUPDEP_SLIMBUS1_IRQ_DSP_WIDTH 0x1
2440#define OMAP54XX_WKUPDEP_SLIMBUS1_IRQ_DSP_MASK (1 << 2)
2441
2442/* Used by PM_ABE_SLIMBUS1_WKDEP */
2443#define OMAP54XX_WKUPDEP_SLIMBUS1_IRQ_MPU_SHIFT 0
2444#define OMAP54XX_WKUPDEP_SLIMBUS1_IRQ_MPU_WIDTH 0x1
2445#define OMAP54XX_WKUPDEP_SLIMBUS1_IRQ_MPU_MASK (1 << 0)
2446
2447/* Used by PM_COREAON_SMARTREFLEX_CORE_WKDEP */
2448#define OMAP54XX_WKUPDEP_SMARTREFLEX_CORE_IPU_SHIFT 1
2449#define OMAP54XX_WKUPDEP_SMARTREFLEX_CORE_IPU_WIDTH 0x1
2450#define OMAP54XX_WKUPDEP_SMARTREFLEX_CORE_IPU_MASK (1 << 1)
2451
2452/* Used by PM_COREAON_SMARTREFLEX_CORE_WKDEP */
2453#define OMAP54XX_WKUPDEP_SMARTREFLEX_CORE_MPU_SHIFT 0
2454#define OMAP54XX_WKUPDEP_SMARTREFLEX_CORE_MPU_WIDTH 0x1
2455#define OMAP54XX_WKUPDEP_SMARTREFLEX_CORE_MPU_MASK (1 << 0)
2456
2457/* Used by PM_COREAON_SMARTREFLEX_MM_WKDEP */
2458#define OMAP54XX_WKUPDEP_SMARTREFLEX_MM_MPU_SHIFT 0
2459#define OMAP54XX_WKUPDEP_SMARTREFLEX_MM_MPU_WIDTH 0x1
2460#define OMAP54XX_WKUPDEP_SMARTREFLEX_MM_MPU_MASK (1 << 0)
2461
2462/* Used by PM_COREAON_SMARTREFLEX_MPU_WKDEP */
2463#define OMAP54XX_WKUPDEP_SMARTREFLEX_MPU_MPU_SHIFT 0
2464#define OMAP54XX_WKUPDEP_SMARTREFLEX_MPU_MPU_WIDTH 0x1
2465#define OMAP54XX_WKUPDEP_SMARTREFLEX_MPU_MPU_MASK (1 << 0)
2466
2467/* Used by PM_L4PER_TIMER10_WKDEP */
2468#define OMAP54XX_WKUPDEP_TIMER10_MPU_SHIFT 0
2469#define OMAP54XX_WKUPDEP_TIMER10_MPU_WIDTH 0x1
2470#define OMAP54XX_WKUPDEP_TIMER10_MPU_MASK (1 << 0)
2471
2472/* Used by PM_L4PER_TIMER11_WKDEP */
2473#define OMAP54XX_WKUPDEP_TIMER11_IPU_SHIFT 1
2474#define OMAP54XX_WKUPDEP_TIMER11_IPU_WIDTH 0x1
2475#define OMAP54XX_WKUPDEP_TIMER11_IPU_MASK (1 << 1)
2476
2477/* Used by PM_L4PER_TIMER11_WKDEP */
2478#define OMAP54XX_WKUPDEP_TIMER11_MPU_SHIFT 0
2479#define OMAP54XX_WKUPDEP_TIMER11_MPU_WIDTH 0x1
2480#define OMAP54XX_WKUPDEP_TIMER11_MPU_MASK (1 << 0)
2481
2482/* Used by PM_WKUPAON_TIMER12_WKDEP */
2483#define OMAP54XX_WKUPDEP_TIMER12_MPU_SHIFT 0
2484#define OMAP54XX_WKUPDEP_TIMER12_MPU_WIDTH 0x1
2485#define OMAP54XX_WKUPDEP_TIMER12_MPU_MASK (1 << 0)
2486
2487/* Used by PM_WKUPAON_TIMER1_WKDEP */
2488#define OMAP54XX_WKUPDEP_TIMER1_MPU_SHIFT 0
2489#define OMAP54XX_WKUPDEP_TIMER1_MPU_WIDTH 0x1
2490#define OMAP54XX_WKUPDEP_TIMER1_MPU_MASK (1 << 0)
2491
2492/* Used by PM_L4PER_TIMER2_WKDEP */
2493#define OMAP54XX_WKUPDEP_TIMER2_MPU_SHIFT 0
2494#define OMAP54XX_WKUPDEP_TIMER2_MPU_WIDTH 0x1
2495#define OMAP54XX_WKUPDEP_TIMER2_MPU_MASK (1 << 0)
2496
2497/* Used by PM_L4PER_TIMER3_WKDEP */
2498#define OMAP54XX_WKUPDEP_TIMER3_IPU_SHIFT 1
2499#define OMAP54XX_WKUPDEP_TIMER3_IPU_WIDTH 0x1
2500#define OMAP54XX_WKUPDEP_TIMER3_IPU_MASK (1 << 1)
2501
2502/* Used by PM_L4PER_TIMER3_WKDEP */
2503#define OMAP54XX_WKUPDEP_TIMER3_MPU_SHIFT 0
2504#define OMAP54XX_WKUPDEP_TIMER3_MPU_WIDTH 0x1
2505#define OMAP54XX_WKUPDEP_TIMER3_MPU_MASK (1 << 0)
2506
2507/* Used by PM_L4PER_TIMER4_WKDEP */
2508#define OMAP54XX_WKUPDEP_TIMER4_IPU_SHIFT 1
2509#define OMAP54XX_WKUPDEP_TIMER4_IPU_WIDTH 0x1
2510#define OMAP54XX_WKUPDEP_TIMER4_IPU_MASK (1 << 1)
2511
2512/* Used by PM_L4PER_TIMER4_WKDEP */
2513#define OMAP54XX_WKUPDEP_TIMER4_MPU_SHIFT 0
2514#define OMAP54XX_WKUPDEP_TIMER4_MPU_WIDTH 0x1
2515#define OMAP54XX_WKUPDEP_TIMER4_MPU_MASK (1 << 0)
2516
2517/* Used by PM_ABE_TIMER5_WKDEP */
2518#define OMAP54XX_WKUPDEP_TIMER5_DSP_SHIFT 2
2519#define OMAP54XX_WKUPDEP_TIMER5_DSP_WIDTH 0x1
2520#define OMAP54XX_WKUPDEP_TIMER5_DSP_MASK (1 << 2)
2521
2522/* Used by PM_ABE_TIMER5_WKDEP */
2523#define OMAP54XX_WKUPDEP_TIMER5_MPU_SHIFT 0
2524#define OMAP54XX_WKUPDEP_TIMER5_MPU_WIDTH 0x1
2525#define OMAP54XX_WKUPDEP_TIMER5_MPU_MASK (1 << 0)
2526
2527/* Used by PM_ABE_TIMER6_WKDEP */
2528#define OMAP54XX_WKUPDEP_TIMER6_DSP_SHIFT 2
2529#define OMAP54XX_WKUPDEP_TIMER6_DSP_WIDTH 0x1
2530#define OMAP54XX_WKUPDEP_TIMER6_DSP_MASK (1 << 2)
2531
2532/* Used by PM_ABE_TIMER6_WKDEP */
2533#define OMAP54XX_WKUPDEP_TIMER6_MPU_SHIFT 0
2534#define OMAP54XX_WKUPDEP_TIMER6_MPU_WIDTH 0x1
2535#define OMAP54XX_WKUPDEP_TIMER6_MPU_MASK (1 << 0)
2536
2537/* Used by PM_ABE_TIMER7_WKDEP */
2538#define OMAP54XX_WKUPDEP_TIMER7_DSP_SHIFT 2
2539#define OMAP54XX_WKUPDEP_TIMER7_DSP_WIDTH 0x1
2540#define OMAP54XX_WKUPDEP_TIMER7_DSP_MASK (1 << 2)
2541
2542/* Used by PM_ABE_TIMER7_WKDEP */
2543#define OMAP54XX_WKUPDEP_TIMER7_MPU_SHIFT 0
2544#define OMAP54XX_WKUPDEP_TIMER7_MPU_WIDTH 0x1
2545#define OMAP54XX_WKUPDEP_TIMER7_MPU_MASK (1 << 0)
2546
2547/* Used by PM_ABE_TIMER8_WKDEP */
2548#define OMAP54XX_WKUPDEP_TIMER8_DSP_SHIFT 2
2549#define OMAP54XX_WKUPDEP_TIMER8_DSP_WIDTH 0x1
2550#define OMAP54XX_WKUPDEP_TIMER8_DSP_MASK (1 << 2)
2551
2552/* Used by PM_ABE_TIMER8_WKDEP */
2553#define OMAP54XX_WKUPDEP_TIMER8_MPU_SHIFT 0
2554#define OMAP54XX_WKUPDEP_TIMER8_MPU_WIDTH 0x1
2555#define OMAP54XX_WKUPDEP_TIMER8_MPU_MASK (1 << 0)
2556
2557/* Used by PM_L4PER_TIMER9_WKDEP */
2558#define OMAP54XX_WKUPDEP_TIMER9_IPU_SHIFT 1
2559#define OMAP54XX_WKUPDEP_TIMER9_IPU_WIDTH 0x1
2560#define OMAP54XX_WKUPDEP_TIMER9_IPU_MASK (1 << 1)
2561
2562/* Used by PM_L4PER_TIMER9_WKDEP */
2563#define OMAP54XX_WKUPDEP_TIMER9_MPU_SHIFT 0
2564#define OMAP54XX_WKUPDEP_TIMER9_MPU_WIDTH 0x1
2565#define OMAP54XX_WKUPDEP_TIMER9_MPU_MASK (1 << 0)
2566
2567/* Used by PM_L4PER_UART1_WKDEP */
2568#define OMAP54XX_WKUPDEP_UART1_MPU_SHIFT 0
2569#define OMAP54XX_WKUPDEP_UART1_MPU_WIDTH 0x1
2570#define OMAP54XX_WKUPDEP_UART1_MPU_MASK (1 << 0)
2571
2572/* Used by PM_L4PER_UART1_WKDEP */
2573#define OMAP54XX_WKUPDEP_UART1_SDMA_SHIFT 3
2574#define OMAP54XX_WKUPDEP_UART1_SDMA_WIDTH 0x1
2575#define OMAP54XX_WKUPDEP_UART1_SDMA_MASK (1 << 3)
2576
2577/* Used by PM_L4PER_UART2_WKDEP */
2578#define OMAP54XX_WKUPDEP_UART2_MPU_SHIFT 0
2579#define OMAP54XX_WKUPDEP_UART2_MPU_WIDTH 0x1
2580#define OMAP54XX_WKUPDEP_UART2_MPU_MASK (1 << 0)
2581
2582/* Used by PM_L4PER_UART2_WKDEP */
2583#define OMAP54XX_WKUPDEP_UART2_SDMA_SHIFT 3
2584#define OMAP54XX_WKUPDEP_UART2_SDMA_WIDTH 0x1
2585#define OMAP54XX_WKUPDEP_UART2_SDMA_MASK (1 << 3)
2586
2587/* Used by PM_L4PER_UART3_WKDEP */
2588#define OMAP54XX_WKUPDEP_UART3_DSP_SHIFT 2
2589#define OMAP54XX_WKUPDEP_UART3_DSP_WIDTH 0x1
2590#define OMAP54XX_WKUPDEP_UART3_DSP_MASK (1 << 2)
2591
2592/* Used by PM_L4PER_UART3_WKDEP */
2593#define OMAP54XX_WKUPDEP_UART3_IPU_SHIFT 1
2594#define OMAP54XX_WKUPDEP_UART3_IPU_WIDTH 0x1
2595#define OMAP54XX_WKUPDEP_UART3_IPU_MASK (1 << 1)
2596
2597/* Used by PM_L4PER_UART3_WKDEP */
2598#define OMAP54XX_WKUPDEP_UART3_MPU_SHIFT 0
2599#define OMAP54XX_WKUPDEP_UART3_MPU_WIDTH 0x1
2600#define OMAP54XX_WKUPDEP_UART3_MPU_MASK (1 << 0)
2601
2602/* Used by PM_L4PER_UART3_WKDEP */
2603#define OMAP54XX_WKUPDEP_UART3_SDMA_SHIFT 3
2604#define OMAP54XX_WKUPDEP_UART3_SDMA_WIDTH 0x1
2605#define OMAP54XX_WKUPDEP_UART3_SDMA_MASK (1 << 3)
2606
2607/* Used by PM_L4PER_UART4_WKDEP */
2608#define OMAP54XX_WKUPDEP_UART4_MPU_SHIFT 0
2609#define OMAP54XX_WKUPDEP_UART4_MPU_WIDTH 0x1
2610#define OMAP54XX_WKUPDEP_UART4_MPU_MASK (1 << 0)
2611
2612/* Used by PM_L4PER_UART4_WKDEP */
2613#define OMAP54XX_WKUPDEP_UART4_SDMA_SHIFT 3
2614#define OMAP54XX_WKUPDEP_UART4_SDMA_WIDTH 0x1
2615#define OMAP54XX_WKUPDEP_UART4_SDMA_MASK (1 << 3)
2616
2617/* Used by PM_L4PER_UART5_WKDEP */
2618#define OMAP54XX_WKUPDEP_UART5_MPU_SHIFT 0
2619#define OMAP54XX_WKUPDEP_UART5_MPU_WIDTH 0x1
2620#define OMAP54XX_WKUPDEP_UART5_MPU_MASK (1 << 0)
2621
2622/* Used by PM_L4PER_UART5_WKDEP */
2623#define OMAP54XX_WKUPDEP_UART5_SDMA_SHIFT 3
2624#define OMAP54XX_WKUPDEP_UART5_SDMA_WIDTH 0x1
2625#define OMAP54XX_WKUPDEP_UART5_SDMA_MASK (1 << 3)
2626
2627/* Used by PM_L4PER_UART6_WKDEP */
2628#define OMAP54XX_WKUPDEP_UART6_MPU_SHIFT 0
2629#define OMAP54XX_WKUPDEP_UART6_MPU_WIDTH 0x1
2630#define OMAP54XX_WKUPDEP_UART6_MPU_MASK (1 << 0)
2631
2632/* Used by PM_L4PER_UART6_WKDEP */
2633#define OMAP54XX_WKUPDEP_UART6_SDMA_SHIFT 3
2634#define OMAP54XX_WKUPDEP_UART6_SDMA_WIDTH 0x1
2635#define OMAP54XX_WKUPDEP_UART6_SDMA_MASK (1 << 3)
2636
2637/* Used by PM_L3INIT_UNIPRO2_WKDEP */
2638#define OMAP54XX_WKUPDEP_UNIPRO2_MPU_SHIFT 0
2639#define OMAP54XX_WKUPDEP_UNIPRO2_MPU_WIDTH 0x1
2640#define OMAP54XX_WKUPDEP_UNIPRO2_MPU_MASK (1 << 0)
2641
2642/* Used by PM_L3INIT_USB_HOST_HS_WKDEP */
2643#define OMAP54XX_WKUPDEP_USB_HOST_HS_IPU_SHIFT 1
2644#define OMAP54XX_WKUPDEP_USB_HOST_HS_IPU_WIDTH 0x1
2645#define OMAP54XX_WKUPDEP_USB_HOST_HS_IPU_MASK (1 << 1)
2646
2647/* Used by PM_L3INIT_USB_HOST_HS_WKDEP */
2648#define OMAP54XX_WKUPDEP_USB_HOST_HS_MPU_SHIFT 0
2649#define OMAP54XX_WKUPDEP_USB_HOST_HS_MPU_WIDTH 0x1
2650#define OMAP54XX_WKUPDEP_USB_HOST_HS_MPU_MASK (1 << 0)
2651
2652/* Used by PM_L3INIT_USB_OTG_SS_WKDEP */
2653#define OMAP54XX_WKUPDEP_USB_OTG_SS_IPU_SHIFT 1
2654#define OMAP54XX_WKUPDEP_USB_OTG_SS_IPU_WIDTH 0x1
2655#define OMAP54XX_WKUPDEP_USB_OTG_SS_IPU_MASK (1 << 1)
2656
2657/* Used by PM_L3INIT_USB_OTG_SS_WKDEP */
2658#define OMAP54XX_WKUPDEP_USB_OTG_SS_MPU_SHIFT 0
2659#define OMAP54XX_WKUPDEP_USB_OTG_SS_MPU_WIDTH 0x1
2660#define OMAP54XX_WKUPDEP_USB_OTG_SS_MPU_MASK (1 << 0)
2661
2662/* Used by PM_L3INIT_USB_TLL_HS_WKDEP */
2663#define OMAP54XX_WKUPDEP_USB_TLL_HS_IPU_SHIFT 1
2664#define OMAP54XX_WKUPDEP_USB_TLL_HS_IPU_WIDTH 0x1
2665#define OMAP54XX_WKUPDEP_USB_TLL_HS_IPU_MASK (1 << 1)
2666
2667/* Used by PM_L3INIT_USB_TLL_HS_WKDEP */
2668#define OMAP54XX_WKUPDEP_USB_TLL_HS_MPU_SHIFT 0
2669#define OMAP54XX_WKUPDEP_USB_TLL_HS_MPU_WIDTH 0x1
2670#define OMAP54XX_WKUPDEP_USB_TLL_HS_MPU_MASK (1 << 0)
2671
2672/* Used by PM_WKUPAON_WD_TIMER2_WKDEP */
2673#define OMAP54XX_WKUPDEP_WD_TIMER2_MPU_SHIFT 0
2674#define OMAP54XX_WKUPDEP_WD_TIMER2_MPU_WIDTH 0x1
2675#define OMAP54XX_WKUPDEP_WD_TIMER2_MPU_MASK (1 << 0)
2676
2677/* Used by PM_ABE_WD_TIMER3_WKDEP */
2678#define OMAP54XX_WKUPDEP_WD_TIMER3_MPU_SHIFT 0
2679#define OMAP54XX_WKUPDEP_WD_TIMER3_MPU_WIDTH 0x1
2680#define OMAP54XX_WKUPDEP_WD_TIMER3_MPU_MASK (1 << 0)
2681
2682/* Used by PRM_IO_PMCTRL */
2683#define OMAP54XX_WUCLK_CTRL_SHIFT 8
2684#define OMAP54XX_WUCLK_CTRL_WIDTH 0x1
2685#define OMAP54XX_WUCLK_CTRL_MASK (1 << 8)
2686
2687/* Used by PRM_IO_PMCTRL */
2688#define OMAP54XX_WUCLK_STATUS_SHIFT 9
2689#define OMAP54XX_WUCLK_STATUS_WIDTH 0x1
2690#define OMAP54XX_WUCLK_STATUS_MASK (1 << 9)
2691
2692/* Used by REVISION_PRM */
2693#define OMAP54XX_X_MAJOR_SHIFT 8
2694#define OMAP54XX_X_MAJOR_WIDTH 0x3
2695#define OMAP54XX_X_MAJOR_MASK (0x7 << 8)
2696
2697/* Used by REVISION_PRM */
2698#define OMAP54XX_Y_MINOR_SHIFT 0
2699#define OMAP54XX_Y_MINOR_WIDTH 0x6
2700#define OMAP54XX_Y_MINOR_MASK (0x3f << 0)
2701#endif
diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c
index 415c7e0c9393..03a603476cfc 100644
--- a/arch/arm/mach-omap2/prm44xx.c
+++ b/arch/arm/mach-omap2/prm44xx.c
@@ -620,6 +620,15 @@ static int omap4_pwrdm_wait_transition(struct powerdomain *pwrdm)
620 return 0; 620 return 0;
621} 621}
622 622
623static int omap4_check_vcvp(void)
624{
625 /* No VC/VP on dra7xx devices */
626 if (soc_is_dra7xx())
627 return 0;
628
629 return 1;
630}
631
623struct pwrdm_ops omap4_pwrdm_operations = { 632struct pwrdm_ops omap4_pwrdm_operations = {
624 .pwrdm_set_next_pwrst = omap4_pwrdm_set_next_pwrst, 633 .pwrdm_set_next_pwrst = omap4_pwrdm_set_next_pwrst,
625 .pwrdm_read_next_pwrst = omap4_pwrdm_read_next_pwrst, 634 .pwrdm_read_next_pwrst = omap4_pwrdm_read_next_pwrst,
@@ -637,6 +646,7 @@ struct pwrdm_ops omap4_pwrdm_operations = {
637 .pwrdm_set_mem_onst = omap4_pwrdm_set_mem_onst, 646 .pwrdm_set_mem_onst = omap4_pwrdm_set_mem_onst,
638 .pwrdm_set_mem_retst = omap4_pwrdm_set_mem_retst, 647 .pwrdm_set_mem_retst = omap4_pwrdm_set_mem_retst,
639 .pwrdm_wait_transition = omap4_pwrdm_wait_transition, 648 .pwrdm_wait_transition = omap4_pwrdm_wait_transition,
649 .pwrdm_has_voltdm = omap4_check_vcvp,
640}; 650};
641 651
642/* 652/*
@@ -650,7 +660,7 @@ static struct prm_ll_data omap44xx_prm_ll_data = {
650 660
651int __init omap44xx_prm_init(void) 661int __init omap44xx_prm_init(void)
652{ 662{
653 if (!cpu_is_omap44xx() && !soc_is_omap54xx()) 663 if (!cpu_is_omap44xx() && !soc_is_omap54xx() && !soc_is_dra7xx())
654 return 0; 664 return 0;
655 665
656 return prm_register(&omap44xx_prm_ll_data); 666 return prm_register(&omap44xx_prm_ll_data);
diff --git a/arch/arm/mach-omap2/prm7xx.h b/arch/arm/mach-omap2/prm7xx.h
new file mode 100644
index 000000000000..d92a8404edc7
--- /dev/null
+++ b/arch/arm/mach-omap2/prm7xx.h
@@ -0,0 +1,678 @@
1/*
2 * DRA7xx PRM instance offset macros
3 *
4 * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com
5 *
6 * Generated by code originally written by:
7 * Paul Walmsley (paul@pwsan.com)
8 * Rajendra Nayak (rnayak@ti.com)
9 * Benoit Cousson (b-cousson@ti.com)
10 *
11 * This file is automatically generated from the OMAP hardware databases.
12 * We respectfully ask that any modifications to this file be coordinated
13 * with the public linux-omap@vger.kernel.org mailing list and the
14 * authors above to ensure that the autogeneration scripts are kept
15 * up-to-date with the file contents.
16 *
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License version 2 as
19 * published by the Free Software Foundation.
20 */
21
22#ifndef __ARCH_ARM_MACH_OMAP2_PRM7XX_H
23#define __ARCH_ARM_MACH_OMAP2_PRM7XX_H
24
25#include "prm44xx_54xx.h"
26#include "prcm-common.h"
27#include "prm.h"
28
29#define DRA7XX_PRM_BASE 0x4ae06000
30
31#define DRA7XX_PRM_REGADDR(inst, reg) \
32 OMAP2_L4_IO_ADDRESS(DRA7XX_PRM_BASE + (inst) + (reg))
33
34
35/* PRM instances */
36#define DRA7XX_PRM_OCP_SOCKET_INST 0x0000
37#define DRA7XX_PRM_CKGEN_INST 0x0100
38#define DRA7XX_PRM_MPU_INST 0x0300
39#define DRA7XX_PRM_DSP1_INST 0x0400
40#define DRA7XX_PRM_IPU_INST 0x0500
41#define DRA7XX_PRM_COREAON_INST 0x0628
42#define DRA7XX_PRM_CORE_INST 0x0700
43#define DRA7XX_PRM_IVA_INST 0x0f00
44#define DRA7XX_PRM_CAM_INST 0x1000
45#define DRA7XX_PRM_DSS_INST 0x1100
46#define DRA7XX_PRM_GPU_INST 0x1200
47#define DRA7XX_PRM_L3INIT_INST 0x1300
48#define DRA7XX_PRM_L4PER_INST 0x1400
49#define DRA7XX_PRM_CUSTEFUSE_INST 0x1600
50#define DRA7XX_PRM_WKUPAON_INST 0x1724
51#define DRA7XX_PRM_WKUPAON_CM_INST 0x1800
52#define DRA7XX_PRM_EMU_INST 0x1900
53#define DRA7XX_PRM_EMU_CM_INST 0x1a00
54#define DRA7XX_PRM_DSP2_INST 0x1b00
55#define DRA7XX_PRM_EVE1_INST 0x1b40
56#define DRA7XX_PRM_EVE2_INST 0x1b80
57#define DRA7XX_PRM_EVE3_INST 0x1bc0
58#define DRA7XX_PRM_EVE4_INST 0x1c00
59#define DRA7XX_PRM_RTC_INST 0x1c60
60#define DRA7XX_PRM_VPE_INST 0x1c80
61#define DRA7XX_PRM_DEVICE_INST 0x1d00
62#define DRA7XX_PRM_INSTR_INST 0x1f00
63
64/* PRM clockdomain register offsets (from instance start) */
65#define DRA7XX_PRM_WKUPAON_CM_WKUPAON_CDOFFS 0x0000
66#define DRA7XX_PRM_EMU_CM_EMU_CDOFFS 0x0000
67
68/* PRM */
69
70/* PRM.OCP_SOCKET_PRM register offsets */
71#define DRA7XX_REVISION_PRM_OFFSET 0x0000
72#define DRA7XX_PRM_IRQSTATUS_MPU_OFFSET 0x0010
73#define DRA7XX_PRM_IRQSTATUS_MPU_2_OFFSET 0x0014
74#define DRA7XX_PRM_IRQENABLE_MPU_OFFSET 0x0018
75#define DRA7XX_PRM_IRQENABLE_MPU_2_OFFSET 0x001c
76#define DRA7XX_PRM_IRQSTATUS_IPU2_OFFSET 0x0020
77#define DRA7XX_PRM_IRQENABLE_IPU2_OFFSET 0x0028
78#define DRA7XX_PRM_IRQSTATUS_DSP1_OFFSET 0x0030
79#define DRA7XX_PRM_IRQENABLE_DSP1_OFFSET 0x0038
80#define DRA7XX_CM_PRM_PROFILING_CLKCTRL_OFFSET 0x0040
81#define DRA7XX_CM_PRM_PROFILING_CLKCTRL DRA7XX_PRM_REGADDR(DRA7XX_PRM_OCP_SOCKET_INST, 0x0040)
82#define DRA7XX_PRM_IRQENABLE_DSP2_OFFSET 0x0044
83#define DRA7XX_PRM_IRQENABLE_EVE1_OFFSET 0x0048
84#define DRA7XX_PRM_IRQENABLE_EVE2_OFFSET 0x004c
85#define DRA7XX_PRM_IRQENABLE_EVE3_OFFSET 0x0050
86#define DRA7XX_PRM_IRQENABLE_EVE4_OFFSET 0x0054
87#define DRA7XX_PRM_IRQENABLE_IPU1_OFFSET 0x0058
88#define DRA7XX_PRM_IRQSTATUS_DSP2_OFFSET 0x005c
89#define DRA7XX_PRM_IRQSTATUS_EVE1_OFFSET 0x0060
90#define DRA7XX_PRM_IRQSTATUS_EVE2_OFFSET 0x0064
91#define DRA7XX_PRM_IRQSTATUS_EVE3_OFFSET 0x0068
92#define DRA7XX_PRM_IRQSTATUS_EVE4_OFFSET 0x006c
93#define DRA7XX_PRM_IRQSTATUS_IPU1_OFFSET 0x0070
94#define DRA7XX_PRM_DEBUG_CFG1_OFFSET 0x00e4
95#define DRA7XX_PRM_DEBUG_CFG2_OFFSET 0x00e8
96#define DRA7XX_PRM_DEBUG_CFG3_OFFSET 0x00ec
97#define DRA7XX_PRM_DEBUG_OUT_OFFSET 0x00f4
98
99/* PRM.CKGEN_PRM register offsets */
100#define DRA7XX_CM_CLKSEL_SYSCLK1_OFFSET 0x0000
101#define DRA7XX_CM_CLKSEL_SYSCLK1 DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0000)
102#define DRA7XX_CM_CLKSEL_WKUPAON_OFFSET 0x0008
103#define DRA7XX_CM_CLKSEL_WKUPAON DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0008)
104#define DRA7XX_CM_CLKSEL_ABE_PLL_REF_OFFSET 0x000c
105#define DRA7XX_CM_CLKSEL_ABE_PLL_REF DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x000c)
106#define DRA7XX_CM_CLKSEL_SYS_OFFSET 0x0010
107#define DRA7XX_CM_CLKSEL_SYS DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0010)
108#define DRA7XX_CM_CLKSEL_ABE_PLL_BYPAS_OFFSET 0x0014
109#define DRA7XX_CM_CLKSEL_ABE_PLL_BYPAS DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0014)
110#define DRA7XX_CM_CLKSEL_ABE_PLL_SYS_OFFSET 0x0018
111#define DRA7XX_CM_CLKSEL_ABE_PLL_SYS DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0018)
112#define DRA7XX_CM_CLKSEL_ABE_24M_OFFSET 0x001c
113#define DRA7XX_CM_CLKSEL_ABE_24M DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x001c)
114#define DRA7XX_CM_CLKSEL_ABE_SYS_OFFSET 0x0020
115#define DRA7XX_CM_CLKSEL_ABE_SYS DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0020)
116#define DRA7XX_CM_CLKSEL_HDMI_MCASP_AUX_OFFSET 0x0024
117#define DRA7XX_CM_CLKSEL_HDMI_MCASP_AUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0024)
118#define DRA7XX_CM_CLKSEL_HDMI_TIMER_OFFSET 0x0028
119#define DRA7XX_CM_CLKSEL_HDMI_TIMER DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0028)
120#define DRA7XX_CM_CLKSEL_MCASP_SYS_OFFSET 0x002c
121#define DRA7XX_CM_CLKSEL_MCASP_SYS DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x002c)
122#define DRA7XX_CM_CLKSEL_MLBP_MCASP_OFFSET 0x0030
123#define DRA7XX_CM_CLKSEL_MLBP_MCASP DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0030)
124#define DRA7XX_CM_CLKSEL_MLB_MCASP_OFFSET 0x0034
125#define DRA7XX_CM_CLKSEL_MLB_MCASP DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0034)
126#define DRA7XX_CM_CLKSEL_PER_ABE_X1_GFCLK_MCASP_AUX_OFFSET 0x0038
127#define DRA7XX_CM_CLKSEL_PER_ABE_X1_GFCLK_MCASP_AUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0038)
128#define DRA7XX_CM_CLKSEL_SYS_CLK1_32K_OFFSET 0x0040
129#define DRA7XX_CM_CLKSEL_SYS_CLK1_32K DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0040)
130#define DRA7XX_CM_CLKSEL_TIMER_SYS_OFFSET 0x0044
131#define DRA7XX_CM_CLKSEL_TIMER_SYS DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0044)
132#define DRA7XX_CM_CLKSEL_VIDEO1_MCASP_AUX_OFFSET 0x0048
133#define DRA7XX_CM_CLKSEL_VIDEO1_MCASP_AUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0048)
134#define DRA7XX_CM_CLKSEL_VIDEO1_TIMER_OFFSET 0x004c
135#define DRA7XX_CM_CLKSEL_VIDEO1_TIMER DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x004c)
136#define DRA7XX_CM_CLKSEL_VIDEO2_MCASP_AUX_OFFSET 0x0050
137#define DRA7XX_CM_CLKSEL_VIDEO2_MCASP_AUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0050)
138#define DRA7XX_CM_CLKSEL_VIDEO2_TIMER_OFFSET 0x0054
139#define DRA7XX_CM_CLKSEL_VIDEO2_TIMER DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0054)
140#define DRA7XX_CM_CLKSEL_CLKOUTMUX0_OFFSET 0x0058
141#define DRA7XX_CM_CLKSEL_CLKOUTMUX0 DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0058)
142#define DRA7XX_CM_CLKSEL_CLKOUTMUX1_OFFSET 0x005c
143#define DRA7XX_CM_CLKSEL_CLKOUTMUX1 DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x005c)
144#define DRA7XX_CM_CLKSEL_CLKOUTMUX2_OFFSET 0x0060
145#define DRA7XX_CM_CLKSEL_CLKOUTMUX2 DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0060)
146#define DRA7XX_CM_CLKSEL_HDMI_PLL_SYS_OFFSET 0x0064
147#define DRA7XX_CM_CLKSEL_HDMI_PLL_SYS DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0064)
148#define DRA7XX_CM_CLKSEL_VIDEO1_PLL_SYS_OFFSET 0x0068
149#define DRA7XX_CM_CLKSEL_VIDEO1_PLL_SYS DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0068)
150#define DRA7XX_CM_CLKSEL_VIDEO2_PLL_SYS_OFFSET 0x006c
151#define DRA7XX_CM_CLKSEL_VIDEO2_PLL_SYS DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x006c)
152#define DRA7XX_CM_CLKSEL_ABE_CLK_DIV_OFFSET 0x0070
153#define DRA7XX_CM_CLKSEL_ABE_CLK_DIV DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0070)
154#define DRA7XX_CM_CLKSEL_ABE_GICLK_DIV_OFFSET 0x0074
155#define DRA7XX_CM_CLKSEL_ABE_GICLK_DIV DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0074)
156#define DRA7XX_CM_CLKSEL_AESS_FCLK_DIV_OFFSET 0x0078
157#define DRA7XX_CM_CLKSEL_AESS_FCLK_DIV DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0078)
158#define DRA7XX_CM_CLKSEL_EVE_CLK_OFFSET 0x0080
159#define DRA7XX_CM_CLKSEL_EVE_CLK DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0080)
160#define DRA7XX_CM_CLKSEL_USB_OTG_CLK_CLKOUTMUX_OFFSET 0x0084
161#define DRA7XX_CM_CLKSEL_USB_OTG_CLK_CLKOUTMUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0084)
162#define DRA7XX_CM_CLKSEL_CORE_DPLL_OUT_CLK_CLKOUTMUX_OFFSET 0x0088
163#define DRA7XX_CM_CLKSEL_CORE_DPLL_OUT_CLK_CLKOUTMUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0088)
164#define DRA7XX_CM_CLKSEL_DSP_GFCLK_CLKOUTMUX_OFFSET 0x008c
165#define DRA7XX_CM_CLKSEL_DSP_GFCLK_CLKOUTMUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x008c)
166#define DRA7XX_CM_CLKSEL_EMIF_PHY_GCLK_CLKOUTMUX_OFFSET 0x0090
167#define DRA7XX_CM_CLKSEL_EMIF_PHY_GCLK_CLKOUTMUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0090)
168#define DRA7XX_CM_CLKSEL_EMU_CLK_CLKOUTMUX_OFFSET 0x0094
169#define DRA7XX_CM_CLKSEL_EMU_CLK_CLKOUTMUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0094)
170#define DRA7XX_CM_CLKSEL_FUNC_96M_AON_CLK_CLKOUTMUX_OFFSET 0x0098
171#define DRA7XX_CM_CLKSEL_FUNC_96M_AON_CLK_CLKOUTMUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x0098)
172#define DRA7XX_CM_CLKSEL_GMAC_250M_CLK_CLKOUTMUX_OFFSET 0x009c
173#define DRA7XX_CM_CLKSEL_GMAC_250M_CLK_CLKOUTMUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x009c)
174#define DRA7XX_CM_CLKSEL_GPU_GCLK_CLKOUTMUX_OFFSET 0x00a0
175#define DRA7XX_CM_CLKSEL_GPU_GCLK_CLKOUTMUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x00a0)
176#define DRA7XX_CM_CLKSEL_HDMI_CLK_CLKOUTMUX_OFFSET 0x00a4
177#define DRA7XX_CM_CLKSEL_HDMI_CLK_CLKOUTMUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x00a4)
178#define DRA7XX_CM_CLKSEL_IVA_GCLK_CLKOUTMUX_OFFSET 0x00a8
179#define DRA7XX_CM_CLKSEL_IVA_GCLK_CLKOUTMUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x00a8)
180#define DRA7XX_CM_CLKSEL_L3INIT_480M_GFCLK_CLKOUTMUX_OFFSET 0x00ac
181#define DRA7XX_CM_CLKSEL_L3INIT_480M_GFCLK_CLKOUTMUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x00ac)
182#define DRA7XX_CM_CLKSEL_MPU_GCLK_CLKOUTMUX_OFFSET 0x00b0
183#define DRA7XX_CM_CLKSEL_MPU_GCLK_CLKOUTMUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x00b0)
184#define DRA7XX_CM_CLKSEL_PCIE1_CLK_CLKOUTMUX_OFFSET 0x00b4
185#define DRA7XX_CM_CLKSEL_PCIE1_CLK_CLKOUTMUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x00b4)
186#define DRA7XX_CM_CLKSEL_PCIE2_CLK_CLKOUTMUX_OFFSET 0x00b8
187#define DRA7XX_CM_CLKSEL_PCIE2_CLK_CLKOUTMUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x00b8)
188#define DRA7XX_CM_CLKSEL_PER_ABE_X1_CLK_CLKOUTMUX_OFFSET 0x00bc
189#define DRA7XX_CM_CLKSEL_PER_ABE_X1_CLK_CLKOUTMUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x00bc)
190#define DRA7XX_CM_CLKSEL_SATA_CLK_CLKOUTMUX_OFFSET 0x00c0
191#define DRA7XX_CM_CLKSEL_SATA_CLK_CLKOUTMUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x00c0)
192#define DRA7XX_CM_CLKSEL_SECURE_32K_CLK_CLKOUTMUX_OFFSET 0x00c4
193#define DRA7XX_CM_CLKSEL_SECURE_32K_CLK_CLKOUTMUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x00c4)
194#define DRA7XX_CM_CLKSEL_SYS_CLK1_CLKOUTMUX_OFFSET 0x00c8
195#define DRA7XX_CM_CLKSEL_SYS_CLK1_CLKOUTMUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x00c8)
196#define DRA7XX_CM_CLKSEL_SYS_CLK2_CLKOUTMUX_OFFSET 0x00cc
197#define DRA7XX_CM_CLKSEL_SYS_CLK2_CLKOUTMUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x00cc)
198#define DRA7XX_CM_CLKSEL_VIDEO1_CLK_CLKOUTMUX_OFFSET 0x00d0
199#define DRA7XX_CM_CLKSEL_VIDEO1_CLK_CLKOUTMUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x00d0)
200#define DRA7XX_CM_CLKSEL_VIDEO2_CLK_CLKOUTMUX_OFFSET 0x00d4
201#define DRA7XX_CM_CLKSEL_VIDEO2_CLK_CLKOUTMUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x00d4)
202#define DRA7XX_CM_CLKSEL_ABE_LP_CLK_OFFSET 0x00d8
203#define DRA7XX_CM_CLKSEL_ABE_LP_CLK DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x00d8)
204#define DRA7XX_CM_CLKSEL_ADC_GFCLK_OFFSET 0x00dc
205#define DRA7XX_CM_CLKSEL_ADC_GFCLK DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x00dc)
206#define DRA7XX_CM_CLKSEL_EVE_GFCLK_CLKOUTMUX_OFFSET 0x00e0
207#define DRA7XX_CM_CLKSEL_EVE_GFCLK_CLKOUTMUX DRA7XX_PRM_REGADDR(DRA7XX_PRM_CKGEN_INST, 0x00e0)
208
209/* PRM.MPU_PRM register offsets */
210#define DRA7XX_PM_MPU_PWRSTCTRL_OFFSET 0x0000
211#define DRA7XX_PM_MPU_PWRSTST_OFFSET 0x0004
212#define DRA7XX_RM_MPU_MPU_CONTEXT_OFFSET 0x0024
213
214/* PRM.DSP1_PRM register offsets */
215#define DRA7XX_PM_DSP1_PWRSTCTRL_OFFSET 0x0000
216#define DRA7XX_PM_DSP1_PWRSTST_OFFSET 0x0004
217#define DRA7XX_RM_DSP1_RSTCTRL_OFFSET 0x0010
218#define DRA7XX_RM_DSP1_RSTST_OFFSET 0x0014
219#define DRA7XX_RM_DSP1_DSP1_CONTEXT_OFFSET 0x0024
220
221/* PRM.IPU_PRM register offsets */
222#define DRA7XX_PM_IPU_PWRSTCTRL_OFFSET 0x0000
223#define DRA7XX_PM_IPU_PWRSTST_OFFSET 0x0004
224#define DRA7XX_RM_IPU1_RSTCTRL_OFFSET 0x0010
225#define DRA7XX_RM_IPU1_RSTST_OFFSET 0x0014
226#define DRA7XX_RM_IPU1_IPU1_CONTEXT_OFFSET 0x0024
227#define DRA7XX_PM_IPU_MCASP1_WKDEP_OFFSET 0x0050
228#define DRA7XX_RM_IPU_MCASP1_CONTEXT_OFFSET 0x0054
229#define DRA7XX_PM_IPU_TIMER5_WKDEP_OFFSET 0x0058
230#define DRA7XX_RM_IPU_TIMER5_CONTEXT_OFFSET 0x005c
231#define DRA7XX_PM_IPU_TIMER6_WKDEP_OFFSET 0x0060
232#define DRA7XX_RM_IPU_TIMER6_CONTEXT_OFFSET 0x0064
233#define DRA7XX_PM_IPU_TIMER7_WKDEP_OFFSET 0x0068
234#define DRA7XX_RM_IPU_TIMER7_CONTEXT_OFFSET 0x006c
235#define DRA7XX_PM_IPU_TIMER8_WKDEP_OFFSET 0x0070
236#define DRA7XX_RM_IPU_TIMER8_CONTEXT_OFFSET 0x0074
237#define DRA7XX_PM_IPU_I2C5_WKDEP_OFFSET 0x0078
238#define DRA7XX_RM_IPU_I2C5_CONTEXT_OFFSET 0x007c
239#define DRA7XX_PM_IPU_UART6_WKDEP_OFFSET 0x0080
240#define DRA7XX_RM_IPU_UART6_CONTEXT_OFFSET 0x0084
241
242/* PRM.COREAON_PRM register offsets */
243#define DRA7XX_PM_COREAON_SMARTREFLEX_MPU_WKDEP_OFFSET 0x0000
244#define DRA7XX_RM_COREAON_SMARTREFLEX_MPU_CONTEXT_OFFSET 0x0004
245#define DRA7XX_PM_COREAON_SMARTREFLEX_CORE_WKDEP_OFFSET 0x0010
246#define DRA7XX_RM_COREAON_SMARTREFLEX_CORE_CONTEXT_OFFSET 0x0014
247#define DRA7XX_PM_COREAON_SMARTREFLEX_GPU_WKDEP_OFFSET 0x0030
248#define DRA7XX_RM_COREAON_SMARTREFLEX_GPU_CONTEXT_OFFSET 0x0034
249#define DRA7XX_PM_COREAON_SMARTREFLEX_DSPEVE_WKDEP_OFFSET 0x0040
250#define DRA7XX_RM_COREAON_SMARTREFLEX_DSPEVE_CONTEXT_OFFSET 0x0044
251#define DRA7XX_PM_COREAON_SMARTREFLEX_IVAHD_WKDEP_OFFSET 0x0050
252#define DRA7XX_RM_COREAON_SMARTREFLEX_IVAHD_CONTEXT_OFFSET 0x0054
253#define DRA7XX_RM_COREAON_DUMMY_MODULE1_CONTEXT_OFFSET 0x0084
254#define DRA7XX_RM_COREAON_DUMMY_MODULE2_CONTEXT_OFFSET 0x0094
255#define DRA7XX_RM_COREAON_DUMMY_MODULE3_CONTEXT_OFFSET 0x00a4
256#define DRA7XX_RM_COREAON_DUMMY_MODULE4_CONTEXT_OFFSET 0x00b4
257
258/* PRM.CORE_PRM register offsets */
259#define DRA7XX_PM_CORE_PWRSTCTRL_OFFSET 0x0000
260#define DRA7XX_PM_CORE_PWRSTST_OFFSET 0x0004
261#define DRA7XX_RM_L3MAIN1_L3_MAIN_1_CONTEXT_OFFSET 0x0024
262#define DRA7XX_RM_L3MAIN1_GPMC_CONTEXT_OFFSET 0x002c
263#define DRA7XX_RM_L3MAIN1_MMU_EDMA_CONTEXT_OFFSET 0x0034
264#define DRA7XX_PM_L3MAIN1_OCMC_RAM1_WKDEP_OFFSET 0x0050
265#define DRA7XX_RM_L3MAIN1_OCMC_RAM1_CONTEXT_OFFSET 0x0054
266#define DRA7XX_PM_L3MAIN1_OCMC_RAM2_WKDEP_OFFSET 0x0058
267#define DRA7XX_RM_L3MAIN1_OCMC_RAM2_CONTEXT_OFFSET 0x005c
268#define DRA7XX_PM_L3MAIN1_OCMC_RAM3_WKDEP_OFFSET 0x0060
269#define DRA7XX_RM_L3MAIN1_OCMC_RAM3_CONTEXT_OFFSET 0x0064
270#define DRA7XX_RM_L3MAIN1_OCMC_ROM_CONTEXT_OFFSET 0x006c
271#define DRA7XX_PM_L3MAIN1_TPCC_WKDEP_OFFSET 0x0070
272#define DRA7XX_RM_L3MAIN1_TPCC_CONTEXT_OFFSET 0x0074
273#define DRA7XX_PM_L3MAIN1_TPTC1_WKDEP_OFFSET 0x0078
274#define DRA7XX_RM_L3MAIN1_TPTC1_CONTEXT_OFFSET 0x007c
275#define DRA7XX_PM_L3MAIN1_TPTC2_WKDEP_OFFSET 0x0080
276#define DRA7XX_RM_L3MAIN1_TPTC2_CONTEXT_OFFSET 0x0084
277#define DRA7XX_RM_L3MAIN1_VCP1_CONTEXT_OFFSET 0x008c
278#define DRA7XX_RM_L3MAIN1_VCP2_CONTEXT_OFFSET 0x0094
279#define DRA7XX_RM_L3MAIN1_SPARE_CME_CONTEXT_OFFSET 0x009c
280#define DRA7XX_RM_L3MAIN1_SPARE_HDMI_CONTEXT_OFFSET 0x00a4
281#define DRA7XX_RM_L3MAIN1_SPARE_ICM_CONTEXT_OFFSET 0x00ac
282#define DRA7XX_RM_L3MAIN1_SPARE_IVA2_CONTEXT_OFFSET 0x00b4
283#define DRA7XX_RM_L3MAIN1_SPARE_SATA2_CONTEXT_OFFSET 0x00bc
284#define DRA7XX_RM_L3MAIN1_SPARE_UNKNOWN4_CONTEXT_OFFSET 0x00c4
285#define DRA7XX_RM_L3MAIN1_SPARE_UNKNOWN5_CONTEXT_OFFSET 0x00cc
286#define DRA7XX_RM_L3MAIN1_SPARE_UNKNOWN6_CONTEXT_OFFSET 0x00d4
287#define DRA7XX_RM_L3MAIN1_SPARE_VIDEOPLL1_CONTEXT_OFFSET 0x00dc
288#define DRA7XX_RM_L3MAIN1_SPARE_VIDEOPLL2_CONTEXT_OFFSET 0x00f4
289#define DRA7XX_RM_L3MAIN1_SPARE_VIDEOPLL3_CONTEXT_OFFSET 0x00fc
290#define DRA7XX_RM_IPU2_RSTCTRL_OFFSET 0x0210
291#define DRA7XX_RM_IPU2_RSTST_OFFSET 0x0214
292#define DRA7XX_RM_IPU2_IPU2_CONTEXT_OFFSET 0x0224
293#define DRA7XX_RM_DMA_DMA_SYSTEM_CONTEXT_OFFSET 0x0324
294#define DRA7XX_RM_EMIF_DMM_CONTEXT_OFFSET 0x0424
295#define DRA7XX_RM_EMIF_EMIF_OCP_FW_CONTEXT_OFFSET 0x042c
296#define DRA7XX_RM_EMIF_EMIF1_CONTEXT_OFFSET 0x0434
297#define DRA7XX_RM_EMIF_EMIF2_CONTEXT_OFFSET 0x043c
298#define DRA7XX_RM_EMIF_EMIF_DLL_CONTEXT_OFFSET 0x0444
299#define DRA7XX_RM_ATL_ATL_CONTEXT_OFFSET 0x0524
300#define DRA7XX_RM_L4CFG_L4_CFG_CONTEXT_OFFSET 0x0624
301#define DRA7XX_RM_L4CFG_SPINLOCK_CONTEXT_OFFSET 0x062c
302#define DRA7XX_RM_L4CFG_MAILBOX1_CONTEXT_OFFSET 0x0634
303#define DRA7XX_RM_L4CFG_SAR_ROM_CONTEXT_OFFSET 0x063c
304#define DRA7XX_RM_L4CFG_OCP2SCP2_CONTEXT_OFFSET 0x0644
305#define DRA7XX_RM_L4CFG_MAILBOX2_CONTEXT_OFFSET 0x064c
306#define DRA7XX_RM_L4CFG_MAILBOX3_CONTEXT_OFFSET 0x0654
307#define DRA7XX_RM_L4CFG_MAILBOX4_CONTEXT_OFFSET 0x065c
308#define DRA7XX_RM_L4CFG_MAILBOX5_CONTEXT_OFFSET 0x0664
309#define DRA7XX_RM_L4CFG_MAILBOX6_CONTEXT_OFFSET 0x066c
310#define DRA7XX_RM_L4CFG_MAILBOX7_CONTEXT_OFFSET 0x0674
311#define DRA7XX_RM_L4CFG_MAILBOX8_CONTEXT_OFFSET 0x067c
312#define DRA7XX_RM_L4CFG_MAILBOX9_CONTEXT_OFFSET 0x0684
313#define DRA7XX_RM_L4CFG_MAILBOX10_CONTEXT_OFFSET 0x068c
314#define DRA7XX_RM_L4CFG_MAILBOX11_CONTEXT_OFFSET 0x0694
315#define DRA7XX_RM_L4CFG_MAILBOX12_CONTEXT_OFFSET 0x069c
316#define DRA7XX_RM_L4CFG_MAILBOX13_CONTEXT_OFFSET 0x06a4
317#define DRA7XX_RM_L4CFG_SPARE_SMARTREFLEX_RTC_CONTEXT_OFFSET 0x06ac
318#define DRA7XX_RM_L4CFG_SPARE_SMARTREFLEX_SDRAM_CONTEXT_OFFSET 0x06b4
319#define DRA7XX_RM_L4CFG_SPARE_SMARTREFLEX_WKUP_CONTEXT_OFFSET 0x06bc
320#define DRA7XX_RM_L4CFG_IO_DELAY_BLOCK_CONTEXT_OFFSET 0x06c4
321#define DRA7XX_RM_L3INSTR_L3_MAIN_2_CONTEXT_OFFSET 0x0724
322#define DRA7XX_RM_L3INSTR_L3_INSTR_CONTEXT_OFFSET 0x072c
323#define DRA7XX_RM_L3INSTR_OCP_WP_NOC_CONTEXT_OFFSET 0x0744
324
325/* PRM.IVA_PRM register offsets */
326#define DRA7XX_PM_IVA_PWRSTCTRL_OFFSET 0x0000
327#define DRA7XX_PM_IVA_PWRSTST_OFFSET 0x0004
328#define DRA7XX_RM_IVA_RSTCTRL_OFFSET 0x0010
329#define DRA7XX_RM_IVA_RSTST_OFFSET 0x0014
330#define DRA7XX_RM_IVA_IVA_CONTEXT_OFFSET 0x0024
331#define DRA7XX_RM_IVA_SL2_CONTEXT_OFFSET 0x002c
332
333/* PRM.CAM_PRM register offsets */
334#define DRA7XX_PM_CAM_PWRSTCTRL_OFFSET 0x0000
335#define DRA7XX_PM_CAM_PWRSTST_OFFSET 0x0004
336#define DRA7XX_PM_CAM_VIP1_WKDEP_OFFSET 0x0020
337#define DRA7XX_RM_CAM_VIP1_CONTEXT_OFFSET 0x0024
338#define DRA7XX_PM_CAM_VIP2_WKDEP_OFFSET 0x0028
339#define DRA7XX_RM_CAM_VIP2_CONTEXT_OFFSET 0x002c
340#define DRA7XX_PM_CAM_VIP3_WKDEP_OFFSET 0x0030
341#define DRA7XX_RM_CAM_VIP3_CONTEXT_OFFSET 0x0034
342#define DRA7XX_RM_CAM_LVDSRX_CONTEXT_OFFSET 0x003c
343#define DRA7XX_RM_CAM_CSI1_CONTEXT_OFFSET 0x0044
344#define DRA7XX_RM_CAM_CSI2_CONTEXT_OFFSET 0x004c
345
346/* PRM.DSS_PRM register offsets */
347#define DRA7XX_PM_DSS_PWRSTCTRL_OFFSET 0x0000
348#define DRA7XX_PM_DSS_PWRSTST_OFFSET 0x0004
349#define DRA7XX_PM_DSS_DSS_WKDEP_OFFSET 0x0020
350#define DRA7XX_RM_DSS_DSS_CONTEXT_OFFSET 0x0024
351#define DRA7XX_PM_DSS_DSS2_WKDEP_OFFSET 0x0028
352#define DRA7XX_RM_DSS_BB2D_CONTEXT_OFFSET 0x0034
353#define DRA7XX_RM_DSS_SDVENC_CONTEXT_OFFSET 0x003c
354
355/* PRM.GPU_PRM register offsets */
356#define DRA7XX_PM_GPU_PWRSTCTRL_OFFSET 0x0000
357#define DRA7XX_PM_GPU_PWRSTST_OFFSET 0x0004
358#define DRA7XX_RM_GPU_GPU_CONTEXT_OFFSET 0x0024
359
360/* PRM.L3INIT_PRM register offsets */
361#define DRA7XX_PM_L3INIT_PWRSTCTRL_OFFSET 0x0000
362#define DRA7XX_PM_L3INIT_PWRSTST_OFFSET 0x0004
363#define DRA7XX_PM_L3INIT_MMC1_WKDEP_OFFSET 0x0028
364#define DRA7XX_RM_L3INIT_MMC1_CONTEXT_OFFSET 0x002c
365#define DRA7XX_PM_L3INIT_MMC2_WKDEP_OFFSET 0x0030
366#define DRA7XX_RM_L3INIT_MMC2_CONTEXT_OFFSET 0x0034
367#define DRA7XX_PM_L3INIT_USB_OTG_SS2_WKDEP_OFFSET 0x0040
368#define DRA7XX_RM_L3INIT_USB_OTG_SS2_CONTEXT_OFFSET 0x0044
369#define DRA7XX_PM_L3INIT_USB_OTG_SS3_WKDEP_OFFSET 0x0048
370#define DRA7XX_RM_L3INIT_USB_OTG_SS3_CONTEXT_OFFSET 0x004c
371#define DRA7XX_PM_L3INIT_USB_OTG_SS4_WKDEP_OFFSET 0x0050
372#define DRA7XX_RM_L3INIT_USB_OTG_SS4_CONTEXT_OFFSET 0x0054
373#define DRA7XX_RM_L3INIT_MLB_SS_CONTEXT_OFFSET 0x005c
374#define DRA7XX_RM_L3INIT_IEEE1500_2_OCP_CONTEXT_OFFSET 0x007c
375#define DRA7XX_PM_L3INIT_SATA_WKDEP_OFFSET 0x0088
376#define DRA7XX_RM_L3INIT_SATA_CONTEXT_OFFSET 0x008c
377#define DRA7XX_RM_GMAC_GMAC_CONTEXT_OFFSET 0x00d4
378#define DRA7XX_RM_L3INIT_OCP2SCP1_CONTEXT_OFFSET 0x00e4
379#define DRA7XX_RM_L3INIT_OCP2SCP3_CONTEXT_OFFSET 0x00ec
380#define DRA7XX_PM_L3INIT_USB_OTG_SS1_WKDEP_OFFSET 0x00f0
381#define DRA7XX_RM_L3INIT_USB_OTG_SS1_CONTEXT_OFFSET 0x00f4
382
383/* PRM.L4PER_PRM register offsets */
384#define DRA7XX_PM_L4PER_PWRSTCTRL_OFFSET 0x0000
385#define DRA7XX_PM_L4PER_PWRSTST_OFFSET 0x0004
386#define DRA7XX_RM_L4PER2_L4PER2_CONTEXT_OFFSET 0x000c
387#define DRA7XX_RM_L4PER3_L4PER3_CONTEXT_OFFSET 0x0014
388#define DRA7XX_RM_L4PER2_PRUSS1_CONTEXT_OFFSET 0x001c
389#define DRA7XX_RM_L4PER2_PRUSS2_CONTEXT_OFFSET 0x0024
390#define DRA7XX_PM_L4PER_TIMER10_WKDEP_OFFSET 0x0028
391#define DRA7XX_RM_L4PER_TIMER10_CONTEXT_OFFSET 0x002c
392#define DRA7XX_PM_L4PER_TIMER11_WKDEP_OFFSET 0x0030
393#define DRA7XX_RM_L4PER_TIMER11_CONTEXT_OFFSET 0x0034
394#define DRA7XX_PM_L4PER_TIMER2_WKDEP_OFFSET 0x0038
395#define DRA7XX_RM_L4PER_TIMER2_CONTEXT_OFFSET 0x003c
396#define DRA7XX_PM_L4PER_TIMER3_WKDEP_OFFSET 0x0040
397#define DRA7XX_RM_L4PER_TIMER3_CONTEXT_OFFSET 0x0044
398#define DRA7XX_PM_L4PER_TIMER4_WKDEP_OFFSET 0x0048
399#define DRA7XX_RM_L4PER_TIMER4_CONTEXT_OFFSET 0x004c
400#define DRA7XX_PM_L4PER_TIMER9_WKDEP_OFFSET 0x0050
401#define DRA7XX_RM_L4PER_TIMER9_CONTEXT_OFFSET 0x0054
402#define DRA7XX_RM_L4PER_ELM_CONTEXT_OFFSET 0x005c
403#define DRA7XX_PM_L4PER_GPIO2_WKDEP_OFFSET 0x0060
404#define DRA7XX_RM_L4PER_GPIO2_CONTEXT_OFFSET 0x0064
405#define DRA7XX_PM_L4PER_GPIO3_WKDEP_OFFSET 0x0068
406#define DRA7XX_RM_L4PER_GPIO3_CONTEXT_OFFSET 0x006c
407#define DRA7XX_PM_L4PER_GPIO4_WKDEP_OFFSET 0x0070
408#define DRA7XX_RM_L4PER_GPIO4_CONTEXT_OFFSET 0x0074
409#define DRA7XX_PM_L4PER_GPIO5_WKDEP_OFFSET 0x0078
410#define DRA7XX_RM_L4PER_GPIO5_CONTEXT_OFFSET 0x007c
411#define DRA7XX_PM_L4PER_GPIO6_WKDEP_OFFSET 0x0080
412#define DRA7XX_RM_L4PER_GPIO6_CONTEXT_OFFSET 0x0084
413#define DRA7XX_RM_L4PER_HDQ1W_CONTEXT_OFFSET 0x008c
414#define DRA7XX_RM_L4PER2_PWMSS2_CONTEXT_OFFSET 0x0094
415#define DRA7XX_RM_L4PER2_PWMSS3_CONTEXT_OFFSET 0x009c
416#define DRA7XX_PM_L4PER_I2C1_WKDEP_OFFSET 0x00a0
417#define DRA7XX_RM_L4PER_I2C1_CONTEXT_OFFSET 0x00a4
418#define DRA7XX_PM_L4PER_I2C2_WKDEP_OFFSET 0x00a8
419#define DRA7XX_RM_L4PER_I2C2_CONTEXT_OFFSET 0x00ac
420#define DRA7XX_PM_L4PER_I2C3_WKDEP_OFFSET 0x00b0
421#define DRA7XX_RM_L4PER_I2C3_CONTEXT_OFFSET 0x00b4
422#define DRA7XX_PM_L4PER_I2C4_WKDEP_OFFSET 0x00b8
423#define DRA7XX_RM_L4PER_I2C4_CONTEXT_OFFSET 0x00bc
424#define DRA7XX_RM_L4PER_L4PER1_CONTEXT_OFFSET 0x00c0
425#define DRA7XX_RM_L4PER2_PWMSS1_CONTEXT_OFFSET 0x00c4
426#define DRA7XX_PM_L4PER_TIMER13_WKDEP_OFFSET 0x00c8
427#define DRA7XX_RM_L4PER3_TIMER13_CONTEXT_OFFSET 0x00cc
428#define DRA7XX_PM_L4PER_TIMER14_WKDEP_OFFSET 0x00d0
429#define DRA7XX_RM_L4PER3_TIMER14_CONTEXT_OFFSET 0x00d4
430#define DRA7XX_PM_L4PER_TIMER15_WKDEP_OFFSET 0x00d8
431#define DRA7XX_RM_L4PER3_TIMER15_CONTEXT_OFFSET 0x00dc
432#define DRA7XX_PM_L4PER_MCSPI1_WKDEP_OFFSET 0x00f0
433#define DRA7XX_RM_L4PER_MCSPI1_CONTEXT_OFFSET 0x00f4
434#define DRA7XX_PM_L4PER_MCSPI2_WKDEP_OFFSET 0x00f8
435#define DRA7XX_RM_L4PER_MCSPI2_CONTEXT_OFFSET 0x00fc
436#define DRA7XX_PM_L4PER_MCSPI3_WKDEP_OFFSET 0x0100
437#define DRA7XX_RM_L4PER_MCSPI3_CONTEXT_OFFSET 0x0104
438#define DRA7XX_PM_L4PER_MCSPI4_WKDEP_OFFSET 0x0108
439#define DRA7XX_RM_L4PER_MCSPI4_CONTEXT_OFFSET 0x010c
440#define DRA7XX_PM_L4PER_GPIO7_WKDEP_OFFSET 0x0110
441#define DRA7XX_RM_L4PER_GPIO7_CONTEXT_OFFSET 0x0114
442#define DRA7XX_PM_L4PER_GPIO8_WKDEP_OFFSET 0x0118
443#define DRA7XX_RM_L4PER_GPIO8_CONTEXT_OFFSET 0x011c
444#define DRA7XX_PM_L4PER_MMC3_WKDEP_OFFSET 0x0120
445#define DRA7XX_RM_L4PER_MMC3_CONTEXT_OFFSET 0x0124
446#define DRA7XX_PM_L4PER_MMC4_WKDEP_OFFSET 0x0128
447#define DRA7XX_RM_L4PER_MMC4_CONTEXT_OFFSET 0x012c
448#define DRA7XX_PM_L4PER_TIMER16_WKDEP_OFFSET 0x0130
449#define DRA7XX_RM_L4PER3_TIMER16_CONTEXT_OFFSET 0x0134
450#define DRA7XX_PM_L4PER2_QSPI_WKDEP_OFFSET 0x0138
451#define DRA7XX_RM_L4PER2_QSPI_CONTEXT_OFFSET 0x013c
452#define DRA7XX_PM_L4PER_UART1_WKDEP_OFFSET 0x0140
453#define DRA7XX_RM_L4PER_UART1_CONTEXT_OFFSET 0x0144
454#define DRA7XX_PM_L4PER_UART2_WKDEP_OFFSET 0x0148
455#define DRA7XX_RM_L4PER_UART2_CONTEXT_OFFSET 0x014c
456#define DRA7XX_PM_L4PER_UART3_WKDEP_OFFSET 0x0150
457#define DRA7XX_RM_L4PER_UART3_CONTEXT_OFFSET 0x0154
458#define DRA7XX_PM_L4PER_UART4_WKDEP_OFFSET 0x0158
459#define DRA7XX_RM_L4PER_UART4_CONTEXT_OFFSET 0x015c
460#define DRA7XX_PM_L4PER2_MCASP2_WKDEP_OFFSET 0x0160
461#define DRA7XX_RM_L4PER2_MCASP2_CONTEXT_OFFSET 0x0164
462#define DRA7XX_PM_L4PER2_MCASP3_WKDEP_OFFSET 0x0168
463#define DRA7XX_RM_L4PER2_MCASP3_CONTEXT_OFFSET 0x016c
464#define DRA7XX_PM_L4PER_UART5_WKDEP_OFFSET 0x0170
465#define DRA7XX_RM_L4PER_UART5_CONTEXT_OFFSET 0x0174
466#define DRA7XX_PM_L4PER2_MCASP5_WKDEP_OFFSET 0x0178
467#define DRA7XX_RM_L4PER2_MCASP5_CONTEXT_OFFSET 0x017c
468#define DRA7XX_PM_L4PER2_MCASP6_WKDEP_OFFSET 0x0180
469#define DRA7XX_RM_L4PER2_MCASP6_CONTEXT_OFFSET 0x0184
470#define DRA7XX_PM_L4PER2_MCASP7_WKDEP_OFFSET 0x0188
471#define DRA7XX_RM_L4PER2_MCASP7_CONTEXT_OFFSET 0x018c
472#define DRA7XX_PM_L4PER2_MCASP8_WKDEP_OFFSET 0x0190
473#define DRA7XX_RM_L4PER2_MCASP8_CONTEXT_OFFSET 0x0194
474#define DRA7XX_PM_L4PER2_MCASP4_WKDEP_OFFSET 0x0198
475#define DRA7XX_RM_L4PER2_MCASP4_CONTEXT_OFFSET 0x019c
476#define DRA7XX_RM_L4SEC_AES1_CONTEXT_OFFSET 0x01a4
477#define DRA7XX_RM_L4SEC_AES2_CONTEXT_OFFSET 0x01ac
478#define DRA7XX_RM_L4SEC_DES3DES_CONTEXT_OFFSET 0x01b4
479#define DRA7XX_RM_L4SEC_FPKA_CONTEXT_OFFSET 0x01bc
480#define DRA7XX_RM_L4SEC_RNG_CONTEXT_OFFSET 0x01c4
481#define DRA7XX_RM_L4SEC_SHA2MD51_CONTEXT_OFFSET 0x01cc
482#define DRA7XX_PM_L4PER2_UART7_WKDEP_OFFSET 0x01d0
483#define DRA7XX_RM_L4PER2_UART7_CONTEXT_OFFSET 0x01d4
484#define DRA7XX_RM_L4SEC_DMA_CRYPTO_CONTEXT_OFFSET 0x01dc
485#define DRA7XX_PM_L4PER2_UART8_WKDEP_OFFSET 0x01e0
486#define DRA7XX_RM_L4PER2_UART8_CONTEXT_OFFSET 0x01e4
487#define DRA7XX_PM_L4PER2_UART9_WKDEP_OFFSET 0x01e8
488#define DRA7XX_RM_L4PER2_UART9_CONTEXT_OFFSET 0x01ec
489#define DRA7XX_PM_L4PER2_DCAN2_WKDEP_OFFSET 0x01f0
490#define DRA7XX_RM_L4PER2_DCAN2_CONTEXT_OFFSET 0x01f4
491#define DRA7XX_RM_L4SEC_SHA2MD52_CONTEXT_OFFSET 0x01fc
492
493/* PRM.CUSTEFUSE_PRM register offsets */
494#define DRA7XX_PM_CUSTEFUSE_PWRSTCTRL_OFFSET 0x0000
495#define DRA7XX_PM_CUSTEFUSE_PWRSTST_OFFSET 0x0004
496#define DRA7XX_RM_CUSTEFUSE_EFUSE_CTRL_CUST_CONTEXT_OFFSET 0x0024
497
498/* PRM.WKUPAON_PRM register offsets */
499#define DRA7XX_RM_WKUPAON_L4_WKUP_CONTEXT_OFFSET 0x0000
500#define DRA7XX_PM_WKUPAON_WD_TIMER1_WKDEP_OFFSET 0x0004
501#define DRA7XX_RM_WKUPAON_WD_TIMER1_CONTEXT_OFFSET 0x0008
502#define DRA7XX_PM_WKUPAON_WD_TIMER2_WKDEP_OFFSET 0x000c
503#define DRA7XX_RM_WKUPAON_WD_TIMER2_CONTEXT_OFFSET 0x0010
504#define DRA7XX_PM_WKUPAON_GPIO1_WKDEP_OFFSET 0x0014
505#define DRA7XX_RM_WKUPAON_GPIO1_CONTEXT_OFFSET 0x0018
506#define DRA7XX_PM_WKUPAON_TIMER1_WKDEP_OFFSET 0x001c
507#define DRA7XX_RM_WKUPAON_TIMER1_CONTEXT_OFFSET 0x0020
508#define DRA7XX_PM_WKUPAON_TIMER12_WKDEP_OFFSET 0x0024
509#define DRA7XX_RM_WKUPAON_TIMER12_CONTEXT_OFFSET 0x0028
510#define DRA7XX_RM_WKUPAON_COUNTER_32K_CONTEXT_OFFSET 0x0030
511#define DRA7XX_RM_WKUPAON_SAR_RAM_CONTEXT_OFFSET 0x0040
512#define DRA7XX_PM_WKUPAON_KBD_WKDEP_OFFSET 0x0054
513#define DRA7XX_RM_WKUPAON_KBD_CONTEXT_OFFSET 0x0058
514#define DRA7XX_PM_WKUPAON_UART10_WKDEP_OFFSET 0x005c
515#define DRA7XX_RM_WKUPAON_UART10_CONTEXT_OFFSET 0x0060
516#define DRA7XX_PM_WKUPAON_DCAN1_WKDEP_OFFSET 0x0064
517#define DRA7XX_RM_WKUPAON_DCAN1_CONTEXT_OFFSET 0x0068
518#define DRA7XX_PM_WKUPAON_ADC_WKDEP_OFFSET 0x007c
519#define DRA7XX_RM_WKUPAON_ADC_CONTEXT_OFFSET 0x0080
520#define DRA7XX_RM_WKUPAON_SPARE_SAFETY1_CONTEXT_OFFSET 0x0090
521#define DRA7XX_RM_WKUPAON_SPARE_SAFETY2_CONTEXT_OFFSET 0x0098
522#define DRA7XX_RM_WKUPAON_SPARE_SAFETY3_CONTEXT_OFFSET 0x00a0
523#define DRA7XX_RM_WKUPAON_SPARE_SAFETY4_CONTEXT_OFFSET 0x00a8
524#define DRA7XX_RM_WKUPAON_SPARE_UNKNOWN2_CONTEXT_OFFSET 0x00b0
525#define DRA7XX_RM_WKUPAON_SPARE_UNKNOWN3_CONTEXT_OFFSET 0x00b8
526
527/* PRM.WKUPAON_CM register offsets */
528#define DRA7XX_CM_WKUPAON_CLKSTCTRL_OFFSET 0x0000
529#define DRA7XX_CM_WKUPAON_L4_WKUP_CLKCTRL_OFFSET 0x0020
530#define DRA7XX_CM_WKUPAON_L4_WKUP_CLKCTRL DRA7XX_PRM_REGADDR(DRA7XX_PRM_WKUPAON_CM_INST, 0x0020)
531#define DRA7XX_CM_WKUPAON_WD_TIMER1_CLKCTRL_OFFSET 0x0028
532#define DRA7XX_CM_WKUPAON_WD_TIMER1_CLKCTRL DRA7XX_PRM_REGADDR(DRA7XX_PRM_WKUPAON_CM_INST, 0x0028)
533#define DRA7XX_CM_WKUPAON_WD_TIMER2_CLKCTRL_OFFSET 0x0030
534#define DRA7XX_CM_WKUPAON_WD_TIMER2_CLKCTRL DRA7XX_PRM_REGADDR(DRA7XX_PRM_WKUPAON_CM_INST, 0x0030)
535#define DRA7XX_CM_WKUPAON_GPIO1_CLKCTRL_OFFSET 0x0038
536#define DRA7XX_CM_WKUPAON_GPIO1_CLKCTRL DRA7XX_PRM_REGADDR(DRA7XX_PRM_WKUPAON_CM_INST, 0x0038)
537#define DRA7XX_CM_WKUPAON_TIMER1_CLKCTRL_OFFSET 0x0040
538#define DRA7XX_CM_WKUPAON_TIMER1_CLKCTRL DRA7XX_PRM_REGADDR(DRA7XX_PRM_WKUPAON_CM_INST, 0x0040)
539#define DRA7XX_CM_WKUPAON_TIMER12_CLKCTRL_OFFSET 0x0048
540#define DRA7XX_CM_WKUPAON_TIMER12_CLKCTRL DRA7XX_PRM_REGADDR(DRA7XX_PRM_WKUPAON_CM_INST, 0x0048)
541#define DRA7XX_CM_WKUPAON_COUNTER_32K_CLKCTRL_OFFSET 0x0050
542#define DRA7XX_CM_WKUPAON_COUNTER_32K_CLKCTRL DRA7XX_PRM_REGADDR(DRA7XX_PRM_WKUPAON_CM_INST, 0x0050)
543#define DRA7XX_CM_WKUPAON_SAR_RAM_CLKCTRL_OFFSET 0x0060
544#define DRA7XX_CM_WKUPAON_SAR_RAM_CLKCTRL DRA7XX_PRM_REGADDR(DRA7XX_PRM_WKUPAON_CM_INST, 0x0060)
545#define DRA7XX_CM_WKUPAON_KBD_CLKCTRL_OFFSET 0x0078
546#define DRA7XX_CM_WKUPAON_KBD_CLKCTRL DRA7XX_PRM_REGADDR(DRA7XX_PRM_WKUPAON_CM_INST, 0x0078)
547#define DRA7XX_CM_WKUPAON_UART10_CLKCTRL_OFFSET 0x0080
548#define DRA7XX_CM_WKUPAON_UART10_CLKCTRL DRA7XX_PRM_REGADDR(DRA7XX_PRM_WKUPAON_CM_INST, 0x0080)
549#define DRA7XX_CM_WKUPAON_DCAN1_CLKCTRL_OFFSET 0x0088
550#define DRA7XX_CM_WKUPAON_DCAN1_CLKCTRL DRA7XX_PRM_REGADDR(DRA7XX_PRM_WKUPAON_CM_INST, 0x0088)
551#define DRA7XX_CM_WKUPAON_SCRM_CLKCTRL_OFFSET 0x0090
552#define DRA7XX_CM_WKUPAON_SCRM_CLKCTRL DRA7XX_PRM_REGADDR(DRA7XX_PRM_WKUPAON_CM_INST, 0x0090)
553#define DRA7XX_CM_WKUPAON_IO_SRCOMP_CLKCTRL_OFFSET 0x0098
554#define DRA7XX_CM_WKUPAON_IO_SRCOMP_CLKCTRL DRA7XX_PRM_REGADDR(DRA7XX_PRM_WKUPAON_CM_INST, 0x0098)
555#define DRA7XX_CM_WKUPAON_ADC_CLKCTRL_OFFSET 0x00a0
556#define DRA7XX_CM_WKUPAON_ADC_CLKCTRL DRA7XX_PRM_REGADDR(DRA7XX_PRM_WKUPAON_CM_INST, 0x00a0)
557#define DRA7XX_CM_WKUPAON_SPARE_SAFETY1_CLKCTRL_OFFSET 0x00b0
558#define DRA7XX_CM_WKUPAON_SPARE_SAFETY1_CLKCTRL DRA7XX_PRM_REGADDR(DRA7XX_PRM_WKUPAON_CM_INST, 0x00b0)
559#define DRA7XX_CM_WKUPAON_SPARE_SAFETY2_CLKCTRL_OFFSET 0x00b8
560#define DRA7XX_CM_WKUPAON_SPARE_SAFETY2_CLKCTRL DRA7XX_PRM_REGADDR(DRA7XX_PRM_WKUPAON_CM_INST, 0x00b8)
561#define DRA7XX_CM_WKUPAON_SPARE_SAFETY3_CLKCTRL_OFFSET 0x00c0
562#define DRA7XX_CM_WKUPAON_SPARE_SAFETY3_CLKCTRL DRA7XX_PRM_REGADDR(DRA7XX_PRM_WKUPAON_CM_INST, 0x00c0)
563#define DRA7XX_CM_WKUPAON_SPARE_SAFETY4_CLKCTRL_OFFSET 0x00c8
564#define DRA7XX_CM_WKUPAON_SPARE_SAFETY4_CLKCTRL DRA7XX_PRM_REGADDR(DRA7XX_PRM_WKUPAON_CM_INST, 0x00c8)
565#define DRA7XX_CM_WKUPAON_SPARE_UNKNOWN2_CLKCTRL_OFFSET 0x00d0
566#define DRA7XX_CM_WKUPAON_SPARE_UNKNOWN2_CLKCTRL DRA7XX_PRM_REGADDR(DRA7XX_PRM_WKUPAON_CM_INST, 0x00d0)
567#define DRA7XX_CM_WKUPAON_SPARE_UNKNOWN3_CLKCTRL_OFFSET 0x00d8
568#define DRA7XX_CM_WKUPAON_SPARE_UNKNOWN3_CLKCTRL DRA7XX_PRM_REGADDR(DRA7XX_PRM_WKUPAON_CM_INST, 0x00d8)
569
570/* PRM.EMU_PRM register offsets */
571#define DRA7XX_PM_EMU_PWRSTCTRL_OFFSET 0x0000
572#define DRA7XX_PM_EMU_PWRSTST_OFFSET 0x0004
573#define DRA7XX_RM_EMU_DEBUGSS_CONTEXT_OFFSET 0x0024
574
575/* PRM.EMU_CM register offsets */
576#define DRA7XX_CM_EMU_CLKSTCTRL_OFFSET 0x0000
577#define DRA7XX_CM_EMU_DEBUGSS_CLKCTRL_OFFSET 0x0004
578#define DRA7XX_CM_EMU_DEBUGSS_CLKCTRL DRA7XX_PRM_REGADDR(DRA7XX_PRM_EMU_CM_INST, 0x0004)
579#define DRA7XX_CM_EMU_DYNAMICDEP_OFFSET 0x0008
580#define DRA7XX_CM_EMU_MPU_EMU_DBG_CLKCTRL_OFFSET 0x000c
581#define DRA7XX_CM_EMU_MPU_EMU_DBG_CLKCTRL DRA7XX_PRM_REGADDR(DRA7XX_PRM_EMU_CM_INST, 0x000c)
582
583/* PRM.DSP2_PRM register offsets */
584#define DRA7XX_PM_DSP2_PWRSTCTRL_OFFSET 0x0000
585#define DRA7XX_PM_DSP2_PWRSTST_OFFSET 0x0004
586#define DRA7XX_RM_DSP2_RSTCTRL_OFFSET 0x0010
587#define DRA7XX_RM_DSP2_RSTST_OFFSET 0x0014
588#define DRA7XX_RM_DSP2_DSP2_CONTEXT_OFFSET 0x0024
589
590/* PRM.EVE1_PRM register offsets */
591#define DRA7XX_PM_EVE1_PWRSTCTRL_OFFSET 0x0000
592#define DRA7XX_PM_EVE1_PWRSTST_OFFSET 0x0004
593#define DRA7XX_RM_EVE1_RSTCTRL_OFFSET 0x0010
594#define DRA7XX_RM_EVE1_RSTST_OFFSET 0x0014
595#define DRA7XX_PM_EVE1_EVE1_WKDEP_OFFSET 0x0020
596#define DRA7XX_RM_EVE1_EVE1_CONTEXT_OFFSET 0x0024
597
598/* PRM.EVE2_PRM register offsets */
599#define DRA7XX_PM_EVE2_PWRSTCTRL_OFFSET 0x0000
600#define DRA7XX_PM_EVE2_PWRSTST_OFFSET 0x0004
601#define DRA7XX_RM_EVE2_RSTCTRL_OFFSET 0x0010
602#define DRA7XX_RM_EVE2_RSTST_OFFSET 0x0014
603#define DRA7XX_PM_EVE2_EVE2_WKDEP_OFFSET 0x0020
604#define DRA7XX_RM_EVE2_EVE2_CONTEXT_OFFSET 0x0024
605
606/* PRM.EVE3_PRM register offsets */
607#define DRA7XX_PM_EVE3_PWRSTCTRL_OFFSET 0x0000
608#define DRA7XX_PM_EVE3_PWRSTST_OFFSET 0x0004
609#define DRA7XX_RM_EVE3_RSTCTRL_OFFSET 0x0010
610#define DRA7XX_RM_EVE3_RSTST_OFFSET 0x0014
611#define DRA7XX_PM_EVE3_EVE3_WKDEP_OFFSET 0x0020
612#define DRA7XX_RM_EVE3_EVE3_CONTEXT_OFFSET 0x0024
613
614/* PRM.EVE4_PRM register offsets */
615#define DRA7XX_PM_EVE4_PWRSTCTRL_OFFSET 0x0000
616#define DRA7XX_PM_EVE4_PWRSTST_OFFSET 0x0004
617#define DRA7XX_RM_EVE4_RSTCTRL_OFFSET 0x0010
618#define DRA7XX_RM_EVE4_RSTST_OFFSET 0x0014
619#define DRA7XX_PM_EVE4_EVE4_WKDEP_OFFSET 0x0020
620#define DRA7XX_RM_EVE4_EVE4_CONTEXT_OFFSET 0x0024
621
622/* PRM.RTC_PRM register offsets */
623#define DRA7XX_PM_RTC_RTCSS_WKDEP_OFFSET 0x0000
624#define DRA7XX_RM_RTC_RTCSS_CONTEXT_OFFSET 0x0004
625
626/* PRM.VPE_PRM register offsets */
627#define DRA7XX_PM_VPE_PWRSTCTRL_OFFSET 0x0000
628#define DRA7XX_PM_VPE_PWRSTST_OFFSET 0x0004
629#define DRA7XX_PM_VPE_VPE_WKDEP_OFFSET 0x0020
630#define DRA7XX_RM_VPE_VPE_CONTEXT_OFFSET 0x0024
631
632/* PRM.DEVICE_PRM register offsets */
633#define DRA7XX_PRM_RSTCTRL_OFFSET 0x0000
634#define DRA7XX_PRM_RSTST_OFFSET 0x0004
635#define DRA7XX_PRM_RSTTIME_OFFSET 0x0008
636#define DRA7XX_PRM_CLKREQCTRL_OFFSET 0x000c
637#define DRA7XX_PRM_VOLTCTRL_OFFSET 0x0010
638#define DRA7XX_PRM_PWRREQCTRL_OFFSET 0x0014
639#define DRA7XX_PRM_PSCON_COUNT_OFFSET 0x0018
640#define DRA7XX_PRM_IO_COUNT_OFFSET 0x001c
641#define DRA7XX_PRM_IO_PMCTRL_OFFSET 0x0020
642#define DRA7XX_PRM_VOLTSETUP_WARMRESET_OFFSET 0x0024
643#define DRA7XX_PRM_VOLTSETUP_CORE_OFF_OFFSET 0x0028
644#define DRA7XX_PRM_VOLTSETUP_MPU_OFF_OFFSET 0x002c
645#define DRA7XX_PRM_VOLTSETUP_MM_OFF_OFFSET 0x0030
646#define DRA7XX_PRM_VOLTSETUP_CORE_RET_SLEEP_OFFSET 0x0034
647#define DRA7XX_PRM_VOLTSETUP_MPU_RET_SLEEP_OFFSET 0x0038
648#define DRA7XX_PRM_VOLTSETUP_MM_RET_SLEEP_OFFSET 0x003c
649#define DRA7XX_PRM_SRAM_COUNT_OFFSET 0x00bc
650#define DRA7XX_PRM_SRAM_WKUP_SETUP_OFFSET 0x00c0
651#define DRA7XX_PRM_SLDO_CORE_SETUP_OFFSET 0x00c4
652#define DRA7XX_PRM_SLDO_CORE_CTRL_OFFSET 0x00c8
653#define DRA7XX_PRM_SLDO_MPU_SETUP_OFFSET 0x00cc
654#define DRA7XX_PRM_SLDO_MPU_CTRL_OFFSET 0x00d0
655#define DRA7XX_PRM_SLDO_GPU_SETUP_OFFSET 0x00d4
656#define DRA7XX_PRM_SLDO_GPU_CTRL_OFFSET 0x00d8
657#define DRA7XX_PRM_ABBLDO_MPU_SETUP_OFFSET 0x00dc
658#define DRA7XX_PRM_ABBLDO_MPU_CTRL_OFFSET 0x00e0
659#define DRA7XX_PRM_ABBLDO_GPU_SETUP_OFFSET 0x00e4
660#define DRA7XX_PRM_ABBLDO_GPU_CTRL_OFFSET 0x00e8
661#define DRA7XX_PRM_BANDGAP_SETUP_OFFSET 0x00ec
662#define DRA7XX_PRM_DEVICE_OFF_CTRL_OFFSET 0x00f0
663#define DRA7XX_PRM_PHASE1_CNDP_OFFSET 0x00f4
664#define DRA7XX_PRM_PHASE2A_CNDP_OFFSET 0x00f8
665#define DRA7XX_PRM_PHASE2B_CNDP_OFFSET 0x00fc
666#define DRA7XX_PRM_MODEM_IF_CTRL_OFFSET 0x0100
667#define DRA7XX_PRM_VOLTST_MPU_OFFSET 0x0110
668#define DRA7XX_PRM_VOLTST_MM_OFFSET 0x0114
669#define DRA7XX_PRM_SLDO_DSPEVE_SETUP_OFFSET 0x0118
670#define DRA7XX_PRM_SLDO_IVA_SETUP_OFFSET 0x011c
671#define DRA7XX_PRM_ABBLDO_DSPEVE_CTRL_OFFSET 0x0120
672#define DRA7XX_PRM_ABBLDO_IVA_CTRL_OFFSET 0x0124
673#define DRA7XX_PRM_SLDO_DSPEVE_CTRL_OFFSET 0x0128
674#define DRA7XX_PRM_SLDO_IVA_CTRL_OFFSET 0x012c
675#define DRA7XX_PRM_ABBLDO_DSPEVE_SETUP_OFFSET 0x0130
676#define DRA7XX_PRM_ABBLDO_IVA_SETUP_OFFSET 0x0134
677
678#endif
diff --git a/arch/arm/mach-omap2/prminst44xx.c b/arch/arm/mach-omap2/prminst44xx.c
index c12320c0ae95..6334b96b4097 100644
--- a/arch/arm/mach-omap2/prminst44xx.c
+++ b/arch/arm/mach-omap2/prminst44xx.c
@@ -20,10 +20,13 @@
20#include "common.h" 20#include "common.h"
21#include "prcm-common.h" 21#include "prcm-common.h"
22#include "prm44xx.h" 22#include "prm44xx.h"
23#include "prm54xx.h"
24#include "prm7xx.h"
23#include "prminst44xx.h" 25#include "prminst44xx.h"
24#include "prm-regbits-44xx.h" 26#include "prm-regbits-44xx.h"
25#include "prcm44xx.h" 27#include "prcm44xx.h"
26#include "prcm_mpu44xx.h" 28#include "prcm_mpu44xx.h"
29#include "soc.h"
27 30
28static void __iomem *_prm_bases[OMAP4_MAX_PRCM_PARTITIONS]; 31static void __iomem *_prm_bases[OMAP4_MAX_PRCM_PARTITIONS];
29 32
@@ -165,10 +168,19 @@ int omap4_prminst_deassert_hardreset(u8 shift, u8 part, s16 inst,
165void omap4_prminst_global_warm_sw_reset(void) 168void omap4_prminst_global_warm_sw_reset(void)
166{ 169{
167 u32 v; 170 u32 v;
168 171 s16 dev_inst;
169 v = omap4_prminst_read_inst_reg(OMAP4430_PRM_PARTITION, 172
170 OMAP4430_PRM_DEVICE_INST, 173 if (cpu_is_omap44xx())
171 OMAP4_PRM_RSTCTRL_OFFSET); 174 dev_inst = OMAP4430_PRM_DEVICE_INST;
175 else if (soc_is_omap54xx())
176 dev_inst = OMAP54XX_PRM_DEVICE_INST;
177 else if (soc_is_dra7xx())
178 dev_inst = DRA7XX_PRM_DEVICE_INST;
179 else
180 return;
181
182 v = omap4_prminst_read_inst_reg(OMAP4430_PRM_PARTITION, dev_inst,
183 OMAP4_PRM_RSTCTRL_OFFSET);
172 v |= OMAP4430_RST_GLOBAL_WARM_SW_MASK; 184 v |= OMAP4430_RST_GLOBAL_WARM_SW_MASK;
173 omap4_prminst_write_inst_reg(v, OMAP4430_PRM_PARTITION, 185 omap4_prminst_write_inst_reg(v, OMAP4430_PRM_PARTITION,
174 OMAP4430_PRM_DEVICE_INST, 186 OMAP4430_PRM_DEVICE_INST,
diff --git a/arch/arm/mach-omap2/soc.h b/arch/arm/mach-omap2/soc.h
index 8c616e436bc7..4588df1447ed 100644
--- a/arch/arm/mach-omap2/soc.h
+++ b/arch/arm/mach-omap2/soc.h
@@ -8,6 +8,7 @@
8 * Written by Tony Lindgren <tony.lindgren@nokia.com> 8 * Written by Tony Lindgren <tony.lindgren@nokia.com>
9 * 9 *
10 * Added OMAP4/5 specific defines - Santosh Shilimkar<santosh.shilimkar@ti.com> 10 * Added OMAP4/5 specific defines - Santosh Shilimkar<santosh.shilimkar@ti.com>
11 * Added DRA7xxx specific defines - Sricharan R<r.sricharan@ti.com>
11 * 12 *
12 * This program is free software; you can redistribute it and/or modify 13 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by 14 * it under the terms of the GNU General Public License as published by
@@ -35,6 +36,7 @@
35#ifndef __ASSEMBLY__ 36#ifndef __ASSEMBLY__
36 37
37#include <linux/bitops.h> 38#include <linux/bitops.h>
39#include <linux/of.h>
38 40
39/* 41/*
40 * Test if multicore OMAP support is needed 42 * Test if multicore OMAP support is needed
@@ -105,6 +107,15 @@
105# endif 107# endif
106#endif 108#endif
107 109
110#ifdef CONFIG_SOC_DRA7XX
111# ifdef OMAP_NAME
112# undef MULTI_OMAP2
113# define MULTI_OMAP2
114# else
115# define OMAP_NAME DRA7XX
116# endif
117#endif
118
108/* 119/*
109 * Omap device type i.e. EMU/HS/TST/GP/BAD 120 * Omap device type i.e. EMU/HS/TST/GP/BAD
110 */ 121 */
@@ -233,6 +244,7 @@ IS_AM_SUBCLASS(437x, 0x437)
233#define cpu_is_omap447x() 0 244#define cpu_is_omap447x() 0
234#define soc_is_omap54xx() 0 245#define soc_is_omap54xx() 0
235#define soc_is_omap543x() 0 246#define soc_is_omap543x() 0
247#define soc_is_dra7xx() 0
236 248
237#if defined(MULTI_OMAP2) 249#if defined(MULTI_OMAP2)
238# if defined(CONFIG_ARCH_OMAP2) 250# if defined(CONFIG_ARCH_OMAP2)
@@ -379,6 +391,11 @@ IS_OMAP_TYPE(3430, 0x3430)
379# define soc_is_omap543x() is_omap543x() 391# define soc_is_omap543x() is_omap543x()
380#endif 392#endif
381 393
394#if defined(CONFIG_SOC_DRA7XX)
395#undef soc_is_dra7xx
396#define soc_is_dra7xx() (of_machine_is_compatible("ti,dra7"))
397#endif
398
382/* Various silicon revisions for omap2 */ 399/* Various silicon revisions for omap2 */
383#define OMAP242X_CLASS 0x24200024 400#define OMAP242X_CLASS 0x24200024
384#define OMAP2420_REV_ES1_0 OMAP242X_CLASS 401#define OMAP2420_REV_ES1_0 OMAP242X_CLASS
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c
index b37e1fcbad56..fa74a0625da1 100644
--- a/arch/arm/mach-omap2/timer.c
+++ b/arch/arm/mach-omap2/timer.c
@@ -537,7 +537,7 @@ static void __init realtime_counter_init(void)
537 reg |= num; 537 reg |= num;
538 __raw_writel(reg, base + INCREMENTER_NUMERATOR_OFFSET); 538 __raw_writel(reg, base + INCREMENTER_NUMERATOR_OFFSET);
539 539
540 reg = __raw_readl(base + INCREMENTER_NUMERATOR_OFFSET) & 540 reg = __raw_readl(base + INCREMENTER_DENUMERATOR_RELOAD_OFFSET) &
541 NUMERATOR_DENUMERATOR_MASK; 541 NUMERATOR_DENUMERATOR_MASK;
542 reg |= den; 542 reg |= den;
543 __raw_writel(reg, base + INCREMENTER_DENUMERATOR_RELOAD_OFFSET); 543 __raw_writel(reg, base + INCREMENTER_DENUMERATOR_RELOAD_OFFSET);
@@ -594,13 +594,14 @@ OMAP_SYS_GP_TIMER_INIT(3, 2, "timer_sys_ck", NULL,
594 1, "timer_sys_ck", "ti,timer-alwon"); 594 1, "timer_sys_ck", "ti,timer-alwon");
595#endif 595#endif
596 596
597#if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) 597#if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) || \
598 defined(CONFIG_SOC_DRA7XX)
598static OMAP_SYS_32K_TIMER_INIT(4, 1, "timer_32k_ck", "ti,timer-alwon", 599static OMAP_SYS_32K_TIMER_INIT(4, 1, "timer_32k_ck", "ti,timer-alwon",
599 2, "sys_clkin_ck", NULL); 600 2, "sys_clkin_ck", NULL);
600#endif 601#endif
601 602
602#ifdef CONFIG_ARCH_OMAP4 603#ifdef CONFIG_ARCH_OMAP4
603#ifdef CONFIG_LOCAL_TIMERS 604#ifdef CONFIG_HAVE_ARM_TWD
604static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, OMAP44XX_LOCAL_TWD_BASE, 29); 605static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, OMAP44XX_LOCAL_TWD_BASE, 29);
605void __init omap4_local_timer_init(void) 606void __init omap4_local_timer_init(void)
606{ 607{
@@ -619,12 +620,12 @@ void __init omap4_local_timer_init(void)
619 pr_err("twd_local_timer_register failed %d\n", err); 620 pr_err("twd_local_timer_register failed %d\n", err);
620 } 621 }
621} 622}
622#else /* CONFIG_LOCAL_TIMERS */ 623#else
623void __init omap4_local_timer_init(void) 624void __init omap4_local_timer_init(void)
624{ 625{
625 omap4_sync32k_timer_init(); 626 omap4_sync32k_timer_init();
626} 627}
627#endif /* CONFIG_LOCAL_TIMERS */ 628#endif /* CONFIG_HAVE_ARM_TWD */
628#endif /* CONFIG_ARCH_OMAP4 */ 629#endif /* CONFIG_ARCH_OMAP4 */
629 630
630#ifdef CONFIG_SOC_OMAP5 631#ifdef CONFIG_SOC_OMAP5
diff --git a/arch/arm/mach-omap2/usb-host.c b/arch/arm/mach-omap2/usb-host.c
index 2eb19d4d0aa1..e83a6a4b184a 100644
--- a/arch/arm/mach-omap2/usb-host.c
+++ b/arch/arm/mach-omap2/usb-host.c
@@ -28,7 +28,7 @@
28#include <linux/io.h> 28#include <linux/io.h>
29#include <linux/gpio.h> 29#include <linux/gpio.h>
30#include <linux/usb/phy.h> 30#include <linux/usb/phy.h>
31#include <linux/usb/nop-usb-xceiv.h> 31#include <linux/usb/usb_phy_gen_xceiv.h>
32 32
33#include "soc.h" 33#include "soc.h"
34#include "omap_device.h" 34#include "omap_device.h"
@@ -349,7 +349,7 @@ static struct fixed_voltage_config hsusb_reg_config = {
349 /* .init_data filled later */ 349 /* .init_data filled later */
350}; 350};
351 351
352static const char *nop_name = "nop_usb_xceiv"; /* NOP PHY driver */ 352static const char *nop_name = "usb_phy_gen_xceiv"; /* NOP PHY driver */
353static const char *reg_name = "reg-fixed-voltage"; /* Regulator driver */ 353static const char *reg_name = "reg-fixed-voltage"; /* Regulator driver */
354 354
355/** 355/**
@@ -460,9 +460,9 @@ int usbhs_init_phys(struct usbhs_phy_data *phy, int num_phys)
460 pdevinfo.name = nop_name; 460 pdevinfo.name = nop_name;
461 pdevinfo.id = phy->port; 461 pdevinfo.id = phy->port;
462 pdevinfo.data = phy->platform_data; 462 pdevinfo.data = phy->platform_data;
463 pdevinfo.size_data = sizeof(struct nop_usb_xceiv_platform_data); 463 pdevinfo.size_data =
464 464 sizeof(struct usb_phy_gen_xceiv_platform_data);
465 scnprintf(phy_id, MAX_STR, "nop_usb_xceiv.%d", 465 scnprintf(phy_id, MAX_STR, "usb_phy_gen_xceiv.%d",
466 phy->port); 466 phy->port);
467 pdev = platform_device_register_full(&pdevinfo); 467 pdev = platform_device_register_full(&pdevinfo);
468 if (IS_ERR(pdev)) { 468 if (IS_ERR(pdev)) {
diff --git a/arch/arm/mach-orion5x/common.c b/arch/arm/mach-orion5x/common.c
index b41599f98a8e..91a5852b44f3 100644
--- a/arch/arm/mach-orion5x/common.c
+++ b/arch/arm/mach-orion5x/common.c
@@ -174,8 +174,10 @@ void __init orion5x_xor_init(void)
174 ****************************************************************************/ 174 ****************************************************************************/
175static void __init orion5x_crypto_init(void) 175static void __init orion5x_crypto_init(void)
176{ 176{
177 mvebu_mbus_add_window("sram", ORION5X_SRAM_PHYS_BASE, 177 mvebu_mbus_add_window_by_id(ORION_MBUS_SRAM_TARGET,
178 ORION5X_SRAM_SIZE); 178 ORION_MBUS_SRAM_ATTR,
179 ORION5X_SRAM_PHYS_BASE,
180 ORION5X_SRAM_SIZE);
179 orion_crypto_init(ORION5X_CRYPTO_PHYS_BASE, ORION5X_SRAM_PHYS_BASE, 181 orion_crypto_init(ORION5X_CRYPTO_PHYS_BASE, ORION5X_SRAM_PHYS_BASE,
180 SZ_8K, IRQ_ORION5X_CESA); 182 SZ_8K, IRQ_ORION5X_CESA);
181} 183}
@@ -222,22 +224,24 @@ void orion5x_setup_wins(void)
222 * The PCIe windows will no longer be statically allocated 224 * The PCIe windows will no longer be statically allocated
223 * here once Orion5x is migrated to the pci-mvebu driver. 225 * here once Orion5x is migrated to the pci-mvebu driver.
224 */ 226 */
225 mvebu_mbus_add_window_remap_flags("pcie0.0", ORION5X_PCIE_IO_PHYS_BASE, 227 mvebu_mbus_add_window_remap_by_id(ORION_MBUS_PCIE_IO_TARGET,
228 ORION_MBUS_PCIE_IO_ATTR,
229 ORION5X_PCIE_IO_PHYS_BASE,
226 ORION5X_PCIE_IO_SIZE, 230 ORION5X_PCIE_IO_SIZE,
227 ORION5X_PCIE_IO_BUS_BASE, 231 ORION5X_PCIE_IO_BUS_BASE);
228 MVEBU_MBUS_PCI_IO); 232 mvebu_mbus_add_window_by_id(ORION_MBUS_PCIE_MEM_TARGET,
229 mvebu_mbus_add_window_remap_flags("pcie0.0", ORION5X_PCIE_MEM_PHYS_BASE, 233 ORION_MBUS_PCIE_MEM_ATTR,
230 ORION5X_PCIE_MEM_SIZE, 234 ORION5X_PCIE_MEM_PHYS_BASE,
231 MVEBU_MBUS_NO_REMAP, 235 ORION5X_PCIE_MEM_SIZE);
232 MVEBU_MBUS_PCI_MEM); 236 mvebu_mbus_add_window_remap_by_id(ORION_MBUS_PCI_IO_TARGET,
233 mvebu_mbus_add_window_remap_flags("pci0.0", ORION5X_PCI_IO_PHYS_BASE, 237 ORION_MBUS_PCI_IO_ATTR,
238 ORION5X_PCI_IO_PHYS_BASE,
234 ORION5X_PCI_IO_SIZE, 239 ORION5X_PCI_IO_SIZE,
235 ORION5X_PCI_IO_BUS_BASE, 240 ORION5X_PCI_IO_BUS_BASE);
236 MVEBU_MBUS_PCI_IO); 241 mvebu_mbus_add_window_by_id(ORION_MBUS_PCI_MEM_TARGET,
237 mvebu_mbus_add_window_remap_flags("pci0.0", ORION5X_PCI_MEM_PHYS_BASE, 242 ORION_MBUS_PCI_MEM_ATTR,
238 ORION5X_PCI_MEM_SIZE, 243 ORION5X_PCI_MEM_PHYS_BASE,
239 MVEBU_MBUS_NO_REMAP, 244 ORION5X_PCI_MEM_SIZE);
240 MVEBU_MBUS_PCI_MEM);
241} 245}
242 246
243int orion5x_tclk; 247int orion5x_tclk;
diff --git a/arch/arm/mach-orion5x/common.h b/arch/arm/mach-orion5x/common.h
index a909afb384fb..f565f9944af2 100644
--- a/arch/arm/mach-orion5x/common.h
+++ b/arch/arm/mach-orion5x/common.h
@@ -7,6 +7,23 @@ struct dsa_platform_data;
7struct mv643xx_eth_platform_data; 7struct mv643xx_eth_platform_data;
8struct mv_sata_platform_data; 8struct mv_sata_platform_data;
9 9
10#define ORION_MBUS_PCIE_MEM_TARGET 0x04
11#define ORION_MBUS_PCIE_MEM_ATTR 0x59
12#define ORION_MBUS_PCIE_IO_TARGET 0x04
13#define ORION_MBUS_PCIE_IO_ATTR 0x51
14#define ORION_MBUS_PCIE_WA_TARGET 0x04
15#define ORION_MBUS_PCIE_WA_ATTR 0x79
16#define ORION_MBUS_PCI_MEM_TARGET 0x03
17#define ORION_MBUS_PCI_MEM_ATTR 0x59
18#define ORION_MBUS_PCI_IO_TARGET 0x03
19#define ORION_MBUS_PCI_IO_ATTR 0x51
20#define ORION_MBUS_DEVBUS_BOOT_TARGET 0x01
21#define ORION_MBUS_DEVBUS_BOOT_ATTR 0x0f
22#define ORION_MBUS_DEVBUS_TARGET(cs) 0x01
23#define ORION_MBUS_DEVBUS_ATTR(cs) (~(1 << cs))
24#define ORION_MBUS_SRAM_TARGET 0x00
25#define ORION_MBUS_SRAM_ATTR 0x00
26
10/* 27/*
11 * Basic Orion init functions used early by machine-setup. 28 * Basic Orion init functions used early by machine-setup.
12 */ 29 */
diff --git a/arch/arm/mach-orion5x/d2net-setup.c b/arch/arm/mach-orion5x/d2net-setup.c
index 16c88bbabc98..8f68b745c1d5 100644
--- a/arch/arm/mach-orion5x/d2net-setup.c
+++ b/arch/arm/mach-orion5x/d2net-setup.c
@@ -317,8 +317,10 @@ static void __init d2net_init(void)
317 d2net_sata_power_init(); 317 d2net_sata_power_init();
318 orion5x_sata_init(&d2net_sata_data); 318 orion5x_sata_init(&d2net_sata_data);
319 319
320 mvebu_mbus_add_window("devbus-boot", D2NET_NOR_BOOT_BASE, 320 mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET,
321 D2NET_NOR_BOOT_SIZE); 321 ORION_MBUS_DEVBUS_BOOT_ATTR,
322 D2NET_NOR_BOOT_BASE,
323 D2NET_NOR_BOOT_SIZE);
322 platform_device_register(&d2net_nor_flash); 324 platform_device_register(&d2net_nor_flash);
323 325
324 platform_device_register(&d2net_gpio_buttons); 326 platform_device_register(&d2net_gpio_buttons);
diff --git a/arch/arm/mach-orion5x/db88f5281-setup.c b/arch/arm/mach-orion5x/db88f5281-setup.c
index 4e1263da38bb..4b2aefd1d961 100644
--- a/arch/arm/mach-orion5x/db88f5281-setup.c
+++ b/arch/arm/mach-orion5x/db88f5281-setup.c
@@ -340,19 +340,27 @@ static void __init db88f5281_init(void)
340 orion5x_uart0_init(); 340 orion5x_uart0_init();
341 orion5x_uart1_init(); 341 orion5x_uart1_init();
342 342
343 mvebu_mbus_add_window("devbus-boot", DB88F5281_NOR_BOOT_BASE, 343 mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET,
344 DB88F5281_NOR_BOOT_SIZE); 344 ORION_MBUS_DEVBUS_BOOT_ATTR,
345 DB88F5281_NOR_BOOT_BASE,
346 DB88F5281_NOR_BOOT_SIZE);
345 platform_device_register(&db88f5281_boot_flash); 347 platform_device_register(&db88f5281_boot_flash);
346 348
347 mvebu_mbus_add_window("devbus-cs0", DB88F5281_7SEG_BASE, 349 mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_TARGET(0),
348 DB88F5281_7SEG_SIZE); 350 ORION_MBUS_DEVBUS_ATTR(0),
351 DB88F5281_7SEG_BASE,
352 DB88F5281_7SEG_SIZE);
349 353
350 mvebu_mbus_add_window("devbus-cs1", DB88F5281_NOR_BASE, 354 mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_TARGET(1),
351 DB88F5281_NOR_SIZE); 355 ORION_MBUS_DEVBUS_ATTR(1),
356 DB88F5281_NOR_BASE,
357 DB88F5281_NOR_SIZE);
352 platform_device_register(&db88f5281_nor_flash); 358 platform_device_register(&db88f5281_nor_flash);
353 359
354 mvebu_mbus_add_window("devbus-cs2", DB88F5281_NAND_BASE, 360 mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_TARGET(2),
355 DB88F5281_NAND_SIZE); 361 ORION_MBUS_DEVBUS_ATTR(2),
362 DB88F5281_NAND_BASE,
363 DB88F5281_NAND_SIZE);
356 platform_device_register(&db88f5281_nand_flash); 364 platform_device_register(&db88f5281_nand_flash);
357 365
358 i2c_register_board_info(0, &db88f5281_i2c_rtc, 1); 366 i2c_register_board_info(0, &db88f5281_i2c_rtc, 1);
diff --git a/arch/arm/mach-orion5x/dns323-setup.c b/arch/arm/mach-orion5x/dns323-setup.c
index 9e6baf581ed3..70974732cbf0 100644
--- a/arch/arm/mach-orion5x/dns323-setup.c
+++ b/arch/arm/mach-orion5x/dns323-setup.c
@@ -611,8 +611,10 @@ static void __init dns323_init(void)
611 /* setup flash mapping 611 /* setup flash mapping
612 * CS3 holds a 8 MB Spansion S29GL064M90TFIR4 612 * CS3 holds a 8 MB Spansion S29GL064M90TFIR4
613 */ 613 */
614 mvebu_mbus_add_window("devbus-boot", DNS323_NOR_BOOT_BASE, 614 mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET,
615 DNS323_NOR_BOOT_SIZE); 615 ORION_MBUS_DEVBUS_BOOT_ATTR,
616 DNS323_NOR_BOOT_BASE,
617 DNS323_NOR_BOOT_SIZE);
616 platform_device_register(&dns323_nor_flash); 618 platform_device_register(&dns323_nor_flash);
617 619
618 /* Sort out LEDs, Buttons and i2c devices */ 620 /* Sort out LEDs, Buttons and i2c devices */
diff --git a/arch/arm/mach-orion5x/edmini_v2-setup.c b/arch/arm/mach-orion5x/edmini_v2-setup.c
index 147615510dd0..f66c1b2ee8c1 100644
--- a/arch/arm/mach-orion5x/edmini_v2-setup.c
+++ b/arch/arm/mach-orion5x/edmini_v2-setup.c
@@ -23,8 +23,8 @@
23#include <linux/platform_device.h> 23#include <linux/platform_device.h>
24#include <linux/pci.h> 24#include <linux/pci.h>
25#include <linux/irq.h> 25#include <linux/irq.h>
26#include <linux/mbus.h>
26#include <linux/mtd/physmap.h> 27#include <linux/mtd/physmap.h>
27#include <linux/mv643xx_eth.h>
28#include <linux/leds.h> 28#include <linux/leds.h>
29#include <linux/gpio_keys.h> 29#include <linux/gpio_keys.h>
30#include <linux/input.h> 30#include <linux/input.h>
@@ -96,14 +96,6 @@ static struct platform_device edmini_v2_nor_flash = {
96}; 96};
97 97
98/***************************************************************************** 98/*****************************************************************************
99 * Ethernet
100 ****************************************************************************/
101
102static struct mv643xx_eth_platform_data edmini_v2_eth_data = {
103 .phy_addr = 8,
104};
105
106/*****************************************************************************
107 * RTC 5C372a on I2C bus 99 * RTC 5C372a on I2C bus
108 ****************************************************************************/ 100 ****************************************************************************/
109 101
@@ -152,10 +144,11 @@ void __init edmini_v2_init(void)
152 * Configure peripherals. 144 * Configure peripherals.
153 */ 145 */
154 orion5x_ehci0_init(); 146 orion5x_ehci0_init();
155 orion5x_eth_init(&edmini_v2_eth_data);
156 147
157 mvebu_mbus_add_window("devbus-boot", EDMINI_V2_NOR_BOOT_BASE, 148 mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET,
158 EDMINI_V2_NOR_BOOT_SIZE); 149 ORION_MBUS_DEVBUS_BOOT_ATTR,
150 EDMINI_V2_NOR_BOOT_BASE,
151 EDMINI_V2_NOR_BOOT_SIZE);
159 platform_device_register(&edmini_v2_nor_flash); 152 platform_device_register(&edmini_v2_nor_flash);
160 153
161 pr_notice("edmini_v2: USB device port, flash write and power-off " 154 pr_notice("edmini_v2: USB device port, flash write and power-off "
diff --git a/arch/arm/mach-orion5x/include/mach/debug-macro.S b/arch/arm/mach-orion5x/include/mach/debug-macro.S
deleted file mode 100644
index f340ed8f8dd0..000000000000
--- a/arch/arm/mach-orion5x/include/mach/debug-macro.S
+++ /dev/null
@@ -1,21 +0,0 @@
1/*
2 * arch/arm/mach-orion5x/include/mach/debug-macro.S
3 *
4 * Debugging macro include header
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9*/
10
11#include <mach/orion5x.h>
12
13 .macro addruart, rp, rv, tmp
14 ldr \rp, =ORION5X_REGS_PHYS_BASE
15 ldr \rv, =ORION5X_REGS_VIRT_BASE
16 orr \rp, \rp, #0x00012000
17 orr \rv, \rv, #0x00012000
18 .endm
19
20#define UART_SHIFT 2
21#include <asm/hardware/debug-8250.S>
diff --git a/arch/arm/mach-orion5x/kurobox_pro-setup.c b/arch/arm/mach-orion5x/kurobox_pro-setup.c
index aae10e4a917c..fe6a48a325e8 100644
--- a/arch/arm/mach-orion5x/kurobox_pro-setup.c
+++ b/arch/arm/mach-orion5x/kurobox_pro-setup.c
@@ -359,13 +359,17 @@ static void __init kurobox_pro_init(void)
359 orion5x_uart1_init(); 359 orion5x_uart1_init();
360 orion5x_xor_init(); 360 orion5x_xor_init();
361 361
362 mvebu_mbus_add_window("devbus-boot", KUROBOX_PRO_NOR_BOOT_BASE, 362 mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET,
363 KUROBOX_PRO_NOR_BOOT_SIZE); 363 ORION_MBUS_DEVBUS_BOOT_ATTR,
364 KUROBOX_PRO_NOR_BOOT_BASE,
365 KUROBOX_PRO_NOR_BOOT_SIZE);
364 platform_device_register(&kurobox_pro_nor_flash); 366 platform_device_register(&kurobox_pro_nor_flash);
365 367
366 if (machine_is_kurobox_pro()) { 368 if (machine_is_kurobox_pro()) {
367 mvebu_mbus_add_window("devbus-cs0", KUROBOX_PRO_NAND_BASE, 369 mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_TARGET(0),
368 KUROBOX_PRO_NAND_SIZE); 370 ORION_MBUS_DEVBUS_ATTR(0),
371 KUROBOX_PRO_NAND_BASE,
372 KUROBOX_PRO_NAND_SIZE);
369 platform_device_register(&kurobox_pro_nand_flash); 373 platform_device_register(&kurobox_pro_nand_flash);
370 } 374 }
371 375
diff --git a/arch/arm/mach-orion5x/ls-chl-setup.c b/arch/arm/mach-orion5x/ls-chl-setup.c
index 6234977b5aea..028ea038d404 100644
--- a/arch/arm/mach-orion5x/ls-chl-setup.c
+++ b/arch/arm/mach-orion5x/ls-chl-setup.c
@@ -294,8 +294,10 @@ static void __init lschl_init(void)
294 orion5x_uart0_init(); 294 orion5x_uart0_init();
295 orion5x_xor_init(); 295 orion5x_xor_init();
296 296
297 mvebu_mbus_add_window("devbus-boot", LSCHL_NOR_BOOT_BASE, 297 mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET,
298 LSCHL_NOR_BOOT_SIZE); 298 ORION_MBUS_DEVBUS_BOOT_ATTR,
299 LSCHL_NOR_BOOT_BASE,
300 LSCHL_NOR_BOOT_SIZE);
299 platform_device_register(&lschl_nor_flash); 301 platform_device_register(&lschl_nor_flash);
300 302
301 platform_device_register(&lschl_leds); 303 platform_device_register(&lschl_leds);
diff --git a/arch/arm/mach-orion5x/ls_hgl-setup.c b/arch/arm/mach-orion5x/ls_hgl-setup.c
index fe04c4b64569..32b7129b767d 100644
--- a/arch/arm/mach-orion5x/ls_hgl-setup.c
+++ b/arch/arm/mach-orion5x/ls_hgl-setup.c
@@ -243,8 +243,10 @@ static void __init ls_hgl_init(void)
243 orion5x_uart0_init(); 243 orion5x_uart0_init();
244 orion5x_xor_init(); 244 orion5x_xor_init();
245 245
246 mvebu_mbus_add_window("devbus-boot", LS_HGL_NOR_BOOT_BASE, 246 mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET,
247 LS_HGL_NOR_BOOT_SIZE); 247 ORION_MBUS_DEVBUS_BOOT_ATTR,
248 LS_HGL_NOR_BOOT_BASE,
249 LS_HGL_NOR_BOOT_SIZE);
248 platform_device_register(&ls_hgl_nor_flash); 250 platform_device_register(&ls_hgl_nor_flash);
249 251
250 platform_device_register(&ls_hgl_button_device); 252 platform_device_register(&ls_hgl_button_device);
diff --git a/arch/arm/mach-orion5x/lsmini-setup.c b/arch/arm/mach-orion5x/lsmini-setup.c
index ca4dbe973daf..a6493e76f96d 100644
--- a/arch/arm/mach-orion5x/lsmini-setup.c
+++ b/arch/arm/mach-orion5x/lsmini-setup.c
@@ -244,8 +244,10 @@ static void __init lsmini_init(void)
244 orion5x_uart0_init(); 244 orion5x_uart0_init();
245 orion5x_xor_init(); 245 orion5x_xor_init();
246 246
247 mvebu_mbus_add_window("devbus-boot", LSMINI_NOR_BOOT_BASE, 247 mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET,
248 LSMINI_NOR_BOOT_SIZE); 248 ORION_MBUS_DEVBUS_BOOT_ATTR,
249 LSMINI_NOR_BOOT_BASE,
250 LSMINI_NOR_BOOT_SIZE);
249 platform_device_register(&lsmini_nor_flash); 251 platform_device_register(&lsmini_nor_flash);
250 252
251 platform_device_register(&lsmini_button_device); 253 platform_device_register(&lsmini_button_device);
diff --git a/arch/arm/mach-orion5x/mss2-setup.c b/arch/arm/mach-orion5x/mss2-setup.c
index 827acbafc9dc..e105130ba51c 100644
--- a/arch/arm/mach-orion5x/mss2-setup.c
+++ b/arch/arm/mach-orion5x/mss2-setup.c
@@ -241,8 +241,10 @@ static void __init mss2_init(void)
241 orion5x_uart0_init(); 241 orion5x_uart0_init();
242 orion5x_xor_init(); 242 orion5x_xor_init();
243 243
244 mvebu_mbus_add_window("devbus-boot", MSS2_NOR_BOOT_BASE, 244 mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET,
245 MSS2_NOR_BOOT_SIZE); 245 ORION_MBUS_DEVBUS_BOOT_ATTR,
246 MSS2_NOR_BOOT_BASE,
247 MSS2_NOR_BOOT_SIZE);
246 platform_device_register(&mss2_nor_flash); 248 platform_device_register(&mss2_nor_flash);
247 249
248 platform_device_register(&mss2_button_device); 250 platform_device_register(&mss2_button_device);
diff --git a/arch/arm/mach-orion5x/mv2120-setup.c b/arch/arm/mach-orion5x/mv2120-setup.c
index 92600ae2b4b6..e032f01da49e 100644
--- a/arch/arm/mach-orion5x/mv2120-setup.c
+++ b/arch/arm/mach-orion5x/mv2120-setup.c
@@ -204,8 +204,10 @@ static void __init mv2120_init(void)
204 orion5x_uart0_init(); 204 orion5x_uart0_init();
205 orion5x_xor_init(); 205 orion5x_xor_init();
206 206
207 mvebu_mbus_add_window("devbus-boot", MV2120_NOR_BOOT_BASE, 207 mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET,
208 MV2120_NOR_BOOT_SIZE); 208 ORION_MBUS_DEVBUS_BOOT_ATTR,
209 MV2120_NOR_BOOT_BASE,
210 MV2120_NOR_BOOT_SIZE);
209 platform_device_register(&mv2120_nor_flash); 211 platform_device_register(&mv2120_nor_flash);
210 212
211 platform_device_register(&mv2120_button_device); 213 platform_device_register(&mv2120_button_device);
diff --git a/arch/arm/mach-orion5x/net2big-setup.c b/arch/arm/mach-orion5x/net2big-setup.c
index dd0641a0d074..ba73dc7ffb9e 100644
--- a/arch/arm/mach-orion5x/net2big-setup.c
+++ b/arch/arm/mach-orion5x/net2big-setup.c
@@ -397,8 +397,10 @@ static void __init net2big_init(void)
397 net2big_sata_power_init(); 397 net2big_sata_power_init();
398 orion5x_sata_init(&net2big_sata_data); 398 orion5x_sata_init(&net2big_sata_data);
399 399
400 mvebu_mbus_add_window("devbus-boot", NET2BIG_NOR_BOOT_BASE, 400 mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET,
401 NET2BIG_NOR_BOOT_SIZE); 401 ORION_MBUS_DEVBUS_BOOT_ATTR,
402 NET2BIG_NOR_BOOT_BASE,
403 NET2BIG_NOR_BOOT_SIZE);
402 platform_device_register(&net2big_nor_flash); 404 platform_device_register(&net2big_nor_flash);
403 405
404 platform_device_register(&net2big_gpio_buttons); 406 platform_device_register(&net2big_gpio_buttons);
diff --git a/arch/arm/mach-orion5x/pci.c b/arch/arm/mach-orion5x/pci.c
index 503368023bb1..7fab67053030 100644
--- a/arch/arm/mach-orion5x/pci.c
+++ b/arch/arm/mach-orion5x/pci.c
@@ -157,11 +157,10 @@ static int __init pcie_setup(struct pci_sys_data *sys)
157 if (dev == MV88F5181_DEV_ID || dev == MV88F5182_DEV_ID) { 157 if (dev == MV88F5181_DEV_ID || dev == MV88F5182_DEV_ID) {
158 printk(KERN_NOTICE "Applying Orion-1/Orion-NAS PCIe config " 158 printk(KERN_NOTICE "Applying Orion-1/Orion-NAS PCIe config "
159 "read transaction workaround\n"); 159 "read transaction workaround\n");
160 mvebu_mbus_add_window_remap_flags("pcie0.0", 160 mvebu_mbus_add_window_by_id(ORION_MBUS_PCIE_WA_TARGET,
161 ORION5X_PCIE_WA_PHYS_BASE, 161 ORION_MBUS_PCIE_WA_ATTR,
162 ORION5X_PCIE_WA_SIZE, 162 ORION5X_PCIE_WA_PHYS_BASE,
163 MVEBU_MBUS_NO_REMAP, 163 ORION5X_PCIE_WA_SIZE);
164 MVEBU_MBUS_PCI_WA);
165 pcie_ops.read = pcie_rd_conf_wa; 164 pcie_ops.read = pcie_rd_conf_wa;
166 } 165 }
167 166
diff --git a/arch/arm/mach-orion5x/rd88f5181l-fxo-setup.c b/arch/arm/mach-orion5x/rd88f5181l-fxo-setup.c
index 1c4498bf650a..213b3e143c57 100644
--- a/arch/arm/mach-orion5x/rd88f5181l-fxo-setup.c
+++ b/arch/arm/mach-orion5x/rd88f5181l-fxo-setup.c
@@ -123,8 +123,10 @@ static void __init rd88f5181l_fxo_init(void)
123 orion5x_eth_switch_init(&rd88f5181l_fxo_switch_plat_data, NO_IRQ); 123 orion5x_eth_switch_init(&rd88f5181l_fxo_switch_plat_data, NO_IRQ);
124 orion5x_uart0_init(); 124 orion5x_uart0_init();
125 125
126 mvebu_mbus_add_window("devbus-boot", RD88F5181L_FXO_NOR_BOOT_BASE, 126 mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET,
127 RD88F5181L_FXO_NOR_BOOT_SIZE); 127 ORION_MBUS_DEVBUS_BOOT_ATTR,
128 RD88F5181L_FXO_NOR_BOOT_BASE,
129 RD88F5181L_FXO_NOR_BOOT_SIZE);
128 platform_device_register(&rd88f5181l_fxo_nor_boot_flash); 130 platform_device_register(&rd88f5181l_fxo_nor_boot_flash);
129} 131}
130 132
diff --git a/arch/arm/mach-orion5x/rd88f5181l-ge-setup.c b/arch/arm/mach-orion5x/rd88f5181l-ge-setup.c
index adabe34c4fc6..594800e1d691 100644
--- a/arch/arm/mach-orion5x/rd88f5181l-ge-setup.c
+++ b/arch/arm/mach-orion5x/rd88f5181l-ge-setup.c
@@ -130,8 +130,10 @@ static void __init rd88f5181l_ge_init(void)
130 orion5x_i2c_init(); 130 orion5x_i2c_init();
131 orion5x_uart0_init(); 131 orion5x_uart0_init();
132 132
133 mvebu_mbus_add_window("devbus-boot", RD88F5181L_GE_NOR_BOOT_BASE, 133 mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET,
134 RD88F5181L_GE_NOR_BOOT_SIZE); 134 ORION_MBUS_DEVBUS_BOOT_ATTR,
135 RD88F5181L_GE_NOR_BOOT_BASE,
136 RD88F5181L_GE_NOR_BOOT_SIZE);
135 platform_device_register(&rd88f5181l_ge_nor_boot_flash); 137 platform_device_register(&rd88f5181l_ge_nor_boot_flash);
136 138
137 i2c_register_board_info(0, &rd88f5181l_ge_i2c_rtc, 1); 139 i2c_register_board_info(0, &rd88f5181l_ge_i2c_rtc, 1);
diff --git a/arch/arm/mach-orion5x/rd88f5182-setup.c b/arch/arm/mach-orion5x/rd88f5182-setup.c
index 66e77ec91532..b1cf68493ffc 100644
--- a/arch/arm/mach-orion5x/rd88f5182-setup.c
+++ b/arch/arm/mach-orion5x/rd88f5182-setup.c
@@ -264,11 +264,14 @@ static void __init rd88f5182_init(void)
264 orion5x_uart0_init(); 264 orion5x_uart0_init();
265 orion5x_xor_init(); 265 orion5x_xor_init();
266 266
267 mvebu_mbus_add_window("devbus-boot", RD88F5182_NOR_BOOT_BASE, 267 mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET,
268 RD88F5182_NOR_BOOT_SIZE); 268 ORION_MBUS_DEVBUS_BOOT_ATTR,
269 269 RD88F5182_NOR_BOOT_BASE,
270 mvebu_mbus_add_window("devbus-cs1", RD88F5182_NOR_BASE, 270 RD88F5182_NOR_BOOT_SIZE);
271 RD88F5182_NOR_SIZE); 271 mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_TARGET(1),
272 ORION_MBUS_DEVBUS_ATTR(1),
273 RD88F5182_NOR_BASE,
274 RD88F5182_NOR_SIZE);
272 platform_device_register(&rd88f5182_nor_flash); 275 platform_device_register(&rd88f5182_nor_flash);
273 platform_device_register(&rd88f5182_gpio_leds); 276 platform_device_register(&rd88f5182_gpio_leds);
274 277
diff --git a/arch/arm/mach-orion5x/terastation_pro2-setup.c b/arch/arm/mach-orion5x/terastation_pro2-setup.c
index a0bfa53e7556..7e9064844698 100644
--- a/arch/arm/mach-orion5x/terastation_pro2-setup.c
+++ b/arch/arm/mach-orion5x/terastation_pro2-setup.c
@@ -329,8 +329,10 @@ static void __init tsp2_init(void)
329 /* 329 /*
330 * Configure peripherals. 330 * Configure peripherals.
331 */ 331 */
332 mvebu_mbus_add_window("devbus-boot", TSP2_NOR_BOOT_BASE, 332 mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET,
333 TSP2_NOR_BOOT_SIZE); 333 ORION_MBUS_DEVBUS_BOOT_ATTR,
334 TSP2_NOR_BOOT_BASE,
335 TSP2_NOR_BOOT_SIZE);
334 platform_device_register(&tsp2_nor_flash); 336 platform_device_register(&tsp2_nor_flash);
335 337
336 orion5x_ehci0_init(); 338 orion5x_ehci0_init();
diff --git a/arch/arm/mach-orion5x/ts209-setup.c b/arch/arm/mach-orion5x/ts209-setup.c
index 80174f0f168e..e90c0618fdad 100644
--- a/arch/arm/mach-orion5x/ts209-setup.c
+++ b/arch/arm/mach-orion5x/ts209-setup.c
@@ -286,8 +286,10 @@ static void __init qnap_ts209_init(void)
286 /* 286 /*
287 * Configure peripherals. 287 * Configure peripherals.
288 */ 288 */
289 mvebu_mbus_add_window("devbus-boot", QNAP_TS209_NOR_BOOT_BASE, 289 mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET,
290 QNAP_TS209_NOR_BOOT_SIZE); 290 ORION_MBUS_DEVBUS_BOOT_ATTR,
291 QNAP_TS209_NOR_BOOT_BASE,
292 QNAP_TS209_NOR_BOOT_SIZE);
291 platform_device_register(&qnap_ts209_nor_flash); 293 platform_device_register(&qnap_ts209_nor_flash);
292 294
293 orion5x_ehci0_init(); 295 orion5x_ehci0_init();
diff --git a/arch/arm/mach-orion5x/ts409-setup.c b/arch/arm/mach-orion5x/ts409-setup.c
index 92592790d6da..5c079d312015 100644
--- a/arch/arm/mach-orion5x/ts409-setup.c
+++ b/arch/arm/mach-orion5x/ts409-setup.c
@@ -277,8 +277,10 @@ static void __init qnap_ts409_init(void)
277 /* 277 /*
278 * Configure peripherals. 278 * Configure peripherals.
279 */ 279 */
280 mvebu_mbus_add_window("devbus-boot", QNAP_TS409_NOR_BOOT_BASE, 280 mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET,
281 QNAP_TS409_NOR_BOOT_SIZE); 281 ORION_MBUS_DEVBUS_BOOT_ATTR,
282 QNAP_TS409_NOR_BOOT_BASE,
283 QNAP_TS409_NOR_BOOT_SIZE);
282 platform_device_register(&qnap_ts409_nor_flash); 284 platform_device_register(&qnap_ts409_nor_flash);
283 285
284 orion5x_ehci0_init(); 286 orion5x_ehci0_init();
diff --git a/arch/arm/mach-orion5x/wnr854t-setup.c b/arch/arm/mach-orion5x/wnr854t-setup.c
index 6b84863c018d..80a56ee245b3 100644
--- a/arch/arm/mach-orion5x/wnr854t-setup.c
+++ b/arch/arm/mach-orion5x/wnr854t-setup.c
@@ -127,8 +127,10 @@ static void __init wnr854t_init(void)
127 orion5x_eth_switch_init(&wnr854t_switch_plat_data, NO_IRQ); 127 orion5x_eth_switch_init(&wnr854t_switch_plat_data, NO_IRQ);
128 orion5x_uart0_init(); 128 orion5x_uart0_init();
129 129
130 mvebu_mbus_add_window("devbus-boot", WNR854T_NOR_BOOT_BASE, 130 mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET,
131 WNR854T_NOR_BOOT_SIZE); 131 ORION_MBUS_DEVBUS_BOOT_ATTR,
132 WNR854T_NOR_BOOT_BASE,
133 WNR854T_NOR_BOOT_SIZE);
132 platform_device_register(&wnr854t_nor_flash); 134 platform_device_register(&wnr854t_nor_flash);
133} 135}
134 136
diff --git a/arch/arm/mach-orion5x/wrt350n-v2-setup.c b/arch/arm/mach-orion5x/wrt350n-v2-setup.c
index fae684bc54f2..670e30dc0d1b 100644
--- a/arch/arm/mach-orion5x/wrt350n-v2-setup.c
+++ b/arch/arm/mach-orion5x/wrt350n-v2-setup.c
@@ -213,8 +213,10 @@ static void __init wrt350n_v2_init(void)
213 orion5x_eth_switch_init(&wrt350n_v2_switch_plat_data, NO_IRQ); 213 orion5x_eth_switch_init(&wrt350n_v2_switch_plat_data, NO_IRQ);
214 orion5x_uart0_init(); 214 orion5x_uart0_init();
215 215
216 mvebu_mbus_add_window("devbus-boot", WRT350N_V2_NOR_BOOT_BASE, 216 mvebu_mbus_add_window_by_id(ORION_MBUS_DEVBUS_BOOT_TARGET,
217 WRT350N_V2_NOR_BOOT_SIZE); 217 ORION_MBUS_DEVBUS_BOOT_ATTR,
218 WRT350N_V2_NOR_BOOT_BASE,
219 WRT350N_V2_NOR_BOOT_SIZE);
218 platform_device_register(&wrt350n_v2_nor_flash); 220 platform_device_register(&wrt350n_v2_nor_flash);
219 platform_device_register(&wrt350n_v2_leds); 221 platform_device_register(&wrt350n_v2_leds);
220 platform_device_register(&wrt350n_v2_button_device); 222 platform_device_register(&wrt350n_v2_button_device);
diff --git a/arch/arm/mach-prima2/common.c b/arch/arm/mach-prima2/common.c
index 2c70f74fed5d..e110b6d4ae8c 100644
--- a/arch/arm/mach-prima2/common.c
+++ b/arch/arm/mach-prima2/common.c
@@ -42,7 +42,6 @@ static const char *atlas6_dt_match[] __initdata = {
42 42
43DT_MACHINE_START(ATLAS6_DT, "Generic ATLAS6 (Flattened Device Tree)") 43DT_MACHINE_START(ATLAS6_DT, "Generic ATLAS6 (Flattened Device Tree)")
44 /* Maintainer: Barry Song <baohua.song@csr.com> */ 44 /* Maintainer: Barry Song <baohua.song@csr.com> */
45 .nr_irqs = 128,
46 .map_io = sirfsoc_map_io, 45 .map_io = sirfsoc_map_io,
47 .init_time = sirfsoc_init_time, 46 .init_time = sirfsoc_init_time,
48 .init_late = sirfsoc_init_late, 47 .init_late = sirfsoc_init_late,
@@ -59,7 +58,6 @@ static const char *prima2_dt_match[] __initdata = {
59 58
60DT_MACHINE_START(PRIMA2_DT, "Generic PRIMA2 (Flattened Device Tree)") 59DT_MACHINE_START(PRIMA2_DT, "Generic PRIMA2 (Flattened Device Tree)")
61 /* Maintainer: Barry Song <baohua.song@csr.com> */ 60 /* Maintainer: Barry Song <baohua.song@csr.com> */
62 .nr_irqs = 128,
63 .map_io = sirfsoc_map_io, 61 .map_io = sirfsoc_map_io,
64 .init_time = sirfsoc_init_time, 62 .init_time = sirfsoc_init_time,
65 .dma_zone_size = SZ_256M, 63 .dma_zone_size = SZ_256M,
diff --git a/arch/arm/mach-prima2/pm.c b/arch/arm/mach-prima2/pm.c
index 02cc34388b05..c4525a88e5da 100644
--- a/arch/arm/mach-prima2/pm.c
+++ b/arch/arm/mach-prima2/pm.c
@@ -34,7 +34,10 @@ static void sirfsoc_set_wakeup_source(void)
34 pwr_trigger_en_reg = sirfsoc_rtc_iobrg_readl(sirfsoc_pwrc_base + 34 pwr_trigger_en_reg = sirfsoc_rtc_iobrg_readl(sirfsoc_pwrc_base +
35 SIRFSOC_PWRC_TRIGGER_EN); 35 SIRFSOC_PWRC_TRIGGER_EN);
36#define X_ON_KEY_B (1 << 0) 36#define X_ON_KEY_B (1 << 0)
37 sirfsoc_rtc_iobrg_writel(pwr_trigger_en_reg | X_ON_KEY_B, 37#define RTC_ALARM0_B (1 << 2)
38#define RTC_ALARM1_B (1 << 3)
39 sirfsoc_rtc_iobrg_writel(pwr_trigger_en_reg | X_ON_KEY_B |
40 RTC_ALARM0_B | RTC_ALARM1_B,
38 sirfsoc_pwrc_base + SIRFSOC_PWRC_TRIGGER_EN); 41 sirfsoc_pwrc_base + SIRFSOC_PWRC_TRIGGER_EN);
39} 42}
40 43
@@ -85,12 +88,6 @@ static const struct platform_suspend_ops sirfsoc_pm_ops = {
85 .valid = suspend_valid_only_mem, 88 .valid = suspend_valid_only_mem,
86}; 89};
87 90
88int __init sirfsoc_pm_init(void)
89{
90 suspend_set_ops(&sirfsoc_pm_ops);
91 return 0;
92}
93
94static const struct of_device_id pwrc_ids[] = { 91static const struct of_device_id pwrc_ids[] = {
95 { .compatible = "sirf,prima2-pwrc" }, 92 { .compatible = "sirf,prima2-pwrc" },
96 {} 93 {}
@@ -118,7 +115,6 @@ static int __init sirfsoc_of_pwrc_init(void)
118 115
119 return 0; 116 return 0;
120} 117}
121postcore_initcall(sirfsoc_of_pwrc_init);
122 118
123static const struct of_device_id memc_ids[] = { 119static const struct of_device_id memc_ids[] = {
124 { .compatible = "sirf,prima2-memc" }, 120 { .compatible = "sirf,prima2-memc" },
@@ -149,4 +145,11 @@ static int __init sirfsoc_memc_init(void)
149{ 145{
150 return platform_driver_register(&sirfsoc_memc_driver); 146 return platform_driver_register(&sirfsoc_memc_driver);
151} 147}
152postcore_initcall(sirfsoc_memc_init); 148
149int __init sirfsoc_pm_init(void)
150{
151 sirfsoc_of_pwrc_init();
152 sirfsoc_memc_init();
153 suspend_set_ops(&sirfsoc_pm_ops);
154 return 0;
155}
diff --git a/arch/arm/mach-pxa/cm-x300.c b/arch/arm/mach-pxa/cm-x300.c
index 8091aac89edf..f9423493ed36 100644
--- a/arch/arm/mach-pxa/cm-x300.c
+++ b/arch/arm/mach-pxa/cm-x300.c
@@ -29,7 +29,7 @@
29#include <linux/pwm_backlight.h> 29#include <linux/pwm_backlight.h>
30 30
31#include <linux/i2c.h> 31#include <linux/i2c.h>
32#include <linux/i2c/pca953x.h> 32#include <linux/platform_data/pca953x.h>
33#include <linux/i2c/pxa-i2c.h> 33#include <linux/i2c/pxa-i2c.h>
34 34
35#include <linux/mfd/da903x.h> 35#include <linux/mfd/da903x.h>
diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c
index 3a3362fa793e..8eb4e23c561d 100644
--- a/arch/arm/mach-pxa/em-x270.c
+++ b/arch/arm/mach-pxa/em-x270.c
@@ -30,7 +30,7 @@
30#include <linux/power_supply.h> 30#include <linux/power_supply.h>
31#include <linux/apm-emulation.h> 31#include <linux/apm-emulation.h>
32#include <linux/i2c.h> 32#include <linux/i2c.h>
33#include <linux/i2c/pca953x.h> 33#include <linux/platform_data/pca953x.h>
34#include <linux/i2c/pxa-i2c.h> 34#include <linux/i2c/pxa-i2c.h>
35#include <linux/regulator/userspace-consumer.h> 35#include <linux/regulator/userspace-consumer.h>
36 36
diff --git a/arch/arm/mach-pxa/icontrol.c b/arch/arm/mach-pxa/icontrol.c
index fe31bfcbb8df..c98511c5abd1 100644
--- a/arch/arm/mach-pxa/icontrol.c
+++ b/arch/arm/mach-pxa/icontrol.c
@@ -73,9 +73,6 @@ static struct pxa2xx_spi_chip mcp251x_chip_info4 = {
73 73
74static struct mcp251x_platform_data mcp251x_info = { 74static struct mcp251x_platform_data mcp251x_info = {
75 .oscillator_frequency = 16E6, 75 .oscillator_frequency = 16E6,
76 .board_specific_setup = NULL,
77 .power_enable = NULL,
78 .transceiver_enable = NULL
79}; 76};
80 77
81static struct spi_board_info mcp251x_board_info[] = { 78static struct spi_board_info mcp251x_board_info[] = {
diff --git a/arch/arm/mach-pxa/pcm990-baseboard.c b/arch/arm/mach-pxa/pcm990-baseboard.c
index 13e5b00eae90..3133ba82c508 100644
--- a/arch/arm/mach-pxa/pcm990-baseboard.c
+++ b/arch/arm/mach-pxa/pcm990-baseboard.c
@@ -408,7 +408,7 @@ struct pxacamera_platform_data pcm990_pxacamera_platform_data = {
408 .mclk_10khz = 1000, 408 .mclk_10khz = 1000,
409}; 409};
410 410
411#include <linux/i2c/pca953x.h> 411#include <linux/platform_data/pca953x.h>
412 412
413static struct pca953x_platform_data pca9536_data = { 413static struct pca953x_platform_data pca9536_data = {
414 .gpio_base = PXA_NR_BUILTIN_GPIO, 414 .gpio_base = PXA_NR_BUILTIN_GPIO,
diff --git a/arch/arm/mach-pxa/pxa-dt.c b/arch/arm/mach-pxa/pxa-dt.c
index 3835979a0dd3..f6a2c4b1c1dc 100644
--- a/arch/arm/mach-pxa/pxa-dt.c
+++ b/arch/arm/mach-pxa/pxa-dt.c
@@ -28,7 +28,7 @@ static const struct of_dev_auxdata pxa3xx_auxdata_lookup[] __initconst = {
28 OF_DEV_AUXDATA("mrvl,pxa-uart", 0x40700000, "pxa2xx-uart.2", NULL), 28 OF_DEV_AUXDATA("mrvl,pxa-uart", 0x40700000, "pxa2xx-uart.2", NULL),
29 OF_DEV_AUXDATA("mrvl,pxa-uart", 0x41600000, "pxa2xx-uart.3", NULL), 29 OF_DEV_AUXDATA("mrvl,pxa-uart", 0x41600000, "pxa2xx-uart.3", NULL),
30 OF_DEV_AUXDATA("marvell,pxa-mmc", 0x41100000, "pxa2xx-mci.0", NULL), 30 OF_DEV_AUXDATA("marvell,pxa-mmc", 0x41100000, "pxa2xx-mci.0", NULL),
31 OF_DEV_AUXDATA("mrvl,pxa-gpio", 0x40e00000, "pxa-gpio", NULL), 31 OF_DEV_AUXDATA("intel,pxa3xx-gpio", 0x40e00000, "pxa3xx-gpio", NULL),
32 OF_DEV_AUXDATA("marvell,pxa-ohci", 0x4c000000, "pxa27x-ohci", NULL), 32 OF_DEV_AUXDATA("marvell,pxa-ohci", 0x4c000000, "pxa27x-ohci", NULL),
33 OF_DEV_AUXDATA("mrvl,pxa-i2c", 0x40301680, "pxa2xx-i2c.0", NULL), 33 OF_DEV_AUXDATA("mrvl,pxa-i2c", 0x40301680, "pxa2xx-i2c.0", NULL),
34 OF_DEV_AUXDATA("mrvl,pwri2c", 0x40f500c0, "pxa3xx-i2c.1", NULL), 34 OF_DEV_AUXDATA("mrvl,pwri2c", 0x40f500c0, "pxa3xx-i2c.1", NULL),
diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c
index 4c29173026e8..0b11c1af51c4 100644
--- a/arch/arm/mach-pxa/spitz.c
+++ b/arch/arm/mach-pxa/spitz.c
@@ -20,7 +20,7 @@
20#include <linux/leds.h> 20#include <linux/leds.h>
21#include <linux/i2c.h> 21#include <linux/i2c.h>
22#include <linux/i2c/pxa-i2c.h> 22#include <linux/i2c/pxa-i2c.h>
23#include <linux/i2c/pca953x.h> 23#include <linux/platform_data/pca953x.h>
24#include <linux/spi/spi.h> 24#include <linux/spi/spi.h>
25#include <linux/spi/ads7846.h> 25#include <linux/spi/ads7846.h>
26#include <linux/spi/corgi_lcd.h> 26#include <linux/spi/corgi_lcd.h>
diff --git a/arch/arm/mach-pxa/zeus.c b/arch/arm/mach-pxa/zeus.c
index f5d436434566..b19d1c361cab 100644
--- a/arch/arm/mach-pxa/zeus.c
+++ b/arch/arm/mach-pxa/zeus.c
@@ -26,9 +26,11 @@
26#include <linux/mtd/physmap.h> 26#include <linux/mtd/physmap.h>
27#include <linux/i2c.h> 27#include <linux/i2c.h>
28#include <linux/i2c/pxa-i2c.h> 28#include <linux/i2c/pxa-i2c.h>
29#include <linux/i2c/pca953x.h> 29#include <linux/platform_data/pca953x.h>
30#include <linux/apm-emulation.h> 30#include <linux/apm-emulation.h>
31#include <linux/can/platform/mcp251x.h> 31#include <linux/can/platform/mcp251x.h>
32#include <linux/regulator/fixed.h>
33#include <linux/regulator/machine.h>
32 34
33#include <asm/mach-types.h> 35#include <asm/mach-types.h>
34#include <asm/suspend.h> 36#include <asm/suspend.h>
@@ -391,33 +393,34 @@ static struct pxa2xx_spi_master pxa2xx_spi_ssp3_master_info = {
391}; 393};
392 394
393/* CAN bus on SPI */ 395/* CAN bus on SPI */
394static int zeus_mcp2515_setup(struct spi_device *sdev) 396static struct regulator_consumer_supply can_regulator_consumer =
395{ 397 REGULATOR_SUPPLY("vdd", "spi3.0");
396 int err;
397
398 err = gpio_request(ZEUS_CAN_SHDN_GPIO, "CAN shutdown");
399 if (err)
400 return err;
401 398
402 err = gpio_direction_output(ZEUS_CAN_SHDN_GPIO, 1); 399static struct regulator_init_data can_regulator_init_data = {
403 if (err) { 400 .constraints = {
404 gpio_free(ZEUS_CAN_SHDN_GPIO); 401 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
405 return err; 402 },
406 } 403 .consumer_supplies = &can_regulator_consumer,
404 .num_consumer_supplies = 1,
405};
407 406
408 return 0; 407static struct fixed_voltage_config can_regulator_pdata = {
409} 408 .supply_name = "CAN_SHDN",
409 .microvolts = 3300000,
410 .gpio = ZEUS_CAN_SHDN_GPIO,
411 .init_data = &can_regulator_init_data,
412};
410 413
411static int zeus_mcp2515_transceiver_enable(int enable) 414static struct platform_device can_regulator_device = {
412{ 415 .name = "reg-fixed-volage",
413 gpio_set_value(ZEUS_CAN_SHDN_GPIO, !enable); 416 .id = -1,
414 return 0; 417 .dev = {
415} 418 .platform_data = &can_regulator_pdata,
419 },
420};
416 421
417static struct mcp251x_platform_data zeus_mcp2515_pdata = { 422static struct mcp251x_platform_data zeus_mcp2515_pdata = {
418 .oscillator_frequency = 16*1000*1000, 423 .oscillator_frequency = 16*1000*1000,
419 .board_specific_setup = zeus_mcp2515_setup,
420 .power_enable = zeus_mcp2515_transceiver_enable,
421}; 424};
422 425
423static struct spi_board_info zeus_spi_board_info[] = { 426static struct spi_board_info zeus_spi_board_info[] = {
@@ -516,6 +519,7 @@ static struct platform_device *zeus_devices[] __initdata = {
516 &zeus_leds_device, 519 &zeus_leds_device,
517 &zeus_pcmcia_device, 520 &zeus_pcmcia_device,
518 &zeus_max6369_device, 521 &zeus_max6369_device,
522 &can_regulator_device,
519}; 523};
520 524
521/* AC'97 */ 525/* AC'97 */
diff --git a/arch/arm/mach-pxa/zylonite_pxa300.c b/arch/arm/mach-pxa/zylonite_pxa300.c
index 86e59c043de2..869bce7c3f24 100644
--- a/arch/arm/mach-pxa/zylonite_pxa300.c
+++ b/arch/arm/mach-pxa/zylonite_pxa300.c
@@ -18,7 +18,7 @@
18#include <linux/init.h> 18#include <linux/init.h>
19#include <linux/i2c.h> 19#include <linux/i2c.h>
20#include <linux/i2c/pxa-i2c.h> 20#include <linux/i2c/pxa-i2c.h>
21#include <linux/i2c/pca953x.h> 21#include <linux/platform_data/pca953x.h>
22#include <linux/gpio.h> 22#include <linux/gpio.h>
23 23
24#include <mach/pxa300.h> 24#include <mach/pxa300.h>
diff --git a/arch/arm/mach-realview/Kconfig b/arch/arm/mach-realview/Kconfig
index d210c0f9c2c4..9db2029aa632 100644
--- a/arch/arm/mach-realview/Kconfig
+++ b/arch/arm/mach-realview/Kconfig
@@ -13,7 +13,7 @@ config REALVIEW_EB_A9MP
13 depends on MACH_REALVIEW_EB 13 depends on MACH_REALVIEW_EB
14 select CPU_V7 14 select CPU_V7
15 select HAVE_ARM_SCU if SMP 15 select HAVE_ARM_SCU if SMP
16 select HAVE_ARM_TWD if LOCAL_TIMERS 16 select HAVE_ARM_TWD if SMP
17 select HAVE_SMP 17 select HAVE_SMP
18 select MIGHT_HAVE_CACHE_L2X0 18 select MIGHT_HAVE_CACHE_L2X0
19 help 19 help
@@ -26,7 +26,7 @@ config REALVIEW_EB_ARM11MP
26 select ARCH_HAS_BARRIERS if SMP 26 select ARCH_HAS_BARRIERS if SMP
27 select CPU_V6K 27 select CPU_V6K
28 select HAVE_ARM_SCU if SMP 28 select HAVE_ARM_SCU if SMP
29 select HAVE_ARM_TWD if LOCAL_TIMERS 29 select HAVE_ARM_TWD if SMP
30 select HAVE_SMP 30 select HAVE_SMP
31 select MIGHT_HAVE_CACHE_L2X0 31 select MIGHT_HAVE_CACHE_L2X0
32 help 32 help
@@ -48,7 +48,7 @@ config MACH_REALVIEW_PB11MP
48 select ARM_GIC 48 select ARM_GIC
49 select CPU_V6K 49 select CPU_V6K
50 select HAVE_ARM_SCU if SMP 50 select HAVE_ARM_SCU if SMP
51 select HAVE_ARM_TWD if LOCAL_TIMERS 51 select HAVE_ARM_TWD if SMP
52 select HAVE_PATA_PLATFORM 52 select HAVE_PATA_PLATFORM
53 select HAVE_SMP 53 select HAVE_SMP
54 select MIGHT_HAVE_CACHE_L2X0 54 select MIGHT_HAVE_CACHE_L2X0
@@ -92,7 +92,7 @@ config MACH_REALVIEW_PBX
92 select ARCH_SPARSEMEM_ENABLE if CPU_V7 && !REALVIEW_HIGH_PHYS_OFFSET 92 select ARCH_SPARSEMEM_ENABLE if CPU_V7 && !REALVIEW_HIGH_PHYS_OFFSET
93 select ARM_GIC 93 select ARM_GIC
94 select HAVE_ARM_SCU if SMP 94 select HAVE_ARM_SCU if SMP
95 select HAVE_ARM_TWD if LOCAL_TIMERS 95 select HAVE_ARM_TWD if SMP
96 select HAVE_PATA_PLATFORM 96 select HAVE_PATA_PLATFORM
97 select HAVE_SMP 97 select HAVE_SMP
98 select MIGHT_HAVE_CACHE_L2X0 98 select MIGHT_HAVE_CACHE_L2X0
diff --git a/arch/arm/mach-realview/include/mach/debug-macro.S b/arch/arm/mach-realview/include/mach/debug-macro.S
deleted file mode 100644
index 8cc372dc66a8..000000000000
--- a/arch/arm/mach-realview/include/mach/debug-macro.S
+++ /dev/null
@@ -1,29 +0,0 @@
1/* arch/arm/mach-realview/include/mach/debug-macro.S
2 *
3 * Debugging macro include header
4 *
5 * Copyright (C) 1994-1999 Russell King
6 * Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12
13#ifdef CONFIG_DEBUG_REALVIEW_STD_PORT
14#define DEBUG_LL_UART_OFFSET 0x00009000
15#elif defined(CONFIG_DEBUG_REALVIEW_PB1176_PORT)
16#define DEBUG_LL_UART_OFFSET 0x0010c000
17#endif
18
19#ifndef DEBUG_LL_UART_OFFSET
20#error "Unknown RealView platform"
21#endif
22
23 .macro addruart, rp, rv, tmp
24 mov \rp, #DEBUG_LL_UART_OFFSET
25 orr \rv, \rp, #0xfb000000 @ virtual base
26 orr \rp, \rp, #0x10000000 @ physical base
27 .endm
28
29#include <asm/hardware/debug-pl01x.S>
diff --git a/arch/arm/mach-rpc/include/mach/debug-macro.S b/arch/arm/mach-rpc/include/mach/debug-macro.S
deleted file mode 100644
index 6d28cc99b124..000000000000
--- a/arch/arm/mach-rpc/include/mach/debug-macro.S
+++ /dev/null
@@ -1,23 +0,0 @@
1/* arch/arm/mach-rpc/include/mach/debug-macro.S
2 *
3 * Debugging macro include header
4 *
5 * Copyright (C) 1994-1999 Russell King
6 * Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 *
12*/
13
14 .macro addruart, rp, rv, tmp
15 mov \rp, #0x00010000
16 orr \rp, \rp, #0x00000fe0
17 orr \rv, \rp, #0xe0000000 @ virtual
18 orr \rp, \rp, #0x03000000 @ physical
19 .endm
20
21#define UART_SHIFT 2
22#define FLOW_CONTROL
23#include <asm/hardware/debug-8250.S>
diff --git a/arch/arm/mach-s3c24xx/Kconfig b/arch/arm/mach-s3c24xx/Kconfig
index 7791ac76f945..dba2173e70f3 100644
--- a/arch/arm/mach-s3c24xx/Kconfig
+++ b/arch/arm/mach-s3c24xx/Kconfig
@@ -30,7 +30,6 @@ config CPU_S3C2410
30 select S3C2410_CLOCK 30 select S3C2410_CLOCK
31 select ARM_S3C2410_CPUFREQ if ARM_S3C24XX_CPUFREQ 31 select ARM_S3C2410_CPUFREQ if ARM_S3C24XX_CPUFREQ
32 select S3C2410_PM if PM 32 select S3C2410_PM if PM
33 select SAMSUNG_HRT
34 select SAMSUNG_WDT_RESET 33 select SAMSUNG_WDT_RESET
35 help 34 help
36 Support for S3C2410 and S3C2410A family from the S3C24XX line 35 Support for S3C2410 and S3C2410A family from the S3C24XX line
@@ -42,7 +41,6 @@ config CPU_S3C2412
42 select CPU_LLSERIAL_S3C2440 41 select CPU_LLSERIAL_S3C2440
43 select S3C2412_DMA if S3C24XX_DMA 42 select S3C2412_DMA if S3C24XX_DMA
44 select S3C2412_PM if PM 43 select S3C2412_PM if PM
45 select SAMSUNG_HRT
46 help 44 help
47 Support for the S3C2412 and S3C2413 SoCs from the S3C24XX line 45 Support for the S3C2412 and S3C2413 SoCs from the S3C24XX line
48 46
@@ -54,7 +52,6 @@ config CPU_S3C2416
54 select S3C2443_COMMON 52 select S3C2443_COMMON
55 select S3C2443_DMA if S3C24XX_DMA 53 select S3C2443_DMA if S3C24XX_DMA
56 select SAMSUNG_CLKSRC 54 select SAMSUNG_CLKSRC
57 select SAMSUNG_HRT
58 help 55 help
59 Support for the S3C2416 SoC from the S3C24XX line 56 Support for the S3C2416 SoC from the S3C24XX line
60 57
@@ -65,7 +62,6 @@ config CPU_S3C2440
65 select S3C2410_CLOCK 62 select S3C2410_CLOCK
66 select S3C2410_PM if PM 63 select S3C2410_PM if PM
67 select S3C2440_DMA if S3C24XX_DMA 64 select S3C2440_DMA if S3C24XX_DMA
68 select SAMSUNG_HRT
69 help 65 help
70 Support for S3C2440 Samsung Mobile CPU based systems. 66 Support for S3C2440 Samsung Mobile CPU based systems.
71 67
@@ -75,7 +71,6 @@ config CPU_S3C2442
75 select CPU_LLSERIAL_S3C2440 71 select CPU_LLSERIAL_S3C2440
76 select S3C2410_CLOCK 72 select S3C2410_CLOCK
77 select S3C2410_PM if PM 73 select S3C2410_PM if PM
78 select SAMSUNG_HRT
79 help 74 help
80 Support for S3C2442 Samsung Mobile CPU based systems. 75 Support for S3C2442 Samsung Mobile CPU based systems.
81 76
@@ -91,7 +86,6 @@ config CPU_S3C2443
91 select S3C2443_COMMON 86 select S3C2443_COMMON
92 select S3C2443_DMA if S3C24XX_DMA 87 select S3C2443_DMA if S3C24XX_DMA
93 select SAMSUNG_CLKSRC 88 select SAMSUNG_CLKSRC
94 select SAMSUNG_HRT
95 help 89 help
96 Support for the S3C2443 SoC from the S3C24XX line 90 Support for the S3C2443 SoC from the S3C24XX line
97 91
diff --git a/arch/arm/mach-s3c24xx/clock-s3c2410.c b/arch/arm/mach-s3c24xx/clock-s3c2410.c
index 564553694b54..d39d3c787580 100644
--- a/arch/arm/mach-s3c24xx/clock-s3c2410.c
+++ b/arch/arm/mach-s3c24xx/clock-s3c2410.c
@@ -281,6 +281,5 @@ int __init s3c2410_baseclk_add(void)
281 (clkslow & S3C2410_CLKSLOW_MPLL_OFF) ? "off" : "on", 281 (clkslow & S3C2410_CLKSLOW_MPLL_OFF) ? "off" : "on",
282 (clkslow & S3C2410_CLKSLOW_UCLK_OFF) ? "off" : "on"); 282 (clkslow & S3C2410_CLKSLOW_UCLK_OFF) ? "off" : "on");
283 283
284 s3c_pwmclk_init();
285 return 0; 284 return 0;
286} 285}
diff --git a/arch/arm/mach-s3c24xx/clock-s3c2412.c b/arch/arm/mach-s3c24xx/clock-s3c2412.c
index 2cc017da88fe..d8f253f2b486 100644
--- a/arch/arm/mach-s3c24xx/clock-s3c2412.c
+++ b/arch/arm/mach-s3c24xx/clock-s3c2412.c
@@ -757,6 +757,5 @@ int __init s3c2412_baseclk_add(void)
757 } 757 }
758 758
759 clkdev_add_table(s3c2412_clk_lookup, ARRAY_SIZE(s3c2412_clk_lookup)); 759 clkdev_add_table(s3c2412_clk_lookup, ARRAY_SIZE(s3c2412_clk_lookup));
760 s3c_pwmclk_init();
761 return 0; 760 return 0;
762} 761}
diff --git a/arch/arm/mach-s3c24xx/clock-s3c2416.c b/arch/arm/mach-s3c24xx/clock-s3c2416.c
index 036056cea57c..d421a72920a5 100644
--- a/arch/arm/mach-s3c24xx/clock-s3c2416.c
+++ b/arch/arm/mach-s3c24xx/clock-s3c2416.c
@@ -168,6 +168,4 @@ void __init s3c2416_init_clocks(int xtal)
168 s3c24xx_register_clock(&hsmmc0_clk); 168 s3c24xx_register_clock(&hsmmc0_clk);
169 clkdev_add_table(s3c2416_clk_lookup, ARRAY_SIZE(s3c2416_clk_lookup)); 169 clkdev_add_table(s3c2416_clk_lookup, ARRAY_SIZE(s3c2416_clk_lookup));
170 170
171 s3c_pwmclk_init();
172
173} 171}
diff --git a/arch/arm/mach-s3c24xx/clock-s3c2443.c b/arch/arm/mach-s3c24xx/clock-s3c2443.c
index 0a53051b0787..76cd31f7804e 100644
--- a/arch/arm/mach-s3c24xx/clock-s3c2443.c
+++ b/arch/arm/mach-s3c24xx/clock-s3c2443.c
@@ -209,6 +209,4 @@ void __init s3c2443_init_clocks(int xtal)
209 s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); 209 s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
210 s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off)); 210 s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
211 clkdev_add_table(s3c2443_clk_lookup, ARRAY_SIZE(s3c2443_clk_lookup)); 211 clkdev_add_table(s3c2443_clk_lookup, ARRAY_SIZE(s3c2443_clk_lookup));
212
213 s3c_pwmclk_init();
214} 212}
diff --git a/arch/arm/mach-s3c24xx/common.c b/arch/arm/mach-s3c24xx/common.c
index c157103ed8eb..457261c98433 100644
--- a/arch/arm/mach-s3c24xx/common.c
+++ b/arch/arm/mach-s3c24xx/common.c
@@ -27,6 +27,7 @@
27#include <linux/interrupt.h> 27#include <linux/interrupt.h>
28#include <linux/ioport.h> 28#include <linux/ioport.h>
29#include <linux/serial_core.h> 29#include <linux/serial_core.h>
30#include <clocksource/samsung_pwm.h>
30#include <linux/platform_device.h> 31#include <linux/platform_device.h>
31#include <linux/delay.h> 32#include <linux/delay.h>
32#include <linux/io.h> 33#include <linux/io.h>
@@ -49,6 +50,7 @@
49#include <plat/clock.h> 50#include <plat/clock.h>
50#include <plat/cpu-freq.h> 51#include <plat/cpu-freq.h>
51#include <plat/pll.h> 52#include <plat/pll.h>
53#include <plat/pwm-core.h>
52 54
53#include "common.h" 55#include "common.h"
54 56
@@ -216,6 +218,13 @@ static void s3c24xx_default_idle(void)
216 S3C2410_CLKCON); 218 S3C2410_CLKCON);
217} 219}
218 220
221static struct samsung_pwm_variant s3c24xx_pwm_variant = {
222 .bits = 16,
223 .div_base = 1,
224 .has_tint_cstat = false,
225 .tclk_mask = (1 << 4),
226};
227
219void __init s3c24xx_init_io(struct map_desc *mach_desc, int size) 228void __init s3c24xx_init_io(struct map_desc *mach_desc, int size)
220{ 229{
221 arm_pm_idle = s3c24xx_default_idle; 230 arm_pm_idle = s3c24xx_default_idle;
@@ -232,6 +241,24 @@ void __init s3c24xx_init_io(struct map_desc *mach_desc, int size)
232 s3c24xx_init_cpu(); 241 s3c24xx_init_cpu();
233 242
234 s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); 243 s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids));
244
245 samsung_pwm_set_platdata(&s3c24xx_pwm_variant);
246}
247
248void __init samsung_set_timer_source(unsigned int event, unsigned int source)
249{
250 s3c24xx_pwm_variant.output_mask = BIT(SAMSUNG_PWM_NUM) - 1;
251 s3c24xx_pwm_variant.output_mask &= ~(BIT(event) | BIT(source));
252}
253
254void __init samsung_timer_init(void)
255{
256 unsigned int timer_irqs[SAMSUNG_PWM_NUM] = {
257 IRQ_TIMER0, IRQ_TIMER1, IRQ_TIMER2, IRQ_TIMER3, IRQ_TIMER4,
258 };
259
260 samsung_pwm_clocksource_init(S3C_VA_TIMER,
261 timer_irqs, &s3c24xx_pwm_variant);
235} 262}
236 263
237/* Serial port registrations */ 264/* Serial port registrations */
diff --git a/arch/arm/mach-s3c24xx/include/mach/map.h b/arch/arm/mach-s3c24xx/include/mach/map.h
index 8ba381f2dbe1..444793f0f5f1 100644
--- a/arch/arm/mach-s3c24xx/include/mach/map.h
+++ b/arch/arm/mach-s3c24xx/include/mach/map.h
@@ -167,4 +167,6 @@
167#define S3C_PA_SPI0 S3C2443_PA_SPI0 167#define S3C_PA_SPI0 S3C2443_PA_SPI0
168#define S3C_PA_SPI1 S3C2443_PA_SPI1 168#define S3C_PA_SPI1 S3C2443_PA_SPI1
169 169
170#define SAMSUNG_PA_TIMER S3C2410_PA_TIMER
171
170#endif /* __ASM_ARCH_MAP_H */ 172#endif /* __ASM_ARCH_MAP_H */
diff --git a/arch/arm/mach-s3c24xx/mach-h1940.c b/arch/arm/mach-s3c24xx/mach-h1940.c
index af4334d6b4d5..74dd47988b41 100644
--- a/arch/arm/mach-s3c24xx/mach-h1940.c
+++ b/arch/arm/mach-s3c24xx/mach-h1940.c
@@ -512,7 +512,7 @@ static struct platform_pwm_backlight_data backlight_data = {
512static struct platform_device h1940_backlight = { 512static struct platform_device h1940_backlight = {
513 .name = "pwm-backlight", 513 .name = "pwm-backlight",
514 .dev = { 514 .dev = {
515 .parent = &s3c_device_timer[0].dev, 515 .parent = &samsung_device_pwm.dev,
516 .platform_data = &backlight_data, 516 .platform_data = &backlight_data,
517 }, 517 },
518 .id = -1, 518 .id = -1,
@@ -632,7 +632,7 @@ static struct platform_device *h1940_devices[] __initdata = {
632 &h1940_device_bluetooth, 632 &h1940_device_bluetooth,
633 &s3c_device_sdi, 633 &s3c_device_sdi,
634 &s3c_device_rtc, 634 &s3c_device_rtc,
635 &s3c_device_timer[0], 635 &samsung_device_pwm,
636 &h1940_backlight, 636 &h1940_backlight,
637 &h1940_lcd_powerdev, 637 &h1940_lcd_powerdev,
638 &s3c_device_adc, 638 &s3c_device_adc,
diff --git a/arch/arm/mach-s3c24xx/mach-rx1950.c b/arch/arm/mach-s3c24xx/mach-rx1950.c
index 44ca018e1f96..206b1f7546d1 100644
--- a/arch/arm/mach-s3c24xx/mach-rx1950.c
+++ b/arch/arm/mach-s3c24xx/mach-rx1950.c
@@ -530,7 +530,7 @@ static struct platform_pwm_backlight_data rx1950_backlight_data = {
530static struct platform_device rx1950_backlight = { 530static struct platform_device rx1950_backlight = {
531 .name = "pwm-backlight", 531 .name = "pwm-backlight",
532 .dev = { 532 .dev = {
533 .parent = &s3c_device_timer[0].dev, 533 .parent = &samsung_device_pwm.dev,
534 .platform_data = &rx1950_backlight_data, 534 .platform_data = &rx1950_backlight_data,
535 }, 535 },
536}; 536};
@@ -717,8 +717,7 @@ static struct platform_device *rx1950_devices[] __initdata = {
717 &s3c_device_sdi, 717 &s3c_device_sdi,
718 &s3c_device_adc, 718 &s3c_device_adc,
719 &s3c_device_ts, 719 &s3c_device_ts,
720 &s3c_device_timer[0], 720 &samsung_device_pwm,
721 &s3c_device_timer[1],
722 &rx1950_backlight, 721 &rx1950_backlight,
723 &rx1950_device_gpiokeys, 722 &rx1950_device_gpiokeys,
724 &power_supply, 723 &power_supply,
diff --git a/arch/arm/mach-s3c64xx/Kconfig b/arch/arm/mach-s3c64xx/Kconfig
index 20578536aec7..041da5172423 100644
--- a/arch/arm/mach-s3c64xx/Kconfig
+++ b/arch/arm/mach-s3c64xx/Kconfig
@@ -17,13 +17,11 @@ config PLAT_S3C64XX
17# Configuration options for the S3C6410 CPU 17# Configuration options for the S3C6410 CPU
18 18
19config CPU_S3C6400 19config CPU_S3C6400
20 select SAMSUNG_HRT
21 bool 20 bool
22 help 21 help
23 Enable S3C6400 CPU support 22 Enable S3C6400 CPU support
24 23
25config CPU_S3C6410 24config CPU_S3C6410
26 select SAMSUNG_HRT
27 bool 25 bool
28 help 26 help
29 Enable S3C6410 CPU support 27 Enable S3C6410 CPU support
diff --git a/arch/arm/mach-s3c64xx/clock.c b/arch/arm/mach-s3c64xx/clock.c
index 8499415be9cd..c1bcc4a6d3a8 100644
--- a/arch/arm/mach-s3c64xx/clock.c
+++ b/arch/arm/mach-s3c64xx/clock.c
@@ -1004,6 +1004,4 @@ void __init s3c64xx_register_clocks(unsigned long xtal,
1004 for (cnt = 0; cnt < ARRAY_SIZE(clksrc_cdev); cnt++) 1004 for (cnt = 0; cnt < ARRAY_SIZE(clksrc_cdev); cnt++)
1005 s3c_register_clksrc(clksrc_cdev[cnt], 1); 1005 s3c_register_clksrc(clksrc_cdev[cnt], 1);
1006 clkdev_add_table(s3c64xx_clk_lookup, ARRAY_SIZE(s3c64xx_clk_lookup)); 1006 clkdev_add_table(s3c64xx_clk_lookup, ARRAY_SIZE(s3c64xx_clk_lookup));
1007
1008 s3c_pwmclk_init();
1009} 1007}
diff --git a/arch/arm/mach-s3c64xx/common.c b/arch/arm/mach-s3c64xx/common.c
index 3f62e467b129..73d79cf5e141 100644
--- a/arch/arm/mach-s3c64xx/common.c
+++ b/arch/arm/mach-s3c64xx/common.c
@@ -27,6 +27,7 @@
27#include <linux/irq.h> 27#include <linux/irq.h>
28#include <linux/gpio.h> 28#include <linux/gpio.h>
29#include <linux/irqchip/arm-vic.h> 29#include <linux/irqchip/arm-vic.h>
30#include <clocksource/samsung_pwm.h>
30 31
31#include <asm/mach/arch.h> 32#include <asm/mach/arch.h>
32#include <asm/mach/map.h> 33#include <asm/mach/map.h>
@@ -42,7 +43,7 @@
42#include <plat/pm.h> 43#include <plat/pm.h>
43#include <plat/gpio-cfg.h> 44#include <plat/gpio-cfg.h>
44#include <plat/irq-uart.h> 45#include <plat/irq-uart.h>
45#include <plat/irq-vic-timer.h> 46#include <plat/pwm-core.h>
46#include <plat/regs-irqtype.h> 47#include <plat/regs-irqtype.h>
47#include <plat/regs-serial.h> 48#include <plat/regs-serial.h>
48#include <plat/watchdog-reset.h> 49#include <plat/watchdog-reset.h>
@@ -149,6 +150,30 @@ static struct device s3c64xx_dev = {
149 .bus = &s3c64xx_subsys, 150 .bus = &s3c64xx_subsys,
150}; 151};
151 152
153static struct samsung_pwm_variant s3c64xx_pwm_variant = {
154 .bits = 32,
155 .div_base = 0,
156 .has_tint_cstat = true,
157 .tclk_mask = (1 << 7) | (1 << 6) | (1 << 5),
158};
159
160void __init samsung_set_timer_source(unsigned int event, unsigned int source)
161{
162 s3c64xx_pwm_variant.output_mask = BIT(SAMSUNG_PWM_NUM) - 1;
163 s3c64xx_pwm_variant.output_mask &= ~(BIT(event) | BIT(source));
164}
165
166void __init samsung_timer_init(void)
167{
168 unsigned int timer_irqs[SAMSUNG_PWM_NUM] = {
169 IRQ_TIMER0_VIC, IRQ_TIMER1_VIC, IRQ_TIMER2_VIC,
170 IRQ_TIMER3_VIC, IRQ_TIMER4_VIC,
171 };
172
173 samsung_pwm_clocksource_init(S3C_VA_TIMER,
174 timer_irqs, &s3c64xx_pwm_variant);
175}
176
152/* read cpu identification code */ 177/* read cpu identification code */
153 178
154void __init s3c64xx_init_io(struct map_desc *mach_desc, int size) 179void __init s3c64xx_init_io(struct map_desc *mach_desc, int size)
@@ -161,6 +186,8 @@ void __init s3c64xx_init_io(struct map_desc *mach_desc, int size)
161 s3c64xx_init_cpu(); 186 s3c64xx_init_cpu();
162 187
163 s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); 188 s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids));
189
190 samsung_pwm_set_platdata(&s3c64xx_pwm_variant);
164} 191}
165 192
166static __init int s3c64xx_dev_init(void) 193static __init int s3c64xx_dev_init(void)
@@ -195,9 +222,6 @@ void __init s3c64xx_init_irq(u32 vic0_valid, u32 vic1_valid)
195 /* initialise the pair of VICs */ 222 /* initialise the pair of VICs */
196 vic_init(VA_VIC0, IRQ_VIC0_BASE, vic0_valid, IRQ_VIC0_RESUME); 223 vic_init(VA_VIC0, IRQ_VIC0_BASE, vic0_valid, IRQ_VIC0_RESUME);
197 vic_init(VA_VIC1, IRQ_VIC1_BASE, vic1_valid, IRQ_VIC1_RESUME); 224 vic_init(VA_VIC1, IRQ_VIC1_BASE, vic1_valid, IRQ_VIC1_RESUME);
198
199 /* add the timer sub-irqs */
200 s3c_init_vic_timer_irq(5, IRQ_TIMER0);
201} 225}
202 226
203#define eint_offset(irq) ((irq) - IRQ_EINT(0)) 227#define eint_offset(irq) ((irq) - IRQ_EINT(0))
diff --git a/arch/arm/mach-s3c64xx/include/mach/irqs.h b/arch/arm/mach-s3c64xx/include/mach/irqs.h
index 96d60e0d9372..67bbd1dd04c2 100644
--- a/arch/arm/mach-s3c64xx/include/mach/irqs.h
+++ b/arch/arm/mach-s3c64xx/include/mach/irqs.h
@@ -107,14 +107,6 @@
107#define IRQ_TC IRQ_PENDN 107#define IRQ_TC IRQ_PENDN
108#define IRQ_ADC S3C64XX_IRQ_VIC1(31) 108#define IRQ_ADC S3C64XX_IRQ_VIC1(31)
109 109
110#define S3C64XX_TIMER_IRQ(x) S3C_IRQ(64 + (x))
111
112#define IRQ_TIMER0 S3C64XX_TIMER_IRQ(0)
113#define IRQ_TIMER1 S3C64XX_TIMER_IRQ(1)
114#define IRQ_TIMER2 S3C64XX_TIMER_IRQ(2)
115#define IRQ_TIMER3 S3C64XX_TIMER_IRQ(3)
116#define IRQ_TIMER4 S3C64XX_TIMER_IRQ(4)
117
118/* compatibility for device defines */ 110/* compatibility for device defines */
119 111
120#define IRQ_IIC1 IRQ_S3C6410_IIC1 112#define IRQ_IIC1 IRQ_S3C6410_IIC1
diff --git a/arch/arm/mach-s3c64xx/include/mach/map.h b/arch/arm/mach-s3c64xx/include/mach/map.h
index 8e2097bb208a..f55ccb1ce893 100644
--- a/arch/arm/mach-s3c64xx/include/mach/map.h
+++ b/arch/arm/mach-s3c64xx/include/mach/map.h
@@ -121,5 +121,6 @@
121#define SAMSUNG_PA_ADC S3C64XX_PA_ADC 121#define SAMSUNG_PA_ADC S3C64XX_PA_ADC
122#define SAMSUNG_PA_CFCON S3C64XX_PA_CFCON 122#define SAMSUNG_PA_CFCON S3C64XX_PA_CFCON
123#define SAMSUNG_PA_KEYPAD S3C64XX_PA_KEYPAD 123#define SAMSUNG_PA_KEYPAD S3C64XX_PA_KEYPAD
124#define SAMSUNG_PA_TIMER S3C64XX_PA_TIMER
124 125
125#endif /* __ASM_ARCH_6400_MAP_H */ 126#endif /* __ASM_ARCH_6400_MAP_H */
diff --git a/arch/arm/mach-s3c64xx/irq-pm.c b/arch/arm/mach-s3c64xx/irq-pm.c
index 0c7e1d960ca4..c3da1b68d03e 100644
--- a/arch/arm/mach-s3c64xx/irq-pm.c
+++ b/arch/arm/mach-s3c64xx/irq-pm.c
@@ -22,7 +22,6 @@
22#include <mach/map.h> 22#include <mach/map.h>
23 23
24#include <plat/regs-serial.h> 24#include <plat/regs-serial.h>
25#include <plat/regs-timer.h>
26#include <mach/regs-gpio.h> 25#include <mach/regs-gpio.h>
27#include <plat/cpu.h> 26#include <plat/cpu.h>
28#include <plat/pm.h> 27#include <plat/pm.h>
@@ -43,7 +42,6 @@ static struct sleep_save irq_save[] = {
43 SAVE_ITEM(S3C64XX_EINT0FLTCON2), 42 SAVE_ITEM(S3C64XX_EINT0FLTCON2),
44 SAVE_ITEM(S3C64XX_EINT0FLTCON3), 43 SAVE_ITEM(S3C64XX_EINT0FLTCON3),
45 SAVE_ITEM(S3C64XX_EINT0MASK), 44 SAVE_ITEM(S3C64XX_EINT0MASK),
46 SAVE_ITEM(S3C64XX_TINT_CSTAT),
47}; 45};
48 46
49static struct irq_grp_save { 47static struct irq_grp_save {
diff --git a/arch/arm/mach-s3c64xx/mach-crag6410.c b/arch/arm/mach-s3c64xx/mach-crag6410.c
index 8ad88ace795a..eb8e5a1aca42 100644
--- a/arch/arm/mach-s3c64xx/mach-crag6410.c
+++ b/arch/arm/mach-s3c64xx/mach-crag6410.c
@@ -30,7 +30,7 @@
30#include <linux/basic_mmio_gpio.h> 30#include <linux/basic_mmio_gpio.h>
31#include <linux/spi/spi.h> 31#include <linux/spi/spi.h>
32 32
33#include <linux/i2c/pca953x.h> 33#include <linux/platform_data/pca953x.h>
34#include <linux/platform_data/s3c-hsotg.h> 34#include <linux/platform_data/s3c-hsotg.h>
35 35
36#include <video/platform_lcd.h> 36#include <video/platform_lcd.h>
@@ -120,7 +120,7 @@ static struct platform_device crag6410_backlight_device = {
120 .name = "pwm-backlight", 120 .name = "pwm-backlight",
121 .id = -1, 121 .id = -1,
122 .dev = { 122 .dev = {
123 .parent = &s3c_device_timer[0].dev, 123 .parent = &samsung_device_pwm.dev,
124 .platform_data = &crag6410_backlight_data, 124 .platform_data = &crag6410_backlight_data,
125 }, 125 },
126}; 126};
@@ -375,7 +375,7 @@ static struct platform_device *crag6410_devices[] __initdata = {
375 &s3c_device_fb, 375 &s3c_device_fb,
376 &s3c_device_ohci, 376 &s3c_device_ohci,
377 &s3c_device_usb_hsotg, 377 &s3c_device_usb_hsotg,
378 &s3c_device_timer[0], 378 &samsung_device_pwm,
379 &s3c64xx_device_iis0, 379 &s3c64xx_device_iis0,
380 &s3c64xx_device_iis1, 380 &s3c64xx_device_iis1,
381 &samsung_device_keypad, 381 &samsung_device_keypad,
diff --git a/arch/arm/mach-s3c64xx/mach-hmt.c b/arch/arm/mach-s3c64xx/mach-hmt.c
index 5b7f357d8c22..f39569e0f2e6 100644
--- a/arch/arm/mach-s3c64xx/mach-hmt.c
+++ b/arch/arm/mach-s3c64xx/mach-hmt.c
@@ -123,7 +123,7 @@ static struct platform_pwm_backlight_data hmt_backlight_data = {
123static struct platform_device hmt_backlight_device = { 123static struct platform_device hmt_backlight_device = {
124 .name = "pwm-backlight", 124 .name = "pwm-backlight",
125 .dev = { 125 .dev = {
126 .parent = &s3c_device_timer[1].dev, 126 .parent = &samsung_device_pwm.dev,
127 .platform_data = &hmt_backlight_data, 127 .platform_data = &hmt_backlight_data,
128 }, 128 },
129}; 129};
@@ -239,7 +239,7 @@ static struct platform_device *hmt_devices[] __initdata = {
239 &s3c_device_nand, 239 &s3c_device_nand,
240 &s3c_device_fb, 240 &s3c_device_fb,
241 &s3c_device_ohci, 241 &s3c_device_ohci,
242 &s3c_device_timer[1], 242 &samsung_device_pwm,
243 &hmt_backlight_device, 243 &hmt_backlight_device,
244 &hmt_leds_device, 244 &hmt_leds_device,
245}; 245};
diff --git a/arch/arm/mach-s3c64xx/mach-smartq.c b/arch/arm/mach-s3c64xx/mach-smartq.c
index 58ac99041274..86d980b448fd 100644
--- a/arch/arm/mach-s3c64xx/mach-smartq.c
+++ b/arch/arm/mach-s3c64xx/mach-smartq.c
@@ -157,7 +157,7 @@ static struct platform_pwm_backlight_data smartq_backlight_data = {
157static struct platform_device smartq_backlight_device = { 157static struct platform_device smartq_backlight_device = {
158 .name = "pwm-backlight", 158 .name = "pwm-backlight",
159 .dev = { 159 .dev = {
160 .parent = &s3c_device_timer[1].dev, 160 .parent = &samsung_device_pwm.dev,
161 .platform_data = &smartq_backlight_data, 161 .platform_data = &smartq_backlight_data,
162 }, 162 },
163}; 163};
@@ -246,7 +246,7 @@ static struct platform_device *smartq_devices[] __initdata = {
246 &s3c_device_i2c0, 246 &s3c_device_i2c0,
247 &s3c_device_ohci, 247 &s3c_device_ohci,
248 &s3c_device_rtc, 248 &s3c_device_rtc,
249 &s3c_device_timer[1], 249 &samsung_device_pwm,
250 &s3c_device_ts, 250 &s3c_device_ts,
251 &s3c_device_usb_hsotg, 251 &s3c_device_usb_hsotg,
252 &s3c64xx_device_iis0, 252 &s3c64xx_device_iis0,
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6410.c b/arch/arm/mach-s3c64xx/mach-smdk6410.c
index bd3295a19ad7..d90b450c5645 100644
--- a/arch/arm/mach-s3c64xx/mach-smdk6410.c
+++ b/arch/arm/mach-s3c64xx/mach-smdk6410.c
@@ -274,6 +274,7 @@ static struct platform_device *smdk6410_devices[] __initdata = {
274 &s3c_device_i2c1, 274 &s3c_device_i2c1,
275 &s3c_device_fb, 275 &s3c_device_fb,
276 &s3c_device_ohci, 276 &s3c_device_ohci,
277 &samsung_device_pwm,
277 &s3c_device_usb_hsotg, 278 &s3c_device_usb_hsotg,
278 &s3c64xx_device_iisv4, 279 &s3c64xx_device_iisv4,
279 &samsung_device_keypad, 280 &samsung_device_keypad,
@@ -691,9 +692,9 @@ static void __init smdk6410_machine_init(void)
691 692
692 s3c_ide_set_platdata(&smdk6410_ide_pdata); 693 s3c_ide_set_platdata(&smdk6410_ide_pdata);
693 694
694 samsung_bl_set(&smdk6410_bl_gpio_info, &smdk6410_bl_data);
695
696 platform_add_devices(smdk6410_devices, ARRAY_SIZE(smdk6410_devices)); 695 platform_add_devices(smdk6410_devices, ARRAY_SIZE(smdk6410_devices));
696
697 samsung_bl_set(&smdk6410_bl_gpio_info, &smdk6410_bl_data);
697} 698}
698 699
699MACHINE_START(SMDK6410, "SMDK6410") 700MACHINE_START(SMDK6410, "SMDK6410")
diff --git a/arch/arm/mach-s5p64x0/Kconfig b/arch/arm/mach-s5p64x0/Kconfig
index 5a707bdb9ea0..bb2111b3751e 100644
--- a/arch/arm/mach-s5p64x0/Kconfig
+++ b/arch/arm/mach-s5p64x0/Kconfig
@@ -11,14 +11,12 @@ config CPU_S5P6440
11 bool 11 bool
12 select S5P_SLEEP if PM 12 select S5P_SLEEP if PM
13 select SAMSUNG_DMADEV 13 select SAMSUNG_DMADEV
14 select SAMSUNG_HRT
15 select SAMSUNG_WAKEMASK if PM 14 select SAMSUNG_WAKEMASK if PM
16 help 15 help
17 Enable S5P6440 CPU support 16 Enable S5P6440 CPU support
18 17
19config CPU_S5P6450 18config CPU_S5P6450
20 bool 19 bool
21 select SAMSUNG_HRT
22 select S5P_SLEEP if PM 20 select S5P_SLEEP if PM
23 select SAMSUNG_DMADEV 21 select SAMSUNG_DMADEV
24 select SAMSUNG_WAKEMASK if PM 22 select SAMSUNG_WAKEMASK if PM
diff --git a/arch/arm/mach-s5p64x0/clock-s5p6440.c b/arch/arm/mach-s5p64x0/clock-s5p6440.c
index 3537815247f1..ae34a1d5e10a 100644
--- a/arch/arm/mach-s5p64x0/clock-s5p6440.c
+++ b/arch/arm/mach-s5p64x0/clock-s5p6440.c
@@ -629,6 +629,4 @@ void __init s5p6440_register_clocks(void)
629 clkdev_add_table(s5p6440_clk_lookup, ARRAY_SIZE(s5p6440_clk_lookup)); 629 clkdev_add_table(s5p6440_clk_lookup, ARRAY_SIZE(s5p6440_clk_lookup));
630 630
631 s3c24xx_register_clock(&dummy_apb_pclk); 631 s3c24xx_register_clock(&dummy_apb_pclk);
632
633 s3c_pwmclk_init();
634} 632}
diff --git a/arch/arm/mach-s5p64x0/clock-s5p6450.c b/arch/arm/mach-s5p64x0/clock-s5p6450.c
index af384ddd2dcf..0b3ca2ed53e9 100644
--- a/arch/arm/mach-s5p64x0/clock-s5p6450.c
+++ b/arch/arm/mach-s5p64x0/clock-s5p6450.c
@@ -698,6 +698,4 @@ void __init s5p6450_register_clocks(void)
698 clkdev_add_table(s5p6450_clk_lookup, ARRAY_SIZE(s5p6450_clk_lookup)); 698 clkdev_add_table(s5p6450_clk_lookup, ARRAY_SIZE(s5p6450_clk_lookup));
699 699
700 s3c24xx_register_clock(&dummy_apb_pclk); 700 s3c24xx_register_clock(&dummy_apb_pclk);
701
702 s3c_pwmclk_init();
703} 701}
diff --git a/arch/arm/mach-s5p64x0/common.c b/arch/arm/mach-s5p64x0/common.c
index dfdfdc320ce7..42e14f2e7ca7 100644
--- a/arch/arm/mach-s5p64x0/common.c
+++ b/arch/arm/mach-s5p64x0/common.c
@@ -19,6 +19,7 @@
19#include <linux/io.h> 19#include <linux/io.h>
20#include <linux/device.h> 20#include <linux/device.h>
21#include <linux/serial_core.h> 21#include <linux/serial_core.h>
22#include <clocksource/samsung_pwm.h>
22#include <linux/platform_device.h> 23#include <linux/platform_device.h>
23#include <linux/sched.h> 24#include <linux/sched.h>
24#include <linux/dma-mapping.h> 25#include <linux/dma-mapping.h>
@@ -47,6 +48,7 @@
47#include <plat/fb-core.h> 48#include <plat/fb-core.h>
48#include <plat/spi-core.h> 49#include <plat/spi-core.h>
49#include <plat/gpio-cfg.h> 50#include <plat/gpio-cfg.h>
51#include <plat/pwm-core.h>
50#include <plat/regs-irqtype.h> 52#include <plat/regs-irqtype.h>
51#include <plat/regs-serial.h> 53#include <plat/regs-serial.h>
52#include <plat/watchdog-reset.h> 54#include <plat/watchdog-reset.h>
@@ -157,6 +159,30 @@ static void s5p64x0_idle(void)
157 cpu_do_idle(); 159 cpu_do_idle();
158} 160}
159 161
162static struct samsung_pwm_variant s5p64x0_pwm_variant = {
163 .bits = 32,
164 .div_base = 0,
165 .has_tint_cstat = true,
166 .tclk_mask = 0,
167};
168
169void __init samsung_set_timer_source(unsigned int event, unsigned int source)
170{
171 s5p64x0_pwm_variant.output_mask = BIT(SAMSUNG_PWM_NUM) - 1;
172 s5p64x0_pwm_variant.output_mask &= ~(BIT(event) | BIT(source));
173}
174
175void __init samsung_timer_init(void)
176{
177 unsigned int timer_irqs[SAMSUNG_PWM_NUM] = {
178 IRQ_TIMER0_VIC, IRQ_TIMER1_VIC, IRQ_TIMER2_VIC,
179 IRQ_TIMER3_VIC, IRQ_TIMER4_VIC,
180 };
181
182 samsung_pwm_clocksource_init(S3C_VA_TIMER,
183 timer_irqs, &s5p64x0_pwm_variant);
184}
185
160/* 186/*
161 * s5p64x0_map_io 187 * s5p64x0_map_io
162 * 188 *
@@ -176,6 +202,7 @@ void __init s5p64x0_init_io(struct map_desc *mach_desc, int size)
176 s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); 202 s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids));
177 samsung_wdt_reset_init(S3C_VA_WATCHDOG); 203 samsung_wdt_reset_init(S3C_VA_WATCHDOG);
178 204
205 samsung_pwm_set_platdata(&s5p64x0_pwm_variant);
179} 206}
180 207
181void __init s5p6440_map_io(void) 208void __init s5p6440_map_io(void)
diff --git a/arch/arm/mach-s5p64x0/include/mach/irqs.h b/arch/arm/mach-s5p64x0/include/mach/irqs.h
index 5b845e849b30..53982db9d259 100644
--- a/arch/arm/mach-s5p64x0/include/mach/irqs.h
+++ b/arch/arm/mach-s5p64x0/include/mach/irqs.h
@@ -141,8 +141,6 @@
141 141
142#define IRQ_EINT_GROUP(grp, x) (IRQ_EINT_GROUP##grp##_BASE + (x)) 142#define IRQ_EINT_GROUP(grp, x) (IRQ_EINT_GROUP##grp##_BASE + (x))
143 143
144#define IRQ_TIMER_BASE (11)
145
146/* Set the default NR_IRQS */ 144/* Set the default NR_IRQS */
147 145
148#define NR_IRQS (IRQ_EINT_GROUP8_BASE + IRQ_EINT_GROUP8_NR + 1) 146#define NR_IRQS (IRQ_EINT_GROUP8_BASE + IRQ_EINT_GROUP8_NR + 1)
diff --git a/arch/arm/mach-s5p64x0/include/mach/map.h b/arch/arm/mach-s5p64x0/include/mach/map.h
index 0c0175dbfa34..50a6e96d6389 100644
--- a/arch/arm/mach-s5p64x0/include/mach/map.h
+++ b/arch/arm/mach-s5p64x0/include/mach/map.h
@@ -76,6 +76,7 @@
76#define S5P_PA_TIMER S5P64X0_PA_TIMER 76#define S5P_PA_TIMER S5P64X0_PA_TIMER
77 77
78#define SAMSUNG_PA_ADC S5P64X0_PA_ADC 78#define SAMSUNG_PA_ADC S5P64X0_PA_ADC
79#define SAMSUNG_PA_TIMER S5P64X0_PA_TIMER
79 80
80/* UART */ 81/* UART */
81 82
diff --git a/arch/arm/mach-s5p64x0/mach-smdk6440.c b/arch/arm/mach-s5p64x0/mach-smdk6440.c
index 73f71a698a34..0b00304c1e91 100644
--- a/arch/arm/mach-s5p64x0/mach-smdk6440.c
+++ b/arch/arm/mach-s5p64x0/mach-smdk6440.c
@@ -162,6 +162,7 @@ static struct platform_device *smdk6440_devices[] __initdata = {
162 &s3c_device_rtc, 162 &s3c_device_rtc,
163 &s3c_device_i2c0, 163 &s3c_device_i2c0,
164 &s3c_device_i2c1, 164 &s3c_device_i2c1,
165 &samsung_device_pwm,
165 &s3c_device_ts, 166 &s3c_device_ts,
166 &s3c_device_wdt, 167 &s3c_device_wdt,
167 &s5p6440_device_iis, 168 &s5p6440_device_iis,
@@ -254,8 +255,6 @@ static void __init smdk6440_machine_init(void)
254 i2c_register_board_info(1, smdk6440_i2c_devs1, 255 i2c_register_board_info(1, smdk6440_i2c_devs1,
255 ARRAY_SIZE(smdk6440_i2c_devs1)); 256 ARRAY_SIZE(smdk6440_i2c_devs1));
256 257
257 samsung_bl_set(&smdk6440_bl_gpio_info, &smdk6440_bl_data);
258
259 s5p6440_set_lcd_interface(); 258 s5p6440_set_lcd_interface();
260 s3c_fb_set_platdata(&smdk6440_lcd_pdata); 259 s3c_fb_set_platdata(&smdk6440_lcd_pdata);
261 260
@@ -264,6 +263,8 @@ static void __init smdk6440_machine_init(void)
264 s3c_sdhci2_set_platdata(&smdk6440_hsmmc2_pdata); 263 s3c_sdhci2_set_platdata(&smdk6440_hsmmc2_pdata);
265 264
266 platform_add_devices(smdk6440_devices, ARRAY_SIZE(smdk6440_devices)); 265 platform_add_devices(smdk6440_devices, ARRAY_SIZE(smdk6440_devices));
266
267 samsung_bl_set(&smdk6440_bl_gpio_info, &smdk6440_bl_data);
267} 268}
268 269
269MACHINE_START(SMDK6440, "SMDK6440") 270MACHINE_START(SMDK6440, "SMDK6440")
diff --git a/arch/arm/mach-s5p64x0/mach-smdk6450.c b/arch/arm/mach-s5p64x0/mach-smdk6450.c
index 18303e12019f..5949296e88fd 100644
--- a/arch/arm/mach-s5p64x0/mach-smdk6450.c
+++ b/arch/arm/mach-s5p64x0/mach-smdk6450.c
@@ -180,6 +180,7 @@ static struct platform_device *smdk6450_devices[] __initdata = {
180 &s3c_device_rtc, 180 &s3c_device_rtc,
181 &s3c_device_i2c0, 181 &s3c_device_i2c0,
182 &s3c_device_i2c1, 182 &s3c_device_i2c1,
183 &samsung_device_pwm,
183 &s3c_device_ts, 184 &s3c_device_ts,
184 &s3c_device_wdt, 185 &s3c_device_wdt,
185 &s5p6450_device_iis0, 186 &s5p6450_device_iis0,
@@ -273,8 +274,6 @@ static void __init smdk6450_machine_init(void)
273 i2c_register_board_info(1, smdk6450_i2c_devs1, 274 i2c_register_board_info(1, smdk6450_i2c_devs1,
274 ARRAY_SIZE(smdk6450_i2c_devs1)); 275 ARRAY_SIZE(smdk6450_i2c_devs1));
275 276
276 samsung_bl_set(&smdk6450_bl_gpio_info, &smdk6450_bl_data);
277
278 s5p6450_set_lcd_interface(); 277 s5p6450_set_lcd_interface();
279 s3c_fb_set_platdata(&smdk6450_lcd_pdata); 278 s3c_fb_set_platdata(&smdk6450_lcd_pdata);
280 279
@@ -283,6 +282,8 @@ static void __init smdk6450_machine_init(void)
283 s3c_sdhci2_set_platdata(&smdk6450_hsmmc2_pdata); 282 s3c_sdhci2_set_platdata(&smdk6450_hsmmc2_pdata);
284 283
285 platform_add_devices(smdk6450_devices, ARRAY_SIZE(smdk6450_devices)); 284 platform_add_devices(smdk6450_devices, ARRAY_SIZE(smdk6450_devices));
285
286 samsung_bl_set(&smdk6450_bl_gpio_info, &smdk6450_bl_data);
286} 287}
287 288
288MACHINE_START(SMDK6450, "SMDK6450") 289MACHINE_START(SMDK6450, "SMDK6450")
diff --git a/arch/arm/mach-s5p64x0/pm.c b/arch/arm/mach-s5p64x0/pm.c
index 97c2a08ad490..861e15cea691 100644
--- a/arch/arm/mach-s5p64x0/pm.c
+++ b/arch/arm/mach-s5p64x0/pm.c
@@ -18,7 +18,6 @@
18 18
19#include <plat/cpu.h> 19#include <plat/cpu.h>
20#include <plat/pm.h> 20#include <plat/pm.h>
21#include <plat/regs-timer.h>
22#include <plat/wakeup-mask.h> 21#include <plat/wakeup-mask.h>
23 22
24#include <mach/regs-clock.h> 23#include <mach/regs-clock.h>
@@ -48,8 +47,6 @@ static struct sleep_save s5p64x0_misc_save[] = {
48 SAVE_ITEM(S5P64X0_MEM0CONSLP1), 47 SAVE_ITEM(S5P64X0_MEM0CONSLP1),
49 SAVE_ITEM(S5P64X0_MEM0DRVCON), 48 SAVE_ITEM(S5P64X0_MEM0DRVCON),
50 SAVE_ITEM(S5P64X0_MEM1DRVCON), 49 SAVE_ITEM(S5P64X0_MEM1DRVCON),
51
52 SAVE_ITEM(S3C64XX_TINT_CSTAT),
53}; 50};
54 51
55/* DPLL is present only in S5P6450 */ 52/* DPLL is present only in S5P6450 */
diff --git a/arch/arm/mach-s5pc100/Kconfig b/arch/arm/mach-s5pc100/Kconfig
index 2f456a4533ba..15170be97a74 100644
--- a/arch/arm/mach-s5pc100/Kconfig
+++ b/arch/arm/mach-s5pc100/Kconfig
@@ -11,7 +11,6 @@ config CPU_S5PC100
11 bool 11 bool
12 select S5P_EXT_INT 12 select S5P_EXT_INT
13 select SAMSUNG_DMADEV 13 select SAMSUNG_DMADEV
14 select SAMSUNG_HRT
15 help 14 help
16 Enable S5PC100 CPU support 15 Enable S5PC100 CPU support
17 16
diff --git a/arch/arm/mach-s5pc100/clock.c b/arch/arm/mach-s5pc100/clock.c
index a206dc35eff1..d0dc10ee7729 100644
--- a/arch/arm/mach-s5pc100/clock.c
+++ b/arch/arm/mach-s5pc100/clock.c
@@ -1358,6 +1358,4 @@ void __init s5pc100_register_clocks(void)
1358 s3c_disable_clocks(clk_cdev[ptr], 1); 1358 s3c_disable_clocks(clk_cdev[ptr], 1);
1359 1359
1360 s3c24xx_register_clock(&dummy_apb_pclk); 1360 s3c24xx_register_clock(&dummy_apb_pclk);
1361
1362 s3c_pwmclk_init();
1363} 1361}
diff --git a/arch/arm/mach-s5pc100/common.c b/arch/arm/mach-s5pc100/common.c
index 4bdfecf6d024..c5a8eeacf81c 100644
--- a/arch/arm/mach-s5pc100/common.c
+++ b/arch/arm/mach-s5pc100/common.c
@@ -22,6 +22,7 @@
22#include <linux/io.h> 22#include <linux/io.h>
23#include <linux/device.h> 23#include <linux/device.h>
24#include <linux/serial_core.h> 24#include <linux/serial_core.h>
25#include <clocksource/samsung_pwm.h>
25#include <linux/platform_device.h> 26#include <linux/platform_device.h>
26#include <linux/sched.h> 27#include <linux/sched.h>
27#include <linux/reboot.h> 28#include <linux/reboot.h>
@@ -46,6 +47,7 @@
46#include <plat/fb-core.h> 47#include <plat/fb-core.h>
47#include <plat/iic-core.h> 48#include <plat/iic-core.h>
48#include <plat/onenand-core.h> 49#include <plat/onenand-core.h>
50#include <plat/pwm-core.h>
49#include <plat/spi-core.h> 51#include <plat/spi-core.h>
50#include <plat/regs-serial.h> 52#include <plat/regs-serial.h>
51#include <plat/watchdog-reset.h> 53#include <plat/watchdog-reset.h>
@@ -132,6 +134,30 @@ static struct map_desc s5pc100_iodesc[] __initdata = {
132 } 134 }
133}; 135};
134 136
137static struct samsung_pwm_variant s5pc100_pwm_variant = {
138 .bits = 32,
139 .div_base = 0,
140 .has_tint_cstat = true,
141 .tclk_mask = (1 << 5),
142};
143
144void __init samsung_set_timer_source(unsigned int event, unsigned int source)
145{
146 s5pc100_pwm_variant.output_mask = BIT(SAMSUNG_PWM_NUM) - 1;
147 s5pc100_pwm_variant.output_mask &= ~(BIT(event) | BIT(source));
148}
149
150void __init samsung_timer_init(void)
151{
152 unsigned int timer_irqs[SAMSUNG_PWM_NUM] = {
153 IRQ_TIMER0_VIC, IRQ_TIMER1_VIC, IRQ_TIMER2_VIC,
154 IRQ_TIMER3_VIC, IRQ_TIMER4_VIC,
155 };
156
157 samsung_pwm_clocksource_init(S3C_VA_TIMER,
158 timer_irqs, &s5pc100_pwm_variant);
159}
160
135/* 161/*
136 * s5pc100_map_io 162 * s5pc100_map_io
137 * 163 *
@@ -149,6 +175,8 @@ void __init s5pc100_init_io(struct map_desc *mach_desc, int size)
149 s5p_init_cpu(S5P_VA_CHIPID); 175 s5p_init_cpu(S5P_VA_CHIPID);
150 176
151 s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); 177 s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids));
178
179 samsung_pwm_set_platdata(&s5pc100_pwm_variant);
152} 180}
153 181
154void __init s5pc100_map_io(void) 182void __init s5pc100_map_io(void)
diff --git a/arch/arm/mach-s5pc100/include/mach/irqs.h b/arch/arm/mach-s5pc100/include/mach/irqs.h
index 2870f12c7926..d2eb4757381f 100644
--- a/arch/arm/mach-s5pc100/include/mach/irqs.h
+++ b/arch/arm/mach-s5pc100/include/mach/irqs.h
@@ -97,8 +97,6 @@
97#define IRQ_SDMFIQ S5P_IRQ_VIC2(31) 97#define IRQ_SDMFIQ S5P_IRQ_VIC2(31)
98#define IRQ_VIC_END S5P_IRQ_VIC2(31) 98#define IRQ_VIC_END S5P_IRQ_VIC2(31)
99 99
100#define IRQ_TIMER_BASE (11)
101
102#define S5P_EINT_BASE1 (S5P_IRQ_VIC0(0)) 100#define S5P_EINT_BASE1 (S5P_IRQ_VIC0(0))
103#define S5P_EINT_BASE2 (IRQ_VIC_END + 1) 101#define S5P_EINT_BASE2 (IRQ_VIC_END + 1)
104 102
diff --git a/arch/arm/mach-s5pc100/include/mach/map.h b/arch/arm/mach-s5pc100/include/mach/map.h
index 54bc4f82e17a..2550b6112b82 100644
--- a/arch/arm/mach-s5pc100/include/mach/map.h
+++ b/arch/arm/mach-s5pc100/include/mach/map.h
@@ -116,6 +116,7 @@
116#define SAMSUNG_PA_ADC S5PC100_PA_TSADC 116#define SAMSUNG_PA_ADC S5PC100_PA_TSADC
117#define SAMSUNG_PA_CFCON S5PC100_PA_CFCON 117#define SAMSUNG_PA_CFCON S5PC100_PA_CFCON
118#define SAMSUNG_PA_KEYPAD S5PC100_PA_KEYPAD 118#define SAMSUNG_PA_KEYPAD S5PC100_PA_KEYPAD
119#define SAMSUNG_PA_TIMER S5PC100_PA_TIMER
119 120
120#define S5PC100_VA_OTHERS (S3C_VA_SYS + 0x10000) 121#define S5PC100_VA_OTHERS (S3C_VA_SYS + 0x10000)
121 122
diff --git a/arch/arm/mach-s5pc100/mach-smdkc100.c b/arch/arm/mach-s5pc100/mach-smdkc100.c
index 8c880f76f274..7c57a221785e 100644
--- a/arch/arm/mach-s5pc100/mach-smdkc100.c
+++ b/arch/arm/mach-s5pc100/mach-smdkc100.c
@@ -194,6 +194,7 @@ static struct platform_device *smdkc100_devices[] __initdata = {
194 &s3c_device_hsmmc0, 194 &s3c_device_hsmmc0,
195 &s3c_device_hsmmc1, 195 &s3c_device_hsmmc1,
196 &s3c_device_hsmmc2, 196 &s3c_device_hsmmc2,
197 &samsung_device_pwm,
197 &s3c_device_ts, 198 &s3c_device_ts,
198 &s3c_device_wdt, 199 &s3c_device_wdt,
199 &smdkc100_lcd_powerdev, 200 &smdkc100_lcd_powerdev,
@@ -246,9 +247,9 @@ static void __init smdkc100_machine_init(void)
246 gpio_request(S5PC100_GPH0(6), "GPH0"); 247 gpio_request(S5PC100_GPH0(6), "GPH0");
247 smdkc100_lcd_power_set(&smdkc100_lcd_power_data, 0); 248 smdkc100_lcd_power_set(&smdkc100_lcd_power_data, 0);
248 249
249 samsung_bl_set(&smdkc100_bl_gpio_info, &smdkc100_bl_data);
250
251 platform_add_devices(smdkc100_devices, ARRAY_SIZE(smdkc100_devices)); 250 platform_add_devices(smdkc100_devices, ARRAY_SIZE(smdkc100_devices));
251
252 samsung_bl_set(&smdkc100_bl_gpio_info, &smdkc100_bl_data);
252} 253}
253 254
254MACHINE_START(SMDKC100, "SMDKC100") 255MACHINE_START(SMDKC100, "SMDKC100")
diff --git a/arch/arm/mach-s5pv210/Kconfig b/arch/arm/mach-s5pv210/Kconfig
index 0963283a7c5d..caaedafbbf5f 100644
--- a/arch/arm/mach-s5pv210/Kconfig
+++ b/arch/arm/mach-s5pv210/Kconfig
@@ -15,7 +15,6 @@ config CPU_S5PV210
15 select S5P_PM if PM 15 select S5P_PM if PM
16 select S5P_SLEEP if PM 16 select S5P_SLEEP if PM
17 select SAMSUNG_DMADEV 17 select SAMSUNG_DMADEV
18 select SAMSUNG_HRT
19 help 18 help
20 Enable S5PV210 CPU support 19 Enable S5PV210 CPU support
21 20
diff --git a/arch/arm/mach-s5pv210/clock.c b/arch/arm/mach-s5pv210/clock.c
index f051f53e35b7..ca463724a3df 100644
--- a/arch/arm/mach-s5pv210/clock.c
+++ b/arch/arm/mach-s5pv210/clock.c
@@ -1362,5 +1362,4 @@ void __init s5pv210_register_clocks(void)
1362 for (ptr = 0; ptr < ARRAY_SIZE(clk_cdev); ptr++) 1362 for (ptr = 0; ptr < ARRAY_SIZE(clk_cdev); ptr++)
1363 s3c_disable_clocks(clk_cdev[ptr], 1); 1363 s3c_disable_clocks(clk_cdev[ptr], 1);
1364 1364
1365 s3c_pwmclk_init();
1366} 1365}
diff --git a/arch/arm/mach-s5pv210/common.c b/arch/arm/mach-s5pv210/common.c
index 023f1a796a9c..26027a29b8a1 100644
--- a/arch/arm/mach-s5pv210/common.c
+++ b/arch/arm/mach-s5pv210/common.c
@@ -19,6 +19,7 @@
19#include <linux/clk.h> 19#include <linux/clk.h>
20#include <linux/io.h> 20#include <linux/io.h>
21#include <linux/device.h> 21#include <linux/device.h>
22#include <clocksource/samsung_pwm.h>
22#include <linux/platform_device.h> 23#include <linux/platform_device.h>
23#include <linux/sched.h> 24#include <linux/sched.h>
24#include <linux/dma-mapping.h> 25#include <linux/dma-mapping.h>
@@ -42,6 +43,7 @@
42#include <plat/fimc-core.h> 43#include <plat/fimc-core.h>
43#include <plat/iic-core.h> 44#include <plat/iic-core.h>
44#include <plat/keypad-core.h> 45#include <plat/keypad-core.h>
46#include <plat/pwm-core.h>
45#include <plat/tv-core.h> 47#include <plat/tv-core.h>
46#include <plat/spi-core.h> 48#include <plat/spi-core.h>
47#include <plat/regs-serial.h> 49#include <plat/regs-serial.h>
@@ -148,6 +150,30 @@ void s5pv210_restart(enum reboot_mode mode, const char *cmd)
148 __raw_writel(0x1, S5P_SWRESET); 150 __raw_writel(0x1, S5P_SWRESET);
149} 151}
150 152
153static struct samsung_pwm_variant s5pv210_pwm_variant = {
154 .bits = 32,
155 .div_base = 0,
156 .has_tint_cstat = true,
157 .tclk_mask = (1 << 5),
158};
159
160void __init samsung_set_timer_source(unsigned int event, unsigned int source)
161{
162 s5pv210_pwm_variant.output_mask = BIT(SAMSUNG_PWM_NUM) - 1;
163 s5pv210_pwm_variant.output_mask &= ~(BIT(event) | BIT(source));
164}
165
166void __init samsung_timer_init(void)
167{
168 unsigned int timer_irqs[SAMSUNG_PWM_NUM] = {
169 IRQ_TIMER0_VIC, IRQ_TIMER1_VIC, IRQ_TIMER2_VIC,
170 IRQ_TIMER3_VIC, IRQ_TIMER4_VIC,
171 };
172
173 samsung_pwm_clocksource_init(S3C_VA_TIMER,
174 timer_irqs, &s5pv210_pwm_variant);
175}
176
151/* 177/*
152 * s5pv210_map_io 178 * s5pv210_map_io
153 * 179 *
@@ -165,6 +191,8 @@ void __init s5pv210_init_io(struct map_desc *mach_desc, int size)
165 s5p_init_cpu(S5P_VA_CHIPID); 191 s5p_init_cpu(S5P_VA_CHIPID);
166 192
167 s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids)); 193 s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids));
194
195 samsung_pwm_set_platdata(&s5pv210_pwm_variant);
168} 196}
169 197
170void __init s5pv210_map_io(void) 198void __init s5pv210_map_io(void)
diff --git a/arch/arm/mach-s5pv210/include/mach/irqs.h b/arch/arm/mach-s5pv210/include/mach/irqs.h
index e777e010ed2e..5e0de3a31f3d 100644
--- a/arch/arm/mach-s5pv210/include/mach/irqs.h
+++ b/arch/arm/mach-s5pv210/include/mach/irqs.h
@@ -118,8 +118,6 @@
118#define IRQ_MDNIE3 S5P_IRQ_VIC3(8) 118#define IRQ_MDNIE3 S5P_IRQ_VIC3(8)
119#define IRQ_VIC_END S5P_IRQ_VIC3(31) 119#define IRQ_VIC_END S5P_IRQ_VIC3(31)
120 120
121#define IRQ_TIMER_BASE (11)
122
123#define S5P_EINT_BASE1 (S5P_IRQ_VIC0(0)) 121#define S5P_EINT_BASE1 (S5P_IRQ_VIC0(0))
124#define S5P_EINT_BASE2 (IRQ_VIC_END + 1) 122#define S5P_EINT_BASE2 (IRQ_VIC_END + 1)
125 123
diff --git a/arch/arm/mach-s5pv210/include/mach/map.h b/arch/arm/mach-s5pv210/include/mach/map.h
index b7c8a1917ffc..763929aca52d 100644
--- a/arch/arm/mach-s5pv210/include/mach/map.h
+++ b/arch/arm/mach-s5pv210/include/mach/map.h
@@ -139,6 +139,7 @@
139#define SAMSUNG_PA_ADC S5PV210_PA_ADC 139#define SAMSUNG_PA_ADC S5PV210_PA_ADC
140#define SAMSUNG_PA_CFCON S5PV210_PA_CFCON 140#define SAMSUNG_PA_CFCON S5PV210_PA_CFCON
141#define SAMSUNG_PA_KEYPAD S5PV210_PA_KEYPAD 141#define SAMSUNG_PA_KEYPAD S5PV210_PA_KEYPAD
142#define SAMSUNG_PA_TIMER S5PV210_PA_TIMER
142 143
143/* UART */ 144/* UART */
144 145
diff --git a/arch/arm/mach-s5pv210/mach-smdkv210.c b/arch/arm/mach-s5pv210/mach-smdkv210.c
index d50b6f124465..6d72bb992e38 100644
--- a/arch/arm/mach-s5pv210/mach-smdkv210.c
+++ b/arch/arm/mach-s5pv210/mach-smdkv210.c
@@ -218,6 +218,7 @@ static struct platform_device *smdkv210_devices[] __initdata = {
218 &s3c_device_i2c0, 218 &s3c_device_i2c0,
219 &s3c_device_i2c1, 219 &s3c_device_i2c1,
220 &s3c_device_i2c2, 220 &s3c_device_i2c2,
221 &samsung_device_pwm,
221 &s3c_device_rtc, 222 &s3c_device_rtc,
222 &s3c_device_ts, 223 &s3c_device_ts,
223 &s3c_device_usb_hsotg, 224 &s3c_device_usb_hsotg,
@@ -316,11 +317,11 @@ static void __init smdkv210_machine_init(void)
316 317
317 s3c_fb_set_platdata(&smdkv210_lcd0_pdata); 318 s3c_fb_set_platdata(&smdkv210_lcd0_pdata);
318 319
319 samsung_bl_set(&smdkv210_bl_gpio_info, &smdkv210_bl_data);
320
321 s3c_hsotg_set_platdata(&smdkv210_hsotg_pdata); 320 s3c_hsotg_set_platdata(&smdkv210_hsotg_pdata);
322 321
323 platform_add_devices(smdkv210_devices, ARRAY_SIZE(smdkv210_devices)); 322 platform_add_devices(smdkv210_devices, ARRAY_SIZE(smdkv210_devices));
323
324 samsung_bl_set(&smdkv210_bl_gpio_info, &smdkv210_bl_data);
324} 325}
325 326
326MACHINE_START(SMDKV210, "SMDKV210") 327MACHINE_START(SMDKV210, "SMDKV210")
diff --git a/arch/arm/mach-s5pv210/pm.c b/arch/arm/mach-s5pv210/pm.c
index 2b68a67b6e95..3cf3f9c8ddd1 100644
--- a/arch/arm/mach-s5pv210/pm.c
+++ b/arch/arm/mach-s5pv210/pm.c
@@ -21,7 +21,6 @@
21 21
22#include <plat/cpu.h> 22#include <plat/cpu.h>
23#include <plat/pm.h> 23#include <plat/pm.h>
24#include <plat/regs-timer.h>
25 24
26#include <mach/regs-irq.h> 25#include <mach/regs-irq.h>
27#include <mach/regs-clock.h> 26#include <mach/regs-clock.h>
@@ -77,15 +76,6 @@ static struct sleep_save s5pv210_core_save[] = {
77 /* Clock ETC */ 76 /* Clock ETC */
78 SAVE_ITEM(S5P_CLK_OUT), 77 SAVE_ITEM(S5P_CLK_OUT),
79 SAVE_ITEM(S5P_MDNIE_SEL), 78 SAVE_ITEM(S5P_MDNIE_SEL),
80
81 /* PWM Register */
82 SAVE_ITEM(S3C2410_TCFG0),
83 SAVE_ITEM(S3C2410_TCFG1),
84 SAVE_ITEM(S3C64XX_TINT_CSTAT),
85 SAVE_ITEM(S3C2410_TCON),
86 SAVE_ITEM(S3C2410_TCNTB(0)),
87 SAVE_ITEM(S3C2410_TCMPB(0)),
88 SAVE_ITEM(S3C2410_TCNTO(0)),
89}; 79};
90 80
91static int s5pv210_cpu_suspend(unsigned long arg) 81static int s5pv210_cpu_suspend(unsigned long arg)
diff --git a/arch/arm/mach-sa1100/collie.c b/arch/arm/mach-sa1100/collie.c
index 612a45689770..7fb96ebdc0fb 100644
--- a/arch/arm/mach-sa1100/collie.c
+++ b/arch/arm/mach-sa1100/collie.c
@@ -289,7 +289,7 @@ static void collie_flash_exit(void)
289} 289}
290 290
291static struct flash_platform_data collie_flash_data = { 291static struct flash_platform_data collie_flash_data = {
292 .map_name = "cfi_probe", 292 .map_name = "jedec_probe",
293 .init = collie_flash_init, 293 .init = collie_flash_init,
294 .set_vpp = collie_set_vpp, 294 .set_vpp = collie_set_vpp,
295 .exit = collie_flash_exit, 295 .exit = collie_flash_exit,
diff --git a/arch/arm/mach-shmobile/Kconfig b/arch/arm/mach-shmobile/Kconfig
index 3912ce91fee4..1f94c310c477 100644
--- a/arch/arm/mach-shmobile/Kconfig
+++ b/arch/arm/mach-shmobile/Kconfig
@@ -1,3 +1,41 @@
1config ARCH_SHMOBILE_MULTI
2 bool "SH-Mobile Series" if ARCH_MULTI_V7
3 depends on MMU
4 select CPU_V7
5 select GENERIC_CLOCKEVENTS
6 select HAVE_ARM_SCU if SMP
7 select HAVE_ARM_TWD if LOCAL_TIMERS
8 select HAVE_SMP
9 select ARM_GIC
10 select MIGHT_HAVE_CACHE_L2X0
11 select NO_IOPORT
12 select PINCTRL
13 select ARCH_REQUIRE_GPIOLIB
14 select CLKDEV_LOOKUP
15
16if ARCH_SHMOBILE_MULTI
17
18comment "SH-Mobile System Type"
19
20config ARCH_EMEV2
21 bool "Emma Mobile EV2"
22
23comment "SH-Mobile Board Type"
24
25config MACH_KZM9D_REFERENCE
26 bool "KZM9D board - Reference Device Tree Implementation"
27 depends on ARCH_EMEV2
28 select REGULATOR_FIXED_VOLTAGE if REGULATOR
29 ---help---
30 Use reference implementation of KZM9D board support
31 which makes a greater use of device tree at the expense
32 of not supporting a number of devices.
33
34 This is intended to aid developers
35
36comment "SH-Mobile System Configuration"
37endif
38
1if ARCH_SHMOBILE 39if ARCH_SHMOBILE
2 40
3comment "SH-Mobile System Type" 41comment "SH-Mobile System Type"
@@ -23,9 +61,10 @@ config ARCH_R8A73A4
23 select ARCH_WANT_OPTIONAL_GPIOLIB 61 select ARCH_WANT_OPTIONAL_GPIOLIB
24 select ARM_GIC 62 select ARM_GIC
25 select CPU_V7 63 select CPU_V7
26 select HAVE_ARM_ARCH_TIMER
27 select SH_CLK_CPG 64 select SH_CLK_CPG
28 select RENESAS_IRQC 65 select RENESAS_IRQC
66 select ARCH_HAS_CPUFREQ
67 select ARCH_HAS_OPP
29 68
30config ARCH_R8A7740 69config ARCH_R8A7740
31 bool "R-Mobile A1 (R8A77400)" 70 bool "R-Mobile A1 (R8A77400)"
@@ -59,7 +98,6 @@ config ARCH_R8A7790
59 select ARCH_WANT_OPTIONAL_GPIOLIB 98 select ARCH_WANT_OPTIONAL_GPIOLIB
60 select ARM_GIC 99 select ARM_GIC
61 select CPU_V7 100 select CPU_V7
62 select HAVE_ARM_ARCH_TIMER
63 select SH_CLK_CPG 101 select SH_CLK_CPG
64 select RENESAS_IRQC 102 select RENESAS_IRQC
65 103
@@ -71,18 +109,22 @@ config ARCH_EMEV2
71 109
72comment "SH-Mobile Board Type" 110comment "SH-Mobile Board Type"
73 111
74config MACH_AG5EVM
75 bool "AG5EVM board"
76 depends on ARCH_SH73A0
77 select ARCH_REQUIRE_GPIOLIB
78 select REGULATOR_FIXED_VOLTAGE if REGULATOR
79 select SH_LCD_MIPI_DSI
80
81config MACH_APE6EVM 112config MACH_APE6EVM
82 bool "APE6EVM board" 113 bool "APE6EVM board"
83 depends on ARCH_R8A73A4 114 depends on ARCH_R8A73A4
84 select USE_OF 115 select USE_OF
85 116
117config MACH_APE6EVM_REFERENCE
118 bool "APE6EVM board - Reference Device Tree Implementation"
119 depends on ARCH_R8A73A4
120 select USE_OF
121 ---help---
122 Use reference implementation of APE6EVM board support
123 which makes a greater use of device tree at the expense
124 of not supporting a number of devices.
125
126 This is intended to aid developers
127
86config MACH_MACKEREL 128config MACH_MACKEREL
87 bool "mackerel board" 129 bool "mackerel board"
88 depends on ARCH_SH7372 130 depends on ARCH_SH7372
@@ -91,12 +133,6 @@ config MACH_MACKEREL
91 select SND_SOC_AK4642 if SND_SIMPLE_CARD 133 select SND_SOC_AK4642 if SND_SIMPLE_CARD
92 select USE_OF 134 select USE_OF
93 135
94config MACH_KOTA2
95 bool "KOTA2 board"
96 depends on ARCH_SH73A0
97 select ARCH_REQUIRE_GPIOLIB
98 select REGULATOR_FIXED_VOLTAGE if REGULATOR
99
100config MACH_ARMADILLO800EVA 136config MACH_ARMADILLO800EVA
101 bool "Armadillo-800 EVA board" 137 bool "Armadillo-800 EVA board"
102 depends on ARCH_R8A7740 138 depends on ARCH_R8A7740
@@ -124,13 +160,29 @@ config MACH_BOCKW
124 depends on ARCH_R8A7778 160 depends on ARCH_R8A7778
125 select ARCH_REQUIRE_GPIOLIB 161 select ARCH_REQUIRE_GPIOLIB
126 select RENESAS_INTC_IRQPIN 162 select RENESAS_INTC_IRQPIN
163 select REGULATOR_FIXED_VOLTAGE if REGULATOR
164 select USE_OF
165
166config MACH_BOCKW_REFERENCE
167 bool "BOCK-W - Reference Device Tree Implementation"
168 depends on ARCH_R8A7778
169 select ARCH_REQUIRE_GPIOLIB
170 select RENESAS_INTC_IRQPIN
171 select REGULATOR_FIXED_VOLTAGE if REGULATOR
127 select USE_OF 172 select USE_OF
173 ---help---
174 Use reference implementation of BockW board support
175 which makes use of device tree at the expense
176 of not supporting a number of devices.
177
178 This is intended to aid developers
128 179
129config MACH_MARZEN 180config MACH_MARZEN
130 bool "MARZEN board" 181 bool "MARZEN board"
131 depends on ARCH_R8A7779 182 depends on ARCH_R8A7779
132 select ARCH_REQUIRE_GPIOLIB 183 select ARCH_REQUIRE_GPIOLIB
133 select REGULATOR_FIXED_VOLTAGE if REGULATOR 184 select REGULATOR_FIXED_VOLTAGE if REGULATOR
185 select USE_OF
134 186
135config MACH_MARZEN_REFERENCE 187config MACH_MARZEN_REFERENCE
136 bool "MARZEN board - Reference Device Tree Implementation" 188 bool "MARZEN board - Reference Device Tree Implementation"
@@ -150,12 +202,35 @@ config MACH_LAGER
150 depends on ARCH_R8A7790 202 depends on ARCH_R8A7790
151 select USE_OF 203 select USE_OF
152 204
205config MACH_LAGER_REFERENCE
206 bool "Lager board - Reference Device Tree Implementation"
207 depends on ARCH_R8A7790
208 select USE_OF
209 ---help---
210 Use reference implementation of Lager board support
211 which makes use of device tree at the expense
212 of not supporting a number of devices.
213
214 This is intended to aid developers
215
153config MACH_KZM9D 216config MACH_KZM9D
154 bool "KZM9D board" 217 bool "KZM9D board"
155 depends on ARCH_EMEV2 218 depends on ARCH_EMEV2
156 select REGULATOR_FIXED_VOLTAGE if REGULATOR 219 select REGULATOR_FIXED_VOLTAGE if REGULATOR
157 select USE_OF 220 select USE_OF
158 221
222config MACH_KZM9D_REFERENCE
223 bool "KZM9D board - Reference Device Tree Implementation"
224 depends on ARCH_EMEV2
225 select REGULATOR_FIXED_VOLTAGE if REGULATOR
226 select USE_OF
227 ---help---
228 Use reference implementation of KZM9D board support
229 which makes a greater use of device tree at the expense
230 of not supporting a number of devices.
231
232 This is intended to aid developers
233
159config MACH_KZM9G 234config MACH_KZM9G
160 bool "KZM-A9-GT board" 235 bool "KZM-A9-GT board"
161 depends on ARCH_SH73A0 236 depends on ARCH_SH73A0
@@ -186,6 +261,15 @@ config CPU_HAS_INTEVT
186 bool 261 bool
187 default y 262 default y
188 263
264config SH_CLK_CPG
265 bool
266
267source "drivers/sh/Kconfig"
268
269endif
270
271if ARCH_SHMOBILE || ARCH_SHMOBILE_MULTI
272
189menu "Timer and clock configuration" 273menu "Timer and clock configuration"
190 274
191config SHMOBILE_TIMER_HZ 275config SHMOBILE_TIMER_HZ
@@ -220,9 +304,4 @@ config EM_TIMER_STI
220 304
221endmenu 305endmenu
222 306
223config SH_CLK_CPG
224 bool
225
226source "drivers/sh/Kconfig"
227
228endif 307endif
diff --git a/arch/arm/mach-shmobile/Makefile b/arch/arm/mach-shmobile/Makefile
index 6165a517f580..2705bfa8c113 100644
--- a/arch/arm/mach-shmobile/Makefile
+++ b/arch/arm/mach-shmobile/Makefile
@@ -2,50 +2,65 @@
2# Makefile for the linux kernel. 2# Makefile for the linux kernel.
3# 3#
4 4
5ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/arch/arm/mach-shmobile/include
6
5# Common objects 7# Common objects
6obj-y := timer.o console.o clock.o 8obj-y := timer.o console.o
7 9
8# CPU objects 10# CPU objects
9obj-$(CONFIG_ARCH_SH7372) += setup-sh7372.o clock-sh7372.o intc-sh7372.o 11obj-$(CONFIG_ARCH_SH7372) += setup-sh7372.o intc-sh7372.o
10obj-$(CONFIG_ARCH_SH73A0) += setup-sh73a0.o clock-sh73a0.o intc-sh73a0.o 12obj-$(CONFIG_ARCH_SH73A0) += setup-sh73a0.o intc-sh73a0.o
11obj-$(CONFIG_ARCH_R8A73A4) += setup-r8a73a4.o clock-r8a73a4.o 13obj-$(CONFIG_ARCH_R8A73A4) += setup-r8a73a4.o
12obj-$(CONFIG_ARCH_R8A7740) += setup-r8a7740.o clock-r8a7740.o intc-r8a7740.o 14obj-$(CONFIG_ARCH_R8A7740) += setup-r8a7740.o
13obj-$(CONFIG_ARCH_R8A7778) += setup-r8a7778.o clock-r8a7778.o 15obj-$(CONFIG_ARCH_R8A7778) += setup-r8a7778.o
14obj-$(CONFIG_ARCH_R8A7779) += setup-r8a7779.o clock-r8a7779.o intc-r8a7779.o 16obj-$(CONFIG_ARCH_R8A7779) += setup-r8a7779.o
15obj-$(CONFIG_ARCH_R8A7790) += setup-r8a7790.o clock-r8a7790.o 17obj-$(CONFIG_ARCH_R8A7790) += setup-r8a7790.o
16obj-$(CONFIG_ARCH_EMEV2) += setup-emev2.o clock-emev2.o 18obj-$(CONFIG_ARCH_EMEV2) += setup-emev2.o
19
20# Clock objects
21ifndef CONFIG_COMMON_CLK
22obj-y += clock.o
23obj-$(CONFIG_ARCH_SH7372) += clock-sh7372.o
24obj-$(CONFIG_ARCH_SH73A0) += clock-sh73a0.o
25obj-$(CONFIG_ARCH_R8A73A4) += clock-r8a73a4.o
26obj-$(CONFIG_ARCH_R8A7740) += clock-r8a7740.o
27obj-$(CONFIG_ARCH_R8A7778) += clock-r8a7778.o
28obj-$(CONFIG_ARCH_R8A7779) += clock-r8a7779.o
29obj-$(CONFIG_ARCH_R8A7790) += clock-r8a7790.o
30obj-$(CONFIG_ARCH_EMEV2) += clock-emev2.o
31endif
17 32
18# SMP objects 33# SMP objects
19smp-y := platsmp.o headsmp.o 34smp-y := platsmp.o headsmp.o
20smp-$(CONFIG_ARCH_SH73A0) += smp-sh73a0.o headsmp-scu.o 35smp-$(CONFIG_ARCH_SH73A0) += smp-sh73a0.o headsmp-scu.o platsmp-scu.o
21smp-$(CONFIG_ARCH_R8A7779) += smp-r8a7779.o headsmp-scu.o 36smp-$(CONFIG_ARCH_R8A7779) += smp-r8a7779.o headsmp-scu.o platsmp-scu.o
22smp-$(CONFIG_ARCH_EMEV2) += smp-emev2.o headsmp-scu.o 37smp-$(CONFIG_ARCH_EMEV2) += smp-emev2.o headsmp-scu.o platsmp-scu.o
23 38
24# IRQ objects 39# IRQ objects
25obj-$(CONFIG_ARCH_SH7372) += entry-intc.o 40obj-$(CONFIG_ARCH_SH7372) += entry-intc.o
26obj-$(CONFIG_ARCH_R8A7740) += entry-intc.o
27 41
28# PM objects 42# PM objects
29obj-$(CONFIG_SUSPEND) += suspend.o 43obj-$(CONFIG_SUSPEND) += suspend.o
30obj-$(CONFIG_CPU_IDLE) += cpuidle.o 44obj-$(CONFIG_CPU_IDLE) += cpuidle.o
31obj-$(CONFIG_ARCH_SHMOBILE) += pm-rmobile.o 45obj-$(CONFIG_ARCH_SH7372) += pm-sh7372.o sleep-sh7372.o pm-rmobile.o
32obj-$(CONFIG_ARCH_SH7372) += pm-sh7372.o sleep-sh7372.o
33obj-$(CONFIG_ARCH_R8A7740) += pm-r8a7740.o
34obj-$(CONFIG_ARCH_R8A7779) += pm-r8a7779.o
35obj-$(CONFIG_ARCH_SH73A0) += pm-sh73a0.o 46obj-$(CONFIG_ARCH_SH73A0) += pm-sh73a0.o
47obj-$(CONFIG_ARCH_R8A7740) += pm-r8a7740.o pm-rmobile.o
48obj-$(CONFIG_ARCH_R8A7779) += pm-r8a7779.o
36 49
37# Board objects 50# Board objects
38obj-$(CONFIG_MACH_AG5EVM) += board-ag5evm.o
39obj-$(CONFIG_MACH_APE6EVM) += board-ape6evm.o 51obj-$(CONFIG_MACH_APE6EVM) += board-ape6evm.o
52obj-$(CONFIG_MACH_APE6EVM_REFERENCE) += board-ape6evm-reference.o
40obj-$(CONFIG_MACH_MACKEREL) += board-mackerel.o 53obj-$(CONFIG_MACH_MACKEREL) += board-mackerel.o
41obj-$(CONFIG_MACH_KOTA2) += board-kota2.o
42obj-$(CONFIG_MACH_BOCKW) += board-bockw.o 54obj-$(CONFIG_MACH_BOCKW) += board-bockw.o
55obj-$(CONFIG_MACH_BOCKW_REFERENCE) += board-bockw-reference.o
43obj-$(CONFIG_MACH_MARZEN) += board-marzen.o 56obj-$(CONFIG_MACH_MARZEN) += board-marzen.o
44obj-$(CONFIG_MACH_MARZEN_REFERENCE) += board-marzen-reference.o 57obj-$(CONFIG_MACH_MARZEN_REFERENCE) += board-marzen-reference.o
45obj-$(CONFIG_MACH_LAGER) += board-lager.o 58obj-$(CONFIG_MACH_LAGER) += board-lager.o
59obj-$(CONFIG_MACH_LAGER_REFERENCE) += board-lager-reference.o
46obj-$(CONFIG_MACH_ARMADILLO800EVA) += board-armadillo800eva.o 60obj-$(CONFIG_MACH_ARMADILLO800EVA) += board-armadillo800eva.o
47obj-$(CONFIG_MACH_ARMADILLO800EVA_REFERENCE) += board-armadillo800eva-reference.o 61obj-$(CONFIG_MACH_ARMADILLO800EVA_REFERENCE) += board-armadillo800eva-reference.o
48obj-$(CONFIG_MACH_KZM9D) += board-kzm9d.o 62obj-$(CONFIG_MACH_KZM9D) += board-kzm9d.o
63obj-$(CONFIG_MACH_KZM9D_REFERENCE) += board-kzm9d-reference.o
49obj-$(CONFIG_MACH_KZM9G) += board-kzm9g.o 64obj-$(CONFIG_MACH_KZM9G) += board-kzm9g.o
50obj-$(CONFIG_MACH_KZM9G_REFERENCE) += board-kzm9g-reference.o 65obj-$(CONFIG_MACH_KZM9G_REFERENCE) += board-kzm9g-reference.o
51 66
diff --git a/arch/arm/mach-shmobile/Makefile.boot b/arch/arm/mach-shmobile/Makefile.boot
index 84c6868580f0..6a504fe7d86c 100644
--- a/arch/arm/mach-shmobile/Makefile.boot
+++ b/arch/arm/mach-shmobile/Makefile.boot
@@ -1,15 +1,17 @@
1# per-board load address for uImage 1# per-board load address for uImage
2loadaddr-y := 2loadaddr-y :=
3loadaddr-$(CONFIG_MACH_AG5EVM) += 0x40008000
4loadaddr-$(CONFIG_MACH_APE6EVM) += 0x40008000 3loadaddr-$(CONFIG_MACH_APE6EVM) += 0x40008000
4loadaddr-$(CONFIG_MACH_APE6EVM_REFERENCE) += 0x40008000
5loadaddr-$(CONFIG_MACH_ARMADILLO800EVA) += 0x40008000 5loadaddr-$(CONFIG_MACH_ARMADILLO800EVA) += 0x40008000
6loadaddr-$(CONFIG_MACH_ARMADILLO800EVA_REFERENCE) += 0x40008000 6loadaddr-$(CONFIG_MACH_ARMADILLO800EVA_REFERENCE) += 0x40008000
7loadaddr-$(CONFIG_MACH_BOCKW) += 0x60008000 7loadaddr-$(CONFIG_MACH_BOCKW) += 0x60008000
8loadaddr-$(CONFIG_MACH_KOTA2) += 0x41008000 8loadaddr-$(CONFIG_MACH_BOCKW_REFERENCE) += 0x60008000
9loadaddr-$(CONFIG_MACH_KZM9D) += 0x40008000 9loadaddr-$(CONFIG_MACH_KZM9D) += 0x40008000
10loadaddr-$(CONFIG_MACH_KZM9D_REFERENCE) += 0x40008000
10loadaddr-$(CONFIG_MACH_KZM9G) += 0x41008000 11loadaddr-$(CONFIG_MACH_KZM9G) += 0x41008000
11loadaddr-$(CONFIG_MACH_KZM9G_REFERENCE) += 0x41008000 12loadaddr-$(CONFIG_MACH_KZM9G_REFERENCE) += 0x41008000
12loadaddr-$(CONFIG_MACH_LAGER) += 0x40008000 13loadaddr-$(CONFIG_MACH_LAGER) += 0x40008000
14loadaddr-$(CONFIG_MACH_LAGER_REFERENCE) += 0x40008000
13loadaddr-$(CONFIG_MACH_MACKEREL) += 0x40008000 15loadaddr-$(CONFIG_MACH_MACKEREL) += 0x40008000
14loadaddr-$(CONFIG_MACH_MARZEN) += 0x60008000 16loadaddr-$(CONFIG_MACH_MARZEN) += 0x60008000
15loadaddr-$(CONFIG_MACH_MARZEN_REFERENCE) += 0x60008000 17loadaddr-$(CONFIG_MACH_MARZEN_REFERENCE) += 0x60008000
diff --git a/arch/arm/mach-shmobile/board-ag5evm.c b/arch/arm/mach-shmobile/board-ag5evm.c
deleted file mode 100644
index c7540710906f..000000000000
--- a/arch/arm/mach-shmobile/board-ag5evm.c
+++ /dev/null
@@ -1,672 +0,0 @@
1/*
2 * arch/arm/mach-shmobile/board-ag5evm.c
3 *
4 * Copyright (C) 2010 Takashi Yoshii <yoshii.takashi.zj@renesas.com>
5 * Copyright (C) 2009 Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; version 2 of the License.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 *
20 */
21
22#include <linux/kernel.h>
23#include <linux/init.h>
24#include <linux/interrupt.h>
25#include <linux/irq.h>
26#include <linux/pinctrl/machine.h>
27#include <linux/pinctrl/pinconf-generic.h>
28#include <linux/platform_device.h>
29#include <linux/delay.h>
30#include <linux/io.h>
31#include <linux/dma-mapping.h>
32#include <linux/regulator/fixed.h>
33#include <linux/regulator/machine.h>
34#include <linux/serial_sci.h>
35#include <linux/smsc911x.h>
36#include <linux/gpio.h>
37#include <linux/videodev2.h>
38#include <linux/input.h>
39#include <linux/input/sh_keysc.h>
40#include <linux/mmc/host.h>
41#include <linux/mmc/sh_mmcif.h>
42#include <linux/mmc/sh_mobile_sdhi.h>
43#include <linux/mfd/tmio.h>
44#include <linux/sh_clk.h>
45#include <linux/irqchip/arm-gic.h>
46#include <video/sh_mobile_lcdc.h>
47#include <video/sh_mipi_dsi.h>
48#include <sound/sh_fsi.h>
49#include <mach/hardware.h>
50#include <mach/irqs.h>
51#include <mach/sh73a0.h>
52#include <mach/common.h>
53#include <asm/mach-types.h>
54#include <asm/mach/arch.h>
55#include <asm/hardware/cache-l2x0.h>
56#include <asm/traps.h>
57
58/* Dummy supplies, where voltage doesn't matter */
59static struct regulator_consumer_supply dummy_supplies[] = {
60 REGULATOR_SUPPLY("vddvario", "smsc911x"),
61 REGULATOR_SUPPLY("vdd33a", "smsc911x"),
62};
63
64static struct resource smsc9220_resources[] = {
65 [0] = {
66 .start = 0x14000000,
67 .end = 0x14000000 + SZ_64K - 1,
68 .flags = IORESOURCE_MEM,
69 },
70 [1] = {
71 .start = SH73A0_PINT0_IRQ(2), /* PINTA2 */
72 .flags = IORESOURCE_IRQ,
73 },
74};
75
76static struct smsc911x_platform_config smsc9220_platdata = {
77 .flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS,
78 .phy_interface = PHY_INTERFACE_MODE_MII,
79 .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
80 .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
81};
82
83static struct platform_device eth_device = {
84 .name = "smsc911x",
85 .id = 0,
86 .dev = {
87 .platform_data = &smsc9220_platdata,
88 },
89 .resource = smsc9220_resources,
90 .num_resources = ARRAY_SIZE(smsc9220_resources),
91};
92
93static struct sh_keysc_info keysc_platdata = {
94 .mode = SH_KEYSC_MODE_6,
95 .scan_timing = 3,
96 .delay = 100,
97 .keycodes = {
98 KEY_A, KEY_B, KEY_C, KEY_D, KEY_E, KEY_F, KEY_G,
99 KEY_H, KEY_I, KEY_J, KEY_K, KEY_L, KEY_M, KEY_N,
100 KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T, KEY_U,
101 KEY_V, KEY_W, KEY_X, KEY_Y, KEY_Z, KEY_HOME, KEY_SLEEP,
102 KEY_SPACE, KEY_9, KEY_6, KEY_3, KEY_WAKEUP, KEY_RIGHT, \
103 KEY_COFFEE,
104 KEY_0, KEY_8, KEY_5, KEY_2, KEY_DOWN, KEY_ENTER, KEY_UP,
105 KEY_KPASTERISK, KEY_7, KEY_4, KEY_1, KEY_STOP, KEY_LEFT, \
106 KEY_COMPUTER,
107 },
108};
109
110static struct resource keysc_resources[] = {
111 [0] = {
112 .name = "KEYSC",
113 .start = 0xe61b0000,
114 .end = 0xe61b0098 - 1,
115 .flags = IORESOURCE_MEM,
116 },
117 [1] = {
118 .start = gic_spi(71),
119 .flags = IORESOURCE_IRQ,
120 },
121};
122
123static struct platform_device keysc_device = {
124 .name = "sh_keysc",
125 .id = 0,
126 .num_resources = ARRAY_SIZE(keysc_resources),
127 .resource = keysc_resources,
128 .dev = {
129 .platform_data = &keysc_platdata,
130 },
131};
132
133/* FSI A */
134static struct resource fsi_resources[] = {
135 [0] = {
136 .name = "FSI",
137 .start = 0xEC230000,
138 .end = 0xEC230400 - 1,
139 .flags = IORESOURCE_MEM,
140 },
141 [1] = {
142 .start = gic_spi(146),
143 .flags = IORESOURCE_IRQ,
144 },
145};
146
147static struct platform_device fsi_device = {
148 .name = "sh_fsi2",
149 .id = -1,
150 .num_resources = ARRAY_SIZE(fsi_resources),
151 .resource = fsi_resources,
152};
153
154/* Fixed 1.8V regulator to be used by MMCIF */
155static struct regulator_consumer_supply fixed1v8_power_consumers[] =
156{
157 REGULATOR_SUPPLY("vmmc", "sh_mmcif.0"),
158 REGULATOR_SUPPLY("vqmmc", "sh_mmcif.0"),
159};
160
161static struct resource sh_mmcif_resources[] = {
162 [0] = {
163 .name = "MMCIF",
164 .start = 0xe6bd0000,
165 .end = 0xe6bd00ff,
166 .flags = IORESOURCE_MEM,
167 },
168 [1] = {
169 .start = gic_spi(141),
170 .flags = IORESOURCE_IRQ,
171 },
172 [2] = {
173 .start = gic_spi(140),
174 .flags = IORESOURCE_IRQ,
175 },
176};
177
178static struct sh_mmcif_plat_data sh_mmcif_platdata = {
179 .sup_pclk = 0,
180 .ocr = MMC_VDD_165_195,
181 .caps = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE,
182 .slave_id_tx = SHDMA_SLAVE_MMCIF_TX,
183 .slave_id_rx = SHDMA_SLAVE_MMCIF_RX,
184};
185
186static struct platform_device mmc_device = {
187 .name = "sh_mmcif",
188 .id = 0,
189 .dev = {
190 .dma_mask = NULL,
191 .coherent_dma_mask = 0xffffffff,
192 .platform_data = &sh_mmcif_platdata,
193 },
194 .num_resources = ARRAY_SIZE(sh_mmcif_resources),
195 .resource = sh_mmcif_resources,
196};
197
198/* IrDA */
199static struct resource irda_resources[] = {
200 [0] = {
201 .start = 0xE6D00000,
202 .end = 0xE6D01FD4 - 1,
203 .flags = IORESOURCE_MEM,
204 },
205 [1] = {
206 .start = gic_spi(95),
207 .flags = IORESOURCE_IRQ,
208 },
209};
210
211static struct platform_device irda_device = {
212 .name = "sh_irda",
213 .id = 0,
214 .resource = irda_resources,
215 .num_resources = ARRAY_SIZE(irda_resources),
216};
217
218/* MIPI-DSI */
219static struct resource mipidsi0_resources[] = {
220 [0] = {
221 .name = "DSI0",
222 .start = 0xfeab0000,
223 .end = 0xfeab3fff,
224 .flags = IORESOURCE_MEM,
225 },
226 [1] = {
227 .name = "DSI0",
228 .start = 0xfeab4000,
229 .end = 0xfeab7fff,
230 .flags = IORESOURCE_MEM,
231 },
232};
233
234static int sh_mipi_set_dot_clock(struct platform_device *pdev,
235 void __iomem *base,
236 int enable)
237{
238 struct clk *pck, *phy;
239 int ret;
240
241 pck = clk_get(&pdev->dev, "dsip_clk");
242 if (IS_ERR(pck)) {
243 ret = PTR_ERR(pck);
244 goto sh_mipi_set_dot_clock_pck_err;
245 }
246
247 phy = clk_get(&pdev->dev, "dsiphy_clk");
248 if (IS_ERR(phy)) {
249 ret = PTR_ERR(phy);
250 goto sh_mipi_set_dot_clock_phy_err;
251 }
252
253 if (enable) {
254 clk_set_rate(pck, clk_round_rate(pck, 24000000));
255 clk_set_rate(phy, clk_round_rate(pck, 510000000));
256 clk_enable(pck);
257 clk_enable(phy);
258 } else {
259 clk_disable(pck);
260 clk_disable(phy);
261 }
262
263 ret = 0;
264
265 clk_put(phy);
266sh_mipi_set_dot_clock_phy_err:
267 clk_put(pck);
268sh_mipi_set_dot_clock_pck_err:
269 return ret;
270}
271
272static struct sh_mipi_dsi_info mipidsi0_info = {
273 .data_format = MIPI_RGB888,
274 .channel = LCDC_CHAN_MAINLCD,
275 .lane = 2,
276 .vsynw_offset = 20,
277 .clksrc = 1,
278 .flags = SH_MIPI_DSI_HSABM |
279 SH_MIPI_DSI_SYNC_PULSES_MODE |
280 SH_MIPI_DSI_HSbyteCLK,
281 .set_dot_clock = sh_mipi_set_dot_clock,
282};
283
284static struct platform_device mipidsi0_device = {
285 .name = "sh-mipi-dsi",
286 .num_resources = ARRAY_SIZE(mipidsi0_resources),
287 .resource = mipidsi0_resources,
288 .id = 0,
289 .dev = {
290 .platform_data = &mipidsi0_info,
291 },
292};
293
294static unsigned char lcd_backlight_seq[3][2] = {
295 { 0x04, 0x07 },
296 { 0x23, 0x80 },
297 { 0x03, 0x01 },
298};
299
300static int lcd_backlight_set_brightness(int brightness)
301{
302 struct i2c_adapter *adap;
303 struct i2c_msg msg;
304 unsigned int i;
305 int ret;
306
307 if (brightness == 0) {
308 /* Reset the chip */
309 gpio_set_value(235, 0);
310 mdelay(24);
311 gpio_set_value(235, 1);
312 return 0;
313 }
314
315 adap = i2c_get_adapter(1);
316 if (adap == NULL)
317 return -ENODEV;
318
319 for (i = 0; i < ARRAY_SIZE(lcd_backlight_seq); i++) {
320 msg.addr = 0x6d;
321 msg.buf = &lcd_backlight_seq[i][0];
322 msg.len = 2;
323 msg.flags = 0;
324
325 ret = i2c_transfer(adap, &msg, 1);
326 if (ret < 0)
327 break;
328 }
329
330 i2c_put_adapter(adap);
331 return ret < 0 ? ret : 0;
332}
333
334/* LCDC0 */
335static const struct fb_videomode lcdc0_modes[] = {
336 {
337 .name = "R63302(QHD)",
338 .xres = 544,
339 .yres = 961,
340 .left_margin = 72,
341 .right_margin = 600,
342 .hsync_len = 16,
343 .upper_margin = 8,
344 .lower_margin = 8,
345 .vsync_len = 2,
346 .sync = FB_SYNC_VERT_HIGH_ACT | FB_SYNC_HOR_HIGH_ACT,
347 },
348};
349
350static struct sh_mobile_lcdc_info lcdc0_info = {
351 .clock_source = LCDC_CLK_PERIPHERAL,
352 .ch[0] = {
353 .chan = LCDC_CHAN_MAINLCD,
354 .interface_type = RGB24,
355 .clock_divider = 1,
356 .flags = LCDC_FLAGS_DWPOL,
357 .fourcc = V4L2_PIX_FMT_RGB565,
358 .lcd_modes = lcdc0_modes,
359 .num_modes = ARRAY_SIZE(lcdc0_modes),
360 .panel_cfg = {
361 .width = 44,
362 .height = 79,
363 },
364 .bl_info = {
365 .name = "sh_mobile_lcdc_bl",
366 .max_brightness = 1,
367 .set_brightness = lcd_backlight_set_brightness,
368 },
369 .tx_dev = &mipidsi0_device,
370 }
371};
372
373static struct resource lcdc0_resources[] = {
374 [0] = {
375 .name = "LCDC0",
376 .start = 0xfe940000, /* P4-only space */
377 .end = 0xfe943fff,
378 .flags = IORESOURCE_MEM,
379 },
380 [1] = {
381 .start = intcs_evt2irq(0x580),
382 .flags = IORESOURCE_IRQ,
383 },
384};
385
386static struct platform_device lcdc0_device = {
387 .name = "sh_mobile_lcdc_fb",
388 .num_resources = ARRAY_SIZE(lcdc0_resources),
389 .resource = lcdc0_resources,
390 .id = 0,
391 .dev = {
392 .platform_data = &lcdc0_info,
393 .coherent_dma_mask = ~0,
394 },
395};
396
397/* Fixed 2.8V regulators to be used by SDHI0 */
398static struct regulator_consumer_supply fixed2v8_power_consumers[] =
399{
400 REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"),
401 REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"),
402};
403
404/* SDHI0 */
405static struct sh_mobile_sdhi_info sdhi0_info = {
406 .dma_slave_tx = SHDMA_SLAVE_SDHI0_TX,
407 .dma_slave_rx = SHDMA_SLAVE_SDHI0_RX,
408 .tmio_flags = TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_USE_GPIO_CD,
409 .tmio_caps = MMC_CAP_SD_HIGHSPEED,
410 .tmio_ocr_mask = MMC_VDD_27_28 | MMC_VDD_28_29,
411 .cd_gpio = 251,
412};
413
414static struct resource sdhi0_resources[] = {
415 [0] = {
416 .name = "SDHI0",
417 .start = 0xee100000,
418 .end = 0xee1000ff,
419 .flags = IORESOURCE_MEM,
420 },
421 [1] = {
422 .name = SH_MOBILE_SDHI_IRQ_CARD_DETECT,
423 .start = gic_spi(83),
424 .flags = IORESOURCE_IRQ,
425 },
426 [2] = {
427 .name = SH_MOBILE_SDHI_IRQ_SDCARD,
428 .start = gic_spi(84),
429 .flags = IORESOURCE_IRQ,
430 },
431 [3] = {
432 .name = SH_MOBILE_SDHI_IRQ_SDIO,
433 .start = gic_spi(85),
434 .flags = IORESOURCE_IRQ,
435 },
436};
437
438static struct platform_device sdhi0_device = {
439 .name = "sh_mobile_sdhi",
440 .id = 0,
441 .num_resources = ARRAY_SIZE(sdhi0_resources),
442 .resource = sdhi0_resources,
443 .dev = {
444 .platform_data = &sdhi0_info,
445 },
446};
447
448/* Fixed 3.3V regulator to be used by SDHI1 */
449static struct regulator_consumer_supply cn4_power_consumers[] =
450{
451 REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"),
452 REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.1"),
453};
454
455static struct regulator_init_data cn4_power_init_data = {
456 .constraints = {
457 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
458 },
459 .num_consumer_supplies = ARRAY_SIZE(cn4_power_consumers),
460 .consumer_supplies = cn4_power_consumers,
461};
462
463static struct fixed_voltage_config cn4_power_info = {
464 .supply_name = "CN4 SD/MMC Vdd",
465 .microvolts = 3300000,
466 .gpio = 114,
467 .enable_high = 1,
468 .init_data = &cn4_power_init_data,
469};
470
471static struct platform_device cn4_power = {
472 .name = "reg-fixed-voltage",
473 .id = 2,
474 .dev = {
475 .platform_data = &cn4_power_info,
476 },
477};
478
479static void ag5evm_sdhi1_set_pwr(struct platform_device *pdev, int state)
480{
481 static int power_gpio = -EINVAL;
482
483 if (power_gpio < 0) {
484 int ret = gpio_request_one(114, GPIOF_OUT_INIT_LOW,
485 "sdhi1_power");
486 if (!ret)
487 power_gpio = 114;
488 }
489
490 /*
491 * If requesting the GPIO above failed, it means, that the regulator got
492 * probed and grabbed the GPIO, but we don't know, whether the sdhi
493 * driver already uses the regulator. If it doesn't, we have to toggle
494 * the GPIO ourselves, even though it is now owned by the fixed
495 * regulator driver. We have to live with the race in case the driver
496 * gets unloaded and the GPIO freed between these two steps.
497 */
498 gpio_set_value(114, state);
499}
500
501static struct sh_mobile_sdhi_info sh_sdhi1_info = {
502 .tmio_flags = TMIO_MMC_WRPROTECT_DISABLE | TMIO_MMC_HAS_IDLE_WAIT,
503 .tmio_caps = MMC_CAP_NONREMOVABLE | MMC_CAP_SDIO_IRQ,
504 .tmio_ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
505 .set_pwr = ag5evm_sdhi1_set_pwr,
506};
507
508static struct resource sdhi1_resources[] = {
509 [0] = {
510 .name = "SDHI1",
511 .start = 0xee120000,
512 .end = 0xee1200ff,
513 .flags = IORESOURCE_MEM,
514 },
515 [1] = {
516 .name = SH_MOBILE_SDHI_IRQ_CARD_DETECT,
517 .start = gic_spi(87),
518 .flags = IORESOURCE_IRQ,
519 },
520 [2] = {
521 .name = SH_MOBILE_SDHI_IRQ_SDCARD,
522 .start = gic_spi(88),
523 .flags = IORESOURCE_IRQ,
524 },
525 [3] = {
526 .name = SH_MOBILE_SDHI_IRQ_SDIO,
527 .start = gic_spi(89),
528 .flags = IORESOURCE_IRQ,
529 },
530};
531
532static struct platform_device sdhi1_device = {
533 .name = "sh_mobile_sdhi",
534 .id = 1,
535 .dev = {
536 .platform_data = &sh_sdhi1_info,
537 },
538 .num_resources = ARRAY_SIZE(sdhi1_resources),
539 .resource = sdhi1_resources,
540};
541
542static struct platform_device *ag5evm_devices[] __initdata = {
543 &cn4_power,
544 &eth_device,
545 &keysc_device,
546 &fsi_device,
547 &mmc_device,
548 &irda_device,
549 &mipidsi0_device,
550 &lcdc0_device,
551 &sdhi0_device,
552 &sdhi1_device,
553};
554
555static unsigned long pin_pullup_conf[] = {
556 PIN_CONF_PACKED(PIN_CONFIG_BIAS_PULL_UP, 0),
557};
558
559static const struct pinctrl_map ag5evm_pinctrl_map[] = {
560 /* FSIA */
561 PIN_MAP_MUX_GROUP_DEFAULT("sh_fsi2.0", "pfc-sh73a0",
562 "fsia_mclk_in", "fsia"),
563 PIN_MAP_MUX_GROUP_DEFAULT("sh_fsi2.0", "pfc-sh73a0",
564 "fsia_sclk_in", "fsia"),
565 PIN_MAP_MUX_GROUP_DEFAULT("sh_fsi2.0", "pfc-sh73a0",
566 "fsia_data_in", "fsia"),
567 PIN_MAP_MUX_GROUP_DEFAULT("sh_fsi2.0", "pfc-sh73a0",
568 "fsia_data_out", "fsia"),
569 /* I2C2 & I2C3 */
570 PIN_MAP_MUX_GROUP_DEFAULT("i2c-sh_mobile.2", "pfc-sh73a0",
571 "i2c2_0", "i2c2"),
572 PIN_MAP_MUX_GROUP_DEFAULT("i2c-sh_mobile.3", "pfc-sh73a0",
573 "i2c3_0", "i2c3"),
574 /* IrDA */
575 PIN_MAP_MUX_GROUP_DEFAULT("sh_irda.0", "pfc-sh73a0",
576 "irda_0", "irda"),
577 /* KEYSC */
578 PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
579 "keysc_in8", "keysc"),
580 PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
581 "keysc_out04", "keysc"),
582 PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
583 "keysc_out5", "keysc"),
584 PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
585 "keysc_out6_0", "keysc"),
586 PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
587 "keysc_out7_0", "keysc"),
588 PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
589 "keysc_out8_0", "keysc"),
590 PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
591 "keysc_out9_2", "keysc"),
592 PIN_MAP_CONFIGS_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
593 "keysc_in8", pin_pullup_conf),
594 /* MMCIF */
595 PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
596 "mmc0_data8_0", "mmc0"),
597 PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
598 "mmc0_ctrl_0", "mmc0"),
599 PIN_MAP_CONFIGS_PIN_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
600 "PORT279", pin_pullup_conf),
601 PIN_MAP_CONFIGS_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
602 "mmc0_data8_0", pin_pullup_conf),
603 /* SCIFA2 */
604 PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.2", "pfc-sh73a0",
605 "scifa2_data_0", "scifa2"),
606 PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.2", "pfc-sh73a0",
607 "scifa2_ctrl_0", "scifa2"),
608 /* SDHI0 (CN15 [SD I/F]) */
609 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
610 "sdhi0_data4", "sdhi0"),
611 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
612 "sdhi0_ctrl", "sdhi0"),
613 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
614 "sdhi0_wp", "sdhi0"),
615 /* SDHI1 (CN4 [WLAN I/F]) */
616 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh73a0",
617 "sdhi1_data4", "sdhi1"),
618 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh73a0",
619 "sdhi1_ctrl", "sdhi1"),
620 PIN_MAP_CONFIGS_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh73a0",
621 "sdhi1_data4", pin_pullup_conf),
622 PIN_MAP_CONFIGS_PIN_DEFAULT("sh_mobile_sdhi.1", "pfc-sh73a0",
623 "PORT263", pin_pullup_conf),
624};
625
626static void __init ag5evm_init(void)
627{
628 regulator_register_always_on(0, "fixed-1.8V", fixed1v8_power_consumers,
629 ARRAY_SIZE(fixed1v8_power_consumers), 1800000);
630 regulator_register_always_on(1, "fixed-2.8V", fixed2v8_power_consumers,
631 ARRAY_SIZE(fixed2v8_power_consumers), 3300000);
632 regulator_register_fixed(3, dummy_supplies, ARRAY_SIZE(dummy_supplies));
633
634 pinctrl_register_mappings(ag5evm_pinctrl_map,
635 ARRAY_SIZE(ag5evm_pinctrl_map));
636 sh73a0_pinmux_init();
637
638 /* enable MMCIF */
639 gpio_request_one(208, GPIOF_OUT_INIT_HIGH, NULL); /* Reset */
640
641 /* enable SMSC911X */
642 gpio_request_one(144, GPIOF_IN, NULL); /* PINTA2 */
643 gpio_request_one(145, GPIOF_OUT_INIT_HIGH, NULL); /* RESET */
644
645 /* LCD panel */
646 gpio_request_one(217, GPIOF_OUT_INIT_LOW, NULL); /* RESET */
647 mdelay(1);
648 gpio_set_value(217, 1);
649 mdelay(100);
650
651 /* LCD backlight controller */
652 gpio_request_one(235, GPIOF_OUT_INIT_LOW, NULL); /* RESET */
653 lcd_backlight_set_brightness(0);
654
655#ifdef CONFIG_CACHE_L2X0
656 /* Shared attribute override enable, 64K*8way */
657 l2x0_init(IOMEM(0xf0100000), 0x00460000, 0xc2000fff);
658#endif
659 sh73a0_add_standard_devices();
660 platform_add_devices(ag5evm_devices, ARRAY_SIZE(ag5evm_devices));
661}
662
663MACHINE_START(AG5EVM, "ag5evm")
664 .smp = smp_ops(sh73a0_smp_ops),
665 .map_io = sh73a0_map_io,
666 .init_early = sh73a0_add_early_devices,
667 .nr_irqs = NR_IRQS_LEGACY,
668 .init_irq = sh73a0_init_irq,
669 .init_machine = ag5evm_init,
670 .init_late = shmobile_init_late,
671 .init_time = sh73a0_earlytimer_init,
672MACHINE_END
diff --git a/arch/arm/mach-shmobile/board-ape6evm-reference.c b/arch/arm/mach-shmobile/board-ape6evm-reference.c
new file mode 100644
index 000000000000..a23fa714f7ac
--- /dev/null
+++ b/arch/arm/mach-shmobile/board-ape6evm-reference.c
@@ -0,0 +1,63 @@
1/*
2 * APE6EVM board support
3 *
4 * Copyright (C) 2013 Renesas Solutions Corp.
5 * Copyright (C) 2013 Magnus Damm
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; version 2 of the License.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21#include <linux/gpio.h>
22#include <linux/kernel.h>
23#include <linux/of_platform.h>
24#include <linux/pinctrl/machine.h>
25#include <linux/platform_device.h>
26#include <linux/sh_clk.h>
27#include <mach/common.h>
28#include <mach/r8a73a4.h>
29#include <asm/mach-types.h>
30#include <asm/mach/arch.h>
31
32static void __init ape6evm_add_standard_devices(void)
33{
34
35 struct clk *parent;
36 struct clk *mp;
37
38 r8a73a4_clock_init();
39
40 /* MP clock parent = extal2 */
41 parent = clk_get(NULL, "extal2");
42 mp = clk_get(NULL, "mp");
43 BUG_ON(IS_ERR(parent) || IS_ERR(mp));
44
45 clk_set_parent(mp, parent);
46 clk_put(parent);
47 clk_put(mp);
48
49 r8a73a4_add_dt_devices();
50 of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
51 platform_device_register_simple("cpufreq-cpu0", -1, NULL, 0);
52}
53
54static const char *ape6evm_boards_compat_dt[] __initdata = {
55 "renesas,ape6evm-reference",
56 NULL,
57};
58
59DT_MACHINE_START(APE6EVM_DT, "ape6evm")
60 .init_early = r8a73a4_init_delay,
61 .init_machine = ape6evm_add_standard_devices,
62 .dt_compat = ape6evm_boards_compat_dt,
63MACHINE_END
diff --git a/arch/arm/mach-shmobile/board-ape6evm.c b/arch/arm/mach-shmobile/board-ape6evm.c
index 5eb0caa6a7d0..24b87eea9da3 100644
--- a/arch/arm/mach-shmobile/board-ape6evm.c
+++ b/arch/arm/mach-shmobile/board-ape6evm.c
@@ -19,9 +19,14 @@
19 */ 19 */
20 20
21#include <linux/gpio.h> 21#include <linux/gpio.h>
22#include <linux/gpio_keys.h>
23#include <linux/input.h>
22#include <linux/interrupt.h> 24#include <linux/interrupt.h>
23#include <linux/irqchip.h>
24#include <linux/kernel.h> 25#include <linux/kernel.h>
26#include <linux/mfd/tmio.h>
27#include <linux/mmc/host.h>
28#include <linux/mmc/sh_mmcif.h>
29#include <linux/mmc/sh_mobile_sdhi.h>
25#include <linux/pinctrl/machine.h> 30#include <linux/pinctrl/machine.h>
26#include <linux/platform_device.h> 31#include <linux/platform_device.h>
27#include <linux/regulator/fixed.h> 32#include <linux/regulator/fixed.h>
@@ -34,6 +39,58 @@
34#include <asm/mach-types.h> 39#include <asm/mach-types.h>
35#include <asm/mach/arch.h> 40#include <asm/mach/arch.h>
36 41
42/* LEDS */
43static struct gpio_led ape6evm_leds[] = {
44 {
45 .name = "gnss-en",
46 .gpio = 28,
47 .default_state = LEDS_GPIO_DEFSTATE_OFF,
48 }, {
49 .name = "nfc-nrst",
50 .gpio = 126,
51 .default_state = LEDS_GPIO_DEFSTATE_OFF,
52 }, {
53 .name = "gnss-nrst",
54 .gpio = 132,
55 .default_state = LEDS_GPIO_DEFSTATE_OFF,
56 }, {
57 .name = "bt-wakeup",
58 .gpio = 232,
59 .default_state = LEDS_GPIO_DEFSTATE_OFF,
60 }, {
61 .name = "strobe",
62 .gpio = 250,
63 .default_state = LEDS_GPIO_DEFSTATE_OFF,
64 }, {
65 .name = "bbresetout",
66 .gpio = 288,
67 .default_state = LEDS_GPIO_DEFSTATE_OFF,
68 },
69};
70
71static __initdata struct gpio_led_platform_data ape6evm_leds_pdata = {
72 .leds = ape6evm_leds,
73 .num_leds = ARRAY_SIZE(ape6evm_leds),
74};
75
76/* GPIO KEY */
77#define GPIO_KEY(c, g, d, ...) \
78 { .code = c, .gpio = g, .desc = d, .active_low = 1 }
79
80static struct gpio_keys_button gpio_buttons[] = {
81 GPIO_KEY(KEY_0, 324, "S16"),
82 GPIO_KEY(KEY_MENU, 325, "S17"),
83 GPIO_KEY(KEY_HOME, 326, "S18"),
84 GPIO_KEY(KEY_BACK, 327, "S19"),
85 GPIO_KEY(KEY_VOLUMEUP, 328, "S20"),
86 GPIO_KEY(KEY_VOLUMEDOWN, 329, "S21"),
87};
88
89static struct __initdata gpio_keys_platform_data ape6evm_keys_pdata = {
90 .buttons = gpio_buttons,
91 .nbuttons = ARRAY_SIZE(gpio_buttons),
92};
93
37/* Dummy supplies, where voltage doesn't matter */ 94/* Dummy supplies, where voltage doesn't matter */
38static struct regulator_consumer_supply dummy_supplies[] = { 95static struct regulator_consumer_supply dummy_supplies[] = {
39 REGULATOR_SUPPLY("vddvario", "smsc911x"), 96 REGULATOR_SUPPLY("vddvario", "smsc911x"),
@@ -41,7 +98,7 @@ static struct regulator_consumer_supply dummy_supplies[] = {
41}; 98};
42 99
43/* SMSC LAN9220 */ 100/* SMSC LAN9220 */
44static const struct resource lan9220_res[] = { 101static const struct resource lan9220_res[] __initconst = {
45 DEFINE_RES_MEM(0x08000000, 0x1000), 102 DEFINE_RES_MEM(0x08000000, 0x1000),
46 { 103 {
47 .start = irq_pin(40), /* IRQ40 */ 104 .start = irq_pin(40), /* IRQ40 */
@@ -49,19 +106,83 @@ static const struct resource lan9220_res[] = {
49 }, 106 },
50}; 107};
51 108
52static const struct smsc911x_platform_config lan9220_data = { 109static const struct smsc911x_platform_config lan9220_data __initconst = {
53 .flags = SMSC911X_USE_32BIT, 110 .flags = SMSC911X_USE_32BIT,
54 .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL, 111 .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
55 .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH, 112 .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH,
56}; 113};
57 114
58static const struct pinctrl_map ape6evm_pinctrl_map[] = { 115/*
116 * On APE6EVM power is supplied to MMCIF by a tps80032 regulator. For now we
117 * model a VDD supply to MMCIF, using a fixed 3.3V regulator. Also use the
118 * static power supply for SDHI0 and SDHI1, whereas SDHI0's VccQ is also
119 * supplied by the same tps80032 regulator and thus can also be adjusted
120 * dynamically.
121 */
122static struct regulator_consumer_supply fixed3v3_power_consumers[] =
123{
124 REGULATOR_SUPPLY("vmmc", "sh_mmcif.0"),
125 REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"),
126 REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"),
127};
128
129/* MMCIF */
130static const struct sh_mmcif_plat_data mmcif0_pdata __initconst = {
131 .caps = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE,
132};
133
134static const struct resource mmcif0_resources[] __initconst = {
135 DEFINE_RES_MEM_NAMED(0xee200000, 0x100, "MMCIF0"),
136 DEFINE_RES_IRQ(gic_spi(169)),
137};
138
139/* SDHI0 */
140static const struct sh_mobile_sdhi_info sdhi0_pdata __initconst = {
141 .tmio_flags = TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_WRPROTECT_DISABLE,
142 .tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ,
143};
144
145static const struct resource sdhi0_resources[] __initconst = {
146 DEFINE_RES_MEM_NAMED(0xee100000, 0x100, "SDHI0"),
147 DEFINE_RES_IRQ(gic_spi(165)),
148};
149
150/* SDHI1 */
151static const struct sh_mobile_sdhi_info sdhi1_pdata __initconst = {
152 .tmio_flags = TMIO_MMC_HAS_IDLE_WAIT | TMIO_MMC_WRPROTECT_DISABLE,
153 .tmio_caps = MMC_CAP_SD_HIGHSPEED | MMC_CAP_SDIO_IRQ |
154 MMC_CAP_NEEDS_POLL,
155};
156
157static const struct resource sdhi1_resources[] __initconst = {
158 DEFINE_RES_MEM_NAMED(0xee120000, 0x100, "SDHI1"),
159 DEFINE_RES_IRQ(gic_spi(166)),
160};
161
162static const struct pinctrl_map ape6evm_pinctrl_map[] __initconst = {
59 /* SCIFA0 console */ 163 /* SCIFA0 console */
60 PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.0", "pfc-r8a73a4", 164 PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.0", "pfc-r8a73a4",
61 "scifa0_data", "scifa0"), 165 "scifa0_data", "scifa0"),
62 /* SMSC */ 166 /* SMSC */
63 PIN_MAP_MUX_GROUP_DEFAULT("smsc911x", "pfc-r8a73a4", 167 PIN_MAP_MUX_GROUP_DEFAULT("smsc911x", "pfc-r8a73a4",
64 "irqc_irq40", "irqc"), 168 "irqc_irq40", "irqc"),
169 /* MMCIF0 */
170 PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-r8a73a4",
171 "mmc0_data8", "mmc0"),
172 PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-r8a73a4",
173 "mmc0_ctrl", "mmc0"),
174 /* SDHI0: uSD: no WP */
175 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a73a4",
176 "sdhi0_data4", "sdhi0"),
177 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a73a4",
178 "sdhi0_ctrl", "sdhi0"),
179 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a73a4",
180 "sdhi0_cd", "sdhi0"),
181 /* SDHI1 */
182 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-r8a73a4",
183 "sdhi1_data4", "sdhi1"),
184 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-r8a73a4",
185 "sdhi1_ctrl", "sdhi1"),
65}; 186};
66 187
67static void __init ape6evm_add_standard_devices(void) 188static void __init ape6evm_add_standard_devices(void)
@@ -94,6 +215,23 @@ static void __init ape6evm_add_standard_devices(void)
94 platform_device_register_resndata(&platform_bus, "smsc911x", -1, 215 platform_device_register_resndata(&platform_bus, "smsc911x", -1,
95 lan9220_res, ARRAY_SIZE(lan9220_res), 216 lan9220_res, ARRAY_SIZE(lan9220_res),
96 &lan9220_data, sizeof(lan9220_data)); 217 &lan9220_data, sizeof(lan9220_data));
218 regulator_register_always_on(1, "fixed-3.3V", fixed3v3_power_consumers,
219 ARRAY_SIZE(fixed3v3_power_consumers), 3300000);
220 platform_device_register_resndata(&platform_bus, "sh_mmcif", 0,
221 mmcif0_resources, ARRAY_SIZE(mmcif0_resources),
222 &mmcif0_pdata, sizeof(mmcif0_pdata));
223 platform_device_register_resndata(&platform_bus, "sh_mobile_sdhi", 0,
224 sdhi0_resources, ARRAY_SIZE(sdhi0_resources),
225 &sdhi0_pdata, sizeof(sdhi0_pdata));
226 platform_device_register_resndata(&platform_bus, "sh_mobile_sdhi", 1,
227 sdhi1_resources, ARRAY_SIZE(sdhi1_resources),
228 &sdhi1_pdata, sizeof(sdhi1_pdata));
229 platform_device_register_data(&platform_bus, "gpio-keys", -1,
230 &ape6evm_keys_pdata,
231 sizeof(ape6evm_keys_pdata));
232 platform_device_register_data(&platform_bus, "leds-gpio", -1,
233 &ape6evm_leds_pdata,
234 sizeof(ape6evm_leds_pdata));
97} 235}
98 236
99static const char *ape6evm_boards_compat_dt[] __initdata = { 237static const char *ape6evm_boards_compat_dt[] __initdata = {
@@ -102,8 +240,7 @@ static const char *ape6evm_boards_compat_dt[] __initdata = {
102}; 240};
103 241
104DT_MACHINE_START(APE6EVM_DT, "ape6evm") 242DT_MACHINE_START(APE6EVM_DT, "ape6evm")
105 .init_irq = irqchip_init, 243 .init_early = r8a73a4_init_delay,
106 .init_time = shmobile_timer_init,
107 .init_machine = ape6evm_add_standard_devices, 244 .init_machine = ape6evm_add_standard_devices,
108 .dt_compat = ape6evm_boards_compat_dt, 245 .dt_compat = ape6evm_boards_compat_dt,
109MACHINE_END 246MACHINE_END
diff --git a/arch/arm/mach-shmobile/board-armadillo800eva-reference.c b/arch/arm/mach-shmobile/board-armadillo800eva-reference.c
index 03b85fec2ddb..57d1a78367b6 100644
--- a/arch/arm/mach-shmobile/board-armadillo800eva-reference.c
+++ b/arch/arm/mach-shmobile/board-armadillo800eva-reference.c
@@ -24,7 +24,6 @@
24#include <linux/kernel.h> 24#include <linux/kernel.h>
25#include <linux/gpio.h> 25#include <linux/gpio.h>
26#include <linux/io.h> 26#include <linux/io.h>
27#include <linux/pinctrl/machine.h>
28#include <mach/common.h> 27#include <mach/common.h>
29#include <mach/r8a7740.h> 28#include <mach/r8a7740.h>
30#include <asm/mach/arch.h> 29#include <asm/mach/arch.h>
@@ -119,12 +118,6 @@
119 * usbhsf_power_ctrl() 118 * usbhsf_power_ctrl()
120 */ 119 */
121 120
122static const struct pinctrl_map eva_pinctrl_map[] = {
123 /* SCIFA1 */
124 PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.1", "pfc-r8a7740",
125 "scifa1_data", "scifa1"),
126};
127
128static void __init eva_clock_init(void) 121static void __init eva_clock_init(void)
129{ 122{
130 struct clk *system = clk_get(NULL, "system_clk"); 123 struct clk *system = clk_get(NULL, "system_clk");
@@ -165,35 +158,26 @@ clock_error:
165 */ 158 */
166static void __init eva_init(void) 159static void __init eva_init(void)
167{ 160{
168
169 r8a7740_clock_init(MD_CK0 | MD_CK2); 161 r8a7740_clock_init(MD_CK0 | MD_CK2);
170 eva_clock_init(); 162 eva_clock_init();
171 163
172 pinctrl_register_mappings(eva_pinctrl_map, ARRAY_SIZE(eva_pinctrl_map));
173 r8a7740_pinmux_init();
174
175 r8a7740_meram_workaround(); 164 r8a7740_meram_workaround();
176 165
177 /*
178 * Touchscreen
179 * TODO: Move reset GPIO over to .dts when we can reference it
180 */
181 gpio_request_one(166, GPIOF_OUT_INIT_HIGH, NULL); /* TP_RST_B */
182
183#ifdef CONFIG_CACHE_L2X0 166#ifdef CONFIG_CACHE_L2X0
184 /* Early BRESP enable, Shared attribute override enable, 32K*8way */ 167 /* Early BRESP enable, Shared attribute override enable, 32K*8way */
185 l2x0_init(IOMEM(0xf0002000), 0x40440000, 0x82000fff); 168 l2x0_init(IOMEM(0xf0002000), 0x40440000, 0x82000fff);
186#endif 169#endif
187 170
188 r8a7740_add_standard_devices_dt(); 171 r8a7740_add_standard_devices_dt();
172
189 r8a7740_pm_init(); 173 r8a7740_pm_init();
190} 174}
191 175
192#define RESCNT2 IOMEM(0xe6188020) 176#define RESCNT2 IOMEM(0xe6188020)
193static void eva_restart(char mode, const char *cmd) 177static void eva_restart(enum reboot_mode mode, const char *cmd)
194{ 178{
195 /* Do soft power on reset */ 179 /* Do soft power on reset */
196 writel((1 << 31), RESCNT2); 180 writel(1 << 31, RESCNT2);
197} 181}
198 182
199static const char *eva_boards_compat_dt[] __initdata = { 183static const char *eva_boards_compat_dt[] __initdata = {
@@ -206,7 +190,6 @@ DT_MACHINE_START(ARMADILLO800EVA_DT, "armadillo800eva-reference")
206 .init_early = r8a7740_init_delay, 190 .init_early = r8a7740_init_delay,
207 .init_irq = r8a7740_init_irq_of, 191 .init_irq = r8a7740_init_irq_of,
208 .init_machine = eva_init, 192 .init_machine = eva_init,
209 .init_time = shmobile_timer_init,
210 .init_late = shmobile_init_late, 193 .init_late = shmobile_init_late,
211 .dt_compat = eva_boards_compat_dt, 194 .dt_compat = eva_boards_compat_dt,
212 .restart = eva_restart, 195 .restart = eva_restart,
diff --git a/arch/arm/mach-shmobile/board-armadillo800eva.c b/arch/arm/mach-shmobile/board-armadillo800eva.c
index c5be60d85e4b..5bd1479d3deb 100644
--- a/arch/arm/mach-shmobile/board-armadillo800eva.c
+++ b/arch/arm/mach-shmobile/board-armadillo800eva.c
@@ -31,6 +31,8 @@
31#include <linux/gpio_keys.h> 31#include <linux/gpio_keys.h>
32#include <linux/regulator/driver.h> 32#include <linux/regulator/driver.h>
33#include <linux/pinctrl/machine.h> 33#include <linux/pinctrl/machine.h>
34#include <linux/platform_data/pwm-renesas-tpu.h>
35#include <linux/pwm_backlight.h>
34#include <linux/regulator/fixed.h> 36#include <linux/regulator/fixed.h>
35#include <linux/regulator/gpio-regulator.h> 37#include <linux/regulator/gpio-regulator.h>
36#include <linux/regulator/machine.h> 38#include <linux/regulator/machine.h>
@@ -358,7 +360,6 @@ static struct platform_device usbhsf_device = {
358static struct sh_eth_plat_data sh_eth_platdata = { 360static struct sh_eth_plat_data sh_eth_platdata = {
359 .phy = 0x00, /* LAN8710A */ 361 .phy = 0x00, /* LAN8710A */
360 .edmac_endian = EDMAC_LITTLE_ENDIAN, 362 .edmac_endian = EDMAC_LITTLE_ENDIAN,
361 .register_type = SH_ETH_REG_GIGABIT,
362 .phy_interface = PHY_INTERFACE_MODE_MII, 363 .phy_interface = PHY_INTERFACE_MODE_MII,
363}; 364};
364 365
@@ -387,7 +388,50 @@ static struct platform_device sh_eth_device = {
387 .num_resources = ARRAY_SIZE(sh_eth_resources), 388 .num_resources = ARRAY_SIZE(sh_eth_resources),
388}; 389};
389 390
390/* LCDC */ 391/* PWM */
392static struct resource pwm_resources[] = {
393 [0] = {
394 .start = 0xe6600000,
395 .end = 0xe66000ff,
396 .flags = IORESOURCE_MEM,
397 },
398};
399
400static struct tpu_pwm_platform_data pwm_device_data = {
401 .channels[2] = {
402 .polarity = PWM_POLARITY_INVERSED,
403 }
404};
405
406static struct platform_device pwm_device = {
407 .name = "renesas-tpu-pwm",
408 .id = -1,
409 .dev = {
410 .platform_data = &pwm_device_data,
411 },
412 .num_resources = ARRAY_SIZE(pwm_resources),
413 .resource = pwm_resources,
414};
415
416static struct pwm_lookup pwm_lookup[] = {
417 PWM_LOOKUP("renesas-tpu-pwm", 2, "pwm-backlight.0", NULL),
418};
419
420/* LCDC and backlight */
421static struct platform_pwm_backlight_data pwm_backlight_data = {
422 .lth_brightness = 50,
423 .max_brightness = 255,
424 .dft_brightness = 255,
425 .pwm_period_ns = 33333, /* 30kHz */
426};
427
428static struct platform_device pwm_backlight_device = {
429 .name = "pwm-backlight",
430 .dev = {
431 .platform_data = &pwm_backlight_data,
432 },
433};
434
391static struct fb_videomode lcdc0_mode = { 435static struct fb_videomode lcdc0_mode = {
392 .name = "AMPIER/AM-800480", 436 .name = "AMPIER/AM-800480",
393 .xres = 800, 437 .xres = 800,
@@ -679,15 +723,6 @@ static struct platform_device vcc_sdhi1 = {
679}; 723};
680 724
681/* SDHI0 */ 725/* SDHI0 */
682/*
683 * FIXME
684 *
685 * It use polling mode here, since
686 * CD (= Card Detect) pin is not connected to SDHI0_CD.
687 * We can use IRQ31 as card detect irq,
688 * but it needs chattering removal operation
689 */
690#define IRQ31 irq_pin(31)
691static struct sh_mobile_sdhi_info sdhi0_info = { 726static struct sh_mobile_sdhi_info sdhi0_info = {
692 .dma_slave_tx = SHDMA_SLAVE_SDHI0_TX, 727 .dma_slave_tx = SHDMA_SLAVE_SDHI0_TX,
693 .dma_slave_rx = SHDMA_SLAVE_SDHI0_RX, 728 .dma_slave_rx = SHDMA_SLAVE_SDHI0_RX,
@@ -788,6 +823,8 @@ static struct sh_mmcif_plat_data sh_mmcif_plat = {
788 .caps = MMC_CAP_4_BIT_DATA | 823 .caps = MMC_CAP_4_BIT_DATA |
789 MMC_CAP_8_BIT_DATA | 824 MMC_CAP_8_BIT_DATA |
790 MMC_CAP_NONREMOVABLE, 825 MMC_CAP_NONREMOVABLE,
826 .slave_id_tx = SHDMA_SLAVE_MMCIF_TX,
827 .slave_id_rx = SHDMA_SLAVE_MMCIF_RX,
791}; 828};
792 829
793static struct resource sh_mmcif_resources[] = { 830static struct resource sh_mmcif_resources[] = {
@@ -1030,6 +1067,8 @@ static struct i2c_board_info i2c2_devices[] = {
1030 */ 1067 */
1031static struct platform_device *eva_devices[] __initdata = { 1068static struct platform_device *eva_devices[] __initdata = {
1032 &lcdc0_device, 1069 &lcdc0_device,
1070 &pwm_device,
1071 &pwm_backlight_device,
1033 &gpio_keys_device, 1072 &gpio_keys_device,
1034 &sh_eth_device, 1073 &sh_eth_device,
1035 &vcc_sdhi0, 1074 &vcc_sdhi0,
@@ -1101,6 +1140,9 @@ static const struct pinctrl_map eva_pinctrl_map[] = {
1101 /* ST1232 */ 1140 /* ST1232 */
1102 PIN_MAP_MUX_GROUP_DEFAULT("0-0055", "pfc-r8a7740", 1141 PIN_MAP_MUX_GROUP_DEFAULT("0-0055", "pfc-r8a7740",
1103 "intc_irq10", "intc"), 1142 "intc_irq10", "intc"),
1143 /* TPU0 */
1144 PIN_MAP_MUX_GROUP_DEFAULT("renesas-tpu-pwm", "pfc-r8a7740",
1145 "tpu0_to2_1", "tpu0"),
1104 /* USBHS */ 1146 /* USBHS */
1105 PIN_MAP_MUX_GROUP_DEFAULT("renesas_usbhs", "pfc-r8a7740", 1147 PIN_MAP_MUX_GROUP_DEFAULT("renesas_usbhs", "pfc-r8a7740",
1106 "intc_irq7_1", "intc"), 1148 "intc_irq7_1", "intc"),
@@ -1154,13 +1196,13 @@ static void __init eva_init(void)
1154 ARRAY_SIZE(fixed3v3_power_consumers), 3300000); 1196 ARRAY_SIZE(fixed3v3_power_consumers), 3300000);
1155 1197
1156 pinctrl_register_mappings(eva_pinctrl_map, ARRAY_SIZE(eva_pinctrl_map)); 1198 pinctrl_register_mappings(eva_pinctrl_map, ARRAY_SIZE(eva_pinctrl_map));
1199 pwm_add_table(pwm_lookup, ARRAY_SIZE(pwm_lookup));
1157 1200
1158 r8a7740_pinmux_init(); 1201 r8a7740_pinmux_init();
1159 r8a7740_meram_workaround(); 1202 r8a7740_meram_workaround();
1160 1203
1161 /* LCDC0 */ 1204 /* LCDC0 */
1162 gpio_request_one(61, GPIOF_OUT_INIT_HIGH, NULL); /* LCDDON */ 1205 gpio_request_one(61, GPIOF_OUT_INIT_HIGH, NULL); /* LCDDON */
1163 gpio_request_one(202, GPIOF_OUT_INIT_LOW, NULL); /* LCD0_LED_CONT */
1164 1206
1165 /* GETHER */ 1207 /* GETHER */
1166 gpio_request_one(18, GPIOF_OUT_INIT_HIGH, NULL); /* PHY_RST */ 1208 gpio_request_one(18, GPIOF_OUT_INIT_HIGH, NULL); /* PHY_RST */
@@ -1271,7 +1313,7 @@ static const char *eva_boards_compat_dt[] __initdata = {
1271DT_MACHINE_START(ARMADILLO800EVA_DT, "armadillo800eva") 1313DT_MACHINE_START(ARMADILLO800EVA_DT, "armadillo800eva")
1272 .map_io = r8a7740_map_io, 1314 .map_io = r8a7740_map_io,
1273 .init_early = eva_add_early_devices, 1315 .init_early = eva_add_early_devices,
1274 .init_irq = r8a7740_init_irq, 1316 .init_irq = r8a7740_init_irq_of,
1275 .init_machine = eva_init, 1317 .init_machine = eva_init,
1276 .init_late = shmobile_init_late, 1318 .init_late = shmobile_init_late,
1277 .init_time = eva_earlytimer_init, 1319 .init_time = eva_earlytimer_init,
diff --git a/arch/arm/mach-shmobile/board-bockw-reference.c b/arch/arm/mach-shmobile/board-bockw-reference.c
new file mode 100644
index 000000000000..1a7c893e1a52
--- /dev/null
+++ b/arch/arm/mach-shmobile/board-bockw-reference.c
@@ -0,0 +1,61 @@
1/*
2 * Bock-W board support
3 *
4 * Copyright (C) 2013 Renesas Solutions Corp.
5 * Copyright (C) 2013 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; version 2 of the License.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21#include <linux/of_platform.h>
22#include <linux/pinctrl/machine.h>
23#include <mach/common.h>
24#include <mach/r8a7778.h>
25#include <asm/mach/arch.h>
26
27/*
28 * see board-bock.c for checking detail of dip-switch
29 */
30
31static const struct pinctrl_map bockw_pinctrl_map[] = {
32 /* SCIF0 */
33 PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.0", "pfc-r8a7778",
34 "scif0_data_a", "scif0"),
35 PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.0", "pfc-r8a7778",
36 "scif0_ctrl", "scif0"),
37};
38
39static void __init bockw_init(void)
40{
41 r8a7778_clock_init();
42
43 pinctrl_register_mappings(bockw_pinctrl_map,
44 ARRAY_SIZE(bockw_pinctrl_map));
45 r8a7778_pinmux_init();
46 r8a7778_add_dt_devices();
47
48 of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
49}
50
51static const char *bockw_boards_compat_dt[] __initdata = {
52 "renesas,bockw-reference",
53 NULL,
54};
55
56DT_MACHINE_START(BOCKW_DT, "bockw")
57 .init_early = r8a7778_init_delay,
58 .init_irq = r8a7778_init_irq_dt,
59 .init_machine = bockw_init,
60 .dt_compat = bockw_boards_compat_dt,
61MACHINE_END
diff --git a/arch/arm/mach-shmobile/board-bockw.c b/arch/arm/mach-shmobile/board-bockw.c
index 3354a85c90f7..6b9faf3908f7 100644
--- a/arch/arm/mach-shmobile/board-bockw.c
+++ b/arch/arm/mach-shmobile/board-bockw.c
@@ -3,6 +3,7 @@
3 * 3 *
4 * Copyright (C) 2013 Renesas Solutions Corp. 4 * Copyright (C) 2013 Renesas Solutions Corp.
5 * Copyright (C) 2013 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> 5 * Copyright (C) 2013 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
6 * Copyright (C) 2013 Cogent Embedded, Inc.
6 * 7 *
7 * This program is free software; you can redistribute it and/or modify 8 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by 9 * it under the terms of the GNU General Public License as published by
@@ -20,14 +21,18 @@
20 21
21#include <linux/mfd/tmio.h> 22#include <linux/mfd/tmio.h>
22#include <linux/mmc/host.h> 23#include <linux/mmc/host.h>
24#include <linux/mmc/sh_mobile_sdhi.h>
25#include <linux/mmc/sh_mmcif.h>
23#include <linux/mtd/partitions.h> 26#include <linux/mtd/partitions.h>
24#include <linux/pinctrl/machine.h> 27#include <linux/pinctrl/machine.h>
28#include <linux/platform_data/usb-rcar-phy.h>
25#include <linux/platform_device.h> 29#include <linux/platform_device.h>
26#include <linux/regulator/fixed.h> 30#include <linux/regulator/fixed.h>
27#include <linux/regulator/machine.h> 31#include <linux/regulator/machine.h>
28#include <linux/smsc911x.h> 32#include <linux/smsc911x.h>
29#include <linux/spi/spi.h> 33#include <linux/spi/spi.h>
30#include <linux/spi/flash.h> 34#include <linux/spi/flash.h>
35#include <media/soc_camera.h>
31#include <mach/common.h> 36#include <mach/common.h>
32#include <mach/irqs.h> 37#include <mach/irqs.h>
33#include <mach/r8a7778.h> 38#include <mach/r8a7778.h>
@@ -64,32 +69,41 @@ static struct regulator_consumer_supply dummy_supplies[] = {
64 REGULATOR_SUPPLY("vdd33a", "smsc911x"), 69 REGULATOR_SUPPLY("vdd33a", "smsc911x"),
65}; 70};
66 71
67static struct smsc911x_platform_config smsc911x_data = { 72static struct smsc911x_platform_config smsc911x_data __initdata = {
68 .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, 73 .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
69 .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL, 74 .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
70 .flags = SMSC911X_USE_32BIT, 75 .flags = SMSC911X_USE_32BIT,
71 .phy_interface = PHY_INTERFACE_MODE_MII, 76 .phy_interface = PHY_INTERFACE_MODE_MII,
72}; 77};
73 78
74static struct resource smsc911x_resources[] = { 79static struct resource smsc911x_resources[] __initdata = {
75 DEFINE_RES_MEM(0x18300000, 0x1000), 80 DEFINE_RES_MEM(0x18300000, 0x1000),
76 DEFINE_RES_IRQ(irq_pin(0)), /* IRQ 0 */ 81 DEFINE_RES_IRQ(irq_pin(0)), /* IRQ 0 */
77}; 82};
78 83
79/* USB */ 84/* USB */
85static struct resource usb_phy_resources[] __initdata = {
86 DEFINE_RES_MEM(0xffe70800, 0x100),
87 DEFINE_RES_MEM(0xffe76000, 0x100),
88};
89
80static struct rcar_phy_platform_data usb_phy_platform_data __initdata; 90static struct rcar_phy_platform_data usb_phy_platform_data __initdata;
81 91
82/* SDHI */ 92/* SDHI */
83static struct sh_mobile_sdhi_info sdhi0_info = { 93static struct sh_mobile_sdhi_info sdhi0_info __initdata = {
84 .tmio_caps = MMC_CAP_SD_HIGHSPEED, 94 .tmio_caps = MMC_CAP_SD_HIGHSPEED,
85 .tmio_ocr_mask = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34, 95 .tmio_ocr_mask = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34,
86 .tmio_flags = TMIO_MMC_HAS_IDLE_WAIT, 96 .tmio_flags = TMIO_MMC_HAS_IDLE_WAIT,
87}; 97};
88 98
99static struct resource sdhi0_resources[] __initdata = {
100 DEFINE_RES_MEM(0xFFE4C000, 0x100),
101 DEFINE_RES_IRQ(gic_iid(0x77)),
102};
103
89static struct sh_eth_plat_data ether_platform_data __initdata = { 104static struct sh_eth_plat_data ether_platform_data __initdata = {
90 .phy = 0x01, 105 .phy = 0x01,
91 .edmac_endian = EDMAC_LITTLE_ENDIAN, 106 .edmac_endian = EDMAC_LITTLE_ENDIAN,
92 .register_type = SH_ETH_REG_FAST_RCAR,
93 .phy_interface = PHY_INTERFACE_MODE_RMII, 107 .phy_interface = PHY_INTERFACE_MODE_RMII,
94 /* 108 /*
95 * Although the LINK signal is available on the board, it's connected to 109 * Although the LINK signal is available on the board, it's connected to
@@ -135,7 +149,12 @@ static struct spi_board_info spi_board_info[] __initdata = {
135}; 149};
136 150
137/* MMC */ 151/* MMC */
138static struct sh_mmcif_plat_data sh_mmcif_plat = { 152static struct resource mmc_resources[] __initdata = {
153 DEFINE_RES_MEM(0xffe4e000, 0x100),
154 DEFINE_RES_IRQ(gic_iid(0x5d)),
155};
156
157static struct sh_mmcif_plat_data sh_mmcif_plat __initdata = {
139 .sup_pclk = 0, 158 .sup_pclk = 0,
140 .ocr = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34, 159 .ocr = MMC_VDD_165_195 | MMC_VDD_32_33 | MMC_VDD_33_34,
141 .caps = MMC_CAP_4_BIT_DATA | 160 .caps = MMC_CAP_4_BIT_DATA |
@@ -143,6 +162,25 @@ static struct sh_mmcif_plat_data sh_mmcif_plat = {
143 MMC_CAP_NEEDS_POLL, 162 MMC_CAP_NEEDS_POLL,
144}; 163};
145 164
165static struct rcar_vin_platform_data vin_platform_data __initdata = {
166 .flags = RCAR_VIN_BT656,
167};
168
169/* In the default configuration both decoders reside on I2C bus 0 */
170#define BOCKW_CAMERA(idx) \
171static struct i2c_board_info camera##idx##_info = { \
172 I2C_BOARD_INFO("ml86v7667", 0x41 + 2 * (idx)), \
173}; \
174 \
175static struct soc_camera_link iclink##idx##_ml86v7667 __initdata = { \
176 .bus_id = idx, \
177 .i2c_adapter_id = 0, \
178 .board_info = &camera##idx##_info, \
179}
180
181BOCKW_CAMERA(0);
182BOCKW_CAMERA(1);
183
146static const struct pinctrl_map bockw_pinctrl_map[] = { 184static const struct pinctrl_map bockw_pinctrl_map[] = {
147 /* Ether */ 185 /* Ether */
148 PIN_MAP_MUX_GROUP_DEFAULT("r8a777x-ether", "pfc-r8a7778", 186 PIN_MAP_MUX_GROUP_DEFAULT("r8a777x-ether", "pfc-r8a7778",
@@ -174,6 +212,16 @@ static const struct pinctrl_map bockw_pinctrl_map[] = {
174 "sdhi0_cd", "sdhi0"), 212 "sdhi0_cd", "sdhi0"),
175 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7778", 213 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7778",
176 "sdhi0_wp", "sdhi0"), 214 "sdhi0_wp", "sdhi0"),
215 /* VIN0 */
216 PIN_MAP_MUX_GROUP_DEFAULT("r8a7778-vin.0", "pfc-r8a7778",
217 "vin0_clk", "vin0"),
218 PIN_MAP_MUX_GROUP_DEFAULT("r8a7778-vin.0", "pfc-r8a7778",
219 "vin0_data8", "vin0"),
220 /* VIN1 */
221 PIN_MAP_MUX_GROUP_DEFAULT("r8a7778-vin.1", "pfc-r8a7778",
222 "vin1_clk", "vin1"),
223 PIN_MAP_MUX_GROUP_DEFAULT("r8a7778-vin.1", "pfc-r8a7778",
224 "vin1_data8", "vin1"),
177}; 225};
178 226
179#define FPGA 0x18200000 227#define FPGA 0x18200000
@@ -187,11 +235,17 @@ static void __init bockw_init(void)
187 r8a7778_clock_init(); 235 r8a7778_clock_init();
188 r8a7778_init_irq_extpin(1); 236 r8a7778_init_irq_extpin(1);
189 r8a7778_add_standard_devices(); 237 r8a7778_add_standard_devices();
190 r8a7778_add_usb_phy_device(&usb_phy_platform_data);
191 r8a7778_add_ether_device(&ether_platform_data); 238 r8a7778_add_ether_device(&ether_platform_data);
192 r8a7778_add_i2c_device(0); 239 r8a7778_add_vin_device(0, &vin_platform_data);
193 r8a7778_add_hspi_device(0); 240 /* VIN1 has a pin conflict with Ether */
194 r8a7778_add_mmc_device(&sh_mmcif_plat); 241 if (!IS_ENABLED(CONFIG_SH_ETH))
242 r8a7778_add_vin_device(1, &vin_platform_data);
243 platform_device_register_data(&platform_bus, "soc-camera-pdrv", 0,
244 &iclink0_ml86v7667,
245 sizeof(iclink0_ml86v7667));
246 platform_device_register_data(&platform_bus, "soc-camera-pdrv", 1,
247 &iclink1_ml86v7667,
248 sizeof(iclink1_ml86v7667));
195 249
196 i2c_register_board_info(0, i2c0_devices, 250 i2c_register_board_info(0, i2c0_devices,
197 ARRAY_SIZE(i2c0_devices)); 251 ARRAY_SIZE(i2c0_devices));
@@ -201,6 +255,19 @@ static void __init bockw_init(void)
201 ARRAY_SIZE(bockw_pinctrl_map)); 255 ARRAY_SIZE(bockw_pinctrl_map));
202 r8a7778_pinmux_init(); 256 r8a7778_pinmux_init();
203 257
258 platform_device_register_resndata(
259 &platform_bus, "sh_mmcif", -1,
260 mmc_resources, ARRAY_SIZE(mmc_resources),
261 &sh_mmcif_plat, sizeof(struct sh_mmcif_plat_data));
262
263 platform_device_register_resndata(
264 &platform_bus, "rcar_usb_phy", -1,
265 usb_phy_resources,
266 ARRAY_SIZE(usb_phy_resources),
267 &usb_phy_platform_data,
268 sizeof(struct rcar_phy_platform_data));
269
270
204 /* for SMSC */ 271 /* for SMSC */
205 base = ioremap_nocache(FPGA, SZ_1M); 272 base = ioremap_nocache(FPGA, SZ_1M);
206 if (base) { 273 if (base) {
@@ -236,7 +303,10 @@ static void __init bockw_init(void)
236 iowrite32(ioread32(base + PUPR4) | (3 << 26), base + PUPR4); 303 iowrite32(ioread32(base + PUPR4) | (3 << 26), base + PUPR4);
237 iounmap(base); 304 iounmap(base);
238 305
239 r8a7778_sdhi_init(0, &sdhi0_info); 306 platform_device_register_resndata(
307 &platform_bus, "sh_mobile_sdhi", 0,
308 sdhi0_resources, ARRAY_SIZE(sdhi0_resources),
309 &sdhi0_info, sizeof(struct sh_mobile_sdhi_info));
240 } 310 }
241} 311}
242 312
@@ -249,7 +319,6 @@ DT_MACHINE_START(BOCKW_DT, "bockw")
249 .init_early = r8a7778_init_delay, 319 .init_early = r8a7778_init_delay,
250 .init_irq = r8a7778_init_irq_dt, 320 .init_irq = r8a7778_init_irq_dt,
251 .init_machine = bockw_init, 321 .init_machine = bockw_init,
252 .init_time = shmobile_timer_init,
253 .dt_compat = bockw_boards_compat_dt, 322 .dt_compat = bockw_boards_compat_dt,
254 .init_late = r8a7778_init_late, 323 .init_late = r8a7778_init_late,
255MACHINE_END 324MACHINE_END
diff --git a/arch/arm/mach-shmobile/board-kota2.c b/arch/arm/mach-shmobile/board-kota2.c
deleted file mode 100644
index ef5ca0ef0cb5..000000000000
--- a/arch/arm/mach-shmobile/board-kota2.c
+++ /dev/null
@@ -1,553 +0,0 @@
1/*
2 * kota2 board support
3 *
4 * Copyright (C) 2011 Renesas Solutions Corp.
5 * Copyright (C) 2011 Magnus Damm
6 * Copyright (C) 2010 Takashi Yoshii <yoshii.takashi.zj@renesas.com>
7 * Copyright (C) 2009 Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; version 2 of the License.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23#include <linux/kernel.h>
24#include <linux/init.h>
25#include <linux/interrupt.h>
26#include <linux/irq.h>
27#include <linux/pinctrl/machine.h>
28#include <linux/pinctrl/pinconf-generic.h>
29#include <linux/platform_device.h>
30#include <linux/delay.h>
31#include <linux/io.h>
32#include <linux/regulator/fixed.h>
33#include <linux/regulator/machine.h>
34#include <linux/smsc911x.h>
35#include <linux/gpio.h>
36#include <linux/input.h>
37#include <linux/input/sh_keysc.h>
38#include <linux/gpio_keys.h>
39#include <linux/leds.h>
40#include <linux/irqchip/arm-gic.h>
41#include <linux/platform_data/leds-renesas-tpu.h>
42#include <linux/mmc/host.h>
43#include <linux/mmc/sh_mmcif.h>
44#include <linux/mfd/tmio.h>
45#include <linux/mmc/sh_mobile_sdhi.h>
46#include <mach/hardware.h>
47#include <mach/irqs.h>
48#include <mach/sh73a0.h>
49#include <mach/common.h>
50#include <asm/mach-types.h>
51#include <asm/mach/arch.h>
52#include <asm/mach/time.h>
53#include <asm/hardware/cache-l2x0.h>
54#include <asm/traps.h>
55
56/* Dummy supplies, where voltage doesn't matter */
57static struct regulator_consumer_supply dummy_supplies[] = {
58 REGULATOR_SUPPLY("vddvario", "smsc911x"),
59 REGULATOR_SUPPLY("vdd33a", "smsc911x"),
60};
61
62/* SMSC 9220 */
63static struct resource smsc9220_resources[] = {
64 [0] = {
65 .start = 0x14000000, /* CS5A */
66 .end = 0x140000ff, /* A1->A7 */
67 .flags = IORESOURCE_MEM,
68 },
69 [1] = {
70 .start = SH73A0_PINT0_IRQ(2), /* PINTA2 */
71 .flags = IORESOURCE_IRQ,
72 },
73};
74
75static struct smsc911x_platform_config smsc9220_platdata = {
76 .flags = SMSC911X_USE_32BIT, /* 32-bit SW on 16-bit HW bus */
77 .phy_interface = PHY_INTERFACE_MODE_MII,
78 .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
79 .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
80};
81
82static struct platform_device eth_device = {
83 .name = "smsc911x",
84 .id = 0,
85 .dev = {
86 .platform_data = &smsc9220_platdata,
87 },
88 .resource = smsc9220_resources,
89 .num_resources = ARRAY_SIZE(smsc9220_resources),
90};
91
92/* KEYSC */
93static struct sh_keysc_info keysc_platdata = {
94 .mode = SH_KEYSC_MODE_6,
95 .scan_timing = 3,
96 .delay = 100,
97 .keycodes = {
98 KEY_NUMERIC_STAR, KEY_NUMERIC_0, KEY_NUMERIC_POUND,
99 0, 0, 0, 0, 0,
100 KEY_NUMERIC_7, KEY_NUMERIC_8, KEY_NUMERIC_9,
101 0, KEY_DOWN, 0, 0, 0,
102 KEY_NUMERIC_4, KEY_NUMERIC_5, KEY_NUMERIC_6,
103 KEY_LEFT, KEY_ENTER, KEY_RIGHT, 0, 0,
104 KEY_NUMERIC_1, KEY_NUMERIC_2, KEY_NUMERIC_3,
105 0, KEY_UP, 0, 0, 0,
106 0, 0, 0, 0, 0, 0, 0, 0,
107 0, 0, 0, 0, 0, 0, 0, 0,
108 0, 0, 0, 0, 0, 0, 0, 0,
109 0, 0, 0, 0, 0, 0, 0, 0,
110 },
111};
112
113static struct resource keysc_resources[] = {
114 [0] = {
115 .name = "KEYSC",
116 .start = 0xe61b0000,
117 .end = 0xe61b0098 - 1,
118 .flags = IORESOURCE_MEM,
119 },
120 [1] = {
121 .start = gic_spi(71),
122 .flags = IORESOURCE_IRQ,
123 },
124};
125
126static struct platform_device keysc_device = {
127 .name = "sh_keysc",
128 .id = 0,
129 .num_resources = ARRAY_SIZE(keysc_resources),
130 .resource = keysc_resources,
131 .dev = {
132 .platform_data = &keysc_platdata,
133 },
134};
135
136/* GPIO KEY */
137#define GPIO_KEY(c, g, d) { .code = c, .gpio = g, .desc = d, .active_low = 1 }
138
139static struct gpio_keys_button gpio_buttons[] = {
140 GPIO_KEY(KEY_VOLUMEUP, 56, "+"), /* S2: VOL+ [IRQ9] */
141 GPIO_KEY(KEY_VOLUMEDOWN, 54, "-"), /* S3: VOL- [IRQ10] */
142 GPIO_KEY(KEY_MENU, 27, "Menu"), /* S4: MENU [IRQ30] */
143 GPIO_KEY(KEY_HOMEPAGE, 26, "Home"), /* S5: HOME [IRQ31] */
144 GPIO_KEY(KEY_BACK, 11, "Back"), /* S6: BACK [IRQ0] */
145 GPIO_KEY(KEY_PHONE, 238, "Tel"), /* S7: TEL [IRQ11] */
146 GPIO_KEY(KEY_POWER, 239, "C1"), /* S8: CAM [IRQ13] */
147 GPIO_KEY(KEY_MAIL, 224, "Mail"), /* S9: MAIL [IRQ3] */
148 /* Omitted button "C3?": 223 - S10: CUST [IRQ8] */
149 GPIO_KEY(KEY_CAMERA, 164, "C2"), /* S11: CAM_HALF [IRQ25] */
150 /* Omitted button "?": 152 - S12: CAM_FULL [No IRQ] */
151};
152
153static struct gpio_keys_platform_data gpio_key_info = {
154 .buttons = gpio_buttons,
155 .nbuttons = ARRAY_SIZE(gpio_buttons),
156};
157
158static struct platform_device gpio_keys_device = {
159 .name = "gpio-keys",
160 .id = -1,
161 .dev = {
162 .platform_data = &gpio_key_info,
163 },
164};
165
166/* GPIO LED */
167#define GPIO_LED(n, g) { .name = n, .gpio = g }
168
169static struct gpio_led gpio_leds[] = {
170 GPIO_LED("G", 20), /* PORT20 [GPO0] -> LED7 -> "G" */
171 GPIO_LED("H", 21), /* PORT21 [GPO1] -> LED8 -> "H" */
172 GPIO_LED("J", 22), /* PORT22 [GPO2] -> LED9 -> "J" */
173};
174
175static struct gpio_led_platform_data gpio_leds_info = {
176 .leds = gpio_leds,
177 .num_leds = ARRAY_SIZE(gpio_leds),
178};
179
180static struct platform_device gpio_leds_device = {
181 .name = "leds-gpio",
182 .id = -1,
183 .dev = {
184 .platform_data = &gpio_leds_info,
185 },
186};
187
188/* TPU LED */
189static struct led_renesas_tpu_config led_renesas_tpu12_pdata = {
190 .name = "V2513",
191 .pin_gpio_fn = GPIO_FN_TPU1TO2,
192 .pin_gpio = 153,
193 .channel_offset = 0x90,
194 .timer_bit = 2,
195 .max_brightness = 1000,
196};
197
198static struct resource tpu12_resources[] = {
199 [0] = {
200 .name = "TPU12",
201 .start = 0xe6610090,
202 .end = 0xe66100b5,
203 .flags = IORESOURCE_MEM,
204 },
205};
206
207static struct platform_device leds_tpu12_device = {
208 .name = "leds-renesas-tpu",
209 .id = 12,
210 .dev = {
211 .platform_data = &led_renesas_tpu12_pdata,
212 },
213 .num_resources = ARRAY_SIZE(tpu12_resources),
214 .resource = tpu12_resources,
215};
216
217static struct led_renesas_tpu_config led_renesas_tpu41_pdata = {
218 .name = "V2514",
219 .pin_gpio_fn = GPIO_FN_TPU4TO1,
220 .pin_gpio = 199,
221 .channel_offset = 0x50,
222 .timer_bit = 1,
223 .max_brightness = 1000,
224};
225
226static struct resource tpu41_resources[] = {
227 [0] = {
228 .name = "TPU41",
229 .start = 0xe6640050,
230 .end = 0xe6640075,
231 .flags = IORESOURCE_MEM,
232 },
233};
234
235static struct platform_device leds_tpu41_device = {
236 .name = "leds-renesas-tpu",
237 .id = 41,
238 .dev = {
239 .platform_data = &led_renesas_tpu41_pdata,
240 },
241 .num_resources = ARRAY_SIZE(tpu41_resources),
242 .resource = tpu41_resources,
243};
244
245static struct led_renesas_tpu_config led_renesas_tpu21_pdata = {
246 .name = "V2515",
247 .pin_gpio_fn = GPIO_FN_TPU2TO1,
248 .pin_gpio = 197,
249 .channel_offset = 0x50,
250 .timer_bit = 1,
251 .max_brightness = 1000,
252};
253
254static struct resource tpu21_resources[] = {
255 [0] = {
256 .name = "TPU21",
257 .start = 0xe6620050,
258 .end = 0xe6620075,
259 .flags = IORESOURCE_MEM,
260 },
261};
262
263static struct platform_device leds_tpu21_device = {
264 .name = "leds-renesas-tpu",
265 .id = 21,
266 .dev = {
267 .platform_data = &led_renesas_tpu21_pdata,
268 },
269 .num_resources = ARRAY_SIZE(tpu21_resources),
270 .resource = tpu21_resources,
271};
272
273static struct led_renesas_tpu_config led_renesas_tpu30_pdata = {
274 .name = "KEYLED",
275 .pin_gpio_fn = GPIO_FN_TPU3TO0,
276 .pin_gpio = 163,
277 .channel_offset = 0x10,
278 .timer_bit = 0,
279 .max_brightness = 1000,
280};
281
282static struct resource tpu30_resources[] = {
283 [0] = {
284 .name = "TPU30",
285 .start = 0xe6630010,
286 .end = 0xe6630035,
287 .flags = IORESOURCE_MEM,
288 },
289};
290
291static struct platform_device leds_tpu30_device = {
292 .name = "leds-renesas-tpu",
293 .id = 30,
294 .dev = {
295 .platform_data = &led_renesas_tpu30_pdata,
296 },
297 .num_resources = ARRAY_SIZE(tpu30_resources),
298 .resource = tpu30_resources,
299};
300
301/* Fixed 1.8V regulator to be used by MMCIF */
302static struct regulator_consumer_supply fixed1v8_power_consumers[] =
303{
304 REGULATOR_SUPPLY("vmmc", "sh_mmcif.0"),
305 REGULATOR_SUPPLY("vqmmc", "sh_mmcif.0"),
306};
307
308/* MMCIF */
309static struct resource mmcif_resources[] = {
310 [0] = {
311 .name = "MMCIF",
312 .start = 0xe6bd0000,
313 .end = 0xe6bd00ff,
314 .flags = IORESOURCE_MEM,
315 },
316 [1] = {
317 .start = gic_spi(140),
318 .flags = IORESOURCE_IRQ,
319 },
320 [2] = {
321 .start = gic_spi(141),
322 .flags = IORESOURCE_IRQ,
323 },
324};
325
326static struct sh_mmcif_plat_data mmcif_info = {
327 .ocr = MMC_VDD_165_195,
328 .caps = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE,
329};
330
331static struct platform_device mmcif_device = {
332 .name = "sh_mmcif",
333 .id = 0,
334 .dev = {
335 .platform_data = &mmcif_info,
336 },
337 .num_resources = ARRAY_SIZE(mmcif_resources),
338 .resource = mmcif_resources,
339};
340
341/* Fixed 3.3V regulator to be used by SDHI0 and SDHI1 */
342static struct regulator_consumer_supply fixed3v3_power_consumers[] =
343{
344 REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.0"),
345 REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.0"),
346 REGULATOR_SUPPLY("vmmc", "sh_mobile_sdhi.1"),
347 REGULATOR_SUPPLY("vqmmc", "sh_mobile_sdhi.1"),
348};
349
350/* SDHI0 */
351static struct sh_mobile_sdhi_info sdhi0_info = {
352 .tmio_caps = MMC_CAP_SD_HIGHSPEED,
353 .tmio_flags = TMIO_MMC_WRPROTECT_DISABLE | TMIO_MMC_HAS_IDLE_WAIT,
354};
355
356static struct resource sdhi0_resources[] = {
357 [0] = {
358 .name = "SDHI0",
359 .start = 0xee100000,
360 .end = 0xee1000ff,
361 .flags = IORESOURCE_MEM,
362 },
363 [1] = {
364 .start = gic_spi(83),
365 .flags = IORESOURCE_IRQ,
366 },
367 [2] = {
368 .start = gic_spi(84),
369 .flags = IORESOURCE_IRQ,
370 },
371 [3] = {
372 .start = gic_spi(85),
373 .flags = IORESOURCE_IRQ,
374 },
375};
376
377static struct platform_device sdhi0_device = {
378 .name = "sh_mobile_sdhi",
379 .id = 0,
380 .num_resources = ARRAY_SIZE(sdhi0_resources),
381 .resource = sdhi0_resources,
382 .dev = {
383 .platform_data = &sdhi0_info,
384 },
385};
386
387/* SDHI1 */
388static struct sh_mobile_sdhi_info sdhi1_info = {
389 .tmio_caps = MMC_CAP_NONREMOVABLE | MMC_CAP_SDIO_IRQ,
390 .tmio_flags = TMIO_MMC_WRPROTECT_DISABLE | TMIO_MMC_HAS_IDLE_WAIT,
391};
392
393static struct resource sdhi1_resources[] = {
394 [0] = {
395 .name = "SDHI1",
396 .start = 0xee120000,
397 .end = 0xee1200ff,
398 .flags = IORESOURCE_MEM,
399 },
400 [1] = {
401 .start = gic_spi(87),
402 .flags = IORESOURCE_IRQ,
403 },
404 [2] = {
405 .start = gic_spi(88),
406 .flags = IORESOURCE_IRQ,
407 },
408 [3] = {
409 .start = gic_spi(89),
410 .flags = IORESOURCE_IRQ,
411 },
412};
413
414static struct platform_device sdhi1_device = {
415 .name = "sh_mobile_sdhi",
416 .id = 1,
417 .num_resources = ARRAY_SIZE(sdhi1_resources),
418 .resource = sdhi1_resources,
419 .dev = {
420 .platform_data = &sdhi1_info,
421 },
422};
423
424static struct platform_device *kota2_devices[] __initdata = {
425 &eth_device,
426 &keysc_device,
427 &gpio_keys_device,
428 &gpio_leds_device,
429 &leds_tpu12_device,
430 &leds_tpu41_device,
431 &leds_tpu21_device,
432 &leds_tpu30_device,
433 &mmcif_device,
434 &sdhi0_device,
435 &sdhi1_device,
436};
437
438static unsigned long pin_pullup_conf[] = {
439 PIN_CONF_PACKED(PIN_CONFIG_BIAS_PULL_UP, 0),
440};
441
442static const struct pinctrl_map kota2_pinctrl_map[] = {
443 /* KEYSC */
444 PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
445 "keysc_in8", "keysc"),
446 PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
447 "keysc_out04", "keysc"),
448 PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
449 "keysc_out5", "keysc"),
450 PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
451 "keysc_out6_0", "keysc"),
452 PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
453 "keysc_out7_0", "keysc"),
454 PIN_MAP_MUX_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
455 "keysc_out8_0", "keysc"),
456 PIN_MAP_CONFIGS_GROUP_DEFAULT("sh_keysc.0", "pfc-sh73a0",
457 "keysc_in8", pin_pullup_conf),
458 /* MMCIF */
459 PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
460 "mmc0_data8_0", "mmc0"),
461 PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
462 "mmc0_ctrl_0", "mmc0"),
463 PIN_MAP_CONFIGS_PIN_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
464 "PORT279", pin_pullup_conf),
465 PIN_MAP_CONFIGS_GROUP_DEFAULT("sh_mmcif.0", "pfc-sh73a0",
466 "mmc0_data8_0", pin_pullup_conf),
467 /* SCIFA2 (UART2) */
468 PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.2", "pfc-sh73a0",
469 "scifa2_data_0", "scifa2"),
470 PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.2", "pfc-sh73a0",
471 "scifa2_ctrl_0", "scifa2"),
472 /* SCIFA4 (UART1) */
473 PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.4", "pfc-sh73a0",
474 "scifa4_data", "scifa4"),
475 PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.4", "pfc-sh73a0",
476 "scifa4_ctrl", "scifa4"),
477 /* SCIFB (BT) */
478 PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.8", "pfc-sh73a0",
479 "scifb_data_0", "scifb"),
480 PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.8", "pfc-sh73a0",
481 "scifb_clk_0", "scifb"),
482 PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.8", "pfc-sh73a0",
483 "scifb_ctrl_0", "scifb"),
484 /* SDHI0 (microSD) */
485 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
486 "sdhi0_data4", "sdhi0"),
487 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
488 "sdhi0_ctrl", "sdhi0"),
489 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
490 "sdhi0_cd", "sdhi0"),
491 PIN_MAP_CONFIGS_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
492 "sdhi0_data4", pin_pullup_conf),
493 PIN_MAP_CONFIGS_PIN_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
494 "PORT256", pin_pullup_conf),
495 PIN_MAP_CONFIGS_PIN_DEFAULT("sh_mobile_sdhi.0", "pfc-sh73a0",
496 "PORT251", pin_pullup_conf),
497 /* SDHI1 (BCM4330) */
498 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh73a0",
499 "sdhi1_data4", "sdhi1"),
500 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh73a0",
501 "sdhi1_ctrl", "sdhi1"),
502 PIN_MAP_CONFIGS_GROUP_DEFAULT("sh_mobile_sdhi.1", "pfc-sh73a0",
503 "sdhi1_data4", pin_pullup_conf),
504 PIN_MAP_CONFIGS_PIN_DEFAULT("sh_mobile_sdhi.1", "pfc-sh73a0",
505 "PORT263", pin_pullup_conf),
506 /* SMSC911X */
507 PIN_MAP_MUX_GROUP_DEFAULT("smsc911x.0", "pfc-sh73a0",
508 "bsc_data_0_7", "bsc"),
509 PIN_MAP_MUX_GROUP_DEFAULT("smsc911x.0", "pfc-sh73a0",
510 "bsc_data_8_15", "bsc"),
511 PIN_MAP_MUX_GROUP_DEFAULT("smsc911x.0", "pfc-sh73a0",
512 "bsc_cs5_a", "bsc"),
513 PIN_MAP_MUX_GROUP_DEFAULT("smsc911x.0", "pfc-sh73a0",
514 "bsc_we0", "bsc"),
515};
516
517static void __init kota2_init(void)
518{
519 regulator_register_always_on(0, "fixed-1.8V", fixed1v8_power_consumers,
520 ARRAY_SIZE(fixed1v8_power_consumers), 1800000);
521 regulator_register_always_on(1, "fixed-3.3V", fixed3v3_power_consumers,
522 ARRAY_SIZE(fixed3v3_power_consumers), 3300000);
523 regulator_register_fixed(2, dummy_supplies, ARRAY_SIZE(dummy_supplies));
524
525 pinctrl_register_mappings(kota2_pinctrl_map,
526 ARRAY_SIZE(kota2_pinctrl_map));
527 sh73a0_pinmux_init();
528
529 /* SMSC911X */
530 gpio_request_one(144, GPIOF_IN, NULL); /* PINTA2 */
531 gpio_request_one(145, GPIOF_OUT_INIT_HIGH, NULL); /* RESET */
532
533 /* MMCIF */
534 gpio_request_one(208, GPIOF_OUT_INIT_HIGH, NULL); /* Reset */
535
536#ifdef CONFIG_CACHE_L2X0
537 /* Early BRESP enable, Shared attribute override enable, 64K*8way */
538 l2x0_init(IOMEM(0xf0100000), 0x40460000, 0x82000fff);
539#endif
540 sh73a0_add_standard_devices();
541 platform_add_devices(kota2_devices, ARRAY_SIZE(kota2_devices));
542}
543
544MACHINE_START(KOTA2, "kota2")
545 .smp = smp_ops(sh73a0_smp_ops),
546 .map_io = sh73a0_map_io,
547 .init_early = sh73a0_add_early_devices,
548 .nr_irqs = NR_IRQS_LEGACY,
549 .init_irq = sh73a0_init_irq,
550 .init_machine = kota2_init,
551 .init_late = shmobile_init_late,
552 .init_time = sh73a0_earlytimer_init,
553MACHINE_END
diff --git a/arch/arm/mach-shmobile/board-kzm9d-reference.c b/arch/arm/mach-shmobile/board-kzm9d-reference.c
new file mode 100644
index 000000000000..8f8bb2fab076
--- /dev/null
+++ b/arch/arm/mach-shmobile/board-kzm9d-reference.c
@@ -0,0 +1,47 @@
1/*
2 * kzm9d board support - Reference DT implementation
3 *
4 * Copyright (C) 2013 Renesas Solutions Corp.
5 * Copyright (C) 2013 Magnus Damm
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; version 2 of the License.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21#include <linux/init.h>
22#include <linux/of_platform.h>
23#include <mach/emev2.h>
24#include <mach/common.h>
25#include <asm/mach/arch.h>
26
27static void __init kzm9d_add_standard_devices(void)
28{
29 if (!IS_ENABLED(CONFIG_COMMON_CLK))
30 emev2_clock_init();
31
32 of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
33}
34
35static const char *kzm9d_boards_compat_dt[] __initdata = {
36 "renesas,kzm9d-reference",
37 NULL,
38};
39
40DT_MACHINE_START(KZM9D_DT, "kzm9d")
41 .smp = smp_ops(emev2_smp_ops),
42 .map_io = emev2_map_io,
43 .init_early = emev2_init_delay,
44 .init_machine = kzm9d_add_standard_devices,
45 .init_late = shmobile_init_late,
46 .dt_compat = kzm9d_boards_compat_dt,
47MACHINE_END
diff --git a/arch/arm/mach-shmobile/board-kzm9d.c b/arch/arm/mach-shmobile/board-kzm9d.c
index 4368000e1127..30c2cc695b12 100644
--- a/arch/arm/mach-shmobile/board-kzm9d.c
+++ b/arch/arm/mach-shmobile/board-kzm9d.c
@@ -85,9 +85,7 @@ static const char *kzm9d_boards_compat_dt[] __initdata = {
85DT_MACHINE_START(KZM9D_DT, "kzm9d") 85DT_MACHINE_START(KZM9D_DT, "kzm9d")
86 .smp = smp_ops(emev2_smp_ops), 86 .smp = smp_ops(emev2_smp_ops),
87 .map_io = emev2_map_io, 87 .map_io = emev2_map_io,
88 .init_early = emev2_add_early_devices, 88 .init_early = emev2_init_delay,
89 .nr_irqs = NR_IRQS_LEGACY,
90 .init_irq = emev2_init_irq,
91 .init_machine = kzm9d_add_standard_devices, 89 .init_machine = kzm9d_add_standard_devices,
92 .init_late = shmobile_init_late, 90 .init_late = shmobile_init_late,
93 .dt_compat = kzm9d_boards_compat_dt, 91 .dt_compat = kzm9d_boards_compat_dt,
diff --git a/arch/arm/mach-shmobile/board-kzm9g-reference.c b/arch/arm/mach-shmobile/board-kzm9g-reference.c
index 44055fe8a45c..598e32488410 100644
--- a/arch/arm/mach-shmobile/board-kzm9g-reference.c
+++ b/arch/arm/mach-shmobile/board-kzm9g-reference.c
@@ -21,67 +21,19 @@
21 */ 21 */
22 22
23#include <linux/delay.h> 23#include <linux/delay.h>
24#include <linux/gpio.h>
25#include <linux/io.h> 24#include <linux/io.h>
26#include <linux/irq.h> 25#include <linux/irq.h>
27#include <linux/irqchip.h>
28#include <linux/input.h> 26#include <linux/input.h>
29#include <linux/of_platform.h> 27#include <linux/of_platform.h>
30#include <linux/pinctrl/machine.h>
31#include <linux/pinctrl/pinconf-generic.h>
32#include <mach/sh73a0.h> 28#include <mach/sh73a0.h>
33#include <mach/common.h> 29#include <mach/common.h>
34#include <asm/hardware/cache-l2x0.h> 30#include <asm/hardware/cache-l2x0.h>
35#include <asm/mach-types.h> 31#include <asm/mach-types.h>
36#include <asm/mach/arch.h> 32#include <asm/mach/arch.h>
37 33
38static unsigned long pin_pullup_conf[] = {
39 PIN_CONF_PACKED(PIN_CONFIG_BIAS_PULL_UP, 0),
40};
41
42static const struct pinctrl_map kzm_pinctrl_map[] = {
43 PIN_MAP_MUX_GROUP_DEFAULT("e6826000.i2c", "pfc-sh73a0",
44 "i2c3_1", "i2c3"),
45 /* MMCIF */
46 PIN_MAP_MUX_GROUP_DEFAULT("e6bd0000.mmcif", "pfc-sh73a0",
47 "mmc0_data8_0", "mmc0"),
48 PIN_MAP_MUX_GROUP_DEFAULT("e6bd0000.mmcif", "pfc-sh73a0",
49 "mmc0_ctrl_0", "mmc0"),
50 PIN_MAP_CONFIGS_PIN_DEFAULT("e6bd0000.mmcif", "pfc-sh73a0",
51 "PORT279", pin_pullup_conf),
52 PIN_MAP_CONFIGS_GROUP_DEFAULT("e6bd0000.mmcif", "pfc-sh73a0",
53 "mmc0_data8_0", pin_pullup_conf),
54 /* SCIFA4 */
55 PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.4", "pfc-sh73a0",
56 "scifa4_data", "scifa4"),
57 PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.4", "pfc-sh73a0",
58 "scifa4_ctrl", "scifa4"),
59 /* SDHI0 */
60 PIN_MAP_MUX_GROUP_DEFAULT("ee100000.sdhi", "pfc-sh73a0",
61 "sdhi0_data4", "sdhi0"),
62 PIN_MAP_MUX_GROUP_DEFAULT("ee100000.sdhi", "pfc-sh73a0",
63 "sdhi0_ctrl", "sdhi0"),
64 PIN_MAP_MUX_GROUP_DEFAULT("ee100000.sdhi", "pfc-sh73a0",
65 "sdhi0_cd", "sdhi0"),
66 PIN_MAP_MUX_GROUP_DEFAULT("ee100000.sdhi", "pfc-sh73a0",
67 "sdhi0_wp", "sdhi0"),
68 /* SDHI2 */
69 PIN_MAP_MUX_GROUP_DEFAULT("ee140000.sdhi", "pfc-sh73a0",
70 "sdhi2_data4", "sdhi2"),
71 PIN_MAP_MUX_GROUP_DEFAULT("ee140000.sdhi", "pfc-sh73a0",
72 "sdhi2_ctrl", "sdhi2"),
73};
74
75static void __init kzm_init(void) 34static void __init kzm_init(void)
76{ 35{
77 sh73a0_add_standard_devices_dt(); 36 sh73a0_add_standard_devices_dt();
78 pinctrl_register_mappings(kzm_pinctrl_map, ARRAY_SIZE(kzm_pinctrl_map));
79 sh73a0_pinmux_init();
80
81 /* enable SD */
82 gpio_request_one(15, GPIOF_OUT_INIT_HIGH, NULL); /* power */
83
84 gpio_request_one(14, GPIOF_OUT_INIT_HIGH, NULL); /* power */
85 37
86#ifdef CONFIG_CACHE_L2X0 38#ifdef CONFIG_CACHE_L2X0
87 /* Early BRESP enable, Shared attribute override enable, 64K*8way */ 39 /* Early BRESP enable, Shared attribute override enable, 64K*8way */
@@ -99,8 +51,6 @@ DT_MACHINE_START(KZM9G_DT, "kzm9g-reference")
99 .map_io = sh73a0_map_io, 51 .map_io = sh73a0_map_io,
100 .init_early = sh73a0_init_delay, 52 .init_early = sh73a0_init_delay,
101 .nr_irqs = NR_IRQS_LEGACY, 53 .nr_irqs = NR_IRQS_LEGACY,
102 .init_irq = irqchip_init,
103 .init_machine = kzm_init, 54 .init_machine = kzm_init,
104 .init_time = shmobile_timer_init,
105 .dt_compat = kzm9g_boards_compat_dt, 55 .dt_compat = kzm9g_boards_compat_dt,
106MACHINE_END 56MACHINE_END
diff --git a/arch/arm/mach-shmobile/board-kzm9g.c b/arch/arm/mach-shmobile/board-kzm9g.c
index 1068120d339f..f1994968d303 100644
--- a/arch/arm/mach-shmobile/board-kzm9g.c
+++ b/arch/arm/mach-shmobile/board-kzm9g.c
@@ -54,14 +54,14 @@
54/* 54/*
55 * external GPIO 55 * external GPIO
56 */ 56 */
57#define GPIO_PCF8575_BASE (GPIO_NR) 57#define GPIO_PCF8575_BASE (310)
58#define GPIO_PCF8575_PORT10 (GPIO_NR + 8) 58#define GPIO_PCF8575_PORT10 (GPIO_PCF8575_BASE + 8)
59#define GPIO_PCF8575_PORT11 (GPIO_NR + 9) 59#define GPIO_PCF8575_PORT11 (GPIO_PCF8575_BASE + 9)
60#define GPIO_PCF8575_PORT12 (GPIO_NR + 10) 60#define GPIO_PCF8575_PORT12 (GPIO_PCF8575_BASE + 10)
61#define GPIO_PCF8575_PORT13 (GPIO_NR + 11) 61#define GPIO_PCF8575_PORT13 (GPIO_PCF8575_BASE + 11)
62#define GPIO_PCF8575_PORT14 (GPIO_NR + 12) 62#define GPIO_PCF8575_PORT14 (GPIO_PCF8575_BASE + 12)
63#define GPIO_PCF8575_PORT15 (GPIO_NR + 13) 63#define GPIO_PCF8575_PORT15 (GPIO_PCF8575_BASE + 13)
64#define GPIO_PCF8575_PORT16 (GPIO_NR + 14) 64#define GPIO_PCF8575_PORT16 (GPIO_PCF8575_BASE + 14)
65 65
66/* Dummy supplies, where voltage doesn't matter */ 66/* Dummy supplies, where voltage doesn't matter */
67static struct regulator_consumer_supply dummy_supplies[] = { 67static struct regulator_consumer_supply dummy_supplies[] = {
diff --git a/arch/arm/mach-shmobile/board-lager-reference.c b/arch/arm/mach-shmobile/board-lager-reference.c
new file mode 100644
index 000000000000..9c316a1b2e32
--- /dev/null
+++ b/arch/arm/mach-shmobile/board-lager-reference.c
@@ -0,0 +1,45 @@
1/*
2 * Lager board support - Reference DT implementation
3 *
4 * Copyright (C) 2013 Renesas Solutions Corp.
5 * Copyright (C) 2013 Simon Horman
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; version 2 of the License.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21#include <linux/init.h>
22#include <linux/of_platform.h>
23#include <mach/r8a7790.h>
24#include <asm/mach/arch.h>
25
26static void __init lager_add_standard_devices(void)
27{
28 /* clocks are setup late during boot in the case of DT */
29 r8a7790_clock_init();
30
31 r8a7790_add_dt_devices();
32 of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
33}
34
35static const char *lager_boards_compat_dt[] __initdata = {
36 "renesas,lager-reference",
37 NULL,
38};
39
40DT_MACHINE_START(LAGER_DT, "lager")
41 .init_early = r8a7790_init_delay,
42 .init_machine = lager_add_standard_devices,
43 .init_time = r8a7790_timer_init,
44 .dt_compat = lager_boards_compat_dt,
45MACHINE_END
diff --git a/arch/arm/mach-shmobile/board-lager.c b/arch/arm/mach-shmobile/board-lager.c
index 8d6bd5c5efb9..ffb6f0ac7606 100644
--- a/arch/arm/mach-shmobile/board-lager.c
+++ b/arch/arm/mach-shmobile/board-lager.c
@@ -22,13 +22,18 @@
22#include <linux/gpio_keys.h> 22#include <linux/gpio_keys.h>
23#include <linux/input.h> 23#include <linux/input.h>
24#include <linux/interrupt.h> 24#include <linux/interrupt.h>
25#include <linux/irqchip.h>
26#include <linux/kernel.h> 25#include <linux/kernel.h>
27#include <linux/leds.h> 26#include <linux/leds.h>
27#include <linux/mmc/host.h>
28#include <linux/mmc/sh_mmcif.h>
28#include <linux/pinctrl/machine.h> 29#include <linux/pinctrl/machine.h>
29#include <linux/platform_data/gpio-rcar.h> 30#include <linux/platform_data/gpio-rcar.h>
30#include <linux/platform_device.h> 31#include <linux/platform_device.h>
32#include <linux/regulator/fixed.h>
33#include <linux/regulator/machine.h>
34#include <linux/sh_eth.h>
31#include <mach/common.h> 35#include <mach/common.h>
36#include <mach/irqs.h>
32#include <mach/r8a7790.h> 37#include <mach/r8a7790.h>
33#include <asm/mach-types.h> 38#include <asm/mach-types.h>
34#include <asm/mach/arch.h> 39#include <asm/mach/arch.h>
@@ -71,6 +76,35 @@ static __initdata struct gpio_keys_platform_data lager_keys_pdata = {
71 .nbuttons = ARRAY_SIZE(gpio_buttons), 76 .nbuttons = ARRAY_SIZE(gpio_buttons),
72}; 77};
73 78
79/* Fixed 3.3V regulator to be used by MMCIF */
80static struct regulator_consumer_supply fixed3v3_power_consumers[] =
81{
82 REGULATOR_SUPPLY("vmmc", "sh_mmcif.1"),
83};
84
85/* MMCIF */
86static struct sh_mmcif_plat_data mmcif1_pdata __initdata = {
87 .caps = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE,
88};
89
90static struct resource mmcif1_resources[] __initdata = {
91 DEFINE_RES_MEM_NAMED(0xee220000, 0x80, "MMCIF1"),
92 DEFINE_RES_IRQ(gic_spi(170)),
93};
94
95/* Ether */
96static struct sh_eth_plat_data ether_pdata __initdata = {
97 .phy = 0x1,
98 .edmac_endian = EDMAC_LITTLE_ENDIAN,
99 .phy_interface = PHY_INTERFACE_MODE_RMII,
100 .ether_link_active_low = 1,
101};
102
103static struct resource ether_resources[] __initdata = {
104 DEFINE_RES_MEM(0xee700000, 0x400),
105 DEFINE_RES_IRQ(gic_spi(162)),
106};
107
74static const struct pinctrl_map lager_pinctrl_map[] = { 108static const struct pinctrl_map lager_pinctrl_map[] = {
75 /* SCIF0 (CN19: DEBUG SERIAL0) */ 109 /* SCIF0 (CN19: DEBUG SERIAL0) */
76 PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.6", "pfc-r8a7790", 110 PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.6", "pfc-r8a7790",
@@ -78,6 +112,20 @@ static const struct pinctrl_map lager_pinctrl_map[] = {
78 /* SCIF1 (CN20: DEBUG SERIAL1) */ 112 /* SCIF1 (CN20: DEBUG SERIAL1) */
79 PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.7", "pfc-r8a7790", 113 PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.7", "pfc-r8a7790",
80 "scif1_data", "scif1"), 114 "scif1_data", "scif1"),
115 /* MMCIF1 */
116 PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.1", "pfc-r8a7790",
117 "mmc1_data8", "mmc1"),
118 PIN_MAP_MUX_GROUP_DEFAULT("sh_mmcif.1", "pfc-r8a7790",
119 "mmc1_ctrl", "mmc1"),
120 /* Ether */
121 PIN_MAP_MUX_GROUP_DEFAULT("r8a7790-ether", "pfc-r8a7790",
122 "eth_link", "eth"),
123 PIN_MAP_MUX_GROUP_DEFAULT("r8a7790-ether", "pfc-r8a7790",
124 "eth_mdio", "eth"),
125 PIN_MAP_MUX_GROUP_DEFAULT("r8a7790-ether", "pfc-r8a7790",
126 "eth_rmii", "eth"),
127 PIN_MAP_MUX_GROUP_DEFAULT("r8a7790-ether", "pfc-r8a7790",
128 "intc_irq0", "intc"),
81}; 129};
82 130
83static void __init lager_add_standard_devices(void) 131static void __init lager_add_standard_devices(void)
@@ -95,6 +143,16 @@ static void __init lager_add_standard_devices(void)
95 platform_device_register_data(&platform_bus, "gpio-keys", -1, 143 platform_device_register_data(&platform_bus, "gpio-keys", -1,
96 &lager_keys_pdata, 144 &lager_keys_pdata,
97 sizeof(lager_keys_pdata)); 145 sizeof(lager_keys_pdata));
146 regulator_register_always_on(0, "fixed-3.3V", fixed3v3_power_consumers,
147 ARRAY_SIZE(fixed3v3_power_consumers), 3300000);
148 platform_device_register_resndata(&platform_bus, "sh_mmcif", 1,
149 mmcif1_resources, ARRAY_SIZE(mmcif1_resources),
150 &mmcif1_pdata, sizeof(mmcif1_pdata));
151
152 platform_device_register_resndata(&platform_bus, "r8a7790-ether", -1,
153 ether_resources,
154 ARRAY_SIZE(ether_resources),
155 &ether_pdata, sizeof(ether_pdata));
98} 156}
99 157
100static const char *lager_boards_compat_dt[] __initdata = { 158static const char *lager_boards_compat_dt[] __initdata = {
@@ -103,7 +161,7 @@ static const char *lager_boards_compat_dt[] __initdata = {
103}; 161};
104 162
105DT_MACHINE_START(LAGER_DT, "lager") 163DT_MACHINE_START(LAGER_DT, "lager")
106 .init_irq = irqchip_init, 164 .init_early = r8a7790_init_delay,
107 .init_time = r8a7790_timer_init, 165 .init_time = r8a7790_timer_init,
108 .init_machine = lager_add_standard_devices, 166 .init_machine = lager_add_standard_devices,
109 .dt_compat = lager_boards_compat_dt, 167 .dt_compat = lager_boards_compat_dt,
diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c
index 85f51a849a50..af06753eb809 100644
--- a/arch/arm/mach-shmobile/board-mackerel.c
+++ b/arch/arm/mach-shmobile/board-mackerel.c
@@ -41,6 +41,7 @@
41#include <linux/mtd/physmap.h> 41#include <linux/mtd/physmap.h>
42#include <linux/mtd/sh_flctl.h> 42#include <linux/mtd/sh_flctl.h>
43#include <linux/pinctrl/machine.h> 43#include <linux/pinctrl/machine.h>
44#include <linux/platform_data/gpio_backlight.h>
44#include <linux/pm_clock.h> 45#include <linux/pm_clock.h>
45#include <linux/regulator/fixed.h> 46#include <linux/regulator/fixed.h>
46#include <linux/regulator/machine.h> 47#include <linux/regulator/machine.h>
@@ -49,7 +50,6 @@
49#include <linux/tca6416_keypad.h> 50#include <linux/tca6416_keypad.h>
50#include <linux/usb/renesas_usbhs.h> 51#include <linux/usb/renesas_usbhs.h>
51#include <linux/dma-mapping.h> 52#include <linux/dma-mapping.h>
52
53#include <video/sh_mobile_hdmi.h> 53#include <video/sh_mobile_hdmi.h>
54#include <video/sh_mobile_lcdc.h> 54#include <video/sh_mobile_lcdc.h>
55#include <media/sh_mobile_ceu.h> 55#include <media/sh_mobile_ceu.h>
@@ -346,7 +346,7 @@ static struct platform_device meram_device = {
346 }, 346 },
347}; 347};
348 348
349/* LCDC */ 349/* LCDC and backlight */
350static struct fb_videomode mackerel_lcdc_modes[] = { 350static struct fb_videomode mackerel_lcdc_modes[] = {
351 { 351 {
352 .name = "WVGA Panel", 352 .name = "WVGA Panel",
@@ -362,13 +362,6 @@ static struct fb_videomode mackerel_lcdc_modes[] = {
362 }, 362 },
363}; 363};
364 364
365static int mackerel_set_brightness(int brightness)
366{
367 gpio_set_value(31, brightness);
368
369 return 0;
370}
371
372static const struct sh_mobile_meram_cfg lcd_meram_cfg = { 365static const struct sh_mobile_meram_cfg lcd_meram_cfg = {
373 .icb[0] = { 366 .icb[0] = {
374 .meram_size = 0x40, 367 .meram_size = 0x40,
@@ -393,11 +386,6 @@ static struct sh_mobile_lcdc_info lcdc_info = {
393 .width = 152, 386 .width = 152,
394 .height = 91, 387 .height = 91,
395 }, 388 },
396 .bl_info = {
397 .name = "sh_mobile_lcdc_bl",
398 .max_brightness = 1,
399 .set_brightness = mackerel_set_brightness,
400 },
401 .meram_cfg = &lcd_meram_cfg, 389 .meram_cfg = &lcd_meram_cfg,
402 } 390 }
403}; 391};
@@ -425,6 +413,20 @@ static struct platform_device lcdc_device = {
425 }, 413 },
426}; 414};
427 415
416static struct gpio_backlight_platform_data gpio_backlight_data = {
417 .fbdev = &lcdc_device.dev,
418 .gpio = 31,
419 .def_value = 1,
420 .name = "backlight",
421};
422
423static struct platform_device gpio_backlight_device = {
424 .name = "gpio-backlight",
425 .dev = {
426 .platform_data = &gpio_backlight_data,
427 },
428};
429
428/* HDMI */ 430/* HDMI */
429static struct sh_mobile_hdmi_info hdmi_info = { 431static struct sh_mobile_hdmi_info hdmi_info = {
430 .flags = HDMI_SND_SRC_SPDIF, 432 .flags = HDMI_SND_SRC_SPDIF,
@@ -1231,6 +1233,7 @@ static struct platform_device *mackerel_devices[] __initdata = {
1231 &nor_flash_device, 1233 &nor_flash_device,
1232 &smc911x_device, 1234 &smc911x_device,
1233 &lcdc_device, 1235 &lcdc_device,
1236 &gpio_backlight_device,
1234 &usbhs0_device, 1237 &usbhs0_device,
1235 &usbhs1_device, 1238 &usbhs1_device,
1236 &leds_device, 1239 &leds_device,
@@ -1441,9 +1444,6 @@ static void __init mackerel_init(void)
1441 ARRAY_SIZE(mackerel_pinctrl_map)); 1444 ARRAY_SIZE(mackerel_pinctrl_map));
1442 sh7372_pinmux_init(); 1445 sh7372_pinmux_init();
1443 1446
1444 /* backlight, off by default */
1445 gpio_request_one(31, GPIOF_OUT_INIT_LOW, NULL);
1446
1447 gpio_request_one(151, GPIOF_OUT_INIT_HIGH, NULL); /* LCDDON */ 1447 gpio_request_one(151, GPIOF_OUT_INIT_HIGH, NULL); /* LCDDON */
1448 1448
1449 /* USBHS0 */ 1449 /* USBHS0 */
diff --git a/arch/arm/mach-shmobile/board-marzen-reference.c b/arch/arm/mach-shmobile/board-marzen-reference.c
index 480d882e42c7..3f4250a2d4eb 100644
--- a/arch/arm/mach-shmobile/board-marzen-reference.c
+++ b/arch/arm/mach-shmobile/board-marzen-reference.c
@@ -19,42 +19,14 @@
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 */ 20 */
21 21
22#include <linux/pinctrl/machine.h>
23#include <mach/r8a7779.h> 22#include <mach/r8a7779.h>
24#include <mach/common.h> 23#include <mach/common.h>
25#include <mach/irqs.h> 24#include <mach/irqs.h>
26#include <asm/irq.h> 25#include <asm/irq.h>
27#include <asm/mach/arch.h> 26#include <asm/mach/arch.h>
28 27
29static const struct pinctrl_map marzen_pinctrl_map[] = {
30 /* SCIF2 (CN18: DEBUG0) */
31 PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.2", "pfc-r8a7779",
32 "scif2_data_c", "scif2"),
33 /* SCIF4 (CN19: DEBUG1) */
34 PIN_MAP_MUX_GROUP_DEFAULT("sh-sci.4", "pfc-r8a7779",
35 "scif4_data", "scif4"),
36 /* SDHI0 */
37 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7779",
38 "sdhi0_data4", "sdhi0"),
39 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7779",
40 "sdhi0_ctrl", "sdhi0"),
41 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7779",
42 "sdhi0_cd", "sdhi0"),
43 PIN_MAP_MUX_GROUP_DEFAULT("sh_mobile_sdhi.0", "pfc-r8a7779",
44 "sdhi0_wp", "sdhi0"),
45 /* SMSC */
46 PIN_MAP_MUX_GROUP_DEFAULT("smsc911x", "pfc-r8a7779",
47 "intc_irq1_b", "intc"),
48 PIN_MAP_MUX_GROUP_DEFAULT("smsc911x", "pfc-r8a7779",
49 "lbsc_ex_cs0", "lbsc"),
50};
51
52static void __init marzen_init(void) 28static void __init marzen_init(void)
53{ 29{
54 pinctrl_register_mappings(marzen_pinctrl_map,
55 ARRAY_SIZE(marzen_pinctrl_map));
56 r8a7779_pinmux_init();
57
58 r8a7779_add_standard_devices_dt(); 30 r8a7779_add_standard_devices_dt();
59} 31}
60 32
@@ -70,6 +42,5 @@ DT_MACHINE_START(MARZEN, "marzen")
70 .nr_irqs = NR_IRQS_LEGACY, 42 .nr_irqs = NR_IRQS_LEGACY,
71 .init_irq = r8a7779_init_irq_dt, 43 .init_irq = r8a7779_init_irq_dt,
72 .init_machine = marzen_init, 44 .init_machine = marzen_init,
73 .init_time = shmobile_timer_init,
74 .dt_compat = marzen_boards_compat_dt, 45 .dt_compat = marzen_boards_compat_dt,
75MACHINE_END 46MACHINE_END
diff --git a/arch/arm/mach-shmobile/board-marzen.c b/arch/arm/mach-shmobile/board-marzen.c
index a7d1010505bf..3f5044fda4e3 100644
--- a/arch/arm/mach-shmobile/board-marzen.c
+++ b/arch/arm/mach-shmobile/board-marzen.c
@@ -1,8 +1,9 @@
1/* 1/*
2 * marzen board support 2 * marzen board support
3 * 3 *
4 * Copyright (C) 2011 Renesas Solutions Corp. 4 * Copyright (C) 2011, 2013 Renesas Solutions Corp.
5 * Copyright (C) 2011 Magnus Damm 5 * Copyright (C) 2011 Magnus Damm
6 * Copyright (C) 2013 Cogent Embedded, Inc.
6 * 7 *
7 * This program is free software; you can redistribute it and/or modify 8 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by 9 * it under the terms of the GNU General Public License as published by
@@ -29,6 +30,7 @@
29#include <linux/dma-mapping.h> 30#include <linux/dma-mapping.h>
30#include <linux/pinctrl/machine.h> 31#include <linux/pinctrl/machine.h>
31#include <linux/platform_data/gpio-rcar.h> 32#include <linux/platform_data/gpio-rcar.h>
33#include <linux/platform_data/usb-rcar-phy.h>
32#include <linux/regulator/fixed.h> 34#include <linux/regulator/fixed.h>
33#include <linux/regulator/machine.h> 35#include <linux/regulator/machine.h>
34#include <linux/smsc911x.h> 36#include <linux/smsc911x.h>
@@ -37,7 +39,7 @@
37#include <linux/mmc/host.h> 39#include <linux/mmc/host.h>
38#include <linux/mmc/sh_mobile_sdhi.h> 40#include <linux/mmc/sh_mobile_sdhi.h>
39#include <linux/mfd/tmio.h> 41#include <linux/mfd/tmio.h>
40#include <mach/hardware.h> 42#include <media/soc_camera.h>
41#include <mach/r8a7779.h> 43#include <mach/r8a7779.h>
42#include <mach/common.h> 44#include <mach/common.h>
43#include <mach/irqs.h> 45#include <mach/irqs.h>
@@ -57,7 +59,26 @@ static struct regulator_consumer_supply dummy_supplies[] = {
57 REGULATOR_SUPPLY("vdd33a", "smsc911x"), 59 REGULATOR_SUPPLY("vdd33a", "smsc911x"),
58}; 60};
59 61
60static struct rcar_phy_platform_data usb_phy_platform_data __initdata; 62/* USB PHY */
63static struct resource usb_phy_resources[] = {
64 [0] = {
65 .start = 0xffe70800,
66 .end = 0xffe70900 - 1,
67 .flags = IORESOURCE_MEM,
68 },
69};
70
71static struct rcar_phy_platform_data usb_phy_platform_data;
72
73static struct platform_device usb_phy = {
74 .name = "rcar_usb_phy",
75 .id = -1,
76 .dev = {
77 .platform_data = &usb_phy_platform_data,
78 },
79 .resource = usb_phy_resources,
80 .num_resources = ARRAY_SIZE(usb_phy_resources),
81};
61 82
62/* SMSC LAN89218 */ 83/* SMSC LAN89218 */
63static struct resource smsc911x_resources[] = { 84static struct resource smsc911x_resources[] = {
@@ -178,12 +199,41 @@ static struct platform_device leds_device = {
178 }, 199 },
179}; 200};
180 201
202static struct rcar_vin_platform_data vin_platform_data __initdata = {
203 .flags = RCAR_VIN_BT656,
204};
205
206#define MARZEN_CAMERA(idx) \
207static struct i2c_board_info camera##idx##_info = { \
208 I2C_BOARD_INFO("adv7180", 0x20 + (idx)), \
209}; \
210 \
211static struct soc_camera_link iclink##idx##_adv7180 = { \
212 .bus_id = 1 + 2 * (idx), \
213 .i2c_adapter_id = 0, \
214 .board_info = &camera##idx##_info, \
215}; \
216 \
217static struct platform_device camera##idx##_device = { \
218 .name = "soc-camera-pdrv", \
219 .id = idx, \
220 .dev = { \
221 .platform_data = &iclink##idx##_adv7180, \
222 }, \
223};
224
225MARZEN_CAMERA(0);
226MARZEN_CAMERA(1);
227
181static struct platform_device *marzen_devices[] __initdata = { 228static struct platform_device *marzen_devices[] __initdata = {
182 &eth_device, 229 &eth_device,
183 &sdhi0_device, 230 &sdhi0_device,
184 &thermal_device, 231 &thermal_device,
185 &hspi_device, 232 &hspi_device,
186 &leds_device, 233 &leds_device,
234 &usb_phy,
235 &camera0_device,
236 &camera1_device,
187}; 237};
188 238
189static const struct pinctrl_map marzen_pinctrl_map[] = { 239static const struct pinctrl_map marzen_pinctrl_map[] = {
@@ -219,6 +269,16 @@ static const struct pinctrl_map marzen_pinctrl_map[] = {
219 /* USB2 */ 269 /* USB2 */
220 PIN_MAP_MUX_GROUP_DEFAULT("ehci-platform.1", "pfc-r8a7779", 270 PIN_MAP_MUX_GROUP_DEFAULT("ehci-platform.1", "pfc-r8a7779",
221 "usb2", "usb2"), 271 "usb2", "usb2"),
272 /* VIN1 */
273 PIN_MAP_MUX_GROUP_DEFAULT("r8a7779-vin.1", "pfc-r8a7779",
274 "vin1_clk", "vin1"),
275 PIN_MAP_MUX_GROUP_DEFAULT("r8a7779-vin.1", "pfc-r8a7779",
276 "vin1_data8", "vin1"),
277 /* VIN3 */
278 PIN_MAP_MUX_GROUP_DEFAULT("r8a7779-vin.3", "pfc-r8a7779",
279 "vin3_clk", "vin3"),
280 PIN_MAP_MUX_GROUP_DEFAULT("r8a7779-vin.3", "pfc-r8a7779",
281 "vin3_data8", "vin3"),
222}; 282};
223 283
224static void __init marzen_init(void) 284static void __init marzen_init(void)
@@ -234,17 +294,23 @@ static void __init marzen_init(void)
234 r8a7779_init_irq_extpin(1); /* IRQ1 as individual interrupt */ 294 r8a7779_init_irq_extpin(1); /* IRQ1 as individual interrupt */
235 295
236 r8a7779_add_standard_devices(); 296 r8a7779_add_standard_devices();
237 r8a7779_add_usb_phy_device(&usb_phy_platform_data); 297 r8a7779_add_vin_device(1, &vin_platform_data);
298 r8a7779_add_vin_device(3, &vin_platform_data);
238 platform_add_devices(marzen_devices, ARRAY_SIZE(marzen_devices)); 299 platform_add_devices(marzen_devices, ARRAY_SIZE(marzen_devices));
239} 300}
240 301
241MACHINE_START(MARZEN, "marzen") 302static const char *marzen_boards_compat_dt[] __initdata = {
303 "renesas,marzen",
304 NULL,
305};
306
307DT_MACHINE_START(MARZEN, "marzen")
242 .smp = smp_ops(r8a7779_smp_ops), 308 .smp = smp_ops(r8a7779_smp_ops),
243 .map_io = r8a7779_map_io, 309 .map_io = r8a7779_map_io,
244 .init_early = r8a7779_add_early_devices, 310 .init_early = r8a7779_add_early_devices,
245 .nr_irqs = NR_IRQS_LEGACY, 311 .init_irq = r8a7779_init_irq_dt,
246 .init_irq = r8a7779_init_irq,
247 .init_machine = marzen_init, 312 .init_machine = marzen_init,
248 .init_late = r8a7779_init_late, 313 .init_late = r8a7779_init_late,
314 .dt_compat = marzen_boards_compat_dt,
249 .init_time = r8a7779_earlytimer_init, 315 .init_time = r8a7779_earlytimer_init,
250MACHINE_END 316MACHINE_END
diff --git a/arch/arm/mach-shmobile/clock-emev2.c b/arch/arm/mach-shmobile/clock-emev2.c
index 4710f1847bb7..5ac13ba71d54 100644
--- a/arch/arm/mach-shmobile/clock-emev2.c
+++ b/arch/arm/mach-shmobile/clock-emev2.c
@@ -40,7 +40,6 @@
40#define USIB2SCLKDIV 0x65c 40#define USIB2SCLKDIV 0x65c
41#define USIB3SCLKDIV 0x660 41#define USIB3SCLKDIV 0x660
42#define STI_CLKSEL 0x688 42#define STI_CLKSEL 0x688
43#define SMU_GENERAL_REG0 0x7c0
44 43
45/* not pretty, but hey */ 44/* not pretty, but hey */
46static void __iomem *smu_base; 45static void __iomem *smu_base;
@@ -51,11 +50,6 @@ static void emev2_smu_write(unsigned long value, int offs)
51 iowrite32(value, smu_base + offs); 50 iowrite32(value, smu_base + offs);
52} 51}
53 52
54void emev2_set_boot_vector(unsigned long value)
55{
56 emev2_smu_write(value, SMU_GENERAL_REG0);
57}
58
59static struct clk_mapping smu_mapping = { 53static struct clk_mapping smu_mapping = {
60 .phys = EMEV2_SMU_BASE, 54 .phys = EMEV2_SMU_BASE,
61 .len = PAGE_SIZE, 55 .len = PAGE_SIZE,
@@ -205,23 +199,11 @@ static struct clk_lookup lookups[] = {
205void __init emev2_clock_init(void) 199void __init emev2_clock_init(void)
206{ 200{
207 int k, ret = 0; 201 int k, ret = 0;
208 static int is_setup;
209
210 /* yuck, this is ugly as hell, but the non-smp case of clocks
211 * code is now designed to rely on ioremap() instead of static
212 * entity maps. in the case of smp we need access to the SMU
213 * register earlier than ioremap() is actually working without
214 * any static maps. to enable SMP in ugly but with dynamic
215 * mappings we have to call emev2_clock_init() from different
216 * places depending on UP and SMP...
217 */
218 if (is_setup++)
219 return;
220 202
221 smu_base = ioremap(EMEV2_SMU_BASE, PAGE_SIZE); 203 smu_base = ioremap(EMEV2_SMU_BASE, PAGE_SIZE);
222 BUG_ON(!smu_base); 204 BUG_ON(!smu_base);
223 205
224 /* setup STI timer to run on 37.768 kHz and deassert reset */ 206 /* setup STI timer to run on 32.768 kHz and deassert reset */
225 emev2_smu_write(0, STI_CLKSEL); 207 emev2_smu_write(0, STI_CLKSEL);
226 emev2_smu_write(1, STI_RSTCTRL); 208 emev2_smu_write(1, STI_RSTCTRL);
227 209
diff --git a/arch/arm/mach-shmobile/clock-r8a73a4.c b/arch/arm/mach-shmobile/clock-r8a73a4.c
index 5f7fe628b8a1..5bd2e851e3c7 100644
--- a/arch/arm/mach-shmobile/clock-r8a73a4.c
+++ b/arch/arm/mach-shmobile/clock-r8a73a4.c
@@ -30,10 +30,12 @@
30 30
31#define SMSTPCR2 0xe6150138 31#define SMSTPCR2 0xe6150138
32#define SMSTPCR3 0xe615013c 32#define SMSTPCR3 0xe615013c
33#define SMSTPCR4 0xe6150140
33#define SMSTPCR5 0xe6150144 34#define SMSTPCR5 0xe6150144
34 35
35#define FRQCRA 0xE6150000 36#define FRQCRA 0xE6150000
36#define FRQCRB 0xE6150004 37#define FRQCRB 0xE6150004
38#define FRQCRC 0xE61500E0
37#define VCLKCR1 0xE6150008 39#define VCLKCR1 0xE6150008
38#define VCLKCR2 0xE615000C 40#define VCLKCR2 0xE615000C
39#define VCLKCR3 0xE615001C 41#define VCLKCR3 0xE615001C
@@ -52,6 +54,7 @@
52#define HSICKCR 0xE615026C 54#define HSICKCR 0xE615026C
53#define M4CKCR 0xE6150098 55#define M4CKCR 0xE6150098
54#define PLLECR 0xE61500D0 56#define PLLECR 0xE61500D0
57#define PLL0CR 0xE61500D8
55#define PLL1CR 0xE6150028 58#define PLL1CR 0xE6150028
56#define PLL2CR 0xE615002C 59#define PLL2CR 0xE615002C
57#define PLL2SCR 0xE61501F4 60#define PLL2SCR 0xE61501F4
@@ -177,6 +180,7 @@ static struct sh_clk_ops pll_clk_ops = {
177 .mapping = &cpg_mapping, \ 180 .mapping = &cpg_mapping, \
178 } 181 }
179 182
183PLL_CLOCK(pll0_clk, &main_clk, pll_parent_main, 1, 20, PLL0CR, 0);
180PLL_CLOCK(pll1_clk, &main_clk, pll_parent_main, 1, 7, PLL1CR, 1); 184PLL_CLOCK(pll1_clk, &main_clk, pll_parent_main, 1, 7, PLL1CR, 1);
181PLL_CLOCK(pll2_clk, &main_div2_clk, pll_parent_main_extal, 3, 5, PLL2CR, 2); 185PLL_CLOCK(pll2_clk, &main_div2_clk, pll_parent_main_extal, 3, 5, PLL2CR, 2);
182PLL_CLOCK(pll2s_clk, &main_div2_clk, pll_parent_main_extal, 3, 5, PLL2SCR, 4); 186PLL_CLOCK(pll2s_clk, &main_div2_clk, pll_parent_main_extal, 3, 5, PLL2SCR, 4);
@@ -184,6 +188,157 @@ PLL_CLOCK(pll2h_clk, &main_div2_clk, pll_parent_main_extal, 3, 5, PLL2HCR, 5);
184 188
185SH_FIXED_RATIO_CLK(pll1_div2_clk, pll1_clk, div2); 189SH_FIXED_RATIO_CLK(pll1_div2_clk, pll1_clk, div2);
186 190
191static atomic_t frqcr_lock;
192
193/* Several clocks need to access FRQCRB, have to lock */
194static bool frqcr_kick_check(struct clk *clk)
195{
196 return !(ioread32(CPG_MAP(FRQCRB)) & BIT(31));
197}
198
199static int frqcr_kick_do(struct clk *clk)
200{
201 int i;
202
203 /* set KICK bit in FRQCRB to update hardware setting, check success */
204 iowrite32(ioread32(CPG_MAP(FRQCRB)) | BIT(31), CPG_MAP(FRQCRB));
205 for (i = 1000; i; i--)
206 if (ioread32(CPG_MAP(FRQCRB)) & BIT(31))
207 cpu_relax();
208 else
209 return 0;
210
211 return -ETIMEDOUT;
212}
213
214static int zclk_set_rate(struct clk *clk, unsigned long rate)
215{
216 void __iomem *frqcrc;
217 int ret;
218 unsigned long step, p_rate;
219 u32 val;
220
221 if (!clk->parent || !__clk_get(clk->parent))
222 return -ENODEV;
223
224 if (!atomic_inc_and_test(&frqcr_lock) || !frqcr_kick_check(clk)) {
225 ret = -EBUSY;
226 goto done;
227 }
228
229 /*
230 * Users are supposed to first call clk_set_rate() only with
231 * clk_round_rate() results. So, we don't fix wrong rates here, but
232 * guard against them anyway
233 */
234
235 p_rate = clk_get_rate(clk->parent);
236 if (rate == p_rate) {
237 val = 0;
238 } else {
239 step = DIV_ROUND_CLOSEST(p_rate, 32);
240
241 if (rate > p_rate || rate < step) {
242 ret = -EINVAL;
243 goto done;
244 }
245
246 val = 32 - rate / step;
247 }
248
249 frqcrc = clk->mapped_reg + (FRQCRC - (u32)clk->enable_reg);
250
251 iowrite32((ioread32(frqcrc) & ~(clk->div_mask << clk->enable_bit)) |
252 (val << clk->enable_bit), frqcrc);
253
254 ret = frqcr_kick_do(clk);
255
256done:
257 atomic_dec(&frqcr_lock);
258 __clk_put(clk->parent);
259 return ret;
260}
261
262static long zclk_round_rate(struct clk *clk, unsigned long rate)
263{
264 /*
265 * theoretical rate = parent rate * multiplier / 32,
266 * where 1 <= multiplier <= 32. Therefore we should do
267 * multiplier = rate * 32 / parent rate
268 * rounded rate = parent rate * multiplier / 32.
269 * However, multiplication before division won't fit in 32 bits, so
270 * we sacrifice some precision by first dividing and then multiplying.
271 * To find the nearest divisor we calculate both and pick up the best
272 * one. This avoids 64-bit arithmetics.
273 */
274 unsigned long step, mul_min, mul_max, rate_min, rate_max;
275
276 rate_max = clk_get_rate(clk->parent);
277
278 /* output freq <= parent */
279 if (rate >= rate_max)
280 return rate_max;
281
282 step = DIV_ROUND_CLOSEST(rate_max, 32);
283 /* output freq >= parent / 32 */
284 if (step >= rate)
285 return step;
286
287 mul_min = rate / step;
288 mul_max = DIV_ROUND_UP(rate, step);
289 rate_min = step * mul_min;
290 if (mul_max == mul_min)
291 return rate_min;
292
293 rate_max = step * mul_max;
294
295 if (rate_max - rate < rate - rate_min)
296 return rate_max;
297
298 return rate_min;
299}
300
301static unsigned long zclk_recalc(struct clk *clk)
302{
303 void __iomem *frqcrc = FRQCRC - (u32)clk->enable_reg + clk->mapped_reg;
304 unsigned int max = clk->div_mask + 1;
305 unsigned long val = ((ioread32(frqcrc) >> clk->enable_bit) &
306 clk->div_mask);
307
308 return DIV_ROUND_CLOSEST(clk_get_rate(clk->parent), max) *
309 (max - val);
310}
311
312static struct sh_clk_ops zclk_ops = {
313 .recalc = zclk_recalc,
314 .set_rate = zclk_set_rate,
315 .round_rate = zclk_round_rate,
316};
317
318static struct clk z_clk = {
319 .parent = &pll0_clk,
320 .div_mask = 0x1f,
321 .enable_bit = 8,
322 /* We'll need to access FRQCRB and FRQCRC */
323 .enable_reg = (void __iomem *)FRQCRB,
324 .ops = &zclk_ops,
325};
326
327/*
328 * It seems only 1/2 divider is usable in manual mode. 1/2 / 2/3
329 * switching is only available in auto-DVFS mode
330 */
331SH_FIXED_RATIO_CLK(pll0_div2_clk, pll0_clk, div2);
332
333static struct clk z2_clk = {
334 .parent = &pll0_div2_clk,
335 .div_mask = 0x1f,
336 .enable_bit = 0,
337 /* We'll need to access FRQCRB and FRQCRC */
338 .enable_reg = (void __iomem *)FRQCRB,
339 .ops = &zclk_ops,
340};
341
187static struct clk *main_clks[] = { 342static struct clk *main_clks[] = {
188 &extalr_clk, 343 &extalr_clk,
189 &extal1_clk, 344 &extal1_clk,
@@ -195,22 +350,23 @@ static struct clk *main_clks[] = {
195 &main_div2_clk, 350 &main_div2_clk,
196 &fsiack_clk, 351 &fsiack_clk,
197 &fsibck_clk, 352 &fsibck_clk,
353 &pll0_clk,
198 &pll1_clk, 354 &pll1_clk,
199 &pll1_div2_clk, 355 &pll1_div2_clk,
200 &pll2_clk, 356 &pll2_clk,
201 &pll2s_clk, 357 &pll2s_clk,
202 &pll2h_clk, 358 &pll2h_clk,
359 &z_clk,
360 &pll0_div2_clk,
361 &z2_clk,
203}; 362};
204 363
205/* DIV4 */ 364/* DIV4 */
206static void div4_kick(struct clk *clk) 365static void div4_kick(struct clk *clk)
207{ 366{
208 unsigned long value; 367 if (!WARN(!atomic_inc_and_test(&frqcr_lock), "FRQCR* lock broken!\n"))
209 368 frqcr_kick_do(clk);
210 /* set KICK bit in FRQCRB to update hardware setting */ 369 atomic_dec(&frqcr_lock);
211 value = ioread32(CPG_MAP(FRQCRB));
212 value |= (1 << 31);
213 iowrite32(value, CPG_MAP(FRQCRB));
214} 370}
215 371
216static int divisors[] = { 2, 3, 4, 6, 8, 12, 16, 18, 24, 0, 36, 48, 10}; 372static int divisors[] = { 2, 3, 4, 6, 8, 12, 16, 18, 24, 0, 36, 48, 10};
@@ -349,8 +505,10 @@ static struct clk div6_clks[DIV6_NR] = {
349/* MSTP */ 505/* MSTP */
350enum { 506enum {
351 MSTP217, MSTP216, MSTP207, MSTP206, MSTP204, MSTP203, 507 MSTP217, MSTP216, MSTP207, MSTP206, MSTP204, MSTP203,
352 MSTP315, MSTP314, MSTP313, MSTP312, MSTP305, 508 MSTP329, MSTP323, MSTP318, MSTP317, MSTP316,
353 MSTP522, 509 MSTP315, MSTP314, MSTP313, MSTP312, MSTP305, MSTP300,
510 MSTP411, MSTP410, MSTP409,
511 MSTP522, MSTP515,
354 MSTP_NR 512 MSTP_NR
355}; 513};
356 514
@@ -361,12 +519,22 @@ static struct clk mstp_clks[MSTP_NR] = {
361 [MSTP207] = SH_CLK_MSTP32(&div6_clks[DIV6_MP], SMSTPCR2, 7, 0), /* SCIFB1 */ 519 [MSTP207] = SH_CLK_MSTP32(&div6_clks[DIV6_MP], SMSTPCR2, 7, 0), /* SCIFB1 */
362 [MSTP216] = SH_CLK_MSTP32(&div6_clks[DIV6_MP], SMSTPCR2, 16, 0), /* SCIFB2 */ 520 [MSTP216] = SH_CLK_MSTP32(&div6_clks[DIV6_MP], SMSTPCR2, 16, 0), /* SCIFB2 */
363 [MSTP217] = SH_CLK_MSTP32(&div6_clks[DIV6_MP], SMSTPCR2, 17, 0), /* SCIFB3 */ 521 [MSTP217] = SH_CLK_MSTP32(&div6_clks[DIV6_MP], SMSTPCR2, 17, 0), /* SCIFB3 */
522 [MSTP300] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR3, 0, 0), /* IIC2 */
364 [MSTP305] = SH_CLK_MSTP32(&div6_clks[DIV6_MMC1],SMSTPCR3, 5, 0), /* MMCIF1 */ 523 [MSTP305] = SH_CLK_MSTP32(&div6_clks[DIV6_MMC1],SMSTPCR3, 5, 0), /* MMCIF1 */
365 [MSTP312] = SH_CLK_MSTP32(&div6_clks[DIV6_SDHI2],SMSTPCR3, 12, 0), /* SDHI2 */ 524 [MSTP312] = SH_CLK_MSTP32(&div6_clks[DIV6_SDHI2],SMSTPCR3, 12, 0), /* SDHI2 */
366 [MSTP313] = SH_CLK_MSTP32(&div6_clks[DIV6_SDHI1],SMSTPCR3, 13, 0), /* SDHI1 */ 525 [MSTP313] = SH_CLK_MSTP32(&div6_clks[DIV6_SDHI1],SMSTPCR3, 13, 0), /* SDHI1 */
367 [MSTP314] = SH_CLK_MSTP32(&div6_clks[DIV6_SDHI0],SMSTPCR3, 14, 0), /* SDHI0 */ 526 [MSTP314] = SH_CLK_MSTP32(&div6_clks[DIV6_SDHI0],SMSTPCR3, 14, 0), /* SDHI0 */
368 [MSTP315] = SH_CLK_MSTP32(&div6_clks[DIV6_MMC0],SMSTPCR3, 15, 0), /* MMCIF0 */ 527 [MSTP315] = SH_CLK_MSTP32(&div6_clks[DIV6_MMC0],SMSTPCR3, 15, 0), /* MMCIF0 */
528 [MSTP316] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR3, 16, 0), /* IIC6 */
529 [MSTP317] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR3, 17, 0), /* IIC7 */
530 [MSTP318] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR3, 18, 0), /* IIC0 */
531 [MSTP323] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR3, 23, 0), /* IIC1 */
532 [MSTP329] = SH_CLK_MSTP32(&extalr_clk, SMSTPCR3, 29, 0), /* CMT10 */
533 [MSTP409] = SH_CLK_MSTP32(&main_div2_clk, SMSTPCR4, 9, 0), /* IIC5 */
534 [MSTP410] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR4, 10, 0), /* IIC4 */
535 [MSTP411] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR4, 11, 0), /* IIC3 */
369 [MSTP522] = SH_CLK_MSTP32(&extal2_clk, SMSTPCR5, 22, 0), /* Thermal */ 536 [MSTP522] = SH_CLK_MSTP32(&extal2_clk, SMSTPCR5, 22, 0), /* Thermal */
537 [MSTP515] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR5, 15, 0), /* IIC8 */
370}; 538};
371 539
372static struct clk_lookup lookups[] = { 540static struct clk_lookup lookups[] = {
@@ -386,6 +554,9 @@ static struct clk_lookup lookups[] = {
386 CLKDEV_CON_ID("pll2s", &pll2s_clk), 554 CLKDEV_CON_ID("pll2s", &pll2s_clk),
387 CLKDEV_CON_ID("pll2h", &pll2h_clk), 555 CLKDEV_CON_ID("pll2h", &pll2h_clk),
388 556
557 /* CPU clock */
558 CLKDEV_DEV_ID("cpu0", &z_clk),
559
389 /* DIV6 */ 560 /* DIV6 */
390 CLKDEV_CON_ID("zb", &div6_clks[DIV6_ZB]), 561 CLKDEV_CON_ID("zb", &div6_clks[DIV6_ZB]),
391 CLKDEV_CON_ID("vck1", &div6_clks[DIV6_VCK1]), 562 CLKDEV_CON_ID("vck1", &div6_clks[DIV6_VCK1]),
@@ -408,6 +579,7 @@ static struct clk_lookup lookups[] = {
408 CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP216]), 579 CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP216]),
409 CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP217]), 580 CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP217]),
410 CLKDEV_DEV_ID("rcar_thermal", &mstp_clks[MSTP522]), 581 CLKDEV_DEV_ID("rcar_thermal", &mstp_clks[MSTP522]),
582 CLKDEV_DEV_ID("e6520000.i2c", &mstp_clks[MSTP300]),
411 CLKDEV_DEV_ID("sh_mmcif.1", &mstp_clks[MSTP305]), 583 CLKDEV_DEV_ID("sh_mmcif.1", &mstp_clks[MSTP305]),
412 CLKDEV_DEV_ID("ee220000.mmcif", &mstp_clks[MSTP305]), 584 CLKDEV_DEV_ID("ee220000.mmcif", &mstp_clks[MSTP305]),
413 CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP312]), 585 CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP312]),
@@ -418,6 +590,15 @@ static struct clk_lookup lookups[] = {
418 CLKDEV_DEV_ID("ee100000.sdhi", &mstp_clks[MSTP314]), 590 CLKDEV_DEV_ID("ee100000.sdhi", &mstp_clks[MSTP314]),
419 CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP315]), 591 CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP315]),
420 CLKDEV_DEV_ID("ee200000.mmcif", &mstp_clks[MSTP315]), 592 CLKDEV_DEV_ID("ee200000.mmcif", &mstp_clks[MSTP315]),
593 CLKDEV_DEV_ID("e6550000.i2c", &mstp_clks[MSTP316]),
594 CLKDEV_DEV_ID("e6560000.i2c", &mstp_clks[MSTP317]),
595 CLKDEV_DEV_ID("e6500000.i2c", &mstp_clks[MSTP318]),
596 CLKDEV_DEV_ID("e6510000.i2c", &mstp_clks[MSTP323]),
597 CLKDEV_DEV_ID("sh_cmt.10", &mstp_clks[MSTP329]),
598 CLKDEV_DEV_ID("e60b0000.i2c", &mstp_clks[MSTP409]),
599 CLKDEV_DEV_ID("e6540000.i2c", &mstp_clks[MSTP410]),
600 CLKDEV_DEV_ID("e6530000.i2c", &mstp_clks[MSTP411]),
601 CLKDEV_DEV_ID("e6570000.i2c", &mstp_clks[MSTP515]),
421 602
422 /* for DT */ 603 /* for DT */
423 CLKDEV_DEV_ID("e61f0000.thermal", &mstp_clks[MSTP522]), 604 CLKDEV_DEV_ID("e61f0000.thermal", &mstp_clks[MSTP522]),
@@ -429,6 +610,8 @@ void __init r8a73a4_clock_init(void)
429 int k, ret = 0; 610 int k, ret = 0;
430 u32 ckscr; 611 u32 ckscr;
431 612
613 atomic_set(&frqcr_lock, -1);
614
432 reg = ioremap_nocache(CKSCR, PAGE_SIZE); 615 reg = ioremap_nocache(CKSCR, PAGE_SIZE);
433 BUG_ON(!reg); 616 BUG_ON(!reg);
434 ckscr = ioread32(reg); 617 ckscr = ioread32(reg);
diff --git a/arch/arm/mach-shmobile/clock-r8a7740.c b/arch/arm/mach-shmobile/clock-r8a7740.c
index de10fd78bf2b..c826bca4024e 100644
--- a/arch/arm/mach-shmobile/clock-r8a7740.c
+++ b/arch/arm/mach-shmobile/clock-r8a7740.c
@@ -596,7 +596,8 @@ static struct clk_lookup lookups[] = {
596 CLKDEV_DEV_ID("e6bd0000.mmcif", &mstp_clks[MSTP312]), 596 CLKDEV_DEV_ID("e6bd0000.mmcif", &mstp_clks[MSTP312]),
597 CLKDEV_DEV_ID("r8a7740-gether", &mstp_clks[MSTP309]), 597 CLKDEV_DEV_ID("r8a7740-gether", &mstp_clks[MSTP309]),
598 CLKDEV_DEV_ID("e9a00000.sh-eth", &mstp_clks[MSTP309]), 598 CLKDEV_DEV_ID("e9a00000.sh-eth", &mstp_clks[MSTP309]),
599 CLKDEV_DEV_ID("renesas_tpu_pwm", &mstp_clks[MSTP304]), 599 CLKDEV_DEV_ID("renesas-tpu-pwm", &mstp_clks[MSTP304]),
600 CLKDEV_DEV_ID("e6600000.pwm", &mstp_clks[MSTP304]),
600 601
601 CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP415]), 602 CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP415]),
602 CLKDEV_DEV_ID("e6870000.sdhi", &mstp_clks[MSTP415]), 603 CLKDEV_DEV_ID("e6870000.sdhi", &mstp_clks[MSTP415]),
diff --git a/arch/arm/mach-shmobile/clock-r8a7778.c b/arch/arm/mach-shmobile/clock-r8a7778.c
index a0e9eb72e46d..c4bf2d8fb111 100644
--- a/arch/arm/mach-shmobile/clock-r8a7778.c
+++ b/arch/arm/mach-shmobile/clock-r8a7778.c
@@ -106,6 +106,7 @@ enum {
106 MSTP331, 106 MSTP331,
107 MSTP323, MSTP322, MSTP321, 107 MSTP323, MSTP322, MSTP321,
108 MSTP114, 108 MSTP114,
109 MSTP110, MSTP109,
109 MSTP100, 110 MSTP100,
110 MSTP030, 111 MSTP030,
111 MSTP029, MSTP028, MSTP027, MSTP026, MSTP025, MSTP024, MSTP023, MSTP022, MSTP021, 112 MSTP029, MSTP028, MSTP027, MSTP026, MSTP025, MSTP024, MSTP023, MSTP022, MSTP021,
@@ -119,6 +120,8 @@ static struct clk mstp_clks[MSTP_NR] = {
119 [MSTP322] = SH_CLK_MSTP32(&p_clk, MSTPCR3, 22, 0), /* SDHI1 */ 120 [MSTP322] = SH_CLK_MSTP32(&p_clk, MSTPCR3, 22, 0), /* SDHI1 */
120 [MSTP321] = SH_CLK_MSTP32(&p_clk, MSTPCR3, 21, 0), /* SDHI2 */ 121 [MSTP321] = SH_CLK_MSTP32(&p_clk, MSTPCR3, 21, 0), /* SDHI2 */
121 [MSTP114] = SH_CLK_MSTP32(&p_clk, MSTPCR1, 14, 0), /* Ether */ 122 [MSTP114] = SH_CLK_MSTP32(&p_clk, MSTPCR1, 14, 0), /* Ether */
123 [MSTP110] = SH_CLK_MSTP32(&s_clk, MSTPCR1, 10, 0), /* VIN0 */
124 [MSTP109] = SH_CLK_MSTP32(&s_clk, MSTPCR1, 9, 0), /* VIN1 */
122 [MSTP100] = SH_CLK_MSTP32(&p_clk, MSTPCR1, 0, 0), /* USB0/1 */ 125 [MSTP100] = SH_CLK_MSTP32(&p_clk, MSTPCR1, 0, 0), /* USB0/1 */
123 [MSTP030] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 30, 0), /* I2C0 */ 126 [MSTP030] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 30, 0), /* I2C0 */
124 [MSTP029] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 29, 0), /* I2C1 */ 127 [MSTP029] = SH_CLK_MSTP32(&p_clk, MSTPCR0, 29, 0), /* I2C1 */
@@ -146,6 +149,8 @@ static struct clk_lookup lookups[] = {
146 CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP322]), /* SDHI1 */ 149 CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP322]), /* SDHI1 */
147 CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP321]), /* SDHI2 */ 150 CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP321]), /* SDHI2 */
148 CLKDEV_DEV_ID("r8a777x-ether", &mstp_clks[MSTP114]), /* Ether */ 151 CLKDEV_DEV_ID("r8a777x-ether", &mstp_clks[MSTP114]), /* Ether */
152 CLKDEV_DEV_ID("r8a7778-vin.0", &mstp_clks[MSTP110]), /* VIN0 */
153 CLKDEV_DEV_ID("r8a7778-vin.1", &mstp_clks[MSTP109]), /* VIN1 */
149 CLKDEV_DEV_ID("ehci-platform", &mstp_clks[MSTP100]), /* USB EHCI port0/1 */ 154 CLKDEV_DEV_ID("ehci-platform", &mstp_clks[MSTP100]), /* USB EHCI port0/1 */
150 CLKDEV_DEV_ID("ohci-platform", &mstp_clks[MSTP100]), /* USB OHCI port0/1 */ 155 CLKDEV_DEV_ID("ohci-platform", &mstp_clks[MSTP100]), /* USB OHCI port0/1 */
151 CLKDEV_DEV_ID("i2c-rcar.0", &mstp_clks[MSTP030]), /* I2C0 */ 156 CLKDEV_DEV_ID("i2c-rcar.0", &mstp_clks[MSTP030]), /* I2C0 */
diff --git a/arch/arm/mach-shmobile/clock-r8a7779.c b/arch/arm/mach-shmobile/clock-r8a7779.c
index 10340f5becbb..bd6ad922eb7e 100644
--- a/arch/arm/mach-shmobile/clock-r8a7779.c
+++ b/arch/arm/mach-shmobile/clock-r8a7779.c
@@ -112,7 +112,9 @@ static struct clk *main_clks[] = {
112}; 112};
113 113
114enum { MSTP323, MSTP322, MSTP321, MSTP320, 114enum { MSTP323, MSTP322, MSTP321, MSTP320,
115 MSTP120,
115 MSTP116, MSTP115, MSTP114, 116 MSTP116, MSTP115, MSTP114,
117 MSTP110, MSTP109, MSTP108,
116 MSTP103, MSTP101, MSTP100, 118 MSTP103, MSTP101, MSTP100,
117 MSTP030, 119 MSTP030,
118 MSTP029, MSTP028, MSTP027, MSTP026, MSTP025, MSTP024, MSTP023, MSTP022, MSTP021, 120 MSTP029, MSTP028, MSTP027, MSTP026, MSTP025, MSTP024, MSTP023, MSTP022, MSTP021,
@@ -125,9 +127,13 @@ static struct clk mstp_clks[MSTP_NR] = {
125 [MSTP322] = SH_CLK_MSTP32(&clkp_clk, MSTPCR3, 22, 0), /* SDHI1 */ 127 [MSTP322] = SH_CLK_MSTP32(&clkp_clk, MSTPCR3, 22, 0), /* SDHI1 */
126 [MSTP321] = SH_CLK_MSTP32(&clkp_clk, MSTPCR3, 21, 0), /* SDHI2 */ 128 [MSTP321] = SH_CLK_MSTP32(&clkp_clk, MSTPCR3, 21, 0), /* SDHI2 */
127 [MSTP320] = SH_CLK_MSTP32(&clkp_clk, MSTPCR3, 20, 0), /* SDHI3 */ 129 [MSTP320] = SH_CLK_MSTP32(&clkp_clk, MSTPCR3, 20, 0), /* SDHI3 */
130 [MSTP120] = SH_CLK_MSTP32(&clks_clk, MSTPCR1, 20, 0), /* VIN3 */
128 [MSTP116] = SH_CLK_MSTP32(&clkp_clk, MSTPCR1, 16, 0), /* PCIe */ 131 [MSTP116] = SH_CLK_MSTP32(&clkp_clk, MSTPCR1, 16, 0), /* PCIe */
129 [MSTP115] = SH_CLK_MSTP32(&clkp_clk, MSTPCR1, 15, 0), /* SATA */ 132 [MSTP115] = SH_CLK_MSTP32(&clkp_clk, MSTPCR1, 15, 0), /* SATA */
130 [MSTP114] = SH_CLK_MSTP32(&clkp_clk, MSTPCR1, 14, 0), /* Ether */ 133 [MSTP114] = SH_CLK_MSTP32(&clkp_clk, MSTPCR1, 14, 0), /* Ether */
134 [MSTP110] = SH_CLK_MSTP32(&clks_clk, MSTPCR1, 10, 0), /* VIN0 */
135 [MSTP109] = SH_CLK_MSTP32(&clks_clk, MSTPCR1, 9, 0), /* VIN1 */
136 [MSTP108] = SH_CLK_MSTP32(&clks_clk, MSTPCR1, 8, 0), /* VIN2 */
131 [MSTP103] = SH_CLK_MSTP32(&clks_clk, MSTPCR1, 3, 0), /* DU */ 137 [MSTP103] = SH_CLK_MSTP32(&clks_clk, MSTPCR1, 3, 0), /* DU */
132 [MSTP101] = SH_CLK_MSTP32(&clkp_clk, MSTPCR1, 1, 0), /* USB2 */ 138 [MSTP101] = SH_CLK_MSTP32(&clkp_clk, MSTPCR1, 1, 0), /* USB2 */
133 [MSTP100] = SH_CLK_MSTP32(&clkp_clk, MSTPCR1, 0, 0), /* USB0/1 */ 139 [MSTP100] = SH_CLK_MSTP32(&clkp_clk, MSTPCR1, 0, 0), /* USB0/1 */
@@ -162,10 +168,14 @@ static struct clk_lookup lookups[] = {
162 CLKDEV_CON_ID("peripheral_clk", &clkp_clk), 168 CLKDEV_CON_ID("peripheral_clk", &clkp_clk),
163 169
164 /* MSTP32 clocks */ 170 /* MSTP32 clocks */
171 CLKDEV_DEV_ID("r8a7779-vin.3", &mstp_clks[MSTP120]), /* VIN3 */
165 CLKDEV_DEV_ID("rcar-pcie", &mstp_clks[MSTP116]), /* PCIe */ 172 CLKDEV_DEV_ID("rcar-pcie", &mstp_clks[MSTP116]), /* PCIe */
166 CLKDEV_DEV_ID("sata_rcar", &mstp_clks[MSTP115]), /* SATA */ 173 CLKDEV_DEV_ID("sata_rcar", &mstp_clks[MSTP115]), /* SATA */
167 CLKDEV_DEV_ID("fc600000.sata", &mstp_clks[MSTP115]), /* SATA w/DT */ 174 CLKDEV_DEV_ID("fc600000.sata", &mstp_clks[MSTP115]), /* SATA w/DT */
168 CLKDEV_DEV_ID("r8a777x-ether", &mstp_clks[MSTP114]), /* Ether */ 175 CLKDEV_DEV_ID("r8a777x-ether", &mstp_clks[MSTP114]), /* Ether */
176 CLKDEV_DEV_ID("r8a7779-vin.0", &mstp_clks[MSTP110]), /* VIN0 */
177 CLKDEV_DEV_ID("r8a7779-vin.1", &mstp_clks[MSTP109]), /* VIN1 */
178 CLKDEV_DEV_ID("r8a7779-vin.2", &mstp_clks[MSTP108]), /* VIN2 */
169 CLKDEV_DEV_ID("ehci-platform.1", &mstp_clks[MSTP101]), /* USB EHCI port2 */ 179 CLKDEV_DEV_ID("ehci-platform.1", &mstp_clks[MSTP101]), /* USB EHCI port2 */
170 CLKDEV_DEV_ID("ohci-platform.1", &mstp_clks[MSTP101]), /* USB OHCI port2 */ 180 CLKDEV_DEV_ID("ohci-platform.1", &mstp_clks[MSTP101]), /* USB OHCI port2 */
171 CLKDEV_DEV_ID("ehci-platform.0", &mstp_clks[MSTP100]), /* USB EHCI port0/1 */ 181 CLKDEV_DEV_ID("ehci-platform.0", &mstp_clks[MSTP100]), /* USB EHCI port0/1 */
diff --git a/arch/arm/mach-shmobile/clock-r8a7790.c b/arch/arm/mach-shmobile/clock-r8a7790.c
index 5d71313df52d..fc36d3db0b4d 100644
--- a/arch/arm/mach-shmobile/clock-r8a7790.c
+++ b/arch/arm/mach-shmobile/clock-r8a7790.c
@@ -24,6 +24,7 @@
24#include <linux/clkdev.h> 24#include <linux/clkdev.h>
25#include <mach/clock.h> 25#include <mach/clock.h>
26#include <mach/common.h> 26#include <mach/common.h>
27#include <mach/r8a7790.h>
27 28
28/* 29/*
29 * MD EXTAL PLL0 PLL1 PLL3 30 * MD EXTAL PLL0 PLL1 PLL3
@@ -42,16 +43,16 @@
42 * see "p1 / 2" on R8A7790_CLOCK_ROOT() below 43 * see "p1 / 2" on R8A7790_CLOCK_ROOT() below
43 */ 44 */
44 45
45#define MD(nr) (1 << nr)
46
47#define CPG_BASE 0xe6150000 46#define CPG_BASE 0xe6150000
48#define CPG_LEN 0x1000 47#define CPG_LEN 0x1000
49 48
49#define SMSTPCR1 0xe6150134
50#define SMSTPCR2 0xe6150138 50#define SMSTPCR2 0xe6150138
51#define SMSTPCR3 0xe615013c 51#define SMSTPCR3 0xe615013c
52#define SMSTPCR5 0xe6150144
52#define SMSTPCR7 0xe615014c 53#define SMSTPCR7 0xe615014c
54#define SMSTPCR8 0xe6150990
53 55
54#define MODEMR 0xE6160060
55#define SDCKCR 0xE6150074 56#define SDCKCR 0xE6150074
56#define SD2CKCR 0xE6150078 57#define SD2CKCR 0xE6150078
57#define SD3CKCR 0xE615007C 58#define SD3CKCR 0xE615007C
@@ -180,16 +181,23 @@ static struct clk div6_clks[DIV6_NR] = {
180 181
181/* MSTP */ 182/* MSTP */
182enum { 183enum {
184 MSTP813,
183 MSTP721, MSTP720, 185 MSTP721, MSTP720,
184 MSTP717, MSTP716, 186 MSTP717, MSTP716,
187 MSTP522,
185 MSTP315, MSTP314, MSTP313, MSTP312, MSTP311, MSTP305, MSTP304, 188 MSTP315, MSTP314, MSTP313, MSTP312, MSTP311, MSTP305, MSTP304,
186 MSTP216, MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, 189 MSTP216, MSTP207, MSTP206, MSTP204, MSTP203, MSTP202,
190 MSTP124,
187 MSTP_NR 191 MSTP_NR
188}; 192};
189 193
190static struct clk mstp_clks[MSTP_NR] = { 194static struct clk mstp_clks[MSTP_NR] = {
195 [MSTP813] = SH_CLK_MSTP32(&p_clk, SMSTPCR8, 13, 0), /* Ether */
191 [MSTP721] = SH_CLK_MSTP32(&p_clk, SMSTPCR7, 21, 0), /* SCIF0 */ 196 [MSTP721] = SH_CLK_MSTP32(&p_clk, SMSTPCR7, 21, 0), /* SCIF0 */
192 [MSTP720] = SH_CLK_MSTP32(&p_clk, SMSTPCR7, 20, 0), /* SCIF1 */ 197 [MSTP720] = SH_CLK_MSTP32(&p_clk, SMSTPCR7, 20, 0), /* SCIF1 */
198 [MSTP717] = SH_CLK_MSTP32(&zs_clk, SMSTPCR7, 17, 0), /* HSCIF0 */
199 [MSTP716] = SH_CLK_MSTP32(&zs_clk, SMSTPCR7, 16, 0), /* HSCIF1 */
200 [MSTP522] = SH_CLK_MSTP32(&extal_clk, SMSTPCR5, 22, 0), /* Thermal */
193 [MSTP315] = SH_CLK_MSTP32(&div6_clks[DIV6_MMC0], SMSTPCR3, 15, 0), /* MMC0 */ 201 [MSTP315] = SH_CLK_MSTP32(&div6_clks[DIV6_MMC0], SMSTPCR3, 15, 0), /* MMC0 */
194 [MSTP314] = SH_CLK_MSTP32(&div4_clks[DIV4_SD0], SMSTPCR3, 14, 0), /* SDHI0 */ 202 [MSTP314] = SH_CLK_MSTP32(&div4_clks[DIV4_SD0], SMSTPCR3, 14, 0), /* SDHI0 */
195 [MSTP313] = SH_CLK_MSTP32(&div4_clks[DIV4_SD1], SMSTPCR3, 13, 0), /* SDHI1 */ 203 [MSTP313] = SH_CLK_MSTP32(&div4_clks[DIV4_SD1], SMSTPCR3, 13, 0), /* SDHI1 */
@@ -203,8 +211,7 @@ static struct clk mstp_clks[MSTP_NR] = {
203 [MSTP204] = SH_CLK_MSTP32(&mp_clk, SMSTPCR2, 4, 0), /* SCIFA0 */ 211 [MSTP204] = SH_CLK_MSTP32(&mp_clk, SMSTPCR2, 4, 0), /* SCIFA0 */
204 [MSTP203] = SH_CLK_MSTP32(&mp_clk, SMSTPCR2, 3, 0), /* SCIFA1 */ 212 [MSTP203] = SH_CLK_MSTP32(&mp_clk, SMSTPCR2, 3, 0), /* SCIFA1 */
205 [MSTP202] = SH_CLK_MSTP32(&mp_clk, SMSTPCR2, 2, 0), /* SCIFA2 */ 213 [MSTP202] = SH_CLK_MSTP32(&mp_clk, SMSTPCR2, 2, 0), /* SCIFA2 */
206 [MSTP717] = SH_CLK_MSTP32(&zs_clk, SMSTPCR7, 17, 0), /* HSCIF0 */ 214 [MSTP124] = SH_CLK_MSTP32(&rclk_clk, SMSTPCR1, 24, 0), /* CMT0 */
207 [MSTP716] = SH_CLK_MSTP32(&zs_clk, SMSTPCR7, 16, 0), /* HSCIF1 */
208}; 215};
209 216
210static struct clk_lookup lookups[] = { 217static struct clk_lookup lookups[] = {
@@ -254,6 +261,8 @@ static struct clk_lookup lookups[] = {
254 CLKDEV_DEV_ID("sh-sci.7", &mstp_clks[MSTP720]), 261 CLKDEV_DEV_ID("sh-sci.7", &mstp_clks[MSTP720]),
255 CLKDEV_DEV_ID("sh-sci.8", &mstp_clks[MSTP717]), 262 CLKDEV_DEV_ID("sh-sci.8", &mstp_clks[MSTP717]),
256 CLKDEV_DEV_ID("sh-sci.9", &mstp_clks[MSTP716]), 263 CLKDEV_DEV_ID("sh-sci.9", &mstp_clks[MSTP716]),
264 CLKDEV_DEV_ID("r8a7790-ether", &mstp_clks[MSTP813]),
265 CLKDEV_DEV_ID("rcar_thermal", &mstp_clks[MSTP522]),
257 CLKDEV_DEV_ID("ee200000.mmcif", &mstp_clks[MSTP315]), 266 CLKDEV_DEV_ID("ee200000.mmcif", &mstp_clks[MSTP315]),
258 CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP315]), 267 CLKDEV_DEV_ID("sh_mmcif.0", &mstp_clks[MSTP315]),
259 CLKDEV_DEV_ID("ee100000.sdhi", &mstp_clks[MSTP314]), 268 CLKDEV_DEV_ID("ee100000.sdhi", &mstp_clks[MSTP314]),
@@ -266,6 +275,7 @@ static struct clk_lookup lookups[] = {
266 CLKDEV_DEV_ID("sh_mobile_sdhi.3", &mstp_clks[MSTP311]), 275 CLKDEV_DEV_ID("sh_mobile_sdhi.3", &mstp_clks[MSTP311]),
267 CLKDEV_DEV_ID("ee220000.mmcif", &mstp_clks[MSTP305]), 276 CLKDEV_DEV_ID("ee220000.mmcif", &mstp_clks[MSTP305]),
268 CLKDEV_DEV_ID("sh_mmcif.1", &mstp_clks[MSTP305]), 277 CLKDEV_DEV_ID("sh_mmcif.1", &mstp_clks[MSTP305]),
278 CLKDEV_DEV_ID("sh_cmt.0", &mstp_clks[MSTP124]),
269}; 279};
270 280
271#define R8A7790_CLOCK_ROOT(e, m, p0, p1, p30, p31) \ 281#define R8A7790_CLOCK_ROOT(e, m, p0, p1, p30, p31) \
@@ -280,14 +290,9 @@ static struct clk_lookup lookups[] = {
280 290
281void __init r8a7790_clock_init(void) 291void __init r8a7790_clock_init(void)
282{ 292{
283 void __iomem *modemr = ioremap_nocache(MODEMR, PAGE_SIZE); 293 u32 mode = r8a7790_read_mode_pins();
284 u32 mode;
285 int k, ret = 0; 294 int k, ret = 0;
286 295
287 BUG_ON(!modemr);
288 mode = ioread32(modemr);
289 iounmap(modemr);
290
291 switch (mode & (MD(14) | MD(13))) { 296 switch (mode & (MD(14) | MD(13))) {
292 case 0: 297 case 0:
293 R8A7790_CLOCK_ROOT(15, &extal_clk, 172, 208, 106, 88); 298 R8A7790_CLOCK_ROOT(15, &extal_clk, 172, 208, 106, 88);
diff --git a/arch/arm/mach-shmobile/clock-sh73a0.c b/arch/arm/mach-shmobile/clock-sh73a0.c
index d9fd0336b910..c92c023f0d27 100644
--- a/arch/arm/mach-shmobile/clock-sh73a0.c
+++ b/arch/arm/mach-shmobile/clock-sh73a0.c
@@ -555,7 +555,7 @@ enum { MSTP001,
555 MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200, 555 MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200,
556 MSTP331, MSTP329, MSTP328, MSTP325, MSTP323, MSTP322, 556 MSTP331, MSTP329, MSTP328, MSTP325, MSTP323, MSTP322,
557 MSTP314, MSTP313, MSTP312, MSTP311, 557 MSTP314, MSTP313, MSTP312, MSTP311,
558 MSTP303, MSTP302, MSTP301, MSTP300, 558 MSTP304, MSTP303, MSTP302, MSTP301, MSTP300,
559 MSTP411, MSTP410, MSTP403, 559 MSTP411, MSTP410, MSTP403,
560 MSTP_NR }; 560 MSTP_NR };
561 561
@@ -593,6 +593,7 @@ static struct clk mstp_clks[MSTP_NR] = {
593 [MSTP313] = MSTP(&div6_clks[DIV6_SDHI1], SMSTPCR3, 13, 0), /* SDHI1 */ 593 [MSTP313] = MSTP(&div6_clks[DIV6_SDHI1], SMSTPCR3, 13, 0), /* SDHI1 */
594 [MSTP312] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 12, 0), /* MMCIF0 */ 594 [MSTP312] = MSTP(&div4_clks[DIV4_HP], SMSTPCR3, 12, 0), /* MMCIF0 */
595 [MSTP311] = MSTP(&div6_clks[DIV6_SDHI2], SMSTPCR3, 11, 0), /* SDHI2 */ 595 [MSTP311] = MSTP(&div6_clks[DIV6_SDHI2], SMSTPCR3, 11, 0), /* SDHI2 */
596 [MSTP304] = MSTP(&main_div2_clk, SMSTPCR3, 4, 0), /* TPU0 */
596 [MSTP303] = MSTP(&main_div2_clk, SMSTPCR3, 3, 0), /* TPU1 */ 597 [MSTP303] = MSTP(&main_div2_clk, SMSTPCR3, 3, 0), /* TPU1 */
597 [MSTP302] = MSTP(&main_div2_clk, SMSTPCR3, 2, 0), /* TPU2 */ 598 [MSTP302] = MSTP(&main_div2_clk, SMSTPCR3, 2, 0), /* TPU2 */
598 [MSTP301] = MSTP(&main_div2_clk, SMSTPCR3, 1, 0), /* TPU3 */ 599 [MSTP301] = MSTP(&main_div2_clk, SMSTPCR3, 1, 0), /* TPU3 */
@@ -615,7 +616,7 @@ static struct clk_lookup lookups[] = {
615 CLKDEV_DEV_ID("smp_twd", &twd_clk), /* smp_twd */ 616 CLKDEV_DEV_ID("smp_twd", &twd_clk), /* smp_twd */
616 617
617 /* DIV4 clocks */ 618 /* DIV4 clocks */
618 CLKDEV_DEV_ID("cpufreq-cpu0", &div4_clks[DIV4_Z]), 619 CLKDEV_DEV_ID("cpu0", &div4_clks[DIV4_Z]),
619 620
620 /* DIV6 clocks */ 621 /* DIV6 clocks */
621 CLKDEV_CON_ID("vck1_clk", &div6_clks[DIV6_VCK1]), 622 CLKDEV_CON_ID("vck1_clk", &div6_clks[DIV6_VCK1]),
@@ -669,10 +670,11 @@ static struct clk_lookup lookups[] = {
669 CLKDEV_DEV_ID("e6bd0000.mmcif", &mstp_clks[MSTP312]), /* MMCIF0 */ 670 CLKDEV_DEV_ID("e6bd0000.mmcif", &mstp_clks[MSTP312]), /* MMCIF0 */
670 CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP311]), /* SDHI2 */ 671 CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP311]), /* SDHI2 */
671 CLKDEV_DEV_ID("ee140000.sdhi", &mstp_clks[MSTP311]), /* SDHI2 */ 672 CLKDEV_DEV_ID("ee140000.sdhi", &mstp_clks[MSTP311]), /* SDHI2 */
672 CLKDEV_DEV_ID("leds-renesas-tpu.12", &mstp_clks[MSTP303]), /* TPU1 */ 673 CLKDEV_DEV_ID("renesas-tpu-pwm.0", &mstp_clks[MSTP304]), /* TPU0 */
673 CLKDEV_DEV_ID("leds-renesas-tpu.21", &mstp_clks[MSTP302]), /* TPU2 */ 674 CLKDEV_DEV_ID("renesas-tpu-pwm.1", &mstp_clks[MSTP303]), /* TPU1 */
674 CLKDEV_DEV_ID("leds-renesas-tpu.30", &mstp_clks[MSTP301]), /* TPU3 */ 675 CLKDEV_DEV_ID("renesas-tpu-pwm.2", &mstp_clks[MSTP302]), /* TPU2 */
675 CLKDEV_DEV_ID("leds-renesas-tpu.41", &mstp_clks[MSTP300]), /* TPU4 */ 676 CLKDEV_DEV_ID("renesas-tpu-pwm.3", &mstp_clks[MSTP301]), /* TPU3 */
677 CLKDEV_DEV_ID("renesas-tpu-pwm.4", &mstp_clks[MSTP300]), /* TPU4 */
676 CLKDEV_DEV_ID("i2c-sh_mobile.3", &mstp_clks[MSTP411]), /* I2C3 */ 678 CLKDEV_DEV_ID("i2c-sh_mobile.3", &mstp_clks[MSTP411]), /* I2C3 */
677 CLKDEV_DEV_ID("e6826000.i2c", &mstp_clks[MSTP411]), /* I2C3 */ 679 CLKDEV_DEV_ID("e6826000.i2c", &mstp_clks[MSTP411]), /* I2C3 */
678 CLKDEV_DEV_ID("i2c-sh_mobile.4", &mstp_clks[MSTP410]), /* I2C4 */ 680 CLKDEV_DEV_ID("i2c-sh_mobile.4", &mstp_clks[MSTP410]), /* I2C4 */
diff --git a/arch/arm/mach-shmobile/headsmp-scu.S b/arch/arm/mach-shmobile/headsmp-scu.S
index bfd920083a3b..f45dde701d7b 100644
--- a/arch/arm/mach-shmobile/headsmp-scu.S
+++ b/arch/arm/mach-shmobile/headsmp-scu.S
@@ -37,13 +37,15 @@ ENTRY(shmobile_boot_scu)
37 lsl r1, r1, #3 @ we will shift by cpu_id * 8 bits 37 lsl r1, r1, #3 @ we will shift by cpu_id * 8 bits
38 ldr r2, [r0, #8] @ SCU Power Status Register 38 ldr r2, [r0, #8] @ SCU Power Status Register
39 mov r3, #3 39 mov r3, #3
40 bic r2, r2, r3, lsl r1 @ Clear bits of our CPU (Run Mode) 40 lsl r3, r3, r1
41 bic r2, r2, r3 @ Clear bits of our CPU (Run Mode)
41 str r2, [r0, #8] @ write back 42 str r2, [r0, #8] @ write back
42 43
43 b shmobile_invalidate_start 44 b shmobile_invalidate_start
44ENDPROC(shmobile_boot_scu) 45ENDPROC(shmobile_boot_scu)
45 46
46 .text 47 .text
48 .align 2
47 .globl shmobile_scu_base 49 .globl shmobile_scu_base
48shmobile_scu_base: 50shmobile_scu_base:
49 .space 4 51 .space 4
diff --git a/arch/arm/mach-shmobile/headsmp.S b/arch/arm/mach-shmobile/headsmp.S
index a9d212498987..f93751caf5cb 100644
--- a/arch/arm/mach-shmobile/headsmp.S
+++ b/arch/arm/mach-shmobile/headsmp.S
@@ -24,15 +24,68 @@ ENDPROC(shmobile_invalidate_start)
24 * This will be mapped at address 0 by SBAR register. 24 * This will be mapped at address 0 by SBAR register.
25 * We need _long_ jump to the physical address. 25 * We need _long_ jump to the physical address.
26 */ 26 */
27 .arm
27 .align 12 28 .align 12
28ENTRY(shmobile_boot_vector) 29ENTRY(shmobile_boot_vector)
29 ldr r0, 2f 30 ldr r0, 2f
30 ldr pc, 1f 31 ldr r1, 1f
32 bx r1
33
31ENDPROC(shmobile_boot_vector) 34ENDPROC(shmobile_boot_vector)
32 35
36 .align 2
33 .globl shmobile_boot_fn 37 .globl shmobile_boot_fn
34shmobile_boot_fn: 38shmobile_boot_fn:
351: .space 4 391: .space 4
36 .globl shmobile_boot_arg 40 .globl shmobile_boot_arg
37shmobile_boot_arg: 41shmobile_boot_arg:
382: .space 4 422: .space 4
43
44/*
45 * Per-CPU SMP boot function/argument selection code based on MPIDR
46 */
47
48ENTRY(shmobile_smp_boot)
49 @ r0 = MPIDR_HWID_BITMASK
50 mrc p15, 0, r1, c0, c0, 5 @ r1 = MPIDR
51 and r0, r1, r0 @ r0 = cpu_logical_map() value
52 mov r1, #0 @ r1 = CPU index
53 adr r5, 1f @ array of per-cpu mpidr values
54 adr r6, 2f @ array of per-cpu functions
55 adr r7, 3f @ array of per-cpu arguments
56
57shmobile_smp_boot_find_mpidr:
58 ldr r8, [r5, r1, lsl #2]
59 cmp r8, r0
60 bne shmobile_smp_boot_next
61
62 ldr r9, [r6, r1, lsl #2]
63 cmp r9, #0
64 bne shmobile_smp_boot_found
65
66shmobile_smp_boot_next:
67 add r1, r1, #1
68 cmp r1, #CONFIG_NR_CPUS
69 blo shmobile_smp_boot_find_mpidr
70
71 b shmobile_smp_sleep
72
73shmobile_smp_boot_found:
74 ldr r0, [r7, r1, lsl #2]
75 mov pc, r9
76ENDPROC(shmobile_smp_boot)
77
78ENTRY(shmobile_smp_sleep)
79 wfi
80 b shmobile_smp_boot
81ENDPROC(shmobile_smp_sleep)
82
83 .globl shmobile_smp_mpidr
84shmobile_smp_mpidr:
851: .space CONFIG_NR_CPUS * 4
86 .globl shmobile_smp_fn
87shmobile_smp_fn:
882: .space CONFIG_NR_CPUS * 4
89 .globl shmobile_smp_arg
90shmobile_smp_arg:
913: .space CONFIG_NR_CPUS * 4
diff --git a/arch/arm/mach-shmobile/include/mach/common.h b/arch/arm/mach-shmobile/include/mach/common.h
index e818f029d8e3..7b938681e756 100644
--- a/arch/arm/mach-shmobile/include/mach/common.h
+++ b/arch/arm/mach-shmobile/include/mach/common.h
@@ -2,7 +2,6 @@
2#define __ARCH_MACH_COMMON_H 2#define __ARCH_MACH_COMMON_H
3 3
4extern void shmobile_earlytimer_init(void); 4extern void shmobile_earlytimer_init(void);
5extern void shmobile_timer_init(void);
6extern void shmobile_setup_delay(unsigned int max_cpu_core_mhz, 5extern void shmobile_setup_delay(unsigned int max_cpu_core_mhz,
7 unsigned int mult, unsigned int div); 6 unsigned int mult, unsigned int div);
8struct twd_local_timer; 7struct twd_local_timer;
@@ -10,7 +9,16 @@ extern void shmobile_setup_console(void);
10extern void shmobile_boot_vector(void); 9extern void shmobile_boot_vector(void);
11extern unsigned long shmobile_boot_fn; 10extern unsigned long shmobile_boot_fn;
12extern unsigned long shmobile_boot_arg; 11extern unsigned long shmobile_boot_arg;
12extern void shmobile_smp_boot(void);
13extern void shmobile_smp_sleep(void);
14extern void shmobile_smp_hook(unsigned int cpu, unsigned long fn,
15 unsigned long arg);
13extern void shmobile_boot_scu(void); 16extern void shmobile_boot_scu(void);
17extern void shmobile_smp_scu_prepare_cpus(unsigned int max_cpus);
18extern int shmobile_smp_scu_boot_secondary(unsigned int cpu,
19 struct task_struct *idle);
20extern void shmobile_smp_scu_cpu_die(unsigned int cpu);
21extern int shmobile_smp_scu_cpu_kill(unsigned int cpu);
14struct clk; 22struct clk;
15extern int shmobile_clk_init(void); 23extern int shmobile_clk_init(void);
16extern void shmobile_handle_irq_intc(struct pt_regs *); 24extern void shmobile_handle_irq_intc(struct pt_regs *);
diff --git a/arch/arm/mach-shmobile/include/mach/dma.h b/arch/arm/mach-shmobile/include/mach/dma.h
deleted file mode 100644
index 40a8c178f10d..000000000000
--- a/arch/arm/mach-shmobile/include/mach/dma.h
+++ /dev/null
@@ -1 +0,0 @@
1/* empty */
diff --git a/arch/arm/mach-shmobile/include/mach/emev2.h b/arch/arm/mach-shmobile/include/mach/emev2.h
index ac3751705cab..c2eb7568d9be 100644
--- a/arch/arm/mach-shmobile/include/mach/emev2.h
+++ b/arch/arm/mach-shmobile/include/mach/emev2.h
@@ -2,11 +2,9 @@
2#define __ASM_EMEV2_H__ 2#define __ASM_EMEV2_H__
3 3
4extern void emev2_map_io(void); 4extern void emev2_map_io(void);
5extern void emev2_init_irq(void); 5extern void emev2_init_delay(void);
6extern void emev2_add_early_devices(void);
7extern void emev2_add_standard_devices(void); 6extern void emev2_add_standard_devices(void);
8extern void emev2_clock_init(void); 7extern void emev2_clock_init(void);
9extern void emev2_set_boot_vector(unsigned long value);
10 8
11#define EMEV2_GPIO_BASE 200 9#define EMEV2_GPIO_BASE 200
12#define EMEV2_GPIO_IRQ(n) (EMEV2_GPIO_BASE + (n)) 10#define EMEV2_GPIO_IRQ(n) (EMEV2_GPIO_BASE + (n))
diff --git a/arch/arm/mach-shmobile/include/mach/hardware.h b/arch/arm/mach-shmobile/include/mach/hardware.h
deleted file mode 100644
index 99264a5ce5e4..000000000000
--- a/arch/arm/mach-shmobile/include/mach/hardware.h
+++ /dev/null
@@ -1,4 +0,0 @@
1#ifndef __ASM_MACH_HARDWARE_H
2#define __ASM_MACH_HARDWARE_H
3
4#endif /* __ASM_MACH_HARDWARE_H */
diff --git a/arch/arm/mach-shmobile/include/mach/r8a73a4.h b/arch/arm/mach-shmobile/include/mach/r8a73a4.h
index f043103e32c9..f3a9b702da56 100644
--- a/arch/arm/mach-shmobile/include/mach/r8a73a4.h
+++ b/arch/arm/mach-shmobile/include/mach/r8a73a4.h
@@ -2,7 +2,9 @@
2#define __ASM_R8A73A4_H__ 2#define __ASM_R8A73A4_H__
3 3
4void r8a73a4_add_standard_devices(void); 4void r8a73a4_add_standard_devices(void);
5void r8a73a4_add_dt_devices(void);
5void r8a73a4_clock_init(void); 6void r8a73a4_clock_init(void);
6void r8a73a4_pinmux_init(void); 7void r8a73a4_pinmux_init(void);
8void r8a73a4_init_delay(void);
7 9
8#endif /* __ASM_R8A73A4_H__ */ 10#endif /* __ASM_R8A73A4_H__ */
diff --git a/arch/arm/mach-shmobile/include/mach/r8a7740.h b/arch/arm/mach-shmobile/include/mach/r8a7740.h
index b34d19b5ca5c..d07932f872b6 100644
--- a/arch/arm/mach-shmobile/include/mach/r8a7740.h
+++ b/arch/arm/mach-shmobile/include/mach/r8a7740.h
@@ -42,11 +42,12 @@ enum {
42 SHDMA_SLAVE_FSIB_TX, 42 SHDMA_SLAVE_FSIB_TX,
43 SHDMA_SLAVE_USBHS_TX, 43 SHDMA_SLAVE_USBHS_TX,
44 SHDMA_SLAVE_USBHS_RX, 44 SHDMA_SLAVE_USBHS_RX,
45 SHDMA_SLAVE_MMCIF_TX,
46 SHDMA_SLAVE_MMCIF_RX,
45}; 47};
46 48
47extern void r8a7740_meram_workaround(void); 49extern void r8a7740_meram_workaround(void);
48extern void r8a7740_init_delay(void); 50extern void r8a7740_init_delay(void);
49extern void r8a7740_init_irq(void);
50extern void r8a7740_init_irq_of(void); 51extern void r8a7740_init_irq_of(void);
51extern void r8a7740_map_io(void); 52extern void r8a7740_map_io(void);
52extern void r8a7740_add_early_devices(void); 53extern void r8a7740_add_early_devices(void);
diff --git a/arch/arm/mach-shmobile/include/mach/r8a7778.h b/arch/arm/mach-shmobile/include/mach/r8a7778.h
index 851d027a2f06..adfcf51b163d 100644
--- a/arch/arm/mach-shmobile/include/mach/r8a7778.h
+++ b/arch/arm/mach-shmobile/include/mach/r8a7778.h
@@ -18,26 +18,21 @@
18#ifndef __ASM_R8A7778_H__ 18#ifndef __ASM_R8A7778_H__
19#define __ASM_R8A7778_H__ 19#define __ASM_R8A7778_H__
20 20
21#include <linux/mmc/sh_mmcif.h>
22#include <linux/mmc/sh_mobile_sdhi.h>
23#include <linux/sh_eth.h> 21#include <linux/sh_eth.h>
24#include <linux/platform_data/usb-rcar-phy.h> 22#include <linux/platform_data/camera-rcar.h>
25 23
26extern void r8a7778_add_standard_devices(void); 24extern void r8a7778_add_standard_devices(void);
27extern void r8a7778_add_standard_devices_dt(void); 25extern void r8a7778_add_standard_devices_dt(void);
28extern void r8a7778_add_ether_device(struct sh_eth_plat_data *pdata); 26extern void r8a7778_add_ether_device(struct sh_eth_plat_data *pdata);
29extern void r8a7778_add_usb_phy_device(struct rcar_phy_platform_data *pdata); 27extern void r8a7778_add_vin_device(int id,
30extern void r8a7778_add_i2c_device(int id); 28 struct rcar_vin_platform_data *pdata);
31extern void r8a7778_add_hspi_device(int id); 29extern void r8a7778_add_dt_devices(void);
32extern void r8a7778_add_mmc_device(struct sh_mmcif_plat_data *info);
33 30
34extern void r8a7778_init_late(void); 31extern void r8a7778_init_late(void);
35extern void r8a7778_init_delay(void); 32extern void r8a7778_init_delay(void);
36extern void r8a7778_init_irq(void);
37extern void r8a7778_init_irq_dt(void); 33extern void r8a7778_init_irq_dt(void);
38extern void r8a7778_clock_init(void); 34extern void r8a7778_clock_init(void);
39extern void r8a7778_init_irq_extpin(int irlm); 35extern void r8a7778_init_irq_extpin(int irlm);
40extern void r8a7778_pinmux_init(void); 36extern void r8a7778_pinmux_init(void);
41extern void r8a7778_sdhi_init(int id, struct sh_mobile_sdhi_info *info);
42 37
43#endif /* __ASM_R8A7778_H__ */ 38#endif /* __ASM_R8A7778_H__ */
diff --git a/arch/arm/mach-shmobile/include/mach/r8a7779.h b/arch/arm/mach-shmobile/include/mach/r8a7779.h
index fc47073c7ba9..11c740047e14 100644
--- a/arch/arm/mach-shmobile/include/mach/r8a7779.h
+++ b/arch/arm/mach-shmobile/include/mach/r8a7779.h
@@ -4,7 +4,7 @@
4#include <linux/sh_clk.h> 4#include <linux/sh_clk.h>
5#include <linux/pm_domain.h> 5#include <linux/pm_domain.h>
6#include <linux/sh_eth.h> 6#include <linux/sh_eth.h>
7#include <linux/platform_data/usb-rcar-phy.h> 7#include <linux/platform_data/camera-rcar.h>
8 8
9struct platform_device; 9struct platform_device;
10 10
@@ -25,7 +25,6 @@ static inline struct r8a7779_pm_ch *to_r8a7779_ch(struct generic_pm_domain *d)
25} 25}
26 26
27extern void r8a7779_init_delay(void); 27extern void r8a7779_init_delay(void);
28extern void r8a7779_init_irq(void);
29extern void r8a7779_init_irq_extpin(int irlm); 28extern void r8a7779_init_irq_extpin(int irlm);
30extern void r8a7779_init_irq_dt(void); 29extern void r8a7779_init_irq_dt(void);
31extern void r8a7779_map_io(void); 30extern void r8a7779_map_io(void);
@@ -34,7 +33,8 @@ extern void r8a7779_add_early_devices(void);
34extern void r8a7779_add_standard_devices(void); 33extern void r8a7779_add_standard_devices(void);
35extern void r8a7779_add_standard_devices_dt(void); 34extern void r8a7779_add_standard_devices_dt(void);
36extern void r8a7779_add_ether_device(struct sh_eth_plat_data *pdata); 35extern void r8a7779_add_ether_device(struct sh_eth_plat_data *pdata);
37extern void r8a7779_add_usb_phy_device(struct rcar_phy_platform_data *pdata); 36extern void r8a7779_add_vin_device(int idx,
37 struct rcar_vin_platform_data *pdata);
38extern void r8a7779_init_late(void); 38extern void r8a7779_init_late(void);
39extern void r8a7779_clock_init(void); 39extern void r8a7779_clock_init(void);
40extern void r8a7779_pinmux_init(void); 40extern void r8a7779_pinmux_init(void);
diff --git a/arch/arm/mach-shmobile/include/mach/r8a7790.h b/arch/arm/mach-shmobile/include/mach/r8a7790.h
index 2e919e61fa0d..788d55952091 100644
--- a/arch/arm/mach-shmobile/include/mach/r8a7790.h
+++ b/arch/arm/mach-shmobile/include/mach/r8a7790.h
@@ -2,8 +2,13 @@
2#define __ASM_R8A7790_H__ 2#define __ASM_R8A7790_H__
3 3
4void r8a7790_add_standard_devices(void); 4void r8a7790_add_standard_devices(void);
5void r8a7790_add_dt_devices(void);
5void r8a7790_clock_init(void); 6void r8a7790_clock_init(void);
6void r8a7790_pinmux_init(void); 7void r8a7790_pinmux_init(void);
8void r8a7790_init_delay(void);
7void r8a7790_timer_init(void); 9void r8a7790_timer_init(void);
8 10
11#define MD(nr) BIT(nr)
12u32 r8a7790_read_mode_pins(void);
13
9#endif /* __ASM_R8A7790_H__ */ 14#endif /* __ASM_R8A7790_H__ */
diff --git a/arch/arm/mach-shmobile/include/mach/sh73a0.h b/arch/arm/mach-shmobile/include/mach/sh73a0.h
index eb7a4320d487..359b582dc270 100644
--- a/arch/arm/mach-shmobile/include/mach/sh73a0.h
+++ b/arch/arm/mach-shmobile/include/mach/sh73a0.h
@@ -1,379 +1,6 @@
1#ifndef __ASM_SH73A0_H__ 1#ifndef __ASM_SH73A0_H__
2#define __ASM_SH73A0_H__ 2#define __ASM_SH73A0_H__
3 3
4/* Pin Function Controller:
5 * GPIO_FN_xx - GPIO used to select pin function and MSEL switch
6 * GPIO_PORTxx - GPIO mapped to real I/O pin on CPU
7 */
8enum {
9 /* Hardware manual Table 25-1 (GPIO) */
10 GPIO_PORT0, GPIO_PORT1, GPIO_PORT2, GPIO_PORT3, GPIO_PORT4,
11 GPIO_PORT5, GPIO_PORT6, GPIO_PORT7, GPIO_PORT8, GPIO_PORT9,
12
13 GPIO_PORT10, GPIO_PORT11, GPIO_PORT12, GPIO_PORT13, GPIO_PORT14,
14 GPIO_PORT15, GPIO_PORT16, GPIO_PORT17, GPIO_PORT18, GPIO_PORT19,
15
16 GPIO_PORT20, GPIO_PORT21, GPIO_PORT22, GPIO_PORT23, GPIO_PORT24,
17 GPIO_PORT25, GPIO_PORT26, GPIO_PORT27, GPIO_PORT28, GPIO_PORT29,
18
19 GPIO_PORT30, GPIO_PORT31, GPIO_PORT32, GPIO_PORT33, GPIO_PORT34,
20 GPIO_PORT35, GPIO_PORT36, GPIO_PORT37, GPIO_PORT38, GPIO_PORT39,
21
22 GPIO_PORT40, GPIO_PORT41, GPIO_PORT42, GPIO_PORT43, GPIO_PORT44,
23 GPIO_PORT45, GPIO_PORT46, GPIO_PORT47, GPIO_PORT48, GPIO_PORT49,
24
25 GPIO_PORT50, GPIO_PORT51, GPIO_PORT52, GPIO_PORT53, GPIO_PORT54,
26 GPIO_PORT55, GPIO_PORT56, GPIO_PORT57, GPIO_PORT58, GPIO_PORT59,
27
28 GPIO_PORT60, GPIO_PORT61, GPIO_PORT62, GPIO_PORT63, GPIO_PORT64,
29 GPIO_PORT65, GPIO_PORT66, GPIO_PORT67, GPIO_PORT68, GPIO_PORT69,
30
31 GPIO_PORT70, GPIO_PORT71, GPIO_PORT72, GPIO_PORT73, GPIO_PORT74,
32 GPIO_PORT75, GPIO_PORT76, GPIO_PORT77, GPIO_PORT78, GPIO_PORT79,
33
34 GPIO_PORT80, GPIO_PORT81, GPIO_PORT82, GPIO_PORT83, GPIO_PORT84,
35 GPIO_PORT85, GPIO_PORT86, GPIO_PORT87, GPIO_PORT88, GPIO_PORT89,
36
37 GPIO_PORT90, GPIO_PORT91, GPIO_PORT92, GPIO_PORT93, GPIO_PORT94,
38 GPIO_PORT95, GPIO_PORT96, GPIO_PORT97, GPIO_PORT98, GPIO_PORT99,
39
40 GPIO_PORT100, GPIO_PORT101, GPIO_PORT102, GPIO_PORT103, GPIO_PORT104,
41 GPIO_PORT105, GPIO_PORT106, GPIO_PORT107, GPIO_PORT108, GPIO_PORT109,
42
43 GPIO_PORT110, GPIO_PORT111, GPIO_PORT112, GPIO_PORT113, GPIO_PORT114,
44 GPIO_PORT115, GPIO_PORT116, GPIO_PORT117, GPIO_PORT118,
45
46 GPIO_PORT128, GPIO_PORT129,
47
48 GPIO_PORT130, GPIO_PORT131, GPIO_PORT132, GPIO_PORT133, GPIO_PORT134,
49 GPIO_PORT135, GPIO_PORT136, GPIO_PORT137, GPIO_PORT138, GPIO_PORT139,
50
51 GPIO_PORT140, GPIO_PORT141, GPIO_PORT142, GPIO_PORT143, GPIO_PORT144,
52 GPIO_PORT145, GPIO_PORT146, GPIO_PORT147, GPIO_PORT148, GPIO_PORT149,
53
54 GPIO_PORT150, GPIO_PORT151, GPIO_PORT152, GPIO_PORT153, GPIO_PORT154,
55 GPIO_PORT155, GPIO_PORT156, GPIO_PORT157, GPIO_PORT158, GPIO_PORT159,
56
57 GPIO_PORT160, GPIO_PORT161, GPIO_PORT162, GPIO_PORT163, GPIO_PORT164,
58
59 GPIO_PORT192, GPIO_PORT193, GPIO_PORT194,
60 GPIO_PORT195, GPIO_PORT196, GPIO_PORT197, GPIO_PORT198, GPIO_PORT199,
61
62 GPIO_PORT200, GPIO_PORT201, GPIO_PORT202, GPIO_PORT203, GPIO_PORT204,
63 GPIO_PORT205, GPIO_PORT206, GPIO_PORT207, GPIO_PORT208, GPIO_PORT209,
64
65 GPIO_PORT210, GPIO_PORT211, GPIO_PORT212, GPIO_PORT213, GPIO_PORT214,
66 GPIO_PORT215, GPIO_PORT216, GPIO_PORT217, GPIO_PORT218, GPIO_PORT219,
67
68 GPIO_PORT220, GPIO_PORT221, GPIO_PORT222, GPIO_PORT223, GPIO_PORT224,
69 GPIO_PORT225, GPIO_PORT226, GPIO_PORT227, GPIO_PORT228, GPIO_PORT229,
70
71 GPIO_PORT230, GPIO_PORT231, GPIO_PORT232, GPIO_PORT233, GPIO_PORT234,
72 GPIO_PORT235, GPIO_PORT236, GPIO_PORT237, GPIO_PORT238, GPIO_PORT239,
73
74 GPIO_PORT240, GPIO_PORT241, GPIO_PORT242, GPIO_PORT243, GPIO_PORT244,
75 GPIO_PORT245, GPIO_PORT246, GPIO_PORT247, GPIO_PORT248, GPIO_PORT249,
76
77 GPIO_PORT250, GPIO_PORT251, GPIO_PORT252, GPIO_PORT253, GPIO_PORT254,
78 GPIO_PORT255, GPIO_PORT256, GPIO_PORT257, GPIO_PORT258, GPIO_PORT259,
79
80 GPIO_PORT260, GPIO_PORT261, GPIO_PORT262, GPIO_PORT263, GPIO_PORT264,
81 GPIO_PORT265, GPIO_PORT266, GPIO_PORT267, GPIO_PORT268, GPIO_PORT269,
82
83 GPIO_PORT270, GPIO_PORT271, GPIO_PORT272, GPIO_PORT273, GPIO_PORT274,
84 GPIO_PORT275, GPIO_PORT276, GPIO_PORT277, GPIO_PORT278, GPIO_PORT279,
85
86 GPIO_PORT280, GPIO_PORT281, GPIO_PORT282,
87
88 GPIO_PORT288, GPIO_PORT289,
89
90 GPIO_PORT290, GPIO_PORT291, GPIO_PORT292, GPIO_PORT293, GPIO_PORT294,
91 GPIO_PORT295, GPIO_PORT296, GPIO_PORT297, GPIO_PORT298, GPIO_PORT299,
92
93 GPIO_PORT300, GPIO_PORT301, GPIO_PORT302, GPIO_PORT303, GPIO_PORT304,
94 GPIO_PORT305, GPIO_PORT306, GPIO_PORT307, GPIO_PORT308, GPIO_PORT309,
95
96 /* Table 25-1 (Function 0-7) */
97 GPIO_FN_GPI0 = 310,
98 GPIO_FN_GPI1,
99 GPIO_FN_GPI2,
100 GPIO_FN_GPI3,
101 GPIO_FN_GPI4,
102 GPIO_FN_GPI5,
103 GPIO_FN_GPI6,
104 GPIO_FN_GPI7,
105 GPIO_FN_GPO7, GPIO_FN_MFG0_OUT2,
106 GPIO_FN_GPO6, GPIO_FN_MFG1_OUT2,
107 GPIO_FN_GPO5,
108 GPIO_FN_PORT16_VIO_CKOR,
109 GPIO_FN_PORT19_VIO_CKO2,
110 GPIO_FN_GPO0,
111 GPIO_FN_GPO1,
112 GPIO_FN_GPO2, GPIO_FN_STATUS0,
113 GPIO_FN_GPO3, GPIO_FN_STATUS1,
114 GPIO_FN_GPO4, GPIO_FN_STATUS2,
115 GPIO_FN_VINT,
116 GPIO_FN_TCKON,
117 GPIO_FN_XDVFS1,
118 GPIO_FN_MFG0_OUT1, GPIO_FN_PORT27_IROUT,
119 GPIO_FN_XDVFS2,
120 GPIO_FN_PORT28_TPU1TO1,
121 GPIO_FN_SIM_RST, GPIO_FN_PORT29_TPU1TO1,
122 GPIO_FN_SIM_CLK, GPIO_FN_PORT30_VIO_CKOR,
123 GPIO_FN_SIM_D, GPIO_FN_PORT31_IROUT,
124 GPIO_FN_XWUP,
125 GPIO_FN_VACK,
126 GPIO_FN_XTAL1L,
127 GPIO_FN_PORT49_IROUT,
128 GPIO_FN_BBIF2_TSYNC2, GPIO_FN_TPU2TO2,
129
130 GPIO_FN_BBIF2_TSCK2, GPIO_FN_TPU2TO3,
131 GPIO_FN_BBIF2_TXD2,
132 GPIO_FN_TPU3TO3,
133 GPIO_FN_TPU3TO2,
134 GPIO_FN_TPU0TO0,
135 GPIO_FN_A0, GPIO_FN_BS_,
136 GPIO_FN_A12, GPIO_FN_TPU4TO2,
137 GPIO_FN_A13, GPIO_FN_TPU0TO1,
138 GPIO_FN_A14,
139 GPIO_FN_A15,
140 GPIO_FN_A16, GPIO_FN_MSIOF0_SS1,
141 GPIO_FN_A17, GPIO_FN_MSIOF0_TSYNC,
142 GPIO_FN_A18, GPIO_FN_MSIOF0_TSCK,
143 GPIO_FN_A19, GPIO_FN_MSIOF0_TXD,
144 GPIO_FN_A20, GPIO_FN_MSIOF0_RSCK,
145 GPIO_FN_A21, GPIO_FN_MSIOF0_RSYNC,
146 GPIO_FN_A22, GPIO_FN_MSIOF0_MCK0,
147 GPIO_FN_A23, GPIO_FN_MSIOF0_MCK1,
148 GPIO_FN_A24, GPIO_FN_MSIOF0_RXD,
149 GPIO_FN_A25, GPIO_FN_MSIOF0_SS2,
150 GPIO_FN_A26,
151 GPIO_FN_FCE1_,
152 GPIO_FN_DACK0,
153 GPIO_FN_FCE0_,
154 GPIO_FN_WAIT_, GPIO_FN_DREQ0,
155 GPIO_FN_FRB,
156 GPIO_FN_CKO,
157 GPIO_FN_NBRSTOUT_,
158 GPIO_FN_NBRST_,
159 GPIO_FN_BBIF2_TXD,
160 GPIO_FN_BBIF2_RXD,
161 GPIO_FN_BBIF2_SYNC,
162 GPIO_FN_BBIF2_SCK,
163 GPIO_FN_MFG3_IN2,
164 GPIO_FN_MFG3_IN1,
165 GPIO_FN_BBIF1_SS2, GPIO_FN_MFG3_OUT1,
166 GPIO_FN_HSI_RX_DATA, GPIO_FN_BBIF1_RXD,
167 GPIO_FN_HSI_TX_WAKE, GPIO_FN_BBIF1_TSCK,
168 GPIO_FN_HSI_TX_DATA, GPIO_FN_BBIF1_TSYNC,
169 GPIO_FN_HSI_TX_READY, GPIO_FN_BBIF1_TXD,
170 GPIO_FN_HSI_RX_READY, GPIO_FN_BBIF1_RSCK,
171 GPIO_FN_HSI_RX_WAKE, GPIO_FN_BBIF1_RSYNC,
172 GPIO_FN_HSI_RX_FLAG, GPIO_FN_BBIF1_SS1, GPIO_FN_BBIF1_FLOW,
173 GPIO_FN_HSI_TX_FLAG,
174 GPIO_FN_VIO_VD, GPIO_FN_VIO2_VD,
175
176 GPIO_FN_VIO_HD,
177 GPIO_FN_VIO2_HD,
178 GPIO_FN_VIO_D0, GPIO_FN_PORT130_MSIOF2_RXD,
179 GPIO_FN_VIO_D1, GPIO_FN_PORT131_MSIOF2_SS1,
180 GPIO_FN_VIO_D2, GPIO_FN_PORT132_MSIOF2_SS2,
181 GPIO_FN_VIO_D3, GPIO_FN_MSIOF2_TSYNC,
182 GPIO_FN_VIO_D4, GPIO_FN_MSIOF2_TXD,
183 GPIO_FN_VIO_D5, GPIO_FN_MSIOF2_TSCK,
184 GPIO_FN_VIO_D6,
185 GPIO_FN_VIO_D7,
186 GPIO_FN_VIO_D8, GPIO_FN_VIO2_D0,
187 GPIO_FN_VIO_D9, GPIO_FN_VIO2_D1,
188 GPIO_FN_VIO_D10, GPIO_FN_TPU0TO2, GPIO_FN_VIO2_D2,
189 GPIO_FN_VIO_D11, GPIO_FN_TPU0TO3, GPIO_FN_VIO2_D3,
190 GPIO_FN_VIO_D12, GPIO_FN_VIO2_D4,
191 GPIO_FN_VIO_D13,
192 GPIO_FN_VIO2_D5,
193 GPIO_FN_VIO_D14, GPIO_FN_VIO2_D6,
194 GPIO_FN_VIO_D15, GPIO_FN_TPU1TO3,
195 GPIO_FN_VIO2_D7,
196 GPIO_FN_VIO_CLK,
197 GPIO_FN_VIO2_CLK,
198 GPIO_FN_VIO_FIELD, GPIO_FN_VIO2_FIELD,
199 GPIO_FN_VIO_CKO,
200 GPIO_FN_A27, GPIO_FN_MFG0_IN1,
201 GPIO_FN_MFG0_IN2,
202 GPIO_FN_TS_SPSYNC3, GPIO_FN_MSIOF2_RSCK,
203 GPIO_FN_TS_SDAT3, GPIO_FN_MSIOF2_RSYNC,
204 GPIO_FN_TPU1TO2, GPIO_FN_TS_SDEN3, GPIO_FN_PORT153_MSIOF2_SS1,
205 GPIO_FN_MSIOF2_MCK0,
206 GPIO_FN_MSIOF2_MCK1,
207 GPIO_FN_PORT156_MSIOF2_SS2,
208 GPIO_FN_PORT157_MSIOF2_RXD,
209 GPIO_FN_DINT_, GPIO_FN_TS_SCK3,
210 GPIO_FN_NMI,
211 GPIO_FN_TPU3TO0,
212 GPIO_FN_BBIF2_TSYNC1,
213 GPIO_FN_BBIF2_TSCK1,
214 GPIO_FN_BBIF2_TXD1,
215 GPIO_FN_MFG2_OUT2,
216 GPIO_FN_TPU2TO1,
217 GPIO_FN_TPU4TO1, GPIO_FN_MFG4_OUT2,
218 GPIO_FN_D16,
219 GPIO_FN_D17,
220 GPIO_FN_D18,
221 GPIO_FN_D19,
222 GPIO_FN_D20,
223 GPIO_FN_D21,
224 GPIO_FN_D22,
225 GPIO_FN_PORT207_MSIOF0L_SS1, GPIO_FN_D23,
226 GPIO_FN_PORT208_MSIOF0L_SS2, GPIO_FN_D24,
227 GPIO_FN_D25,
228 GPIO_FN_DREQ2, GPIO_FN_PORT210_MSIOF0L_SS1, GPIO_FN_D26,
229 GPIO_FN_PORT211_MSIOF0L_SS2, GPIO_FN_D27,
230 GPIO_FN_TS_SPSYNC1, GPIO_FN_MSIOF0L_MCK0, GPIO_FN_D28,
231 GPIO_FN_TS_SDAT1, GPIO_FN_MSIOF0L_MCK1, GPIO_FN_D29,
232 GPIO_FN_TS_SDEN1, GPIO_FN_MSIOF0L_RSCK, GPIO_FN_D30,
233 GPIO_FN_TS_SCK1, GPIO_FN_MSIOF0L_RSYNC, GPIO_FN_D31,
234 GPIO_FN_DACK2,
235 GPIO_FN_MSIOF0L_TSYNC, GPIO_FN_VIO2_FIELD3,
236 GPIO_FN_DACK3,
237 GPIO_FN_PORT218_VIO_CKOR,
238 GPIO_FN_DREQ3, GPIO_FN_MSIOF0L_TSCK, GPIO_FN_VIO2_CLK3, \
239 GPIO_FN_DREQ1,
240 GPIO_FN_PWEN, GPIO_FN_MSIOF0L_RXD, GPIO_FN_VIO2_HD3, \
241 GPIO_FN_DACK1, GPIO_FN_OVCN,
242 GPIO_FN_MSIOF0L_TXD, GPIO_FN_VIO2_VD3,
243
244 GPIO_FN_OVCN2,
245 GPIO_FN_EXTLP, GPIO_FN_PORT226_VIO_CKO2,
246 GPIO_FN_IDIN,
247 GPIO_FN_MFG1_IN1,
248 GPIO_FN_MSIOF1_TXD,
249 GPIO_FN_MSIOF1_TSYNC,
250 GPIO_FN_MSIOF1_TSCK,
251 GPIO_FN_MSIOF1_RXD,
252 GPIO_FN_MSIOF1_RSCK, GPIO_FN_VIO2_CLK2,
253 GPIO_FN_MSIOF1_RSYNC, GPIO_FN_MFG1_IN2, GPIO_FN_VIO2_VD2, \
254 GPIO_FN_MSIOF1_MCK0,
255 GPIO_FN_MSIOF1_MCK1,
256 GPIO_FN_MSIOF1_SS1, GPIO_FN_VIO2_FIELD2,
257 GPIO_FN_MSIOF1_SS2, GPIO_FN_VIO2_HD2,
258 GPIO_FN_PORT241_IROUT, GPIO_FN_MFG4_OUT1, \
259 GPIO_FN_TPU4TO0,
260 GPIO_FN_MFG4_IN2,
261 GPIO_FN_PORT243_VIO_CKO2,
262 GPIO_FN_MFG2_IN1,
263 GPIO_FN_MSIOF2R_RXD,
264 GPIO_FN_MFG2_IN2,
265 GPIO_FN_MSIOF2R_TXD,
266 GPIO_FN_MFG1_OUT1,
267 GPIO_FN_TPU1TO0,
268 GPIO_FN_MFG3_OUT2,
269 GPIO_FN_TPU3TO1,
270 GPIO_FN_MFG2_OUT1,
271 GPIO_FN_TPU2TO0,
272 GPIO_FN_MSIOF2R_TSCK,
273 GPIO_FN_PORT249_IROUT, GPIO_FN_MFG4_IN1, \
274 GPIO_FN_MSIOF2R_TSYNC,
275 GPIO_FN_SDHICLK0,
276 GPIO_FN_SDHICD0,
277 GPIO_FN_SDHID0_0,
278 GPIO_FN_SDHID0_1,
279 GPIO_FN_SDHID0_2,
280 GPIO_FN_SDHID0_3,
281 GPIO_FN_SDHICMD0,
282 GPIO_FN_SDHIWP0,
283 GPIO_FN_SDHICLK1,
284 GPIO_FN_SDHID1_0, GPIO_FN_TS_SPSYNC2,
285 GPIO_FN_SDHID1_1, GPIO_FN_TS_SDAT2,
286 GPIO_FN_SDHID1_2, GPIO_FN_TS_SDEN2,
287 GPIO_FN_SDHID1_3, GPIO_FN_TS_SCK2,
288 GPIO_FN_SDHICMD1,
289 GPIO_FN_SDHICLK2,
290 GPIO_FN_SDHID2_0, GPIO_FN_TS_SPSYNC4,
291 GPIO_FN_SDHID2_1, GPIO_FN_TS_SDAT4,
292 GPIO_FN_SDHID2_2, GPIO_FN_TS_SDEN4,
293 GPIO_FN_SDHID2_3, GPIO_FN_TS_SCK4,
294 GPIO_FN_SDHICMD2,
295 GPIO_FN_MMCCLK0,
296 GPIO_FN_MMCD0_0,
297 GPIO_FN_MMCD0_1,
298 GPIO_FN_MMCD0_2,
299 GPIO_FN_MMCD0_3,
300 GPIO_FN_MMCD0_4, GPIO_FN_TS_SPSYNC5,
301 GPIO_FN_MMCD0_5, GPIO_FN_TS_SDAT5,
302 GPIO_FN_MMCD0_6, GPIO_FN_TS_SDEN5,
303 GPIO_FN_MMCD0_7, GPIO_FN_TS_SCK5,
304 GPIO_FN_MMCCMD0,
305 GPIO_FN_RESETOUTS_, GPIO_FN_EXTAL2OUT,
306 GPIO_FN_MCP_WAIT__MCP_FRB,
307 GPIO_FN_MCP_CKO, GPIO_FN_MMCCLK1,
308 GPIO_FN_MCP_D15_MCP_NAF15,
309 GPIO_FN_MCP_D14_MCP_NAF14,
310 GPIO_FN_MCP_D13_MCP_NAF13,
311 GPIO_FN_MCP_D12_MCP_NAF12,
312 GPIO_FN_MCP_D11_MCP_NAF11,
313 GPIO_FN_MCP_D10_MCP_NAF10,
314 GPIO_FN_MCP_D9_MCP_NAF9,
315 GPIO_FN_MCP_D8_MCP_NAF8, GPIO_FN_MMCCMD1,
316 GPIO_FN_MCP_D7_MCP_NAF7, GPIO_FN_MMCD1_7,
317
318 GPIO_FN_MCP_D6_MCP_NAF6, GPIO_FN_MMCD1_6,
319 GPIO_FN_MCP_D5_MCP_NAF5, GPIO_FN_MMCD1_5,
320 GPIO_FN_MCP_D4_MCP_NAF4, GPIO_FN_MMCD1_4,
321 GPIO_FN_MCP_D3_MCP_NAF3, GPIO_FN_MMCD1_3,
322 GPIO_FN_MCP_D2_MCP_NAF2, GPIO_FN_MMCD1_2,
323 GPIO_FN_MCP_D1_MCP_NAF1, GPIO_FN_MMCD1_1,
324 GPIO_FN_MCP_D0_MCP_NAF0, GPIO_FN_MMCD1_0,
325 GPIO_FN_MCP_NBRSTOUT_,
326 GPIO_FN_MCP_WE0__MCP_FWE, GPIO_FN_MCP_RDWR_MCP_FWE,
327
328 /* MSEL2 special case */
329 GPIO_FN_TSIF2_TS_XX1,
330 GPIO_FN_TSIF2_TS_XX2,
331 GPIO_FN_TSIF2_TS_XX3,
332 GPIO_FN_TSIF2_TS_XX4,
333 GPIO_FN_TSIF2_TS_XX5,
334 GPIO_FN_TSIF1_TS_XX1,
335 GPIO_FN_TSIF1_TS_XX2,
336 GPIO_FN_TSIF1_TS_XX3,
337 GPIO_FN_TSIF1_TS_XX4,
338 GPIO_FN_TSIF1_TS_XX5,
339 GPIO_FN_TSIF0_TS_XX1,
340 GPIO_FN_TSIF0_TS_XX2,
341 GPIO_FN_TSIF0_TS_XX3,
342 GPIO_FN_TSIF0_TS_XX4,
343 GPIO_FN_TSIF0_TS_XX5,
344 GPIO_FN_MST1_TS_XX1,
345 GPIO_FN_MST1_TS_XX2,
346 GPIO_FN_MST1_TS_XX3,
347 GPIO_FN_MST1_TS_XX4,
348 GPIO_FN_MST1_TS_XX5,
349 GPIO_FN_MST0_TS_XX1,
350 GPIO_FN_MST0_TS_XX2,
351 GPIO_FN_MST0_TS_XX3,
352 GPIO_FN_MST0_TS_XX4,
353 GPIO_FN_MST0_TS_XX5,
354
355 /* MSEL3 special cases */
356 GPIO_FN_SDHI0_VCCQ_MC0_ON,
357 GPIO_FN_SDHI0_VCCQ_MC0_OFF,
358 GPIO_FN_DEBUG_MON_VIO,
359 GPIO_FN_DEBUG_MON_LCDD,
360 GPIO_FN_LCDC_LCDC0,
361 GPIO_FN_LCDC_LCDC1,
362
363 /* MSEL4 special cases */
364 GPIO_FN_IRQ9_MEM_INT,
365 GPIO_FN_IRQ9_MCP_INT,
366 GPIO_FN_A11,
367 GPIO_FN_TPU4TO3,
368 GPIO_FN_RESETA_N_PU_ON,
369 GPIO_FN_RESETA_N_PU_OFF,
370 GPIO_FN_EDBGREQ_PD,
371 GPIO_FN_EDBGREQ_PU,
372
373 /* end of GPIO */
374 GPIO_NR,
375};
376
377/* DMA slave IDs */ 4/* DMA slave IDs */
378enum { 5enum {
379 SHDMA_SLAVE_INVALID, 6 SHDMA_SLAVE_INVALID,
diff --git a/arch/arm/mach-shmobile/include/mach/zboot.h b/arch/arm/mach-shmobile/include/mach/zboot.h
index f2d8744c1f14..c3c4669a2d72 100644
--- a/arch/arm/mach-shmobile/include/mach/zboot.h
+++ b/arch/arm/mach-shmobile/include/mach/zboot.h
@@ -1,7 +1,6 @@
1#ifndef ZBOOT_H 1#ifndef ZBOOT_H
2#define ZBOOT_H 2#define ZBOOT_H
3 3
4#include <asm/mach-types.h>
5#include <mach/zboot_macros.h> 4#include <mach/zboot_macros.h>
6 5
7/************************************************** 6/**************************************************
@@ -11,7 +10,6 @@
11 **************************************************/ 10 **************************************************/
12 11
13#ifdef CONFIG_MACH_MACKEREL 12#ifdef CONFIG_MACH_MACKEREL
14#define MACH_TYPE MACH_TYPE_MACKEREL
15#define MEMORY_START 0x40000000 13#define MEMORY_START 0x40000000
16#include "mach/head-mackerel.txt" 14#include "mach/head-mackerel.txt"
17#else 15#else
diff --git a/arch/arm/mach-shmobile/intc-r8a7740.c b/arch/arm/mach-shmobile/intc-r8a7740.c
deleted file mode 100644
index 8871f7717dc8..000000000000
--- a/arch/arm/mach-shmobile/intc-r8a7740.c
+++ /dev/null
@@ -1,68 +0,0 @@
1/*
2 * R8A7740 processor support
3 *
4 * Copyright (C) 2011 Renesas Solutions Corp.
5 * Copyright (C) 2011 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; version 2 of the License.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21#include <linux/init.h>
22#include <linux/io.h>
23#include <linux/irqchip.h>
24#include <linux/irqchip/arm-gic.h>
25
26static void __init r8a7740_init_irq_common(void)
27{
28 void __iomem *intc_prio_base = ioremap_nocache(0xe6900010, 0x10);
29 void __iomem *intc_msk_base = ioremap_nocache(0xe6900040, 0x10);
30 void __iomem *pfc_inta_ctrl = ioremap_nocache(0xe605807c, 0x4);
31
32 /* route signals to GIC */
33 iowrite32(0x0, pfc_inta_ctrl);
34
35 /*
36 * To mask the shared interrupt to SPI 149 we must ensure to set
37 * PRIO *and* MASK. Else we run into IRQ floods when registering
38 * the intc_irqpin devices
39 */
40 iowrite32(0x0, intc_prio_base + 0x0);
41 iowrite32(0x0, intc_prio_base + 0x4);
42 iowrite32(0x0, intc_prio_base + 0x8);
43 iowrite32(0x0, intc_prio_base + 0xc);
44 iowrite8(0xff, intc_msk_base + 0x0);
45 iowrite8(0xff, intc_msk_base + 0x4);
46 iowrite8(0xff, intc_msk_base + 0x8);
47 iowrite8(0xff, intc_msk_base + 0xc);
48
49 iounmap(intc_prio_base);
50 iounmap(intc_msk_base);
51 iounmap(pfc_inta_ctrl);
52}
53
54void __init r8a7740_init_irq_of(void)
55{
56 irqchip_init();
57 r8a7740_init_irq_common();
58}
59
60void __init r8a7740_init_irq(void)
61{
62 void __iomem *gic_dist_base = ioremap_nocache(0xc2800000, 0x1000);
63 void __iomem *gic_cpu_base = ioremap_nocache(0xc2000000, 0x1000);
64
65 /* initialize the Generic Interrupt Controller PL390 r0p0 */
66 gic_init(0, 29, gic_dist_base, gic_cpu_base);
67 r8a7740_init_irq_common();
68}
diff --git a/arch/arm/mach-shmobile/intc-r8a7779.c b/arch/arm/mach-shmobile/intc-r8a7779.c
deleted file mode 100644
index b86dc8908724..000000000000
--- a/arch/arm/mach-shmobile/intc-r8a7779.c
+++ /dev/null
@@ -1,131 +0,0 @@
1/*
2 * r8a7779 processor support - INTC hardware block
3 *
4 * Copyright (C) 2011 Renesas Solutions Corp.
5 * Copyright (C) 2011 Magnus Damm
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; version 2 of the License.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20#include <linux/kernel.h>
21#include <linux/init.h>
22#include <linux/platform_device.h>
23#include <linux/interrupt.h>
24#include <linux/irq.h>
25#include <linux/io.h>
26#include <linux/irqchip/arm-gic.h>
27#include <linux/platform_data/irq-renesas-intc-irqpin.h>
28#include <linux/irqchip.h>
29#include <mach/common.h>
30#include <mach/intc.h>
31#include <mach/irqs.h>
32#include <mach/r8a7779.h>
33#include <asm/mach-types.h>
34#include <asm/mach/arch.h>
35
36#define INT2SMSKCR0 IOMEM(0xfe7822a0)
37#define INT2SMSKCR1 IOMEM(0xfe7822a4)
38#define INT2SMSKCR2 IOMEM(0xfe7822a8)
39#define INT2SMSKCR3 IOMEM(0xfe7822ac)
40#define INT2SMSKCR4 IOMEM(0xfe7822b0)
41
42#define INT2NTSR0 IOMEM(0xfe700060)
43#define INT2NTSR1 IOMEM(0xfe700064)
44
45static struct renesas_intc_irqpin_config irqpin0_platform_data = {
46 .irq_base = irq_pin(0), /* IRQ0 -> IRQ3 */
47 .sense_bitfield_width = 2,
48};
49
50static struct resource irqpin0_resources[] = {
51 DEFINE_RES_MEM(0xfe78001c, 4), /* ICR1 */
52 DEFINE_RES_MEM(0xfe780010, 4), /* INTPRI */
53 DEFINE_RES_MEM(0xfe780024, 4), /* INTREQ */
54 DEFINE_RES_MEM(0xfe780044, 4), /* INTMSK0 */
55 DEFINE_RES_MEM(0xfe780064, 4), /* INTMSKCLR0 */
56 DEFINE_RES_IRQ(gic_spi(27)), /* IRQ0 */
57 DEFINE_RES_IRQ(gic_spi(28)), /* IRQ1 */
58 DEFINE_RES_IRQ(gic_spi(29)), /* IRQ2 */
59 DEFINE_RES_IRQ(gic_spi(30)), /* IRQ3 */
60};
61
62static struct platform_device irqpin0_device = {
63 .name = "renesas_intc_irqpin",
64 .id = 0,
65 .resource = irqpin0_resources,
66 .num_resources = ARRAY_SIZE(irqpin0_resources),
67 .dev = {
68 .platform_data = &irqpin0_platform_data,
69 },
70};
71
72void __init r8a7779_init_irq_extpin(int irlm)
73{
74 void __iomem *icr0 = ioremap_nocache(0xfe780000, PAGE_SIZE);
75 unsigned long tmp;
76
77 if (icr0) {
78 tmp = ioread32(icr0);
79 if (irlm)
80 tmp |= 1 << 23; /* IRQ0 -> IRQ3 as individual pins */
81 else
82 tmp &= ~(1 << 23); /* IRL mode - not supported */
83 tmp |= (1 << 21); /* LVLMODE = 1 */
84 iowrite32(tmp, icr0);
85 iounmap(icr0);
86
87 if (irlm)
88 platform_device_register(&irqpin0_device);
89 } else
90 pr_warn("r8a7779: unable to setup external irq pin mode\n");
91}
92
93static int r8a7779_set_wake(struct irq_data *data, unsigned int on)
94{
95 return 0; /* always allow wakeup */
96}
97
98static void __init r8a7779_init_irq_common(void)
99{
100 gic_arch_extn.irq_set_wake = r8a7779_set_wake;
101
102 /* route all interrupts to ARM */
103 __raw_writel(0xffffffff, INT2NTSR0);
104 __raw_writel(0x3fffffff, INT2NTSR1);
105
106 /* unmask all known interrupts in INTCS2 */
107 __raw_writel(0xfffffff0, INT2SMSKCR0);
108 __raw_writel(0xfff7ffff, INT2SMSKCR1);
109 __raw_writel(0xfffbffdf, INT2SMSKCR2);
110 __raw_writel(0xbffffffc, INT2SMSKCR3);
111 __raw_writel(0x003fee3f, INT2SMSKCR4);
112}
113
114void __init r8a7779_init_irq(void)
115{
116 void __iomem *gic_dist_base = IOMEM(0xf0001000);
117 void __iomem *gic_cpu_base = IOMEM(0xf0000100);
118
119 /* use GIC to handle interrupts */
120 gic_init(0, 29, gic_dist_base, gic_cpu_base);
121
122 r8a7779_init_irq_common();
123}
124
125#ifdef CONFIG_OF
126void __init r8a7779_init_irq_dt(void)
127{
128 irqchip_init();
129 r8a7779_init_irq_common();
130}
131#endif
diff --git a/arch/arm/mach-shmobile/platsmp-scu.c b/arch/arm/mach-shmobile/platsmp-scu.c
new file mode 100644
index 000000000000..c96f50160be6
--- /dev/null
+++ b/arch/arm/mach-shmobile/platsmp-scu.c
@@ -0,0 +1,81 @@
1/*
2 * SMP support for SoCs with SCU covered by mach-shmobile
3 *
4 * Copyright (C) 2013 Magnus Damm
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10#include <linux/delay.h>
11#include <linux/init.h>
12#include <linux/io.h>
13#include <linux/smp.h>
14#include <asm/cacheflush.h>
15#include <asm/smp_plat.h>
16#include <asm/smp_scu.h>
17#include <mach/common.h>
18
19void __init shmobile_smp_scu_prepare_cpus(unsigned int max_cpus)
20{
21 /* install boot code shared by all CPUs */
22 shmobile_boot_fn = virt_to_phys(shmobile_smp_boot);
23 shmobile_boot_arg = MPIDR_HWID_BITMASK;
24
25 /* enable SCU and cache coherency on booting CPU */
26 scu_enable(shmobile_scu_base);
27 scu_power_mode(shmobile_scu_base, SCU_PM_NORMAL);
28}
29
30int shmobile_smp_scu_boot_secondary(unsigned int cpu, struct task_struct *idle)
31{
32 /* For this particular CPU register SCU boot vector */
33 shmobile_smp_hook(cpu, virt_to_phys(shmobile_boot_scu),
34 (unsigned long)shmobile_scu_base);
35 return 0;
36}
37
38#ifdef CONFIG_HOTPLUG_CPU
39void shmobile_smp_scu_cpu_die(unsigned int cpu)
40{
41 /* For this particular CPU deregister boot vector */
42 shmobile_smp_hook(cpu, 0, 0);
43
44 dsb();
45 flush_cache_all();
46
47 /* disable cache coherency */
48 scu_power_mode(shmobile_scu_base, SCU_PM_POWEROFF);
49
50 /* jump to shared mach-shmobile sleep / reset code */
51 shmobile_smp_sleep();
52}
53
54static int shmobile_smp_scu_psr_core_disabled(int cpu)
55{
56 unsigned long mask = SCU_PM_POWEROFF << (cpu * 8);
57
58 if ((__raw_readl(shmobile_scu_base + 8) & mask) == mask)
59 return 1;
60
61 return 0;
62}
63
64int shmobile_smp_scu_cpu_kill(unsigned int cpu)
65{
66 int k;
67
68 /* this function is running on another CPU than the offline target,
69 * here we need wait for shutdown code in platform_cpu_die() to
70 * finish before asking SoC-specific code to power off the CPU core.
71 */
72 for (k = 0; k < 1000; k++) {
73 if (shmobile_smp_scu_psr_core_disabled(cpu))
74 return 1;
75
76 mdelay(1);
77 }
78
79 return 0;
80}
81#endif
diff --git a/arch/arm/mach-shmobile/platsmp.c b/arch/arm/mach-shmobile/platsmp.c
index 1f958d7b0bac..d4ae616bcedb 100644
--- a/arch/arm/mach-shmobile/platsmp.c
+++ b/arch/arm/mach-shmobile/platsmp.c
@@ -12,6 +12,9 @@
12 */ 12 */
13#include <linux/init.h> 13#include <linux/init.h>
14#include <linux/smp.h> 14#include <linux/smp.h>
15#include <asm/cacheflush.h>
16#include <asm/smp_plat.h>
17#include <mach/common.h>
15 18
16void __init shmobile_smp_init_cpus(unsigned int ncores) 19void __init shmobile_smp_init_cpus(unsigned int ncores)
17{ 20{
@@ -26,3 +29,18 @@ void __init shmobile_smp_init_cpus(unsigned int ncores)
26 for (i = 0; i < ncores; i++) 29 for (i = 0; i < ncores; i++)
27 set_cpu_possible(i, true); 30 set_cpu_possible(i, true);
28} 31}
32
33extern unsigned long shmobile_smp_fn[];
34extern unsigned long shmobile_smp_arg[];
35extern unsigned long shmobile_smp_mpidr[];
36
37void shmobile_smp_hook(unsigned int cpu, unsigned long fn, unsigned long arg)
38{
39 shmobile_smp_fn[cpu] = 0;
40 flush_cache_all();
41
42 shmobile_smp_mpidr[cpu] = cpu_logical_map(cpu);
43 shmobile_smp_fn[cpu] = fn;
44 shmobile_smp_arg[cpu] = arg;
45 flush_cache_all();
46}
diff --git a/arch/arm/mach-shmobile/setup-emev2.c b/arch/arm/mach-shmobile/setup-emev2.c
index 1ccddd228112..3ad531caf4f0 100644
--- a/arch/arm/mach-shmobile/setup-emev2.c
+++ b/arch/arm/mach-shmobile/setup-emev2.c
@@ -20,7 +20,6 @@
20#include <linux/init.h> 20#include <linux/init.h>
21#include <linux/interrupt.h> 21#include <linux/interrupt.h>
22#include <linux/irq.h> 22#include <linux/irq.h>
23#include <linux/irqchip.h>
24#include <linux/platform_device.h> 23#include <linux/platform_device.h>
25#include <linux/platform_data/gpio-em.h> 24#include <linux/platform_data/gpio-em.h>
26#include <linux/of_platform.h> 25#include <linux/of_platform.h>
@@ -28,7 +27,6 @@
28#include <linux/input.h> 27#include <linux/input.h>
29#include <linux/io.h> 28#include <linux/io.h>
30#include <linux/irqchip/arm-gic.h> 29#include <linux/irqchip/arm-gic.h>
31#include <mach/hardware.h>
32#include <mach/common.h> 30#include <mach/common.h>
33#include <mach/emev2.h> 31#include <mach/emev2.h>
34#include <mach/irqs.h> 32#include <mach/irqs.h>
@@ -39,13 +37,6 @@
39 37
40static struct map_desc emev2_io_desc[] __initdata = { 38static struct map_desc emev2_io_desc[] __initdata = {
41#ifdef CONFIG_SMP 39#ifdef CONFIG_SMP
42 /* 128K entity map for 0xe0100000 (SMU) */
43 {
44 .virtual = 0xe0100000,
45 .pfn = __phys_to_pfn(0xe0100000),
46 .length = SZ_128K,
47 .type = MT_DEVICE
48 },
49 /* 2M mapping for SCU + L2 controller */ 40 /* 2M mapping for SCU + L2 controller */
50 { 41 {
51 .virtual = 0xf0000000, 42 .virtual = 0xf0000000,
@@ -63,102 +54,40 @@ void __init emev2_map_io(void)
63 54
64/* UART */ 55/* UART */
65static struct resource uart0_resources[] = { 56static struct resource uart0_resources[] = {
66 [0] = { 57 DEFINE_RES_MEM(0xe1020000, 0x38),
67 .start = 0xe1020000, 58 DEFINE_RES_IRQ(40),
68 .end = 0xe1020037,
69 .flags = IORESOURCE_MEM,
70 },
71 [1] = {
72 .start = 40,
73 .flags = IORESOURCE_IRQ,
74 }
75};
76
77static struct platform_device uart0_device = {
78 .name = "serial8250-em",
79 .id = 0,
80 .num_resources = ARRAY_SIZE(uart0_resources),
81 .resource = uart0_resources,
82}; 59};
83 60
84static struct resource uart1_resources[] = { 61static struct resource uart1_resources[] = {
85 [0] = { 62 DEFINE_RES_MEM(0xe1030000, 0x38),
86 .start = 0xe1030000, 63 DEFINE_RES_IRQ(41),
87 .end = 0xe1030037,
88 .flags = IORESOURCE_MEM,
89 },
90 [1] = {
91 .start = 41,
92 .flags = IORESOURCE_IRQ,
93 }
94};
95
96static struct platform_device uart1_device = {
97 .name = "serial8250-em",
98 .id = 1,
99 .num_resources = ARRAY_SIZE(uart1_resources),
100 .resource = uart1_resources,
101}; 64};
102 65
103static struct resource uart2_resources[] = { 66static struct resource uart2_resources[] = {
104 [0] = { 67 DEFINE_RES_MEM(0xe1040000, 0x38),
105 .start = 0xe1040000, 68 DEFINE_RES_IRQ(42),
106 .end = 0xe1040037,
107 .flags = IORESOURCE_MEM,
108 },
109 [1] = {
110 .start = 42,
111 .flags = IORESOURCE_IRQ,
112 }
113};
114
115static struct platform_device uart2_device = {
116 .name = "serial8250-em",
117 .id = 2,
118 .num_resources = ARRAY_SIZE(uart2_resources),
119 .resource = uart2_resources,
120}; 69};
121 70
122static struct resource uart3_resources[] = { 71static struct resource uart3_resources[] = {
123 [0] = { 72 DEFINE_RES_MEM(0xe1050000, 0x38),
124 .start = 0xe1050000, 73 DEFINE_RES_IRQ(43),
125 .end = 0xe1050037,
126 .flags = IORESOURCE_MEM,
127 },
128 [1] = {
129 .start = 43,
130 .flags = IORESOURCE_IRQ,
131 }
132}; 74};
133 75
134static struct platform_device uart3_device = { 76#define emev2_register_uart(idx) \
135 .name = "serial8250-em", 77 platform_device_register_simple("serial8250-em", idx, \
136 .id = 3, 78 uart##idx##_resources, \
137 .num_resources = ARRAY_SIZE(uart3_resources), 79 ARRAY_SIZE(uart##idx##_resources))
138 .resource = uart3_resources,
139};
140 80
141/* STI */ 81/* STI */
142static struct resource sti_resources[] = { 82static struct resource sti_resources[] = {
143 [0] = { 83 DEFINE_RES_MEM(0xe0180000, 0x54),
144 .name = "STI", 84 DEFINE_RES_IRQ(157),
145 .start = 0xe0180000,
146 .end = 0xe0180053,
147 .flags = IORESOURCE_MEM,
148 },
149 [1] = {
150 .start = 157,
151 .flags = IORESOURCE_IRQ,
152 },
153};
154
155static struct platform_device sti_device = {
156 .name = "em_sti",
157 .id = 0,
158 .resource = sti_resources,
159 .num_resources = ARRAY_SIZE(sti_resources),
160}; 85};
161 86
87#define emev2_register_sti() \
88 platform_device_register_simple("em_sti", 0, \
89 sti_resources, \
90 ARRAY_SIZE(sti_resources))
162 91
163/* GIO */ 92/* GIO */
164static struct gpio_em_config gio0_config = { 93static struct gpio_em_config gio0_config = {
@@ -168,36 +97,10 @@ static struct gpio_em_config gio0_config = {
168}; 97};
169 98
170static struct resource gio0_resources[] = { 99static struct resource gio0_resources[] = {
171 [0] = { 100 DEFINE_RES_MEM(0xe0050000, 0x2c),
172 .name = "GIO_000", 101 DEFINE_RES_MEM(0xe0050040, 0x20),
173 .start = 0xe0050000, 102 DEFINE_RES_IRQ(99),
174 .end = 0xe005002b, 103 DEFINE_RES_IRQ(100),
175 .flags = IORESOURCE_MEM,
176 },
177 [1] = {
178 .name = "GIO_000",
179 .start = 0xe0050040,
180 .end = 0xe005005f,
181 .flags = IORESOURCE_MEM,
182 },
183 [2] = {
184 .start = 99,
185 .flags = IORESOURCE_IRQ,
186 },
187 [3] = {
188 .start = 100,
189 .flags = IORESOURCE_IRQ,
190 },
191};
192
193static struct platform_device gio0_device = {
194 .name = "em_gio",
195 .id = 0,
196 .resource = gio0_resources,
197 .num_resources = ARRAY_SIZE(gio0_resources),
198 .dev = {
199 .platform_data = &gio0_config,
200 },
201}; 104};
202 105
203static struct gpio_em_config gio1_config = { 106static struct gpio_em_config gio1_config = {
@@ -207,36 +110,10 @@ static struct gpio_em_config gio1_config = {
207}; 110};
208 111
209static struct resource gio1_resources[] = { 112static struct resource gio1_resources[] = {
210 [0] = { 113 DEFINE_RES_MEM(0xe0050080, 0x2c),
211 .name = "GIO_032", 114 DEFINE_RES_MEM(0xe00500c0, 0x20),
212 .start = 0xe0050080, 115 DEFINE_RES_IRQ(101),
213 .end = 0xe00500ab, 116 DEFINE_RES_IRQ(102),
214 .flags = IORESOURCE_MEM,
215 },
216 [1] = {
217 .name = "GIO_032",
218 .start = 0xe00500c0,
219 .end = 0xe00500df,
220 .flags = IORESOURCE_MEM,
221 },
222 [2] = {
223 .start = 101,
224 .flags = IORESOURCE_IRQ,
225 },
226 [3] = {
227 .start = 102,
228 .flags = IORESOURCE_IRQ,
229 },
230};
231
232static struct platform_device gio1_device = {
233 .name = "em_gio",
234 .id = 1,
235 .resource = gio1_resources,
236 .num_resources = ARRAY_SIZE(gio1_resources),
237 .dev = {
238 .platform_data = &gio1_config,
239 },
240}; 117};
241 118
242static struct gpio_em_config gio2_config = { 119static struct gpio_em_config gio2_config = {
@@ -246,36 +123,10 @@ static struct gpio_em_config gio2_config = {
246}; 123};
247 124
248static struct resource gio2_resources[] = { 125static struct resource gio2_resources[] = {
249 [0] = { 126 DEFINE_RES_MEM(0xe0050100, 0x2c),
250 .name = "GIO_064", 127 DEFINE_RES_MEM(0xe0050140, 0x20),
251 .start = 0xe0050100, 128 DEFINE_RES_IRQ(103),
252 .end = 0xe005012b, 129 DEFINE_RES_IRQ(104),
253 .flags = IORESOURCE_MEM,
254 },
255 [1] = {
256 .name = "GIO_064",
257 .start = 0xe0050140,
258 .end = 0xe005015f,
259 .flags = IORESOURCE_MEM,
260 },
261 [2] = {
262 .start = 103,
263 .flags = IORESOURCE_IRQ,
264 },
265 [3] = {
266 .start = 104,
267 .flags = IORESOURCE_IRQ,
268 },
269};
270
271static struct platform_device gio2_device = {
272 .name = "em_gio",
273 .id = 2,
274 .resource = gio2_resources,
275 .num_resources = ARRAY_SIZE(gio2_resources),
276 .dev = {
277 .platform_data = &gio2_config,
278 },
279}; 130};
280 131
281static struct gpio_em_config gio3_config = { 132static struct gpio_em_config gio3_config = {
@@ -285,36 +136,10 @@ static struct gpio_em_config gio3_config = {
285}; 136};
286 137
287static struct resource gio3_resources[] = { 138static struct resource gio3_resources[] = {
288 [0] = { 139 DEFINE_RES_MEM(0xe0050180, 0x2c),
289 .name = "GIO_096", 140 DEFINE_RES_MEM(0xe00501c0, 0x20),
290 .start = 0xe0050180, 141 DEFINE_RES_IRQ(105),
291 .end = 0xe00501ab, 142 DEFINE_RES_IRQ(106),
292 .flags = IORESOURCE_MEM,
293 },
294 [1] = {
295 .name = "GIO_096",
296 .start = 0xe00501c0,
297 .end = 0xe00501df,
298 .flags = IORESOURCE_MEM,
299 },
300 [2] = {
301 .start = 105,
302 .flags = IORESOURCE_IRQ,
303 },
304 [3] = {
305 .start = 106,
306 .flags = IORESOURCE_IRQ,
307 },
308};
309
310static struct platform_device gio3_device = {
311 .name = "em_gio",
312 .id = 3,
313 .resource = gio3_resources,
314 .num_resources = ARRAY_SIZE(gio3_resources),
315 .dev = {
316 .platform_data = &gio3_config,
317 },
318}; 143};
319 144
320static struct gpio_em_config gio4_config = { 145static struct gpio_em_config gio4_config = {
@@ -324,126 +149,53 @@ static struct gpio_em_config gio4_config = {
324}; 149};
325 150
326static struct resource gio4_resources[] = { 151static struct resource gio4_resources[] = {
327 [0] = { 152 DEFINE_RES_MEM(0xe0050200, 0x2c),
328 .name = "GIO_128", 153 DEFINE_RES_MEM(0xe0050240, 0x20),
329 .start = 0xe0050200, 154 DEFINE_RES_IRQ(107),
330 .end = 0xe005022b, 155 DEFINE_RES_IRQ(108),
331 .flags = IORESOURCE_MEM,
332 },
333 [1] = {
334 .name = "GIO_128",
335 .start = 0xe0050240,
336 .end = 0xe005025f,
337 .flags = IORESOURCE_MEM,
338 },
339 [2] = {
340 .start = 107,
341 .flags = IORESOURCE_IRQ,
342 },
343 [3] = {
344 .start = 108,
345 .flags = IORESOURCE_IRQ,
346 },
347}; 156};
348 157
349static struct platform_device gio4_device = { 158#define emev2_register_gio(idx) \
350 .name = "em_gio", 159 platform_device_register_resndata(&platform_bus, "em_gio", \
351 .id = 4, 160 idx, gio##idx##_resources, \
352 .resource = gio4_resources, 161 ARRAY_SIZE(gio##idx##_resources), \
353 .num_resources = ARRAY_SIZE(gio4_resources), 162 &gio##idx##_config, \
354 .dev = { 163 sizeof(struct gpio_em_config))
355 .platform_data = &gio4_config,
356 },
357};
358 164
359static struct resource pmu_resources[] = { 165static struct resource pmu_resources[] = {
360 [0] = { 166 DEFINE_RES_IRQ(152),
361 .start = 152, 167 DEFINE_RES_IRQ(153),
362 .end = 152,
363 .flags = IORESOURCE_IRQ,
364 },
365 [1] = {
366 .start = 153,
367 .end = 153,
368 .flags = IORESOURCE_IRQ,
369 },
370};
371
372static struct platform_device pmu_device = {
373 .name = "arm-pmu",
374 .id = -1,
375 .num_resources = ARRAY_SIZE(pmu_resources),
376 .resource = pmu_resources,
377}; 168};
378 169
379static struct platform_device *emev2_early_devices[] __initdata = { 170#define emev2_register_pmu() \
380 &uart0_device, 171 platform_device_register_simple("arm-pmu", -1, \
381 &uart1_device, 172 pmu_resources, \
382 &uart2_device, 173 ARRAY_SIZE(pmu_resources))
383 &uart3_device,
384};
385
386static struct platform_device *emev2_late_devices[] __initdata = {
387 &sti_device,
388 &gio0_device,
389 &gio1_device,
390 &gio2_device,
391 &gio3_device,
392 &gio4_device,
393 &pmu_device,
394};
395 174
396void __init emev2_add_standard_devices(void) 175void __init emev2_add_standard_devices(void)
397{ 176{
398 emev2_clock_init(); 177 if (!IS_ENABLED(CONFIG_COMMON_CLK))
399 178 emev2_clock_init();
400 platform_add_devices(emev2_early_devices, 179
401 ARRAY_SIZE(emev2_early_devices)); 180 emev2_register_uart(0);
402 181 emev2_register_uart(1);
403 platform_add_devices(emev2_late_devices, 182 emev2_register_uart(2);
404 ARRAY_SIZE(emev2_late_devices)); 183 emev2_register_uart(3);
184 emev2_register_sti();
185 emev2_register_gio(0);
186 emev2_register_gio(1);
187 emev2_register_gio(2);
188 emev2_register_gio(3);
189 emev2_register_gio(4);
190 emev2_register_pmu();
405} 191}
406 192
407static void __init emev2_init_delay(void) 193void __init emev2_init_delay(void)
408{ 194{
409 shmobile_setup_delay(533, 1, 3); /* Cortex-A9 @ 533MHz */ 195 shmobile_setup_delay(533, 1, 3); /* Cortex-A9 @ 533MHz */
410} 196}
411 197
412void __init emev2_add_early_devices(void)
413{
414 emev2_init_delay();
415
416 early_platform_add_devices(emev2_early_devices,
417 ARRAY_SIZE(emev2_early_devices));
418
419 /* setup early console here as well */
420 shmobile_setup_console();
421}
422
423void __init emev2_init_irq(void)
424{
425 void __iomem *gic_dist_base;
426 void __iomem *gic_cpu_base;
427
428 /* Static mappings, never released */
429 gic_dist_base = ioremap(0xe0028000, PAGE_SIZE);
430 gic_cpu_base = ioremap(0xe0020000, PAGE_SIZE);
431 BUG_ON(!gic_dist_base || !gic_cpu_base);
432
433 /* Use GIC to handle interrupts */
434 gic_init(0, 29, gic_dist_base, gic_cpu_base);
435}
436
437#ifdef CONFIG_USE_OF 198#ifdef CONFIG_USE_OF
438static const struct of_dev_auxdata emev2_auxdata_lookup[] __initconst = {
439 { }
440};
441
442static void __init emev2_add_standard_devices_dt(void)
443{
444 of_platform_populate(NULL, of_default_bus_match_table,
445 emev2_auxdata_lookup, NULL);
446}
447 199
448static const char *emev2_boards_compat_dt[] __initdata = { 200static const char *emev2_boards_compat_dt[] __initdata = {
449 "renesas,emev2", 201 "renesas,emev2",
@@ -452,10 +204,8 @@ static const char *emev2_boards_compat_dt[] __initdata = {
452 204
453DT_MACHINE_START(EMEV2_DT, "Generic Emma Mobile EV2 (Flattened Device Tree)") 205DT_MACHINE_START(EMEV2_DT, "Generic Emma Mobile EV2 (Flattened Device Tree)")
454 .smp = smp_ops(emev2_smp_ops), 206 .smp = smp_ops(emev2_smp_ops),
207 .map_io = emev2_map_io,
455 .init_early = emev2_init_delay, 208 .init_early = emev2_init_delay,
456 .nr_irqs = NR_IRQS_LEGACY,
457 .init_irq = irqchip_init,
458 .init_machine = emev2_add_standard_devices_dt,
459 .dt_compat = emev2_boards_compat_dt, 209 .dt_compat = emev2_boards_compat_dt,
460MACHINE_END 210MACHINE_END
461 211
diff --git a/arch/arm/mach-shmobile/setup-r8a73a4.c b/arch/arm/mach-shmobile/setup-r8a73a4.c
index 7f45c2edbca9..89491700afb7 100644
--- a/arch/arm/mach-shmobile/setup-r8a73a4.c
+++ b/arch/arm/mach-shmobile/setup-r8a73a4.c
@@ -18,11 +18,11 @@
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */ 19 */
20#include <linux/irq.h> 20#include <linux/irq.h>
21#include <linux/irqchip.h>
22#include <linux/kernel.h> 21#include <linux/kernel.h>
23#include <linux/of_platform.h> 22#include <linux/of_platform.h>
24#include <linux/platform_data/irq-renesas-irqc.h> 23#include <linux/platform_data/irq-renesas-irqc.h>
25#include <linux/serial_sci.h> 24#include <linux/serial_sci.h>
25#include <linux/sh_timer.h>
26#include <mach/common.h> 26#include <mach/common.h>
27#include <mach/irqs.h> 27#include <mach/irqs.h>
28#include <mach/r8a73a4.h> 28#include <mach/r8a73a4.h>
@@ -169,7 +169,26 @@ static const struct resource thermal0_resources[] = {
169 thermal0_resources, \ 169 thermal0_resources, \
170 ARRAY_SIZE(thermal0_resources)) 170 ARRAY_SIZE(thermal0_resources))
171 171
172void __init r8a73a4_add_standard_devices(void) 172static struct sh_timer_config cmt10_platform_data = {
173 .name = "CMT10",
174 .timer_bit = 0,
175 .clockevent_rating = 80,
176};
177
178static struct resource cmt10_resources[] = {
179 DEFINE_RES_MEM(0xe6130010, 0x0c),
180 DEFINE_RES_MEM(0xe6130000, 0x04),
181 DEFINE_RES_IRQ(gic_spi(120)), /* CMT1_0 */
182};
183
184#define r8a7790_register_cmt(idx) \
185 platform_device_register_resndata(&platform_bus, "sh_cmt", \
186 idx, cmt##idx##_resources, \
187 ARRAY_SIZE(cmt##idx##_resources), \
188 &cmt##idx##_platform_data, \
189 sizeof(struct sh_timer_config))
190
191void __init r8a73a4_add_dt_devices(void)
173{ 192{
174 r8a73a4_register_scif(SCIFA0); 193 r8a73a4_register_scif(SCIFA0);
175 r8a73a4_register_scif(SCIFA1); 194 r8a73a4_register_scif(SCIFA1);
@@ -177,26 +196,33 @@ void __init r8a73a4_add_standard_devices(void)
177 r8a73a4_register_scif(SCIFB1); 196 r8a73a4_register_scif(SCIFB1);
178 r8a73a4_register_scif(SCIFB2); 197 r8a73a4_register_scif(SCIFB2);
179 r8a73a4_register_scif(SCIFB3); 198 r8a73a4_register_scif(SCIFB3);
199 r8a7790_register_cmt(10);
200}
201
202void __init r8a73a4_add_standard_devices(void)
203{
204 r8a73a4_add_dt_devices();
180 r8a73a4_register_irqc(0); 205 r8a73a4_register_irqc(0);
181 r8a73a4_register_irqc(1); 206 r8a73a4_register_irqc(1);
182 r8a73a4_register_thermal(); 207 r8a73a4_register_thermal();
183} 208}
184 209
185#ifdef CONFIG_USE_OF 210void __init r8a73a4_init_delay(void)
186void __init r8a73a4_add_standard_devices_dt(void)
187{ 211{
188 of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); 212#ifndef CONFIG_ARM_ARCH_TIMER
213 shmobile_setup_delay(1500, 2, 4); /* Cortex-A15 @ 1500MHz */
214#endif
189} 215}
190 216
217#ifdef CONFIG_USE_OF
218
191static const char *r8a73a4_boards_compat_dt[] __initdata = { 219static const char *r8a73a4_boards_compat_dt[] __initdata = {
192 "renesas,r8a73a4", 220 "renesas,r8a73a4",
193 NULL, 221 NULL,
194}; 222};
195 223
196DT_MACHINE_START(R8A73A4_DT, "Generic R8A73A4 (Flattened Device Tree)") 224DT_MACHINE_START(R8A73A4_DT, "Generic R8A73A4 (Flattened Device Tree)")
197 .init_irq = irqchip_init, 225 .init_early = r8a73a4_init_delay,
198 .init_machine = r8a73a4_add_standard_devices_dt,
199 .init_time = shmobile_timer_init,
200 .dt_compat = r8a73a4_boards_compat_dt, 226 .dt_compat = r8a73a4_boards_compat_dt,
201MACHINE_END 227MACHINE_END
202#endif /* CONFIG_USE_OF */ 228#endif /* CONFIG_USE_OF */
diff --git a/arch/arm/mach-shmobile/setup-r8a7740.c b/arch/arm/mach-shmobile/setup-r8a7740.c
index 00c5a707238b..b7d4b2c3bc29 100644
--- a/arch/arm/mach-shmobile/setup-r8a7740.c
+++ b/arch/arm/mach-shmobile/setup-r8a7740.c
@@ -22,6 +22,8 @@
22#include <linux/kernel.h> 22#include <linux/kernel.h>
23#include <linux/init.h> 23#include <linux/init.h>
24#include <linux/io.h> 24#include <linux/io.h>
25#include <linux/irqchip.h>
26#include <linux/irqchip/arm-gic.h>
25#include <linux/platform_data/irq-renesas-intc-irqpin.h> 27#include <linux/platform_data/irq-renesas-intc-irqpin.h>
26#include <linux/platform_device.h> 28#include <linux/platform_device.h>
27#include <linux/of_platform.h> 29#include <linux/of_platform.h>
@@ -588,6 +590,16 @@ static const struct sh_dmae_slave_config r8a7740_dmae_slaves[] = {
588 .addr = 0xfe1f0064, 590 .addr = 0xfe1f0064,
589 .chcr = CHCR_TX(XMIT_SZ_32BIT), 591 .chcr = CHCR_TX(XMIT_SZ_32BIT),
590 .mid_rid = 0xb5, 592 .mid_rid = 0xb5,
593 }, {
594 .slave_id = SHDMA_SLAVE_MMCIF_TX,
595 .addr = 0xe6bd0034,
596 .chcr = CHCR_TX(XMIT_SZ_32BIT),
597 .mid_rid = 0xd1,
598 }, {
599 .slave_id = SHDMA_SLAVE_MMCIF_RX,
600 .addr = 0xe6bd0034,
601 .chcr = CHCR_RX(XMIT_SZ_32BIT),
602 .mid_rid = 0xd2,
591 }, 603 },
592}; 604};
593 605
@@ -986,16 +998,22 @@ void __init r8a7740_add_early_devices(void)
986 998
987#ifdef CONFIG_USE_OF 999#ifdef CONFIG_USE_OF
988 1000
989static const struct of_dev_auxdata r8a7740_auxdata_lookup[] __initconst = { 1001void __init r8a7740_add_early_devices_dt(void)
990 { } 1002{
991}; 1003 shmobile_setup_delay(800, 1, 3); /* Cortex-A9 @ 800MHz */
1004
1005 early_platform_add_devices(r8a7740_early_devices,
1006 ARRAY_SIZE(r8a7740_early_devices));
1007
1008 /* setup early console here as well */
1009 shmobile_setup_console();
1010}
992 1011
993void __init r8a7740_add_standard_devices_dt(void) 1012void __init r8a7740_add_standard_devices_dt(void)
994{ 1013{
995 platform_add_devices(r8a7740_devices_dt, 1014 platform_add_devices(r8a7740_devices_dt,
996 ARRAY_SIZE(r8a7740_devices_dt)); 1015 ARRAY_SIZE(r8a7740_devices_dt));
997 of_platform_populate(NULL, of_default_bus_match_table, 1016 of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
998 r8a7740_auxdata_lookup, NULL);
999} 1017}
1000 1018
1001void __init r8a7740_init_delay(void) 1019void __init r8a7740_init_delay(void)
@@ -1003,6 +1021,36 @@ void __init r8a7740_init_delay(void)
1003 shmobile_setup_delay(800, 1, 3); /* Cortex-A9 @ 800MHz */ 1021 shmobile_setup_delay(800, 1, 3); /* Cortex-A9 @ 800MHz */
1004}; 1022};
1005 1023
1024void __init r8a7740_init_irq_of(void)
1025{
1026 void __iomem *intc_prio_base = ioremap_nocache(0xe6900010, 0x10);
1027 void __iomem *intc_msk_base = ioremap_nocache(0xe6900040, 0x10);
1028 void __iomem *pfc_inta_ctrl = ioremap_nocache(0xe605807c, 0x4);
1029
1030 irqchip_init();
1031
1032 /* route signals to GIC */
1033 iowrite32(0x0, pfc_inta_ctrl);
1034
1035 /*
1036 * To mask the shared interrupt to SPI 149 we must ensure to set
1037 * PRIO *and* MASK. Else we run into IRQ floods when registering
1038 * the intc_irqpin devices
1039 */
1040 iowrite32(0x0, intc_prio_base + 0x0);
1041 iowrite32(0x0, intc_prio_base + 0x4);
1042 iowrite32(0x0, intc_prio_base + 0x8);
1043 iowrite32(0x0, intc_prio_base + 0xc);
1044 iowrite8(0xff, intc_msk_base + 0x0);
1045 iowrite8(0xff, intc_msk_base + 0x4);
1046 iowrite8(0xff, intc_msk_base + 0x8);
1047 iowrite8(0xff, intc_msk_base + 0xc);
1048
1049 iounmap(intc_prio_base);
1050 iounmap(intc_msk_base);
1051 iounmap(pfc_inta_ctrl);
1052}
1053
1006static void __init r8a7740_generic_init(void) 1054static void __init r8a7740_generic_init(void)
1007{ 1055{
1008 r8a7740_clock_init(0); 1056 r8a7740_clock_init(0);
@@ -1019,7 +1067,6 @@ DT_MACHINE_START(R8A7740_DT, "Generic R8A7740 (Flattened Device Tree)")
1019 .init_early = r8a7740_init_delay, 1067 .init_early = r8a7740_init_delay,
1020 .init_irq = r8a7740_init_irq_of, 1068 .init_irq = r8a7740_init_irq_of,
1021 .init_machine = r8a7740_generic_init, 1069 .init_machine = r8a7740_generic_init,
1022 .init_time = shmobile_timer_init,
1023 .dt_compat = r8a7740_boards_compat_dt, 1070 .dt_compat = r8a7740_boards_compat_dt,
1024MACHINE_END 1071MACHINE_END
1025 1072
diff --git a/arch/arm/mach-shmobile/setup-r8a7778.c b/arch/arm/mach-shmobile/setup-r8a7778.c
index 80c20392ad7c..6a2657ebd197 100644
--- a/arch/arm/mach-shmobile/setup-r8a7778.c
+++ b/arch/arm/mach-shmobile/setup-r8a7778.c
@@ -53,7 +53,7 @@
53 .irqs = SCIx_IRQ_MUXED(irq), \ 53 .irqs = SCIx_IRQ_MUXED(irq), \
54} 54}
55 55
56static struct plat_sci_port scif_platform_data[] = { 56static struct plat_sci_port scif_platform_data[] __initdata = {
57 SCIF_INFO(0xffe40000, gic_iid(0x66)), 57 SCIF_INFO(0xffe40000, gic_iid(0x66)),
58 SCIF_INFO(0xffe41000, gic_iid(0x67)), 58 SCIF_INFO(0xffe41000, gic_iid(0x67)),
59 SCIF_INFO(0xffe42000, gic_iid(0x68)), 59 SCIF_INFO(0xffe42000, gic_iid(0x68)),
@@ -63,24 +63,24 @@ static struct plat_sci_port scif_platform_data[] = {
63}; 63};
64 64
65/* TMU */ 65/* TMU */
66static struct resource sh_tmu0_resources[] = { 66static struct resource sh_tmu0_resources[] __initdata = {
67 DEFINE_RES_MEM(0xffd80008, 12), 67 DEFINE_RES_MEM(0xffd80008, 12),
68 DEFINE_RES_IRQ(gic_iid(0x40)), 68 DEFINE_RES_IRQ(gic_iid(0x40)),
69}; 69};
70 70
71static struct sh_timer_config sh_tmu0_platform_data = { 71static struct sh_timer_config sh_tmu0_platform_data __initdata = {
72 .name = "TMU00", 72 .name = "TMU00",
73 .channel_offset = 0x4, 73 .channel_offset = 0x4,
74 .timer_bit = 0, 74 .timer_bit = 0,
75 .clockevent_rating = 200, 75 .clockevent_rating = 200,
76}; 76};
77 77
78static struct resource sh_tmu1_resources[] = { 78static struct resource sh_tmu1_resources[] __initdata = {
79 DEFINE_RES_MEM(0xffd80014, 12), 79 DEFINE_RES_MEM(0xffd80014, 12),
80 DEFINE_RES_IRQ(gic_iid(0x41)), 80 DEFINE_RES_IRQ(gic_iid(0x41)),
81}; 81};
82 82
83static struct sh_timer_config sh_tmu1_platform_data = { 83static struct sh_timer_config sh_tmu1_platform_data __initdata = {
84 .name = "TMU01", 84 .name = "TMU01",
85 .channel_offset = 0x10, 85 .channel_offset = 0x10,
86 .timer_bit = 1, 86 .timer_bit = 1,
@@ -95,20 +95,6 @@ static struct sh_timer_config sh_tmu1_platform_data = {
95 &sh_tmu##idx##_platform_data, \ 95 &sh_tmu##idx##_platform_data, \
96 sizeof(sh_tmu##idx##_platform_data)) 96 sizeof(sh_tmu##idx##_platform_data))
97 97
98/* USB PHY */
99static struct resource usb_phy_resources[] __initdata = {
100 DEFINE_RES_MEM(0xffe70800, 0x100),
101 DEFINE_RES_MEM(0xffe76000, 0x100),
102};
103
104void __init r8a7778_add_usb_phy_device(struct rcar_phy_platform_data *pdata)
105{
106 platform_device_register_resndata(&platform_bus, "rcar_usb_phy", -1,
107 usb_phy_resources,
108 ARRAY_SIZE(usb_phy_resources),
109 pdata, sizeof(*pdata));
110}
111
112/* USB */ 98/* USB */
113static struct usb_phy *phy; 99static struct usb_phy *phy;
114 100
@@ -189,7 +175,7 @@ USB_PLATFORM_INFO(ehci);
189USB_PLATFORM_INFO(ohci); 175USB_PLATFORM_INFO(ohci);
190 176
191/* Ether */ 177/* Ether */
192static struct resource ether_resources[] = { 178static struct resource ether_resources[] __initdata = {
193 DEFINE_RES_MEM(0xfde00000, 0x400), 179 DEFINE_RES_MEM(0xfde00000, 0x400),
194 DEFINE_RES_IRQ(gic_iid(0x89)), 180 DEFINE_RES_IRQ(gic_iid(0x89)),
195}; 181};
@@ -203,17 +189,17 @@ void __init r8a7778_add_ether_device(struct sh_eth_plat_data *pdata)
203} 189}
204 190
205/* PFC/GPIO */ 191/* PFC/GPIO */
206static struct resource pfc_resources[] = { 192static struct resource pfc_resources[] __initdata = {
207 DEFINE_RES_MEM(0xfffc0000, 0x118), 193 DEFINE_RES_MEM(0xfffc0000, 0x118),
208}; 194};
209 195
210#define R8A7778_GPIO(idx) \ 196#define R8A7778_GPIO(idx) \
211static struct resource r8a7778_gpio##idx##_resources[] = { \ 197static struct resource r8a7778_gpio##idx##_resources[] __initdata = { \
212 DEFINE_RES_MEM(0xffc40000 + 0x1000 * (idx), 0x30), \ 198 DEFINE_RES_MEM(0xffc40000 + 0x1000 * (idx), 0x30), \
213 DEFINE_RES_IRQ(gic_iid(0x87)), \ 199 DEFINE_RES_IRQ(gic_iid(0x87)), \
214}; \ 200}; \
215 \ 201 \
216static struct gpio_rcar_config r8a7778_gpio##idx##_platform_data = { \ 202static struct gpio_rcar_config r8a7778_gpio##idx##_platform_data __initdata = { \
217 .gpio_base = 32 * (idx), \ 203 .gpio_base = 32 * (idx), \
218 .irq_base = GPIO_IRQ_BASE(idx), \ 204 .irq_base = GPIO_IRQ_BASE(idx), \
219 .number_of_pins = 32, \ 205 .number_of_pins = 32, \
@@ -248,30 +234,6 @@ void __init r8a7778_pinmux_init(void)
248 r8a7778_register_gpio(4); 234 r8a7778_register_gpio(4);
249}; 235};
250 236
251/* SDHI */
252static struct resource sdhi_resources[] = {
253 /* SDHI0 */
254 DEFINE_RES_MEM(0xFFE4C000, 0x100),
255 DEFINE_RES_IRQ(gic_iid(0x77)),
256 /* SDHI1 */
257 DEFINE_RES_MEM(0xFFE4D000, 0x100),
258 DEFINE_RES_IRQ(gic_iid(0x78)),
259 /* SDHI2 */
260 DEFINE_RES_MEM(0xFFE4F000, 0x100),
261 DEFINE_RES_IRQ(gic_iid(0x76)),
262};
263
264void __init r8a7778_sdhi_init(int id,
265 struct sh_mobile_sdhi_info *info)
266{
267 BUG_ON(id < 0 || id > 2);
268
269 platform_device_register_resndata(
270 &platform_bus, "sh_mobile_sdhi", id,
271 sdhi_resources + (2 * id), 2,
272 info, sizeof(*info));
273}
274
275/* I2C */ 237/* I2C */
276static struct resource i2c_resources[] __initdata = { 238static struct resource i2c_resources[] __initdata = {
277 /* I2C0 */ 239 /* I2C0 */
@@ -288,7 +250,7 @@ static struct resource i2c_resources[] __initdata = {
288 DEFINE_RES_IRQ(gic_iid(0x6d)), 250 DEFINE_RES_IRQ(gic_iid(0x6d)),
289}; 251};
290 252
291void __init r8a7778_add_i2c_device(int id) 253static void __init r8a7778_register_i2c(int id)
292{ 254{
293 BUG_ON(id < 0 || id > 3); 255 BUG_ON(id < 0 || id > 3);
294 256
@@ -310,7 +272,7 @@ static struct resource hspi_resources[] __initdata = {
310 DEFINE_RES_IRQ(gic_iid(0x75)), 272 DEFINE_RES_IRQ(gic_iid(0x75)),
311}; 273};
312 274
313void __init r8a7778_add_hspi_device(int id) 275void __init r8a7778_register_hspi(int id)
314{ 276{
315 BUG_ON(id < 0 || id > 2); 277 BUG_ON(id < 0 || id > 2);
316 278
@@ -319,21 +281,41 @@ void __init r8a7778_add_hspi_device(int id)
319 hspi_resources + (2 * id), 2); 281 hspi_resources + (2 * id), 2);
320} 282}
321 283
322/* MMC */ 284/* VIN */
323static struct resource mmc_resources[] __initdata = { 285#define R8A7778_VIN(idx) \
324 DEFINE_RES_MEM(0xffe4e000, 0x100), 286static struct resource vin##idx##_resources[] __initdata = { \
325 DEFINE_RES_IRQ(gic_iid(0x5d)), 287 DEFINE_RES_MEM(0xffc50000 + 0x1000 * (idx), 0x1000), \
288 DEFINE_RES_IRQ(gic_iid(0x5a)), \
289}; \
290 \
291static struct platform_device_info vin##idx##_info __initdata = { \
292 .parent = &platform_bus, \
293 .name = "r8a7778-vin", \
294 .id = idx, \
295 .res = vin##idx##_resources, \
296 .num_res = ARRAY_SIZE(vin##idx##_resources), \
297 .dma_mask = DMA_BIT_MASK(32), \
298}
299
300R8A7778_VIN(0);
301R8A7778_VIN(1);
302
303static struct platform_device_info *vin_info_table[] __initdata = {
304 &vin0_info,
305 &vin1_info,
326}; 306};
327 307
328void __init r8a7778_add_mmc_device(struct sh_mmcif_plat_data *info) 308void __init r8a7778_add_vin_device(int id, struct rcar_vin_platform_data *pdata)
329{ 309{
330 platform_device_register_resndata( 310 BUG_ON(id < 0 || id > 1);
331 &platform_bus, "sh_mmcif", -1, 311
332 mmc_resources, ARRAY_SIZE(mmc_resources), 312 vin_info_table[id]->data = pdata;
333 info, sizeof(*info)); 313 vin_info_table[id]->size_data = sizeof(*pdata);
314
315 platform_device_register_full(vin_info_table[id]);
334} 316}
335 317
336void __init r8a7778_add_standard_devices(void) 318void __init r8a7778_add_dt_devices(void)
337{ 319{
338 int i; 320 int i;
339 321
@@ -357,6 +339,18 @@ void __init r8a7778_add_standard_devices(void)
357 r8a7778_register_tmu(1); 339 r8a7778_register_tmu(1);
358} 340}
359 341
342void __init r8a7778_add_standard_devices(void)
343{
344 r8a7778_add_dt_devices();
345 r8a7778_register_i2c(0);
346 r8a7778_register_i2c(1);
347 r8a7778_register_i2c(2);
348 r8a7778_register_i2c(3);
349 r8a7778_register_hspi(0);
350 r8a7778_register_hspi(1);
351 r8a7778_register_hspi(2);
352}
353
360void __init r8a7778_init_late(void) 354void __init r8a7778_init_late(void)
361{ 355{
362 phy = usb_get_phy(USB_PHY_TYPE_USB2); 356 phy = usb_get_phy(USB_PHY_TYPE_USB2);
@@ -365,12 +359,12 @@ void __init r8a7778_init_late(void)
365 platform_device_register_full(&ohci_info); 359 platform_device_register_full(&ohci_info);
366} 360}
367 361
368static struct renesas_intc_irqpin_config irqpin_platform_data = { 362static struct renesas_intc_irqpin_config irqpin_platform_data __initdata = {
369 .irq_base = irq_pin(0), /* IRQ0 -> IRQ3 */ 363 .irq_base = irq_pin(0), /* IRQ0 -> IRQ3 */
370 .sense_bitfield_width = 2, 364 .sense_bitfield_width = 2,
371}; 365};
372 366
373static struct resource irqpin_resources[] = { 367static struct resource irqpin_resources[] __initdata = {
374 DEFINE_RES_MEM(0xfe78001c, 4), /* ICR1 */ 368 DEFINE_RES_MEM(0xfe78001c, 4), /* ICR1 */
375 DEFINE_RES_MEM(0xfe780010, 4), /* INTPRI */ 369 DEFINE_RES_MEM(0xfe780010, 4), /* INTPRI */
376 DEFINE_RES_MEM(0xfe780024, 4), /* INTREQ */ 370 DEFINE_RES_MEM(0xfe780024, 4), /* INTREQ */
@@ -408,17 +402,25 @@ void __init r8a7778_init_irq_extpin(int irlm)
408 &irqpin_platform_data, sizeof(irqpin_platform_data)); 402 &irqpin_platform_data, sizeof(irqpin_platform_data));
409} 403}
410 404
405void __init r8a7778_init_delay(void)
406{
407 shmobile_setup_delay(800, 1, 3); /* Cortex-A9 @ 800MHz */
408}
409
410#ifdef CONFIG_USE_OF
411#define INT2SMSKCR0 0x82288 /* 0xfe782288 */ 411#define INT2SMSKCR0 0x82288 /* 0xfe782288 */
412#define INT2SMSKCR1 0x8228c /* 0xfe78228c */ 412#define INT2SMSKCR1 0x8228c /* 0xfe78228c */
413 413
414#define INT2NTSR0 0x00018 /* 0xfe700018 */ 414#define INT2NTSR0 0x00018 /* 0xfe700018 */
415#define INT2NTSR1 0x0002c /* 0xfe70002c */ 415#define INT2NTSR1 0x0002c /* 0xfe70002c */
416static void __init r8a7778_init_irq_common(void) 416void __init r8a7778_init_irq_dt(void)
417{ 417{
418 void __iomem *base = ioremap_nocache(0xfe700000, 0x00100000); 418 void __iomem *base = ioremap_nocache(0xfe700000, 0x00100000);
419 419
420 BUG_ON(!base); 420 BUG_ON(!base);
421 421
422 irqchip_init();
423
422 /* route all interrupts to ARM */ 424 /* route all interrupts to ARM */
423 __raw_writel(0x73ffffff, base + INT2NTSR0); 425 __raw_writel(0x73ffffff, base + INT2NTSR0);
424 __raw_writel(0xffffffff, base + INT2NTSR1); 426 __raw_writel(0xffffffff, base + INT2NTSR1);
@@ -430,43 +432,6 @@ static void __init r8a7778_init_irq_common(void)
430 iounmap(base); 432 iounmap(base);
431} 433}
432 434
433void __init r8a7778_init_irq(void)
434{
435 void __iomem *gic_dist_base;
436 void __iomem *gic_cpu_base;
437
438 gic_dist_base = ioremap_nocache(0xfe438000, PAGE_SIZE);
439 gic_cpu_base = ioremap_nocache(0xfe430000, PAGE_SIZE);
440 BUG_ON(!gic_dist_base || !gic_cpu_base);
441
442 /* use GIC to handle interrupts */
443 gic_init(0, 29, gic_dist_base, gic_cpu_base);
444
445 r8a7778_init_irq_common();
446}
447
448void __init r8a7778_init_delay(void)
449{
450 shmobile_setup_delay(800, 1, 3); /* Cortex-A9 @ 800MHz */
451}
452
453#ifdef CONFIG_USE_OF
454void __init r8a7778_init_irq_dt(void)
455{
456 irqchip_init();
457 r8a7778_init_irq_common();
458}
459
460static const struct of_dev_auxdata r8a7778_auxdata_lookup[] __initconst = {
461 {},
462};
463
464void __init r8a7778_add_standard_devices_dt(void)
465{
466 of_platform_populate(NULL, of_default_bus_match_table,
467 r8a7778_auxdata_lookup, NULL);
468}
469
470static const char *r8a7778_compat_dt[] __initdata = { 435static const char *r8a7778_compat_dt[] __initdata = {
471 "renesas,r8a7778", 436 "renesas,r8a7778",
472 NULL, 437 NULL,
@@ -475,8 +440,6 @@ static const char *r8a7778_compat_dt[] __initdata = {
475DT_MACHINE_START(R8A7778_DT, "Generic R8A7778 (Flattened Device Tree)") 440DT_MACHINE_START(R8A7778_DT, "Generic R8A7778 (Flattened Device Tree)")
476 .init_early = r8a7778_init_delay, 441 .init_early = r8a7778_init_delay,
477 .init_irq = r8a7778_init_irq_dt, 442 .init_irq = r8a7778_init_irq_dt,
478 .init_machine = r8a7778_add_standard_devices_dt,
479 .init_time = shmobile_timer_init,
480 .dt_compat = r8a7778_compat_dt, 443 .dt_compat = r8a7778_compat_dt,
481 .init_late = r8a7778_init_late, 444 .init_late = r8a7778_init_late,
482MACHINE_END 445MACHINE_END
diff --git a/arch/arm/mach-shmobile/setup-r8a7779.c b/arch/arm/mach-shmobile/setup-r8a7779.c
index 398687761f50..ecd0148ee1e1 100644
--- a/arch/arm/mach-shmobile/setup-r8a7779.c
+++ b/arch/arm/mach-shmobile/setup-r8a7779.c
@@ -22,14 +22,16 @@
22#include <linux/init.h> 22#include <linux/init.h>
23#include <linux/interrupt.h> 23#include <linux/interrupt.h>
24#include <linux/irq.h> 24#include <linux/irq.h>
25#include <linux/irqchip.h>
26#include <linux/irqchip/arm-gic.h>
25#include <linux/of_platform.h> 27#include <linux/of_platform.h>
26#include <linux/platform_data/gpio-rcar.h> 28#include <linux/platform_data/gpio-rcar.h>
29#include <linux/platform_data/irq-renesas-intc-irqpin.h>
27#include <linux/platform_device.h> 30#include <linux/platform_device.h>
28#include <linux/delay.h> 31#include <linux/delay.h>
29#include <linux/input.h> 32#include <linux/input.h>
30#include <linux/io.h> 33#include <linux/io.h>
31#include <linux/serial_sci.h> 34#include <linux/serial_sci.h>
32#include <linux/sh_intc.h>
33#include <linux/sh_timer.h> 35#include <linux/sh_timer.h>
34#include <linux/dma-mapping.h> 36#include <linux/dma-mapping.h>
35#include <linux/usb/otg.h> 37#include <linux/usb/otg.h>
@@ -37,7 +39,6 @@
37#include <linux/usb/ehci_pdriver.h> 39#include <linux/usb/ehci_pdriver.h>
38#include <linux/usb/ohci_pdriver.h> 40#include <linux/usb/ohci_pdriver.h>
39#include <linux/pm_runtime.h> 41#include <linux/pm_runtime.h>
40#include <mach/hardware.h>
41#include <mach/irqs.h> 42#include <mach/irqs.h>
42#include <mach/r8a7779.h> 43#include <mach/r8a7779.h>
43#include <mach/common.h> 44#include <mach/common.h>
@@ -69,6 +70,60 @@ void __init r8a7779_map_io(void)
69 iotable_init(r8a7779_io_desc, ARRAY_SIZE(r8a7779_io_desc)); 70 iotable_init(r8a7779_io_desc, ARRAY_SIZE(r8a7779_io_desc));
70} 71}
71 72
73/* IRQ */
74#define INT2SMSKCR0 IOMEM(0xfe7822a0)
75#define INT2SMSKCR1 IOMEM(0xfe7822a4)
76#define INT2SMSKCR2 IOMEM(0xfe7822a8)
77#define INT2SMSKCR3 IOMEM(0xfe7822ac)
78#define INT2SMSKCR4 IOMEM(0xfe7822b0)
79
80#define INT2NTSR0 IOMEM(0xfe700060)
81#define INT2NTSR1 IOMEM(0xfe700064)
82
83static struct renesas_intc_irqpin_config irqpin0_platform_data __initdata = {
84 .irq_base = irq_pin(0), /* IRQ0 -> IRQ3 */
85 .sense_bitfield_width = 2,
86};
87
88static struct resource irqpin0_resources[] __initdata = {
89 DEFINE_RES_MEM(0xfe78001c, 4), /* ICR1 */
90 DEFINE_RES_MEM(0xfe780010, 4), /* INTPRI */
91 DEFINE_RES_MEM(0xfe780024, 4), /* INTREQ */
92 DEFINE_RES_MEM(0xfe780044, 4), /* INTMSK0 */
93 DEFINE_RES_MEM(0xfe780064, 4), /* INTMSKCLR0 */
94 DEFINE_RES_IRQ(gic_spi(27)), /* IRQ0 */
95 DEFINE_RES_IRQ(gic_spi(28)), /* IRQ1 */
96 DEFINE_RES_IRQ(gic_spi(29)), /* IRQ2 */
97 DEFINE_RES_IRQ(gic_spi(30)), /* IRQ3 */
98};
99
100void __init r8a7779_init_irq_extpin(int irlm)
101{
102 void __iomem *icr0 = ioremap_nocache(0xfe780000, PAGE_SIZE);
103 u32 tmp;
104
105 if (!icr0) {
106 pr_warn("r8a7779: unable to setup external irq pin mode\n");
107 return;
108 }
109
110 tmp = ioread32(icr0);
111 if (irlm)
112 tmp |= 1 << 23; /* IRQ0 -> IRQ3 as individual pins */
113 else
114 tmp &= ~(1 << 23); /* IRL mode - not supported */
115 tmp |= (1 << 21); /* LVLMODE = 1 */
116 iowrite32(tmp, icr0);
117 iounmap(icr0);
118
119 if (irlm)
120 platform_device_register_resndata(
121 &platform_bus, "renesas_intc_irqpin", -1,
122 irqpin0_resources, ARRAY_SIZE(irqpin0_resources),
123 &irqpin0_platform_data, sizeof(irqpin0_platform_data));
124}
125
126/* PFC/GPIO */
72static struct resource r8a7779_pfc_resources[] = { 127static struct resource r8a7779_pfc_resources[] = {
73 DEFINE_RES_MEM(0xfffc0000, 0x023c), 128 DEFINE_RES_MEM(0xfffc0000, 0x023c),
74}; 129};
@@ -388,15 +443,6 @@ static struct platform_device sata_device = {
388 }, 443 },
389}; 444};
390 445
391/* USB PHY */
392static struct resource usb_phy_resources[] __initdata = {
393 [0] = {
394 .start = 0xffe70800,
395 .end = 0xffe70900 - 1,
396 .flags = IORESOURCE_MEM,
397 },
398};
399
400/* USB */ 446/* USB */
401static struct usb_phy *phy; 447static struct usb_phy *phy;
402 448
@@ -548,7 +594,7 @@ static struct platform_device ohci1_device = {
548}; 594};
549 595
550/* Ether */ 596/* Ether */
551static struct resource ether_resources[] = { 597static struct resource ether_resources[] __initdata = {
552 { 598 {
553 .start = 0xfde00000, 599 .start = 0xfde00000,
554 .end = 0xfde003ff, 600 .end = 0xfde003ff,
@@ -559,6 +605,33 @@ static struct resource ether_resources[] = {
559 }, 605 },
560}; 606};
561 607
608#define R8A7779_VIN(idx) \
609static struct resource vin##idx##_resources[] __initdata = { \
610 DEFINE_RES_MEM(0xffc50000 + 0x1000 * (idx), 0x1000), \
611 DEFINE_RES_IRQ(gic_iid(0x5f + (idx))), \
612}; \
613 \
614static struct platform_device_info vin##idx##_info __initdata = { \
615 .parent = &platform_bus, \
616 .name = "r8a7779-vin", \
617 .id = idx, \
618 .res = vin##idx##_resources, \
619 .num_res = ARRAY_SIZE(vin##idx##_resources), \
620 .dma_mask = DMA_BIT_MASK(32), \
621}
622
623R8A7779_VIN(0);
624R8A7779_VIN(1);
625R8A7779_VIN(2);
626R8A7779_VIN(3);
627
628static struct platform_device_info *vin_info_table[] __initdata = {
629 &vin0_info,
630 &vin1_info,
631 &vin2_info,
632 &vin3_info,
633};
634
562static struct platform_device *r8a7779_devices_dt[] __initdata = { 635static struct platform_device *r8a7779_devices_dt[] __initdata = {
563 &scif0_device, 636 &scif0_device,
564 &scif1_device, 637 &scif1_device,
@@ -602,12 +675,14 @@ void __init r8a7779_add_ether_device(struct sh_eth_plat_data *pdata)
602 pdata, sizeof(*pdata)); 675 pdata, sizeof(*pdata));
603} 676}
604 677
605void __init r8a7779_add_usb_phy_device(struct rcar_phy_platform_data *pdata) 678void __init r8a7779_add_vin_device(int id, struct rcar_vin_platform_data *pdata)
606{ 679{
607 platform_device_register_resndata(&platform_bus, "rcar_usb_phy", -1, 680 BUG_ON(id < 0 || id > 3);
608 usb_phy_resources, 681
609 ARRAY_SIZE(usb_phy_resources), 682 vin_info_table[id]->data = pdata;
610 pdata, sizeof(*pdata)); 683 vin_info_table[id]->size_data = sizeof(*pdata);
684
685 platform_device_register_full(vin_info_table[id]);
611} 686}
612 687
613/* do nothing for !CONFIG_SMP or !CONFIG_HAVE_TWD */ 688/* do nothing for !CONFIG_SMP or !CONFIG_HAVE_TWD */
@@ -616,8 +691,8 @@ void __init __weak r8a7779_register_twd(void) { }
616void __init r8a7779_earlytimer_init(void) 691void __init r8a7779_earlytimer_init(void)
617{ 692{
618 r8a7779_clock_init(); 693 r8a7779_clock_init();
619 shmobile_earlytimer_init();
620 r8a7779_register_twd(); 694 r8a7779_register_twd();
695 shmobile_earlytimer_init();
621} 696}
622 697
623void __init r8a7779_add_early_devices(void) 698void __init r8a7779_add_early_devices(void)
@@ -660,15 +735,34 @@ void __init r8a7779_init_late(void)
660} 735}
661 736
662#ifdef CONFIG_USE_OF 737#ifdef CONFIG_USE_OF
738static int r8a7779_set_wake(struct irq_data *data, unsigned int on)
739{
740 return 0; /* always allow wakeup */
741}
742
743void __init r8a7779_init_irq_dt(void)
744{
745 gic_arch_extn.irq_set_wake = r8a7779_set_wake;
746
747 irqchip_init();
748
749 /* route all interrupts to ARM */
750 __raw_writel(0xffffffff, INT2NTSR0);
751 __raw_writel(0x3fffffff, INT2NTSR1);
752
753 /* unmask all known interrupts in INTCS2 */
754 __raw_writel(0xfffffff0, INT2SMSKCR0);
755 __raw_writel(0xfff7ffff, INT2SMSKCR1);
756 __raw_writel(0xfffbffdf, INT2SMSKCR2);
757 __raw_writel(0xbffffffc, INT2SMSKCR3);
758 __raw_writel(0x003fee3f, INT2SMSKCR4);
759}
760
663void __init r8a7779_init_delay(void) 761void __init r8a7779_init_delay(void)
664{ 762{
665 shmobile_setup_delay(1000, 2, 4); /* Cortex-A9 @ 1000MHz */ 763 shmobile_setup_delay(1000, 2, 4); /* Cortex-A9 @ 1000MHz */
666} 764}
667 765
668static const struct of_dev_auxdata r8a7779_auxdata_lookup[] __initconst = {
669 {},
670};
671
672void __init r8a7779_add_standard_devices_dt(void) 766void __init r8a7779_add_standard_devices_dt(void)
673{ 767{
674 /* clocks are setup late during boot in the case of DT */ 768 /* clocks are setup late during boot in the case of DT */
@@ -676,8 +770,7 @@ void __init r8a7779_add_standard_devices_dt(void)
676 770
677 platform_add_devices(r8a7779_devices_dt, 771 platform_add_devices(r8a7779_devices_dt,
678 ARRAY_SIZE(r8a7779_devices_dt)); 772 ARRAY_SIZE(r8a7779_devices_dt));
679 of_platform_populate(NULL, of_default_bus_match_table, 773 of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
680 r8a7779_auxdata_lookup, NULL);
681} 774}
682 775
683static const char *r8a7779_compat_dt[] __initdata = { 776static const char *r8a7779_compat_dt[] __initdata = {
@@ -691,7 +784,6 @@ DT_MACHINE_START(R8A7779_DT, "Generic R8A7779 (Flattened Device Tree)")
691 .nr_irqs = NR_IRQS_LEGACY, 784 .nr_irqs = NR_IRQS_LEGACY,
692 .init_irq = r8a7779_init_irq_dt, 785 .init_irq = r8a7779_init_irq_dt,
693 .init_machine = r8a7779_add_standard_devices_dt, 786 .init_machine = r8a7779_add_standard_devices_dt,
694 .init_time = shmobile_timer_init,
695 .init_late = r8a7779_init_late, 787 .init_late = r8a7779_init_late,
696 .dt_compat = r8a7779_compat_dt, 788 .dt_compat = r8a7779_compat_dt,
697MACHINE_END 789MACHINE_END
diff --git a/arch/arm/mach-shmobile/setup-r8a7790.c b/arch/arm/mach-shmobile/setup-r8a7790.c
index 28f94752b8ff..d0f5c9f9349a 100644
--- a/arch/arm/mach-shmobile/setup-r8a7790.c
+++ b/arch/arm/mach-shmobile/setup-r8a7790.c
@@ -18,13 +18,14 @@
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */ 19 */
20 20
21#include <linux/clocksource.h>
21#include <linux/irq.h> 22#include <linux/irq.h>
22#include <linux/irqchip.h>
23#include <linux/kernel.h> 23#include <linux/kernel.h>
24#include <linux/of_platform.h> 24#include <linux/of_platform.h>
25#include <linux/serial_sci.h>
26#include <linux/platform_data/gpio-rcar.h> 25#include <linux/platform_data/gpio-rcar.h>
27#include <linux/platform_data/irq-renesas-irqc.h> 26#include <linux/platform_data/irq-renesas-irqc.h>
27#include <linux/serial_sci.h>
28#include <linux/sh_timer.h>
28#include <mach/common.h> 29#include <mach/common.h>
29#include <mach/irqs.h> 30#include <mach/irqs.h>
30#include <mach/r8a7790.h> 31#include <mach/r8a7790.h>
@@ -149,7 +150,37 @@ static struct resource irqc0_resources[] __initdata = {
149 &irqc##idx##_data, \ 150 &irqc##idx##_data, \
150 sizeof(struct renesas_irqc_config)) 151 sizeof(struct renesas_irqc_config))
151 152
152void __init r8a7790_add_standard_devices(void) 153static struct resource thermal_resources[] __initdata = {
154 DEFINE_RES_MEM(0xe61f0000, 0x14),
155 DEFINE_RES_MEM(0xe61f0100, 0x38),
156 DEFINE_RES_IRQ(gic_spi(69)),
157};
158
159#define r8a7790_register_thermal() \
160 platform_device_register_simple("rcar_thermal", -1, \
161 thermal_resources, \
162 ARRAY_SIZE(thermal_resources))
163
164static struct sh_timer_config cmt00_platform_data __initdata = {
165 .name = "CMT00",
166 .timer_bit = 0,
167 .clockevent_rating = 80,
168};
169
170static struct resource cmt00_resources[] __initdata = {
171 DEFINE_RES_MEM(0xffca0510, 0x0c),
172 DEFINE_RES_MEM(0xffca0500, 0x04),
173 DEFINE_RES_IRQ(gic_spi(142)), /* CMT0_0 */
174};
175
176#define r8a7790_register_cmt(idx) \
177 platform_device_register_resndata(&platform_bus, "sh_cmt", \
178 idx, cmt##idx##_resources, \
179 ARRAY_SIZE(cmt##idx##_resources), \
180 &cmt##idx##_platform_data, \
181 sizeof(struct sh_timer_config))
182
183void __init r8a7790_add_dt_devices(void)
153{ 184{
154 r8a7790_register_scif(SCIFA0); 185 r8a7790_register_scif(SCIFA0);
155 r8a7790_register_scif(SCIFA1); 186 r8a7790_register_scif(SCIFA1);
@@ -161,35 +192,97 @@ void __init r8a7790_add_standard_devices(void)
161 r8a7790_register_scif(SCIF1); 192 r8a7790_register_scif(SCIF1);
162 r8a7790_register_scif(HSCIF0); 193 r8a7790_register_scif(HSCIF0);
163 r8a7790_register_scif(HSCIF1); 194 r8a7790_register_scif(HSCIF1);
195 r8a7790_register_cmt(00);
196}
197
198void __init r8a7790_add_standard_devices(void)
199{
200 r8a7790_add_dt_devices();
164 r8a7790_register_irqc(0); 201 r8a7790_register_irqc(0);
202 r8a7790_register_thermal();
165} 203}
166 204
205#define MODEMR 0xe6160060
206
207u32 __init r8a7790_read_mode_pins(void)
208{
209 void __iomem *modemr = ioremap_nocache(MODEMR, 4);
210 u32 mode;
211
212 BUG_ON(!modemr);
213 mode = ioread32(modemr);
214 iounmap(modemr);
215
216 return mode;
217}
218
219#define CNTCR 0
220#define CNTFID0 0x20
221
167void __init r8a7790_timer_init(void) 222void __init r8a7790_timer_init(void)
168{ 223{
169 void __iomem *cntcr; 224#ifdef CONFIG_ARM_ARCH_TIMER
225 u32 mode = r8a7790_read_mode_pins();
226 void __iomem *base;
227 int extal_mhz = 0;
228 u32 freq;
229
230 /* At Linux boot time the r8a7790 arch timer comes up
231 * with the counter disabled. Moreover, it may also report
232 * a potentially incorrect fixed 13 MHz frequency. To be
233 * correct these registers need to be updated to use the
234 * frequency EXTAL / 2 which can be determined by the MD pins.
235 */
170 236
171 /* make sure arch timer is started by setting bit 0 of CNTCT */ 237 switch (mode & (MD(14) | MD(13))) {
172 cntcr = ioremap(0xe6080000, PAGE_SIZE); 238 case 0:
173 iowrite32(1, cntcr); 239 extal_mhz = 15;
174 iounmap(cntcr); 240 break;
241 case MD(13):
242 extal_mhz = 20;
243 break;
244 case MD(14):
245 extal_mhz = 26;
246 break;
247 case MD(13) | MD(14):
248 extal_mhz = 30;
249 break;
250 }
175 251
176 shmobile_timer_init(); 252 /* The arch timer frequency equals EXTAL / 2 */
253 freq = extal_mhz * (1000000 / 2);
254
255 /* Remap "armgcnt address map" space */
256 base = ioremap(0xe6080000, PAGE_SIZE);
257
258 /* Update registers with correct frequency */
259 iowrite32(freq, base + CNTFID0);
260 asm volatile("mcr p15, 0, %0, c14, c0, 0" : : "r" (freq));
261
262 /* make sure arch timer is started by setting bit 0 of CNTCR */
263 iowrite32(1, base + CNTCR);
264 iounmap(base);
265#endif /* CONFIG_ARM_ARCH_TIMER */
266
267 clocksource_of_init();
177} 268}
178 269
179#ifdef CONFIG_USE_OF 270void __init r8a7790_init_delay(void)
180void __init r8a7790_add_standard_devices_dt(void)
181{ 271{
182 of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); 272#ifndef CONFIG_ARM_ARCH_TIMER
273 shmobile_setup_delay(1300, 2, 4); /* Cortex-A15 @ 1300MHz */
274#endif
183} 275}
184 276
277#ifdef CONFIG_USE_OF
278
185static const char *r8a7790_boards_compat_dt[] __initdata = { 279static const char *r8a7790_boards_compat_dt[] __initdata = {
186 "renesas,r8a7790", 280 "renesas,r8a7790",
187 NULL, 281 NULL,
188}; 282};
189 283
190DT_MACHINE_START(R8A7790_DT, "Generic R8A7790 (Flattened Device Tree)") 284DT_MACHINE_START(R8A7790_DT, "Generic R8A7790 (Flattened Device Tree)")
191 .init_irq = irqchip_init, 285 .init_early = r8a7790_init_delay,
192 .init_machine = r8a7790_add_standard_devices_dt,
193 .init_time = r8a7790_timer_init, 286 .init_time = r8a7790_timer_init,
194 .dt_compat = r8a7790_boards_compat_dt, 287 .dt_compat = r8a7790_boards_compat_dt,
195MACHINE_END 288MACHINE_END
diff --git a/arch/arm/mach-shmobile/setup-sh7372.c b/arch/arm/mach-shmobile/setup-sh7372.c
index 5502d624aca6..311878391e18 100644
--- a/arch/arm/mach-shmobile/setup-sh7372.c
+++ b/arch/arm/mach-shmobile/setup-sh7372.c
@@ -35,7 +35,6 @@
35#include <linux/dma-mapping.h> 35#include <linux/dma-mapping.h>
36#include <linux/platform_data/sh_ipmmu.h> 36#include <linux/platform_data/sh_ipmmu.h>
37#include <mach/dma-register.h> 37#include <mach/dma-register.h>
38#include <mach/hardware.h>
39#include <mach/irqs.h> 38#include <mach/irqs.h>
40#include <mach/sh7372.h> 39#include <mach/sh7372.h>
41#include <mach/common.h> 40#include <mach/common.h>
@@ -1147,10 +1146,6 @@ void __init sh7372_add_early_devices_dt(void)
1147 shmobile_setup_console(); 1146 shmobile_setup_console();
1148} 1147}
1149 1148
1150static const struct of_dev_auxdata sh7372_auxdata_lookup[] __initconst = {
1151 { }
1152};
1153
1154void __init sh7372_add_standard_devices_dt(void) 1149void __init sh7372_add_standard_devices_dt(void)
1155{ 1150{
1156 /* clocks are setup late during boot in the case of DT */ 1151 /* clocks are setup late during boot in the case of DT */
@@ -1159,8 +1154,7 @@ void __init sh7372_add_standard_devices_dt(void)
1159 platform_add_devices(sh7372_early_devices, 1154 platform_add_devices(sh7372_early_devices,
1160 ARRAY_SIZE(sh7372_early_devices)); 1155 ARRAY_SIZE(sh7372_early_devices));
1161 1156
1162 of_platform_populate(NULL, of_default_bus_match_table, 1157 of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
1163 sh7372_auxdata_lookup, NULL);
1164} 1158}
1165 1159
1166static const char *sh7372_boards_compat_dt[] __initdata = { 1160static const char *sh7372_boards_compat_dt[] __initdata = {
diff --git a/arch/arm/mach-shmobile/setup-sh73a0.c b/arch/arm/mach-shmobile/setup-sh73a0.c
index 96e7ca1e4e11..22de17417fd7 100644
--- a/arch/arm/mach-shmobile/setup-sh73a0.c
+++ b/arch/arm/mach-shmobile/setup-sh73a0.c
@@ -22,7 +22,6 @@
22#include <linux/init.h> 22#include <linux/init.h>
23#include <linux/interrupt.h> 23#include <linux/interrupt.h>
24#include <linux/irq.h> 24#include <linux/irq.h>
25#include <linux/irqchip.h>
26#include <linux/platform_device.h> 25#include <linux/platform_device.h>
27#include <linux/of_platform.h> 26#include <linux/of_platform.h>
28#include <linux/delay.h> 27#include <linux/delay.h>
@@ -35,7 +34,6 @@
35#include <linux/platform_data/sh_ipmmu.h> 34#include <linux/platform_data/sh_ipmmu.h>
36#include <linux/platform_data/irq-renesas-intc-irqpin.h> 35#include <linux/platform_data/irq-renesas-intc-irqpin.h>
37#include <mach/dma-register.h> 36#include <mach/dma-register.h>
38#include <mach/hardware.h>
39#include <mach/irqs.h> 37#include <mach/irqs.h>
40#include <mach/sh73a0.h> 38#include <mach/sh73a0.h>
41#include <mach/common.h> 39#include <mach/common.h>
@@ -61,29 +59,16 @@ void __init sh73a0_map_io(void)
61 iotable_init(sh73a0_io_desc, ARRAY_SIZE(sh73a0_io_desc)); 59 iotable_init(sh73a0_io_desc, ARRAY_SIZE(sh73a0_io_desc));
62} 60}
63 61
64static struct resource sh73a0_pfc_resources[] = { 62/* PFC */
65 [0] = { 63static struct resource pfc_resources[] __initdata = {
66 .start = 0xe6050000, 64 DEFINE_RES_MEM(0xe6050000, 0x8000),
67 .end = 0xe6057fff, 65 DEFINE_RES_MEM(0xe605801c, 0x000c),
68 .flags = IORESOURCE_MEM,
69 },
70 [1] = {
71 .start = 0xe605801c,
72 .end = 0xe6058027,
73 .flags = IORESOURCE_MEM,
74 }
75};
76
77static struct platform_device sh73a0_pfc_device = {
78 .name = "pfc-sh73a0",
79 .id = -1,
80 .resource = sh73a0_pfc_resources,
81 .num_resources = ARRAY_SIZE(sh73a0_pfc_resources),
82}; 66};
83 67
84void __init sh73a0_pinmux_init(void) 68void __init sh73a0_pinmux_init(void)
85{ 69{
86 platform_device_register(&sh73a0_pfc_device); 70 platform_device_register_simple("pfc-sh73a0", -1, pfc_resources,
71 ARRAY_SIZE(pfc_resources));
87} 72}
88 73
89static struct plat_sci_port scif0_platform_data = { 74static struct plat_sci_port scif0_platform_data = {
@@ -958,10 +943,6 @@ void __init sh73a0_add_early_devices(void)
958 943
959#ifdef CONFIG_USE_OF 944#ifdef CONFIG_USE_OF
960 945
961static const struct of_dev_auxdata sh73a0_auxdata_lookup[] __initconst = {
962 {},
963};
964
965void __init sh73a0_add_standard_devices_dt(void) 946void __init sh73a0_add_standard_devices_dt(void)
966{ 947{
967 struct platform_device_info devinfo = { .name = "cpufreq-cpu0", .id = -1, }; 948 struct platform_device_info devinfo = { .name = "cpufreq-cpu0", .id = -1, };
@@ -971,8 +952,7 @@ void __init sh73a0_add_standard_devices_dt(void)
971 952
972 platform_add_devices(sh73a0_devices_dt, 953 platform_add_devices(sh73a0_devices_dt,
973 ARRAY_SIZE(sh73a0_devices_dt)); 954 ARRAY_SIZE(sh73a0_devices_dt));
974 of_platform_populate(NULL, of_default_bus_match_table, 955 of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
975 sh73a0_auxdata_lookup, NULL);
976 956
977 /* Instantiate cpufreq-cpu0 */ 957 /* Instantiate cpufreq-cpu0 */
978 platform_device_register_full(&devinfo); 958 platform_device_register_full(&devinfo);
@@ -988,7 +968,6 @@ DT_MACHINE_START(SH73A0_DT, "Generic SH73A0 (Flattened Device Tree)")
988 .map_io = sh73a0_map_io, 968 .map_io = sh73a0_map_io,
989 .init_early = sh73a0_init_delay, 969 .init_early = sh73a0_init_delay,
990 .nr_irqs = NR_IRQS_LEGACY, 970 .nr_irqs = NR_IRQS_LEGACY,
991 .init_irq = irqchip_init,
992 .init_machine = sh73a0_add_standard_devices_dt, 971 .init_machine = sh73a0_add_standard_devices_dt,
993 .dt_compat = sh73a0_boards_compat_dt, 972 .dt_compat = sh73a0_boards_compat_dt,
994MACHINE_END 973MACHINE_END
diff --git a/arch/arm/mach-shmobile/sleep-sh7372.S b/arch/arm/mach-shmobile/sleep-sh7372.S
index 53f4840e4949..9782862899e8 100644
--- a/arch/arm/mach-shmobile/sleep-sh7372.S
+++ b/arch/arm/mach-shmobile/sleep-sh7372.S
@@ -41,6 +41,7 @@
41sh7372_resume_core_standby_sysc: 41sh7372_resume_core_standby_sysc:
42 ldr pc, 1f 42 ldr pc, 1f
43 43
44 .align 2
44 .globl sh7372_cpu_resume 45 .globl sh7372_cpu_resume
45sh7372_cpu_resume: 46sh7372_cpu_resume:
461: .space 4 471: .space 4
@@ -96,6 +97,7 @@ sh7372_do_idle_sysc:
961: 971:
97 b 1b 98 b 1b
98 99
100 .align 2
99kernel_flush: 101kernel_flush:
100 .word v7_flush_dcache_all 102 .word v7_flush_dcache_all
101#endif 103#endif
diff --git a/arch/arm/mach-shmobile/smp-emev2.c b/arch/arm/mach-shmobile/smp-emev2.c
index 22a05a869d25..522de5ebb55f 100644
--- a/arch/arm/mach-shmobile/smp-emev2.c
+++ b/arch/arm/mach-shmobile/smp-emev2.c
@@ -29,41 +29,38 @@
29#include <asm/smp_scu.h> 29#include <asm/smp_scu.h>
30 30
31#define EMEV2_SCU_BASE 0x1e000000 31#define EMEV2_SCU_BASE 0x1e000000
32#define EMEV2_SMU_BASE 0xe0110000
33#define SMU_GENERAL_REG0 0x7c0
32 34
33static int emev2_boot_secondary(unsigned int cpu, struct task_struct *idle) 35static int emev2_boot_secondary(unsigned int cpu, struct task_struct *idle)
34{ 36{
37 int ret;
38
39 ret = shmobile_smp_scu_boot_secondary(cpu, idle);
40 if (ret)
41 return ret;
42
35 arch_send_wakeup_ipi_mask(cpumask_of(cpu_logical_map(cpu))); 43 arch_send_wakeup_ipi_mask(cpumask_of(cpu_logical_map(cpu)));
36 return 0; 44 return 0;
37} 45}
38 46
39static void __init emev2_smp_prepare_cpus(unsigned int max_cpus) 47static void __init emev2_smp_prepare_cpus(unsigned int max_cpus)
40{ 48{
41 scu_enable(shmobile_scu_base); 49 void __iomem *smu;
42
43 /* Tell ROM loader about our vector (in headsmp-scu.S, headsmp.S) */
44 emev2_set_boot_vector(__pa(shmobile_boot_vector));
45 shmobile_boot_fn = virt_to_phys(shmobile_boot_scu);
46 shmobile_boot_arg = (unsigned long)shmobile_scu_base;
47
48 /* enable cache coherency on booting CPU */
49 scu_power_mode(shmobile_scu_base, SCU_PM_NORMAL);
50}
51 50
52static void __init emev2_smp_init_cpus(void) 51 /* Tell ROM loader about our vector (in headsmp.S) */
53{ 52 smu = ioremap(EMEV2_SMU_BASE, PAGE_SIZE);
54 unsigned int ncores; 53 if (smu) {
54 iowrite32(__pa(shmobile_boot_vector), smu + SMU_GENERAL_REG0);
55 iounmap(smu);
56 }
55 57
56 /* setup EMEV2 specific SCU base */ 58 /* setup EMEV2 specific SCU bits */
57 shmobile_scu_base = ioremap(EMEV2_SCU_BASE, PAGE_SIZE); 59 shmobile_scu_base = ioremap(EMEV2_SCU_BASE, PAGE_SIZE);
58 emev2_clock_init(); /* need ioremapped SMU */ 60 shmobile_smp_scu_prepare_cpus(max_cpus);
59
60 ncores = shmobile_scu_base ? scu_get_core_count(shmobile_scu_base) : 1;
61
62 shmobile_smp_init_cpus(ncores);
63} 61}
64 62
65struct smp_operations emev2_smp_ops __initdata = { 63struct smp_operations emev2_smp_ops __initdata = {
66 .smp_init_cpus = emev2_smp_init_cpus,
67 .smp_prepare_cpus = emev2_smp_prepare_cpus, 64 .smp_prepare_cpus = emev2_smp_prepare_cpus,
68 .smp_boot_secondary = emev2_boot_secondary, 65 .smp_boot_secondary = emev2_boot_secondary,
69}; 66};
diff --git a/arch/arm/mach-shmobile/smp-r8a7779.c b/arch/arm/mach-shmobile/smp-r8a7779.c
index 9bdf810f2a87..0f05e9fb722f 100644
--- a/arch/arm/mach-shmobile/smp-r8a7779.c
+++ b/arch/arm/mach-shmobile/smp-r8a7779.c
@@ -84,30 +84,34 @@ static int r8a7779_platform_cpu_kill(unsigned int cpu)
84static int r8a7779_boot_secondary(unsigned int cpu, struct task_struct *idle) 84static int r8a7779_boot_secondary(unsigned int cpu, struct task_struct *idle)
85{ 85{
86 struct r8a7779_pm_ch *ch = NULL; 86 struct r8a7779_pm_ch *ch = NULL;
87 int ret = -EIO; 87 unsigned int lcpu = cpu_logical_map(cpu);
88 int ret;
88 89
89 cpu = cpu_logical_map(cpu); 90 ret = shmobile_smp_scu_boot_secondary(cpu, idle);
91 if (ret)
92 return ret;
90 93
91 if (cpu < ARRAY_SIZE(r8a7779_ch_cpu)) 94 if (lcpu < ARRAY_SIZE(r8a7779_ch_cpu))
92 ch = r8a7779_ch_cpu[cpu]; 95 ch = r8a7779_ch_cpu[lcpu];
93 96
94 if (ch) 97 if (ch)
95 ret = r8a7779_sysc_power_up(ch); 98 ret = r8a7779_sysc_power_up(ch);
99 else
100 ret = -EIO;
96 101
97 return ret; 102 return ret;
98} 103}
99 104
100static void __init r8a7779_smp_prepare_cpus(unsigned int max_cpus) 105static void __init r8a7779_smp_prepare_cpus(unsigned int max_cpus)
101{ 106{
102 scu_enable(shmobile_scu_base);
103
104 /* Map the reset vector (in headsmp-scu.S, headsmp.S) */ 107 /* Map the reset vector (in headsmp-scu.S, headsmp.S) */
105 __raw_writel(__pa(shmobile_boot_vector), AVECR); 108 __raw_writel(__pa(shmobile_boot_vector), AVECR);
106 shmobile_boot_fn = virt_to_phys(shmobile_boot_scu); 109 shmobile_boot_fn = virt_to_phys(shmobile_boot_scu);
107 shmobile_boot_arg = (unsigned long)shmobile_scu_base; 110 shmobile_boot_arg = (unsigned long)shmobile_scu_base;
108 111
109 /* enable cache coherency on booting CPU */ 112 /* setup r8a7779 specific SCU bits */
110 scu_power_mode(shmobile_scu_base, SCU_PM_NORMAL); 113 shmobile_scu_base = IOMEM(R8A7779_SCU_BASE);
114 shmobile_smp_scu_prepare_cpus(max_cpus);
111 115
112 r8a7779_pm_init(); 116 r8a7779_pm_init();
113 117
@@ -117,56 +121,15 @@ static void __init r8a7779_smp_prepare_cpus(unsigned int max_cpus)
117 r8a7779_platform_cpu_kill(3); 121 r8a7779_platform_cpu_kill(3);
118} 122}
119 123
120static void __init r8a7779_smp_init_cpus(void)
121{
122 /* setup r8a7779 specific SCU base */
123 shmobile_scu_base = IOMEM(R8A7779_SCU_BASE);
124
125 shmobile_smp_init_cpus(scu_get_core_count(shmobile_scu_base));
126}
127
128#ifdef CONFIG_HOTPLUG_CPU 124#ifdef CONFIG_HOTPLUG_CPU
129static int r8a7779_scu_psr_core_disabled(int cpu)
130{
131 unsigned long mask = 3 << (cpu * 8);
132
133 if ((__raw_readl(shmobile_scu_base + 8) & mask) == mask)
134 return 1;
135
136 return 0;
137}
138
139static int r8a7779_cpu_kill(unsigned int cpu) 125static int r8a7779_cpu_kill(unsigned int cpu)
140{ 126{
141 int k; 127 if (shmobile_smp_scu_cpu_kill(cpu))
142 128 return r8a7779_platform_cpu_kill(cpu);
143 /* this function is running on another CPU than the offline target,
144 * here we need wait for shutdown code in platform_cpu_die() to
145 * finish before asking SoC-specific code to power off the CPU core.
146 */
147 for (k = 0; k < 1000; k++) {
148 if (r8a7779_scu_psr_core_disabled(cpu))
149 return r8a7779_platform_cpu_kill(cpu);
150
151 mdelay(1);
152 }
153 129
154 return 0; 130 return 0;
155} 131}
156 132
157static void r8a7779_cpu_die(unsigned int cpu)
158{
159 dsb();
160 flush_cache_all();
161
162 /* disable cache coherency */
163 scu_power_mode(shmobile_scu_base, SCU_PM_POWEROFF);
164
165 /* Endless loop until power off from r8a7779_cpu_kill() */
166 while (1)
167 cpu_do_idle();
168}
169
170static int r8a7779_cpu_disable(unsigned int cpu) 133static int r8a7779_cpu_disable(unsigned int cpu)
171{ 134{
172 /* only CPU1->3 have power domains, do not allow hotplug of CPU0 */ 135 /* only CPU1->3 have power domains, do not allow hotplug of CPU0 */
@@ -175,12 +138,11 @@ static int r8a7779_cpu_disable(unsigned int cpu)
175#endif /* CONFIG_HOTPLUG_CPU */ 138#endif /* CONFIG_HOTPLUG_CPU */
176 139
177struct smp_operations r8a7779_smp_ops __initdata = { 140struct smp_operations r8a7779_smp_ops __initdata = {
178 .smp_init_cpus = r8a7779_smp_init_cpus,
179 .smp_prepare_cpus = r8a7779_smp_prepare_cpus, 141 .smp_prepare_cpus = r8a7779_smp_prepare_cpus,
180 .smp_boot_secondary = r8a7779_boot_secondary, 142 .smp_boot_secondary = r8a7779_boot_secondary,
181#ifdef CONFIG_HOTPLUG_CPU 143#ifdef CONFIG_HOTPLUG_CPU
182 .cpu_kill = r8a7779_cpu_kill,
183 .cpu_die = r8a7779_cpu_die,
184 .cpu_disable = r8a7779_cpu_disable, 144 .cpu_disable = r8a7779_cpu_disable,
145 .cpu_die = shmobile_smp_scu_cpu_die,
146 .cpu_kill = r8a7779_cpu_kill,
185#endif 147#endif
186}; 148};
diff --git a/arch/arm/mach-shmobile/smp-sh73a0.c b/arch/arm/mach-shmobile/smp-sh73a0.c
index d5fc3ed4e315..0baa24443793 100644
--- a/arch/arm/mach-shmobile/smp-sh73a0.c
+++ b/arch/arm/mach-shmobile/smp-sh73a0.c
@@ -20,14 +20,11 @@
20#include <linux/kernel.h> 20#include <linux/kernel.h>
21#include <linux/init.h> 21#include <linux/init.h>
22#include <linux/smp.h> 22#include <linux/smp.h>
23#include <linux/spinlock.h>
24#include <linux/io.h> 23#include <linux/io.h>
25#include <linux/delay.h> 24#include <linux/delay.h>
26#include <mach/common.h> 25#include <mach/common.h>
27#include <asm/cacheflush.h>
28#include <asm/smp_plat.h>
29#include <mach/sh73a0.h> 26#include <mach/sh73a0.h>
30#include <asm/smp_scu.h> 27#include <asm/smp_plat.h>
31#include <asm/smp_twd.h> 28#include <asm/smp_twd.h>
32 29
33#define WUPCR IOMEM(0xe6151010) 30#define WUPCR IOMEM(0xe6151010)
@@ -36,8 +33,6 @@
36#define SBAR IOMEM(0xe6180020) 33#define SBAR IOMEM(0xe6180020)
37#define APARMBAREA IOMEM(0xe6f10020) 34#define APARMBAREA IOMEM(0xe6f10020)
38 35
39#define PSTR_SHUTDOWN_MODE 3
40
41#define SH73A0_SCU_BASE 0xf0000000 36#define SH73A0_SCU_BASE 0xf0000000
42 37
43#ifdef CONFIG_HAVE_ARM_TWD 38#ifdef CONFIG_HAVE_ARM_TWD
@@ -50,69 +45,33 @@ void __init sh73a0_register_twd(void)
50 45
51static int sh73a0_boot_secondary(unsigned int cpu, struct task_struct *idle) 46static int sh73a0_boot_secondary(unsigned int cpu, struct task_struct *idle)
52{ 47{
53 cpu = cpu_logical_map(cpu); 48 unsigned int lcpu = cpu_logical_map(cpu);
49 int ret;
54 50
55 if (((__raw_readl(PSTR) >> (4 * cpu)) & 3) == 3) 51 ret = shmobile_smp_scu_boot_secondary(cpu, idle);
56 __raw_writel(1 << cpu, WUPCR); /* wake up */ 52 if (ret)
53 return ret;
54
55 if (((__raw_readl(PSTR) >> (4 * lcpu)) & 3) == 3)
56 __raw_writel(1 << lcpu, WUPCR); /* wake up */
57 else 57 else
58 __raw_writel(1 << cpu, SRESCR); /* reset */ 58 __raw_writel(1 << lcpu, SRESCR); /* reset */
59 59
60 return 0; 60 return 0;
61} 61}
62 62
63static void __init sh73a0_smp_prepare_cpus(unsigned int max_cpus) 63static void __init sh73a0_smp_prepare_cpus(unsigned int max_cpus)
64{ 64{
65 scu_enable(shmobile_scu_base); 65 /* Map the reset vector (in headsmp.S) */
66
67 /* Map the reset vector (in headsmp-scu.S, headsmp.S) */
68 __raw_writel(0, APARMBAREA); /* 4k */ 66 __raw_writel(0, APARMBAREA); /* 4k */
69 __raw_writel(__pa(shmobile_boot_vector), SBAR); 67 __raw_writel(__pa(shmobile_boot_vector), SBAR);
70 shmobile_boot_fn = virt_to_phys(shmobile_boot_scu);
71 shmobile_boot_arg = (unsigned long)shmobile_scu_base;
72 68
73 /* enable cache coherency on booting CPU */ 69 /* setup sh73a0 specific SCU bits */
74 scu_power_mode(shmobile_scu_base, SCU_PM_NORMAL);
75}
76
77static void __init sh73a0_smp_init_cpus(void)
78{
79 /* setup sh73a0 specific SCU base */
80 shmobile_scu_base = IOMEM(SH73A0_SCU_BASE); 70 shmobile_scu_base = IOMEM(SH73A0_SCU_BASE);
81 71 shmobile_smp_scu_prepare_cpus(max_cpus);
82 shmobile_smp_init_cpus(scu_get_core_count(shmobile_scu_base));
83} 72}
84 73
85#ifdef CONFIG_HOTPLUG_CPU 74#ifdef CONFIG_HOTPLUG_CPU
86static int sh73a0_cpu_kill(unsigned int cpu)
87{
88
89 int k;
90 u32 pstr;
91
92 /*
93 * wait until the power status register confirms the shutdown of the
94 * offline target
95 */
96 for (k = 0; k < 1000; k++) {
97 pstr = (__raw_readl(PSTR) >> (4 * cpu)) & 3;
98 if (pstr == PSTR_SHUTDOWN_MODE)
99 return 1;
100
101 mdelay(1);
102 }
103
104 return 0;
105}
106
107static void sh73a0_cpu_die(unsigned int cpu)
108{
109 /* Set power off mode. This takes the CPU out of the MP cluster */
110 scu_power_mode(shmobile_scu_base, SCU_PM_POWEROFF);
111
112 /* Enter shutdown mode */
113 cpu_do_idle();
114}
115
116static int sh73a0_cpu_disable(unsigned int cpu) 75static int sh73a0_cpu_disable(unsigned int cpu)
117{ 76{
118 return 0; /* CPU0 and CPU1 supported */ 77 return 0; /* CPU0 and CPU1 supported */
@@ -120,12 +79,11 @@ static int sh73a0_cpu_disable(unsigned int cpu)
120#endif /* CONFIG_HOTPLUG_CPU */ 79#endif /* CONFIG_HOTPLUG_CPU */
121 80
122struct smp_operations sh73a0_smp_ops __initdata = { 81struct smp_operations sh73a0_smp_ops __initdata = {
123 .smp_init_cpus = sh73a0_smp_init_cpus,
124 .smp_prepare_cpus = sh73a0_smp_prepare_cpus, 82 .smp_prepare_cpus = sh73a0_smp_prepare_cpus,
125 .smp_boot_secondary = sh73a0_boot_secondary, 83 .smp_boot_secondary = sh73a0_boot_secondary,
126#ifdef CONFIG_HOTPLUG_CPU 84#ifdef CONFIG_HOTPLUG_CPU
127 .cpu_kill = sh73a0_cpu_kill,
128 .cpu_die = sh73a0_cpu_die,
129 .cpu_disable = sh73a0_cpu_disable, 85 .cpu_disable = sh73a0_cpu_disable,
86 .cpu_die = shmobile_smp_scu_cpu_die,
87 .cpu_kill = shmobile_smp_scu_cpu_kill,
130#endif 88#endif
131}; 89};
diff --git a/arch/arm/mach-shmobile/timer.c b/arch/arm/mach-shmobile/timer.c
index f321dbeb2379..62d7052d6f21 100644
--- a/arch/arm/mach-shmobile/timer.c
+++ b/arch/arm/mach-shmobile/timer.c
@@ -59,7 +59,3 @@ void __init shmobile_earlytimer_init(void)
59 late_time_init = shmobile_late_time_init; 59 late_time_init = shmobile_late_time_init;
60} 60}
61 61
62void __init shmobile_timer_init(void)
63{
64 clocksource_of_init();
65}
diff --git a/arch/arm/mach-spear/Kconfig b/arch/arm/mach-spear/Kconfig
index 442917eedff3..df0d59afeb40 100644
--- a/arch/arm/mach-spear/Kconfig
+++ b/arch/arm/mach-spear/Kconfig
@@ -23,7 +23,7 @@ config ARCH_SPEAR13XX
23 select CPU_V7 23 select CPU_V7
24 select GPIO_SPEAR_SPICS 24 select GPIO_SPEAR_SPICS
25 select HAVE_ARM_SCU if SMP 25 select HAVE_ARM_SCU if SMP
26 select HAVE_ARM_TWD if LOCAL_TIMERS 26 select HAVE_ARM_TWD if SMP
27 select HAVE_SMP 27 select HAVE_SMP
28 select MIGHT_HAVE_CACHE_L2X0 28 select MIGHT_HAVE_CACHE_L2X0
29 select PINCTRL 29 select PINCTRL
diff --git a/arch/arm/mach-spear/include/mach/debug-macro.S b/arch/arm/mach-spear/include/mach/debug-macro.S
deleted file mode 100644
index 75b05ad0fbad..000000000000
--- a/arch/arm/mach-spear/include/mach/debug-macro.S
+++ /dev/null
@@ -1,36 +0,0 @@
1/*
2 * arch/arm/plat-spear/include/plat/debug-macro.S
3 *
4 * Debugging macro include header for spear platform
5 *
6 * Copyright (C) 2009 ST Microelectronics
7 * Viresh Kumar <viresh.linux@gmail.com>
8 *
9 * This file is licensed under the terms of the GNU General Public
10 * License version 2. This program is licensed "as is" without any
11 * warranty of any kind, whether express or implied.
12 */
13
14#include <linux/amba/serial.h>
15#include <mach/spear.h>
16
17 .macro addruart, rp, rv, tmp
18 mov \rp, #SPEAR_DBG_UART_BASE @ Physical base
19 mov \rv, #VA_SPEAR_DBG_UART_BASE @ Virtual base
20 .endm
21
22 .macro senduart, rd, rx
23 strb \rd, [\rx, #UART01x_DR] @ ASC_TX_BUFFER
24 .endm
25
26 .macro waituart, rd, rx
271001: ldr \rd, [\rx, #UART01x_FR] @ FLAG REGISTER
28 tst \rd, #UART01x_FR_TXFF @ TX_FULL
29 bne 1001b
30 .endm
31
32 .macro busyuart, rd, rx
331002: ldr \rd, [\rx, #UART01x_FR] @ FLAG REGISTER
34 tst \rd, #UART011_FR_TXFE @ TX_EMPTY
35 beq 1002b
36 .endm
diff --git a/arch/arm/mach-spear/include/mach/spear.h b/arch/arm/mach-spear/include/mach/spear.h
index cf3a5369eeca..5cdc53d9b653 100644
--- a/arch/arm/mach-spear/include/mach/spear.h
+++ b/arch/arm/mach-spear/include/mach/spear.h
@@ -39,7 +39,6 @@
39 39
40/* Debug uart for linux, will be used for debug and uncompress messages */ 40/* Debug uart for linux, will be used for debug and uncompress messages */
41#define SPEAR_DBG_UART_BASE SPEAR_ICM1_UART_BASE 41#define SPEAR_DBG_UART_BASE SPEAR_ICM1_UART_BASE
42#define VA_SPEAR_DBG_UART_BASE VA_SPEAR_ICM1_UART_BASE
43 42
44/* Sysctl base for spear platform */ 43/* Sysctl base for spear platform */
45#define SPEAR_SYS_CTRL_BASE SPEAR_ICM3_SYS_CTRL_BASE 44#define SPEAR_SYS_CTRL_BASE SPEAR_ICM3_SYS_CTRL_BASE
@@ -86,7 +85,6 @@
86 85
87/* Debug uart for linux, will be used for debug and uncompress messages */ 86/* Debug uart for linux, will be used for debug and uncompress messages */
88#define SPEAR_DBG_UART_BASE UART_BASE 87#define SPEAR_DBG_UART_BASE UART_BASE
89#define VA_SPEAR_DBG_UART_BASE VA_UART_BASE
90 88
91#endif /* SPEAR13XX */ 89#endif /* SPEAR13XX */
92 90
diff --git a/arch/arm/mach-sunxi/Kconfig b/arch/arm/mach-sunxi/Kconfig
index 5b045e302b43..3ab2f65f8a50 100644
--- a/arch/arm/mach-sunxi/Kconfig
+++ b/arch/arm/mach-sunxi/Kconfig
@@ -10,3 +10,5 @@ config ARCH_SUNXI
10 select SPARSE_IRQ 10 select SPARSE_IRQ
11 select SUN4I_TIMER 11 select SUN4I_TIMER
12 select PINCTRL_SUNXI 12 select PINCTRL_SUNXI
13 select ARM_GIC
14 select HAVE_SMP
diff --git a/arch/arm/mach-sunxi/Makefile.boot b/arch/arm/mach-sunxi/Makefile.boot
deleted file mode 100644
index 46d4cf0841c0..000000000000
--- a/arch/arm/mach-sunxi/Makefile.boot
+++ /dev/null
@@ -1 +0,0 @@
1zreladdr-$(CONFIG_ARCH_SUNXI) += 0x40008000
diff --git a/arch/arm/mach-sunxi/sunxi.c b/arch/arm/mach-sunxi/sunxi.c
index 38a3c55527c8..e79fb3469341 100644
--- a/arch/arm/mach-sunxi/sunxi.c
+++ b/arch/arm/mach-sunxi/sunxi.c
@@ -27,10 +27,19 @@
27#include <asm/system_misc.h> 27#include <asm/system_misc.h>
28 28
29#define SUN4I_WATCHDOG_CTRL_REG 0x00 29#define SUN4I_WATCHDOG_CTRL_REG 0x00
30#define SUN4I_WATCHDOG_CTRL_RESTART (1 << 0) 30#define SUN4I_WATCHDOG_CTRL_RESTART BIT(0)
31#define SUN4I_WATCHDOG_MODE_REG 0x04 31#define SUN4I_WATCHDOG_MODE_REG 0x04
32#define SUN4I_WATCHDOG_MODE_ENABLE (1 << 0) 32#define SUN4I_WATCHDOG_MODE_ENABLE BIT(0)
33#define SUN4I_WATCHDOG_MODE_RESET_ENABLE (1 << 1) 33#define SUN4I_WATCHDOG_MODE_RESET_ENABLE BIT(1)
34
35#define SUN6I_WATCHDOG1_IRQ_REG 0x00
36#define SUN6I_WATCHDOG1_CTRL_REG 0x10
37#define SUN6I_WATCHDOG1_CTRL_RESTART BIT(0)
38#define SUN6I_WATCHDOG1_CONFIG_REG 0x14
39#define SUN6I_WATCHDOG1_CONFIG_RESTART BIT(0)
40#define SUN6I_WATCHDOG1_CONFIG_IRQ BIT(1)
41#define SUN6I_WATCHDOG1_MODE_REG 0x18
42#define SUN6I_WATCHDOG1_MODE_ENABLE BIT(0)
34 43
35static void __iomem *wdt_base; 44static void __iomem *wdt_base;
36 45
@@ -56,8 +65,36 @@ static void sun4i_restart(enum reboot_mode mode, const char *cmd)
56 } 65 }
57} 66}
58 67
68static void sun6i_restart(enum reboot_mode mode, const char *cmd)
69{
70 if (!wdt_base)
71 return;
72
73 /* Disable interrupts */
74 writel(0, wdt_base + SUN6I_WATCHDOG1_IRQ_REG);
75
76 /* We want to disable the IRQ and just reset the whole system */
77 writel(SUN6I_WATCHDOG1_CONFIG_RESTART,
78 wdt_base + SUN6I_WATCHDOG1_CONFIG_REG);
79
80 /* Enable timer. The default and lowest interval value is 0.5s */
81 writel(SUN6I_WATCHDOG1_MODE_ENABLE,
82 wdt_base + SUN6I_WATCHDOG1_MODE_REG);
83
84 /* Restart the watchdog. */
85 writel(SUN6I_WATCHDOG1_CTRL_RESTART,
86 wdt_base + SUN6I_WATCHDOG1_CTRL_REG);
87
88 while (1) {
89 mdelay(5);
90 writel(SUN6I_WATCHDOG1_MODE_ENABLE,
91 wdt_base + SUN6I_WATCHDOG1_MODE_REG);
92 }
93}
94
59static struct of_device_id sunxi_restart_ids[] = { 95static struct of_device_id sunxi_restart_ids[] = {
60 { .compatible = "allwinner,sun4i-wdt", .data = sun4i_restart }, 96 { .compatible = "allwinner,sun4i-wdt", .data = sun4i_restart },
97 { .compatible = "allwinner,sun6i-wdt", .data = sun6i_restart },
61 { /*sentinel*/ } 98 { /*sentinel*/ }
62}; 99};
63 100
@@ -96,6 +133,8 @@ static const char * const sunxi_board_dt_compat[] = {
96 "allwinner,sun4i-a10", 133 "allwinner,sun4i-a10",
97 "allwinner,sun5i-a10s", 134 "allwinner,sun5i-a10s",
98 "allwinner,sun5i-a13", 135 "allwinner,sun5i-a13",
136 "allwinner,sun6i-a31",
137 "allwinner,sun7i-a20",
99 NULL, 138 NULL,
100}; 139};
101 140
diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig
index ef3a8da49b2d..67a76f2dfb9f 100644
--- a/arch/arm/mach-tegra/Kconfig
+++ b/arch/arm/mach-tegra/Kconfig
@@ -2,18 +2,25 @@ config ARCH_TEGRA
2 bool "NVIDIA Tegra" if ARCH_MULTI_V7 2 bool "NVIDIA Tegra" if ARCH_MULTI_V7
3 select ARCH_HAS_CPUFREQ 3 select ARCH_HAS_CPUFREQ
4 select ARCH_REQUIRE_GPIOLIB 4 select ARCH_REQUIRE_GPIOLIB
5 select ARM_GIC
5 select CLKDEV_LOOKUP 6 select CLKDEV_LOOKUP
6 select CLKSRC_MMIO 7 select CLKSRC_MMIO
7 select CLKSRC_OF 8 select CLKSRC_OF
8 select COMMON_CLK 9 select COMMON_CLK
10 select CPU_V7
9 select GENERIC_CLOCKEVENTS 11 select GENERIC_CLOCKEVENTS
10 select HAVE_ARM_SCU if SMP 12 select HAVE_ARM_SCU if SMP
11 select HAVE_ARM_TWD if LOCAL_TIMERS 13 select HAVE_ARM_TWD if SMP
12 select HAVE_CLK 14 select HAVE_CLK
13 select HAVE_SMP 15 select HAVE_SMP
14 select MIGHT_HAVE_CACHE_L2X0 16 select MIGHT_HAVE_CACHE_L2X0
17 select MIGHT_HAVE_PCI
18 select PINCTRL
15 select SOC_BUS 19 select SOC_BUS
16 select SPARSE_IRQ 20 select SPARSE_IRQ
21 select USB_ARCH_HAS_EHCI if USB_SUPPORT
22 select USB_ULPI if USB_PHY
23 select USB_ULPI_VIEWPORT if USB_PHY
17 select USE_OF 24 select USE_OF
18 help 25 help
19 This enables support for NVIDIA Tegra based systems. 26 This enables support for NVIDIA Tegra based systems.
@@ -27,15 +34,9 @@ config ARCH_TEGRA_2x_SOC
27 select ARM_ERRATA_720789 34 select ARM_ERRATA_720789
28 select ARM_ERRATA_754327 if SMP 35 select ARM_ERRATA_754327 if SMP
29 select ARM_ERRATA_764369 if SMP 36 select ARM_ERRATA_764369 if SMP
30 select ARM_GIC
31 select CPU_V7
32 select PINCTRL
33 select PINCTRL_TEGRA20 37 select PINCTRL_TEGRA20
34 select PL310_ERRATA_727915 if CACHE_L2X0 38 select PL310_ERRATA_727915 if CACHE_L2X0
35 select PL310_ERRATA_769419 if CACHE_L2X0 39 select PL310_ERRATA_769419 if CACHE_L2X0
36 select USB_ARCH_HAS_EHCI if USB_SUPPORT
37 select USB_ULPI if USB_PHY
38 select USB_ULPI_VIEWPORT if USB_PHY
39 help 40 help
40 Support for NVIDIA Tegra AP20 and T20 processors, based on the 41 Support for NVIDIA Tegra AP20 and T20 processors, based on the
41 ARM CortexA9MP CPU and the ARM PL310 L2 cache controller 42 ARM CortexA9MP CPU and the ARM PL310 L2 cache controller
@@ -44,14 +45,8 @@ config ARCH_TEGRA_3x_SOC
44 bool "Enable support for Tegra30 family" 45 bool "Enable support for Tegra30 family"
45 select ARM_ERRATA_754322 46 select ARM_ERRATA_754322
46 select ARM_ERRATA_764369 if SMP 47 select ARM_ERRATA_764369 if SMP
47 select ARM_GIC
48 select CPU_V7
49 select PINCTRL
50 select PINCTRL_TEGRA30 48 select PINCTRL_TEGRA30
51 select PL310_ERRATA_769419 if CACHE_L2X0 49 select PL310_ERRATA_769419 if CACHE_L2X0
52 select USB_ARCH_HAS_EHCI if USB_SUPPORT
53 select USB_ULPI if USB_PHY
54 select USB_ULPI_VIEWPORT if USB_PHY
55 help 50 help
56 Support for NVIDIA Tegra T30 processor family, based on the 51 Support for NVIDIA Tegra T30 processor family, based on the
57 ARM CortexA9MP CPU and the ARM PL310 L2 cache controller 52 ARM CortexA9MP CPU and the ARM PL310 L2 cache controller
@@ -59,20 +54,13 @@ config ARCH_TEGRA_3x_SOC
59config ARCH_TEGRA_114_SOC 54config ARCH_TEGRA_114_SOC
60 bool "Enable support for Tegra114 family" 55 bool "Enable support for Tegra114 family"
61 select HAVE_ARM_ARCH_TIMER 56 select HAVE_ARM_ARCH_TIMER
62 select ARM_GIC 57 select ARM_ERRATA_798181
63 select ARM_L1_CACHE_SHIFT_6 58 select ARM_L1_CACHE_SHIFT_6
64 select CPU_V7
65 select PINCTRL
66 select PINCTRL_TEGRA114 59 select PINCTRL_TEGRA114
67 help 60 help
68 Support for NVIDIA Tegra T114 processor family, based on the 61 Support for NVIDIA Tegra T114 processor family, based on the
69 ARM CortexA15MP CPU 62 ARM CortexA15MP CPU
70 63
71config TEGRA_PCI
72 bool "PCI Express support"
73 depends on ARCH_TEGRA_2x_SOC
74 select PCI
75
76config TEGRA_AHB 64config TEGRA_AHB
77 bool "Enable AHB driver for NVIDIA Tegra SoCs" 65 bool "Enable AHB driver for NVIDIA Tegra SoCs"
78 default y 66 default y
diff --git a/arch/arm/mach-tegra/Makefile b/arch/arm/mach-tegra/Makefile
index 98b184efc110..e7e5f45c6558 100644
--- a/arch/arm/mach-tegra/Makefile
+++ b/arch/arm/mach-tegra/Makefile
@@ -17,24 +17,24 @@ obj-$(CONFIG_CPU_IDLE) += cpuidle.o
17obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += tegra20_speedo.o 17obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += tegra20_speedo.o
18obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += tegra2_emc.o 18obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += tegra2_emc.o
19obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += sleep-tegra20.o 19obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += sleep-tegra20.o
20obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += pm-tegra20.o
20ifeq ($(CONFIG_CPU_IDLE),y) 21ifeq ($(CONFIG_CPU_IDLE),y)
21obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += cpuidle-tegra20.o 22obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += cpuidle-tegra20.o
22endif 23endif
23obj-$(CONFIG_ARCH_TEGRA_3x_SOC) += tegra30_speedo.o 24obj-$(CONFIG_ARCH_TEGRA_3x_SOC) += tegra30_speedo.o
24obj-$(CONFIG_ARCH_TEGRA_3x_SOC) += sleep-tegra30.o 25obj-$(CONFIG_ARCH_TEGRA_3x_SOC) += sleep-tegra30.o
26obj-$(CONFIG_ARCH_TEGRA_3x_SOC) += pm-tegra30.o
25ifeq ($(CONFIG_CPU_IDLE),y) 27ifeq ($(CONFIG_CPU_IDLE),y)
26obj-$(CONFIG_ARCH_TEGRA_3x_SOC) += cpuidle-tegra30.o 28obj-$(CONFIG_ARCH_TEGRA_3x_SOC) += cpuidle-tegra30.o
27endif 29endif
28obj-$(CONFIG_SMP) += platsmp.o headsmp.o 30obj-$(CONFIG_SMP) += platsmp.o headsmp.o
29obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o 31obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
30obj-$(CONFIG_TEGRA_PCI) += pcie.o
31 32
32obj-$(CONFIG_ARCH_TEGRA_114_SOC) += tegra114_speedo.o 33obj-$(CONFIG_ARCH_TEGRA_114_SOC) += tegra114_speedo.o
33obj-$(CONFIG_ARCH_TEGRA_114_SOC) += sleep-tegra30.o 34obj-$(CONFIG_ARCH_TEGRA_114_SOC) += sleep-tegra30.o
35obj-$(CONFIG_ARCH_TEGRA_114_SOC) += pm-tegra30.o
34ifeq ($(CONFIG_CPU_IDLE),y) 36ifeq ($(CONFIG_CPU_IDLE),y)
35obj-$(CONFIG_ARCH_TEGRA_114_SOC) += cpuidle-tegra114.o 37obj-$(CONFIG_ARCH_TEGRA_114_SOC) += cpuidle-tegra114.o
36endif 38endif
37 39
38obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += board-harmony-pcie.o
39
40obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += board-paz00.o 40obj-$(CONFIG_ARCH_TEGRA_2x_SOC) += board-paz00.o
diff --git a/arch/arm/mach-tegra/board-harmony-pcie.c b/arch/arm/mach-tegra/board-harmony-pcie.c
deleted file mode 100644
index 035b240b9e15..000000000000
--- a/arch/arm/mach-tegra/board-harmony-pcie.c
+++ /dev/null
@@ -1,89 +0,0 @@
1/*
2 * arch/arm/mach-tegra/board-harmony-pcie.c
3 *
4 * Copyright (C) 2010 CompuLab, Ltd.
5 * Mike Rapoport <mike@compulab.co.il>
6 *
7 * This software is licensed under the terms of the GNU General Public
8 * License version 2, as published by the Free Software Foundation, and
9 * may be copied, distributed, and modified under those terms.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 */
17
18#include <linux/kernel.h>
19#include <linux/gpio.h>
20#include <linux/err.h>
21#include <linux/of_gpio.h>
22#include <linux/regulator/consumer.h>
23
24#include <asm/mach-types.h>
25
26#include "board.h"
27
28#ifdef CONFIG_TEGRA_PCI
29
30int __init harmony_pcie_init(void)
31{
32 struct device_node *np;
33 int en_vdd_1v05;
34 struct regulator *regulator = NULL;
35 int err;
36
37 np = of_find_node_by_path("/regulators/regulator@3");
38 if (!np) {
39 pr_err("%s: of_find_node_by_path failed\n", __func__);
40 return -ENODEV;
41 }
42
43 en_vdd_1v05 = of_get_named_gpio(np, "gpio", 0);
44 if (en_vdd_1v05 < 0) {
45 pr_err("%s: of_get_named_gpio failed: %d\n", __func__,
46 en_vdd_1v05);
47 return en_vdd_1v05;
48 }
49
50 err = gpio_request(en_vdd_1v05, "EN_VDD_1V05");
51 if (err) {
52 pr_err("%s: gpio_request failed: %d\n", __func__, err);
53 return err;
54 }
55
56 gpio_direction_output(en_vdd_1v05, 1);
57
58 regulator = regulator_get(NULL, "vdd_ldo0,vddio_pex_clk");
59 if (IS_ERR(regulator)) {
60 err = PTR_ERR(regulator);
61 pr_err("%s: regulator_get failed: %d\n", __func__, err);
62 goto err_reg;
63 }
64
65 err = regulator_enable(regulator);
66 if (err) {
67 pr_err("%s: regulator_enable failed: %d\n", __func__, err);
68 goto err_en;
69 }
70
71 err = tegra_pcie_init(true, true);
72 if (err) {
73 pr_err("%s: tegra_pcie_init failed: %d\n", __func__, err);
74 goto err_pcie;
75 }
76
77 return 0;
78
79err_pcie:
80 regulator_disable(regulator);
81err_en:
82 regulator_put(regulator);
83err_reg:
84 gpio_free(en_vdd_1v05);
85
86 return err;
87}
88
89#endif
diff --git a/arch/arm/mach-tegra/board.h b/arch/arm/mach-tegra/board.h
index 9a6659fe2dc2..db6810dc0b3d 100644
--- a/arch/arm/mach-tegra/board.h
+++ b/arch/arm/mach-tegra/board.h
@@ -31,7 +31,6 @@ void __init tegra_init_early(void);
31void __init tegra_map_common_io(void); 31void __init tegra_map_common_io(void);
32void __init tegra_init_irq(void); 32void __init tegra_init_irq(void);
33void __init tegra_dt_init_irq(void); 33void __init tegra_dt_init_irq(void);
34int __init tegra_pcie_init(bool init_port0, bool init_port1);
35 34
36void tegra_init_late(void); 35void tegra_init_late(void);
37 36
@@ -48,13 +47,6 @@ int __init tegra_powergate_debugfs_init(void);
48static inline int tegra_powergate_debugfs_init(void) { return 0; } 47static inline int tegra_powergate_debugfs_init(void) { return 0; }
49#endif 48#endif
50 49
51int __init harmony_regulator_init(void);
52#ifdef CONFIG_TEGRA_PCI
53int __init harmony_pcie_init(void);
54#else
55static inline int harmony_pcie_init(void) { return 0; }
56#endif
57
58void __init tegra_paz00_wifikill_init(void); 50void __init tegra_paz00_wifikill_init(void);
59 51
60#endif 52#endif
diff --git a/arch/arm/mach-tegra/common.h b/arch/arm/mach-tegra/common.h
index 32f8eb3fe344..5900cc44f780 100644
--- a/arch/arm/mach-tegra/common.h
+++ b/arch/arm/mach-tegra/common.h
@@ -2,4 +2,3 @@ extern struct smp_operations tegra_smp_ops;
2 2
3extern int tegra_cpu_kill(unsigned int cpu); 3extern int tegra_cpu_kill(unsigned int cpu);
4extern void tegra_cpu_die(unsigned int cpu); 4extern void tegra_cpu_die(unsigned int cpu);
5extern int tegra_cpu_disable(unsigned int cpu);
diff --git a/arch/arm/mach-tegra/cpuidle-tegra114.c b/arch/arm/mach-tegra/cpuidle-tegra114.c
index 1d1c6023f4a2..e0b87300243d 100644
--- a/arch/arm/mach-tegra/cpuidle-tegra114.c
+++ b/arch/arm/mach-tegra/cpuidle-tegra114.c
@@ -17,15 +17,64 @@
17#include <linux/kernel.h> 17#include <linux/kernel.h>
18#include <linux/module.h> 18#include <linux/module.h>
19#include <linux/cpuidle.h> 19#include <linux/cpuidle.h>
20#include <linux/cpu_pm.h>
21#include <linux/clockchips.h>
20 22
21#include <asm/cpuidle.h> 23#include <asm/cpuidle.h>
24#include <asm/suspend.h>
25#include <asm/smp_plat.h>
26
27#include "pm.h"
28#include "sleep.h"
29
30#ifdef CONFIG_PM_SLEEP
31#define TEGRA114_MAX_STATES 2
32#else
33#define TEGRA114_MAX_STATES 1
34#endif
35
36#ifdef CONFIG_PM_SLEEP
37static int tegra114_idle_power_down(struct cpuidle_device *dev,
38 struct cpuidle_driver *drv,
39 int index)
40{
41 local_fiq_disable();
42
43 tegra_set_cpu_in_lp2();
44 cpu_pm_enter();
45
46 clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &dev->cpu);
47
48 cpu_suspend(0, tegra30_sleep_cpu_secondary_finish);
49
50 clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &dev->cpu);
51
52 cpu_pm_exit();
53 tegra_clear_cpu_in_lp2();
54
55 local_fiq_enable();
56
57 return index;
58}
59#endif
22 60
23static struct cpuidle_driver tegra_idle_driver = { 61static struct cpuidle_driver tegra_idle_driver = {
24 .name = "tegra_idle", 62 .name = "tegra_idle",
25 .owner = THIS_MODULE, 63 .owner = THIS_MODULE,
26 .state_count = 1, 64 .state_count = TEGRA114_MAX_STATES,
27 .states = { 65 .states = {
28 [0] = ARM_CPUIDLE_WFI_STATE_PWR(600), 66 [0] = ARM_CPUIDLE_WFI_STATE_PWR(600),
67#ifdef CONFIG_PM_SLEEP
68 [1] = {
69 .enter = tegra114_idle_power_down,
70 .exit_latency = 500,
71 .target_residency = 1000,
72 .power_usage = 0,
73 .flags = CPUIDLE_FLAG_TIME_VALID,
74 .name = "powered-down",
75 .desc = "CPU power gated",
76 },
77#endif
29 }, 78 },
30}; 79};
31 80
diff --git a/arch/arm/mach-tegra/cpuidle-tegra20.c b/arch/arm/mach-tegra/cpuidle-tegra20.c
index 706aa4215c36..b82dcaee2ef4 100644
--- a/arch/arm/mach-tegra/cpuidle-tegra20.c
+++ b/arch/arm/mach-tegra/cpuidle-tegra20.c
@@ -211,6 +211,18 @@ static int tegra20_idle_lp2_coupled(struct cpuidle_device *dev,
211} 211}
212#endif 212#endif
213 213
214/*
215 * Tegra20 HW appears to have a bug such that PCIe device interrupts, whether
216 * they are legacy IRQs or MSI, are lost when LP2 is enabled. To work around
217 * this, simply disable LP2 if the PCI driver and DT node are both enabled.
218 */
219void tegra20_cpuidle_pcie_irqs_in_use(void)
220{
221 pr_info_once(
222 "Disabling cpuidle LP2 state, since PCIe IRQs are in use\n");
223 tegra_idle_driver.states[1].disabled = true;
224}
225
214int __init tegra20_cpuidle_init(void) 226int __init tegra20_cpuidle_init(void)
215{ 227{
216 return cpuidle_register(&tegra_idle_driver, cpu_possible_mask); 228 return cpuidle_register(&tegra_idle_driver, cpu_possible_mask);
diff --git a/arch/arm/mach-tegra/cpuidle.c b/arch/arm/mach-tegra/cpuidle.c
index e85973cef037..0961dfcf83a4 100644
--- a/arch/arm/mach-tegra/cpuidle.c
+++ b/arch/arm/mach-tegra/cpuidle.c
@@ -44,3 +44,13 @@ void __init tegra_cpuidle_init(void)
44 break; 44 break;
45 } 45 }
46} 46}
47
48void tegra_cpuidle_pcie_irqs_in_use(void)
49{
50 switch (tegra_chip_id) {
51 case TEGRA20:
52 if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC))
53 tegra20_cpuidle_pcie_irqs_in_use();
54 break;
55 }
56}
diff --git a/arch/arm/mach-tegra/cpuidle.h b/arch/arm/mach-tegra/cpuidle.h
index 9ec2c1ab0fa4..c017dab60ffa 100644
--- a/arch/arm/mach-tegra/cpuidle.h
+++ b/arch/arm/mach-tegra/cpuidle.h
@@ -19,6 +19,7 @@
19 19
20#ifdef CONFIG_CPU_IDLE 20#ifdef CONFIG_CPU_IDLE
21int tegra20_cpuidle_init(void); 21int tegra20_cpuidle_init(void);
22void tegra20_cpuidle_pcie_irqs_in_use(void);
22int tegra30_cpuidle_init(void); 23int tegra30_cpuidle_init(void);
23int tegra114_cpuidle_init(void); 24int tegra114_cpuidle_init(void);
24void tegra_cpuidle_init(void); 25void tegra_cpuidle_init(void);
diff --git a/arch/arm/mach-tegra/flowctrl.c b/arch/arm/mach-tegra/flowctrl.c
index b477ef310dcd..5348543382bf 100644
--- a/arch/arm/mach-tegra/flowctrl.c
+++ b/arch/arm/mach-tegra/flowctrl.c
@@ -86,6 +86,7 @@ void flowctrl_cpu_suspend_enter(unsigned int cpuid)
86 reg |= TEGRA20_FLOW_CTRL_CSR_WFE_CPU0 << cpuid; 86 reg |= TEGRA20_FLOW_CTRL_CSR_WFE_CPU0 << cpuid;
87 break; 87 break;
88 case TEGRA30: 88 case TEGRA30:
89 case TEGRA114:
89 /* clear wfe bitmap */ 90 /* clear wfe bitmap */
90 reg &= ~TEGRA30_FLOW_CTRL_CSR_WFE_BITMAP; 91 reg &= ~TEGRA30_FLOW_CTRL_CSR_WFE_BITMAP;
91 /* clear wfi bitmap */ 92 /* clear wfi bitmap */
@@ -123,6 +124,7 @@ void flowctrl_cpu_suspend_exit(unsigned int cpuid)
123 reg &= ~TEGRA20_FLOW_CTRL_CSR_WFI_BITMAP; 124 reg &= ~TEGRA20_FLOW_CTRL_CSR_WFI_BITMAP;
124 break; 125 break;
125 case TEGRA30: 126 case TEGRA30:
127 case TEGRA114:
126 /* clear wfe bitmap */ 128 /* clear wfe bitmap */
127 reg &= ~TEGRA30_FLOW_CTRL_CSR_WFE_BITMAP; 129 reg &= ~TEGRA30_FLOW_CTRL_CSR_WFE_BITMAP;
128 /* clear wfi bitmap */ 130 /* clear wfi bitmap */
diff --git a/arch/arm/mach-tegra/flowctrl.h b/arch/arm/mach-tegra/flowctrl.h
index 7a29bae799a7..c89aac60a143 100644
--- a/arch/arm/mach-tegra/flowctrl.h
+++ b/arch/arm/mach-tegra/flowctrl.h
@@ -28,9 +28,18 @@
28#define FLOW_CTRL_SCLK_RESUME (1 << 27) 28#define FLOW_CTRL_SCLK_RESUME (1 << 27)
29#define FLOW_CTRL_HALT_CPU_IRQ (1 << 10) 29#define FLOW_CTRL_HALT_CPU_IRQ (1 << 10)
30#define FLOW_CTRL_HALT_CPU_FIQ (1 << 8) 30#define FLOW_CTRL_HALT_CPU_FIQ (1 << 8)
31#define FLOW_CTRL_HALT_LIC_IRQ (1 << 11)
32#define FLOW_CTRL_HALT_LIC_FIQ (1 << 10)
33#define FLOW_CTRL_HALT_GIC_IRQ (1 << 9)
34#define FLOW_CTRL_HALT_GIC_FIQ (1 << 8)
31#define FLOW_CTRL_CPU0_CSR 0x8 35#define FLOW_CTRL_CPU0_CSR 0x8
32#define FLOW_CTRL_CSR_INTR_FLAG (1 << 15) 36#define FLOW_CTRL_CSR_INTR_FLAG (1 << 15)
33#define FLOW_CTRL_CSR_EVENT_FLAG (1 << 14) 37#define FLOW_CTRL_CSR_EVENT_FLAG (1 << 14)
38#define FLOW_CTRL_CSR_ENABLE_EXT_CRAIL (1 << 13)
39#define FLOW_CTRL_CSR_ENABLE_EXT_NCPU (1 << 12)
40#define FLOW_CTRL_CSR_ENABLE_EXT_MASK ( \
41 FLOW_CTRL_CSR_ENABLE_EXT_NCPU | \
42 FLOW_CTRL_CSR_ENABLE_EXT_CRAIL)
34#define FLOW_CTRL_CSR_ENABLE (1 << 0) 43#define FLOW_CTRL_CSR_ENABLE (1 << 0)
35#define FLOW_CTRL_HALT_CPU1_EVENTS 0x14 44#define FLOW_CTRL_HALT_CPU1_EVENTS 0x14
36#define FLOW_CTRL_CPU1_CSR 0x18 45#define FLOW_CTRL_CPU1_CSR 0x18
diff --git a/arch/arm/mach-tegra/headsmp.S b/arch/arm/mach-tegra/headsmp.S
index 045c16f2dd51..2072e7322c39 100644
--- a/arch/arm/mach-tegra/headsmp.S
+++ b/arch/arm/mach-tegra/headsmp.S
@@ -6,6 +6,7 @@
6 .section ".text.head", "ax" 6 .section ".text.head", "ax"
7 7
8ENTRY(tegra_secondary_startup) 8ENTRY(tegra_secondary_startup)
9 bl v7_invalidate_l1 9 check_cpu_part_num 0xc09, r8, r9
10 bleq v7_invalidate_l1
10 b secondary_startup 11 b secondary_startup
11ENDPROC(tegra_secondary_startup) 12ENDPROC(tegra_secondary_startup)
diff --git a/arch/arm/mach-tegra/hotplug.c b/arch/arm/mach-tegra/hotplug.c
index a52c10e0a857..04de2e860923 100644
--- a/arch/arm/mach-tegra/hotplug.c
+++ b/arch/arm/mach-tegra/hotplug.c
@@ -37,7 +37,7 @@ int tegra_cpu_kill(unsigned cpu)
37void __ref tegra_cpu_die(unsigned int cpu) 37void __ref tegra_cpu_die(unsigned int cpu)
38{ 38{
39 /* Clean L1 data cache */ 39 /* Clean L1 data cache */
40 tegra_disable_clean_inv_dcache(); 40 tegra_disable_clean_inv_dcache(TEGRA_FLUSH_CACHE_LOUIS);
41 41
42 /* Shut down the current CPU. */ 42 /* Shut down the current CPU. */
43 tegra_hotplug_shutdown(); 43 tegra_hotplug_shutdown();
@@ -46,17 +46,6 @@ void __ref tegra_cpu_die(unsigned int cpu)
46 BUG(); 46 BUG();
47} 47}
48 48
49int tegra_cpu_disable(unsigned int cpu)
50{
51 switch (tegra_chip_id) {
52 case TEGRA20:
53 case TEGRA30:
54 return cpu == 0 ? -EPERM : 0;
55 default:
56 return 0;
57 }
58}
59
60void __init tegra_hotplug_init(void) 49void __init tegra_hotplug_init(void)
61{ 50{
62 if (!IS_ENABLED(CONFIG_HOTPLUG_CPU)) 51 if (!IS_ENABLED(CONFIG_HOTPLUG_CPU))
diff --git a/arch/arm/mach-tegra/iomap.h b/arch/arm/mach-tegra/iomap.h
index 399fbca27102..3f5fa0749bde 100644
--- a/arch/arm/mach-tegra/iomap.h
+++ b/arch/arm/mach-tegra/iomap.h
@@ -24,6 +24,8 @@
24#define TEGRA_IRAM_BASE 0x40000000 24#define TEGRA_IRAM_BASE 0x40000000
25#define TEGRA_IRAM_SIZE SZ_256K 25#define TEGRA_IRAM_SIZE SZ_256K
26 26
27#define TEGRA_IRAM_CODE_AREA (TEGRA_IRAM_BASE + SZ_4K)
28
27#define TEGRA_HOST1X_BASE 0x50000000 29#define TEGRA_HOST1X_BASE 0x50000000
28#define TEGRA_HOST1X_SIZE 0x24000 30#define TEGRA_HOST1X_SIZE 0x24000
29 31
@@ -237,6 +239,12 @@
237#define TEGRA_KFUSE_BASE 0x7000FC00 239#define TEGRA_KFUSE_BASE 0x7000FC00
238#define TEGRA_KFUSE_SIZE SZ_1K 240#define TEGRA_KFUSE_SIZE SZ_1K
239 241
242#define TEGRA_EMC0_BASE 0x7001A000
243#define TEGRA_EMC0_SIZE SZ_2K
244
245#define TEGRA_EMC1_BASE 0x7001A800
246#define TEGRA_EMC1_SIZE SZ_2K
247
240#define TEGRA_CSITE_BASE 0x70040000 248#define TEGRA_CSITE_BASE 0x70040000
241#define TEGRA_CSITE_SIZE SZ_256K 249#define TEGRA_CSITE_SIZE SZ_256K
242 250
@@ -278,9 +286,6 @@
278#define IO_APB_VIRT IOMEM(0xFE300000) 286#define IO_APB_VIRT IOMEM(0xFE300000)
279#define IO_APB_SIZE SZ_1M 287#define IO_APB_SIZE SZ_1M
280 288
281#define TEGRA_PCIE_BASE 0x80000000
282#define TEGRA_PCIE_IO_BASE (TEGRA_PCIE_BASE + SZ_4M)
283
284#define IO_TO_VIRT_BETWEEN(p, st, sz) ((p) >= (st) && (p) < ((st) + (sz))) 289#define IO_TO_VIRT_BETWEEN(p, st, sz) ((p) >= (st) && (p) < ((st) + (sz)))
285#define IO_TO_VIRT_XLATE(p, pst, vst) (((p) - (pst) + (vst))) 290#define IO_TO_VIRT_XLATE(p, pst, vst) (((p) - (pst) + (vst)))
286 291
diff --git a/arch/arm/mach-tegra/irq.c b/arch/arm/mach-tegra/irq.c
index 0de4eed1493d..1a74d562dca1 100644
--- a/arch/arm/mach-tegra/irq.c
+++ b/arch/arm/mach-tegra/irq.c
@@ -18,10 +18,12 @@
18 */ 18 */
19 19
20#include <linux/kernel.h> 20#include <linux/kernel.h>
21#include <linux/cpu_pm.h>
21#include <linux/interrupt.h> 22#include <linux/interrupt.h>
22#include <linux/irq.h> 23#include <linux/irq.h>
23#include <linux/io.h> 24#include <linux/io.h>
24#include <linux/of.h> 25#include <linux/of.h>
26#include <linux/of_address.h>
25#include <linux/irqchip/arm-gic.h> 27#include <linux/irqchip/arm-gic.h>
26#include <linux/syscore_ops.h> 28#include <linux/syscore_ops.h>
27 29
@@ -65,6 +67,7 @@ static u32 cpu_ier[TEGRA_MAX_NUM_ICTLRS];
65static u32 cpu_iep[TEGRA_MAX_NUM_ICTLRS]; 67static u32 cpu_iep[TEGRA_MAX_NUM_ICTLRS];
66 68
67static u32 ictlr_wake_mask[TEGRA_MAX_NUM_ICTLRS]; 69static u32 ictlr_wake_mask[TEGRA_MAX_NUM_ICTLRS];
70static void __iomem *tegra_gic_cpu_base;
68#endif 71#endif
69 72
70bool tegra_pending_sgi(void) 73bool tegra_pending_sgi(void)
@@ -213,8 +216,43 @@ int tegra_legacy_irq_syscore_init(void)
213 216
214 return 0; 217 return 0;
215} 218}
219
220static int tegra_gic_notifier(struct notifier_block *self,
221 unsigned long cmd, void *v)
222{
223 switch (cmd) {
224 case CPU_PM_ENTER:
225 writel_relaxed(0x1E0, tegra_gic_cpu_base + GIC_CPU_CTRL);
226 break;
227 }
228
229 return NOTIFY_OK;
230}
231
232static struct notifier_block tegra_gic_notifier_block = {
233 .notifier_call = tegra_gic_notifier,
234};
235
236static const struct of_device_id tegra114_dt_gic_match[] __initconst = {
237 { .compatible = "arm,cortex-a15-gic" },
238 { }
239};
240
241static void tegra114_gic_cpu_pm_registration(void)
242{
243 struct device_node *dn;
244
245 dn = of_find_matching_node(NULL, tegra114_dt_gic_match);
246 if (!dn)
247 return;
248
249 tegra_gic_cpu_base = of_iomap(dn, 1);
250
251 cpu_pm_register_notifier(&tegra_gic_notifier_block);
252}
216#else 253#else
217#define tegra_set_wake NULL 254#define tegra_set_wake NULL
255static void tegra114_gic_cpu_pm_registration(void) { }
218#endif 256#endif
219 257
220void __init tegra_init_irq(void) 258void __init tegra_init_irq(void)
@@ -252,4 +290,6 @@ void __init tegra_init_irq(void)
252 if (!of_have_populated_dt()) 290 if (!of_have_populated_dt())
253 gic_init(0, 29, distbase, 291 gic_init(0, 29, distbase,
254 IO_ADDRESS(TEGRA_ARM_PERIF_BASE + 0x100)); 292 IO_ADDRESS(TEGRA_ARM_PERIF_BASE + 0x100));
293
294 tegra114_gic_cpu_pm_registration();
255} 295}
diff --git a/arch/arm/mach-tegra/pcie.c b/arch/arm/mach-tegra/pcie.c
deleted file mode 100644
index 46144a19a7e7..000000000000
--- a/arch/arm/mach-tegra/pcie.c
+++ /dev/null
@@ -1,886 +0,0 @@
1/*
2 * arch/arm/mach-tegra/pci.c
3 *
4 * PCIe host controller driver for TEGRA(2) SOCs
5 *
6 * Copyright (c) 2010, CompuLab, Ltd.
7 * Author: Mike Rapoport <mike@compulab.co.il>
8 *
9 * Based on NVIDIA PCIe driver
10 * Copyright (c) 2008-2009, NVIDIA Corporation.
11 *
12 * Bits taken from arch/arm/mach-dove/pcie.c
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2 of the License, or
17 * (at your option) any later version.
18 *
19 * This program is distributed in the hope that it will be useful, but WITHOUT
20 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
22 * more details.
23 *
24 * You should have received a copy of the GNU General Public License along
25 * with this program; if not, write to the Free Software Foundation, Inc.,
26 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
27 */
28
29#include <linux/kernel.h>
30#include <linux/pci.h>
31#include <linux/interrupt.h>
32#include <linux/irq.h>
33#include <linux/clk.h>
34#include <linux/delay.h>
35#include <linux/export.h>
36#include <linux/clk/tegra.h>
37#include <linux/tegra-powergate.h>
38
39#include <asm/sizes.h>
40#include <asm/mach/pci.h>
41
42#include "board.h"
43#include "iomap.h"
44
45/* Hack - need to parse this from DT */
46#define INT_PCIE_INTR 130
47
48/* register definitions */
49#define AFI_OFFSET 0x3800
50#define PADS_OFFSET 0x3000
51#define RP0_OFFSET 0x0000
52#define RP1_OFFSET 0x1000
53
54#define AFI_AXI_BAR0_SZ 0x00
55#define AFI_AXI_BAR1_SZ 0x04
56#define AFI_AXI_BAR2_SZ 0x08
57#define AFI_AXI_BAR3_SZ 0x0c
58#define AFI_AXI_BAR4_SZ 0x10
59#define AFI_AXI_BAR5_SZ 0x14
60
61#define AFI_AXI_BAR0_START 0x18
62#define AFI_AXI_BAR1_START 0x1c
63#define AFI_AXI_BAR2_START 0x20
64#define AFI_AXI_BAR3_START 0x24
65#define AFI_AXI_BAR4_START 0x28
66#define AFI_AXI_BAR5_START 0x2c
67
68#define AFI_FPCI_BAR0 0x30
69#define AFI_FPCI_BAR1 0x34
70#define AFI_FPCI_BAR2 0x38
71#define AFI_FPCI_BAR3 0x3c
72#define AFI_FPCI_BAR4 0x40
73#define AFI_FPCI_BAR5 0x44
74
75#define AFI_CACHE_BAR0_SZ 0x48
76#define AFI_CACHE_BAR0_ST 0x4c
77#define AFI_CACHE_BAR1_SZ 0x50
78#define AFI_CACHE_BAR1_ST 0x54
79
80#define AFI_MSI_BAR_SZ 0x60
81#define AFI_MSI_FPCI_BAR_ST 0x64
82#define AFI_MSI_AXI_BAR_ST 0x68
83
84#define AFI_CONFIGURATION 0xac
85#define AFI_CONFIGURATION_EN_FPCI (1 << 0)
86
87#define AFI_FPCI_ERROR_MASKS 0xb0
88
89#define AFI_INTR_MASK 0xb4
90#define AFI_INTR_MASK_INT_MASK (1 << 0)
91#define AFI_INTR_MASK_MSI_MASK (1 << 8)
92
93#define AFI_INTR_CODE 0xb8
94#define AFI_INTR_CODE_MASK 0xf
95#define AFI_INTR_MASTER_ABORT 4
96#define AFI_INTR_LEGACY 6
97
98#define AFI_INTR_SIGNATURE 0xbc
99#define AFI_SM_INTR_ENABLE 0xc4
100
101#define AFI_AFI_INTR_ENABLE 0xc8
102#define AFI_INTR_EN_INI_SLVERR (1 << 0)
103#define AFI_INTR_EN_INI_DECERR (1 << 1)
104#define AFI_INTR_EN_TGT_SLVERR (1 << 2)
105#define AFI_INTR_EN_TGT_DECERR (1 << 3)
106#define AFI_INTR_EN_TGT_WRERR (1 << 4)
107#define AFI_INTR_EN_DFPCI_DECERR (1 << 5)
108#define AFI_INTR_EN_AXI_DECERR (1 << 6)
109#define AFI_INTR_EN_FPCI_TIMEOUT (1 << 7)
110
111#define AFI_PCIE_CONFIG 0x0f8
112#define AFI_PCIE_CONFIG_PCIEC0_DISABLE_DEVICE (1 << 1)
113#define AFI_PCIE_CONFIG_PCIEC1_DISABLE_DEVICE (1 << 2)
114#define AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_MASK (0xf << 20)
115#define AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_SINGLE (0x0 << 20)
116#define AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_DUAL (0x1 << 20)
117
118#define AFI_FUSE 0x104
119#define AFI_FUSE_PCIE_T0_GEN2_DIS (1 << 2)
120
121#define AFI_PEX0_CTRL 0x110
122#define AFI_PEX1_CTRL 0x118
123#define AFI_PEX_CTRL_RST (1 << 0)
124#define AFI_PEX_CTRL_REFCLK_EN (1 << 3)
125
126#define RP_VEND_XP 0x00000F00
127#define RP_VEND_XP_DL_UP (1 << 30)
128
129#define RP_LINK_CONTROL_STATUS 0x00000090
130#define RP_LINK_CONTROL_STATUS_LINKSTAT_MASK 0x3fff0000
131
132#define PADS_CTL_SEL 0x0000009C
133
134#define PADS_CTL 0x000000A0
135#define PADS_CTL_IDDQ_1L (1 << 0)
136#define PADS_CTL_TX_DATA_EN_1L (1 << 6)
137#define PADS_CTL_RX_DATA_EN_1L (1 << 10)
138
139#define PADS_PLL_CTL 0x000000B8
140#define PADS_PLL_CTL_RST_B4SM (1 << 1)
141#define PADS_PLL_CTL_LOCKDET (1 << 8)
142#define PADS_PLL_CTL_REFCLK_MASK (0x3 << 16)
143#define PADS_PLL_CTL_REFCLK_INTERNAL_CML (0 << 16)
144#define PADS_PLL_CTL_REFCLK_INTERNAL_CMOS (1 << 16)
145#define PADS_PLL_CTL_REFCLK_EXTERNAL (2 << 16)
146#define PADS_PLL_CTL_TXCLKREF_MASK (0x1 << 20)
147#define PADS_PLL_CTL_TXCLKREF_DIV10 (0 << 20)
148#define PADS_PLL_CTL_TXCLKREF_DIV5 (1 << 20)
149
150/* PMC access is required for PCIE xclk (un)clamping */
151#define PMC_SCRATCH42 0x144
152#define PMC_SCRATCH42_PCX_CLAMP (1 << 0)
153
154static void __iomem *reg_pmc_base = IO_ADDRESS(TEGRA_PMC_BASE);
155
156#define pmc_writel(value, reg) \
157 __raw_writel(value, reg_pmc_base + (reg))
158#define pmc_readl(reg) \
159 __raw_readl(reg_pmc_base + (reg))
160
161/*
162 * Tegra2 defines 1GB in the AXI address map for PCIe.
163 *
164 * That address space is split into different regions, with sizes and
165 * offsets as follows:
166 *
167 * 0x80000000 - 0x80003fff - PCI controller registers
168 * 0x80004000 - 0x80103fff - PCI configuration space
169 * 0x80104000 - 0x80203fff - PCI extended configuration space
170 * 0x80203fff - 0x803fffff - unused
171 * 0x80400000 - 0x8040ffff - downstream IO
172 * 0x80410000 - 0x8fffffff - unused
173 * 0x90000000 - 0x9fffffff - non-prefetchable memory
174 * 0xa0000000 - 0xbfffffff - prefetchable memory
175 */
176#define PCIE_REGS_SZ SZ_16K
177#define PCIE_CFG_OFF PCIE_REGS_SZ
178#define PCIE_CFG_SZ SZ_1M
179#define PCIE_EXT_CFG_OFF (PCIE_CFG_SZ + PCIE_CFG_OFF)
180#define PCIE_EXT_CFG_SZ SZ_1M
181#define PCIE_IOMAP_SZ (PCIE_REGS_SZ + PCIE_CFG_SZ + PCIE_EXT_CFG_SZ)
182
183#define MEM_BASE_0 (TEGRA_PCIE_BASE + SZ_256M)
184#define MEM_SIZE_0 SZ_128M
185#define MEM_BASE_1 (MEM_BASE_0 + MEM_SIZE_0)
186#define MEM_SIZE_1 SZ_128M
187#define PREFETCH_MEM_BASE_0 (MEM_BASE_1 + MEM_SIZE_1)
188#define PREFETCH_MEM_SIZE_0 SZ_128M
189#define PREFETCH_MEM_BASE_1 (PREFETCH_MEM_BASE_0 + PREFETCH_MEM_SIZE_0)
190#define PREFETCH_MEM_SIZE_1 SZ_128M
191
192#define PCIE_CONF_BUS(b) ((b) << 16)
193#define PCIE_CONF_DEV(d) ((d) << 11)
194#define PCIE_CONF_FUNC(f) ((f) << 8)
195#define PCIE_CONF_REG(r) \
196 (((r) & ~0x3) | (((r) < 256) ? PCIE_CFG_OFF : PCIE_EXT_CFG_OFF))
197
198struct tegra_pcie_port {
199 int index;
200 u8 root_bus_nr;
201 void __iomem *base;
202
203 bool link_up;
204
205 char mem_space_name[16];
206 char prefetch_space_name[20];
207 struct resource res[2];
208};
209
210struct tegra_pcie_info {
211 struct tegra_pcie_port port[2];
212 int num_ports;
213
214 void __iomem *regs;
215 struct resource res_mmio;
216
217 struct clk *pex_clk;
218 struct clk *afi_clk;
219 struct clk *pcie_xclk;
220 struct clk *pll_e;
221};
222
223static struct tegra_pcie_info tegra_pcie;
224
225static inline void afi_writel(u32 value, unsigned long offset)
226{
227 writel(value, offset + AFI_OFFSET + tegra_pcie.regs);
228}
229
230static inline u32 afi_readl(unsigned long offset)
231{
232 return readl(offset + AFI_OFFSET + tegra_pcie.regs);
233}
234
235static inline void pads_writel(u32 value, unsigned long offset)
236{
237 writel(value, offset + PADS_OFFSET + tegra_pcie.regs);
238}
239
240static inline u32 pads_readl(unsigned long offset)
241{
242 return readl(offset + PADS_OFFSET + tegra_pcie.regs);
243}
244
245static struct tegra_pcie_port *bus_to_port(int bus)
246{
247 int i;
248
249 for (i = tegra_pcie.num_ports - 1; i >= 0; i--) {
250 int rbus = tegra_pcie.port[i].root_bus_nr;
251 if (rbus != -1 && rbus == bus)
252 break;
253 }
254
255 return i >= 0 ? tegra_pcie.port + i : NULL;
256}
257
258static int tegra_pcie_read_conf(struct pci_bus *bus, unsigned int devfn,
259 int where, int size, u32 *val)
260{
261 struct tegra_pcie_port *pp = bus_to_port(bus->number);
262 void __iomem *addr;
263
264 if (pp) {
265 if (devfn != 0) {
266 *val = 0xffffffff;
267 return PCIBIOS_DEVICE_NOT_FOUND;
268 }
269
270 addr = pp->base + (where & ~0x3);
271 } else {
272 addr = tegra_pcie.regs + (PCIE_CONF_BUS(bus->number) +
273 PCIE_CONF_DEV(PCI_SLOT(devfn)) +
274 PCIE_CONF_FUNC(PCI_FUNC(devfn)) +
275 PCIE_CONF_REG(where));
276 }
277
278 *val = readl(addr);
279
280 if (size == 1)
281 *val = (*val >> (8 * (where & 3))) & 0xff;
282 else if (size == 2)
283 *val = (*val >> (8 * (where & 3))) & 0xffff;
284
285 return PCIBIOS_SUCCESSFUL;
286}
287
288static int tegra_pcie_write_conf(struct pci_bus *bus, unsigned int devfn,
289 int where, int size, u32 val)
290{
291 struct tegra_pcie_port *pp = bus_to_port(bus->number);
292 void __iomem *addr;
293
294 u32 mask;
295 u32 tmp;
296
297 if (pp) {
298 if (devfn != 0)
299 return PCIBIOS_DEVICE_NOT_FOUND;
300
301 addr = pp->base + (where & ~0x3);
302 } else {
303 addr = tegra_pcie.regs + (PCIE_CONF_BUS(bus->number) +
304 PCIE_CONF_DEV(PCI_SLOT(devfn)) +
305 PCIE_CONF_FUNC(PCI_FUNC(devfn)) +
306 PCIE_CONF_REG(where));
307 }
308
309 if (size == 4) {
310 writel(val, addr);
311 return PCIBIOS_SUCCESSFUL;
312 }
313
314 if (size == 2)
315 mask = ~(0xffff << ((where & 0x3) * 8));
316 else if (size == 1)
317 mask = ~(0xff << ((where & 0x3) * 8));
318 else
319 return PCIBIOS_BAD_REGISTER_NUMBER;
320
321 tmp = readl(addr) & mask;
322 tmp |= val << ((where & 0x3) * 8);
323 writel(tmp, addr);
324
325 return PCIBIOS_SUCCESSFUL;
326}
327
328static struct pci_ops tegra_pcie_ops = {
329 .read = tegra_pcie_read_conf,
330 .write = tegra_pcie_write_conf,
331};
332
333static void tegra_pcie_fixup_bridge(struct pci_dev *dev)
334{
335 u16 reg;
336
337 if ((dev->class >> 16) == PCI_BASE_CLASS_BRIDGE) {
338 pci_read_config_word(dev, PCI_COMMAND, &reg);
339 reg |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
340 PCI_COMMAND_MASTER | PCI_COMMAND_SERR);
341 pci_write_config_word(dev, PCI_COMMAND, reg);
342 }
343}
344DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, tegra_pcie_fixup_bridge);
345
346/* Tegra PCIE root complex wrongly reports device class */
347static void tegra_pcie_fixup_class(struct pci_dev *dev)
348{
349 dev->class = PCI_CLASS_BRIDGE_PCI << 8;
350}
351DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA, 0x0bf0, tegra_pcie_fixup_class);
352DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NVIDIA, 0x0bf1, tegra_pcie_fixup_class);
353
354/* Tegra PCIE requires relaxed ordering */
355static void tegra_pcie_relax_enable(struct pci_dev *dev)
356{
357 pcie_capability_set_word(dev, PCI_EXP_DEVCTL, PCI_EXP_DEVCTL_RELAX_EN);
358}
359DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, tegra_pcie_relax_enable);
360
361static int tegra_pcie_setup(int nr, struct pci_sys_data *sys)
362{
363 struct tegra_pcie_port *pp;
364
365 if (nr >= tegra_pcie.num_ports)
366 return 0;
367
368 pp = tegra_pcie.port + nr;
369 pp->root_bus_nr = sys->busnr;
370
371 pci_ioremap_io(nr * SZ_64K, TEGRA_PCIE_IO_BASE);
372
373 /*
374 * IORESOURCE_MEM
375 */
376 snprintf(pp->mem_space_name, sizeof(pp->mem_space_name),
377 "PCIe %d MEM", pp->index);
378 pp->mem_space_name[sizeof(pp->mem_space_name) - 1] = 0;
379 pp->res[0].name = pp->mem_space_name;
380 if (pp->index == 0) {
381 pp->res[0].start = MEM_BASE_0;
382 pp->res[0].end = pp->res[0].start + MEM_SIZE_0 - 1;
383 } else {
384 pp->res[0].start = MEM_BASE_1;
385 pp->res[0].end = pp->res[0].start + MEM_SIZE_1 - 1;
386 }
387 pp->res[0].flags = IORESOURCE_MEM;
388 if (request_resource(&iomem_resource, &pp->res[0]))
389 panic("Request PCIe Memory resource failed\n");
390 pci_add_resource_offset(&sys->resources, &pp->res[0], sys->mem_offset);
391
392 /*
393 * IORESOURCE_MEM | IORESOURCE_PREFETCH
394 */
395 snprintf(pp->prefetch_space_name, sizeof(pp->prefetch_space_name),
396 "PCIe %d PREFETCH MEM", pp->index);
397 pp->prefetch_space_name[sizeof(pp->prefetch_space_name) - 1] = 0;
398 pp->res[1].name = pp->prefetch_space_name;
399 if (pp->index == 0) {
400 pp->res[1].start = PREFETCH_MEM_BASE_0;
401 pp->res[1].end = pp->res[1].start + PREFETCH_MEM_SIZE_0 - 1;
402 } else {
403 pp->res[1].start = PREFETCH_MEM_BASE_1;
404 pp->res[1].end = pp->res[1].start + PREFETCH_MEM_SIZE_1 - 1;
405 }
406 pp->res[1].flags = IORESOURCE_MEM | IORESOURCE_PREFETCH;
407 if (request_resource(&iomem_resource, &pp->res[1]))
408 panic("Request PCIe Prefetch Memory resource failed\n");
409 pci_add_resource_offset(&sys->resources, &pp->res[1], sys->mem_offset);
410
411 return 1;
412}
413
414static int tegra_pcie_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
415{
416 return INT_PCIE_INTR;
417}
418
419static struct pci_bus __init *tegra_pcie_scan_bus(int nr,
420 struct pci_sys_data *sys)
421{
422 struct tegra_pcie_port *pp;
423
424 if (nr >= tegra_pcie.num_ports)
425 return NULL;
426
427 pp = tegra_pcie.port + nr;
428 pp->root_bus_nr = sys->busnr;
429
430 return pci_scan_root_bus(NULL, sys->busnr, &tegra_pcie_ops, sys,
431 &sys->resources);
432}
433
434static struct hw_pci tegra_pcie_hw __initdata = {
435 .nr_controllers = 2,
436 .setup = tegra_pcie_setup,
437 .scan = tegra_pcie_scan_bus,
438 .map_irq = tegra_pcie_map_irq,
439};
440
441
442static irqreturn_t tegra_pcie_isr(int irq, void *arg)
443{
444 const char *err_msg[] = {
445 "Unknown",
446 "AXI slave error",
447 "AXI decode error",
448 "Target abort",
449 "Master abort",
450 "Invalid write",
451 "Response decoding error",
452 "AXI response decoding error",
453 "Transcation timeout",
454 };
455
456 u32 code, signature;
457
458 code = afi_readl(AFI_INTR_CODE) & AFI_INTR_CODE_MASK;
459 signature = afi_readl(AFI_INTR_SIGNATURE);
460 afi_writel(0, AFI_INTR_CODE);
461
462 if (code == AFI_INTR_LEGACY)
463 return IRQ_NONE;
464
465 if (code >= ARRAY_SIZE(err_msg))
466 code = 0;
467
468 /*
469 * do not pollute kernel log with master abort reports since they
470 * happen a lot during enumeration
471 */
472 if (code == AFI_INTR_MASTER_ABORT)
473 pr_debug("PCIE: %s, signature: %08x\n", err_msg[code], signature);
474 else
475 pr_err("PCIE: %s, signature: %08x\n", err_msg[code], signature);
476
477 return IRQ_HANDLED;
478}
479
480static void tegra_pcie_setup_translations(void)
481{
482 u32 fpci_bar;
483 u32 size;
484 u32 axi_address;
485
486 /* Bar 0: config Bar */
487 fpci_bar = ((u32)0xfdff << 16);
488 size = PCIE_CFG_SZ;
489 axi_address = TEGRA_PCIE_BASE + PCIE_CFG_OFF;
490 afi_writel(axi_address, AFI_AXI_BAR0_START);
491 afi_writel(size >> 12, AFI_AXI_BAR0_SZ);
492 afi_writel(fpci_bar, AFI_FPCI_BAR0);
493
494 /* Bar 1: extended config Bar */
495 fpci_bar = ((u32)0xfe1 << 20);
496 size = PCIE_EXT_CFG_SZ;
497 axi_address = TEGRA_PCIE_BASE + PCIE_EXT_CFG_OFF;
498 afi_writel(axi_address, AFI_AXI_BAR1_START);
499 afi_writel(size >> 12, AFI_AXI_BAR1_SZ);
500 afi_writel(fpci_bar, AFI_FPCI_BAR1);
501
502 /* Bar 2: downstream IO bar */
503 fpci_bar = ((__u32)0xfdfc << 16);
504 size = SZ_128K;
505 axi_address = TEGRA_PCIE_IO_BASE;
506 afi_writel(axi_address, AFI_AXI_BAR2_START);
507 afi_writel(size >> 12, AFI_AXI_BAR2_SZ);
508 afi_writel(fpci_bar, AFI_FPCI_BAR2);
509
510 /* Bar 3: prefetchable memory BAR */
511 fpci_bar = (((PREFETCH_MEM_BASE_0 >> 12) & 0x0fffffff) << 4) | 0x1;
512 size = PREFETCH_MEM_SIZE_0 + PREFETCH_MEM_SIZE_1;
513 axi_address = PREFETCH_MEM_BASE_0;
514 afi_writel(axi_address, AFI_AXI_BAR3_START);
515 afi_writel(size >> 12, AFI_AXI_BAR3_SZ);
516 afi_writel(fpci_bar, AFI_FPCI_BAR3);
517
518 /* Bar 4: non prefetchable memory BAR */
519 fpci_bar = (((MEM_BASE_0 >> 12) & 0x0FFFFFFF) << 4) | 0x1;
520 size = MEM_SIZE_0 + MEM_SIZE_1;
521 axi_address = MEM_BASE_0;
522 afi_writel(axi_address, AFI_AXI_BAR4_START);
523 afi_writel(size >> 12, AFI_AXI_BAR4_SZ);
524 afi_writel(fpci_bar, AFI_FPCI_BAR4);
525
526 /* Bar 5: NULL out the remaining BAR as it is not used */
527 fpci_bar = 0;
528 size = 0;
529 axi_address = 0;
530 afi_writel(axi_address, AFI_AXI_BAR5_START);
531 afi_writel(size >> 12, AFI_AXI_BAR5_SZ);
532 afi_writel(fpci_bar, AFI_FPCI_BAR5);
533
534 /* map all upstream transactions as uncached */
535 afi_writel(PHYS_OFFSET, AFI_CACHE_BAR0_ST);
536 afi_writel(0, AFI_CACHE_BAR0_SZ);
537 afi_writel(0, AFI_CACHE_BAR1_ST);
538 afi_writel(0, AFI_CACHE_BAR1_SZ);
539
540 /* No MSI */
541 afi_writel(0, AFI_MSI_FPCI_BAR_ST);
542 afi_writel(0, AFI_MSI_BAR_SZ);
543 afi_writel(0, AFI_MSI_AXI_BAR_ST);
544 afi_writel(0, AFI_MSI_BAR_SZ);
545}
546
547static int tegra_pcie_enable_controller(void)
548{
549 u32 val, reg;
550 int i, timeout;
551
552 /* Enable slot clock and pulse the reset signals */
553 for (i = 0, reg = AFI_PEX0_CTRL; i < 2; i++, reg += 0x8) {
554 val = afi_readl(reg) | AFI_PEX_CTRL_REFCLK_EN;
555 afi_writel(val, reg);
556 val &= ~AFI_PEX_CTRL_RST;
557 afi_writel(val, reg);
558
559 val = afi_readl(reg) | AFI_PEX_CTRL_RST;
560 afi_writel(val, reg);
561 }
562
563 /* Enable dual controller and both ports */
564 val = afi_readl(AFI_PCIE_CONFIG);
565 val &= ~(AFI_PCIE_CONFIG_PCIEC0_DISABLE_DEVICE |
566 AFI_PCIE_CONFIG_PCIEC1_DISABLE_DEVICE |
567 AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_MASK);
568 val |= AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_DUAL;
569 afi_writel(val, AFI_PCIE_CONFIG);
570
571 val = afi_readl(AFI_FUSE) & ~AFI_FUSE_PCIE_T0_GEN2_DIS;
572 afi_writel(val, AFI_FUSE);
573
574 /* Initialze internal PHY, enable up to 16 PCIE lanes */
575 pads_writel(0x0, PADS_CTL_SEL);
576
577 /* override IDDQ to 1 on all 4 lanes */
578 val = pads_readl(PADS_CTL) | PADS_CTL_IDDQ_1L;
579 pads_writel(val, PADS_CTL);
580
581 /*
582 * set up PHY PLL inputs select PLLE output as refclock,
583 * set TX ref sel to div10 (not div5)
584 */
585 val = pads_readl(PADS_PLL_CTL);
586 val &= ~(PADS_PLL_CTL_REFCLK_MASK | PADS_PLL_CTL_TXCLKREF_MASK);
587 val |= (PADS_PLL_CTL_REFCLK_INTERNAL_CML | PADS_PLL_CTL_TXCLKREF_DIV10);
588 pads_writel(val, PADS_PLL_CTL);
589
590 /* take PLL out of reset */
591 val = pads_readl(PADS_PLL_CTL) | PADS_PLL_CTL_RST_B4SM;
592 pads_writel(val, PADS_PLL_CTL);
593
594 /*
595 * Hack, set the clock voltage to the DEFAULT provided by hw folks.
596 * This doesn't exist in the documentation
597 */
598 pads_writel(0xfa5cfa5c, 0xc8);
599
600 /* Wait for the PLL to lock */
601 timeout = 300;
602 do {
603 val = pads_readl(PADS_PLL_CTL);
604 usleep_range(1000, 1000);
605 if (--timeout == 0) {
606 pr_err("Tegra PCIe error: timeout waiting for PLL\n");
607 return -EBUSY;
608 }
609 } while (!(val & PADS_PLL_CTL_LOCKDET));
610
611 /* turn off IDDQ override */
612 val = pads_readl(PADS_CTL) & ~PADS_CTL_IDDQ_1L;
613 pads_writel(val, PADS_CTL);
614
615 /* enable TX/RX data */
616 val = pads_readl(PADS_CTL);
617 val |= (PADS_CTL_TX_DATA_EN_1L | PADS_CTL_RX_DATA_EN_1L);
618 pads_writel(val, PADS_CTL);
619
620 /* Take the PCIe interface module out of reset */
621 tegra_periph_reset_deassert(tegra_pcie.pcie_xclk);
622
623 /* Finally enable PCIe */
624 val = afi_readl(AFI_CONFIGURATION) | AFI_CONFIGURATION_EN_FPCI;
625 afi_writel(val, AFI_CONFIGURATION);
626
627 val = (AFI_INTR_EN_INI_SLVERR | AFI_INTR_EN_INI_DECERR |
628 AFI_INTR_EN_TGT_SLVERR | AFI_INTR_EN_TGT_DECERR |
629 AFI_INTR_EN_TGT_WRERR | AFI_INTR_EN_DFPCI_DECERR);
630 afi_writel(val, AFI_AFI_INTR_ENABLE);
631 afi_writel(0xffffffff, AFI_SM_INTR_ENABLE);
632
633 /* FIXME: No MSI for now, only INT */
634 afi_writel(AFI_INTR_MASK_INT_MASK, AFI_INTR_MASK);
635
636 /* Disable all execptions */
637 afi_writel(0, AFI_FPCI_ERROR_MASKS);
638
639 return 0;
640}
641
642static void tegra_pcie_xclk_clamp(bool clamp)
643{
644 u32 reg;
645
646 reg = pmc_readl(PMC_SCRATCH42) & ~PMC_SCRATCH42_PCX_CLAMP;
647
648 if (clamp)
649 reg |= PMC_SCRATCH42_PCX_CLAMP;
650
651 pmc_writel(reg, PMC_SCRATCH42);
652}
653
654static void tegra_pcie_power_off(void)
655{
656 tegra_periph_reset_assert(tegra_pcie.pcie_xclk);
657 tegra_periph_reset_assert(tegra_pcie.afi_clk);
658 tegra_periph_reset_assert(tegra_pcie.pex_clk);
659
660 tegra_powergate_power_off(TEGRA_POWERGATE_PCIE);
661 tegra_pcie_xclk_clamp(true);
662}
663
664static int tegra_pcie_power_regate(void)
665{
666 int err;
667
668 tegra_pcie_power_off();
669
670 tegra_pcie_xclk_clamp(true);
671
672 tegra_periph_reset_assert(tegra_pcie.pcie_xclk);
673 tegra_periph_reset_assert(tegra_pcie.afi_clk);
674
675 err = tegra_powergate_sequence_power_up(TEGRA_POWERGATE_PCIE,
676 tegra_pcie.pex_clk);
677 if (err) {
678 pr_err("PCIE: powerup sequence failed: %d\n", err);
679 return err;
680 }
681
682 tegra_periph_reset_deassert(tegra_pcie.afi_clk);
683
684 tegra_pcie_xclk_clamp(false);
685
686 clk_prepare_enable(tegra_pcie.afi_clk);
687 clk_prepare_enable(tegra_pcie.pex_clk);
688 return clk_prepare_enable(tegra_pcie.pll_e);
689}
690
691static int tegra_pcie_clocks_get(void)
692{
693 int err;
694
695 tegra_pcie.pex_clk = clk_get(NULL, "pex");
696 if (IS_ERR(tegra_pcie.pex_clk))
697 return PTR_ERR(tegra_pcie.pex_clk);
698
699 tegra_pcie.afi_clk = clk_get(NULL, "afi");
700 if (IS_ERR(tegra_pcie.afi_clk)) {
701 err = PTR_ERR(tegra_pcie.afi_clk);
702 goto err_afi_clk;
703 }
704
705 tegra_pcie.pcie_xclk = clk_get(NULL, "pcie_xclk");
706 if (IS_ERR(tegra_pcie.pcie_xclk)) {
707 err = PTR_ERR(tegra_pcie.pcie_xclk);
708 goto err_pcie_xclk;
709 }
710
711 tegra_pcie.pll_e = clk_get_sys(NULL, "pll_e");
712 if (IS_ERR(tegra_pcie.pll_e)) {
713 err = PTR_ERR(tegra_pcie.pll_e);
714 goto err_pll_e;
715 }
716
717 return 0;
718
719err_pll_e:
720 clk_put(tegra_pcie.pcie_xclk);
721err_pcie_xclk:
722 clk_put(tegra_pcie.afi_clk);
723err_afi_clk:
724 clk_put(tegra_pcie.pex_clk);
725
726 return err;
727}
728
729static void tegra_pcie_clocks_put(void)
730{
731 clk_put(tegra_pcie.pll_e);
732 clk_put(tegra_pcie.pcie_xclk);
733 clk_put(tegra_pcie.afi_clk);
734 clk_put(tegra_pcie.pex_clk);
735}
736
737static int __init tegra_pcie_get_resources(void)
738{
739 int err;
740
741 err = tegra_pcie_clocks_get();
742 if (err) {
743 pr_err("PCIE: failed to get clocks: %d\n", err);
744 return err;
745 }
746
747 err = tegra_pcie_power_regate();
748 if (err) {
749 pr_err("PCIE: failed to power up: %d\n", err);
750 goto err_pwr_on;
751 }
752
753 tegra_pcie.regs = ioremap_nocache(TEGRA_PCIE_BASE, PCIE_IOMAP_SZ);
754 if (tegra_pcie.regs == NULL) {
755 pr_err("PCIE: Failed to map PCI/AFI registers\n");
756 err = -ENOMEM;
757 goto err_map_reg;
758 }
759
760 err = request_irq(INT_PCIE_INTR, tegra_pcie_isr,
761 IRQF_SHARED, "PCIE", &tegra_pcie);
762 if (err) {
763 pr_err("PCIE: Failed to register IRQ: %d\n", err);
764 goto err_req_io;
765 }
766 set_irq_flags(INT_PCIE_INTR, IRQF_VALID);
767
768 return 0;
769
770err_req_io:
771 iounmap(tegra_pcie.regs);
772err_map_reg:
773 tegra_pcie_power_off();
774err_pwr_on:
775 tegra_pcie_clocks_put();
776
777 return err;
778}
779
780/*
781 * FIXME: If there are no PCIe cards attached, then calling this function
782 * can result in the increase of the bootup time as there are big timeout
783 * loops.
784 */
785#define TEGRA_PCIE_LINKUP_TIMEOUT 200 /* up to 1.2 seconds */
786static bool tegra_pcie_check_link(struct tegra_pcie_port *pp, int idx,
787 u32 reset_reg)
788{
789 u32 reg;
790 int retries = 3;
791 int timeout;
792
793 do {
794 timeout = TEGRA_PCIE_LINKUP_TIMEOUT;
795 while (timeout) {
796 reg = readl(pp->base + RP_VEND_XP);
797
798 if (reg & RP_VEND_XP_DL_UP)
799 break;
800
801 mdelay(1);
802 timeout--;
803 }
804
805 if (!timeout) {
806 pr_err("PCIE: port %d: link down, retrying\n", idx);
807 goto retry;
808 }
809
810 timeout = TEGRA_PCIE_LINKUP_TIMEOUT;
811 while (timeout) {
812 reg = readl(pp->base + RP_LINK_CONTROL_STATUS);
813
814 if (reg & 0x20000000)
815 return true;
816
817 mdelay(1);
818 timeout--;
819 }
820
821retry:
822 /* Pulse the PEX reset */
823 reg = afi_readl(reset_reg) | AFI_PEX_CTRL_RST;
824 afi_writel(reg, reset_reg);
825 mdelay(1);
826 reg = afi_readl(reset_reg) & ~AFI_PEX_CTRL_RST;
827 afi_writel(reg, reset_reg);
828
829 retries--;
830 } while (retries);
831
832 return false;
833}
834
835static void __init tegra_pcie_add_port(int index, u32 offset, u32 reset_reg)
836{
837 struct tegra_pcie_port *pp;
838
839 pp = tegra_pcie.port + tegra_pcie.num_ports;
840
841 pp->index = -1;
842 pp->base = tegra_pcie.regs + offset;
843 pp->link_up = tegra_pcie_check_link(pp, index, reset_reg);
844
845 if (!pp->link_up) {
846 pp->base = NULL;
847 printk(KERN_INFO "PCIE: port %d: link down, ignoring\n", index);
848 return;
849 }
850
851 tegra_pcie.num_ports++;
852 pp->index = index;
853 pp->root_bus_nr = -1;
854 memset(pp->res, 0, sizeof(pp->res));
855}
856
857int __init tegra_pcie_init(bool init_port0, bool init_port1)
858{
859 int err;
860
861 if (!(init_port0 || init_port1))
862 return -ENODEV;
863
864 pcibios_min_mem = 0;
865
866 err = tegra_pcie_get_resources();
867 if (err)
868 return err;
869
870 err = tegra_pcie_enable_controller();
871 if (err)
872 return err;
873
874 /* setup the AFI address translations */
875 tegra_pcie_setup_translations();
876
877 if (init_port0)
878 tegra_pcie_add_port(0, RP0_OFFSET, AFI_PEX0_CTRL);
879
880 if (init_port1)
881 tegra_pcie_add_port(1, RP1_OFFSET, AFI_PEX1_CTRL);
882
883 pci_common_init(&tegra_pcie_hw);
884
885 return 0;
886}
diff --git a/arch/arm/mach-tegra/platsmp.c b/arch/arm/mach-tegra/platsmp.c
index 97b33a2a2d75..2d0203627fbb 100644
--- a/arch/arm/mach-tegra/platsmp.c
+++ b/arch/arm/mach-tegra/platsmp.c
@@ -196,6 +196,5 @@ struct smp_operations tegra_smp_ops __initdata = {
196#ifdef CONFIG_HOTPLUG_CPU 196#ifdef CONFIG_HOTPLUG_CPU
197 .cpu_kill = tegra_cpu_kill, 197 .cpu_kill = tegra_cpu_kill,
198 .cpu_die = tegra_cpu_die, 198 .cpu_die = tegra_cpu_die,
199 .cpu_disable = tegra_cpu_disable,
200#endif 199#endif
201}; 200};
diff --git a/arch/arm/mach-tegra/pm-tegra20.c b/arch/arm/mach-tegra/pm-tegra20.c
new file mode 100644
index 000000000000..d65e1d786400
--- /dev/null
+++ b/arch/arm/mach-tegra/pm-tegra20.c
@@ -0,0 +1,34 @@
1/*
2 * Copyright (c) 2013, NVIDIA Corporation. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms and conditions of the GNU General Public License,
6 * version 2, as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11 * more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16#include <linux/kernel.h>
17
18#include "pm.h"
19
20#ifdef CONFIG_PM_SLEEP
21extern u32 tegra20_iram_start, tegra20_iram_end;
22extern void tegra20_sleep_core_finish(unsigned long);
23
24void tegra20_lp1_iram_hook(void)
25{
26 tegra_lp1_iram.start_addr = &tegra20_iram_start;
27 tegra_lp1_iram.end_addr = &tegra20_iram_end;
28}
29
30void tegra20_sleep_core_init(void)
31{
32 tegra_sleep_core_finish = tegra20_sleep_core_finish;
33}
34#endif
diff --git a/arch/arm/mach-tegra/pm-tegra30.c b/arch/arm/mach-tegra/pm-tegra30.c
new file mode 100644
index 000000000000..8fa326d6ff1a
--- /dev/null
+++ b/arch/arm/mach-tegra/pm-tegra30.c
@@ -0,0 +1,34 @@
1/*
2 * Copyright (c) 2013, NVIDIA Corporation. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms and conditions of the GNU General Public License,
6 * version 2, as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11 * more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16#include <linux/kernel.h>
17
18#include "pm.h"
19
20#ifdef CONFIG_PM_SLEEP
21extern u32 tegra30_iram_start, tegra30_iram_end;
22extern void tegra30_sleep_core_finish(unsigned long);
23
24void tegra30_lp1_iram_hook(void)
25{
26 tegra_lp1_iram.start_addr = &tegra30_iram_start;
27 tegra_lp1_iram.end_addr = &tegra30_iram_end;
28}
29
30void tegra30_sleep_core_init(void)
31{
32 tegra_sleep_core_finish = tegra30_sleep_core_finish;
33}
34#endif
diff --git a/arch/arm/mach-tegra/pm.c b/arch/arm/mach-tegra/pm.c
index 261fec140c06..ed294a04e1d3 100644
--- a/arch/arm/mach-tegra/pm.c
+++ b/arch/arm/mach-tegra/pm.c
@@ -37,12 +37,18 @@
37#include "reset.h" 37#include "reset.h"
38#include "flowctrl.h" 38#include "flowctrl.h"
39#include "fuse.h" 39#include "fuse.h"
40#include "pm.h"
40#include "pmc.h" 41#include "pmc.h"
41#include "sleep.h" 42#include "sleep.h"
42 43
43#ifdef CONFIG_PM_SLEEP 44#ifdef CONFIG_PM_SLEEP
44static DEFINE_SPINLOCK(tegra_lp2_lock); 45static DEFINE_SPINLOCK(tegra_lp2_lock);
46static u32 iram_save_size;
47static void *iram_save_addr;
48struct tegra_lp1_iram tegra_lp1_iram;
45void (*tegra_tear_down_cpu)(void); 49void (*tegra_tear_down_cpu)(void);
50void (*tegra_sleep_core_finish)(unsigned long v2p);
51static int (*tegra_sleep_func)(unsigned long v2p);
46 52
47static void tegra_tear_down_cpu_init(void) 53static void tegra_tear_down_cpu_init(void)
48{ 54{
@@ -52,7 +58,9 @@ static void tegra_tear_down_cpu_init(void)
52 tegra_tear_down_cpu = tegra20_tear_down_cpu; 58 tegra_tear_down_cpu = tegra20_tear_down_cpu;
53 break; 59 break;
54 case TEGRA30: 60 case TEGRA30:
55 if (IS_ENABLED(CONFIG_ARCH_TEGRA_3x_SOC)) 61 case TEGRA114:
62 if (IS_ENABLED(CONFIG_ARCH_TEGRA_3x_SOC) ||
63 IS_ENABLED(CONFIG_ARCH_TEGRA_114_SOC))
56 tegra_tear_down_cpu = tegra30_tear_down_cpu; 64 tegra_tear_down_cpu = tegra30_tear_down_cpu;
57 break; 65 break;
58 } 66 }
@@ -171,19 +179,109 @@ void tegra_idle_lp2_last(void)
171enum tegra_suspend_mode tegra_pm_validate_suspend_mode( 179enum tegra_suspend_mode tegra_pm_validate_suspend_mode(
172 enum tegra_suspend_mode mode) 180 enum tegra_suspend_mode mode)
173{ 181{
174 /* Tegra114 didn't support any suspending mode yet. */
175 if (tegra_chip_id == TEGRA114)
176 return TEGRA_SUSPEND_NONE;
177
178 /* 182 /*
179 * The Tegra devices only support suspending to LP2 currently. 183 * The Tegra devices support suspending to LP1 or lower currently.
180 */ 184 */
181 if (mode > TEGRA_SUSPEND_LP2) 185 if (mode > TEGRA_SUSPEND_LP1)
182 return TEGRA_SUSPEND_LP2; 186 return TEGRA_SUSPEND_LP1;
183 187
184 return mode; 188 return mode;
185} 189}
186 190
191static int tegra_sleep_core(unsigned long v2p)
192{
193 setup_mm_for_reboot();
194 tegra_sleep_core_finish(v2p);
195
196 /* should never here */
197 BUG();
198
199 return 0;
200}
201
202/*
203 * tegra_lp1_iram_hook
204 *
205 * Hooking the address of LP1 reset vector and SDRAM self-refresh code in
206 * SDRAM. These codes not be copied to IRAM in this fuction. We need to
207 * copy these code to IRAM before LP0/LP1 suspend and restore the content
208 * of IRAM after resume.
209 */
210static bool tegra_lp1_iram_hook(void)
211{
212 switch (tegra_chip_id) {
213 case TEGRA20:
214 if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC))
215 tegra20_lp1_iram_hook();
216 break;
217 case TEGRA30:
218 case TEGRA114:
219 if (IS_ENABLED(CONFIG_ARCH_TEGRA_3x_SOC) ||
220 IS_ENABLED(CONFIG_ARCH_TEGRA_114_SOC))
221 tegra30_lp1_iram_hook();
222 break;
223 default:
224 break;
225 }
226
227 if (!tegra_lp1_iram.start_addr || !tegra_lp1_iram.end_addr)
228 return false;
229
230 iram_save_size = tegra_lp1_iram.end_addr - tegra_lp1_iram.start_addr;
231 iram_save_addr = kmalloc(iram_save_size, GFP_KERNEL);
232 if (!iram_save_addr)
233 return false;
234
235 return true;
236}
237
238static bool tegra_sleep_core_init(void)
239{
240 switch (tegra_chip_id) {
241 case TEGRA20:
242 if (IS_ENABLED(CONFIG_ARCH_TEGRA_2x_SOC))
243 tegra20_sleep_core_init();
244 break;
245 case TEGRA30:
246 case TEGRA114:
247 if (IS_ENABLED(CONFIG_ARCH_TEGRA_3x_SOC) ||
248 IS_ENABLED(CONFIG_ARCH_TEGRA_114_SOC))
249 tegra30_sleep_core_init();
250 break;
251 default:
252 break;
253 }
254
255 if (!tegra_sleep_core_finish)
256 return false;
257
258 return true;
259}
260
261static void tegra_suspend_enter_lp1(void)
262{
263 tegra_pmc_suspend();
264
265 /* copy the reset vector & SDRAM shutdown code into IRAM */
266 memcpy(iram_save_addr, IO_ADDRESS(TEGRA_IRAM_CODE_AREA),
267 iram_save_size);
268 memcpy(IO_ADDRESS(TEGRA_IRAM_CODE_AREA), tegra_lp1_iram.start_addr,
269 iram_save_size);
270
271 *((u32 *)tegra_cpu_lp1_mask) = 1;
272}
273
274static void tegra_suspend_exit_lp1(void)
275{
276 tegra_pmc_resume();
277
278 /* restore IRAM */
279 memcpy(IO_ADDRESS(TEGRA_IRAM_CODE_AREA), iram_save_addr,
280 iram_save_size);
281
282 *(u32 *)tegra_cpu_lp1_mask = 0;
283}
284
187static const char *lp_state[TEGRA_MAX_SUSPEND_MODE] = { 285static const char *lp_state[TEGRA_MAX_SUSPEND_MODE] = {
188 [TEGRA_SUSPEND_NONE] = "none", 286 [TEGRA_SUSPEND_NONE] = "none",
189 [TEGRA_SUSPEND_LP2] = "LP2", 287 [TEGRA_SUSPEND_LP2] = "LP2",
@@ -207,6 +305,9 @@ static int tegra_suspend_enter(suspend_state_t state)
207 305
208 suspend_cpu_complex(); 306 suspend_cpu_complex();
209 switch (mode) { 307 switch (mode) {
308 case TEGRA_SUSPEND_LP1:
309 tegra_suspend_enter_lp1();
310 break;
210 case TEGRA_SUSPEND_LP2: 311 case TEGRA_SUSPEND_LP2:
211 tegra_set_cpu_in_lp2(); 312 tegra_set_cpu_in_lp2();
212 break; 313 break;
@@ -214,9 +315,12 @@ static int tegra_suspend_enter(suspend_state_t state)
214 break; 315 break;
215 } 316 }
216 317
217 cpu_suspend(PHYS_OFFSET - PAGE_OFFSET, &tegra_sleep_cpu); 318 cpu_suspend(PHYS_OFFSET - PAGE_OFFSET, tegra_sleep_func);
218 319
219 switch (mode) { 320 switch (mode) {
321 case TEGRA_SUSPEND_LP1:
322 tegra_suspend_exit_lp1();
323 break;
220 case TEGRA_SUSPEND_LP2: 324 case TEGRA_SUSPEND_LP2:
221 tegra_clear_cpu_in_lp2(); 325 tegra_clear_cpu_in_lp2();
222 break; 326 break;
@@ -237,12 +341,36 @@ static const struct platform_suspend_ops tegra_suspend_ops = {
237 341
238void __init tegra_init_suspend(void) 342void __init tegra_init_suspend(void)
239{ 343{
240 if (tegra_pmc_get_suspend_mode() == TEGRA_SUSPEND_NONE) 344 enum tegra_suspend_mode mode = tegra_pmc_get_suspend_mode();
345
346 if (mode == TEGRA_SUSPEND_NONE)
241 return; 347 return;
242 348
243 tegra_tear_down_cpu_init(); 349 tegra_tear_down_cpu_init();
244 tegra_pmc_suspend_init(); 350 tegra_pmc_suspend_init();
245 351
352 if (mode >= TEGRA_SUSPEND_LP1) {
353 if (!tegra_lp1_iram_hook() || !tegra_sleep_core_init()) {
354 pr_err("%s: unable to allocate memory for SDRAM"
355 "self-refresh -- LP0/LP1 unavailable\n",
356 __func__);
357 tegra_pmc_set_suspend_mode(TEGRA_SUSPEND_LP2);
358 mode = TEGRA_SUSPEND_LP2;
359 }
360 }
361
362 /* set up sleep function for cpu_suspend */
363 switch (mode) {
364 case TEGRA_SUSPEND_LP1:
365 tegra_sleep_func = tegra_sleep_core;
366 break;
367 case TEGRA_SUSPEND_LP2:
368 tegra_sleep_func = tegra_sleep_cpu;
369 break;
370 default:
371 break;
372 }
373
246 suspend_set_ops(&tegra_suspend_ops); 374 suspend_set_ops(&tegra_suspend_ops);
247} 375}
248#endif 376#endif
diff --git a/arch/arm/mach-tegra/pm.h b/arch/arm/mach-tegra/pm.h
index 94c4b9d9077c..fe204e5256e7 100644
--- a/arch/arm/mach-tegra/pm.h
+++ b/arch/arm/mach-tegra/pm.h
@@ -23,6 +23,18 @@
23 23
24#include "pmc.h" 24#include "pmc.h"
25 25
26struct tegra_lp1_iram {
27 void *start_addr;
28 void *end_addr;
29};
30extern struct tegra_lp1_iram tegra_lp1_iram;
31extern void (*tegra_sleep_core_finish)(unsigned long v2p);
32
33void tegra20_lp1_iram_hook(void);
34void tegra20_sleep_core_init(void);
35void tegra30_lp1_iram_hook(void);
36void tegra30_sleep_core_init(void);
37
26extern unsigned long l2x0_saved_regs_addr; 38extern unsigned long l2x0_saved_regs_addr;
27 39
28void save_cpu_arch_register(void); 40void save_cpu_arch_register(void);
diff --git a/arch/arm/mach-tegra/pmc.c b/arch/arm/mach-tegra/pmc.c
index eb3fa4aee0e4..8acb881f7cfe 100644
--- a/arch/arm/mach-tegra/pmc.c
+++ b/arch/arm/mach-tegra/pmc.c
@@ -21,11 +21,14 @@
21#include <linux/of.h> 21#include <linux/of.h>
22#include <linux/of_address.h> 22#include <linux/of_address.h>
23 23
24#include "flowctrl.h"
24#include "fuse.h" 25#include "fuse.h"
25#include "pm.h" 26#include "pm.h"
26#include "pmc.h" 27#include "pmc.h"
27#include "sleep.h" 28#include "sleep.h"
28 29
30#define TEGRA_POWER_SYSCLK_POLARITY (1 << 10) /* sys clk polarity */
31#define TEGRA_POWER_SYSCLK_OE (1 << 11) /* system clock enable */
29#define TEGRA_POWER_EFFECT_LP0 (1 << 14) /* LP0 when CPU pwr gated */ 32#define TEGRA_POWER_EFFECT_LP0 (1 << 14) /* LP0 when CPU pwr gated */
30#define TEGRA_POWER_CPU_PWRREQ_POLARITY (1 << 15) /* CPU pwr req polarity */ 33#define TEGRA_POWER_CPU_PWRREQ_POLARITY (1 << 15) /* CPU pwr req polarity */
31#define TEGRA_POWER_CPU_PWRREQ_OE (1 << 16) /* CPU pwr req enable */ 34#define TEGRA_POWER_CPU_PWRREQ_OE (1 << 16) /* CPU pwr req enable */
@@ -193,16 +196,50 @@ enum tegra_suspend_mode tegra_pmc_get_suspend_mode(void)
193 return pmc_pm_data.suspend_mode; 196 return pmc_pm_data.suspend_mode;
194} 197}
195 198
199void tegra_pmc_set_suspend_mode(enum tegra_suspend_mode mode)
200{
201 if (mode < TEGRA_SUSPEND_NONE || mode >= TEGRA_MAX_SUSPEND_MODE)
202 return;
203
204 pmc_pm_data.suspend_mode = mode;
205}
206
207void tegra_pmc_suspend(void)
208{
209 tegra_pmc_writel(virt_to_phys(tegra_resume), PMC_SCRATCH41);
210}
211
212void tegra_pmc_resume(void)
213{
214 tegra_pmc_writel(0x0, PMC_SCRATCH41);
215}
216
196void tegra_pmc_pm_set(enum tegra_suspend_mode mode) 217void tegra_pmc_pm_set(enum tegra_suspend_mode mode)
197{ 218{
198 u32 reg; 219 u32 reg, csr_reg;
199 unsigned long rate = 0; 220 unsigned long rate = 0;
200 221
201 reg = tegra_pmc_readl(PMC_CTRL); 222 reg = tegra_pmc_readl(PMC_CTRL);
202 reg |= TEGRA_POWER_CPU_PWRREQ_OE; 223 reg |= TEGRA_POWER_CPU_PWRREQ_OE;
203 reg &= ~TEGRA_POWER_EFFECT_LP0; 224 reg &= ~TEGRA_POWER_EFFECT_LP0;
204 225
226 switch (tegra_chip_id) {
227 case TEGRA20:
228 case TEGRA30:
229 break;
230 default:
231 /* Turn off CRAIL */
232 csr_reg = flowctrl_read_cpu_csr(0);
233 csr_reg &= ~FLOW_CTRL_CSR_ENABLE_EXT_MASK;
234 csr_reg |= FLOW_CTRL_CSR_ENABLE_EXT_CRAIL;
235 flowctrl_write_cpu_csr(0, csr_reg);
236 break;
237 }
238
205 switch (mode) { 239 switch (mode) {
240 case TEGRA_SUSPEND_LP1:
241 rate = 32768;
242 break;
206 case TEGRA_SUSPEND_LP2: 243 case TEGRA_SUSPEND_LP2:
207 rate = clk_get_rate(tegra_pclk); 244 rate = clk_get_rate(tegra_pclk);
208 break; 245 break;
@@ -224,6 +261,20 @@ void tegra_pmc_suspend_init(void)
224 reg = tegra_pmc_readl(PMC_CTRL); 261 reg = tegra_pmc_readl(PMC_CTRL);
225 reg |= TEGRA_POWER_CPU_PWRREQ_OE; 262 reg |= TEGRA_POWER_CPU_PWRREQ_OE;
226 tegra_pmc_writel(reg, PMC_CTRL); 263 tegra_pmc_writel(reg, PMC_CTRL);
264
265 reg = tegra_pmc_readl(PMC_CTRL);
266
267 if (!pmc_pm_data.sysclkreq_high)
268 reg |= TEGRA_POWER_SYSCLK_POLARITY;
269 else
270 reg &= ~TEGRA_POWER_SYSCLK_POLARITY;
271
272 /* configure the output polarity while the request is tristated */
273 tegra_pmc_writel(reg, PMC_CTRL);
274
275 /* now enable the request */
276 reg |= TEGRA_POWER_SYSCLK_OE;
277 tegra_pmc_writel(reg, PMC_CTRL);
227} 278}
228#endif 279#endif
229 280
diff --git a/arch/arm/mach-tegra/pmc.h b/arch/arm/mach-tegra/pmc.h
index e1c2df272f7d..549f8c7b762c 100644
--- a/arch/arm/mach-tegra/pmc.h
+++ b/arch/arm/mach-tegra/pmc.h
@@ -28,6 +28,9 @@ enum tegra_suspend_mode {
28 28
29#ifdef CONFIG_PM_SLEEP 29#ifdef CONFIG_PM_SLEEP
30enum tegra_suspend_mode tegra_pmc_get_suspend_mode(void); 30enum tegra_suspend_mode tegra_pmc_get_suspend_mode(void);
31void tegra_pmc_set_suspend_mode(enum tegra_suspend_mode mode);
32void tegra_pmc_suspend(void);
33void tegra_pmc_resume(void);
31void tegra_pmc_pm_set(enum tegra_suspend_mode mode); 34void tegra_pmc_pm_set(enum tegra_suspend_mode mode);
32void tegra_pmc_suspend_init(void); 35void tegra_pmc_suspend_init(void);
33#endif 36#endif
diff --git a/arch/arm/mach-tegra/reset-handler.S b/arch/arm/mach-tegra/reset-handler.S
index 39dc9e7834f3..f527b2c2dea7 100644
--- a/arch/arm/mach-tegra/reset-handler.S
+++ b/arch/arm/mach-tegra/reset-handler.S
@@ -40,9 +40,12 @@
40 * re-enabling sdram. 40 * re-enabling sdram.
41 * 41 *
42 * r6: SoC ID 42 * r6: SoC ID
43 * r8: CPU part number
43 */ 44 */
44ENTRY(tegra_resume) 45ENTRY(tegra_resume)
45 bl v7_invalidate_l1 46 check_cpu_part_num 0xc09, r8, r9
47 bleq v7_invalidate_l1
48 blne tegra_init_l2_for_a15
46 49
47 cpu_id r0 50 cpu_id r0
48 tegra_get_soc_id TEGRA_APB_MISC_BASE, r6 51 tegra_get_soc_id TEGRA_APB_MISC_BASE, r6
@@ -70,7 +73,8 @@ no_cpu0_chk:
70 str r1, [r2] 73 str r1, [r2]
711: 741:
72 75
73 check_cpu_part_num 0xc09, r8, r9 76 mov32 r9, 0xc09
77 cmp r8, r9
74 bne not_ca9 78 bne not_ca9
75#ifdef CONFIG_HAVE_ARM_SCU 79#ifdef CONFIG_HAVE_ARM_SCU
76 /* enable SCU */ 80 /* enable SCU */
@@ -178,6 +182,19 @@ after_errata:
1781: 1821:
179#endif 183#endif
180 184
185 /* Waking up from LP1? */
186 ldr r8, [r12, #RESET_DATA(MASK_LP1)]
187 tst r8, r11 @ if in_lp1
188 beq __is_not_lp1
189 cmp r10, #0
190 bne __die @ only CPU0 can be here
191 ldr lr, [r12, #RESET_DATA(STARTUP_LP1)]
192 cmp lr, #0
193 bleq __die @ no LP1 startup handler
194 THUMB( add lr, lr, #1 ) @ switch to Thumb mode
195 bx lr
196__is_not_lp1:
197
181 /* Waking up from LP2? */ 198 /* Waking up from LP2? */
182 ldr r9, [r12, #RESET_DATA(MASK_LP2)] 199 ldr r9, [r12, #RESET_DATA(MASK_LP2)]
183 tst r9, r11 @ if in_lp2 200 tst r9, r11 @ if in_lp2
diff --git a/arch/arm/mach-tegra/reset.c b/arch/arm/mach-tegra/reset.c
index 1ac434e0068f..fd0bbf8a6c94 100644
--- a/arch/arm/mach-tegra/reset.c
+++ b/arch/arm/mach-tegra/reset.c
@@ -81,6 +81,8 @@ void __init tegra_cpu_reset_handler_init(void)
81#endif 81#endif
82 82
83#ifdef CONFIG_PM_SLEEP 83#ifdef CONFIG_PM_SLEEP
84 __tegra_cpu_reset_handler_data[TEGRA_RESET_STARTUP_LP1] =
85 TEGRA_IRAM_CODE_AREA;
84 __tegra_cpu_reset_handler_data[TEGRA_RESET_STARTUP_LP2] = 86 __tegra_cpu_reset_handler_data[TEGRA_RESET_STARTUP_LP2] =
85 virt_to_phys((void *)tegra_resume); 87 virt_to_phys((void *)tegra_resume);
86#endif 88#endif
diff --git a/arch/arm/mach-tegra/reset.h b/arch/arm/mach-tegra/reset.h
index c90d8e9c4ad2..76a93434c6ee 100644
--- a/arch/arm/mach-tegra/reset.h
+++ b/arch/arm/mach-tegra/reset.h
@@ -39,6 +39,10 @@ void __tegra_cpu_reset_handler_end(void);
39void tegra_secondary_startup(void); 39void tegra_secondary_startup(void);
40 40
41#ifdef CONFIG_PM_SLEEP 41#ifdef CONFIG_PM_SLEEP
42#define tegra_cpu_lp1_mask \
43 (IO_ADDRESS(TEGRA_IRAM_BASE + TEGRA_IRAM_RESET_HANDLER_OFFSET + \
44 ((u32)&__tegra_cpu_reset_handler_data[TEGRA_RESET_MASK_LP1] - \
45 (u32)__tegra_cpu_reset_handler_start)))
42#define tegra_cpu_lp2_mask \ 46#define tegra_cpu_lp2_mask \
43 (IO_ADDRESS(TEGRA_IRAM_BASE + TEGRA_IRAM_RESET_HANDLER_OFFSET + \ 47 (IO_ADDRESS(TEGRA_IRAM_BASE + TEGRA_IRAM_RESET_HANDLER_OFFSET + \
44 ((u32)&__tegra_cpu_reset_handler_data[TEGRA_RESET_MASK_LP2] - \ 48 ((u32)&__tegra_cpu_reset_handler_data[TEGRA_RESET_MASK_LP2] - \
diff --git a/arch/arm/mach-tegra/sleep-tegra20.S b/arch/arm/mach-tegra/sleep-tegra20.S
index e3f2417c420e..5c3bd11c9838 100644
--- a/arch/arm/mach-tegra/sleep-tegra20.S
+++ b/arch/arm/mach-tegra/sleep-tegra20.S
@@ -23,10 +23,49 @@
23#include <asm/assembler.h> 23#include <asm/assembler.h>
24#include <asm/proc-fns.h> 24#include <asm/proc-fns.h>
25#include <asm/cp15.h> 25#include <asm/cp15.h>
26#include <asm/cache.h>
26 27
27#include "sleep.h" 28#include "sleep.h"
28#include "flowctrl.h" 29#include "flowctrl.h"
29 30
31#define EMC_CFG 0xc
32#define EMC_ADR_CFG 0x10
33#define EMC_REFRESH 0x70
34#define EMC_NOP 0xdc
35#define EMC_SELF_REF 0xe0
36#define EMC_REQ_CTRL 0x2b0
37#define EMC_EMC_STATUS 0x2b4
38
39#define CLK_RESET_CCLK_BURST 0x20
40#define CLK_RESET_CCLK_DIVIDER 0x24
41#define CLK_RESET_SCLK_BURST 0x28
42#define CLK_RESET_SCLK_DIVIDER 0x2c
43#define CLK_RESET_PLLC_BASE 0x80
44#define CLK_RESET_PLLM_BASE 0x90
45#define CLK_RESET_PLLP_BASE 0xa0
46
47#define APB_MISC_XM2CFGCPADCTRL 0x8c8
48#define APB_MISC_XM2CFGDPADCTRL 0x8cc
49#define APB_MISC_XM2CLKCFGPADCTRL 0x8d0
50#define APB_MISC_XM2COMPPADCTRL 0x8d4
51#define APB_MISC_XM2VTTGENPADCTRL 0x8d8
52#define APB_MISC_XM2CFGCPADCTRL2 0x8e4
53#define APB_MISC_XM2CFGDPADCTRL2 0x8e8
54
55.macro pll_enable, rd, r_car_base, pll_base
56 ldr \rd, [\r_car_base, #\pll_base]
57 tst \rd, #(1 << 30)
58 orreq \rd, \rd, #(1 << 30)
59 streq \rd, [\r_car_base, #\pll_base]
60.endm
61
62.macro emc_device_mask, rd, base
63 ldr \rd, [\base, #EMC_ADR_CFG]
64 tst \rd, #(0x3 << 24)
65 moveq \rd, #(0x1 << 8) @ just 1 device
66 movne \rd, #(0x3 << 8) @ 2 devices
67.endm
68
30#if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_PM_SLEEP) 69#if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_PM_SLEEP)
31/* 70/*
32 * tegra20_hotplug_shutdown(void) 71 * tegra20_hotplug_shutdown(void)
@@ -181,6 +220,28 @@ ENTRY(tegra20_cpu_is_resettable_soon)
181ENDPROC(tegra20_cpu_is_resettable_soon) 220ENDPROC(tegra20_cpu_is_resettable_soon)
182 221
183/* 222/*
223 * tegra20_sleep_core_finish(unsigned long v2p)
224 *
225 * Enters suspend in LP0 or LP1 by turning off the mmu and jumping to
226 * tegra20_tear_down_core in IRAM
227 */
228ENTRY(tegra20_sleep_core_finish)
229 /* Flush, disable the L1 data cache and exit SMP */
230 bl tegra_disable_clean_inv_dcache
231
232 mov32 r3, tegra_shut_off_mmu
233 add r3, r3, r0
234
235 mov32 r0, tegra20_tear_down_core
236 mov32 r1, tegra20_iram_start
237 sub r0, r0, r1
238 mov32 r1, TEGRA_IRAM_CODE_AREA
239 add r0, r0, r1
240
241 mov pc, r3
242ENDPROC(tegra20_sleep_core_finish)
243
244/*
184 * tegra20_sleep_cpu_secondary_finish(unsigned long v2p) 245 * tegra20_sleep_cpu_secondary_finish(unsigned long v2p)
185 * 246 *
186 * Enters WFI on secondary CPU by exiting coherency. 247 * Enters WFI on secondary CPU by exiting coherency.
@@ -191,6 +252,7 @@ ENTRY(tegra20_sleep_cpu_secondary_finish)
191 mrc p15, 0, r11, c1, c0, 1 @ save actlr before exiting coherency 252 mrc p15, 0, r11, c1, c0, 1 @ save actlr before exiting coherency
192 253
193 /* Flush and disable the L1 data cache */ 254 /* Flush and disable the L1 data cache */
255 mov r0, #TEGRA_FLUSH_CACHE_LOUIS
194 bl tegra_disable_clean_inv_dcache 256 bl tegra_disable_clean_inv_dcache
195 257
196 mov32 r0, TEGRA_PMC_VIRT + PMC_SCRATCH41 258 mov32 r0, TEGRA_PMC_VIRT + PMC_SCRATCH41
@@ -250,6 +312,150 @@ ENTRY(tegra20_tear_down_cpu)
250 b tegra20_enter_sleep 312 b tegra20_enter_sleep
251ENDPROC(tegra20_tear_down_cpu) 313ENDPROC(tegra20_tear_down_cpu)
252 314
315/* START OF ROUTINES COPIED TO IRAM */
316 .align L1_CACHE_SHIFT
317 .globl tegra20_iram_start
318tegra20_iram_start:
319
320/*
321 * tegra20_lp1_reset
322 *
323 * reset vector for LP1 restore; copied into IRAM during suspend.
324 * Brings the system back up to a safe staring point (SDRAM out of
325 * self-refresh, PLLC, PLLM and PLLP reenabled, CPU running on PLLP,
326 * system clock running on the same PLL that it suspended at), and
327 * jumps to tegra_resume to restore virtual addressing and PLLX.
328 * The physical address of tegra_resume expected to be stored in
329 * PMC_SCRATCH41.
330 *
331 * NOTE: THIS *MUST* BE RELOCATED TO TEGRA_IRAM_CODE_AREA.
332 */
333ENTRY(tegra20_lp1_reset)
334 /*
335 * The CPU and system bus are running at 32KHz and executing from
336 * IRAM when this code is executed; immediately switch to CLKM and
337 * enable PLLM, PLLP, PLLC.
338 */
339 mov32 r0, TEGRA_CLK_RESET_BASE
340
341 mov r1, #(1 << 28)
342 str r1, [r0, #CLK_RESET_SCLK_BURST]
343 str r1, [r0, #CLK_RESET_CCLK_BURST]
344 mov r1, #0
345 str r1, [r0, #CLK_RESET_CCLK_DIVIDER]
346 str r1, [r0, #CLK_RESET_SCLK_DIVIDER]
347
348 pll_enable r1, r0, CLK_RESET_PLLM_BASE
349 pll_enable r1, r0, CLK_RESET_PLLP_BASE
350 pll_enable r1, r0, CLK_RESET_PLLC_BASE
351
352 adr r2, tegra20_sdram_pad_address
353 adr r4, tegra20_sdram_pad_save
354 mov r5, #0
355
356 ldr r6, tegra20_sdram_pad_size
357padload:
358 ldr r7, [r2, r5] @ r7 is the addr in the pad_address
359
360 ldr r1, [r4, r5]
361 str r1, [r7] @ restore the value in pad_save
362
363 add r5, r5, #4
364 cmp r6, r5
365 bne padload
366
367padload_done:
368 /* 255uS delay for PLL stabilization */
369 mov32 r7, TEGRA_TMRUS_BASE
370 ldr r1, [r7]
371 add r1, r1, #0xff
372 wait_until r1, r7, r9
373
374 adr r4, tegra20_sclk_save
375 ldr r4, [r4]
376 str r4, [r0, #CLK_RESET_SCLK_BURST]
377 mov32 r4, ((1 << 28) | (4)) @ burst policy is PLLP
378 str r4, [r0, #CLK_RESET_CCLK_BURST]
379
380 mov32 r0, TEGRA_EMC_BASE
381 ldr r1, [r0, #EMC_CFG]
382 bic r1, r1, #(1 << 31) @ disable DRAM_CLK_STOP
383 str r1, [r0, #EMC_CFG]
384
385 mov r1, #0
386 str r1, [r0, #EMC_SELF_REF] @ take DRAM out of self refresh
387 mov r1, #1
388 str r1, [r0, #EMC_NOP]
389 str r1, [r0, #EMC_NOP]
390 str r1, [r0, #EMC_REFRESH]
391
392 emc_device_mask r1, r0
393
394exit_selfrefresh_loop:
395 ldr r2, [r0, #EMC_EMC_STATUS]
396 ands r2, r2, r1
397 bne exit_selfrefresh_loop
398
399 mov r1, #0 @ unstall all transactions
400 str r1, [r0, #EMC_REQ_CTRL]
401
402 mov32 r0, TEGRA_PMC_BASE
403 ldr r0, [r0, #PMC_SCRATCH41]
404 mov pc, r0 @ jump to tegra_resume
405ENDPROC(tegra20_lp1_reset)
406
407/*
408 * tegra20_tear_down_core
409 *
410 * copied into and executed from IRAM
411 * puts memory in self-refresh for LP0 and LP1
412 */
413tegra20_tear_down_core:
414 bl tegra20_sdram_self_refresh
415 bl tegra20_switch_cpu_to_clk32k
416 b tegra20_enter_sleep
417
418/*
419 * tegra20_switch_cpu_to_clk32k
420 *
421 * In LP0 and LP1 all PLLs will be turned off. Switch the CPU and system clock
422 * to the 32KHz clock.
423 */
424tegra20_switch_cpu_to_clk32k:
425 /*
426 * start by switching to CLKM to safely disable PLLs, then switch to
427 * CLKS.
428 */
429 mov r0, #(1 << 28)
430 str r0, [r5, #CLK_RESET_SCLK_BURST]
431 str r0, [r5, #CLK_RESET_CCLK_BURST]
432 mov r0, #0
433 str r0, [r5, #CLK_RESET_CCLK_DIVIDER]
434 str r0, [r5, #CLK_RESET_SCLK_DIVIDER]
435
436 /* 2uS delay delay between changing SCLK and disabling PLLs */
437 mov32 r7, TEGRA_TMRUS_BASE
438 ldr r1, [r7]
439 add r1, r1, #2
440 wait_until r1, r7, r9
441
442 /* disable PLLM, PLLP and PLLC */
443 ldr r0, [r5, #CLK_RESET_PLLM_BASE]
444 bic r0, r0, #(1 << 30)
445 str r0, [r5, #CLK_RESET_PLLM_BASE]
446 ldr r0, [r5, #CLK_RESET_PLLP_BASE]
447 bic r0, r0, #(1 << 30)
448 str r0, [r5, #CLK_RESET_PLLP_BASE]
449 ldr r0, [r5, #CLK_RESET_PLLC_BASE]
450 bic r0, r0, #(1 << 30)
451 str r0, [r5, #CLK_RESET_PLLC_BASE]
452
453 /* switch to CLKS */
454 mov r0, #0 /* brust policy = 32KHz */
455 str r0, [r5, #CLK_RESET_SCLK_BURST]
456
457 mov pc, lr
458
253/* 459/*
254 * tegra20_enter_sleep 460 * tegra20_enter_sleep
255 * 461 *
@@ -274,4 +480,95 @@ halted:
274 isb 480 isb
275 b halted 481 b halted
276 482
483/*
484 * tegra20_sdram_self_refresh
485 *
486 * called with MMU off and caches disabled
487 * puts sdram in self refresh
488 * must be executed from IRAM
489 */
490tegra20_sdram_self_refresh:
491 mov32 r1, TEGRA_EMC_BASE @ r1 reserved for emc base addr
492
493 mov r2, #3
494 str r2, [r1, #EMC_REQ_CTRL] @ stall incoming DRAM requests
495
496emcidle:
497 ldr r2, [r1, #EMC_EMC_STATUS]
498 tst r2, #4
499 beq emcidle
500
501 mov r2, #1
502 str r2, [r1, #EMC_SELF_REF]
503
504 emc_device_mask r2, r1
505
506emcself:
507 ldr r3, [r1, #EMC_EMC_STATUS]
508 and r3, r3, r2
509 cmp r3, r2
510 bne emcself @ loop until DDR in self-refresh
511
512 adr r2, tegra20_sdram_pad_address
513 adr r3, tegra20_sdram_pad_safe
514 adr r4, tegra20_sdram_pad_save
515 mov r5, #0
516
517 ldr r6, tegra20_sdram_pad_size
518padsave:
519 ldr r0, [r2, r5] @ r0 is the addr in the pad_address
520
521 ldr r1, [r0]
522 str r1, [r4, r5] @ save the content of the addr
523
524 ldr r1, [r3, r5]
525 str r1, [r0] @ set the save val to the addr
526
527 add r5, r5, #4
528 cmp r6, r5
529 bne padsave
530padsave_done:
531
532 mov32 r5, TEGRA_CLK_RESET_BASE
533 ldr r0, [r5, #CLK_RESET_SCLK_BURST]
534 adr r2, tegra20_sclk_save
535 str r0, [r2]
536 dsb
537 mov pc, lr
538
539tegra20_sdram_pad_address:
540 .word TEGRA_APB_MISC_BASE + APB_MISC_XM2CFGCPADCTRL
541 .word TEGRA_APB_MISC_BASE + APB_MISC_XM2CFGDPADCTRL
542 .word TEGRA_APB_MISC_BASE + APB_MISC_XM2CLKCFGPADCTRL
543 .word TEGRA_APB_MISC_BASE + APB_MISC_XM2COMPPADCTRL
544 .word TEGRA_APB_MISC_BASE + APB_MISC_XM2VTTGENPADCTRL
545 .word TEGRA_APB_MISC_BASE + APB_MISC_XM2CFGCPADCTRL2
546 .word TEGRA_APB_MISC_BASE + APB_MISC_XM2CFGDPADCTRL2
547
548tegra20_sdram_pad_size:
549 .word tegra20_sdram_pad_size - tegra20_sdram_pad_address
550
551tegra20_sdram_pad_safe:
552 .word 0x8
553 .word 0x8
554 .word 0x0
555 .word 0x8
556 .word 0x5500
557 .word 0x08080040
558 .word 0x0
559
560tegra20_sclk_save:
561 .word 0x0
562
563tegra20_sdram_pad_save:
564 .rept (tegra20_sdram_pad_size - tegra20_sdram_pad_address) / 4
565 .long 0
566 .endr
567
568 .ltorg
569/* dummy symbol for end of IRAM */
570 .align L1_CACHE_SHIFT
571 .globl tegra20_iram_end
572tegra20_iram_end:
573 b .
277#endif 574#endif
diff --git a/arch/arm/mach-tegra/sleep-tegra30.S b/arch/arm/mach-tegra/sleep-tegra30.S
index ada8821b48be..63fa91b5fafb 100644
--- a/arch/arm/mach-tegra/sleep-tegra30.S
+++ b/arch/arm/mach-tegra/sleep-tegra30.S
@@ -18,13 +18,118 @@
18 18
19#include <asm/assembler.h> 19#include <asm/assembler.h>
20#include <asm/asm-offsets.h> 20#include <asm/asm-offsets.h>
21#include <asm/cache.h>
21 22
22#include "fuse.h" 23#include "fuse.h"
23#include "sleep.h" 24#include "sleep.h"
24#include "flowctrl.h" 25#include "flowctrl.h"
25 26
27#define EMC_CFG 0xc
28#define EMC_ADR_CFG 0x10
29#define EMC_TIMING_CONTROL 0x28
30#define EMC_REFRESH 0x70
31#define EMC_NOP 0xdc
32#define EMC_SELF_REF 0xe0
33#define EMC_MRW 0xe8
34#define EMC_FBIO_CFG5 0x104
35#define EMC_AUTO_CAL_CONFIG 0x2a4
36#define EMC_AUTO_CAL_INTERVAL 0x2a8
37#define EMC_AUTO_CAL_STATUS 0x2ac
38#define EMC_REQ_CTRL 0x2b0
39#define EMC_CFG_DIG_DLL 0x2bc
40#define EMC_EMC_STATUS 0x2b4
41#define EMC_ZCAL_INTERVAL 0x2e0
42#define EMC_ZQ_CAL 0x2ec
43#define EMC_XM2VTTGENPADCTRL 0x310
44#define EMC_XM2VTTGENPADCTRL2 0x314
45
46#define PMC_CTRL 0x0
47#define PMC_CTRL_SIDE_EFFECT_LP0 (1 << 14) /* enter LP0 when CPU pwr gated */
48
49#define PMC_PLLP_WB0_OVERRIDE 0xf8
50#define PMC_IO_DPD_REQ 0x1b8
51#define PMC_IO_DPD_STATUS 0x1bc
52
53#define CLK_RESET_CCLK_BURST 0x20
54#define CLK_RESET_CCLK_DIVIDER 0x24
55#define CLK_RESET_SCLK_BURST 0x28
56#define CLK_RESET_SCLK_DIVIDER 0x2c
57
58#define CLK_RESET_PLLC_BASE 0x80
59#define CLK_RESET_PLLC_MISC 0x8c
60#define CLK_RESET_PLLM_BASE 0x90
61#define CLK_RESET_PLLM_MISC 0x9c
62#define CLK_RESET_PLLP_BASE 0xa0
63#define CLK_RESET_PLLP_MISC 0xac
64#define CLK_RESET_PLLA_BASE 0xb0
65#define CLK_RESET_PLLA_MISC 0xbc
66#define CLK_RESET_PLLX_BASE 0xe0
67#define CLK_RESET_PLLX_MISC 0xe4
68#define CLK_RESET_PLLX_MISC3 0x518
69#define CLK_RESET_PLLX_MISC3_IDDQ 3
70#define CLK_RESET_PLLM_MISC_IDDQ 5
71#define CLK_RESET_PLLC_MISC_IDDQ 26
72
73#define CLK_RESET_CLK_SOURCE_MSELECT 0x3b4
74
75#define MSELECT_CLKM (0x3 << 30)
76
77#define LOCK_DELAY 50 /* safety delay after lock is detected */
78
26#define TEGRA30_POWER_HOTPLUG_SHUTDOWN (1 << 27) /* Hotplug shutdown */ 79#define TEGRA30_POWER_HOTPLUG_SHUTDOWN (1 << 27) /* Hotplug shutdown */
27 80
81.macro emc_device_mask, rd, base
82 ldr \rd, [\base, #EMC_ADR_CFG]
83 tst \rd, #0x1
84 moveq \rd, #(0x1 << 8) @ just 1 device
85 movne \rd, #(0x3 << 8) @ 2 devices
86.endm
87
88.macro emc_timing_update, rd, base
89 mov \rd, #1
90 str \rd, [\base, #EMC_TIMING_CONTROL]
911001:
92 ldr \rd, [\base, #EMC_EMC_STATUS]
93 tst \rd, #(0x1<<23) @ wait EMC_STATUS_TIMING_UPDATE_STALLED is clear
94 bne 1001b
95.endm
96
97.macro pll_enable, rd, r_car_base, pll_base, pll_misc
98 ldr \rd, [\r_car_base, #\pll_base]
99 tst \rd, #(1 << 30)
100 orreq \rd, \rd, #(1 << 30)
101 streq \rd, [\r_car_base, #\pll_base]
102 /* Enable lock detector */
103 .if \pll_misc
104 ldr \rd, [\r_car_base, #\pll_misc]
105 bic \rd, \rd, #(1 << 18)
106 str \rd, [\r_car_base, #\pll_misc]
107 ldr \rd, [\r_car_base, #\pll_misc]
108 ldr \rd, [\r_car_base, #\pll_misc]
109 orr \rd, \rd, #(1 << 18)
110 str \rd, [\r_car_base, #\pll_misc]
111 .endif
112.endm
113
114.macro pll_locked, rd, r_car_base, pll_base
1151:
116 ldr \rd, [\r_car_base, #\pll_base]
117 tst \rd, #(1 << 27)
118 beq 1b
119.endm
120
121.macro pll_iddq_exit, rd, car, iddq, iddq_bit
122 ldr \rd, [\car, #\iddq]
123 bic \rd, \rd, #(1<<\iddq_bit)
124 str \rd, [\car, #\iddq]
125.endm
126
127.macro pll_iddq_entry, rd, car, iddq, iddq_bit
128 ldr \rd, [\car, #\iddq]
129 orr \rd, \rd, #(1<<\iddq_bit)
130 str \rd, [\car, #\iddq]
131.endm
132
28#if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_PM_SLEEP) 133#if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_PM_SLEEP)
29/* 134/*
30 * tegra30_hotplug_shutdown(void) 135 * tegra30_hotplug_shutdown(void)
@@ -99,6 +204,8 @@ flow_ctrl_setting_for_lp2:
99 cmp r10, #TEGRA30 204 cmp r10, #TEGRA30
100 moveq r3, #FLOW_CTRL_WAIT_FOR_INTERRUPT @ For LP2 205 moveq r3, #FLOW_CTRL_WAIT_FOR_INTERRUPT @ For LP2
101 movne r3, #FLOW_CTRL_WAITEVENT 206 movne r3, #FLOW_CTRL_WAITEVENT
207 orrne r3, r3, #FLOW_CTRL_HALT_GIC_IRQ
208 orrne r3, r3, #FLOW_CTRL_HALT_GIC_FIQ
102flow_ctrl_done: 209flow_ctrl_done:
103 cmp r10, #TEGRA30 210 cmp r10, #TEGRA30
104 str r3, [r2] 211 str r3, [r2]
@@ -127,6 +234,41 @@ ENDPROC(tegra30_cpu_shutdown)
127 234
128#ifdef CONFIG_PM_SLEEP 235#ifdef CONFIG_PM_SLEEP
129/* 236/*
237 * tegra30_sleep_core_finish(unsigned long v2p)
238 *
239 * Enters suspend in LP0 or LP1 by turning off the MMU and jumping to
240 * tegra30_tear_down_core in IRAM
241 */
242ENTRY(tegra30_sleep_core_finish)
243 /* Flush, disable the L1 data cache and exit SMP */
244 bl tegra_disable_clean_inv_dcache
245
246 /*
247 * Preload all the address literals that are needed for the
248 * CPU power-gating process, to avoid loading from SDRAM which
249 * are not supported once SDRAM is put into self-refresh.
250 * LP0 / LP1 use physical address, since the MMU needs to be
251 * disabled before putting SDRAM into self-refresh to avoid
252 * memory access due to page table walks.
253 */
254 mov32 r4, TEGRA_PMC_BASE
255 mov32 r5, TEGRA_CLK_RESET_BASE
256 mov32 r6, TEGRA_FLOW_CTRL_BASE
257 mov32 r7, TEGRA_TMRUS_BASE
258
259 mov32 r3, tegra_shut_off_mmu
260 add r3, r3, r0
261
262 mov32 r0, tegra30_tear_down_core
263 mov32 r1, tegra30_iram_start
264 sub r0, r0, r1
265 mov32 r1, TEGRA_IRAM_CODE_AREA
266 add r0, r0, r1
267
268 mov pc, r3
269ENDPROC(tegra30_sleep_core_finish)
270
271/*
130 * tegra30_sleep_cpu_secondary_finish(unsigned long v2p) 272 * tegra30_sleep_cpu_secondary_finish(unsigned long v2p)
131 * 273 *
132 * Enters LP2 on secondary CPU by exiting coherency and powergating the CPU. 274 * Enters LP2 on secondary CPU by exiting coherency and powergating the CPU.
@@ -135,6 +277,7 @@ ENTRY(tegra30_sleep_cpu_secondary_finish)
135 mov r7, lr 277 mov r7, lr
136 278
137 /* Flush and disable the L1 data cache */ 279 /* Flush and disable the L1 data cache */
280 mov r0, #TEGRA_FLUSH_CACHE_LOUIS
138 bl tegra_disable_clean_inv_dcache 281 bl tegra_disable_clean_inv_dcache
139 282
140 /* Powergate this CPU. */ 283 /* Powergate this CPU. */
@@ -155,6 +298,351 @@ ENTRY(tegra30_tear_down_cpu)
155 b tegra30_enter_sleep 298 b tegra30_enter_sleep
156ENDPROC(tegra30_tear_down_cpu) 299ENDPROC(tegra30_tear_down_cpu)
157 300
301/* START OF ROUTINES COPIED TO IRAM */
302 .align L1_CACHE_SHIFT
303 .globl tegra30_iram_start
304tegra30_iram_start:
305
306/*
307 * tegra30_lp1_reset
308 *
309 * reset vector for LP1 restore; copied into IRAM during suspend.
310 * Brings the system back up to a safe staring point (SDRAM out of
311 * self-refresh, PLLC, PLLM and PLLP reenabled, CPU running on PLLX,
312 * system clock running on the same PLL that it suspended at), and
313 * jumps to tegra_resume to restore virtual addressing.
314 * The physical address of tegra_resume expected to be stored in
315 * PMC_SCRATCH41.
316 *
317 * NOTE: THIS *MUST* BE RELOCATED TO TEGRA_IRAM_CODE_AREA.
318 */
319ENTRY(tegra30_lp1_reset)
320 /*
321 * The CPU and system bus are running at 32KHz and executing from
322 * IRAM when this code is executed; immediately switch to CLKM and
323 * enable PLLP, PLLM, PLLC, PLLA and PLLX.
324 */
325 mov32 r0, TEGRA_CLK_RESET_BASE
326
327 mov r1, #(1 << 28)
328 str r1, [r0, #CLK_RESET_SCLK_BURST]
329 str r1, [r0, #CLK_RESET_CCLK_BURST]
330 mov r1, #0
331 str r1, [r0, #CLK_RESET_CCLK_DIVIDER]
332 str r1, [r0, #CLK_RESET_SCLK_DIVIDER]
333
334 tegra_get_soc_id TEGRA_APB_MISC_BASE, r10
335 cmp r10, #TEGRA30
336 beq _no_pll_iddq_exit
337
338 pll_iddq_exit r1, r0, CLK_RESET_PLLM_MISC, CLK_RESET_PLLM_MISC_IDDQ
339 pll_iddq_exit r1, r0, CLK_RESET_PLLC_MISC, CLK_RESET_PLLC_MISC_IDDQ
340 pll_iddq_exit r1, r0, CLK_RESET_PLLX_MISC3, CLK_RESET_PLLX_MISC3_IDDQ
341
342 mov32 r7, TEGRA_TMRUS_BASE
343 ldr r1, [r7]
344 add r1, r1, #2
345 wait_until r1, r7, r3
346
347 /* enable PLLM via PMC */
348 mov32 r2, TEGRA_PMC_BASE
349 ldr r1, [r2, #PMC_PLLP_WB0_OVERRIDE]
350 orr r1, r1, #(1 << 12)
351 str r1, [r2, #PMC_PLLP_WB0_OVERRIDE]
352
353 pll_enable r1, r0, CLK_RESET_PLLM_BASE, 0
354 pll_enable r1, r0, CLK_RESET_PLLC_BASE, 0
355 pll_enable r1, r0, CLK_RESET_PLLX_BASE, 0
356
357 b _pll_m_c_x_done
358
359_no_pll_iddq_exit:
360 /* enable PLLM via PMC */
361 mov32 r2, TEGRA_PMC_BASE
362 ldr r1, [r2, #PMC_PLLP_WB0_OVERRIDE]
363 orr r1, r1, #(1 << 12)
364 str r1, [r2, #PMC_PLLP_WB0_OVERRIDE]
365
366 pll_enable r1, r0, CLK_RESET_PLLM_BASE, CLK_RESET_PLLM_MISC
367 pll_enable r1, r0, CLK_RESET_PLLC_BASE, CLK_RESET_PLLC_MISC
368 pll_enable r1, r0, CLK_RESET_PLLX_BASE, CLK_RESET_PLLX_MISC
369
370_pll_m_c_x_done:
371 pll_enable r1, r0, CLK_RESET_PLLP_BASE, CLK_RESET_PLLP_MISC
372 pll_enable r1, r0, CLK_RESET_PLLA_BASE, CLK_RESET_PLLA_MISC
373
374 pll_locked r1, r0, CLK_RESET_PLLM_BASE
375 pll_locked r1, r0, CLK_RESET_PLLP_BASE
376 pll_locked r1, r0, CLK_RESET_PLLA_BASE
377 pll_locked r1, r0, CLK_RESET_PLLC_BASE
378 pll_locked r1, r0, CLK_RESET_PLLX_BASE
379
380 mov32 r7, TEGRA_TMRUS_BASE
381 ldr r1, [r7]
382 add r1, r1, #LOCK_DELAY
383 wait_until r1, r7, r3
384
385 adr r5, tegra30_sdram_pad_save
386
387 ldr r4, [r5, #0x18] @ restore CLK_SOURCE_MSELECT
388 str r4, [r0, #CLK_RESET_CLK_SOURCE_MSELECT]
389
390 ldr r4, [r5, #0x1C] @ restore SCLK_BURST
391 str r4, [r0, #CLK_RESET_SCLK_BURST]
392
393 cmp r10, #TEGRA30
394 movweq r4, #:lower16:((1 << 28) | (0x8)) @ burst policy is PLLX
395 movteq r4, #:upper16:((1 << 28) | (0x8))
396 movwne r4, #:lower16:((1 << 28) | (0xe))
397 movtne r4, #:upper16:((1 << 28) | (0xe))
398 str r4, [r0, #CLK_RESET_CCLK_BURST]
399
400 /* Restore pad power state to normal */
401 ldr r1, [r5, #0x14] @ PMC_IO_DPD_STATUS
402 mvn r1, r1
403 bic r1, r1, #(1 << 31)
404 orr r1, r1, #(1 << 30)
405 str r1, [r2, #PMC_IO_DPD_REQ] @ DPD_OFF
406
407 cmp r10, #TEGRA30
408 movweq r0, #:lower16:TEGRA_EMC_BASE @ r0 reserved for emc base
409 movteq r0, #:upper16:TEGRA_EMC_BASE
410 movwne r0, #:lower16:TEGRA_EMC0_BASE
411 movtne r0, #:upper16:TEGRA_EMC0_BASE
412
413exit_self_refresh:
414 ldr r1, [r5, #0xC] @ restore EMC_XM2VTTGENPADCTRL
415 str r1, [r0, #EMC_XM2VTTGENPADCTRL]
416 ldr r1, [r5, #0x10] @ restore EMC_XM2VTTGENPADCTRL2
417 str r1, [r0, #EMC_XM2VTTGENPADCTRL2]
418 ldr r1, [r5, #0x8] @ restore EMC_AUTO_CAL_INTERVAL
419 str r1, [r0, #EMC_AUTO_CAL_INTERVAL]
420
421 /* Relock DLL */
422 ldr r1, [r0, #EMC_CFG_DIG_DLL]
423 orr r1, r1, #(1 << 30) @ set DLL_RESET
424 str r1, [r0, #EMC_CFG_DIG_DLL]
425
426 emc_timing_update r1, r0
427
428 cmp r10, #TEGRA114
429 movweq r1, #:lower16:TEGRA_EMC1_BASE
430 movteq r1, #:upper16:TEGRA_EMC1_BASE
431 cmpeq r0, r1
432
433 ldr r1, [r0, #EMC_AUTO_CAL_CONFIG]
434 orr r1, r1, #(1 << 31) @ set AUTO_CAL_ACTIVE
435 orreq r1, r1, #(1 << 27) @ set slave mode for channel 1
436 str r1, [r0, #EMC_AUTO_CAL_CONFIG]
437
438emc_wait_auto_cal_onetime:
439 ldr r1, [r0, #EMC_AUTO_CAL_STATUS]
440 tst r1, #(1 << 31) @ wait until AUTO_CAL_ACTIVE is cleared
441 bne emc_wait_auto_cal_onetime
442
443 ldr r1, [r0, #EMC_CFG]
444 bic r1, r1, #(1 << 31) @ disable DRAM_CLK_STOP_PD
445 str r1, [r0, #EMC_CFG]
446
447 mov r1, #0
448 str r1, [r0, #EMC_SELF_REF] @ take DRAM out of self refresh
449 mov r1, #1
450 cmp r10, #TEGRA30
451 streq r1, [r0, #EMC_NOP]
452 streq r1, [r0, #EMC_NOP]
453 streq r1, [r0, #EMC_REFRESH]
454
455 emc_device_mask r1, r0
456
457exit_selfrefresh_loop:
458 ldr r2, [r0, #EMC_EMC_STATUS]
459 ands r2, r2, r1
460 bne exit_selfrefresh_loop
461
462 lsr r1, r1, #8 @ devSel, bit0:dev0, bit1:dev1
463
464 mov32 r7, TEGRA_TMRUS_BASE
465 ldr r2, [r0, #EMC_FBIO_CFG5]
466
467 and r2, r2, #3 @ check DRAM_TYPE
468 cmp r2, #2
469 beq emc_lpddr2
470
471 /* Issue a ZQ_CAL for dev0 - DDR3 */
472 mov32 r2, 0x80000011 @ DEV_SELECTION=2, LENGTH=LONG, CMD=1
473 str r2, [r0, #EMC_ZQ_CAL]
474 ldr r2, [r7]
475 add r2, r2, #10
476 wait_until r2, r7, r3
477
478 tst r1, #2
479 beq zcal_done
480
481 /* Issue a ZQ_CAL for dev1 - DDR3 */
482 mov32 r2, 0x40000011 @ DEV_SELECTION=1, LENGTH=LONG, CMD=1
483 str r2, [r0, #EMC_ZQ_CAL]
484 ldr r2, [r7]
485 add r2, r2, #10
486 wait_until r2, r7, r3
487 b zcal_done
488
489emc_lpddr2:
490 /* Issue a ZQ_CAL for dev0 - LPDDR2 */
491 mov32 r2, 0x800A00AB @ DEV_SELECTION=2, MA=10, OP=0xAB
492 str r2, [r0, #EMC_MRW]
493 ldr r2, [r7]
494 add r2, r2, #1
495 wait_until r2, r7, r3
496
497 tst r1, #2
498 beq zcal_done
499
500 /* Issue a ZQ_CAL for dev0 - LPDDR2 */
501 mov32 r2, 0x400A00AB @ DEV_SELECTION=1, MA=10, OP=0xAB
502 str r2, [r0, #EMC_MRW]
503 ldr r2, [r7]
504 add r2, r2, #1
505 wait_until r2, r7, r3
506
507zcal_done:
508 mov r1, #0 @ unstall all transactions
509 str r1, [r0, #EMC_REQ_CTRL]
510 ldr r1, [r5, #0x4] @ restore EMC_ZCAL_INTERVAL
511 str r1, [r0, #EMC_ZCAL_INTERVAL]
512 ldr r1, [r5, #0x0] @ restore EMC_CFG
513 str r1, [r0, #EMC_CFG]
514
515 /* Tegra114 had dual EMC channel, now config the other one */
516 cmp r10, #TEGRA114
517 bne __no_dual_emc_chanl
518 mov32 r1, TEGRA_EMC1_BASE
519 cmp r0, r1
520 movne r0, r1
521 addne r5, r5, #0x20
522 bne exit_self_refresh
523__no_dual_emc_chanl:
524
525 mov32 r0, TEGRA_PMC_BASE
526 ldr r0, [r0, #PMC_SCRATCH41]
527 mov pc, r0 @ jump to tegra_resume
528ENDPROC(tegra30_lp1_reset)
529
530 .align L1_CACHE_SHIFT
531tegra30_sdram_pad_address:
532 .word TEGRA_EMC_BASE + EMC_CFG @0x0
533 .word TEGRA_EMC_BASE + EMC_ZCAL_INTERVAL @0x4
534 .word TEGRA_EMC_BASE + EMC_AUTO_CAL_INTERVAL @0x8
535 .word TEGRA_EMC_BASE + EMC_XM2VTTGENPADCTRL @0xc
536 .word TEGRA_EMC_BASE + EMC_XM2VTTGENPADCTRL2 @0x10
537 .word TEGRA_PMC_BASE + PMC_IO_DPD_STATUS @0x14
538 .word TEGRA_CLK_RESET_BASE + CLK_RESET_CLK_SOURCE_MSELECT @0x18
539 .word TEGRA_CLK_RESET_BASE + CLK_RESET_SCLK_BURST @0x1c
540
541tegra114_sdram_pad_address:
542 .word TEGRA_EMC0_BASE + EMC_CFG @0x0
543 .word TEGRA_EMC0_BASE + EMC_ZCAL_INTERVAL @0x4
544 .word TEGRA_EMC0_BASE + EMC_AUTO_CAL_INTERVAL @0x8
545 .word TEGRA_EMC0_BASE + EMC_XM2VTTGENPADCTRL @0xc
546 .word TEGRA_EMC0_BASE + EMC_XM2VTTGENPADCTRL2 @0x10
547 .word TEGRA_PMC_BASE + PMC_IO_DPD_STATUS @0x14
548 .word TEGRA_CLK_RESET_BASE + CLK_RESET_CLK_SOURCE_MSELECT @0x18
549 .word TEGRA_CLK_RESET_BASE + CLK_RESET_SCLK_BURST @0x1c
550 .word TEGRA_EMC1_BASE + EMC_CFG @0x20
551 .word TEGRA_EMC1_BASE + EMC_ZCAL_INTERVAL @0x24
552 .word TEGRA_EMC1_BASE + EMC_AUTO_CAL_INTERVAL @0x28
553 .word TEGRA_EMC1_BASE + EMC_XM2VTTGENPADCTRL @0x2c
554 .word TEGRA_EMC1_BASE + EMC_XM2VTTGENPADCTRL2 @0x30
555
556tegra30_sdram_pad_size:
557 .word tegra114_sdram_pad_address - tegra30_sdram_pad_address
558
559tegra114_sdram_pad_size:
560 .word tegra30_sdram_pad_size - tegra114_sdram_pad_address
561
562 .type tegra30_sdram_pad_save, %object
563tegra30_sdram_pad_save:
564 .rept (tegra30_sdram_pad_size - tegra114_sdram_pad_address) / 4
565 .long 0
566 .endr
567
568/*
569 * tegra30_tear_down_core
570 *
571 * copied into and executed from IRAM
572 * puts memory in self-refresh for LP0 and LP1
573 */
574tegra30_tear_down_core:
575 bl tegra30_sdram_self_refresh
576 bl tegra30_switch_cpu_to_clk32k
577 b tegra30_enter_sleep
578
579/*
580 * tegra30_switch_cpu_to_clk32k
581 *
582 * In LP0 and LP1 all PLLs will be turned off. Switching the CPU and System CLK
583 * to the 32KHz clock.
584 * r4 = TEGRA_PMC_BASE
585 * r5 = TEGRA_CLK_RESET_BASE
586 * r6 = TEGRA_FLOW_CTRL_BASE
587 * r7 = TEGRA_TMRUS_BASE
588 * r10= SoC ID
589 */
590tegra30_switch_cpu_to_clk32k:
591 /*
592 * start by jumping to CLKM to safely disable PLLs, then jump to
593 * CLKS.
594 */
595 mov r0, #(1 << 28)
596 str r0, [r5, #CLK_RESET_SCLK_BURST]
597 /* 2uS delay delay between changing SCLK and CCLK */
598 ldr r1, [r7]
599 add r1, r1, #2
600 wait_until r1, r7, r9
601 str r0, [r5, #CLK_RESET_CCLK_BURST]
602 mov r0, #0
603 str r0, [r5, #CLK_RESET_CCLK_DIVIDER]
604 str r0, [r5, #CLK_RESET_SCLK_DIVIDER]
605
606 /* switch the clock source of mselect to be CLK_M */
607 ldr r0, [r5, #CLK_RESET_CLK_SOURCE_MSELECT]
608 orr r0, r0, #MSELECT_CLKM
609 str r0, [r5, #CLK_RESET_CLK_SOURCE_MSELECT]
610
611 /* 2uS delay delay between changing SCLK and disabling PLLs */
612 ldr r1, [r7]
613 add r1, r1, #2
614 wait_until r1, r7, r9
615
616 /* disable PLLM via PMC in LP1 */
617 ldr r0, [r4, #PMC_PLLP_WB0_OVERRIDE]
618 bic r0, r0, #(1 << 12)
619 str r0, [r4, #PMC_PLLP_WB0_OVERRIDE]
620
621 /* disable PLLP, PLLA, PLLC and PLLX */
622 ldr r0, [r5, #CLK_RESET_PLLP_BASE]
623 bic r0, r0, #(1 << 30)
624 str r0, [r5, #CLK_RESET_PLLP_BASE]
625 ldr r0, [r5, #CLK_RESET_PLLA_BASE]
626 bic r0, r0, #(1 << 30)
627 str r0, [r5, #CLK_RESET_PLLA_BASE]
628 ldr r0, [r5, #CLK_RESET_PLLC_BASE]
629 bic r0, r0, #(1 << 30)
630 str r0, [r5, #CLK_RESET_PLLC_BASE]
631 ldr r0, [r5, #CLK_RESET_PLLX_BASE]
632 bic r0, r0, #(1 << 30)
633 str r0, [r5, #CLK_RESET_PLLX_BASE]
634
635 cmp r10, #TEGRA30
636 beq _no_pll_in_iddq
637 pll_iddq_entry r1, r5, CLK_RESET_PLLX_MISC3, CLK_RESET_PLLX_MISC3_IDDQ
638_no_pll_in_iddq:
639
640 /* switch to CLKS */
641 mov r0, #0 /* brust policy = 32KHz */
642 str r0, [r5, #CLK_RESET_SCLK_BURST]
643
644 mov pc, lr
645
158/* 646/*
159 * tegra30_enter_sleep 647 * tegra30_enter_sleep
160 * 648 *
@@ -172,8 +660,12 @@ tegra30_enter_sleep:
172 orr r0, r0, #FLOW_CTRL_CSR_ENABLE 660 orr r0, r0, #FLOW_CTRL_CSR_ENABLE
173 str r0, [r6, r2] 661 str r0, [r6, r2]
174 662
663 tegra_get_soc_id TEGRA_APB_MISC_BASE, r10
664 cmp r10, #TEGRA30
175 mov r0, #FLOW_CTRL_WAIT_FOR_INTERRUPT 665 mov r0, #FLOW_CTRL_WAIT_FOR_INTERRUPT
176 orr r0, r0, #FLOW_CTRL_HALT_CPU_IRQ | FLOW_CTRL_HALT_CPU_FIQ 666 orreq r0, r0, #FLOW_CTRL_HALT_CPU_IRQ | FLOW_CTRL_HALT_CPU_FIQ
667 orrne r0, r0, #FLOW_CTRL_HALT_LIC_IRQ | FLOW_CTRL_HALT_LIC_FIQ
668
177 cpu_to_halt_reg r2, r1 669 cpu_to_halt_reg r2, r1
178 str r0, [r6, r2] 670 str r0, [r6, r2]
179 dsb 671 dsb
@@ -187,4 +679,126 @@ halted:
187 /* !!!FIXME!!! Implement halt failure handler */ 679 /* !!!FIXME!!! Implement halt failure handler */
188 b halted 680 b halted
189 681
682/*
683 * tegra30_sdram_self_refresh
684 *
685 * called with MMU off and caches disabled
686 * must be executed from IRAM
687 * r4 = TEGRA_PMC_BASE
688 * r5 = TEGRA_CLK_RESET_BASE
689 * r6 = TEGRA_FLOW_CTRL_BASE
690 * r7 = TEGRA_TMRUS_BASE
691 * r10= SoC ID
692 */
693tegra30_sdram_self_refresh:
694
695 adr r8, tegra30_sdram_pad_save
696 tegra_get_soc_id TEGRA_APB_MISC_BASE, r10
697 cmp r10, #TEGRA30
698 adreq r2, tegra30_sdram_pad_address
699 ldreq r3, tegra30_sdram_pad_size
700 adrne r2, tegra114_sdram_pad_address
701 ldrne r3, tegra114_sdram_pad_size
702 mov r9, #0
703
704padsave:
705 ldr r0, [r2, r9] @ r0 is the addr in the pad_address
706
707 ldr r1, [r0]
708 str r1, [r8, r9] @ save the content of the addr
709
710 add r9, r9, #4
711 cmp r3, r9
712 bne padsave
713padsave_done:
714
715 dsb
716
717 cmp r10, #TEGRA30
718 ldreq r0, =TEGRA_EMC_BASE @ r0 reserved for emc base addr
719 ldrne r0, =TEGRA_EMC0_BASE
720
721enter_self_refresh:
722 cmp r10, #TEGRA30
723 mov r1, #0
724 str r1, [r0, #EMC_ZCAL_INTERVAL]
725 str r1, [r0, #EMC_AUTO_CAL_INTERVAL]
726 ldr r1, [r0, #EMC_CFG]
727 bic r1, r1, #(1 << 28)
728 bicne r1, r1, #(1 << 29)
729 str r1, [r0, #EMC_CFG] @ disable DYN_SELF_REF
730
731 emc_timing_update r1, r0
732
733 ldr r1, [r7]
734 add r1, r1, #5
735 wait_until r1, r7, r2
736
737emc_wait_auto_cal:
738 ldr r1, [r0, #EMC_AUTO_CAL_STATUS]
739 tst r1, #(1 << 31) @ wait until AUTO_CAL_ACTIVE is cleared
740 bne emc_wait_auto_cal
741
742 mov r1, #3
743 str r1, [r0, #EMC_REQ_CTRL] @ stall incoming DRAM requests
744
745emcidle:
746 ldr r1, [r0, #EMC_EMC_STATUS]
747 tst r1, #4
748 beq emcidle
749
750 mov r1, #1
751 str r1, [r0, #EMC_SELF_REF]
752
753 emc_device_mask r1, r0
754
755emcself:
756 ldr r2, [r0, #EMC_EMC_STATUS]
757 and r2, r2, r1
758 cmp r2, r1
759 bne emcself @ loop until DDR in self-refresh
760
761 /* Put VTTGEN in the lowest power mode */
762 ldr r1, [r0, #EMC_XM2VTTGENPADCTRL]
763 mov32 r2, 0xF8F8FFFF @ clear XM2VTTGEN_DRVUP and XM2VTTGEN_DRVDN
764 and r1, r1, r2
765 str r1, [r0, #EMC_XM2VTTGENPADCTRL]
766 ldr r1, [r0, #EMC_XM2VTTGENPADCTRL2]
767 cmp r10, #TEGRA30
768 orreq r1, r1, #7 @ set E_NO_VTTGEN
769 orrne r1, r1, #0x3f
770 str r1, [r0, #EMC_XM2VTTGENPADCTRL2]
771
772 emc_timing_update r1, r0
773
774 /* Tegra114 had dual EMC channel, now config the other one */
775 cmp r10, #TEGRA114
776 bne no_dual_emc_chanl
777 mov32 r1, TEGRA_EMC1_BASE
778 cmp r0, r1
779 movne r0, r1
780 bne enter_self_refresh
781no_dual_emc_chanl:
782
783 ldr r1, [r4, #PMC_CTRL]
784 tst r1, #PMC_CTRL_SIDE_EFFECT_LP0
785 bne pmc_io_dpd_skip
786 /*
787 * Put DDR_DATA, DISC_ADDR_CMD, DDR_ADDR_CMD, POP_ADDR_CMD, POP_CLK
788 * and COMP in the lowest power mode when LP1.
789 */
790 mov32 r1, 0x8EC00000
791 str r1, [r4, #PMC_IO_DPD_REQ]
792pmc_io_dpd_skip:
793
794 dsb
795
796 mov pc, lr
797
798 .ltorg
799/* dummy symbol for end of IRAM */
800 .align L1_CACHE_SHIFT
801 .global tegra30_iram_end
802tegra30_iram_end:
803 b .
190#endif 804#endif
diff --git a/arch/arm/mach-tegra/sleep.S b/arch/arm/mach-tegra/sleep.S
index 9daaef26b0f6..8d06213fbc47 100644
--- a/arch/arm/mach-tegra/sleep.S
+++ b/arch/arm/mach-tegra/sleep.S
@@ -56,7 +56,9 @@ ENTRY(tegra_disable_clean_inv_dcache)
56 isb 56 isb
57 57
58 /* Flush the D-cache */ 58 /* Flush the D-cache */
59 bl v7_flush_dcache_louis 59 cmp r0, #TEGRA_FLUSH_CACHE_ALL
60 blne v7_flush_dcache_louis
61 bleq v7_flush_dcache_all
60 62
61 /* Trun off coherency */ 63 /* Trun off coherency */
62 exit_smp r4, r5 64 exit_smp r4, r5
@@ -67,15 +69,40 @@ ENDPROC(tegra_disable_clean_inv_dcache)
67 69
68#ifdef CONFIG_PM_SLEEP 70#ifdef CONFIG_PM_SLEEP
69/* 71/*
72 * tegra_init_l2_for_a15
73 *
74 * set up the correct L2 cache data RAM latency
75 */
76ENTRY(tegra_init_l2_for_a15)
77 mrc p15, 0, r0, c0, c0, 5
78 ubfx r0, r0, #8, #4
79 tst r0, #1 @ only need for cluster 0
80 bne _exit_init_l2_a15
81
82 mrc p15, 0x1, r0, c9, c0, 2
83 and r0, r0, #7
84 cmp r0, #2
85 bicne r0, r0, #7
86 orrne r0, r0, #2
87 mcrne p15, 0x1, r0, c9, c0, 2
88_exit_init_l2_a15:
89
90 mov pc, lr
91ENDPROC(tegra_init_l2_for_a15)
92
93/*
70 * tegra_sleep_cpu_finish(unsigned long v2p) 94 * tegra_sleep_cpu_finish(unsigned long v2p)
71 * 95 *
72 * enters suspend in LP2 by turning off the mmu and jumping to 96 * enters suspend in LP2 by turning off the mmu and jumping to
73 * tegra?_tear_down_cpu 97 * tegra?_tear_down_cpu
74 */ 98 */
75ENTRY(tegra_sleep_cpu_finish) 99ENTRY(tegra_sleep_cpu_finish)
100 mov r4, r0
76 /* Flush and disable the L1 data cache */ 101 /* Flush and disable the L1 data cache */
102 mov r0, #TEGRA_FLUSH_CACHE_ALL
77 bl tegra_disable_clean_inv_dcache 103 bl tegra_disable_clean_inv_dcache
78 104
105 mov r0, r4
79 mov32 r6, tegra_tear_down_cpu 106 mov32 r6, tegra_tear_down_cpu
80 ldr r1, [r6] 107 ldr r1, [r6]
81 add r1, r1, r0 108 add r1, r1, r0
@@ -107,10 +134,10 @@ ENTRY(tegra_shut_off_mmu)
107#ifdef CONFIG_CACHE_L2X0 134#ifdef CONFIG_CACHE_L2X0
108 /* Disable L2 cache */ 135 /* Disable L2 cache */
109 check_cpu_part_num 0xc09, r9, r10 136 check_cpu_part_num 0xc09, r9, r10
110 movweq r4, #:lower16:(TEGRA_ARM_PERIF_BASE + 0x3000) 137 movweq r2, #:lower16:(TEGRA_ARM_PERIF_BASE + 0x3000)
111 movteq r4, #:upper16:(TEGRA_ARM_PERIF_BASE + 0x3000) 138 movteq r2, #:upper16:(TEGRA_ARM_PERIF_BASE + 0x3000)
112 moveq r5, #0 139 moveq r3, #0
113 streq r5, [r4, #L2X0_CTRL] 140 streq r3, [r2, #L2X0_CTRL]
114#endif 141#endif
115 mov pc, r0 142 mov pc, r0
116ENDPROC(tegra_shut_off_mmu) 143ENDPROC(tegra_shut_off_mmu)
diff --git a/arch/arm/mach-tegra/sleep.h b/arch/arm/mach-tegra/sleep.h
index 98b7da698f2b..a4edbb3abd3d 100644
--- a/arch/arm/mach-tegra/sleep.h
+++ b/arch/arm/mach-tegra/sleep.h
@@ -41,7 +41,19 @@
41#define CPU_NOT_RESETTABLE 0 41#define CPU_NOT_RESETTABLE 0
42#endif 42#endif
43 43
44/* flag of tegra_disable_clean_inv_dcache to do LoUIS or all */
45#define TEGRA_FLUSH_CACHE_LOUIS 0
46#define TEGRA_FLUSH_CACHE_ALL 1
47
44#ifdef __ASSEMBLY__ 48#ifdef __ASSEMBLY__
49/* waits until the microsecond counter (base) is > rn */
50.macro wait_until, rn, base, tmp
51 add \rn, \rn, #1
521001: ldr \tmp, [\base]
53 cmp \tmp, \rn
54 bmi 1001b
55.endm
56
45/* returns the offset of the flow controller halt register for a cpu */ 57/* returns the offset of the flow controller halt register for a cpu */
46.macro cpu_to_halt_reg rd, rcpu 58.macro cpu_to_halt_reg rd, rcpu
47 cmp \rcpu, #0 59 cmp \rcpu, #0
@@ -144,7 +156,7 @@ void tegra_pen_lock(void);
144void tegra_pen_unlock(void); 156void tegra_pen_unlock(void);
145void tegra_resume(void); 157void tegra_resume(void);
146int tegra_sleep_cpu_finish(unsigned long); 158int tegra_sleep_cpu_finish(unsigned long);
147void tegra_disable_clean_inv_dcache(void); 159void tegra_disable_clean_inv_dcache(u32 flag);
148 160
149#ifdef CONFIG_HOTPLUG_CPU 161#ifdef CONFIG_HOTPLUG_CPU
150void tegra20_hotplug_shutdown(void); 162void tegra20_hotplug_shutdown(void);
diff --git a/arch/arm/mach-tegra/tegra.c b/arch/arm/mach-tegra/tegra.c
index 0d1e4128d460..5b8605547a09 100644
--- a/arch/arm/mach-tegra/tegra.c
+++ b/arch/arm/mach-tegra/tegra.c
@@ -29,7 +29,6 @@
29#include <linux/of_fdt.h> 29#include <linux/of_fdt.h>
30#include <linux/of_platform.h> 30#include <linux/of_platform.h>
31#include <linux/pda_power.h> 31#include <linux/pda_power.h>
32#include <linux/platform_data/tegra_usb.h>
33#include <linux/io.h> 32#include <linux/io.h>
34#include <linux/slab.h> 33#include <linux/slab.h>
35#include <linux/sys_soc.h> 34#include <linux/sys_soc.h>
@@ -46,40 +45,6 @@
46#include "fuse.h" 45#include "fuse.h"
47#include "iomap.h" 46#include "iomap.h"
48 47
49static struct tegra_ehci_platform_data tegra_ehci1_pdata = {
50 .operating_mode = TEGRA_USB_OTG,
51 .power_down_on_bus_suspend = 1,
52 .vbus_gpio = -1,
53};
54
55static struct tegra_ulpi_config tegra_ehci2_ulpi_phy_config = {
56 .reset_gpio = -1,
57 .clk = "cdev2",
58};
59
60static struct tegra_ehci_platform_data tegra_ehci2_pdata = {
61 .phy_config = &tegra_ehci2_ulpi_phy_config,
62 .operating_mode = TEGRA_USB_HOST,
63 .power_down_on_bus_suspend = 1,
64 .vbus_gpio = -1,
65};
66
67static struct tegra_ehci_platform_data tegra_ehci3_pdata = {
68 .operating_mode = TEGRA_USB_HOST,
69 .power_down_on_bus_suspend = 1,
70 .vbus_gpio = -1,
71};
72
73static struct of_dev_auxdata tegra20_auxdata_lookup[] __initdata = {
74 OF_DEV_AUXDATA("nvidia,tegra20-ehci", 0xC5000000, "tegra-ehci.0",
75 &tegra_ehci1_pdata),
76 OF_DEV_AUXDATA("nvidia,tegra20-ehci", 0xC5004000, "tegra-ehci.1",
77 &tegra_ehci2_pdata),
78 OF_DEV_AUXDATA("nvidia,tegra20-ehci", 0xC5008000, "tegra-ehci.2",
79 &tegra_ehci3_pdata),
80 {}
81};
82
83static void __init tegra_dt_init(void) 48static void __init tegra_dt_init(void)
84{ 49{
85 struct soc_device_attribute *soc_dev_attr; 50 struct soc_device_attribute *soc_dev_attr;
@@ -112,30 +77,7 @@ static void __init tegra_dt_init(void)
112 * devices 77 * devices
113 */ 78 */
114out: 79out:
115 of_platform_populate(NULL, of_default_bus_match_table, 80 of_platform_populate(NULL, of_default_bus_match_table, NULL, parent);
116 tegra20_auxdata_lookup, parent);
117}
118
119static void __init trimslice_init(void)
120{
121#ifdef CONFIG_TEGRA_PCI
122 int ret;
123
124 ret = tegra_pcie_init(true, true);
125 if (ret)
126 pr_err("tegra_pci_init() failed: %d\n", ret);
127#endif
128}
129
130static void __init harmony_init(void)
131{
132#ifdef CONFIG_TEGRA_PCI
133 int ret;
134
135 ret = harmony_pcie_init();
136 if (ret)
137 pr_err("harmony_pcie_init() failed: %d\n", ret);
138#endif
139} 81}
140 82
141static void __init paz00_init(void) 83static void __init paz00_init(void)
@@ -148,8 +90,6 @@ static struct {
148 char *machine; 90 char *machine;
149 void (*init)(void); 91 void (*init)(void);
150} board_init_funcs[] = { 92} board_init_funcs[] = {
151 { "compulab,trimslice", trimslice_init },
152 { "nvidia,harmony", harmony_init },
153 { "compal,paz00", paz00_init }, 93 { "compal,paz00", paz00_init },
154}; 94};
155 95
diff --git a/arch/arm/mach-u300/Kconfig b/arch/arm/mach-u300/Kconfig
index a85adcd00882..a1659863bfd5 100644
--- a/arch/arm/mach-u300/Kconfig
+++ b/arch/arm/mach-u300/Kconfig
@@ -1,7 +1,3 @@
1menu "ST-Ericsson AB U300/U335 Platform"
2
3comment "ST-Ericsson Mobile Platform Products"
4
5config ARCH_U300 1config ARCH_U300
6 bool "ST-Ericsson U300 Series" if ARCH_MULTI_V5 2 bool "ST-Ericsson U300 Series" if ARCH_MULTI_V5
7 depends on MMU 3 depends on MMU
@@ -25,7 +21,9 @@ config ARCH_U300
25 help 21 help
26 Support for ST-Ericsson U300 series mobile platforms. 22 Support for ST-Ericsson U300 series mobile platforms.
27 23
28comment "ST-Ericsson U300/U335 Feature Selections" 24if ARCH_U300
25
26menu "ST-Ericsson AB U300/U335 Platform"
29 27
30config MACH_U300 28config MACH_U300
31 depends on ARCH_U300 29 depends on ARCH_U300
@@ -53,3 +51,5 @@ config MACH_U300_SPIDUMMY
53 SPI framework and ARM PL022 support. 51 SPI framework and ARM PL022 support.
54 52
55endmenu 53endmenu
54
55endif
diff --git a/arch/arm/mach-ux500/Kconfig b/arch/arm/mach-ux500/Kconfig
index b19b07204aaf..99a28d628297 100644
--- a/arch/arm/mach-ux500/Kconfig
+++ b/arch/arm/mach-ux500/Kconfig
@@ -8,7 +8,7 @@ config ARCH_U8500
8 select CPU_V7 8 select CPU_V7
9 select GENERIC_CLOCKEVENTS 9 select GENERIC_CLOCKEVENTS
10 select HAVE_ARM_SCU if SMP 10 select HAVE_ARM_SCU if SMP
11 select HAVE_ARM_TWD if LOCAL_TIMERS 11 select HAVE_ARM_TWD if SMP
12 select HAVE_SMP 12 select HAVE_SMP
13 select MIGHT_HAVE_CACHE_L2X0 13 select MIGHT_HAVE_CACHE_L2X0
14 help 14 help
diff --git a/arch/arm/mach-ux500/Makefile b/arch/arm/mach-ux500/Makefile
index bf9b6be5b180..fe1f3e26b88b 100644
--- a/arch/arm/mach-ux500/Makefile
+++ b/arch/arm/mach-ux500/Makefile
@@ -4,7 +4,6 @@
4 4
5obj-y := cpu.o devices.o devices-common.o \ 5obj-y := cpu.o devices.o devices-common.o \
6 id.o usb.o timer.o pm.o 6 id.o usb.o timer.o pm.o
7obj-$(CONFIG_CPU_IDLE) += cpuidle.o
8obj-$(CONFIG_CACHE_L2X0) += cache-l2x0.o 7obj-$(CONFIG_CACHE_L2X0) += cache-l2x0.o
9obj-$(CONFIG_UX500_SOC_DB8500) += cpu-db8500.o devices-db8500.o 8obj-$(CONFIG_UX500_SOC_DB8500) += cpu-db8500.o devices-db8500.o
10obj-$(CONFIG_MACH_MOP500) += board-mop500.o board-mop500-sdi.o \ 9obj-$(CONFIG_MACH_MOP500) += board-mop500.o board-mop500-sdi.o \
diff --git a/arch/arm/mach-ux500/board-mop500-audio.c b/arch/arm/mach-ux500/board-mop500-audio.c
index bfe443daf4b0..ec0807247e60 100644
--- a/arch/arm/mach-ux500/board-mop500-audio.c
+++ b/arch/arm/mach-ux500/board-mop500-audio.c
@@ -17,7 +17,6 @@
17#include "ste-dma40-db8500.h" 17#include "ste-dma40-db8500.h"
18#include "board-mop500.h" 18#include "board-mop500.h"
19#include "devices-db8500.h" 19#include "devices-db8500.h"
20#include "pins-db8500.h"
21 20
22static struct stedma40_chan_cfg msp0_dma_rx = { 21static struct stedma40_chan_cfg msp0_dma_rx = {
23 .high_priority = true, 22 .high_priority = true,
diff --git a/arch/arm/mach-ux500/board-mop500-pins.c b/arch/arm/mach-ux500/board-mop500-pins.c
index 7936d40a5c37..0efb1560fc35 100644
--- a/arch/arm/mach-ux500/board-mop500-pins.c
+++ b/arch/arm/mach-ux500/board-mop500-pins.c
@@ -14,7 +14,6 @@
14 14
15#include <asm/mach-types.h> 15#include <asm/mach-types.h>
16 16
17#include "pins-db8500.h"
18#include "board-mop500.h" 17#include "board-mop500.h"
19 18
20enum custom_pin_cfg_t { 19enum custom_pin_cfg_t {
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c
index df5d27a532e9..ad0806eff762 100644
--- a/arch/arm/mach-ux500/board-mop500.c
+++ b/arch/arm/mach-ux500/board-mop500.c
@@ -42,7 +42,6 @@
42#include <linux/platform_data/dma-ste-dma40.h> 42#include <linux/platform_data/dma-ste-dma40.h>
43 43
44#include <asm/mach-types.h> 44#include <asm/mach-types.h>
45#include <asm/mach/arch.h>
46 45
47#include "setup.h" 46#include "setup.h"
48#include "devices.h" 47#include "devices.h"
@@ -325,21 +324,19 @@ static struct lp55xx_platform_data __initdata lp5521_sec_data = {
325 .clock_mode = LP55XX_CLOCK_EXT, 324 .clock_mode = LP55XX_CLOCK_EXT,
326}; 325};
327 326
327/* I2C0 devices only available on the first HREF/MOP500 */
328static struct i2c_board_info __initdata mop500_i2c0_devices[] = { 328static struct i2c_board_info __initdata mop500_i2c0_devices[] = {
329 { 329 {
330 I2C_BOARD_INFO("tc3589x", 0x42), 330 I2C_BOARD_INFO("tc3589x", 0x42),
331 .irq = NOMADIK_GPIO_TO_IRQ(217), 331 .irq = NOMADIK_GPIO_TO_IRQ(217),
332 .platform_data = &mop500_tc35892_data, 332 .platform_data = &mop500_tc35892_data,
333 }, 333 },
334 /* I2C0 devices only available prior to HREFv60 */
335 { 334 {
336 I2C_BOARD_INFO("tps61052", 0x33), 335 I2C_BOARD_INFO("tps61052", 0x33),
337 .platform_data = &mop500_tps61052_data, 336 .platform_data = &mop500_tps61052_data,
338 }, 337 },
339}; 338};
340 339
341#define NUM_PRE_V60_I2C0_DEVICES 1
342
343static struct i2c_board_info __initdata mop500_i2c2_devices[] = { 340static struct i2c_board_info __initdata mop500_i2c2_devices[] = {
344 { 341 {
345 /* lp5521 LED driver, 1st device */ 342 /* lp5521 LED driver, 1st device */
@@ -357,6 +354,17 @@ static struct i2c_board_info __initdata mop500_i2c2_devices[] = {
357 }, 354 },
358}; 355};
359 356
357static int __init mop500_i2c_board_init(void)
358{
359 if (machine_is_u8500())
360 mop500_uib_i2c_add(0, mop500_i2c0_devices,
361 ARRAY_SIZE(mop500_i2c0_devices));
362 mop500_uib_i2c_add(2, mop500_i2c2_devices,
363 ARRAY_SIZE(mop500_i2c2_devices));
364 return 0;
365}
366device_initcall(mop500_i2c_board_init);
367
360static void __init mop500_i2c_init(struct device *parent) 368static void __init mop500_i2c_init(struct device *parent)
361{ 369{
362 db8500_add_i2c0(parent, NULL); 370 db8500_add_i2c0(parent, NULL);
@@ -565,7 +573,6 @@ static struct platform_device *snowball_platform_devs[] __initdata = {
565static void __init mop500_init_machine(void) 573static void __init mop500_init_machine(void)
566{ 574{
567 struct device *parent = NULL; 575 struct device *parent = NULL;
568 int i2c0_devs;
569 int i; 576 int i;
570 577
571 platform_device_register(&db8500_prcmu_device); 578 platform_device_register(&db8500_prcmu_device);
@@ -588,19 +595,13 @@ static void __init mop500_init_machine(void)
588 mop500_spi_init(parent); 595 mop500_spi_init(parent);
589 mop500_audio_init(parent); 596 mop500_audio_init(parent);
590 mop500_uart_init(parent); 597 mop500_uart_init(parent);
591
592 u8500_cryp1_hash1_init(parent); 598 u8500_cryp1_hash1_init(parent);
593 599
594 i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
595
596 i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
597 i2c_register_board_info(2, mop500_i2c2_devices,
598 ARRAY_SIZE(mop500_i2c2_devices));
599
600 /* This board has full regulator constraints */ 600 /* This board has full regulator constraints */
601 regulator_has_full_constraints(); 601 regulator_has_full_constraints();
602} 602}
603 603
604
604static void __init snowball_init_machine(void) 605static void __init snowball_init_machine(void)
605{ 606{
606 struct device *parent = NULL; 607 struct device *parent = NULL;
@@ -635,7 +636,6 @@ static void __init snowball_init_machine(void)
635static void __init hrefv60_init_machine(void) 636static void __init hrefv60_init_machine(void)
636{ 637{
637 struct device *parent = NULL; 638 struct device *parent = NULL;
638 int i2c0_devs;
639 int i; 639 int i;
640 640
641 platform_device_register(&db8500_prcmu_device); 641 platform_device_register(&db8500_prcmu_device);
@@ -664,14 +664,6 @@ static void __init hrefv60_init_machine(void)
664 mop500_audio_init(parent); 664 mop500_audio_init(parent);
665 mop500_uart_init(parent); 665 mop500_uart_init(parent);
666 666
667 i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
668
669 i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES;
670
671 i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
672 i2c_register_board_info(2, mop500_i2c2_devices,
673 ARRAY_SIZE(mop500_i2c2_devices));
674
675 /* This board has full regulator constraints */ 667 /* This board has full regulator constraints */
676 regulator_has_full_constraints(); 668 regulator_has_full_constraints();
677} 669}
@@ -686,6 +678,7 @@ MACHINE_START(U8500, "ST-Ericsson MOP500 platform")
686 .init_time = ux500_timer_init, 678 .init_time = ux500_timer_init,
687 .init_machine = mop500_init_machine, 679 .init_machine = mop500_init_machine,
688 .init_late = ux500_init_late, 680 .init_late = ux500_init_late,
681 .restart = ux500_restart,
689MACHINE_END 682MACHINE_END
690 683
691MACHINE_START(U8520, "ST-Ericsson U8520 Platform HREFP520") 684MACHINE_START(U8520, "ST-Ericsson U8520 Platform HREFP520")
@@ -695,6 +688,7 @@ MACHINE_START(U8520, "ST-Ericsson U8520 Platform HREFP520")
695 .init_time = ux500_timer_init, 688 .init_time = ux500_timer_init,
696 .init_machine = mop500_init_machine, 689 .init_machine = mop500_init_machine,
697 .init_late = ux500_init_late, 690 .init_late = ux500_init_late,
691 .restart = ux500_restart,
698MACHINE_END 692MACHINE_END
699 693
700MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+") 694MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+")
@@ -705,6 +699,7 @@ MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+")
705 .init_time = ux500_timer_init, 699 .init_time = ux500_timer_init,
706 .init_machine = hrefv60_init_machine, 700 .init_machine = hrefv60_init_machine,
707 .init_late = ux500_init_late, 701 .init_late = ux500_init_late,
702 .restart = ux500_restart,
708MACHINE_END 703MACHINE_END
709 704
710MACHINE_START(SNOWBALL, "Calao Systems Snowball platform") 705MACHINE_START(SNOWBALL, "Calao Systems Snowball platform")
@@ -716,4 +711,5 @@ MACHINE_START(SNOWBALL, "Calao Systems Snowball platform")
716 .init_time = ux500_timer_init, 711 .init_time = ux500_timer_init,
717 .init_machine = snowball_init_machine, 712 .init_machine = snowball_init_machine,
718 .init_late = NULL, 713 .init_late = NULL,
714 .restart = ux500_restart,
719MACHINE_END 715MACHINE_END
diff --git a/arch/arm/mach-ux500/cache-l2x0.c b/arch/arm/mach-ux500/cache-l2x0.c
index 82ccf1d98735..264f894c0e3d 100644
--- a/arch/arm/mach-ux500/cache-l2x0.c
+++ b/arch/arm/mach-ux500/cache-l2x0.c
@@ -69,6 +69,7 @@ static int __init ux500_l2x0_init(void)
69 * some SMI service available. 69 * some SMI service available.
70 */ 70 */
71 outer_cache.disable = NULL; 71 outer_cache.disable = NULL;
72 outer_cache.set_debug = NULL;
72 73
73 return 0; 74 return 0;
74} 75}
diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c
index 12eee8167525..301c3460d96a 100644
--- a/arch/arm/mach-ux500/cpu-db8500.c
+++ b/arch/arm/mach-ux500/cpu-db8500.c
@@ -26,7 +26,6 @@
26 26
27#include <asm/pmu.h> 27#include <asm/pmu.h>
28#include <asm/mach/map.h> 28#include <asm/mach/map.h>
29#include <asm/mach/arch.h>
30 29
31#include "setup.h" 30#include "setup.h"
32#include "devices.h" 31#include "devices.h"
@@ -157,7 +156,8 @@ static void __init db8500_add_gpios(struct device *parent)
157 .supports_sleepmode = true, 156 .supports_sleepmode = true,
158 }; 157 };
159 158
160 dbx500_add_gpios(parent, ARRAY_AND_SIZE(db8500_gpio_base), 159 dbx500_add_gpios(parent, db8500_gpio_base,
160 ARRAY_SIZE(db8500_gpio_base),
161 IRQ_DB8500_GPIO0, &pdata); 161 IRQ_DB8500_GPIO0, &pdata);
162 dbx500_add_pinctrl(parent, "pinctrl-db8500", U8500_PRCMU_BASE); 162 dbx500_add_pinctrl(parent, "pinctrl-db8500", U8500_PRCMU_BASE);
163} 163}
@@ -223,10 +223,10 @@ static struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = {
223 OF_DEV_AUXDATA("arm,pl011", 0x80121000, "uart1", NULL), 223 OF_DEV_AUXDATA("arm,pl011", 0x80121000, "uart1", NULL),
224 OF_DEV_AUXDATA("arm,pl011", 0x80007000, "uart2", NULL), 224 OF_DEV_AUXDATA("arm,pl011", 0x80007000, "uart2", NULL),
225 OF_DEV_AUXDATA("arm,pl022", 0x80002000, "ssp0", &ssp0_plat), 225 OF_DEV_AUXDATA("arm,pl022", 0x80002000, "ssp0", &ssp0_plat),
226 OF_DEV_AUXDATA("arm,pl18x", 0x80126000, "sdi0", &mop500_sdi0_data), 226 OF_DEV_AUXDATA("arm,pl18x", 0x80126000, "sdi0", NULL),
227 OF_DEV_AUXDATA("arm,pl18x", 0x80118000, "sdi1", &mop500_sdi1_data), 227 OF_DEV_AUXDATA("arm,pl18x", 0x80118000, "sdi1", NULL),
228 OF_DEV_AUXDATA("arm,pl18x", 0x80005000, "sdi2", &mop500_sdi2_data), 228 OF_DEV_AUXDATA("arm,pl18x", 0x80005000, "sdi2", NULL),
229 OF_DEV_AUXDATA("arm,pl18x", 0x80114000, "sdi4", &mop500_sdi4_data), 229 OF_DEV_AUXDATA("arm,pl18x", 0x80114000, "sdi4", NULL),
230 /* Requires clock name bindings. */ 230 /* Requires clock name bindings. */
231 OF_DEV_AUXDATA("st,nomadik-gpio", 0x8012e000, "gpio.0", NULL), 231 OF_DEV_AUXDATA("st,nomadik-gpio", 0x8012e000, "gpio.0", NULL),
232 OF_DEV_AUXDATA("st,nomadik-gpio", 0x8012e080, "gpio.1", NULL), 232 OF_DEV_AUXDATA("st,nomadik-gpio", 0x8012e080, "gpio.1", NULL),
@@ -325,6 +325,7 @@ DT_MACHINE_START(U8500_DT, "ST-Ericsson Ux5x0 platform (Device Tree Support)")
325 .init_machine = u8500_init_machine, 325 .init_machine = u8500_init_machine,
326 .init_late = NULL, 326 .init_late = NULL,
327 .dt_compat = stericsson_dt_platform_compat, 327 .dt_compat = stericsson_dt_platform_compat,
328 .restart = ux500_restart,
328MACHINE_END 329MACHINE_END
329 330
330#endif 331#endif
diff --git a/arch/arm/mach-ux500/cpu.c b/arch/arm/mach-ux500/cpu.c
index e6fb0239151b..5d7eebcabc63 100644
--- a/arch/arm/mach-ux500/cpu.c
+++ b/arch/arm/mach-ux500/cpu.c
@@ -31,6 +31,14 @@
31#include "db8500-regs.h" 31#include "db8500-regs.h"
32#include "id.h" 32#include "id.h"
33 33
34void ux500_restart(enum reboot_mode mode, const char *cmd)
35{
36 local_irq_disable();
37 local_fiq_disable();
38
39 prcmu_system_reset(0);
40}
41
34/* 42/*
35 * FIXME: Should we set up the GPIO domain here? 43 * FIXME: Should we set up the GPIO domain here?
36 * 44 *
diff --git a/arch/arm/mach-ux500/cpuidle.c b/arch/arm/mach-ux500/cpuidle.c
deleted file mode 100644
index a45dd09daed9..000000000000
--- a/arch/arm/mach-ux500/cpuidle.c
+++ /dev/null
@@ -1,128 +0,0 @@
1/*
2 * Copyright (c) 2012 Linaro : Daniel Lezcano <daniel.lezcano@linaro.org> (IBM)
3 *
4 * Based on the work of Rickard Andersson <rickard.andersson@stericsson.com>
5 * and Jonas Aaberg <jonas.aberg@stericsson.com>.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11
12#include <linux/module.h>
13#include <linux/cpuidle.h>
14#include <linux/spinlock.h>
15#include <linux/atomic.h>
16#include <linux/smp.h>
17#include <linux/mfd/dbx500-prcmu.h>
18#include <linux/platform_data/arm-ux500-pm.h>
19
20#include <asm/cpuidle.h>
21#include <asm/proc-fns.h>
22
23#include "db8500-regs.h"
24#include "id.h"
25
26static atomic_t master = ATOMIC_INIT(0);
27static DEFINE_SPINLOCK(master_lock);
28
29static inline int ux500_enter_idle(struct cpuidle_device *dev,
30 struct cpuidle_driver *drv, int index)
31{
32 int this_cpu = smp_processor_id();
33 bool recouple = false;
34
35 if (atomic_inc_return(&master) == num_online_cpus()) {
36
37 /* With this lock, we prevent the other cpu to exit and enter
38 * this function again and become the master */
39 if (!spin_trylock(&master_lock))
40 goto wfi;
41
42 /* decouple the gic from the A9 cores */
43 if (prcmu_gic_decouple()) {
44 spin_unlock(&master_lock);
45 goto out;
46 }
47
48 /* If an error occur, we will have to recouple the gic
49 * manually */
50 recouple = true;
51
52 /* At this state, as the gic is decoupled, if the other
53 * cpu is in WFI, we have the guarantee it won't be wake
54 * up, so we can safely go to retention */
55 if (!prcmu_is_cpu_in_wfi(this_cpu ? 0 : 1))
56 goto out;
57
58 /* The prcmu will be in charge of watching the interrupts
59 * and wake up the cpus */
60 if (prcmu_copy_gic_settings())
61 goto out;
62
63 /* Check in the meantime an interrupt did
64 * not occur on the gic ... */
65 if (prcmu_gic_pending_irq())
66 goto out;
67
68 /* ... and the prcmu */
69 if (prcmu_pending_irq())
70 goto out;
71
72 /* Go to the retention state, the prcmu will wait for the
73 * cpu to go WFI and this is what happens after exiting this
74 * 'master' critical section */
75 if (prcmu_set_power_state(PRCMU_AP_IDLE, true, true))
76 goto out;
77
78 /* When we switch to retention, the prcmu is in charge
79 * of recoupling the gic automatically */
80 recouple = false;
81
82 spin_unlock(&master_lock);
83 }
84wfi:
85 cpu_do_idle();
86out:
87 atomic_dec(&master);
88
89 if (recouple) {
90 prcmu_gic_recouple();
91 spin_unlock(&master_lock);
92 }
93
94 return index;
95}
96
97static struct cpuidle_driver ux500_idle_driver = {
98 .name = "ux500_idle",
99 .owner = THIS_MODULE,
100 .states = {
101 ARM_CPUIDLE_WFI_STATE,
102 {
103 .enter = ux500_enter_idle,
104 .exit_latency = 70,
105 .target_residency = 260,
106 .flags = CPUIDLE_FLAG_TIME_VALID |
107 CPUIDLE_FLAG_TIMER_STOP,
108 .name = "ApIdle",
109 .desc = "ARM Retention",
110 },
111 },
112 .safe_state_index = 0,
113 .state_count = 2,
114};
115
116int __init ux500_idle_init(void)
117{
118 if (!(cpu_is_u8500_family() || cpu_is_ux540_family()))
119 return -ENODEV;
120
121 /* Configure wake up reasons */
122 prcmu_enable_wakeups(PRCMU_WAKEUP(ARM) | PRCMU_WAKEUP(RTC) |
123 PRCMU_WAKEUP(ABB));
124
125 return cpuidle_register(&ux500_idle_driver, NULL);
126}
127
128device_initcall(ux500_idle_init);
diff --git a/arch/arm/mach-ux500/devices-db8500.c b/arch/arm/mach-ux500/devices-db8500.c
index 516a6f57d159..bc316062e0c2 100644
--- a/arch/arm/mach-ux500/devices-db8500.c
+++ b/arch/arm/mach-ux500/devices-db8500.c
@@ -49,6 +49,7 @@ struct stedma40_platform_data dma40_plat_data = {
49struct platform_device u8500_dma40_device = { 49struct platform_device u8500_dma40_device = {
50 .dev = { 50 .dev = {
51 .platform_data = &dma40_plat_data, 51 .platform_data = &dma40_plat_data,
52 .coherent_dma_mask = DMA_BIT_MASK(32),
52 }, 53 },
53 .name = "dma40", 54 .name = "dma40",
54 .id = 0, 55 .id = 0,
diff --git a/arch/arm/mach-ux500/headsmp.S b/arch/arm/mach-ux500/headsmp.S
index 08da5589bcd8..9cdea049485d 100644
--- a/arch/arm/mach-ux500/headsmp.S
+++ b/arch/arm/mach-ux500/headsmp.S
@@ -11,8 +11,6 @@
11#include <linux/linkage.h> 11#include <linux/linkage.h>
12#include <linux/init.h> 12#include <linux/init.h>
13 13
14 __INIT
15
16/* 14/*
17 * U8500 specific entry point for secondary CPUs. 15 * U8500 specific entry point for secondary CPUs.
18 */ 16 */
diff --git a/arch/arm/mach-ux500/pins-db8500.h b/arch/arm/mach-ux500/pins-db8500.h
deleted file mode 100644
index 062c7acf4576..000000000000
--- a/arch/arm/mach-ux500/pins-db8500.h
+++ /dev/null
@@ -1,746 +0,0 @@
1/*
2 * Copyright (C) ST-Ericsson SA 2010
3 *
4 * License terms: GNU General Public License, version 2
5 * Author: Rabin Vincent <rabin.vincent@stericsson.com>
6 */
7
8#ifndef __MACH_PINS_DB8500_H
9#define __MACH_PINS_DB8500_H
10
11/*
12 * TODO: Eventually encode all non-board specific pull up/down configuration
13 * here.
14 */
15
16#define GPIO0_GPIO PIN_CFG(0, GPIO)
17#define GPIO0_U0_CTSn PIN_CFG(0, ALT_A)
18#define GPIO0_TRIG_OUT PIN_CFG(0, ALT_B)
19#define GPIO0_IP_TDO PIN_CFG(0, ALT_C)
20
21#define GPIO1_GPIO PIN_CFG(1, GPIO)
22#define GPIO1_U0_RTSn PIN_CFG(1, ALT_A)
23#define GPIO1_TRIG_IN PIN_CFG(1, ALT_B)
24#define GPIO1_IP_TDI PIN_CFG(1, ALT_C)
25
26#define GPIO2_GPIO PIN_CFG(2, GPIO)
27#define GPIO2_U0_RXD PIN_CFG(2, ALT_A)
28#define GPIO2_NONE PIN_CFG(2, ALT_B)
29#define GPIO2_IP_TMS PIN_CFG(2, ALT_C)
30
31#define GPIO3_GPIO PIN_CFG(3, GPIO)
32#define GPIO3_U0_TXD PIN_CFG(3, ALT_A)
33#define GPIO3_NONE PIN_CFG(3, ALT_B)
34#define GPIO3_IP_TCK PIN_CFG(3, ALT_C)
35
36#define GPIO4_GPIO PIN_CFG(4, GPIO)
37#define GPIO4_U1_RXD PIN_CFG(4, ALT_A)
38#define GPIO4_I2C4_SCL PIN_CFG(4, ALT_B)
39#define GPIO4_IP_TRSTn PIN_CFG(4, ALT_C)
40
41#define GPIO5_GPIO PIN_CFG(5, GPIO)
42#define GPIO5_U1_TXD PIN_CFG(5, ALT_A)
43#define GPIO5_I2C4_SDA PIN_CFG(5, ALT_B)
44#define GPIO5_IP_GPIO6 PIN_CFG(5, ALT_C)
45
46#define GPIO6_GPIO PIN_CFG(6, GPIO)
47#define GPIO6_U1_CTSn PIN_CFG(6, ALT_A)
48#define GPIO6_I2C1_SCL PIN_CFG(6, ALT_B)
49#define GPIO6_IP_GPIO0 PIN_CFG(6, ALT_C)
50
51#define GPIO7_GPIO PIN_CFG(7, GPIO)
52#define GPIO7_U1_RTSn PIN_CFG(7, ALT_A)
53#define GPIO7_I2C1_SDA PIN_CFG(7, ALT_B)
54#define GPIO7_IP_GPIO1 PIN_CFG(7, ALT_C)
55
56#define GPIO8_GPIO PIN_CFG(8, GPIO)
57#define GPIO8_IPI2C_SDA PIN_CFG(8, ALT_A)
58#define GPIO8_I2C2_SDA PIN_CFG(8, ALT_B)
59
60#define GPIO9_GPIO PIN_CFG(9, GPIO)
61#define GPIO9_IPI2C_SCL PIN_CFG(9, ALT_A)
62#define GPIO9_I2C2_SCL PIN_CFG(9, ALT_B)
63
64#define GPIO10_GPIO PIN_CFG(10, GPIO)
65#define GPIO10_IPI2C_SDA PIN_CFG(10, ALT_A)
66#define GPIO10_I2C2_SDA PIN_CFG(10, ALT_B)
67#define GPIO10_IP_GPIO3 PIN_CFG(10, ALT_C)
68
69#define GPIO11_GPIO PIN_CFG(11, GPIO)
70#define GPIO11_IPI2C_SCL PIN_CFG(11, ALT_A)
71#define GPIO11_I2C2_SCL PIN_CFG(11, ALT_B)
72#define GPIO11_IP_GPIO2 PIN_CFG(11, ALT_C)
73
74#define GPIO12_GPIO PIN_CFG(12, GPIO)
75#define GPIO12_MSP0_TXD PIN_CFG(12, ALT_A)
76#define GPIO12_MSP0_RXD PIN_CFG(12, ALT_B)
77
78#define GPIO13_GPIO PIN_CFG(13, GPIO)
79#define GPIO13_MSP0_TFS PIN_CFG(13, ALT_A)
80
81#define GPIO14_GPIO PIN_CFG(14, GPIO)
82#define GPIO14_MSP0_TCK PIN_CFG(14, ALT_A)
83
84#define GPIO15_GPIO PIN_CFG(15, GPIO)
85#define GPIO15_MSP0_RXD PIN_CFG(15, ALT_A)
86#define GPIO15_MSP0_TXD PIN_CFG(15, ALT_B)
87
88#define GPIO16_GPIO PIN_CFG(16, GPIO)
89#define GPIO16_MSP0_RFS PIN_CFG(16, ALT_A)
90#define GPIO16_I2C1_SCL PIN_CFG(16, ALT_B)
91#define GPIO16_SLIM0_DAT PIN_CFG(16, ALT_C)
92
93#define GPIO17_GPIO PIN_CFG(17, GPIO)
94#define GPIO17_MSP0_RCK PIN_CFG(17, ALT_A)
95#define GPIO17_I2C1_SDA PIN_CFG(17, ALT_B)
96#define GPIO17_SLIM0_CLK PIN_CFG(17, ALT_C)
97
98#define GPIO18_GPIO PIN_CFG(18, GPIO)
99#define GPIO18_MC0_CMDDIR PIN_CFG_INPUT(18, ALT_A, PULLUP)
100#define GPIO18_U2_RXD PIN_CFG(18, ALT_B)
101#define GPIO18_MS_IEP PIN_CFG(18, ALT_C)
102
103#define GPIO19_GPIO PIN_CFG(19, GPIO)
104#define GPIO19_MC0_DAT0DIR PIN_CFG_INPUT(19, ALT_A, PULLUP)
105#define GPIO19_U2_TXD PIN_CFG(19, ALT_B)
106#define GPIO19_MS_DAT0DIR PIN_CFG(19, ALT_C)
107
108#define GPIO20_GPIO PIN_CFG(20, GPIO)
109#define GPIO20_MC0_DAT2DIR PIN_CFG_INPUT(20, ALT_A, PULLUP)
110#define GPIO20_UARTMOD_TXD PIN_CFG(20, ALT_B)
111#define GPIO20_IP_TRIGOUT PIN_CFG(20, ALT_C)
112
113#define GPIO21_GPIO PIN_CFG(21, GPIO)
114#define GPIO21_MC0_DAT31DIR PIN_CFG_INPUT(21, ALT_A, PULLUP)
115#define GPIO21_MSP0_SCK PIN_CFG(21, ALT_B)
116#define GPIO21_MS_DAT31DIR PIN_CFG(21, ALT_C)
117
118#define GPIO22_GPIO PIN_CFG(22, GPIO)
119#define GPIO22_MC0_FBCLK PIN_CFG_INPUT(22, ALT_A, PULLUP)
120#define GPIO22_UARTMOD_RXD PIN_CFG(22, ALT_B)
121#define GPIO22_MS_FBCLK PIN_CFG(22, ALT_C)
122
123#define GPIO23_GPIO PIN_CFG(23, GPIO)
124#define GPIO23_MC0_CLK PIN_CFG_INPUT(23, ALT_A, PULLUP)
125#define GPIO23_STMMOD_CLK PIN_CFG(23, ALT_B)
126#define GPIO23_MS_CLK PIN_CFG(23, ALT_C)
127
128#define GPIO24_GPIO PIN_CFG(24, GPIO)
129#define GPIO24_MC0_CMD PIN_CFG_INPUT(24, ALT_A, PULLUP)
130#define GPIO24_UARTMOD_RXD PIN_CFG(24, ALT_B)
131#define GPIO24_MS_BS PIN_CFG(24, ALT_C)
132
133#define GPIO25_GPIO PIN_CFG(25, GPIO)
134#define GPIO25_MC0_DAT0 PIN_CFG_INPUT(25, ALT_A, PULLUP)
135#define GPIO25_STMMOD_DAT0 PIN_CFG(25, ALT_B)
136#define GPIO25_MS_DAT0 PIN_CFG(25, ALT_C)
137
138#define GPIO26_GPIO PIN_CFG(26, GPIO)
139#define GPIO26_MC0_DAT1 PIN_CFG_INPUT(26, ALT_A, PULLUP)
140#define GPIO26_STMMOD_DAT1 PIN_CFG(26, ALT_B)
141#define GPIO26_MS_DAT1 PIN_CFG(26, ALT_C)
142
143#define GPIO27_GPIO PIN_CFG(27, GPIO)
144#define GPIO27_MC0_DAT2 PIN_CFG_INPUT(27, ALT_A, PULLUP)
145#define GPIO27_STMMOD_DAT2 PIN_CFG(27, ALT_B)
146#define GPIO27_MS_DAT2 PIN_CFG(27, ALT_C)
147
148#define GPIO28_GPIO PIN_CFG(28, GPIO)
149#define GPIO28_MC0_DAT3 PIN_CFG_INPUT(28, ALT_A, PULLUP)
150#define GPIO28_STMMOD_DAT3 PIN_CFG(28, ALT_B)
151#define GPIO28_MS_DAT3 PIN_CFG(28, ALT_C)
152
153#define GPIO29_GPIO PIN_CFG(29, GPIO)
154#define GPIO29_MC0_DAT4 PIN_CFG(29, ALT_A)
155#define GPIO29_SPI3_CLK PIN_CFG(29, ALT_B)
156#define GPIO29_U2_RXD PIN_CFG(29, ALT_C)
157
158#define GPIO30_GPIO PIN_CFG(30, GPIO)
159#define GPIO30_MC0_DAT5 PIN_CFG(30, ALT_A)
160#define GPIO30_SPI3_RXD PIN_CFG(30, ALT_B)
161#define GPIO30_U2_TXD PIN_CFG(30, ALT_C)
162
163#define GPIO31_GPIO PIN_CFG(31, GPIO)
164#define GPIO31_MC0_DAT6 PIN_CFG(31, ALT_A)
165#define GPIO31_SPI3_FRM PIN_CFG(31, ALT_B)
166#define GPIO31_U2_CTSn PIN_CFG(31, ALT_C)
167
168#define GPIO32_GPIO PIN_CFG(32, GPIO)
169#define GPIO32_MC0_DAT7 PIN_CFG(32, ALT_A)
170#define GPIO32_SPI3_TXD PIN_CFG(32, ALT_B)
171#define GPIO32_U2_RTSn PIN_CFG(32, ALT_C)
172
173#define GPIO33_GPIO PIN_CFG(33, GPIO)
174#define GPIO33_MSP1_TXD PIN_CFG(33, ALT_A)
175#define GPIO33_MSP1_RXD PIN_CFG(33, ALT_B)
176#define GPIO33_U0_DTRn PIN_CFG(33, ALT_C)
177
178#define GPIO34_GPIO PIN_CFG(34, GPIO)
179#define GPIO34_MSP1_TFS PIN_CFG(34, ALT_A)
180#define GPIO34_NONE PIN_CFG(34, ALT_B)
181#define GPIO34_U0_DCDn PIN_CFG(34, ALT_C)
182
183#define GPIO35_GPIO PIN_CFG(35, GPIO)
184#define GPIO35_MSP1_TCK PIN_CFG(35, ALT_A)
185#define GPIO35_NONE PIN_CFG(35, ALT_B)
186#define GPIO35_U0_DSRn PIN_CFG(35, ALT_C)
187
188#define GPIO36_GPIO PIN_CFG(36, GPIO)
189#define GPIO36_MSP1_RXD PIN_CFG(36, ALT_A)
190#define GPIO36_MSP1_TXD PIN_CFG(36, ALT_B)
191#define GPIO36_U0_RIn PIN_CFG(36, ALT_C)
192
193#define GPIO64_GPIO PIN_CFG(64, GPIO)
194#define GPIO64_LCDB_DE PIN_CFG(64, ALT_A)
195#define GPIO64_KP_O1 PIN_CFG(64, ALT_B)
196#define GPIO64_IP_GPIO4 PIN_CFG(64, ALT_C)
197
198#define GPIO65_GPIO PIN_CFG(65, GPIO)
199#define GPIO65_LCDB_HSO PIN_CFG(65, ALT_A)
200#define GPIO65_KP_O0 PIN_CFG(65, ALT_B)
201#define GPIO65_IP_GPIO5 PIN_CFG(65, ALT_C)
202
203#define GPIO66_GPIO PIN_CFG(66, GPIO)
204#define GPIO66_LCDB_VSO PIN_CFG(66, ALT_A)
205#define GPIO66_KP_I1 PIN_CFG(66, ALT_B)
206#define GPIO66_IP_GPIO6 PIN_CFG(66, ALT_C)
207
208#define GPIO67_GPIO PIN_CFG(67, GPIO)
209#define GPIO67_LCDB_CLK PIN_CFG(67, ALT_A)
210#define GPIO67_KP_I0 PIN_CFG(67, ALT_B)
211#define GPIO67_IP_GPIO7 PIN_CFG(67, ALT_C)
212
213#define GPIO68_GPIO PIN_CFG(68, GPIO)
214#define GPIO68_LCD_VSI0 PIN_CFG(68, ALT_A)
215#define GPIO68_KP_O7 PIN_CFG(68, ALT_B)
216#define GPIO68_SM_CLE PIN_CFG(68, ALT_C)
217
218#define GPIO69_GPIO PIN_CFG(69, GPIO)
219#define GPIO69_LCD_VSI1 PIN_CFG(69, ALT_A)
220#define GPIO69_KP_I7 PIN_CFG(69, ALT_B)
221#define GPIO69_SM_ALE PIN_CFG(69, ALT_C)
222
223#define GPIO70_GPIO PIN_CFG(70, GPIO)
224#define GPIO70_LCD_D0 PIN_CFG(70, ALT_A)
225#define GPIO70_KP_O5 PIN_CFG(70, ALT_B)
226#define GPIO70_STMAPE_CLK PIN_CFG(70, ALT_C)
227
228#define GPIO71_GPIO PIN_CFG(71, GPIO)
229#define GPIO71_LCD_D1 PIN_CFG(71, ALT_A)
230#define GPIO71_KP_O4 PIN_CFG(71, ALT_B)
231#define GPIO71_STMAPE_DAT3 PIN_CFG(71, ALT_C)
232
233#define GPIO72_GPIO PIN_CFG(72, GPIO)
234#define GPIO72_LCD_D2 PIN_CFG(72, ALT_A)
235#define GPIO72_KP_O3 PIN_CFG(72, ALT_B)
236#define GPIO72_STMAPE_DAT2 PIN_CFG(72, ALT_C)
237
238#define GPIO73_GPIO PIN_CFG(73, GPIO)
239#define GPIO73_LCD_D3 PIN_CFG(73, ALT_A)
240#define GPIO73_KP_O2 PIN_CFG(73, ALT_B)
241#define GPIO73_STMAPE_DAT1 PIN_CFG(73, ALT_C)
242
243#define GPIO74_GPIO PIN_CFG(74, GPIO)
244#define GPIO74_LCD_D4 PIN_CFG(74, ALT_A)
245#define GPIO74_KP_I5 PIN_CFG(74, ALT_B)
246#define GPIO74_STMAPE_DAT0 PIN_CFG(74, ALT_C)
247
248#define GPIO75_GPIO PIN_CFG(75, GPIO)
249#define GPIO75_LCD_D5 PIN_CFG(75, ALT_A)
250#define GPIO75_KP_I4 PIN_CFG(75, ALT_B)
251#define GPIO75_U2_RXD PIN_CFG(75, ALT_C)
252
253#define GPIO76_GPIO PIN_CFG(76, GPIO)
254#define GPIO76_LCD_D6 PIN_CFG(76, ALT_A)
255#define GPIO76_KP_I3 PIN_CFG(76, ALT_B)
256#define GPIO76_U2_TXD PIN_CFG(76, ALT_C)
257
258#define GPIO77_GPIO PIN_CFG(77, GPIO)
259#define GPIO77_LCD_D7 PIN_CFG(77, ALT_A)
260#define GPIO77_KP_I2 PIN_CFG(77, ALT_B)
261#define GPIO77_NONE PIN_CFG(77, ALT_C)
262
263#define GPIO78_GPIO PIN_CFG(78, GPIO)
264#define GPIO78_LCD_D8 PIN_CFG(78, ALT_A)
265#define GPIO78_KP_O6 PIN_CFG(78, ALT_B)
266#define GPIO78_IP_GPIO2 PIN_CFG(78, ALT_C)
267
268#define GPIO79_GPIO PIN_CFG(79, GPIO)
269#define GPIO79_LCD_D9 PIN_CFG(79, ALT_A)
270#define GPIO79_KP_I6 PIN_CFG(79, ALT_B)
271#define GPIO79_IP_GPIO3 PIN_CFG(79, ALT_C)
272
273#define GPIO80_GPIO PIN_CFG(80, GPIO)
274#define GPIO80_LCD_D10 PIN_CFG(80, ALT_A)
275#define GPIO80_KP_SKA0 PIN_CFG(80, ALT_B)
276#define GPIO80_IP_GPIO4 PIN_CFG(80, ALT_C)
277
278#define GPIO81_GPIO PIN_CFG(81, GPIO)
279#define GPIO81_LCD_D11 PIN_CFG(81, ALT_A)
280#define GPIO81_KP_SKB0 PIN_CFG(81, ALT_B)
281#define GPIO81_IP_GPIO5 PIN_CFG(81, ALT_C)
282
283#define GPIO82_GPIO PIN_CFG(82, GPIO)
284#define GPIO82_LCD_D12 PIN_CFG(82, ALT_A)
285#define GPIO82_KP_O5 PIN_CFG(82, ALT_B)
286
287#define GPIO83_GPIO PIN_CFG(83, GPIO)
288#define GPIO83_LCD_D13 PIN_CFG(83, ALT_A)
289#define GPIO83_KP_O4 PIN_CFG(83, ALT_B)
290
291#define GPIO84_GPIO PIN_CFG(84, GPIO)
292#define GPIO84_LCD_D14 PIN_CFG(84, ALT_A)
293#define GPIO84_KP_I5 PIN_CFG(84, ALT_B)
294
295#define GPIO85_GPIO PIN_CFG(85, GPIO)
296#define GPIO85_LCD_D15 PIN_CFG(85, ALT_A)
297#define GPIO85_KP_I4 PIN_CFG(85, ALT_B)
298
299#define GPIO86_GPIO PIN_CFG(86, GPIO)
300#define GPIO86_LCD_D16 PIN_CFG(86, ALT_A)
301#define GPIO86_SM_ADQ0 PIN_CFG(86, ALT_B)
302#define GPIO86_MC5_DAT0 PIN_CFG(86, ALT_C)
303
304#define GPIO87_GPIO PIN_CFG(87, GPIO)
305#define GPIO87_LCD_D17 PIN_CFG(87, ALT_A)
306#define GPIO87_SM_ADQ1 PIN_CFG(87, ALT_B)
307#define GPIO87_MC5_DAT1 PIN_CFG(87, ALT_C)
308
309#define GPIO88_GPIO PIN_CFG(88, GPIO)
310#define GPIO88_LCD_D18 PIN_CFG(88, ALT_A)
311#define GPIO88_SM_ADQ2 PIN_CFG(88, ALT_B)
312#define GPIO88_MC5_DAT2 PIN_CFG(88, ALT_C)
313
314#define GPIO89_GPIO PIN_CFG(89, GPIO)
315#define GPIO89_LCD_D19 PIN_CFG(89, ALT_A)
316#define GPIO89_SM_ADQ3 PIN_CFG(89, ALT_B)
317#define GPIO89_MC5_DAT3 PIN_CFG(89, ALT_C)
318
319#define GPIO90_GPIO PIN_CFG(90, GPIO)
320#define GPIO90_LCD_D20 PIN_CFG(90, ALT_A)
321#define GPIO90_SM_ADQ4 PIN_CFG(90, ALT_B)
322#define GPIO90_MC5_CMD PIN_CFG(90, ALT_C)
323
324#define GPIO91_GPIO PIN_CFG(91, GPIO)
325#define GPIO91_LCD_D21 PIN_CFG(91, ALT_A)
326#define GPIO91_SM_ADQ5 PIN_CFG(91, ALT_B)
327#define GPIO91_MC5_FBCLK PIN_CFG(91, ALT_C)
328
329#define GPIO92_GPIO PIN_CFG(92, GPIO)
330#define GPIO92_LCD_D22 PIN_CFG(92, ALT_A)
331#define GPIO92_SM_ADQ6 PIN_CFG(92, ALT_B)
332#define GPIO92_MC5_CLK PIN_CFG(92, ALT_C)
333
334#define GPIO93_GPIO PIN_CFG(93, GPIO)
335#define GPIO93_LCD_D23 PIN_CFG(93, ALT_A)
336#define GPIO93_SM_ADQ7 PIN_CFG(93, ALT_B)
337#define GPIO93_MC5_DAT4 PIN_CFG(93, ALT_C)
338
339#define GPIO94_GPIO PIN_CFG(94, GPIO)
340#define GPIO94_KP_O7 PIN_CFG(94, ALT_A)
341#define GPIO94_SM_ADVn PIN_CFG(94, ALT_B)
342#define GPIO94_MC5_DAT5 PIN_CFG(94, ALT_C)
343
344#define GPIO95_GPIO PIN_CFG(95, GPIO)
345#define GPIO95_KP_I7 PIN_CFG(95, ALT_A)
346#define GPIO95_SM_CS0n PIN_CFG(95, ALT_B)
347#define GPIO95_SM_PS0n PIN_CFG(95, ALT_C)
348
349#define GPIO96_GPIO PIN_CFG(96, GPIO)
350#define GPIO96_KP_O6 PIN_CFG(96, ALT_A)
351#define GPIO96_SM_OEn PIN_CFG(96, ALT_B)
352#define GPIO96_MC5_DAT6 PIN_CFG(96, ALT_C)
353
354#define GPIO97_GPIO PIN_CFG(97, GPIO)
355#define GPIO97_KP_I6 PIN_CFG(97, ALT_A)
356#define GPIO97_SM_WEn PIN_CFG(97, ALT_B)
357#define GPIO97_MC5_DAT7 PIN_CFG(97, ALT_C)
358
359#define GPIO128_GPIO PIN_CFG(128, GPIO)
360#define GPIO128_MC2_CLK PIN_CFG_INPUT(128, ALT_A, PULLUP)
361#define GPIO128_SM_CKO PIN_CFG(128, ALT_B)
362
363#define GPIO129_GPIO PIN_CFG(129, GPIO)
364#define GPIO129_MC2_CMD PIN_CFG_INPUT(129, ALT_A, PULLUP)
365#define GPIO129_SM_WAIT0n PIN_CFG(129, ALT_B)
366
367#define GPIO130_GPIO PIN_CFG(130, GPIO)
368#define GPIO130_MC2_FBCLK PIN_CFG_INPUT(130, ALT_A, PULLUP)
369#define GPIO130_SM_FBCLK PIN_CFG(130, ALT_B)
370#define GPIO130_MC2_RSTN PIN_CFG(130, ALT_C)
371
372#define GPIO131_GPIO PIN_CFG(131, GPIO)
373#define GPIO131_MC2_DAT0 PIN_CFG_INPUT(131, ALT_A, PULLUP)
374#define GPIO131_SM_ADQ8 PIN_CFG(131, ALT_B)
375
376#define GPIO132_GPIO PIN_CFG(132, GPIO)
377#define GPIO132_MC2_DAT1 PIN_CFG_INPUT(132, ALT_A, PULLUP)
378#define GPIO132_SM_ADQ9 PIN_CFG(132, ALT_B)
379
380#define GPIO133_GPIO PIN_CFG(133, GPIO)
381#define GPIO133_MC2_DAT2 PIN_CFG_INPUT(133, ALT_A, PULLUP)
382#define GPIO133_SM_ADQ10 PIN_CFG(133, ALT_B)
383
384#define GPIO134_GPIO PIN_CFG(134, GPIO)
385#define GPIO134_MC2_DAT3 PIN_CFG_INPUT(134, ALT_A, PULLUP)
386#define GPIO134_SM_ADQ11 PIN_CFG(134, ALT_B)
387
388#define GPIO135_GPIO PIN_CFG(135, GPIO)
389#define GPIO135_MC2_DAT4 PIN_CFG_INPUT(135, ALT_A, PULLUP)
390#define GPIO135_SM_ADQ12 PIN_CFG(135, ALT_B)
391
392#define GPIO136_GPIO PIN_CFG(136, GPIO)
393#define GPIO136_MC2_DAT5 PIN_CFG_INPUT(136, ALT_A, PULLUP)
394#define GPIO136_SM_ADQ13 PIN_CFG(136, ALT_B)
395
396#define GPIO137_GPIO PIN_CFG(137, GPIO)
397#define GPIO137_MC2_DAT6 PIN_CFG_INPUT(137, ALT_A, PULLUP)
398#define GPIO137_SM_ADQ14 PIN_CFG(137, ALT_B)
399
400#define GPIO138_GPIO PIN_CFG(138, GPIO)
401#define GPIO138_MC2_DAT7 PIN_CFG_INPUT(138, ALT_A, PULLUP)
402#define GPIO138_SM_ADQ15 PIN_CFG(138, ALT_B)
403
404#define GPIO139_GPIO PIN_CFG(139, GPIO)
405#define GPIO139_SSP1_RXD PIN_CFG(139, ALT_A)
406#define GPIO139_SM_WAIT1n PIN_CFG(139, ALT_B)
407#define GPIO139_KP_O8 PIN_CFG(139, ALT_C)
408
409#define GPIO140_GPIO PIN_CFG(140, GPIO)
410#define GPIO140_SSP1_TXD PIN_CFG(140, ALT_A)
411#define GPIO140_IP_GPIO7 PIN_CFG(140, ALT_B)
412#define GPIO140_KP_SKA1 PIN_CFG(140, ALT_C)
413
414#define GPIO141_GPIO PIN_CFG(141, GPIO)
415#define GPIO141_SSP1_CLK PIN_CFG(141, ALT_A)
416#define GPIO141_IP_GPIO2 PIN_CFG(141, ALT_B)
417#define GPIO141_KP_O9 PIN_CFG(141, ALT_C)
418
419#define GPIO142_GPIO PIN_CFG(142, GPIO)
420#define GPIO142_SSP1_FRM PIN_CFG(142, ALT_A)
421#define GPIO142_IP_GPIO3 PIN_CFG(142, ALT_B)
422#define GPIO142_KP_SKB1 PIN_CFG(142, ALT_C)
423
424#define GPIO143_GPIO PIN_CFG(143, GPIO)
425#define GPIO143_SSP0_CLK PIN_CFG(143, ALT_A)
426
427#define GPIO144_GPIO PIN_CFG(144, GPIO)
428#define GPIO144_SSP0_FRM PIN_CFG(144, ALT_A)
429
430#define GPIO145_GPIO PIN_CFG(145, GPIO)
431#define GPIO145_SSP0_RXD PIN_CFG(145, ALT_A)
432
433#define GPIO146_GPIO PIN_CFG(146, GPIO)
434#define GPIO146_SSP0_TXD PIN_CFG(146, ALT_A)
435
436#define GPIO147_GPIO PIN_CFG(147, GPIO)
437#define GPIO147_I2C0_SCL PIN_CFG(147, ALT_A)
438
439#define GPIO148_GPIO PIN_CFG(148, GPIO)
440#define GPIO148_I2C0_SDA PIN_CFG(148, ALT_A)
441
442#define GPIO149_GPIO PIN_CFG(149, GPIO)
443#define GPIO149_IP_GPIO0 PIN_CFG(149, ALT_A)
444#define GPIO149_SM_CS1n PIN_CFG(149, ALT_B)
445#define GPIO149_SM_PS1n PIN_CFG(149, ALT_C)
446
447#define GPIO150_GPIO PIN_CFG(150, GPIO)
448#define GPIO150_IP_GPIO1 PIN_CFG(150, ALT_A)
449#define GPIO150_LCDA_CLK PIN_CFG(150, ALT_B)
450
451#define GPIO151_GPIO PIN_CFG(151, GPIO)
452#define GPIO151_KP_SKA0 PIN_CFG(151, ALT_A)
453#define GPIO151_LCD_VSI0 PIN_CFG(151, ALT_B)
454#define GPIO151_KP_O8 PIN_CFG(151, ALT_C)
455
456#define GPIO152_GPIO PIN_CFG(152, GPIO)
457#define GPIO152_KP_SKB0 PIN_CFG(152, ALT_A)
458#define GPIO152_LCD_VSI1 PIN_CFG(152, ALT_B)
459#define GPIO152_KP_O9 PIN_CFG(152, ALT_C)
460
461#define GPIO153_GPIO PIN_CFG(153, GPIO)
462#define GPIO153_KP_I7 PIN_CFG(153, ALT_A)
463#define GPIO153_LCD_D24 PIN_CFG(153, ALT_B)
464#define GPIO153_U2_RXD PIN_CFG(153, ALT_C)
465
466#define GPIO154_GPIO PIN_CFG(154, GPIO)
467#define GPIO154_KP_I6 PIN_CFG(154, ALT_A)
468#define GPIO154_LCD_D25 PIN_CFG(154, ALT_B)
469#define GPIO154_U2_TXD PIN_CFG(154, ALT_C)
470
471#define GPIO155_GPIO PIN_CFG(155, GPIO)
472#define GPIO155_KP_I5 PIN_CFG(155, ALT_A)
473#define GPIO155_LCD_D26 PIN_CFG(155, ALT_B)
474#define GPIO155_STMAPE_CLK PIN_CFG(155, ALT_C)
475
476#define GPIO156_GPIO PIN_CFG(156, GPIO)
477#define GPIO156_KP_I4 PIN_CFG(156, ALT_A)
478#define GPIO156_LCD_D27 PIN_CFG(156, ALT_B)
479#define GPIO156_STMAPE_DAT3 PIN_CFG(156, ALT_C)
480
481#define GPIO157_GPIO PIN_CFG(157, GPIO)
482#define GPIO157_KP_O7 PIN_CFG(157, ALT_A)
483#define GPIO157_LCD_D28 PIN_CFG(157, ALT_B)
484#define GPIO157_STMAPE_DAT2 PIN_CFG(157, ALT_C)
485
486#define GPIO158_GPIO PIN_CFG(158, GPIO)
487#define GPIO158_KP_O6 PIN_CFG(158, ALT_A)
488#define GPIO158_LCD_D29 PIN_CFG(158, ALT_B)
489#define GPIO158_STMAPE_DAT1 PIN_CFG(158, ALT_C)
490
491#define GPIO159_GPIO PIN_CFG(159, GPIO)
492#define GPIO159_KP_O5 PIN_CFG(159, ALT_A)
493#define GPIO159_LCD_D30 PIN_CFG(159, ALT_B)
494#define GPIO159_STMAPE_DAT0 PIN_CFG(159, ALT_C)
495
496#define GPIO160_GPIO PIN_CFG(160, GPIO)
497#define GPIO160_KP_O4 PIN_CFG(160, ALT_A)
498#define GPIO160_LCD_D31 PIN_CFG(160, ALT_B)
499#define GPIO160_NONE PIN_CFG(160, ALT_C)
500
501#define GPIO161_GPIO PIN_CFG(161, GPIO)
502#define GPIO161_KP_I3 PIN_CFG(161, ALT_A)
503#define GPIO161_LCD_D32 PIN_CFG(161, ALT_B)
504#define GPIO161_UARTMOD_RXD PIN_CFG(161, ALT_C)
505
506#define GPIO162_GPIO PIN_CFG(162, GPIO)
507#define GPIO162_KP_I2 PIN_CFG(162, ALT_A)
508#define GPIO162_LCD_D33 PIN_CFG(162, ALT_B)
509#define GPIO162_UARTMOD_TXD PIN_CFG(162, ALT_C)
510
511#define GPIO163_GPIO PIN_CFG(163, GPIO)
512#define GPIO163_KP_I1 PIN_CFG(163, ALT_A)
513#define GPIO163_LCD_D34 PIN_CFG(163, ALT_B)
514#define GPIO163_STMMOD_CLK PIN_CFG(163, ALT_C)
515
516#define GPIO164_GPIO PIN_CFG(164, GPIO)
517#define GPIO164_KP_I0 PIN_CFG(164, ALT_A)
518#define GPIO164_LCD_D35 PIN_CFG(164, ALT_B)
519#define GPIO164_STMMOD_DAT3 PIN_CFG(164, ALT_C)
520
521#define GPIO165_GPIO PIN_CFG(165, GPIO)
522#define GPIO165_KP_O3 PIN_CFG(165, ALT_A)
523#define GPIO165_LCD_D36 PIN_CFG(165, ALT_B)
524#define GPIO165_STMMOD_DAT2 PIN_CFG(165, ALT_C)
525
526#define GPIO166_GPIO PIN_CFG(166, GPIO)
527#define GPIO166_KP_O2 PIN_CFG(166, ALT_A)
528#define GPIO166_LCD_D37 PIN_CFG(166, ALT_B)
529#define GPIO166_STMMOD_DAT1 PIN_CFG(166, ALT_C)
530
531#define GPIO167_GPIO PIN_CFG(167, GPIO)
532#define GPIO167_KP_O1 PIN_CFG(167, ALT_A)
533#define GPIO167_LCD_D38 PIN_CFG(167, ALT_B)
534#define GPIO167_STMMOD_DAT0 PIN_CFG(167, ALT_C)
535
536#define GPIO168_GPIO PIN_CFG(168, GPIO)
537#define GPIO168_KP_O0 PIN_CFG(168, ALT_A)
538#define GPIO168_LCD_D39 PIN_CFG(168, ALT_B)
539#define GPIO168_NONE PIN_CFG(168, ALT_C)
540
541#define GPIO169_GPIO PIN_CFG(169, GPIO)
542#define GPIO169_RF_PURn PIN_CFG(169, ALT_A)
543#define GPIO169_LCDA_DE PIN_CFG(169, ALT_B)
544#define GPIO169_USBSIM_PDC PIN_CFG(169, ALT_C)
545
546#define GPIO170_GPIO PIN_CFG(170, GPIO)
547#define GPIO170_MODEM_STATE PIN_CFG(170, ALT_A)
548#define GPIO170_LCDA_VSO PIN_CFG(170, ALT_B)
549#define GPIO170_KP_SKA1 PIN_CFG(170, ALT_C)
550
551#define GPIO171_GPIO PIN_CFG(171, GPIO)
552#define GPIO171_MODEM_PWREN PIN_CFG(171, ALT_A)
553#define GPIO171_LCDA_HSO PIN_CFG(171, ALT_B)
554#define GPIO171_KP_SKB1 PIN_CFG(171, ALT_C)
555
556#define GPIO192_GPIO PIN_CFG(192, GPIO)
557#define GPIO192_MSP2_SCK PIN_CFG(192, ALT_A)
558
559#define GPIO193_GPIO PIN_CFG(193, GPIO)
560#define GPIO193_MSP2_TXD PIN_CFG(193, ALT_A)
561
562#define GPIO194_GPIO PIN_CFG(194, GPIO)
563#define GPIO194_MSP2_TCK PIN_CFG(194, ALT_A)
564
565#define GPIO195_GPIO PIN_CFG(195, GPIO)
566#define GPIO195_MSP2_TFS PIN_CFG(195, ALT_A)
567
568#define GPIO196_GPIO PIN_CFG(196, GPIO)
569#define GPIO196_MSP2_RXD PIN_CFG(196, ALT_A)
570
571#define GPIO197_GPIO PIN_CFG(197, GPIO)
572#define GPIO197_MC4_DAT3 PIN_CFG_INPUT(197, ALT_A, PULLUP)
573
574#define GPIO198_GPIO PIN_CFG(198, GPIO)
575#define GPIO198_MC4_DAT2 PIN_CFG_INPUT(198, ALT_A, PULLUP)
576
577#define GPIO199_GPIO PIN_CFG(199, GPIO)
578#define GPIO199_MC4_DAT1 PIN_CFG_INPUT(199, ALT_A, PULLUP)
579
580#define GPIO200_GPIO PIN_CFG(200, GPIO)
581#define GPIO200_MC4_DAT0 PIN_CFG_INPUT(200, ALT_A, PULLUP)
582
583#define GPIO201_GPIO PIN_CFG(201, GPIO)
584#define GPIO201_MC4_CMD PIN_CFG_INPUT(201, ALT_A, PULLUP)
585
586#define GPIO202_GPIO PIN_CFG(202, GPIO)
587#define GPIO202_MC4_FBCLK PIN_CFG_INPUT(202, ALT_A, PULLUP)
588#define GPIO202_PWL PIN_CFG(202, ALT_B)
589#define GPIO202_MC4_RSTN PIN_CFG(202, ALT_C)
590
591#define GPIO203_GPIO PIN_CFG(203, GPIO)
592#define GPIO203_MC4_CLK PIN_CFG_INPUT(203, ALT_A, PULLUP)
593
594#define GPIO204_GPIO PIN_CFG(204, GPIO)
595#define GPIO204_MC4_DAT7 PIN_CFG_INPUT(204, ALT_A, PULLUP)
596
597#define GPIO205_GPIO PIN_CFG(205, GPIO)
598#define GPIO205_MC4_DAT6 PIN_CFG_INPUT(205, ALT_A, PULLUP)
599
600#define GPIO206_GPIO PIN_CFG(206, GPIO)
601#define GPIO206_MC4_DAT5 PIN_CFG_INPUT(206, ALT_A, PULLUP)
602
603#define GPIO207_GPIO PIN_CFG(207, GPIO)
604#define GPIO207_MC4_DAT4 PIN_CFG_INPUT(207, ALT_A, PULLUP)
605
606#define GPIO208_GPIO PIN_CFG(208, GPIO)
607#define GPIO208_MC1_CLK PIN_CFG(208, ALT_A)
608
609#define GPIO209_GPIO PIN_CFG(209, GPIO)
610#define GPIO209_MC1_FBCLK PIN_CFG(209, ALT_A)
611#define GPIO209_SPI1_CLK PIN_CFG(209, ALT_B)
612
613#define GPIO210_GPIO PIN_CFG(210, GPIO)
614#define GPIO210_MC1_CMD PIN_CFG(210, ALT_A)
615
616#define GPIO211_GPIO PIN_CFG(211, GPIO)
617#define GPIO211_MC1_DAT0 PIN_CFG(211, ALT_A)
618
619#define GPIO212_GPIO PIN_CFG(212, GPIO)
620#define GPIO212_MC1_DAT1 PIN_CFG(212, ALT_A)
621#define GPIO212_SPI1_FRM PIN_CFG(212, ALT_B)
622
623#define GPIO213_GPIO PIN_CFG(213, GPIO)
624#define GPIO213_MC1_DAT2 PIN_CFG(213, ALT_A)
625#define GPIO213_SPI1_TXD PIN_CFG(213, ALT_B)
626
627#define GPIO214_GPIO PIN_CFG(214, GPIO)
628#define GPIO214_MC1_DAT3 PIN_CFG(214, ALT_A)
629#define GPIO214_SPI1_RXD PIN_CFG(214, ALT_B)
630
631#define GPIO215_GPIO PIN_CFG(215, GPIO)
632#define GPIO215_MC1_CMDDIR PIN_CFG(215, ALT_A)
633#define GPIO215_MC3_DAT2DIR PIN_CFG(215, ALT_B)
634#define GPIO215_CLKOUT1 PIN_CFG(215, ALT_C)
635#define GPIO215_SPI2_TXD PIN_CFG(215, ALT_C)
636
637#define GPIO216_GPIO PIN_CFG(216, GPIO)
638#define GPIO216_MC1_DAT2DIR PIN_CFG(216, ALT_A)
639#define GPIO216_MC3_CMDDIR PIN_CFG(216, ALT_B)
640#define GPIO216_I2C3_SDA PIN_CFG(216, ALT_C)
641#define GPIO216_SPI2_FRM PIN_CFG(216, ALT_C)
642
643#define GPIO217_GPIO PIN_CFG(217, GPIO)
644#define GPIO217_MC1_DAT0DIR PIN_CFG(217, ALT_A)
645#define GPIO217_MC3_DAT31DIR PIN_CFG(217, ALT_B)
646#define GPIO217_CLKOUT2 PIN_CFG(217, ALT_C)
647#define GPIO217_SPI2_CLK PIN_CFG(217, ALT_C)
648
649#define GPIO218_GPIO PIN_CFG(218, GPIO)
650#define GPIO218_MC1_DAT31DIR PIN_CFG(218, ALT_A)
651#define GPIO218_MC3_DAT0DIR PIN_CFG(218, ALT_B)
652#define GPIO218_I2C3_SCL PIN_CFG(218, ALT_C)
653#define GPIO218_SPI2_RXD PIN_CFG(218, ALT_C)
654
655#define GPIO219_GPIO PIN_CFG(219, GPIO)
656#define GPIO219_HSIR_FLA0 PIN_CFG(219, ALT_A)
657#define GPIO219_MC3_CLK PIN_CFG(219, ALT_B)
658
659#define GPIO220_GPIO PIN_CFG(220, GPIO)
660#define GPIO220_HSIR_DAT0 PIN_CFG(220, ALT_A)
661#define GPIO220_MC3_FBCLK PIN_CFG(220, ALT_B)
662#define GPIO220_SPI0_CLK PIN_CFG(220, ALT_C)
663
664#define GPIO221_GPIO PIN_CFG(221, GPIO)
665#define GPIO221_HSIR_RDY0 PIN_CFG(221, ALT_A)
666#define GPIO221_MC3_CMD PIN_CFG(221, ALT_B)
667
668#define GPIO222_GPIO PIN_CFG(222, GPIO)
669#define GPIO222_HSIT_FLA0 PIN_CFG(222, ALT_A)
670#define GPIO222_MC3_DAT0 PIN_CFG(222, ALT_B)
671
672#define GPIO223_GPIO PIN_CFG(223, GPIO)
673#define GPIO223_HSIT_DAT0 PIN_CFG(223, ALT_A)
674#define GPIO223_MC3_DAT1 PIN_CFG(223, ALT_B)
675#define GPIO223_SPI0_FRM PIN_CFG(223, ALT_C)
676
677#define GPIO224_GPIO PIN_CFG(224, GPIO)
678#define GPIO224_HSIT_RDY0 PIN_CFG(224, ALT_A)
679#define GPIO224_MC3_DAT2 PIN_CFG(224, ALT_B)
680#define GPIO224_SPI0_TXD PIN_CFG(224, ALT_C)
681
682#define GPIO225_GPIO PIN_CFG(225, GPIO)
683#define GPIO225_HSIT_CAWAKE0 PIN_CFG(225, ALT_A)
684#define GPIO225_MC3_DAT3 PIN_CFG(225, ALT_B)
685#define GPIO225_SPI0_RXD PIN_CFG(225, ALT_C)
686
687#define GPIO226_GPIO PIN_CFG(226, GPIO)
688#define GPIO226_HSIT_ACWAKE0 PIN_CFG(226, ALT_A)
689#define GPIO226_PWL PIN_CFG(226, ALT_B)
690#define GPIO226_USBSIM_PDC PIN_CFG(226, ALT_C)
691
692#define GPIO227_GPIO PIN_CFG(227, GPIO)
693#define GPIO227_CLKOUT1 PIN_CFG(227, ALT_A)
694
695#define GPIO228_GPIO PIN_CFG(228, GPIO)
696#define GPIO228_CLKOUT2 PIN_CFG(228, ALT_A)
697
698#define GPIO229_GPIO PIN_CFG(229, GPIO)
699#define GPIO229_CLKOUT1 PIN_CFG(229, ALT_A)
700#define GPIO229_PWL PIN_CFG(229, ALT_B)
701#define GPIO229_I2C3_SDA PIN_CFG(229, ALT_C)
702
703#define GPIO230_GPIO PIN_CFG(230, GPIO)
704#define GPIO230_CLKOUT2 PIN_CFG(230, ALT_A)
705#define GPIO230_PWL PIN_CFG(230, ALT_B)
706#define GPIO230_I2C3_SCL PIN_CFG(230, ALT_C)
707
708#define GPIO256_GPIO PIN_CFG(256, GPIO)
709#define GPIO256_USB_NXT PIN_CFG(256, ALT_A)
710
711#define GPIO257_GPIO PIN_CFG(257, GPIO)
712#define GPIO257_USB_STP PIN_CFG(257, ALT_A)
713
714#define GPIO258_GPIO PIN_CFG(258, GPIO)
715#define GPIO258_USB_XCLK PIN_CFG(258, ALT_A)
716#define GPIO258_NONE PIN_CFG(258, ALT_B)
717#define GPIO258_DDR_TRIG PIN_CFG(258, ALT_C)
718
719#define GPIO259_GPIO PIN_CFG(259, GPIO)
720#define GPIO259_USB_DIR PIN_CFG(259, ALT_A)
721
722#define GPIO260_GPIO PIN_CFG(260, GPIO)
723#define GPIO260_USB_DAT7 PIN_CFG(260, ALT_A)
724
725#define GPIO261_GPIO PIN_CFG(261, GPIO)
726#define GPIO261_USB_DAT6 PIN_CFG(261, ALT_A)
727
728#define GPIO262_GPIO PIN_CFG(262, GPIO)
729#define GPIO262_USB_DAT5 PIN_CFG(262, ALT_A)
730
731#define GPIO263_GPIO PIN_CFG(263, GPIO)
732#define GPIO263_USB_DAT4 PIN_CFG(263, ALT_A)
733
734#define GPIO264_GPIO PIN_CFG(264, GPIO)
735#define GPIO264_USB_DAT3 PIN_CFG(264, ALT_A)
736
737#define GPIO265_GPIO PIN_CFG(265, GPIO)
738#define GPIO265_USB_DAT2 PIN_CFG(265, ALT_A)
739
740#define GPIO266_GPIO PIN_CFG(266, GPIO)
741#define GPIO266_USB_DAT1 PIN_CFG(266, ALT_A)
742
743#define GPIO267_GPIO PIN_CFG(267, GPIO)
744#define GPIO267_USB_DAT0 PIN_CFG(267, ALT_A)
745
746#endif
diff --git a/arch/arm/mach-ux500/setup.h b/arch/arm/mach-ux500/setup.h
index cad3ca86c540..656324aad18e 100644
--- a/arch/arm/mach-ux500/setup.h
+++ b/arch/arm/mach-ux500/setup.h
@@ -11,10 +11,13 @@
11#ifndef __ASM_ARCH_SETUP_H 11#ifndef __ASM_ARCH_SETUP_H
12#define __ASM_ARCH_SETUP_H 12#define __ASM_ARCH_SETUP_H
13 13
14#include <asm/mach/arch.h>
14#include <asm/mach/time.h> 15#include <asm/mach/time.h>
15#include <linux/init.h> 16#include <linux/init.h>
16#include <linux/mfd/abx500/ab8500.h> 17#include <linux/mfd/abx500/ab8500.h>
17 18
19void ux500_restart(enum reboot_mode mode, const char *cmd);
20
18void __init ux500_map_io(void); 21void __init ux500_map_io(void);
19extern void __init u8500_map_io(void); 22extern void __init u8500_map_io(void);
20 23
diff --git a/arch/arm/mach-versatile/include/mach/debug-macro.S b/arch/arm/mach-versatile/include/mach/debug-macro.S
deleted file mode 100644
index d0fbd7f1cb00..000000000000
--- a/arch/arm/mach-versatile/include/mach/debug-macro.S
+++ /dev/null
@@ -1,21 +0,0 @@
1/* arch/arm/mach-versatile/include/mach/debug-macro.S
2 *
3 * Debugging macro include header
4 *
5 * Copyright (C) 1994-1999 Russell King
6 * Moved from linux/arch/arm/kernel/debug.S by Ben Dooks
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 *
12*/
13
14 .macro addruart, rp, rv, tmp
15 mov \rp, #0x001F0000
16 orr \rp, \rp, #0x00001000
17 orr \rv, \rp, #0xf1000000 @ virtual base
18 orr \rp, \rp, #0x10000000 @ physical base
19 .endm
20
21#include <asm/hardware/debug-pl01x.S>
diff --git a/arch/arm/mach-versatile/include/mach/platform.h b/arch/arm/mach-versatile/include/mach/platform.h
index ec087407b163..6f938ccb0c54 100644
--- a/arch/arm/mach-versatile/include/mach/platform.h
+++ b/arch/arm/mach-versatile/include/mach/platform.h
@@ -231,12 +231,14 @@
231/* PCI space */ 231/* PCI space */
232#define VERSATILE_PCI_BASE 0x41000000 /* PCI Interface */ 232#define VERSATILE_PCI_BASE 0x41000000 /* PCI Interface */
233#define VERSATILE_PCI_CFG_BASE 0x42000000 233#define VERSATILE_PCI_CFG_BASE 0x42000000
234#define VERSATILE_PCI_IO_BASE 0x43000000
234#define VERSATILE_PCI_MEM_BASE0 0x44000000 235#define VERSATILE_PCI_MEM_BASE0 0x44000000
235#define VERSATILE_PCI_MEM_BASE1 0x50000000 236#define VERSATILE_PCI_MEM_BASE1 0x50000000
236#define VERSATILE_PCI_MEM_BASE2 0x60000000 237#define VERSATILE_PCI_MEM_BASE2 0x60000000
237/* Sizes of above maps */ 238/* Sizes of above maps */
238#define VERSATILE_PCI_BASE_SIZE 0x01000000 239#define VERSATILE_PCI_BASE_SIZE 0x01000000
239#define VERSATILE_PCI_CFG_BASE_SIZE 0x02000000 240#define VERSATILE_PCI_CFG_BASE_SIZE 0x02000000
241#define VERSATILE_PCI_IO_BASE_SIZE 0x01000000
240#define VERSATILE_PCI_MEM_BASE0_SIZE 0x0c000000 /* 32Mb */ 242#define VERSATILE_PCI_MEM_BASE0_SIZE 0x0c000000 /* 32Mb */
241#define VERSATILE_PCI_MEM_BASE1_SIZE 0x10000000 /* 256Mb */ 243#define VERSATILE_PCI_MEM_BASE1_SIZE 0x10000000 /* 256Mb */
242#define VERSATILE_PCI_MEM_BASE2_SIZE 0x10000000 /* 256Mb */ 244#define VERSATILE_PCI_MEM_BASE2_SIZE 0x10000000 /* 256Mb */
diff --git a/arch/arm/mach-versatile/pci.c b/arch/arm/mach-versatile/pci.c
index e92e5e0705bc..c97be4ea76d2 100644
--- a/arch/arm/mach-versatile/pci.c
+++ b/arch/arm/mach-versatile/pci.c
@@ -43,9 +43,9 @@
43#define PCI_IMAP0 __IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x0) 43#define PCI_IMAP0 __IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x0)
44#define PCI_IMAP1 __IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x4) 44#define PCI_IMAP1 __IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x4)
45#define PCI_IMAP2 __IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x8) 45#define PCI_IMAP2 __IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x8)
46#define PCI_SMAP0 __IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x10) 46#define PCI_SMAP0 __IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x14)
47#define PCI_SMAP1 __IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x14) 47#define PCI_SMAP1 __IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x18)
48#define PCI_SMAP2 __IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x18) 48#define PCI_SMAP2 __IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x1c)
49#define PCI_SELFID __IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0xc) 49#define PCI_SELFID __IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0xc)
50 50
51#define DEVICE_ID_OFFSET 0x00 51#define DEVICE_ID_OFFSET 0x00
@@ -170,8 +170,8 @@ static struct pci_ops pci_versatile_ops = {
170 .write = versatile_write_config, 170 .write = versatile_write_config,
171}; 171};
172 172
173static struct resource io_mem = { 173static struct resource unused_mem = {
174 .name = "PCI I/O space", 174 .name = "PCI unused",
175 .start = VERSATILE_PCI_MEM_BASE0, 175 .start = VERSATILE_PCI_MEM_BASE0,
176 .end = VERSATILE_PCI_MEM_BASE0+VERSATILE_PCI_MEM_BASE0_SIZE-1, 176 .end = VERSATILE_PCI_MEM_BASE0+VERSATILE_PCI_MEM_BASE0_SIZE-1,
177 .flags = IORESOURCE_MEM, 177 .flags = IORESOURCE_MEM,
@@ -195,9 +195,9 @@ static int __init pci_versatile_setup_resources(struct pci_sys_data *sys)
195{ 195{
196 int ret = 0; 196 int ret = 0;
197 197
198 ret = request_resource(&iomem_resource, &io_mem); 198 ret = request_resource(&iomem_resource, &unused_mem);
199 if (ret) { 199 if (ret) {
200 printk(KERN_ERR "PCI: unable to allocate I/O " 200 printk(KERN_ERR "PCI: unable to allocate unused "
201 "memory region (%d)\n", ret); 201 "memory region (%d)\n", ret);
202 goto out; 202 goto out;
203 } 203 }
@@ -205,7 +205,7 @@ static int __init pci_versatile_setup_resources(struct pci_sys_data *sys)
205 if (ret) { 205 if (ret) {
206 printk(KERN_ERR "PCI: unable to allocate non-prefetchable " 206 printk(KERN_ERR "PCI: unable to allocate non-prefetchable "
207 "memory region (%d)\n", ret); 207 "memory region (%d)\n", ret);
208 goto release_io_mem; 208 goto release_unused_mem;
209 } 209 }
210 ret = request_resource(&iomem_resource, &pre_mem); 210 ret = request_resource(&iomem_resource, &pre_mem);
211 if (ret) { 211 if (ret) {
@@ -225,8 +225,8 @@ static int __init pci_versatile_setup_resources(struct pci_sys_data *sys)
225 225
226 release_non_mem: 226 release_non_mem:
227 release_resource(&non_mem); 227 release_resource(&non_mem);
228 release_io_mem: 228 release_unused_mem:
229 release_resource(&io_mem); 229 release_resource(&unused_mem);
230 out: 230 out:
231 return ret; 231 return ret;
232} 232}
@@ -246,7 +246,7 @@ int __init pci_versatile_setup(int nr, struct pci_sys_data *sys)
246 goto out; 246 goto out;
247 } 247 }
248 248
249 ret = pci_ioremap_io(0, VERSATILE_PCI_MEM_BASE0); 249 ret = pci_ioremap_io(0, VERSATILE_PCI_IO_BASE);
250 if (ret) 250 if (ret)
251 goto out; 251 goto out;
252 252
@@ -295,6 +295,19 @@ int __init pci_versatile_setup(int nr, struct pci_sys_data *sys)
295 __raw_writel(PHYS_OFFSET, local_pci_cfg_base + PCI_BASE_ADDRESS_2); 295 __raw_writel(PHYS_OFFSET, local_pci_cfg_base + PCI_BASE_ADDRESS_2);
296 296
297 /* 297 /*
298 * For many years the kernel and QEMU were symbiotically buggy
299 * in that they both assumed the same broken IRQ mapping.
300 * QEMU therefore attempts to auto-detect old broken kernels
301 * so that they still work on newer QEMU as they did on old
302 * QEMU. Since we now use the correct (ie matching-hardware)
303 * IRQ mapping we write a definitely different value to a
304 * PCI_INTERRUPT_LINE register to tell QEMU that we expect
305 * real hardware behaviour and it need not be backwards
306 * compatible for us. This write is harmless on real hardware.
307 */
308 __raw_writel(0, VERSATILE_PCI_VIRT_BASE+PCI_INTERRUPT_LINE);
309
310 /*
298 * Do not to map Versatile FPGA PCI device into memory space 311 * Do not to map Versatile FPGA PCI device into memory space
299 */ 312 */
300 pci_slot_ignore |= (1 << myslot); 313 pci_slot_ignore |= (1 << myslot);
@@ -327,13 +340,13 @@ static int __init versatile_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
327{ 340{
328 int irq; 341 int irq;
329 342
330 /* slot, pin, irq 343 /*
331 * 24 1 IRQ_SIC_PCI0 344 * Slot INTA INTB INTC INTD
332 * 25 1 IRQ_SIC_PCI1 345 * 31 PCI1 PCI2 PCI3 PCI0
333 * 26 1 IRQ_SIC_PCI2 346 * 30 PCI0 PCI1 PCI2 PCI3
334 * 27 1 IRQ_SIC_PCI3 347 * 29 PCI3 PCI0 PCI1 PCI2
335 */ 348 */
336 irq = IRQ_SIC_PCI0 + ((slot - 24 + pin - 1) & 3); 349 irq = IRQ_SIC_PCI0 + ((slot + 2 + pin - 1) & 3);
337 350
338 return irq; 351 return irq;
339} 352}
diff --git a/arch/arm/mach-vexpress/Kconfig b/arch/arm/mach-vexpress/Kconfig
index b8bbabec6310..365795447804 100644
--- a/arch/arm/mach-vexpress/Kconfig
+++ b/arch/arm/mach-vexpress/Kconfig
@@ -10,7 +10,7 @@ config ARCH_VEXPRESS
10 select CPU_V7 10 select CPU_V7
11 select GENERIC_CLOCKEVENTS 11 select GENERIC_CLOCKEVENTS
12 select HAVE_ARM_SCU if SMP 12 select HAVE_ARM_SCU if SMP
13 select HAVE_ARM_TWD if LOCAL_TIMERS 13 select HAVE_ARM_TWD if SMP
14 select HAVE_CLK 14 select HAVE_CLK
15 select HAVE_PATA_PLATFORM 15 select HAVE_PATA_PLATFORM
16 select HAVE_SMP 16 select HAVE_SMP
@@ -66,4 +66,12 @@ config ARCH_VEXPRESS_DCSCB
66 This is needed to provide CPU and cluster power management 66 This is needed to provide CPU and cluster power management
67 on RTSM implementing big.LITTLE. 67 on RTSM implementing big.LITTLE.
68 68
69config ARCH_VEXPRESS_TC2_PM
70 bool "Versatile Express TC2 power management"
71 depends on MCPM
72 select ARM_CCI
73 help
74 Support for CPU and cluster power management on Versatile Express
75 with a TC2 (A15x2 A7x3) big.LITTLE core tile.
76
69endmenu 77endmenu
diff --git a/arch/arm/mach-vexpress/Makefile b/arch/arm/mach-vexpress/Makefile
index 48ba89a8149f..505e64ab3eae 100644
--- a/arch/arm/mach-vexpress/Makefile
+++ b/arch/arm/mach-vexpress/Makefile
@@ -7,5 +7,8 @@ ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/$(src)/include \
7obj-y := v2m.o 7obj-y := v2m.o
8obj-$(CONFIG_ARCH_VEXPRESS_CA9X4) += ct-ca9x4.o 8obj-$(CONFIG_ARCH_VEXPRESS_CA9X4) += ct-ca9x4.o
9obj-$(CONFIG_ARCH_VEXPRESS_DCSCB) += dcscb.o dcscb_setup.o 9obj-$(CONFIG_ARCH_VEXPRESS_DCSCB) += dcscb.o dcscb_setup.o
10CFLAGS_dcscb.o += -march=armv7-a
11obj-$(CONFIG_ARCH_VEXPRESS_TC2_PM) += tc2_pm.o spc.o
12CFLAGS_tc2_pm.o += -march=armv7-a
10obj-$(CONFIG_SMP) += platsmp.o 13obj-$(CONFIG_SMP) += platsmp.o
11obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o 14obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
diff --git a/arch/arm/mach-vexpress/dcscb.c b/arch/arm/mach-vexpress/dcscb.c
index 16d57a8a9d5a..3a6384c6c435 100644
--- a/arch/arm/mach-vexpress/dcscb.c
+++ b/arch/arm/mach-vexpress/dcscb.c
@@ -136,14 +136,35 @@ static void dcscb_power_down(void)
136 /* 136 /*
137 * Flush all cache levels for this cluster. 137 * Flush all cache levels for this cluster.
138 * 138 *
139 * A15/A7 can hit in the cache with SCTLR.C=0, so we don't need 139 * To do so we do:
140 * a preliminary flush here for those CPUs. At least, that's 140 * - Clear the SCTLR.C bit to prevent further cache allocations
141 * the theory -- without the extra flush, Linux explodes on 141 * - Flush the whole cache
142 * RTSM (to be investigated). 142 * - Clear the ACTLR "SMP" bit to disable local coherency
143 *
144 * Let's do it in the safest possible way i.e. with
145 * no memory access within the following sequence
146 * including to the stack.
147 *
148 * Note: fp is preserved to the stack explicitly prior doing
149 * this since adding it to the clobber list is incompatible
150 * with having CONFIG_FRAME_POINTER=y.
143 */ 151 */
144 flush_cache_all(); 152 asm volatile(
145 set_cr(get_cr() & ~CR_C); 153 "str fp, [sp, #-4]! \n\t"
146 flush_cache_all(); 154 "mrc p15, 0, r0, c1, c0, 0 @ get CR \n\t"
155 "bic r0, r0, #"__stringify(CR_C)" \n\t"
156 "mcr p15, 0, r0, c1, c0, 0 @ set CR \n\t"
157 "isb \n\t"
158 "bl v7_flush_dcache_all \n\t"
159 "clrex \n\t"
160 "mrc p15, 0, r0, c1, c0, 1 @ get AUXCR \n\t"
161 "bic r0, r0, #(1 << 6) @ disable local coherency \n\t"
162 "mcr p15, 0, r0, c1, c0, 1 @ set AUXCR \n\t"
163 "isb \n\t"
164 "dsb \n\t"
165 "ldr fp, [sp], #4"
166 : : : "r0","r1","r2","r3","r4","r5","r6","r7",
167 "r9","r10","lr","memory");
147 168
148 /* 169 /*
149 * This is a harmless no-op. On platforms with a real 170 * This is a harmless no-op. On platforms with a real
@@ -152,9 +173,6 @@ static void dcscb_power_down(void)
152 */ 173 */
153 outer_flush_all(); 174 outer_flush_all();
154 175
155 /* Disable local coherency by clearing the ACTLR "SMP" bit: */
156 set_auxcr(get_auxcr() & ~(1 << 6));
157
158 /* 176 /*
159 * Disable cluster-level coherency by masking 177 * Disable cluster-level coherency by masking
160 * incoming snoops and DVM messages: 178 * incoming snoops and DVM messages:
@@ -167,18 +185,24 @@ static void dcscb_power_down(void)
167 185
168 /* 186 /*
169 * Flush the local CPU cache. 187 * Flush the local CPU cache.
170 * 188 * Let's do it in the safest possible way as above.
171 * A15/A7 can hit in the cache with SCTLR.C=0, so we don't need
172 * a preliminary flush here for those CPUs. At least, that's
173 * the theory -- without the extra flush, Linux explodes on
174 * RTSM (to be investigated).
175 */ 189 */
176 flush_cache_louis(); 190 asm volatile(
177 set_cr(get_cr() & ~CR_C); 191 "str fp, [sp, #-4]! \n\t"
178 flush_cache_louis(); 192 "mrc p15, 0, r0, c1, c0, 0 @ get CR \n\t"
179 193 "bic r0, r0, #"__stringify(CR_C)" \n\t"
180 /* Disable local coherency by clearing the ACTLR "SMP" bit: */ 194 "mcr p15, 0, r0, c1, c0, 0 @ set CR \n\t"
181 set_auxcr(get_auxcr() & ~(1 << 6)); 195 "isb \n\t"
196 "bl v7_flush_dcache_louis \n\t"
197 "clrex \n\t"
198 "mrc p15, 0, r0, c1, c0, 1 @ get AUXCR \n\t"
199 "bic r0, r0, #(1 << 6) @ disable local coherency \n\t"
200 "mcr p15, 0, r0, c1, c0, 1 @ set AUXCR \n\t"
201 "isb \n\t"
202 "dsb \n\t"
203 "ldr fp, [sp], #4"
204 : : : "r0","r1","r2","r3","r4","r5","r6","r7",
205 "r9","r10","lr","memory");
182 } 206 }
183 207
184 __mcpm_cpu_down(cpu, cluster); 208 __mcpm_cpu_down(cpu, cluster);
diff --git a/arch/arm/mach-vexpress/spc.c b/arch/arm/mach-vexpress/spc.c
new file mode 100644
index 000000000000..eefb029197ca
--- /dev/null
+++ b/arch/arm/mach-vexpress/spc.c
@@ -0,0 +1,180 @@
1/*
2 * Versatile Express Serial Power Controller (SPC) support
3 *
4 * Copyright (C) 2013 ARM Ltd.
5 *
6 * Authors: Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
7 * Achin Gupta <achin.gupta@arm.com>
8 * Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 *
14 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
15 * kind, whether express or implied; without even the implied warranty
16 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 */
19
20#include <linux/err.h>
21#include <linux/io.h>
22#include <linux/slab.h>
23
24#include <asm/cacheflush.h>
25
26#define SPCLOG "vexpress-spc: "
27
28/* SPC wake-up IRQs status and mask */
29#define WAKE_INT_MASK 0x24
30#define WAKE_INT_RAW 0x28
31#define WAKE_INT_STAT 0x2c
32/* SPC power down registers */
33#define A15_PWRDN_EN 0x30
34#define A7_PWRDN_EN 0x34
35/* SPC per-CPU mailboxes */
36#define A15_BX_ADDR0 0x68
37#define A7_BX_ADDR0 0x78
38
39/* wake-up interrupt masks */
40#define GBL_WAKEUP_INT_MSK (0x3 << 10)
41
42/* TC2 static dual-cluster configuration */
43#define MAX_CLUSTERS 2
44
45struct ve_spc_drvdata {
46 void __iomem *baseaddr;
47 /*
48 * A15s cluster identifier
49 * It corresponds to A15 processors MPIDR[15:8] bitfield
50 */
51 u32 a15_clusid;
52};
53
54static struct ve_spc_drvdata *info;
55
56static inline bool cluster_is_a15(u32 cluster)
57{
58 return cluster == info->a15_clusid;
59}
60
61/**
62 * ve_spc_global_wakeup_irq()
63 *
64 * Function to set/clear global wakeup IRQs. Not protected by locking since
65 * it might be used in code paths where normal cacheable locks are not
66 * working. Locking must be provided by the caller to ensure atomicity.
67 *
68 * @set: if true, global wake-up IRQs are set, if false they are cleared
69 */
70void ve_spc_global_wakeup_irq(bool set)
71{
72 u32 reg;
73
74 reg = readl_relaxed(info->baseaddr + WAKE_INT_MASK);
75
76 if (set)
77 reg |= GBL_WAKEUP_INT_MSK;
78 else
79 reg &= ~GBL_WAKEUP_INT_MSK;
80
81 writel_relaxed(reg, info->baseaddr + WAKE_INT_MASK);
82}
83
84/**
85 * ve_spc_cpu_wakeup_irq()
86 *
87 * Function to set/clear per-CPU wake-up IRQs. Not protected by locking since
88 * it might be used in code paths where normal cacheable locks are not
89 * working. Locking must be provided by the caller to ensure atomicity.
90 *
91 * @cluster: mpidr[15:8] bitfield describing cluster affinity level
92 * @cpu: mpidr[7:0] bitfield describing cpu affinity level
93 * @set: if true, wake-up IRQs are set, if false they are cleared
94 */
95void ve_spc_cpu_wakeup_irq(u32 cluster, u32 cpu, bool set)
96{
97 u32 mask, reg;
98
99 if (cluster >= MAX_CLUSTERS)
100 return;
101
102 mask = 1 << cpu;
103
104 if (!cluster_is_a15(cluster))
105 mask <<= 4;
106
107 reg = readl_relaxed(info->baseaddr + WAKE_INT_MASK);
108
109 if (set)
110 reg |= mask;
111 else
112 reg &= ~mask;
113
114 writel_relaxed(reg, info->baseaddr + WAKE_INT_MASK);
115}
116
117/**
118 * ve_spc_set_resume_addr() - set the jump address used for warm boot
119 *
120 * @cluster: mpidr[15:8] bitfield describing cluster affinity level
121 * @cpu: mpidr[7:0] bitfield describing cpu affinity level
122 * @addr: physical resume address
123 */
124void ve_spc_set_resume_addr(u32 cluster, u32 cpu, u32 addr)
125{
126 void __iomem *baseaddr;
127
128 if (cluster >= MAX_CLUSTERS)
129 return;
130
131 if (cluster_is_a15(cluster))
132 baseaddr = info->baseaddr + A15_BX_ADDR0 + (cpu << 2);
133 else
134 baseaddr = info->baseaddr + A7_BX_ADDR0 + (cpu << 2);
135
136 writel_relaxed(addr, baseaddr);
137}
138
139/**
140 * ve_spc_powerdown()
141 *
142 * Function to enable/disable cluster powerdown. Not protected by locking
143 * since it might be used in code paths where normal cacheable locks are not
144 * working. Locking must be provided by the caller to ensure atomicity.
145 *
146 * @cluster: mpidr[15:8] bitfield describing cluster affinity level
147 * @enable: if true enables powerdown, if false disables it
148 */
149void ve_spc_powerdown(u32 cluster, bool enable)
150{
151 u32 pwdrn_reg;
152
153 if (cluster >= MAX_CLUSTERS)
154 return;
155
156 pwdrn_reg = cluster_is_a15(cluster) ? A15_PWRDN_EN : A7_PWRDN_EN;
157 writel_relaxed(enable, info->baseaddr + pwdrn_reg);
158}
159
160int __init ve_spc_init(void __iomem *baseaddr, u32 a15_clusid)
161{
162 info = kzalloc(sizeof(*info), GFP_KERNEL);
163 if (!info) {
164 pr_err(SPCLOG "unable to allocate mem\n");
165 return -ENOMEM;
166 }
167
168 info->baseaddr = baseaddr;
169 info->a15_clusid = a15_clusid;
170
171 /*
172 * Multi-cluster systems may need this data when non-coherent, during
173 * cluster power-up/power-down. Make sure driver info reaches main
174 * memory.
175 */
176 sync_cache_w(info);
177 sync_cache_w(&info);
178
179 return 0;
180}
diff --git a/arch/arm/mach-vexpress/spc.h b/arch/arm/mach-vexpress/spc.h
new file mode 100644
index 000000000000..5f7e4a446a17
--- /dev/null
+++ b/arch/arm/mach-vexpress/spc.h
@@ -0,0 +1,24 @@
1/*
2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License version 2 as
4 * published by the Free Software Foundation.
5 *
6 * This program is distributed in the hope that it will be useful,
7 * but WITHOUT ANY WARRANTY; without even the implied warranty of
8 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 * GNU General Public License for more details.
10 *
11 * Copyright (C) 2012 ARM Limited
12 */
13
14
15#ifndef __SPC_H_
16#define __SPC_H_
17
18int __init ve_spc_init(void __iomem *base, u32 a15_clusid);
19void ve_spc_global_wakeup_irq(bool set);
20void ve_spc_cpu_wakeup_irq(u32 cluster, u32 cpu, bool set);
21void ve_spc_set_resume_addr(u32 cluster, u32 cpu, u32 addr);
22void ve_spc_powerdown(u32 cluster, bool enable);
23
24#endif
diff --git a/arch/arm/mach-vexpress/tc2_pm.c b/arch/arm/mach-vexpress/tc2_pm.c
new file mode 100644
index 000000000000..7aeb5d60e484
--- /dev/null
+++ b/arch/arm/mach-vexpress/tc2_pm.c
@@ -0,0 +1,354 @@
1/*
2 * arch/arm/mach-vexpress/tc2_pm.c - TC2 power management support
3 *
4 * Created by: Nicolas Pitre, October 2012
5 * Copyright: (C) 2012-2013 Linaro Limited
6 *
7 * Some portions of this file were originally written by Achin Gupta
8 * Copyright: (C) 2012 ARM Limited
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 */
14
15#include <linux/init.h>
16#include <linux/io.h>
17#include <linux/kernel.h>
18#include <linux/of_address.h>
19#include <linux/spinlock.h>
20#include <linux/errno.h>
21#include <linux/irqchip/arm-gic.h>
22
23#include <asm/mcpm.h>
24#include <asm/proc-fns.h>
25#include <asm/cacheflush.h>
26#include <asm/cputype.h>
27#include <asm/cp15.h>
28
29#include <linux/arm-cci.h>
30
31#include "spc.h"
32
33/* SCC conf registers */
34#define A15_CONF 0x400
35#define A7_CONF 0x500
36#define SYS_INFO 0x700
37#define SPC_BASE 0xb00
38
39/*
40 * We can't use regular spinlocks. In the switcher case, it is possible
41 * for an outbound CPU to call power_down() after its inbound counterpart
42 * is already live using the same logical CPU number which trips lockdep
43 * debugging.
44 */
45static arch_spinlock_t tc2_pm_lock = __ARCH_SPIN_LOCK_UNLOCKED;
46
47#define TC2_CLUSTERS 2
48#define TC2_MAX_CPUS_PER_CLUSTER 3
49
50static unsigned int tc2_nr_cpus[TC2_CLUSTERS];
51
52/* Keep per-cpu usage count to cope with unordered up/down requests */
53static int tc2_pm_use_count[TC2_MAX_CPUS_PER_CLUSTER][TC2_CLUSTERS];
54
55#define tc2_cluster_unused(cluster) \
56 (!tc2_pm_use_count[0][cluster] && \
57 !tc2_pm_use_count[1][cluster] && \
58 !tc2_pm_use_count[2][cluster])
59
60static int tc2_pm_power_up(unsigned int cpu, unsigned int cluster)
61{
62 pr_debug("%s: cpu %u cluster %u\n", __func__, cpu, cluster);
63 if (cluster >= TC2_CLUSTERS || cpu >= tc2_nr_cpus[cluster])
64 return -EINVAL;
65
66 /*
67 * Since this is called with IRQs enabled, and no arch_spin_lock_irq
68 * variant exists, we need to disable IRQs manually here.
69 */
70 local_irq_disable();
71 arch_spin_lock(&tc2_pm_lock);
72
73 if (tc2_cluster_unused(cluster))
74 ve_spc_powerdown(cluster, false);
75
76 tc2_pm_use_count[cpu][cluster]++;
77 if (tc2_pm_use_count[cpu][cluster] == 1) {
78 ve_spc_set_resume_addr(cluster, cpu,
79 virt_to_phys(mcpm_entry_point));
80 ve_spc_cpu_wakeup_irq(cluster, cpu, true);
81 } else if (tc2_pm_use_count[cpu][cluster] != 2) {
82 /*
83 * The only possible values are:
84 * 0 = CPU down
85 * 1 = CPU (still) up
86 * 2 = CPU requested to be up before it had a chance
87 * to actually make itself down.
88 * Any other value is a bug.
89 */
90 BUG();
91 }
92
93 arch_spin_unlock(&tc2_pm_lock);
94 local_irq_enable();
95
96 return 0;
97}
98
99static void tc2_pm_down(u64 residency)
100{
101 unsigned int mpidr, cpu, cluster;
102 bool last_man = false, skip_wfi = false;
103
104 mpidr = read_cpuid_mpidr();
105 cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
106 cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
107
108 pr_debug("%s: cpu %u cluster %u\n", __func__, cpu, cluster);
109 BUG_ON(cluster >= TC2_CLUSTERS || cpu >= TC2_MAX_CPUS_PER_CLUSTER);
110
111 __mcpm_cpu_going_down(cpu, cluster);
112
113 arch_spin_lock(&tc2_pm_lock);
114 BUG_ON(__mcpm_cluster_state(cluster) != CLUSTER_UP);
115 tc2_pm_use_count[cpu][cluster]--;
116 if (tc2_pm_use_count[cpu][cluster] == 0) {
117 ve_spc_cpu_wakeup_irq(cluster, cpu, true);
118 if (tc2_cluster_unused(cluster)) {
119 ve_spc_powerdown(cluster, true);
120 ve_spc_global_wakeup_irq(true);
121 last_man = true;
122 }
123 } else if (tc2_pm_use_count[cpu][cluster] == 1) {
124 /*
125 * A power_up request went ahead of us.
126 * Even if we do not want to shut this CPU down,
127 * the caller expects a certain state as if the WFI
128 * was aborted. So let's continue with cache cleaning.
129 */
130 skip_wfi = true;
131 } else
132 BUG();
133
134 if (last_man && __mcpm_outbound_enter_critical(cpu, cluster)) {
135 arch_spin_unlock(&tc2_pm_lock);
136
137 if (read_cpuid_part_number() == ARM_CPU_PART_CORTEX_A15) {
138 /*
139 * On the Cortex-A15 we need to disable
140 * L2 prefetching before flushing the cache.
141 */
142 asm volatile(
143 "mcr p15, 1, %0, c15, c0, 3 \n\t"
144 "isb \n\t"
145 "dsb "
146 : : "r" (0x400) );
147 }
148
149 /*
150 * We need to disable and flush the whole (L1 and L2) cache.
151 * Let's do it in the safest possible way i.e. with
152 * no memory access within the following sequence
153 * including the stack.
154 *
155 * Note: fp is preserved to the stack explicitly prior doing
156 * this since adding it to the clobber list is incompatible
157 * with having CONFIG_FRAME_POINTER=y.
158 */
159 asm volatile(
160 "str fp, [sp, #-4]! \n\t"
161 "mrc p15, 0, r0, c1, c0, 0 @ get CR \n\t"
162 "bic r0, r0, #"__stringify(CR_C)" \n\t"
163 "mcr p15, 0, r0, c1, c0, 0 @ set CR \n\t"
164 "isb \n\t"
165 "bl v7_flush_dcache_all \n\t"
166 "clrex \n\t"
167 "mrc p15, 0, r0, c1, c0, 1 @ get AUXCR \n\t"
168 "bic r0, r0, #(1 << 6) @ disable local coherency \n\t"
169 "mcr p15, 0, r0, c1, c0, 1 @ set AUXCR \n\t"
170 "isb \n\t"
171 "dsb \n\t"
172 "ldr fp, [sp], #4"
173 : : : "r0","r1","r2","r3","r4","r5","r6","r7",
174 "r9","r10","lr","memory");
175
176 cci_disable_port_by_cpu(mpidr);
177
178 __mcpm_outbound_leave_critical(cluster, CLUSTER_DOWN);
179 } else {
180 /*
181 * If last man then undo any setup done previously.
182 */
183 if (last_man) {
184 ve_spc_powerdown(cluster, false);
185 ve_spc_global_wakeup_irq(false);
186 }
187
188 arch_spin_unlock(&tc2_pm_lock);
189
190 /*
191 * We need to disable and flush only the L1 cache.
192 * Let's do it in the safest possible way as above.
193 */
194 asm volatile(
195 "str fp, [sp, #-4]! \n\t"
196 "mrc p15, 0, r0, c1, c0, 0 @ get CR \n\t"
197 "bic r0, r0, #"__stringify(CR_C)" \n\t"
198 "mcr p15, 0, r0, c1, c0, 0 @ set CR \n\t"
199 "isb \n\t"
200 "bl v7_flush_dcache_louis \n\t"
201 "clrex \n\t"
202 "mrc p15, 0, r0, c1, c0, 1 @ get AUXCR \n\t"
203 "bic r0, r0, #(1 << 6) @ disable local coherency \n\t"
204 "mcr p15, 0, r0, c1, c0, 1 @ set AUXCR \n\t"
205 "isb \n\t"
206 "dsb \n\t"
207 "ldr fp, [sp], #4"
208 : : : "r0","r1","r2","r3","r4","r5","r6","r7",
209 "r9","r10","lr","memory");
210 }
211
212 __mcpm_cpu_down(cpu, cluster);
213
214 /* Now we are prepared for power-down, do it: */
215 if (!skip_wfi)
216 wfi();
217
218 /* Not dead at this point? Let our caller cope. */
219}
220
221static void tc2_pm_power_down(void)
222{
223 tc2_pm_down(0);
224}
225
226static void tc2_pm_suspend(u64 residency)
227{
228 unsigned int mpidr, cpu, cluster;
229
230 mpidr = read_cpuid_mpidr();
231 cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
232 cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
233 ve_spc_set_resume_addr(cluster, cpu, virt_to_phys(mcpm_entry_point));
234 gic_cpu_if_down();
235 tc2_pm_down(residency);
236}
237
238static void tc2_pm_powered_up(void)
239{
240 unsigned int mpidr, cpu, cluster;
241 unsigned long flags;
242
243 mpidr = read_cpuid_mpidr();
244 cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
245 cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
246
247 pr_debug("%s: cpu %u cluster %u\n", __func__, cpu, cluster);
248 BUG_ON(cluster >= TC2_CLUSTERS || cpu >= TC2_MAX_CPUS_PER_CLUSTER);
249
250 local_irq_save(flags);
251 arch_spin_lock(&tc2_pm_lock);
252
253 if (tc2_cluster_unused(cluster)) {
254 ve_spc_powerdown(cluster, false);
255 ve_spc_global_wakeup_irq(false);
256 }
257
258 if (!tc2_pm_use_count[cpu][cluster])
259 tc2_pm_use_count[cpu][cluster] = 1;
260
261 ve_spc_cpu_wakeup_irq(cluster, cpu, false);
262 ve_spc_set_resume_addr(cluster, cpu, 0);
263
264 arch_spin_unlock(&tc2_pm_lock);
265 local_irq_restore(flags);
266}
267
268static const struct mcpm_platform_ops tc2_pm_power_ops = {
269 .power_up = tc2_pm_power_up,
270 .power_down = tc2_pm_power_down,
271 .suspend = tc2_pm_suspend,
272 .powered_up = tc2_pm_powered_up,
273};
274
275static bool __init tc2_pm_usage_count_init(void)
276{
277 unsigned int mpidr, cpu, cluster;
278
279 mpidr = read_cpuid_mpidr();
280 cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
281 cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
282
283 pr_debug("%s: cpu %u cluster %u\n", __func__, cpu, cluster);
284 if (cluster >= TC2_CLUSTERS || cpu >= tc2_nr_cpus[cluster]) {
285 pr_err("%s: boot CPU is out of bound!\n", __func__);
286 return false;
287 }
288 tc2_pm_use_count[cpu][cluster] = 1;
289 return true;
290}
291
292/*
293 * Enable cluster-level coherency, in preparation for turning on the MMU.
294 */
295static void __naked tc2_pm_power_up_setup(unsigned int affinity_level)
296{
297 asm volatile (" \n"
298" cmp r0, #1 \n"
299" bxne lr \n"
300" b cci_enable_port_for_self ");
301}
302
303static int __init tc2_pm_init(void)
304{
305 int ret;
306 void __iomem *scc;
307 u32 a15_cluster_id, a7_cluster_id, sys_info;
308 struct device_node *np;
309
310 /*
311 * The power management-related features are hidden behind
312 * SCC registers. We need to extract runtime information like
313 * cluster ids and number of CPUs really available in clusters.
314 */
315 np = of_find_compatible_node(NULL, NULL,
316 "arm,vexpress-scc,v2p-ca15_a7");
317 scc = of_iomap(np, 0);
318 if (!scc)
319 return -ENODEV;
320
321 a15_cluster_id = readl_relaxed(scc + A15_CONF) & 0xf;
322 a7_cluster_id = readl_relaxed(scc + A7_CONF) & 0xf;
323 if (a15_cluster_id >= TC2_CLUSTERS || a7_cluster_id >= TC2_CLUSTERS)
324 return -EINVAL;
325
326 sys_info = readl_relaxed(scc + SYS_INFO);
327 tc2_nr_cpus[a15_cluster_id] = (sys_info >> 16) & 0xf;
328 tc2_nr_cpus[a7_cluster_id] = (sys_info >> 20) & 0xf;
329
330 /*
331 * A subset of the SCC registers is also used to communicate
332 * with the SPC (power controller). We need to be able to
333 * drive it very early in the boot process to power up
334 * processors, so we initialize the SPC driver here.
335 */
336 ret = ve_spc_init(scc + SPC_BASE, a15_cluster_id);
337 if (ret)
338 return ret;
339
340 if (!cci_probed())
341 return -ENODEV;
342
343 if (!tc2_pm_usage_count_init())
344 return -EINVAL;
345
346 ret = mcpm_platform_register(&tc2_pm_power_ops);
347 if (!ret) {
348 mcpm_sync_init(tc2_pm_power_up_setup);
349 pr_info("TC2 power management initialized\n");
350 }
351 return ret;
352}
353
354early_initcall(tc2_pm_init);
diff --git a/arch/arm/mach-zynq/Kconfig b/arch/arm/mach-zynq/Kconfig
index c1d61f281e68..04f8a4a6e755 100644
--- a/arch/arm/mach-zynq/Kconfig
+++ b/arch/arm/mach-zynq/Kconfig
@@ -6,7 +6,7 @@ config ARCH_ZYNQ
6 select CPU_V7 6 select CPU_V7
7 select GENERIC_CLOCKEVENTS 7 select GENERIC_CLOCKEVENTS
8 select HAVE_ARM_SCU if SMP 8 select HAVE_ARM_SCU if SMP
9 select HAVE_ARM_TWD if LOCAL_TIMERS 9 select HAVE_ARM_TWD if SMP
10 select ICST 10 select ICST
11 select MIGHT_HAVE_CACHE_L2X0 11 select MIGHT_HAVE_CACHE_L2X0
12 select USE_OF 12 select USE_OF
diff --git a/arch/arm/mach-zynq/hotplug.c b/arch/arm/mach-zynq/hotplug.c
index c89672bd1de2..5052c70326e4 100644
--- a/arch/arm/mach-zynq/hotplug.c
+++ b/arch/arm/mach-zynq/hotplug.c
@@ -40,44 +40,6 @@ static inline void zynq_cpu_enter_lowpower(void)
40 : "cc"); 40 : "cc");
41} 41}
42 42
43static inline void zynq_cpu_leave_lowpower(void)
44{
45 unsigned int v;
46
47 asm volatile(
48 " mrc p15, 0, %0, c1, c0, 0\n"
49 " orr %0, %0, %1\n"
50 " mcr p15, 0, %0, c1, c0, 0\n"
51 " mrc p15, 0, %0, c1, c0, 1\n"
52 " orr %0, %0, #0x40\n"
53 " mcr p15, 0, %0, c1, c0, 1\n"
54 : "=&r" (v)
55 : "Ir" (CR_C)
56 : "cc");
57}
58
59static inline void zynq_platform_do_lowpower(unsigned int cpu, int *spurious)
60{
61 /*
62 * there is no power-control hardware on this platform, so all
63 * we can do is put the core into WFI; this is safe as the calling
64 * code will have already disabled interrupts
65 */
66 for (;;) {
67 dsb();
68 wfi();
69
70 /*
71 * Getting here, means that we have come out of WFI without
72 * having been woken up - this shouldn't happen
73 *
74 * Just note it happening - when we're woken, we can report
75 * its occurrence.
76 */
77 (*spurious)++;
78 }
79}
80
81/* 43/*
82 * platform-specific code to shutdown a CPU 44 * platform-specific code to shutdown a CPU
83 * 45 *
@@ -85,20 +47,13 @@ static inline void zynq_platform_do_lowpower(unsigned int cpu, int *spurious)
85 */ 47 */
86void zynq_platform_cpu_die(unsigned int cpu) 48void zynq_platform_cpu_die(unsigned int cpu)
87{ 49{
88 int spurious = 0;
89
90 /*
91 * we're ready for shutdown now, so do it
92 */
93 zynq_cpu_enter_lowpower(); 50 zynq_cpu_enter_lowpower();
94 zynq_platform_do_lowpower(cpu, &spurious);
95 51
96 /* 52 /*
97 * bring this CPU back into the world of cache 53 * there is no power-control hardware on this platform, so all
98 * coherency, and then restore interrupts 54 * we can do is put the core into WFI; this is safe as the calling
55 * code will have already disabled interrupts
99 */ 56 */
100 zynq_cpu_leave_lowpower(); 57 for (;;)
101 58 cpu_do_idle();
102 if (spurious)
103 pr_warn("CPU%u: %u spurious wakeup calls\n", cpu, spurious);
104} 59}
diff --git a/arch/arm/mach-zynq/slcr.c b/arch/arm/mach-zynq/slcr.c
index 50d008d8f87f..1836d5a34606 100644
--- a/arch/arm/mach-zynq/slcr.c
+++ b/arch/arm/mach-zynq/slcr.c
@@ -14,32 +14,21 @@
14 * 02139, USA. 14 * 02139, USA.
15 */ 15 */
16 16
17#include <linux/export.h>
18#include <linux/io.h> 17#include <linux/io.h>
19#include <linux/fs.h>
20#include <linux/interrupt.h>
21#include <linux/init.h>
22#include <linux/kernel.h>
23#include <linux/module.h>
24#include <linux/of_address.h> 18#include <linux/of_address.h>
25#include <linux/uaccess.h>
26#include <linux/platform_device.h>
27#include <linux/slab.h>
28#include <linux/string.h>
29#include <linux/clk/zynq.h> 19#include <linux/clk/zynq.h>
30#include "common.h" 20#include "common.h"
31 21
32#define SLCR_UNLOCK_MAGIC 0xDF0D 22/* register offsets */
33#define SLCR_UNLOCK 0x8 /* SCLR unlock register */ 23#define SLCR_UNLOCK_OFFSET 0x8 /* SCLR unlock register */
34
35#define SLCR_PS_RST_CTRL_OFFSET 0x200 /* PS Software Reset Control */ 24#define SLCR_PS_RST_CTRL_OFFSET 0x200 /* PS Software Reset Control */
25#define SLCR_A9_CPU_RST_CTRL_OFFSET 0x244 /* CPU Software Reset Control */
26#define SLCR_REBOOT_STATUS_OFFSET 0x258 /* PS Reboot Status */
36 27
28#define SLCR_UNLOCK_MAGIC 0xDF0D
37#define SLCR_A9_CPU_CLKSTOP 0x10 29#define SLCR_A9_CPU_CLKSTOP 0x10
38#define SLCR_A9_CPU_RST 0x1 30#define SLCR_A9_CPU_RST 0x1
39 31
40#define SLCR_A9_CPU_RST_CTRL 0x244 /* CPU Software Reset Control */
41#define SLCR_REBOOT_STATUS 0x258 /* PS Reboot Status */
42
43void __iomem *zynq_slcr_base; 32void __iomem *zynq_slcr_base;
44 33
45/** 34/**
@@ -54,15 +43,15 @@ void zynq_slcr_system_reset(void)
54 * Note that this seems to require raw i/o 43 * Note that this seems to require raw i/o
55 * functions or there's a lockup? 44 * functions or there's a lockup?
56 */ 45 */
57 writel(SLCR_UNLOCK_MAGIC, zynq_slcr_base + SLCR_UNLOCK); 46 writel(SLCR_UNLOCK_MAGIC, zynq_slcr_base + SLCR_UNLOCK_OFFSET);
58 47
59 /* 48 /*
60 * Clear 0x0F000000 bits of reboot status register to workaround 49 * Clear 0x0F000000 bits of reboot status register to workaround
61 * the FSBL not loading the bitstream after soft-reboot 50 * the FSBL not loading the bitstream after soft-reboot
62 * This is a temporary solution until we know more. 51 * This is a temporary solution until we know more.
63 */ 52 */
64 reboot = readl(zynq_slcr_base + SLCR_REBOOT_STATUS); 53 reboot = readl(zynq_slcr_base + SLCR_REBOOT_STATUS_OFFSET);
65 writel(reboot & 0xF0FFFFFF, zynq_slcr_base + SLCR_REBOOT_STATUS); 54 writel(reboot & 0xF0FFFFFF, zynq_slcr_base + SLCR_REBOOT_STATUS_OFFSET);
66 writel(1, zynq_slcr_base + SLCR_PS_RST_CTRL_OFFSET); 55 writel(1, zynq_slcr_base + SLCR_PS_RST_CTRL_OFFSET);
67} 56}
68 57
@@ -72,11 +61,11 @@ void zynq_slcr_system_reset(void)
72 */ 61 */
73void zynq_slcr_cpu_start(int cpu) 62void zynq_slcr_cpu_start(int cpu)
74{ 63{
75 /* enable CPUn */ 64 u32 reg = readl(zynq_slcr_base + SLCR_A9_CPU_RST_CTRL_OFFSET);
76 writel(SLCR_A9_CPU_CLKSTOP << cpu, 65 reg &= ~(SLCR_A9_CPU_RST << cpu);
77 zynq_slcr_base + SLCR_A9_CPU_RST_CTRL); 66 writel(reg, zynq_slcr_base + SLCR_A9_CPU_RST_CTRL_OFFSET);
78 /* enable CLK for CPUn */ 67 reg &= ~(SLCR_A9_CPU_CLKSTOP << cpu);
79 writel(0x0 << cpu, zynq_slcr_base + SLCR_A9_CPU_RST_CTRL); 68 writel(reg, zynq_slcr_base + SLCR_A9_CPU_RST_CTRL_OFFSET);
80} 69}
81 70
82/** 71/**
@@ -85,9 +74,9 @@ void zynq_slcr_cpu_start(int cpu)
85 */ 74 */
86void zynq_slcr_cpu_stop(int cpu) 75void zynq_slcr_cpu_stop(int cpu)
87{ 76{
88 /* stop CLK and reset CPUn */ 77 u32 reg = readl(zynq_slcr_base + SLCR_A9_CPU_RST_CTRL_OFFSET);
89 writel((SLCR_A9_CPU_CLKSTOP | SLCR_A9_CPU_RST) << cpu, 78 reg |= (SLCR_A9_CPU_CLKSTOP | SLCR_A9_CPU_RST) << cpu;
90 zynq_slcr_base + SLCR_A9_CPU_RST_CTRL); 79 writel(reg, zynq_slcr_base + SLCR_A9_CPU_RST_CTRL_OFFSET);
91} 80}
92 81
93/** 82/**
@@ -113,7 +102,7 @@ int __init zynq_slcr_init(void)
113 } 102 }
114 103
115 /* unlock the SLCR so that registers can be changed */ 104 /* unlock the SLCR so that registers can be changed */
116 writel(SLCR_UNLOCK_MAGIC, zynq_slcr_base + SLCR_UNLOCK); 105 writel(SLCR_UNLOCK_MAGIC, zynq_slcr_base + SLCR_UNLOCK_OFFSET);
117 106
118 pr_info("%s mapped to %p\n", np->name, zynq_slcr_base); 107 pr_info("%s mapped to %p\n", np->name, zynq_slcr_base);
119 108
diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c
index d70e0aba0c9d..447da6ffadd5 100644
--- a/arch/arm/mm/cache-l2x0.c
+++ b/arch/arm/mm/cache-l2x0.c
@@ -290,7 +290,7 @@ static void l2x0_disable(void)
290 raw_spin_lock_irqsave(&l2x0_lock, flags); 290 raw_spin_lock_irqsave(&l2x0_lock, flags);
291 __l2x0_flush_all(); 291 __l2x0_flush_all();
292 writel_relaxed(0, l2x0_base + L2X0_CTRL); 292 writel_relaxed(0, l2x0_base + L2X0_CTRL);
293 dsb(); 293 dsb(st);
294 raw_spin_unlock_irqrestore(&l2x0_lock, flags); 294 raw_spin_unlock_irqrestore(&l2x0_lock, flags);
295} 295}
296 296
@@ -417,9 +417,9 @@ void __init l2x0_init(void __iomem *base, u32 aux_val, u32 aux_mask)
417 outer_cache.disable = l2x0_disable; 417 outer_cache.disable = l2x0_disable;
418 } 418 }
419 419
420 printk(KERN_INFO "%s cache controller enabled\n", type); 420 pr_info("%s cache controller enabled\n", type);
421 printk(KERN_INFO "l2x0: %d ways, CACHE_ID 0x%08x, AUX_CTRL 0x%08x, Cache size: %d B\n", 421 pr_info("l2x0: %d ways, CACHE_ID 0x%08x, AUX_CTRL 0x%08x, Cache size: %d kB\n",
422 ways, cache_id, aux, l2x0_size); 422 ways, cache_id, aux, l2x0_size >> 10);
423} 423}
424 424
425#ifdef CONFIG_OF 425#ifdef CONFIG_OF
@@ -929,7 +929,9 @@ static const struct of_device_id l2x0_ids[] __initconst = {
929 .data = (void *)&aurora_no_outer_data}, 929 .data = (void *)&aurora_no_outer_data},
930 { .compatible = "marvell,aurora-outer-cache", 930 { .compatible = "marvell,aurora-outer-cache",
931 .data = (void *)&aurora_with_outer_data}, 931 .data = (void *)&aurora_with_outer_data},
932 { .compatible = "bcm,bcm11351-a2-pl310-cache", 932 { .compatible = "brcm,bcm11351-a2-pl310-cache",
933 .data = (void *)&bcm_l2x0_data},
934 { .compatible = "bcm,bcm11351-a2-pl310-cache", /* deprecated name */
933 .data = (void *)&bcm_l2x0_data}, 935 .data = (void *)&bcm_l2x0_data},
934 {} 936 {}
935}; 937};
diff --git a/arch/arm/mm/cache-v7.S b/arch/arm/mm/cache-v7.S
index 515b00064da8..b5c467a65c27 100644
--- a/arch/arm/mm/cache-v7.S
+++ b/arch/arm/mm/cache-v7.S
@@ -282,7 +282,7 @@ ENTRY(v7_coherent_user_range)
282 add r12, r12, r2 282 add r12, r12, r2
283 cmp r12, r1 283 cmp r12, r1
284 blo 1b 284 blo 1b
285 dsb 285 dsb ishst
286 icache_line_size r2, r3 286 icache_line_size r2, r3
287 sub r3, r2, #1 287 sub r3, r2, #1
288 bic r12, r0, r3 288 bic r12, r0, r3
@@ -294,7 +294,7 @@ ENTRY(v7_coherent_user_range)
294 mov r0, #0 294 mov r0, #0
295 ALT_SMP(mcr p15, 0, r0, c7, c1, 6) @ invalidate BTB Inner Shareable 295 ALT_SMP(mcr p15, 0, r0, c7, c1, 6) @ invalidate BTB Inner Shareable
296 ALT_UP(mcr p15, 0, r0, c7, c5, 6) @ invalidate BTB 296 ALT_UP(mcr p15, 0, r0, c7, c5, 6) @ invalidate BTB
297 dsb 297 dsb ishst
298 isb 298 isb
299 mov pc, lr 299 mov pc, lr
300 300
diff --git a/arch/arm/mm/context.c b/arch/arm/mm/context.c
index 4a0544492f10..84e6f772e204 100644
--- a/arch/arm/mm/context.c
+++ b/arch/arm/mm/context.c
@@ -162,10 +162,7 @@ static void flush_context(unsigned int cpu)
162 } 162 }
163 163
164 /* Queue a TLB invalidate and flush the I-cache if necessary. */ 164 /* Queue a TLB invalidate and flush the I-cache if necessary. */
165 if (!tlb_ops_need_broadcast()) 165 cpumask_setall(&tlb_flush_pending);
166 cpumask_set_cpu(cpu, &tlb_flush_pending);
167 else
168 cpumask_setall(&tlb_flush_pending);
169 166
170 if (icache_is_vivt_asid_tagged()) 167 if (icache_is_vivt_asid_tagged())
171 __flush_icache_all(); 168 __flush_icache_all();
@@ -245,8 +242,6 @@ void check_and_switch_context(struct mm_struct *mm, struct task_struct *tsk)
245 if (cpumask_test_and_clear_cpu(cpu, &tlb_flush_pending)) { 242 if (cpumask_test_and_clear_cpu(cpu, &tlb_flush_pending)) {
246 local_flush_bp_all(); 243 local_flush_bp_all();
247 local_flush_tlb_all(); 244 local_flush_tlb_all();
248 if (erratum_a15_798181())
249 dummy_flush_tlb_a15_erratum();
250 } 245 }
251 246
252 atomic64_set(&per_cpu(active_asids, cpu), asid); 247 atomic64_set(&per_cpu(active_asids, cpu), asid);
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
index 7f9b1798c6cf..f5e1a8471714 100644
--- a/arch/arm/mm/dma-mapping.c
+++ b/arch/arm/mm/dma-mapping.c
@@ -358,7 +358,7 @@ static int __init atomic_pool_init(void)
358 if (!pages) 358 if (!pages)
359 goto no_pages; 359 goto no_pages;
360 360
361 if (IS_ENABLED(CONFIG_CMA)) 361 if (IS_ENABLED(CONFIG_DMA_CMA))
362 ptr = __alloc_from_contiguous(NULL, pool->size, prot, &page, 362 ptr = __alloc_from_contiguous(NULL, pool->size, prot, &page,
363 atomic_pool_init); 363 atomic_pool_init);
364 else 364 else
@@ -455,7 +455,6 @@ static void __dma_remap(struct page *page, size_t size, pgprot_t prot)
455 unsigned end = start + size; 455 unsigned end = start + size;
456 456
457 apply_to_page_range(&init_mm, start, size, __dma_update_pte, &prot); 457 apply_to_page_range(&init_mm, start, size, __dma_update_pte, &prot);
458 dsb();
459 flush_tlb_kernel_range(start, end); 458 flush_tlb_kernel_range(start, end);
460} 459}
461 460
@@ -670,7 +669,7 @@ static void *__dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,
670 addr = __alloc_simple_buffer(dev, size, gfp, &page); 669 addr = __alloc_simple_buffer(dev, size, gfp, &page);
671 else if (!(gfp & __GFP_WAIT)) 670 else if (!(gfp & __GFP_WAIT))
672 addr = __alloc_from_pool(size, &page); 671 addr = __alloc_from_pool(size, &page);
673 else if (!IS_ENABLED(CONFIG_CMA)) 672 else if (!IS_ENABLED(CONFIG_DMA_CMA))
674 addr = __alloc_remap_buffer(dev, size, gfp, prot, &page, caller); 673 addr = __alloc_remap_buffer(dev, size, gfp, prot, &page, caller);
675 else 674 else
676 addr = __alloc_from_contiguous(dev, size, prot, &page, caller); 675 addr = __alloc_from_contiguous(dev, size, prot, &page, caller);
@@ -759,7 +758,7 @@ static void __arm_dma_free(struct device *dev, size_t size, void *cpu_addr,
759 __dma_free_buffer(page, size); 758 __dma_free_buffer(page, size);
760 } else if (__free_from_pool(cpu_addr, size)) { 759 } else if (__free_from_pool(cpu_addr, size)) {
761 return; 760 return;
762 } else if (!IS_ENABLED(CONFIG_CMA)) { 761 } else if (!IS_ENABLED(CONFIG_DMA_CMA)) {
763 __dma_free_remap(cpu_addr, size); 762 __dma_free_remap(cpu_addr, size);
764 __dma_free_buffer(page, size); 763 __dma_free_buffer(page, size);
765 } else { 764 } else {
diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c
index c97f7940cb95..eb8830a4c5ed 100644
--- a/arch/arm/mm/fault.c
+++ b/arch/arm/mm/fault.c
@@ -261,9 +261,7 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
261 struct task_struct *tsk; 261 struct task_struct *tsk;
262 struct mm_struct *mm; 262 struct mm_struct *mm;
263 int fault, sig, code; 263 int fault, sig, code;
264 int write = fsr & FSR_WRITE; 264 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
265 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE |
266 (write ? FAULT_FLAG_WRITE : 0);
267 265
268 if (notify_page_fault(regs, fsr)) 266 if (notify_page_fault(regs, fsr))
269 return 0; 267 return 0;
@@ -282,6 +280,11 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
282 if (in_atomic() || !mm) 280 if (in_atomic() || !mm)
283 goto no_context; 281 goto no_context;
284 282
283 if (user_mode(regs))
284 flags |= FAULT_FLAG_USER;
285 if (fsr & FSR_WRITE)
286 flags |= FAULT_FLAG_WRITE;
287
285 /* 288 /*
286 * As per x86, we may deadlock here. However, since the kernel only 289 * As per x86, we may deadlock here. However, since the kernel only
287 * validly references user space from well defined areas of the code, 290 * validly references user space from well defined areas of the code,
@@ -349,6 +352,13 @@ retry:
349 if (likely(!(fault & (VM_FAULT_ERROR | VM_FAULT_BADMAP | VM_FAULT_BADACCESS)))) 352 if (likely(!(fault & (VM_FAULT_ERROR | VM_FAULT_BADMAP | VM_FAULT_BADACCESS))))
350 return 0; 353 return 0;
351 354
355 /*
356 * If we are in kernel mode at this point, we
357 * have no context to handle this fault with.
358 */
359 if (!user_mode(regs))
360 goto no_context;
361
352 if (fault & VM_FAULT_OOM) { 362 if (fault & VM_FAULT_OOM) {
353 /* 363 /*
354 * We ran out of memory, call the OOM killer, and return to 364 * We ran out of memory, call the OOM killer, and return to
@@ -359,13 +369,6 @@ retry:
359 return 0; 369 return 0;
360 } 370 }
361 371
362 /*
363 * If we are in kernel mode at this point, we
364 * have no context to handle this fault with.
365 */
366 if (!user_mode(regs))
367 goto no_context;
368
369 if (fault & VM_FAULT_SIGBUS) { 372 if (fault & VM_FAULT_SIGBUS) {
370 /* 373 /*
371 * We had some memory, but were unable to 374 * We had some memory, but were unable to
diff --git a/arch/arm/mm/hugetlbpage.c b/arch/arm/mm/hugetlbpage.c
index 3d1e4a205b0b..54ee6163c181 100644
--- a/arch/arm/mm/hugetlbpage.c
+++ b/arch/arm/mm/hugetlbpage.c
@@ -36,22 +36,6 @@
36 * of type casting from pmd_t * to pte_t *. 36 * of type casting from pmd_t * to pte_t *.
37 */ 37 */
38 38
39pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
40{
41 pgd_t *pgd;
42 pud_t *pud;
43 pmd_t *pmd = NULL;
44
45 pgd = pgd_offset(mm, addr);
46 if (pgd_present(*pgd)) {
47 pud = pud_offset(pgd, addr);
48 if (pud_present(*pud))
49 pmd = pmd_offset(pud, addr);
50 }
51
52 return (pte_t *)pmd;
53}
54
55struct page *follow_huge_addr(struct mm_struct *mm, unsigned long address, 39struct page *follow_huge_addr(struct mm_struct *mm, unsigned long address,
56 int write) 40 int write)
57{ 41{
@@ -68,34 +52,12 @@ int huge_pmd_unshare(struct mm_struct *mm, unsigned long *addr, pte_t *ptep)
68 return 0; 52 return 0;
69} 53}
70 54
71pte_t *huge_pte_alloc(struct mm_struct *mm, 55int pmd_huge(pmd_t pmd)
72 unsigned long addr, unsigned long sz)
73{
74 pgd_t *pgd;
75 pud_t *pud;
76 pte_t *pte = NULL;
77
78 pgd = pgd_offset(mm, addr);
79 pud = pud_alloc(mm, pgd, addr);
80 if (pud)
81 pte = (pte_t *)pmd_alloc(mm, pud, addr);
82
83 return pte;
84}
85
86struct page *
87follow_huge_pmd(struct mm_struct *mm, unsigned long address,
88 pmd_t *pmd, int write)
89{ 56{
90 struct page *page; 57 return pmd_val(pmd) && !(pmd_val(pmd) & PMD_TABLE_BIT);
91
92 page = pte_page(*(pte_t *)pmd);
93 if (page)
94 page += ((address & ~PMD_MASK) >> PAGE_SHIFT);
95 return page;
96} 58}
97 59
98int pmd_huge(pmd_t pmd) 60int pmd_huge_support(void)
99{ 61{
100 return pmd_val(pmd) && !(pmd_val(pmd) & PMD_TABLE_BIT); 62 return 1;
101} 63}
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
index 15225d829d71..febaee7ca57b 100644
--- a/arch/arm/mm/init.c
+++ b/arch/arm/mm/init.c
@@ -17,6 +17,7 @@
17#include <linux/nodemask.h> 17#include <linux/nodemask.h>
18#include <linux/initrd.h> 18#include <linux/initrd.h>
19#include <linux/of_fdt.h> 19#include <linux/of_fdt.h>
20#include <linux/of_reserved_mem.h>
20#include <linux/highmem.h> 21#include <linux/highmem.h>
21#include <linux/gfp.h> 22#include <linux/gfp.h>
22#include <linux/memblock.h> 23#include <linux/memblock.h>
@@ -77,7 +78,7 @@ static int __init parse_tag_initrd2(const struct tag *tag)
77__tagtable(ATAG_INITRD2, parse_tag_initrd2); 78__tagtable(ATAG_INITRD2, parse_tag_initrd2);
78 79
79#ifdef CONFIG_OF_FLATTREE 80#ifdef CONFIG_OF_FLATTREE
80void __init early_init_dt_setup_initrd_arch(unsigned long start, unsigned long end) 81void __init early_init_dt_setup_initrd_arch(u64 start, u64 end)
81{ 82{
82 phys_initrd_start = start; 83 phys_initrd_start = start;
83 phys_initrd_size = end - start; 84 phys_initrd_size = end - start;
@@ -207,7 +208,7 @@ static void __init arm_bootmem_init(unsigned long start_pfn,
207 208
208#ifdef CONFIG_ZONE_DMA 209#ifdef CONFIG_ZONE_DMA
209 210
210unsigned long arm_dma_zone_size __read_mostly; 211phys_addr_t arm_dma_zone_size __read_mostly;
211EXPORT_SYMBOL(arm_dma_zone_size); 212EXPORT_SYMBOL(arm_dma_zone_size);
212 213
213/* 214/*
@@ -231,7 +232,7 @@ static void __init arm_adjust_dma_zone(unsigned long *size, unsigned long *hole,
231} 232}
232#endif 233#endif
233 234
234void __init setup_dma_zone(struct machine_desc *mdesc) 235void __init setup_dma_zone(const struct machine_desc *mdesc)
235{ 236{
236#ifdef CONFIG_ZONE_DMA 237#ifdef CONFIG_ZONE_DMA
237 if (mdesc->dma_zone_size) { 238 if (mdesc->dma_zone_size) {
@@ -335,7 +336,8 @@ phys_addr_t __init arm_memblock_steal(phys_addr_t size, phys_addr_t align)
335 return phys; 336 return phys;
336} 337}
337 338
338void __init arm_memblock_init(struct meminfo *mi, struct machine_desc *mdesc) 339void __init arm_memblock_init(struct meminfo *mi,
340 const struct machine_desc *mdesc)
339{ 341{
340 int i; 342 int i;
341 343
@@ -377,6 +379,8 @@ void __init arm_memblock_init(struct meminfo *mi, struct machine_desc *mdesc)
377 if (mdesc->reserve) 379 if (mdesc->reserve)
378 mdesc->reserve(); 380 mdesc->reserve();
379 381
382 early_init_dt_scan_reserved_mem();
383
380 /* 384 /*
381 * reserve memory for DMA contigouos allocations, 385 * reserve memory for DMA contigouos allocations,
382 * must come from DMA area inside low memory 386 * must come from DMA area inside low memory
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
index 53cdbd39ec8e..b1d17eeb59b8 100644
--- a/arch/arm/mm/mmu.c
+++ b/arch/arm/mm/mmu.c
@@ -1186,7 +1186,7 @@ void __init arm_mm_memblock_reserve(void)
1186 * called function. This means you can't use any function or debugging 1186 * called function. This means you can't use any function or debugging
1187 * method which may touch any device, otherwise the kernel _will_ crash. 1187 * method which may touch any device, otherwise the kernel _will_ crash.
1188 */ 1188 */
1189static void __init devicemaps_init(struct machine_desc *mdesc) 1189static void __init devicemaps_init(const struct machine_desc *mdesc)
1190{ 1190{
1191 struct map_desc map; 1191 struct map_desc map;
1192 unsigned long addr; 1192 unsigned long addr;
@@ -1319,7 +1319,7 @@ static void __init map_lowmem(void)
1319 * paging_init() sets up the page tables, initialises the zone memory 1319 * paging_init() sets up the page tables, initialises the zone memory
1320 * maps, and sets up the zero page, bad page and bad page tables. 1320 * maps, and sets up the zero page, bad page and bad page tables.
1321 */ 1321 */
1322void __init paging_init(struct machine_desc *mdesc) 1322void __init paging_init(const struct machine_desc *mdesc)
1323{ 1323{
1324 void *zero_page; 1324 void *zero_page;
1325 1325
diff --git a/arch/arm/mm/nommu.c b/arch/arm/mm/nommu.c
index 1fa50100ab6a..34d4ab217bab 100644
--- a/arch/arm/mm/nommu.c
+++ b/arch/arm/mm/nommu.c
@@ -299,7 +299,7 @@ void __init sanity_check_meminfo(void)
299 * paging_init() sets up the page tables, initialises the zone memory 299 * paging_init() sets up the page tables, initialises the zone memory
300 * maps, and sets up the zero page, bad page and bad page tables. 300 * maps, and sets up the zero page, bad page and bad page tables.
301 */ 301 */
302void __init paging_init(struct machine_desc *mdesc) 302void __init paging_init(const struct machine_desc *mdesc)
303{ 303{
304 early_trap_init((void *)CONFIG_VECTORS_BASE); 304 early_trap_init((void *)CONFIG_VECTORS_BASE);
305 mpu_setup(); 305 mpu_setup();
diff --git a/arch/arm/mm/proc-feroceon.S b/arch/arm/mm/proc-feroceon.S
index d5146b98c8d1..db79b62c92fb 100644
--- a/arch/arm/mm/proc-feroceon.S
+++ b/arch/arm/mm/proc-feroceon.S
@@ -514,6 +514,32 @@ ENTRY(cpu_feroceon_set_pte_ext)
514#endif 514#endif
515 mov pc, lr 515 mov pc, lr
516 516
517/* Suspend/resume support: taken from arch/arm/mm/proc-arm926.S */
518.globl cpu_feroceon_suspend_size
519.equ cpu_feroceon_suspend_size, 4 * 3
520#ifdef CONFIG_ARM_CPU_SUSPEND
521ENTRY(cpu_feroceon_do_suspend)
522 stmfd sp!, {r4 - r6, lr}
523 mrc p15, 0, r4, c13, c0, 0 @ PID
524 mrc p15, 0, r5, c3, c0, 0 @ Domain ID
525 mrc p15, 0, r6, c1, c0, 0 @ Control register
526 stmia r0, {r4 - r6}
527 ldmfd sp!, {r4 - r6, pc}
528ENDPROC(cpu_feroceon_do_suspend)
529
530ENTRY(cpu_feroceon_do_resume)
531 mov ip, #0
532 mcr p15, 0, ip, c8, c7, 0 @ invalidate I+D TLBs
533 mcr p15, 0, ip, c7, c7, 0 @ invalidate I+D caches
534 ldmia r0, {r4 - r6}
535 mcr p15, 0, r4, c13, c0, 0 @ PID
536 mcr p15, 0, r5, c3, c0, 0 @ Domain ID
537 mcr p15, 0, r1, c2, c0, 0 @ TTB address
538 mov r0, r6 @ control register
539 b cpu_resume_mmu
540ENDPROC(cpu_feroceon_do_resume)
541#endif
542
517 .type __feroceon_setup, #function 543 .type __feroceon_setup, #function
518__feroceon_setup: 544__feroceon_setup:
519 mov r0, #0 545 mov r0, #0
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S
index 73398bcf9bd8..c63d9bdee51e 100644
--- a/arch/arm/mm/proc-v7.S
+++ b/arch/arm/mm/proc-v7.S
@@ -83,7 +83,7 @@ ENTRY(cpu_v7_dcache_clean_area)
83 add r0, r0, r2 83 add r0, r0, r2
84 subs r1, r1, r2 84 subs r1, r1, r2
85 bhi 2b 85 bhi 2b
86 dsb 86 dsb ishst
87 mov pc, lr 87 mov pc, lr
88ENDPROC(cpu_v7_dcache_clean_area) 88ENDPROC(cpu_v7_dcache_clean_area)
89 89
@@ -330,7 +330,19 @@ __v7_setup:
3301: 3301:
331#endif 331#endif
332 332
3333: mov r10, #0 333 /* Cortex-A15 Errata */
3343: ldr r10, =0x00000c0f @ Cortex-A15 primary part number
335 teq r0, r10
336 bne 4f
337
338#ifdef CONFIG_ARM_ERRATA_773022
339 cmp r6, #0x4 @ only present up to r0p4
340 mrcle p15, 0, r10, c1, c0, 1 @ read aux control register
341 orrle r10, r10, #1 << 1 @ disable loop buffer
342 mcrle p15, 0, r10, c1, c0, 1 @ write aux control register
343#endif
344
3454: mov r10, #0
334 mcr p15, 0, r10, c7, c5, 0 @ I+BTB cache invalidate 346 mcr p15, 0, r10, c7, c5, 0 @ I+BTB cache invalidate
335 dsb 347 dsb
336#ifdef CONFIG_MMU 348#ifdef CONFIG_MMU
diff --git a/arch/arm/mm/tlb-v7.S b/arch/arm/mm/tlb-v7.S
index ea94765acf9a..355308767bae 100644
--- a/arch/arm/mm/tlb-v7.S
+++ b/arch/arm/mm/tlb-v7.S
@@ -35,7 +35,7 @@
35ENTRY(v7wbi_flush_user_tlb_range) 35ENTRY(v7wbi_flush_user_tlb_range)
36 vma_vm_mm r3, r2 @ get vma->vm_mm 36 vma_vm_mm r3, r2 @ get vma->vm_mm
37 mmid r3, r3 @ get vm_mm->context.id 37 mmid r3, r3 @ get vm_mm->context.id
38 dsb 38 dsb ish
39 mov r0, r0, lsr #PAGE_SHIFT @ align address 39 mov r0, r0, lsr #PAGE_SHIFT @ align address
40 mov r1, r1, lsr #PAGE_SHIFT 40 mov r1, r1, lsr #PAGE_SHIFT
41 asid r3, r3 @ mask ASID 41 asid r3, r3 @ mask ASID
@@ -56,7 +56,7 @@ ENTRY(v7wbi_flush_user_tlb_range)
56 add r0, r0, #PAGE_SZ 56 add r0, r0, #PAGE_SZ
57 cmp r0, r1 57 cmp r0, r1
58 blo 1b 58 blo 1b
59 dsb 59 dsb ish
60 mov pc, lr 60 mov pc, lr
61ENDPROC(v7wbi_flush_user_tlb_range) 61ENDPROC(v7wbi_flush_user_tlb_range)
62 62
@@ -69,7 +69,7 @@ ENDPROC(v7wbi_flush_user_tlb_range)
69 * - end - end address (exclusive, may not be aligned) 69 * - end - end address (exclusive, may not be aligned)
70 */ 70 */
71ENTRY(v7wbi_flush_kern_tlb_range) 71ENTRY(v7wbi_flush_kern_tlb_range)
72 dsb 72 dsb ish
73 mov r0, r0, lsr #PAGE_SHIFT @ align address 73 mov r0, r0, lsr #PAGE_SHIFT @ align address
74 mov r1, r1, lsr #PAGE_SHIFT 74 mov r1, r1, lsr #PAGE_SHIFT
75 mov r0, r0, lsl #PAGE_SHIFT 75 mov r0, r0, lsl #PAGE_SHIFT
@@ -84,7 +84,7 @@ ENTRY(v7wbi_flush_kern_tlb_range)
84 add r0, r0, #PAGE_SZ 84 add r0, r0, #PAGE_SZ
85 cmp r0, r1 85 cmp r0, r1
86 blo 1b 86 blo 1b
87 dsb 87 dsb ish
88 isb 88 isb
89 mov pc, lr 89 mov pc, lr
90ENDPROC(v7wbi_flush_kern_tlb_range) 90ENDPROC(v7wbi_flush_kern_tlb_range)
diff --git a/arch/arm/plat-omap/Kconfig b/arch/arm/plat-omap/Kconfig
index f82bae2171eb..436ea97074cd 100644
--- a/arch/arm/plat-omap/Kconfig
+++ b/arch/arm/plat-omap/Kconfig
@@ -106,7 +106,7 @@ config OMAP_32K_TIMER
106 This timer saves power compared to the OMAP_MPU_TIMER, and has 106 This timer saves power compared to the OMAP_MPU_TIMER, and has
107 support for no tick during idle. The 32KHz timer provides less 107 support for no tick during idle. The 32KHz timer provides less
108 intra-tick resolution than OMAP_MPU_TIMER. The 32KHz timer is 108 intra-tick resolution than OMAP_MPU_TIMER. The 32KHz timer is
109 currently only available for OMAP16XX, 24XX, 34XX and OMAP4/5. 109 currently only available for OMAP16XX, 24XX, 34XX, OMAP4/5 and DRA7XX.
110 110
111 On OMAP2PLUS this value is only used for CONFIG_HZ and 111 On OMAP2PLUS this value is only used for CONFIG_HZ and
112 CLOCK_TICK_RATE compile time calculation. 112 CLOCK_TICK_RATE compile time calculation.
diff --git a/arch/arm/plat-omap/dma.c b/arch/arm/plat-omap/dma.c
index 4d463ca6821f..037660633fa4 100644
--- a/arch/arm/plat-omap/dma.c
+++ b/arch/arm/plat-omap/dma.c
@@ -2083,6 +2083,7 @@ static int omap_system_dma_probe(struct platform_device *pdev)
2083 dma_irq = platform_get_irq_byname(pdev, irq_name); 2083 dma_irq = platform_get_irq_byname(pdev, irq_name);
2084 if (dma_irq < 0) { 2084 if (dma_irq < 0) {
2085 dev_err(&pdev->dev, "failed: request IRQ %d", dma_irq); 2085 dev_err(&pdev->dev, "failed: request IRQ %d", dma_irq);
2086 ret = dma_irq;
2086 goto exit_dma_lch_fail; 2087 goto exit_dma_lch_fail;
2087 } 2088 }
2088 ret = setup_irq(dma_irq, &omap24xx_dma_irq); 2089 ret = setup_irq(dma_irq, &omap24xx_dma_irq);
diff --git a/arch/arm/plat-orion/irq.c b/arch/arm/plat-orion/irq.c
index 8db0b981ca64..c492e1b3dfdb 100644
--- a/arch/arm/plat-orion/irq.c
+++ b/arch/arm/plat-orion/irq.c
@@ -47,7 +47,7 @@ static int __init orion_add_irq_domain(struct device_node *np,
47 do { 47 do {
48 base = of_iomap(np, i); 48 base = of_iomap(np, i);
49 if (base) { 49 if (base) {
50 orion_irq_init(i * 32, base); 50 orion_irq_init(i * 32, base + 0x04);
51 i++; 51 i++;
52 } 52 }
53 } while (base); 53 } while (base);
diff --git a/arch/arm/plat-pxa/ssp.c b/arch/arm/plat-pxa/ssp.c
index 8e11e96eab5e..3ea02903d75a 100644
--- a/arch/arm/plat-pxa/ssp.c
+++ b/arch/arm/plat-pxa/ssp.c
@@ -30,6 +30,8 @@
30#include <linux/platform_device.h> 30#include <linux/platform_device.h>
31#include <linux/spi/pxa2xx_spi.h> 31#include <linux/spi/pxa2xx_spi.h>
32#include <linux/io.h> 32#include <linux/io.h>
33#include <linux/of.h>
34#include <linux/of_device.h>
33 35
34#include <asm/irq.h> 36#include <asm/irq.h>
35#include <mach/hardware.h> 37#include <mach/hardware.h>
@@ -60,6 +62,30 @@ struct ssp_device *pxa_ssp_request(int port, const char *label)
60} 62}
61EXPORT_SYMBOL(pxa_ssp_request); 63EXPORT_SYMBOL(pxa_ssp_request);
62 64
65struct ssp_device *pxa_ssp_request_of(const struct device_node *of_node,
66 const char *label)
67{
68 struct ssp_device *ssp = NULL;
69
70 mutex_lock(&ssp_lock);
71
72 list_for_each_entry(ssp, &ssp_list, node) {
73 if (ssp->of_node == of_node && ssp->use_count == 0) {
74 ssp->use_count++;
75 ssp->label = label;
76 break;
77 }
78 }
79
80 mutex_unlock(&ssp_lock);
81
82 if (&ssp->node == &ssp_list)
83 return NULL;
84
85 return ssp;
86}
87EXPORT_SYMBOL(pxa_ssp_request_of);
88
63void pxa_ssp_free(struct ssp_device *ssp) 89void pxa_ssp_free(struct ssp_device *ssp)
64{ 90{
65 mutex_lock(&ssp_lock); 91 mutex_lock(&ssp_lock);
@@ -72,96 +98,136 @@ void pxa_ssp_free(struct ssp_device *ssp)
72} 98}
73EXPORT_SYMBOL(pxa_ssp_free); 99EXPORT_SYMBOL(pxa_ssp_free);
74 100
101#ifdef CONFIG_OF
102static const struct of_device_id pxa_ssp_of_ids[] = {
103 { .compatible = "mrvl,pxa25x-ssp", .data = (void *) PXA25x_SSP },
104 { .compatible = "mvrl,pxa25x-nssp", .data = (void *) PXA25x_NSSP },
105 { .compatible = "mrvl,pxa27x-ssp", .data = (void *) PXA27x_SSP },
106 { .compatible = "mrvl,pxa3xx-ssp", .data = (void *) PXA3xx_SSP },
107 { .compatible = "mvrl,pxa168-ssp", .data = (void *) PXA168_SSP },
108 { .compatible = "mrvl,pxa910-ssp", .data = (void *) PXA910_SSP },
109 { .compatible = "mrvl,ce4100-ssp", .data = (void *) CE4100_SSP },
110 { .compatible = "mrvl,lpss-ssp", .data = (void *) LPSS_SSP },
111 { },
112};
113MODULE_DEVICE_TABLE(of, pxa_ssp_of_ids);
114#endif
115
75static int pxa_ssp_probe(struct platform_device *pdev) 116static int pxa_ssp_probe(struct platform_device *pdev)
76{ 117{
77 const struct platform_device_id *id = platform_get_device_id(pdev);
78 struct resource *res; 118 struct resource *res;
79 struct ssp_device *ssp; 119 struct ssp_device *ssp;
80 int ret = 0; 120 struct device *dev = &pdev->dev;
81 121
82 ssp = kzalloc(sizeof(struct ssp_device), GFP_KERNEL); 122 ssp = devm_kzalloc(dev, sizeof(struct ssp_device), GFP_KERNEL);
83 if (ssp == NULL) { 123 if (ssp == NULL)
84 dev_err(&pdev->dev, "failed to allocate memory");
85 return -ENOMEM; 124 return -ENOMEM;
86 } 125
87 ssp->pdev = pdev; 126 ssp->pdev = pdev;
88 127
89 ssp->clk = clk_get(&pdev->dev, NULL); 128 ssp->clk = devm_clk_get(dev, NULL);
90 if (IS_ERR(ssp->clk)) { 129 if (IS_ERR(ssp->clk))
91 ret = PTR_ERR(ssp->clk); 130 return PTR_ERR(ssp->clk);
92 goto err_free;
93 }
94 131
95 res = platform_get_resource(pdev, IORESOURCE_DMA, 0); 132 if (dev->of_node) {
96 if (res == NULL) { 133 struct of_phandle_args dma_spec;
97 dev_err(&pdev->dev, "no SSP RX DRCMR defined\n"); 134 struct device_node *np = dev->of_node;
98 ret = -ENODEV; 135 int ret;
99 goto err_free_clk;
100 }
101 ssp->drcmr_rx = res->start;
102 136
103 res = platform_get_resource(pdev, IORESOURCE_DMA, 1); 137 /*
104 if (res == NULL) { 138 * FIXME: we should allocate the DMA channel from this
105 dev_err(&pdev->dev, "no SSP TX DRCMR defined\n"); 139 * context and pass the channel down to the ssp users.
106 ret = -ENODEV; 140 * For now, we lookup the rx and tx indices manually
107 goto err_free_clk; 141 */
142
143 /* rx */
144 ret = of_parse_phandle_with_args(np, "dmas", "#dma-cells",
145 0, &dma_spec);
146
147 if (ret) {
148 dev_err(dev, "Can't parse dmas property\n");
149 return -ENODEV;
150 }
151 ssp->drcmr_rx = dma_spec.args[0];
152 of_node_put(dma_spec.np);
153
154 /* tx */
155 ret = of_parse_phandle_with_args(np, "dmas", "#dma-cells",
156 1, &dma_spec);
157 if (ret) {
158 dev_err(dev, "Can't parse dmas property\n");
159 return -ENODEV;
160 }
161 ssp->drcmr_tx = dma_spec.args[0];
162 of_node_put(dma_spec.np);
163 } else {
164 res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
165 if (res == NULL) {
166 dev_err(dev, "no SSP RX DRCMR defined\n");
167 return -ENODEV;
168 }
169 ssp->drcmr_rx = res->start;
170
171 res = platform_get_resource(pdev, IORESOURCE_DMA, 1);
172 if (res == NULL) {
173 dev_err(dev, "no SSP TX DRCMR defined\n");
174 return -ENODEV;
175 }
176 ssp->drcmr_tx = res->start;
108 } 177 }
109 ssp->drcmr_tx = res->start;
110 178
111 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 179 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
112 if (res == NULL) { 180 if (res == NULL) {
113 dev_err(&pdev->dev, "no memory resource defined\n"); 181 dev_err(dev, "no memory resource defined\n");
114 ret = -ENODEV; 182 return -ENODEV;
115 goto err_free_clk;
116 } 183 }
117 184
118 res = request_mem_region(res->start, resource_size(res), 185 res = devm_request_mem_region(dev, res->start, resource_size(res),
119 pdev->name); 186 pdev->name);
120 if (res == NULL) { 187 if (res == NULL) {
121 dev_err(&pdev->dev, "failed to request memory resource\n"); 188 dev_err(dev, "failed to request memory resource\n");
122 ret = -EBUSY; 189 return -EBUSY;
123 goto err_free_clk;
124 } 190 }
125 191
126 ssp->phys_base = res->start; 192 ssp->phys_base = res->start;
127 193
128 ssp->mmio_base = ioremap(res->start, resource_size(res)); 194 ssp->mmio_base = devm_ioremap(dev, res->start, resource_size(res));
129 if (ssp->mmio_base == NULL) { 195 if (ssp->mmio_base == NULL) {
130 dev_err(&pdev->dev, "failed to ioremap() registers\n"); 196 dev_err(dev, "failed to ioremap() registers\n");
131 ret = -ENODEV; 197 return -ENODEV;
132 goto err_free_mem;
133 } 198 }
134 199
135 ssp->irq = platform_get_irq(pdev, 0); 200 ssp->irq = platform_get_irq(pdev, 0);
136 if (ssp->irq < 0) { 201 if (ssp->irq < 0) {
137 dev_err(&pdev->dev, "no IRQ resource defined\n"); 202 dev_err(dev, "no IRQ resource defined\n");
138 ret = -ENODEV; 203 return -ENODEV;
139 goto err_free_io; 204 }
205
206 if (dev->of_node) {
207 const struct of_device_id *id =
208 of_match_device(of_match_ptr(pxa_ssp_of_ids), dev);
209 ssp->type = (int) id->data;
210 } else {
211 const struct platform_device_id *id =
212 platform_get_device_id(pdev);
213 ssp->type = (int) id->driver_data;
214
215 /* PXA2xx/3xx SSP ports starts from 1 and the internal pdev->id
216 * starts from 0, do a translation here
217 */
218 ssp->port_id = pdev->id + 1;
140 } 219 }
141 220
142 /* PXA2xx/3xx SSP ports starts from 1 and the internal pdev->id
143 * starts from 0, do a translation here
144 */
145 ssp->port_id = pdev->id + 1;
146 ssp->use_count = 0; 221 ssp->use_count = 0;
147 ssp->type = (int)id->driver_data; 222 ssp->of_node = dev->of_node;
148 223
149 mutex_lock(&ssp_lock); 224 mutex_lock(&ssp_lock);
150 list_add(&ssp->node, &ssp_list); 225 list_add(&ssp->node, &ssp_list);
151 mutex_unlock(&ssp_lock); 226 mutex_unlock(&ssp_lock);
152 227
153 platform_set_drvdata(pdev, ssp); 228 platform_set_drvdata(pdev, ssp);
154 return 0;
155 229
156err_free_io: 230 return 0;
157 iounmap(ssp->mmio_base);
158err_free_mem:
159 release_mem_region(res->start, resource_size(res));
160err_free_clk:
161 clk_put(ssp->clk);
162err_free:
163 kfree(ssp);
164 return ret;
165} 231}
166 232
167static int pxa_ssp_remove(struct platform_device *pdev) 233static int pxa_ssp_remove(struct platform_device *pdev)
@@ -201,8 +267,9 @@ static struct platform_driver pxa_ssp_driver = {
201 .probe = pxa_ssp_probe, 267 .probe = pxa_ssp_probe,
202 .remove = pxa_ssp_remove, 268 .remove = pxa_ssp_remove,
203 .driver = { 269 .driver = {
204 .owner = THIS_MODULE, 270 .owner = THIS_MODULE,
205 .name = "pxa2xx-ssp", 271 .name = "pxa2xx-ssp",
272 .of_match_table = of_match_ptr(pxa_ssp_of_ids),
206 }, 273 },
207 .id_table = ssp_id_table, 274 .id_table = ssp_id_table,
208}; 275};
diff --git a/arch/arm/plat-samsung/Kconfig b/arch/arm/plat-samsung/Kconfig
index a5b5ff6e68d2..7dfba937d8fc 100644
--- a/arch/arm/plat-samsung/Kconfig
+++ b/arch/arm/plat-samsung/Kconfig
@@ -25,7 +25,6 @@ config PLAT_S5P
25 select S5P_GPIO_DRVSTR 25 select S5P_GPIO_DRVSTR
26 select SAMSUNG_CLKSRC if !COMMON_CLK 26 select SAMSUNG_CLKSRC if !COMMON_CLK
27 select SAMSUNG_GPIOLIB_4BIT 27 select SAMSUNG_GPIOLIB_4BIT
28 select SAMSUNG_IRQ_VIC_TIMER
29 help 28 help
30 Base platform code for Samsung's S5P series SoC. 29 Base platform code for Samsung's S5P series SoC.
31 30
@@ -79,14 +78,6 @@ config SAMSUNG_ATAGS
79 78
80if SAMSUNG_ATAGS 79if SAMSUNG_ATAGS
81 80
82# timer options
83
84config SAMSUNG_HRT
85 bool
86 select SAMSUNG_DEV_PWM
87 help
88 Use the High Resolution timer support
89
90# clock options 81# clock options
91 82
92config SAMSUNG_CLOCK 83config SAMSUNG_CLOCK
@@ -106,11 +97,6 @@ config S5P_CLOCK
106 97
107# options for IRQ support 98# options for IRQ support
108 99
109config SAMSUNG_IRQ_VIC_TIMER
110 bool
111 help
112 Internal configuration to build the VIC timer interrupt code.
113
114config S5P_IRQ 100config S5P_IRQ
115 def_bool (ARCH_S5P64X0 || ARCH_S5PC100 || ARCH_S5PV210) 101 def_bool (ARCH_S5P64X0 || ARCH_S5PC100 || ARCH_S5PV210)
116 help 102 help
diff --git a/arch/arm/plat-samsung/Makefile b/arch/arm/plat-samsung/Makefile
index 199bbe304d02..498c7c23e9f4 100644
--- a/arch/arm/plat-samsung/Makefile
+++ b/arch/arm/plat-samsung/Makefile
@@ -12,15 +12,12 @@ obj- :=
12# Objects we always build independent of SoC choice 12# Objects we always build independent of SoC choice
13 13
14obj-y += init.o cpu.o 14obj-y += init.o cpu.o
15obj-$(CONFIG_SAMSUNG_HRT) += samsung-time.o
16 15
17obj-$(CONFIG_SAMSUNG_CLOCK) += clock.o 16obj-$(CONFIG_SAMSUNG_CLOCK) += clock.o
18obj-$(CONFIG_SAMSUNG_CLOCK) += pwm-clock.o
19 17
20obj-$(CONFIG_SAMSUNG_CLKSRC) += clock-clksrc.o 18obj-$(CONFIG_SAMSUNG_CLKSRC) += clock-clksrc.o
21obj-$(CONFIG_S5P_CLOCK) += s5p-clock.o 19obj-$(CONFIG_S5P_CLOCK) += s5p-clock.o
22 20
23obj-$(CONFIG_SAMSUNG_IRQ_VIC_TIMER) += irq-vic-timer.o
24obj-$(CONFIG_S5P_IRQ) += s5p-irq.o 21obj-$(CONFIG_S5P_IRQ) += s5p-irq.o
25obj-$(CONFIG_S5P_EXT_INT) += s5p-irq-eint.o 22obj-$(CONFIG_S5P_EXT_INT) += s5p-irq-eint.o
26obj-$(CONFIG_S5P_GPIO_INT) += s5p-irq-gpioint.o 23obj-$(CONFIG_S5P_GPIO_INT) += s5p-irq-gpioint.o
diff --git a/arch/arm/plat-samsung/dev-backlight.c b/arch/arm/plat-samsung/dev-backlight.c
index 5f197dcaf10c..d51f9565567c 100644
--- a/arch/arm/plat-samsung/dev-backlight.c
+++ b/arch/arm/plat-samsung/dev-backlight.c
@@ -20,13 +20,18 @@
20#include <plat/gpio-cfg.h> 20#include <plat/gpio-cfg.h>
21#include <plat/backlight.h> 21#include <plat/backlight.h>
22 22
23struct samsung_bl_drvdata {
24 struct platform_pwm_backlight_data plat_data;
25 struct samsung_bl_gpio_info *gpio_info;
26};
27
23static int samsung_bl_init(struct device *dev) 28static int samsung_bl_init(struct device *dev)
24{ 29{
25 int ret = 0; 30 int ret = 0;
26 struct platform_device *timer_dev = 31 struct platform_pwm_backlight_data *pdata = dev->platform_data;
27 container_of(dev->parent, struct platform_device, dev); 32 struct samsung_bl_drvdata *drvdata = container_of(pdata,
28 struct samsung_bl_gpio_info *bl_gpio_info = 33 struct samsung_bl_drvdata, plat_data);
29 timer_dev->dev.platform_data; 34 struct samsung_bl_gpio_info *bl_gpio_info = drvdata->gpio_info;
30 35
31 ret = gpio_request(bl_gpio_info->no, "Backlight"); 36 ret = gpio_request(bl_gpio_info->no, "Backlight");
32 if (ret) { 37 if (ret) {
@@ -42,10 +47,10 @@ static int samsung_bl_init(struct device *dev)
42 47
43static void samsung_bl_exit(struct device *dev) 48static void samsung_bl_exit(struct device *dev)
44{ 49{
45 struct platform_device *timer_dev = 50 struct platform_pwm_backlight_data *pdata = dev->platform_data;
46 container_of(dev->parent, struct platform_device, dev); 51 struct samsung_bl_drvdata *drvdata = container_of(pdata,
47 struct samsung_bl_gpio_info *bl_gpio_info = 52 struct samsung_bl_drvdata, plat_data);
48 timer_dev->dev.platform_data; 53 struct samsung_bl_gpio_info *bl_gpio_info = drvdata->gpio_info;
49 54
50 s3c_gpio_cfgpin(bl_gpio_info->no, S3C_GPIO_OUTPUT); 55 s3c_gpio_cfgpin(bl_gpio_info->no, S3C_GPIO_OUTPUT);
51 gpio_free(bl_gpio_info->no); 56 gpio_free(bl_gpio_info->no);
@@ -60,12 +65,14 @@ static void samsung_bl_exit(struct device *dev)
60 * for their specific boards 65 * for their specific boards
61 */ 66 */
62 67
63static struct platform_pwm_backlight_data samsung_dfl_bl_data __initdata = { 68static struct samsung_bl_drvdata samsung_dfl_bl_data __initdata = {
64 .max_brightness = 255, 69 .plat_data = {
65 .dft_brightness = 255, 70 .max_brightness = 255,
66 .pwm_period_ns = 78770, 71 .dft_brightness = 255,
67 .init = samsung_bl_init, 72 .pwm_period_ns = 78770,
68 .exit = samsung_bl_exit, 73 .init = samsung_bl_init,
74 .exit = samsung_bl_exit,
75 },
69}; 76};
70 77
71static struct platform_device samsung_dfl_bl_device __initdata = { 78static struct platform_device samsung_dfl_bl_device __initdata = {
@@ -82,6 +89,7 @@ void __init samsung_bl_set(struct samsung_bl_gpio_info *gpio_info,
82{ 89{
83 int ret = 0; 90 int ret = 0;
84 struct platform_device *samsung_bl_device; 91 struct platform_device *samsung_bl_device;
92 struct samsung_bl_drvdata *samsung_bl_drvdata;
85 struct platform_pwm_backlight_data *samsung_bl_data; 93 struct platform_pwm_backlight_data *samsung_bl_data;
86 94
87 samsung_bl_device = kmemdup(&samsung_dfl_bl_device, 95 samsung_bl_device = kmemdup(&samsung_dfl_bl_device,
@@ -91,17 +99,19 @@ void __init samsung_bl_set(struct samsung_bl_gpio_info *gpio_info,
91 return; 99 return;
92 } 100 }
93 101
94 samsung_bl_data = s3c_set_platdata(&samsung_dfl_bl_data, 102 samsung_bl_drvdata = kmemdup(&samsung_dfl_bl_data,
95 sizeof(struct platform_pwm_backlight_data), samsung_bl_device); 103 sizeof(samsung_dfl_bl_data), GFP_KERNEL);
96 if (!samsung_bl_data) { 104 if (!samsung_bl_drvdata) {
97 printk(KERN_ERR "%s: no memory for platform dev\n", __func__); 105 printk(KERN_ERR "%s: no memory for platform dev\n", __func__);
98 goto err_data; 106 goto err_data;
99 } 107 }
108 samsung_bl_device->dev.platform_data = &samsung_bl_drvdata->plat_data;
109 samsung_bl_drvdata->gpio_info = gpio_info;
110 samsung_bl_data = &samsung_bl_drvdata->plat_data;
100 111
101 /* Copy board specific data provided by user */ 112 /* Copy board specific data provided by user */
102 samsung_bl_data->pwm_id = bl_data->pwm_id; 113 samsung_bl_data->pwm_id = bl_data->pwm_id;
103 samsung_bl_device->dev.parent = 114 samsung_bl_device->dev.parent = &samsung_device_pwm.dev;
104 &s3c_device_timer[samsung_bl_data->pwm_id].dev;
105 115
106 if (bl_data->max_brightness) 116 if (bl_data->max_brightness)
107 samsung_bl_data->max_brightness = bl_data->max_brightness; 117 samsung_bl_data->max_brightness = bl_data->max_brightness;
@@ -122,17 +132,6 @@ void __init samsung_bl_set(struct samsung_bl_gpio_info *gpio_info,
122 if (bl_data->check_fb) 132 if (bl_data->check_fb)
123 samsung_bl_data->check_fb = bl_data->check_fb; 133 samsung_bl_data->check_fb = bl_data->check_fb;
124 134
125 /* Keep the GPIO info for future use */
126 s3c_device_timer[samsung_bl_data->pwm_id].dev.platform_data = gpio_info;
127
128 /* Register the specific PWM timer dev for Backlight control */
129 ret = platform_device_register(
130 &s3c_device_timer[samsung_bl_data->pwm_id]);
131 if (ret) {
132 printk(KERN_ERR "failed to register pwm timer for backlight: %d\n", ret);
133 goto err_plat_reg1;
134 }
135
136 /* Register the Backlight dev */ 135 /* Register the Backlight dev */
137 ret = platform_device_register(samsung_bl_device); 136 ret = platform_device_register(samsung_bl_device);
138 if (ret) { 137 if (ret) {
@@ -143,8 +142,6 @@ void __init samsung_bl_set(struct samsung_bl_gpio_info *gpio_info,
143 return; 142 return;
144 143
145err_plat_reg2: 144err_plat_reg2:
146 platform_device_unregister(&s3c_device_timer[samsung_bl_data->pwm_id]);
147err_plat_reg1:
148 kfree(samsung_bl_data); 145 kfree(samsung_bl_data);
149err_data: 146err_data:
150 kfree(samsung_bl_device); 147 kfree(samsung_bl_device);
diff --git a/arch/arm/plat-samsung/devs.c b/arch/arm/plat-samsung/devs.c
index 0f9c3f431a5f..8ce0ac007eb9 100644
--- a/arch/arm/plat-samsung/devs.c
+++ b/arch/arm/plat-samsung/devs.c
@@ -58,6 +58,7 @@
58#include <plat/keypad.h> 58#include <plat/keypad.h>
59#include <linux/platform_data/mmc-s3cmci.h> 59#include <linux/platform_data/mmc-s3cmci.h>
60#include <linux/platform_data/mtd-nand-s3c2410.h> 60#include <linux/platform_data/mtd-nand-s3c2410.h>
61#include <plat/pwm-core.h>
61#include <plat/sdhci.h> 62#include <plat/sdhci.h>
62#include <linux/platform_data/touchscreen-s3c2410.h> 63#include <linux/platform_data/touchscreen-s3c2410.h>
63#include <linux/platform_data/usb-s3c2410_udc.h> 64#include <linux/platform_data/usb-s3c2410_udc.h>
@@ -1097,36 +1098,21 @@ arch_initcall(s5p_pmu_init);
1097/* PWM Timer */ 1098/* PWM Timer */
1098 1099
1099#ifdef CONFIG_SAMSUNG_DEV_PWM 1100#ifdef CONFIG_SAMSUNG_DEV_PWM
1101static struct resource samsung_pwm_resource[] = {
1102 DEFINE_RES_MEM(SAMSUNG_PA_TIMER, SZ_4K),
1103};
1100 1104
1101#define TIMER_RESOURCE_SIZE (1) 1105struct platform_device samsung_device_pwm = {
1102 1106 .name = "samsung-pwm",
1103#define TIMER_RESOURCE(_tmr, _irq) \ 1107 .id = -1,
1104 (struct resource [TIMER_RESOURCE_SIZE]) { \ 1108 .num_resources = ARRAY_SIZE(samsung_pwm_resource),
1105 [0] = { \ 1109 .resource = samsung_pwm_resource,
1106 .start = _irq, \
1107 .end = _irq, \
1108 .flags = IORESOURCE_IRQ \
1109 } \
1110 }
1111
1112#define DEFINE_S3C_TIMER(_tmr_no, _irq) \
1113 .name = "s3c24xx-pwm", \
1114 .id = _tmr_no, \
1115 .num_resources = TIMER_RESOURCE_SIZE, \
1116 .resource = TIMER_RESOURCE(_tmr_no, _irq), \
1117
1118/*
1119 * since we already have an static mapping for the timer,
1120 * we do not bother setting any IO resource for the base.
1121 */
1122
1123struct platform_device s3c_device_timer[] = {
1124 [0] = { DEFINE_S3C_TIMER(0, IRQ_TIMER0) },
1125 [1] = { DEFINE_S3C_TIMER(1, IRQ_TIMER1) },
1126 [2] = { DEFINE_S3C_TIMER(2, IRQ_TIMER2) },
1127 [3] = { DEFINE_S3C_TIMER(3, IRQ_TIMER3) },
1128 [4] = { DEFINE_S3C_TIMER(4, IRQ_TIMER4) },
1129}; 1110};
1111
1112void __init samsung_pwm_set_platdata(struct samsung_pwm_variant *pd)
1113{
1114 samsung_device_pwm.dev.platform_data = pd;
1115}
1130#endif /* CONFIG_SAMSUNG_DEV_PWM */ 1116#endif /* CONFIG_SAMSUNG_DEV_PWM */
1131 1117
1132/* RTC */ 1118/* RTC */
diff --git a/arch/arm/plat-samsung/include/plat/clock.h b/arch/arm/plat-samsung/include/plat/clock.h
index df45d6edc98d..63239f409807 100644
--- a/arch/arm/plat-samsung/include/plat/clock.h
+++ b/arch/arm/plat-samsung/include/plat/clock.h
@@ -145,10 +145,6 @@ extern int s3c2443_clkcon_enable_s(struct clk *clk, int enable);
145 145
146extern int s3c64xx_sclk_ctrl(struct clk *clk, int enable); 146extern int s3c64xx_sclk_ctrl(struct clk *clk, int enable);
147 147
148/* Init for pwm clock code */
149
150extern void s3c_pwmclk_init(void);
151
152/* Global watchdog clock used by arch_wtd_reset() callback */ 148/* Global watchdog clock used by arch_wtd_reset() callback */
153 149
154extern struct clk *s3c2410_wdtclk; 150extern struct clk *s3c2410_wdtclk;
diff --git a/arch/arm/plat-samsung/include/plat/devs.h b/arch/arm/plat-samsung/include/plat/devs.h
index 87d501ff3328..0dc4ac4909b0 100644
--- a/arch/arm/plat-samsung/include/plat/devs.h
+++ b/arch/arm/plat-samsung/include/plat/devs.h
@@ -134,6 +134,7 @@ extern struct platform_device exynos4_device_spdif;
134 134
135extern struct platform_device samsung_asoc_idma; 135extern struct platform_device samsung_asoc_idma;
136extern struct platform_device samsung_device_keypad; 136extern struct platform_device samsung_device_keypad;
137extern struct platform_device samsung_device_pwm;
137 138
138/* s3c2440 specific devices */ 139/* s3c2440 specific devices */
139 140
diff --git a/arch/arm/plat-samsung/include/plat/irq-vic-timer.h b/arch/arm/plat-samsung/include/plat/irq-vic-timer.h
deleted file mode 100644
index 5b9c42fd32d7..000000000000
--- a/arch/arm/plat-samsung/include/plat/irq-vic-timer.h
+++ /dev/null
@@ -1,13 +0,0 @@
1/* arch/arm/plat-samsung/include/plat/irq-vic-timer.h
2 *
3 * Copyright (c) 2010 Simtec Electronics
4 * Ben Dooks <ben@simtec.co.uk>
5 *
6 * Header file for Samsung SoC IRQ VIC timer
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11*/
12
13extern void s3c_init_vic_timer_irq(unsigned int num, unsigned int timer_irq);
diff --git a/arch/arm/plat-samsung/include/plat/irqs.h b/arch/arm/plat-samsung/include/plat/irqs.h
index df46b776976a..039001c0ef05 100644
--- a/arch/arm/plat-samsung/include/plat/irqs.h
+++ b/arch/arm/plat-samsung/include/plat/irqs.h
@@ -44,15 +44,6 @@
44#define S5P_IRQ_VIC2(x) (S5P_VIC2_BASE + (x)) 44#define S5P_IRQ_VIC2(x) (S5P_VIC2_BASE + (x))
45#define S5P_IRQ_VIC3(x) (S5P_VIC3_BASE + (x)) 45#define S5P_IRQ_VIC3(x) (S5P_VIC3_BASE + (x))
46 46
47#define S5P_TIMER_IRQ(x) (IRQ_TIMER_BASE + (x))
48
49#define IRQ_TIMER0 S5P_TIMER_IRQ(0)
50#define IRQ_TIMER1 S5P_TIMER_IRQ(1)
51#define IRQ_TIMER2 S5P_TIMER_IRQ(2)
52#define IRQ_TIMER3 S5P_TIMER_IRQ(3)
53#define IRQ_TIMER4 S5P_TIMER_IRQ(4)
54#define IRQ_TIMER_COUNT (5)
55
56#define IRQ_EINT(x) ((x) < 16 ? ((x) + S5P_EINT_BASE1) \ 47#define IRQ_EINT(x) ((x) < 16 ? ((x) + S5P_EINT_BASE1) \
57 : ((x) - 16 + S5P_EINT_BASE2)) 48 : ((x) - 16 + S5P_EINT_BASE2))
58 49
diff --git a/arch/arm/plat-samsung/include/plat/pwm-clock.h b/arch/arm/plat-samsung/include/plat/pwm-clock.h
deleted file mode 100644
index bf6a60eb6237..000000000000
--- a/arch/arm/plat-samsung/include/plat/pwm-clock.h
+++ /dev/null
@@ -1,81 +0,0 @@
1/* linux/arch/arm/plat-samsung/include/plat/pwm-clock.h
2 *
3 * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
4 * http://www.samsung.com
5 *
6 * Copyright 2008 Openmoko, Inc.
7 * Copyright 2008 Simtec Electronics
8 * Ben Dooks <ben@simtec.co.uk>
9 * http://armlinux.simtec.co.uk/
10 *
11 * SAMSUNG - pwm clock and timer support
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License version 2 as
15 * published by the Free Software Foundation.
16*/
17
18#ifndef __ASM_PLAT_PWM_CLOCK_H
19#define __ASM_PLAT_PWM_CLOCK_H __FILE__
20
21/**
22 * pwm_cfg_src_is_tclk() - return whether the given mux config is a tclk
23 * @tcfg: The timer TCFG1 register bits shifted down to 0.
24 *
25 * Return true if the given configuration from TCFG1 is a TCLK instead
26 * any of the TDIV clocks.
27 */
28static inline int pwm_cfg_src_is_tclk(unsigned long tcfg)
29{
30 if (soc_is_s3c24xx())
31 return tcfg == S3C2410_TCFG1_MUX_TCLK;
32 else if (soc_is_s3c64xx() || soc_is_s5pc100())
33 return tcfg >= S3C64XX_TCFG1_MUX_TCLK;
34 else if (soc_is_s5p6440() || soc_is_s5p6450())
35 return 0;
36 else
37 return tcfg == S3C64XX_TCFG1_MUX_TCLK;
38}
39
40/**
41 * tcfg_to_divisor() - convert tcfg1 setting to a divisor
42 * @tcfg1: The tcfg1 setting, shifted down.
43 *
44 * Get the divisor value for the given tcfg1 setting. We assume the
45 * caller has already checked to see if this is not a TCLK source.
46 */
47static inline unsigned long tcfg_to_divisor(unsigned long tcfg1)
48{
49 if (soc_is_s3c24xx())
50 return 1 << (tcfg1 + 1);
51 else
52 return 1 << tcfg1;
53}
54
55/**
56 * pwm_tdiv_has_div1() - does the tdiv setting have a /1
57 *
58 * Return true if we have a /1 in the tdiv setting.
59 */
60static inline unsigned int pwm_tdiv_has_div1(void)
61{
62 if (soc_is_s3c24xx())
63 return 0;
64 else
65 return 1;
66}
67
68/**
69 * pwm_tdiv_div_bits() - calculate TCFG1 divisor value.
70 * @div: The divisor to calculate the bit information for.
71 *
72 * Turn a divisor into the necessary bit field for TCFG1.
73 */
74static inline unsigned long pwm_tdiv_div_bits(unsigned int div)
75{
76 if (soc_is_s3c24xx())
77 return ilog2(div) - 1;
78 else
79 return ilog2(div);
80}
81#endif /* __ASM_PLAT_PWM_CLOCK_H */
diff --git a/arch/arm/plat-samsung/include/plat/pwm-core.h b/arch/arm/plat-samsung/include/plat/pwm-core.h
new file mode 100644
index 000000000000..5bff1facb672
--- /dev/null
+++ b/arch/arm/plat-samsung/include/plat/pwm-core.h
@@ -0,0 +1,22 @@
1/*
2 * Copyright 2013 Tomasz Figa <tomasz.figa@gmail.com>
3 *
4 * Samsung PWM controller platform data helpers.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10
11#ifndef __ASM_ARCH_PWM_CORE_H
12#define __ASM_ARCH_PWM_CORE_H __FILE__
13
14#include <clocksource/samsung_pwm.h>
15
16#ifdef CONFIG_SAMSUNG_DEV_PWM
17extern void samsung_pwm_set_platdata(struct samsung_pwm_variant *pd);
18#else
19static inline void samsung_pwm_set_platdata(struct samsung_pwm_variant *pd) { }
20#endif
21
22#endif /* __ASM_ARCH_PWM_CORE_H */
diff --git a/arch/arm/plat-samsung/include/plat/regs-timer.h b/arch/arm/plat-samsung/include/plat/regs-timer.h
deleted file mode 100644
index d097d92f8cc7..000000000000
--- a/arch/arm/plat-samsung/include/plat/regs-timer.h
+++ /dev/null
@@ -1,124 +0,0 @@
1/* arch/arm/mach-s3c2410/include/mach/regs-timer.h
2 *
3 * Copyright (c) 2003 Simtec Electronics <linux@simtec.co.uk>
4 * http://www.simtec.co.uk/products/SWLINUX/
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 * S3C2410 Timer configuration
11*/
12
13#ifndef __ASM_ARCH_REGS_TIMER_H
14#define __ASM_ARCH_REGS_TIMER_H
15
16#define S3C_TIMERREG(x) (S3C_VA_TIMER + (x))
17#define S3C_TIMERREG2(tmr,reg) S3C_TIMERREG((reg)+0x0c+((tmr)*0x0c))
18
19#define S3C2410_TCFG0 S3C_TIMERREG(0x00)
20#define S3C2410_TCFG1 S3C_TIMERREG(0x04)
21#define S3C2410_TCON S3C_TIMERREG(0x08)
22
23#define S3C64XX_TINT_CSTAT S3C_TIMERREG(0x44)
24
25#define S3C2410_TCFG_PRESCALER0_MASK (255<<0)
26#define S3C2410_TCFG_PRESCALER1_MASK (255<<8)
27#define S3C2410_TCFG_PRESCALER1_SHIFT (8)
28#define S3C2410_TCFG_DEADZONE_MASK (255<<16)
29#define S3C2410_TCFG_DEADZONE_SHIFT (16)
30
31#define S3C2410_TCFG1_MUX4_DIV2 (0<<16)
32#define S3C2410_TCFG1_MUX4_DIV4 (1<<16)
33#define S3C2410_TCFG1_MUX4_DIV8 (2<<16)
34#define S3C2410_TCFG1_MUX4_DIV16 (3<<16)
35#define S3C2410_TCFG1_MUX4_TCLK1 (4<<16)
36#define S3C2410_TCFG1_MUX4_MASK (15<<16)
37#define S3C2410_TCFG1_MUX4_SHIFT (16)
38
39#define S3C2410_TCFG1_MUX3_DIV2 (0<<12)
40#define S3C2410_TCFG1_MUX3_DIV4 (1<<12)
41#define S3C2410_TCFG1_MUX3_DIV8 (2<<12)
42#define S3C2410_TCFG1_MUX3_DIV16 (3<<12)
43#define S3C2410_TCFG1_MUX3_TCLK1 (4<<12)
44#define S3C2410_TCFG1_MUX3_MASK (15<<12)
45
46
47#define S3C2410_TCFG1_MUX2_DIV2 (0<<8)
48#define S3C2410_TCFG1_MUX2_DIV4 (1<<8)
49#define S3C2410_TCFG1_MUX2_DIV8 (2<<8)
50#define S3C2410_TCFG1_MUX2_DIV16 (3<<8)
51#define S3C2410_TCFG1_MUX2_TCLK1 (4<<8)
52#define S3C2410_TCFG1_MUX2_MASK (15<<8)
53
54
55#define S3C2410_TCFG1_MUX1_DIV2 (0<<4)
56#define S3C2410_TCFG1_MUX1_DIV4 (1<<4)
57#define S3C2410_TCFG1_MUX1_DIV8 (2<<4)
58#define S3C2410_TCFG1_MUX1_DIV16 (3<<4)
59#define S3C2410_TCFG1_MUX1_TCLK0 (4<<4)
60#define S3C2410_TCFG1_MUX1_MASK (15<<4)
61
62#define S3C2410_TCFG1_MUX0_DIV2 (0<<0)
63#define S3C2410_TCFG1_MUX0_DIV4 (1<<0)
64#define S3C2410_TCFG1_MUX0_DIV8 (2<<0)
65#define S3C2410_TCFG1_MUX0_DIV16 (3<<0)
66#define S3C2410_TCFG1_MUX0_TCLK0 (4<<0)
67#define S3C2410_TCFG1_MUX0_MASK (15<<0)
68
69#define S3C2410_TCFG1_MUX_DIV2 (0<<0)
70#define S3C2410_TCFG1_MUX_DIV4 (1<<0)
71#define S3C2410_TCFG1_MUX_DIV8 (2<<0)
72#define S3C2410_TCFG1_MUX_DIV16 (3<<0)
73#define S3C2410_TCFG1_MUX_TCLK (4<<0)
74#define S3C2410_TCFG1_MUX_MASK (15<<0)
75
76#define S3C64XX_TCFG1_MUX_DIV1 (0<<0)
77#define S3C64XX_TCFG1_MUX_DIV2 (1<<0)
78#define S3C64XX_TCFG1_MUX_DIV4 (2<<0)
79#define S3C64XX_TCFG1_MUX_DIV8 (3<<0)
80#define S3C64XX_TCFG1_MUX_DIV16 (4<<0)
81#define S3C64XX_TCFG1_MUX_TCLK (5<<0) /* 3 sets of TCLK */
82#define S3C64XX_TCFG1_MUX_MASK (15<<0)
83
84#define S3C2410_TCFG1_SHIFT(x) ((x) * 4)
85
86/* for each timer, we have an count buffer, an compare buffer and
87 * an observation buffer
88*/
89
90/* WARNING - timer 4 has no buffer reg, and it's observation is at +4 */
91
92#define S3C2410_TCNTB(tmr) S3C_TIMERREG2(tmr, 0x00)
93#define S3C2410_TCMPB(tmr) S3C_TIMERREG2(tmr, 0x04)
94#define S3C2410_TCNTO(tmr) S3C_TIMERREG2(tmr, (((tmr) == 4) ? 0x04 : 0x08))
95
96#define S3C2410_TCON_T4RELOAD (1<<22)
97#define S3C2410_TCON_T4MANUALUPD (1<<21)
98#define S3C2410_TCON_T4START (1<<20)
99
100#define S3C2410_TCON_T3RELOAD (1<<19)
101#define S3C2410_TCON_T3INVERT (1<<18)
102#define S3C2410_TCON_T3MANUALUPD (1<<17)
103#define S3C2410_TCON_T3START (1<<16)
104
105#define S3C2410_TCON_T2RELOAD (1<<15)
106#define S3C2410_TCON_T2INVERT (1<<14)
107#define S3C2410_TCON_T2MANUALUPD (1<<13)
108#define S3C2410_TCON_T2START (1<<12)
109
110#define S3C2410_TCON_T1RELOAD (1<<11)
111#define S3C2410_TCON_T1INVERT (1<<10)
112#define S3C2410_TCON_T1MANUALUPD (1<<9)
113#define S3C2410_TCON_T1START (1<<8)
114
115#define S3C2410_TCON_T0DEADZONE (1<<4)
116#define S3C2410_TCON_T0RELOAD (1<<3)
117#define S3C2410_TCON_T0INVERT (1<<2)
118#define S3C2410_TCON_T0MANUALUPD (1<<1)
119#define S3C2410_TCON_T0START (1<<0)
120
121#endif /* __ASM_ARCH_REGS_TIMER_H */
122
123
124
diff --git a/arch/arm/plat-samsung/include/plat/samsung-time.h b/arch/arm/plat-samsung/include/plat/samsung-time.h
index 4cc99bb1f176..209464adef97 100644
--- a/arch/arm/plat-samsung/include/plat/samsung-time.h
+++ b/arch/arm/plat-samsung/include/plat/samsung-time.h
@@ -22,29 +22,6 @@ enum samsung_timer_mode {
22 SAMSUNG_PWM4, 22 SAMSUNG_PWM4,
23}; 23};
24 24
25struct samsung_timer_source {
26 unsigned int event_id;
27 unsigned int source_id;
28};
29
30/* Be able to sleep for atleast 4 seconds (usually more) */
31#define SAMSUNG_TIMER_MIN_RANGE 4
32
33#if defined(CONFIG_ARCH_S3C24XX) || defined(CONFIG_ARCH_S5PC100)
34#define TCNT_MAX 0xffff
35#define TSCALER_DIV 25
36#define TDIV 50
37#define TSIZE 16
38#else
39#define TCNT_MAX 0xffffffff
40#define TSCALER_DIV 2
41#define TDIV 2
42#define TSIZE 32
43#endif
44
45#define NON_PERIODIC 0
46#define PERIODIC 1
47
48extern void __init samsung_set_timer_source(enum samsung_timer_mode event, 25extern void __init samsung_set_timer_source(enum samsung_timer_mode event,
49 enum samsung_timer_mode source); 26 enum samsung_timer_mode source);
50 27
diff --git a/arch/arm/plat-samsung/include/plat/sdhci.h b/arch/arm/plat-samsung/include/plat/sdhci.h
index ce1d0f785efd..bf650218b40e 100644
--- a/arch/arm/plat-samsung/include/plat/sdhci.h
+++ b/arch/arm/plat-samsung/include/plat/sdhci.h
@@ -260,44 +260,6 @@ static inline void s5pv210_default_sdhci3(void) { }
260 260
261#endif /* CONFIG_S5PV210_SETUP_SDHCI */ 261#endif /* CONFIG_S5PV210_SETUP_SDHCI */
262 262
263/* EXYNOS4 SDHCI setup */
264#ifdef CONFIG_EXYNOS4_SETUP_SDHCI
265static inline void exynos4_default_sdhci0(void)
266{
267#ifdef CONFIG_S3C_DEV_HSMMC
268 s3c_hsmmc0_def_platdata.cfg_gpio = exynos4_setup_sdhci0_cfg_gpio;
269#endif
270}
271
272static inline void exynos4_default_sdhci1(void)
273{
274#ifdef CONFIG_S3C_DEV_HSMMC1
275 s3c_hsmmc1_def_platdata.cfg_gpio = exynos4_setup_sdhci1_cfg_gpio;
276#endif
277}
278
279static inline void exynos4_default_sdhci2(void)
280{
281#ifdef CONFIG_S3C_DEV_HSMMC2
282 s3c_hsmmc2_def_platdata.cfg_gpio = exynos4_setup_sdhci2_cfg_gpio;
283#endif
284}
285
286static inline void exynos4_default_sdhci3(void)
287{
288#ifdef CONFIG_S3C_DEV_HSMMC3
289 s3c_hsmmc3_def_platdata.cfg_gpio = exynos4_setup_sdhci3_cfg_gpio;
290#endif
291}
292
293#else
294static inline void exynos4_default_sdhci0(void) { }
295static inline void exynos4_default_sdhci1(void) { }
296static inline void exynos4_default_sdhci2(void) { }
297static inline void exynos4_default_sdhci3(void) { }
298
299#endif /* CONFIG_EXYNOS4_SETUP_SDHCI */
300
301static inline void s3c_sdhci_setname(int id, char *name) 263static inline void s3c_sdhci_setname(int id, char *name)
302{ 264{
303 switch (id) { 265 switch (id) {
diff --git a/arch/arm/plat-samsung/irq-vic-timer.c b/arch/arm/plat-samsung/irq-vic-timer.c
deleted file mode 100644
index 0fceb4273824..000000000000
--- a/arch/arm/plat-samsung/irq-vic-timer.c
+++ /dev/null
@@ -1,98 +0,0 @@
1/* arch/arm/plat-samsung/irq-vic-timer.c
2 * originally part of arch/arm/plat-s3c64xx/irq.c
3 *
4 * Copyright 2008 Openmoko, Inc.
5 * Copyright 2008 Simtec Electronics
6 * Ben Dooks <ben@simtec.co.uk>
7 * http://armlinux.simtec.co.uk/
8 *
9 * S3C64XX - Interrupt handling
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
14 */
15
16#include <linux/kernel.h>
17#include <linux/interrupt.h>
18#include <linux/irq.h>
19#include <linux/irqchip/chained_irq.h>
20#include <linux/io.h>
21
22#include <mach/map.h>
23#include <mach/irqs.h>
24#include <plat/cpu.h>
25#include <plat/irq-vic-timer.h>
26#include <plat/regs-timer.h>
27
28static void s3c_irq_demux_vic_timer(unsigned int irq, struct irq_desc *desc)
29{
30 struct irq_chip *chip = irq_get_chip(irq);
31 chained_irq_enter(chip, desc);
32 generic_handle_irq((int)desc->irq_data.handler_data);
33 chained_irq_exit(chip, desc);
34}
35
36/* We assume the IRQ_TIMER0..IRQ_TIMER4 range is continuous. */
37static void s3c_irq_timer_ack(struct irq_data *d)
38{
39 struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
40 u32 mask = (1 << 5) << (d->irq - gc->irq_base);
41
42 irq_reg_writel(mask | gc->mask_cache, gc->reg_base);
43}
44
45/**
46 * s3c_init_vic_timer_irq() - initialise timer irq chanined off VIC.\
47 * @num: Number of timers to initialize
48 * @timer_irq: Base IRQ number to be used for the timers.
49 *
50 * Register the necessary IRQ chaining and support for the timer IRQs
51 * chained of the VIC.
52 */
53void __init s3c_init_vic_timer_irq(unsigned int num, unsigned int timer_irq)
54{
55 unsigned int pirq[5] = { IRQ_TIMER0_VIC, IRQ_TIMER1_VIC, IRQ_TIMER2_VIC,
56 IRQ_TIMER3_VIC, IRQ_TIMER4_VIC };
57 struct irq_chip_generic *s3c_tgc;
58 struct irq_chip_type *ct;
59 unsigned int i;
60
61#ifdef CONFIG_ARCH_EXYNOS
62 if (soc_is_exynos5250()) {
63 pirq[0] = EXYNOS5_IRQ_TIMER0_VIC;
64 pirq[1] = EXYNOS5_IRQ_TIMER1_VIC;
65 pirq[2] = EXYNOS5_IRQ_TIMER2_VIC;
66 pirq[3] = EXYNOS5_IRQ_TIMER3_VIC;
67 pirq[4] = EXYNOS5_IRQ_TIMER4_VIC;
68 } else {
69 pirq[0] = EXYNOS4_IRQ_TIMER0_VIC;
70 pirq[1] = EXYNOS4_IRQ_TIMER1_VIC;
71 pirq[2] = EXYNOS4_IRQ_TIMER2_VIC;
72 pirq[3] = EXYNOS4_IRQ_TIMER3_VIC;
73 pirq[4] = EXYNOS4_IRQ_TIMER4_VIC;
74 }
75#endif
76 s3c_tgc = irq_alloc_generic_chip("s3c-timer", 1, timer_irq,
77 S3C64XX_TINT_CSTAT, handle_level_irq);
78
79 if (!s3c_tgc) {
80 pr_err("%s: irq_alloc_generic_chip for IRQ %d failed\n",
81 __func__, timer_irq);
82 return;
83 }
84
85 ct = s3c_tgc->chip_types;
86 ct->chip.irq_mask = irq_gc_mask_clr_bit;
87 ct->chip.irq_unmask = irq_gc_mask_set_bit;
88 ct->chip.irq_ack = s3c_irq_timer_ack;
89 irq_setup_generic_chip(s3c_tgc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE,
90 IRQ_NOREQUEST | IRQ_NOPROBE, 0);
91 /* Clear the upper bits of the mask_cache*/
92 s3c_tgc->mask_cache &= 0x1f;
93
94 for (i = 0; i < num; i++, timer_irq++) {
95 irq_set_chained_handler(pirq[i], s3c_irq_demux_vic_timer);
96 irq_set_handler_data(pirq[i], (void *)timer_irq);
97 }
98}
diff --git a/arch/arm/plat-samsung/pwm-clock.c b/arch/arm/plat-samsung/pwm-clock.c
deleted file mode 100644
index a35ff3bcffe4..000000000000
--- a/arch/arm/plat-samsung/pwm-clock.c
+++ /dev/null
@@ -1,474 +0,0 @@
1/* linux/arch/arm/plat-s3c24xx/pwm-clock.c
2 *
3 * Copyright (c) 2007 Simtec Electronics
4 * Copyright (c) 2007, 2008 Ben Dooks
5 * Ben Dooks <ben-linux@fluff.org>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License.
10*/
11
12#include <linux/init.h>
13#include <linux/module.h>
14#include <linux/kernel.h>
15#include <linux/list.h>
16#include <linux/errno.h>
17#include <linux/log2.h>
18#include <linux/clk.h>
19#include <linux/err.h>
20#include <linux/io.h>
21
22#include <mach/hardware.h>
23#include <mach/map.h>
24#include <asm/irq.h>
25
26#include <plat/clock.h>
27#include <plat/cpu.h>
28
29#include <plat/regs-timer.h>
30#include <plat/pwm-clock.h>
31
32/* Each of the timers 0 through 5 go through the following
33 * clock tree, with the inputs depending on the timers.
34 *
35 * pclk ---- [ prescaler 0 ] -+---> timer 0
36 * +---> timer 1
37 *
38 * pclk ---- [ prescaler 1 ] -+---> timer 2
39 * +---> timer 3
40 * \---> timer 4
41 *
42 * Which are fed into the timers as so:
43 *
44 * prescaled 0 ---- [ div 2,4,8,16 ] ---\
45 * [mux] -> timer 0
46 * tclk 0 ------------------------------/
47 *
48 * prescaled 0 ---- [ div 2,4,8,16 ] ---\
49 * [mux] -> timer 1
50 * tclk 0 ------------------------------/
51 *
52 *
53 * prescaled 1 ---- [ div 2,4,8,16 ] ---\
54 * [mux] -> timer 2
55 * tclk 1 ------------------------------/
56 *
57 * prescaled 1 ---- [ div 2,4,8,16 ] ---\
58 * [mux] -> timer 3
59 * tclk 1 ------------------------------/
60 *
61 * prescaled 1 ---- [ div 2,4,8, 16 ] --\
62 * [mux] -> timer 4
63 * tclk 1 ------------------------------/
64 *
65 * Since the mux and the divider are tied together in the
66 * same register space, it is impossible to set the parent
67 * and the rate at the same time. To avoid this, we add an
68 * intermediate 'prescaled-and-divided' clock to select
69 * as the parent for the timer input clock called tdiv.
70 *
71 * prescaled clk --> pwm-tdiv ---\
72 * [ mux ] --> timer X
73 * tclk -------------------------/
74*/
75
76static struct clk clk_timer_scaler[];
77
78static unsigned long clk_pwm_scaler_get_rate(struct clk *clk)
79{
80 unsigned long tcfg0 = __raw_readl(S3C2410_TCFG0);
81
82 if (clk == &clk_timer_scaler[1]) {
83 tcfg0 &= S3C2410_TCFG_PRESCALER1_MASK;
84 tcfg0 >>= S3C2410_TCFG_PRESCALER1_SHIFT;
85 } else {
86 tcfg0 &= S3C2410_TCFG_PRESCALER0_MASK;
87 }
88
89 return clk_get_rate(clk->parent) / (tcfg0 + 1);
90}
91
92static unsigned long clk_pwm_scaler_round_rate(struct clk *clk,
93 unsigned long rate)
94{
95 unsigned long parent_rate = clk_get_rate(clk->parent);
96 unsigned long divisor = parent_rate / rate;
97
98 if (divisor > 256)
99 divisor = 256;
100 else if (divisor < 2)
101 divisor = 2;
102
103 return parent_rate / divisor;
104}
105
106static int clk_pwm_scaler_set_rate(struct clk *clk, unsigned long rate)
107{
108 unsigned long round = clk_pwm_scaler_round_rate(clk, rate);
109 unsigned long tcfg0;
110 unsigned long divisor;
111 unsigned long flags;
112
113 divisor = clk_get_rate(clk->parent) / round;
114 divisor--;
115
116 local_irq_save(flags);
117 tcfg0 = __raw_readl(S3C2410_TCFG0);
118
119 if (clk == &clk_timer_scaler[1]) {
120 tcfg0 &= ~S3C2410_TCFG_PRESCALER1_MASK;
121 tcfg0 |= divisor << S3C2410_TCFG_PRESCALER1_SHIFT;
122 } else {
123 tcfg0 &= ~S3C2410_TCFG_PRESCALER0_MASK;
124 tcfg0 |= divisor;
125 }
126
127 __raw_writel(tcfg0, S3C2410_TCFG0);
128 local_irq_restore(flags);
129
130 return 0;
131}
132
133static struct clk_ops clk_pwm_scaler_ops = {
134 .get_rate = clk_pwm_scaler_get_rate,
135 .set_rate = clk_pwm_scaler_set_rate,
136 .round_rate = clk_pwm_scaler_round_rate,
137};
138
139static struct clk clk_timer_scaler[] = {
140 [0] = {
141 .name = "pwm-scaler0",
142 .id = -1,
143 .ops = &clk_pwm_scaler_ops,
144 },
145 [1] = {
146 .name = "pwm-scaler1",
147 .id = -1,
148 .ops = &clk_pwm_scaler_ops,
149 },
150};
151
152static struct clk clk_timer_tclk[] = {
153 [0] = {
154 .name = "pwm-tclk0",
155 .id = -1,
156 },
157 [1] = {
158 .name = "pwm-tclk1",
159 .id = -1,
160 },
161};
162
163struct pwm_tdiv_clk {
164 struct clk clk;
165 unsigned int divisor;
166};
167
168static inline struct pwm_tdiv_clk *to_tdiv(struct clk *clk)
169{
170 return container_of(clk, struct pwm_tdiv_clk, clk);
171}
172
173static unsigned long clk_pwm_tdiv_get_rate(struct clk *clk)
174{
175 unsigned long tcfg1 = __raw_readl(S3C2410_TCFG1);
176 unsigned int divisor;
177
178 tcfg1 >>= S3C2410_TCFG1_SHIFT(clk->id);
179 tcfg1 &= S3C2410_TCFG1_MUX_MASK;
180
181 if (pwm_cfg_src_is_tclk(tcfg1))
182 divisor = to_tdiv(clk)->divisor;
183 else
184 divisor = tcfg_to_divisor(tcfg1);
185
186 return clk_get_rate(clk->parent) / divisor;
187}
188
189static unsigned long clk_pwm_tdiv_round_rate(struct clk *clk,
190 unsigned long rate)
191{
192 unsigned long parent_rate;
193 unsigned long divisor;
194
195 parent_rate = clk_get_rate(clk->parent);
196 divisor = parent_rate / rate;
197
198 if (divisor <= 1 && pwm_tdiv_has_div1())
199 divisor = 1;
200 else if (divisor <= 2)
201 divisor = 2;
202 else if (divisor <= 4)
203 divisor = 4;
204 else if (divisor <= 8)
205 divisor = 8;
206 else
207 divisor = 16;
208
209 return parent_rate / divisor;
210}
211
212static unsigned long clk_pwm_tdiv_bits(struct pwm_tdiv_clk *divclk)
213{
214 return pwm_tdiv_div_bits(divclk->divisor);
215}
216
217static void clk_pwm_tdiv_update(struct pwm_tdiv_clk *divclk)
218{
219 unsigned long tcfg1 = __raw_readl(S3C2410_TCFG1);
220 unsigned long bits = clk_pwm_tdiv_bits(divclk);
221 unsigned long flags;
222 unsigned long shift = S3C2410_TCFG1_SHIFT(divclk->clk.id);
223
224 local_irq_save(flags);
225
226 tcfg1 = __raw_readl(S3C2410_TCFG1);
227 tcfg1 &= ~(S3C2410_TCFG1_MUX_MASK << shift);
228 tcfg1 |= bits << shift;
229 __raw_writel(tcfg1, S3C2410_TCFG1);
230
231 local_irq_restore(flags);
232}
233
234static int clk_pwm_tdiv_set_rate(struct clk *clk, unsigned long rate)
235{
236 struct pwm_tdiv_clk *divclk = to_tdiv(clk);
237 unsigned long tcfg1 = __raw_readl(S3C2410_TCFG1);
238 unsigned long parent_rate = clk_get_rate(clk->parent);
239 unsigned long divisor;
240
241 tcfg1 >>= S3C2410_TCFG1_SHIFT(clk->id);
242 tcfg1 &= S3C2410_TCFG1_MUX_MASK;
243
244 rate = clk_round_rate(clk, rate);
245 divisor = parent_rate / rate;
246
247 if (divisor > 16)
248 return -EINVAL;
249
250 divclk->divisor = divisor;
251
252 /* Update the current MUX settings if we are currently
253 * selected as the clock source for this clock. */
254
255 if (!pwm_cfg_src_is_tclk(tcfg1))
256 clk_pwm_tdiv_update(divclk);
257
258 return 0;
259}
260
261static struct clk_ops clk_tdiv_ops = {
262 .get_rate = clk_pwm_tdiv_get_rate,
263 .set_rate = clk_pwm_tdiv_set_rate,
264 .round_rate = clk_pwm_tdiv_round_rate,
265};
266
267static struct pwm_tdiv_clk clk_timer_tdiv[] = {
268 [0] = {
269 .clk = {
270 .name = "pwm-tdiv",
271 .devname = "s3c24xx-pwm.0",
272 .ops = &clk_tdiv_ops,
273 .parent = &clk_timer_scaler[0],
274 },
275 },
276 [1] = {
277 .clk = {
278 .name = "pwm-tdiv",
279 .devname = "s3c24xx-pwm.1",
280 .ops = &clk_tdiv_ops,
281 .parent = &clk_timer_scaler[0],
282 }
283 },
284 [2] = {
285 .clk = {
286 .name = "pwm-tdiv",
287 .devname = "s3c24xx-pwm.2",
288 .ops = &clk_tdiv_ops,
289 .parent = &clk_timer_scaler[1],
290 },
291 },
292 [3] = {
293 .clk = {
294 .name = "pwm-tdiv",
295 .devname = "s3c24xx-pwm.3",
296 .ops = &clk_tdiv_ops,
297 .parent = &clk_timer_scaler[1],
298 },
299 },
300 [4] = {
301 .clk = {
302 .name = "pwm-tdiv",
303 .devname = "s3c24xx-pwm.4",
304 .ops = &clk_tdiv_ops,
305 .parent = &clk_timer_scaler[1],
306 },
307 },
308};
309
310static int __init clk_pwm_tdiv_register(unsigned int id)
311{
312 struct pwm_tdiv_clk *divclk = &clk_timer_tdiv[id];
313 unsigned long tcfg1 = __raw_readl(S3C2410_TCFG1);
314
315 tcfg1 >>= S3C2410_TCFG1_SHIFT(id);
316 tcfg1 &= S3C2410_TCFG1_MUX_MASK;
317
318 divclk->clk.id = id;
319 divclk->divisor = tcfg_to_divisor(tcfg1);
320
321 return s3c24xx_register_clock(&divclk->clk);
322}
323
324static inline struct clk *s3c24xx_pwmclk_tclk(unsigned int id)
325{
326 return (id >= 2) ? &clk_timer_tclk[1] : &clk_timer_tclk[0];
327}
328
329static inline struct clk *s3c24xx_pwmclk_tdiv(unsigned int id)
330{
331 return &clk_timer_tdiv[id].clk;
332}
333
334static int clk_pwm_tin_set_parent(struct clk *clk, struct clk *parent)
335{
336 unsigned int id = clk->id;
337 unsigned long tcfg1;
338 unsigned long flags;
339 unsigned long bits;
340 unsigned long shift = S3C2410_TCFG1_SHIFT(id);
341
342 unsigned long mux_tclk;
343
344 if (soc_is_s3c24xx())
345 mux_tclk = S3C2410_TCFG1_MUX_TCLK;
346 else if (soc_is_s5p6440() || soc_is_s5p6450())
347 mux_tclk = 0;
348 else
349 mux_tclk = S3C64XX_TCFG1_MUX_TCLK;
350
351 if (parent == s3c24xx_pwmclk_tclk(id))
352 bits = mux_tclk << shift;
353 else if (parent == s3c24xx_pwmclk_tdiv(id))
354 bits = clk_pwm_tdiv_bits(to_tdiv(parent)) << shift;
355 else
356 return -EINVAL;
357
358 clk->parent = parent;
359
360 local_irq_save(flags);
361
362 tcfg1 = __raw_readl(S3C2410_TCFG1);
363 tcfg1 &= ~(S3C2410_TCFG1_MUX_MASK << shift);
364 __raw_writel(tcfg1 | bits, S3C2410_TCFG1);
365
366 local_irq_restore(flags);
367
368 return 0;
369}
370
371static struct clk_ops clk_tin_ops = {
372 .set_parent = clk_pwm_tin_set_parent,
373};
374
375static struct clk clk_tin[] = {
376 [0] = {
377 .name = "pwm-tin",
378 .devname = "s3c24xx-pwm.0",
379 .id = 0,
380 .ops = &clk_tin_ops,
381 },
382 [1] = {
383 .name = "pwm-tin",
384 .devname = "s3c24xx-pwm.1",
385 .id = 1,
386 .ops = &clk_tin_ops,
387 },
388 [2] = {
389 .name = "pwm-tin",
390 .devname = "s3c24xx-pwm.2",
391 .id = 2,
392 .ops = &clk_tin_ops,
393 },
394 [3] = {
395 .name = "pwm-tin",
396 .devname = "s3c24xx-pwm.3",
397 .id = 3,
398 .ops = &clk_tin_ops,
399 },
400 [4] = {
401 .name = "pwm-tin",
402 .devname = "s3c24xx-pwm.4",
403 .id = 4,
404 .ops = &clk_tin_ops,
405 },
406};
407
408static __init int clk_pwm_tin_register(struct clk *pwm)
409{
410 unsigned long tcfg1 = __raw_readl(S3C2410_TCFG1);
411 unsigned int id = pwm->id;
412
413 struct clk *parent;
414 int ret;
415
416 ret = s3c24xx_register_clock(pwm);
417 if (ret < 0)
418 return ret;
419
420 tcfg1 >>= S3C2410_TCFG1_SHIFT(id);
421 tcfg1 &= S3C2410_TCFG1_MUX_MASK;
422
423 if (pwm_cfg_src_is_tclk(tcfg1))
424 parent = s3c24xx_pwmclk_tclk(id);
425 else
426 parent = s3c24xx_pwmclk_tdiv(id);
427
428 return clk_set_parent(pwm, parent);
429}
430
431/**
432 * s3c_pwmclk_init() - initialise pwm clocks
433 *
434 * Initialise and register the clocks which provide the inputs for the
435 * pwm timer blocks.
436 *
437 * Note, this call is required by the time core, so must be called after
438 * the base clocks are added and before any of the initcalls are run.
439 */
440__init void s3c_pwmclk_init(void)
441{
442 struct clk *clk_timers;
443 unsigned int clk;
444 int ret;
445
446 clk_timers = clk_get(NULL, "timers");
447 if (IS_ERR(clk_timers)) {
448 printk(KERN_ERR "%s: no parent clock\n", __func__);
449 return;
450 }
451
452 for (clk = 0; clk < ARRAY_SIZE(clk_timer_scaler); clk++)
453 clk_timer_scaler[clk].parent = clk_timers;
454
455 s3c_register_clocks(clk_timer_scaler, ARRAY_SIZE(clk_timer_scaler));
456 s3c_register_clocks(clk_timer_tclk, ARRAY_SIZE(clk_timer_tclk));
457
458 for (clk = 0; clk < ARRAY_SIZE(clk_timer_tdiv); clk++) {
459 ret = clk_pwm_tdiv_register(clk);
460
461 if (ret < 0) {
462 printk(KERN_ERR "error adding pwm%d tdiv clock\n", clk);
463 return;
464 }
465 }
466
467 for (clk = 0; clk < ARRAY_SIZE(clk_tin); clk++) {
468 ret = clk_pwm_tin_register(&clk_tin[clk]);
469 if (ret < 0) {
470 printk(KERN_ERR "error adding pwm%d tin clock\n", clk);
471 return;
472 }
473 }
474}
diff --git a/arch/arm/plat-samsung/s3c-dma-ops.c b/arch/arm/plat-samsung/s3c-dma-ops.c
index 0cc40aea3f5a..98b10ba67dc7 100644
--- a/arch/arm/plat-samsung/s3c-dma-ops.c
+++ b/arch/arm/plat-samsung/s3c-dma-ops.c
@@ -82,7 +82,8 @@ static int s3c_dma_config(unsigned ch, struct samsung_dma_config *param)
82static int s3c_dma_prepare(unsigned ch, struct samsung_dma_prep *param) 82static int s3c_dma_prepare(unsigned ch, struct samsung_dma_prep *param)
83{ 83{
84 struct cb_data *data; 84 struct cb_data *data;
85 int len = (param->cap == DMA_CYCLIC) ? param->period : param->len; 85 dma_addr_t pos = param->buf;
86 dma_addr_t end = param->buf + param->len;
86 87
87 list_for_each_entry(data, &dma_list, node) 88 list_for_each_entry(data, &dma_list, node)
88 if (data->ch == ch) 89 if (data->ch == ch)
@@ -94,7 +95,15 @@ static int s3c_dma_prepare(unsigned ch, struct samsung_dma_prep *param)
94 data->fp_param = param->fp_param; 95 data->fp_param = param->fp_param;
95 } 96 }
96 97
97 s3c2410_dma_enqueue(ch, (void *)data, param->buf, len); 98 if (param->cap != DMA_CYCLIC) {
99 s3c2410_dma_enqueue(ch, (void *)data, param->buf, param->len);
100 return 0;
101 }
102
103 while (pos < end) {
104 s3c2410_dma_enqueue(ch, (void *)data, pos, param->period);
105 pos += param->period;
106 }
98 107
99 return 0; 108 return 0;
100} 109}
diff --git a/arch/arm/plat-samsung/s5p-irq.c b/arch/arm/plat-samsung/s5p-irq.c
index ff1a76011b1e..ddfaca9c79d8 100644
--- a/arch/arm/plat-samsung/s5p-irq.c
+++ b/arch/arm/plat-samsung/s5p-irq.c
@@ -17,9 +17,7 @@
17 17
18#include <mach/irqs.h> 18#include <mach/irqs.h>
19#include <mach/map.h> 19#include <mach/map.h>
20#include <plat/regs-timer.h>
21#include <plat/cpu.h> 20#include <plat/cpu.h>
22#include <plat/irq-vic-timer.h>
23 21
24void __init s5p_init_irq(u32 *vic, u32 num_vic) 22void __init s5p_init_irq(u32 *vic, u32 num_vic)
25{ 23{
@@ -30,6 +28,4 @@ void __init s5p_init_irq(u32 *vic, u32 num_vic)
30 for (irq = 0; irq < num_vic; irq++) 28 for (irq = 0; irq < num_vic; irq++)
31 vic_init(VA_VIC(irq), VIC_BASE(irq), vic[irq], 0); 29 vic_init(VA_VIC(irq), VIC_BASE(irq), vic[irq], 0);
32#endif 30#endif
33
34 s3c_init_vic_timer_irq(5, IRQ_TIMER0);
35} 31}
diff --git a/arch/arm/plat-samsung/samsung-time.c b/arch/arm/plat-samsung/samsung-time.c
deleted file mode 100644
index 2957075ca836..000000000000
--- a/arch/arm/plat-samsung/samsung-time.c
+++ /dev/null
@@ -1,394 +0,0 @@
1/*
2 * Copyright (c) 2011 Samsung Electronics Co., Ltd.
3 * http://www.samsung.com/
4 *
5 * samsung - Common hr-timer support (s3c and s5p)
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10*/
11
12#include <linux/interrupt.h>
13#include <linux/irq.h>
14#include <linux/err.h>
15#include <linux/clk.h>
16#include <linux/clockchips.h>
17#include <linux/platform_device.h>
18#include <linux/sched_clock.h>
19
20#include <asm/smp_twd.h>
21#include <asm/mach/time.h>
22#include <asm/mach/arch.h>
23#include <asm/mach/map.h>
24
25#include <mach/map.h>
26#include <plat/devs.h>
27#include <plat/regs-timer.h>
28#include <plat/samsung-time.h>
29
30static struct clk *tin_event;
31static struct clk *tin_source;
32static struct clk *tdiv_event;
33static struct clk *tdiv_source;
34static struct clk *timerclk;
35static struct samsung_timer_source timer_source;
36static unsigned long clock_count_per_tick;
37static void samsung_timer_resume(void);
38
39static void samsung_time_stop(enum samsung_timer_mode mode)
40{
41 unsigned long tcon;
42
43 tcon = __raw_readl(S3C2410_TCON);
44
45 switch (mode) {
46 case SAMSUNG_PWM0:
47 tcon &= ~S3C2410_TCON_T0START;
48 break;
49
50 case SAMSUNG_PWM1:
51 tcon &= ~S3C2410_TCON_T1START;
52 break;
53
54 case SAMSUNG_PWM2:
55 tcon &= ~S3C2410_TCON_T2START;
56 break;
57
58 case SAMSUNG_PWM3:
59 tcon &= ~S3C2410_TCON_T3START;
60 break;
61
62 case SAMSUNG_PWM4:
63 tcon &= ~S3C2410_TCON_T4START;
64 break;
65
66 default:
67 printk(KERN_ERR "Invalid Timer %d\n", mode);
68 break;
69 }
70 __raw_writel(tcon, S3C2410_TCON);
71}
72
73static void samsung_time_setup(enum samsung_timer_mode mode, unsigned long tcnt)
74{
75 unsigned long tcon;
76
77 tcon = __raw_readl(S3C2410_TCON);
78
79 tcnt--;
80
81 switch (mode) {
82 case SAMSUNG_PWM0:
83 tcon &= ~(0x0f << 0);
84 tcon |= S3C2410_TCON_T0MANUALUPD;
85 break;
86
87 case SAMSUNG_PWM1:
88 tcon &= ~(0x0f << 8);
89 tcon |= S3C2410_TCON_T1MANUALUPD;
90 break;
91
92 case SAMSUNG_PWM2:
93 tcon &= ~(0x0f << 12);
94 tcon |= S3C2410_TCON_T2MANUALUPD;
95 break;
96
97 case SAMSUNG_PWM3:
98 tcon &= ~(0x0f << 16);
99 tcon |= S3C2410_TCON_T3MANUALUPD;
100 break;
101
102 case SAMSUNG_PWM4:
103 tcon &= ~(0x07 << 20);
104 tcon |= S3C2410_TCON_T4MANUALUPD;
105 break;
106
107 default:
108 printk(KERN_ERR "Invalid Timer %d\n", mode);
109 break;
110 }
111
112 __raw_writel(tcnt, S3C2410_TCNTB(mode));
113 __raw_writel(tcnt, S3C2410_TCMPB(mode));
114 __raw_writel(tcon, S3C2410_TCON);
115}
116
117static void samsung_time_start(enum samsung_timer_mode mode, bool periodic)
118{
119 unsigned long tcon;
120
121 tcon = __raw_readl(S3C2410_TCON);
122
123 switch (mode) {
124 case SAMSUNG_PWM0:
125 tcon |= S3C2410_TCON_T0START;
126 tcon &= ~S3C2410_TCON_T0MANUALUPD;
127
128 if (periodic)
129 tcon |= S3C2410_TCON_T0RELOAD;
130 else
131 tcon &= ~S3C2410_TCON_T0RELOAD;
132 break;
133
134 case SAMSUNG_PWM1:
135 tcon |= S3C2410_TCON_T1START;
136 tcon &= ~S3C2410_TCON_T1MANUALUPD;
137
138 if (periodic)
139 tcon |= S3C2410_TCON_T1RELOAD;
140 else
141 tcon &= ~S3C2410_TCON_T1RELOAD;
142 break;
143
144 case SAMSUNG_PWM2:
145 tcon |= S3C2410_TCON_T2START;
146 tcon &= ~S3C2410_TCON_T2MANUALUPD;
147
148 if (periodic)
149 tcon |= S3C2410_TCON_T2RELOAD;
150 else
151 tcon &= ~S3C2410_TCON_T2RELOAD;
152 break;
153
154 case SAMSUNG_PWM3:
155 tcon |= S3C2410_TCON_T3START;
156 tcon &= ~S3C2410_TCON_T3MANUALUPD;
157
158 if (periodic)
159 tcon |= S3C2410_TCON_T3RELOAD;
160 else
161 tcon &= ~S3C2410_TCON_T3RELOAD;
162 break;
163
164 case SAMSUNG_PWM4:
165 tcon |= S3C2410_TCON_T4START;
166 tcon &= ~S3C2410_TCON_T4MANUALUPD;
167
168 if (periodic)
169 tcon |= S3C2410_TCON_T4RELOAD;
170 else
171 tcon &= ~S3C2410_TCON_T4RELOAD;
172 break;
173
174 default:
175 printk(KERN_ERR "Invalid Timer %d\n", mode);
176 break;
177 }
178 __raw_writel(tcon, S3C2410_TCON);
179}
180
181static int samsung_set_next_event(unsigned long cycles,
182 struct clock_event_device *evt)
183{
184 samsung_time_setup(timer_source.event_id, cycles);
185 samsung_time_start(timer_source.event_id, NON_PERIODIC);
186
187 return 0;
188}
189
190static void samsung_set_mode(enum clock_event_mode mode,
191 struct clock_event_device *evt)
192{
193 samsung_time_stop(timer_source.event_id);
194
195 switch (mode) {
196 case CLOCK_EVT_MODE_PERIODIC:
197 samsung_time_setup(timer_source.event_id, clock_count_per_tick);
198 samsung_time_start(timer_source.event_id, PERIODIC);
199 break;
200
201 case CLOCK_EVT_MODE_ONESHOT:
202 break;
203
204 case CLOCK_EVT_MODE_UNUSED:
205 case CLOCK_EVT_MODE_SHUTDOWN:
206 break;
207
208 case CLOCK_EVT_MODE_RESUME:
209 samsung_timer_resume();
210 break;
211 }
212}
213
214static void samsung_timer_resume(void)
215{
216 /* event timer restart */
217 samsung_time_setup(timer_source.event_id, clock_count_per_tick);
218 samsung_time_start(timer_source.event_id, PERIODIC);
219
220 /* source timer restart */
221 samsung_time_setup(timer_source.source_id, TCNT_MAX);
222 samsung_time_start(timer_source.source_id, PERIODIC);
223}
224
225void __init samsung_set_timer_source(enum samsung_timer_mode event,
226 enum samsung_timer_mode source)
227{
228 s3c_device_timer[event].dev.bus = &platform_bus_type;
229 s3c_device_timer[source].dev.bus = &platform_bus_type;
230
231 timer_source.event_id = event;
232 timer_source.source_id = source;
233}
234
235static struct clock_event_device time_event_device = {
236 .name = "samsung_event_timer",
237 .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
238 .rating = 200,
239 .set_next_event = samsung_set_next_event,
240 .set_mode = samsung_set_mode,
241};
242
243static irqreturn_t samsung_clock_event_isr(int irq, void *dev_id)
244{
245 struct clock_event_device *evt = dev_id;
246
247 evt->event_handler(evt);
248
249 return IRQ_HANDLED;
250}
251
252static struct irqaction samsung_clock_event_irq = {
253 .name = "samsung_time_irq",
254 .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
255 .handler = samsung_clock_event_isr,
256 .dev_id = &time_event_device,
257};
258
259static void __init samsung_clockevent_init(void)
260{
261 unsigned long pclk;
262 unsigned long clock_rate;
263 unsigned int irq_number;
264 struct clk *tscaler;
265
266 pclk = clk_get_rate(timerclk);
267
268 tscaler = clk_get_parent(tdiv_event);
269
270 clk_set_rate(tscaler, pclk / TSCALER_DIV);
271 clk_set_rate(tdiv_event, pclk / TDIV);
272 clk_set_parent(tin_event, tdiv_event);
273
274 clock_rate = clk_get_rate(tin_event);
275 clock_count_per_tick = clock_rate / HZ;
276
277 time_event_device.cpumask = cpumask_of(0);
278 clockevents_config_and_register(&time_event_device, clock_rate, 1, -1);
279
280 irq_number = timer_source.event_id + IRQ_TIMER0;
281 setup_irq(irq_number, &samsung_clock_event_irq);
282}
283
284static void __iomem *samsung_timer_reg(void)
285{
286 unsigned long offset = 0;
287
288 switch (timer_source.source_id) {
289 case SAMSUNG_PWM0:
290 case SAMSUNG_PWM1:
291 case SAMSUNG_PWM2:
292 case SAMSUNG_PWM3:
293 offset = (timer_source.source_id * 0x0c) + 0x14;
294 break;
295
296 case SAMSUNG_PWM4:
297 offset = 0x40;
298 break;
299
300 default:
301 printk(KERN_ERR "Invalid Timer %d\n", timer_source.source_id);
302 return NULL;
303 }
304
305 return S3C_TIMERREG(offset);
306}
307
308/*
309 * Override the global weak sched_clock symbol with this
310 * local implementation which uses the clocksource to get some
311 * better resolution when scheduling the kernel. We accept that
312 * this wraps around for now, since it is just a relative time
313 * stamp. (Inspired by U300 implementation.)
314 */
315static u32 notrace samsung_read_sched_clock(void)
316{
317 void __iomem *reg = samsung_timer_reg();
318
319 if (!reg)
320 return 0;
321
322 return ~__raw_readl(reg);
323}
324
325static void __init samsung_clocksource_init(void)
326{
327 unsigned long pclk;
328 unsigned long clock_rate;
329
330 pclk = clk_get_rate(timerclk);
331
332 clk_set_rate(tdiv_source, pclk / TDIV);
333 clk_set_parent(tin_source, tdiv_source);
334
335 clock_rate = clk_get_rate(tin_source);
336
337 samsung_time_setup(timer_source.source_id, TCNT_MAX);
338 samsung_time_start(timer_source.source_id, PERIODIC);
339
340 setup_sched_clock(samsung_read_sched_clock, TSIZE, clock_rate);
341
342 if (clocksource_mmio_init(samsung_timer_reg(), "samsung_clocksource_timer",
343 clock_rate, 250, TSIZE, clocksource_mmio_readl_down))
344 panic("samsung_clocksource_timer: can't register clocksource\n");
345}
346
347static void __init samsung_timer_resources(void)
348{
349
350 unsigned long event_id = timer_source.event_id;
351 unsigned long source_id = timer_source.source_id;
352 char devname[15];
353
354 timerclk = clk_get(NULL, "timers");
355 if (IS_ERR(timerclk))
356 panic("failed to get timers clock for timer");
357
358 clk_enable(timerclk);
359
360 sprintf(devname, "s3c24xx-pwm.%lu", event_id);
361 s3c_device_timer[event_id].id = event_id;
362 s3c_device_timer[event_id].dev.init_name = devname;
363
364 tin_event = clk_get(&s3c_device_timer[event_id].dev, "pwm-tin");
365 if (IS_ERR(tin_event))
366 panic("failed to get pwm-tin clock for event timer");
367
368 tdiv_event = clk_get(&s3c_device_timer[event_id].dev, "pwm-tdiv");
369 if (IS_ERR(tdiv_event))
370 panic("failed to get pwm-tdiv clock for event timer");
371
372 clk_enable(tin_event);
373
374 sprintf(devname, "s3c24xx-pwm.%lu", source_id);
375 s3c_device_timer[source_id].id = source_id;
376 s3c_device_timer[source_id].dev.init_name = devname;
377
378 tin_source = clk_get(&s3c_device_timer[source_id].dev, "pwm-tin");
379 if (IS_ERR(tin_source))
380 panic("failed to get pwm-tin clock for source timer");
381
382 tdiv_source = clk_get(&s3c_device_timer[source_id].dev, "pwm-tdiv");
383 if (IS_ERR(tdiv_source))
384 panic("failed to get pwm-tdiv clock for source timer");
385
386 clk_enable(tin_source);
387}
388
389void __init samsung_timer_init(void)
390{
391 samsung_timer_resources();
392 samsung_clockevent_init();
393 samsung_clocksource_init();
394}
diff --git a/arch/arm/vfp/vfphw.S b/arch/arm/vfp/vfphw.S
index 8d10dc8a1e17..3e5d3115a2a6 100644
--- a/arch/arm/vfp/vfphw.S
+++ b/arch/arm/vfp/vfphw.S
@@ -78,6 +78,11 @@
78ENTRY(vfp_support_entry) 78ENTRY(vfp_support_entry)
79 DBGSTR3 "instr %08x pc %08x state %p", r0, r2, r10 79 DBGSTR3 "instr %08x pc %08x state %p", r0, r2, r10
80 80
81 ldr r3, [sp, #S_PSR] @ Neither lazy restore nor FP exceptions
82 and r3, r3, #MODE_MASK @ are supported in kernel mode
83 teq r3, #USR_MODE
84 bne vfp_kmode_exception @ Returns through lr
85
81 VFPFMRX r1, FPEXC @ Is the VFP enabled? 86 VFPFMRX r1, FPEXC @ Is the VFP enabled?
82 DBGSTR1 "fpexc %08x", r1 87 DBGSTR1 "fpexc %08x", r1
83 tst r1, #FPEXC_EN 88 tst r1, #FPEXC_EN
diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c
index 5dfbb0b8e7f4..52b8f40b1c73 100644
--- a/arch/arm/vfp/vfpmodule.c
+++ b/arch/arm/vfp/vfpmodule.c
@@ -20,6 +20,7 @@
20#include <linux/init.h> 20#include <linux/init.h>
21#include <linux/uaccess.h> 21#include <linux/uaccess.h>
22#include <linux/user.h> 22#include <linux/user.h>
23#include <linux/export.h>
23 24
24#include <asm/cp15.h> 25#include <asm/cp15.h>
25#include <asm/cputype.h> 26#include <asm/cputype.h>
@@ -648,6 +649,72 @@ static int vfp_hotplug(struct notifier_block *b, unsigned long action,
648 return NOTIFY_OK; 649 return NOTIFY_OK;
649} 650}
650 651
652void vfp_kmode_exception(void)
653{
654 /*
655 * If we reach this point, a floating point exception has been raised
656 * while running in kernel mode. If the NEON/VFP unit was enabled at the
657 * time, it means a VFP instruction has been issued that requires
658 * software assistance to complete, something which is not currently
659 * supported in kernel mode.
660 * If the NEON/VFP unit was disabled, and the location pointed to below
661 * is properly preceded by a call to kernel_neon_begin(), something has
662 * caused the task to be scheduled out and back in again. In this case,
663 * rebuilding and running with CONFIG_DEBUG_ATOMIC_SLEEP enabled should
664 * be helpful in localizing the problem.
665 */
666 if (fmrx(FPEXC) & FPEXC_EN)
667 pr_crit("BUG: unsupported FP instruction in kernel mode\n");
668 else
669 pr_crit("BUG: FP instruction issued in kernel mode with FP unit disabled\n");
670}
671
672#ifdef CONFIG_KERNEL_MODE_NEON
673
674/*
675 * Kernel-side NEON support functions
676 */
677void kernel_neon_begin(void)
678{
679 struct thread_info *thread = current_thread_info();
680 unsigned int cpu;
681 u32 fpexc;
682
683 /*
684 * Kernel mode NEON is only allowed outside of interrupt context
685 * with preemption disabled. This will make sure that the kernel
686 * mode NEON register contents never need to be preserved.
687 */
688 BUG_ON(in_interrupt());
689 cpu = get_cpu();
690
691 fpexc = fmrx(FPEXC) | FPEXC_EN;
692 fmxr(FPEXC, fpexc);
693
694 /*
695 * Save the userland NEON/VFP state. Under UP,
696 * the owner could be a task other than 'current'
697 */
698 if (vfp_state_in_hw(cpu, thread))
699 vfp_save_state(&thread->vfpstate, fpexc);
700#ifndef CONFIG_SMP
701 else if (vfp_current_hw_state[cpu] != NULL)
702 vfp_save_state(vfp_current_hw_state[cpu], fpexc);
703#endif
704 vfp_current_hw_state[cpu] = NULL;
705}
706EXPORT_SYMBOL(kernel_neon_begin);
707
708void kernel_neon_end(void)
709{
710 /* Disable the NEON/VFP unit. */
711 fmxr(FPEXC, fmrx(FPEXC) & ~FPEXC_EN);
712 put_cpu();
713}
714EXPORT_SYMBOL(kernel_neon_end);
715
716#endif /* CONFIG_KERNEL_MODE_NEON */
717
651/* 718/*
652 * VFP support code initialisation. 719 * VFP support code initialisation.
653 */ 720 */
@@ -731,4 +798,4 @@ static int __init vfp_init(void)
731 return 0; 798 return 0;
732} 799}
733 800
734late_initcall(vfp_init); 801core_initcall(vfp_init);
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
index 9737e97f9f38..c04454876bcb 100644
--- a/arch/arm64/Kconfig
+++ b/arch/arm64/Kconfig
@@ -23,7 +23,6 @@ config ARM64
23 select HAVE_DMA_API_DEBUG 23 select HAVE_DMA_API_DEBUG
24 select HAVE_DMA_ATTRS 24 select HAVE_DMA_ATTRS
25 select HAVE_GENERIC_DMA_COHERENT 25 select HAVE_GENERIC_DMA_COHERENT
26 select HAVE_GENERIC_HARDIRQS
27 select HAVE_HW_BREAKPOINT if PERF_EVENTS 26 select HAVE_HW_BREAKPOINT if PERF_EVENTS
28 select HAVE_MEMBLOCK 27 select HAVE_MEMBLOCK
29 select HAVE_PERF_EVENTS 28 select HAVE_PERF_EVENTS
@@ -96,6 +95,9 @@ config SWIOTLB
96config IOMMU_HELPER 95config IOMMU_HELPER
97 def_bool SWIOTLB 96 def_bool SWIOTLB
98 97
98config KERNEL_MODE_NEON
99 def_bool y
100
99source "init/Kconfig" 101source "init/Kconfig"
100 102
101source "kernel/Kconfig.freezer" 103source "kernel/Kconfig.freezer"
diff --git a/arch/arm64/include/asm/arch_timer.h b/arch/arm64/include/asm/arch_timer.h
index 98abd476992d..c9f1d2816c2b 100644
--- a/arch/arm64/include/asm/arch_timer.h
+++ b/arch/arm64/include/asm/arch_timer.h
@@ -26,7 +26,13 @@
26 26
27#include <clocksource/arm_arch_timer.h> 27#include <clocksource/arm_arch_timer.h>
28 28
29static inline void arch_timer_reg_write(int access, int reg, u32 val) 29/*
30 * These register accessors are marked inline so the compiler can
31 * nicely work out which register we want, and chuck away the rest of
32 * the code.
33 */
34static __always_inline
35void arch_timer_reg_write_cp15(int access, enum arch_timer_reg reg, u32 val)
30{ 36{
31 if (access == ARCH_TIMER_PHYS_ACCESS) { 37 if (access == ARCH_TIMER_PHYS_ACCESS) {
32 switch (reg) { 38 switch (reg) {
@@ -36,8 +42,6 @@ static inline void arch_timer_reg_write(int access, int reg, u32 val)
36 case ARCH_TIMER_REG_TVAL: 42 case ARCH_TIMER_REG_TVAL:
37 asm volatile("msr cntp_tval_el0, %0" : : "r" (val)); 43 asm volatile("msr cntp_tval_el0, %0" : : "r" (val));
38 break; 44 break;
39 default:
40 BUILD_BUG();
41 } 45 }
42 } else if (access == ARCH_TIMER_VIRT_ACCESS) { 46 } else if (access == ARCH_TIMER_VIRT_ACCESS) {
43 switch (reg) { 47 switch (reg) {
@@ -47,17 +51,14 @@ static inline void arch_timer_reg_write(int access, int reg, u32 val)
47 case ARCH_TIMER_REG_TVAL: 51 case ARCH_TIMER_REG_TVAL:
48 asm volatile("msr cntv_tval_el0, %0" : : "r" (val)); 52 asm volatile("msr cntv_tval_el0, %0" : : "r" (val));
49 break; 53 break;
50 default:
51 BUILD_BUG();
52 } 54 }
53 } else {
54 BUILD_BUG();
55 } 55 }
56 56
57 isb(); 57 isb();
58} 58}
59 59
60static inline u32 arch_timer_reg_read(int access, int reg) 60static __always_inline
61u32 arch_timer_reg_read_cp15(int access, enum arch_timer_reg reg)
61{ 62{
62 u32 val; 63 u32 val;
63 64
@@ -69,8 +70,6 @@ static inline u32 arch_timer_reg_read(int access, int reg)
69 case ARCH_TIMER_REG_TVAL: 70 case ARCH_TIMER_REG_TVAL:
70 asm volatile("mrs %0, cntp_tval_el0" : "=r" (val)); 71 asm volatile("mrs %0, cntp_tval_el0" : "=r" (val));
71 break; 72 break;
72 default:
73 BUILD_BUG();
74 } 73 }
75 } else if (access == ARCH_TIMER_VIRT_ACCESS) { 74 } else if (access == ARCH_TIMER_VIRT_ACCESS) {
76 switch (reg) { 75 switch (reg) {
@@ -80,11 +79,7 @@ static inline u32 arch_timer_reg_read(int access, int reg)
80 case ARCH_TIMER_REG_TVAL: 79 case ARCH_TIMER_REG_TVAL:
81 asm volatile("mrs %0, cntv_tval_el0" : "=r" (val)); 80 asm volatile("mrs %0, cntv_tval_el0" : "=r" (val));
82 break; 81 break;
83 default:
84 BUILD_BUG();
85 } 82 }
86 } else {
87 BUILD_BUG();
88 } 83 }
89 84
90 return val; 85 return val;
diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h
index fe32c0e4ac01..e7fa87f9201b 100644
--- a/arch/arm64/include/asm/elf.h
+++ b/arch/arm64/include/asm/elf.h
@@ -33,8 +33,6 @@ typedef unsigned long elf_greg_t;
33typedef elf_greg_t elf_gregset_t[ELF_NGREG]; 33typedef elf_greg_t elf_gregset_t[ELF_NGREG];
34typedef struct user_fpsimd_state elf_fpregset_t; 34typedef struct user_fpsimd_state elf_fpregset_t;
35 35
36#define EM_AARCH64 183
37
38/* 36/*
39 * AArch64 static relocation types. 37 * AArch64 static relocation types.
40 */ 38 */
@@ -151,7 +149,6 @@ extern unsigned long arch_randomize_brk(struct mm_struct *mm);
151#define arch_randomize_brk arch_randomize_brk 149#define arch_randomize_brk arch_randomize_brk
152 150
153#ifdef CONFIG_COMPAT 151#ifdef CONFIG_COMPAT
154#define EM_ARM 40
155#define COMPAT_ELF_PLATFORM ("v8l") 152#define COMPAT_ELF_PLATFORM ("v8l")
156 153
157#define COMPAT_ELF_ET_DYN_BASE (randomize_et_dyn(2 * TASK_SIZE_32 / 3)) 154#define COMPAT_ELF_ET_DYN_BASE (randomize_et_dyn(2 * TASK_SIZE_32 / 3))
diff --git a/arch/arm64/include/asm/hwcap.h b/arch/arm64/include/asm/hwcap.h
index 6d4482fa35bc..e2950b098e76 100644
--- a/arch/arm64/include/asm/hwcap.h
+++ b/arch/arm64/include/asm/hwcap.h
@@ -43,6 +43,6 @@
43 COMPAT_HWCAP_VFPv3|COMPAT_HWCAP_VFPv4|\ 43 COMPAT_HWCAP_VFPv3|COMPAT_HWCAP_VFPv4|\
44 COMPAT_HWCAP_NEON|COMPAT_HWCAP_IDIV) 44 COMPAT_HWCAP_NEON|COMPAT_HWCAP_IDIV)
45 45
46extern unsigned int elf_hwcap; 46extern unsigned long elf_hwcap;
47#endif 47#endif
48#endif 48#endif
diff --git a/arch/arm64/include/asm/neon.h b/arch/arm64/include/asm/neon.h
new file mode 100644
index 000000000000..b0cc58a97780
--- /dev/null
+++ b/arch/arm64/include/asm/neon.h
@@ -0,0 +1,14 @@
1/*
2 * linux/arch/arm64/include/asm/neon.h
3 *
4 * Copyright (C) 2013 Linaro Ltd <ard.biesheuvel@linaro.org>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10
11#define cpu_has_neon() (1)
12
13void kernel_neon_begin(void);
14void kernel_neon_end(void);
diff --git a/arch/arm64/include/asm/pgtable-2level-types.h b/arch/arm64/include/asm/pgtable-2level-types.h
index 3c3ca7d361e4..5f101e63dfc1 100644
--- a/arch/arm64/include/asm/pgtable-2level-types.h
+++ b/arch/arm64/include/asm/pgtable-2level-types.h
@@ -16,6 +16,8 @@
16#ifndef __ASM_PGTABLE_2LEVEL_TYPES_H 16#ifndef __ASM_PGTABLE_2LEVEL_TYPES_H
17#define __ASM_PGTABLE_2LEVEL_TYPES_H 17#define __ASM_PGTABLE_2LEVEL_TYPES_H
18 18
19#include <asm/types.h>
20
19typedef u64 pteval_t; 21typedef u64 pteval_t;
20typedef u64 pgdval_t; 22typedef u64 pgdval_t;
21typedef pgdval_t pmdval_t; 23typedef pgdval_t pmdval_t;
diff --git a/arch/arm64/include/asm/pgtable-3level-types.h b/arch/arm64/include/asm/pgtable-3level-types.h
index 4489615f14a9..4e94424938a4 100644
--- a/arch/arm64/include/asm/pgtable-3level-types.h
+++ b/arch/arm64/include/asm/pgtable-3level-types.h
@@ -16,6 +16,8 @@
16#ifndef __ASM_PGTABLE_3LEVEL_TYPES_H 16#ifndef __ASM_PGTABLE_3LEVEL_TYPES_H
17#define __ASM_PGTABLE_3LEVEL_TYPES_H 17#define __ASM_PGTABLE_3LEVEL_TYPES_H
18 18
19#include <asm/types.h>
20
19typedef u64 pteval_t; 21typedef u64 pteval_t;
20typedef u64 pmdval_t; 22typedef u64 pmdval_t;
21typedef u64 pgdval_t; 23typedef u64 pgdval_t;
diff --git a/arch/arm64/include/asm/pgtable-hwdef.h b/arch/arm64/include/asm/pgtable-hwdef.h
index e182a356c979..d57e66845c86 100644
--- a/arch/arm64/include/asm/pgtable-hwdef.h
+++ b/arch/arm64/include/asm/pgtable-hwdef.h
@@ -122,5 +122,6 @@
122#define TCR_TG1_64K (UL(1) << 30) 122#define TCR_TG1_64K (UL(1) << 30)
123#define TCR_IPS_40BIT (UL(2) << 32) 123#define TCR_IPS_40BIT (UL(2) << 32)
124#define TCR_ASID16 (UL(1) << 36) 124#define TCR_ASID16 (UL(1) << 36)
125#define TCR_TBI0 (UL(1) << 37)
125 126
126#endif 127#endif
diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S
index 6ad781b21c08..3881fd115ebb 100644
--- a/arch/arm64/kernel/entry.S
+++ b/arch/arm64/kernel/entry.S
@@ -423,6 +423,7 @@ el0_da:
423 * Data abort handling 423 * Data abort handling
424 */ 424 */
425 mrs x0, far_el1 425 mrs x0, far_el1
426 bic x0, x0, #(0xff << 56)
426 disable_step x1 427 disable_step x1
427 isb 428 isb
428 enable_dbg 429 enable_dbg
@@ -476,6 +477,8 @@ el0_undef:
476 * Undefined instruction 477 * Undefined instruction
477 */ 478 */
478 mov x0, sp 479 mov x0, sp
480 // enable interrupts before calling the main handler
481 enable_irq
479 b do_undefinstr 482 b do_undefinstr
480el0_dbg: 483el0_dbg:
481 /* 484 /*
diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c
index e8b8357aedb4..1f2e4d5a5c0f 100644
--- a/arch/arm64/kernel/fpsimd.c
+++ b/arch/arm64/kernel/fpsimd.c
@@ -21,6 +21,7 @@
21#include <linux/init.h> 21#include <linux/init.h>
22#include <linux/sched.h> 22#include <linux/sched.h>
23#include <linux/signal.h> 23#include <linux/signal.h>
24#include <linux/hardirq.h>
24 25
25#include <asm/fpsimd.h> 26#include <asm/fpsimd.h>
26#include <asm/cputype.h> 27#include <asm/cputype.h>
@@ -83,6 +84,33 @@ void fpsimd_flush_thread(void)
83 fpsimd_load_state(&current->thread.fpsimd_state); 84 fpsimd_load_state(&current->thread.fpsimd_state);
84} 85}
85 86
87#ifdef CONFIG_KERNEL_MODE_NEON
88
89/*
90 * Kernel-side NEON support functions
91 */
92void kernel_neon_begin(void)
93{
94 /* Avoid using the NEON in interrupt context */
95 BUG_ON(in_interrupt());
96 preempt_disable();
97
98 if (current->mm)
99 fpsimd_save_state(&current->thread.fpsimd_state);
100}
101EXPORT_SYMBOL(kernel_neon_begin);
102
103void kernel_neon_end(void)
104{
105 if (current->mm)
106 fpsimd_load_state(&current->thread.fpsimd_state);
107
108 preempt_enable();
109}
110EXPORT_SYMBOL(kernel_neon_end);
111
112#endif /* CONFIG_KERNEL_MODE_NEON */
113
86/* 114/*
87 * FP/SIMD support code initialisation. 115 * FP/SIMD support code initialisation.
88 */ 116 */
diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
index 53dcae49e729..7090c126797c 100644
--- a/arch/arm64/kernel/head.S
+++ b/arch/arm64/kernel/head.S
@@ -112,6 +112,14 @@
112 .quad TEXT_OFFSET // Image load offset from start of RAM 112 .quad TEXT_OFFSET // Image load offset from start of RAM
113 .quad 0 // reserved 113 .quad 0 // reserved
114 .quad 0 // reserved 114 .quad 0 // reserved
115 .quad 0 // reserved
116 .quad 0 // reserved
117 .quad 0 // reserved
118 .byte 0x41 // Magic number, "ARM\x64"
119 .byte 0x52
120 .byte 0x4d
121 .byte 0x64
122 .word 0 // reserved
115 123
116ENTRY(stext) 124ENTRY(stext)
117 mov x21, x0 // x21=FDT 125 mov x21, x0 // x21=FDT
diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c
index 12e6ccb88691..cea1594ff933 100644
--- a/arch/arm64/kernel/perf_event.c
+++ b/arch/arm64/kernel/perf_event.c
@@ -325,7 +325,10 @@ validate_event(struct pmu_hw_events *hw_events,
325 if (is_software_event(event)) 325 if (is_software_event(event))
326 return 1; 326 return 1;
327 327
328 if (event->pmu != leader_pmu || event->state <= PERF_EVENT_STATE_OFF) 328 if (event->pmu != leader_pmu || event->state < PERF_EVENT_STATE_OFF)
329 return 1;
330
331 if (event->state == PERF_EVENT_STATE_OFF && !event->attr.enable_on_exec)
329 return 1; 332 return 1;
330 333
331 return armpmu->get_event_idx(hw_events, &fake_event) >= 0; 334 return armpmu->get_event_idx(hw_events, &fake_event) >= 0;
@@ -781,7 +784,7 @@ static const unsigned armv8_pmuv3_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]
781/* 784/*
782 * PMXEVTYPER: Event selection reg 785 * PMXEVTYPER: Event selection reg
783 */ 786 */
784#define ARMV8_EVTYPE_MASK 0xc00000ff /* Mask for writable bits */ 787#define ARMV8_EVTYPE_MASK 0xc80000ff /* Mask for writable bits */
785#define ARMV8_EVTYPE_EVENT 0xff /* Mask for EVENT bits */ 788#define ARMV8_EVTYPE_EVENT 0xff /* Mask for EVENT bits */
786 789
787/* 790/*
diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
index 57fb55c44c90..7ae8a1f00c3c 100644
--- a/arch/arm64/kernel/process.c
+++ b/arch/arm64/kernel/process.c
@@ -143,15 +143,26 @@ void machine_restart(char *cmd)
143 143
144void __show_regs(struct pt_regs *regs) 144void __show_regs(struct pt_regs *regs)
145{ 145{
146 int i; 146 int i, top_reg;
147 u64 lr, sp;
148
149 if (compat_user_mode(regs)) {
150 lr = regs->compat_lr;
151 sp = regs->compat_sp;
152 top_reg = 12;
153 } else {
154 lr = regs->regs[30];
155 sp = regs->sp;
156 top_reg = 29;
157 }
147 158
148 show_regs_print_info(KERN_DEFAULT); 159 show_regs_print_info(KERN_DEFAULT);
149 print_symbol("PC is at %s\n", instruction_pointer(regs)); 160 print_symbol("PC is at %s\n", instruction_pointer(regs));
150 print_symbol("LR is at %s\n", regs->regs[30]); 161 print_symbol("LR is at %s\n", lr);
151 printk("pc : [<%016llx>] lr : [<%016llx>] pstate: %08llx\n", 162 printk("pc : [<%016llx>] lr : [<%016llx>] pstate: %08llx\n",
152 regs->pc, regs->regs[30], regs->pstate); 163 regs->pc, lr, regs->pstate);
153 printk("sp : %016llx\n", regs->sp); 164 printk("sp : %016llx\n", sp);
154 for (i = 29; i >= 0; i--) { 165 for (i = top_reg; i >= 0; i--) {
155 printk("x%-2d: %016llx ", i, regs->regs[i]); 166 printk("x%-2d: %016llx ", i, regs->regs[i]);
156 if (i % 2 == 0) 167 if (i % 2 == 0)
157 printk("\n"); 168 printk("\n");
diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
index add6ea616843..055cfb80e05c 100644
--- a/arch/arm64/kernel/setup.c
+++ b/arch/arm64/kernel/setup.c
@@ -57,7 +57,7 @@
57unsigned int processor_id; 57unsigned int processor_id;
58EXPORT_SYMBOL(processor_id); 58EXPORT_SYMBOL(processor_id);
59 59
60unsigned int elf_hwcap __read_mostly; 60unsigned long elf_hwcap __read_mostly;
61EXPORT_SYMBOL_GPL(elf_hwcap); 61EXPORT_SYMBOL_GPL(elf_hwcap);
62 62
63static const char *cpu_name; 63static const char *cpu_name;
@@ -190,11 +190,6 @@ void __init early_init_dt_add_memory_arch(u64 base, u64 size)
190 memblock_add(base, size); 190 memblock_add(base, size);
191} 191}
192 192
193void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align)
194{
195 return __va(memblock_alloc(size, align));
196}
197
198/* 193/*
199 * Limit the memory size that was specified via FDT. 194 * Limit the memory size that was specified via FDT.
200 */ 195 */
@@ -328,9 +323,6 @@ static int c_show(struct seq_file *m, void *v)
328#ifdef CONFIG_SMP 323#ifdef CONFIG_SMP
329 seq_printf(m, "processor\t: %d\n", i); 324 seq_printf(m, "processor\t: %d\n", i);
330#endif 325#endif
331 seq_printf(m, "BogoMIPS\t: %lu.%02lu\n\n",
332 loops_per_jiffy / (500000UL/HZ),
333 loops_per_jiffy / (5000UL/HZ) % 100);
334 } 326 }
335 327
336 /* dump out the processor features */ 328 /* dump out the processor features */
diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
index fee5cce83450..78db90dcc910 100644
--- a/arch/arm64/kernel/smp.c
+++ b/arch/arm64/kernel/smp.c
@@ -223,11 +223,7 @@ asmlinkage void secondary_start_kernel(void)
223 223
224void __init smp_cpus_done(unsigned int max_cpus) 224void __init smp_cpus_done(unsigned int max_cpus)
225{ 225{
226 unsigned long bogosum = loops_per_jiffy * num_online_cpus(); 226 pr_info("SMP: Total of %d processors activated.\n", num_online_cpus());
227
228 pr_info("SMP: Total of %d processors activated (%lu.%02lu BogoMIPS).\n",
229 num_online_cpus(), bogosum / (500000/HZ),
230 (bogosum / (5000/HZ)) % 100);
231} 227}
232 228
233void __init smp_prepare_boot_cpu(void) 229void __init smp_prepare_boot_cpu(void)
diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S
index f5e55747242f..f8ab9d8e2ea3 100644
--- a/arch/arm64/kernel/vmlinux.lds.S
+++ b/arch/arm64/kernel/vmlinux.lds.S
@@ -71,6 +71,7 @@ SECTIONS
71 71
72 RO_DATA(PAGE_SIZE) 72 RO_DATA(PAGE_SIZE)
73 EXCEPTION_TABLE(8) 73 EXCEPTION_TABLE(8)
74 NOTES
74 _etext = .; /* End of text and rodata section */ 75 _etext = .; /* End of text and rodata section */
75 76
76 . = ALIGN(PAGE_SIZE); 77 . = ALIGN(PAGE_SIZE);
@@ -122,8 +123,6 @@ SECTIONS
122 } 123 }
123 _edata_loc = __data_loc + SIZEOF(.data); 124 _edata_loc = __data_loc + SIZEOF(.data);
124 125
125 NOTES
126
127 BSS_SECTION(0, 0, 0) 126 BSS_SECTION(0, 0, 0)
128 _end = .; 127 _end = .;
129 128
diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c
index 6c8ba25bf6bb..c23751b06120 100644
--- a/arch/arm64/mm/fault.c
+++ b/arch/arm64/mm/fault.c
@@ -130,7 +130,7 @@ static void __do_user_fault(struct task_struct *tsk, unsigned long addr,
130 force_sig_info(sig, &si, tsk); 130 force_sig_info(sig, &si, tsk);
131} 131}
132 132
133void do_bad_area(unsigned long addr, unsigned int esr, struct pt_regs *regs) 133static void do_bad_area(unsigned long addr, unsigned int esr, struct pt_regs *regs)
134{ 134{
135 struct task_struct *tsk = current; 135 struct task_struct *tsk = current;
136 struct mm_struct *mm = tsk->active_mm; 136 struct mm_struct *mm = tsk->active_mm;
@@ -199,13 +199,6 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr,
199 unsigned long vm_flags = VM_READ | VM_WRITE | VM_EXEC; 199 unsigned long vm_flags = VM_READ | VM_WRITE | VM_EXEC;
200 unsigned int mm_flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; 200 unsigned int mm_flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
201 201
202 if (esr & ESR_LNX_EXEC) {
203 vm_flags = VM_EXEC;
204 } else if ((esr & ESR_WRITE) && !(esr & ESR_CM)) {
205 vm_flags = VM_WRITE;
206 mm_flags |= FAULT_FLAG_WRITE;
207 }
208
209 tsk = current; 202 tsk = current;
210 mm = tsk->mm; 203 mm = tsk->mm;
211 204
@@ -220,6 +213,16 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr,
220 if (in_atomic() || !mm) 213 if (in_atomic() || !mm)
221 goto no_context; 214 goto no_context;
222 215
216 if (user_mode(regs))
217 mm_flags |= FAULT_FLAG_USER;
218
219 if (esr & ESR_LNX_EXEC) {
220 vm_flags = VM_EXEC;
221 } else if ((esr & ESR_WRITE) && !(esr & ESR_CM)) {
222 vm_flags = VM_WRITE;
223 mm_flags |= FAULT_FLAG_WRITE;
224 }
225
223 /* 226 /*
224 * As per x86, we may deadlock here. However, since the kernel only 227 * As per x86, we may deadlock here. However, since the kernel only
225 * validly references user space from well defined areas of the code, 228 * validly references user space from well defined areas of the code,
@@ -288,6 +291,13 @@ retry:
288 VM_FAULT_BADACCESS)))) 291 VM_FAULT_BADACCESS))))
289 return 0; 292 return 0;
290 293
294 /*
295 * If we are in kernel mode at this point, we have no context to
296 * handle this fault with.
297 */
298 if (!user_mode(regs))
299 goto no_context;
300
291 if (fault & VM_FAULT_OOM) { 301 if (fault & VM_FAULT_OOM) {
292 /* 302 /*
293 * We ran out of memory, call the OOM killer, and return to 303 * We ran out of memory, call the OOM killer, and return to
@@ -298,13 +308,6 @@ retry:
298 return 0; 308 return 0;
299 } 309 }
300 310
301 /*
302 * If we are in kernel mode at this point, we have no context to
303 * handle this fault with.
304 */
305 if (!user_mode(regs))
306 goto no_context;
307
308 if (fault & VM_FAULT_SIGBUS) { 311 if (fault & VM_FAULT_SIGBUS) {
309 /* 312 /*
310 * We had some memory, but were unable to successfully fix up 313 * We had some memory, but were unable to successfully fix up
diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c
index 2fc8258bab2d..5e9aec358306 100644
--- a/arch/arm64/mm/hugetlbpage.c
+++ b/arch/arm64/mm/hugetlbpage.c
@@ -54,6 +54,11 @@ int pud_huge(pud_t pud)
54 return !(pud_val(pud) & PUD_TABLE_BIT); 54 return !(pud_val(pud) & PUD_TABLE_BIT);
55} 55}
56 56
57int pmd_huge_support(void)
58{
59 return 1;
60}
61
57static __init int setup_hugepagesz(char *opt) 62static __init int setup_hugepagesz(char *opt)
58{ 63{
59 unsigned long ps = memparse(opt, &opt); 64 unsigned long ps = memparse(opt, &opt);
diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
index 67e8d7ce3fe7..de2de5db628d 100644
--- a/arch/arm64/mm/init.c
+++ b/arch/arm64/mm/init.c
@@ -44,8 +44,7 @@ static unsigned long phys_initrd_size __initdata = 0;
44 44
45phys_addr_t memstart_addr __read_mostly = 0; 45phys_addr_t memstart_addr __read_mostly = 0;
46 46
47void __init early_init_dt_setup_initrd_arch(unsigned long start, 47void __init early_init_dt_setup_initrd_arch(u64 start, u64 end)
48 unsigned long end)
49{ 48{
50 phys_initrd_start = start; 49 phys_initrd_start = start;
51 phys_initrd_size = end - start; 50 phys_initrd_size = end - start;
diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
index a8d1059b91b2..f557ebbe7013 100644
--- a/arch/arm64/mm/mmu.c
+++ b/arch/arm64/mm/mmu.c
@@ -296,6 +296,7 @@ void __iomem * __init early_io_map(phys_addr_t phys, unsigned long virt)
296static void __init map_mem(void) 296static void __init map_mem(void)
297{ 297{
298 struct memblock_region *reg; 298 struct memblock_region *reg;
299 phys_addr_t limit;
299 300
300 /* 301 /*
301 * Temporarily limit the memblock range. We need to do this as 302 * Temporarily limit the memblock range. We need to do this as
@@ -303,9 +304,11 @@ static void __init map_mem(void)
303 * memory addressable from the initial direct kernel mapping. 304 * memory addressable from the initial direct kernel mapping.
304 * 305 *
305 * The initial direct kernel mapping, located at swapper_pg_dir, 306 * The initial direct kernel mapping, located at swapper_pg_dir,
306 * gives us PGDIR_SIZE memory starting from PHYS_OFFSET (aligned). 307 * gives us PGDIR_SIZE memory starting from PHYS_OFFSET (which must be
308 * aligned to 2MB as per Documentation/arm64/booting.txt).
307 */ 309 */
308 memblock_set_current_limit((PHYS_OFFSET & PGDIR_MASK) + PGDIR_SIZE); 310 limit = PHYS_OFFSET + PGDIR_SIZE;
311 memblock_set_current_limit(limit);
309 312
310 /* map all the memory banks */ 313 /* map all the memory banks */
311 for_each_memblock(memory, reg) { 314 for_each_memblock(memory, reg) {
@@ -315,6 +318,22 @@ static void __init map_mem(void)
315 if (start >= end) 318 if (start >= end)
316 break; 319 break;
317 320
321#ifndef CONFIG_ARM64_64K_PAGES
322 /*
323 * For the first memory bank align the start address and
324 * current memblock limit to prevent create_mapping() from
325 * allocating pte page tables from unmapped memory.
326 * When 64K pages are enabled, the pte page table for the
327 * first PGDIR_SIZE is already present in swapper_pg_dir.
328 */
329 if (start < limit)
330 start = ALIGN(start, PMD_SIZE);
331 if (end < limit) {
332 limit = end & PMD_MASK;
333 memblock_set_current_limit(limit);
334 }
335#endif
336
318 create_mapping(start, __phys_to_virt(start), end - start); 337 create_mapping(start, __phys_to_virt(start), end - start);
319 } 338 }
320 339
diff --git a/arch/arm64/mm/proc.S b/arch/arm64/mm/proc.S
index a82ae8868077..b1b31bbc967b 100644
--- a/arch/arm64/mm/proc.S
+++ b/arch/arm64/mm/proc.S
@@ -95,10 +95,6 @@ ENTRY(cpu_do_switch_mm)
95 ret 95 ret
96ENDPROC(cpu_do_switch_mm) 96ENDPROC(cpu_do_switch_mm)
97 97
98cpu_name:
99 .ascii "AArch64 Processor"
100 .align
101
102 .section ".text.init", #alloc, #execinstr 98 .section ".text.init", #alloc, #execinstr
103 99
104/* 100/*
@@ -151,7 +147,7 @@ ENTRY(__cpu_setup)
151 * both user and kernel. 147 * both user and kernel.
152 */ 148 */
153 ldr x10, =TCR_TxSZ(VA_BITS) | TCR_FLAGS | TCR_IPS_40BIT | \ 149 ldr x10, =TCR_TxSZ(VA_BITS) | TCR_FLAGS | TCR_IPS_40BIT | \
154 TCR_ASID16 | (1 << 31) 150 TCR_ASID16 | TCR_TBI0 | (1 << 31)
155#ifdef CONFIG_ARM64_64K_PAGES 151#ifdef CONFIG_ARM64_64K_PAGES
156 orr x10, x10, TCR_TG0_64K 152 orr x10, x10, TCR_TG0_64K
157 orr x10, x10, TCR_TG1_64K 153 orr x10, x10, TCR_TG1_64K
diff --git a/arch/avr32/Kconfig b/arch/avr32/Kconfig
index 549903cfc2cb..b6878eb64884 100644
--- a/arch/avr32/Kconfig
+++ b/arch/avr32/Kconfig
@@ -6,7 +6,6 @@ config AVR32
6 select HAVE_CLK 6 select HAVE_CLK
7 select HAVE_OPROFILE 7 select HAVE_OPROFILE
8 select HAVE_KPROBES 8 select HAVE_KPROBES
9 select HAVE_GENERIC_HARDIRQS
10 select VIRT_TO_BUS 9 select VIRT_TO_BUS
11 select GENERIC_IRQ_PROBE 10 select GENERIC_IRQ_PROBE
12 select GENERIC_ATOMIC64 11 select GENERIC_ATOMIC64
diff --git a/arch/avr32/mach-at32ap/at32ap700x.c b/arch/avr32/mach-at32ap/at32ap700x.c
index 7f8759a8a92a..a68f3cf7c3c1 100644
--- a/arch/avr32/mach-at32ap/at32ap700x.c
+++ b/arch/avr32/mach-at32ap/at32ap700x.c
@@ -1983,6 +1983,9 @@ at32_add_device_nand(unsigned int id, struct atmel_nand_data *data)
1983 ARRAY_SIZE(smc_cs3_resource))) 1983 ARRAY_SIZE(smc_cs3_resource)))
1984 goto fail; 1984 goto fail;
1985 1985
1986 /* For at32ap7000, we use the reset workaround for nand driver */
1987 data->need_reset_workaround = true;
1988
1986 if (platform_device_add_data(pdev, data, 1989 if (platform_device_add_data(pdev, data,
1987 sizeof(struct atmel_nand_data))) 1990 sizeof(struct atmel_nand_data)))
1988 goto fail; 1991 goto fail;
diff --git a/arch/avr32/mm/fault.c b/arch/avr32/mm/fault.c
index b2f2d2d66849..0eca93327195 100644
--- a/arch/avr32/mm/fault.c
+++ b/arch/avr32/mm/fault.c
@@ -86,6 +86,8 @@ asmlinkage void do_page_fault(unsigned long ecr, struct pt_regs *regs)
86 86
87 local_irq_enable(); 87 local_irq_enable();
88 88
89 if (user_mode(regs))
90 flags |= FAULT_FLAG_USER;
89retry: 91retry:
90 down_read(&mm->mmap_sem); 92 down_read(&mm->mmap_sem);
91 93
@@ -228,9 +230,9 @@ no_context:
228 */ 230 */
229out_of_memory: 231out_of_memory:
230 up_read(&mm->mmap_sem); 232 up_read(&mm->mmap_sem);
231 pagefault_out_of_memory();
232 if (!user_mode(regs)) 233 if (!user_mode(regs))
233 goto no_context; 234 goto no_context;
235 pagefault_out_of_memory();
234 return; 236 return;
235 237
236do_sigbus: 238do_sigbus:
diff --git a/arch/avr32/oprofile/op_model_avr32.c b/arch/avr32/oprofile/op_model_avr32.c
index f74b7809e089..08308be2c02c 100644
--- a/arch/avr32/oprofile/op_model_avr32.c
+++ b/arch/avr32/oprofile/op_model_avr32.c
@@ -97,8 +97,7 @@ static irqreturn_t avr32_perf_counter_interrupt(int irq, void *dev_id)
97 return IRQ_HANDLED; 97 return IRQ_HANDLED;
98} 98}
99 99
100static int avr32_perf_counter_create_files(struct super_block *sb, 100static int avr32_perf_counter_create_files(struct dentry *root)
101 struct dentry *root)
102{ 101{
103 struct dentry *dir; 102 struct dentry *dir;
104 unsigned int i; 103 unsigned int i;
@@ -106,21 +105,21 @@ static int avr32_perf_counter_create_files(struct super_block *sb,
106 105
107 for (i = 0; i < NR_counter; i++) { 106 for (i = 0; i < NR_counter; i++) {
108 snprintf(filename, sizeof(filename), "%u", i); 107 snprintf(filename, sizeof(filename), "%u", i);
109 dir = oprofilefs_mkdir(sb, root, filename); 108 dir = oprofilefs_mkdir(root, filename);
110 109
111 oprofilefs_create_ulong(sb, dir, "enabled", 110 oprofilefs_create_ulong(dir, "enabled",
112 &counter[i].enabled); 111 &counter[i].enabled);
113 oprofilefs_create_ulong(sb, dir, "event", 112 oprofilefs_create_ulong(dir, "event",
114 &counter[i].event); 113 &counter[i].event);
115 oprofilefs_create_ulong(sb, dir, "count", 114 oprofilefs_create_ulong(dir, "count",
116 &counter[i].count); 115 &counter[i].count);
117 116
118 /* Dummy entries */ 117 /* Dummy entries */
119 oprofilefs_create_ulong(sb, dir, "kernel", 118 oprofilefs_create_ulong(dir, "kernel",
120 &counter[i].kernel); 119 &counter[i].kernel);
121 oprofilefs_create_ulong(sb, dir, "user", 120 oprofilefs_create_ulong(dir, "user",
122 &counter[i].user); 121 &counter[i].user);
123 oprofilefs_create_ulong(sb, dir, "unit_mask", 122 oprofilefs_create_ulong(dir, "unit_mask",
124 &counter[i].unit_mask); 123 &counter[i].unit_mask);
125 } 124 }
126 125
diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig
index 3b6abc54b015..f78c9a2c7e28 100644
--- a/arch/blackfin/Kconfig
+++ b/arch/blackfin/Kconfig
@@ -32,7 +32,6 @@ config BLACKFIN
32 select HAVE_UNDERSCORE_SYMBOL_PREFIX 32 select HAVE_UNDERSCORE_SYMBOL_PREFIX
33 select VIRT_TO_BUS 33 select VIRT_TO_BUS
34 select ARCH_WANT_IPC_PARSE_VERSION 34 select ARCH_WANT_IPC_PARSE_VERSION
35 select HAVE_GENERIC_HARDIRQS
36 select GENERIC_ATOMIC64 35 select GENERIC_ATOMIC64
37 select GENERIC_IRQ_PROBE 36 select GENERIC_IRQ_PROBE
38 select USE_GENERIC_SMP_HELPERS if SMP 37 select USE_GENERIC_SMP_HELPERS if SMP
diff --git a/arch/blackfin/boot/.gitignore b/arch/blackfin/boot/.gitignore
index 229e50808677..1287a5487e7d 100644
--- a/arch/blackfin/boot/.gitignore
+++ b/arch/blackfin/boot/.gitignore
@@ -1,2 +1,3 @@
1vmImage* 1vmImage*
2vmlinux* 2vmlinux*
3uImage*
diff --git a/arch/blackfin/include/asm/scb.h b/arch/blackfin/include/asm/scb.h
new file mode 100644
index 000000000000..a294cc0d1a4a
--- /dev/null
+++ b/arch/blackfin/include/asm/scb.h
@@ -0,0 +1,21 @@
1/*
2 * arch/blackfin/mach-common/scb-init.c - reprogram system cross bar priority
3 *
4 * Copyright 2012 Analog Devices Inc.
5 *
6 * Licensed under the GPL-2 or later.
7 */
8
9#define SCB_SLOT_OFFSET 24
10#define SCB_MI_MAX_SLOT 32
11
12struct scb_mi_prio {
13 unsigned long scb_mi_arbr;
14 unsigned long scb_mi_arbw;
15 unsigned char scb_mi_slots;
16 unsigned char scb_mi_prio[SCB_MI_MAX_SLOT];
17};
18
19extern struct scb_mi_prio scb_data[];
20
21extern void init_scb(void);
diff --git a/arch/blackfin/kernel/setup.c b/arch/blackfin/kernel/setup.c
index 19ad0637e8ff..396193042127 100644
--- a/arch/blackfin/kernel/setup.c
+++ b/arch/blackfin/kernel/setup.c
@@ -35,6 +35,9 @@
35#ifdef CONFIG_BF60x 35#ifdef CONFIG_BF60x
36#include <mach/pm.h> 36#include <mach/pm.h>
37#endif 37#endif
38#ifdef CONFIG_SCB_PRIORITY
39#include <asm/scb.h>
40#endif
38 41
39u16 _bfin_swrst; 42u16 _bfin_swrst;
40EXPORT_SYMBOL(_bfin_swrst); 43EXPORT_SYMBOL(_bfin_swrst);
@@ -1101,6 +1104,9 @@ void __init setup_arch(char **cmdline_p)
1101#endif 1104#endif
1102 init_exception_vectors(); 1105 init_exception_vectors();
1103 bfin_cache_init(); /* Initialize caches for the boot CPU */ 1106 bfin_cache_init(); /* Initialize caches for the boot CPU */
1107#ifdef CONFIG_SCB_PRIORITY
1108 init_scb();
1109#endif
1104} 1110}
1105 1111
1106static int __init topology_init(void) 1112static int __init topology_init(void)
diff --git a/arch/blackfin/mach-bf609/Kconfig b/arch/blackfin/mach-bf609/Kconfig
index 95a4f1b676ce..2bcbf94b1edf 100644
--- a/arch/blackfin/mach-bf609/Kconfig
+++ b/arch/blackfin/mach-bf609/Kconfig
@@ -59,6 +59,1661 @@ config SEC_IRQ_PRIORITY_LEVELS
59 Divide the total number of interrupt priority levels into sub-levels. 59 Divide the total number of interrupt priority levels into sub-levels.
60 There is 2 ^ (SEC_IRQ_PRIORITY_LEVELS + 1) different levels. 60 There is 2 ^ (SEC_IRQ_PRIORITY_LEVELS + 1) different levels.
61 61
62
63comment "System Cross Bar Priority Assignment"
64
65config SCB_PRIORITY
66 bool "Init System Cross Bar Priority"
67 default n
68
69menuconfig SCB0_MI0
70 bool "SCB0 Master Interface 0 (DDR)"
71 default n
72 depends on SCB_PRIORITY
73 help
74 The slave interface id of each slot should be set according following table.
75 Core 0 -- 0
76 Core 1 -- 2
77 SCB1 -- 9
78 SCB2 -- 10
79 SCB3 -- 11
80 SCB4 -- 12
81 SCB5 -- 5
82 SCB6 -- 6
83 SCB7 -- 8
84 SCB8 -- 7
85 SCB9 -- 4
86 USB -- 13
87
88if SCB0_MI0
89
90config SCB0_MI0_SLOT0
91 int "Slot 0 slave interface id"
92 default 0
93 range 0 13
94
95config SCB0_MI0_SLOT1
96 int "Slot 1 slave interface id"
97 default 2
98 range 0 13
99
100config SCB0_MI0_SLOT2
101 int "Slot 2 slave interface id"
102 default 4
103 range 0 13
104
105config SCB0_MI0_SLOT3
106 int "Slot 3 slave interface id"
107 default 5
108 range 0 13
109
110config SCB0_MI0_SLOT4
111 int "Slot 4 slave interface id"
112 default 6
113 range 0 13
114
115config SCB0_MI0_SLOT5
116 int "Slot 5 slave interface id"
117 default 7
118 range 0 13
119
120config SCB0_MI0_SLOT6
121 int "Slot 6 slave interface id"
122 default 8
123 range 0 13
124
125config SCB0_MI0_SLOT7
126 int "Slot 7 slave interface id"
127 default 9
128 range 0 13
129
130config SCB0_MI0_SLOT8
131 int "Slot 8 slave interface id"
132 default 10
133 range 0 13
134
135config SCB0_MI0_SLOT9
136 int "Slot 9 slave interface id"
137 default 11
138 range 0 13
139
140config SCB0_MI0_SLOT10
141 int "Slot 10 slave interface id"
142 default 13
143 range 0 13
144
145config SCB0_MI0_SLOT11
146 int "Slot 11 slave interface id"
147 default 12
148 range 0 13
149
150config SCB0_MI0_SLOT12
151 int "Slot 12 slave interface id"
152 default 0
153 range 0 13
154
155config SCB0_MI0_SLOT13
156 int "Slot 13 slave interface id"
157 default 2
158 range 0 13
159
160config SCB0_MI0_SLOT14
161 int "Slot 14 slave interface id"
162 default 4
163 range 0 13
164
165config SCB0_MI0_SLOT15
166 int "Slot 15 slave interface id"
167 default 5
168 range 0 13
169
170config SCB0_MI0_SLOT16
171 int "Slot 16 slave interface id"
172 default 6
173 range 0 13
174
175config SCB0_MI0_SLOT17
176 int "Slot 17 slave interface id"
177 default 7
178 range 0 13
179
180config SCB0_MI0_SLOT18
181 int "Slot 18 slave interface id"
182 default 8
183 range 0 13
184
185config SCB0_MI0_SLOT19
186 int "Slot 19 slave interface id"
187 default 9
188 range 0 13
189
190config SCB0_MI0_SLOT20
191 int "Slot 20 slave interface id"
192 default 10
193 range 0 13
194
195config SCB0_MI0_SLOT21
196 int "Slot 21 slave interface id"
197 default 11
198 range 0 13
199
200config SCB0_MI0_SLOT22
201 int "Slot 22 slave interface id"
202 default 13
203 range 0 13
204
205config SCB0_MI0_SLOT23
206 int "Slot 23 slave interface id"
207 default 12
208 range 0 13
209
210config SCB0_MI0_SLOT24
211 int "Slot 24 slave interface id"
212 default 0
213 range 0 13
214
215config SCB0_MI0_SLOT25
216 int "Slot 25 slave interface id"
217 default 2
218 range 0 13
219
220config SCB0_MI0_SLOT26
221 int "Slot 26 slave interface id"
222 default 4
223 range 0 13
224
225config SCB0_MI0_SLOT27
226 int "Slot 27 slave interface id"
227 default 5
228 range 0 13
229
230config SCB0_MI0_SLOT28
231 int "Slot 28 slave interface id"
232 default 6
233 range 0 13
234
235config SCB0_MI0_SLOT29
236 int "Slot 29 slave interface id"
237 default 7
238 range 0 13
239
240config SCB0_MI0_SLOT30
241 int "Slot 30 slave interface id"
242 default 8
243 range 0 13
244
245config SCB0_MI0_SLOT31
246 int "Slot 31 slave interface id"
247 default 13
248 range 0 13
249
250endif # SCB0_MI0
251
252menuconfig SCB0_MI1
253 bool "SCB0 Master Interface 1 (SMC)"
254 default n
255 depends on SCB_PRIORITY
256 help
257 The slave interface id of each slot should be set according following table.
258 Core 0 -- 0
259 Core 1 -- 2
260 SCB1 -- 9
261 SCB2 -- 10
262 SCB3 -- 11
263 SCB4 -- 12
264 SCB5 -- 5
265 SCB6 -- 6
266 SCB7 -- 8
267 SCB8 -- 7
268 SCB9 -- 4
269 USB -- 13
270
271if SCB0_MI1
272
273config SCB0_MI1_SLOT0
274 int "Slot 0 slave interface id"
275 default 0
276 range 0 13
277
278config SCB0_MI1_SLOT1
279 int "Slot 1 slave interface id"
280 default 2
281 range 0 13
282
283config SCB0_MI1_SLOT2
284 int "Slot 2 slave interface id"
285 default 4
286 range 0 13
287
288config SCB0_MI1_SLOT3
289 int "Slot 3 slave interface id"
290 default 5
291 range 0 13
292
293config SCB0_MI1_SLOT4
294 int "Slot 4 slave interface id"
295 default 6
296 range 0 13
297
298config SCB0_MI1_SLOT5
299 int "Slot 5 slave interface id"
300 default 7
301 range 0 13
302
303config SCB0_MI1_SLOT6
304 int "Slot 6 slave interface id"
305 default 8
306 range 0 13
307
308config SCB0_MI1_SLOT7
309 int "Slot 7 slave interface id"
310 default 9
311 range 0 13
312
313config SCB0_MI1_SLOT8
314 int "Slot 8 slave interface id"
315 default 10
316 range 0 13
317
318config SCB0_MI1_SLOT9
319 int "Slot 9 slave interface id"
320 default 11
321 range 0 13
322
323config SCB0_MI1_SLOT10
324 int "Slot 10 slave interface id"
325 default 13
326 range 0 13
327
328config SCB0_MI1_SLOT11
329 int "Slot 11 slave interface id"
330 default 12
331 range 0 13
332
333config SCB0_MI1_SLOT12
334 int "Slot 12 slave interface id"
335 default 0
336 range 0 13
337
338config SCB0_MI1_SLOT13
339 int "Slot 13 slave interface id"
340 default 2
341 range 0 13
342
343config SCB0_MI1_SLOT14
344 int "Slot 14 slave interface id"
345 default 4
346 range 0 13
347
348config SCB0_MI1_SLOT15
349 int "Slot 15 slave interface id"
350 default 5
351 range 0 13
352
353config SCB0_MI1_SLOT16
354 int "Slot 16 slave interface id"
355 default 6
356 range 0 13
357
358config SCB0_MI1_SLOT17
359 int "Slot 17 slave interface id"
360 default 7
361 range 0 13
362
363config SCB0_MI1_SLOT18
364 int "Slot 18 slave interface id"
365 default 8
366 range 0 13
367
368config SCB0_MI1_SLOT19
369 int "Slot 19 slave interface id"
370 default 9
371 range 0 13
372
373config SCB0_MI1_SLOT20
374 int "Slot 20 slave interface id"
375 default 10
376 range 0 13
377
378config SCB0_MI1_SLOT21
379 int "Slot 21 slave interface id"
380 default 11
381 range 0 13
382
383config SCB0_MI1_SLOT22
384 int "Slot 22 slave interface id"
385 default 13
386 range 0 13
387
388config SCB0_MI1_SLOT23
389 int "Slot 23 slave interface id"
390 default 12
391 range 0 13
392
393config SCB0_MI1_SLOT24
394 int "Slot 24 slave interface id"
395 default 0
396 range 0 13
397
398config SCB0_MI1_SLOT25
399 int "Slot 25 slave interface id"
400 default 2
401 range 0 13
402
403config SCB0_MI1_SLOT26
404 int "Slot 26 slave interface id"
405 default 4
406 range 0 13
407
408config SCB0_MI1_SLOT27
409 int "Slot 27 slave interface id"
410 default 5
411 range 0 13
412
413config SCB0_MI1_SLOT28
414 int "Slot 28 slave interface id"
415 default 6
416 range 0 13
417
418config SCB0_MI1_SLOT29
419 int "Slot 29 slave interface id"
420 default 7
421 range 0 13
422
423config SCB0_MI1_SLOT30
424 int "Slot 30 slave interface id"
425 default 8
426 range 0 13
427
428config SCB0_MI1_SLOT31
429 int "Slot 31 slave interface id"
430 default 13
431 range 0 13
432
433endif # SCB0_MI1
434
435menuconfig SCB0_MI2
436 bool "SCB0 Master Interface 2 (Data L2)"
437 default n
438 depends on SCB_PRIORITY
439 help
440 The slave interface id of each slot should be set according following table.
441 Core 0 -- 0
442 Core 1 -- 2
443 SCB1 -- 9
444 SCB2 -- 10
445 SCB3 -- 11
446 SCB4 -- 12
447 SCB5 -- 5
448 SCB6 -- 6
449 SCB7 -- 8
450 SCB8 -- 7
451 SCB9 -- 4
452 USB -- 13
453
454if SCB0_MI2
455
456config SCB0_MI2_SLOT0
457 int "Slot 0 slave interface id"
458 default 4
459 range 0 13
460
461config SCB0_MI2_SLOT1
462 int "Slot 1 slave interface id"
463 default 5
464 range 0 13
465
466config SCB0_MI2_SLOT2
467 int "Slot 2 slave interface id"
468 default 6
469 range 0 13
470
471config SCB0_MI2_SLOT3
472 int "Slot 3 slave interface id"
473 default 7
474 range 0 13
475
476config SCB0_MI2_SLOT4
477 int "Slot 4 slave interface id"
478 default 8
479 range 0 13
480
481config SCB0_MI2_SLOT5
482 int "Slot 5 slave interface id"
483 default 9
484 range 0 13
485
486config SCB0_MI2_SLOT6
487 int "Slot 6 slave interface id"
488 default 10
489 range 0 13
490
491config SCB0_MI2_SLOT7
492 int "Slot 7 slave interface id"
493 default 11
494 range 0 13
495
496config SCB0_MI2_SLOT8
497 int "Slot 8 slave interface id"
498 default 13
499 range 0 13
500
501config SCB0_MI2_SLOT9
502 int "Slot 9 slave interface id"
503 default 12
504 range 0 13
505
506config SCB0_MI2_SLOT10
507 int "Slot 10 slave interface id"
508 default 4
509 range 0 13
510
511config SCB0_MI2_SLOT11
512 int "Slot 11 slave interface id"
513 default 5
514 range 0 13
515
516config SCB0_MI2_SLOT12
517 int "Slot 12 slave interface id"
518 default 6
519 range 0 13
520
521config SCB0_MI2_SLOT13
522 int "Slot 13 slave interface id"
523 default 7
524 range 0 13
525
526config SCB0_MI2_SLOT14
527 int "Slot 14 slave interface id"
528 default 8
529 range 0 13
530
531config SCB0_MI2_SLOT15
532 int "Slot 15 slave interface id"
533 default 9
534 range 0 13
535
536config SCB0_MI2_SLOT16
537 int "Slot 16 slave interface id"
538 default 10
539 range 0 13
540
541config SCB0_MI2_SLOT17
542 int "Slot 17 slave interface id"
543 default 11
544 range 0 13
545
546config SCB0_MI2_SLOT18
547 int "Slot 18 slave interface id"
548 default 13
549 range 0 13
550
551config SCB0_MI2_SLOT19
552 int "Slot 19 slave interface id"
553 default 12
554 range 0 13
555
556config SCB0_MI2_SLOT20
557 int "Slot 20 slave interface id"
558 default 4
559 range 0 13
560
561config SCB0_MI2_SLOT21
562 int "Slot 21 slave interface id"
563 default 5
564 range 0 13
565
566config SCB0_MI2_SLOT22
567 int "Slot 22 slave interface id"
568 default 6
569 range 0 13
570
571config SCB0_MI2_SLOT23
572 int "Slot 23 slave interface id"
573 default 7
574 range 0 13
575
576config SCB0_MI2_SLOT24
577 int "Slot 24 slave interface id"
578 default 8
579 range 0 13
580
581config SCB0_MI2_SLOT25
582 int "Slot 25 slave interface id"
583 default 9
584 range 0 13
585
586config SCB0_MI2_SLOT26
587 int "Slot 26 slave interface id"
588 default 10
589 range 0 13
590
591config SCB0_MI2_SLOT27
592 int "Slot 27 slave interface id"
593 default 11
594 range 0 13
595
596config SCB0_MI2_SLOT28
597 int "Slot 28 slave interface id"
598 default 13
599 range 0 13
600
601config SCB0_MI2_SLOT29
602 int "Slot 29 slave interface id"
603 default 12
604 range 0 13
605
606config SCB0_MI2_SLOT30
607 int "Slot 30 slave interface id"
608 default 4
609 range 0 13
610
611config SCB0_MI2_SLOT31
612 int "Slot 31 slave interface id"
613 default 7
614 range 0 13
615
616endif # SCB0_MI2
617
618menuconfig SCB0_MI3
619 bool "SCB0 Master Interface 3 (L1A)"
620 default n
621 depends on SCB_PRIORITY
622 help
623 The slave interface id of each slot should be set according following table.
624 Core 0 -- 0
625 Core 1 -- 2
626 SCB1 -- 9
627 SCB2 -- 10
628 SCB3 -- 11
629 SCB4 -- 12
630 SCB5 -- 5
631 SCB6 -- 6
632 SCB7 -- 8
633 SCB8 -- 7
634 SCB9 -- 4
635 USB -- 13
636
637if SCB0_MI3
638
639config SCB0_MI3_SLOT0
640 int "Slot 0 slave interface id"
641 default 4
642 range 0 13
643
644config SCB0_MI3_SLOT1
645 int "Slot 1 slave interface id"
646 default 5
647 range 0 13
648
649config SCB0_MI3_SLOT2
650 int "Slot 2 slave interface id"
651 default 6
652 range 0 13
653
654config SCB0_MI3_SLOT3
655 int "Slot 3 slave interface id"
656 default 7
657 range 0 13
658
659config SCB0_MI3_SLOT4
660 int "Slot 4 slave interface id"
661 default 8
662 range 0 13
663
664config SCB0_MI3_SLOT5
665 int "Slot 5 slave interface id"
666 default 9
667 range 0 13
668
669config SCB0_MI3_SLOT6
670 int "Slot 6 slave interface id"
671 default 10
672 range 0 13
673
674config SCB0_MI3_SLOT7
675 int "Slot 7 slave interface id"
676 default 11
677 range 0 13
678
679config SCB0_MI3_SLOT8
680 int "Slot 8 slave interface id"
681 default 13
682 range 0 13
683
684config SCB0_MI3_SLOT9
685 int "Slot 9 slave interface id"
686 default 12
687 range 0 13
688
689config SCB0_MI3_SLOT10
690 int "Slot 10 slave interface id"
691 default 4
692 range 0 13
693
694config SCB0_MI3_SLOT11
695 int "Slot 11 slave interface id"
696 default 5
697 range 0 13
698
699config SCB0_MI3_SLOT12
700 int "Slot 12 slave interface id"
701 default 6
702 range 0 13
703
704config SCB0_MI3_SLOT13
705 int "Slot 13 slave interface id"
706 default 7
707 range 0 13
708
709config SCB0_MI3_SLOT14
710 int "Slot 14 slave interface id"
711 default 8
712 range 0 13
713
714config SCB0_MI3_SLOT15
715 int "Slot 15 slave interface id"
716 default 9
717 range 0 13
718
719config SCB0_MI3_SLOT16
720 int "Slot 16 slave interface id"
721 default 10
722 range 0 13
723
724config SCB0_MI3_SLOT17
725 int "Slot 17 slave interface id"
726 default 11
727 range 0 13
728
729config SCB0_MI3_SLOT18
730 int "Slot 18 slave interface id"
731 default 13
732 range 0 13
733
734config SCB0_MI3_SLOT19
735 int "Slot 19 slave interface id"
736 default 12
737 range 0 13
738
739config SCB0_MI3_SLOT20
740 int "Slot 20 slave interface id"
741 default 4
742 range 0 13
743
744config SCB0_MI3_SLOT21
745 int "Slot 21 slave interface id"
746 default 5
747 range 0 13
748
749config SCB0_MI3_SLOT22
750 int "Slot 22 slave interface id"
751 default 6
752 range 0 13
753
754config SCB0_MI3_SLOT23
755 int "Slot 23 slave interface id"
756 default 7
757 range 0 13
758
759config SCB0_MI3_SLOT24
760 int "Slot 24 slave interface id"
761 default 8
762 range 0 13
763
764config SCB0_MI3_SLOT25
765 int "Slot 25 slave interface id"
766 default 9
767 range 0 13
768
769config SCB0_MI3_SLOT26
770 int "Slot 26 slave interface id"
771 default 10
772 range 0 13
773
774config SCB0_MI3_SLOT27
775 int "Slot 27 slave interface id"
776 default 11
777 range 0 13
778
779config SCB0_MI3_SLOT28
780 int "Slot 28 slave interface id"
781 default 13
782 range 0 13
783
784config SCB0_MI3_SLOT29
785 int "Slot 29 slave interface id"
786 default 12
787 range 0 13
788
789config SCB0_MI3_SLOT30
790 int "Slot 30 slave interface id"
791 default 4
792 range 0 13
793
794config SCB0_MI3_SLOT31
795 int "Slot 31 slave interface id"
796 default 7
797 range 0 13
798
799endif # SCB0_MI3
800
801menuconfig SCB0_MI4
802 bool "SCB0 Master Interface 4 (L1B)"
803 default n
804 depends on SCB_PRIORITY
805 help
806 The slave interface id of each slot should be set according following table.
807 Core 0 -- 0
808 Core 1 -- 2
809 SCB1 -- 9
810 SCB2 -- 10
811 SCB3 -- 11
812 SCB4 -- 12
813 SCB5 -- 5
814 SCB6 -- 6
815 SCB7 -- 8
816 SCB8 -- 7
817 SCB9 -- 4
818 USB -- 13
819
820if SCB0_MI4
821
822config SCB0_MI4_SLOT0
823 int "Slot 0 slave interface id"
824 default 4
825 range 0 13
826
827config SCB0_MI4_SLOT1
828 int "Slot 1 slave interface id"
829 default 5
830 range 0 13
831
832config SCB0_MI4_SLOT2
833 int "Slot 2 slave interface id"
834 default 6
835 range 0 13
836
837config SCB0_MI4_SLOT3
838 int "Slot 3 slave interface id"
839 default 7
840 range 0 13
841
842config SCB0_MI4_SLOT4
843 int "Slot 4 slave interface id"
844 default 8
845 range 0 13
846
847config SCB0_MI4_SLOT5
848 int "Slot 5 slave interface id"
849 default 9
850 range 0 13
851
852config SCB0_MI4_SLOT6
853 int "Slot 6 slave interface id"
854 default 10
855 range 0 13
856
857config SCB0_MI4_SLOT7
858 int "Slot 7 slave interface id"
859 default 11
860 range 0 13
861
862config SCB0_MI4_SLOT8
863 int "Slot 8 slave interface id"
864 default 13
865 range 0 13
866
867config SCB0_MI4_SLOT9
868 int "Slot 9 slave interface id"
869 default 12
870 range 0 13
871
872config SCB0_MI4_SLOT10
873 int "Slot 10 slave interface id"
874 default 4
875 range 0 13
876
877config SCB0_MI4_SLOT11
878 int "Slot 11 slave interface id"
879 default 5
880 range 0 13
881
882config SCB0_MI4_SLOT12
883 int "Slot 12 slave interface id"
884 default 6
885 range 0 13
886
887config SCB0_MI4_SLOT13
888 int "Slot 13 slave interface id"
889 default 7
890 range 0 13
891
892config SCB0_MI4_SLOT14
893 int "Slot 14 slave interface id"
894 default 8
895 range 0 13
896
897config SCB0_MI4_SLOT15
898 int "Slot 15 slave interface id"
899 default 9
900 range 0 13
901
902config SCB0_MI4_SLOT16
903 int "Slot 16 slave interface id"
904 default 10
905 range 0 13
906
907config SCB0_MI4_SLOT17
908 int "Slot 17 slave interface id"
909 default 11
910 range 0 13
911
912config SCB0_MI4_SLOT18
913 int "Slot 18 slave interface id"
914 default 13
915 range 0 13
916
917config SCB0_MI4_SLOT19
918 int "Slot 19 slave interface id"
919 default 12
920 range 0 13
921
922config SCB0_MI4_SLOT20
923 int "Slot 20 slave interface id"
924 default 4
925 range 0 13
926
927config SCB0_MI4_SLOT21
928 int "Slot 21 slave interface id"
929 default 5
930 range 0 13
931
932config SCB0_MI4_SLOT22
933 int "Slot 22 slave interface id"
934 default 6
935 range 0 13
936
937config SCB0_MI4_SLOT23
938 int "Slot 23 slave interface id"
939 default 7
940 range 0 13
941
942config SCB0_MI4_SLOT24
943 int "Slot 24 slave interface id"
944 default 8
945 range 0 13
946
947config SCB0_MI4_SLOT25
948 int "Slot 25 slave interface id"
949 default 9
950 range 0 13
951
952config SCB0_MI4_SLOT26
953 int "Slot 26 slave interface id"
954 default 10
955 range 0 13
956
957config SCB0_MI4_SLOT27
958 int "Slot 27 slave interface id"
959 default 11
960 range 0 13
961
962config SCB0_MI4_SLOT28
963 int "Slot 28 slave interface id"
964 default 13
965 range 0 13
966
967config SCB0_MI4_SLOT29
968 int "Slot 29 slave interface id"
969 default 12
970 range 0 13
971
972config SCB0_MI4_SLOT30
973 int "Slot 30 slave interface id"
974 default 4
975 range 0 13
976
977config SCB0_MI4_SLOT31
978 int "Slot 31 slave interface id"
979 default 7
980 range 0 13
981
982endif # SCB0_MI4
983
984menuconfig SCB0_MI5
985 bool "SCB0 Master Interface 5 (SMMR)"
986 default n
987 depends on SCB_PRIORITY
988 help
989 The slave interface id of each slot should be set according following table.
990 MMR0 -- 1
991 MMR1 -- 3
992 SCB2 -- 10
993 SCB4 -- 12
994
995if SCB0_MI5
996
997config SCB0_MI5_SLOT0
998 int "Slot 0 slave interface id"
999 default 1
1000 range 0 13
1001
1002config SCB0_MI5_SLOT1
1003 int "Slot 1 slave interface id"
1004 default 3
1005 range 0 13
1006
1007config SCB0_MI5_SLOT2
1008 int "Slot 2 slave interface id"
1009 default 10
1010 range 0 13
1011
1012config SCB0_MI5_SLOT3
1013 int "Slot 3 slave interface id"
1014 default 12
1015 range 0 13
1016
1017config SCB0_MI5_SLOT4
1018 int "Slot 4 slave interface id"
1019 default 1
1020 range 0 13
1021
1022config SCB0_MI5_SLOT5
1023 int "Slot 5 slave interface id"
1024 default 3
1025 range 0 13
1026
1027config SCB0_MI5_SLOT6
1028 int "Slot 6 slave interface id"
1029 default 10
1030 range 0 13
1031
1032config SCB0_MI5_SLOT7
1033 int "Slot 7 slave interface id"
1034 default 12
1035 range 0 13
1036
1037config SCB0_MI5_SLOT8
1038 int "Slot 8 slave interface id"
1039 default 1
1040 range 0 13
1041
1042config SCB0_MI5_SLOT9
1043 int "Slot 9 slave interface id"
1044 default 3
1045 range 0 13
1046
1047config SCB0_MI5_SLOT10
1048 int "Slot 10 slave interface id"
1049 default 10
1050 range 0 13
1051
1052config SCB0_MI5_SLOT11
1053 int "Slot 11 slave interface id"
1054 default 12
1055 range 0 13
1056
1057config SCB0_MI5_SLOT12
1058 int "Slot 12 slave interface id"
1059 default 1
1060 range 0 13
1061
1062config SCB0_MI5_SLOT13
1063 int "Slot 13 slave interface id"
1064 default 3
1065 range 0 13
1066
1067config SCB0_MI5_SLOT14
1068 int "Slot 14 slave interface id"
1069 default 10
1070 range 0 13
1071
1072config SCB0_MI5_SLOT15
1073 int "Slot 15 slave interface id"
1074 default 12
1075 range 0 13
1076
1077endif # SCB0_MI5
1078
1079menuconfig SCB1_MI0
1080 bool "SCB1 Master Interface 0"
1081 default n
1082 depends on SCB_PRIORITY
1083 help
1084 The slave interface id of each slot should be set according following table.
1085 SPORT0A -- 0
1086 SPORT0B -- 1
1087 SPORT1A -- 2
1088 SPORT1B -- 3
1089 SPORT2A -- 4
1090 SPORT2B -- 5
1091 SPI0TX -- 6
1092 SPI0RX -- 7
1093 SPI1TX -- 8
1094 SPI1RX -- 9
1095
1096if SCB1_MI0
1097
1098config SCB1_MI0_SLOT0
1099 int "Slot 0 slave interface id"
1100 default 0
1101 range 0 9
1102
1103config SCB1_MI0_SLOT1
1104 int "Slot 1 slave interface id"
1105 default 1
1106 range 0 9
1107
1108config SCB1_MI0_SLOT2
1109 int "Slot 2 slave interface id"
1110 default 2
1111 range 0 9
1112
1113config SCB1_MI0_SLOT3
1114 int "Slot 3 slave interface id"
1115 default 3
1116 range 0 9
1117
1118config SCB1_MI0_SLOT4
1119 int "Slot 4 slave interface id"
1120 default 4
1121 range 0 9
1122
1123config SCB1_MI0_SLOT5
1124 int "Slot 5 slave interface id"
1125 default 5
1126 range 0 9
1127
1128config SCB1_MI0_SLOT6
1129 int "Slot 6 slave interface id"
1130 default 6
1131 range 0 9
1132
1133config SCB1_MI0_SLOT7
1134 int "Slot 7 slave interface id"
1135 default 7
1136 range 0 9
1137
1138config SCB1_MI0_SLOT8
1139 int "Slot 8 slave interface id"
1140 default 8
1141 range 0 9
1142
1143config SCB1_MI0_SLOT9
1144 int "Slot 9 slave interface id"
1145 default 9
1146 range 0 9
1147
1148config SCB1_MI0_SLOT10
1149 int "Slot 10 slave interface id"
1150 default 0
1151 range 0 9
1152
1153config SCB1_MI0_SLOT11
1154 int "Slot 11 slave interface id"
1155 default 1
1156 range 0 9
1157
1158config SCB1_MI0_SLOT12
1159 int "Slot 12 slave interface id"
1160 default 2
1161 range 0 9
1162
1163config SCB1_MI0_SLOT13
1164 int "Slot 13 slave interface id"
1165 default 3
1166 range 0 9
1167
1168config SCB1_MI0_SLOT14
1169 int "Slot 14 slave interface id"
1170 default 4
1171 range 0 9
1172
1173config SCB1_MI0_SLOT15
1174 int "Slot 15 slave interface id"
1175 default 5
1176 range 0 9
1177
1178config SCB1_MI0_SLOT16
1179 int "Slot 16 slave interface id"
1180 default 6
1181 range 0 13
1182
1183config SCB1_MI0_SLOT17
1184 int "Slot 17 slave interface id"
1185 default 7
1186 range 0 13
1187
1188config SCB1_MI0_SLOT18
1189 int "Slot 18 slave interface id"
1190 default 8
1191 range 0 13
1192
1193config SCB1_MI0_SLOT19
1194 int "Slot 19 slave interface id"
1195 default 9
1196 range 0 13
1197
1198endif # SCB1_MI0
1199
1200menuconfig SCB2_MI0
1201 bool "SCB2 Master Interface 0"
1202 default n
1203 depends on SCB_PRIORITY
1204 help
1205 The slave interface id of each slot should be set according following table.
1206 RSI -- 0
1207 SDU DMA -- 1
1208 SDU -- 2
1209 EMAC0 -- 3
1210 EMAC1 -- 4
1211
1212if SCB2_MI0
1213
1214config SCB2_MI0_SLOT0
1215 int "Slot 0 slave interface id"
1216 default 0
1217 range 0 4
1218
1219config SCB2_MI0_SLOT1
1220 int "Slot 1 slave interface id"
1221 default 1
1222 range 0 4
1223
1224config SCB2_MI0_SLOT2
1225 int "Slot 2 slave interface id"
1226 default 2
1227 range 0 4
1228
1229config SCB2_MI0_SLOT3
1230 int "Slot 3 slave interface id"
1231 default 3
1232 range 0 4
1233
1234config SCB2_MI0_SLOT4
1235 int "Slot 4 slave interface id"
1236 default 4
1237 range 0 4
1238
1239config SCB2_MI0_SLOT5
1240 int "Slot 5 slave interface id"
1241 default 0
1242 range 0 4
1243
1244config SCB2_MI0_SLOT6
1245 int "Slot 6 slave interface id"
1246 default 1
1247 range 0 4
1248
1249config SCB2_MI0_SLOT7
1250 int "Slot 7 slave interface id"
1251 default 2
1252 range 0 4
1253
1254config SCB2_MI0_SLOT8
1255 int "Slot 8 slave interface id"
1256 default 3
1257 range 0 4
1258
1259config SCB2_MI0_SLOT9
1260 int "Slot 9 slave interface id"
1261 default 4
1262 range 0 4
1263
1264endif # SCB2_MI0
1265
1266menuconfig SCB3_MI0
1267 bool "SCB3 Master Interface 0"
1268 default n
1269 depends on SCB_PRIORITY
1270 help
1271 The slave interface id of each slot should be set according following table.
1272 LP0 -- 0
1273 LP1 -- 1
1274 LP2 -- 2
1275 LP3 -- 3
1276 UART0TX -- 4
1277 UART0RX -- 5
1278 UART1TX -- 4
1279 UART1RX -- 5
1280
1281if SCB3_MI0
1282
1283config SCB3_MI0_SLOT0
1284 int "Slot 0 slave interface id"
1285 default 0
1286 range 0 7
1287
1288config SCB3_MI0_SLOT1
1289 int "Slot 1 slave interface id"
1290 default 1
1291 range 0 7
1292
1293config SCB3_MI0_SLOT2
1294 int "Slot 2 slave interface id"
1295 default 2
1296 range 0 7
1297
1298config SCB3_MI0_SLOT3
1299 int "Slot 3 slave interface id"
1300 default 3
1301 range 0 7
1302
1303config SCB3_MI0_SLOT4
1304 int "Slot 4 slave interface id"
1305 default 4
1306 range 0 7
1307
1308config SCB3_MI0_SLOT5
1309 int "Slot 5 slave interface id"
1310 default 5
1311 range 0 7
1312
1313config SCB3_MI0_SLOT6
1314 int "Slot 6 slave interface id"
1315 default 6
1316 range 0 7
1317
1318config SCB3_MI0_SLOT7
1319 int "Slot 7 slave interface id"
1320 default 7
1321 range 0 7
1322
1323config SCB3_MI0_SLOT8
1324 int "Slot 8 slave interface id"
1325 default 0
1326 range 0 7
1327
1328config SCB3_MI0_SLOT9
1329 int "Slot 9 slave interface id"
1330 default 1
1331 range 0 7
1332
1333config SCB3_MI0_SLOT10
1334 int "Slot 10 slave interface id"
1335 default 2
1336 range 0 7
1337
1338config SCB3_MI0_SLOT11
1339 int "Slot 11 slave interface id"
1340 default 3
1341 range 0 7
1342
1343config SCB3_MI0_SLOT12
1344 int "Slot 12 slave interface id"
1345 default 4
1346 range 0 7
1347
1348config SCB3_MI0_SLOT13
1349 int "Slot 13 slave interface id"
1350 default 5
1351 range 0 7
1352
1353config SCB3_MI0_SLOT14
1354 int "Slot 14 slave interface id"
1355 default 6
1356 range 0 7
1357
1358config SCB3_MI0_SLOT15
1359 int "Slot 15 slave interface id"
1360 default 7
1361 range 0 7
1362
1363endif # SCB3_MI0
1364
1365menuconfig SCB4_MI0
1366 bool "SCB4 Master Interface 0"
1367 default n
1368 depends on SCB_PRIORITY
1369 help
1370 The slave interface id of each slot should be set according following table.
1371 MDA21 -- 0
1372 MDA22 -- 1
1373 MDA23 -- 2
1374 MDA24 -- 3
1375 MDA25 -- 4
1376 MDA26 -- 5
1377 MDA27 -- 6
1378 MDA28 -- 7
1379
1380if SCB4_MI0
1381
1382config SCB4_MI0_SLOT0
1383 int "Slot 0 slave interface id"
1384 default 0
1385 range 0 7
1386
1387config SCB4_MI0_SLOT1
1388 int "Slot 1 slave interface id"
1389 default 1
1390 range 0 7
1391
1392config SCB4_MI0_SLOT2
1393 int "Slot 2 slave interface id"
1394 default 2
1395 range 0 7
1396
1397config SCB4_MI0_SLOT3
1398 int "Slot 3 slave interface id"
1399 default 3
1400 range 0 7
1401
1402config SCB4_MI0_SLOT4
1403 int "Slot 4 slave interface id"
1404 default 4
1405 range 0 7
1406
1407config SCB4_MI0_SLOT5
1408 int "Slot 5 slave interface id"
1409 default 5
1410 range 0 7
1411
1412config SCB4_MI0_SLOT6
1413 int "Slot 6 slave interface id"
1414 default 6
1415 range 0 7
1416
1417config SCB4_MI0_SLOT7
1418 int "Slot 7 slave interface id"
1419 default 7
1420 range 0 7
1421
1422config SCB4_MI0_SLOT8
1423 int "Slot 8 slave interface id"
1424 default 0
1425 range 0 7
1426
1427config SCB4_MI0_SLOT9
1428 int "Slot 9 slave interface id"
1429 default 1
1430 range 0 7
1431
1432config SCB4_MI0_SLOT10
1433 int "Slot 10 slave interface id"
1434 default 2
1435 range 0 7
1436
1437config SCB4_MI0_SLOT11
1438 int "Slot 11 slave interface id"
1439 default 3
1440 range 0 7
1441
1442config SCB4_MI0_SLOT12
1443 int "Slot 12 slave interface id"
1444 default 4
1445 range 0 7
1446
1447config SCB4_MI0_SLOT13
1448 int "Slot 13 slave interface id"
1449 default 5
1450 range 0 7
1451
1452config SCB4_MI0_SLOT14
1453 int "Slot 14 slave interface id"
1454 default 6
1455 range 0 7
1456
1457config SCB4_MI0_SLOT15
1458 int "Slot 15 slave interface id"
1459 default 7
1460 range 0 7
1461
1462endif # SCB4_MI0
1463
1464menuconfig SCB5_MI0
1465 bool "SCB5 Master Interface 0"
1466 default n
1467 depends on SCB_PRIORITY
1468 help
1469 The slave interface id of each slot should be set according following table.
1470 PPI0 MDA29 -- 0
1471 PPI0 MDA30 -- 1
1472 PPI2 MDA31 -- 2
1473 PPI2 MDA32 -- 3
1474
1475if SCB5_MI0
1476
1477config SCB5_MI0_SLOT0
1478 int "Slot 0 slave interface id"
1479 default 0
1480 range 0 3
1481
1482config SCB5_MI0_SLOT1
1483 int "Slot 1 slave interface id"
1484 default 1
1485 range 0 3
1486
1487config SCB5_MI0_SLOT2
1488 int "Slot 2 slave interface id"
1489 default 2
1490 range 0 3
1491
1492config SCB5_MI0_SLOT3
1493 int "Slot 3 slave interface id"
1494 default 3
1495 range 0 3
1496
1497config SCB5_MI0_SLOT4
1498 int "Slot 4 slave interface id"
1499 default 0
1500 range 0 3
1501
1502config SCB5_MI0_SLOT5
1503 int "Slot 5 slave interface id"
1504 default 1
1505 range 0 3
1506
1507config SCB5_MI0_SLOT6
1508 int "Slot 6 slave interface id"
1509 default 2
1510 range 0 3
1511
1512config SCB5_MI0_SLOT7
1513 int "Slot 7 slave interface id"
1514 default 3
1515 range 0 3
1516
1517endif # SCB5_MI0
1518
1519menuconfig SCB6_MI0
1520 bool "SCB6 Master Interface 0"
1521 default n
1522 depends on SCB_PRIORITY
1523 help
1524 The slave interface id of each slot should be set according following table.
1525 PPI1 MDA33 -- 0
1526 PPI1 MDA34 -- 1
1527
1528if SCB6_MI0
1529
1530config SCB6_MI0_SLOT0
1531 int "Slot 0 slave interface id"
1532 default 0
1533 range 0 1
1534
1535config SCB6_MI0_SLOT1
1536 int "Slot 1 slave interface id"
1537 default 1
1538 range 0 1
1539
1540config SCB6_MI0_SLOT2
1541 int "Slot 2 slave interface id"
1542 default 0
1543 range 0 1
1544
1545config SCB6_MI0_SLOT3
1546 int "Slot 3 slave interface id"
1547 default 1
1548 range 0 1
1549
1550endif # SCB6_MI0
1551
1552menuconfig SCB7_MI0
1553 bool "SCB7 Master Interface 0"
1554 default n
1555 depends on SCB_PRIORITY
1556 help
1557 The slave interface id of each slot should be set according following table.
1558 PIXC0 -- 0
1559 PIXC1 -- 1
1560 PIXC2 -- 2
1561
1562if SCB7_MI0
1563
1564config SCB7_MI0_SLOT0
1565 int "Slot 0 slave interface id"
1566 default 0
1567 range 0 2
1568
1569config SCB7_MI0_SLOT1
1570 int "Slot 1 slave interface id"
1571 default 1
1572 range 0 2
1573
1574config SCB7_MI0_SLOT2
1575 int "Slot 2 slave interface id"
1576 default 2
1577 range 0 2
1578
1579config SCB7_MI0_SLOT3
1580 int "Slot 3 slave interface id"
1581 default 0
1582 range 0 2
1583
1584config SCB7_MI0_SLOT4
1585 int "Slot 4 slave interface id"
1586 default 1
1587 range 0 2
1588
1589config SCB7_MI0_SLOT5
1590 int "Slot 5 slave interface id"
1591 default 2
1592 range 0 2
1593
1594endif # SCB7_MI0
1595
1596menuconfig SCB8_MI0
1597 bool "SCB8 Master Interface 0"
1598 default n
1599 depends on SCB_PRIORITY
1600 help
1601 The slave interface id of each slot should be set according following table.
1602 PVP CPDOB -- 0
1603 PVP CPDOC -- 1
1604 PVP CPCO -- 2
1605 PVP CPCI -- 3
1606
1607if SCB8_MI0
1608
1609config SCB8_MI0_SLOT0
1610 int "Slot 0 slave interface id"
1611 default 0
1612 range 0 3
1613
1614config SCB8_MI0_SLOT1
1615 int "Slot 1 slave interface id"
1616 default 1
1617 range 0 3
1618
1619config SCB8_MI0_SLOT2
1620 int "Slot 2 slave interface id"
1621 default 2
1622 range 0 3
1623
1624config SCB8_MI0_SLOT3
1625 int "Slot 3 slave interface id"
1626 default 3
1627 range 0 3
1628
1629config SCB8_MI0_SLOT4
1630 int "Slot 4 slave interface id"
1631 default 0
1632 range 0 3
1633
1634config SCB8_MI0_SLOT5
1635 int "Slot 5 slave interface id"
1636 default 1
1637 range 0 3
1638
1639config SCB8_MI0_SLOT6
1640 int "Slot 6 slave interface id"
1641 default 2
1642 range 0 3
1643
1644config SCB8_MI0_SLOT7
1645 int "Slot 7 slave interface id"
1646 default 3
1647 range 0 3
1648
1649endif # SCB8_MI0
1650
1651menuconfig SCB9_MI0
1652 bool "SCB9 Master Interface 0"
1653 default n
1654 depends on SCB_PRIORITY
1655 help
1656 The slave interface id of each slot should be set according following table.
1657 PVP MPDO -- 0
1658 PVP MPDI -- 1
1659 PVP MPCO -- 2
1660 PVP MPCI -- 3
1661 PVP CPDOA -- 4
1662
1663if SCB9_MI0
1664
1665config SCB9_MI0_SLOT0
1666 int "Slot 0 slave interface id"
1667 default 0
1668 range 0 4
1669
1670config SCB9_MI0_SLOT1
1671 int "Slot 1 slave interface id"
1672 default 1
1673 range 0 4
1674
1675config SCB9_MI0_SLOT2
1676 int "Slot 2 slave interface id"
1677 default 2
1678 range 0 4
1679
1680config SCB9_MI0_SLOT3
1681 int "Slot 3 slave interface id"
1682 default 3
1683 range 0 4
1684
1685config SCB9_MI0_SLOT4
1686 int "Slot 4 slave interface id"
1687 default 4
1688 range 0 4
1689
1690config SCB9_MI0_SLOT5
1691 int "Slot 5 slave interface id"
1692 default 0
1693 range 0 4
1694
1695config SCB9_MI0_SLOT6
1696 int "Slot 6 slave interface id"
1697 default 1
1698 range 0 4
1699
1700config SCB9_MI0_SLOT7
1701 int "Slot 7 slave interface id"
1702 default 2
1703 range 0 4
1704
1705config SCB9_MI0_SLOT8
1706 int "Slot 8 slave interface id"
1707 default 3
1708 range 0 4
1709
1710config SCB9_MI0_SLOT9
1711 int "Slot 9 slave interface id"
1712 default 4
1713 range 0 4
1714
1715endif # SCB9_MI0
1716
62endmenu 1717endmenu
63 1718
64endif 1719endif
diff --git a/arch/blackfin/mach-bf609/Makefile b/arch/blackfin/mach-bf609/Makefile
index 234fe1b4bb0e..60ffaf85d303 100644
--- a/arch/blackfin/mach-bf609/Makefile
+++ b/arch/blackfin/mach-bf609/Makefile
@@ -4,3 +4,4 @@
4 4
5obj-y := dma.o clock.o ints-priority.o 5obj-y := dma.o clock.o ints-priority.o
6obj-$(CONFIG_PM) += pm.o dpm.o 6obj-$(CONFIG_PM) += pm.o dpm.o
7obj-$(CONFIG_SCB_PRIORITY) += scb.o
diff --git a/arch/blackfin/mach-bf609/boards/ezkit.c b/arch/blackfin/mach-bf609/boards/ezkit.c
index 0bc47231540b..d56a55ad83a7 100644
--- a/arch/blackfin/mach-bf609/boards/ezkit.c
+++ b/arch/blackfin/mach-bf609/boards/ezkit.c
@@ -104,6 +104,7 @@ static struct platform_device bfin_rotary_device = {
104 104
105#if defined(CONFIG_STMMAC_ETH) || defined(CONFIG_STMMAC_ETH_MODULE) 105#if defined(CONFIG_STMMAC_ETH) || defined(CONFIG_STMMAC_ETH_MODULE)
106#include <linux/stmmac.h> 106#include <linux/stmmac.h>
107#include <linux/phy.h>
107 108
108static unsigned short pins[] = P_RMII0; 109static unsigned short pins[] = P_RMII0;
109 110
@@ -111,11 +112,26 @@ static struct stmmac_mdio_bus_data phy_private_data = {
111 .phy_mask = 1, 112 .phy_mask = 1,
112}; 113};
113 114
115static struct stmmac_dma_cfg eth_dma_cfg = {
116 .pbl = 2,
117};
118
119int stmmac_ptp_clk_init(struct platform_device *pdev)
120{
121 bfin_write32(PADS0_EMAC_PTP_CLKSEL, 0);
122 return 0;
123}
124
114static struct plat_stmmacenet_data eth_private_data = { 125static struct plat_stmmacenet_data eth_private_data = {
126 .has_gmac = 1,
115 .bus_id = 0, 127 .bus_id = 0,
116 .enh_desc = 1, 128 .enh_desc = 1,
117 .phy_addr = 1, 129 .phy_addr = 1,
118 .mdio_bus_data = &phy_private_data, 130 .mdio_bus_data = &phy_private_data,
131 .dma_cfg = &eth_dma_cfg,
132 .force_thresh_dma_mode = 1,
133 .interface = PHY_INTERFACE_MODE_RMII,
134 .init = stmmac_ptp_clk_init,
119}; 135};
120 136
121static struct platform_device bfin_eth_device = { 137static struct platform_device bfin_eth_device = {
@@ -1107,6 +1123,81 @@ static struct bfin_display_config bfin_display_data = {
1107}; 1123};
1108#endif 1124#endif
1109 1125
1126#if IS_ENABLED(CONFIG_VIDEO_ADV7343)
1127#include <media/adv7343.h>
1128
1129static struct v4l2_output adv7343_outputs[] = {
1130 {
1131 .index = 0,
1132 .name = "Composite",
1133 .type = V4L2_OUTPUT_TYPE_ANALOG,
1134 .std = V4L2_STD_ALL,
1135 .capabilities = V4L2_OUT_CAP_STD,
1136 },
1137 {
1138 .index = 1,
1139 .name = "S-Video",
1140 .type = V4L2_OUTPUT_TYPE_ANALOG,
1141 .std = V4L2_STD_ALL,
1142 .capabilities = V4L2_OUT_CAP_STD,
1143 },
1144 {
1145 .index = 2,
1146 .name = "Component",
1147 .type = V4L2_OUTPUT_TYPE_ANALOG,
1148 .std = V4L2_STD_ALL,
1149 .capabilities = V4L2_OUT_CAP_STD,
1150 },
1151
1152};
1153
1154static struct disp_route adv7343_routes[] = {
1155 {
1156 .output = ADV7343_COMPOSITE_ID,
1157 },
1158 {
1159 .output = ADV7343_SVIDEO_ID,
1160 },
1161 {
1162 .output = ADV7343_COMPONENT_ID,
1163 },
1164};
1165
1166static struct adv7343_platform_data adv7343_data = {
1167 .mode_config = {
1168 .sleep_mode = false,
1169 .pll_control = false,
1170 .dac_1 = true,
1171 .dac_2 = true,
1172 .dac_3 = true,
1173 .dac_4 = true,
1174 .dac_5 = true,
1175 .dac_6 = true,
1176 },
1177 .sd_config = {
1178 .sd_dac_out1 = false,
1179 .sd_dac_out2 = false,
1180 },
1181};
1182
1183static struct bfin_display_config bfin_display_data = {
1184 .card_name = "BF609",
1185 .outputs = adv7343_outputs,
1186 .num_outputs = ARRAY_SIZE(adv7343_outputs),
1187 .routes = adv7343_routes,
1188 .i2c_adapter_id = 0,
1189 .board_info = {
1190 .type = "adv7343",
1191 .addr = 0x2b,
1192 .platform_data = (void *)&adv7343_data,
1193 },
1194 .ppi_info = &ppi_info_disp,
1195 .ppi_control = (PACK_EN | DLEN_8 | EPPI_CTL_FS1LO_FS2LO
1196 | EPPI_CTL_POLC3 | EPPI_CTL_BLANKGEN | EPPI_CTL_SYNC2
1197 | EPPI_CTL_NON656 | EPPI_CTL_DIR),
1198};
1199#endif
1200
1110static struct platform_device bfin_display_device = { 1201static struct platform_device bfin_display_device = {
1111 .name = "bfin_display", 1202 .name = "bfin_display",
1112 .dev = { 1203 .dev = {
diff --git a/arch/blackfin/mach-bf609/clock.c b/arch/blackfin/mach-bf609/clock.c
index 437d56c82281..dab8849af884 100644
--- a/arch/blackfin/mach-bf609/clock.c
+++ b/arch/blackfin/mach-bf609/clock.c
@@ -220,6 +220,12 @@ unsigned long sys_clk_get_rate(struct clk *clk)
220 } 220 }
221} 221}
222 222
223unsigned long dummy_get_rate(struct clk *clk)
224{
225 clk->parent->rate = clk_get_rate(clk->parent);
226 return clk->parent->rate;
227}
228
223unsigned long sys_clk_round_rate(struct clk *clk, unsigned long rate) 229unsigned long sys_clk_round_rate(struct clk *clk, unsigned long rate)
224{ 230{
225 unsigned long max_rate; 231 unsigned long max_rate;
@@ -283,6 +289,10 @@ static struct clk_ops sys_clk_ops = {
283 .round_rate = sys_clk_round_rate, 289 .round_rate = sys_clk_round_rate,
284}; 290};
285 291
292static struct clk_ops dummy_clk_ops = {
293 .get_rate = dummy_get_rate,
294};
295
286static struct clk sys_clkin = { 296static struct clk sys_clkin = {
287 .name = "SYS_CLKIN", 297 .name = "SYS_CLKIN",
288 .rate = CONFIG_CLKIN_HZ, 298 .rate = CONFIG_CLKIN_HZ,
@@ -364,6 +374,12 @@ static struct clk oclk = {
364 .parent = &pll_clk, 374 .parent = &pll_clk,
365}; 375};
366 376
377static struct clk ethclk = {
378 .name = "stmmaceth",
379 .parent = &sclk0,
380 .ops = &dummy_clk_ops,
381};
382
367static struct clk_lookup bf609_clks[] = { 383static struct clk_lookup bf609_clks[] = {
368 CLK(sys_clkin, NULL, "SYS_CLKIN"), 384 CLK(sys_clkin, NULL, "SYS_CLKIN"),
369 CLK(pll_clk, NULL, "PLLCLK"), 385 CLK(pll_clk, NULL, "PLLCLK"),
@@ -375,6 +391,7 @@ static struct clk_lookup bf609_clks[] = {
375 CLK(sclk1, NULL, "SCLK1"), 391 CLK(sclk1, NULL, "SCLK1"),
376 CLK(dclk, NULL, "DCLK"), 392 CLK(dclk, NULL, "DCLK"),
377 CLK(oclk, NULL, "OCLK"), 393 CLK(oclk, NULL, "OCLK"),
394 CLK(ethclk, NULL, "stmmaceth"),
378}; 395};
379 396
380int __init clk_init(void) 397int __init clk_init(void)
diff --git a/arch/blackfin/mach-bf609/include/mach/defBF60x_base.h b/arch/blackfin/mach-bf609/include/mach/defBF60x_base.h
index f1a6afae1a71..35caa7bc192c 100644
--- a/arch/blackfin/mach-bf609/include/mach/defBF60x_base.h
+++ b/arch/blackfin/mach-bf609/include/mach/defBF60x_base.h
@@ -839,6 +839,16 @@
839#define PORTG_LOCK 0xFFC03344 /* PORTG Port x GPIO Lock Register */ 839#define PORTG_LOCK 0xFFC03344 /* PORTG Port x GPIO Lock Register */
840#define PORTG_REVID 0xFFC0337C /* PORTG Port x GPIO Revision ID */ 840#define PORTG_REVID 0xFFC0337C /* PORTG Port x GPIO Revision ID */
841 841
842/* ==================================================
843 Pads Controller Registers
844 ================================================== */
845
846/* =========================
847 PADS0
848 ========================= */
849#define PADS0_EMAC_PTP_CLKSEL 0xFFC03404 /* PADS0 Clock Selection for EMAC and PTP */
850#define PADS0_TWI_VSEL 0xFFC03408 /* PADS0 TWI Voltage Selection */
851#define PADS0_PORTS_HYST 0xFFC03440 /* PADS0 Hysteresis Enable Register */
842 852
843/* ========================= 853/* =========================
844 PINT Registers 854 PINT Registers
diff --git a/arch/blackfin/mach-bf609/scb.c b/arch/blackfin/mach-bf609/scb.c
new file mode 100644
index 000000000000..ac1f07c33594
--- /dev/null
+++ b/arch/blackfin/mach-bf609/scb.c
@@ -0,0 +1,363 @@
1/*
2 * arch/blackfin/mach-common/scb-init.c - reprogram system cross bar priority
3 *
4 * Copyright 2012 Analog Devices Inc.
5 *
6 * Licensed under the GPL-2 or later.
7 */
8
9#include <asm/blackfin.h>
10#include <asm/scb.h>
11
12struct scb_mi_prio scb_data[] = {
13#ifdef CONFIG_SCB0_MI0
14 { REG_SCB0_ARBR0, REG_SCB0_ARBW0, 32, {
15 CONFIG_SCB0_MI0_SLOT0,
16 CONFIG_SCB0_MI0_SLOT1,
17 CONFIG_SCB0_MI0_SLOT2,
18 CONFIG_SCB0_MI0_SLOT3,
19 CONFIG_SCB0_MI0_SLOT4,
20 CONFIG_SCB0_MI0_SLOT5,
21 CONFIG_SCB0_MI0_SLOT6,
22 CONFIG_SCB0_MI0_SLOT7,
23 CONFIG_SCB0_MI0_SLOT8,
24 CONFIG_SCB0_MI0_SLOT9,
25 CONFIG_SCB0_MI0_SLOT10,
26 CONFIG_SCB0_MI0_SLOT11,
27 CONFIG_SCB0_MI0_SLOT12,
28 CONFIG_SCB0_MI0_SLOT13,
29 CONFIG_SCB0_MI0_SLOT14,
30 CONFIG_SCB0_MI0_SLOT15,
31 CONFIG_SCB0_MI0_SLOT16,
32 CONFIG_SCB0_MI0_SLOT17,
33 CONFIG_SCB0_MI0_SLOT18,
34 CONFIG_SCB0_MI0_SLOT19,
35 CONFIG_SCB0_MI0_SLOT20,
36 CONFIG_SCB0_MI0_SLOT21,
37 CONFIG_SCB0_MI0_SLOT22,
38 CONFIG_SCB0_MI0_SLOT23,
39 CONFIG_SCB0_MI0_SLOT24,
40 CONFIG_SCB0_MI0_SLOT25,
41 CONFIG_SCB0_MI0_SLOT26,
42 CONFIG_SCB0_MI0_SLOT27,
43 CONFIG_SCB0_MI0_SLOT28,
44 CONFIG_SCB0_MI0_SLOT29,
45 CONFIG_SCB0_MI0_SLOT30,
46 CONFIG_SCB0_MI0_SLOT31
47 },
48 },
49#endif
50#ifdef CONFIG_SCB0_MI1
51 { REG_SCB0_ARBR1, REG_SCB0_ARBW1, 32, {
52 CONFIG_SCB0_MI1_SLOT0,
53 CONFIG_SCB0_MI1_SLOT1,
54 CONFIG_SCB0_MI1_SLOT2,
55 CONFIG_SCB0_MI1_SLOT3,
56 CONFIG_SCB0_MI1_SLOT4,
57 CONFIG_SCB0_MI1_SLOT5,
58 CONFIG_SCB0_MI1_SLOT6,
59 CONFIG_SCB0_MI1_SLOT7,
60 CONFIG_SCB0_MI1_SLOT8,
61 CONFIG_SCB0_MI1_SLOT9,
62 CONFIG_SCB0_MI1_SLOT10,
63 CONFIG_SCB0_MI1_SLOT11,
64 CONFIG_SCB0_MI1_SLOT12,
65 CONFIG_SCB0_MI1_SLOT13,
66 CONFIG_SCB0_MI1_SLOT14,
67 CONFIG_SCB0_MI1_SLOT15,
68 CONFIG_SCB0_MI1_SLOT16,
69 CONFIG_SCB0_MI1_SLOT17,
70 CONFIG_SCB0_MI1_SLOT18,
71 CONFIG_SCB0_MI1_SLOT19,
72 CONFIG_SCB0_MI1_SLOT20,
73 CONFIG_SCB0_MI1_SLOT21,
74 CONFIG_SCB0_MI1_SLOT22,
75 CONFIG_SCB0_MI1_SLOT23,
76 CONFIG_SCB0_MI1_SLOT24,
77 CONFIG_SCB0_MI1_SLOT25,
78 CONFIG_SCB0_MI1_SLOT26,
79 CONFIG_SCB0_MI1_SLOT27,
80 CONFIG_SCB0_MI1_SLOT28,
81 CONFIG_SCB0_MI1_SLOT29,
82 CONFIG_SCB0_MI1_SLOT30,
83 CONFIG_SCB0_MI1_SLOT31
84 },
85 },
86#endif
87#ifdef CONFIG_SCB0_MI2
88 { REG_SCB0_ARBR2, REG_SCB0_ARBW2, 32, {
89 CONFIG_SCB0_MI2_SLOT0,
90 CONFIG_SCB0_MI2_SLOT1,
91 CONFIG_SCB0_MI2_SLOT2,
92 CONFIG_SCB0_MI2_SLOT3,
93 CONFIG_SCB0_MI2_SLOT4,
94 CONFIG_SCB0_MI2_SLOT5,
95 CONFIG_SCB0_MI2_SLOT6,
96 CONFIG_SCB0_MI2_SLOT7,
97 CONFIG_SCB0_MI2_SLOT8,
98 CONFIG_SCB0_MI2_SLOT9,
99 CONFIG_SCB0_MI2_SLOT10,
100 CONFIG_SCB0_MI2_SLOT11,
101 CONFIG_SCB0_MI2_SLOT12,
102 CONFIG_SCB0_MI2_SLOT13,
103 CONFIG_SCB0_MI2_SLOT14,
104 CONFIG_SCB0_MI2_SLOT15,
105 CONFIG_SCB0_MI2_SLOT16,
106 CONFIG_SCB0_MI2_SLOT17,
107 CONFIG_SCB0_MI2_SLOT18,
108 CONFIG_SCB0_MI2_SLOT19,
109 CONFIG_SCB0_MI2_SLOT20,
110 CONFIG_SCB0_MI2_SLOT21,
111 CONFIG_SCB0_MI2_SLOT22,
112 CONFIG_SCB0_MI2_SLOT23,
113 CONFIG_SCB0_MI2_SLOT24,
114 CONFIG_SCB0_MI2_SLOT25,
115 CONFIG_SCB0_MI2_SLOT26,
116 CONFIG_SCB0_MI2_SLOT27,
117 CONFIG_SCB0_MI2_SLOT28,
118 CONFIG_SCB0_MI2_SLOT29,
119 CONFIG_SCB0_MI2_SLOT30,
120 CONFIG_SCB0_MI2_SLOT31
121 },
122 },
123#endif
124#ifdef CONFIG_SCB0_MI3
125 { REG_SCB0_ARBR3, REG_SCB0_ARBW3, 32, {
126 CONFIG_SCB0_MI3_SLOT0,
127 CONFIG_SCB0_MI3_SLOT1,
128 CONFIG_SCB0_MI3_SLOT2,
129 CONFIG_SCB0_MI3_SLOT3,
130 CONFIG_SCB0_MI3_SLOT4,
131 CONFIG_SCB0_MI3_SLOT5,
132 CONFIG_SCB0_MI3_SLOT6,
133 CONFIG_SCB0_MI3_SLOT7,
134 CONFIG_SCB0_MI3_SLOT8,
135 CONFIG_SCB0_MI3_SLOT9,
136 CONFIG_SCB0_MI3_SLOT10,
137 CONFIG_SCB0_MI3_SLOT11,
138 CONFIG_SCB0_MI3_SLOT12,
139 CONFIG_SCB0_MI3_SLOT13,
140 CONFIG_SCB0_MI3_SLOT14,
141 CONFIG_SCB0_MI3_SLOT15,
142 CONFIG_SCB0_MI3_SLOT16,
143 CONFIG_SCB0_MI3_SLOT17,
144 CONFIG_SCB0_MI3_SLOT18,
145 CONFIG_SCB0_MI3_SLOT19,
146 CONFIG_SCB0_MI3_SLOT20,
147 CONFIG_SCB0_MI3_SLOT21,
148 CONFIG_SCB0_MI3_SLOT22,
149 CONFIG_SCB0_MI3_SLOT23,
150 CONFIG_SCB0_MI3_SLOT24,
151 CONFIG_SCB0_MI3_SLOT25,
152 CONFIG_SCB0_MI3_SLOT26,
153 CONFIG_SCB0_MI3_SLOT27,
154 CONFIG_SCB0_MI3_SLOT28,
155 CONFIG_SCB0_MI3_SLOT29,
156 CONFIG_SCB0_MI3_SLOT30,
157 CONFIG_SCB0_MI3_SLOT31
158 },
159 },
160#endif
161#ifdef CONFIG_SCB0_MI4
162 { REG_SCB0_ARBR4, REG_SCB4_ARBW0, 32, {
163 CONFIG_SCB0_MI4_SLOT0,
164 CONFIG_SCB0_MI4_SLOT1,
165 CONFIG_SCB0_MI4_SLOT2,
166 CONFIG_SCB0_MI4_SLOT3,
167 CONFIG_SCB0_MI4_SLOT4,
168 CONFIG_SCB0_MI4_SLOT5,
169 CONFIG_SCB0_MI4_SLOT6,
170 CONFIG_SCB0_MI4_SLOT7,
171 CONFIG_SCB0_MI4_SLOT8,
172 CONFIG_SCB0_MI4_SLOT9,
173 CONFIG_SCB0_MI4_SLOT10,
174 CONFIG_SCB0_MI4_SLOT11,
175 CONFIG_SCB0_MI4_SLOT12,
176 CONFIG_SCB0_MI4_SLOT13,
177 CONFIG_SCB0_MI4_SLOT14,
178 CONFIG_SCB0_MI4_SLOT15,
179 CONFIG_SCB0_MI4_SLOT16,
180 CONFIG_SCB0_MI4_SLOT17,
181 CONFIG_SCB0_MI4_SLOT18,
182 CONFIG_SCB0_MI4_SLOT19,
183 CONFIG_SCB0_MI4_SLOT20,
184 CONFIG_SCB0_MI4_SLOT21,
185 CONFIG_SCB0_MI4_SLOT22,
186 CONFIG_SCB0_MI4_SLOT23,
187 CONFIG_SCB0_MI4_SLOT24,
188 CONFIG_SCB0_MI4_SLOT25,
189 CONFIG_SCB0_MI4_SLOT26,
190 CONFIG_SCB0_MI4_SLOT27,
191 CONFIG_SCB0_MI4_SLOT28,
192 CONFIG_SCB0_MI4_SLOT29,
193 CONFIG_SCB0_MI4_SLOT30,
194 CONFIG_SCB0_MI4_SLOT31
195 },
196 },
197#endif
198#ifdef CONFIG_SCB0_MI5
199 { REG_SCB0_ARBR5, REG_SCB0_ARBW5, 16, {
200 CONFIG_SCB0_MI5_SLOT0,
201 CONFIG_SCB0_MI5_SLOT1,
202 CONFIG_SCB0_MI5_SLOT2,
203 CONFIG_SCB0_MI5_SLOT3,
204 CONFIG_SCB0_MI5_SLOT4,
205 CONFIG_SCB0_MI5_SLOT5,
206 CONFIG_SCB0_MI5_SLOT6,
207 CONFIG_SCB0_MI5_SLOT7,
208 CONFIG_SCB0_MI5_SLOT8,
209 CONFIG_SCB0_MI5_SLOT9,
210 CONFIG_SCB0_MI5_SLOT10,
211 CONFIG_SCB0_MI5_SLOT11,
212 CONFIG_SCB0_MI5_SLOT12,
213 CONFIG_SCB0_MI5_SLOT13,
214 CONFIG_SCB0_MI5_SLOT14,
215 CONFIG_SCB0_MI5_SLOT15
216 },
217 },
218#endif
219#ifdef CONFIG_SCB1_MI0
220 { REG_SCB1_ARBR0, REG_SCB1_ARBW0, 20, {
221 CONFIG_SCB1_MI0_SLOT0,
222 CONFIG_SCB1_MI0_SLOT1,
223 CONFIG_SCB1_MI0_SLOT2,
224 CONFIG_SCB1_MI0_SLOT3,
225 CONFIG_SCB1_MI0_SLOT4,
226 CONFIG_SCB1_MI0_SLOT5,
227 CONFIG_SCB1_MI0_SLOT6,
228 CONFIG_SCB1_MI0_SLOT7,
229 CONFIG_SCB1_MI0_SLOT8,
230 CONFIG_SCB1_MI0_SLOT9,
231 CONFIG_SCB1_MI0_SLOT10,
232 CONFIG_SCB1_MI0_SLOT11,
233 CONFIG_SCB1_MI0_SLOT12,
234 CONFIG_SCB1_MI0_SLOT13,
235 CONFIG_SCB1_MI0_SLOT14,
236 CONFIG_SCB1_MI0_SLOT15,
237 CONFIG_SCB1_MI0_SLOT16,
238 CONFIG_SCB1_MI0_SLOT17,
239 CONFIG_SCB1_MI0_SLOT18,
240 CONFIG_SCB1_MI0_SLOT19
241 },
242 },
243#endif
244#ifdef CONFIG_SCB2_MI0
245 { REG_SCB2_ARBR0, REG_SCB2_ARBW0, 10, {
246 CONFIG_SCB2_MI0_SLOT0,
247 CONFIG_SCB2_MI0_SLOT1,
248 CONFIG_SCB2_MI0_SLOT2,
249 CONFIG_SCB2_MI0_SLOT3,
250 CONFIG_SCB2_MI0_SLOT4,
251 CONFIG_SCB2_MI0_SLOT5,
252 CONFIG_SCB2_MI0_SLOT6,
253 CONFIG_SCB2_MI0_SLOT7,
254 CONFIG_SCB2_MI0_SLOT8,
255 CONFIG_SCB2_MI0_SLOT9
256 },
257 },
258#endif
259#ifdef CONFIG_SCB3_MI0
260 { REG_SCB3_ARBR0, REG_SCB3_ARBW0, 16, {
261 CONFIG_SCB3_MI0_SLOT0,
262 CONFIG_SCB3_MI0_SLOT1,
263 CONFIG_SCB3_MI0_SLOT2,
264 CONFIG_SCB3_MI0_SLOT3,
265 CONFIG_SCB3_MI0_SLOT4,
266 CONFIG_SCB3_MI0_SLOT5,
267 CONFIG_SCB3_MI0_SLOT6,
268 CONFIG_SCB3_MI0_SLOT7,
269 CONFIG_SCB3_MI0_SLOT8,
270 CONFIG_SCB3_MI0_SLOT9,
271 CONFIG_SCB3_MI0_SLOT10,
272 CONFIG_SCB3_MI0_SLOT11,
273 CONFIG_SCB3_MI0_SLOT12,
274 CONFIG_SCB3_MI0_SLOT13,
275 CONFIG_SCB3_MI0_SLOT14,
276 CONFIG_SCB3_MI0_SLOT15
277 },
278 },
279#endif
280#ifdef CONFIG_SCB4_MI0
281 { REG_SCB4_ARBR0, REG_SCB4_ARBW0, 16, {
282 CONFIG_SCB4_MI0_SLOT0,
283 CONFIG_SCB4_MI0_SLOT1,
284 CONFIG_SCB4_MI0_SLOT2,
285 CONFIG_SCB4_MI0_SLOT3,
286 CONFIG_SCB4_MI0_SLOT4,
287 CONFIG_SCB4_MI0_SLOT5,
288 CONFIG_SCB4_MI0_SLOT6,
289 CONFIG_SCB4_MI0_SLOT7,
290 CONFIG_SCB4_MI0_SLOT8,
291 CONFIG_SCB4_MI0_SLOT9,
292 CONFIG_SCB4_MI0_SLOT10,
293 CONFIG_SCB4_MI0_SLOT11,
294 CONFIG_SCB4_MI0_SLOT12,
295 CONFIG_SCB4_MI0_SLOT13,
296 CONFIG_SCB4_MI0_SLOT14,
297 CONFIG_SCB4_MI0_SLOT15
298 },
299 },
300#endif
301#ifdef CONFIG_SCB5_MI0
302 { REG_SCB5_ARBR0, REG_SCB5_ARBW0, 8, {
303 CONFIG_SCB5_MI0_SLOT0,
304 CONFIG_SCB5_MI0_SLOT1,
305 CONFIG_SCB5_MI0_SLOT2,
306 CONFIG_SCB5_MI0_SLOT3,
307 CONFIG_SCB5_MI0_SLOT4,
308 CONFIG_SCB5_MI0_SLOT5,
309 CONFIG_SCB5_MI0_SLOT6,
310 CONFIG_SCB5_MI0_SLOT7
311 },
312 },
313#endif
314#ifdef CONFIG_SCB6_MI0
315 { REG_SCB6_ARBR0, REG_SCB6_ARBW0, 4, {
316 CONFIG_SCB6_MI0_SLOT0,
317 CONFIG_SCB6_MI0_SLOT1,
318 CONFIG_SCB6_MI0_SLOT2,
319 CONFIG_SCB6_MI0_SLOT3
320 },
321 },
322#endif
323#ifdef CONFIG_SCB7_MI0
324 { REG_SCB7_ARBR0, REG_SCB7_ARBW0, 6, {
325 CONFIG_SCB7_MI0_SLOT0,
326 CONFIG_SCB7_MI0_SLOT1,
327 CONFIG_SCB7_MI0_SLOT2,
328 CONFIG_SCB7_MI0_SLOT3,
329 CONFIG_SCB7_MI0_SLOT4,
330 CONFIG_SCB7_MI0_SLOT5
331 },
332 },
333#endif
334#ifdef CONFIG_SCB8_MI0
335 { REG_SCB8_ARBR0, REG_SCB8_ARBW0, 8, {
336 CONFIG_SCB8_MI0_SLOT0,
337 CONFIG_SCB8_MI0_SLOT1,
338 CONFIG_SCB8_MI0_SLOT2,
339 CONFIG_SCB8_MI0_SLOT3,
340 CONFIG_SCB8_MI0_SLOT4,
341 CONFIG_SCB8_MI0_SLOT5,
342 CONFIG_SCB8_MI0_SLOT6,
343 CONFIG_SCB8_MI0_SLOT7
344 },
345 },
346#endif
347#ifdef CONFIG_SCB9_MI0
348 { REG_SCB9_ARBR0, REG_SCB9_ARBW0, 10, {
349 CONFIG_SCB9_MI0_SLOT0,
350 CONFIG_SCB9_MI0_SLOT1,
351 CONFIG_SCB9_MI0_SLOT2,
352 CONFIG_SCB9_MI0_SLOT3,
353 CONFIG_SCB9_MI0_SLOT4,
354 CONFIG_SCB9_MI0_SLOT5,
355 CONFIG_SCB9_MI0_SLOT6,
356 CONFIG_SCB9_MI0_SLOT7,
357 CONFIG_SCB9_MI0_SLOT8,
358 CONFIG_SCB9_MI0_SLOT9
359 },
360 },
361#endif
362 { 0, }
363};
diff --git a/arch/blackfin/mach-common/Makefile b/arch/blackfin/mach-common/Makefile
index 675466d490d4..f09979204040 100644
--- a/arch/blackfin/mach-common/Makefile
+++ b/arch/blackfin/mach-common/Makefile
@@ -10,6 +10,7 @@ obj-$(CONFIG_PM) += pm.o
10ifneq ($(CONFIG_BF60x),y) 10ifneq ($(CONFIG_BF60x),y)
11obj-$(CONFIG_PM) += dpmc_modes.o 11obj-$(CONFIG_PM) += dpmc_modes.o
12endif 12endif
13obj-$(CONFIG_SCB_PRIORITY) += scb-init.o
13obj-$(CONFIG_CPU_VOLTAGE) += dpmc.o 14obj-$(CONFIG_CPU_VOLTAGE) += dpmc.o
14obj-$(CONFIG_SMP) += smp.o 15obj-$(CONFIG_SMP) += smp.o
15obj-$(CONFIG_BFIN_KERNEL_CLOCK) += clocks-init.o 16obj-$(CONFIG_BFIN_KERNEL_CLOCK) += clocks-init.o
diff --git a/arch/blackfin/mach-common/scb-init.c b/arch/blackfin/mach-common/scb-init.c
new file mode 100644
index 000000000000..2cbfb0b5679e
--- /dev/null
+++ b/arch/blackfin/mach-common/scb-init.c
@@ -0,0 +1,53 @@
1/*
2 * arch/blackfin/mach-common/scb-init.c - reprogram system cross bar priority
3 *
4 * Copyright 2012 Analog Devices Inc.
5 *
6 * Licensed under the GPL-2 or later.
7 */
8
9#include <linux/init.h>
10#include <linux/errno.h>
11#include <linux/kernel.h>
12#include <asm/scb.h>
13
14__attribute__((l1_text))
15inline void scb_mi_write(unsigned long scb_mi_arbw, unsigned int slots,
16 unsigned char *scb_mi_prio)
17{
18 unsigned int i;
19
20 for (i = 0; i < slots; ++i)
21 bfin_write32(scb_mi_arbw, (i << SCB_SLOT_OFFSET) | scb_mi_prio[i]);
22}
23
24__attribute__((l1_text))
25inline void scb_mi_read(unsigned long scb_mi_arbw, unsigned int slots,
26 unsigned char *scb_mi_prio)
27{
28 unsigned int i;
29
30 for (i = 0; i < slots; ++i) {
31 bfin_write32(scb_mi_arbw, (0xFF << SCB_SLOT_OFFSET) | i);
32 scb_mi_prio[i] = bfin_read32(scb_mi_arbw);
33 }
34}
35
36__attribute__((l1_text))
37void init_scb(void)
38{
39 unsigned int i, j;
40 unsigned char scb_tmp_prio[32];
41
42 pr_info("Init System Crossbar\n");
43 for (i = 0; scb_data[i].scb_mi_arbr > 0; ++i) {
44
45 scb_mi_write(scb_data[i].scb_mi_arbw, scb_data[i].scb_mi_slots, scb_data[i].scb_mi_prio);
46
47 pr_debug("scb priority at 0x%lx:\n", scb_data[i].scb_mi_arbr);
48 scb_mi_read(scb_data[i].scb_mi_arbw, scb_data[i].scb_mi_slots, scb_tmp_prio);
49 for (j = 0; j < scb_data[i].scb_mi_slots; ++j)
50 pr_debug("slot %d = %d\n", j, scb_tmp_prio[j]);
51 }
52
53}
diff --git a/arch/c6x/Kconfig b/arch/c6x/Kconfig
index f6a3648f5ec3..957dd00ea561 100644
--- a/arch/c6x/Kconfig
+++ b/arch/c6x/Kconfig
@@ -10,7 +10,6 @@ config C6X
10 select GENERIC_IRQ_SHOW 10 select GENERIC_IRQ_SHOW
11 select HAVE_ARCH_TRACEHOOK 11 select HAVE_ARCH_TRACEHOOK
12 select HAVE_DMA_API_DEBUG 12 select HAVE_DMA_API_DEBUG
13 select HAVE_GENERIC_HARDIRQS
14 select HAVE_MEMBLOCK 13 select HAVE_MEMBLOCK
15 select SPARSE_IRQ 14 select SPARSE_IRQ
16 select IRQ_DOMAIN 15 select IRQ_DOMAIN
diff --git a/arch/c6x/kernel/devicetree.c b/arch/c6x/kernel/devicetree.c
index bdb56f09d0ac..9e15ab9199b2 100644
--- a/arch/c6x/kernel/devicetree.c
+++ b/arch/c6x/kernel/devicetree.c
@@ -33,8 +33,7 @@ void __init early_init_devtree(void *params)
33 33
34 34
35#ifdef CONFIG_BLK_DEV_INITRD 35#ifdef CONFIG_BLK_DEV_INITRD
36void __init early_init_dt_setup_initrd_arch(unsigned long start, 36void __init early_init_dt_setup_initrd_arch(u64 start, u64 end)
37 unsigned long end)
38{ 37{
39 initrd_start = (unsigned long)__va(start); 38 initrd_start = (unsigned long)__va(start);
40 initrd_end = (unsigned long)__va(end); 39 initrd_end = (unsigned long)__va(end);
@@ -46,8 +45,3 @@ void __init early_init_dt_add_memory_arch(u64 base, u64 size)
46{ 45{
47 c6x_add_memory(base, size); 46 c6x_add_memory(base, size);
48} 47}
49
50void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align)
51{
52 return __va(memblock_alloc(size, align));
53}
diff --git a/arch/cris/Kconfig b/arch/cris/Kconfig
index 3201ddb8da6a..02380bed189c 100644
--- a/arch/cris/Kconfig
+++ b/arch/cris/Kconfig
@@ -41,7 +41,6 @@ config CRIS
41 default y 41 default y
42 select HAVE_IDE 42 select HAVE_IDE
43 select GENERIC_ATOMIC64 43 select GENERIC_ATOMIC64
44 select HAVE_GENERIC_HARDIRQS
45 select HAVE_UID16 44 select HAVE_UID16
46 select VIRT_TO_BUS 45 select VIRT_TO_BUS
47 select ARCH_WANT_IPC_PARSE_VERSION 46 select ARCH_WANT_IPC_PARSE_VERSION
@@ -99,9 +98,6 @@ config ETRAX_KMALLOCED_MODULES
99 help 98 help
100 Enable module allocation with kmalloc instead of vmalloc. 99 Enable module allocation with kmalloc instead of vmalloc.
101 100
102config OOM_REBOOT
103 bool "Enable reboot at out of memory"
104
105source "kernel/Kconfig.preempt" 101source "kernel/Kconfig.preempt"
106 102
107source mm/Kconfig 103source mm/Kconfig
@@ -175,12 +171,6 @@ config ETRAX_FLASH_BUSWIDTH
175 help 171 help
176 Width in bytes of the NOR Flash bus (1, 2 or 4). Is usually 2. 172 Width in bytes of the NOR Flash bus (1, 2 or 4). Is usually 2.
177 173
178config ETRAX_NANDFLASH_BUSWIDTH
179 int "Buswidth of NAND flash in bytes"
180 default "1"
181 help
182 Width in bytes of the NAND flash (1 or 2).
183
184config ETRAX_FLASH1_SIZE 174config ETRAX_FLASH1_SIZE
185 int "FLASH1 size (dec, in MB. 0 = Unknown)" 175 int "FLASH1 size (dec, in MB. 0 = Unknown)"
186 default "0" 176 default "0"
@@ -272,38 +262,6 @@ config ETRAX_AXISFLASHMAP
272 This option enables MTD mapping of flash devices. Needed to use 262 This option enables MTD mapping of flash devices. Needed to use
273 flash memories. If unsure, say Y. 263 flash memories. If unsure, say Y.
274 264
275config ETRAX_RTC
276 bool "Real Time Clock support"
277 depends on ETRAX_I2C
278 help
279 Enables drivers for the Real-Time Clock battery-backed chips on
280 some products. The kernel reads the time when booting, and
281 the date can be set using ioctl(fd, RTC_SET_TIME, &rt) with rt a
282 rtc_time struct (see <file:arch/cris/include/asm/rtc.h>) on the
283 /dev/rtc device. You can check the time with cat /proc/rtc, but
284 normal time reading should be done using libc function time and
285 friends.
286
287choice
288 prompt "RTC chip"
289 depends on ETRAX_RTC
290 default ETRAX_DS1302
291
292config ETRAX_DS1302
293 depends on ETRAX_ARCH_V10
294 bool "DS1302"
295 help
296 Enables the driver for the DS1302 Real-Time Clock battery-backed
297 chip on some products.
298
299config ETRAX_PCF8563
300 bool "PCF8563"
301 help
302 Enables the driver for the PCF8563 Real-Time Clock battery-backed
303 chip on some products.
304
305endchoice
306
307config ETRAX_SYNCHRONOUS_SERIAL 265config ETRAX_SYNCHRONOUS_SERIAL
308 bool "Synchronous serial-port support" 266 bool "Synchronous serial-port support"
309 help 267 help
@@ -578,26 +536,6 @@ config ETRAX_SERIAL_PORT3_DMA5_IN
578 depends on ETRAX_ARCH_V10 536 depends on ETRAX_ARCH_V10
579 bool "DMA 5" 537 bool "DMA 5"
580 538
581config ETRAX_SERIAL_PORT3_DMA9_IN
582 bool "Ser3 uses DMA9 for input"
583 depends on ETRAXFS
584 help
585 Enables the DMA9 input channel for ser3 (ttyS3).
586 If you do not enable DMA, an interrupt for each character will be
587 used when receiving data.
588 Normally you want to use DMA, unless you use the DMA channel for
589 something else.
590
591config ETRAX_SERIAL_PORT3_DMA3_IN
592 bool "Ser3 uses DMA3 for input"
593 depends on CRIS_MACH_ARTPEC3
594 help
595 Enables the DMA3 input channel for ser3 (ttyS3).
596 If you do not enable DMA, an interrupt for each character will be
597 used when receiving data.
598 Normally you want to use DMA, unless you use the DMA channel for
599 something else.
600
601endchoice 539endchoice
602 540
603choice 541choice
@@ -615,26 +553,6 @@ config ETRAX_SERIAL_PORT3_DMA4_OUT
615 depends on ETRAX_ARCH_V10 553 depends on ETRAX_ARCH_V10
616 bool "DMA 4" 554 bool "DMA 4"
617 555
618config ETRAX_SERIAL_PORT3_DMA8_OUT
619 bool "Ser3 uses DMA8 for output"
620 depends on ETRAXFS
621 help
622 Enables the DMA8 output channel for ser3 (ttyS3).
623 If you do not enable DMA, an interrupt for each character will be
624 used when transmitting data.
625 Normally you want to use DMA, unless you use the DMA channel for
626 something else.
627
628config ETRAX_SERIAL_PORT3_DMA2_OUT
629 bool "Ser3 uses DMA2 for output"
630 depends on CRIS_MACH_ARTPEC3
631 help
632 Enables the DMA2 output channel for ser3 (ttyS3).
633 If you do not enable DMA, an interrupt for each character will be
634 used when transmitting data.
635 Normally you want to use DMA, unless you use the DMA channel for
636 something else.
637
638endchoice 556endchoice
639 557
640endmenu 558endmenu
diff --git a/arch/cris/arch-v10/drivers/Kconfig b/arch/cris/arch-v10/drivers/Kconfig
index daf5f19b61a1..239dab0b95c1 100644
--- a/arch/cris/arch-v10/drivers/Kconfig
+++ b/arch/cris/arch-v10/drivers/Kconfig
@@ -417,16 +417,6 @@ config ETRAX_USB_HOST
417 for CTRL and BULK traffic only, INTR traffic may work as well 417 for CTRL and BULK traffic only, INTR traffic may work as well
418 however (depending on the requirements of timeliness). 418 however (depending on the requirements of timeliness).
419 419
420config ETRAX_USB_HOST_PORT1
421 bool "USB port 1 enabled"
422 depends on ETRAX_USB_HOST
423 default n
424
425config ETRAX_USB_HOST_PORT2
426 bool "USB port 2 enabled"
427 depends on ETRAX_USB_HOST
428 default n
429
430config ETRAX_PTABLE_SECTOR 420config ETRAX_PTABLE_SECTOR
431 int "Byte-offset of partition table sector" 421 int "Byte-offset of partition table sector"
432 depends on ETRAX_AXISFLASHMAP 422 depends on ETRAX_AXISFLASHMAP
@@ -527,19 +517,6 @@ config ETRAX_GPIO
527 Remember that you need to setup the port directions appropriately in 517 Remember that you need to setup the port directions appropriately in
528 the General configuration. 518 the General configuration.
529 519
530config ETRAX_PA_BUTTON_BITMASK
531 hex "PA-buttons bitmask"
532 depends on ETRAX_GPIO
533 default "02"
534 help
535 This is a bitmask with information about what bits on PA that
536 are used for buttons.
537 Most products has a so called TEST button on PA1, if that's true
538 use 02 here.
539 Use 00 if there are no buttons on PA.
540 If the bitmask is <> 00 a button driver will be included in the gpio
541 driver. ETRAX general I/O support must be enabled.
542
543config ETRAX_PA_CHANGEABLE_DIR 520config ETRAX_PA_CHANGEABLE_DIR
544 hex "PA user changeable dir mask" 521 hex "PA user changeable dir mask"
545 depends on ETRAX_GPIO 522 depends on ETRAX_GPIO
@@ -580,51 +557,4 @@ config ETRAX_PB_CHANGEABLE_BITS
580 Bit set = changeable. 557 Bit set = changeable.
581 You probably want 00 here. 558 You probably want 00 here.
582 559
583config ETRAX_DS1302_RST_ON_GENERIC_PORT
584 bool "DS1302 RST on Generic Port"
585 depends on ETRAX_DS1302
586 help
587 If your product has the RST signal line for the DS1302 RTC on the
588 Generic Port then say Y here, otherwise leave it as N in which
589 case the RST signal line is assumed to be connected to Port PB
590 (just like the SCL and SDA lines).
591
592config ETRAX_DS1302_RSTBIT
593 int "DS1302 RST bit number"
594 depends on ETRAX_DS1302
595 default "2"
596 help
597 This is the bit number for the RST signal line of the DS1302 RTC on
598 the selected port. If you have selected the generic port then it
599 should be bit 27, otherwise your best bet is bit 5.
600
601config ETRAX_DS1302_SCLBIT
602 int "DS1302 SCL bit number"
603 depends on ETRAX_DS1302
604 default "1"
605 help
606 This is the bit number for the SCL signal line of the DS1302 RTC on
607 Port PB. This is probably best left at 3.
608
609config ETRAX_DS1302_SDABIT
610 int "DS1302 SDA bit number"
611 depends on ETRAX_DS1302
612 default "0"
613 help
614 This is the bit number for the SDA signal line of the DS1302 RTC on
615 Port PB. This is probably best left at 2.
616
617config ETRAX_DS1302_TRICKLE_CHARGE
618 int "DS1302 Trickle charger value"
619 depends on ETRAX_DS1302
620 default "0"
621 help
622 This controls the initial value of the trickle charge register.
623 0 = disabled (use this if you are unsure or have a non rechargeable battery)
624 Otherwise the following values can be OR:ed together to control the
625 charge current:
626 1 = 2kohm, 2 = 4kohm, 3 = 4kohm
627 4 = 1 diode, 8 = 2 diodes
628 Allowed values are (increasing current): 0, 11, 10, 9, 7, 6, 5
629
630endif 560endif
diff --git a/arch/cris/arch-v10/drivers/Makefile b/arch/cris/arch-v10/drivers/Makefile
index 44bf2e88c26e..e5c13183b97c 100644
--- a/arch/cris/arch-v10/drivers/Makefile
+++ b/arch/cris/arch-v10/drivers/Makefile
@@ -6,7 +6,5 @@ obj-$(CONFIG_ETRAX_AXISFLASHMAP) += axisflashmap.o
6obj-$(CONFIG_ETRAX_I2C) += i2c.o 6obj-$(CONFIG_ETRAX_I2C) += i2c.o
7obj-$(CONFIG_ETRAX_I2C_EEPROM) += eeprom.o 7obj-$(CONFIG_ETRAX_I2C_EEPROM) += eeprom.o
8obj-$(CONFIG_ETRAX_GPIO) += gpio.o 8obj-$(CONFIG_ETRAX_GPIO) += gpio.o
9obj-$(CONFIG_ETRAX_DS1302) += ds1302.o
10obj-$(CONFIG_ETRAX_PCF8563) += pcf8563.o
11obj-$(CONFIG_ETRAX_SYNCHRONOUS_SERIAL) += sync_serial.o 9obj-$(CONFIG_ETRAX_SYNCHRONOUS_SERIAL) += sync_serial.o
12 10
diff --git a/arch/cris/arch-v32/drivers/Kconfig b/arch/cris/arch-v32/drivers/Kconfig
index 1d866d3ee2f8..6792503aaf79 100644
--- a/arch/cris/arch-v32/drivers/Kconfig
+++ b/arch/cris/arch-v32/drivers/Kconfig
@@ -19,64 +19,6 @@ config ETRAX_NO_PHY
19 switch. This option should normally be disabled. If enabled, 19 switch. This option should normally be disabled. If enabled,
20 speed and duplex will be locked to 100 Mbit and full duplex. 20 speed and duplex will be locked to 100 Mbit and full duplex.
21 21
22config ETRAX_ETHERNET_IFACE0
23 depends on ETRAX_ETHERNET
24 bool "Enable network interface 0"
25
26config ETRAX_ETHERNET_IFACE1
27 depends on (ETRAX_ETHERNET && ETRAXFS)
28 bool "Enable network interface 1 (uses DMA6 and DMA7)"
29
30config ETRAX_ETHERNET_GBIT
31 depends on (ETRAX_ETHERNET && CRIS_MACH_ARTPEC3)
32 bool "Enable gigabit Ethernet support"
33
34choice
35 prompt "Eth0 led group"
36 depends on ETRAX_ETHERNET_IFACE0
37 default ETRAX_ETH0_USE_LEDGRP0
38
39config ETRAX_ETH0_USE_LEDGRP0
40 bool "Use LED grp 0"
41 depends on ETRAX_NBR_LED_GRP_ONE || ETRAX_NBR_LED_GRP_TWO
42 help
43 Use LED grp 0 for eth0
44
45config ETRAX_ETH0_USE_LEDGRP1
46 bool "Use LED grp 1"
47 depends on ETRAX_NBR_LED_GRP_TWO
48 help
49 Use LED grp 1 for eth0
50
51config ETRAX_ETH0_USE_LEDGRPNULL
52 bool "Use no LEDs for eth0"
53 help
54 Use no LEDs for eth0
55endchoice
56
57choice
58 prompt "Eth1 led group"
59 depends on ETRAX_ETHERNET_IFACE1
60 default ETRAX_ETH1_USE_LEDGRP1
61
62config ETRAX_ETH1_USE_LEDGRP0
63 bool "Use LED grp 0"
64 depends on ETRAX_NBR_LED_GRP_ONE || ETRAX_NBR_LED_GRP_TWO
65 help
66 Use LED grp 0 for eth1
67
68config ETRAX_ETH1_USE_LEDGRP1
69 bool "Use LED grp 1"
70 depends on ETRAX_NBR_LED_GRP_TWO
71 help
72 Use LED grp 1 for eth1
73
74config ETRAX_ETH1_USE_LEDGRPNULL
75 bool "Use no LEDs for eth1"
76 help
77 Use no LEDs for eth1
78endchoice
79
80config ETRAXFS_SERIAL 22config ETRAXFS_SERIAL
81 bool "Serial-port support" 23 bool "Serial-port support"
82 depends on ETRAX_ARCH_V32 24 depends on ETRAX_ARCH_V32
@@ -108,261 +50,24 @@ config ETRAX_SERIAL_PORT0
108 if you do not need DMA to something else. 50 if you do not need DMA to something else.
109 ser0 can use dma4 or dma6 for output and dma5 or dma7 for input. 51 ser0 can use dma4 or dma6 for output and dma5 or dma7 for input.
110 52
111choice
112 prompt "Ser0 default port type "
113 depends on ETRAX_SERIAL_PORT0
114 default ETRAX_SERIAL_PORT0_TYPE_232
115 help
116 Type of serial port.
117
118config ETRAX_SERIAL_PORT0_TYPE_232
119 bool "Ser0 is a RS-232 port"
120 help
121 Configure serial port 0 to be a RS-232 port.
122
123config ETRAX_SERIAL_PORT0_TYPE_485HD
124 bool "Ser0 is a half duplex RS-485 port"
125 depends on ETRAX_RS485
126 help
127 Configure serial port 0 to be a half duplex (two wires) RS-485 port.
128
129config ETRAX_SERIAL_PORT0_TYPE_485FD
130 bool "Ser0 is a full duplex RS-485 port"
131 depends on ETRAX_RS485
132 help
133 Configure serial port 0 to be a full duplex (four wires) RS-485 port.
134endchoice
135
136config ETRAX_SER0_DTR_BIT
137 string "Ser 0 DTR bit (empty = not used)"
138 depends on ETRAX_SERIAL_PORT0
139
140config ETRAX_SER0_RI_BIT
141 string "Ser 0 RI bit (empty = not used)"
142 depends on ETRAX_SERIAL_PORT0
143
144config ETRAX_SER0_DSR_BIT
145 string "Ser 0 DSR bit (empty = not used)"
146 depends on ETRAX_SERIAL_PORT0
147
148config ETRAX_SER0_CD_BIT
149 string "Ser 0 CD bit (empty = not used)"
150 depends on ETRAX_SERIAL_PORT0
151
152config ETRAX_SERIAL_PORT1 53config ETRAX_SERIAL_PORT1
153 bool "Serial port 1 enabled" 54 bool "Serial port 1 enabled"
154 depends on ETRAXFS_SERIAL 55 depends on ETRAXFS_SERIAL
155 help 56 help
156 Enables the ETRAX FS serial driver for ser1 (ttyS1). 57 Enables the ETRAX FS serial driver for ser1 (ttyS1).
157 58
158choice
159 prompt "Ser1 default port type"
160 depends on ETRAX_SERIAL_PORT1
161 default ETRAX_SERIAL_PORT1_TYPE_232
162 help
163 Type of serial port.
164
165config ETRAX_SERIAL_PORT1_TYPE_232
166 bool "Ser1 is a RS-232 port"
167 help
168 Configure serial port 1 to be a RS-232 port.
169
170config ETRAX_SERIAL_PORT1_TYPE_485HD
171 bool "Ser1 is a half duplex RS-485 port"
172 depends on ETRAX_RS485
173 help
174 Configure serial port 1 to be a half duplex (two wires) RS-485 port.
175
176config ETRAX_SERIAL_PORT1_TYPE_485FD
177 bool "Ser1 is a full duplex RS-485 port"
178 depends on ETRAX_RS485
179 help
180 Configure serial port 1 to be a full duplex (four wires) RS-485 port.
181endchoice
182
183config ETRAX_SER1_DTR_BIT
184 string "Ser 1 DTR bit (empty = not used)"
185 depends on ETRAX_SERIAL_PORT1
186
187config ETRAX_SER1_RI_BIT
188 string "Ser 1 RI bit (empty = not used)"
189 depends on ETRAX_SERIAL_PORT1
190
191config ETRAX_SER1_DSR_BIT
192 string "Ser 1 DSR bit (empty = not used)"
193 depends on ETRAX_SERIAL_PORT1
194
195config ETRAX_SER1_CD_BIT
196 string "Ser 1 CD bit (empty = not used)"
197 depends on ETRAX_SERIAL_PORT1
198
199config ETRAX_SERIAL_PORT2 59config ETRAX_SERIAL_PORT2
200 bool "Serial port 2 enabled" 60 bool "Serial port 2 enabled"
201 depends on ETRAXFS_SERIAL 61 depends on ETRAXFS_SERIAL
202 help 62 help
203 Enables the ETRAX FS serial driver for ser2 (ttyS2). 63 Enables the ETRAX FS serial driver for ser2 (ttyS2).
204 64
205choice
206 prompt "Ser2 default port type"
207 depends on ETRAX_SERIAL_PORT2
208 default ETRAX_SERIAL_PORT2_TYPE_232
209 help
210 What DMA channel to use for ser2
211
212config ETRAX_SERIAL_PORT2_TYPE_232
213 bool "Ser2 is a RS-232 port"
214 help
215 Configure serial port 2 to be a RS-232 port.
216
217config ETRAX_SERIAL_PORT2_TYPE_485HD
218 bool "Ser2 is a half duplex RS-485 port"
219 depends on ETRAX_RS485
220 help
221 Configure serial port 2 to be a half duplex (two wires) RS-485 port.
222
223config ETRAX_SERIAL_PORT2_TYPE_485FD
224 bool "Ser2 is a full duplex RS-485 port"
225 depends on ETRAX_RS485
226 help
227 Configure serial port 2 to be a full duplex (four wires) RS-485 port.
228endchoice
229
230
231config ETRAX_SER2_DTR_BIT
232 string "Ser 2 DTR bit (empty = not used)"
233 depends on ETRAX_SERIAL_PORT2
234
235config ETRAX_SER2_RI_BIT
236 string "Ser 2 RI bit (empty = not used)"
237 depends on ETRAX_SERIAL_PORT2
238
239config ETRAX_SER2_DSR_BIT
240 string "Ser 2 DSR bit (empty = not used)"
241 depends on ETRAX_SERIAL_PORT2
242
243config ETRAX_SER2_CD_BIT
244 string "Ser 2 CD bit (empty = not used)"
245 depends on ETRAX_SERIAL_PORT2
246
247config ETRAX_SERIAL_PORT3 65config ETRAX_SERIAL_PORT3
248 bool "Serial port 3 enabled" 66 bool "Serial port 3 enabled"
249 depends on ETRAXFS_SERIAL 67 depends on ETRAXFS_SERIAL
250 help 68 help
251 Enables the ETRAX FS serial driver for ser3 (ttyS3). 69 Enables the ETRAX FS serial driver for ser3 (ttyS3).
252 70
253choice
254 prompt "Ser3 default port type"
255 depends on ETRAX_SERIAL_PORT3
256 default ETRAX_SERIAL_PORT3_TYPE_232
257 help
258 What DMA channel to use for ser3.
259
260config ETRAX_SERIAL_PORT3_TYPE_232
261 bool "Ser3 is a RS-232 port"
262 help
263 Configure serial port 3 to be a RS-232 port.
264
265config ETRAX_SERIAL_PORT3_TYPE_485HD
266 bool "Ser3 is a half duplex RS-485 port"
267 depends on ETRAX_RS485
268 help
269 Configure serial port 3 to be a half duplex (two wires) RS-485 port.
270
271config ETRAX_SERIAL_PORT3_TYPE_485FD
272 bool "Ser3 is a full duplex RS-485 port"
273 depends on ETRAX_RS485
274 help
275 Configure serial port 3 to be a full duplex (four wires) RS-485 port.
276endchoice
277
278config ETRAX_SER3_DTR_BIT
279 string "Ser 3 DTR bit (empty = not used)"
280 depends on ETRAX_SERIAL_PORT3
281
282config ETRAX_SER3_RI_BIT
283 string "Ser 3 RI bit (empty = not used)"
284 depends on ETRAX_SERIAL_PORT3
285
286config ETRAX_SER3_DSR_BIT
287 string "Ser 3 DSR bit (empty = not used)"
288 depends on ETRAX_SERIAL_PORT3
289
290config ETRAX_SER3_CD_BIT
291 string "Ser 3 CD bit (empty = not used)"
292 depends on ETRAX_SERIAL_PORT3
293
294config ETRAX_SERIAL_PORT4
295 bool "Serial port 4 enabled"
296 depends on ETRAXFS_SERIAL && CRIS_MACH_ARTPEC3
297 help
298 Enables the ETRAX FS serial driver for ser4 (ttyS4).
299
300choice
301 prompt "Ser4 default port type"
302 depends on ETRAX_SERIAL_PORT4
303 default ETRAX_SERIAL_PORT4_TYPE_232
304 help
305 What DMA channel to use for ser4.
306
307config ETRAX_SERIAL_PORT4_TYPE_232
308 bool "Ser4 is a RS-232 port"
309 help
310 Configure serial port 4 to be a RS-232 port.
311
312config ETRAX_SERIAL_PORT4_TYPE_485HD
313 bool "Ser4 is a half duplex RS-485 port"
314 depends on ETRAX_RS485
315 help
316 Configure serial port 4 to be a half duplex (two wires) RS-485 port.
317
318config ETRAX_SERIAL_PORT4_TYPE_485FD
319 bool "Ser4 is a full duplex RS-485 port"
320 depends on ETRAX_RS485
321 help
322 Configure serial port 4 to be a full duplex (four wires) RS-485 port.
323endchoice
324
325choice
326 prompt "Ser4 DMA in channel "
327 depends on ETRAX_SERIAL_PORT4
328 default ETRAX_SERIAL_PORT4_NO_DMA_IN
329 help
330 What DMA channel to use for ser4.
331
332
333config ETRAX_SERIAL_PORT4_NO_DMA_IN
334 bool "Ser4 uses no DMA for input"
335 help
336 Do not use DMA for ser4 input.
337
338config ETRAX_SERIAL_PORT4_DMA9_IN
339 bool "Ser4 uses DMA9 for input"
340 depends on ETRAX_SERIAL_PORT4
341 help
342 Enables the DMA9 input channel for ser4 (ttyS4).
343 If you do not enable DMA, an interrupt for each character will be
344 used when receiving data.
345 Normally you want to use DMA, unless you use the DMA channel for
346 something else.
347
348endchoice
349
350config ETRAX_SER4_DTR_BIT
351 string "Ser 4 DTR bit (empty = not used)"
352 depends on ETRAX_SERIAL_PORT4
353
354config ETRAX_SER4_RI_BIT
355 string "Ser 4 RI bit (empty = not used)"
356 depends on ETRAX_SERIAL_PORT4
357
358config ETRAX_SER4_DSR_BIT
359 string "Ser 4 DSR bit (empty = not used)"
360 depends on ETRAX_SERIAL_PORT4
361
362config ETRAX_SER4_CD_BIT
363 string "Ser 4 CD bit (empty = not used)"
364 depends on ETRAX_SERIAL_PORT4
365
366config ETRAX_SYNCHRONOUS_SERIAL 71config ETRAX_SYNCHRONOUS_SERIAL
367 bool "Synchronous serial-port support" 72 bool "Synchronous serial-port support"
368 depends on ETRAX_ARCH_V32 73 depends on ETRAX_ARCH_V32
@@ -703,32 +408,6 @@ config ETRAX_SPI_SSER0
703 want to build it as a module, which will be named spi_crisv32_sser. 408 want to build it as a module, which will be named spi_crisv32_sser.
704 (You need to select MMC separately.) 409 (You need to select MMC separately.)
705 410
706config ETRAX_SPI_SSER0_DMA
707 bool "DMA for SPI on sser0 enabled"
708 depends on ETRAX_SPI_SSER0
709 depends on !ETRAX_SERIAL_PORT1_DMA4_OUT && !ETRAX_SERIAL_PORT1_DMA5_IN
710 default y
711 help
712 Say Y if using DMA (dma4/dma5) for SPI on synchronous serial port 0.
713
714config ETRAX_SPI_MMC_CD_SSER0_PIN
715 string "MMC/SD card detect pin for SPI on sser0"
716 depends on ETRAX_SPI_SSER0 && MMC_SPI
717 default "pd11"
718 help
719 The pin to use for SD/MMC card detect. This pin should be pulled up
720 and grounded when a card is present. If defined as " " (space), no
721 pin is selected. A card must then always be inserted for proper
722 action.
723
724config ETRAX_SPI_MMC_WP_SSER0_PIN
725 string "MMC/SD card write-protect pin for SPI on sser0"
726 depends on ETRAX_SPI_SSER0 && MMC_SPI
727 default "pd10"
728 help
729 The pin to use for the SD/MMC write-protect signal for a memory
730 card. If defined as " " (space), the card is considered writable.
731
732config ETRAX_SPI_SSER1 411config ETRAX_SPI_SSER1
733 tristate "SPI using synchronous serial port 1 (sser1)" 412 tristate "SPI using synchronous serial port 1 (sser1)"
734 depends on ETRAX_SPI_MMC 413 depends on ETRAX_SPI_MMC
@@ -742,32 +421,6 @@ config ETRAX_SPI_SSER1
742 want to build it as a module, which will be named spi_crisv32_sser. 421 want to build it as a module, which will be named spi_crisv32_sser.
743 (You need to select MMC separately.) 422 (You need to select MMC separately.)
744 423
745config ETRAX_SPI_SSER1_DMA
746 bool "DMA for SPI on sser1 enabled"
747 depends on ETRAX_SPI_SSER1 && !ETRAX_ETHERNET_IFACE1
748 depends on !ETRAX_SERIAL_PORT0_DMA6_OUT && !ETRAX_SERIAL_PORT0_DMA7_IN
749 default y
750 help
751 Say Y if using DMA (dma6/dma7) for SPI on synchronous serial port 1.
752
753config ETRAX_SPI_MMC_CD_SSER1_PIN
754 string "MMC/SD card detect pin for SPI on sser1"
755 depends on ETRAX_SPI_SSER1 && MMC_SPI
756 default "pd12"
757 help
758 The pin to use for SD/MMC card detect. This pin should be pulled up
759 and grounded when a card is present. If defined as " " (space), no
760 pin is selected. A card must then always be inserted for proper
761 action.
762
763config ETRAX_SPI_MMC_WP_SSER1_PIN
764 string "MMC/SD card write-protect pin for SPI on sser1"
765 depends on ETRAX_SPI_SSER1 && MMC_SPI
766 default "pd9"
767 help
768 The pin to use for the SD/MMC write-protect signal for a memory
769 card. If defined as " " (space), the card is considered writable.
770
771config ETRAX_SPI_GPIO 424config ETRAX_SPI_GPIO
772 tristate "Bitbanged SPI using gpio pins" 425 tristate "Bitbanged SPI using gpio pins"
773 depends on ETRAX_SPI_MMC 426 depends on ETRAX_SPI_MMC
@@ -782,51 +435,4 @@ config ETRAX_SPI_GPIO
782 Say m to build it as a module, which will be called spi_crisv32_gpio. 435 Say m to build it as a module, which will be called spi_crisv32_gpio.
783 (You need to select MMC separately.) 436 (You need to select MMC separately.)
784 437
785# The default match that of sser0, only because that's how it was tested.
786config ETRAX_SPI_CS_PIN
787 string "SPI chip select pin"
788 depends on ETRAX_SPI_GPIO
789 default "pc3"
790 help
791 The pin to use for SPI chip select.
792
793config ETRAX_SPI_CLK_PIN
794 string "SPI clock pin"
795 depends on ETRAX_SPI_GPIO
796 default "pc1"
797 help
798 The pin to use for the SPI clock.
799
800config ETRAX_SPI_DATAIN_PIN
801 string "SPI MISO (data in) pin"
802 depends on ETRAX_SPI_GPIO
803 default "pc16"
804 help
805 The pin to use for SPI data in from the device.
806
807config ETRAX_SPI_DATAOUT_PIN
808 string "SPI MOSI (data out) pin"
809 depends on ETRAX_SPI_GPIO
810 default "pc0"
811 help
812 The pin to use for SPI data out to the device.
813
814config ETRAX_SPI_MMC_CD_GPIO_PIN
815 string "MMC/SD card detect pin for SPI using gpio (space for none)"
816 depends on ETRAX_SPI_GPIO && MMC_SPI
817 default "pd11"
818 help
819 The pin to use for SD/MMC card detect. This pin should be pulled up
820 and grounded when a card is present. If defined as " " (space), no
821 pin is selected. A card must then always be inserted for proper
822 action.
823
824config ETRAX_SPI_MMC_WP_GPIO_PIN
825 string "MMC/SD card write-protect pin for SPI using gpio (space for none)"
826 depends on ETRAX_SPI_GPIO && MMC_SPI
827 default "pd10"
828 help
829 The pin to use for the SD/MMC write-protect signal for a memory
830 card. If defined as " " (space), the card is considered writable.
831
832endif 438endif
diff --git a/arch/cris/arch-v32/mach-a3/Kconfig b/arch/cris/arch-v32/mach-a3/Kconfig
index 7796aafc711e..87547271a595 100644
--- a/arch/cris/arch-v32/mach-a3/Kconfig
+++ b/arch/cris/arch-v32/mach-a3/Kconfig
@@ -15,10 +15,6 @@ config ETRAX_SERIAL_PORTS
15 int 15 int
16 default 5 16 default 5
17 17
18config ETRAX_DDR
19 bool
20 default y
21
22config ETRAX_DDR2_MRS 18config ETRAX_DDR2_MRS
23 hex "DDR2 MRS" 19 hex "DDR2 MRS"
24 default "0" 20 default "0"
diff --git a/arch/cris/include/asm/processor.h b/arch/cris/include/asm/processor.h
index c0a29b96b92b..15b815df29c1 100644
--- a/arch/cris/include/asm/processor.h
+++ b/arch/cris/include/asm/processor.h
@@ -47,7 +47,6 @@ struct task_struct;
47 */ 47 */
48 48
49#define task_pt_regs(task) user_regs(task_thread_info(task)) 49#define task_pt_regs(task) user_regs(task_thread_info(task))
50#define current_regs() task_pt_regs(current)
51 50
52unsigned long get_wchan(struct task_struct *p); 51unsigned long get_wchan(struct task_struct *p);
53 52
diff --git a/arch/cris/include/uapi/asm/kvm_para.h b/arch/cris/include/uapi/asm/kvm_para.h
new file mode 100644
index 000000000000..14fab8f0b957
--- /dev/null
+++ b/arch/cris/include/uapi/asm/kvm_para.h
@@ -0,0 +1 @@
#include <asm-generic/kvm_para.h>
diff --git a/arch/cris/mm/fault.c b/arch/cris/mm/fault.c
index 73312ab6c696..1790f22e71a2 100644
--- a/arch/cris/mm/fault.c
+++ b/arch/cris/mm/fault.c
@@ -58,8 +58,7 @@ do_page_fault(unsigned long address, struct pt_regs *regs,
58 struct vm_area_struct * vma; 58 struct vm_area_struct * vma;
59 siginfo_t info; 59 siginfo_t info;
60 int fault; 60 int fault;
61 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE | 61 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
62 ((writeaccess & 1) ? FAULT_FLAG_WRITE : 0);
63 62
64 D(printk(KERN_DEBUG 63 D(printk(KERN_DEBUG
65 "Page fault for %lX on %X at %lX, prot %d write %d\n", 64 "Page fault for %lX on %X at %lX, prot %d write %d\n",
@@ -117,6 +116,8 @@ do_page_fault(unsigned long address, struct pt_regs *regs,
117 if (in_atomic() || !mm) 116 if (in_atomic() || !mm)
118 goto no_context; 117 goto no_context;
119 118
119 if (user_mode(regs))
120 flags |= FAULT_FLAG_USER;
120retry: 121retry:
121 down_read(&mm->mmap_sem); 122 down_read(&mm->mmap_sem);
122 vma = find_vma(mm, address); 123 vma = find_vma(mm, address);
@@ -155,6 +156,7 @@ retry:
155 } else if (writeaccess == 1) { 156 } else if (writeaccess == 1) {
156 if (!(vma->vm_flags & VM_WRITE)) 157 if (!(vma->vm_flags & VM_WRITE))
157 goto bad_area; 158 goto bad_area;
159 flags |= FAULT_FLAG_WRITE;
158 } else { 160 } else {
159 if (!(vma->vm_flags & (VM_READ | VM_EXEC))) 161 if (!(vma->vm_flags & (VM_READ | VM_EXEC)))
160 goto bad_area; 162 goto bad_area;
diff --git a/arch/frv/Kconfig b/arch/frv/Kconfig
index 4b6628ea381e..34aa19352dc1 100644
--- a/arch/frv/Kconfig
+++ b/arch/frv/Kconfig
@@ -5,7 +5,6 @@ config FRV
5 select HAVE_ARCH_TRACEHOOK 5 select HAVE_ARCH_TRACEHOOK
6 select HAVE_PERF_EVENTS 6 select HAVE_PERF_EVENTS
7 select HAVE_UID16 7 select HAVE_UID16
8 select HAVE_GENERIC_HARDIRQS
9 select VIRT_TO_BUS 8 select VIRT_TO_BUS
10 select GENERIC_IRQ_SHOW 9 select GENERIC_IRQ_SHOW
11 select HAVE_DEBUG_BUGVERBOSE 10 select HAVE_DEBUG_BUGVERBOSE
diff --git a/arch/frv/mb93090-mb00/pci-vdk.c b/arch/frv/mb93090-mb00/pci-vdk.c
index 0aa35f0eb0db..deb67843693c 100644
--- a/arch/frv/mb93090-mb00/pci-vdk.c
+++ b/arch/frv/mb93090-mb00/pci-vdk.c
@@ -320,7 +320,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_ide_bases);
320 * are examined. 320 * are examined.
321 */ 321 */
322 322
323void __init pcibios_fixup_bus(struct pci_bus *bus) 323void pcibios_fixup_bus(struct pci_bus *bus)
324{ 324{
325#if 0 325#if 0
326 printk("### PCIBIOS_FIXUP_BUS(%d)\n",bus->number); 326 printk("### PCIBIOS_FIXUP_BUS(%d)\n",bus->number);
diff --git a/arch/frv/mm/fault.c b/arch/frv/mm/fault.c
index 331c1e2cfb67..9a66372fc7c7 100644
--- a/arch/frv/mm/fault.c
+++ b/arch/frv/mm/fault.c
@@ -34,11 +34,11 @@ asmlinkage void do_page_fault(int datammu, unsigned long esr0, unsigned long ear
34 struct vm_area_struct *vma; 34 struct vm_area_struct *vma;
35 struct mm_struct *mm; 35 struct mm_struct *mm;
36 unsigned long _pme, lrai, lrad, fixup; 36 unsigned long _pme, lrai, lrad, fixup;
37 unsigned long flags = 0;
37 siginfo_t info; 38 siginfo_t info;
38 pgd_t *pge; 39 pgd_t *pge;
39 pud_t *pue; 40 pud_t *pue;
40 pte_t *pte; 41 pte_t *pte;
41 int write;
42 int fault; 42 int fault;
43 43
44#if 0 44#if 0
@@ -81,6 +81,9 @@ asmlinkage void do_page_fault(int datammu, unsigned long esr0, unsigned long ear
81 if (in_atomic() || !mm) 81 if (in_atomic() || !mm)
82 goto no_context; 82 goto no_context;
83 83
84 if (user_mode(__frame))
85 flags |= FAULT_FLAG_USER;
86
84 down_read(&mm->mmap_sem); 87 down_read(&mm->mmap_sem);
85 88
86 vma = find_vma(mm, ear0); 89 vma = find_vma(mm, ear0);
@@ -129,7 +132,6 @@ asmlinkage void do_page_fault(int datammu, unsigned long esr0, unsigned long ear
129 */ 132 */
130 good_area: 133 good_area:
131 info.si_code = SEGV_ACCERR; 134 info.si_code = SEGV_ACCERR;
132 write = 0;
133 switch (esr0 & ESR0_ATXC) { 135 switch (esr0 & ESR0_ATXC) {
134 default: 136 default:
135 /* handle write to write protected page */ 137 /* handle write to write protected page */
@@ -140,7 +142,7 @@ asmlinkage void do_page_fault(int datammu, unsigned long esr0, unsigned long ear
140#endif 142#endif
141 if (!(vma->vm_flags & VM_WRITE)) 143 if (!(vma->vm_flags & VM_WRITE))
142 goto bad_area; 144 goto bad_area;
143 write = 1; 145 flags |= FAULT_FLAG_WRITE;
144 break; 146 break;
145 147
146 /* handle read from protected page */ 148 /* handle read from protected page */
@@ -162,7 +164,7 @@ asmlinkage void do_page_fault(int datammu, unsigned long esr0, unsigned long ear
162 * make sure we exit gracefully rather than endlessly redo 164 * make sure we exit gracefully rather than endlessly redo
163 * the fault. 165 * the fault.
164 */ 166 */
165 fault = handle_mm_fault(mm, vma, ear0, write ? FAULT_FLAG_WRITE : 0); 167 fault = handle_mm_fault(mm, vma, ear0, flags);
166 if (unlikely(fault & VM_FAULT_ERROR)) { 168 if (unlikely(fault & VM_FAULT_ERROR)) {
167 if (fault & VM_FAULT_OOM) 169 if (fault & VM_FAULT_OOM)
168 goto out_of_memory; 170 goto out_of_memory;
diff --git a/arch/h8300/Kconfig b/arch/h8300/Kconfig
index 3d6759ee382f..24b1dc2564f1 100644
--- a/arch/h8300/Kconfig
+++ b/arch/h8300/Kconfig
@@ -2,7 +2,6 @@ config H8300
2 bool 2 bool
3 default y 3 default y
4 select HAVE_IDE 4 select HAVE_IDE
5 select HAVE_GENERIC_HARDIRQS
6 select GENERIC_ATOMIC64 5 select GENERIC_ATOMIC64
7 select HAVE_UID16 6 select HAVE_UID16
8 select VIRT_TO_BUS 7 select VIRT_TO_BUS
diff --git a/arch/hexagon/Kconfig b/arch/hexagon/Kconfig
index 77d442ab28c8..99041b07e610 100644
--- a/arch/hexagon/Kconfig
+++ b/arch/hexagon/Kconfig
@@ -15,7 +15,6 @@ config HEXAGON
15 # select GENERIC_PENDING_IRQ if SMP 15 # select GENERIC_PENDING_IRQ if SMP
16 select GENERIC_ATOMIC64 16 select GENERIC_ATOMIC64
17 select HAVE_PERF_EVENTS 17 select HAVE_PERF_EVENTS
18 select HAVE_GENERIC_HARDIRQS
19 # GENERIC_ALLOCATOR is used by dma_alloc_coherent() 18 # GENERIC_ALLOCATOR is used by dma_alloc_coherent()
20 select GENERIC_ALLOCATOR 19 select GENERIC_ALLOCATOR
21 select GENERIC_IRQ_SHOW 20 select GENERIC_IRQ_SHOW
diff --git a/arch/hexagon/mm/vm_fault.c b/arch/hexagon/mm/vm_fault.c
index 1bd276dbec7d..8704c9320032 100644
--- a/arch/hexagon/mm/vm_fault.c
+++ b/arch/hexagon/mm/vm_fault.c
@@ -53,8 +53,7 @@ void do_page_fault(unsigned long address, long cause, struct pt_regs *regs)
53 int si_code = SEGV_MAPERR; 53 int si_code = SEGV_MAPERR;
54 int fault; 54 int fault;
55 const struct exception_table_entry *fixup; 55 const struct exception_table_entry *fixup;
56 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE | 56 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
57 (cause > 0 ? FAULT_FLAG_WRITE : 0);
58 57
59 /* 58 /*
60 * If we're in an interrupt or have no user context, 59 * If we're in an interrupt or have no user context,
@@ -65,6 +64,8 @@ void do_page_fault(unsigned long address, long cause, struct pt_regs *regs)
65 64
66 local_irq_enable(); 65 local_irq_enable();
67 66
67 if (user_mode(regs))
68 flags |= FAULT_FLAG_USER;
68retry: 69retry:
69 down_read(&mm->mmap_sem); 70 down_read(&mm->mmap_sem);
70 vma = find_vma(mm, address); 71 vma = find_vma(mm, address);
@@ -96,6 +97,7 @@ good_area:
96 case FLT_STORE: 97 case FLT_STORE:
97 if (!(vma->vm_flags & VM_WRITE)) 98 if (!(vma->vm_flags & VM_WRITE))
98 goto bad_area; 99 goto bad_area;
100 flags |= FAULT_FLAG_WRITE;
99 break; 101 break;
100 } 102 }
101 103
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig
index 5a768ad8e893..7740ab10a171 100644
--- a/arch/ia64/Kconfig
+++ b/arch/ia64/Kconfig
@@ -9,7 +9,6 @@ config IA64
9 select PCI if (!IA64_HP_SIM) 9 select PCI if (!IA64_HP_SIM)
10 select ACPI if (!IA64_HP_SIM) 10 select ACPI if (!IA64_HP_SIM)
11 select PM if (!IA64_HP_SIM) 11 select PM if (!IA64_HP_SIM)
12 select ARCH_SUPPORTS_MSI
13 select HAVE_UNSTABLE_SCHED_CLOCK 12 select HAVE_UNSTABLE_SCHED_CLOCK
14 select HAVE_IDE 13 select HAVE_IDE
15 select HAVE_OPROFILE 14 select HAVE_OPROFILE
@@ -22,7 +21,6 @@ config IA64
22 select HAVE_KVM 21 select HAVE_KVM
23 select HAVE_ARCH_TRACEHOOK 22 select HAVE_ARCH_TRACEHOOK
24 select HAVE_DMA_API_DEBUG 23 select HAVE_DMA_API_DEBUG
25 select HAVE_GENERIC_HARDIRQS
26 select HAVE_MEMBLOCK 24 select HAVE_MEMBLOCK
27 select HAVE_MEMBLOCK_NODE_MAP 25 select HAVE_MEMBLOCK_NODE_MAP
28 select HAVE_VIRT_CPU_ACCOUNTING 26 select HAVE_VIRT_CPU_ACCOUNTING
@@ -43,6 +41,7 @@ config IA64
43 select SYSCTL_ARCH_UNALIGN_NO_WARN 41 select SYSCTL_ARCH_UNALIGN_NO_WARN
44 select HAVE_MOD_ARCH_SPECIFIC 42 select HAVE_MOD_ARCH_SPECIFIC
45 select MODULES_USE_ELF_RELA 43 select MODULES_USE_ELF_RELA
44 select ARCH_USE_CMPXCHG_LOCKREF
46 default y 45 default y
47 help 46 help
48 The Itanium Processor Family is Intel's 64-bit successor to 47 The Itanium Processor Family is Intel's 64-bit successor to
@@ -565,9 +564,9 @@ config KEXEC
565 564
566 It is an ongoing process to be certain the hardware in a machine 565 It is an ongoing process to be certain the hardware in a machine
567 is properly shutdown, so do not be surprised if this code does not 566 is properly shutdown, so do not be surprised if this code does not
568 initially work for you. It may help to enable device hotplugging 567 initially work for you. As of this writing the exact hardware
569 support. As of this writing the exact hardware interface is 568 interface is strongly in flux, so no good recommendation can be
570 strongly in flux, so no good recommendation can be made. 569 made.
571 570
572config CRASH_DUMP 571config CRASH_DUMP
573 bool "kernel crash dumps" 572 bool "kernel crash dumps"
diff --git a/arch/ia64/include/asm/Kbuild b/arch/ia64/include/asm/Kbuild
index 05b03ecd7933..a3456f34f672 100644
--- a/arch/ia64/include/asm/Kbuild
+++ b/arch/ia64/include/asm/Kbuild
@@ -3,3 +3,4 @@ generic-y += clkdev.h
3generic-y += exec.h 3generic-y += exec.h
4generic-y += kvm_para.h 4generic-y += kvm_para.h
5generic-y += trace_clock.h 5generic-y += trace_clock.h
6generic-y += vtime.h \ No newline at end of file
diff --git a/arch/ia64/include/asm/bitops.h b/arch/ia64/include/asm/bitops.h
index 8e20bff39f79..c27eccd33349 100644
--- a/arch/ia64/include/asm/bitops.h
+++ b/arch/ia64/include/asm/bitops.h
@@ -425,13 +425,7 @@ __fls (unsigned long x)
425 425
426#include <asm-generic/bitops/fls64.h> 426#include <asm-generic/bitops/fls64.h>
427 427
428/* 428#include <asm-generic/bitops/builtin-ffs.h>
429 * ffs: find first bit set. This is defined the same way as the libc and
430 * compiler builtin ffs routines, therefore differs in spirit from the above
431 * ffz (man ffs): it operates on "int" values only and the result value is the
432 * bit number + 1. ffs(0) is defined to return zero.
433 */
434#define ffs(x) __builtin_ffs(x)
435 429
436/* 430/*
437 * hweightN: returns the hamming weight (i.e. the number 431 * hweightN: returns the hamming weight (i.e. the number
diff --git a/arch/ia64/include/asm/dmi.h b/arch/ia64/include/asm/dmi.h
index 1ed4c8fedb83..185d3d18d0ec 100644
--- a/arch/ia64/include/asm/dmi.h
+++ b/arch/ia64/include/asm/dmi.h
@@ -7,6 +7,6 @@
7/* Use normal IO mappings for DMI */ 7/* Use normal IO mappings for DMI */
8#define dmi_ioremap ioremap 8#define dmi_ioremap ioremap
9#define dmi_iounmap(x,l) iounmap(x) 9#define dmi_iounmap(x,l) iounmap(x)
10#define dmi_alloc(l) kmalloc(l, GFP_ATOMIC) 10#define dmi_alloc(l) kzalloc(l, GFP_ATOMIC)
11 11
12#endif 12#endif
diff --git a/arch/ia64/include/asm/spinlock.h b/arch/ia64/include/asm/spinlock.h
index 54ff557d474e..45698cd15b7b 100644
--- a/arch/ia64/include/asm/spinlock.h
+++ b/arch/ia64/include/asm/spinlock.h
@@ -102,6 +102,11 @@ static inline int __ticket_spin_is_contended(arch_spinlock_t *lock)
102 return ((tmp - (tmp >> TICKET_SHIFT)) & TICKET_MASK) > 1; 102 return ((tmp - (tmp >> TICKET_SHIFT)) & TICKET_MASK) > 1;
103} 103}
104 104
105static __always_inline int arch_spin_value_unlocked(arch_spinlock_t lock)
106{
107 return !(((lock.lock >> TICKET_SHIFT) ^ lock.lock) & TICKET_MASK);
108}
109
105static inline int arch_spin_is_locked(arch_spinlock_t *lock) 110static inline int arch_spin_is_locked(arch_spinlock_t *lock)
106{ 111{
107 return __ticket_spin_is_locked(lock); 112 return __ticket_spin_is_locked(lock);
diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c
index 5b2dc0d10c8f..bdfd8789b376 100644
--- a/arch/ia64/kvm/kvm-ia64.c
+++ b/arch/ia64/kvm/kvm-ia64.c
@@ -1560,6 +1560,10 @@ int kvm_arch_create_memslot(struct kvm_memory_slot *slot, unsigned long npages)
1560 return 0; 1560 return 0;
1561} 1561}
1562 1562
1563void kvm_arch_memslots_updated(struct kvm *kvm)
1564{
1565}
1566
1563int kvm_arch_prepare_memory_region(struct kvm *kvm, 1567int kvm_arch_prepare_memory_region(struct kvm *kvm,
1564 struct kvm_memory_slot *memslot, 1568 struct kvm_memory_slot *memslot,
1565 struct kvm_userspace_memory_region *mem, 1569 struct kvm_userspace_memory_region *mem,
diff --git a/arch/ia64/mm/fault.c b/arch/ia64/mm/fault.c
index 6cf0341f978e..7225dad87094 100644
--- a/arch/ia64/mm/fault.c
+++ b/arch/ia64/mm/fault.c
@@ -90,8 +90,6 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re
90 mask = ((((isr >> IA64_ISR_X_BIT) & 1UL) << VM_EXEC_BIT) 90 mask = ((((isr >> IA64_ISR_X_BIT) & 1UL) << VM_EXEC_BIT)
91 | (((isr >> IA64_ISR_W_BIT) & 1UL) << VM_WRITE_BIT)); 91 | (((isr >> IA64_ISR_W_BIT) & 1UL) << VM_WRITE_BIT));
92 92
93 flags |= ((mask & VM_WRITE) ? FAULT_FLAG_WRITE : 0);
94
95 /* mmap_sem is performance critical.... */ 93 /* mmap_sem is performance critical.... */
96 prefetchw(&mm->mmap_sem); 94 prefetchw(&mm->mmap_sem);
97 95
@@ -119,6 +117,10 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re
119 if (notify_page_fault(regs, TRAP_BRKPT)) 117 if (notify_page_fault(regs, TRAP_BRKPT))
120 return; 118 return;
121 119
120 if (user_mode(regs))
121 flags |= FAULT_FLAG_USER;
122 if (mask & VM_WRITE)
123 flags |= FAULT_FLAG_WRITE;
122retry: 124retry:
123 down_read(&mm->mmap_sem); 125 down_read(&mm->mmap_sem);
124 126
diff --git a/arch/ia64/mm/hugetlbpage.c b/arch/ia64/mm/hugetlbpage.c
index 76069c18ee42..68232db98baa 100644
--- a/arch/ia64/mm/hugetlbpage.c
+++ b/arch/ia64/mm/hugetlbpage.c
@@ -114,6 +114,11 @@ int pud_huge(pud_t pud)
114 return 0; 114 return 0;
115} 115}
116 116
117int pmd_huge_support(void)
118{
119 return 0;
120}
121
117struct page * 122struct page *
118follow_huge_pmd(struct mm_struct *mm, unsigned long address, pmd_t *pmd, int write) 123follow_huge_pmd(struct mm_struct *mm, unsigned long address, pmd_t *pmd, int write)
119{ 124{
diff --git a/arch/m32r/Kconfig b/arch/m32r/Kconfig
index 29a7ef4e448b..75661fbf4529 100644
--- a/arch/m32r/Kconfig
+++ b/arch/m32r/Kconfig
@@ -9,7 +9,6 @@ config M32R
9 select HAVE_KERNEL_LZMA 9 select HAVE_KERNEL_LZMA
10 select ARCH_WANT_IPC_PARSE_VERSION 10 select ARCH_WANT_IPC_PARSE_VERSION
11 select HAVE_DEBUG_BUGVERBOSE 11 select HAVE_DEBUG_BUGVERBOSE
12 select HAVE_GENERIC_HARDIRQS
13 select VIRT_TO_BUS 12 select VIRT_TO_BUS
14 select GENERIC_IRQ_PROBE 13 select GENERIC_IRQ_PROBE
15 select GENERIC_IRQ_SHOW 14 select GENERIC_IRQ_SHOW
diff --git a/arch/m32r/mm/fault.c b/arch/m32r/mm/fault.c
index 3cdfa9c1d091..e9c6a8014bd6 100644
--- a/arch/m32r/mm/fault.c
+++ b/arch/m32r/mm/fault.c
@@ -78,7 +78,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code,
78 struct mm_struct *mm; 78 struct mm_struct *mm;
79 struct vm_area_struct * vma; 79 struct vm_area_struct * vma;
80 unsigned long page, addr; 80 unsigned long page, addr;
81 int write; 81 unsigned long flags = 0;
82 int fault; 82 int fault;
83 siginfo_t info; 83 siginfo_t info;
84 84
@@ -117,6 +117,9 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code,
117 if (in_atomic() || !mm) 117 if (in_atomic() || !mm)
118 goto bad_area_nosemaphore; 118 goto bad_area_nosemaphore;
119 119
120 if (error_code & ACE_USERMODE)
121 flags |= FAULT_FLAG_USER;
122
120 /* When running in the kernel we expect faults to occur only to 123 /* When running in the kernel we expect faults to occur only to
121 * addresses in user space. All other faults represent errors in the 124 * addresses in user space. All other faults represent errors in the
122 * kernel and should generate an OOPS. Unfortunately, in the case of an 125 * kernel and should generate an OOPS. Unfortunately, in the case of an
@@ -166,14 +169,13 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code,
166 */ 169 */
167good_area: 170good_area:
168 info.si_code = SEGV_ACCERR; 171 info.si_code = SEGV_ACCERR;
169 write = 0;
170 switch (error_code & (ACE_WRITE|ACE_PROTECTION)) { 172 switch (error_code & (ACE_WRITE|ACE_PROTECTION)) {
171 default: /* 3: write, present */ 173 default: /* 3: write, present */
172 /* fall through */ 174 /* fall through */
173 case ACE_WRITE: /* write, not present */ 175 case ACE_WRITE: /* write, not present */
174 if (!(vma->vm_flags & VM_WRITE)) 176 if (!(vma->vm_flags & VM_WRITE))
175 goto bad_area; 177 goto bad_area;
176 write++; 178 flags |= FAULT_FLAG_WRITE;
177 break; 179 break;
178 case ACE_PROTECTION: /* read, present */ 180 case ACE_PROTECTION: /* read, present */
179 case 0: /* read, not present */ 181 case 0: /* read, not present */
@@ -194,7 +196,7 @@ good_area:
194 */ 196 */
195 addr = (address & PAGE_MASK); 197 addr = (address & PAGE_MASK);
196 set_thread_fault_code(error_code); 198 set_thread_fault_code(error_code);
197 fault = handle_mm_fault(mm, vma, addr, write ? FAULT_FLAG_WRITE : 0); 199 fault = handle_mm_fault(mm, vma, addr, flags);
198 if (unlikely(fault & VM_FAULT_ERROR)) { 200 if (unlikely(fault & VM_FAULT_ERROR)) {
199 if (fault & VM_FAULT_OOM) 201 if (fault & VM_FAULT_OOM)
200 goto out_of_memory; 202 goto out_of_memory;
diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig
index 821170e5f6ed..311a300d48cc 100644
--- a/arch/m68k/Kconfig
+++ b/arch/m68k/Kconfig
@@ -4,13 +4,13 @@ config M68K
4 select HAVE_IDE 4 select HAVE_IDE
5 select HAVE_AOUT if MMU 5 select HAVE_AOUT if MMU
6 select HAVE_DEBUG_BUGVERBOSE 6 select HAVE_DEBUG_BUGVERBOSE
7 select HAVE_GENERIC_HARDIRQS
8 select GENERIC_IRQ_SHOW 7 select GENERIC_IRQ_SHOW
9 select GENERIC_ATOMIC64 8 select GENERIC_ATOMIC64
10 select HAVE_UID16 9 select HAVE_UID16
11 select VIRT_TO_BUS 10 select VIRT_TO_BUS
12 select ARCH_HAVE_NMI_SAFE_CMPXCHG if RMW_INSNS 11 select ARCH_HAVE_NMI_SAFE_CMPXCHG if RMW_INSNS
13 select GENERIC_CPU_DEVICES 12 select GENERIC_CPU_DEVICES
13 select GENERIC_IOMAP
14 select GENERIC_STRNCPY_FROM_USER if MMU 14 select GENERIC_STRNCPY_FROM_USER if MMU
15 select GENERIC_STRNLEN_USER if MMU 15 select GENERIC_STRNLEN_USER if MMU
16 select FPU if MMU 16 select FPU if MMU
@@ -72,7 +72,6 @@ source "kernel/Kconfig.freezer"
72config MMU 72config MMU
73 bool "MMU-based Paged Memory Management Support" 73 bool "MMU-based Paged Memory Management Support"
74 default y 74 default y
75 select GENERIC_IOMAP
76 help 75 help
77 Select if you want MMU-based virtualised addressing space 76 Select if you want MMU-based virtualised addressing space
78 support by paged memory management. If unsure, say 'Y'. 77 support by paged memory management. If unsure, say 'Y'.
diff --git a/arch/m68k/Kconfig.machine b/arch/m68k/Kconfig.machine
index b9ab0a69561c..61dc643c0b05 100644
--- a/arch/m68k/Kconfig.machine
+++ b/arch/m68k/Kconfig.machine
@@ -150,18 +150,6 @@ config XCOPILOT_BUGS
150 help 150 help
151 Support the bugs of Xcopilot. 151 Support the bugs of Xcopilot.
152 152
153config UC5272
154 bool "Arcturus Networks uC5272 dimm board support"
155 depends on M5272
156 help
157 Support for the Arcturus Networks uC5272 dimm board.
158
159config UC5282
160 bool "Arcturus Networks uC5282 board support"
161 depends on M528x
162 help
163 Support for the Arcturus Networks uC5282 dimm board.
164
165config UCSIMM 153config UCSIMM
166 bool "uCsimm module support" 154 bool "uCsimm module support"
167 depends on M68EZ328 155 depends on M68EZ328
@@ -205,23 +193,15 @@ config UCQUICC
205 help 193 help
206 Support for the Lineo uCquicc board. 194 Support for the Lineo uCquicc board.
207 195
208config ARNEWSH
209 bool
210
211config ARN5206 196config ARN5206
212 bool "Arnewsh 5206 board support" 197 bool "Arnewsh 5206 board support"
213 depends on M5206 198 depends on M5206
214 select ARNEWSH
215 help 199 help
216 Support for the Arnewsh 5206 board. 200 Support for the Arnewsh 5206 board.
217 201
218config FREESCALE
219 bool
220
221config M5206eC3 202config M5206eC3
222 bool "Motorola M5206eC3 board support" 203 bool "Motorola M5206eC3 board support"
223 depends on M5206e 204 depends on M5206e
224 select FREESCALE
225 help 205 help
226 Support for the Motorola M5206eC3 board. 206 Support for the Motorola M5206eC3 board.
227 207
@@ -231,88 +211,24 @@ config ELITE
231 help 211 help
232 Support for the Motorola M5206eLITE board. 212 Support for the Motorola M5206eLITE board.
233 213
234config M5208EVB
235 bool "Freescale M5208EVB board support"
236 depends on M520x
237 select FREESCALE
238 help
239 Support for the Freescale Coldfire M5208EVB.
240
241config M5235EVB 214config M5235EVB
242 bool "Freescale M5235EVB support" 215 bool "Freescale M5235EVB support"
243 depends on M523x 216 depends on M523x
244 select FREESCALE
245 help 217 help
246 Support for the Freescale M5235EVB board. 218 Support for the Freescale M5235EVB board.
247 219
248config M5249C3 220config M5249C3
249 bool "Motorola M5249C3 board support" 221 bool "Motorola M5249C3 board support"
250 depends on M5249 222 depends on M5249
251 select FREESCALE
252 help 223 help
253 Support for the Motorola M5249C3 board. 224 Support for the Motorola M5249C3 board.
254 225
255config M5271EVB
256 bool "Freescale (Motorola) M5271EVB board support"
257 depends on M5271
258 select FREESCALE
259 help
260 Support for the Freescale (Motorola) M5271EVB board.
261
262config M5275EVB
263 bool "Freescale (Motorola) M5275EVB board support"
264 depends on M5275
265 select FREESCALE
266 help
267 Support for the Freescale (Motorola) M5275EVB board.
268
269config M5272C3 226config M5272C3
270 bool "Motorola M5272C3 board support" 227 bool "Motorola M5272C3 board support"
271 depends on M5272 228 depends on M5272
272 select FREESCALE
273 help 229 help
274 Support for the Motorola M5272C3 board. 230 Support for the Motorola M5272C3 board.
275 231
276config senTec
277 bool
278
279config COBRA5272
280 bool "senTec COBRA5272 board support"
281 depends on M5272
282 select senTec
283 help
284 Support for the senTec COBRA5272 board.
285
286config AVNET
287 bool
288
289config AVNET5282
290 bool "Avnet 5282 board support"
291 depends on M528x
292 select AVNET
293 help
294 Support for the Avnet 5282 board.
295
296config M5282EVB
297 bool "Motorola M5282EVB board support"
298 depends on M528x
299 select FREESCALE
300 help
301 Support for the Motorola M5282EVB board.
302
303config COBRA5282
304 bool "senTec COBRA5282 board support"
305 depends on M528x
306 select senTec
307 help
308 Support for the senTec COBRA5282 board.
309
310config SOM5282EM
311 bool "EMAC.Inc SOM5282EM board support"
312 depends on M528x
313 help
314 Support for the EMAC.Inc SOM5282EM module.
315
316config WILDFIRE 232config WILDFIRE
317 bool "Intec Automation Inc. WildFire board support" 233 bool "Intec Automation Inc. WildFire board support"
318 depends on M528x 234 depends on M528x
@@ -328,14 +244,12 @@ config WILDFIREMOD
328config ARN5307 244config ARN5307
329 bool "Arnewsh 5307 board support" 245 bool "Arnewsh 5307 board support"
330 depends on M5307 246 depends on M5307
331 select ARNEWSH
332 help 247 help
333 Support for the Arnewsh 5307 board. 248 Support for the Arnewsh 5307 board.
334 249
335config M5307C3 250config M5307C3
336 bool "Motorola M5307C3 board support" 251 bool "Motorola M5307C3 board support"
337 depends on M5307 252 depends on M5307
338 select FREESCALE
339 help 253 help
340 Support for the Motorola M5307C3 board. 254 Support for the Motorola M5307C3 board.
341 255
@@ -345,30 +259,9 @@ config SECUREEDGEMP3
345 help 259 help
346 Support for the SnapGear SecureEdge/MP3 platform. 260 Support for the SnapGear SecureEdge/MP3 platform.
347 261
348config M5329EVB
349 bool "Freescale (Motorola) M5329EVB board support"
350 depends on M532x
351 select FREESCALE
352 help
353 Support for the Freescale (Motorola) M5329EVB board.
354
355config COBRA5329
356 bool "senTec COBRA5329 board support"
357 depends on M532x
358 help
359 Support for the senTec COBRA5329 board.
360
361config M5373EVB
362 bool "Freescale M5373EVB board support"
363 depends on M537x
364 select FREESCALE
365 help
366 Support for the Freescale M5373EVB board.
367
368config M5407C3 262config M5407C3
369 bool "Motorola M5407C3 board support" 263 bool "Motorola M5407C3 board support"
370 depends on M5407 264 depends on M5407
371 select FREESCALE
372 help 265 help
373 Support for the Motorola M5407C3 board. 266 Support for the Motorola M5407C3 board.
374 267
@@ -402,39 +295,12 @@ config NETtel
402 help 295 help
403 Support for the SnapGear NETtel/SecureEdge/SnapGear boards. 296 Support for the SnapGear NETtel/SecureEdge/SnapGear boards.
404 297
405config SNAPGEAR
406 bool "SnapGear router board support"
407 depends on NETtel
408 help
409 Special additional support for SnapGear router boards.
410
411config SNEHA
412 bool
413
414config CPU16B
415 bool "Sneha Technologies S.L. Sarasvati board support"
416 depends on M5272
417 select SNEHA
418 help
419 Support for the SNEHA CPU16B board.
420
421config MOD5272 298config MOD5272
422 bool "Netburner MOD-5272 board support" 299 bool "Netburner MOD-5272 board support"
423 depends on M5272 300 depends on M5272
424 help 301 help
425 Support for the Netburner MOD-5272 board. 302 Support for the Netburner MOD-5272 board.
426 303
427config SAVANT
428 bool
429
430config SAVANTrosie1
431 bool "Savant Rosie1 board support"
432 depends on M523x
433 select SAVANT
434 help
435 Support for the Savant Rosie1 board.
436
437
438if !MMU || COLDFIRE 304if !MMU || COLDFIRE
439 305
440comment "Machine Options" 306comment "Machine Options"
diff --git a/arch/m68k/amiga/platform.c b/arch/m68k/amiga/platform.c
index 6083088c0cca..dacd9f911f71 100644
--- a/arch/m68k/amiga/platform.c
+++ b/arch/m68k/amiga/platform.c
@@ -56,7 +56,7 @@ static int __init amiga_init_bus(void)
56 n = AMIGAHW_PRESENT(ZORRO3) ? 4 : 2; 56 n = AMIGAHW_PRESENT(ZORRO3) ? 4 : 2;
57 pdev = platform_device_register_simple("amiga-zorro", -1, 57 pdev = platform_device_register_simple("amiga-zorro", -1,
58 zorro_resources, n); 58 zorro_resources, n);
59 return PTR_RET(pdev); 59 return PTR_ERR_OR_ZERO(pdev);
60} 60}
61 61
62subsys_initcall(amiga_init_bus); 62subsys_initcall(amiga_init_bus);
diff --git a/arch/m68k/emu/natfeat.c b/arch/m68k/emu/natfeat.c
index fa277aecfb78..121a6660ad4e 100644
--- a/arch/m68k/emu/natfeat.c
+++ b/arch/m68k/emu/natfeat.c
@@ -18,11 +18,11 @@
18#include <asm/machdep.h> 18#include <asm/machdep.h>
19#include <asm/natfeat.h> 19#include <asm/natfeat.h>
20 20
21extern long nf_get_id2(const char *feature_name); 21extern long nf_get_id_phys(unsigned long feature_name);
22 22
23asm("\n" 23asm("\n"
24" .global nf_get_id2,nf_call\n" 24" .global nf_get_id_phys,nf_call\n"
25"nf_get_id2:\n" 25"nf_get_id_phys:\n"
26" .short 0x7300\n" 26" .short 0x7300\n"
27" rts\n" 27" rts\n"
28"nf_call:\n" 28"nf_call:\n"
@@ -31,7 +31,7 @@ asm("\n"
31"1: moveq.l #0,%d0\n" 31"1: moveq.l #0,%d0\n"
32" rts\n" 32" rts\n"
33" .section __ex_table,\"a\"\n" 33" .section __ex_table,\"a\"\n"
34" .long nf_get_id2,1b\n" 34" .long nf_get_id_phys,1b\n"
35" .long nf_call,1b\n" 35" .long nf_call,1b\n"
36" .previous"); 36" .previous");
37EXPORT_SYMBOL_GPL(nf_call); 37EXPORT_SYMBOL_GPL(nf_call);
@@ -46,7 +46,7 @@ long nf_get_id(const char *feature_name)
46 if (n >= sizeof(name_copy)) 46 if (n >= sizeof(name_copy))
47 return 0; 47 return 0;
48 48
49 return nf_get_id2(name_copy); 49 return nf_get_id_phys(virt_to_phys(name_copy));
50} 50}
51EXPORT_SYMBOL_GPL(nf_get_id); 51EXPORT_SYMBOL_GPL(nf_get_id);
52 52
@@ -58,7 +58,7 @@ void nfprint(const char *fmt, ...)
58 58
59 va_start(ap, fmt); 59 va_start(ap, fmt);
60 n = vsnprintf(buf, 256, fmt, ap); 60 n = vsnprintf(buf, 256, fmt, ap);
61 nf_call(nf_get_id("NF_STDERR"), buf); 61 nf_call(nf_get_id("NF_STDERR"), virt_to_phys(buf));
62 va_end(ap); 62 va_end(ap);
63} 63}
64 64
@@ -83,7 +83,7 @@ void nf_init(void)
83 id = nf_get_id("NF_NAME"); 83 id = nf_get_id("NF_NAME");
84 if (!id) 84 if (!id)
85 return; 85 return;
86 nf_call(id, buf, 256); 86 nf_call(id, virt_to_phys(buf), 256);
87 buf[255] = 0; 87 buf[255] = 0;
88 88
89 pr_info("NatFeats found (%s, %lu.%lu)\n", buf, version >> 16, 89 pr_info("NatFeats found (%s, %lu.%lu)\n", buf, version >> 16,
diff --git a/arch/m68k/emu/nfblock.c b/arch/m68k/emu/nfblock.c
index e3011338ab40..0721858fbd1e 100644
--- a/arch/m68k/emu/nfblock.c
+++ b/arch/m68k/emu/nfblock.c
@@ -41,8 +41,8 @@ static inline s32 nfhd_read_write(u32 major, u32 minor, u32 rwflag, u32 recno,
41static inline s32 nfhd_get_capacity(u32 major, u32 minor, u32 *blocks, 41static inline s32 nfhd_get_capacity(u32 major, u32 minor, u32 *blocks,
42 u32 *blocksize) 42 u32 *blocksize)
43{ 43{
44 return nf_call(nfhd_id + NFHD_GET_CAPACITY, major, minor, blocks, 44 return nf_call(nfhd_id + NFHD_GET_CAPACITY, major, minor,
45 blocksize); 45 virt_to_phys(blocks), virt_to_phys(blocksize));
46} 46}
47 47
48static LIST_HEAD(nfhd_list); 48static LIST_HEAD(nfhd_list);
diff --git a/arch/m68k/emu/nfcon.c b/arch/m68k/emu/nfcon.c
index 6685bf45c2c3..57e8c8fb5eba 100644
--- a/arch/m68k/emu/nfcon.c
+++ b/arch/m68k/emu/nfcon.c
@@ -15,6 +15,7 @@
15#include <linux/slab.h> 15#include <linux/slab.h>
16#include <linux/err.h> 16#include <linux/err.h>
17#include <linux/uaccess.h> 17#include <linux/uaccess.h>
18#include <linux/io.h>
18 19
19#include <asm/natfeat.h> 20#include <asm/natfeat.h>
20 21
@@ -25,17 +26,18 @@ static struct tty_driver *nfcon_tty_driver;
25static void nfputs(const char *str, unsigned int count) 26static void nfputs(const char *str, unsigned int count)
26{ 27{
27 char buf[68]; 28 char buf[68];
29 unsigned long phys = virt_to_phys(buf);
28 30
29 buf[64] = 0; 31 buf[64] = 0;
30 while (count > 64) { 32 while (count > 64) {
31 memcpy(buf, str, 64); 33 memcpy(buf, str, 64);
32 nf_call(stderr_id, buf); 34 nf_call(stderr_id, phys);
33 str += 64; 35 str += 64;
34 count -= 64; 36 count -= 64;
35 } 37 }
36 memcpy(buf, str, count); 38 memcpy(buf, str, count);
37 buf[count] = 0; 39 buf[count] = 0;
38 nf_call(stderr_id, buf); 40 nf_call(stderr_id, phys);
39} 41}
40 42
41static void nfcon_write(struct console *con, const char *str, 43static void nfcon_write(struct console *con, const char *str,
@@ -79,7 +81,7 @@ static int nfcon_tty_put_char(struct tty_struct *tty, unsigned char ch)
79{ 81{
80 char temp[2] = { ch, 0 }; 82 char temp[2] = { ch, 0 };
81 83
82 nf_call(stderr_id, temp); 84 nf_call(stderr_id, virt_to_phys(temp));
83 return 1; 85 return 1;
84} 86}
85 87
diff --git a/arch/m68k/emu/nfeth.c b/arch/m68k/emu/nfeth.c
index 695cd737a42e..a0985fd088d1 100644
--- a/arch/m68k/emu/nfeth.c
+++ b/arch/m68k/emu/nfeth.c
@@ -195,7 +195,8 @@ static struct net_device * __init nfeth_probe(int unit)
195 char mac[ETH_ALEN], host_ip[32], local_ip[32]; 195 char mac[ETH_ALEN], host_ip[32], local_ip[32];
196 int err; 196 int err;
197 197
198 if (!nf_call(nfEtherID + XIF_GET_MAC, unit, mac, ETH_ALEN)) 198 if (!nf_call(nfEtherID + XIF_GET_MAC, unit, virt_to_phys(mac),
199 ETH_ALEN))
199 return NULL; 200 return NULL;
200 201
201 dev = alloc_etherdev(sizeof(struct nfeth_private)); 202 dev = alloc_etherdev(sizeof(struct nfeth_private));
@@ -217,9 +218,9 @@ static struct net_device * __init nfeth_probe(int unit)
217 } 218 }
218 219
219 nf_call(nfEtherID + XIF_GET_IPHOST, unit, 220 nf_call(nfEtherID + XIF_GET_IPHOST, unit,
220 host_ip, sizeof(host_ip)); 221 virt_to_phys(host_ip), sizeof(host_ip));
221 nf_call(nfEtherID + XIF_GET_IPATARI, unit, 222 nf_call(nfEtherID + XIF_GET_IPATARI, unit,
222 local_ip, sizeof(local_ip)); 223 virt_to_phys(local_ip), sizeof(local_ip));
223 224
224 netdev_info(dev, KBUILD_MODNAME " addr:%s (%s) HWaddr:%pM\n", host_ip, 225 netdev_info(dev, KBUILD_MODNAME " addr:%s (%s) HWaddr:%pM\n", host_ip,
225 local_ip, mac); 226 local_ip, mac);
diff --git a/arch/m68k/include/asm/io_no.h b/arch/m68k/include/asm/io_no.h
index 353bf754a972..e1534783e94e 100644
--- a/arch/m68k/include/asm/io_no.h
+++ b/arch/m68k/include/asm/io_no.h
@@ -4,6 +4,7 @@
4#ifdef __KERNEL__ 4#ifdef __KERNEL__
5 5
6#include <asm/virtconvert.h> 6#include <asm/virtconvert.h>
7#include <asm-generic/iomap.h>
7 8
8/* 9/*
9 * These are for ISA/PCI shared memory _only_ and should never be used 10 * These are for ISA/PCI shared memory _only_ and should never be used
diff --git a/arch/m68k/include/asm/irqflags.h b/arch/m68k/include/asm/irqflags.h
index 7ef4115b8c4a..a823cd73dc09 100644
--- a/arch/m68k/include/asm/irqflags.h
+++ b/arch/m68k/include/asm/irqflags.h
@@ -3,7 +3,7 @@
3 3
4#include <linux/types.h> 4#include <linux/types.h>
5#ifdef CONFIG_MMU 5#ifdef CONFIG_MMU
6#include <linux/hardirq.h> 6#include <linux/preempt_mask.h>
7#endif 7#endif
8#include <linux/preempt.h> 8#include <linux/preempt.h>
9#include <asm/thread_info.h> 9#include <asm/thread_info.h>
@@ -67,6 +67,10 @@ static inline void arch_local_irq_restore(unsigned long flags)
67 67
68static inline bool arch_irqs_disabled_flags(unsigned long flags) 68static inline bool arch_irqs_disabled_flags(unsigned long flags)
69{ 69{
70 if (MACH_IS_ATARI) {
71 /* Ignore HSYNC = ipl 2 on Atari */
72 return (flags & ~(ALLOWINT | 0x200)) != 0;
73 }
70 return (flags & ~ALLOWINT) != 0; 74 return (flags & ~ALLOWINT) != 0;
71} 75}
72 76
diff --git a/arch/m68k/include/asm/page.h b/arch/m68k/include/asm/page.h
index 7c360dac00b7..38b024a0b045 100644
--- a/arch/m68k/include/asm/page.h
+++ b/arch/m68k/include/asm/page.h
@@ -48,6 +48,9 @@ extern unsigned long _ramend;
48#include <asm/page_no.h> 48#include <asm/page_no.h>
49#endif 49#endif
50 50
51#define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \
52 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
53
51#include <asm-generic/getorder.h> 54#include <asm-generic/getorder.h>
52 55
53#endif /* _M68K_PAGE_H */ 56#endif /* _M68K_PAGE_H */
diff --git a/arch/m68k/include/asm/page_mm.h b/arch/m68k/include/asm/page_mm.h
index 89f201434b5a..5029f73e6294 100644
--- a/arch/m68k/include/asm/page_mm.h
+++ b/arch/m68k/include/asm/page_mm.h
@@ -173,7 +173,4 @@ static inline __attribute_const__ int __virt_to_node_shift(void)
173 173
174#endif /* __ASSEMBLY__ */ 174#endif /* __ASSEMBLY__ */
175 175
176#define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \
177 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
178
179#endif /* _M68K_PAGE_MM_H */ 176#endif /* _M68K_PAGE_MM_H */
diff --git a/arch/m68k/kernel/setup_no.c b/arch/m68k/kernel/setup_no.c
index 911ba472e6c4..5b16f5d61b44 100644
--- a/arch/m68k/kernel/setup_no.c
+++ b/arch/m68k/kernel/setup_no.c
@@ -118,7 +118,7 @@ void (*mach_power_off)(void);
118 * 118 *
119 * Returns: 119 * Returns:
120 */ 120 */
121void parse_uboot_commandline(char *commandp, int size) 121static void __init parse_uboot_commandline(char *commandp, int size)
122{ 122{
123 extern unsigned long _init_sp; 123 extern unsigned long _init_sp;
124 unsigned long *sp; 124 unsigned long *sp;
diff --git a/arch/m68k/kernel/signal.c b/arch/m68k/kernel/signal.c
index 2a16df3d9312..57fd286e4b0b 100644
--- a/arch/m68k/kernel/signal.c
+++ b/arch/m68k/kernel/signal.c
@@ -50,6 +50,7 @@
50#include <asm/pgtable.h> 50#include <asm/pgtable.h>
51#include <asm/traps.h> 51#include <asm/traps.h>
52#include <asm/ucontext.h> 52#include <asm/ucontext.h>
53#include <asm/cacheflush.h>
53 54
54#ifdef CONFIG_MMU 55#ifdef CONFIG_MMU
55 56
@@ -181,6 +182,13 @@ static inline void push_cache (unsigned long vaddr)
181 asm volatile ("movec %0,%%caar\n\t" 182 asm volatile ("movec %0,%%caar\n\t"
182 "movec %1,%%cacr" 183 "movec %1,%%cacr"
183 : : "r" (vaddr + 4), "r" (temp)); 184 : : "r" (vaddr + 4), "r" (temp));
185 } else {
186 /* CPU_IS_COLDFIRE */
187#if defined(CONFIG_CACHE_COPYBACK)
188 flush_cf_dcache(0, DCACHE_MAX_ADDR);
189#endif
190 /* Invalidate instruction cache for the pushed bytes */
191 clear_cf_icache(vaddr, vaddr + 8);
184 } 192 }
185} 193}
186 194
diff --git a/arch/m68k/kernel/time.c b/arch/m68k/kernel/time.c
index bea6bcf8f9b8..7eb9792009f8 100644
--- a/arch/m68k/kernel/time.c
+++ b/arch/m68k/kernel/time.c
@@ -90,7 +90,7 @@ static int __init rtc_init(void)
90 return -ENODEV; 90 return -ENODEV;
91 91
92 pdev = platform_device_register_simple("rtc-generic", -1, NULL, 0); 92 pdev = platform_device_register_simple("rtc-generic", -1, NULL, 0);
93 return PTR_RET(pdev); 93 return PTR_ERR_OR_ZERO(pdev);
94} 94}
95 95
96module_init(rtc_init); 96module_init(rtc_init);
diff --git a/arch/m68k/mm/fault.c b/arch/m68k/mm/fault.c
index a563727806bf..eb1d61f68725 100644
--- a/arch/m68k/mm/fault.c
+++ b/arch/m68k/mm/fault.c
@@ -88,6 +88,8 @@ int do_page_fault(struct pt_regs *regs, unsigned long address,
88 if (in_atomic() || !mm) 88 if (in_atomic() || !mm)
89 goto no_context; 89 goto no_context;
90 90
91 if (user_mode(regs))
92 flags |= FAULT_FLAG_USER;
91retry: 93retry:
92 down_read(&mm->mmap_sem); 94 down_read(&mm->mmap_sem);
93 95
diff --git a/arch/m68k/platform/68000/m68328.c b/arch/m68k/platform/68000/m68328.c
index a86eb66835aa..e53caf4c3bfb 100644
--- a/arch/m68k/platform/68000/m68328.c
+++ b/arch/m68k/platform/68000/m68328.c
@@ -15,6 +15,7 @@
15 15
16/***************************************************************************/ 16/***************************************************************************/
17 17
18#include <linux/init.h>
18#include <linux/types.h> 19#include <linux/types.h>
19#include <linux/kernel.h> 20#include <linux/kernel.h>
20#include <linux/rtc.h> 21#include <linux/rtc.h>
@@ -42,7 +43,7 @@ void m68328_reset (void)
42 43
43/***************************************************************************/ 44/***************************************************************************/
44 45
45void config_BSP(char *command, int len) 46void __init config_BSP(char *command, int len)
46{ 47{
47 printk(KERN_INFO "\n68328 support D. Jeff Dionne <jeff@uclinux.org>\n"); 48 printk(KERN_INFO "\n68328 support D. Jeff Dionne <jeff@uclinux.org>\n");
48 printk(KERN_INFO "68328 support Kenneth Albanowski <kjahds@kjshds.com>\n"); 49 printk(KERN_INFO "68328 support Kenneth Albanowski <kjahds@kjshds.com>\n");
diff --git a/arch/m68k/platform/68000/m68EZ328.c b/arch/m68k/platform/68000/m68EZ328.c
index a6eb72d75008..332b5e8605fc 100644
--- a/arch/m68k/platform/68000/m68EZ328.c
+++ b/arch/m68k/platform/68000/m68EZ328.c
@@ -13,6 +13,7 @@
13 13
14/***************************************************************************/ 14/***************************************************************************/
15 15
16#include <linux/init.h>
16#include <linux/types.h> 17#include <linux/types.h>
17#include <linux/kernel.h> 18#include <linux/kernel.h>
18#include <linux/rtc.h> 19#include <linux/rtc.h>
@@ -52,7 +53,7 @@ _bsc1(unsigned char *, gethwaddr, int, a)
52_bsc1(char *, getbenv, char *, a) 53_bsc1(char *, getbenv, char *, a)
53#endif 54#endif
54 55
55void config_BSP(char *command, int len) 56void __init config_BSP(char *command, int len)
56{ 57{
57 unsigned char *p; 58 unsigned char *p;
58 59
diff --git a/arch/m68k/platform/68000/m68VZ328.c b/arch/m68k/platform/68000/m68VZ328.c
index eb6964fbec09..fd6658358af1 100644
--- a/arch/m68k/platform/68000/m68VZ328.c
+++ b/arch/m68k/platform/68000/m68VZ328.c
@@ -14,6 +14,7 @@
14 14
15/***************************************************************************/ 15/***************************************************************************/
16 16
17#include <linux/init.h>
17#include <linux/types.h> 18#include <linux/types.h>
18#include <linux/kernel.h> 19#include <linux/kernel.h>
19#include <linux/kd.h> 20#include <linux/kd.h>
@@ -59,7 +60,7 @@ static void m68vz328_reset(void)
59 ); 60 );
60} 61}
61 62
62static void init_hardware(char *command, int size) 63static void __init init_hardware(char *command, int size)
63{ 64{
64#ifdef CONFIG_DIRECT_IO_ACCESS 65#ifdef CONFIG_DIRECT_IO_ACCESS
65 SCR = 0x10; /* allow user access to internal registers */ 66 SCR = 0x10; /* allow user access to internal registers */
@@ -145,7 +146,7 @@ _bsc0(char *, getserialnum)
145_bsc1(unsigned char *, gethwaddr, int, a) 146_bsc1(unsigned char *, gethwaddr, int, a)
146_bsc1(char *, getbenv, char *, a) 147_bsc1(char *, getbenv, char *, a)
147 148
148static void init_hardware(char *command, int size) 149static void __init init_hardware(char *command, int size)
149{ 150{
150 char *p; 151 char *p;
151 152
@@ -167,7 +168,7 @@ static void m68vz328_reset(void)
167{ 168{
168} 169}
169 170
170static void init_hardware(char *command, int size) 171static void __init init_hardware(char *command, int size)
171{ 172{
172} 173}
173 174
@@ -175,7 +176,7 @@ static void init_hardware(char *command, int size)
175#endif 176#endif
176/***************************************************************************/ 177/***************************************************************************/
177 178
178void config_BSP(char *command, int size) 179void __init config_BSP(char *command, int size)
179{ 180{
180 printk(KERN_INFO "68VZ328 DragonBallVZ support (c) 2001 Lineo, Inc.\n"); 181 printk(KERN_INFO "68VZ328 DragonBallVZ support (c) 2001 Lineo, Inc.\n");
181 182
diff --git a/arch/m68k/platform/68360/commproc.c b/arch/m68k/platform/68360/commproc.c
index 8e4e10cc0080..315727b7ff40 100644
--- a/arch/m68k/platform/68360/commproc.c
+++ b/arch/m68k/platform/68360/commproc.c
@@ -31,6 +31,7 @@
31 */ 31 */
32 32
33#include <linux/errno.h> 33#include <linux/errno.h>
34#include <linux/init.h>
34#include <linux/sched.h> 35#include <linux/sched.h>
35#include <linux/kernel.h> 36#include <linux/kernel.h>
36#include <linux/param.h> 37#include <linux/param.h>
@@ -77,7 +78,7 @@ void m360_cpm_reset(void);
77 78
78 79
79 80
80void m360_cpm_reset() 81void __init m360_cpm_reset()
81{ 82{
82/* pte_t *pte; */ 83/* pte_t *pte; */
83 84
diff --git a/arch/m68k/platform/68360/config.c b/arch/m68k/platform/68360/config.c
index 9877cefad1e7..0570741e5500 100644
--- a/arch/m68k/platform/68360/config.c
+++ b/arch/m68k/platform/68360/config.c
@@ -11,6 +11,7 @@
11 */ 11 */
12 12
13#include <stdarg.h> 13#include <stdarg.h>
14#include <linux/init.h>
14#include <linux/types.h> 15#include <linux/types.h>
15#include <linux/kernel.h> 16#include <linux/kernel.h>
16#include <linux/mm.h> 17#include <linux/mm.h>
@@ -140,7 +141,7 @@ _bsc1(char *, getbenv, char *, a)
140#endif 141#endif
141 142
142 143
143void config_BSP(char *command, int len) 144void __init config_BSP(char *command, int len)
144{ 145{
145 unsigned char *p; 146 unsigned char *p;
146 147
diff --git a/arch/m68k/platform/coldfire/pci.c b/arch/m68k/platform/coldfire/pci.c
index b33f97a13e6d..df9679238b6d 100644
--- a/arch/m68k/platform/coldfire/pci.c
+++ b/arch/m68k/platform/coldfire/pci.c
@@ -319,7 +319,6 @@ static int __init mcf_pci_init(void)
319 pci_fixup_irqs(pci_common_swizzle, mcf_pci_map_irq); 319 pci_fixup_irqs(pci_common_swizzle, mcf_pci_map_irq);
320 pci_bus_size_bridges(rootbus); 320 pci_bus_size_bridges(rootbus);
321 pci_bus_assign_resources(rootbus); 321 pci_bus_assign_resources(rootbus);
322 pci_enable_bridges(rootbus);
323 return 0; 322 return 0;
324} 323}
325 324
diff --git a/arch/m68k/q40/config.c b/arch/m68k/q40/config.c
index 658542b914fc..078bb744b5fe 100644
--- a/arch/m68k/q40/config.c
+++ b/arch/m68k/q40/config.c
@@ -338,6 +338,6 @@ static __init int q40_add_kbd_device(void)
338 return -ENODEV; 338 return -ENODEV;
339 339
340 pdev = platform_device_register_simple("q40kbd", -1, NULL, 0); 340 pdev = platform_device_register_simple("q40kbd", -1, NULL, 0);
341 return PTR_RET(pdev); 341 return PTR_ERR_OR_ZERO(pdev);
342} 342}
343arch_initcall(q40_add_kbd_device); 343arch_initcall(q40_add_kbd_device);
diff --git a/arch/metag/Kconfig b/arch/metag/Kconfig
index cfd831c29824..36368eb07e13 100644
--- a/arch/metag/Kconfig
+++ b/arch/metag/Kconfig
@@ -13,7 +13,6 @@ config METAG
13 select HAVE_FTRACE_MCOUNT_RECORD 13 select HAVE_FTRACE_MCOUNT_RECORD
14 select HAVE_FUNCTION_TRACER 14 select HAVE_FUNCTION_TRACER
15 select HAVE_FUNCTION_TRACE_MCOUNT_TEST 15 select HAVE_FUNCTION_TRACE_MCOUNT_TEST
16 select HAVE_GENERIC_HARDIRQS
17 select HAVE_KERNEL_BZIP2 16 select HAVE_KERNEL_BZIP2
18 select HAVE_KERNEL_GZIP 17 select HAVE_KERNEL_GZIP
19 select HAVE_KERNEL_LZO 18 select HAVE_KERNEL_LZO
diff --git a/arch/metag/Kconfig.soc b/arch/metag/Kconfig.soc
index 2a3c860c7525..973640f46752 100644
--- a/arch/metag/Kconfig.soc
+++ b/arch/metag/Kconfig.soc
@@ -16,6 +16,8 @@ config META21_FPGA
16 16
17config SOC_TZ1090 17config SOC_TZ1090
18 bool "Toumaz Xenif TZ1090 SoC (Comet)" 18 bool "Toumaz Xenif TZ1090 SoC (Comet)"
19 select ARCH_WANT_OPTIONAL_GPIOLIB
20 select IMGPDC_IRQ
19 select METAG_LNKGET_AROUND_CACHE 21 select METAG_LNKGET_AROUND_CACHE
20 select METAG_META21 22 select METAG_META21
21 select METAG_SMP_WRITE_REORDERING 23 select METAG_SMP_WRITE_REORDERING
diff --git a/arch/metag/boot/dts/tz1090.dtsi b/arch/metag/boot/dts/tz1090.dtsi
index 853744652b93..24ea7d2e9138 100644
--- a/arch/metag/boot/dts/tz1090.dtsi
+++ b/arch/metag/boot/dts/tz1090.dtsi
@@ -8,6 +8,8 @@
8 8
9#include "skeleton.dtsi" 9#include "skeleton.dtsi"
10 10
11#include <dt-bindings/interrupt-controller/irq.h>
12
11/ { 13/ {
12 compatible = "toumaz,tz1090", "img,meta"; 14 compatible = "toumaz,tz1090", "img,meta";
13 15
@@ -26,6 +28,22 @@
26 #size-cells = <1>; 28 #size-cells = <1>;
27 ranges; 29 ranges;
28 30
31 pdc: pdc@0x02006000 {
32 interrupt-controller;
33 #interrupt-cells = <2>;
34
35 reg = <0x02006000 0x1000>;
36 compatible = "img,pdc-intc";
37
38 num-perips = <3>;
39 num-syswakes = <3>;
40
41 interrupts = <18 IRQ_TYPE_LEVEL_HIGH>, /* Syswakes */
42 <30 IRQ_TYPE_LEVEL_HIGH>, /* Perip 0 (RTC) */
43 <29 IRQ_TYPE_LEVEL_HIGH>, /* Perip 1 (IR) */
44 <31 IRQ_TYPE_LEVEL_HIGH>; /* Perip 2 (WDT) */
45 };
46
29 pinctrl: pinctrl@02005800 { 47 pinctrl: pinctrl@02005800 {
30 #gpio-range-cells = <3>; 48 #gpio-range-cells = <3>;
31 compatible = "img,tz1090-pinctrl"; 49 compatible = "img,tz1090-pinctrl";
@@ -37,5 +55,54 @@
37 compatible = "img,tz1090-pdc-pinctrl"; 55 compatible = "img,tz1090-pdc-pinctrl";
38 reg = <0x02006500 0x100>; 56 reg = <0x02006500 0x100>;
39 }; 57 };
58
59 gpios: gpios@02005800 {
60 #address-cells = <1>;
61 #size-cells = <0>;
62 compatible = "img,tz1090-gpio";
63 reg = <0x02005800 0x90>;
64
65 gpios0: bank@0 {
66 gpio-controller;
67 interrupt-controller;
68 #gpio-cells = <2>;
69 #interrupt-cells = <2>;
70 reg = <0>;
71 interrupts = <13 IRQ_TYPE_LEVEL_HIGH>;
72 gpio-ranges = <&pinctrl 0 0 30>;
73 };
74 gpios1: bank@1 {
75 gpio-controller;
76 interrupt-controller;
77 #gpio-cells = <2>;
78 #interrupt-cells = <2>;
79 reg = <1>;
80 interrupts = <14 IRQ_TYPE_LEVEL_HIGH>;
81 gpio-ranges = <&pinctrl 0 30 30>;
82 };
83 gpios2: bank@2 {
84 gpio-controller;
85 interrupt-controller;
86 #gpio-cells = <2>;
87 #interrupt-cells = <2>;
88 reg = <2>;
89 interrupts = <15 IRQ_TYPE_LEVEL_HIGH>;
90 gpio-ranges = <&pinctrl 0 60 30>;
91 };
92 };
93
94 pdc_gpios: gpios@02006500 {
95 gpio-controller;
96 #gpio-cells = <2>;
97
98 compatible = "img,tz1090-pdc-gpio";
99 reg = <0x02006500 0x100>;
100
101 interrupt-parent = <&pdc>;
102 interrupts = <8 IRQ_TYPE_NONE>,
103 <9 IRQ_TYPE_NONE>,
104 <10 IRQ_TYPE_NONE>;
105 gpio-ranges = <&pdc_pinctrl 0 0 7>;
106 };
40 }; 107 };
41}; 108};
diff --git a/arch/metag/mm/fault.c b/arch/metag/mm/fault.c
index 8fddf46e6c62..332680e5ebf2 100644
--- a/arch/metag/mm/fault.c
+++ b/arch/metag/mm/fault.c
@@ -53,8 +53,7 @@ int do_page_fault(struct pt_regs *regs, unsigned long address,
53 struct vm_area_struct *vma, *prev_vma; 53 struct vm_area_struct *vma, *prev_vma;
54 siginfo_t info; 54 siginfo_t info;
55 int fault; 55 int fault;
56 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE | 56 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
57 (write_access ? FAULT_FLAG_WRITE : 0);
58 57
59 tsk = current; 58 tsk = current;
60 59
@@ -109,6 +108,8 @@ int do_page_fault(struct pt_regs *regs, unsigned long address,
109 if (in_atomic() || !mm) 108 if (in_atomic() || !mm)
110 goto no_context; 109 goto no_context;
111 110
111 if (user_mode(regs))
112 flags |= FAULT_FLAG_USER;
112retry: 113retry:
113 down_read(&mm->mmap_sem); 114 down_read(&mm->mmap_sem);
114 115
@@ -121,6 +122,7 @@ good_area:
121 if (write_access) { 122 if (write_access) {
122 if (!(vma->vm_flags & VM_WRITE)) 123 if (!(vma->vm_flags & VM_WRITE))
123 goto bad_area; 124 goto bad_area;
125 flags |= FAULT_FLAG_WRITE;
124 } else { 126 } else {
125 if (!(vma->vm_flags & (VM_READ | VM_EXEC | VM_WRITE))) 127 if (!(vma->vm_flags & (VM_READ | VM_EXEC | VM_WRITE)))
126 goto bad_area; 128 goto bad_area;
diff --git a/arch/metag/mm/hugetlbpage.c b/arch/metag/mm/hugetlbpage.c
index 3c52fa6d0f8e..042431509b56 100644
--- a/arch/metag/mm/hugetlbpage.c
+++ b/arch/metag/mm/hugetlbpage.c
@@ -110,6 +110,11 @@ int pud_huge(pud_t pud)
110 return 0; 110 return 0;
111} 111}
112 112
113int pmd_huge_support(void)
114{
115 return 1;
116}
117
113struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address, 118struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address,
114 pmd_t *pmd, int write) 119 pmd_t *pmd, int write)
115{ 120{
diff --git a/arch/metag/mm/init.c b/arch/metag/mm/init.c
index 28813f164730..123919534b80 100644
--- a/arch/metag/mm/init.c
+++ b/arch/metag/mm/init.c
@@ -407,10 +407,9 @@ void free_initrd_mem(unsigned long start, unsigned long end)
407#endif 407#endif
408 408
409#ifdef CONFIG_OF_FLATTREE 409#ifdef CONFIG_OF_FLATTREE
410void __init early_init_dt_setup_initrd_arch(unsigned long start, 410void __init early_init_dt_setup_initrd_arch(u64 start, u64 end)
411 unsigned long end)
412{ 411{
413 pr_err("%s(%lx, %lx)\n", 412 pr_err("%s(%llx, %llx)\n",
414 __func__, start, end); 413 __func__, start, end);
415} 414}
416#endif /* CONFIG_OF_FLATTREE */ 415#endif /* CONFIG_OF_FLATTREE */
diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig
index 4fab52294d98..b82f82b74319 100644
--- a/arch/microblaze/Kconfig
+++ b/arch/microblaze/Kconfig
@@ -18,7 +18,6 @@ config MICROBLAZE
18 select ARCH_WANT_IPC_PARSE_VERSION 18 select ARCH_WANT_IPC_PARSE_VERSION
19 select HAVE_DEBUG_KMEMLEAK 19 select HAVE_DEBUG_KMEMLEAK
20 select IRQ_DOMAIN 20 select IRQ_DOMAIN
21 select HAVE_GENERIC_HARDIRQS
22 select VIRT_TO_BUS 21 select VIRT_TO_BUS
23 select GENERIC_IRQ_PROBE 22 select GENERIC_IRQ_PROBE
24 select GENERIC_IRQ_SHOW 23 select GENERIC_IRQ_SHOW
@@ -29,6 +28,7 @@ config MICROBLAZE
29 select GENERIC_IDLE_POLL_SETUP 28 select GENERIC_IDLE_POLL_SETUP
30 select MODULES_USE_ELF_RELA 29 select MODULES_USE_ELF_RELA
31 select CLONE_BACKWARDS3 30 select CLONE_BACKWARDS3
31 select CLKSRC_OF
32 32
33config SWAP 33config SWAP
34 def_bool n 34 def_bool n
diff --git a/arch/microblaze/Makefile b/arch/microblaze/Makefile
index 0a603d3ecf24..40350a3c24e9 100644
--- a/arch/microblaze/Makefile
+++ b/arch/microblaze/Makefile
@@ -72,7 +72,7 @@ all: linux.bin
72archclean: 72archclean:
73 $(Q)$(MAKE) $(clean)=$(boot) 73 $(Q)$(MAKE) $(clean)=$(boot)
74 74
75linux.bin linux.bin.gz: vmlinux 75linux.bin linux.bin.gz linux.bin.ub: vmlinux
76 $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ 76 $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
77 77
78simpleImage.%: vmlinux 78simpleImage.%: vmlinux
@@ -81,6 +81,7 @@ simpleImage.%: vmlinux
81define archhelp 81define archhelp
82 echo '* linux.bin - Create raw binary' 82 echo '* linux.bin - Create raw binary'
83 echo ' linux.bin.gz - Create compressed raw binary' 83 echo ' linux.bin.gz - Create compressed raw binary'
84 echo ' linux.bin.ub - Create U-Boot wrapped raw binary'
84 echo ' simpleImage.<dt> - ELF image with $(arch)/boot/dts/<dt>.dts linked in' 85 echo ' simpleImage.<dt> - ELF image with $(arch)/boot/dts/<dt>.dts linked in'
85 echo ' - stripped elf with fdt blob' 86 echo ' - stripped elf with fdt blob'
86 echo ' simpleImage.<dt>.unstrip - full ELF image with fdt blob' 87 echo ' simpleImage.<dt>.unstrip - full ELF image with fdt blob'
diff --git a/arch/microblaze/boot/Makefile b/arch/microblaze/boot/Makefile
index 80fe54fb7ca3..8e211cc28dac 100644
--- a/arch/microblaze/boot/Makefile
+++ b/arch/microblaze/boot/Makefile
@@ -2,12 +2,15 @@
2# arch/microblaze/boot/Makefile 2# arch/microblaze/boot/Makefile
3# 3#
4 4
5targets := linux.bin linux.bin.gz simpleImage.% 5targets := linux.bin linux.bin.gz linux.bin.ub simpleImage.%
6 6
7OBJCOPYFLAGS := -R .note -R .comment -R .note.gnu.build-id -O binary 7OBJCOPYFLAGS := -R .note -R .comment -R .note.gnu.build-id -O binary
8 8
9$(obj)/linux.bin: vmlinux FORCE 9$(obj)/linux.bin: vmlinux FORCE
10 $(call if_changed,objcopy) 10 $(call if_changed,objcopy)
11 @echo 'Kernel: $@ is ready' ' (#'`cat .version`')'
12
13$(obj)/linux.bin.ub: $(obj)/linux.bin FORCE
11 $(call if_changed,uimage) 14 $(call if_changed,uimage)
12 @echo 'Kernel: $@ is ready' ' (#'`cat .version`')' 15 @echo 'Kernel: $@ is ready' ' (#'`cat .version`')'
13 16
@@ -22,8 +25,6 @@ quiet_cmd_strip = STRIP $@
22 cmd_strip = $(STRIP) -K microblaze_start -K _end -K __log_buf \ 25 cmd_strip = $(STRIP) -K microblaze_start -K _end -K __log_buf \
23 -K _fdt_start vmlinux -o $@ 26 -K _fdt_start vmlinux -o $@
24 27
25UIMAGE_IN = $@
26UIMAGE_OUT = $@.ub
27UIMAGE_LOADADDR = $(CONFIG_KERNEL_BASE_ADDR) 28UIMAGE_LOADADDR = $(CONFIG_KERNEL_BASE_ADDR)
28 29
29$(obj)/simpleImage.%: vmlinux FORCE 30$(obj)/simpleImage.%: vmlinux FORCE
diff --git a/arch/microblaze/include/asm/prom.h b/arch/microblaze/include/asm/prom.h
index 20c5e8e5121b..9977816c5ad3 100644
--- a/arch/microblaze/include/asm/prom.h
+++ b/arch/microblaze/include/asm/prom.h
@@ -50,9 +50,6 @@ void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop,
50 50
51extern void kdump_move_device_tree(void); 51extern void kdump_move_device_tree(void);
52 52
53/* CPU OF node matching */
54struct device_node *of_get_cpu_node(int cpu, unsigned int *thread);
55
56#endif /* __ASSEMBLY__ */ 53#endif /* __ASSEMBLY__ */
57#endif /* __KERNEL__ */ 54#endif /* __KERNEL__ */
58 55
diff --git a/arch/microblaze/include/asm/selfmod.h b/arch/microblaze/include/asm/selfmod.h
deleted file mode 100644
index c42aff2e6cd0..000000000000
--- a/arch/microblaze/include/asm/selfmod.h
+++ /dev/null
@@ -1,24 +0,0 @@
1/*
2 * Copyright (C) 2007-2008 Michal Simek <monstr@monstr.eu>
3 *
4 * This file is subject to the terms and conditions of the GNU General Public
5 * License. See the file "COPYING" in the main directory of this archive
6 * for more details.
7 */
8
9#ifndef _ASM_MICROBLAZE_SELFMOD_H
10#define _ASM_MICROBLAZE_SELFMOD_H
11
12/*
13 * BARRIER_BASE_ADDR is constant address for selfmod function.
14 * do not change this value - selfmod function is in
15 * arch/microblaze/kernel/selfmod.c: selfmod_function()
16 *
17 * last 16 bits is used for storing register offset
18 */
19
20#define BARRIER_BASE_ADDR 0x1234ff00
21
22void selfmod_function(const int *arr_fce, const unsigned int base);
23
24#endif /* _ASM_MICROBLAZE_SELFMOD_H */
diff --git a/arch/microblaze/kernel/Makefile b/arch/microblaze/kernel/Makefile
index 928c950fc14c..5b0e512c78e5 100644
--- a/arch/microblaze/kernel/Makefile
+++ b/arch/microblaze/kernel/Makefile
@@ -7,7 +7,6 @@ ifdef CONFIG_FUNCTION_TRACER
7CFLAGS_REMOVE_timer.o = -pg 7CFLAGS_REMOVE_timer.o = -pg
8CFLAGS_REMOVE_intc.o = -pg 8CFLAGS_REMOVE_intc.o = -pg
9CFLAGS_REMOVE_early_printk.o = -pg 9CFLAGS_REMOVE_early_printk.o = -pg
10CFLAGS_REMOVE_selfmod.o = -pg
11CFLAGS_REMOVE_heartbeat.o = -pg 10CFLAGS_REMOVE_heartbeat.o = -pg
12CFLAGS_REMOVE_ftrace.o = -pg 11CFLAGS_REMOVE_ftrace.o = -pg
13CFLAGS_REMOVE_process.o = -pg 12CFLAGS_REMOVE_process.o = -pg
@@ -23,7 +22,6 @@ obj-y += dma.o exceptions.o \
23obj-y += cpu/ 22obj-y += cpu/
24 23
25obj-$(CONFIG_EARLY_PRINTK) += early_printk.o 24obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
26obj-$(CONFIG_SELFMOD) += selfmod.o
27obj-$(CONFIG_HEART_BEAT) += heartbeat.o 25obj-$(CONFIG_HEART_BEAT) += heartbeat.o
28obj-$(CONFIG_MODULES) += microblaze_ksyms.o module.o 26obj-$(CONFIG_MODULES) += microblaze_ksyms.o module.o
29obj-$(CONFIG_MMU) += misc.o 27obj-$(CONFIG_MMU) += misc.o
diff --git a/arch/microblaze/kernel/cpu/cpuinfo.c b/arch/microblaze/kernel/cpu/cpuinfo.c
index 410398f6db55..c9203b1007aa 100644
--- a/arch/microblaze/kernel/cpu/cpuinfo.c
+++ b/arch/microblaze/kernel/cpu/cpuinfo.c
@@ -39,6 +39,8 @@ const struct cpu_ver_key cpu_ver_lookup[] = {
39 {"8.30.a", 0x17}, 39 {"8.30.a", 0x17},
40 {"8.40.a", 0x18}, 40 {"8.40.a", 0x18},
41 {"8.40.b", 0x19}, 41 {"8.40.b", 0x19},
42 {"9.0", 0x1b},
43 {"9.1", 0x1d},
42 {NULL, 0}, 44 {NULL, 0},
43}; 45};
44 46
diff --git a/arch/microblaze/kernel/intc.c b/arch/microblaze/kernel/intc.c
index d85fa3a2b0f8..581451ad4687 100644
--- a/arch/microblaze/kernel/intc.c
+++ b/arch/microblaze/kernel/intc.c
@@ -1,5 +1,6 @@
1/* 1/*
2 * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu> 2 * Copyright (C) 2007-2013 Michal Simek <monstr@monstr.eu>
3 * Copyright (C) 2012-2013 Xilinx, Inc.
3 * Copyright (C) 2007-2009 PetaLogix 4 * Copyright (C) 2007-2009 PetaLogix
4 * Copyright (C) 2006 Atmark Techno, Inc. 5 * Copyright (C) 2006 Atmark Techno, Inc.
5 * 6 *
@@ -8,23 +9,15 @@
8 * for more details. 9 * for more details.
9 */ 10 */
10 11
11#include <linux/init.h>
12#include <linux/irqdomain.h> 12#include <linux/irqdomain.h>
13#include <linux/irq.h> 13#include <linux/irq.h>
14#include <asm/page.h> 14#include <linux/of_address.h>
15#include <linux/io.h> 15#include <linux/io.h>
16#include <linux/bug.h> 16#include <linux/bug.h>
17 17
18#include <asm/prom.h> 18#include "../../drivers/irqchip/irqchip.h"
19#include <asm/irq.h>
20 19
21#ifdef CONFIG_SELFMOD_INTC 20static void __iomem *intc_baseaddr;
22#include <asm/selfmod.h>
23#define INTC_BASE BARRIER_BASE_ADDR
24#else
25static unsigned int intc_baseaddr;
26#define INTC_BASE intc_baseaddr
27#endif
28 21
29/* No one else should require these constants, so define them locally here. */ 22/* No one else should require these constants, so define them locally here. */
30#define ISR 0x00 /* Interrupt Status Register */ 23#define ISR 0x00 /* Interrupt Status Register */
@@ -50,21 +43,21 @@ static void intc_enable_or_unmask(struct irq_data *d)
50 * acks the irq before calling the interrupt handler 43 * acks the irq before calling the interrupt handler
51 */ 44 */
52 if (irqd_is_level_type(d)) 45 if (irqd_is_level_type(d))
53 out_be32(INTC_BASE + IAR, mask); 46 out_be32(intc_baseaddr + IAR, mask);
54 47
55 out_be32(INTC_BASE + SIE, mask); 48 out_be32(intc_baseaddr + SIE, mask);
56} 49}
57 50
58static void intc_disable_or_mask(struct irq_data *d) 51static void intc_disable_or_mask(struct irq_data *d)
59{ 52{
60 pr_debug("disable: %ld\n", d->hwirq); 53 pr_debug("disable: %ld\n", d->hwirq);
61 out_be32(INTC_BASE + CIE, 1 << d->hwirq); 54 out_be32(intc_baseaddr + CIE, 1 << d->hwirq);
62} 55}
63 56
64static void intc_ack(struct irq_data *d) 57static void intc_ack(struct irq_data *d)
65{ 58{
66 pr_debug("ack: %ld\n", d->hwirq); 59 pr_debug("ack: %ld\n", d->hwirq);
67 out_be32(INTC_BASE + IAR, 1 << d->hwirq); 60 out_be32(intc_baseaddr + IAR, 1 << d->hwirq);
68} 61}
69 62
70static void intc_mask_ack(struct irq_data *d) 63static void intc_mask_ack(struct irq_data *d)
@@ -72,8 +65,8 @@ static void intc_mask_ack(struct irq_data *d)
72 unsigned long mask = 1 << d->hwirq; 65 unsigned long mask = 1 << d->hwirq;
73 66
74 pr_debug("disable_and_ack: %ld\n", d->hwirq); 67 pr_debug("disable_and_ack: %ld\n", d->hwirq);
75 out_be32(INTC_BASE + CIE, mask); 68 out_be32(intc_baseaddr + CIE, mask);
76 out_be32(INTC_BASE + IAR, mask); 69 out_be32(intc_baseaddr + IAR, mask);
77} 70}
78 71
79static struct irq_chip intc_dev = { 72static struct irq_chip intc_dev = {
@@ -90,7 +83,7 @@ unsigned int get_irq(void)
90{ 83{
91 unsigned int hwirq, irq = -1; 84 unsigned int hwirq, irq = -1;
92 85
93 hwirq = in_be32(INTC_BASE + IVR); 86 hwirq = in_be32(intc_baseaddr + IVR);
94 if (hwirq != -1U) 87 if (hwirq != -1U)
95 irq = irq_find_mapping(root_domain, hwirq); 88 irq = irq_find_mapping(root_domain, hwirq);
96 89
@@ -120,40 +113,32 @@ static const struct irq_domain_ops xintc_irq_domain_ops = {
120 .map = xintc_map, 113 .map = xintc_map,
121}; 114};
122 115
123void __init init_IRQ(void) 116static int __init xilinx_intc_of_init(struct device_node *intc,
117 struct device_node *parent)
124{ 118{
125 u32 nr_irq, intr_mask; 119 u32 nr_irq, intr_mask;
126 struct device_node *intc = NULL; 120 int ret;
127#ifdef CONFIG_SELFMOD_INTC 121
128 unsigned int intc_baseaddr = 0; 122 intc_baseaddr = of_iomap(intc, 0);
129 static int arr_func[] = { 123 BUG_ON(!intc_baseaddr);
130 (int)&get_irq, 124
131 (int)&intc_enable_or_unmask, 125 ret = of_property_read_u32(intc, "xlnx,num-intr-inputs", &nr_irq);
132 (int)&intc_disable_or_mask, 126 if (ret < 0) {
133 (int)&intc_mask_ack, 127 pr_err("%s: unable to read xlnx,num-intr-inputs\n", __func__);
134 (int)&intc_ack, 128 return -EINVAL;
135 (int)&intc_end, 129 }
136 0 130
137 }; 131 ret = of_property_read_u32(intc, "xlnx,kind-of-intr", &intr_mask);
138#endif 132 if (ret < 0) {
139 intc = of_find_compatible_node(NULL, NULL, "xlnx,xps-intc-1.00.a"); 133 pr_err("%s: unable to read xlnx,kind-of-intr\n", __func__);
140 BUG_ON(!intc); 134 return -EINVAL;
141 135 }
142 intc_baseaddr = be32_to_cpup(of_get_property(intc, "reg", NULL)); 136
143 intc_baseaddr = (unsigned long) ioremap(intc_baseaddr, PAGE_SIZE);
144 nr_irq = be32_to_cpup(of_get_property(intc,
145 "xlnx,num-intr-inputs", NULL));
146
147 intr_mask =
148 be32_to_cpup(of_get_property(intc, "xlnx,kind-of-intr", NULL));
149 if (intr_mask > (u32)((1ULL << nr_irq) - 1)) 137 if (intr_mask > (u32)((1ULL << nr_irq) - 1))
150 pr_info(" ERROR: Mismatch in kind-of-intr param\n"); 138 pr_info(" ERROR: Mismatch in kind-of-intr param\n");
151 139
152#ifdef CONFIG_SELFMOD_INTC 140 pr_info("%s: num_irq=%d, edge=0x%x\n",
153 selfmod_function((int *) arr_func, intc_baseaddr); 141 intc->full_name, nr_irq, intr_mask);
154#endif
155 pr_info("%s #0 at 0x%08x, num_irq=%d, edge=0x%x\n",
156 intc->name, intc_baseaddr, nr_irq, intr_mask);
157 142
158 /* 143 /*
159 * Disable all external interrupts until they are 144 * Disable all external interrupts until they are
@@ -174,4 +159,8 @@ void __init init_IRQ(void)
174 (void *)intr_mask); 159 (void *)intr_mask);
175 160
176 irq_set_default_host(root_domain); 161 irq_set_default_host(root_domain);
162
163 return 0;
177} 164}
165
166IRQCHIP_DECLARE(xilinx_intc, "xlnx,xps-intc-1.00.a", xilinx_intc_of_init);
diff --git a/arch/microblaze/kernel/irq.c b/arch/microblaze/kernel/irq.c
index ace700afbfdf..11e24de91aa4 100644
--- a/arch/microblaze/kernel/irq.c
+++ b/arch/microblaze/kernel/irq.c
@@ -17,10 +17,8 @@
17#include <linux/seq_file.h> 17#include <linux/seq_file.h>
18#include <linux/kernel_stat.h> 18#include <linux/kernel_stat.h>
19#include <linux/irq.h> 19#include <linux/irq.h>
20#include <linux/irqchip.h>
20#include <linux/of_irq.h> 21#include <linux/of_irq.h>
21#include <linux/export.h>
22
23#include <asm/prom.h>
24 22
25static u32 concurrent_irq; 23static u32 concurrent_irq;
26 24
@@ -47,3 +45,9 @@ next_irq:
47 set_irq_regs(old_regs); 45 set_irq_regs(old_regs);
48 trace_hardirqs_on(); 46 trace_hardirqs_on();
49} 47}
48
49void __init init_IRQ(void)
50{
51 /* process the entire interrupt tree in one go */
52 irqchip_init();
53}
diff --git a/arch/microblaze/kernel/prom.c b/arch/microblaze/kernel/prom.c
index 0a2c68f9f9b0..0c4453f134cb 100644
--- a/arch/microblaze/kernel/prom.c
+++ b/arch/microblaze/kernel/prom.c
@@ -46,11 +46,6 @@ void __init early_init_dt_add_memory_arch(u64 base, u64 size)
46 memblock_add(base, size); 46 memblock_add(base, size);
47} 47}
48 48
49void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align)
50{
51 return __va(memblock_alloc(size, align));
52}
53
54#ifdef CONFIG_EARLY_PRINTK 49#ifdef CONFIG_EARLY_PRINTK
55static char *stdout; 50static char *stdout;
56 51
@@ -136,8 +131,7 @@ void __init early_init_devtree(void *params)
136} 131}
137 132
138#ifdef CONFIG_BLK_DEV_INITRD 133#ifdef CONFIG_BLK_DEV_INITRD
139void __init early_init_dt_setup_initrd_arch(unsigned long start, 134void __init early_init_dt_setup_initrd_arch(u64 start, u64 end)
140 unsigned long end)
141{ 135{
142 initrd_start = (unsigned long)__va(start); 136 initrd_start = (unsigned long)__va(start);
143 initrd_end = (unsigned long)__va(end); 137 initrd_end = (unsigned long)__va(end);
diff --git a/arch/microblaze/kernel/reset.c b/arch/microblaze/kernel/reset.c
index 2e5079ab53d2..fbe58c6554a8 100644
--- a/arch/microblaze/kernel/reset.c
+++ b/arch/microblaze/kernel/reset.c
@@ -67,7 +67,11 @@ static void gpio_system_reset(void)
67 pr_notice("Reset GPIO unavailable - halting!\n"); 67 pr_notice("Reset GPIO unavailable - halting!\n");
68} 68}
69#else 69#else
70#define gpio_system_reset() do {} while (0) 70static void gpio_system_reset(void)
71{
72 pr_notice("No reset GPIO present - halting!\n");
73}
74
71void of_platform_reset_gpio_probe(void) 75void of_platform_reset_gpio_probe(void)
72{ 76{
73 return; 77 return;
diff --git a/arch/microblaze/kernel/selfmod.c b/arch/microblaze/kernel/selfmod.c
deleted file mode 100644
index 89508bdc9f3c..000000000000
--- a/arch/microblaze/kernel/selfmod.c
+++ /dev/null
@@ -1,81 +0,0 @@
1/*
2 * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu>
3 * Copyright (C) 2009 PetaLogix
4 *
5 * This file is subject to the terms and conditions of the GNU General Public
6 * License. See the file "COPYING" in the main directory of this archive
7 * for more details.
8 */
9
10#include <linux/interrupt.h>
11#include <asm/selfmod.h>
12
13#undef DEBUG
14
15#if __GNUC__ > 3
16#error GCC 4 unsupported SELFMOD. Please disable SELFMOD from menuconfig.
17#endif
18
19#define OPCODE_IMM 0xB0000000
20#define OPCODE_LWI 0xE8000000
21#define OPCODE_LWI_MASK 0xEC000000
22#define OPCODE_RTSD 0xB60F0008 /* return from func: rtsd r15, 8 */
23#define OPCODE_ADDIK 0x30000000
24#define OPCODE_ADDIK_MASK 0xFC000000
25
26#define IMM_BASE (OPCODE_IMM | (BARRIER_BASE_ADDR >> 16))
27#define LWI_BASE (OPCODE_LWI | (BARRIER_BASE_ADDR & 0x0000ff00))
28#define LWI_BASE_MASK (OPCODE_LWI_MASK | (BARRIER_BASE_ADDR & 0x0000ff00))
29#define ADDIK_BASE (OPCODE_ADDIK | (BARRIER_BASE_ADDR & 0x0000ff00))
30#define ADDIK_BASE_MASK (OPCODE_ADDIK_MASK | (BARRIER_BASE_ADDR & 0x0000ff00))
31
32#define MODIFY_INSTR { \
33 pr_debug("%s: curr instr, (%d):0x%x, next(%d):0x%x\n", \
34 __func__, i, addr[i], i + 1, addr[i + 1]); \
35 addr[i] = OPCODE_IMM + (base >> 16); \
36 /* keep instruction opcode and add only last 16bits */ \
37 addr[i + 1] = (addr[i + 1] & 0xffff00ff) + (base & 0xffff); \
38 __invalidate_icache(addr[i]); \
39 __invalidate_icache(addr[i + 1]); \
40 pr_debug("%s: hack instr, (%d):0x%x, next(%d):0x%x\n", \
41 __func__, i, addr[i], i + 1, addr[i + 1]); }
42
43/* NOTE
44 * self-modified part of code for improvement of interrupt controller
45 * save instruction in interrupt rutine
46 */
47void selfmod_function(const int *arr_fce, const unsigned int base)
48{
49 unsigned int flags, i, j, *addr = NULL;
50
51 local_irq_save(flags);
52 __disable_icache();
53
54 /* zero terminated array */
55 for (j = 0; arr_fce[j] != 0; j++) {
56 /* get start address of function */
57 addr = (unsigned int *) arr_fce[j];
58 pr_debug("%s: func(%d) at 0x%x\n",
59 __func__, j, (unsigned int) addr);
60 for (i = 0; ; i++) {
61 pr_debug("%s: instruction code at %d: 0x%x\n",
62 __func__, i, addr[i]);
63 if (addr[i] == IMM_BASE) {
64 /* detecting of lwi (0xE8) or swi (0xF8) instr
65 * I can detect both opcode with one mask */
66 if ((addr[i + 1] & LWI_BASE_MASK) == LWI_BASE) {
67 MODIFY_INSTR;
68 } else /* detection addik for ack */
69 if ((addr[i + 1] & ADDIK_BASE_MASK) ==
70 ADDIK_BASE) {
71 MODIFY_INSTR;
72 }
73 } else if (addr[i] == OPCODE_RTSD) {
74 /* return from function means end of function */
75 pr_debug("%s: end of array %d\n", __func__, i);
76 break;
77 }
78 }
79 }
80 local_irq_restore(flags);
81} /* end of self-modified code */
diff --git a/arch/microblaze/kernel/setup.c b/arch/microblaze/kernel/setup.c
index 0263da7b83dd..0775e036c526 100644
--- a/arch/microblaze/kernel/setup.c
+++ b/arch/microblaze/kernel/setup.c
@@ -9,6 +9,7 @@
9 */ 9 */
10 10
11#include <linux/init.h> 11#include <linux/init.h>
12#include <linux/clocksource.h>
12#include <linux/string.h> 13#include <linux/string.h>
13#include <linux/seq_file.h> 14#include <linux/seq_file.h>
14#include <linux/cpu.h> 15#include <linux/cpu.h>
@@ -68,10 +69,6 @@ void __init setup_arch(char **cmdline_p)
68 69
69 xilinx_pci_init(); 70 xilinx_pci_init();
70 71
71#if defined(CONFIG_SELFMOD_INTC) || defined(CONFIG_SELFMOD_TIMER)
72 pr_notice("Self modified code enable\n");
73#endif
74
75#ifdef CONFIG_VT 72#ifdef CONFIG_VT
76#if defined(CONFIG_XILINX_CONSOLE) 73#if defined(CONFIG_XILINX_CONSOLE)
77 conswitchp = &xil_con; 74 conswitchp = &xil_con;
@@ -196,6 +193,11 @@ void __init machine_early_init(const char *cmdline, unsigned int ram,
196 per_cpu(CURRENT_SAVE, 0) = (unsigned long)current; 193 per_cpu(CURRENT_SAVE, 0) = (unsigned long)current;
197} 194}
198 195
196void __init time_init(void)
197{
198 clocksource_of_init();
199}
200
199#ifdef CONFIG_DEBUG_FS 201#ifdef CONFIG_DEBUG_FS
200struct dentry *of_debugfs_root; 202struct dentry *of_debugfs_root;
201 203
diff --git a/arch/microblaze/kernel/timer.c b/arch/microblaze/kernel/timer.c
index aec5020a6e31..e4b3f33ef34c 100644
--- a/arch/microblaze/kernel/timer.c
+++ b/arch/microblaze/kernel/timer.c
@@ -1,5 +1,6 @@
1/* 1/*
2 * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu> 2 * Copyright (C) 2007-2013 Michal Simek <monstr@monstr.eu>
3 * Copyright (C) 2012-2013 Xilinx, Inc.
3 * Copyright (C) 2007-2009 PetaLogix 4 * Copyright (C) 2007-2009 PetaLogix
4 * Copyright (C) 2006 Atmark Techno, Inc. 5 * Copyright (C) 2006 Atmark Techno, Inc.
5 * 6 *
@@ -8,34 +9,16 @@
8 * for more details. 9 * for more details.
9 */ 10 */
10 11
11#include <linux/init.h>
12#include <linux/kernel.h>
13#include <linux/param.h>
14#include <linux/interrupt.h> 12#include <linux/interrupt.h>
15#include <linux/profile.h>
16#include <linux/irq.h>
17#include <linux/delay.h> 13#include <linux/delay.h>
18#include <linux/sched.h> 14#include <linux/sched.h>
19#include <linux/spinlock.h>
20#include <linux/err.h>
21#include <linux/clk.h> 15#include <linux/clk.h>
22#include <linux/clocksource.h>
23#include <linux/clockchips.h> 16#include <linux/clockchips.h>
24#include <linux/io.h> 17#include <linux/of_address.h>
25#include <linux/bug.h>
26#include <asm/cpuinfo.h> 18#include <asm/cpuinfo.h>
27#include <asm/setup.h>
28#include <asm/prom.h>
29#include <asm/irq.h>
30#include <linux/cnt32_to_63.h> 19#include <linux/cnt32_to_63.h>
31 20
32#ifdef CONFIG_SELFMOD_TIMER 21static void __iomem *timer_baseaddr;
33#include <asm/selfmod.h>
34#define TIMER_BASE BARRIER_BASE_ADDR
35#else
36static unsigned int timer_baseaddr;
37#define TIMER_BASE timer_baseaddr
38#endif
39 22
40static unsigned int freq_div_hz; 23static unsigned int freq_div_hz;
41static unsigned int timer_clock_freq; 24static unsigned int timer_clock_freq;
@@ -59,19 +42,21 @@ static unsigned int timer_clock_freq;
59#define TCSR_PWMA (1<<9) 42#define TCSR_PWMA (1<<9)
60#define TCSR_ENALL (1<<10) 43#define TCSR_ENALL (1<<10)
61 44
62static inline void microblaze_timer0_stop(void) 45static inline void xilinx_timer0_stop(void)
63{ 46{
64 out_be32(TIMER_BASE + TCSR0, in_be32(TIMER_BASE + TCSR0) & ~TCSR_ENT); 47 out_be32(timer_baseaddr + TCSR0,
48 in_be32(timer_baseaddr + TCSR0) & ~TCSR_ENT);
65} 49}
66 50
67static inline void microblaze_timer0_start_periodic(unsigned long load_val) 51static inline void xilinx_timer0_start_periodic(unsigned long load_val)
68{ 52{
69 if (!load_val) 53 if (!load_val)
70 load_val = 1; 54 load_val = 1;
71 out_be32(TIMER_BASE + TLR0, load_val); /* loading value to timer reg */ 55 /* loading value to timer reg */
56 out_be32(timer_baseaddr + TLR0, load_val);
72 57
73 /* load the initial value */ 58 /* load the initial value */
74 out_be32(TIMER_BASE + TCSR0, TCSR_LOAD); 59 out_be32(timer_baseaddr + TCSR0, TCSR_LOAD);
75 60
76 /* see timer data sheet for detail 61 /* see timer data sheet for detail
77 * !ENALL - don't enable 'em all 62 * !ENALL - don't enable 'em all
@@ -86,38 +71,39 @@ static inline void microblaze_timer0_start_periodic(unsigned long load_val)
86 * UDT - set the timer as down counter 71 * UDT - set the timer as down counter
87 * !MDT0 - generate mode 72 * !MDT0 - generate mode
88 */ 73 */
89 out_be32(TIMER_BASE + TCSR0, 74 out_be32(timer_baseaddr + TCSR0,
90 TCSR_TINT|TCSR_ENIT|TCSR_ENT|TCSR_ARHT|TCSR_UDT); 75 TCSR_TINT|TCSR_ENIT|TCSR_ENT|TCSR_ARHT|TCSR_UDT);
91} 76}
92 77
93static inline void microblaze_timer0_start_oneshot(unsigned long load_val) 78static inline void xilinx_timer0_start_oneshot(unsigned long load_val)
94{ 79{
95 if (!load_val) 80 if (!load_val)
96 load_val = 1; 81 load_val = 1;
97 out_be32(TIMER_BASE + TLR0, load_val); /* loading value to timer reg */ 82 /* loading value to timer reg */
83 out_be32(timer_baseaddr + TLR0, load_val);
98 84
99 /* load the initial value */ 85 /* load the initial value */
100 out_be32(TIMER_BASE + TCSR0, TCSR_LOAD); 86 out_be32(timer_baseaddr + TCSR0, TCSR_LOAD);
101 87
102 out_be32(TIMER_BASE + TCSR0, 88 out_be32(timer_baseaddr + TCSR0,
103 TCSR_TINT|TCSR_ENIT|TCSR_ENT|TCSR_ARHT|TCSR_UDT); 89 TCSR_TINT|TCSR_ENIT|TCSR_ENT|TCSR_ARHT|TCSR_UDT);
104} 90}
105 91
106static int microblaze_timer_set_next_event(unsigned long delta, 92static int xilinx_timer_set_next_event(unsigned long delta,
107 struct clock_event_device *dev) 93 struct clock_event_device *dev)
108{ 94{
109 pr_debug("%s: next event, delta %x\n", __func__, (u32)delta); 95 pr_debug("%s: next event, delta %x\n", __func__, (u32)delta);
110 microblaze_timer0_start_oneshot(delta); 96 xilinx_timer0_start_oneshot(delta);
111 return 0; 97 return 0;
112} 98}
113 99
114static void microblaze_timer_set_mode(enum clock_event_mode mode, 100static void xilinx_timer_set_mode(enum clock_event_mode mode,
115 struct clock_event_device *evt) 101 struct clock_event_device *evt)
116{ 102{
117 switch (mode) { 103 switch (mode) {
118 case CLOCK_EVT_MODE_PERIODIC: 104 case CLOCK_EVT_MODE_PERIODIC:
119 pr_info("%s: periodic\n", __func__); 105 pr_info("%s: periodic\n", __func__);
120 microblaze_timer0_start_periodic(freq_div_hz); 106 xilinx_timer0_start_periodic(freq_div_hz);
121 break; 107 break;
122 case CLOCK_EVT_MODE_ONESHOT: 108 case CLOCK_EVT_MODE_ONESHOT:
123 pr_info("%s: oneshot\n", __func__); 109 pr_info("%s: oneshot\n", __func__);
@@ -127,7 +113,7 @@ static void microblaze_timer_set_mode(enum clock_event_mode mode,
127 break; 113 break;
128 case CLOCK_EVT_MODE_SHUTDOWN: 114 case CLOCK_EVT_MODE_SHUTDOWN:
129 pr_info("%s: shutdown\n", __func__); 115 pr_info("%s: shutdown\n", __func__);
130 microblaze_timer0_stop(); 116 xilinx_timer0_stop();
131 break; 117 break;
132 case CLOCK_EVT_MODE_RESUME: 118 case CLOCK_EVT_MODE_RESUME:
133 pr_info("%s: resume\n", __func__); 119 pr_info("%s: resume\n", __func__);
@@ -135,23 +121,23 @@ static void microblaze_timer_set_mode(enum clock_event_mode mode,
135 } 121 }
136} 122}
137 123
138static struct clock_event_device clockevent_microblaze_timer = { 124static struct clock_event_device clockevent_xilinx_timer = {
139 .name = "microblaze_clockevent", 125 .name = "xilinx_clockevent",
140 .features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC, 126 .features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC,
141 .shift = 8, 127 .shift = 8,
142 .rating = 300, 128 .rating = 300,
143 .set_next_event = microblaze_timer_set_next_event, 129 .set_next_event = xilinx_timer_set_next_event,
144 .set_mode = microblaze_timer_set_mode, 130 .set_mode = xilinx_timer_set_mode,
145}; 131};
146 132
147static inline void timer_ack(void) 133static inline void timer_ack(void)
148{ 134{
149 out_be32(TIMER_BASE + TCSR0, in_be32(TIMER_BASE + TCSR0)); 135 out_be32(timer_baseaddr + TCSR0, in_be32(timer_baseaddr + TCSR0));
150} 136}
151 137
152static irqreturn_t timer_interrupt(int irq, void *dev_id) 138static irqreturn_t timer_interrupt(int irq, void *dev_id)
153{ 139{
154 struct clock_event_device *evt = &clockevent_microblaze_timer; 140 struct clock_event_device *evt = &clockevent_xilinx_timer;
155#ifdef CONFIG_HEART_BEAT 141#ifdef CONFIG_HEART_BEAT
156 heartbeat(); 142 heartbeat();
157#endif 143#endif
@@ -164,73 +150,74 @@ static struct irqaction timer_irqaction = {
164 .handler = timer_interrupt, 150 .handler = timer_interrupt,
165 .flags = IRQF_DISABLED | IRQF_TIMER, 151 .flags = IRQF_DISABLED | IRQF_TIMER,
166 .name = "timer", 152 .name = "timer",
167 .dev_id = &clockevent_microblaze_timer, 153 .dev_id = &clockevent_xilinx_timer,
168}; 154};
169 155
170static __init void microblaze_clockevent_init(void) 156static __init void xilinx_clockevent_init(void)
171{ 157{
172 clockevent_microblaze_timer.mult = 158 clockevent_xilinx_timer.mult =
173 div_sc(timer_clock_freq, NSEC_PER_SEC, 159 div_sc(timer_clock_freq, NSEC_PER_SEC,
174 clockevent_microblaze_timer.shift); 160 clockevent_xilinx_timer.shift);
175 clockevent_microblaze_timer.max_delta_ns = 161 clockevent_xilinx_timer.max_delta_ns =
176 clockevent_delta2ns((u32)~0, &clockevent_microblaze_timer); 162 clockevent_delta2ns((u32)~0, &clockevent_xilinx_timer);
177 clockevent_microblaze_timer.min_delta_ns = 163 clockevent_xilinx_timer.min_delta_ns =
178 clockevent_delta2ns(1, &clockevent_microblaze_timer); 164 clockevent_delta2ns(1, &clockevent_xilinx_timer);
179 clockevent_microblaze_timer.cpumask = cpumask_of(0); 165 clockevent_xilinx_timer.cpumask = cpumask_of(0);
180 clockevents_register_device(&clockevent_microblaze_timer); 166 clockevents_register_device(&clockevent_xilinx_timer);
181} 167}
182 168
183static cycle_t microblaze_read(struct clocksource *cs) 169static cycle_t xilinx_read(struct clocksource *cs)
184{ 170{
185 /* reading actual value of timer 1 */ 171 /* reading actual value of timer 1 */
186 return (cycle_t) (in_be32(TIMER_BASE + TCR1)); 172 return (cycle_t) (in_be32(timer_baseaddr + TCR1));
187} 173}
188 174
189static struct timecounter microblaze_tc = { 175static struct timecounter xilinx_tc = {
190 .cc = NULL, 176 .cc = NULL,
191}; 177};
192 178
193static cycle_t microblaze_cc_read(const struct cyclecounter *cc) 179static cycle_t xilinx_cc_read(const struct cyclecounter *cc)
194{ 180{
195 return microblaze_read(NULL); 181 return xilinx_read(NULL);
196} 182}
197 183
198static struct cyclecounter microblaze_cc = { 184static struct cyclecounter xilinx_cc = {
199 .read = microblaze_cc_read, 185 .read = xilinx_cc_read,
200 .mask = CLOCKSOURCE_MASK(32), 186 .mask = CLOCKSOURCE_MASK(32),
201 .shift = 8, 187 .shift = 8,
202}; 188};
203 189
204static int __init init_microblaze_timecounter(void) 190static int __init init_xilinx_timecounter(void)
205{ 191{
206 microblaze_cc.mult = div_sc(timer_clock_freq, NSEC_PER_SEC, 192 xilinx_cc.mult = div_sc(timer_clock_freq, NSEC_PER_SEC,
207 microblaze_cc.shift); 193 xilinx_cc.shift);
208 194
209 timecounter_init(&microblaze_tc, &microblaze_cc, sched_clock()); 195 timecounter_init(&xilinx_tc, &xilinx_cc, sched_clock());
210 196
211 return 0; 197 return 0;
212} 198}
213 199
214static struct clocksource clocksource_microblaze = { 200static struct clocksource clocksource_microblaze = {
215 .name = "microblaze_clocksource", 201 .name = "xilinx_clocksource",
216 .rating = 300, 202 .rating = 300,
217 .read = microblaze_read, 203 .read = xilinx_read,
218 .mask = CLOCKSOURCE_MASK(32), 204 .mask = CLOCKSOURCE_MASK(32),
219 .flags = CLOCK_SOURCE_IS_CONTINUOUS, 205 .flags = CLOCK_SOURCE_IS_CONTINUOUS,
220}; 206};
221 207
222static int __init microblaze_clocksource_init(void) 208static int __init xilinx_clocksource_init(void)
223{ 209{
224 if (clocksource_register_hz(&clocksource_microblaze, timer_clock_freq)) 210 if (clocksource_register_hz(&clocksource_microblaze, timer_clock_freq))
225 panic("failed to register clocksource"); 211 panic("failed to register clocksource");
226 212
227 /* stop timer1 */ 213 /* stop timer1 */
228 out_be32(TIMER_BASE + TCSR1, in_be32(TIMER_BASE + TCSR1) & ~TCSR_ENT); 214 out_be32(timer_baseaddr + TCSR1,
215 in_be32(timer_baseaddr + TCSR1) & ~TCSR_ENT);
229 /* start timer1 - up counting without interrupt */ 216 /* start timer1 - up counting without interrupt */
230 out_be32(TIMER_BASE + TCSR1, TCSR_TINT|TCSR_ENT|TCSR_ARHT); 217 out_be32(timer_baseaddr + TCSR1, TCSR_TINT|TCSR_ENT|TCSR_ARHT);
231 218
232 /* register timecounter - for ftrace support */ 219 /* register timecounter - for ftrace support */
233 init_microblaze_timecounter(); 220 init_xilinx_timecounter();
234 return 0; 221 return 0;
235} 222}
236 223
@@ -240,55 +227,31 @@ static int __init microblaze_clocksource_init(void)
240 */ 227 */
241static int timer_initialized; 228static int timer_initialized;
242 229
243void __init time_init(void) 230static void __init xilinx_timer_init(struct device_node *timer)
244{ 231{
245 u32 irq; 232 u32 irq;
246 u32 timer_num = 1; 233 u32 timer_num = 1;
247 struct device_node *timer = NULL; 234 int ret;
248 const void *prop; 235
249#ifdef CONFIG_SELFMOD_TIMER 236 timer_baseaddr = of_iomap(timer, 0);
250 unsigned int timer_baseaddr = 0; 237 if (!timer_baseaddr) {
251 int arr_func[] = { 238 pr_err("ERROR: invalid timer base address\n");
252 (int)&microblaze_read, 239 BUG();
253 (int)&timer_interrupt, 240 }
254 (int)&microblaze_clocksource_init, 241
255 (int)&microblaze_timer_set_mode,
256 (int)&microblaze_timer_set_next_event,
257 0
258 };
259#endif
260 prop = of_get_property(of_chosen, "system-timer", NULL);
261 if (prop)
262 timer = of_find_node_by_phandle(be32_to_cpup(prop));
263 else
264 pr_info("No chosen timer found, using default\n");
265
266 if (!timer)
267 timer = of_find_compatible_node(NULL, NULL,
268 "xlnx,xps-timer-1.00.a");
269 BUG_ON(!timer);
270
271 timer_baseaddr = be32_to_cpup(of_get_property(timer, "reg", NULL));
272 timer_baseaddr = (unsigned long) ioremap(timer_baseaddr, PAGE_SIZE);
273 irq = irq_of_parse_and_map(timer, 0); 242 irq = irq_of_parse_and_map(timer, 0);
274 timer_num = be32_to_cpup(of_get_property(timer, 243
275 "xlnx,one-timer-only", NULL)); 244 of_property_read_u32(timer, "xlnx,one-timer-only", &timer_num);
276 if (timer_num) { 245 if (timer_num) {
277 pr_emerg("Please enable two timers in HW\n"); 246 pr_emerg("Please enable two timers in HW\n");
278 BUG(); 247 BUG();
279 } 248 }
280 249
281#ifdef CONFIG_SELFMOD_TIMER 250 pr_info("%s: irq=%d\n", timer->full_name, irq);
282 selfmod_function((int *) arr_func, timer_baseaddr);
283#endif
284 pr_info("%s #0 at 0x%08x, irq=%d\n",
285 timer->name, timer_baseaddr, irq);
286 251
287 /* If there is clock-frequency property than use it */ 252 /* If there is clock-frequency property than use it */
288 prop = of_get_property(timer, "clock-frequency", NULL); 253 ret = of_property_read_u32(timer, "clock-frequency", &timer_clock_freq);
289 if (prop) 254 if (ret < 0)
290 timer_clock_freq = be32_to_cpup(prop);
291 else
292 timer_clock_freq = cpuinfo.cpu_clock_freq; 255 timer_clock_freq = cpuinfo.cpu_clock_freq;
293 256
294 freq_div_hz = timer_clock_freq / HZ; 257 freq_div_hz = timer_clock_freq / HZ;
@@ -297,8 +260,8 @@ void __init time_init(void)
297#ifdef CONFIG_HEART_BEAT 260#ifdef CONFIG_HEART_BEAT
298 setup_heartbeat(); 261 setup_heartbeat();
299#endif 262#endif
300 microblaze_clocksource_init(); 263 xilinx_clocksource_init();
301 microblaze_clockevent_init(); 264 xilinx_clockevent_init();
302 timer_initialized = 1; 265 timer_initialized = 1;
303} 266}
304 267
@@ -312,3 +275,6 @@ unsigned long long notrace sched_clock(void)
312 } 275 }
313 return 0; 276 return 0;
314} 277}
278
279CLOCKSOURCE_OF_DECLARE(xilinx_timer, "xlnx,xps-timer-1.00.a",
280 xilinx_timer_init);
diff --git a/arch/microblaze/mm/fault.c b/arch/microblaze/mm/fault.c
index 731f739d17a1..fa4cf52aa7a6 100644
--- a/arch/microblaze/mm/fault.c
+++ b/arch/microblaze/mm/fault.c
@@ -92,8 +92,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long address,
92 int code = SEGV_MAPERR; 92 int code = SEGV_MAPERR;
93 int is_write = error_code & ESR_S; 93 int is_write = error_code & ESR_S;
94 int fault; 94 int fault;
95 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE | 95 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
96 (is_write ? FAULT_FLAG_WRITE : 0);
97 96
98 regs->ear = address; 97 regs->ear = address;
99 regs->esr = error_code; 98 regs->esr = error_code;
@@ -121,6 +120,9 @@ void do_page_fault(struct pt_regs *regs, unsigned long address,
121 die("Weird page fault", regs, SIGSEGV); 120 die("Weird page fault", regs, SIGSEGV);
122 } 121 }
123 122
123 if (user_mode(regs))
124 flags |= FAULT_FLAG_USER;
125
124 /* When running in the kernel we expect faults to occur only to 126 /* When running in the kernel we expect faults to occur only to
125 * addresses in user space. All other faults represent errors in the 127 * addresses in user space. All other faults represent errors in the
126 * kernel and should generate an OOPS. Unfortunately, in the case of an 128 * kernel and should generate an OOPS. Unfortunately, in the case of an
@@ -199,6 +201,7 @@ good_area:
199 if (unlikely(is_write)) { 201 if (unlikely(is_write)) {
200 if (unlikely(!(vma->vm_flags & VM_WRITE))) 202 if (unlikely(!(vma->vm_flags & VM_WRITE)))
201 goto bad_area; 203 goto bad_area;
204 flags |= FAULT_FLAG_WRITE;
202 /* a read */ 205 /* a read */
203 } else { 206 } else {
204 /* protection fault */ 207 /* protection fault */
diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c
index bdb8ea100e73..1b93bf0892a0 100644
--- a/arch/microblaze/pci/pci-common.c
+++ b/arch/microblaze/pci/pci-common.c
@@ -657,67 +657,42 @@ void pci_resource_to_user(const struct pci_dev *dev, int bar,
657void pci_process_bridge_OF_ranges(struct pci_controller *hose, 657void pci_process_bridge_OF_ranges(struct pci_controller *hose,
658 struct device_node *dev, int primary) 658 struct device_node *dev, int primary)
659{ 659{
660 const u32 *ranges;
661 int rlen;
662 int pna = of_n_addr_cells(dev);
663 int np = pna + 5;
664 int memno = 0, isa_hole = -1; 660 int memno = 0, isa_hole = -1;
665 u32 pci_space;
666 unsigned long long pci_addr, cpu_addr, pci_next, cpu_next, size;
667 unsigned long long isa_mb = 0; 661 unsigned long long isa_mb = 0;
668 struct resource *res; 662 struct resource *res;
663 struct of_pci_range range;
664 struct of_pci_range_parser parser;
669 665
670 pr_info("PCI host bridge %s %s ranges:\n", 666 pr_info("PCI host bridge %s %s ranges:\n",
671 dev->full_name, primary ? "(primary)" : ""); 667 dev->full_name, primary ? "(primary)" : "");
672 668
673 /* Get ranges property */ 669 /* Check for ranges property */
674 ranges = of_get_property(dev, "ranges", &rlen); 670 if (of_pci_range_parser_init(&parser, dev))
675 if (ranges == NULL)
676 return; 671 return;
677 672
678 /* Parse it */
679 pr_debug("Parsing ranges property...\n"); 673 pr_debug("Parsing ranges property...\n");
680 while ((rlen -= np * 4) >= 0) { 674 for_each_of_pci_range(&parser, &range) {
681 /* Read next ranges element */ 675 /* Read next ranges element */
682 pci_space = ranges[0];
683 pci_addr = of_read_number(ranges + 1, 2);
684 cpu_addr = of_translate_address(dev, ranges + 3);
685 size = of_read_number(ranges + pna + 3, 2);
686
687 pr_debug("pci_space: 0x%08x pci_addr:0x%016llx ", 676 pr_debug("pci_space: 0x%08x pci_addr:0x%016llx ",
688 pci_space, pci_addr); 677 range.pci_space, range.pci_addr);
689 pr_debug("cpu_addr:0x%016llx size:0x%016llx\n", 678 pr_debug("cpu_addr:0x%016llx size:0x%016llx\n",
690 cpu_addr, size); 679 range.cpu_addr, range.size);
691
692 ranges += np;
693 680
694 /* If we failed translation or got a zero-sized region 681 /* If we failed translation or got a zero-sized region
695 * (some FW try to feed us with non sensical zero sized regions 682 * (some FW try to feed us with non sensical zero sized regions
696 * such as power3 which look like some kind of attempt 683 * such as power3 which look like some kind of attempt
697 * at exposing the VGA memory hole) 684 * at exposing the VGA memory hole)
698 */ 685 */
699 if (cpu_addr == OF_BAD_ADDR || size == 0) 686 if (range.cpu_addr == OF_BAD_ADDR || range.size == 0)
700 continue; 687 continue;
701 688
702 /* Now consume following elements while they are contiguous */
703 for (; rlen >= np * sizeof(u32);
704 ranges += np, rlen -= np * 4) {
705 if (ranges[0] != pci_space)
706 break;
707 pci_next = of_read_number(ranges + 1, 2);
708 cpu_next = of_translate_address(dev, ranges + 3);
709 if (pci_next != pci_addr + size ||
710 cpu_next != cpu_addr + size)
711 break;
712 size += of_read_number(ranges + pna + 3, 2);
713 }
714
715 /* Act based on address space type */ 689 /* Act based on address space type */
716 res = NULL; 690 res = NULL;
717 switch ((pci_space >> 24) & 0x3) { 691 switch (range.flags & IORESOURCE_TYPE_BITS) {
718 case 1: /* PCI IO space */ 692 case IORESOURCE_IO:
719 pr_info(" IO 0x%016llx..0x%016llx -> 0x%016llx\n", 693 pr_info(" IO 0x%016llx..0x%016llx -> 0x%016llx\n",
720 cpu_addr, cpu_addr + size - 1, pci_addr); 694 range.cpu_addr, range.cpu_addr + range.size - 1,
695 range.pci_addr);
721 696
722 /* We support only one IO range */ 697 /* We support only one IO range */
723 if (hose->pci_io_size) { 698 if (hose->pci_io_size) {
@@ -725,11 +700,12 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose,
725 continue; 700 continue;
726 } 701 }
727 /* On 32 bits, limit I/O space to 16MB */ 702 /* On 32 bits, limit I/O space to 16MB */
728 if (size > 0x01000000) 703 if (range.size > 0x01000000)
729 size = 0x01000000; 704 range.size = 0x01000000;
730 705
731 /* 32 bits needs to map IOs here */ 706 /* 32 bits needs to map IOs here */
732 hose->io_base_virt = ioremap(cpu_addr, size); 707 hose->io_base_virt = ioremap(range.cpu_addr,
708 range.size);
733 709
734 /* Expect trouble if pci_addr is not 0 */ 710 /* Expect trouble if pci_addr is not 0 */
735 if (primary) 711 if (primary)
@@ -738,19 +714,20 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose,
738 /* pci_io_size and io_base_phys always represent IO 714 /* pci_io_size and io_base_phys always represent IO
739 * space starting at 0 so we factor in pci_addr 715 * space starting at 0 so we factor in pci_addr
740 */ 716 */
741 hose->pci_io_size = pci_addr + size; 717 hose->pci_io_size = range.pci_addr + range.size;
742 hose->io_base_phys = cpu_addr - pci_addr; 718 hose->io_base_phys = range.cpu_addr - range.pci_addr;
743 719
744 /* Build resource */ 720 /* Build resource */
745 res = &hose->io_resource; 721 res = &hose->io_resource;
746 res->flags = IORESOURCE_IO; 722 range.cpu_addr = range.pci_addr;
747 res->start = pci_addr; 723
748 break; 724 break;
749 case 2: /* PCI Memory space */ 725 case IORESOURCE_MEM:
750 case 3: /* PCI 64 bits Memory space */
751 pr_info(" MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n", 726 pr_info(" MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n",
752 cpu_addr, cpu_addr + size - 1, pci_addr, 727 range.cpu_addr, range.cpu_addr + range.size - 1,
753 (pci_space & 0x40000000) ? "Prefetch" : ""); 728 range.pci_addr,
729 (range.pci_space & 0x40000000) ?
730 "Prefetch" : "");
754 731
755 /* We support only 3 memory ranges */ 732 /* We support only 3 memory ranges */
756 if (memno >= 3) { 733 if (memno >= 3) {
@@ -758,13 +735,13 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose,
758 continue; 735 continue;
759 } 736 }
760 /* Handles ISA memory hole space here */ 737 /* Handles ISA memory hole space here */
761 if (pci_addr == 0) { 738 if (range.pci_addr == 0) {
762 isa_mb = cpu_addr; 739 isa_mb = range.cpu_addr;
763 isa_hole = memno; 740 isa_hole = memno;
764 if (primary || isa_mem_base == 0) 741 if (primary || isa_mem_base == 0)
765 isa_mem_base = cpu_addr; 742 isa_mem_base = range.cpu_addr;
766 hose->isa_mem_phys = cpu_addr; 743 hose->isa_mem_phys = range.cpu_addr;
767 hose->isa_mem_size = size; 744 hose->isa_mem_size = range.size;
768 } 745 }
769 746
770 /* We get the PCI/Mem offset from the first range or 747 /* We get the PCI/Mem offset from the first range or
@@ -772,30 +749,23 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose,
772 * hole. If they don't match, bugger. 749 * hole. If they don't match, bugger.
773 */ 750 */
774 if (memno == 0 || 751 if (memno == 0 ||
775 (isa_hole >= 0 && pci_addr != 0 && 752 (isa_hole >= 0 && range.pci_addr != 0 &&
776 hose->pci_mem_offset == isa_mb)) 753 hose->pci_mem_offset == isa_mb))
777 hose->pci_mem_offset = cpu_addr - pci_addr; 754 hose->pci_mem_offset = range.cpu_addr -
778 else if (pci_addr != 0 && 755 range.pci_addr;
779 hose->pci_mem_offset != cpu_addr - pci_addr) { 756 else if (range.pci_addr != 0 &&
757 hose->pci_mem_offset != range.cpu_addr -
758 range.pci_addr) {
780 pr_info(" \\--> Skipped (offset mismatch) !\n"); 759 pr_info(" \\--> Skipped (offset mismatch) !\n");
781 continue; 760 continue;
782 } 761 }
783 762
784 /* Build resource */ 763 /* Build resource */
785 res = &hose->mem_resources[memno++]; 764 res = &hose->mem_resources[memno++];
786 res->flags = IORESOURCE_MEM;
787 if (pci_space & 0x40000000)
788 res->flags |= IORESOURCE_PREFETCH;
789 res->start = cpu_addr;
790 break; 765 break;
791 } 766 }
792 if (res != NULL) { 767 if (res != NULL)
793 res->name = dev->full_name; 768 of_pci_range_to_resource(&range, dev, res);
794 res->end = res->start + size - 1;
795 res->parent = NULL;
796 res->sibling = NULL;
797 res->child = NULL;
798 }
799 } 769 }
800 770
801 /* If there's an ISA hole and the pci_mem_offset is -not- matching 771 /* If there's an ISA hole and the pci_mem_offset is -not- matching
diff --git a/arch/microblaze/platform/Kconfig.platform b/arch/microblaze/platform/Kconfig.platform
index b1747211b8b1..db1aa5c22cea 100644
--- a/arch/microblaze/platform/Kconfig.platform
+++ b/arch/microblaze/platform/Kconfig.platform
@@ -18,28 +18,6 @@ config PLATFORM_GENERIC
18 18
19endchoice 19endchoice
20 20
21config SELFMOD
22 bool "Use self modified code for intc/timer"
23 depends on NO_MMU
24 default n
25 help
26 This choice enables self-modified code for interrupt controller
27 and timer.
28
29config SELFMOD_INTC
30 bool "Use self modified code for intc"
31 depends on SELFMOD
32 default y
33 help
34 This choice enables self-modified code for interrupt controller.
35
36config SELFMOD_TIMER
37 bool "Use self modified code for timer"
38 depends on SELFMOD
39 default y
40 help
41 This choice enables self-modified code for timer.
42
43config OPT_LIB_FUNCTION 21config OPT_LIB_FUNCTION
44 bool "Optimalized lib function" 22 bool "Optimalized lib function"
45 default y 23 default y
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index e12764c2a9d0..f75ab4a2f246 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -25,7 +25,6 @@ config MIPS
25 select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE 25 select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
26 select HAVE_DMA_ATTRS 26 select HAVE_DMA_ATTRS
27 select HAVE_DMA_API_DEBUG 27 select HAVE_DMA_API_DEBUG
28 select HAVE_GENERIC_HARDIRQS
29 select GENERIC_IRQ_PROBE 28 select GENERIC_IRQ_PROBE
30 select GENERIC_IRQ_SHOW 29 select GENERIC_IRQ_SHOW
31 select GENERIC_PCI_IOMAP 30 select GENERIC_PCI_IOMAP
@@ -95,6 +94,7 @@ config ATH79
95 select CSRC_R4K 94 select CSRC_R4K
96 select DMA_NONCOHERENT 95 select DMA_NONCOHERENT
97 select HAVE_CLK 96 select HAVE_CLK
97 select CLKDEV_LOOKUP
98 select IRQ_CPU 98 select IRQ_CPU
99 select MIPS_MACHINE 99 select MIPS_MACHINE
100 select SYS_HAS_CPU_MIPS32_R2 100 select SYS_HAS_CPU_MIPS32_R2
@@ -131,7 +131,6 @@ config BCM63XX
131 select IRQ_CPU 131 select IRQ_CPU
132 select SYS_HAS_CPU_MIPS32_R1 132 select SYS_HAS_CPU_MIPS32_R1
133 select SYS_HAS_CPU_BMIPS4350 if !BCM63XX_CPU_6338 && !BCM63XX_CPU_6345 && !BCM63XX_CPU_6348 133 select SYS_HAS_CPU_BMIPS4350 if !BCM63XX_CPU_6338 && !BCM63XX_CPU_6345 && !BCM63XX_CPU_6348
134 select NR_CPUS_DEFAULT_2
135 select SYS_SUPPORTS_32BIT_KERNEL 134 select SYS_SUPPORTS_32BIT_KERNEL
136 select SYS_SUPPORTS_BIG_ENDIAN 135 select SYS_SUPPORTS_BIG_ENDIAN
137 select SYS_HAS_EARLY_PRINTK 136 select SYS_HAS_EARLY_PRINTK
@@ -445,6 +444,8 @@ config RALINK
445 select SYS_HAS_EARLY_PRINTK 444 select SYS_HAS_EARLY_PRINTK
446 select HAVE_MACH_CLKDEV 445 select HAVE_MACH_CLKDEV
447 select CLKDEV_LOOKUP 446 select CLKDEV_LOOKUP
447 select ARCH_HAS_RESET_CONTROLLER
448 select RESET_CONTROLLER
448 449
449config SGI_IP22 450config SGI_IP22
450 bool "SGI IP22 (Indy/Indigo2)" 451 bool "SGI IP22 (Indy/Indigo2)"
@@ -609,7 +610,6 @@ config SIBYTE_SWARM
609 select BOOT_ELF32 610 select BOOT_ELF32
610 select DMA_COHERENT 611 select DMA_COHERENT
611 select HAVE_PATA_PLATFORM 612 select HAVE_PATA_PLATFORM
612 select NR_CPUS_DEFAULT_2
613 select SIBYTE_SB1250 613 select SIBYTE_SB1250
614 select SWAP_IO_SPACE 614 select SWAP_IO_SPACE
615 select SYS_HAS_CPU_SB1 615 select SYS_HAS_CPU_SB1
@@ -623,7 +623,6 @@ config SIBYTE_LITTLESUR
623 select BOOT_ELF32 623 select BOOT_ELF32
624 select DMA_COHERENT 624 select DMA_COHERENT
625 select HAVE_PATA_PLATFORM 625 select HAVE_PATA_PLATFORM
626 select NR_CPUS_DEFAULT_2
627 select SIBYTE_SB1250 626 select SIBYTE_SB1250
628 select SWAP_IO_SPACE 627 select SWAP_IO_SPACE
629 select SYS_HAS_CPU_SB1 628 select SYS_HAS_CPU_SB1
@@ -635,7 +634,6 @@ config SIBYTE_SENTOSA
635 bool "Sibyte BCM91250E-Sentosa" 634 bool "Sibyte BCM91250E-Sentosa"
636 select BOOT_ELF32 635 select BOOT_ELF32
637 select DMA_COHERENT 636 select DMA_COHERENT
638 select NR_CPUS_DEFAULT_2
639 select SIBYTE_SB1250 637 select SIBYTE_SB1250
640 select SWAP_IO_SPACE 638 select SWAP_IO_SPACE
641 select SYS_HAS_CPU_SB1 639 select SYS_HAS_CPU_SB1
@@ -727,11 +725,11 @@ config CAVIUM_OCTEON_SOC
727 select SYS_HAS_CPU_CAVIUM_OCTEON 725 select SYS_HAS_CPU_CAVIUM_OCTEON
728 select SWAP_IO_SPACE 726 select SWAP_IO_SPACE
729 select HW_HAS_PCI 727 select HW_HAS_PCI
730 select ARCH_SUPPORTS_MSI
731 select ZONE_DMA32 728 select ZONE_DMA32
732 select USB_ARCH_HAS_OHCI 729 select USB_ARCH_HAS_OHCI
733 select USB_ARCH_HAS_EHCI 730 select USB_ARCH_HAS_EHCI
734 select HOLES_IN_ZONE 731 select HOLES_IN_ZONE
732 select ARCH_REQUIRE_GPIOLIB
735 help 733 help
736 This option supports all of the Octeon reference boards from Cavium 734 This option supports all of the Octeon reference boards from Cavium
737 Networks. It builds a kernel that dynamically determines the Octeon 735 Networks. It builds a kernel that dynamically determines the Octeon
@@ -763,7 +761,6 @@ config NLM_XLR_BOARD
763 select CEVT_R4K 761 select CEVT_R4K
764 select CSRC_R4K 762 select CSRC_R4K
765 select IRQ_CPU 763 select IRQ_CPU
766 select ARCH_SUPPORTS_MSI
767 select ZONE_DMA32 if 64BIT 764 select ZONE_DMA32 if 64BIT
768 select SYNC_R4K 765 select SYNC_R4K
769 select SYS_HAS_EARLY_PRINTK 766 select SYS_HAS_EARLY_PRINTK
@@ -1862,7 +1859,6 @@ config MIPS_MT_SMP
1862 select CPU_MIPSR2_IRQ_VI 1859 select CPU_MIPSR2_IRQ_VI
1863 select CPU_MIPSR2_IRQ_EI 1860 select CPU_MIPSR2_IRQ_EI
1864 select MIPS_MT 1861 select MIPS_MT
1865 select NR_CPUS_DEFAULT_2
1866 select SMP 1862 select SMP
1867 select SYS_SUPPORTS_SCHED_SMT if SMP 1863 select SYS_SUPPORTS_SCHED_SMT if SMP
1868 select SYS_SUPPORTS_SMP 1864 select SYS_SUPPORTS_SMP
@@ -2173,12 +2169,6 @@ config SYS_SUPPORTS_MIPS_CMP
2173config SYS_SUPPORTS_SMP 2169config SYS_SUPPORTS_SMP
2174 bool 2170 bool
2175 2171
2176config NR_CPUS_DEFAULT_1
2177 bool
2178
2179config NR_CPUS_DEFAULT_2
2180 bool
2181
2182config NR_CPUS_DEFAULT_4 2172config NR_CPUS_DEFAULT_4
2183 bool 2173 bool
2184 2174
@@ -2196,10 +2186,8 @@ config NR_CPUS_DEFAULT_64
2196 2186
2197config NR_CPUS 2187config NR_CPUS
2198 int "Maximum number of CPUs (2-64)" 2188 int "Maximum number of CPUs (2-64)"
2199 range 1 64 if NR_CPUS_DEFAULT_1 2189 range 2 64
2200 depends on SMP 2190 depends on SMP
2201 default "1" if NR_CPUS_DEFAULT_1
2202 default "2" if NR_CPUS_DEFAULT_2
2203 default "4" if NR_CPUS_DEFAULT_4 2191 default "4" if NR_CPUS_DEFAULT_4
2204 default "8" if NR_CPUS_DEFAULT_8 2192 default "8" if NR_CPUS_DEFAULT_8
2205 default "16" if NR_CPUS_DEFAULT_16 2193 default "16" if NR_CPUS_DEFAULT_16
@@ -2305,9 +2293,9 @@ config KEXEC
2305 2293
2306 It is an ongoing process to be certain the hardware in a machine 2294 It is an ongoing process to be certain the hardware in a machine
2307 is properly shutdown, so do not be surprised if this code does not 2295 is properly shutdown, so do not be surprised if this code does not
2308 initially work for you. It may help to enable device hotplugging 2296 initially work for you. As of this writing the exact hardware
2309 support. As of this writing the exact hardware interface is 2297 interface is strongly in flux, so no good recommendation can be
2310 strongly in flux, so no good recommendation can be made. 2298 made.
2311 2299
2312config CRASH_DUMP 2300config CRASH_DUMP
2313 bool "Kernel crash dumps" 2301 bool "Kernel crash dumps"
diff --git a/arch/mips/Makefile b/arch/mips/Makefile
index 37f9ef324f2f..ca8f8340d75f 100644
--- a/arch/mips/Makefile
+++ b/arch/mips/Makefile
@@ -194,6 +194,8 @@ include $(srctree)/arch/mips/Kbuild.platforms
194ifdef CONFIG_PHYSICAL_START 194ifdef CONFIG_PHYSICAL_START
195load-y = $(CONFIG_PHYSICAL_START) 195load-y = $(CONFIG_PHYSICAL_START)
196endif 196endif
197entry-y = 0x$(shell $(NM) vmlinux 2>/dev/null \
198 | grep "\bkernel_entry\b" | cut -f1 -d \ )
197 199
198cflags-y += -I$(srctree)/arch/mips/include/asm/mach-generic 200cflags-y += -I$(srctree)/arch/mips/include/asm/mach-generic
199drivers-$(CONFIG_PCI) += arch/mips/pci/ 201drivers-$(CONFIG_PCI) += arch/mips/pci/
@@ -225,6 +227,9 @@ KBUILD_CFLAGS += $(cflags-y)
225KBUILD_CPPFLAGS += -DVMLINUX_LOAD_ADDRESS=$(load-y) 227KBUILD_CPPFLAGS += -DVMLINUX_LOAD_ADDRESS=$(load-y)
226KBUILD_CPPFLAGS += -DDATAOFFSET=$(if $(dataoffset-y),$(dataoffset-y),0) 228KBUILD_CPPFLAGS += -DDATAOFFSET=$(if $(dataoffset-y),$(dataoffset-y),0)
227 229
230bootvars-y = VMLINUX_LOAD_ADDRESS=$(load-y) \
231 VMLINUX_ENTRY_ADDRESS=$(entry-y)
232
228LDFLAGS += -m $(ld-emul) 233LDFLAGS += -m $(ld-emul)
229 234
230ifdef CONFIG_CC_STACKPROTECTOR 235ifdef CONFIG_CC_STACKPROTECTOR
@@ -254,9 +259,25 @@ drivers-$(CONFIG_OPROFILE) += arch/mips/oprofile/
254# suspend and hibernation support 259# suspend and hibernation support
255drivers-$(CONFIG_PM) += arch/mips/power/ 260drivers-$(CONFIG_PM) += arch/mips/power/
256 261
262# boot image targets (arch/mips/boot/)
263boot-y := vmlinux.bin
264boot-y += vmlinux.ecoff
265boot-y += vmlinux.srec
266ifeq ($(shell expr $(load-y) \< 0xffffffff80000000 2> /dev/null), 0)
267boot-y += uImage
268boot-y += uImage.gz
269endif
270
271# compressed boot image targets (arch/mips/boot/compressed/)
272bootz-y := vmlinuz
273bootz-y += vmlinuz.bin
274bootz-y += vmlinuz.ecoff
275bootz-y += vmlinuz.srec
276
257ifdef CONFIG_LASAT 277ifdef CONFIG_LASAT
258rom.bin rom.sw: vmlinux 278rom.bin rom.sw: vmlinux
259 $(Q)$(MAKE) $(build)=arch/mips/lasat/image $@ 279 $(Q)$(MAKE) $(build)=arch/mips/lasat/image \
280 $(bootvars-y) $@
260endif 281endif
261 282
262# 283#
@@ -267,9 +288,6 @@ endif
267vmlinux.32: vmlinux 288vmlinux.32: vmlinux
268 $(OBJCOPY) -O $(32bit-bfd) $(OBJCOPYFLAGS) $< $@ 289 $(OBJCOPY) -O $(32bit-bfd) $(OBJCOPYFLAGS) $< $@
269 290
270
271#obj-$(CONFIG_KPROBES) += kprobes.o
272
273# 291#
274# The 64-bit ELF tools are pretty broken so at this time we generate 64-bit 292# The 64-bit ELF tools are pretty broken so at this time we generate 64-bit
275# ELF files from 32-bit files by conversion. 293# ELF files from 32-bit files by conversion.
@@ -280,13 +298,14 @@ vmlinux.64: vmlinux
280all: $(all-y) 298all: $(all-y)
281 299
282# boot 300# boot
283vmlinux.bin vmlinux.ecoff vmlinux.srec: $(vmlinux-32) FORCE 301$(boot-y): $(vmlinux-32) FORCE
284 $(Q)$(MAKE) $(build)=arch/mips/boot VMLINUX=$(vmlinux-32) arch/mips/boot/$@ 302 $(Q)$(MAKE) $(build)=arch/mips/boot VMLINUX=$(vmlinux-32) \
303 $(bootvars-y) arch/mips/boot/$@
285 304
286# boot/compressed 305# boot/compressed
287vmlinuz vmlinuz.bin vmlinuz.ecoff vmlinuz.srec: $(vmlinux-32) FORCE 306$(bootz-y): $(vmlinux-32) FORCE
288 $(Q)$(MAKE) $(build)=arch/mips/boot/compressed \ 307 $(Q)$(MAKE) $(build)=arch/mips/boot/compressed \
289 VMLINUX_LOAD_ADDRESS=$(load-y) 32bit-bfd=$(32bit-bfd) $@ 308 $(bootvars-y) 32bit-bfd=$(32bit-bfd) $@
290 309
291 310
292CLEAN_FILES += vmlinux.32 vmlinux.64 311CLEAN_FILES += vmlinux.32 vmlinux.64
@@ -323,6 +342,8 @@ define archhelp
323 echo ' vmlinuz.ecoff - ECOFF zboot image' 342 echo ' vmlinuz.ecoff - ECOFF zboot image'
324 echo ' vmlinuz.bin - Raw binary zboot image' 343 echo ' vmlinuz.bin - Raw binary zboot image'
325 echo ' vmlinuz.srec - SREC zboot image' 344 echo ' vmlinuz.srec - SREC zboot image'
345 echo ' uImage - U-Boot image'
346 echo ' uImage.gz - U-Boot image (gzip)'
326 echo 347 echo
327 echo ' These will be default as appropriate for a configured platform.' 348 echo ' These will be default as appropriate for a configured platform.'
328endef 349endef
diff --git a/arch/mips/alchemy/common/usb.c b/arch/mips/alchemy/common/usb.c
index fcc695626117..2adc7edda49c 100644
--- a/arch/mips/alchemy/common/usb.c
+++ b/arch/mips/alchemy/common/usb.c
@@ -14,6 +14,7 @@
14#include <linux/module.h> 14#include <linux/module.h>
15#include <linux/spinlock.h> 15#include <linux/spinlock.h>
16#include <linux/syscore_ops.h> 16#include <linux/syscore_ops.h>
17#include <asm/cpu.h>
17#include <asm/mach-au1x00/au1000.h> 18#include <asm/mach-au1x00/au1000.h>
18 19
19/* control register offsets */ 20/* control register offsets */
@@ -358,7 +359,7 @@ static inline int au1200_coherency_bug(void)
358{ 359{
359#if defined(CONFIG_DMA_COHERENT) 360#if defined(CONFIG_DMA_COHERENT)
360 /* Au1200 AB USB does not support coherent memory */ 361 /* Au1200 AB USB does not support coherent memory */
361 if (!(read_c0_prid() & 0xff)) { 362 if (!(read_c0_prid() & PRID_REV_MASK)) {
362 printk(KERN_INFO "Au1200 USB: this is chip revision AB !!\n"); 363 printk(KERN_INFO "Au1200 USB: this is chip revision AB !!\n");
363 printk(KERN_INFO "Au1200 USB: update your board or re-configure" 364 printk(KERN_INFO "Au1200 USB: update your board or re-configure"
364 " the kernel\n"); 365 " the kernel\n");
diff --git a/arch/mips/ath79/clock.c b/arch/mips/ath79/clock.c
index 765ef30e3e1c..26479f437675 100644
--- a/arch/mips/ath79/clock.c
+++ b/arch/mips/ath79/clock.c
@@ -16,6 +16,7 @@
16#include <linux/init.h> 16#include <linux/init.h>
17#include <linux/err.h> 17#include <linux/err.h>
18#include <linux/clk.h> 18#include <linux/clk.h>
19#include <linux/clkdev.h>
19 20
20#include <asm/div64.h> 21#include <asm/div64.h>
21 22
@@ -31,92 +32,132 @@ struct clk {
31 unsigned long rate; 32 unsigned long rate;
32}; 33};
33 34
34static struct clk ath79_ref_clk; 35static void __init ath79_add_sys_clkdev(const char *id, unsigned long rate)
35static struct clk ath79_cpu_clk; 36{
36static struct clk ath79_ddr_clk; 37 struct clk *clk;
37static struct clk ath79_ahb_clk; 38 int err;
38static struct clk ath79_wdt_clk; 39
39static struct clk ath79_uart_clk; 40 clk = kzalloc(sizeof(*clk), GFP_KERNEL);
41 if (!clk)
42 panic("failed to allocate %s clock structure", id);
43
44 clk->rate = rate;
45
46 err = clk_register_clkdev(clk, id, NULL);
47 if (err)
48 panic("unable to register %s clock device", id);
49}
40 50
41static void __init ar71xx_clocks_init(void) 51static void __init ar71xx_clocks_init(void)
42{ 52{
53 unsigned long ref_rate;
54 unsigned long cpu_rate;
55 unsigned long ddr_rate;
56 unsigned long ahb_rate;
43 u32 pll; 57 u32 pll;
44 u32 freq; 58 u32 freq;
45 u32 div; 59 u32 div;
46 60
47 ath79_ref_clk.rate = AR71XX_BASE_FREQ; 61 ref_rate = AR71XX_BASE_FREQ;
48 62
49 pll = ath79_pll_rr(AR71XX_PLL_REG_CPU_CONFIG); 63 pll = ath79_pll_rr(AR71XX_PLL_REG_CPU_CONFIG);
50 64
51 div = ((pll >> AR71XX_PLL_DIV_SHIFT) & AR71XX_PLL_DIV_MASK) + 1; 65 div = ((pll >> AR71XX_PLL_DIV_SHIFT) & AR71XX_PLL_DIV_MASK) + 1;
52 freq = div * ath79_ref_clk.rate; 66 freq = div * ref_rate;
53 67
54 div = ((pll >> AR71XX_CPU_DIV_SHIFT) & AR71XX_CPU_DIV_MASK) + 1; 68 div = ((pll >> AR71XX_CPU_DIV_SHIFT) & AR71XX_CPU_DIV_MASK) + 1;
55 ath79_cpu_clk.rate = freq / div; 69 cpu_rate = freq / div;
56 70
57 div = ((pll >> AR71XX_DDR_DIV_SHIFT) & AR71XX_DDR_DIV_MASK) + 1; 71 div = ((pll >> AR71XX_DDR_DIV_SHIFT) & AR71XX_DDR_DIV_MASK) + 1;
58 ath79_ddr_clk.rate = freq / div; 72 ddr_rate = freq / div;
59 73
60 div = (((pll >> AR71XX_AHB_DIV_SHIFT) & AR71XX_AHB_DIV_MASK) + 1) * 2; 74 div = (((pll >> AR71XX_AHB_DIV_SHIFT) & AR71XX_AHB_DIV_MASK) + 1) * 2;
61 ath79_ahb_clk.rate = ath79_cpu_clk.rate / div; 75 ahb_rate = cpu_rate / div;
76
77 ath79_add_sys_clkdev("ref", ref_rate);
78 ath79_add_sys_clkdev("cpu", cpu_rate);
79 ath79_add_sys_clkdev("ddr", ddr_rate);
80 ath79_add_sys_clkdev("ahb", ahb_rate);
62 81
63 ath79_wdt_clk.rate = ath79_ahb_clk.rate; 82 clk_add_alias("wdt", NULL, "ahb", NULL);
64 ath79_uart_clk.rate = ath79_ahb_clk.rate; 83 clk_add_alias("uart", NULL, "ahb", NULL);
65} 84}
66 85
67static void __init ar724x_clocks_init(void) 86static void __init ar724x_clocks_init(void)
68{ 87{
88 unsigned long ref_rate;
89 unsigned long cpu_rate;
90 unsigned long ddr_rate;
91 unsigned long ahb_rate;
69 u32 pll; 92 u32 pll;
70 u32 freq; 93 u32 freq;
71 u32 div; 94 u32 div;
72 95
73 ath79_ref_clk.rate = AR724X_BASE_FREQ; 96 ref_rate = AR724X_BASE_FREQ;
74 pll = ath79_pll_rr(AR724X_PLL_REG_CPU_CONFIG); 97 pll = ath79_pll_rr(AR724X_PLL_REG_CPU_CONFIG);
75 98
76 div = ((pll >> AR724X_PLL_DIV_SHIFT) & AR724X_PLL_DIV_MASK); 99 div = ((pll >> AR724X_PLL_DIV_SHIFT) & AR724X_PLL_DIV_MASK);
77 freq = div * ath79_ref_clk.rate; 100 freq = div * ref_rate;
78 101
79 div = ((pll >> AR724X_PLL_REF_DIV_SHIFT) & AR724X_PLL_REF_DIV_MASK); 102 div = ((pll >> AR724X_PLL_REF_DIV_SHIFT) & AR724X_PLL_REF_DIV_MASK);
80 freq *= div; 103 freq *= div;
81 104
82 ath79_cpu_clk.rate = freq; 105 cpu_rate = freq;
83 106
84 div = ((pll >> AR724X_DDR_DIV_SHIFT) & AR724X_DDR_DIV_MASK) + 1; 107 div = ((pll >> AR724X_DDR_DIV_SHIFT) & AR724X_DDR_DIV_MASK) + 1;
85 ath79_ddr_clk.rate = freq / div; 108 ddr_rate = freq / div;
86 109
87 div = (((pll >> AR724X_AHB_DIV_SHIFT) & AR724X_AHB_DIV_MASK) + 1) * 2; 110 div = (((pll >> AR724X_AHB_DIV_SHIFT) & AR724X_AHB_DIV_MASK) + 1) * 2;
88 ath79_ahb_clk.rate = ath79_cpu_clk.rate / div; 111 ahb_rate = cpu_rate / div;
112
113 ath79_add_sys_clkdev("ref", ref_rate);
114 ath79_add_sys_clkdev("cpu", cpu_rate);
115 ath79_add_sys_clkdev("ddr", ddr_rate);
116 ath79_add_sys_clkdev("ahb", ahb_rate);
89 117
90 ath79_wdt_clk.rate = ath79_ahb_clk.rate; 118 clk_add_alias("wdt", NULL, "ahb", NULL);
91 ath79_uart_clk.rate = ath79_ahb_clk.rate; 119 clk_add_alias("uart", NULL, "ahb", NULL);
92} 120}
93 121
94static void __init ar913x_clocks_init(void) 122static void __init ar913x_clocks_init(void)
95{ 123{
124 unsigned long ref_rate;
125 unsigned long cpu_rate;
126 unsigned long ddr_rate;
127 unsigned long ahb_rate;
96 u32 pll; 128 u32 pll;
97 u32 freq; 129 u32 freq;
98 u32 div; 130 u32 div;
99 131
100 ath79_ref_clk.rate = AR913X_BASE_FREQ; 132 ref_rate = AR913X_BASE_FREQ;
101 pll = ath79_pll_rr(AR913X_PLL_REG_CPU_CONFIG); 133 pll = ath79_pll_rr(AR913X_PLL_REG_CPU_CONFIG);
102 134
103 div = ((pll >> AR913X_PLL_DIV_SHIFT) & AR913X_PLL_DIV_MASK); 135 div = ((pll >> AR913X_PLL_DIV_SHIFT) & AR913X_PLL_DIV_MASK);
104 freq = div * ath79_ref_clk.rate; 136 freq = div * ref_rate;
105 137
106 ath79_cpu_clk.rate = freq; 138 cpu_rate = freq;
107 139
108 div = ((pll >> AR913X_DDR_DIV_SHIFT) & AR913X_DDR_DIV_MASK) + 1; 140 div = ((pll >> AR913X_DDR_DIV_SHIFT) & AR913X_DDR_DIV_MASK) + 1;
109 ath79_ddr_clk.rate = freq / div; 141 ddr_rate = freq / div;
110 142
111 div = (((pll >> AR913X_AHB_DIV_SHIFT) & AR913X_AHB_DIV_MASK) + 1) * 2; 143 div = (((pll >> AR913X_AHB_DIV_SHIFT) & AR913X_AHB_DIV_MASK) + 1) * 2;
112 ath79_ahb_clk.rate = ath79_cpu_clk.rate / div; 144 ahb_rate = cpu_rate / div;
113 145
114 ath79_wdt_clk.rate = ath79_ahb_clk.rate; 146 ath79_add_sys_clkdev("ref", ref_rate);
115 ath79_uart_clk.rate = ath79_ahb_clk.rate; 147 ath79_add_sys_clkdev("cpu", cpu_rate);
148 ath79_add_sys_clkdev("ddr", ddr_rate);
149 ath79_add_sys_clkdev("ahb", ahb_rate);
150
151 clk_add_alias("wdt", NULL, "ahb", NULL);
152 clk_add_alias("uart", NULL, "ahb", NULL);
116} 153}
117 154
118static void __init ar933x_clocks_init(void) 155static void __init ar933x_clocks_init(void)
119{ 156{
157 unsigned long ref_rate;
158 unsigned long cpu_rate;
159 unsigned long ddr_rate;
160 unsigned long ahb_rate;
120 u32 clock_ctrl; 161 u32 clock_ctrl;
121 u32 cpu_config; 162 u32 cpu_config;
122 u32 freq; 163 u32 freq;
@@ -124,21 +165,21 @@ static void __init ar933x_clocks_init(void)
124 165
125 t = ath79_reset_rr(AR933X_RESET_REG_BOOTSTRAP); 166 t = ath79_reset_rr(AR933X_RESET_REG_BOOTSTRAP);
126 if (t & AR933X_BOOTSTRAP_REF_CLK_40) 167 if (t & AR933X_BOOTSTRAP_REF_CLK_40)
127 ath79_ref_clk.rate = (40 * 1000 * 1000); 168 ref_rate = (40 * 1000 * 1000);
128 else 169 else
129 ath79_ref_clk.rate = (25 * 1000 * 1000); 170 ref_rate = (25 * 1000 * 1000);
130 171
131 clock_ctrl = ath79_pll_rr(AR933X_PLL_CLOCK_CTRL_REG); 172 clock_ctrl = ath79_pll_rr(AR933X_PLL_CLOCK_CTRL_REG);
132 if (clock_ctrl & AR933X_PLL_CLOCK_CTRL_BYPASS) { 173 if (clock_ctrl & AR933X_PLL_CLOCK_CTRL_BYPASS) {
133 ath79_cpu_clk.rate = ath79_ref_clk.rate; 174 cpu_rate = ref_rate;
134 ath79_ahb_clk.rate = ath79_ref_clk.rate; 175 ahb_rate = ref_rate;
135 ath79_ddr_clk.rate = ath79_ref_clk.rate; 176 ddr_rate = ref_rate;
136 } else { 177 } else {
137 cpu_config = ath79_pll_rr(AR933X_PLL_CPU_CONFIG_REG); 178 cpu_config = ath79_pll_rr(AR933X_PLL_CPU_CONFIG_REG);
138 179
139 t = (cpu_config >> AR933X_PLL_CPU_CONFIG_REFDIV_SHIFT) & 180 t = (cpu_config >> AR933X_PLL_CPU_CONFIG_REFDIV_SHIFT) &
140 AR933X_PLL_CPU_CONFIG_REFDIV_MASK; 181 AR933X_PLL_CPU_CONFIG_REFDIV_MASK;
141 freq = ath79_ref_clk.rate / t; 182 freq = ref_rate / t;
142 183
143 t = (cpu_config >> AR933X_PLL_CPU_CONFIG_NINT_SHIFT) & 184 t = (cpu_config >> AR933X_PLL_CPU_CONFIG_NINT_SHIFT) &
144 AR933X_PLL_CPU_CONFIG_NINT_MASK; 185 AR933X_PLL_CPU_CONFIG_NINT_MASK;
@@ -153,19 +194,24 @@ static void __init ar933x_clocks_init(void)
153 194
154 t = ((clock_ctrl >> AR933X_PLL_CLOCK_CTRL_CPU_DIV_SHIFT) & 195 t = ((clock_ctrl >> AR933X_PLL_CLOCK_CTRL_CPU_DIV_SHIFT) &
155 AR933X_PLL_CLOCK_CTRL_CPU_DIV_MASK) + 1; 196 AR933X_PLL_CLOCK_CTRL_CPU_DIV_MASK) + 1;
156 ath79_cpu_clk.rate = freq / t; 197 cpu_rate = freq / t;
157 198
158 t = ((clock_ctrl >> AR933X_PLL_CLOCK_CTRL_DDR_DIV_SHIFT) & 199 t = ((clock_ctrl >> AR933X_PLL_CLOCK_CTRL_DDR_DIV_SHIFT) &
159 AR933X_PLL_CLOCK_CTRL_DDR_DIV_MASK) + 1; 200 AR933X_PLL_CLOCK_CTRL_DDR_DIV_MASK) + 1;
160 ath79_ddr_clk.rate = freq / t; 201 ddr_rate = freq / t;
161 202
162 t = ((clock_ctrl >> AR933X_PLL_CLOCK_CTRL_AHB_DIV_SHIFT) & 203 t = ((clock_ctrl >> AR933X_PLL_CLOCK_CTRL_AHB_DIV_SHIFT) &
163 AR933X_PLL_CLOCK_CTRL_AHB_DIV_MASK) + 1; 204 AR933X_PLL_CLOCK_CTRL_AHB_DIV_MASK) + 1;
164 ath79_ahb_clk.rate = freq / t; 205 ahb_rate = freq / t;
165 } 206 }
166 207
167 ath79_wdt_clk.rate = ath79_ref_clk.rate; 208 ath79_add_sys_clkdev("ref", ref_rate);
168 ath79_uart_clk.rate = ath79_ref_clk.rate; 209 ath79_add_sys_clkdev("cpu", cpu_rate);
210 ath79_add_sys_clkdev("ddr", ddr_rate);
211 ath79_add_sys_clkdev("ahb", ahb_rate);
212
213 clk_add_alias("wdt", NULL, "ahb", NULL);
214 clk_add_alias("uart", NULL, "ref", NULL);
169} 215}
170 216
171static u32 __init ar934x_get_pll_freq(u32 ref, u32 ref_div, u32 nint, u32 nfrac, 217static u32 __init ar934x_get_pll_freq(u32 ref, u32 ref_div, u32 nint, u32 nfrac,
@@ -174,12 +220,12 @@ static u32 __init ar934x_get_pll_freq(u32 ref, u32 ref_div, u32 nint, u32 nfrac,
174 u64 t; 220 u64 t;
175 u32 ret; 221 u32 ret;
176 222
177 t = ath79_ref_clk.rate; 223 t = ref;
178 t *= nint; 224 t *= nint;
179 do_div(t, ref_div); 225 do_div(t, ref_div);
180 ret = t; 226 ret = t;
181 227
182 t = ath79_ref_clk.rate; 228 t = ref;
183 t *= nfrac; 229 t *= nfrac;
184 do_div(t, ref_div * frac); 230 do_div(t, ref_div * frac);
185 ret += t; 231 ret += t;
@@ -190,6 +236,10 @@ static u32 __init ar934x_get_pll_freq(u32 ref, u32 ref_div, u32 nint, u32 nfrac,
190 236
191static void __init ar934x_clocks_init(void) 237static void __init ar934x_clocks_init(void)
192{ 238{
239 unsigned long ref_rate;
240 unsigned long cpu_rate;
241 unsigned long ddr_rate;
242 unsigned long ahb_rate;
193 u32 pll, out_div, ref_div, nint, nfrac, frac, clk_ctrl, postdiv; 243 u32 pll, out_div, ref_div, nint, nfrac, frac, clk_ctrl, postdiv;
194 u32 cpu_pll, ddr_pll; 244 u32 cpu_pll, ddr_pll;
195 u32 bootstrap; 245 u32 bootstrap;
@@ -199,9 +249,9 @@ static void __init ar934x_clocks_init(void)
199 249
200 bootstrap = ath79_reset_rr(AR934X_RESET_REG_BOOTSTRAP); 250 bootstrap = ath79_reset_rr(AR934X_RESET_REG_BOOTSTRAP);
201 if (bootstrap & AR934X_BOOTSTRAP_REF_CLK_40) 251 if (bootstrap & AR934X_BOOTSTRAP_REF_CLK_40)
202 ath79_ref_clk.rate = 40 * 1000 * 1000; 252 ref_rate = 40 * 1000 * 1000;
203 else 253 else
204 ath79_ref_clk.rate = 25 * 1000 * 1000; 254 ref_rate = 25 * 1000 * 1000;
205 255
206 pll = __raw_readl(dpll_base + AR934X_SRIF_CPU_DPLL2_REG); 256 pll = __raw_readl(dpll_base + AR934X_SRIF_CPU_DPLL2_REG);
207 if (pll & AR934X_SRIF_DPLL2_LOCAL_PLL) { 257 if (pll & AR934X_SRIF_DPLL2_LOCAL_PLL) {
@@ -227,7 +277,7 @@ static void __init ar934x_clocks_init(void)
227 frac = 1 << 6; 277 frac = 1 << 6;
228 } 278 }
229 279
230 cpu_pll = ar934x_get_pll_freq(ath79_ref_clk.rate, ref_div, nint, 280 cpu_pll = ar934x_get_pll_freq(ref_rate, ref_div, nint,
231 nfrac, frac, out_div); 281 nfrac, frac, out_div);
232 282
233 pll = __raw_readl(dpll_base + AR934X_SRIF_DDR_DPLL2_REG); 283 pll = __raw_readl(dpll_base + AR934X_SRIF_DDR_DPLL2_REG);
@@ -254,7 +304,7 @@ static void __init ar934x_clocks_init(void)
254 frac = 1 << 10; 304 frac = 1 << 10;
255 } 305 }
256 306
257 ddr_pll = ar934x_get_pll_freq(ath79_ref_clk.rate, ref_div, nint, 307 ddr_pll = ar934x_get_pll_freq(ref_rate, ref_div, nint,
258 nfrac, frac, out_div); 308 nfrac, frac, out_div);
259 309
260 clk_ctrl = ath79_pll_rr(AR934X_PLL_CPU_DDR_CLK_CTRL_REG); 310 clk_ctrl = ath79_pll_rr(AR934X_PLL_CPU_DDR_CLK_CTRL_REG);
@@ -263,49 +313,58 @@ static void __init ar934x_clocks_init(void)
263 AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_POST_DIV_MASK; 313 AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_POST_DIV_MASK;
264 314
265 if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_PLL_BYPASS) 315 if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_CPU_PLL_BYPASS)
266 ath79_cpu_clk.rate = ath79_ref_clk.rate; 316 cpu_rate = ref_rate;
267 else if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_CPUCLK_FROM_CPUPLL) 317 else if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_CPUCLK_FROM_CPUPLL)
268 ath79_cpu_clk.rate = cpu_pll / (postdiv + 1); 318 cpu_rate = cpu_pll / (postdiv + 1);
269 else 319 else
270 ath79_cpu_clk.rate = ddr_pll / (postdiv + 1); 320 cpu_rate = ddr_pll / (postdiv + 1);
271 321
272 postdiv = (clk_ctrl >> AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_POST_DIV_SHIFT) & 322 postdiv = (clk_ctrl >> AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_POST_DIV_SHIFT) &
273 AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_POST_DIV_MASK; 323 AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_POST_DIV_MASK;
274 324
275 if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_PLL_BYPASS) 325 if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_DDR_PLL_BYPASS)
276 ath79_ddr_clk.rate = ath79_ref_clk.rate; 326 ddr_rate = ref_rate;
277 else if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_DDRCLK_FROM_DDRPLL) 327 else if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_DDRCLK_FROM_DDRPLL)
278 ath79_ddr_clk.rate = ddr_pll / (postdiv + 1); 328 ddr_rate = ddr_pll / (postdiv + 1);
279 else 329 else
280 ath79_ddr_clk.rate = cpu_pll / (postdiv + 1); 330 ddr_rate = cpu_pll / (postdiv + 1);
281 331
282 postdiv = (clk_ctrl >> AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_POST_DIV_SHIFT) & 332 postdiv = (clk_ctrl >> AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_POST_DIV_SHIFT) &
283 AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_POST_DIV_MASK; 333 AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_POST_DIV_MASK;
284 334
285 if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_PLL_BYPASS) 335 if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_AHB_PLL_BYPASS)
286 ath79_ahb_clk.rate = ath79_ref_clk.rate; 336 ahb_rate = ref_rate;
287 else if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_AHBCLK_FROM_DDRPLL) 337 else if (clk_ctrl & AR934X_PLL_CPU_DDR_CLK_CTRL_AHBCLK_FROM_DDRPLL)
288 ath79_ahb_clk.rate = ddr_pll / (postdiv + 1); 338 ahb_rate = ddr_pll / (postdiv + 1);
289 else 339 else
290 ath79_ahb_clk.rate = cpu_pll / (postdiv + 1); 340 ahb_rate = cpu_pll / (postdiv + 1);
341
342 ath79_add_sys_clkdev("ref", ref_rate);
343 ath79_add_sys_clkdev("cpu", cpu_rate);
344 ath79_add_sys_clkdev("ddr", ddr_rate);
345 ath79_add_sys_clkdev("ahb", ahb_rate);
291 346
292 ath79_wdt_clk.rate = ath79_ref_clk.rate; 347 clk_add_alias("wdt", NULL, "ref", NULL);
293 ath79_uart_clk.rate = ath79_ref_clk.rate; 348 clk_add_alias("uart", NULL, "ref", NULL);
294 349
295 iounmap(dpll_base); 350 iounmap(dpll_base);
296} 351}
297 352
298static void __init qca955x_clocks_init(void) 353static void __init qca955x_clocks_init(void)
299{ 354{
355 unsigned long ref_rate;
356 unsigned long cpu_rate;
357 unsigned long ddr_rate;
358 unsigned long ahb_rate;
300 u32 pll, out_div, ref_div, nint, frac, clk_ctrl, postdiv; 359 u32 pll, out_div, ref_div, nint, frac, clk_ctrl, postdiv;
301 u32 cpu_pll, ddr_pll; 360 u32 cpu_pll, ddr_pll;
302 u32 bootstrap; 361 u32 bootstrap;
303 362
304 bootstrap = ath79_reset_rr(QCA955X_RESET_REG_BOOTSTRAP); 363 bootstrap = ath79_reset_rr(QCA955X_RESET_REG_BOOTSTRAP);
305 if (bootstrap & QCA955X_BOOTSTRAP_REF_CLK_40) 364 if (bootstrap & QCA955X_BOOTSTRAP_REF_CLK_40)
306 ath79_ref_clk.rate = 40 * 1000 * 1000; 365 ref_rate = 40 * 1000 * 1000;
307 else 366 else
308 ath79_ref_clk.rate = 25 * 1000 * 1000; 367 ref_rate = 25 * 1000 * 1000;
309 368
310 pll = ath79_pll_rr(QCA955X_PLL_CPU_CONFIG_REG); 369 pll = ath79_pll_rr(QCA955X_PLL_CPU_CONFIG_REG);
311 out_div = (pll >> QCA955X_PLL_CPU_CONFIG_OUTDIV_SHIFT) & 370 out_div = (pll >> QCA955X_PLL_CPU_CONFIG_OUTDIV_SHIFT) &
@@ -317,8 +376,8 @@ static void __init qca955x_clocks_init(void)
317 frac = (pll >> QCA955X_PLL_CPU_CONFIG_NFRAC_SHIFT) & 376 frac = (pll >> QCA955X_PLL_CPU_CONFIG_NFRAC_SHIFT) &
318 QCA955X_PLL_CPU_CONFIG_NFRAC_MASK; 377 QCA955X_PLL_CPU_CONFIG_NFRAC_MASK;
319 378
320 cpu_pll = nint * ath79_ref_clk.rate / ref_div; 379 cpu_pll = nint * ref_rate / ref_div;
321 cpu_pll += frac * ath79_ref_clk.rate / (ref_div * (1 << 6)); 380 cpu_pll += frac * ref_rate / (ref_div * (1 << 6));
322 cpu_pll /= (1 << out_div); 381 cpu_pll /= (1 << out_div);
323 382
324 pll = ath79_pll_rr(QCA955X_PLL_DDR_CONFIG_REG); 383 pll = ath79_pll_rr(QCA955X_PLL_DDR_CONFIG_REG);
@@ -331,8 +390,8 @@ static void __init qca955x_clocks_init(void)
331 frac = (pll >> QCA955X_PLL_DDR_CONFIG_NFRAC_SHIFT) & 390 frac = (pll >> QCA955X_PLL_DDR_CONFIG_NFRAC_SHIFT) &
332 QCA955X_PLL_DDR_CONFIG_NFRAC_MASK; 391 QCA955X_PLL_DDR_CONFIG_NFRAC_MASK;
333 392
334 ddr_pll = nint * ath79_ref_clk.rate / ref_div; 393 ddr_pll = nint * ref_rate / ref_div;
335 ddr_pll += frac * ath79_ref_clk.rate / (ref_div * (1 << 10)); 394 ddr_pll += frac * ref_rate / (ref_div * (1 << 10));
336 ddr_pll /= (1 << out_div); 395 ddr_pll /= (1 << out_div);
337 396
338 clk_ctrl = ath79_pll_rr(QCA955X_PLL_CLK_CTRL_REG); 397 clk_ctrl = ath79_pll_rr(QCA955X_PLL_CLK_CTRL_REG);
@@ -341,34 +400,39 @@ static void __init qca955x_clocks_init(void)
341 QCA955X_PLL_CLK_CTRL_CPU_POST_DIV_MASK; 400 QCA955X_PLL_CLK_CTRL_CPU_POST_DIV_MASK;
342 401
343 if (clk_ctrl & QCA955X_PLL_CLK_CTRL_CPU_PLL_BYPASS) 402 if (clk_ctrl & QCA955X_PLL_CLK_CTRL_CPU_PLL_BYPASS)
344 ath79_cpu_clk.rate = ath79_ref_clk.rate; 403 cpu_rate = ref_rate;
345 else if (clk_ctrl & QCA955X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL) 404 else if (clk_ctrl & QCA955X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL)
346 ath79_cpu_clk.rate = ddr_pll / (postdiv + 1); 405 cpu_rate = ddr_pll / (postdiv + 1);
347 else 406 else
348 ath79_cpu_clk.rate = cpu_pll / (postdiv + 1); 407 cpu_rate = cpu_pll / (postdiv + 1);
349 408
350 postdiv = (clk_ctrl >> QCA955X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT) & 409 postdiv = (clk_ctrl >> QCA955X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT) &
351 QCA955X_PLL_CLK_CTRL_DDR_POST_DIV_MASK; 410 QCA955X_PLL_CLK_CTRL_DDR_POST_DIV_MASK;
352 411
353 if (clk_ctrl & QCA955X_PLL_CLK_CTRL_DDR_PLL_BYPASS) 412 if (clk_ctrl & QCA955X_PLL_CLK_CTRL_DDR_PLL_BYPASS)
354 ath79_ddr_clk.rate = ath79_ref_clk.rate; 413 ddr_rate = ref_rate;
355 else if (clk_ctrl & QCA955X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL) 414 else if (clk_ctrl & QCA955X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL)
356 ath79_ddr_clk.rate = cpu_pll / (postdiv + 1); 415 ddr_rate = cpu_pll / (postdiv + 1);
357 else 416 else
358 ath79_ddr_clk.rate = ddr_pll / (postdiv + 1); 417 ddr_rate = ddr_pll / (postdiv + 1);
359 418
360 postdiv = (clk_ctrl >> QCA955X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT) & 419 postdiv = (clk_ctrl >> QCA955X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT) &
361 QCA955X_PLL_CLK_CTRL_AHB_POST_DIV_MASK; 420 QCA955X_PLL_CLK_CTRL_AHB_POST_DIV_MASK;
362 421
363 if (clk_ctrl & QCA955X_PLL_CLK_CTRL_AHB_PLL_BYPASS) 422 if (clk_ctrl & QCA955X_PLL_CLK_CTRL_AHB_PLL_BYPASS)
364 ath79_ahb_clk.rate = ath79_ref_clk.rate; 423 ahb_rate = ref_rate;
365 else if (clk_ctrl & QCA955X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL) 424 else if (clk_ctrl & QCA955X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL)
366 ath79_ahb_clk.rate = ddr_pll / (postdiv + 1); 425 ahb_rate = ddr_pll / (postdiv + 1);
367 else 426 else
368 ath79_ahb_clk.rate = cpu_pll / (postdiv + 1); 427 ahb_rate = cpu_pll / (postdiv + 1);
369 428
370 ath79_wdt_clk.rate = ath79_ref_clk.rate; 429 ath79_add_sys_clkdev("ref", ref_rate);
371 ath79_uart_clk.rate = ath79_ref_clk.rate; 430 ath79_add_sys_clkdev("cpu", cpu_rate);
431 ath79_add_sys_clkdev("ddr", ddr_rate);
432 ath79_add_sys_clkdev("ahb", ahb_rate);
433
434 clk_add_alias("wdt", NULL, "ref", NULL);
435 clk_add_alias("uart", NULL, "ref", NULL);
372} 436}
373 437
374void __init ath79_clocks_init(void) 438void __init ath79_clocks_init(void)
@@ -387,46 +451,27 @@ void __init ath79_clocks_init(void)
387 qca955x_clocks_init(); 451 qca955x_clocks_init();
388 else 452 else
389 BUG(); 453 BUG();
390
391 pr_info("Clocks: CPU:%lu.%03luMHz, DDR:%lu.%03luMHz, AHB:%lu.%03luMHz, "
392 "Ref:%lu.%03luMHz",
393 ath79_cpu_clk.rate / 1000000,
394 (ath79_cpu_clk.rate / 1000) % 1000,
395 ath79_ddr_clk.rate / 1000000,
396 (ath79_ddr_clk.rate / 1000) % 1000,
397 ath79_ahb_clk.rate / 1000000,
398 (ath79_ahb_clk.rate / 1000) % 1000,
399 ath79_ref_clk.rate / 1000000,
400 (ath79_ref_clk.rate / 1000) % 1000);
401} 454}
402 455
403/* 456unsigned long __init
404 * Linux clock API 457ath79_get_sys_clk_rate(const char *id)
405 */
406struct clk *clk_get(struct device *dev, const char *id)
407{ 458{
408 if (!strcmp(id, "ref")) 459 struct clk *clk;
409 return &ath79_ref_clk; 460 unsigned long rate;
410
411 if (!strcmp(id, "cpu"))
412 return &ath79_cpu_clk;
413
414 if (!strcmp(id, "ddr"))
415 return &ath79_ddr_clk;
416
417 if (!strcmp(id, "ahb"))
418 return &ath79_ahb_clk;
419 461
420 if (!strcmp(id, "wdt")) 462 clk = clk_get(NULL, id);
421 return &ath79_wdt_clk; 463 if (IS_ERR(clk))
464 panic("unable to get %s clock, err=%d", id, (int) PTR_ERR(clk));
422 465
423 if (!strcmp(id, "uart")) 466 rate = clk_get_rate(clk);
424 return &ath79_uart_clk; 467 clk_put(clk);
425 468
426 return ERR_PTR(-ENOENT); 469 return rate;
427} 470}
428EXPORT_SYMBOL(clk_get);
429 471
472/*
473 * Linux clock API
474 */
430int clk_enable(struct clk *clk) 475int clk_enable(struct clk *clk)
431{ 476{
432 return 0; 477 return 0;
@@ -443,8 +488,3 @@ unsigned long clk_get_rate(struct clk *clk)
443 return clk->rate; 488 return clk->rate;
444} 489}
445EXPORT_SYMBOL(clk_get_rate); 490EXPORT_SYMBOL(clk_get_rate);
446
447void clk_put(struct clk *clk)
448{
449}
450EXPORT_SYMBOL(clk_put);
diff --git a/arch/mips/ath79/common.h b/arch/mips/ath79/common.h
index 561906c2345e..648d2dafbc56 100644
--- a/arch/mips/ath79/common.h
+++ b/arch/mips/ath79/common.h
@@ -21,6 +21,8 @@
21#define ATH79_MEM_SIZE_MAX (128 * 1024 * 1024) 21#define ATH79_MEM_SIZE_MAX (128 * 1024 * 1024)
22 22
23void ath79_clocks_init(void); 23void ath79_clocks_init(void);
24unsigned long ath79_get_sys_clk_rate(const char *id);
25
24void ath79_ddr_wb_flush(unsigned int reg); 26void ath79_ddr_wb_flush(unsigned int reg);
25 27
26void ath79_gpio_function_enable(u32 mask); 28void ath79_gpio_function_enable(u32 mask);
diff --git a/arch/mips/ath79/dev-common.c b/arch/mips/ath79/dev-common.c
index a3a2741d0688..c3b04c929f29 100644
--- a/arch/mips/ath79/dev-common.c
+++ b/arch/mips/ath79/dev-common.c
@@ -81,21 +81,19 @@ static struct platform_device ar933x_uart_device = {
81 81
82void __init ath79_register_uart(void) 82void __init ath79_register_uart(void)
83{ 83{
84 struct clk *clk; 84 unsigned long uart_clk_rate;
85 85
86 clk = clk_get(NULL, "uart"); 86 uart_clk_rate = ath79_get_sys_clk_rate("uart");
87 if (IS_ERR(clk))
88 panic("unable to get UART clock, err=%ld", PTR_ERR(clk));
89 87
90 if (soc_is_ar71xx() || 88 if (soc_is_ar71xx() ||
91 soc_is_ar724x() || 89 soc_is_ar724x() ||
92 soc_is_ar913x() || 90 soc_is_ar913x() ||
93 soc_is_ar934x() || 91 soc_is_ar934x() ||
94 soc_is_qca955x()) { 92 soc_is_qca955x()) {
95 ath79_uart_data[0].uartclk = clk_get_rate(clk); 93 ath79_uart_data[0].uartclk = uart_clk_rate;
96 platform_device_register(&ath79_uart_device); 94 platform_device_register(&ath79_uart_device);
97 } else if (soc_is_ar933x()) { 95 } else if (soc_is_ar933x()) {
98 ar933x_uart_data.uartclk = clk_get_rate(clk); 96 ar933x_uart_data.uartclk = uart_clk_rate;
99 platform_device_register(&ar933x_uart_device); 97 platform_device_register(&ar933x_uart_device);
100 } else { 98 } else {
101 BUG(); 99 BUG();
diff --git a/arch/mips/ath79/setup.c b/arch/mips/ath79/setup.c
index 80f4ecd42b0d..64807a4809d0 100644
--- a/arch/mips/ath79/setup.c
+++ b/arch/mips/ath79/setup.c
@@ -200,7 +200,6 @@ void __init plat_mem_setup(void)
200 200
201 ath79_detect_sys_type(); 201 ath79_detect_sys_type();
202 detect_memory_region(0, ATH79_MEM_SIZE_MIN, ATH79_MEM_SIZE_MAX); 202 detect_memory_region(0, ATH79_MEM_SIZE_MIN, ATH79_MEM_SIZE_MAX);
203 ath79_clocks_init();
204 203
205 _machine_restart = ath79_restart; 204 _machine_restart = ath79_restart;
206 _machine_halt = ath79_halt; 205 _machine_halt = ath79_halt;
@@ -209,13 +208,25 @@ void __init plat_mem_setup(void)
209 208
210void __init plat_time_init(void) 209void __init plat_time_init(void)
211{ 210{
212 struct clk *clk; 211 unsigned long cpu_clk_rate;
212 unsigned long ahb_clk_rate;
213 unsigned long ddr_clk_rate;
214 unsigned long ref_clk_rate;
215
216 ath79_clocks_init();
217
218 cpu_clk_rate = ath79_get_sys_clk_rate("cpu");
219 ahb_clk_rate = ath79_get_sys_clk_rate("ahb");
220 ddr_clk_rate = ath79_get_sys_clk_rate("ddr");
221 ref_clk_rate = ath79_get_sys_clk_rate("ref");
213 222
214 clk = clk_get(NULL, "cpu"); 223 pr_info("Clocks: CPU:%lu.%03luMHz, DDR:%lu.%03luMHz, AHB:%lu.%03luMHz, Ref:%lu.%03luMHz",
215 if (IS_ERR(clk)) 224 cpu_clk_rate / 1000000, (cpu_clk_rate / 1000) % 1000,
216 panic("unable to get CPU clock, err=%ld", PTR_ERR(clk)); 225 ddr_clk_rate / 1000000, (ddr_clk_rate / 1000) % 1000,
226 ahb_clk_rate / 1000000, (ahb_clk_rate / 1000) % 1000,
227 ref_clk_rate / 1000000, (ref_clk_rate / 1000) % 1000);
217 228
218 mips_hpt_frequency = clk_get_rate(clk) / 2; 229 mips_hpt_frequency = cpu_clk_rate / 2;
219} 230}
220 231
221static int __init ath79_setup(void) 232static int __init ath79_setup(void)
diff --git a/arch/mips/bcm63xx/cpu.c b/arch/mips/bcm63xx/cpu.c
index 7e17374a9ae8..b713cd64b087 100644
--- a/arch/mips/bcm63xx/cpu.c
+++ b/arch/mips/bcm63xx/cpu.c
@@ -306,14 +306,14 @@ void __init bcm63xx_cpu_init(void)
306 306
307 switch (c->cputype) { 307 switch (c->cputype) {
308 case CPU_BMIPS3300: 308 case CPU_BMIPS3300:
309 if ((read_c0_prid() & 0xff00) != PRID_IMP_BMIPS3300_ALT) 309 if ((read_c0_prid() & PRID_IMP_MASK) != PRID_IMP_BMIPS3300_ALT)
310 __cpu_name[cpu] = "Broadcom BCM6338"; 310 __cpu_name[cpu] = "Broadcom BCM6338";
311 /* fall-through */ 311 /* fall-through */
312 case CPU_BMIPS32: 312 case CPU_BMIPS32:
313 chipid_reg = BCM_6345_PERF_BASE; 313 chipid_reg = BCM_6345_PERF_BASE;
314 break; 314 break;
315 case CPU_BMIPS4350: 315 case CPU_BMIPS4350:
316 switch ((read_c0_prid() & 0xff)) { 316 switch ((read_c0_prid() & PRID_REV_MASK)) {
317 case 0x04: 317 case 0x04:
318 chipid_reg = BCM_3368_PERF_BASE; 318 chipid_reg = BCM_3368_PERF_BASE;
319 break; 319 break;
diff --git a/arch/mips/bcm63xx/nvram.c b/arch/mips/bcm63xx/nvram.c
index e652e578a679..4b50d40f7451 100644
--- a/arch/mips/bcm63xx/nvram.c
+++ b/arch/mips/bcm63xx/nvram.c
@@ -35,6 +35,8 @@ struct bcm963xx_nvram {
35 u32 checksum_high; 35 u32 checksum_high;
36}; 36};
37 37
38#define BCM63XX_DEFAULT_PSI_SIZE 64
39
38static struct bcm963xx_nvram nvram; 40static struct bcm963xx_nvram nvram;
39static int mac_addr_used; 41static int mac_addr_used;
40 42
@@ -114,3 +116,12 @@ int bcm63xx_nvram_get_mac_address(u8 *mac)
114 return 0; 116 return 0;
115} 117}
116EXPORT_SYMBOL(bcm63xx_nvram_get_mac_address); 118EXPORT_SYMBOL(bcm63xx_nvram_get_mac_address);
119
120int bcm63xx_nvram_get_psi_size(void)
121{
122 if (nvram.psi_size > 0)
123 return nvram.psi_size;
124
125 return BCM63XX_DEFAULT_PSI_SIZE;
126}
127EXPORT_SYMBOL(bcm63xx_nvram_get_psi_size);
diff --git a/arch/mips/boot/.gitignore b/arch/mips/boot/.gitignore
index f210b09ececc..a73d6e2c4f64 100644
--- a/arch/mips/boot/.gitignore
+++ b/arch/mips/boot/.gitignore
@@ -4,3 +4,4 @@ vmlinux.*
4zImage 4zImage
5zImage.tmp 5zImage.tmp
6calc_vmlinuz_load_addr 6calc_vmlinuz_load_addr
7uImage
diff --git a/arch/mips/boot/Makefile b/arch/mips/boot/Makefile
index 851261e9fdc0..1466c0026093 100644
--- a/arch/mips/boot/Makefile
+++ b/arch/mips/boot/Makefile
@@ -40,3 +40,18 @@ quiet_cmd_srec = OBJCOPY $@
40 cmd_srec = $(OBJCOPY) -S -O srec $(strip-flags) $(VMLINUX) $@ 40 cmd_srec = $(OBJCOPY) -S -O srec $(strip-flags) $(VMLINUX) $@
41$(obj)/vmlinux.srec: $(VMLINUX) FORCE 41$(obj)/vmlinux.srec: $(VMLINUX) FORCE
42 $(call if_changed,srec) 42 $(call if_changed,srec)
43
44UIMAGE_LOADADDR = $(VMLINUX_LOAD_ADDRESS)
45UIMAGE_ENTRYADDR = $(VMLINUX_ENTRY_ADDRESS)
46
47$(obj)/vmlinux.bin.gz: $(obj)/vmlinux.bin FORCE
48 $(call if_changed,gzip)
49
50targets += uImage.gz
51$(obj)/uImage.gz: $(obj)/vmlinux.bin.gz FORCE
52 $(call if_changed,uimage,gzip)
53
54targets += uImage
55$(obj)/uImage: $(obj)/uImage.gz FORCE
56 @ln -sf $(notdir $<) $@
57 @echo ' Image $@ is ready'
diff --git a/arch/mips/boot/compressed/Makefile b/arch/mips/boot/compressed/Makefile
index bb1dbf4abb9d..0048c0897896 100644
--- a/arch/mips/boot/compressed/Makefile
+++ b/arch/mips/boot/compressed/Makefile
@@ -25,7 +25,7 @@ KBUILD_CFLAGS := $(LINUXINCLUDE) $(KBUILD_CFLAGS) -D__KERNEL__ \
25 25
26KBUILD_AFLAGS := $(LINUXINCLUDE) $(KBUILD_AFLAGS) -D__ASSEMBLY__ \ 26KBUILD_AFLAGS := $(LINUXINCLUDE) $(KBUILD_AFLAGS) -D__ASSEMBLY__ \
27 -DBOOT_HEAP_SIZE=$(BOOT_HEAP_SIZE) \ 27 -DBOOT_HEAP_SIZE=$(BOOT_HEAP_SIZE) \
28 -DKERNEL_ENTRY=0x$(shell $(NM) $(objtree)/$(KBUILD_IMAGE) 2>/dev/null | grep " kernel_entry" | cut -f1 -d \ ) 28 -DKERNEL_ENTRY=$(VMLINUX_ENTRY_ADDRESS)
29 29
30targets := head.o decompress.o dbg.o uart-16550.o uart-alchemy.o 30targets := head.o decompress.o dbg.o uart-16550.o uart-alchemy.o
31 31
diff --git a/arch/mips/boot/dts/include/dt-bindings b/arch/mips/boot/dts/include/dt-bindings
new file mode 120000
index 000000000000..08c00e4972fa
--- /dev/null
+++ b/arch/mips/boot/dts/include/dt-bindings
@@ -0,0 +1 @@
../../../../../include/dt-bindings \ No newline at end of file
diff --git a/arch/mips/cavium-octeon/csrc-octeon.c b/arch/mips/cavium-octeon/csrc-octeon.c
index 02193953eb9e..b752c4ed0b79 100644
--- a/arch/mips/cavium-octeon/csrc-octeon.c
+++ b/arch/mips/cavium-octeon/csrc-octeon.c
@@ -12,6 +12,7 @@
12#include <linux/smp.h> 12#include <linux/smp.h>
13 13
14#include <asm/cpu-info.h> 14#include <asm/cpu-info.h>
15#include <asm/cpu-type.h>
15#include <asm/time.h> 16#include <asm/time.h>
16 17
17#include <asm/octeon/octeon.h> 18#include <asm/octeon/octeon.h>
diff --git a/arch/mips/cavium-octeon/octeon-irq.c b/arch/mips/cavium-octeon/octeon-irq.c
index 9d36774bded1..25fbfae06c1f 100644
--- a/arch/mips/cavium-octeon/octeon-irq.c
+++ b/arch/mips/cavium-octeon/octeon-irq.c
@@ -1776,7 +1776,7 @@ asmlinkage void plat_irq_dispatch(void)
1776 1776
1777#ifdef CONFIG_HOTPLUG_CPU 1777#ifdef CONFIG_HOTPLUG_CPU
1778 1778
1779void fixup_irqs(void) 1779void octeon_fixup_irqs(void)
1780{ 1780{
1781 irq_cpu_offline(); 1781 irq_cpu_offline();
1782} 1782}
diff --git a/arch/mips/cavium-octeon/setup.c b/arch/mips/cavium-octeon/setup.c
index 48b08eb9d9e4..b212ae12e5ac 100644
--- a/arch/mips/cavium-octeon/setup.c
+++ b/arch/mips/cavium-octeon/setup.c
@@ -8,6 +8,7 @@
8 * written by Ralf Baechle <ralf@linux-mips.org> 8 * written by Ralf Baechle <ralf@linux-mips.org>
9 */ 9 */
10#include <linux/compiler.h> 10#include <linux/compiler.h>
11#include <linux/vmalloc.h>
11#include <linux/init.h> 12#include <linux/init.h>
12#include <linux/kernel.h> 13#include <linux/kernel.h>
13#include <linux/console.h> 14#include <linux/console.h>
@@ -1139,3 +1140,30 @@ static int __init edac_devinit(void)
1139 return err; 1140 return err;
1140} 1141}
1141device_initcall(edac_devinit); 1142device_initcall(edac_devinit);
1143
1144static void __initdata *octeon_dummy_iospace;
1145
1146static int __init octeon_no_pci_init(void)
1147{
1148 /*
1149 * Initially assume there is no PCI. The PCI/PCIe platform code will
1150 * later re-initialize these to correct values if they are present.
1151 */
1152 octeon_dummy_iospace = vzalloc(IO_SPACE_LIMIT);
1153 set_io_port_base((unsigned long)octeon_dummy_iospace);
1154 ioport_resource.start = MAX_RESOURCE;
1155 ioport_resource.end = 0;
1156 return 0;
1157}
1158core_initcall(octeon_no_pci_init);
1159
1160static int __init octeon_no_pci_release(void)
1161{
1162 /*
1163 * Release the allocated memory if a real IO space is there.
1164 */
1165 if ((unsigned long)octeon_dummy_iospace != mips_io_port_base)
1166 vfree(octeon_dummy_iospace);
1167 return 0;
1168}
1169late_initcall(octeon_no_pci_release);
diff --git a/arch/mips/cavium-octeon/smp.c b/arch/mips/cavium-octeon/smp.c
index 138cc80c5928..24a2167db778 100644
--- a/arch/mips/cavium-octeon/smp.c
+++ b/arch/mips/cavium-octeon/smp.c
@@ -255,8 +255,6 @@ static void octeon_cpus_done(void)
255/* State of each CPU. */ 255/* State of each CPU. */
256DEFINE_PER_CPU(int, cpu_state); 256DEFINE_PER_CPU(int, cpu_state);
257 257
258extern void fixup_irqs(void);
259
260static int octeon_cpu_disable(void) 258static int octeon_cpu_disable(void)
261{ 259{
262 unsigned int cpu = smp_processor_id(); 260 unsigned int cpu = smp_processor_id();
@@ -267,7 +265,7 @@ static int octeon_cpu_disable(void)
267 set_cpu_online(cpu, false); 265 set_cpu_online(cpu, false);
268 cpu_clear(cpu, cpu_callin_map); 266 cpu_clear(cpu, cpu_callin_map);
269 local_irq_disable(); 267 local_irq_disable();
270 fixup_irqs(); 268 octeon_fixup_irqs();
271 local_irq_enable(); 269 local_irq_enable();
272 270
273 flush_cache_all(); 271 flush_cache_all();
diff --git a/arch/mips/configs/xway_defconfig b/arch/mips/configs/xway_defconfig
new file mode 100644
index 000000000000..8987846240f7
--- /dev/null
+++ b/arch/mips/configs/xway_defconfig
@@ -0,0 +1,159 @@
1CONFIG_LANTIQ=y
2CONFIG_XRX200_PHY_FW=y
3CONFIG_CPU_MIPS32_R2=y
4# CONFIG_COMPACTION is not set
5# CONFIG_CROSS_MEMORY_ATTACH is not set
6CONFIG_HZ_100=y
7# CONFIG_SECCOMP is not set
8# CONFIG_LOCALVERSION_AUTO is not set
9CONFIG_SYSVIPC=y
10CONFIG_HIGH_RES_TIMERS=y
11CONFIG_BLK_DEV_INITRD=y
12# CONFIG_RD_GZIP is not set
13CONFIG_CC_OPTIMIZE_FOR_SIZE=y
14CONFIG_KALLSYMS_ALL=y
15# CONFIG_AIO is not set
16CONFIG_EMBEDDED=y
17# CONFIG_VM_EVENT_COUNTERS is not set
18# CONFIG_SLUB_DEBUG is not set
19# CONFIG_COMPAT_BRK is not set
20CONFIG_MODULES=y
21CONFIG_MODULE_UNLOAD=y
22# CONFIG_BLK_DEV_BSG is not set
23CONFIG_PARTITION_ADVANCED=y
24# CONFIG_IOSCHED_CFQ is not set
25# CONFIG_COREDUMP is not set
26# CONFIG_SUSPEND is not set
27CONFIG_NET=y
28CONFIG_PACKET=y
29CONFIG_UNIX=y
30CONFIG_INET=y
31CONFIG_IP_MULTICAST=y
32CONFIG_IP_ADVANCED_ROUTER=y
33CONFIG_IP_MULTIPLE_TABLES=y
34CONFIG_IP_ROUTE_MULTIPATH=y
35CONFIG_IP_ROUTE_VERBOSE=y
36CONFIG_IP_MROUTE=y
37CONFIG_IP_MROUTE_MULTIPLE_TABLES=y
38CONFIG_ARPD=y
39CONFIG_SYN_COOKIES=y
40# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
41# CONFIG_INET_XFRM_MODE_TUNNEL is not set
42# CONFIG_INET_XFRM_MODE_BEET is not set
43# CONFIG_INET_LRO is not set
44# CONFIG_INET_DIAG is not set
45CONFIG_TCP_CONG_ADVANCED=y
46# CONFIG_TCP_CONG_BIC is not set
47# CONFIG_TCP_CONG_WESTWOOD is not set
48# CONFIG_TCP_CONG_HTCP is not set
49# CONFIG_IPV6 is not set
50CONFIG_NETFILTER=y
51# CONFIG_BRIDGE_NETFILTER is not set
52CONFIG_NF_CONNTRACK=m
53CONFIG_NF_CONNTRACK_FTP=m
54CONFIG_NF_CONNTRACK_IRC=m
55CONFIG_NETFILTER_XT_TARGET_CT=m
56CONFIG_NETFILTER_XT_TARGET_LOG=m
57CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
58CONFIG_NETFILTER_XT_MATCH_COMMENT=m
59CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
60CONFIG_NETFILTER_XT_MATCH_LIMIT=m
61CONFIG_NETFILTER_XT_MATCH_MAC=m
62CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
63CONFIG_NETFILTER_XT_MATCH_STATE=m
64CONFIG_NF_CONNTRACK_IPV4=m
65# CONFIG_NF_CONNTRACK_PROC_COMPAT is not set
66CONFIG_IP_NF_IPTABLES=m
67CONFIG_IP_NF_FILTER=m
68CONFIG_IP_NF_TARGET_REJECT=m
69CONFIG_IP_NF_MANGLE=m
70CONFIG_IP_NF_RAW=m
71CONFIG_BRIDGE=y
72# CONFIG_BRIDGE_IGMP_SNOOPING is not set
73CONFIG_VLAN_8021Q=y
74CONFIG_NET_SCHED=y
75CONFIG_HAMRADIO=y
76CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
77# CONFIG_FIRMWARE_IN_KERNEL is not set
78CONFIG_MTD=y
79CONFIG_MTD_CMDLINE_PARTS=y
80CONFIG_MTD_BLOCK=y
81CONFIG_MTD_CFI=y
82CONFIG_MTD_CFI_AMDSTD=y
83CONFIG_MTD_COMPLEX_MAPPINGS=y
84CONFIG_MTD_PHYSMAP=y
85CONFIG_MTD_PHYSMAP_OF=y
86CONFIG_MTD_LANTIQ=y
87CONFIG_EEPROM_93CX6=m
88CONFIG_SCSI=y
89CONFIG_BLK_DEV_SD=y
90CONFIG_NETDEVICES=y
91CONFIG_LANTIQ_ETOP=y
92# CONFIG_NET_VENDOR_WIZNET is not set
93CONFIG_PHYLIB=y
94CONFIG_PPP=m
95CONFIG_PPP_FILTER=y
96CONFIG_PPP_MULTILINK=y
97CONFIG_PPPOE=m
98CONFIG_PPP_ASYNC=m
99CONFIG_ISDN=y
100CONFIG_INPUT=m
101CONFIG_INPUT_POLLDEV=m
102# CONFIG_INPUT_MOUSEDEV is not set
103# CONFIG_KEYBOARD_ATKBD is not set
104# CONFIG_INPUT_MOUSE is not set
105CONFIG_INPUT_MISC=y
106# CONFIG_SERIO is not set
107# CONFIG_VT is not set
108# CONFIG_LEGACY_PTYS is not set
109# CONFIG_DEVKMEM is not set
110CONFIG_SERIAL_8250=y
111CONFIG_SERIAL_8250_CONSOLE=y
112CONFIG_SERIAL_8250_RUNTIME_UARTS=2
113CONFIG_SERIAL_OF_PLATFORM=y
114CONFIG_SPI=y
115CONFIG_GPIO_MM_LANTIQ=y
116CONFIG_GPIO_STP_XWAY=y
117# CONFIG_HWMON is not set
118CONFIG_WATCHDOG=y
119# CONFIG_HID is not set
120# CONFIG_USB_HID is not set
121CONFIG_USB=y
122CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
123CONFIG_USB_STORAGE=y
124CONFIG_USB_STORAGE_DEBUG=y
125CONFIG_NEW_LEDS=y
126CONFIG_LEDS_CLASS=y
127CONFIG_LEDS_TRIGGERS=y
128CONFIG_LEDS_TRIGGER_TIMER=y
129CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
130CONFIG_STAGING=y
131# CONFIG_IOMMU_SUPPORT is not set
132# CONFIG_DNOTIFY is not set
133# CONFIG_PROC_PAGE_MONITOR is not set
134CONFIG_TMPFS=y
135CONFIG_TMPFS_XATTR=y
136CONFIG_JFFS2_FS=y
137CONFIG_JFFS2_SUMMARY=y
138CONFIG_JFFS2_FS_XATTR=y
139# CONFIG_JFFS2_FS_POSIX_ACL is not set
140# CONFIG_JFFS2_FS_SECURITY is not set
141CONFIG_JFFS2_COMPRESSION_OPTIONS=y
142# CONFIG_JFFS2_ZLIB is not set
143CONFIG_SQUASHFS=y
144# CONFIG_SQUASHFS_ZLIB is not set
145CONFIG_SQUASHFS_XZ=y
146CONFIG_PRINTK_TIME=y
147# CONFIG_ENABLE_MUST_CHECK is not set
148CONFIG_STRIP_ASM_SYMS=y
149CONFIG_DEBUG_FS=y
150CONFIG_MAGIC_SYSRQ=y
151# CONFIG_SCHED_DEBUG is not set
152# CONFIG_FTRACE is not set
153CONFIG_CMDLINE_BOOL=y
154CONFIG_CRYPTO_MANAGER=m
155CONFIG_CRYPTO_ARC4=m
156# CONFIG_CRYPTO_ANSI_CPRNG is not set
157CONFIG_CRC_ITU_T=m
158CONFIG_CRC32_SARWATE=y
159CONFIG_AVERAGE=y
diff --git a/arch/mips/dec/ioasic-irq.c b/arch/mips/dec/ioasic-irq.c
index 824e08c73798..4b3e3a4375a6 100644
--- a/arch/mips/dec/ioasic-irq.c
+++ b/arch/mips/dec/ioasic-irq.c
@@ -51,6 +51,14 @@ static struct irq_chip ioasic_irq_type = {
51 .irq_unmask = unmask_ioasic_irq, 51 .irq_unmask = unmask_ioasic_irq,
52}; 52};
53 53
54void clear_ioasic_dma_irq(unsigned int irq)
55{
56 u32 sir;
57
58 sir = ~(1 << (irq - ioasic_irq_base));
59 ioasic_write(IO_REG_SIR, sir);
60}
61
54static struct irq_chip ioasic_dma_irq_type = { 62static struct irq_chip ioasic_dma_irq_type = {
55 .name = "IO-ASIC-DMA", 63 .name = "IO-ASIC-DMA",
56 .irq_ack = ack_ioasic_irq, 64 .irq_ack = ack_ioasic_irq,
diff --git a/arch/mips/dec/prom/init.c b/arch/mips/dec/prom/init.c
index ab169046e442..468f665de7bb 100644
--- a/arch/mips/dec/prom/init.c
+++ b/arch/mips/dec/prom/init.c
@@ -13,6 +13,7 @@
13 13
14#include <asm/bootinfo.h> 14#include <asm/bootinfo.h>
15#include <asm/cpu.h> 15#include <asm/cpu.h>
16#include <asm/cpu-type.h>
16#include <asm/processor.h> 17#include <asm/processor.h>
17 18
18#include <asm/dec/prom.h> 19#include <asm/dec/prom.h>
diff --git a/arch/mips/dec/time.c b/arch/mips/dec/time.c
index ea57f39e6736..1914e56f0d96 100644
--- a/arch/mips/dec/time.c
+++ b/arch/mips/dec/time.c
@@ -125,13 +125,18 @@ int rtc_mips_set_mmss(unsigned long nowtime)
125 125
126void __init plat_time_init(void) 126void __init plat_time_init(void)
127{ 127{
128 int ioasic_clock = 0;
128 u32 start, end; 129 u32 start, end;
129 int i = HZ / 10; 130 int i = HZ / 8;
130 131
131 /* Set up the rate of periodic DS1287 interrupts. */ 132 /* Set up the rate of periodic DS1287 interrupts. */
132 ds1287_set_base_clock(HZ); 133 ds1287_set_base_clock(HZ);
133 134
135 /* On some I/O ASIC systems we have the I/O ASIC's counter. */
136 if (IOASIC)
137 ioasic_clock = dec_ioasic_clocksource_init() == 0;
134 if (cpu_has_counter) { 138 if (cpu_has_counter) {
139 ds1287_timer_state();
135 while (!ds1287_timer_state()) 140 while (!ds1287_timer_state())
136 ; 141 ;
137 142
@@ -143,12 +148,24 @@ void __init plat_time_init(void)
143 148
144 end = read_c0_count(); 149 end = read_c0_count();
145 150
146 mips_hpt_frequency = (end - start) * 10; 151 mips_hpt_frequency = (end - start) * 8;
147 printk(KERN_INFO "MIPS counter frequency %dHz\n", 152 printk(KERN_INFO "MIPS counter frequency %dHz\n",
148 mips_hpt_frequency); 153 mips_hpt_frequency);
149 } else if (IOASIC) 154
150 /* For pre-R4k systems we use the I/O ASIC's counter. */ 155 /*
151 dec_ioasic_clocksource_init(); 156 * All R4k DECstations suffer from the CP0 Count erratum,
157 * so we can't use the timer as a clock source, and a clock
158 * event both at a time. An accurate wall clock is more
159 * important than a high-precision interval timer so only
160 * use the timer as a clock source, and not a clock event
161 * if there's no I/O ASIC counter available to serve as a
162 * clock source.
163 */
164 if (!ioasic_clock) {
165 init_r4k_clocksource();
166 mips_hpt_frequency = 0;
167 }
168 }
152 169
153 ds1287_clockevent_init(dec_interrupt[DEC_IRQ_RTC]); 170 ds1287_clockevent_init(dec_interrupt[DEC_IRQ_RTC]);
154} 171}
diff --git a/arch/mips/include/asm/Kbuild b/arch/mips/include/asm/Kbuild
index 9b54b7a403d4..454ddf9bb76f 100644
--- a/arch/mips/include/asm/Kbuild
+++ b/arch/mips/include/asm/Kbuild
@@ -1,2 +1,15 @@
1# MIPS headers 1# MIPS headers
2generic-y += cputime.h
3generic-y += current.h
4generic-y += emergency-restart.h
5generic-y += local64.h
6generic-y += mutex.h
7generic-y += parport.h
8generic-y += percpu.h
9generic-y += scatterlist.h
10generic-y += sections.h
11generic-y += segment.h
12generic-y += serial.h
2generic-y += trace_clock.h 13generic-y += trace_clock.h
14generic-y += ucontext.h
15generic-y += xor.h
diff --git a/arch/mips/include/asm/bmips.h b/arch/mips/include/asm/bmips.h
index 552a65a0cf2b..27bd060d716e 100644
--- a/arch/mips/include/asm/bmips.h
+++ b/arch/mips/include/asm/bmips.h
@@ -65,44 +65,33 @@ static inline unsigned long bmips_read_zscm_reg(unsigned int offset)
65{ 65{
66 unsigned long ret; 66 unsigned long ret;
67 67
68 __asm__ __volatile__( 68 barrier();
69 ".set push\n" 69 cache_op(Index_Load_Tag_S, ZSCM_REG_BASE + offset);
70 ".set noreorder\n" 70 __sync();
71 "cache %1, 0(%2)\n" 71 _ssnop();
72 "sync\n" 72 _ssnop();
73 "_ssnop\n" 73 _ssnop();
74 "_ssnop\n" 74 _ssnop();
75 "_ssnop\n" 75 _ssnop();
76 "_ssnop\n" 76 _ssnop();
77 "_ssnop\n" 77 _ssnop();
78 "_ssnop\n" 78 ret = read_c0_ddatalo();
79 "_ssnop\n" 79 _ssnop();
80 "mfc0 %0, $28, 3\n" 80
81 "_ssnop\n"
82 ".set pop\n"
83 : "=&r" (ret)
84 : "i" (Index_Load_Tag_S), "r" (ZSCM_REG_BASE + offset)
85 : "memory");
86 return ret; 81 return ret;
87} 82}
88 83
89static inline void bmips_write_zscm_reg(unsigned int offset, unsigned long data) 84static inline void bmips_write_zscm_reg(unsigned int offset, unsigned long data)
90{ 85{
91 __asm__ __volatile__( 86 write_c0_ddatalo(data);
92 ".set push\n" 87 _ssnop();
93 ".set noreorder\n" 88 _ssnop();
94 "mtc0 %0, $28, 3\n" 89 _ssnop();
95 "_ssnop\n" 90 cache_op(Index_Store_Tag_S, ZSCM_REG_BASE + offset);
96 "_ssnop\n" 91 _ssnop();
97 "_ssnop\n" 92 _ssnop();
98 "cache %1, 0(%2)\n" 93 _ssnop();
99 "_ssnop\n" 94 barrier();
100 "_ssnop\n"
101 "_ssnop\n"
102 : /* no outputs */
103 : "r" (data),
104 "i" (Index_Store_Tag_S), "r" (ZSCM_REG_BASE + offset)
105 : "memory");
106} 95}
107 96
108#endif /* !defined(__ASSEMBLY__) */ 97#endif /* !defined(__ASSEMBLY__) */
diff --git a/arch/mips/include/asm/cpu-features.h b/arch/mips/include/asm/cpu-features.h
index fa44f3ec5302..d445d060e346 100644
--- a/arch/mips/include/asm/cpu-features.h
+++ b/arch/mips/include/asm/cpu-features.h
@@ -13,12 +13,6 @@
13#include <asm/cpu-info.h> 13#include <asm/cpu-info.h>
14#include <cpu-feature-overrides.h> 14#include <cpu-feature-overrides.h>
15 15
16#ifndef current_cpu_type
17#define current_cpu_type() current_cpu_data.cputype
18#endif
19
20#define boot_cpu_type() cpu_data[0].cputype
21
22/* 16/*
23 * SMP assumption: Options of CPU 0 are a superset of all processors. 17 * SMP assumption: Options of CPU 0 are a superset of all processors.
24 * This is true for all known MIPS systems. 18 * This is true for all known MIPS systems.
@@ -193,7 +187,7 @@
193 187
194/* 188/*
195 * MIPS32, MIPS64, VR5500, IDT32332, IDT32334 and maybe a few other 189 * MIPS32, MIPS64, VR5500, IDT32332, IDT32334 and maybe a few other
196 * pre-MIPS32/MIPS53 processors have CLO, CLZ. The IDT RC64574 is 64-bit and 190 * pre-MIPS32/MIPS64 processors have CLO, CLZ. The IDT RC64574 is 64-bit and
197 * has CLO and CLZ but not DCLO nor DCLZ. For 64-bit kernels 191 * has CLO and CLZ but not DCLO nor DCLZ. For 64-bit kernels
198 * cpu_has_clo_clz also indicates the availability of DCLO and DCLZ. 192 * cpu_has_clo_clz also indicates the availability of DCLO and DCLZ.
199 */ 193 */
diff --git a/arch/mips/include/asm/cpu-info.h b/arch/mips/include/asm/cpu-info.h
index 41401d8eb7d1..21c8e29c8f91 100644
--- a/arch/mips/include/asm/cpu-info.h
+++ b/arch/mips/include/asm/cpu-info.h
@@ -84,6 +84,7 @@ struct cpuinfo_mips {
84extern struct cpuinfo_mips cpu_data[]; 84extern struct cpuinfo_mips cpu_data[];
85#define current_cpu_data cpu_data[smp_processor_id()] 85#define current_cpu_data cpu_data[smp_processor_id()]
86#define raw_current_cpu_data cpu_data[raw_smp_processor_id()] 86#define raw_current_cpu_data cpu_data[raw_smp_processor_id()]
87#define boot_cpu_data cpu_data[0]
87 88
88extern void cpu_probe(void); 89extern void cpu_probe(void);
89extern void cpu_report(void); 90extern void cpu_report(void);
diff --git a/arch/mips/include/asm/cpu-type.h b/arch/mips/include/asm/cpu-type.h
new file mode 100644
index 000000000000..4a402cc60c03
--- /dev/null
+++ b/arch/mips/include/asm/cpu-type.h
@@ -0,0 +1,203 @@
1/*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details.
5 *
6 * Copyright (C) 2003, 2004 Ralf Baechle
7 * Copyright (C) 2004 Maciej W. Rozycki
8 */
9#ifndef __ASM_CPU_TYPE_H
10#define __ASM_CPU_TYPE_H
11
12#include <linux/smp.h>
13#include <linux/compiler.h>
14
15static inline int __pure __get_cpu_type(const int cpu_type)
16{
17 switch (cpu_type) {
18#if defined(CONFIG_SYS_HAS_CPU_LOONGSON2E) || \
19 defined(CONFIG_SYS_HAS_CPU_LOONGSON2F)
20 case CPU_LOONGSON2:
21#endif
22
23#ifdef CONFIG_SYS_HAS_CPU_LOONGSON1B
24 case CPU_LOONGSON1:
25#endif
26
27#ifdef CONFIG_SYS_HAS_CPU_MIPS32_R1
28 case CPU_4KC:
29 case CPU_ALCHEMY:
30 case CPU_BMIPS3300:
31 case CPU_BMIPS4350:
32 case CPU_PR4450:
33 case CPU_BMIPS32:
34 case CPU_JZRISC:
35#endif
36
37#if defined(CONFIG_SYS_HAS_CPU_MIPS32_R1) || \
38 defined(CONFIG_SYS_HAS_CPU_MIPS32_R2)
39 case CPU_4KEC:
40#endif
41
42#ifdef CONFIG_SYS_HAS_CPU_MIPS32_R2
43 case CPU_4KSC:
44 case CPU_24K:
45 case CPU_34K:
46 case CPU_1004K:
47 case CPU_74K:
48 case CPU_M14KC:
49 case CPU_M14KEC:
50#endif
51
52#ifdef CONFIG_SYS_HAS_CPU_MIPS64_R1
53 case CPU_5KC:
54 case CPU_5KE:
55 case CPU_20KC:
56 case CPU_25KF:
57 case CPU_SB1:
58 case CPU_SB1A:
59#endif
60
61#ifdef CONFIG_SYS_HAS_CPU_MIPS64_R2
62 /*
63 * All MIPS64 R2 processors have their own special symbols. That is,
64 * there currently is no pure R2 core
65 */
66#endif
67
68#ifdef CONFIG_SYS_HAS_CPU_R3000
69 case CPU_R2000:
70 case CPU_R3000:
71 case CPU_R3000A:
72 case CPU_R3041:
73 case CPU_R3051:
74 case CPU_R3052:
75 case CPU_R3081:
76 case CPU_R3081E:
77#endif
78
79#ifdef CONFIG_SYS_HAS_CPU_TX39XX
80 case CPU_TX3912:
81 case CPU_TX3922:
82 case CPU_TX3927:
83#endif
84
85#ifdef CONFIG_SYS_HAS_CPU_VR41XX
86 case CPU_VR41XX:
87 case CPU_VR4111:
88 case CPU_VR4121:
89 case CPU_VR4122:
90 case CPU_VR4131:
91 case CPU_VR4133:
92 case CPU_VR4181:
93 case CPU_VR4181A:
94#endif
95
96#ifdef CONFIG_SYS_HAS_CPU_R4300
97 case CPU_R4300:
98 case CPU_R4310:
99#endif
100
101#ifdef CONFIG_SYS_HAS_CPU_R4X00
102 case CPU_R4000PC:
103 case CPU_R4000SC:
104 case CPU_R4000MC:
105 case CPU_R4200:
106 case CPU_R4400PC:
107 case CPU_R4400SC:
108 case CPU_R4400MC:
109 case CPU_R4600:
110 case CPU_R4700:
111 case CPU_R4640:
112 case CPU_R4650:
113#endif
114
115#ifdef CONFIG_SYS_HAS_CPU_TX49XX
116 case CPU_TX49XX:
117#endif
118
119#ifdef CONFIG_SYS_HAS_CPU_R5000
120 case CPU_R5000:
121#endif
122
123#ifdef CONFIG_SYS_HAS_CPU_R5432
124 case CPU_R5432:
125#endif
126
127#ifdef CONFIG_SYS_HAS_CPU_R5500
128 case CPU_R5500:
129#endif
130
131#ifdef CONFIG_SYS_HAS_CPU_R6000
132 case CPU_R6000:
133 case CPU_R6000A:
134#endif
135
136#ifdef CONFIG_SYS_HAS_CPU_NEVADA
137 case CPU_NEVADA:
138#endif
139
140#ifdef CONFIG_SYS_HAS_CPU_R8000
141 case CPU_R8000:
142#endif
143
144#ifdef CONFIG_SYS_HAS_CPU_R10000
145 case CPU_R10000:
146 case CPU_R12000:
147 case CPU_R14000:
148#endif
149#ifdef CONFIG_SYS_HAS_CPU_RM7000
150 case CPU_RM7000:
151 case CPU_SR71000:
152#endif
153#ifdef CONFIG_SYS_HAS_CPU_RM9000
154 case CPU_RM9000:
155#endif
156#ifdef CONFIG_SYS_HAS_CPU_SB1
157 case CPU_SB1:
158 case CPU_SB1A:
159#endif
160#ifdef CONFIG_SYS_HAS_CPU_CAVIUM_OCTEON
161 case CPU_CAVIUM_OCTEON:
162 case CPU_CAVIUM_OCTEON_PLUS:
163 case CPU_CAVIUM_OCTEON2:
164#endif
165
166#ifdef CONFIG_SYS_HAS_CPU_BMIPS4380
167 case CPU_BMIPS4380:
168#endif
169
170#ifdef CONFIG_SYS_HAS_CPU_BMIPS5000
171 case CPU_BMIPS5000:
172#endif
173
174#ifdef CONFIG_SYS_HAS_CPU_XLP
175 case CPU_XLP:
176#endif
177
178#ifdef CONFIG_SYS_HAS_CPU_XLR
179 case CPU_XLR:
180#endif
181 break;
182 default:
183 unreachable();
184 }
185
186 return cpu_type;
187}
188
189static inline int __pure current_cpu_type(void)
190{
191 const int cpu_type = current_cpu_data.cputype;
192
193 return __get_cpu_type(cpu_type);
194}
195
196static inline int __pure boot_cpu_type(void)
197{
198 const int cpu_type = cpu_data[0].cputype;
199
200 return __get_cpu_type(cpu_type);
201}
202
203#endif /* __ASM_CPU_TYPE_H */
diff --git a/arch/mips/include/asm/cpu.h b/arch/mips/include/asm/cpu.h
index 632bbe5a79ea..d2035e16502a 100644
--- a/arch/mips/include/asm/cpu.h
+++ b/arch/mips/include/asm/cpu.h
@@ -3,15 +3,14 @@
3 * various MIPS cpu types. 3 * various MIPS cpu types.
4 * 4 *
5 * Copyright (C) 1996 David S. Miller (davem@davemloft.net) 5 * Copyright (C) 1996 David S. Miller (davem@davemloft.net)
6 * Copyright (C) 2004 Maciej W. Rozycki 6 * Copyright (C) 2004, 2013 Maciej W. Rozycki
7 */ 7 */
8#ifndef _ASM_CPU_H 8#ifndef _ASM_CPU_H
9#define _ASM_CPU_H 9#define _ASM_CPU_H
10 10
11/* Assigned Company values for bits 23:16 of the PRId Register 11/*
12 (CP0 register 15, select 0). As of the MIPS32 and MIPS64 specs from 12 As of the MIPS32 and MIPS64 specs from MTI, the PRId register (CP0
13 MTI, the PRId register is defined in this (backwards compatible) 13 register 15, select 0) is defined in this (backwards compatible) way:
14 way:
15 14
16 +----------------+----------------+----------------+----------------+ 15 +----------------+----------------+----------------+----------------+
17 | Company Options| Company ID | Processor ID | Revision | 16 | Company Options| Company ID | Processor ID | Revision |
@@ -23,6 +22,14 @@
23 spec. 22 spec.
24*/ 23*/
25 24
25#define PRID_OPT_MASK 0xff000000
26
27/*
28 * Assigned Company values for bits 23:16 of the PRId register.
29 */
30
31#define PRID_COMP_MASK 0xff0000
32
26#define PRID_COMP_LEGACY 0x000000 33#define PRID_COMP_LEGACY 0x000000
27#define PRID_COMP_MIPS 0x010000 34#define PRID_COMP_MIPS 0x010000
28#define PRID_COMP_BROADCOM 0x020000 35#define PRID_COMP_BROADCOM 0x020000
@@ -38,10 +45,17 @@
38#define PRID_COMP_INGENIC 0xd00000 45#define PRID_COMP_INGENIC 0xd00000
39 46
40/* 47/*
41 * Assigned values for the product ID register. In order to detect a 48 * Assigned Processor ID (implementation) values for bits 15:8 of the PRId
42 * certain CPU type exactly eventually additional registers may need to 49 * register. In order to detect a certain CPU type exactly eventually
43 * be examined. These are valid when 23:16 == PRID_COMP_LEGACY 50 * additional registers may need to be examined.
44 */ 51 */
52
53#define PRID_IMP_MASK 0xff00
54
55/*
56 * These are valid when 23:16 == PRID_COMP_LEGACY
57 */
58
45#define PRID_IMP_R2000 0x0100 59#define PRID_IMP_R2000 0x0100
46#define PRID_IMP_AU1_REV1 0x0100 60#define PRID_IMP_AU1_REV1 0x0100
47#define PRID_IMP_AU1_REV2 0x0200 61#define PRID_IMP_AU1_REV2 0x0200
@@ -141,6 +155,9 @@
141#define PRID_IMP_CAVIUM_CN68XX 0x9100 155#define PRID_IMP_CAVIUM_CN68XX 0x9100
142#define PRID_IMP_CAVIUM_CN66XX 0x9200 156#define PRID_IMP_CAVIUM_CN66XX 0x9200
143#define PRID_IMP_CAVIUM_CN61XX 0x9300 157#define PRID_IMP_CAVIUM_CN61XX 0x9300
158#define PRID_IMP_CAVIUM_CNF71XX 0x9400
159#define PRID_IMP_CAVIUM_CN78XX 0x9500
160#define PRID_IMP_CAVIUM_CN70XX 0x9600
144 161
145/* 162/*
146 * These are the PRID's for when 23:16 == PRID_COMP_INGENIC 163 * These are the PRID's for when 23:16 == PRID_COMP_INGENIC
@@ -176,13 +193,18 @@
176 193
177#define PRID_IMP_NETLOGIC_XLP8XX 0x1000 194#define PRID_IMP_NETLOGIC_XLP8XX 0x1000
178#define PRID_IMP_NETLOGIC_XLP3XX 0x1100 195#define PRID_IMP_NETLOGIC_XLP3XX 0x1100
196#define PRID_IMP_NETLOGIC_XLP2XX 0x1200
179 197
180/* 198/*
181 * Definitions for 7:0 on legacy processors 199 * Particular Revision values for bits 7:0 of the PRId register.
182 */ 200 */
183 201
184#define PRID_REV_MASK 0x00ff 202#define PRID_REV_MASK 0x00ff
185 203
204/*
205 * Definitions for 7:0 on legacy processors
206 */
207
186#define PRID_REV_TX4927 0x0022 208#define PRID_REV_TX4927 0x0022
187#define PRID_REV_TX4937 0x0030 209#define PRID_REV_TX4937 0x0030
188#define PRID_REV_R4400 0x0040 210#define PRID_REV_R4400 0x0040
@@ -223,6 +245,8 @@
223 * 31 16 15 8 7 0 245 * 31 16 15 8 7 0
224 */ 246 */
225 247
248#define FPIR_IMP_MASK 0xff00
249
226#define FPIR_IMP_NONE 0x0000 250#define FPIR_IMP_NONE 0x0000
227 251
228enum cpu_type_enum { 252enum cpu_type_enum {
@@ -272,7 +296,7 @@ enum cpu_type_enum {
272 */ 296 */
273 CPU_5KC, CPU_5KE, CPU_20KC, CPU_25KF, CPU_SB1, CPU_SB1A, CPU_LOONGSON2, 297 CPU_5KC, CPU_5KE, CPU_20KC, CPU_25KF, CPU_SB1, CPU_SB1A, CPU_LOONGSON2,
274 CPU_CAVIUM_OCTEON, CPU_CAVIUM_OCTEON_PLUS, CPU_CAVIUM_OCTEON2, 298 CPU_CAVIUM_OCTEON, CPU_CAVIUM_OCTEON_PLUS, CPU_CAVIUM_OCTEON2,
275 CPU_XLR, CPU_XLP, 299 CPU_CAVIUM_OCTEON3, CPU_XLR, CPU_XLP,
276 300
277 CPU_LAST 301 CPU_LAST
278}; 302};
diff --git a/arch/mips/include/asm/cputime.h b/arch/mips/include/asm/cputime.h
deleted file mode 100644
index c00eacbdd979..000000000000
--- a/arch/mips/include/asm/cputime.h
+++ /dev/null
@@ -1,6 +0,0 @@
1#ifndef __MIPS_CPUTIME_H
2#define __MIPS_CPUTIME_H
3
4#include <asm-generic/cputime.h>
5
6#endif /* __MIPS_CPUTIME_H */
diff --git a/arch/mips/include/asm/current.h b/arch/mips/include/asm/current.h
deleted file mode 100644
index 4c51401b5537..000000000000
--- a/arch/mips/include/asm/current.h
+++ /dev/null
@@ -1 +0,0 @@
1#include <asm-generic/current.h>
diff --git a/arch/mips/include/asm/dec/ioasic.h b/arch/mips/include/asm/dec/ioasic.h
index 98badd6bf22d..a6e505a0e44b 100644
--- a/arch/mips/include/asm/dec/ioasic.h
+++ b/arch/mips/include/asm/dec/ioasic.h
@@ -31,8 +31,10 @@ static inline u32 ioasic_read(unsigned int reg)
31 return ioasic_base[reg / 4]; 31 return ioasic_base[reg / 4];
32} 32}
33 33
34extern void clear_ioasic_dma_irq(unsigned int irq);
35
34extern void init_ioasic_irqs(int base); 36extern void init_ioasic_irqs(int base);
35 37
36extern void dec_ioasic_clocksource_init(void); 38extern int dec_ioasic_clocksource_init(void);
37 39
38#endif /* __ASM_DEC_IOASIC_H */ 40#endif /* __ASM_DEC_IOASIC_H */
diff --git a/arch/mips/include/asm/emergency-restart.h b/arch/mips/include/asm/emergency-restart.h
deleted file mode 100644
index 108d8c48e42e..000000000000
--- a/arch/mips/include/asm/emergency-restart.h
+++ /dev/null
@@ -1,6 +0,0 @@
1#ifndef _ASM_EMERGENCY_RESTART_H
2#define _ASM_EMERGENCY_RESTART_H
3
4#include <asm-generic/emergency-restart.h>
5
6#endif /* _ASM_EMERGENCY_RESTART_H */
diff --git a/arch/mips/include/asm/local64.h b/arch/mips/include/asm/local64.h
deleted file mode 100644
index 36c93b5cc239..000000000000
--- a/arch/mips/include/asm/local64.h
+++ /dev/null
@@ -1 +0,0 @@
1#include <asm-generic/local64.h>
diff --git a/arch/mips/include/asm/mach-ath79/cpu-feature-overrides.h b/arch/mips/include/asm/mach-ath79/cpu-feature-overrides.h
index ddb947e9221f..0089a740e5ae 100644
--- a/arch/mips/include/asm/mach-ath79/cpu-feature-overrides.h
+++ b/arch/mips/include/asm/mach-ath79/cpu-feature-overrides.h
@@ -42,8 +42,6 @@
42#define cpu_has_mips64r1 0 42#define cpu_has_mips64r1 0
43#define cpu_has_mips64r2 0 43#define cpu_has_mips64r2 0
44 44
45#define cpu_has_dsp 0
46#define cpu_has_dsp2 0
47#define cpu_has_mipsmt 0 45#define cpu_has_mipsmt 0
48 46
49#define cpu_has_64bits 0 47#define cpu_has_64bits 0
diff --git a/arch/mips/include/asm/mach-au1x00/au1000.h b/arch/mips/include/asm/mach-au1x00/au1000.h
index 3e11a468cdf8..54f9e84db8ac 100644
--- a/arch/mips/include/asm/mach-au1x00/au1000.h
+++ b/arch/mips/include/asm/mach-au1x00/au1000.h
@@ -43,6 +43,8 @@
43#include <linux/io.h> 43#include <linux/io.h>
44#include <linux/irq.h> 44#include <linux/irq.h>
45 45
46#include <asm/cpu.h>
47
46/* cpu pipeline flush */ 48/* cpu pipeline flush */
47void static inline au_sync(void) 49void static inline au_sync(void)
48{ 50{
@@ -140,7 +142,7 @@ static inline int au1xxx_cpu_needs_config_od(void)
140 142
141static inline int alchemy_get_cputype(void) 143static inline int alchemy_get_cputype(void)
142{ 144{
143 switch (read_c0_prid() & 0xffff0000) { 145 switch (read_c0_prid() & (PRID_OPT_MASK | PRID_COMP_MASK)) {
144 case 0x00030000: 146 case 0x00030000:
145 return ALCHEMY_CPU_AU1000; 147 return ALCHEMY_CPU_AU1000;
146 break; 148 break;
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_nvram.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_nvram.h
index 4e0b6bc1165e..348df49dcc9f 100644
--- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_nvram.h
+++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_nvram.h
@@ -30,4 +30,6 @@ u8 *bcm63xx_nvram_get_name(void);
30 */ 30 */
31int bcm63xx_nvram_get_mac_address(u8 *mac); 31int bcm63xx_nvram_get_mac_address(u8 *mac);
32 32
33int bcm63xx_nvram_get_psi_size(void);
34
33#endif /* BCM63XX_NVRAM_H */ 35#endif /* BCM63XX_NVRAM_H */
diff --git a/arch/mips/include/asm/mach-cavium-octeon/gpio.h b/arch/mips/include/asm/mach-cavium-octeon/gpio.h
new file mode 100644
index 000000000000..34e9f7aabab4
--- /dev/null
+++ b/arch/mips/include/asm/mach-cavium-octeon/gpio.h
@@ -0,0 +1,21 @@
1#ifndef __ASM_MACH_CAVIUM_OCTEON_GPIO_H
2#define __ASM_MACH_CAVIUM_OCTEON_GPIO_H
3
4#ifdef CONFIG_GPIOLIB
5#define gpio_get_value __gpio_get_value
6#define gpio_set_value __gpio_set_value
7#define gpio_cansleep __gpio_cansleep
8#else
9int gpio_request(unsigned gpio, const char *label);
10void gpio_free(unsigned gpio);
11int gpio_direction_input(unsigned gpio);
12int gpio_direction_output(unsigned gpio, int value);
13int gpio_get_value(unsigned gpio);
14void gpio_set_value(unsigned gpio, int value);
15#endif
16
17#include <asm-generic/gpio.h>
18
19#define gpio_to_irq __gpio_to_irq
20
21#endif /* __ASM_MACH_GENERIC_GPIO_H */
diff --git a/arch/mips/include/asm/mach-ip22/cpu-feature-overrides.h b/arch/mips/include/asm/mach-ip22/cpu-feature-overrides.h
index f4caacd25552..1bcb6421205e 100644
--- a/arch/mips/include/asm/mach-ip22/cpu-feature-overrides.h
+++ b/arch/mips/include/asm/mach-ip22/cpu-feature-overrides.h
@@ -8,6 +8,8 @@
8#ifndef __ASM_MACH_IP22_CPU_FEATURE_OVERRIDES_H 8#ifndef __ASM_MACH_IP22_CPU_FEATURE_OVERRIDES_H
9#define __ASM_MACH_IP22_CPU_FEATURE_OVERRIDES_H 9#define __ASM_MACH_IP22_CPU_FEATURE_OVERRIDES_H
10 10
11#include <asm/cpu.h>
12
11/* 13/*
12 * IP22 with a variety of processors so we can't use defaults for everything. 14 * IP22 with a variety of processors so we can't use defaults for everything.
13 */ 15 */
diff --git a/arch/mips/include/asm/mach-ip27/cpu-feature-overrides.h b/arch/mips/include/asm/mach-ip27/cpu-feature-overrides.h
index 1d2b6ff60d33..d6111aa2e886 100644
--- a/arch/mips/include/asm/mach-ip27/cpu-feature-overrides.h
+++ b/arch/mips/include/asm/mach-ip27/cpu-feature-overrides.h
@@ -8,6 +8,8 @@
8#ifndef __ASM_MACH_IP27_CPU_FEATURE_OVERRIDES_H 8#ifndef __ASM_MACH_IP27_CPU_FEATURE_OVERRIDES_H
9#define __ASM_MACH_IP27_CPU_FEATURE_OVERRIDES_H 9#define __ASM_MACH_IP27_CPU_FEATURE_OVERRIDES_H
10 10
11#include <asm/cpu.h>
12
11/* 13/*
12 * IP27 only comes with R10000 family processors all using the same config 14 * IP27 only comes with R10000 family processors all using the same config
13 */ 15 */
diff --git a/arch/mips/include/asm/mach-ip28/cpu-feature-overrides.h b/arch/mips/include/asm/mach-ip28/cpu-feature-overrides.h
index 65e9c856390d..4cec06d133db 100644
--- a/arch/mips/include/asm/mach-ip28/cpu-feature-overrides.h
+++ b/arch/mips/include/asm/mach-ip28/cpu-feature-overrides.h
@@ -9,6 +9,8 @@
9#ifndef __ASM_MACH_IP28_CPU_FEATURE_OVERRIDES_H 9#ifndef __ASM_MACH_IP28_CPU_FEATURE_OVERRIDES_H
10#define __ASM_MACH_IP28_CPU_FEATURE_OVERRIDES_H 10#define __ASM_MACH_IP28_CPU_FEATURE_OVERRIDES_H
11 11
12#include <asm/cpu.h>
13
12/* 14/*
13 * IP28 only comes with R10000 family processors all using the same config 15 * IP28 only comes with R10000 family processors all using the same config
14 */ 16 */
diff --git a/arch/mips/include/asm/mach-lantiq/falcon/cpu-feature-overrides.h b/arch/mips/include/asm/mach-lantiq/falcon/cpu-feature-overrides.h
new file mode 100644
index 000000000000..096a10072430
--- /dev/null
+++ b/arch/mips/include/asm/mach-lantiq/falcon/cpu-feature-overrides.h
@@ -0,0 +1,58 @@
1/*
2 * Lantiq FALCON specific CPU feature overrides
3 *
4 * Copyright (C) 2013 Thomas Langer, Lantiq Deutschland
5 *
6 * This file was derived from: include/asm-mips/cpu-features.h
7 * Copyright (C) 2003, 2004 Ralf Baechle
8 * Copyright (C) 2004 Maciej W. Rozycki
9 *
10 * This program is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License version 2 as published
12 * by the Free Software Foundation.
13 *
14 */
15#ifndef __ASM_MACH_FALCON_CPU_FEATURE_OVERRIDES_H
16#define __ASM_MACH_FALCON_CPU_FEATURE_OVERRIDES_H
17
18#define cpu_has_tlb 1
19#define cpu_has_4kex 1
20#define cpu_has_3k_cache 0
21#define cpu_has_4k_cache 1
22#define cpu_has_tx39_cache 0
23#define cpu_has_sb1_cache 0
24#define cpu_has_fpu 0
25#define cpu_has_32fpr 0
26#define cpu_has_counter 1
27#define cpu_has_watch 1
28#define cpu_has_divec 1
29
30#define cpu_has_prefetch 1
31#define cpu_has_ejtag 1
32#define cpu_has_llsc 1
33
34#define cpu_has_mips16 1
35#define cpu_has_mdmx 0
36#define cpu_has_mips3d 0
37#define cpu_has_smartmips 0
38
39#define cpu_has_mips32r1 1
40#define cpu_has_mips32r2 1
41#define cpu_has_mips64r1 0
42#define cpu_has_mips64r2 0
43
44#define cpu_has_dsp 1
45#define cpu_has_mipsmt 1
46
47#define cpu_has_vint 1
48#define cpu_has_veic 1
49
50#define cpu_has_64bits 0
51#define cpu_has_64bit_zero_reg 0
52#define cpu_has_64bit_gp_regs 0
53#define cpu_has_64bit_addresses 0
54
55#define cpu_dcache_line_size() 32
56#define cpu_icache_line_size() 32
57
58#endif /* __ASM_MACH_FALCON_CPU_FEATURE_OVERRIDES_H */
diff --git a/arch/mips/include/asm/mach-ralink/mt7620.h b/arch/mips/include/asm/mach-ralink/mt7620.h
index 9809972ea882..6f9b24f51157 100644
--- a/arch/mips/include/asm/mach-ralink/mt7620.h
+++ b/arch/mips/include/asm/mach-ralink/mt7620.h
@@ -20,6 +20,8 @@
20#define SYSC_REG_CHIP_REV 0x0c 20#define SYSC_REG_CHIP_REV 0x0c
21#define SYSC_REG_SYSTEM_CONFIG0 0x10 21#define SYSC_REG_SYSTEM_CONFIG0 0x10
22#define SYSC_REG_SYSTEM_CONFIG1 0x14 22#define SYSC_REG_SYSTEM_CONFIG1 0x14
23#define SYSC_REG_CLKCFG0 0x2c
24#define SYSC_REG_CPU_SYS_CLKCFG 0x3c
23#define SYSC_REG_CPLL_CONFIG0 0x54 25#define SYSC_REG_CPLL_CONFIG0 0x54
24#define SYSC_REG_CPLL_CONFIG1 0x58 26#define SYSC_REG_CPLL_CONFIG1 0x58
25 27
@@ -29,20 +31,42 @@
29#define MT7620A_CHIP_NAME0 0x3637544d 31#define MT7620A_CHIP_NAME0 0x3637544d
30#define MT7620A_CHIP_NAME1 0x20203032 32#define MT7620A_CHIP_NAME1 0x20203032
31 33
34#define SYSCFG0_XTAL_FREQ_SEL BIT(6)
35
32#define CHIP_REV_PKG_MASK 0x1 36#define CHIP_REV_PKG_MASK 0x1
33#define CHIP_REV_PKG_SHIFT 16 37#define CHIP_REV_PKG_SHIFT 16
34#define CHIP_REV_VER_MASK 0xf 38#define CHIP_REV_VER_MASK 0xf
35#define CHIP_REV_VER_SHIFT 8 39#define CHIP_REV_VER_SHIFT 8
36#define CHIP_REV_ECO_MASK 0xf 40#define CHIP_REV_ECO_MASK 0xf
37 41
38#define CPLL_SW_CONFIG_SHIFT 31 42#define CLKCFG0_PERI_CLK_SEL BIT(4)
39#define CPLL_SW_CONFIG_MASK 0x1 43
40#define CPLL_CPU_CLK_SHIFT 24 44#define CPU_SYS_CLKCFG_OCP_RATIO_SHIFT 16
41#define CPLL_CPU_CLK_MASK 0x1 45#define CPU_SYS_CLKCFG_OCP_RATIO_MASK 0xf
42#define CPLL_MULT_RATIO_SHIFT 16 46#define CPU_SYS_CLKCFG_OCP_RATIO_1 0 /* 1:1 (Reserved) */
43#define CPLL_MULT_RATIO 0x7 47#define CPU_SYS_CLKCFG_OCP_RATIO_1_5 1 /* 1:1.5 (Reserved) */
44#define CPLL_DIV_RATIO_SHIFT 10 48#define CPU_SYS_CLKCFG_OCP_RATIO_2 2 /* 1:2 */
45#define CPLL_DIV_RATIO 0x3 49#define CPU_SYS_CLKCFG_OCP_RATIO_2_5 3 /* 1:2.5 (Reserved) */
50#define CPU_SYS_CLKCFG_OCP_RATIO_3 4 /* 1:3 */
51#define CPU_SYS_CLKCFG_OCP_RATIO_3_5 5 /* 1:3.5 (Reserved) */
52#define CPU_SYS_CLKCFG_OCP_RATIO_4 6 /* 1:4 */
53#define CPU_SYS_CLKCFG_OCP_RATIO_5 7 /* 1:5 */
54#define CPU_SYS_CLKCFG_OCP_RATIO_10 8 /* 1:10 */
55#define CPU_SYS_CLKCFG_CPU_FDIV_SHIFT 8
56#define CPU_SYS_CLKCFG_CPU_FDIV_MASK 0x1f
57#define CPU_SYS_CLKCFG_CPU_FFRAC_SHIFT 0
58#define CPU_SYS_CLKCFG_CPU_FFRAC_MASK 0x1f
59
60#define CPLL_CFG0_SW_CFG BIT(31)
61#define CPLL_CFG0_PLL_MULT_RATIO_SHIFT 16
62#define CPLL_CFG0_PLL_MULT_RATIO_MASK 0x7
63#define CPLL_CFG0_LC_CURFCK BIT(15)
64#define CPLL_CFG0_BYPASS_REF_CLK BIT(14)
65#define CPLL_CFG0_PLL_DIV_RATIO_SHIFT 10
66#define CPLL_CFG0_PLL_DIV_RATIO_MASK 0x3
67
68#define CPLL_CFG1_CPU_AUX1 BIT(25)
69#define CPLL_CFG1_CPU_AUX0 BIT(24)
46 70
47#define SYSCFG0_DRAM_TYPE_MASK 0x3 71#define SYSCFG0_DRAM_TYPE_MASK 0x3
48#define SYSCFG0_DRAM_TYPE_SHIFT 4 72#define SYSCFG0_DRAM_TYPE_SHIFT 4
diff --git a/arch/mips/include/asm/mach-ralink/mt7620/cpu-feature-overrides.h b/arch/mips/include/asm/mach-ralink/mt7620/cpu-feature-overrides.h
new file mode 100644
index 000000000000..f7bb8cfc5eb1
--- /dev/null
+++ b/arch/mips/include/asm/mach-ralink/mt7620/cpu-feature-overrides.h
@@ -0,0 +1,57 @@
1/*
2 * Ralink MT7620 specific CPU feature overrides
3 *
4 * Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
5 * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
6 *
7 * This file was derived from: include/asm-mips/cpu-features.h
8 * Copyright (C) 2003, 2004 Ralf Baechle
9 * Copyright (C) 2004 Maciej W. Rozycki
10 *
11 * This program is free software; you can redistribute it and/or modify it
12 * under the terms of the GNU General Public License version 2 as published
13 * by the Free Software Foundation.
14 *
15 */
16#ifndef _MT7620_CPU_FEATURE_OVERRIDES_H
17#define _MT7620_CPU_FEATURE_OVERRIDES_H
18
19#define cpu_has_tlb 1
20#define cpu_has_4kex 1
21#define cpu_has_3k_cache 0
22#define cpu_has_4k_cache 1
23#define cpu_has_tx39_cache 0
24#define cpu_has_sb1_cache 0
25#define cpu_has_fpu 0
26#define cpu_has_32fpr 0
27#define cpu_has_counter 1
28#define cpu_has_watch 1
29#define cpu_has_divec 1
30
31#define cpu_has_prefetch 1
32#define cpu_has_ejtag 1
33#define cpu_has_llsc 1
34
35#define cpu_has_mips16 1
36#define cpu_has_mdmx 0
37#define cpu_has_mips3d 0
38#define cpu_has_smartmips 0
39
40#define cpu_has_mips32r1 1
41#define cpu_has_mips32r2 1
42#define cpu_has_mips64r1 0
43#define cpu_has_mips64r2 0
44
45#define cpu_has_dsp 1
46#define cpu_has_dsp2 0
47#define cpu_has_mipsmt 0
48
49#define cpu_has_64bits 0
50#define cpu_has_64bit_zero_reg 0
51#define cpu_has_64bit_gp_regs 0
52#define cpu_has_64bit_addresses 0
53
54#define cpu_dcache_line_size() 32
55#define cpu_icache_line_size() 32
56
57#endif /* _MT7620_CPU_FEATURE_OVERRIDES_H */
diff --git a/arch/mips/include/asm/mipsregs.h b/arch/mips/include/asm/mipsregs.h
index fed1c3e9b486..e0331414c7d6 100644
--- a/arch/mips/include/asm/mipsregs.h
+++ b/arch/mips/include/asm/mipsregs.h
@@ -603,6 +603,13 @@
603#define MIPS_CONF4_MMUEXTDEF (_ULCAST_(3) << 14) 603#define MIPS_CONF4_MMUEXTDEF (_ULCAST_(3) << 14)
604#define MIPS_CONF4_MMUEXTDEF_MMUSIZEEXT (_ULCAST_(1) << 14) 604#define MIPS_CONF4_MMUEXTDEF_MMUSIZEEXT (_ULCAST_(1) << 14)
605 605
606#define MIPS_CONF5_NF (_ULCAST_(1) << 0)
607#define MIPS_CONF5_UFR (_ULCAST_(1) << 2)
608#define MIPS_CONF5_MSAEN (_ULCAST_(1) << 27)
609#define MIPS_CONF5_EVA (_ULCAST_(1) << 28)
610#define MIPS_CONF5_CV (_ULCAST_(1) << 29)
611#define MIPS_CONF5_K (_ULCAST_(1) << 30)
612
606#define MIPS_CONF6_SYND (_ULCAST_(1) << 13) 613#define MIPS_CONF6_SYND (_ULCAST_(1) << 13)
607 614
608#define MIPS_CONF7_WII (_ULCAST_(1) << 31) 615#define MIPS_CONF7_WII (_ULCAST_(1) << 31)
diff --git a/arch/mips/include/asm/mutex.h b/arch/mips/include/asm/mutex.h
deleted file mode 100644
index 458c1f7fbc18..000000000000
--- a/arch/mips/include/asm/mutex.h
+++ /dev/null
@@ -1,9 +0,0 @@
1/*
2 * Pull in the generic implementation for the mutex fastpath.
3 *
4 * TODO: implement optimized primitives instead, or leave the generic
5 * implementation in place, or pick the atomic_xchg() based generic
6 * implementation. (see asm-generic/mutex-xchg.h for details)
7 */
8
9#include <asm-generic/mutex-dec.h>
diff --git a/arch/mips/include/asm/netlogic/xlp-hal/bridge.h b/arch/mips/include/asm/netlogic/xlp-hal/bridge.h
index 790f0f1e55c6..4e8eacb9588a 100644
--- a/arch/mips/include/asm/netlogic/xlp-hal/bridge.h
+++ b/arch/mips/include/asm/netlogic/xlp-hal/bridge.h
@@ -88,6 +88,7 @@
88#define BRIDGE_DRAM_LIMIT6 0x22 88#define BRIDGE_DRAM_LIMIT6 0x22
89#define BRIDGE_DRAM_LIMIT7 0x23 89#define BRIDGE_DRAM_LIMIT7 0x23
90 90
91#define BRIDGE_DRAM_NODE_TRANSLN(i) (0x24 + (i))
91#define BRIDGE_DRAM_NODE_TRANSLN0 0x24 92#define BRIDGE_DRAM_NODE_TRANSLN0 0x24
92#define BRIDGE_DRAM_NODE_TRANSLN1 0x25 93#define BRIDGE_DRAM_NODE_TRANSLN1 0x25
93#define BRIDGE_DRAM_NODE_TRANSLN2 0x26 94#define BRIDGE_DRAM_NODE_TRANSLN2 0x26
@@ -96,6 +97,8 @@
96#define BRIDGE_DRAM_NODE_TRANSLN5 0x29 97#define BRIDGE_DRAM_NODE_TRANSLN5 0x29
97#define BRIDGE_DRAM_NODE_TRANSLN6 0x2a 98#define BRIDGE_DRAM_NODE_TRANSLN6 0x2a
98#define BRIDGE_DRAM_NODE_TRANSLN7 0x2b 99#define BRIDGE_DRAM_NODE_TRANSLN7 0x2b
100
101#define BRIDGE_DRAM_CHNL_TRANSLN(i) (0x2c + (i))
99#define BRIDGE_DRAM_CHNL_TRANSLN0 0x2c 102#define BRIDGE_DRAM_CHNL_TRANSLN0 0x2c
100#define BRIDGE_DRAM_CHNL_TRANSLN1 0x2d 103#define BRIDGE_DRAM_CHNL_TRANSLN1 0x2d
101#define BRIDGE_DRAM_CHNL_TRANSLN2 0x2e 104#define BRIDGE_DRAM_CHNL_TRANSLN2 0x2e
@@ -104,6 +107,7 @@
104#define BRIDGE_DRAM_CHNL_TRANSLN5 0x31 107#define BRIDGE_DRAM_CHNL_TRANSLN5 0x31
105#define BRIDGE_DRAM_CHNL_TRANSLN6 0x32 108#define BRIDGE_DRAM_CHNL_TRANSLN6 0x32
106#define BRIDGE_DRAM_CHNL_TRANSLN7 0x33 109#define BRIDGE_DRAM_CHNL_TRANSLN7 0x33
110
107#define BRIDGE_PCIEMEM_BASE0 0x34 111#define BRIDGE_PCIEMEM_BASE0 0x34
108#define BRIDGE_PCIEMEM_BASE1 0x35 112#define BRIDGE_PCIEMEM_BASE1 0x35
109#define BRIDGE_PCIEMEM_BASE2 0x36 113#define BRIDGE_PCIEMEM_BASE2 0x36
diff --git a/arch/mips/include/asm/netlogic/xlp-hal/iomap.h b/arch/mips/include/asm/netlogic/xlp-hal/iomap.h
index 9fac46fb7913..55eee77adaca 100644
--- a/arch/mips/include/asm/netlogic/xlp-hal/iomap.h
+++ b/arch/mips/include/asm/netlogic/xlp-hal/iomap.h
@@ -72,6 +72,12 @@
72#define XLP_IO_USB_OHCI2_OFFSET(node) XLP_HDR_OFFSET(node, 0, 2, 4) 72#define XLP_IO_USB_OHCI2_OFFSET(node) XLP_HDR_OFFSET(node, 0, 2, 4)
73#define XLP_IO_USB_OHCI3_OFFSET(node) XLP_HDR_OFFSET(node, 0, 2, 5) 73#define XLP_IO_USB_OHCI3_OFFSET(node) XLP_HDR_OFFSET(node, 0, 2, 5)
74 74
75/* XLP2xx has an updated USB block */
76#define XLP2XX_IO_USB_OFFSET(node, i) XLP_HDR_OFFSET(node, 0, 4, i)
77#define XLP2XX_IO_USB_XHCI0_OFFSET(node) XLP_HDR_OFFSET(node, 0, 4, 1)
78#define XLP2XX_IO_USB_XHCI1_OFFSET(node) XLP_HDR_OFFSET(node, 0, 4, 2)
79#define XLP2XX_IO_USB_XHCI2_OFFSET(node) XLP_HDR_OFFSET(node, 0, 4, 3)
80
75#define XLP_IO_NAE_OFFSET(node) XLP_HDR_OFFSET(node, 0, 3, 0) 81#define XLP_IO_NAE_OFFSET(node) XLP_HDR_OFFSET(node, 0, 3, 0)
76#define XLP_IO_POE_OFFSET(node) XLP_HDR_OFFSET(node, 0, 3, 1) 82#define XLP_IO_POE_OFFSET(node) XLP_HDR_OFFSET(node, 0, 3, 1)
77 83
@@ -88,6 +94,9 @@
88#define XLP_IO_I2C0_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 2) 94#define XLP_IO_I2C0_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 2)
89#define XLP_IO_I2C1_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 3) 95#define XLP_IO_I2C1_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 3)
90#define XLP_IO_GPIO_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 4) 96#define XLP_IO_GPIO_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 4)
97/* on 2XX, all I2C busses are on the same block */
98#define XLP2XX_IO_I2C_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 7)
99
91/* system management */ 100/* system management */
92#define XLP_IO_SYS_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 5) 101#define XLP_IO_SYS_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 5)
93#define XLP_IO_JTAG_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 6) 102#define XLP_IO_JTAG_OFFSET(node) XLP_HDR_OFFSET(node, 0, 6, 6)
@@ -145,6 +154,7 @@
145#define PCI_DEVICE_ID_NLM_NOR 0x1015 154#define PCI_DEVICE_ID_NLM_NOR 0x1015
146#define PCI_DEVICE_ID_NLM_NAND 0x1016 155#define PCI_DEVICE_ID_NLM_NAND 0x1016
147#define PCI_DEVICE_ID_NLM_MMC 0x1018 156#define PCI_DEVICE_ID_NLM_MMC 0x1018
157#define PCI_DEVICE_ID_NLM_XHCI 0x101d
148 158
149#ifndef __ASSEMBLY__ 159#ifndef __ASSEMBLY__
150 160
diff --git a/arch/mips/include/asm/netlogic/xlp-hal/pic.h b/arch/mips/include/asm/netlogic/xlp-hal/pic.h
index 4b5108dfaa16..105389b79f09 100644
--- a/arch/mips/include/asm/netlogic/xlp-hal/pic.h
+++ b/arch/mips/include/asm/netlogic/xlp-hal/pic.h
@@ -208,13 +208,14 @@
208#define PIC_LOCAL_SCHEDULING 1 208#define PIC_LOCAL_SCHEDULING 1
209#define PIC_GLOBAL_SCHEDULING 0 209#define PIC_GLOBAL_SCHEDULING 0
210 210
211#define PIC_CLK_HZ 133333333
212
213#define nlm_read_pic_reg(b, r) nlm_read_reg64(b, r) 211#define nlm_read_pic_reg(b, r) nlm_read_reg64(b, r)
214#define nlm_write_pic_reg(b, r, v) nlm_write_reg64(b, r, v) 212#define nlm_write_pic_reg(b, r, v) nlm_write_reg64(b, r, v)
215#define nlm_get_pic_pcibase(node) nlm_pcicfg_base(XLP_IO_PIC_OFFSET(node)) 213#define nlm_get_pic_pcibase(node) nlm_pcicfg_base(XLP_IO_PIC_OFFSET(node))
216#define nlm_get_pic_regbase(node) (nlm_get_pic_pcibase(node) + XLP_IO_PCI_HDRSZ) 214#define nlm_get_pic_regbase(node) (nlm_get_pic_pcibase(node) + XLP_IO_PCI_HDRSZ)
217 215
216/* We use PIC on node 0 as a timer */
217#define pic_timer_freq() nlm_get_pic_frequency(0)
218
218/* IRT and h/w interrupt routines */ 219/* IRT and h/w interrupt routines */
219static inline int 220static inline int
220nlm_pic_read_irt(uint64_t base, int irt_index) 221nlm_pic_read_irt(uint64_t base, int irt_index)
diff --git a/arch/mips/include/asm/netlogic/xlp-hal/sys.h b/arch/mips/include/asm/netlogic/xlp-hal/sys.h
index 470e52bfc061..fcf2833c16ca 100644
--- a/arch/mips/include/asm/netlogic/xlp-hal/sys.h
+++ b/arch/mips/include/asm/netlogic/xlp-hal/sys.h
@@ -117,6 +117,36 @@
117#define SYS_SCRTCH2 0x4b 117#define SYS_SCRTCH2 0x4b
118#define SYS_SCRTCH3 0x4c 118#define SYS_SCRTCH3 0x4c
119 119
120/* PLL registers XLP2XX */
121#define SYS_PLL_CTRL0 0x240
122#define SYS_PLL_CTRL1 0x241
123#define SYS_PLL_CTRL2 0x242
124#define SYS_PLL_CTRL3 0x243
125#define SYS_DMC_PLL_CTRL0 0x244
126#define SYS_DMC_PLL_CTRL1 0x245
127#define SYS_DMC_PLL_CTRL2 0x246
128#define SYS_DMC_PLL_CTRL3 0x247
129
130#define SYS_PLL_CTRL0_DEVX(x) (0x248 + (x) * 4)
131#define SYS_PLL_CTRL1_DEVX(x) (0x249 + (x) * 4)
132#define SYS_PLL_CTRL2_DEVX(x) (0x24a + (x) * 4)
133#define SYS_PLL_CTRL3_DEVX(x) (0x24b + (x) * 4)
134
135#define SYS_CPU_PLL_CHG_CTRL 0x288
136#define SYS_PLL_CHG_CTRL 0x289
137#define SYS_CLK_DEV_DIS 0x28a
138#define SYS_CLK_DEV_SEL 0x28b
139#define SYS_CLK_DEV_DIV 0x28c
140#define SYS_CLK_DEV_CHG 0x28d
141#define SYS_CLK_DEV_SEL_REG 0x28e
142#define SYS_CLK_DEV_DIV_REG 0x28f
143#define SYS_CPU_PLL_LOCK 0x29f
144#define SYS_SYS_PLL_LOCK 0x2a0
145#define SYS_PLL_MEM_CMD 0x2a1
146#define SYS_CPU_PLL_MEM_REQ 0x2a2
147#define SYS_SYS_PLL_MEM_REQ 0x2a3
148#define SYS_PLL_MEM_STAT 0x2a4
149
120#ifndef __ASSEMBLY__ 150#ifndef __ASSEMBLY__
121 151
122#define nlm_read_sys_reg(b, r) nlm_read_reg(b, r) 152#define nlm_read_sys_reg(b, r) nlm_read_reg(b, r)
@@ -124,5 +154,6 @@
124#define nlm_get_sys_pcibase(node) nlm_pcicfg_base(XLP_IO_SYS_OFFSET(node)) 154#define nlm_get_sys_pcibase(node) nlm_pcicfg_base(XLP_IO_SYS_OFFSET(node))
125#define nlm_get_sys_regbase(node) (nlm_get_sys_pcibase(node) + XLP_IO_PCI_HDRSZ) 155#define nlm_get_sys_regbase(node) (nlm_get_sys_pcibase(node) + XLP_IO_PCI_HDRSZ)
126 156
157unsigned int nlm_get_pic_frequency(int node);
127#endif 158#endif
128#endif 159#endif
diff --git a/arch/mips/include/asm/netlogic/xlp-hal/xlp.h b/arch/mips/include/asm/netlogic/xlp-hal/xlp.h
index f4ea0f7f3965..17daffb280a3 100644
--- a/arch/mips/include/asm/netlogic/xlp-hal/xlp.h
+++ b/arch/mips/include/asm/netlogic/xlp-hal/xlp.h
@@ -41,15 +41,22 @@
41#define PIC_PCIE_LINK_1_IRQ 20 41#define PIC_PCIE_LINK_1_IRQ 20
42#define PIC_PCIE_LINK_2_IRQ 21 42#define PIC_PCIE_LINK_2_IRQ 21
43#define PIC_PCIE_LINK_3_IRQ 22 43#define PIC_PCIE_LINK_3_IRQ 22
44
44#define PIC_EHCI_0_IRQ 23 45#define PIC_EHCI_0_IRQ 23
45#define PIC_EHCI_1_IRQ 24 46#define PIC_EHCI_1_IRQ 24
46#define PIC_OHCI_0_IRQ 25 47#define PIC_OHCI_0_IRQ 25
47#define PIC_OHCI_1_IRQ 26 48#define PIC_OHCI_1_IRQ 26
48#define PIC_OHCI_2_IRQ 27 49#define PIC_OHCI_2_IRQ 27
49#define PIC_OHCI_3_IRQ 28 50#define PIC_OHCI_3_IRQ 28
51#define PIC_2XX_XHCI_0_IRQ 23
52#define PIC_2XX_XHCI_1_IRQ 24
53#define PIC_2XX_XHCI_2_IRQ 25
54
50#define PIC_MMC_IRQ 29 55#define PIC_MMC_IRQ 29
51#define PIC_I2C_0_IRQ 30 56#define PIC_I2C_0_IRQ 30
52#define PIC_I2C_1_IRQ 31 57#define PIC_I2C_1_IRQ 31
58#define PIC_I2C_2_IRQ 32
59#define PIC_I2C_3_IRQ 33
53 60
54#ifndef __ASSEMBLY__ 61#ifndef __ASSEMBLY__
55 62
@@ -59,7 +66,17 @@ void xlp_wakeup_secondary_cpus(void);
59 66
60void xlp_mmu_init(void); 67void xlp_mmu_init(void);
61void nlm_hal_init(void); 68void nlm_hal_init(void);
69int xlp_get_dram_map(int n, uint64_t *dram_map);
70
71/* Device tree related */
62void *xlp_dt_init(void *fdtp); 72void *xlp_dt_init(void *fdtp);
63 73
74static inline int cpu_is_xlpii(void)
75{
76 int chip = read_c0_prid() & 0xff00;
77
78 return chip == PRID_IMP_NETLOGIC_XLP2XX;
79}
80
64#endif /* !__ASSEMBLY__ */ 81#endif /* !__ASSEMBLY__ */
65#endif /* _ASM_NLM_XLP_H */ 82#endif /* _ASM_NLM_XLP_H */
diff --git a/arch/mips/include/asm/netlogic/xlr/pic.h b/arch/mips/include/asm/netlogic/xlr/pic.h
index 63c99176dffe..3c80a75233bd 100644
--- a/arch/mips/include/asm/netlogic/xlr/pic.h
+++ b/arch/mips/include/asm/netlogic/xlr/pic.h
@@ -36,6 +36,8 @@
36#define _ASM_NLM_XLR_PIC_H 36#define _ASM_NLM_XLR_PIC_H
37 37
38#define PIC_CLK_HZ 66666666 38#define PIC_CLK_HZ 66666666
39#define pic_timer_freq() PIC_CLK_HZ
40
39/* PIC hardware interrupt numbers */ 41/* PIC hardware interrupt numbers */
40#define PIC_IRT_WD_INDEX 0 42#define PIC_IRT_WD_INDEX 0
41#define PIC_IRT_TIMER_0_INDEX 1 43#define PIC_IRT_TIMER_0_INDEX 1
diff --git a/arch/mips/include/asm/octeon/octeon.h b/arch/mips/include/asm/octeon/octeon.h
index a2eed23c49a9..f5d77b91537f 100644
--- a/arch/mips/include/asm/octeon/octeon.h
+++ b/arch/mips/include/asm/octeon/octeon.h
@@ -251,4 +251,6 @@ extern void (*octeon_irq_setup_secondary)(void);
251typedef void (*octeon_irq_ip4_handler_t)(void); 251typedef void (*octeon_irq_ip4_handler_t)(void);
252void octeon_irq_set_ip4_handler(octeon_irq_ip4_handler_t); 252void octeon_irq_set_ip4_handler(octeon_irq_ip4_handler_t);
253 253
254extern void octeon_fixup_irqs(void);
255
254#endif /* __ASM_OCTEON_OCTEON_H */ 256#endif /* __ASM_OCTEON_OCTEON_H */
diff --git a/arch/mips/include/asm/parport.h b/arch/mips/include/asm/parport.h
deleted file mode 100644
index cf252af64590..000000000000
--- a/arch/mips/include/asm/parport.h
+++ /dev/null
@@ -1 +0,0 @@
1#include <asm-generic/parport.h>
diff --git a/arch/mips/include/asm/pci.h b/arch/mips/include/asm/pci.h
index fa8e0aa250ca..12d6842962be 100644
--- a/arch/mips/include/asm/pci.h
+++ b/arch/mips/include/asm/pci.h
@@ -83,6 +83,18 @@ static inline void pcibios_penalize_isa_irq(int irq, int active)
83extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, 83extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
84 enum pci_mmap_state mmap_state, int write_combine); 84 enum pci_mmap_state mmap_state, int write_combine);
85 85
86#define HAVE_ARCH_PCI_RESOURCE_TO_USER
87
88static inline void pci_resource_to_user(const struct pci_dev *dev, int bar,
89 const struct resource *rsrc, resource_size_t *start,
90 resource_size_t *end)
91{
92 phys_t size = resource_size(rsrc);
93
94 *start = fixup_bigphys_addr(rsrc->start, size);
95 *end = rsrc->start + size;
96}
97
86/* 98/*
87 * Dynamic DMA mapping stuff. 99 * Dynamic DMA mapping stuff.
88 * MIPS has everything mapped statically. 100 * MIPS has everything mapped statically.
@@ -136,11 +148,6 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
136 return channel ? 15 : 14; 148 return channel ? 15 : 14;
137} 149}
138 150
139#ifdef CONFIG_CPU_CAVIUM_OCTEON
140/* MSI arch hook for OCTEON */
141#define arch_setup_msi_irqs arch_setup_msi_irqs
142#endif
143
144extern char * (*pcibios_plat_setup)(char *str); 151extern char * (*pcibios_plat_setup)(char *str);
145 152
146#ifdef CONFIG_OF 153#ifdef CONFIG_OF
diff --git a/arch/mips/include/asm/percpu.h b/arch/mips/include/asm/percpu.h
deleted file mode 100644
index 844e763e9332..000000000000
--- a/arch/mips/include/asm/percpu.h
+++ /dev/null
@@ -1,6 +0,0 @@
1#ifndef __ASM_PERCPU_H
2#define __ASM_PERCPU_H
3
4#include <asm-generic/percpu.h>
5
6#endif /* __ASM_PERCPU_H */
diff --git a/arch/mips/include/asm/scatterlist.h b/arch/mips/include/asm/scatterlist.h
deleted file mode 100644
index 7ee0e646d82c..000000000000
--- a/arch/mips/include/asm/scatterlist.h
+++ /dev/null
@@ -1,6 +0,0 @@
1#ifndef __ASM_SCATTERLIST_H
2#define __ASM_SCATTERLIST_H
3
4#include <asm-generic/scatterlist.h>
5
6#endif /* __ASM_SCATTERLIST_H */
diff --git a/arch/mips/include/asm/sections.h b/arch/mips/include/asm/sections.h
deleted file mode 100644
index b7e37262c246..000000000000
--- a/arch/mips/include/asm/sections.h
+++ /dev/null
@@ -1,6 +0,0 @@
1#ifndef _ASM_SECTIONS_H
2#define _ASM_SECTIONS_H
3
4#include <asm-generic/sections.h>
5
6#endif /* _ASM_SECTIONS_H */
diff --git a/arch/mips/include/asm/segment.h b/arch/mips/include/asm/segment.h
deleted file mode 100644
index 92ac001fc483..000000000000
--- a/arch/mips/include/asm/segment.h
+++ /dev/null
@@ -1,6 +0,0 @@
1#ifndef _ASM_SEGMENT_H
2#define _ASM_SEGMENT_H
3
4/* Only here because we have some old header files that expect it.. */
5
6#endif /* _ASM_SEGMENT_H */
diff --git a/arch/mips/include/asm/serial.h b/arch/mips/include/asm/serial.h
deleted file mode 100644
index a0cb0caff152..000000000000
--- a/arch/mips/include/asm/serial.h
+++ /dev/null
@@ -1 +0,0 @@
1#include <asm-generic/serial.h>
diff --git a/arch/mips/include/asm/timex.h b/arch/mips/include/asm/timex.h
index 6529704aa73a..c5424757da65 100644
--- a/arch/mips/include/asm/timex.h
+++ b/arch/mips/include/asm/timex.h
@@ -10,7 +10,9 @@
10 10
11#ifdef __KERNEL__ 11#ifdef __KERNEL__
12 12
13#include <asm/cpu-features.h>
13#include <asm/mipsregs.h> 14#include <asm/mipsregs.h>
15#include <asm/cpu-type.h>
14 16
15/* 17/*
16 * This is the clock rate of the i8253 PIT. A MIPS system may not have 18 * This is the clock rate of the i8253 PIT. A MIPS system may not have
@@ -33,9 +35,38 @@
33 35
34typedef unsigned int cycles_t; 36typedef unsigned int cycles_t;
35 37
38/*
39 * On R4000/R4400 before version 5.0 an erratum exists such that if the
40 * cycle counter is read in the exact moment that it is matching the
41 * compare register, no interrupt will be generated.
42 *
43 * There is a suggested workaround and also the erratum can't strike if
44 * the compare interrupt isn't being used as the clock source device.
45 * However for now the implementaton of this function doesn't get these
46 * fine details right.
47 */
36static inline cycles_t get_cycles(void) 48static inline cycles_t get_cycles(void)
37{ 49{
38 return 0; 50 switch (boot_cpu_type()) {
51 case CPU_R4400PC:
52 case CPU_R4400SC:
53 case CPU_R4400MC:
54 if ((read_c0_prid() & 0xff) >= 0x0050)
55 return read_c0_count();
56 break;
57
58 case CPU_R4000PC:
59 case CPU_R4000SC:
60 case CPU_R4000MC:
61 break;
62
63 default:
64 if (cpu_has_counter)
65 return read_c0_count();
66 break;
67 }
68
69 return 0; /* no usable counter */
39} 70}
40 71
41#endif /* __KERNEL__ */ 72#endif /* __KERNEL__ */
diff --git a/arch/mips/include/asm/ucontext.h b/arch/mips/include/asm/ucontext.h
deleted file mode 100644
index 9bc07b9f30fb..000000000000
--- a/arch/mips/include/asm/ucontext.h
+++ /dev/null
@@ -1 +0,0 @@
1#include <asm-generic/ucontext.h>
diff --git a/arch/mips/include/asm/vga.h b/arch/mips/include/asm/vga.h
index f4cff7e4fa8a..f82c83749a08 100644
--- a/arch/mips/include/asm/vga.h
+++ b/arch/mips/include/asm/vga.h
@@ -6,6 +6,7 @@
6#ifndef _ASM_VGA_H 6#ifndef _ASM_VGA_H
7#define _ASM_VGA_H 7#define _ASM_VGA_H
8 8
9#include <asm/addrspace.h>
9#include <asm/byteorder.h> 10#include <asm/byteorder.h>
10 11
11/* 12/*
@@ -13,7 +14,7 @@
13 * access the videoram directly without any black magic. 14 * access the videoram directly without any black magic.
14 */ 15 */
15 16
16#define VGA_MAP_MEM(x, s) (0xb0000000L + (unsigned long)(x)) 17#define VGA_MAP_MEM(x, s) CKSEG1ADDR(0x10000000L + (unsigned long)(x))
17 18
18#define vga_readb(x) (*(x)) 19#define vga_readb(x) (*(x))
19#define vga_writeb(x, y) (*(y) = (x)) 20#define vga_writeb(x, y) (*(y) = (x))
diff --git a/arch/mips/include/asm/xor.h b/arch/mips/include/asm/xor.h
deleted file mode 100644
index c82eb12a5b18..000000000000
--- a/arch/mips/include/asm/xor.h
+++ /dev/null
@@ -1 +0,0 @@
1#include <asm-generic/xor.h>
diff --git a/arch/mips/include/uapi/asm/Kbuild b/arch/mips/include/uapi/asm/Kbuild
index 350ccccadcb9..be7196eacb88 100644
--- a/arch/mips/include/uapi/asm/Kbuild
+++ b/arch/mips/include/uapi/asm/Kbuild
@@ -1,7 +1,9 @@
1# UAPI Header export list 1# UAPI Header export list
2include include/uapi/asm-generic/Kbuild.asm 2include include/uapi/asm-generic/Kbuild.asm
3 3
4header-y += auxvec.h 4generic-y += auxvec.h
5generic-y += ipcbuf.h
6
5header-y += bitsperlong.h 7header-y += bitsperlong.h
6header-y += break.h 8header-y += break.h
7header-y += byteorder.h 9header-y += byteorder.h
@@ -11,7 +13,6 @@ header-y += fcntl.h
11header-y += inst.h 13header-y += inst.h
12header-y += ioctl.h 14header-y += ioctl.h
13header-y += ioctls.h 15header-y += ioctls.h
14header-y += ipcbuf.h
15header-y += kvm_para.h 16header-y += kvm_para.h
16header-y += mman.h 17header-y += mman.h
17header-y += msgbuf.h 18header-y += msgbuf.h
diff --git a/arch/mips/include/uapi/asm/auxvec.h b/arch/mips/include/uapi/asm/auxvec.h
deleted file mode 100644
index 7cf7f2d21943..000000000000
--- a/arch/mips/include/uapi/asm/auxvec.h
+++ /dev/null
@@ -1,4 +0,0 @@
1#ifndef _ASM_AUXVEC_H
2#define _ASM_AUXVEC_H
3
4#endif /* _ASM_AUXVEC_H */
diff --git a/arch/mips/include/uapi/asm/ipcbuf.h b/arch/mips/include/uapi/asm/ipcbuf.h
deleted file mode 100644
index 84c7e51cb6d0..000000000000
--- a/arch/mips/include/uapi/asm/ipcbuf.h
+++ /dev/null
@@ -1 +0,0 @@
1#include <asm-generic/ipcbuf.h>
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c
index 4c6167a17875..5465dc183e5a 100644
--- a/arch/mips/kernel/cpu-probe.c
+++ b/arch/mips/kernel/cpu-probe.c
@@ -20,6 +20,7 @@
20 20
21#include <asm/bugs.h> 21#include <asm/bugs.h>
22#include <asm/cpu.h> 22#include <asm/cpu.h>
23#include <asm/cpu-type.h>
23#include <asm/fpu.h> 24#include <asm/fpu.h>
24#include <asm/mipsregs.h> 25#include <asm/mipsregs.h>
25#include <asm/watch.h> 26#include <asm/watch.h>
@@ -55,7 +56,7 @@ static inline void check_errata(void)
55{ 56{
56 struct cpuinfo_mips *c = &current_cpu_data; 57 struct cpuinfo_mips *c = &current_cpu_data;
57 58
58 switch (c->cputype) { 59 switch (current_cpu_type()) {
59 case CPU_34K: 60 case CPU_34K:
60 /* 61 /*
61 * Erratum "RPS May Cause Incorrect Instruction Execution" 62 * Erratum "RPS May Cause Incorrect Instruction Execution"
@@ -122,7 +123,7 @@ static inline unsigned long cpu_get_fpu_id(void)
122 */ 123 */
123static inline int __cpu_has_fpu(void) 124static inline int __cpu_has_fpu(void)
124{ 125{
125 return ((cpu_get_fpu_id() & 0xff00) != FPIR_IMP_NONE); 126 return ((cpu_get_fpu_id() & FPIR_IMP_MASK) != FPIR_IMP_NONE);
126} 127}
127 128
128static inline void cpu_probe_vmbits(struct cpuinfo_mips *c) 129static inline void cpu_probe_vmbits(struct cpuinfo_mips *c)
@@ -290,6 +291,17 @@ static inline unsigned int decode_config4(struct cpuinfo_mips *c)
290 return config4 & MIPS_CONF_M; 291 return config4 & MIPS_CONF_M;
291} 292}
292 293
294static inline unsigned int decode_config5(struct cpuinfo_mips *c)
295{
296 unsigned int config5;
297
298 config5 = read_c0_config5();
299 config5 &= ~MIPS_CONF5_UFR;
300 write_c0_config5(config5);
301
302 return config5 & MIPS_CONF_M;
303}
304
293static void decode_configs(struct cpuinfo_mips *c) 305static void decode_configs(struct cpuinfo_mips *c)
294{ 306{
295 int ok; 307 int ok;
@@ -310,6 +322,8 @@ static void decode_configs(struct cpuinfo_mips *c)
310 ok = decode_config3(c); 322 ok = decode_config3(c);
311 if (ok) 323 if (ok)
312 ok = decode_config4(c); 324 ok = decode_config4(c);
325 if (ok)
326 ok = decode_config5(c);
313 327
314 mips_probe_watch_registers(c); 328 mips_probe_watch_registers(c);
315 329
@@ -322,7 +336,7 @@ static void decode_configs(struct cpuinfo_mips *c)
322 336
323static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu) 337static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu)
324{ 338{
325 switch (c->processor_id & 0xff00) { 339 switch (c->processor_id & PRID_IMP_MASK) {
326 case PRID_IMP_R2000: 340 case PRID_IMP_R2000:
327 c->cputype = CPU_R2000; 341 c->cputype = CPU_R2000;
328 __cpu_name[cpu] = "R2000"; 342 __cpu_name[cpu] = "R2000";
@@ -333,7 +347,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu)
333 c->tlbsize = 64; 347 c->tlbsize = 64;
334 break; 348 break;
335 case PRID_IMP_R3000: 349 case PRID_IMP_R3000:
336 if ((c->processor_id & 0xff) == PRID_REV_R3000A) { 350 if ((c->processor_id & PRID_REV_MASK) == PRID_REV_R3000A) {
337 if (cpu_has_confreg()) { 351 if (cpu_has_confreg()) {
338 c->cputype = CPU_R3081E; 352 c->cputype = CPU_R3081E;
339 __cpu_name[cpu] = "R3081"; 353 __cpu_name[cpu] = "R3081";
@@ -353,7 +367,8 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu)
353 break; 367 break;
354 case PRID_IMP_R4000: 368 case PRID_IMP_R4000:
355 if (read_c0_config() & CONF_SC) { 369 if (read_c0_config() & CONF_SC) {
356 if ((c->processor_id & 0xff) >= PRID_REV_R4400) { 370 if ((c->processor_id & PRID_REV_MASK) >=
371 PRID_REV_R4400) {
357 c->cputype = CPU_R4400PC; 372 c->cputype = CPU_R4400PC;
358 __cpu_name[cpu] = "R4400PC"; 373 __cpu_name[cpu] = "R4400PC";
359 } else { 374 } else {
@@ -361,7 +376,8 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu)
361 __cpu_name[cpu] = "R4000PC"; 376 __cpu_name[cpu] = "R4000PC";
362 } 377 }
363 } else { 378 } else {
364 if ((c->processor_id & 0xff) >= PRID_REV_R4400) { 379 if ((c->processor_id & PRID_REV_MASK) >=
380 PRID_REV_R4400) {
365 c->cputype = CPU_R4400SC; 381 c->cputype = CPU_R4400SC;
366 __cpu_name[cpu] = "R4400SC"; 382 __cpu_name[cpu] = "R4400SC";
367 } else { 383 } else {
@@ -454,7 +470,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu)
454 __cpu_name[cpu] = "TX3927"; 470 __cpu_name[cpu] = "TX3927";
455 c->tlbsize = 64; 471 c->tlbsize = 64;
456 } else { 472 } else {
457 switch (c->processor_id & 0xff) { 473 switch (c->processor_id & PRID_REV_MASK) {
458 case PRID_REV_TX3912: 474 case PRID_REV_TX3912:
459 c->cputype = CPU_TX3912; 475 c->cputype = CPU_TX3912;
460 __cpu_name[cpu] = "TX3912"; 476 __cpu_name[cpu] = "TX3912";
@@ -640,7 +656,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu)
640static inline void cpu_probe_mips(struct cpuinfo_mips *c, unsigned int cpu) 656static inline void cpu_probe_mips(struct cpuinfo_mips *c, unsigned int cpu)
641{ 657{
642 decode_configs(c); 658 decode_configs(c);
643 switch (c->processor_id & 0xff00) { 659 switch (c->processor_id & PRID_IMP_MASK) {
644 case PRID_IMP_4KC: 660 case PRID_IMP_4KC:
645 c->cputype = CPU_4KC; 661 c->cputype = CPU_4KC;
646 __cpu_name[cpu] = "MIPS 4Kc"; 662 __cpu_name[cpu] = "MIPS 4Kc";
@@ -711,7 +727,7 @@ static inline void cpu_probe_mips(struct cpuinfo_mips *c, unsigned int cpu)
711static inline void cpu_probe_alchemy(struct cpuinfo_mips *c, unsigned int cpu) 727static inline void cpu_probe_alchemy(struct cpuinfo_mips *c, unsigned int cpu)
712{ 728{
713 decode_configs(c); 729 decode_configs(c);
714 switch (c->processor_id & 0xff00) { 730 switch (c->processor_id & PRID_IMP_MASK) {
715 case PRID_IMP_AU1_REV1: 731 case PRID_IMP_AU1_REV1:
716 case PRID_IMP_AU1_REV2: 732 case PRID_IMP_AU1_REV2:
717 c->cputype = CPU_ALCHEMY; 733 c->cputype = CPU_ALCHEMY;
@@ -730,7 +746,7 @@ static inline void cpu_probe_alchemy(struct cpuinfo_mips *c, unsigned int cpu)
730 break; 746 break;
731 case 4: 747 case 4:
732 __cpu_name[cpu] = "Au1200"; 748 __cpu_name[cpu] = "Au1200";
733 if ((c->processor_id & 0xff) == 2) 749 if ((c->processor_id & PRID_REV_MASK) == 2)
734 __cpu_name[cpu] = "Au1250"; 750 __cpu_name[cpu] = "Au1250";
735 break; 751 break;
736 case 5: 752 case 5:
@@ -748,12 +764,12 @@ static inline void cpu_probe_sibyte(struct cpuinfo_mips *c, unsigned int cpu)
748{ 764{
749 decode_configs(c); 765 decode_configs(c);
750 766
751 switch (c->processor_id & 0xff00) { 767 switch (c->processor_id & PRID_IMP_MASK) {
752 case PRID_IMP_SB1: 768 case PRID_IMP_SB1:
753 c->cputype = CPU_SB1; 769 c->cputype = CPU_SB1;
754 __cpu_name[cpu] = "SiByte SB1"; 770 __cpu_name[cpu] = "SiByte SB1";
755 /* FPU in pass1 is known to have issues. */ 771 /* FPU in pass1 is known to have issues. */
756 if ((c->processor_id & 0xff) < 0x02) 772 if ((c->processor_id & PRID_REV_MASK) < 0x02)
757 c->options &= ~(MIPS_CPU_FPU | MIPS_CPU_32FPR); 773 c->options &= ~(MIPS_CPU_FPU | MIPS_CPU_32FPR);
758 break; 774 break;
759 case PRID_IMP_SB1A: 775 case PRID_IMP_SB1A:
@@ -766,7 +782,7 @@ static inline void cpu_probe_sibyte(struct cpuinfo_mips *c, unsigned int cpu)
766static inline void cpu_probe_sandcraft(struct cpuinfo_mips *c, unsigned int cpu) 782static inline void cpu_probe_sandcraft(struct cpuinfo_mips *c, unsigned int cpu)
767{ 783{
768 decode_configs(c); 784 decode_configs(c);
769 switch (c->processor_id & 0xff00) { 785 switch (c->processor_id & PRID_IMP_MASK) {
770 case PRID_IMP_SR71000: 786 case PRID_IMP_SR71000:
771 c->cputype = CPU_SR71000; 787 c->cputype = CPU_SR71000;
772 __cpu_name[cpu] = "Sandcraft SR71000"; 788 __cpu_name[cpu] = "Sandcraft SR71000";
@@ -779,7 +795,7 @@ static inline void cpu_probe_sandcraft(struct cpuinfo_mips *c, unsigned int cpu)
779static inline void cpu_probe_nxp(struct cpuinfo_mips *c, unsigned int cpu) 795static inline void cpu_probe_nxp(struct cpuinfo_mips *c, unsigned int cpu)
780{ 796{
781 decode_configs(c); 797 decode_configs(c);
782 switch (c->processor_id & 0xff00) { 798 switch (c->processor_id & PRID_IMP_MASK) {
783 case PRID_IMP_PR4450: 799 case PRID_IMP_PR4450:
784 c->cputype = CPU_PR4450; 800 c->cputype = CPU_PR4450;
785 __cpu_name[cpu] = "Philips PR4450"; 801 __cpu_name[cpu] = "Philips PR4450";
@@ -791,7 +807,7 @@ static inline void cpu_probe_nxp(struct cpuinfo_mips *c, unsigned int cpu)
791static inline void cpu_probe_broadcom(struct cpuinfo_mips *c, unsigned int cpu) 807static inline void cpu_probe_broadcom(struct cpuinfo_mips *c, unsigned int cpu)
792{ 808{
793 decode_configs(c); 809 decode_configs(c);
794 switch (c->processor_id & 0xff00) { 810 switch (c->processor_id & PRID_IMP_MASK) {
795 case PRID_IMP_BMIPS32_REV4: 811 case PRID_IMP_BMIPS32_REV4:
796 case PRID_IMP_BMIPS32_REV8: 812 case PRID_IMP_BMIPS32_REV8:
797 c->cputype = CPU_BMIPS32; 813 c->cputype = CPU_BMIPS32;
@@ -806,7 +822,7 @@ static inline void cpu_probe_broadcom(struct cpuinfo_mips *c, unsigned int cpu)
806 set_elf_platform(cpu, "bmips3300"); 822 set_elf_platform(cpu, "bmips3300");
807 break; 823 break;
808 case PRID_IMP_BMIPS43XX: { 824 case PRID_IMP_BMIPS43XX: {
809 int rev = c->processor_id & 0xff; 825 int rev = c->processor_id & PRID_REV_MASK;
810 826
811 if (rev >= PRID_REV_BMIPS4380_LO && 827 if (rev >= PRID_REV_BMIPS4380_LO &&
812 rev <= PRID_REV_BMIPS4380_HI) { 828 rev <= PRID_REV_BMIPS4380_HI) {
@@ -832,7 +848,7 @@ static inline void cpu_probe_broadcom(struct cpuinfo_mips *c, unsigned int cpu)
832static inline void cpu_probe_cavium(struct cpuinfo_mips *c, unsigned int cpu) 848static inline void cpu_probe_cavium(struct cpuinfo_mips *c, unsigned int cpu)
833{ 849{
834 decode_configs(c); 850 decode_configs(c);
835 switch (c->processor_id & 0xff00) { 851 switch (c->processor_id & PRID_IMP_MASK) {
836 case PRID_IMP_CAVIUM_CN38XX: 852 case PRID_IMP_CAVIUM_CN38XX:
837 case PRID_IMP_CAVIUM_CN31XX: 853 case PRID_IMP_CAVIUM_CN31XX:
838 case PRID_IMP_CAVIUM_CN30XX: 854 case PRID_IMP_CAVIUM_CN30XX:
@@ -852,10 +868,17 @@ platform:
852 case PRID_IMP_CAVIUM_CN63XX: 868 case PRID_IMP_CAVIUM_CN63XX:
853 case PRID_IMP_CAVIUM_CN66XX: 869 case PRID_IMP_CAVIUM_CN66XX:
854 case PRID_IMP_CAVIUM_CN68XX: 870 case PRID_IMP_CAVIUM_CN68XX:
871 case PRID_IMP_CAVIUM_CNF71XX:
855 c->cputype = CPU_CAVIUM_OCTEON2; 872 c->cputype = CPU_CAVIUM_OCTEON2;
856 __cpu_name[cpu] = "Cavium Octeon II"; 873 __cpu_name[cpu] = "Cavium Octeon II";
857 set_elf_platform(cpu, "octeon2"); 874 set_elf_platform(cpu, "octeon2");
858 break; 875 break;
876 case PRID_IMP_CAVIUM_CN70XX:
877 case PRID_IMP_CAVIUM_CN78XX:
878 c->cputype = CPU_CAVIUM_OCTEON3;
879 __cpu_name[cpu] = "Cavium Octeon III";
880 set_elf_platform(cpu, "octeon3");
881 break;
859 default: 882 default:
860 printk(KERN_INFO "Unknown Octeon chip!\n"); 883 printk(KERN_INFO "Unknown Octeon chip!\n");
861 c->cputype = CPU_UNKNOWN; 884 c->cputype = CPU_UNKNOWN;
@@ -868,7 +891,7 @@ static inline void cpu_probe_ingenic(struct cpuinfo_mips *c, unsigned int cpu)
868 decode_configs(c); 891 decode_configs(c);
869 /* JZRISC does not implement the CP0 counter. */ 892 /* JZRISC does not implement the CP0 counter. */
870 c->options &= ~MIPS_CPU_COUNTER; 893 c->options &= ~MIPS_CPU_COUNTER;
871 switch (c->processor_id & 0xff00) { 894 switch (c->processor_id & PRID_IMP_MASK) {
872 case PRID_IMP_JZRISC: 895 case PRID_IMP_JZRISC:
873 c->cputype = CPU_JZRISC; 896 c->cputype = CPU_JZRISC;
874 __cpu_name[cpu] = "Ingenic JZRISC"; 897 __cpu_name[cpu] = "Ingenic JZRISC";
@@ -883,7 +906,7 @@ static inline void cpu_probe_netlogic(struct cpuinfo_mips *c, int cpu)
883{ 906{
884 decode_configs(c); 907 decode_configs(c);
885 908
886 if ((c->processor_id & 0xff00) == PRID_IMP_NETLOGIC_AU13XX) { 909 if ((c->processor_id & PRID_IMP_MASK) == PRID_IMP_NETLOGIC_AU13XX) {
887 c->cputype = CPU_ALCHEMY; 910 c->cputype = CPU_ALCHEMY;
888 __cpu_name[cpu] = "Au1300"; 911 __cpu_name[cpu] = "Au1300";
889 /* following stuff is not for Alchemy */ 912 /* following stuff is not for Alchemy */
@@ -898,7 +921,12 @@ static inline void cpu_probe_netlogic(struct cpuinfo_mips *c, int cpu)
898 MIPS_CPU_EJTAG | 921 MIPS_CPU_EJTAG |
899 MIPS_CPU_LLSC); 922 MIPS_CPU_LLSC);
900 923
901 switch (c->processor_id & 0xff00) { 924 switch (c->processor_id & PRID_IMP_MASK) {
925 case PRID_IMP_NETLOGIC_XLP2XX:
926 c->cputype = CPU_XLP;
927 __cpu_name[cpu] = "Broadcom XLPII";
928 break;
929
902 case PRID_IMP_NETLOGIC_XLP8XX: 930 case PRID_IMP_NETLOGIC_XLP8XX:
903 case PRID_IMP_NETLOGIC_XLP3XX: 931 case PRID_IMP_NETLOGIC_XLP3XX:
904 c->cputype = CPU_XLP; 932 c->cputype = CPU_XLP;
@@ -972,7 +1000,7 @@ void cpu_probe(void)
972 c->cputype = CPU_UNKNOWN; 1000 c->cputype = CPU_UNKNOWN;
973 1001
974 c->processor_id = read_c0_prid(); 1002 c->processor_id = read_c0_prid();
975 switch (c->processor_id & 0xff0000) { 1003 switch (c->processor_id & PRID_COMP_MASK) {
976 case PRID_COMP_LEGACY: 1004 case PRID_COMP_LEGACY:
977 cpu_probe_legacy(c, cpu); 1005 cpu_probe_legacy(c, cpu);
978 break; 1006 break;
diff --git a/arch/mips/kernel/csrc-ioasic.c b/arch/mips/kernel/csrc-ioasic.c
index 0654bff9b69c..6cbbf6e106b9 100644
--- a/arch/mips/kernel/csrc-ioasic.c
+++ b/arch/mips/kernel/csrc-ioasic.c
@@ -37,13 +37,13 @@ static struct clocksource clocksource_dec = {
37 .flags = CLOCK_SOURCE_IS_CONTINUOUS, 37 .flags = CLOCK_SOURCE_IS_CONTINUOUS,
38}; 38};
39 39
40void __init dec_ioasic_clocksource_init(void) 40int __init dec_ioasic_clocksource_init(void)
41{ 41{
42 unsigned int freq; 42 unsigned int freq;
43 u32 start, end; 43 u32 start, end;
44 int i = HZ / 10; 44 int i = HZ / 8;
45
46 45
46 ds1287_timer_state();
47 while (!ds1287_timer_state()) 47 while (!ds1287_timer_state())
48 ; 48 ;
49 49
@@ -55,9 +55,15 @@ void __init dec_ioasic_clocksource_init(void)
55 55
56 end = dec_ioasic_hpt_read(&clocksource_dec); 56 end = dec_ioasic_hpt_read(&clocksource_dec);
57 57
58 freq = (end - start) * 10; 58 freq = (end - start) * 8;
59
60 /* An early revision of the I/O ASIC didn't have the counter. */
61 if (!freq)
62 return -ENXIO;
63
59 printk(KERN_INFO "I/O ASIC clock frequency %dHz\n", freq); 64 printk(KERN_INFO "I/O ASIC clock frequency %dHz\n", freq);
60 65
61 clocksource_dec.rating = 200 + freq / 10000000; 66 clocksource_dec.rating = 200 + freq / 10000000;
62 clocksource_register_hz(&clocksource_dec, freq); 67 clocksource_register_hz(&clocksource_dec, freq);
68 return 0;
63} 69}
diff --git a/arch/mips/kernel/idle.c b/arch/mips/kernel/idle.c
index 0c655deeea4a..f7991d95bff9 100644
--- a/arch/mips/kernel/idle.c
+++ b/arch/mips/kernel/idle.c
@@ -18,6 +18,7 @@
18#include <linux/sched.h> 18#include <linux/sched.h>
19#include <asm/cpu.h> 19#include <asm/cpu.h>
20#include <asm/cpu-info.h> 20#include <asm/cpu-info.h>
21#include <asm/cpu-type.h>
21#include <asm/idle.h> 22#include <asm/idle.h>
22#include <asm/mipsregs.h> 23#include <asm/mipsregs.h>
23 24
@@ -136,7 +137,7 @@ void __init check_wait(void)
136 return; 137 return;
137 } 138 }
138 139
139 switch (c->cputype) { 140 switch (current_cpu_type()) {
140 case CPU_R3081: 141 case CPU_R3081:
141 case CPU_R3081E: 142 case CPU_R3081E:
142 cpu_wait = r3081_wait; 143 cpu_wait = r3081_wait;
@@ -166,6 +167,7 @@ void __init check_wait(void)
166 case CPU_CAVIUM_OCTEON: 167 case CPU_CAVIUM_OCTEON:
167 case CPU_CAVIUM_OCTEON_PLUS: 168 case CPU_CAVIUM_OCTEON_PLUS:
168 case CPU_CAVIUM_OCTEON2: 169 case CPU_CAVIUM_OCTEON2:
170 case CPU_CAVIUM_OCTEON3:
169 case CPU_JZRISC: 171 case CPU_JZRISC:
170 case CPU_LOONGSON1: 172 case CPU_LOONGSON1:
171 case CPU_XLR: 173 case CPU_XLR:
diff --git a/arch/mips/kernel/mcount.S b/arch/mips/kernel/mcount.S
index a03e93c4a946..539b6294b613 100644
--- a/arch/mips/kernel/mcount.S
+++ b/arch/mips/kernel/mcount.S
@@ -83,7 +83,7 @@ _mcount:
83 PTR_S MCOUNT_RA_ADDRESS_REG, PT_R12(sp) 83 PTR_S MCOUNT_RA_ADDRESS_REG, PT_R12(sp)
84#endif 84#endif
85 85
86 move a0, ra /* arg1: self return address */ 86 PTR_SUBU a0, ra, 8 /* arg1: self address */
87 .globl ftrace_call 87 .globl ftrace_call
88ftrace_call: 88ftrace_call:
89 nop /* a placeholder for the call to a real tracing function */ 89 nop /* a placeholder for the call to a real tracing function */
diff --git a/arch/mips/kernel/prom.c b/arch/mips/kernel/prom.c
index 7e954042f252..0fa0b69cdd53 100644
--- a/arch/mips/kernel/prom.c
+++ b/arch/mips/kernel/prom.c
@@ -58,8 +58,7 @@ void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align)
58} 58}
59 59
60#ifdef CONFIG_BLK_DEV_INITRD 60#ifdef CONFIG_BLK_DEV_INITRD
61void __init early_init_dt_setup_initrd_arch(unsigned long start, 61void __init early_init_dt_setup_initrd_arch(u64 start, u64 end)
62 unsigned long end)
63{ 62{
64 initrd_start = (unsigned long)__va(start); 63 initrd_start = (unsigned long)__va(start);
65 initrd_end = (unsigned long)__va(end); 64 initrd_end = (unsigned long)__va(end);
diff --git a/arch/mips/kernel/relocate_kernel.S b/arch/mips/kernel/relocate_kernel.S
index 43d2d78d3287..74bab9ddd0e1 100644
--- a/arch/mips/kernel/relocate_kernel.S
+++ b/arch/mips/kernel/relocate_kernel.S
@@ -26,6 +26,12 @@ process_entry:
26 PTR_L s2, (s0) 26 PTR_L s2, (s0)
27 PTR_ADD s0, s0, SZREG 27 PTR_ADD s0, s0, SZREG
28 28
29 /*
30 * In case of a kdump/crash kernel, the indirection page is not
31 * populated as the kernel is directly copied to a reserved location
32 */
33 beqz s2, done
34
29 /* destination page */ 35 /* destination page */
30 and s3, s2, 0x1 36 and s3, s2, 0x1
31 beq s3, zero, 1f 37 beq s3, zero, 1f
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c
index c7f90519e58c..c538d6e01b7b 100644
--- a/arch/mips/kernel/setup.c
+++ b/arch/mips/kernel/setup.c
@@ -552,6 +552,52 @@ static void __init arch_mem_addpart(phys_t mem, phys_t end, int type)
552 add_memory_region(mem, size, type); 552 add_memory_region(mem, size, type);
553} 553}
554 554
555#ifdef CONFIG_KEXEC
556static inline unsigned long long get_total_mem(void)
557{
558 unsigned long long total;
559
560 total = max_pfn - min_low_pfn;
561 return total << PAGE_SHIFT;
562}
563
564static void __init mips_parse_crashkernel(void)
565{
566 unsigned long long total_mem;
567 unsigned long long crash_size, crash_base;
568 int ret;
569
570 total_mem = get_total_mem();
571 ret = parse_crashkernel(boot_command_line, total_mem,
572 &crash_size, &crash_base);
573 if (ret != 0 || crash_size <= 0)
574 return;
575
576 crashk_res.start = crash_base;
577 crashk_res.end = crash_base + crash_size - 1;
578}
579
580static void __init request_crashkernel(struct resource *res)
581{
582 int ret;
583
584 ret = request_resource(res, &crashk_res);
585 if (!ret)
586 pr_info("Reserving %ldMB of memory at %ldMB for crashkernel\n",
587 (unsigned long)((crashk_res.end -
588 crashk_res.start + 1) >> 20),
589 (unsigned long)(crashk_res.start >> 20));
590}
591#else /* !defined(CONFIG_KEXEC) */
592static void __init mips_parse_crashkernel(void)
593{
594}
595
596static void __init request_crashkernel(struct resource *res)
597{
598}
599#endif /* !defined(CONFIG_KEXEC) */
600
555static void __init arch_mem_init(char **cmdline_p) 601static void __init arch_mem_init(char **cmdline_p)
556{ 602{
557 extern void plat_mem_setup(void); 603 extern void plat_mem_setup(void);
@@ -608,6 +654,8 @@ static void __init arch_mem_init(char **cmdline_p)
608 BOOTMEM_DEFAULT); 654 BOOTMEM_DEFAULT);
609 } 655 }
610#endif 656#endif
657
658 mips_parse_crashkernel();
611#ifdef CONFIG_KEXEC 659#ifdef CONFIG_KEXEC
612 if (crashk_res.start != crashk_res.end) 660 if (crashk_res.start != crashk_res.end)
613 reserve_bootmem(crashk_res.start, 661 reserve_bootmem(crashk_res.start,
@@ -620,52 +668,6 @@ static void __init arch_mem_init(char **cmdline_p)
620 paging_init(); 668 paging_init();
621} 669}
622 670
623#ifdef CONFIG_KEXEC
624static inline unsigned long long get_total_mem(void)
625{
626 unsigned long long total;
627
628 total = max_pfn - min_low_pfn;
629 return total << PAGE_SHIFT;
630}
631
632static void __init mips_parse_crashkernel(void)
633{
634 unsigned long long total_mem;
635 unsigned long long crash_size, crash_base;
636 int ret;
637
638 total_mem = get_total_mem();
639 ret = parse_crashkernel(boot_command_line, total_mem,
640 &crash_size, &crash_base);
641 if (ret != 0 || crash_size <= 0)
642 return;
643
644 crashk_res.start = crash_base;
645 crashk_res.end = crash_base + crash_size - 1;
646}
647
648static void __init request_crashkernel(struct resource *res)
649{
650 int ret;
651
652 ret = request_resource(res, &crashk_res);
653 if (!ret)
654 pr_info("Reserving %ldMB of memory at %ldMB for crashkernel\n",
655 (unsigned long)((crashk_res.end -
656 crashk_res.start + 1) >> 20),
657 (unsigned long)(crashk_res.start >> 20));
658}
659#else /* !defined(CONFIG_KEXEC) */
660static void __init mips_parse_crashkernel(void)
661{
662}
663
664static void __init request_crashkernel(struct resource *res)
665{
666}
667#endif /* !defined(CONFIG_KEXEC) */
668
669static void __init resource_init(void) 671static void __init resource_init(void)
670{ 672{
671 int i; 673 int i;
@@ -678,11 +680,6 @@ static void __init resource_init(void)
678 data_resource.start = __pa_symbol(&_etext); 680 data_resource.start = __pa_symbol(&_etext);
679 data_resource.end = __pa_symbol(&_edata) - 1; 681 data_resource.end = __pa_symbol(&_edata) - 1;
680 682
681 /*
682 * Request address space for all standard RAM.
683 */
684 mips_parse_crashkernel();
685
686 for (i = 0; i < boot_mem_map.nr_map; i++) { 683 for (i = 0; i < boot_mem_map.nr_map; i++) {
687 struct resource *res; 684 struct resource *res;
688 unsigned long start, end; 685 unsigned long start, end;
diff --git a/arch/mips/kernel/smp-cmp.c b/arch/mips/kernel/smp-cmp.c
index c2e5d74739b4..5969f1e9b62a 100644
--- a/arch/mips/kernel/smp-cmp.c
+++ b/arch/mips/kernel/smp-cmp.c
@@ -99,7 +99,9 @@ static void cmp_init_secondary(void)
99 99
100 c->core = (read_c0_ebase() >> 1) & 0x1ff; 100 c->core = (read_c0_ebase() >> 1) & 0x1ff;
101#if defined(CONFIG_MIPS_MT_SMP) || defined(CONFIG_MIPS_MT_SMTC) 101#if defined(CONFIG_MIPS_MT_SMP) || defined(CONFIG_MIPS_MT_SMTC)
102 c->vpe_id = (read_c0_tcbind() >> TCBIND_CURVPE_SHIFT) & TCBIND_CURVPE; 102 if (cpu_has_mipsmt)
103 c->vpe_id = (read_c0_tcbind() >> TCBIND_CURVPE_SHIFT) &
104 TCBIND_CURVPE;
103#endif 105#endif
104#ifdef CONFIG_MIPS_MT_SMTC 106#ifdef CONFIG_MIPS_MT_SMTC
105 c->tc_id = (read_c0_tcbind() & TCBIND_CURTC) >> TCBIND_CURTC_SHIFT; 107 c->tc_id = (read_c0_tcbind() & TCBIND_CURTC) >> TCBIND_CURTC_SHIFT;
@@ -177,9 +179,16 @@ void __init cmp_smp_setup(void)
177 } 179 }
178 180
179 if (cpu_has_mipsmt) { 181 if (cpu_has_mipsmt) {
180 unsigned int nvpe, mvpconf0 = read_c0_mvpconf0(); 182 unsigned int nvpe = 1;
183#ifdef CONFIG_MIPS_MT_SMP
184 unsigned int mvpconf0 = read_c0_mvpconf0();
185
186 nvpe = ((mvpconf0 & MVPCONF0_PVPE) >> MVPCONF0_PVPE_SHIFT) + 1;
187#elif defined(CONFIG_MIPS_MT_SMTC)
188 unsigned int mvpconf0 = read_c0_mvpconf0();
181 189
182 nvpe = ((mvpconf0 & MVPCONF0_PTC) >> MVPCONF0_PTC_SHIFT) + 1; 190 nvpe = ((mvpconf0 & MVPCONF0_PTC) >> MVPCONF0_PTC_SHIFT) + 1;
191#endif
183 smp_num_siblings = nvpe; 192 smp_num_siblings = nvpe;
184 } 193 }
185 pr_info("Detected %i available secondary CPU(s)\n", ncpu); 194 pr_info("Detected %i available secondary CPU(s)\n", ncpu);
diff --git a/arch/mips/kernel/time.c b/arch/mips/kernel/time.c
index 9d686bf97b0e..dcb8e5d3bb8a 100644
--- a/arch/mips/kernel/time.c
+++ b/arch/mips/kernel/time.c
@@ -24,6 +24,7 @@
24#include <linux/export.h> 24#include <linux/export.h>
25 25
26#include <asm/cpu-features.h> 26#include <asm/cpu-features.h>
27#include <asm/cpu-type.h>
27#include <asm/div64.h> 28#include <asm/div64.h>
28#include <asm/smtc_ipi.h> 29#include <asm/smtc_ipi.h>
29#include <asm/time.h> 30#include <asm/time.h>
@@ -121,6 +122,14 @@ void __init time_init(void)
121{ 122{
122 plat_time_init(); 123 plat_time_init();
123 124
124 if (!mips_clockevent_init() || !cpu_has_mfc0_count_bug()) 125 /*
126 * The use of the R4k timer as a clock event takes precedence;
127 * if reading the Count register might interfere with the timer
128 * interrupt, then we don't use the timer as a clock source.
129 * We may still use the timer as a clock source though if the
130 * timer interrupt isn't reliable; the interference doesn't
131 * matter then, because we don't use the interrupt.
132 */
133 if (mips_clockevent_init() != 0 || !cpu_has_mfc0_count_bug())
125 init_mips_clocksource(); 134 init_mips_clocksource();
126} 135}
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c
index aec3408edd4b..524841f02803 100644
--- a/arch/mips/kernel/traps.c
+++ b/arch/mips/kernel/traps.c
@@ -39,6 +39,7 @@
39#include <asm/break.h> 39#include <asm/break.h>
40#include <asm/cop2.h> 40#include <asm/cop2.h>
41#include <asm/cpu.h> 41#include <asm/cpu.h>
42#include <asm/cpu-type.h>
42#include <asm/dsp.h> 43#include <asm/dsp.h>
43#include <asm/fpu.h> 44#include <asm/fpu.h>
44#include <asm/fpu_emulator.h> 45#include <asm/fpu_emulator.h>
@@ -622,7 +623,7 @@ static int simulate_rdhwr(struct pt_regs *regs, int rd, int rt)
622 regs->regs[rt] = read_c0_count(); 623 regs->regs[rt] = read_c0_count();
623 return 0; 624 return 0;
624 case 3: /* Count register resolution */ 625 case 3: /* Count register resolution */
625 switch (current_cpu_data.cputype) { 626 switch (current_cpu_type()) {
626 case CPU_20KC: 627 case CPU_20KC:
627 case CPU_25KF: 628 case CPU_25KF:
628 regs->regs[rt] = 1; 629 regs->regs[rt] = 1;
diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S
index 05826d20a792..3b46f7ce9ca7 100644
--- a/arch/mips/kernel/vmlinux.lds.S
+++ b/arch/mips/kernel/vmlinux.lds.S
@@ -179,5 +179,6 @@ SECTIONS
179 *(.options) 179 *(.options)
180 *(.pdr) 180 *(.pdr)
181 *(.reginfo) 181 *(.reginfo)
182 *(.eh_frame)
182 } 183 }
183} 184}
diff --git a/arch/mips/kernel/vpe.c b/arch/mips/kernel/vpe.c
index 1765bab000a0..59b2b3cd7885 100644
--- a/arch/mips/kernel/vpe.c
+++ b/arch/mips/kernel/vpe.c
@@ -1335,8 +1335,9 @@ static ssize_t store_kill(struct device *dev, struct device_attribute *attr,
1335 1335
1336 return len; 1336 return len;
1337} 1337}
1338static DEVICE_ATTR(kill, S_IWUSR, NULL, store_kill);
1338 1339
1339static ssize_t show_ntcs(struct device *cd, struct device_attribute *attr, 1340static ssize_t ntcs_show(struct device *cd, struct device_attribute *attr,
1340 char *buf) 1341 char *buf)
1341{ 1342{
1342 struct vpe *vpe = get_vpe(tclimit); 1343 struct vpe *vpe = get_vpe(tclimit);
@@ -1344,7 +1345,7 @@ static ssize_t show_ntcs(struct device *cd, struct device_attribute *attr,
1344 return sprintf(buf, "%d\n", vpe->ntcs); 1345 return sprintf(buf, "%d\n", vpe->ntcs);
1345} 1346}
1346 1347
1347static ssize_t store_ntcs(struct device *dev, struct device_attribute *attr, 1348static ssize_t ntcs_store(struct device *dev, struct device_attribute *attr,
1348 const char *buf, size_t len) 1349 const char *buf, size_t len)
1349{ 1350{
1350 struct vpe *vpe = get_vpe(tclimit); 1351 struct vpe *vpe = get_vpe(tclimit);
@@ -1365,12 +1366,14 @@ static ssize_t store_ntcs(struct device *dev, struct device_attribute *attr,
1365out_einval: 1366out_einval:
1366 return -EINVAL; 1367 return -EINVAL;
1367} 1368}
1369static DEVICE_ATTR_RW(ntcs);
1368 1370
1369static struct device_attribute vpe_class_attributes[] = { 1371static struct attribute *vpe_attrs[] = {
1370 __ATTR(kill, S_IWUSR, NULL, store_kill), 1372 &dev_attr_kill.attr,
1371 __ATTR(ntcs, S_IRUGO | S_IWUSR, show_ntcs, store_ntcs), 1373 &dev_attr_ntcs.attr,
1372 {} 1374 NULL,
1373}; 1375};
1376ATTRIBUTE_GROUPS(vpe);
1374 1377
1375static void vpe_device_release(struct device *cd) 1378static void vpe_device_release(struct device *cd)
1376{ 1379{
@@ -1381,7 +1384,7 @@ struct class vpe_class = {
1381 .name = "vpe", 1384 .name = "vpe",
1382 .owner = THIS_MODULE, 1385 .owner = THIS_MODULE,
1383 .dev_release = vpe_device_release, 1386 .dev_release = vpe_device_release,
1384 .dev_attrs = vpe_class_attributes, 1387 .dev_groups = vpe_groups,
1385}; 1388};
1386 1389
1387struct device vpe_device; 1390struct device vpe_device;
diff --git a/arch/mips/kvm/kvm_locore.S b/arch/mips/kvm/kvm_locore.S
index dca2aa665993..bbace092ad0a 100644
--- a/arch/mips/kvm/kvm_locore.S
+++ b/arch/mips/kvm/kvm_locore.S
@@ -1,13 +1,13 @@
1/* 1/*
2* This file is subject to the terms and conditions of the GNU General Public 2 * This file is subject to the terms and conditions of the GNU General Public
3* License. See the file "COPYING" in the main directory of this archive 3 * License. See the file "COPYING" in the main directory of this archive
4* for more details. 4 * for more details.
5* 5 *
6* Main entry point for the guest, exception handling. 6 * Main entry point for the guest, exception handling.
7* 7 *
8* Copyright (C) 2012 MIPS Technologies, Inc. All rights reserved. 8 * Copyright (C) 2012 MIPS Technologies, Inc. All rights reserved.
9* Authors: Sanjay Lal <sanjayl@kymasys.com> 9 * Authors: Sanjay Lal <sanjayl@kymasys.com>
10*/ 10 */
11 11
12#include <asm/asm.h> 12#include <asm/asm.h>
13#include <asm/asmmacro.h> 13#include <asm/asmmacro.h>
@@ -55,195 +55,193 @@
55 * a0: run 55 * a0: run
56 * a1: vcpu 56 * a1: vcpu
57 */ 57 */
58 .set noreorder
59 .set noat
58 60
59FEXPORT(__kvm_mips_vcpu_run) 61FEXPORT(__kvm_mips_vcpu_run)
60 .set push 62 /* k0/k1 not being used in host kernel context */
61 .set noreorder 63 INT_ADDIU k1, sp, -PT_SIZE
62 .set noat 64 LONG_S $0, PT_R0(k1)
63 65 LONG_S $1, PT_R1(k1)
64 /* k0/k1 not being used in host kernel context */ 66 LONG_S $2, PT_R2(k1)
65 addiu k1,sp, -PT_SIZE 67 LONG_S $3, PT_R3(k1)
66 LONG_S $0, PT_R0(k1) 68
67 LONG_S $1, PT_R1(k1) 69 LONG_S $4, PT_R4(k1)
68 LONG_S $2, PT_R2(k1) 70 LONG_S $5, PT_R5(k1)
69 LONG_S $3, PT_R3(k1) 71 LONG_S $6, PT_R6(k1)
70 72 LONG_S $7, PT_R7(k1)
71 LONG_S $4, PT_R4(k1) 73
72 LONG_S $5, PT_R5(k1) 74 LONG_S $8, PT_R8(k1)
73 LONG_S $6, PT_R6(k1) 75 LONG_S $9, PT_R9(k1)
74 LONG_S $7, PT_R7(k1) 76 LONG_S $10, PT_R10(k1)
75 77 LONG_S $11, PT_R11(k1)
76 LONG_S $8, PT_R8(k1) 78 LONG_S $12, PT_R12(k1)
77 LONG_S $9, PT_R9(k1) 79 LONG_S $13, PT_R13(k1)
78 LONG_S $10, PT_R10(k1) 80 LONG_S $14, PT_R14(k1)
79 LONG_S $11, PT_R11(k1) 81 LONG_S $15, PT_R15(k1)
80 LONG_S $12, PT_R12(k1) 82 LONG_S $16, PT_R16(k1)
81 LONG_S $13, PT_R13(k1) 83 LONG_S $17, PT_R17(k1)
82 LONG_S $14, PT_R14(k1) 84
83 LONG_S $15, PT_R15(k1) 85 LONG_S $18, PT_R18(k1)
84 LONG_S $16, PT_R16(k1) 86 LONG_S $19, PT_R19(k1)
85 LONG_S $17, PT_R17(k1) 87 LONG_S $20, PT_R20(k1)
86 88 LONG_S $21, PT_R21(k1)
87 LONG_S $18, PT_R18(k1) 89 LONG_S $22, PT_R22(k1)
88 LONG_S $19, PT_R19(k1) 90 LONG_S $23, PT_R23(k1)
89 LONG_S $20, PT_R20(k1) 91 LONG_S $24, PT_R24(k1)
90 LONG_S $21, PT_R21(k1) 92 LONG_S $25, PT_R25(k1)
91 LONG_S $22, PT_R22(k1)
92 LONG_S $23, PT_R23(k1)
93 LONG_S $24, PT_R24(k1)
94 LONG_S $25, PT_R25(k1)
95 93
96 /* XXXKYMA k0/k1 not saved, not being used if we got here through an ioctl() */ 94 /* XXXKYMA k0/k1 not saved, not being used if we got here through an ioctl() */
97 95
98 LONG_S $28, PT_R28(k1) 96 LONG_S $28, PT_R28(k1)
99 LONG_S $29, PT_R29(k1) 97 LONG_S $29, PT_R29(k1)
100 LONG_S $30, PT_R30(k1) 98 LONG_S $30, PT_R30(k1)
101 LONG_S $31, PT_R31(k1) 99 LONG_S $31, PT_R31(k1)
102 100
103 /* Save hi/lo */ 101 /* Save hi/lo */
104 mflo v0 102 mflo v0
105 LONG_S v0, PT_LO(k1) 103 LONG_S v0, PT_LO(k1)
106 mfhi v1 104 mfhi v1
107 LONG_S v1, PT_HI(k1) 105 LONG_S v1, PT_HI(k1)
108 106
109 /* Save host status */ 107 /* Save host status */
110 mfc0 v0, CP0_STATUS 108 mfc0 v0, CP0_STATUS
111 LONG_S v0, PT_STATUS(k1) 109 LONG_S v0, PT_STATUS(k1)
112 110
113 /* Save host ASID, shove it into the BVADDR location */ 111 /* Save host ASID, shove it into the BVADDR location */
114 mfc0 v1,CP0_ENTRYHI 112 mfc0 v1, CP0_ENTRYHI
115 andi v1, 0xff 113 andi v1, 0xff
116 LONG_S v1, PT_HOST_ASID(k1) 114 LONG_S v1, PT_HOST_ASID(k1)
117 115
118 /* Save DDATA_LO, will be used to store pointer to vcpu */ 116 /* Save DDATA_LO, will be used to store pointer to vcpu */
119 mfc0 v1, CP0_DDATA_LO 117 mfc0 v1, CP0_DDATA_LO
120 LONG_S v1, PT_HOST_USERLOCAL(k1) 118 LONG_S v1, PT_HOST_USERLOCAL(k1)
121 119
122 /* DDATA_LO has pointer to vcpu */ 120 /* DDATA_LO has pointer to vcpu */
123 mtc0 a1,CP0_DDATA_LO 121 mtc0 a1, CP0_DDATA_LO
124 122
125 /* Offset into vcpu->arch */ 123 /* Offset into vcpu->arch */
126 addiu k1, a1, VCPU_HOST_ARCH 124 INT_ADDIU k1, a1, VCPU_HOST_ARCH
127 125
128 /* Save the host stack to VCPU, used for exception processing when we exit from the Guest */ 126 /*
129 LONG_S sp, VCPU_HOST_STACK(k1) 127 * Save the host stack to VCPU, used for exception processing
128 * when we exit from the Guest
129 */
130 LONG_S sp, VCPU_HOST_STACK(k1)
130 131
131 /* Save the kernel gp as well */ 132 /* Save the kernel gp as well */
132 LONG_S gp, VCPU_HOST_GP(k1) 133 LONG_S gp, VCPU_HOST_GP(k1)
133 134
134 /* Setup status register for running the guest in UM, interrupts are disabled */ 135 /* Setup status register for running the guest in UM, interrupts are disabled */
135 li k0,(ST0_EXL | KSU_USER| ST0_BEV) 136 li k0, (ST0_EXL | KSU_USER | ST0_BEV)
136 mtc0 k0,CP0_STATUS 137 mtc0 k0, CP0_STATUS
137 ehb 138 ehb
138 139
139 /* load up the new EBASE */ 140 /* load up the new EBASE */
140 LONG_L k0, VCPU_GUEST_EBASE(k1) 141 LONG_L k0, VCPU_GUEST_EBASE(k1)
141 mtc0 k0,CP0_EBASE 142 mtc0 k0, CP0_EBASE
142 143
143 /* Now that the new EBASE has been loaded, unset BEV, set interrupt mask as it was 144 /*
144 * but make sure that timer interrupts are enabled 145 * Now that the new EBASE has been loaded, unset BEV, set
145 */ 146 * interrupt mask as it was but make sure that timer interrupts
146 li k0,(ST0_EXL | KSU_USER | ST0_IE) 147 * are enabled
147 andi v0, v0, ST0_IM 148 */
148 or k0, k0, v0 149 li k0, (ST0_EXL | KSU_USER | ST0_IE)
149 mtc0 k0,CP0_STATUS 150 andi v0, v0, ST0_IM
150 ehb 151 or k0, k0, v0
152 mtc0 k0, CP0_STATUS
153 ehb
151 154
152 155
153 /* Set Guest EPC */ 156 /* Set Guest EPC */
154 LONG_L t0, VCPU_PC(k1) 157 LONG_L t0, VCPU_PC(k1)
155 mtc0 t0, CP0_EPC 158 mtc0 t0, CP0_EPC
156 159
157FEXPORT(__kvm_mips_load_asid) 160FEXPORT(__kvm_mips_load_asid)
158 /* Set the ASID for the Guest Kernel */ 161 /* Set the ASID for the Guest Kernel */
159 sll t0, t0, 1 /* with kseg0 @ 0x40000000, kernel */ 162 INT_SLL t0, t0, 1 /* with kseg0 @ 0x40000000, kernel */
160 /* addresses shift to 0x80000000 */ 163 /* addresses shift to 0x80000000 */
161 bltz t0, 1f /* If kernel */ 164 bltz t0, 1f /* If kernel */
162 addiu t1, k1, VCPU_GUEST_KERNEL_ASID /* (BD) */ 165 INT_ADDIU t1, k1, VCPU_GUEST_KERNEL_ASID /* (BD) */
163 addiu t1, k1, VCPU_GUEST_USER_ASID /* else user */ 166 INT_ADDIU t1, k1, VCPU_GUEST_USER_ASID /* else user */
1641: 1671:
165 /* t1: contains the base of the ASID array, need to get the cpu id */ 168 /* t1: contains the base of the ASID array, need to get the cpu id */
166 LONG_L t2, TI_CPU($28) /* smp_processor_id */ 169 LONG_L t2, TI_CPU($28) /* smp_processor_id */
167 sll t2, t2, 2 /* x4 */ 170 INT_SLL t2, t2, 2 /* x4 */
168 addu t3, t1, t2 171 REG_ADDU t3, t1, t2
169 LONG_L k0, (t3) 172 LONG_L k0, (t3)
170 andi k0, k0, 0xff 173 andi k0, k0, 0xff
171 mtc0 k0,CP0_ENTRYHI 174 mtc0 k0, CP0_ENTRYHI
172 ehb 175 ehb
173 176
174 /* Disable RDHWR access */ 177 /* Disable RDHWR access */
175 mtc0 zero, CP0_HWRENA 178 mtc0 zero, CP0_HWRENA
176 179
177 /* Now load up the Guest Context from VCPU */ 180 /* Now load up the Guest Context from VCPU */
178 LONG_L $1, VCPU_R1(k1) 181 LONG_L $1, VCPU_R1(k1)
179 LONG_L $2, VCPU_R2(k1) 182 LONG_L $2, VCPU_R2(k1)
180 LONG_L $3, VCPU_R3(k1) 183 LONG_L $3, VCPU_R3(k1)
181 184
182 LONG_L $4, VCPU_R4(k1) 185 LONG_L $4, VCPU_R4(k1)
183 LONG_L $5, VCPU_R5(k1) 186 LONG_L $5, VCPU_R5(k1)
184 LONG_L $6, VCPU_R6(k1) 187 LONG_L $6, VCPU_R6(k1)
185 LONG_L $7, VCPU_R7(k1) 188 LONG_L $7, VCPU_R7(k1)
186 189
187 LONG_L $8, VCPU_R8(k1) 190 LONG_L $8, VCPU_R8(k1)
188 LONG_L $9, VCPU_R9(k1) 191 LONG_L $9, VCPU_R9(k1)
189 LONG_L $10, VCPU_R10(k1) 192 LONG_L $10, VCPU_R10(k1)
190 LONG_L $11, VCPU_R11(k1) 193 LONG_L $11, VCPU_R11(k1)
191 LONG_L $12, VCPU_R12(k1) 194 LONG_L $12, VCPU_R12(k1)
192 LONG_L $13, VCPU_R13(k1) 195 LONG_L $13, VCPU_R13(k1)
193 LONG_L $14, VCPU_R14(k1) 196 LONG_L $14, VCPU_R14(k1)
194 LONG_L $15, VCPU_R15(k1) 197 LONG_L $15, VCPU_R15(k1)
195 LONG_L $16, VCPU_R16(k1) 198 LONG_L $16, VCPU_R16(k1)
196 LONG_L $17, VCPU_R17(k1) 199 LONG_L $17, VCPU_R17(k1)
197 LONG_L $18, VCPU_R18(k1) 200 LONG_L $18, VCPU_R18(k1)
198 LONG_L $19, VCPU_R19(k1) 201 LONG_L $19, VCPU_R19(k1)
199 LONG_L $20, VCPU_R20(k1) 202 LONG_L $20, VCPU_R20(k1)
200 LONG_L $21, VCPU_R21(k1) 203 LONG_L $21, VCPU_R21(k1)
201 LONG_L $22, VCPU_R22(k1) 204 LONG_L $22, VCPU_R22(k1)
202 LONG_L $23, VCPU_R23(k1) 205 LONG_L $23, VCPU_R23(k1)
203 LONG_L $24, VCPU_R24(k1) 206 LONG_L $24, VCPU_R24(k1)
204 LONG_L $25, VCPU_R25(k1) 207 LONG_L $25, VCPU_R25(k1)
205 208
206 /* k0/k1 loaded up later */ 209 /* k0/k1 loaded up later */
207 210
208 LONG_L $28, VCPU_R28(k1) 211 LONG_L $28, VCPU_R28(k1)
209 LONG_L $29, VCPU_R29(k1) 212 LONG_L $29, VCPU_R29(k1)
210 LONG_L $30, VCPU_R30(k1) 213 LONG_L $30, VCPU_R30(k1)
211 LONG_L $31, VCPU_R31(k1) 214 LONG_L $31, VCPU_R31(k1)
212 215
213 /* Restore hi/lo */ 216 /* Restore hi/lo */
214 LONG_L k0, VCPU_LO(k1) 217 LONG_L k0, VCPU_LO(k1)
215 mtlo k0 218 mtlo k0
216 219
217 LONG_L k0, VCPU_HI(k1) 220 LONG_L k0, VCPU_HI(k1)
218 mthi k0 221 mthi k0
219 222
220FEXPORT(__kvm_mips_load_k0k1) 223FEXPORT(__kvm_mips_load_k0k1)
221 /* Restore the guest's k0/k1 registers */ 224 /* Restore the guest's k0/k1 registers */
222 LONG_L k0, VCPU_R26(k1) 225 LONG_L k0, VCPU_R26(k1)
223 LONG_L k1, VCPU_R27(k1) 226 LONG_L k1, VCPU_R27(k1)
224 227
225 /* Jump to guest */ 228 /* Jump to guest */
226 eret 229 eret
227 .set pop
228 230
229VECTOR(MIPSX(exception), unknown) 231VECTOR(MIPSX(exception), unknown)
230/* 232/*
231 * Find out what mode we came from and jump to the proper handler. 233 * Find out what mode we came from and jump to the proper handler.
232 */ 234 */
233 .set push 235 mtc0 k0, CP0_ERROREPC #01: Save guest k0
234 .set noat 236 ehb #02:
235 .set noreorder 237
236 mtc0 k0, CP0_ERROREPC #01: Save guest k0 238 mfc0 k0, CP0_EBASE #02: Get EBASE
237 ehb #02: 239 INT_SRL k0, k0, 10 #03: Get rid of CPUNum
238 240 INT_SLL k0, k0, 10 #04
239 mfc0 k0, CP0_EBASE #02: Get EBASE 241 LONG_S k1, 0x3000(k0) #05: Save k1 @ offset 0x3000
240 srl k0, k0, 10 #03: Get rid of CPUNum 242 INT_ADDIU k0, k0, 0x2000 #06: Exception handler is installed @ offset 0x2000
241 sll k0, k0, 10 #04 243 j k0 #07: jump to the function
242 LONG_S k1, 0x3000(k0) #05: Save k1 @ offset 0x3000 244 nop #08: branch delay slot
243 addiu k0, k0, 0x2000 #06: Exception handler is installed @ offset 0x2000
244 j k0 #07: jump to the function
245 nop #08: branch delay slot
246 .set push
247VECTOR_END(MIPSX(exceptionEnd)) 245VECTOR_END(MIPSX(exceptionEnd))
248.end MIPSX(exception) 246.end MIPSX(exception)
249 247
@@ -253,329 +251,327 @@ VECTOR_END(MIPSX(exceptionEnd))
253 * 251 *
254 */ 252 */
255NESTED (MIPSX(GuestException), CALLFRAME_SIZ, ra) 253NESTED (MIPSX(GuestException), CALLFRAME_SIZ, ra)
256 .set push 254 /* Get the VCPU pointer from DDTATA_LO */
257 .set noat 255 mfc0 k1, CP0_DDATA_LO
258 .set noreorder 256 INT_ADDIU k1, k1, VCPU_HOST_ARCH
259 257
260 /* Get the VCPU pointer from DDTATA_LO */ 258 /* Start saving Guest context to VCPU */
261 mfc0 k1, CP0_DDATA_LO 259 LONG_S $0, VCPU_R0(k1)
262 addiu k1, k1, VCPU_HOST_ARCH 260 LONG_S $1, VCPU_R1(k1)
263 261 LONG_S $2, VCPU_R2(k1)
264 /* Start saving Guest context to VCPU */ 262 LONG_S $3, VCPU_R3(k1)
265 LONG_S $0, VCPU_R0(k1) 263 LONG_S $4, VCPU_R4(k1)
266 LONG_S $1, VCPU_R1(k1) 264 LONG_S $5, VCPU_R5(k1)
267 LONG_S $2, VCPU_R2(k1) 265 LONG_S $6, VCPU_R6(k1)
268 LONG_S $3, VCPU_R3(k1) 266 LONG_S $7, VCPU_R7(k1)
269 LONG_S $4, VCPU_R4(k1) 267 LONG_S $8, VCPU_R8(k1)
270 LONG_S $5, VCPU_R5(k1) 268 LONG_S $9, VCPU_R9(k1)
271 LONG_S $6, VCPU_R6(k1) 269 LONG_S $10, VCPU_R10(k1)
272 LONG_S $7, VCPU_R7(k1) 270 LONG_S $11, VCPU_R11(k1)
273 LONG_S $8, VCPU_R8(k1) 271 LONG_S $12, VCPU_R12(k1)
274 LONG_S $9, VCPU_R9(k1) 272 LONG_S $13, VCPU_R13(k1)
275 LONG_S $10, VCPU_R10(k1) 273 LONG_S $14, VCPU_R14(k1)
276 LONG_S $11, VCPU_R11(k1) 274 LONG_S $15, VCPU_R15(k1)
277 LONG_S $12, VCPU_R12(k1) 275 LONG_S $16, VCPU_R16(k1)
278 LONG_S $13, VCPU_R13(k1) 276 LONG_S $17, VCPU_R17(k1)
279 LONG_S $14, VCPU_R14(k1) 277 LONG_S $18, VCPU_R18(k1)
280 LONG_S $15, VCPU_R15(k1) 278 LONG_S $19, VCPU_R19(k1)
281 LONG_S $16, VCPU_R16(k1) 279 LONG_S $20, VCPU_R20(k1)
282 LONG_S $17,VCPU_R17(k1) 280 LONG_S $21, VCPU_R21(k1)
283 LONG_S $18, VCPU_R18(k1) 281 LONG_S $22, VCPU_R22(k1)
284 LONG_S $19, VCPU_R19(k1) 282 LONG_S $23, VCPU_R23(k1)
285 LONG_S $20, VCPU_R20(k1) 283 LONG_S $24, VCPU_R24(k1)
286 LONG_S $21, VCPU_R21(k1) 284 LONG_S $25, VCPU_R25(k1)
287 LONG_S $22, VCPU_R22(k1) 285
288 LONG_S $23, VCPU_R23(k1) 286 /* Guest k0/k1 saved later */
289 LONG_S $24, VCPU_R24(k1) 287
290 LONG_S $25, VCPU_R25(k1) 288 LONG_S $28, VCPU_R28(k1)
291 289 LONG_S $29, VCPU_R29(k1)
292 /* Guest k0/k1 saved later */ 290 LONG_S $30, VCPU_R30(k1)
293 291 LONG_S $31, VCPU_R31(k1)
294 LONG_S $28, VCPU_R28(k1) 292
295 LONG_S $29, VCPU_R29(k1) 293 /* We need to save hi/lo and restore them on
296 LONG_S $30, VCPU_R30(k1) 294 * the way out
297 LONG_S $31, VCPU_R31(k1) 295 */
298 296 mfhi t0
299 /* We need to save hi/lo and restore them on 297 LONG_S t0, VCPU_HI(k1)
300 * the way out 298
301 */ 299 mflo t0
302 mfhi t0 300 LONG_S t0, VCPU_LO(k1)
303 LONG_S t0, VCPU_HI(k1) 301
304 302 /* Finally save guest k0/k1 to VCPU */
305 mflo t0 303 mfc0 t0, CP0_ERROREPC
306 LONG_S t0, VCPU_LO(k1) 304 LONG_S t0, VCPU_R26(k1)
307 305
308 /* Finally save guest k0/k1 to VCPU */ 306 /* Get GUEST k1 and save it in VCPU */
309 mfc0 t0, CP0_ERROREPC 307 PTR_LI t1, ~0x2ff
310 LONG_S t0, VCPU_R26(k1) 308 mfc0 t0, CP0_EBASE
311 309 and t0, t0, t1
312 /* Get GUEST k1 and save it in VCPU */ 310 LONG_L t0, 0x3000(t0)
313 la t1, ~0x2ff 311 LONG_S t0, VCPU_R27(k1)
314 mfc0 t0, CP0_EBASE 312
315 and t0, t0, t1 313 /* Now that context has been saved, we can use other registers */
316 LONG_L t0, 0x3000(t0) 314
317 LONG_S t0, VCPU_R27(k1) 315 /* Restore vcpu */
318 316 mfc0 a1, CP0_DDATA_LO
319 /* Now that context has been saved, we can use other registers */ 317 move s1, a1
320 318
321 /* Restore vcpu */ 319 /* Restore run (vcpu->run) */
322 mfc0 a1, CP0_DDATA_LO 320 LONG_L a0, VCPU_RUN(a1)
323 move s1, a1 321 /* Save pointer to run in s0, will be saved by the compiler */
324 322 move s0, a0
325 /* Restore run (vcpu->run) */ 323
326 LONG_L a0, VCPU_RUN(a1) 324 /* Save Host level EPC, BadVaddr and Cause to VCPU, useful to
327 /* Save pointer to run in s0, will be saved by the compiler */ 325 * process the exception */
328 move s0, a0 326 mfc0 k0,CP0_EPC
329 327 LONG_S k0, VCPU_PC(k1)
330 328
331 /* Save Host level EPC, BadVaddr and Cause to VCPU, useful to process the exception */ 329 mfc0 k0, CP0_BADVADDR
332 mfc0 k0,CP0_EPC 330 LONG_S k0, VCPU_HOST_CP0_BADVADDR(k1)
333 LONG_S k0, VCPU_PC(k1) 331
334 332 mfc0 k0, CP0_CAUSE
335 mfc0 k0, CP0_BADVADDR 333 LONG_S k0, VCPU_HOST_CP0_CAUSE(k1)
336 LONG_S k0, VCPU_HOST_CP0_BADVADDR(k1) 334
337 335 mfc0 k0, CP0_ENTRYHI
338 mfc0 k0, CP0_CAUSE 336 LONG_S k0, VCPU_HOST_ENTRYHI(k1)
339 LONG_S k0, VCPU_HOST_CP0_CAUSE(k1) 337
340 338 /* Now restore the host state just enough to run the handlers */
341 mfc0 k0, CP0_ENTRYHI 339
342 LONG_S k0, VCPU_HOST_ENTRYHI(k1) 340 /* Swtich EBASE to the one used by Linux */
343 341 /* load up the host EBASE */
344 /* Now restore the host state just enough to run the handlers */ 342 mfc0 v0, CP0_STATUS
345 343
346 /* Swtich EBASE to the one used by Linux */ 344 .set at
347 /* load up the host EBASE */ 345 or k0, v0, ST0_BEV
348 mfc0 v0, CP0_STATUS 346 .set noat
349 347
350 .set at 348 mtc0 k0, CP0_STATUS
351 or k0, v0, ST0_BEV 349 ehb
352 .set noat 350
353 351 LONG_L k0, VCPU_HOST_EBASE(k1)
354 mtc0 k0, CP0_STATUS 352 mtc0 k0,CP0_EBASE
355 ehb 353
356
357 LONG_L k0, VCPU_HOST_EBASE(k1)
358 mtc0 k0,CP0_EBASE
359
360
361 /* Now that the new EBASE has been loaded, unset BEV and KSU_USER */
362 .set at
363 and v0, v0, ~(ST0_EXL | KSU_USER | ST0_IE)
364 or v0, v0, ST0_CU0
365 .set noat
366 mtc0 v0, CP0_STATUS
367 ehb
368
369 /* Load up host GP */
370 LONG_L gp, VCPU_HOST_GP(k1)
371
372 /* Need a stack before we can jump to "C" */
373 LONG_L sp, VCPU_HOST_STACK(k1)
374
375 /* Saved host state */
376 addiu sp,sp, -PT_SIZE
377 354
378 /* XXXKYMA do we need to load the host ASID, maybe not because the 355 /* Now that the new EBASE has been loaded, unset BEV and KSU_USER */
379 * kernel entries are marked GLOBAL, need to verify 356 .set at
380 */ 357 and v0, v0, ~(ST0_EXL | KSU_USER | ST0_IE)
358 or v0, v0, ST0_CU0
359 .set noat
360 mtc0 v0, CP0_STATUS
361 ehb
362
363 /* Load up host GP */
364 LONG_L gp, VCPU_HOST_GP(k1)
365
366 /* Need a stack before we can jump to "C" */
367 LONG_L sp, VCPU_HOST_STACK(k1)
368
369 /* Saved host state */
370 INT_ADDIU sp, sp, -PT_SIZE
381 371
382 /* Restore host DDATA_LO */ 372 /* XXXKYMA do we need to load the host ASID, maybe not because the
383 LONG_L k0, PT_HOST_USERLOCAL(sp) 373 * kernel entries are marked GLOBAL, need to verify
384 mtc0 k0, CP0_DDATA_LO 374 */
385 375
386 /* Restore RDHWR access */ 376 /* Restore host DDATA_LO */
387 la k0, 0x2000000F 377 LONG_L k0, PT_HOST_USERLOCAL(sp)
388 mtc0 k0, CP0_HWRENA 378 mtc0 k0, CP0_DDATA_LO
389 379
390 /* Jump to handler */ 380 /* Restore RDHWR access */
381 PTR_LI k0, 0x2000000F
382 mtc0 k0, CP0_HWRENA
383
384 /* Jump to handler */
391FEXPORT(__kvm_mips_jump_to_handler) 385FEXPORT(__kvm_mips_jump_to_handler)
392 /* XXXKYMA: not sure if this is safe, how large is the stack?? */ 386 /* XXXKYMA: not sure if this is safe, how large is the stack??
393 /* Now jump to the kvm_mips_handle_exit() to see if we can deal with this in the kernel */ 387 * Now jump to the kvm_mips_handle_exit() to see if we can deal
394 la t9,kvm_mips_handle_exit 388 * with this in the kernel */
395 jalr.hb t9 389 PTR_LA t9, kvm_mips_handle_exit
396 addiu sp,sp, -CALLFRAME_SIZ /* BD Slot */ 390 jalr.hb t9
397 391 INT_ADDIU sp, sp, -CALLFRAME_SIZ /* BD Slot */
398 /* Return from handler Make sure interrupts are disabled */ 392
399 di 393 /* Return from handler Make sure interrupts are disabled */
400 ehb 394 di
401 395 ehb
402 /* XXXKYMA: k0/k1 could have been blown away if we processed an exception 396
403 * while we were handling the exception from the guest, reload k1 397 /* XXXKYMA: k0/k1 could have been blown away if we processed
404 */ 398 * an exception while we were handling the exception from the
405 move k1, s1 399 * guest, reload k1
406 addiu k1, k1, VCPU_HOST_ARCH 400 */
407 401
408 /* Check return value, should tell us if we are returning to the host (handle I/O etc) 402 move k1, s1
409 * or resuming the guest 403 INT_ADDIU k1, k1, VCPU_HOST_ARCH
410 */ 404
411 andi t0, v0, RESUME_HOST 405 /* Check return value, should tell us if we are returning to the
412 bnez t0, __kvm_mips_return_to_host 406 * host (handle I/O etc)or resuming the guest
413 nop 407 */
408 andi t0, v0, RESUME_HOST
409 bnez t0, __kvm_mips_return_to_host
410 nop
414 411
415__kvm_mips_return_to_guest: 412__kvm_mips_return_to_guest:
416 /* Put the saved pointer to vcpu (s1) back into the DDATA_LO Register */ 413 /* Put the saved pointer to vcpu (s1) back into the DDATA_LO Register */
417 mtc0 s1, CP0_DDATA_LO 414 mtc0 s1, CP0_DDATA_LO
418
419 /* Load up the Guest EBASE to minimize the window where BEV is set */
420 LONG_L t0, VCPU_GUEST_EBASE(k1)
421
422 /* Switch EBASE back to the one used by KVM */
423 mfc0 v1, CP0_STATUS
424 .set at
425 or k0, v1, ST0_BEV
426 .set noat
427 mtc0 k0, CP0_STATUS
428 ehb
429 mtc0 t0,CP0_EBASE
430
431 /* Setup status register for running guest in UM */
432 .set at
433 or v1, v1, (ST0_EXL | KSU_USER | ST0_IE)
434 and v1, v1, ~ST0_CU0
435 .set noat
436 mtc0 v1, CP0_STATUS
437 ehb
438 415
416 /* Load up the Guest EBASE to minimize the window where BEV is set */
417 LONG_L t0, VCPU_GUEST_EBASE(k1)
418
419 /* Switch EBASE back to the one used by KVM */
420 mfc0 v1, CP0_STATUS
421 .set at
422 or k0, v1, ST0_BEV
423 .set noat
424 mtc0 k0, CP0_STATUS
425 ehb
426 mtc0 t0, CP0_EBASE
427
428 /* Setup status register for running guest in UM */
429 .set at
430 or v1, v1, (ST0_EXL | KSU_USER | ST0_IE)
431 and v1, v1, ~ST0_CU0
432 .set noat
433 mtc0 v1, CP0_STATUS
434 ehb
439 435
440 /* Set Guest EPC */ 436 /* Set Guest EPC */
441 LONG_L t0, VCPU_PC(k1) 437 LONG_L t0, VCPU_PC(k1)
442 mtc0 t0, CP0_EPC 438 mtc0 t0, CP0_EPC
443 439
444 /* Set the ASID for the Guest Kernel */ 440 /* Set the ASID for the Guest Kernel */
445 sll t0, t0, 1 /* with kseg0 @ 0x40000000, kernel */ 441 INT_SLL t0, t0, 1 /* with kseg0 @ 0x40000000, kernel */
446 /* addresses shift to 0x80000000 */ 442 /* addresses shift to 0x80000000 */
447 bltz t0, 1f /* If kernel */ 443 bltz t0, 1f /* If kernel */
448 addiu t1, k1, VCPU_GUEST_KERNEL_ASID /* (BD) */ 444 INT_ADDIU t1, k1, VCPU_GUEST_KERNEL_ASID /* (BD) */
449 addiu t1, k1, VCPU_GUEST_USER_ASID /* else user */ 445 INT_ADDIU t1, k1, VCPU_GUEST_USER_ASID /* else user */
4501: 4461:
451 /* t1: contains the base of the ASID array, need to get the cpu id */ 447 /* t1: contains the base of the ASID array, need to get the cpu id */
452 LONG_L t2, TI_CPU($28) /* smp_processor_id */ 448 LONG_L t2, TI_CPU($28) /* smp_processor_id */
453 sll t2, t2, 2 /* x4 */ 449 INT_SLL t2, t2, 2 /* x4 */
454 addu t3, t1, t2 450 REG_ADDU t3, t1, t2
455 LONG_L k0, (t3) 451 LONG_L k0, (t3)
456 andi k0, k0, 0xff 452 andi k0, k0, 0xff
457 mtc0 k0,CP0_ENTRYHI 453 mtc0 k0,CP0_ENTRYHI
458 ehb 454 ehb
459 455
460 /* Disable RDHWR access */ 456 /* Disable RDHWR access */
461 mtc0 zero, CP0_HWRENA 457 mtc0 zero, CP0_HWRENA
462 458
463 /* load the guest context from VCPU and return */ 459 /* load the guest context from VCPU and return */
464 LONG_L $0, VCPU_R0(k1) 460 LONG_L $0, VCPU_R0(k1)
465 LONG_L $1, VCPU_R1(k1) 461 LONG_L $1, VCPU_R1(k1)
466 LONG_L $2, VCPU_R2(k1) 462 LONG_L $2, VCPU_R2(k1)
467 LONG_L $3, VCPU_R3(k1) 463 LONG_L $3, VCPU_R3(k1)
468 LONG_L $4, VCPU_R4(k1) 464 LONG_L $4, VCPU_R4(k1)
469 LONG_L $5, VCPU_R5(k1) 465 LONG_L $5, VCPU_R5(k1)
470 LONG_L $6, VCPU_R6(k1) 466 LONG_L $6, VCPU_R6(k1)
471 LONG_L $7, VCPU_R7(k1) 467 LONG_L $7, VCPU_R7(k1)
472 LONG_L $8, VCPU_R8(k1) 468 LONG_L $8, VCPU_R8(k1)
473 LONG_L $9, VCPU_R9(k1) 469 LONG_L $9, VCPU_R9(k1)
474 LONG_L $10, VCPU_R10(k1) 470 LONG_L $10, VCPU_R10(k1)
475 LONG_L $11, VCPU_R11(k1) 471 LONG_L $11, VCPU_R11(k1)
476 LONG_L $12, VCPU_R12(k1) 472 LONG_L $12, VCPU_R12(k1)
477 LONG_L $13, VCPU_R13(k1) 473 LONG_L $13, VCPU_R13(k1)
478 LONG_L $14, VCPU_R14(k1) 474 LONG_L $14, VCPU_R14(k1)
479 LONG_L $15, VCPU_R15(k1) 475 LONG_L $15, VCPU_R15(k1)
480 LONG_L $16, VCPU_R16(k1) 476 LONG_L $16, VCPU_R16(k1)
481 LONG_L $17, VCPU_R17(k1) 477 LONG_L $17, VCPU_R17(k1)
482 LONG_L $18, VCPU_R18(k1) 478 LONG_L $18, VCPU_R18(k1)
483 LONG_L $19, VCPU_R19(k1) 479 LONG_L $19, VCPU_R19(k1)
484 LONG_L $20, VCPU_R20(k1) 480 LONG_L $20, VCPU_R20(k1)
485 LONG_L $21, VCPU_R21(k1) 481 LONG_L $21, VCPU_R21(k1)
486 LONG_L $22, VCPU_R22(k1) 482 LONG_L $22, VCPU_R22(k1)
487 LONG_L $23, VCPU_R23(k1) 483 LONG_L $23, VCPU_R23(k1)
488 LONG_L $24, VCPU_R24(k1) 484 LONG_L $24, VCPU_R24(k1)
489 LONG_L $25, VCPU_R25(k1) 485 LONG_L $25, VCPU_R25(k1)
490 486
491 /* $/k1 loaded later */ 487 /* $/k1 loaded later */
492 LONG_L $28, VCPU_R28(k1) 488 LONG_L $28, VCPU_R28(k1)
493 LONG_L $29, VCPU_R29(k1) 489 LONG_L $29, VCPU_R29(k1)
494 LONG_L $30, VCPU_R30(k1) 490 LONG_L $30, VCPU_R30(k1)
495 LONG_L $31, VCPU_R31(k1) 491 LONG_L $31, VCPU_R31(k1)
496 492
497FEXPORT(__kvm_mips_skip_guest_restore) 493FEXPORT(__kvm_mips_skip_guest_restore)
498 LONG_L k0, VCPU_HI(k1) 494 LONG_L k0, VCPU_HI(k1)
499 mthi k0 495 mthi k0
500 496
501 LONG_L k0, VCPU_LO(k1) 497 LONG_L k0, VCPU_LO(k1)
502 mtlo k0 498 mtlo k0
503 499
504 LONG_L k0, VCPU_R26(k1) 500 LONG_L k0, VCPU_R26(k1)
505 LONG_L k1, VCPU_R27(k1) 501 LONG_L k1, VCPU_R27(k1)
506 502
507 eret 503 eret
508 504
509__kvm_mips_return_to_host: 505__kvm_mips_return_to_host:
510 /* EBASE is already pointing to Linux */ 506 /* EBASE is already pointing to Linux */
511 LONG_L k1, VCPU_HOST_STACK(k1) 507 LONG_L k1, VCPU_HOST_STACK(k1)
512 addiu k1,k1, -PT_SIZE 508 INT_ADDIU k1,k1, -PT_SIZE
513 509
514 /* Restore host DDATA_LO */ 510 /* Restore host DDATA_LO */
515 LONG_L k0, PT_HOST_USERLOCAL(k1) 511 LONG_L k0, PT_HOST_USERLOCAL(k1)
516 mtc0 k0, CP0_DDATA_LO 512 mtc0 k0, CP0_DDATA_LO
517 513
518 /* Restore host ASID */ 514 /* Restore host ASID */
519 LONG_L k0, PT_HOST_ASID(sp) 515 LONG_L k0, PT_HOST_ASID(sp)
520 andi k0, 0xff 516 andi k0, 0xff
521 mtc0 k0,CP0_ENTRYHI 517 mtc0 k0,CP0_ENTRYHI
522 ehb 518 ehb
523 519
524 /* Load context saved on the host stack */ 520 /* Load context saved on the host stack */
525 LONG_L $0, PT_R0(k1) 521 LONG_L $0, PT_R0(k1)
526 LONG_L $1, PT_R1(k1) 522 LONG_L $1, PT_R1(k1)
527 523
528 /* r2/v0 is the return code, shift it down by 2 (arithmetic) to recover the err code */ 524 /* r2/v0 is the return code, shift it down by 2 (arithmetic)
529 sra k0, v0, 2 525 * to recover the err code */
530 move $2, k0 526 INT_SRA k0, v0, 2
531 527 move $2, k0
532 LONG_L $3, PT_R3(k1) 528
533 LONG_L $4, PT_R4(k1) 529 LONG_L $3, PT_R3(k1)
534 LONG_L $5, PT_R5(k1) 530 LONG_L $4, PT_R4(k1)
535 LONG_L $6, PT_R6(k1) 531 LONG_L $5, PT_R5(k1)
536 LONG_L $7, PT_R7(k1) 532 LONG_L $6, PT_R6(k1)
537 LONG_L $8, PT_R8(k1) 533 LONG_L $7, PT_R7(k1)
538 LONG_L $9, PT_R9(k1) 534 LONG_L $8, PT_R8(k1)
539 LONG_L $10, PT_R10(k1) 535 LONG_L $9, PT_R9(k1)
540 LONG_L $11, PT_R11(k1) 536 LONG_L $10, PT_R10(k1)
541 LONG_L $12, PT_R12(k1) 537 LONG_L $11, PT_R11(k1)
542 LONG_L $13, PT_R13(k1) 538 LONG_L $12, PT_R12(k1)
543 LONG_L $14, PT_R14(k1) 539 LONG_L $13, PT_R13(k1)
544 LONG_L $15, PT_R15(k1) 540 LONG_L $14, PT_R14(k1)
545 LONG_L $16, PT_R16(k1) 541 LONG_L $15, PT_R15(k1)
546 LONG_L $17, PT_R17(k1) 542 LONG_L $16, PT_R16(k1)
547 LONG_L $18, PT_R18(k1) 543 LONG_L $17, PT_R17(k1)
548 LONG_L $19, PT_R19(k1) 544 LONG_L $18, PT_R18(k1)
549 LONG_L $20, PT_R20(k1) 545 LONG_L $19, PT_R19(k1)
550 LONG_L $21, PT_R21(k1) 546 LONG_L $20, PT_R20(k1)
551 LONG_L $22, PT_R22(k1) 547 LONG_L $21, PT_R21(k1)
552 LONG_L $23, PT_R23(k1) 548 LONG_L $22, PT_R22(k1)
553 LONG_L $24, PT_R24(k1) 549 LONG_L $23, PT_R23(k1)
554 LONG_L $25, PT_R25(k1) 550 LONG_L $24, PT_R24(k1)
555 551 LONG_L $25, PT_R25(k1)
556 /* Host k0/k1 were not saved */ 552
557 553 /* Host k0/k1 were not saved */
558 LONG_L $28, PT_R28(k1) 554
559 LONG_L $29, PT_R29(k1) 555 LONG_L $28, PT_R28(k1)
560 LONG_L $30, PT_R30(k1) 556 LONG_L $29, PT_R29(k1)
561 557 LONG_L $30, PT_R30(k1)
562 LONG_L k0, PT_HI(k1) 558
563 mthi k0 559 LONG_L k0, PT_HI(k1)
564 560 mthi k0
565 LONG_L k0, PT_LO(k1) 561
566 mtlo k0 562 LONG_L k0, PT_LO(k1)
567 563 mtlo k0
568 /* Restore RDHWR access */ 564
569 la k0, 0x2000000F 565 /* Restore RDHWR access */
570 mtc0 k0, CP0_HWRENA 566 PTR_LI k0, 0x2000000F
571 567 mtc0 k0, CP0_HWRENA
572 568
573 /* Restore RA, which is the address we will return to */ 569
574 LONG_L ra, PT_R31(k1) 570 /* Restore RA, which is the address we will return to */
575 j ra 571 LONG_L ra, PT_R31(k1)
576 nop 572 j ra
577 573 nop
578 .set pop 574
579VECTOR_END(MIPSX(GuestExceptionEnd)) 575VECTOR_END(MIPSX(GuestExceptionEnd))
580.end MIPSX(GuestException) 576.end MIPSX(GuestException)
581 577
@@ -627,24 +623,23 @@ MIPSX(exceptions):
627 623
628#define HW_SYNCI_Step $1 624#define HW_SYNCI_Step $1
629LEAF(MIPSX(SyncICache)) 625LEAF(MIPSX(SyncICache))
630 .set push 626 .set push
631 .set mips32r2 627 .set mips32r2
632 beq a1, zero, 20f 628 beq a1, zero, 20f
633 nop 629 nop
634 addu a1, a0, a1 630 REG_ADDU a1, a0, a1
635 rdhwr v0, HW_SYNCI_Step 631 rdhwr v0, HW_SYNCI_Step
636 beq v0, zero, 20f 632 beq v0, zero, 20f
637 nop 633 nop
638
63910: 63410:
640 synci 0(a0) 635 synci 0(a0)
641 addu a0, a0, v0 636 REG_ADDU a0, a0, v0
642 sltu v1, a0, a1 637 sltu v1, a0, a1
643 bne v1, zero, 10b 638 bne v1, zero, 10b
644 nop 639 nop
645 sync 640 sync
64620: 64120:
647 jr.hb ra 642 jr.hb ra
648 nop 643 nop
649 .set pop 644 .set pop
650END(MIPSX(SyncICache)) 645END(MIPSX(SyncICache))
diff --git a/arch/mips/kvm/kvm_mips.c b/arch/mips/kvm/kvm_mips.c
index dd203e59e6fd..a7b044536de4 100644
--- a/arch/mips/kvm/kvm_mips.c
+++ b/arch/mips/kvm/kvm_mips.c
@@ -208,6 +208,10 @@ int kvm_arch_create_memslot(struct kvm_memory_slot *slot, unsigned long npages)
208 return 0; 208 return 0;
209} 209}
210 210
211void kvm_arch_memslots_updated(struct kvm *kvm)
212{
213}
214
211int kvm_arch_prepare_memory_region(struct kvm *kvm, 215int kvm_arch_prepare_memory_region(struct kvm *kvm,
212 struct kvm_memory_slot *memslot, 216 struct kvm_memory_slot *memslot,
213 struct kvm_userspace_memory_region *mem, 217 struct kvm_userspace_memory_region *mem,
diff --git a/arch/mips/lantiq/falcon/sysctrl.c b/arch/mips/lantiq/falcon/sysctrl.c
index ff4894a833ee..8f1866d8124d 100644
--- a/arch/mips/lantiq/falcon/sysctrl.c
+++ b/arch/mips/lantiq/falcon/sysctrl.c
@@ -48,6 +48,7 @@
48#define CPU0CC_CPUDIV 0x0001 48#define CPU0CC_CPUDIV 0x0001
49 49
50/* Activation Status Register */ 50/* Activation Status Register */
51#define ACTS_ASC0_ACT 0x00001000
51#define ACTS_ASC1_ACT 0x00000800 52#define ACTS_ASC1_ACT 0x00000800
52#define ACTS_I2C_ACT 0x00004000 53#define ACTS_I2C_ACT 0x00004000
53#define ACTS_P0 0x00010000 54#define ACTS_P0 0x00010000
@@ -108,6 +109,7 @@ static void sysctl_deactivate(struct clk *clk)
108static int sysctl_clken(struct clk *clk) 109static int sysctl_clken(struct clk *clk)
109{ 110{
110 sysctl_w32(clk->module, clk->bits, SYSCTL_CLKEN); 111 sysctl_w32(clk->module, clk->bits, SYSCTL_CLKEN);
112 sysctl_w32(clk->module, clk->bits, SYSCTL_ACT);
111 sysctl_wait(clk, clk->bits, SYSCTL_CLKS); 113 sysctl_wait(clk, clk->bits, SYSCTL_CLKS);
112 return 0; 114 return 0;
113} 115}
@@ -256,6 +258,7 @@ void __init ltq_soc_init(void)
256 clkdev_add_sys("1e800400.pad", SYSCTL_SYS1, ACTS_PADCTRL1); 258 clkdev_add_sys("1e800400.pad", SYSCTL_SYS1, ACTS_PADCTRL1);
257 clkdev_add_sys("1e800500.pad", SYSCTL_SYS1, ACTS_PADCTRL3); 259 clkdev_add_sys("1e800500.pad", SYSCTL_SYS1, ACTS_PADCTRL3);
258 clkdev_add_sys("1e800600.pad", SYSCTL_SYS1, ACTS_PADCTRL4); 260 clkdev_add_sys("1e800600.pad", SYSCTL_SYS1, ACTS_PADCTRL4);
259 clkdev_add_sys("1e100C00.serial", SYSCTL_SYS1, ACTS_ASC1_ACT); 261 clkdev_add_sys("1e100b00.serial", SYSCTL_SYS1, ACTS_ASC1_ACT);
262 clkdev_add_sys("1e100c00.serial", SYSCTL_SYS1, ACTS_ASC0_ACT);
260 clkdev_add_sys("1e200000.i2c", SYSCTL_SYS1, ACTS_I2C_ACT); 263 clkdev_add_sys("1e200000.i2c", SYSCTL_SYS1, ACTS_I2C_ACT);
261} 264}
diff --git a/arch/mips/lantiq/xway/Makefile b/arch/mips/lantiq/xway/Makefile
index 7a13660d630d..087497d97357 100644
--- a/arch/mips/lantiq/xway/Makefile
+++ b/arch/mips/lantiq/xway/Makefile
@@ -1,3 +1,3 @@
1obj-y := prom.o sysctrl.o clk.o reset.o dma.o gptu.o 1obj-y := prom.o sysctrl.o clk.o reset.o dma.o gptu.o dcdc.o
2 2
3obj-$(CONFIG_XRX200_PHY_FW) += xrx200_phy_fw.o 3obj-$(CONFIG_XRX200_PHY_FW) += xrx200_phy_fw.o
diff --git a/arch/mips/lantiq/xway/dcdc.c b/arch/mips/lantiq/xway/dcdc.c
new file mode 100644
index 000000000000..7688ac0f06d0
--- /dev/null
+++ b/arch/mips/lantiq/xway/dcdc.c
@@ -0,0 +1,63 @@
1/*
2 * This program is free software; you can redistribute it and/or modify it
3 * under the terms of the GNU General Public License version 2 as published
4 * by the Free Software Foundation.
5 *
6 * Copyright (C) 2012 John Crispin <blogic@openwrt.org>
7 * Copyright (C) 2010 Sameer Ahmad, Lantiq GmbH
8 */
9
10#include <linux/ioport.h>
11#include <linux/of_platform.h>
12
13#include <lantiq_soc.h>
14
15/* Bias and regulator Setup Register */
16#define DCDC_BIAS_VREG0 0xa
17/* Bias and regulator Setup Register */
18#define DCDC_BIAS_VREG1 0xb
19
20#define dcdc_w8(x, y) ltq_w8((x), dcdc_membase + (y))
21#define dcdc_r8(x) ltq_r8(dcdc_membase + (x))
22
23static void __iomem *dcdc_membase;
24
25static int dcdc_probe(struct platform_device *pdev)
26{
27 struct resource *res;
28
29 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
30 dcdc_membase = devm_ioremap_resource(&pdev->dev, res);
31 if (IS_ERR(dcdc_membase))
32 return PTR_ERR(dcdc_membase);
33
34 dev_info(&pdev->dev, "Core Voltage : %d mV\n",
35 dcdc_r8(DCDC_BIAS_VREG1) * 8);
36
37 return 0;
38}
39
40static const struct of_device_id dcdc_match[] = {
41 { .compatible = "lantiq,dcdc-xrx200" },
42 {},
43};
44
45static struct platform_driver dcdc_driver = {
46 .probe = dcdc_probe,
47 .driver = {
48 .name = "dcdc-xrx200",
49 .owner = THIS_MODULE,
50 .of_match_table = dcdc_match,
51 },
52};
53
54int __init dcdc_init(void)
55{
56 int ret = platform_driver_register(&dcdc_driver);
57
58 if (ret)
59 pr_info("dcdc: Error registering platform driver\n");
60 return ret;
61}
62
63arch_initcall(dcdc_init);
diff --git a/arch/mips/lasat/image/Makefile b/arch/mips/lasat/image/Makefile
index dfb509d21d8e..fd32075679c6 100644
--- a/arch/mips/lasat/image/Makefile
+++ b/arch/mips/lasat/image/Makefile
@@ -13,13 +13,11 @@ endif
13MKLASATIMG = mklasatimg 13MKLASATIMG = mklasatimg
14MKLASATIMG_ARCH = mq2,mqpro,sp100,sp200 14MKLASATIMG_ARCH = mq2,mqpro,sp100,sp200
15KERNEL_IMAGE = vmlinux 15KERNEL_IMAGE = vmlinux
16KERNEL_START = $(shell $(NM) $(KERNEL_IMAGE) | grep " _text" | cut -f1 -d\ )
17KERNEL_ENTRY = $(shell $(NM) $(KERNEL_IMAGE) | grep kernel_entry | cut -f1 -d\ )
18 16
19LDSCRIPT= -L$(srctree)/$(src) -Tromscript.normal 17LDSCRIPT= -L$(srctree)/$(src) -Tromscript.normal
20 18
21HEAD_DEFINES := -D_kernel_start=0x$(KERNEL_START) \ 19HEAD_DEFINES := -D_kernel_start=$(VMLINUX_LOAD_ADDRESS) \
22 -D_kernel_entry=0x$(KERNEL_ENTRY) \ 20 -D_kernel_entry=$(VMLINUX_ENTRY_ADDRESS) \
23 -D VERSION="\"$(Version)\"" \ 21 -D VERSION="\"$(Version)\"" \
24 -D TIMESTAMP=$(shell date +%s) 22 -D TIMESTAMP=$(shell date +%s)
25 23
diff --git a/arch/mips/loongson/common/Makefile b/arch/mips/loongson/common/Makefile
index 4c57b3e5743f..9e4484ccbb03 100644
--- a/arch/mips/loongson/common/Makefile
+++ b/arch/mips/loongson/common/Makefile
@@ -3,8 +3,9 @@
3# 3#
4 4
5obj-y += setup.o init.o cmdline.o env.o time.o reset.o irq.o \ 5obj-y += setup.o init.o cmdline.o env.o time.o reset.o irq.o \
6 pci.o bonito-irq.o mem.o machtype.o platform.o 6 bonito-irq.o mem.o machtype.o platform.o
7obj-$(CONFIG_GPIOLIB) += gpio.o 7obj-$(CONFIG_GPIOLIB) += gpio.o
8obj-$(CONFIG_PCI) += pci.o
8 9
9# 10#
10# Serial port support 11# Serial port support
diff --git a/arch/mips/math-emu/cp1emu.c b/arch/mips/math-emu/cp1emu.c
index 46048d24328c..efe008846ed0 100644
--- a/arch/mips/math-emu/cp1emu.c
+++ b/arch/mips/math-emu/cp1emu.c
@@ -436,7 +436,6 @@ static int microMIPS32_to_MIPS32(union mips_instruction *insn_ptr)
436 break; 436 break;
437 default: 437 default:
438 return SIGILL; 438 return SIGILL;
439 break;
440 } 439 }
441 break; 440 break;
442 case mm_32f_74_op: /* c.cond.fmt */ 441 case mm_32f_74_op: /* c.cond.fmt */
@@ -451,12 +450,10 @@ static int microMIPS32_to_MIPS32(union mips_instruction *insn_ptr)
451 break; 450 break;
452 default: 451 default:
453 return SIGILL; 452 return SIGILL;
454 break;
455 } 453 }
456 break; 454 break;
457 default: 455 default:
458 return SIGILL; 456 return SIGILL;
459 break;
460 } 457 }
461 458
462 *insn_ptr = mips32_insn; 459 *insn_ptr = mips32_insn;
@@ -491,7 +488,6 @@ int mm_isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
491 dec_insn.next_pc_inc; 488 dec_insn.next_pc_inc;
492 *contpc = regs->regs[insn.mm_i_format.rs]; 489 *contpc = regs->regs[insn.mm_i_format.rs];
493 return 1; 490 return 1;
494 break;
495 } 491 }
496 } 492 }
497 break; 493 break;
@@ -513,7 +509,6 @@ int mm_isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
513 dec_insn.pc_inc + 509 dec_insn.pc_inc +
514 dec_insn.next_pc_inc; 510 dec_insn.next_pc_inc;
515 return 1; 511 return 1;
516 break;
517 case mm_bgezals_op: 512 case mm_bgezals_op:
518 case mm_bgezal_op: 513 case mm_bgezal_op:
519 regs->regs[31] = regs->cp0_epc + 514 regs->regs[31] = regs->cp0_epc +
@@ -530,7 +525,6 @@ int mm_isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
530 dec_insn.pc_inc + 525 dec_insn.pc_inc +
531 dec_insn.next_pc_inc; 526 dec_insn.next_pc_inc;
532 return 1; 527 return 1;
533 break;
534 case mm_blez_op: 528 case mm_blez_op:
535 if ((long)regs->regs[insn.mm_i_format.rs] <= 0) 529 if ((long)regs->regs[insn.mm_i_format.rs] <= 0)
536 *contpc = regs->cp0_epc + 530 *contpc = regs->cp0_epc +
@@ -541,7 +535,6 @@ int mm_isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
541 dec_insn.pc_inc + 535 dec_insn.pc_inc +
542 dec_insn.next_pc_inc; 536 dec_insn.next_pc_inc;
543 return 1; 537 return 1;
544 break;
545 case mm_bgtz_op: 538 case mm_bgtz_op:
546 if ((long)regs->regs[insn.mm_i_format.rs] <= 0) 539 if ((long)regs->regs[insn.mm_i_format.rs] <= 0)
547 *contpc = regs->cp0_epc + 540 *contpc = regs->cp0_epc +
@@ -552,7 +545,6 @@ int mm_isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
552 dec_insn.pc_inc + 545 dec_insn.pc_inc +
553 dec_insn.next_pc_inc; 546 dec_insn.next_pc_inc;
554 return 1; 547 return 1;
555 break;
556 case mm_bc2f_op: 548 case mm_bc2f_op:
557 case mm_bc1f_op: 549 case mm_bc1f_op:
558 bc_false = 1; 550 bc_false = 1;
@@ -580,7 +572,6 @@ int mm_isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
580 *contpc = regs->cp0_epc + 572 *contpc = regs->cp0_epc +
581 dec_insn.pc_inc + dec_insn.next_pc_inc; 573 dec_insn.pc_inc + dec_insn.next_pc_inc;
582 return 1; 574 return 1;
583 break;
584 } 575 }
585 break; 576 break;
586 case mm_pool16c_op: 577 case mm_pool16c_op:
@@ -593,7 +584,6 @@ int mm_isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
593 case mm_jr16_op: 584 case mm_jr16_op:
594 *contpc = regs->regs[insn.mm_i_format.rs]; 585 *contpc = regs->regs[insn.mm_i_format.rs];
595 return 1; 586 return 1;
596 break;
597 } 587 }
598 break; 588 break;
599 case mm_beqz16_op: 589 case mm_beqz16_op:
@@ -605,7 +595,6 @@ int mm_isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
605 *contpc = regs->cp0_epc + 595 *contpc = regs->cp0_epc +
606 dec_insn.pc_inc + dec_insn.next_pc_inc; 596 dec_insn.pc_inc + dec_insn.next_pc_inc;
607 return 1; 597 return 1;
608 break;
609 case mm_bnez16_op: 598 case mm_bnez16_op:
610 if ((long)regs->regs[reg16to32map[insn.mm_b1_format.rs]] != 0) 599 if ((long)regs->regs[reg16to32map[insn.mm_b1_format.rs]] != 0)
611 *contpc = regs->cp0_epc + 600 *contpc = regs->cp0_epc +
@@ -615,12 +604,10 @@ int mm_isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
615 *contpc = regs->cp0_epc + 604 *contpc = regs->cp0_epc +
616 dec_insn.pc_inc + dec_insn.next_pc_inc; 605 dec_insn.pc_inc + dec_insn.next_pc_inc;
617 return 1; 606 return 1;
618 break;
619 case mm_b16_op: 607 case mm_b16_op:
620 *contpc = regs->cp0_epc + dec_insn.pc_inc + 608 *contpc = regs->cp0_epc + dec_insn.pc_inc +
621 (insn.mm_b0_format.simmediate << 1); 609 (insn.mm_b0_format.simmediate << 1);
622 return 1; 610 return 1;
623 break;
624 case mm_beq32_op: 611 case mm_beq32_op:
625 if (regs->regs[insn.mm_i_format.rs] == 612 if (regs->regs[insn.mm_i_format.rs] ==
626 regs->regs[insn.mm_i_format.rt]) 613 regs->regs[insn.mm_i_format.rt])
@@ -632,7 +619,6 @@ int mm_isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
632 dec_insn.pc_inc + 619 dec_insn.pc_inc +
633 dec_insn.next_pc_inc; 620 dec_insn.next_pc_inc;
634 return 1; 621 return 1;
635 break;
636 case mm_bne32_op: 622 case mm_bne32_op:
637 if (regs->regs[insn.mm_i_format.rs] != 623 if (regs->regs[insn.mm_i_format.rs] !=
638 regs->regs[insn.mm_i_format.rt]) 624 regs->regs[insn.mm_i_format.rt])
@@ -643,7 +629,6 @@ int mm_isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
643 *contpc = regs->cp0_epc + 629 *contpc = regs->cp0_epc +
644 dec_insn.pc_inc + dec_insn.next_pc_inc; 630 dec_insn.pc_inc + dec_insn.next_pc_inc;
645 return 1; 631 return 1;
646 break;
647 case mm_jalx32_op: 632 case mm_jalx32_op:
648 regs->regs[31] = regs->cp0_epc + 633 regs->regs[31] = regs->cp0_epc +
649 dec_insn.pc_inc + dec_insn.next_pc_inc; 634 dec_insn.pc_inc + dec_insn.next_pc_inc;
@@ -652,7 +637,6 @@ int mm_isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
652 *contpc <<= 28; 637 *contpc <<= 28;
653 *contpc |= (insn.j_format.target << 2); 638 *contpc |= (insn.j_format.target << 2);
654 return 1; 639 return 1;
655 break;
656 case mm_jals32_op: 640 case mm_jals32_op:
657 case mm_jal32_op: 641 case mm_jal32_op:
658 regs->regs[31] = regs->cp0_epc + 642 regs->regs[31] = regs->cp0_epc +
@@ -665,7 +649,6 @@ int mm_isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
665 *contpc |= (insn.j_format.target << 1); 649 *contpc |= (insn.j_format.target << 1);
666 set_isa16_mode(*contpc); 650 set_isa16_mode(*contpc);
667 return 1; 651 return 1;
668 break;
669 } 652 }
670 return 0; 653 return 0;
671} 654}
@@ -694,7 +677,6 @@ static int isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
694 case jr_op: 677 case jr_op:
695 *contpc = regs->regs[insn.r_format.rs]; 678 *contpc = regs->regs[insn.r_format.rs];
696 return 1; 679 return 1;
697 break;
698 } 680 }
699 break; 681 break;
700 case bcond_op: 682 case bcond_op:
@@ -716,7 +698,6 @@ static int isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
716 dec_insn.pc_inc + 698 dec_insn.pc_inc +
717 dec_insn.next_pc_inc; 699 dec_insn.next_pc_inc;
718 return 1; 700 return 1;
719 break;
720 case bgezal_op: 701 case bgezal_op:
721 case bgezall_op: 702 case bgezall_op:
722 regs->regs[31] = regs->cp0_epc + 703 regs->regs[31] = regs->cp0_epc +
@@ -734,7 +715,6 @@ static int isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
734 dec_insn.pc_inc + 715 dec_insn.pc_inc +
735 dec_insn.next_pc_inc; 716 dec_insn.next_pc_inc;
736 return 1; 717 return 1;
737 break;
738 } 718 }
739 break; 719 break;
740 case jalx_op: 720 case jalx_op:
@@ -752,7 +732,6 @@ static int isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
752 /* Set microMIPS mode bit: XOR for jalx. */ 732 /* Set microMIPS mode bit: XOR for jalx. */
753 *contpc ^= bit; 733 *contpc ^= bit;
754 return 1; 734 return 1;
755 break;
756 case beq_op: 735 case beq_op:
757 case beql_op: 736 case beql_op:
758 if (regs->regs[insn.i_format.rs] == 737 if (regs->regs[insn.i_format.rs] ==
@@ -765,7 +744,6 @@ static int isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
765 dec_insn.pc_inc + 744 dec_insn.pc_inc +
766 dec_insn.next_pc_inc; 745 dec_insn.next_pc_inc;
767 return 1; 746 return 1;
768 break;
769 case bne_op: 747 case bne_op:
770 case bnel_op: 748 case bnel_op:
771 if (regs->regs[insn.i_format.rs] != 749 if (regs->regs[insn.i_format.rs] !=
@@ -778,7 +756,6 @@ static int isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
778 dec_insn.pc_inc + 756 dec_insn.pc_inc +
779 dec_insn.next_pc_inc; 757 dec_insn.next_pc_inc;
780 return 1; 758 return 1;
781 break;
782 case blez_op: 759 case blez_op:
783 case blezl_op: 760 case blezl_op:
784 if ((long)regs->regs[insn.i_format.rs] <= 0) 761 if ((long)regs->regs[insn.i_format.rs] <= 0)
@@ -790,7 +767,6 @@ static int isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
790 dec_insn.pc_inc + 767 dec_insn.pc_inc +
791 dec_insn.next_pc_inc; 768 dec_insn.next_pc_inc;
792 return 1; 769 return 1;
793 break;
794 case bgtz_op: 770 case bgtz_op:
795 case bgtzl_op: 771 case bgtzl_op:
796 if ((long)regs->regs[insn.i_format.rs] > 0) 772 if ((long)regs->regs[insn.i_format.rs] > 0)
@@ -802,7 +778,6 @@ static int isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
802 dec_insn.pc_inc + 778 dec_insn.pc_inc +
803 dec_insn.next_pc_inc; 779 dec_insn.next_pc_inc;
804 return 1; 780 return 1;
805 break;
806#ifdef CONFIG_CPU_CAVIUM_OCTEON 781#ifdef CONFIG_CPU_CAVIUM_OCTEON
807 case lwc2_op: /* This is bbit0 on Octeon */ 782 case lwc2_op: /* This is bbit0 on Octeon */
808 if ((regs->regs[insn.i_format.rs] & (1ull<<insn.i_format.rt)) == 0) 783 if ((regs->regs[insn.i_format.rs] & (1ull<<insn.i_format.rt)) == 0)
@@ -856,7 +831,6 @@ static int isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
856 dec_insn.pc_inc + 831 dec_insn.pc_inc +
857 dec_insn.next_pc_inc; 832 dec_insn.next_pc_inc;
858 return 1; 833 return 1;
859 break;
860 case 1: /* bc1t */ 834 case 1: /* bc1t */
861 case 3: /* bc1tl */ 835 case 3: /* bc1tl */
862 if (fcr31 & (1 << bit)) 836 if (fcr31 & (1 << bit))
@@ -868,7 +842,6 @@ static int isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
868 dec_insn.pc_inc + 842 dec_insn.pc_inc +
869 dec_insn.next_pc_inc; 843 dec_insn.next_pc_inc;
870 return 1; 844 return 1;
871 break;
872 } 845 }
873 } 846 }
874 break; 847 break;
diff --git a/arch/mips/mm/c-octeon.c b/arch/mips/mm/c-octeon.c
index a0bcdbb81d41..c8efdb5b6ee0 100644
--- a/arch/mips/mm/c-octeon.c
+++ b/arch/mips/mm/c-octeon.c
@@ -19,6 +19,7 @@
19#include <asm/bootinfo.h> 19#include <asm/bootinfo.h>
20#include <asm/cacheops.h> 20#include <asm/cacheops.h>
21#include <asm/cpu-features.h> 21#include <asm/cpu-features.h>
22#include <asm/cpu-type.h>
22#include <asm/page.h> 23#include <asm/page.h>
23#include <asm/pgtable.h> 24#include <asm/pgtable.h>
24#include <asm/r4kcache.h> 25#include <asm/r4kcache.h>
@@ -186,9 +187,10 @@ static void probe_octeon(void)
186 unsigned long dcache_size; 187 unsigned long dcache_size;
187 unsigned int config1; 188 unsigned int config1;
188 struct cpuinfo_mips *c = &current_cpu_data; 189 struct cpuinfo_mips *c = &current_cpu_data;
190 int cputype = current_cpu_type();
189 191
190 config1 = read_c0_config1(); 192 config1 = read_c0_config1();
191 switch (c->cputype) { 193 switch (cputype) {
192 case CPU_CAVIUM_OCTEON: 194 case CPU_CAVIUM_OCTEON:
193 case CPU_CAVIUM_OCTEON_PLUS: 195 case CPU_CAVIUM_OCTEON_PLUS:
194 c->icache.linesz = 2 << ((config1 >> 19) & 7); 196 c->icache.linesz = 2 << ((config1 >> 19) & 7);
@@ -199,7 +201,7 @@ static void probe_octeon(void)
199 c->icache.sets * c->icache.ways * c->icache.linesz; 201 c->icache.sets * c->icache.ways * c->icache.linesz;
200 c->icache.waybit = ffs(icache_size / c->icache.ways) - 1; 202 c->icache.waybit = ffs(icache_size / c->icache.ways) - 1;
201 c->dcache.linesz = 128; 203 c->dcache.linesz = 128;
202 if (c->cputype == CPU_CAVIUM_OCTEON_PLUS) 204 if (cputype == CPU_CAVIUM_OCTEON_PLUS)
203 c->dcache.sets = 2; /* CN5XXX has two Dcache sets */ 205 c->dcache.sets = 2; /* CN5XXX has two Dcache sets */
204 else 206 else
205 c->dcache.sets = 1; /* CN3XXX has one Dcache set */ 207 c->dcache.sets = 1; /* CN3XXX has one Dcache set */
@@ -224,6 +226,20 @@ static void probe_octeon(void)
224 c->options |= MIPS_CPU_PREFETCH; 226 c->options |= MIPS_CPU_PREFETCH;
225 break; 227 break;
226 228
229 case CPU_CAVIUM_OCTEON3:
230 c->icache.linesz = 128;
231 c->icache.sets = 16;
232 c->icache.ways = 39;
233 c->icache.flags |= MIPS_CACHE_VTAG;
234 icache_size = c->icache.sets * c->icache.ways * c->icache.linesz;
235
236 c->dcache.linesz = 128;
237 c->dcache.ways = 32;
238 c->dcache.sets = 8;
239 dcache_size = c->dcache.sets * c->dcache.ways * c->dcache.linesz;
240 c->options |= MIPS_CPU_PREFETCH;
241 break;
242
227 default: 243 default:
228 panic("Unsupported Cavium Networks CPU type"); 244 panic("Unsupported Cavium Networks CPU type");
229 break; 245 break;
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c
index f749f687ee87..627883bc6d5f 100644
--- a/arch/mips/mm/c-r4k.c
+++ b/arch/mips/mm/c-r4k.c
@@ -12,6 +12,7 @@
12#include <linux/highmem.h> 12#include <linux/highmem.h>
13#include <linux/kernel.h> 13#include <linux/kernel.h>
14#include <linux/linkage.h> 14#include <linux/linkage.h>
15#include <linux/preempt.h>
15#include <linux/sched.h> 16#include <linux/sched.h>
16#include <linux/smp.h> 17#include <linux/smp.h>
17#include <linux/mm.h> 18#include <linux/mm.h>
@@ -24,6 +25,7 @@
24#include <asm/cacheops.h> 25#include <asm/cacheops.h>
25#include <asm/cpu.h> 26#include <asm/cpu.h>
26#include <asm/cpu-features.h> 27#include <asm/cpu-features.h>
28#include <asm/cpu-type.h>
27#include <asm/io.h> 29#include <asm/io.h>
28#include <asm/page.h> 30#include <asm/page.h>
29#include <asm/pgtable.h> 31#include <asm/pgtable.h>
@@ -601,6 +603,7 @@ static void r4k_dma_cache_wback_inv(unsigned long addr, unsigned long size)
601 /* Catch bad driver code */ 603 /* Catch bad driver code */
602 BUG_ON(size == 0); 604 BUG_ON(size == 0);
603 605
606 preempt_disable();
604 if (cpu_has_inclusive_pcaches) { 607 if (cpu_has_inclusive_pcaches) {
605 if (size >= scache_size) 608 if (size >= scache_size)
606 r4k_blast_scache(); 609 r4k_blast_scache();
@@ -621,6 +624,7 @@ static void r4k_dma_cache_wback_inv(unsigned long addr, unsigned long size)
621 R4600_HIT_CACHEOP_WAR_IMPL; 624 R4600_HIT_CACHEOP_WAR_IMPL;
622 blast_dcache_range(addr, addr + size); 625 blast_dcache_range(addr, addr + size);
623 } 626 }
627 preempt_enable();
624 628
625 bc_wback_inv(addr, size); 629 bc_wback_inv(addr, size);
626 __sync(); 630 __sync();
@@ -631,6 +635,7 @@ static void r4k_dma_cache_inv(unsigned long addr, unsigned long size)
631 /* Catch bad driver code */ 635 /* Catch bad driver code */
632 BUG_ON(size == 0); 636 BUG_ON(size == 0);
633 637
638 preempt_disable();
634 if (cpu_has_inclusive_pcaches) { 639 if (cpu_has_inclusive_pcaches) {
635 if (size >= scache_size) 640 if (size >= scache_size)
636 r4k_blast_scache(); 641 r4k_blast_scache();
@@ -655,6 +660,7 @@ static void r4k_dma_cache_inv(unsigned long addr, unsigned long size)
655 R4600_HIT_CACHEOP_WAR_IMPL; 660 R4600_HIT_CACHEOP_WAR_IMPL;
656 blast_inv_dcache_range(addr, addr + size); 661 blast_inv_dcache_range(addr, addr + size);
657 } 662 }
663 preempt_enable();
658 664
659 bc_inv(addr, size); 665 bc_inv(addr, size);
660 __sync(); 666 __sync();
@@ -780,20 +786,30 @@ static inline void rm7k_erratum31(void)
780 786
781static inline void alias_74k_erratum(struct cpuinfo_mips *c) 787static inline void alias_74k_erratum(struct cpuinfo_mips *c)
782{ 788{
789 unsigned int imp = c->processor_id & PRID_IMP_MASK;
790 unsigned int rev = c->processor_id & PRID_REV_MASK;
791
783 /* 792 /*
784 * Early versions of the 74K do not update the cache tags on a 793 * Early versions of the 74K do not update the cache tags on a
785 * vtag miss/ptag hit which can occur in the case of KSEG0/KUSEG 794 * vtag miss/ptag hit which can occur in the case of KSEG0/KUSEG
786 * aliases. In this case it is better to treat the cache as always 795 * aliases. In this case it is better to treat the cache as always
787 * having aliases. 796 * having aliases.
788 */ 797 */
789 if ((c->processor_id & 0xff) <= PRID_REV_ENCODE_332(2, 4, 0)) 798 switch (imp) {
790 c->dcache.flags |= MIPS_CACHE_VTAG; 799 case PRID_IMP_74K:
791 if ((c->processor_id & 0xff) == PRID_REV_ENCODE_332(2, 4, 0)) 800 if (rev <= PRID_REV_ENCODE_332(2, 4, 0))
792 write_c0_config6(read_c0_config6() | MIPS_CONF6_SYND); 801 c->dcache.flags |= MIPS_CACHE_VTAG;
793 if (((c->processor_id & 0xff00) == PRID_IMP_1074K) && 802 if (rev == PRID_REV_ENCODE_332(2, 4, 0))
794 ((c->processor_id & 0xff) <= PRID_REV_ENCODE_332(1, 1, 0))) { 803 write_c0_config6(read_c0_config6() | MIPS_CONF6_SYND);
795 c->dcache.flags |= MIPS_CACHE_VTAG; 804 break;
796 write_c0_config6(read_c0_config6() | MIPS_CONF6_SYND); 805 case PRID_IMP_1074K:
806 if (rev <= PRID_REV_ENCODE_332(1, 1, 0)) {
807 c->dcache.flags |= MIPS_CACHE_VTAG;
808 write_c0_config6(read_c0_config6() | MIPS_CONF6_SYND);
809 }
810 break;
811 default:
812 BUG();
797 } 813 }
798} 814}
799 815
@@ -809,7 +825,7 @@ static void probe_pcache(void)
809 unsigned long config1; 825 unsigned long config1;
810 unsigned int lsize; 826 unsigned int lsize;
811 827
812 switch (c->cputype) { 828 switch (current_cpu_type()) {
813 case CPU_R4600: /* QED style two way caches? */ 829 case CPU_R4600: /* QED style two way caches? */
814 case CPU_R4700: 830 case CPU_R4700:
815 case CPU_R5000: 831 case CPU_R5000:
@@ -1025,7 +1041,8 @@ static void probe_pcache(void)
1025 * presumably no vendor is shipping his hardware in the "bad" 1041 * presumably no vendor is shipping his hardware in the "bad"
1026 * configuration. 1042 * configuration.
1027 */ 1043 */
1028 if ((prid & 0xff00) == PRID_IMP_R4000 && (prid & 0xff) < 0x40 && 1044 if ((prid & PRID_IMP_MASK) == PRID_IMP_R4000 &&
1045 (prid & PRID_REV_MASK) < PRID_REV_R4400 &&
1029 !(config & CONF_SC) && c->icache.linesz != 16 && 1046 !(config & CONF_SC) && c->icache.linesz != 16 &&
1030 PAGE_SIZE <= 0x8000) 1047 PAGE_SIZE <= 0x8000)
1031 panic("Improper R4000SC processor configuration detected"); 1048 panic("Improper R4000SC processor configuration detected");
@@ -1045,7 +1062,7 @@ static void probe_pcache(void)
1045 * normally they'd suffer from aliases but magic in the hardware deals 1062 * normally they'd suffer from aliases but magic in the hardware deals
1046 * with that for us so we don't need to take care ourselves. 1063 * with that for us so we don't need to take care ourselves.
1047 */ 1064 */
1048 switch (c->cputype) { 1065 switch (current_cpu_type()) {
1049 case CPU_20KC: 1066 case CPU_20KC:
1050 case CPU_25KF: 1067 case CPU_25KF:
1051 case CPU_SB1: 1068 case CPU_SB1:
@@ -1065,7 +1082,7 @@ static void probe_pcache(void)
1065 case CPU_34K: 1082 case CPU_34K:
1066 case CPU_74K: 1083 case CPU_74K:
1067 case CPU_1004K: 1084 case CPU_1004K:
1068 if (c->cputype == CPU_74K) 1085 if (current_cpu_type() == CPU_74K)
1069 alias_74k_erratum(c); 1086 alias_74k_erratum(c);
1070 if ((read_c0_config7() & (1 << 16))) { 1087 if ((read_c0_config7() & (1 << 16))) {
1071 /* effectively physically indexed dcache, 1088 /* effectively physically indexed dcache,
@@ -1078,7 +1095,7 @@ static void probe_pcache(void)
1078 c->dcache.flags |= MIPS_CACHE_ALIASES; 1095 c->dcache.flags |= MIPS_CACHE_ALIASES;
1079 } 1096 }
1080 1097
1081 switch (c->cputype) { 1098 switch (current_cpu_type()) {
1082 case CPU_20KC: 1099 case CPU_20KC:
1083 /* 1100 /*
1084 * Some older 20Kc chips doesn't have the 'VI' bit in 1101 * Some older 20Kc chips doesn't have the 'VI' bit in
@@ -1207,7 +1224,7 @@ static void setup_scache(void)
1207 * processors don't have a S-cache that would be relevant to the 1224 * processors don't have a S-cache that would be relevant to the
1208 * Linux memory management. 1225 * Linux memory management.
1209 */ 1226 */
1210 switch (c->cputype) { 1227 switch (current_cpu_type()) {
1211 case CPU_R4000SC: 1228 case CPU_R4000SC:
1212 case CPU_R4000MC: 1229 case CPU_R4000MC:
1213 case CPU_R4400SC: 1230 case CPU_R4400SC:
@@ -1384,9 +1401,8 @@ static void r4k_cache_error_setup(void)
1384{ 1401{
1385 extern char __weak except_vec2_generic; 1402 extern char __weak except_vec2_generic;
1386 extern char __weak except_vec2_sb1; 1403 extern char __weak except_vec2_sb1;
1387 struct cpuinfo_mips *c = &current_cpu_data;
1388 1404
1389 switch (c->cputype) { 1405 switch (current_cpu_type()) {
1390 case CPU_SB1: 1406 case CPU_SB1:
1391 case CPU_SB1A: 1407 case CPU_SB1A:
1392 set_uncached_handler(0x100, &except_vec2_sb1, 0x80); 1408 set_uncached_handler(0x100, &except_vec2_sb1, 0x80);
diff --git a/arch/mips/mm/dma-default.c b/arch/mips/mm/dma-default.c
index aaccf1c10699..5f8b95512580 100644
--- a/arch/mips/mm/dma-default.c
+++ b/arch/mips/mm/dma-default.c
@@ -18,6 +18,7 @@
18#include <linux/highmem.h> 18#include <linux/highmem.h>
19 19
20#include <asm/cache.h> 20#include <asm/cache.h>
21#include <asm/cpu-type.h>
21#include <asm/io.h> 22#include <asm/io.h>
22 23
23#include <dma-coherence.h> 24#include <dma-coherence.h>
@@ -50,16 +51,20 @@ static inline struct page *dma_addr_to_page(struct device *dev,
50} 51}
51 52
52/* 53/*
54 * The affected CPUs below in 'cpu_needs_post_dma_flush()' can
55 * speculatively fill random cachelines with stale data at any time,
56 * requiring an extra flush post-DMA.
57 *
53 * Warning on the terminology - Linux calls an uncached area coherent; 58 * Warning on the terminology - Linux calls an uncached area coherent;
54 * MIPS terminology calls memory areas with hardware maintained coherency 59 * MIPS terminology calls memory areas with hardware maintained coherency
55 * coherent. 60 * coherent.
56 */ 61 */
57 62static inline int cpu_needs_post_dma_flush(struct device *dev)
58static inline int cpu_is_noncoherent_r10000(struct device *dev)
59{ 63{
60 return !plat_device_is_coherent(dev) && 64 return !plat_device_is_coherent(dev) &&
61 (current_cpu_type() == CPU_R10000 || 65 (boot_cpu_type() == CPU_R10000 ||
62 current_cpu_type() == CPU_R12000); 66 boot_cpu_type() == CPU_R12000 ||
67 boot_cpu_type() == CPU_BMIPS5000);
63} 68}
64 69
65static gfp_t massage_gfp_flags(const struct device *dev, gfp_t gfp) 70static gfp_t massage_gfp_flags(const struct device *dev, gfp_t gfp)
@@ -230,7 +235,7 @@ static inline void __dma_sync(struct page *page,
230static void mips_dma_unmap_page(struct device *dev, dma_addr_t dma_addr, 235static void mips_dma_unmap_page(struct device *dev, dma_addr_t dma_addr,
231 size_t size, enum dma_data_direction direction, struct dma_attrs *attrs) 236 size_t size, enum dma_data_direction direction, struct dma_attrs *attrs)
232{ 237{
233 if (cpu_is_noncoherent_r10000(dev)) 238 if (cpu_needs_post_dma_flush(dev))
234 __dma_sync(dma_addr_to_page(dev, dma_addr), 239 __dma_sync(dma_addr_to_page(dev, dma_addr),
235 dma_addr & ~PAGE_MASK, size, direction); 240 dma_addr & ~PAGE_MASK, size, direction);
236 241
@@ -284,7 +289,7 @@ static void mips_dma_unmap_sg(struct device *dev, struct scatterlist *sg,
284static void mips_dma_sync_single_for_cpu(struct device *dev, 289static void mips_dma_sync_single_for_cpu(struct device *dev,
285 dma_addr_t dma_handle, size_t size, enum dma_data_direction direction) 290 dma_addr_t dma_handle, size_t size, enum dma_data_direction direction)
286{ 291{
287 if (cpu_is_noncoherent_r10000(dev)) 292 if (cpu_needs_post_dma_flush(dev))
288 __dma_sync(dma_addr_to_page(dev, dma_handle), 293 __dma_sync(dma_addr_to_page(dev, dma_handle),
289 dma_handle & ~PAGE_MASK, size, direction); 294 dma_handle & ~PAGE_MASK, size, direction);
290} 295}
@@ -303,12 +308,10 @@ static void mips_dma_sync_sg_for_cpu(struct device *dev,
303{ 308{
304 int i; 309 int i;
305 310
306 /* Make sure that gcc doesn't leave the empty loop body. */ 311 if (cpu_needs_post_dma_flush(dev))
307 for (i = 0; i < nelems; i++, sg++) { 312 for (i = 0; i < nelems; i++, sg++)
308 if (cpu_is_noncoherent_r10000(dev))
309 __dma_sync(sg_page(sg), sg->offset, sg->length, 313 __dma_sync(sg_page(sg), sg->offset, sg->length,
310 direction); 314 direction);
311 }
312} 315}
313 316
314static void mips_dma_sync_sg_for_device(struct device *dev, 317static void mips_dma_sync_sg_for_device(struct device *dev,
@@ -316,12 +319,10 @@ static void mips_dma_sync_sg_for_device(struct device *dev,
316{ 319{
317 int i; 320 int i;
318 321
319 /* Make sure that gcc doesn't leave the empty loop body. */ 322 if (!plat_device_is_coherent(dev))
320 for (i = 0; i < nelems; i++, sg++) { 323 for (i = 0; i < nelems; i++, sg++)
321 if (!plat_device_is_coherent(dev))
322 __dma_sync(sg_page(sg), sg->offset, sg->length, 324 __dma_sync(sg_page(sg), sg->offset, sg->length,
323 direction); 325 direction);
324 }
325} 326}
326 327
327int mips_dma_mapping_error(struct device *dev, dma_addr_t dma_addr) 328int mips_dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
diff --git a/arch/mips/mm/fault.c b/arch/mips/mm/fault.c
index 85df1cd8d446..becc42bb1849 100644
--- a/arch/mips/mm/fault.c
+++ b/arch/mips/mm/fault.c
@@ -42,8 +42,7 @@ static void __kprobes __do_page_fault(struct pt_regs *regs, unsigned long write,
42 const int field = sizeof(unsigned long) * 2; 42 const int field = sizeof(unsigned long) * 2;
43 siginfo_t info; 43 siginfo_t info;
44 int fault; 44 int fault;
45 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE | 45 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
46 (write ? FAULT_FLAG_WRITE : 0);
47 46
48#if 0 47#if 0
49 printk("Cpu%d[%s:%d:%0*lx:%ld:%0*lx]\n", raw_smp_processor_id(), 48 printk("Cpu%d[%s:%d:%0*lx:%ld:%0*lx]\n", raw_smp_processor_id(),
@@ -93,6 +92,8 @@ static void __kprobes __do_page_fault(struct pt_regs *regs, unsigned long write,
93 if (in_atomic() || !mm) 92 if (in_atomic() || !mm)
94 goto bad_area_nosemaphore; 93 goto bad_area_nosemaphore;
95 94
95 if (user_mode(regs))
96 flags |= FAULT_FLAG_USER;
96retry: 97retry:
97 down_read(&mm->mmap_sem); 98 down_read(&mm->mmap_sem);
98 vma = find_vma(mm, address); 99 vma = find_vma(mm, address);
@@ -114,6 +115,7 @@ good_area:
114 if (write) { 115 if (write) {
115 if (!(vma->vm_flags & VM_WRITE)) 116 if (!(vma->vm_flags & VM_WRITE))
116 goto bad_area; 117 goto bad_area;
118 flags |= FAULT_FLAG_WRITE;
117 } else { 119 } else {
118 if (cpu_has_rixi) { 120 if (cpu_has_rixi) {
119 if (address == regs->cp0_epc && !(vma->vm_flags & VM_EXEC)) { 121 if (address == regs->cp0_epc && !(vma->vm_flags & VM_EXEC)) {
@@ -241,6 +243,8 @@ out_of_memory:
241 * (which will retry the fault, or kill us if we got oom-killed). 243 * (which will retry the fault, or kill us if we got oom-killed).
242 */ 244 */
243 up_read(&mm->mmap_sem); 245 up_read(&mm->mmap_sem);
246 if (!user_mode(regs))
247 goto no_context;
244 pagefault_out_of_memory(); 248 pagefault_out_of_memory();
245 return; 249 return;
246 250
diff --git a/arch/mips/mm/gup.c b/arch/mips/mm/gup.c
index d4ea5c9c4a93..06ce17c2a905 100644
--- a/arch/mips/mm/gup.c
+++ b/arch/mips/mm/gup.c
@@ -12,6 +12,7 @@
12#include <linux/swap.h> 12#include <linux/swap.h>
13#include <linux/hugetlb.h> 13#include <linux/hugetlb.h>
14 14
15#include <asm/cpu-features.h>
15#include <asm/pgtable.h> 16#include <asm/pgtable.h>
16 17
17static inline pte_t gup_get_pte(pte_t *ptep) 18static inline pte_t gup_get_pte(pte_t *ptep)
@@ -273,7 +274,7 @@ int get_user_pages_fast(unsigned long start, int nr_pages, int write,
273 len = (unsigned long) nr_pages << PAGE_SHIFT; 274 len = (unsigned long) nr_pages << PAGE_SHIFT;
274 275
275 end = start + len; 276 end = start + len;
276 if (end < start) 277 if (end < start || cpu_has_dc_aliases)
277 goto slow_irqon; 278 goto slow_irqon;
278 279
279 /* XXX: batch / limit 'nr' */ 280 /* XXX: batch / limit 'nr' */
diff --git a/arch/mips/mm/hugetlbpage.c b/arch/mips/mm/hugetlbpage.c
index a7fee0dfb7a9..01fda4419ed0 100644
--- a/arch/mips/mm/hugetlbpage.c
+++ b/arch/mips/mm/hugetlbpage.c
@@ -85,6 +85,11 @@ int pud_huge(pud_t pud)
85 return (pud_val(pud) & _PAGE_HUGE) != 0; 85 return (pud_val(pud) & _PAGE_HUGE) != 0;
86} 86}
87 87
88int pmd_huge_support(void)
89{
90 return 1;
91}
92
88struct page * 93struct page *
89follow_huge_pmd(struct mm_struct *mm, unsigned long address, 94follow_huge_pmd(struct mm_struct *mm, unsigned long address,
90 pmd_t *pmd, int write) 95 pmd_t *pmd, int write)
diff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c
index 4e73f10a7519..e205ef598e97 100644
--- a/arch/mips/mm/init.c
+++ b/arch/mips/mm/init.c
@@ -254,6 +254,7 @@ void copy_from_user_page(struct vm_area_struct *vma,
254 SetPageDcacheDirty(page); 254 SetPageDcacheDirty(page);
255 } 255 }
256} 256}
257EXPORT_SYMBOL_GPL(copy_from_user_page);
257 258
258void __init fixrange_init(unsigned long start, unsigned long end, 259void __init fixrange_init(unsigned long start, unsigned long end,
259 pgd_t *pgd_base) 260 pgd_t *pgd_base)
diff --git a/arch/mips/mm/page.c b/arch/mips/mm/page.c
index 218c2109a55d..cbd81d17793a 100644
--- a/arch/mips/mm/page.c
+++ b/arch/mips/mm/page.c
@@ -18,6 +18,7 @@
18 18
19#include <asm/bugs.h> 19#include <asm/bugs.h>
20#include <asm/cacheops.h> 20#include <asm/cacheops.h>
21#include <asm/cpu-type.h>
21#include <asm/inst.h> 22#include <asm/inst.h>
22#include <asm/io.h> 23#include <asm/io.h>
23#include <asm/page.h> 24#include <asm/page.h>
diff --git a/arch/mips/mm/sc-mips.c b/arch/mips/mm/sc-mips.c
index 5d01392e3518..08d05aee8788 100644
--- a/arch/mips/mm/sc-mips.c
+++ b/arch/mips/mm/sc-mips.c
@@ -6,6 +6,7 @@
6#include <linux/sched.h> 6#include <linux/sched.h>
7#include <linux/mm.h> 7#include <linux/mm.h>
8 8
9#include <asm/cpu-type.h>
9#include <asm/mipsregs.h> 10#include <asm/mipsregs.h>
10#include <asm/bcache.h> 11#include <asm/bcache.h>
11#include <asm/cacheops.h> 12#include <asm/cacheops.h>
@@ -71,7 +72,7 @@ static inline int mips_sc_is_activated(struct cpuinfo_mips *c)
71 unsigned int tmp; 72 unsigned int tmp;
72 73
73 /* Check the bypass bit (L2B) */ 74 /* Check the bypass bit (L2B) */
74 switch (c->cputype) { 75 switch (current_cpu_type()) {
75 case CPU_34K: 76 case CPU_34K:
76 case CPU_74K: 77 case CPU_74K:
77 case CPU_1004K: 78 case CPU_1004K:
diff --git a/arch/mips/mm/tlb-funcs.S b/arch/mips/mm/tlb-funcs.S
index 30a494db99c2..79bca3130bd1 100644
--- a/arch/mips/mm/tlb-funcs.S
+++ b/arch/mips/mm/tlb-funcs.S
@@ -16,10 +16,12 @@
16 16
17#define FASTPATH_SIZE 128 17#define FASTPATH_SIZE 128
18 18
19#ifdef CONFIG_MIPS_PGD_C0_CONTEXT
19LEAF(tlbmiss_handler_setup_pgd) 20LEAF(tlbmiss_handler_setup_pgd)
20 .space 16 * 4 21 .space 16 * 4
21END(tlbmiss_handler_setup_pgd) 22END(tlbmiss_handler_setup_pgd)
22EXPORT(tlbmiss_handler_setup_pgd_end) 23EXPORT(tlbmiss_handler_setup_pgd_end)
24#endif
23 25
24LEAF(handle_tlbm) 26LEAF(handle_tlbm)
25 .space FASTPATH_SIZE * 4 27 .space FASTPATH_SIZE * 4
diff --git a/arch/mips/mm/tlb-r4k.c b/arch/mips/mm/tlb-r4k.c
index 00b26a67a06d..bb3a5f643e97 100644
--- a/arch/mips/mm/tlb-r4k.c
+++ b/arch/mips/mm/tlb-r4k.c
@@ -16,6 +16,7 @@
16#include <linux/module.h> 16#include <linux/module.h>
17 17
18#include <asm/cpu.h> 18#include <asm/cpu.h>
19#include <asm/cpu-type.h>
19#include <asm/bootinfo.h> 20#include <asm/bootinfo.h>
20#include <asm/mmu_context.h> 21#include <asm/mmu_context.h>
21#include <asm/pgtable.h> 22#include <asm/pgtable.h>
diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c
index 556cb4815770..9bb3a9363b06 100644
--- a/arch/mips/mm/tlbex.c
+++ b/arch/mips/mm/tlbex.c
@@ -30,6 +30,7 @@
30#include <linux/cache.h> 30#include <linux/cache.h>
31 31
32#include <asm/cacheflush.h> 32#include <asm/cacheflush.h>
33#include <asm/cpu-type.h>
33#include <asm/pgtable.h> 34#include <asm/pgtable.h>
34#include <asm/war.h> 35#include <asm/war.h>
35#include <asm/uasm.h> 36#include <asm/uasm.h>
@@ -85,6 +86,7 @@ static int use_bbit_insns(void)
85 case CPU_CAVIUM_OCTEON: 86 case CPU_CAVIUM_OCTEON:
86 case CPU_CAVIUM_OCTEON_PLUS: 87 case CPU_CAVIUM_OCTEON_PLUS:
87 case CPU_CAVIUM_OCTEON2: 88 case CPU_CAVIUM_OCTEON2:
89 case CPU_CAVIUM_OCTEON3:
88 return 1; 90 return 1;
89 default: 91 default:
90 return 0; 92 return 0;
@@ -95,6 +97,7 @@ static int use_lwx_insns(void)
95{ 97{
96 switch (current_cpu_type()) { 98 switch (current_cpu_type()) {
97 case CPU_CAVIUM_OCTEON2: 99 case CPU_CAVIUM_OCTEON2:
100 case CPU_CAVIUM_OCTEON3:
98 return 1; 101 return 1;
99 default: 102 default:
100 return 0; 103 return 0;
diff --git a/arch/mips/mti-malta/malta-time.c b/arch/mips/mti-malta/malta-time.c
index 53aad4a35375..a18af5fce67e 100644
--- a/arch/mips/mti-malta/malta-time.c
+++ b/arch/mips/mti-malta/malta-time.c
@@ -27,6 +27,7 @@
27#include <linux/timex.h> 27#include <linux/timex.h>
28#include <linux/mc146818rtc.h> 28#include <linux/mc146818rtc.h>
29 29
30#include <asm/cpu.h>
30#include <asm/mipsregs.h> 31#include <asm/mipsregs.h>
31#include <asm/mipsmtregs.h> 32#include <asm/mipsmtregs.h>
32#include <asm/hardirq.h> 33#include <asm/hardirq.h>
@@ -76,7 +77,7 @@ static void __init estimate_frequencies(void)
76#endif 77#endif
77 78
78#if defined (CONFIG_KVM_GUEST) && defined (CONFIG_KVM_HOST_FREQ) 79#if defined (CONFIG_KVM_GUEST) && defined (CONFIG_KVM_HOST_FREQ)
79 unsigned int prid = read_c0_prid() & 0xffff00; 80 unsigned int prid = read_c0_prid() & (PRID_COMP_MASK | PRID_IMP_MASK);
80 81
81 /* 82 /*
82 * XXXKYMA: hardwire the CPU frequency to Host Freq/4 83 * XXXKYMA: hardwire the CPU frequency to Host Freq/4
@@ -169,7 +170,7 @@ unsigned int get_c0_compare_int(void)
169 170
170void __init plat_time_init(void) 171void __init plat_time_init(void)
171{ 172{
172 unsigned int prid = read_c0_prid() & 0xffff00; 173 unsigned int prid = read_c0_prid() & (PRID_COMP_MASK | PRID_IMP_MASK);
173 unsigned int freq; 174 unsigned int freq;
174 175
175 estimate_frequencies(); 176 estimate_frequencies();
diff --git a/arch/mips/mti-sead3/sead3-time.c b/arch/mips/mti-sead3/sead3-time.c
index a43ea3cc0a3b..552d26c34386 100644
--- a/arch/mips/mti-sead3/sead3-time.c
+++ b/arch/mips/mti-sead3/sead3-time.c
@@ -7,6 +7,7 @@
7 */ 7 */
8#include <linux/init.h> 8#include <linux/init.h>
9 9
10#include <asm/cpu.h>
10#include <asm/setup.h> 11#include <asm/setup.h>
11#include <asm/time.h> 12#include <asm/time.h>
12#include <asm/irq.h> 13#include <asm/irq.h>
@@ -34,7 +35,7 @@ static void __iomem *status_reg = (void __iomem *)0xbf000410;
34 */ 35 */
35static unsigned int __init estimate_cpu_frequency(void) 36static unsigned int __init estimate_cpu_frequency(void)
36{ 37{
37 unsigned int prid = read_c0_prid() & 0xffff00; 38 unsigned int prid = read_c0_prid() & (PRID_COMP_MASK | PRID_IMP_MASK);
38 unsigned int tick = 0; 39 unsigned int tick = 0;
39 unsigned int freq; 40 unsigned int freq;
40 unsigned int orig; 41 unsigned int orig;
diff --git a/arch/mips/netlogic/Kconfig b/arch/mips/netlogic/Kconfig
index 2447bf97d35a..852a4ee09954 100644
--- a/arch/mips/netlogic/Kconfig
+++ b/arch/mips/netlogic/Kconfig
@@ -19,6 +19,15 @@ config DT_XLP_SVP
19 pointer to the kernel. The corresponding DTS file is at 19 pointer to the kernel. The corresponding DTS file is at
20 arch/mips/netlogic/dts/xlp_svp.dts 20 arch/mips/netlogic/dts/xlp_svp.dts
21 21
22config DT_XLP_FVP
23 bool "Built-in device tree for XLP FVP boards"
24 default y
25 help
26 Add an FDT blob for XLP FVP board into the kernel.
27 This DTB will be used if the firmware does not pass in a DTB
28 pointer to the kernel. The corresponding DTS file is at
29 arch/mips/netlogic/dts/xlp_fvp.dts
30
22config NLM_MULTINODE 31config NLM_MULTINODE
23 bool "Support for multi-chip boards" 32 bool "Support for multi-chip boards"
24 depends on NLM_XLP_BOARD 33 depends on NLM_XLP_BOARD
diff --git a/arch/mips/netlogic/common/smp.c b/arch/mips/netlogic/common/smp.c
index 4e35d9c453e2..6f8feb9efcff 100644
--- a/arch/mips/netlogic/common/smp.c
+++ b/arch/mips/netlogic/common/smp.c
@@ -106,9 +106,7 @@ void nlm_early_init_secondary(int cpu)
106{ 106{
107 change_c0_config(CONF_CM_CMASK, 0x3); 107 change_c0_config(CONF_CM_CMASK, 0x3);
108#ifdef CONFIG_CPU_XLP 108#ifdef CONFIG_CPU_XLP
109 /* mmu init, once per core */ 109 xlp_mmu_init();
110 if (cpu % NLM_THREADS_PER_CORE == 0)
111 xlp_mmu_init();
112#endif 110#endif
113 write_c0_ebase(nlm_current_node()->ebase); 111 write_c0_ebase(nlm_current_node()->ebase);
114} 112}
diff --git a/arch/mips/netlogic/common/time.c b/arch/mips/netlogic/common/time.c
index 045a396c57ce..13391b8a6031 100644
--- a/arch/mips/netlogic/common/time.c
+++ b/arch/mips/netlogic/common/time.c
@@ -45,6 +45,7 @@
45#if defined(CONFIG_CPU_XLP) 45#if defined(CONFIG_CPU_XLP)
46#include <asm/netlogic/xlp-hal/iomap.h> 46#include <asm/netlogic/xlp-hal/iomap.h>
47#include <asm/netlogic/xlp-hal/xlp.h> 47#include <asm/netlogic/xlp-hal/xlp.h>
48#include <asm/netlogic/xlp-hal/sys.h>
48#include <asm/netlogic/xlp-hal/pic.h> 49#include <asm/netlogic/xlp-hal/pic.h>
49#elif defined(CONFIG_CPU_XLR) 50#elif defined(CONFIG_CPU_XLR)
50#include <asm/netlogic/xlr/iomap.h> 51#include <asm/netlogic/xlr/iomap.h>
@@ -91,7 +92,7 @@ static void nlm_init_pic_timer(void)
91 csrc_pic.read = nlm_get_pic_timer; 92 csrc_pic.read = nlm_get_pic_timer;
92 } 93 }
93 csrc_pic.rating = 1000; 94 csrc_pic.rating = 1000;
94 clocksource_register_hz(&csrc_pic, PIC_CLK_HZ); 95 clocksource_register_hz(&csrc_pic, pic_timer_freq());
95} 96}
96 97
97void __init plat_time_init(void) 98void __init plat_time_init(void)
diff --git a/arch/mips/netlogic/dts/Makefile b/arch/mips/netlogic/dts/Makefile
index aecb6fa9a9c3..0b9be5fd2e46 100644
--- a/arch/mips/netlogic/dts/Makefile
+++ b/arch/mips/netlogic/dts/Makefile
@@ -1,2 +1,3 @@
1obj-$(CONFIG_DT_XLP_EVP) := xlp_evp.dtb.o 1obj-$(CONFIG_DT_XLP_EVP) := xlp_evp.dtb.o
2obj-$(CONFIG_DT_XLP_SVP) += xlp_svp.dtb.o 2obj-$(CONFIG_DT_XLP_SVP) += xlp_svp.dtb.o
3obj-$(CONFIG_DT_XLP_FVP) += xlp_fvp.dtb.o
diff --git a/arch/mips/netlogic/dts/xlp_evp.dts b/arch/mips/netlogic/dts/xlp_evp.dts
index 06407033678e..89ad04808c02 100644
--- a/arch/mips/netlogic/dts/xlp_evp.dts
+++ b/arch/mips/netlogic/dts/xlp_evp.dts
@@ -9,19 +9,12 @@
9 #address-cells = <2>; 9 #address-cells = <2>;
10 #size-cells = <2>; 10 #size-cells = <2>;
11 11
12 memory {
13 device_type = "memory";
14 reg = <0 0x00100000 0 0x0FF00000 // 255M at 1M
15 0 0x20000000 0 0xa0000000 // 2560M at 512M
16 0 0xe0000000 1 0x00000000>;
17 };
18
19 soc { 12 soc {
20 #address-cells = <2>; 13 #address-cells = <2>;
21 #size-cells = <1>; 14 #size-cells = <1>;
22 compatible = "simple-bus"; 15 compatible = "simple-bus";
23 ranges = <0 0 0 0x18000000 0x04000000 // PCIe CFG 16 ranges = <0 0 0 0x18000000 0x04000000 // PCIe CFG
24 1 0 0 0x16000000 0x01000000>; // GBU chipselects 17 1 0 0 0x16000000 0x02000000>; // GBU chipselects
25 18
26 serial0: serial@30000 { 19 serial0: serial@30000 {
27 device_type = "serial"; 20 device_type = "serial";
diff --git a/arch/mips/netlogic/dts/xlp_fvp.dts b/arch/mips/netlogic/dts/xlp_fvp.dts
new file mode 100644
index 000000000000..63e62b7bd758
--- /dev/null
+++ b/arch/mips/netlogic/dts/xlp_fvp.dts
@@ -0,0 +1,118 @@
1/*
2 * XLP2XX Device Tree Source for FVP boards
3 */
4
5/dts-v1/;
6/ {
7 model = "netlogic,XLP-FVP";
8 compatible = "netlogic,xlp";
9 #address-cells = <2>;
10 #size-cells = <2>;
11
12 soc {
13 #address-cells = <2>;
14 #size-cells = <1>;
15 compatible = "simple-bus";
16 ranges = <0 0 0 0x18000000 0x04000000 // PCIe CFG
17 1 0 0 0x16000000 0x02000000>; // GBU chipselects
18
19 serial0: serial@30000 {
20 device_type = "serial";
21 compatible = "ns16550";
22 reg = <0 0x30100 0xa00>;
23 reg-shift = <2>;
24 reg-io-width = <4>;
25 clock-frequency = <133333333>;
26 interrupt-parent = <&pic>;
27 interrupts = <17>;
28 };
29 serial1: serial@31000 {
30 device_type = "serial";
31 compatible = "ns16550";
32 reg = <0 0x31100 0xa00>;
33 reg-shift = <2>;
34 reg-io-width = <4>;
35 clock-frequency = <133333333>;
36 interrupt-parent = <&pic>;
37 interrupts = <18>;
38 };
39 i2c0: ocores@37100 {
40 compatible = "opencores,i2c-ocores";
41 #address-cells = <1>;
42 #size-cells = <0>;
43 reg = <0 0x37100 0x20>;
44 reg-shift = <2>;
45 reg-io-width = <4>;
46 clock-frequency = <32000000>;
47 interrupt-parent = <&pic>;
48 interrupts = <30>;
49 };
50 i2c1: ocores@37120 {
51 compatible = "opencores,i2c-ocores";
52 #address-cells = <1>;
53 #size-cells = <0>;
54 reg = <0 0x37120 0x20>;
55 reg-shift = <2>;
56 reg-io-width = <4>;
57 clock-frequency = <32000000>;
58 interrupt-parent = <&pic>;
59 interrupts = <31>;
60
61 rtc@68 {
62 compatible = "dallas,ds1374";
63 reg = <0x68>;
64 };
65
66 dtt@4c {
67 compatible = "national,lm90";
68 reg = <0x4c>;
69 };
70 };
71 pic: pic@4000 {
72 compatible = "netlogic,xlp-pic";
73 #address-cells = <0>;
74 #interrupt-cells = <1>;
75 reg = <0 0x4000 0x200>;
76 interrupt-controller;
77 };
78
79 nor_flash@1,0 {
80 compatible = "cfi-flash";
81 #address-cells = <1>;
82 #size-cells = <1>;
83 bank-width = <2>;
84 reg = <1 0 0x1000000>;
85
86 partition@0 {
87 label = "x-loader";
88 reg = <0x0 0x100000>; /* 1M */
89 read-only;
90 };
91
92 partition@100000 {
93 label = "u-boot";
94 reg = <0x100000 0x100000>; /* 1M */
95 };
96
97 partition@200000 {
98 label = "kernel";
99 reg = <0x200000 0x500000>; /* 5M */
100 };
101
102 partition@700000 {
103 label = "rootfs";
104 reg = <0x700000 0x800000>; /* 8M */
105 };
106
107 partition@f00000 {
108 label = "env";
109 reg = <0xf00000 0x100000>; /* 1M */
110 read-only;
111 };
112 };
113 };
114
115 chosen {
116 bootargs = "console=ttyS0,115200 rdinit=/sbin/init";
117 };
118};
diff --git a/arch/mips/netlogic/dts/xlp_svp.dts b/arch/mips/netlogic/dts/xlp_svp.dts
index 9c5db102df53..1ebd00edaacc 100644
--- a/arch/mips/netlogic/dts/xlp_svp.dts
+++ b/arch/mips/netlogic/dts/xlp_svp.dts
@@ -9,19 +9,12 @@
9 #address-cells = <2>; 9 #address-cells = <2>;
10 #size-cells = <2>; 10 #size-cells = <2>;
11 11
12 memory {
13 device_type = "memory";
14 reg = <0 0x00100000 0 0x0FF00000 // 255M at 1M
15 0 0x20000000 0 0xa0000000 // 2560M at 512M
16 0 0xe0000000 0 0x40000000>;
17 };
18
19 soc { 12 soc {
20 #address-cells = <2>; 13 #address-cells = <2>;
21 #size-cells = <1>; 14 #size-cells = <1>;
22 compatible = "simple-bus"; 15 compatible = "simple-bus";
23 ranges = <0 0 0 0x18000000 0x04000000 // PCIe CFG 16 ranges = <0 0 0 0x18000000 0x04000000 // PCIe CFG
24 1 0 0 0x16000000 0x01000000>; // GBU chipselects 17 1 0 0 0x16000000 0x02000000>; // GBU chipselects
25 18
26 serial0: serial@30000 { 19 serial0: serial@30000 {
27 device_type = "serial"; 20 device_type = "serial";
diff --git a/arch/mips/netlogic/xlp/Makefile b/arch/mips/netlogic/xlp/Makefile
index 85ac4a892ced..ed9a93c04650 100644
--- a/arch/mips/netlogic/xlp/Makefile
+++ b/arch/mips/netlogic/xlp/Makefile
@@ -1,3 +1,4 @@
1obj-y += setup.o nlm_hal.o cop2-ex.o dt.o 1obj-y += setup.o nlm_hal.o cop2-ex.o dt.o
2obj-$(CONFIG_SMP) += wakeup.o 2obj-$(CONFIG_SMP) += wakeup.o
3obj-$(CONFIG_USB) += usb-init.o 3obj-$(CONFIG_USB) += usb-init.o
4obj-$(CONFIG_USB) += usb-init-xlp2.o
diff --git a/arch/mips/netlogic/xlp/dt.c b/arch/mips/netlogic/xlp/dt.c
index a15cdbb8d0bd..88df445dda76 100644
--- a/arch/mips/netlogic/xlp/dt.c
+++ b/arch/mips/netlogic/xlp/dt.c
@@ -39,12 +39,18 @@
39#include <linux/of_platform.h> 39#include <linux/of_platform.h>
40#include <linux/of_device.h> 40#include <linux/of_device.h>
41 41
42extern u32 __dtb_xlp_evp_begin[], __dtb_xlp_svp_begin[], __dtb_start[]; 42extern u32 __dtb_xlp_evp_begin[], __dtb_xlp_svp_begin[],
43 __dtb_xlp_fvp_begin[], __dtb_start[];
43 44
44void __init *xlp_dt_init(void *fdtp) 45void __init *xlp_dt_init(void *fdtp)
45{ 46{
46 if (!fdtp) { 47 if (!fdtp) {
47 switch (current_cpu_data.processor_id & 0xff00) { 48 switch (current_cpu_data.processor_id & 0xff00) {
49#ifdef CONFIG_DT_XLP_FVP
50 case PRID_IMP_NETLOGIC_XLP2XX:
51 fdtp = __dtb_xlp_fvp_begin;
52 break;
53#endif
48#ifdef CONFIG_DT_XLP_SVP 54#ifdef CONFIG_DT_XLP_SVP
49 case PRID_IMP_NETLOGIC_XLP3XX: 55 case PRID_IMP_NETLOGIC_XLP3XX:
50 fdtp = __dtb_xlp_svp_begin; 56 fdtp = __dtb_xlp_svp_begin;
diff --git a/arch/mips/netlogic/xlp/nlm_hal.c b/arch/mips/netlogic/xlp/nlm_hal.c
index 87560e4db35f..56c50ba43c9b 100644
--- a/arch/mips/netlogic/xlp/nlm_hal.c
+++ b/arch/mips/netlogic/xlp/nlm_hal.c
@@ -44,6 +44,7 @@
44#include <asm/netlogic/haldefs.h> 44#include <asm/netlogic/haldefs.h>
45#include <asm/netlogic/xlp-hal/iomap.h> 45#include <asm/netlogic/xlp-hal/iomap.h>
46#include <asm/netlogic/xlp-hal/xlp.h> 46#include <asm/netlogic/xlp-hal/xlp.h>
47#include <asm/netlogic/xlp-hal/bridge.h>
47#include <asm/netlogic/xlp-hal/pic.h> 48#include <asm/netlogic/xlp-hal/pic.h>
48#include <asm/netlogic/xlp-hal/sys.h> 49#include <asm/netlogic/xlp-hal/sys.h>
49 50
@@ -64,6 +65,7 @@ int nlm_irq_to_irt(int irq)
64 uint64_t pcibase; 65 uint64_t pcibase;
65 int devoff, irt; 66 int devoff, irt;
66 67
68 devoff = 0;
67 switch (irq) { 69 switch (irq) {
68 case PIC_UART_0_IRQ: 70 case PIC_UART_0_IRQ:
69 devoff = XLP_IO_UART0_OFFSET(0); 71 devoff = XLP_IO_UART0_OFFSET(0);
@@ -71,44 +73,68 @@ int nlm_irq_to_irt(int irq)
71 case PIC_UART_1_IRQ: 73 case PIC_UART_1_IRQ:
72 devoff = XLP_IO_UART1_OFFSET(0); 74 devoff = XLP_IO_UART1_OFFSET(0);
73 break; 75 break;
74 case PIC_EHCI_0_IRQ:
75 devoff = XLP_IO_USB_EHCI0_OFFSET(0);
76 break;
77 case PIC_EHCI_1_IRQ:
78 devoff = XLP_IO_USB_EHCI1_OFFSET(0);
79 break;
80 case PIC_OHCI_0_IRQ:
81 devoff = XLP_IO_USB_OHCI0_OFFSET(0);
82 break;
83 case PIC_OHCI_1_IRQ:
84 devoff = XLP_IO_USB_OHCI1_OFFSET(0);
85 break;
86 case PIC_OHCI_2_IRQ:
87 devoff = XLP_IO_USB_OHCI2_OFFSET(0);
88 break;
89 case PIC_OHCI_3_IRQ:
90 devoff = XLP_IO_USB_OHCI3_OFFSET(0);
91 break;
92 case PIC_MMC_IRQ: 76 case PIC_MMC_IRQ:
93 devoff = XLP_IO_SD_OFFSET(0); 77 devoff = XLP_IO_SD_OFFSET(0);
94 break; 78 break;
95 case PIC_I2C_0_IRQ: 79 case PIC_I2C_0_IRQ: /* I2C will be fixed up */
96 devoff = XLP_IO_I2C0_OFFSET(0);
97 break;
98 case PIC_I2C_1_IRQ: 80 case PIC_I2C_1_IRQ:
99 devoff = XLP_IO_I2C1_OFFSET(0); 81 case PIC_I2C_2_IRQ:
82 case PIC_I2C_3_IRQ:
83 if (cpu_is_xlpii())
84 devoff = XLP2XX_IO_I2C_OFFSET(0);
85 else
86 devoff = XLP_IO_I2C0_OFFSET(0);
100 break; 87 break;
101 default: 88 default:
102 devoff = 0; 89 if (cpu_is_xlpii()) {
103 break; 90 switch (irq) {
91 /* XLP2XX has three XHCI USB controller */
92 case PIC_2XX_XHCI_0_IRQ:
93 devoff = XLP2XX_IO_USB_XHCI0_OFFSET(0);
94 break;
95 case PIC_2XX_XHCI_1_IRQ:
96 devoff = XLP2XX_IO_USB_XHCI1_OFFSET(0);
97 break;
98 case PIC_2XX_XHCI_2_IRQ:
99 devoff = XLP2XX_IO_USB_XHCI2_OFFSET(0);
100 break;
101 }
102 } else {
103 switch (irq) {
104 case PIC_EHCI_0_IRQ:
105 devoff = XLP_IO_USB_EHCI0_OFFSET(0);
106 break;
107 case PIC_EHCI_1_IRQ:
108 devoff = XLP_IO_USB_EHCI1_OFFSET(0);
109 break;
110 case PIC_OHCI_0_IRQ:
111 devoff = XLP_IO_USB_OHCI0_OFFSET(0);
112 break;
113 case PIC_OHCI_1_IRQ:
114 devoff = XLP_IO_USB_OHCI1_OFFSET(0);
115 break;
116 case PIC_OHCI_2_IRQ:
117 devoff = XLP_IO_USB_OHCI2_OFFSET(0);
118 break;
119 case PIC_OHCI_3_IRQ:
120 devoff = XLP_IO_USB_OHCI3_OFFSET(0);
121 break;
122 }
123 }
104 } 124 }
105 125
106 if (devoff != 0) { 126 if (devoff != 0) {
107 pcibase = nlm_pcicfg_base(devoff); 127 pcibase = nlm_pcicfg_base(devoff);
108 irt = nlm_read_reg(pcibase, XLP_PCI_IRTINFO_REG) & 0xffff; 128 irt = nlm_read_reg(pcibase, XLP_PCI_IRTINFO_REG) & 0xffff;
109 /* HW bug, I2C 1 irt entry is off by one */ 129 /* HW weirdness, I2C IRT entry has to be fixed up */
110 if (irq == PIC_I2C_1_IRQ) 130 switch (irq) {
111 irt = irt + 1; 131 case PIC_I2C_1_IRQ:
132 irt = irt + 1; break;
133 case PIC_I2C_2_IRQ:
134 irt = irt + 2; break;
135 case PIC_I2C_3_IRQ:
136 irt = irt + 3; break;
137 }
112 } else if (irq >= PIC_PCIE_LINK_0_IRQ && irq <= PIC_PCIE_LINK_3_IRQ) { 138 } else if (irq >= PIC_PCIE_LINK_0_IRQ && irq <= PIC_PCIE_LINK_3_IRQ) {
113 /* HW bug, PCI IRT entries are bad on early silicon, fix */ 139 /* HW bug, PCI IRT entries are bad on early silicon, fix */
114 irt = PIC_IRT_PCIE_LINK_INDEX(irq - PIC_PCIE_LINK_0_IRQ); 140 irt = PIC_IRT_PCIE_LINK_INDEX(irq - PIC_PCIE_LINK_0_IRQ);
@@ -126,19 +152,160 @@ unsigned int nlm_get_core_frequency(int node, int core)
126 152
127 sysbase = nlm_get_node(node)->sysbase; 153 sysbase = nlm_get_node(node)->sysbase;
128 rstval = nlm_read_sys_reg(sysbase, SYS_POWER_ON_RESET_CFG); 154 rstval = nlm_read_sys_reg(sysbase, SYS_POWER_ON_RESET_CFG);
129 dfsval = nlm_read_sys_reg(sysbase, SYS_CORE_DFS_DIV_VALUE); 155 if (cpu_is_xlpii()) {
130 pll_divf = ((rstval >> 10) & 0x7f) + 1; 156 num = 1000000ULL * (400 * 3 + 100 * (rstval >> 26));
131 pll_divr = ((rstval >> 8) & 0x3) + 1; 157 denom = 3;
132 ext_div = ((rstval >> 30) & 0x3) + 1; 158 } else {
133 dfs_div = ((dfsval >> (core * 4)) & 0xf) + 1; 159 dfsval = nlm_read_sys_reg(sysbase, SYS_CORE_DFS_DIV_VALUE);
134 160 pll_divf = ((rstval >> 10) & 0x7f) + 1;
135 num = 800000000ULL * pll_divf; 161 pll_divr = ((rstval >> 8) & 0x3) + 1;
136 denom = 3 * pll_divr * ext_div * dfs_div; 162 ext_div = ((rstval >> 30) & 0x3) + 1;
163 dfs_div = ((dfsval >> (core * 4)) & 0xf) + 1;
164
165 num = 800000000ULL * pll_divf;
166 denom = 3 * pll_divr * ext_div * dfs_div;
167 }
137 do_div(num, denom); 168 do_div(num, denom);
138 return (unsigned int)num; 169 return (unsigned int)num;
139} 170}
140 171
172/* Calculate Frequency to the PIC from PLL.
173 * freq_out = ( ref_freq/2 * (6 + ctrl2[7:0]) + ctrl2[20:8]/2^13 ) /
174 * ((2^ctrl0[7:5]) * Table(ctrl0[26:24]))
175 */
176static unsigned int nlm_2xx_get_pic_frequency(int node)
177{
178 u32 ctrl_val0, ctrl_val2, vco_post_div, pll_post_div;
179 u32 mdiv, fdiv, pll_out_freq_den, reg_select, ref_div, pic_div;
180 u64 ref_clk, sysbase, pll_out_freq_num, ref_clk_select;
181
182 sysbase = nlm_get_node(node)->sysbase;
183
184 /* Find ref_clk_base */
185 ref_clk_select =
186 (nlm_read_sys_reg(sysbase, SYS_POWER_ON_RESET_CFG) >> 18) & 0x3;
187 switch (ref_clk_select) {
188 case 0:
189 ref_clk = 200000000ULL;
190 ref_div = 3;
191 break;
192 case 1:
193 ref_clk = 100000000ULL;
194 ref_div = 1;
195 break;
196 case 2:
197 ref_clk = 125000000ULL;
198 ref_div = 1;
199 break;
200 case 3:
201 ref_clk = 400000000ULL;
202 ref_div = 3;
203 break;
204 }
205
206 /* Find the clock source PLL device for PIC */
207 reg_select = (nlm_read_sys_reg(sysbase, SYS_CLK_DEV_SEL) >> 22) & 0x3;
208 switch (reg_select) {
209 case 0:
210 ctrl_val0 = nlm_read_sys_reg(sysbase, SYS_PLL_CTRL0);
211 ctrl_val2 = nlm_read_sys_reg(sysbase, SYS_PLL_CTRL2);
212 break;
213 case 1:
214 ctrl_val0 = nlm_read_sys_reg(sysbase, SYS_PLL_CTRL0_DEVX(0));
215 ctrl_val2 = nlm_read_sys_reg(sysbase, SYS_PLL_CTRL2_DEVX(0));
216 break;
217 case 2:
218 ctrl_val0 = nlm_read_sys_reg(sysbase, SYS_PLL_CTRL0_DEVX(1));
219 ctrl_val2 = nlm_read_sys_reg(sysbase, SYS_PLL_CTRL2_DEVX(1));
220 break;
221 case 3:
222 ctrl_val0 = nlm_read_sys_reg(sysbase, SYS_PLL_CTRL0_DEVX(2));
223 ctrl_val2 = nlm_read_sys_reg(sysbase, SYS_PLL_CTRL2_DEVX(2));
224 break;
225 }
226
227 vco_post_div = (ctrl_val0 >> 5) & 0x7;
228 pll_post_div = (ctrl_val0 >> 24) & 0x7;
229 mdiv = ctrl_val2 & 0xff;
230 fdiv = (ctrl_val2 >> 8) & 0xfff;
231
232 /* Find PLL post divider value */
233 switch (pll_post_div) {
234 case 1:
235 pll_post_div = 2;
236 break;
237 case 3:
238 pll_post_div = 4;
239 break;
240 case 7:
241 pll_post_div = 8;
242 break;
243 case 6:
244 pll_post_div = 16;
245 break;
246 case 0:
247 default:
248 pll_post_div = 1;
249 break;
250 }
251
252 fdiv = fdiv/(1 << 13);
253 pll_out_freq_num = ((ref_clk >> 1) * (6 + mdiv)) + fdiv;
254 pll_out_freq_den = (1 << vco_post_div) * pll_post_div * 3;
255
256 if (pll_out_freq_den > 0)
257 do_div(pll_out_freq_num, pll_out_freq_den);
258
259 /* PIC post divider, which happens after PLL */
260 pic_div = (nlm_read_sys_reg(sysbase, SYS_CLK_DEV_DIV) >> 22) & 0x3;
261 do_div(pll_out_freq_num, 1 << pic_div);
262
263 return pll_out_freq_num;
264}
265
266unsigned int nlm_get_pic_frequency(int node)
267{
268 if (cpu_is_xlpii())
269 return nlm_2xx_get_pic_frequency(node);
270 else
271 return 133333333;
272}
273
141unsigned int nlm_get_cpu_frequency(void) 274unsigned int nlm_get_cpu_frequency(void)
142{ 275{
143 return nlm_get_core_frequency(0, 0); 276 return nlm_get_core_frequency(0, 0);
144} 277}
278
279/*
280 * Fills upto 8 pairs of entries containing the DRAM map of a node
281 * if n < 0, get dram map for all nodes
282 */
283int xlp_get_dram_map(int n, uint64_t *dram_map)
284{
285 uint64_t bridgebase, base, lim;
286 uint32_t val;
287 int i, node, rv;
288
289 /* Look only at mapping on Node 0, we don't handle crazy configs */
290 bridgebase = nlm_get_bridge_regbase(0);
291 rv = 0;
292 for (i = 0; i < 8; i++) {
293 val = nlm_read_bridge_reg(bridgebase,
294 BRIDGE_DRAM_NODE_TRANSLN(i));
295 node = (val >> 1) & 0x3;
296 if (n >= 0 && n != node)
297 continue;
298 val = nlm_read_bridge_reg(bridgebase, BRIDGE_DRAM_BAR(i));
299 val = (val >> 12) & 0xfffff;
300 base = (uint64_t) val << 20;
301 val = nlm_read_bridge_reg(bridgebase, BRIDGE_DRAM_LIMIT(i));
302 val = (val >> 12) & 0xfffff;
303 if (val == 0) /* BAR not used */
304 continue;
305 lim = ((uint64_t)val + 1) << 20;
306 dram_map[rv] = base;
307 dram_map[rv + 1] = lim;
308 rv += 2;
309 }
310 return rv;
311}
diff --git a/arch/mips/netlogic/xlp/setup.c b/arch/mips/netlogic/xlp/setup.c
index 7b638f7be491..76a7131e486e 100644
--- a/arch/mips/netlogic/xlp/setup.c
+++ b/arch/mips/netlogic/xlp/setup.c
@@ -73,6 +73,23 @@ static void nlm_fixup_mem(void)
73 } 73 }
74} 74}
75 75
76static void __init xlp_init_mem_from_bars(void)
77{
78 uint64_t map[16];
79 int i, n;
80
81 n = xlp_get_dram_map(-1, map); /* -1: info for all nodes */
82 for (i = 0; i < n; i += 2) {
83 /* exclude 0x1000_0000-0x2000_0000, u-boot device */
84 if (map[i] <= 0x10000000 && map[i+1] > 0x10000000)
85 map[i+1] = 0x10000000;
86 if (map[i] > 0x10000000 && map[i] < 0x20000000)
87 map[i] = 0x20000000;
88
89 add_memory_region(map[i], map[i+1] - map[i], BOOT_MEM_RAM);
90 }
91}
92
76void __init plat_mem_setup(void) 93void __init plat_mem_setup(void)
77{ 94{
78 panic_timeout = 5; 95 panic_timeout = 5;
@@ -82,12 +99,23 @@ void __init plat_mem_setup(void)
82 99
83 /* memory and bootargs from DT */ 100 /* memory and bootargs from DT */
84 early_init_devtree(initial_boot_params); 101 early_init_devtree(initial_boot_params);
102
103 if (boot_mem_map.nr_map == 0) {
104 pr_info("Using DRAM BARs for memory map.\n");
105 xlp_init_mem_from_bars();
106 }
107 /* Calculate and setup wired entries for mapped kernel */
85 nlm_fixup_mem(); 108 nlm_fixup_mem();
86} 109}
87 110
88const char *get_system_type(void) 111const char *get_system_type(void)
89{ 112{
90 return "Netlogic XLP Series"; 113 switch (read_c0_prid() & 0xff00) {
114 case PRID_IMP_NETLOGIC_XLP2XX:
115 return "Broadcom XLPII Series";
116 default:
117 return "Netlogic XLP Series";
118 }
91} 119}
92 120
93void __init prom_free_prom_memory(void) 121void __init prom_free_prom_memory(void)
@@ -97,12 +125,20 @@ void __init prom_free_prom_memory(void)
97 125
98void xlp_mmu_init(void) 126void xlp_mmu_init(void)
99{ 127{
100 /* enable extended TLB and Large Fixed TLB */ 128 u32 conf4;
101 write_c0_config6(read_c0_config6() | 0x24); 129
102 130 if (cpu_is_xlpii()) {
103 /* set page mask of Fixed TLB in config7 */ 131 /* XLPII series has extended pagesize in config 4 */
104 write_c0_config7(PM_DEFAULT_MASK >> 132 conf4 = read_c0_config4() & ~0x1f00u;
105 (13 + (ffz(PM_DEFAULT_MASK >> 13) / 2))); 133 write_c0_config4(conf4 | ((PAGE_SHIFT - 10) / 2 << 8));
134 } else {
135 /* enable extended TLB and Large Fixed TLB */
136 write_c0_config6(read_c0_config6() | 0x24);
137
138 /* set page mask of extended Fixed TLB in config7 */
139 write_c0_config7(PM_DEFAULT_MASK >>
140 (13 + (ffz(PM_DEFAULT_MASK >> 13) / 2)));
141 }
106} 142}
107 143
108void nlm_percpu_init(int hwcpuid) 144void nlm_percpu_init(int hwcpuid)
diff --git a/arch/mips/netlogic/xlp/usb-init-xlp2.c b/arch/mips/netlogic/xlp/usb-init-xlp2.c
new file mode 100644
index 000000000000..36e9c22afc46
--- /dev/null
+++ b/arch/mips/netlogic/xlp/usb-init-xlp2.c
@@ -0,0 +1,218 @@
1/*
2 * Copyright (c) 2003-2013 Broadcom Corporation
3 * All Rights Reserved
4 *
5 * This software is available to you under a choice of one of two
6 * licenses. You may choose to be licensed under the terms of the GNU
7 * General Public License (GPL) Version 2, available from the file
8 * COPYING in the main directory of this source tree, or the Broadcom
9 * license below:
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 *
15 * 1. Redistributions of source code must retain the above copyright
16 * notice, this list of conditions and the following disclaimer.
17 * 2. Redistributions in binary form must reproduce the above copyright
18 * notice, this list of conditions and the following disclaimer in
19 * the documentation and/or other materials provided with the
20 * distribution.
21 *
22 * THIS SOFTWARE IS PROVIDED BY BROADCOM ``AS IS'' AND ANY EXPRESS OR
23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
24 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL BROADCOM OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
29 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
30 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
31 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
32 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 */
34
35#include <linux/dma-mapping.h>
36#include <linux/kernel.h>
37#include <linux/delay.h>
38#include <linux/init.h>
39#include <linux/pci.h>
40#include <linux/platform_device.h>
41#include <linux/irq.h>
42
43#include <asm/netlogic/common.h>
44#include <asm/netlogic/haldefs.h>
45#include <asm/netlogic/xlp-hal/iomap.h>
46#include <asm/netlogic/xlp-hal/xlp.h>
47
48#define XLPII_USB3_CTL_0 0xc0
49#define XLPII_VAUXRST BIT(0)
50#define XLPII_VCCRST BIT(1)
51#define XLPII_NUM2PORT 9
52#define XLPII_NUM3PORT 13
53#define XLPII_RTUNEREQ BIT(20)
54#define XLPII_MS_CSYSREQ BIT(21)
55#define XLPII_XS_CSYSREQ BIT(22)
56#define XLPII_RETENABLEN BIT(23)
57#define XLPII_TX2RX BIT(24)
58#define XLPII_XHCIREV BIT(25)
59#define XLPII_ECCDIS BIT(26)
60
61#define XLPII_USB3_INT_REG 0xc2
62#define XLPII_USB3_INT_MASK 0xc3
63
64#define XLPII_USB_PHY_TEST 0xc6
65#define XLPII_PRESET BIT(0)
66#define XLPII_ATERESET BIT(1)
67#define XLPII_LOOPEN BIT(2)
68#define XLPII_TESTPDHSP BIT(3)
69#define XLPII_TESTPDSSP BIT(4)
70#define XLPII_TESTBURNIN BIT(5)
71
72#define XLPII_USB_PHY_LOS_LV 0xc9
73#define XLPII_LOSLEV 0
74#define XLPII_LOSBIAS 5
75#define XLPII_SQRXTX 8
76#define XLPII_TXBOOST 11
77#define XLPII_RSLKSEL 16
78#define XLPII_FSEL 20
79
80#define XLPII_USB_RFCLK_REG 0xcc
81#define XLPII_VVLD 30
82
83#define nlm_read_usb_reg(b, r) nlm_read_reg(b, r)
84#define nlm_write_usb_reg(b, r, v) nlm_write_reg(b, r, v)
85
86#define nlm_xlpii_get_usb_pcibase(node, inst) \
87 nlm_pcicfg_base(XLP2XX_IO_USB_OFFSET(node, inst))
88#define nlm_xlpii_get_usb_regbase(node, inst) \
89 (nlm_xlpii_get_usb_pcibase(node, inst) + XLP_IO_PCI_HDRSZ)
90
91static void xlpii_usb_ack(struct irq_data *data)
92{
93 u64 port_addr;
94
95 switch (data->irq) {
96 case PIC_2XX_XHCI_0_IRQ:
97 port_addr = nlm_xlpii_get_usb_regbase(0, 1);
98 break;
99 case PIC_2XX_XHCI_1_IRQ:
100 port_addr = nlm_xlpii_get_usb_regbase(0, 2);
101 break;
102 case PIC_2XX_XHCI_2_IRQ:
103 port_addr = nlm_xlpii_get_usb_regbase(0, 3);
104 break;
105 default:
106 pr_err("No matching USB irq!\n");
107 return;
108 }
109 nlm_write_usb_reg(port_addr, XLPII_USB3_INT_REG, 0xffffffff);
110}
111
112static void nlm_xlpii_usb_hw_reset(int node, int port)
113{
114 u64 port_addr, xhci_base, pci_base;
115 void __iomem *corebase;
116 u32 val;
117
118 port_addr = nlm_xlpii_get_usb_regbase(node, port);
119
120 /* Set frequency */
121 val = nlm_read_usb_reg(port_addr, XLPII_USB_PHY_LOS_LV);
122 val &= ~(0x3f << XLPII_FSEL);
123 val |= (0x27 << XLPII_FSEL);
124 nlm_write_usb_reg(port_addr, XLPII_USB_PHY_LOS_LV, val);
125
126 val = nlm_read_usb_reg(port_addr, XLPII_USB_RFCLK_REG);
127 val |= (1 << XLPII_VVLD);
128 nlm_write_usb_reg(port_addr, XLPII_USB_RFCLK_REG, val);
129
130 /* PHY reset */
131 val = nlm_read_usb_reg(port_addr, XLPII_USB_PHY_TEST);
132 val &= (XLPII_ATERESET | XLPII_LOOPEN | XLPII_TESTPDHSP
133 | XLPII_TESTPDSSP | XLPII_TESTBURNIN);
134 nlm_write_usb_reg(port_addr, XLPII_USB_PHY_TEST, val);
135
136 /* Setup control register */
137 val = XLPII_VAUXRST | XLPII_VCCRST | (1 << XLPII_NUM2PORT)
138 | (1 << XLPII_NUM3PORT) | XLPII_MS_CSYSREQ | XLPII_XS_CSYSREQ
139 | XLPII_RETENABLEN | XLPII_XHCIREV;
140 nlm_write_usb_reg(port_addr, XLPII_USB3_CTL_0, val);
141
142 /* Enable interrupts */
143 nlm_write_usb_reg(port_addr, XLPII_USB3_INT_MASK, 0x00000001);
144
145 /* Clear all interrupts */
146 nlm_write_usb_reg(port_addr, XLPII_USB3_INT_REG, 0xffffffff);
147
148 udelay(2000);
149
150 /* XHCI configuration at PCI mem */
151 pci_base = nlm_xlpii_get_usb_pcibase(node, port);
152 xhci_base = nlm_read_usb_reg(pci_base, 0x4) & ~0xf;
153 corebase = ioremap(xhci_base, 0x10000);
154 if (!corebase)
155 return;
156
157 writel(0x240002, corebase + 0xc2c0);
158 /* GCTL 0xc110 */
159 val = readl(corebase + 0xc110);
160 val &= ~(0x3 << 12);
161 val |= (1 << 12);
162 writel(val, corebase + 0xc110);
163 udelay(100);
164
165 /* PHYCFG 0xc200 */
166 val = readl(corebase + 0xc200);
167 val &= ~(1 << 6);
168 writel(val, corebase + 0xc200);
169 udelay(100);
170
171 /* PIPECTL 0xc2c0 */
172 val = readl(corebase + 0xc2c0);
173 val &= ~(1 << 17);
174 writel(val, corebase + 0xc2c0);
175
176 iounmap(corebase);
177}
178
179static int __init nlm_platform_xlpii_usb_init(void)
180{
181 if (!cpu_is_xlpii())
182 return 0;
183
184 pr_info("Initializing 2XX USB Interface\n");
185 nlm_xlpii_usb_hw_reset(0, 1);
186 nlm_xlpii_usb_hw_reset(0, 2);
187 nlm_xlpii_usb_hw_reset(0, 3);
188 nlm_set_pic_extra_ack(0, PIC_2XX_XHCI_0_IRQ, xlpii_usb_ack);
189 nlm_set_pic_extra_ack(0, PIC_2XX_XHCI_1_IRQ, xlpii_usb_ack);
190 nlm_set_pic_extra_ack(0, PIC_2XX_XHCI_2_IRQ, xlpii_usb_ack);
191
192 return 0;
193}
194
195arch_initcall(nlm_platform_xlpii_usb_init);
196
197static u64 xlp_usb_dmamask = ~(u32)0;
198
199/* Fixup IRQ for USB devices on XLP the SoC PCIe bus */
200static void nlm_usb_fixup_final(struct pci_dev *dev)
201{
202 dev->dev.dma_mask = &xlp_usb_dmamask;
203 dev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
204 switch (dev->devfn) {
205 case 0x21:
206 dev->irq = PIC_2XX_XHCI_0_IRQ;
207 break;
208 case 0x22:
209 dev->irq = PIC_2XX_XHCI_1_IRQ;
210 break;
211 case 0x23:
212 dev->irq = PIC_2XX_XHCI_2_IRQ;
213 break;
214 }
215}
216
217DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_NETLOGIC, PCI_DEVICE_ID_NLM_XHCI,
218 nlm_usb_fixup_final);
diff --git a/arch/mips/netlogic/xlp/usb-init.c b/arch/mips/netlogic/xlp/usb-init.c
index ef3897ef0dc7..f8117985f0f8 100644
--- a/arch/mips/netlogic/xlp/usb-init.c
+++ b/arch/mips/netlogic/xlp/usb-init.c
@@ -75,8 +75,7 @@ static void nlm_usb_intr_en(int node, int port)
75 port_addr = nlm_get_usb_regbase(node, port); 75 port_addr = nlm_get_usb_regbase(node, port);
76 val = nlm_read_usb_reg(port_addr, USB_INT_EN); 76 val = nlm_read_usb_reg(port_addr, USB_INT_EN);
77 val = USB_CTRL_INTERRUPT_EN | USB_OHCI_INTERRUPT_EN | 77 val = USB_CTRL_INTERRUPT_EN | USB_OHCI_INTERRUPT_EN |
78 USB_OHCI_INTERRUPT1_EN | USB_CTRL_INTERRUPT_EN | 78 USB_OHCI_INTERRUPT1_EN | USB_OHCI_INTERRUPT2_EN;
79 USB_OHCI_INTERRUPT_EN | USB_OHCI_INTERRUPT2_EN;
80 nlm_write_usb_reg(port_addr, USB_INT_EN, val); 79 nlm_write_usb_reg(port_addr, USB_INT_EN, val);
81} 80}
82 81
@@ -100,6 +99,9 @@ static void nlm_usb_hw_reset(int node, int port)
100 99
101static int __init nlm_platform_usb_init(void) 100static int __init nlm_platform_usb_init(void)
102{ 101{
102 if (cpu_is_xlpii())
103 return 0;
104
103 pr_info("Initializing USB Interface\n"); 105 pr_info("Initializing USB Interface\n");
104 nlm_usb_hw_reset(0, 0); 106 nlm_usb_hw_reset(0, 0);
105 nlm_usb_hw_reset(0, 3); 107 nlm_usb_hw_reset(0, 3);
diff --git a/arch/mips/netlogic/xlp/wakeup.c b/arch/mips/netlogic/xlp/wakeup.c
index 0cce37cbffef..682d5638dc01 100644
--- a/arch/mips/netlogic/xlp/wakeup.c
+++ b/arch/mips/netlogic/xlp/wakeup.c
@@ -58,10 +58,12 @@ static int xlp_wakeup_core(uint64_t sysbase, int node, int core)
58 58
59 coremask = (1 << core); 59 coremask = (1 << core);
60 60
61 /* Enable CPU clock */ 61 /* Enable CPU clock in case of 8xx/3xx */
62 value = nlm_read_sys_reg(sysbase, SYS_CORE_DFS_DIS_CTRL); 62 if (!cpu_is_xlpii()) {
63 value &= ~coremask; 63 value = nlm_read_sys_reg(sysbase, SYS_CORE_DFS_DIS_CTRL);
64 nlm_write_sys_reg(sysbase, SYS_CORE_DFS_DIS_CTRL, value); 64 value &= ~coremask;
65 nlm_write_sys_reg(sysbase, SYS_CORE_DFS_DIS_CTRL, value);
66 }
65 67
66 /* Remove CPU Reset */ 68 /* Remove CPU Reset */
67 value = nlm_read_sys_reg(sysbase, SYS_CPU_RESET); 69 value = nlm_read_sys_reg(sysbase, SYS_CPU_RESET);
diff --git a/arch/mips/netlogic/xlr/fmn-config.c b/arch/mips/netlogic/xlr/fmn-config.c
index ed3bf0e3f309..c7622c6e5f67 100644
--- a/arch/mips/netlogic/xlr/fmn-config.c
+++ b/arch/mips/netlogic/xlr/fmn-config.c
@@ -36,6 +36,7 @@
36#include <linux/irq.h> 36#include <linux/irq.h>
37#include <linux/interrupt.h> 37#include <linux/interrupt.h>
38 38
39#include <asm/cpu.h>
39#include <asm/mipsregs.h> 40#include <asm/mipsregs.h>
40#include <asm/netlogic/xlr/fmn.h> 41#include <asm/netlogic/xlr/fmn.h>
41#include <asm/netlogic/xlr/xlr.h> 42#include <asm/netlogic/xlr/xlr.h>
@@ -187,7 +188,7 @@ void xlr_board_info_setup(void)
187 int processor_id, num_core; 188 int processor_id, num_core;
188 189
189 num_core = hweight32(nlm_current_node()->coremask); 190 num_core = hweight32(nlm_current_node()->coremask);
190 processor_id = read_c0_prid() & 0xff00; 191 processor_id = read_c0_prid() & PRID_IMP_MASK;
191 192
192 setup_cpu_fmninfo(cpu, num_core); 193 setup_cpu_fmninfo(cpu, num_core);
193 switch (processor_id) { 194 switch (processor_id) {
diff --git a/arch/mips/oprofile/common.c b/arch/mips/oprofile/common.c
index af763e838fdd..4d1736fc1955 100644
--- a/arch/mips/oprofile/common.c
+++ b/arch/mips/oprofile/common.c
@@ -12,6 +12,7 @@
12#include <linux/oprofile.h> 12#include <linux/oprofile.h>
13#include <linux/smp.h> 13#include <linux/smp.h>
14#include <asm/cpu-info.h> 14#include <asm/cpu-info.h>
15#include <asm/cpu-type.h>
15 16
16#include "op_impl.h" 17#include "op_impl.h"
17 18
@@ -33,7 +34,7 @@ static int op_mips_setup(void)
33 return 0; 34 return 0;
34} 35}
35 36
36static int op_mips_create_files(struct super_block *sb, struct dentry *root) 37static int op_mips_create_files(struct dentry *root)
37{ 38{
38 int i; 39 int i;
39 40
@@ -42,16 +43,16 @@ static int op_mips_create_files(struct super_block *sb, struct dentry *root)
42 char buf[4]; 43 char buf[4];
43 44
44 snprintf(buf, sizeof buf, "%d", i); 45 snprintf(buf, sizeof buf, "%d", i);
45 dir = oprofilefs_mkdir(sb, root, buf); 46 dir = oprofilefs_mkdir(root, buf);
46 47
47 oprofilefs_create_ulong(sb, dir, "enabled", &ctr[i].enabled); 48 oprofilefs_create_ulong(dir, "enabled", &ctr[i].enabled);
48 oprofilefs_create_ulong(sb, dir, "event", &ctr[i].event); 49 oprofilefs_create_ulong(dir, "event", &ctr[i].event);
49 oprofilefs_create_ulong(sb, dir, "count", &ctr[i].count); 50 oprofilefs_create_ulong(dir, "count", &ctr[i].count);
50 oprofilefs_create_ulong(sb, dir, "kernel", &ctr[i].kernel); 51 oprofilefs_create_ulong(dir, "kernel", &ctr[i].kernel);
51 oprofilefs_create_ulong(sb, dir, "user", &ctr[i].user); 52 oprofilefs_create_ulong(dir, "user", &ctr[i].user);
52 oprofilefs_create_ulong(sb, dir, "exl", &ctr[i].exl); 53 oprofilefs_create_ulong(dir, "exl", &ctr[i].exl);
53 /* Dummy. */ 54 /* Dummy. */
54 oprofilefs_create_ulong(sb, dir, "unit_mask", &ctr[i].unit_mask); 55 oprofilefs_create_ulong(dir, "unit_mask", &ctr[i].unit_mask);
55 } 56 }
56 57
57 return 0; 58 return 0;
diff --git a/arch/mips/pci/Makefile b/arch/mips/pci/Makefile
index c382042911dd..719e4557e22e 100644
--- a/arch/mips/pci/Makefile
+++ b/arch/mips/pci/Makefile
@@ -41,6 +41,7 @@ obj-$(CONFIG_SIBYTE_BCM1x80) += pci-bcm1480.o pci-bcm1480ht.o
41obj-$(CONFIG_SNI_RM) += fixup-sni.o ops-sni.o 41obj-$(CONFIG_SNI_RM) += fixup-sni.o ops-sni.o
42obj-$(CONFIG_LANTIQ) += fixup-lantiq.o 42obj-$(CONFIG_LANTIQ) += fixup-lantiq.o
43obj-$(CONFIG_PCI_LANTIQ) += pci-lantiq.o ops-lantiq.o 43obj-$(CONFIG_PCI_LANTIQ) += pci-lantiq.o ops-lantiq.o
44obj-$(CONFIG_SOC_RT3883) += pci-rt3883.o
44obj-$(CONFIG_TANBAC_TB0219) += fixup-tb0219.o 45obj-$(CONFIG_TANBAC_TB0219) += fixup-tb0219.o
45obj-$(CONFIG_TANBAC_TB0226) += fixup-tb0226.o 46obj-$(CONFIG_TANBAC_TB0226) += fixup-tb0226.o
46obj-$(CONFIG_TANBAC_TB0287) += fixup-tb0287.o 47obj-$(CONFIG_TANBAC_TB0287) += fixup-tb0287.o
diff --git a/arch/mips/pci/pci-bcm1480.c b/arch/mips/pci/pci-bcm1480.c
index 44dd5aa2e36f..5ec2a7bae02c 100644
--- a/arch/mips/pci/pci-bcm1480.c
+++ b/arch/mips/pci/pci-bcm1480.c
@@ -39,6 +39,7 @@
39#include <linux/mm.h> 39#include <linux/mm.h>
40#include <linux/console.h> 40#include <linux/console.h>
41#include <linux/tty.h> 41#include <linux/tty.h>
42#include <linux/vt.h>
42 43
43#include <asm/sibyte/bcm1480_regs.h> 44#include <asm/sibyte/bcm1480_regs.h>
44#include <asm/sibyte/bcm1480_scd.h> 45#include <asm/sibyte/bcm1480_scd.h>
diff --git a/arch/mips/pci/pci-octeon.c b/arch/mips/pci/pci-octeon.c
index 95c2ea815cac..59cccd95688b 100644
--- a/arch/mips/pci/pci-octeon.c
+++ b/arch/mips/pci/pci-octeon.c
@@ -586,15 +586,16 @@ static int __init octeon_pci_setup(void)
586 else 586 else
587 octeon_dma_bar_type = OCTEON_DMA_BAR_TYPE_BIG; 587 octeon_dma_bar_type = OCTEON_DMA_BAR_TYPE_BIG;
588 588
589 /* PCI I/O and PCI MEM values */
590 set_io_port_base(OCTEON_PCI_IOSPACE_BASE);
591 ioport_resource.start = 0;
592 ioport_resource.end = OCTEON_PCI_IOSPACE_SIZE - 1;
593 if (!octeon_is_pci_host()) { 589 if (!octeon_is_pci_host()) {
594 pr_notice("Not in host mode, PCI Controller not initialized\n"); 590 pr_notice("Not in host mode, PCI Controller not initialized\n");
595 return 0; 591 return 0;
596 } 592 }
597 593
594 /* PCI I/O and PCI MEM values */
595 set_io_port_base(OCTEON_PCI_IOSPACE_BASE);
596 ioport_resource.start = 0;
597 ioport_resource.end = OCTEON_PCI_IOSPACE_SIZE - 1;
598
598 pr_notice("%s Octeon big bar support\n", 599 pr_notice("%s Octeon big bar support\n",
599 (octeon_dma_bar_type == 600 (octeon_dma_bar_type ==
600 OCTEON_DMA_BAR_TYPE_BIG) ? "Enabling" : "Disabling"); 601 OCTEON_DMA_BAR_TYPE_BIG) ? "Enabling" : "Disabling");
diff --git a/arch/mips/pci/pci-rt3883.c b/arch/mips/pci/pci-rt3883.c
new file mode 100644
index 000000000000..95c9d41382e7
--- /dev/null
+++ b/arch/mips/pci/pci-rt3883.c
@@ -0,0 +1,636 @@
1/*
2 * Ralink RT3662/RT3883 SoC PCI support
3 *
4 * Copyright (C) 2011-2013 Gabor Juhos <juhosg@openwrt.org>
5 *
6 * Parts of this file are based on Ralink's 2.6.21 BSP
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License version 2 as published
10 * by the Free Software Foundation.
11 */
12
13#include <linux/types.h>
14#include <linux/pci.h>
15#include <linux/io.h>
16#include <linux/init.h>
17#include <linux/delay.h>
18#include <linux/interrupt.h>
19#include <linux/module.h>
20#include <linux/of.h>
21#include <linux/of_irq.h>
22#include <linux/of_pci.h>
23#include <linux/platform_device.h>
24
25#include <asm/mach-ralink/rt3883.h>
26#include <asm/mach-ralink/ralink_regs.h>
27
28#define RT3883_MEMORY_BASE 0x00000000
29#define RT3883_MEMORY_SIZE 0x02000000
30
31#define RT3883_PCI_REG_PCICFG 0x00
32#define RT3883_PCICFG_P2P_BR_DEVNUM_M 0xf
33#define RT3883_PCICFG_P2P_BR_DEVNUM_S 16
34#define RT3883_PCICFG_PCIRST BIT(1)
35#define RT3883_PCI_REG_PCIRAW 0x04
36#define RT3883_PCI_REG_PCIINT 0x08
37#define RT3883_PCI_REG_PCIENA 0x0c
38
39#define RT3883_PCI_REG_CFGADDR 0x20
40#define RT3883_PCI_REG_CFGDATA 0x24
41#define RT3883_PCI_REG_MEMBASE 0x28
42#define RT3883_PCI_REG_IOBASE 0x2c
43#define RT3883_PCI_REG_ARBCTL 0x80
44
45#define RT3883_PCI_REG_BASE(_x) (0x1000 + (_x) * 0x1000)
46#define RT3883_PCI_REG_BAR0SETUP(_x) (RT3883_PCI_REG_BASE((_x)) + 0x10)
47#define RT3883_PCI_REG_IMBASEBAR0(_x) (RT3883_PCI_REG_BASE((_x)) + 0x18)
48#define RT3883_PCI_REG_ID(_x) (RT3883_PCI_REG_BASE((_x)) + 0x30)
49#define RT3883_PCI_REG_CLASS(_x) (RT3883_PCI_REG_BASE((_x)) + 0x34)
50#define RT3883_PCI_REG_SUBID(_x) (RT3883_PCI_REG_BASE((_x)) + 0x38)
51#define RT3883_PCI_REG_STATUS(_x) (RT3883_PCI_REG_BASE((_x)) + 0x50)
52
53#define RT3883_PCI_MODE_NONE 0
54#define RT3883_PCI_MODE_PCI BIT(0)
55#define RT3883_PCI_MODE_PCIE BIT(1)
56#define RT3883_PCI_MODE_BOTH (RT3883_PCI_MODE_PCI | RT3883_PCI_MODE_PCIE)
57
58#define RT3883_PCI_IRQ_COUNT 32
59
60#define RT3883_P2P_BR_DEVNUM 1
61
62struct rt3883_pci_controller {
63 void __iomem *base;
64 spinlock_t lock;
65
66 struct device_node *intc_of_node;
67 struct irq_domain *irq_domain;
68
69 struct pci_controller pci_controller;
70 struct resource io_res;
71 struct resource mem_res;
72
73 bool pcie_ready;
74};
75
76static inline struct rt3883_pci_controller *
77pci_bus_to_rt3883_controller(struct pci_bus *bus)
78{
79 struct pci_controller *hose;
80
81 hose = (struct pci_controller *) bus->sysdata;
82 return container_of(hose, struct rt3883_pci_controller, pci_controller);
83}
84
85static inline u32 rt3883_pci_r32(struct rt3883_pci_controller *rpc,
86 unsigned reg)
87{
88 return ioread32(rpc->base + reg);
89}
90
91static inline void rt3883_pci_w32(struct rt3883_pci_controller *rpc,
92 u32 val, unsigned reg)
93{
94 iowrite32(val, rpc->base + reg);
95}
96
97static inline u32 rt3883_pci_get_cfgaddr(unsigned int bus, unsigned int slot,
98 unsigned int func, unsigned int where)
99{
100 return (bus << 16) | (slot << 11) | (func << 8) | (where & 0xfc) |
101 0x80000000;
102}
103
104static u32 rt3883_pci_read_cfg32(struct rt3883_pci_controller *rpc,
105 unsigned bus, unsigned slot,
106 unsigned func, unsigned reg)
107{
108 unsigned long flags;
109 u32 address;
110 u32 ret;
111
112 address = rt3883_pci_get_cfgaddr(bus, slot, func, reg);
113
114 spin_lock_irqsave(&rpc->lock, flags);
115 rt3883_pci_w32(rpc, address, RT3883_PCI_REG_CFGADDR);
116 ret = rt3883_pci_r32(rpc, RT3883_PCI_REG_CFGDATA);
117 spin_unlock_irqrestore(&rpc->lock, flags);
118
119 return ret;
120}
121
122static void rt3883_pci_write_cfg32(struct rt3883_pci_controller *rpc,
123 unsigned bus, unsigned slot,
124 unsigned func, unsigned reg, u32 val)
125{
126 unsigned long flags;
127 u32 address;
128
129 address = rt3883_pci_get_cfgaddr(bus, slot, func, reg);
130
131 spin_lock_irqsave(&rpc->lock, flags);
132 rt3883_pci_w32(rpc, address, RT3883_PCI_REG_CFGADDR);
133 rt3883_pci_w32(rpc, val, RT3883_PCI_REG_CFGDATA);
134 spin_unlock_irqrestore(&rpc->lock, flags);
135}
136
137static void rt3883_pci_irq_handler(unsigned int irq, struct irq_desc *desc)
138{
139 struct rt3883_pci_controller *rpc;
140 u32 pending;
141
142 rpc = irq_get_handler_data(irq);
143
144 pending = rt3883_pci_r32(rpc, RT3883_PCI_REG_PCIINT) &
145 rt3883_pci_r32(rpc, RT3883_PCI_REG_PCIENA);
146
147 if (!pending) {
148 spurious_interrupt();
149 return;
150 }
151
152 while (pending) {
153 unsigned bit = __ffs(pending);
154
155 irq = irq_find_mapping(rpc->irq_domain, bit);
156 generic_handle_irq(irq);
157
158 pending &= ~BIT(bit);
159 }
160}
161
162static void rt3883_pci_irq_unmask(struct irq_data *d)
163{
164 struct rt3883_pci_controller *rpc;
165 u32 t;
166
167 rpc = irq_data_get_irq_chip_data(d);
168
169 t = rt3883_pci_r32(rpc, RT3883_PCI_REG_PCIENA);
170 rt3883_pci_w32(rpc, t | BIT(d->hwirq), RT3883_PCI_REG_PCIENA);
171 /* flush write */
172 rt3883_pci_r32(rpc, RT3883_PCI_REG_PCIENA);
173}
174
175static void rt3883_pci_irq_mask(struct irq_data *d)
176{
177 struct rt3883_pci_controller *rpc;
178 u32 t;
179
180 rpc = irq_data_get_irq_chip_data(d);
181
182 t = rt3883_pci_r32(rpc, RT3883_PCI_REG_PCIENA);
183 rt3883_pci_w32(rpc, t & ~BIT(d->hwirq), RT3883_PCI_REG_PCIENA);
184 /* flush write */
185 rt3883_pci_r32(rpc, RT3883_PCI_REG_PCIENA);
186}
187
188static struct irq_chip rt3883_pci_irq_chip = {
189 .name = "RT3883 PCI",
190 .irq_mask = rt3883_pci_irq_mask,
191 .irq_unmask = rt3883_pci_irq_unmask,
192 .irq_mask_ack = rt3883_pci_irq_mask,
193};
194
195static int rt3883_pci_irq_map(struct irq_domain *d, unsigned int irq,
196 irq_hw_number_t hw)
197{
198 irq_set_chip_and_handler(irq, &rt3883_pci_irq_chip, handle_level_irq);
199 irq_set_chip_data(irq, d->host_data);
200
201 return 0;
202}
203
204static const struct irq_domain_ops rt3883_pci_irq_domain_ops = {
205 .map = rt3883_pci_irq_map,
206 .xlate = irq_domain_xlate_onecell,
207};
208
209static int rt3883_pci_irq_init(struct device *dev,
210 struct rt3883_pci_controller *rpc)
211{
212 int irq;
213
214 irq = irq_of_parse_and_map(rpc->intc_of_node, 0);
215 if (irq == 0) {
216 dev_err(dev, "%s has no IRQ",
217 of_node_full_name(rpc->intc_of_node));
218 return -EINVAL;
219 }
220
221 /* disable all interrupts */
222 rt3883_pci_w32(rpc, 0, RT3883_PCI_REG_PCIENA);
223
224 rpc->irq_domain =
225 irq_domain_add_linear(rpc->intc_of_node, RT3883_PCI_IRQ_COUNT,
226 &rt3883_pci_irq_domain_ops,
227 rpc);
228 if (!rpc->irq_domain) {
229 dev_err(dev, "unable to add IRQ domain\n");
230 return -ENODEV;
231 }
232
233 irq_set_handler_data(irq, rpc);
234 irq_set_chained_handler(irq, rt3883_pci_irq_handler);
235
236 return 0;
237}
238
239static int rt3883_pci_config_read(struct pci_bus *bus, unsigned int devfn,
240 int where, int size, u32 *val)
241{
242 struct rt3883_pci_controller *rpc;
243 unsigned long flags;
244 u32 address;
245 u32 data;
246
247 rpc = pci_bus_to_rt3883_controller(bus);
248
249 if (!rpc->pcie_ready && bus->number == 1)
250 return PCIBIOS_DEVICE_NOT_FOUND;
251
252 address = rt3883_pci_get_cfgaddr(bus->number, PCI_SLOT(devfn),
253 PCI_FUNC(devfn), where);
254
255 spin_lock_irqsave(&rpc->lock, flags);
256 rt3883_pci_w32(rpc, address, RT3883_PCI_REG_CFGADDR);
257 data = rt3883_pci_r32(rpc, RT3883_PCI_REG_CFGDATA);
258 spin_unlock_irqrestore(&rpc->lock, flags);
259
260 switch (size) {
261 case 1:
262 *val = (data >> ((where & 3) << 3)) & 0xff;
263 break;
264 case 2:
265 *val = (data >> ((where & 3) << 3)) & 0xffff;
266 break;
267 case 4:
268 *val = data;
269 break;
270 }
271
272 return PCIBIOS_SUCCESSFUL;
273}
274
275static int rt3883_pci_config_write(struct pci_bus *bus, unsigned int devfn,
276 int where, int size, u32 val)
277{
278 struct rt3883_pci_controller *rpc;
279 unsigned long flags;
280 u32 address;
281 u32 data;
282
283 rpc = pci_bus_to_rt3883_controller(bus);
284
285 if (!rpc->pcie_ready && bus->number == 1)
286 return PCIBIOS_DEVICE_NOT_FOUND;
287
288 address = rt3883_pci_get_cfgaddr(bus->number, PCI_SLOT(devfn),
289 PCI_FUNC(devfn), where);
290
291 spin_lock_irqsave(&rpc->lock, flags);
292 rt3883_pci_w32(rpc, address, RT3883_PCI_REG_CFGADDR);
293 data = rt3883_pci_r32(rpc, RT3883_PCI_REG_CFGDATA);
294
295 switch (size) {
296 case 1:
297 data = (data & ~(0xff << ((where & 3) << 3))) |
298 (val << ((where & 3) << 3));
299 break;
300 case 2:
301 data = (data & ~(0xffff << ((where & 3) << 3))) |
302 (val << ((where & 3) << 3));
303 break;
304 case 4:
305 data = val;
306 break;
307 }
308
309 rt3883_pci_w32(rpc, data, RT3883_PCI_REG_CFGDATA);
310 spin_unlock_irqrestore(&rpc->lock, flags);
311
312 return PCIBIOS_SUCCESSFUL;
313}
314
315static struct pci_ops rt3883_pci_ops = {
316 .read = rt3883_pci_config_read,
317 .write = rt3883_pci_config_write,
318};
319
320static void rt3883_pci_preinit(struct rt3883_pci_controller *rpc, unsigned mode)
321{
322 u32 syscfg1;
323 u32 rstctrl;
324 u32 clkcfg1;
325 u32 t;
326
327 rstctrl = rt_sysc_r32(RT3883_SYSC_REG_RSTCTRL);
328 syscfg1 = rt_sysc_r32(RT3883_SYSC_REG_SYSCFG1);
329 clkcfg1 = rt_sysc_r32(RT3883_SYSC_REG_CLKCFG1);
330
331 if (mode & RT3883_PCI_MODE_PCIE) {
332 rstctrl |= RT3883_RSTCTRL_PCIE;
333 rt_sysc_w32(rstctrl, RT3883_SYSC_REG_RSTCTRL);
334
335 /* setup PCI PAD drive mode */
336 syscfg1 &= ~(0x30);
337 syscfg1 |= (2 << 4);
338 rt_sysc_w32(syscfg1, RT3883_SYSC_REG_SYSCFG1);
339
340 t = rt_sysc_r32(RT3883_SYSC_REG_PCIE_CLK_GEN0);
341 t &= ~BIT(31);
342 rt_sysc_w32(t, RT3883_SYSC_REG_PCIE_CLK_GEN0);
343
344 t = rt_sysc_r32(RT3883_SYSC_REG_PCIE_CLK_GEN1);
345 t &= 0x80ffffff;
346 rt_sysc_w32(t, RT3883_SYSC_REG_PCIE_CLK_GEN1);
347
348 t = rt_sysc_r32(RT3883_SYSC_REG_PCIE_CLK_GEN1);
349 t |= 0xa << 24;
350 rt_sysc_w32(t, RT3883_SYSC_REG_PCIE_CLK_GEN1);
351
352 t = rt_sysc_r32(RT3883_SYSC_REG_PCIE_CLK_GEN0);
353 t |= BIT(31);
354 rt_sysc_w32(t, RT3883_SYSC_REG_PCIE_CLK_GEN0);
355
356 msleep(50);
357
358 rstctrl &= ~RT3883_RSTCTRL_PCIE;
359 rt_sysc_w32(rstctrl, RT3883_SYSC_REG_RSTCTRL);
360 }
361
362 syscfg1 |= (RT3883_SYSCFG1_PCIE_RC_MODE | RT3883_SYSCFG1_PCI_HOST_MODE);
363
364 clkcfg1 &= ~(RT3883_CLKCFG1_PCI_CLK_EN | RT3883_CLKCFG1_PCIE_CLK_EN);
365
366 if (mode & RT3883_PCI_MODE_PCI) {
367 clkcfg1 |= RT3883_CLKCFG1_PCI_CLK_EN;
368 rstctrl &= ~RT3883_RSTCTRL_PCI;
369 }
370
371 if (mode & RT3883_PCI_MODE_PCIE) {
372 clkcfg1 |= RT3883_CLKCFG1_PCIE_CLK_EN;
373 rstctrl &= ~RT3883_RSTCTRL_PCIE;
374 }
375
376 rt_sysc_w32(syscfg1, RT3883_SYSC_REG_SYSCFG1);
377 rt_sysc_w32(rstctrl, RT3883_SYSC_REG_RSTCTRL);
378 rt_sysc_w32(clkcfg1, RT3883_SYSC_REG_CLKCFG1);
379
380 msleep(500);
381
382 /*
383 * setup the device number of the P2P bridge
384 * and de-assert the reset line
385 */
386 t = (RT3883_P2P_BR_DEVNUM << RT3883_PCICFG_P2P_BR_DEVNUM_S);
387 rt3883_pci_w32(rpc, t, RT3883_PCI_REG_PCICFG);
388
389 /* flush write */
390 rt3883_pci_r32(rpc, RT3883_PCI_REG_PCICFG);
391 msleep(500);
392
393 if (mode & RT3883_PCI_MODE_PCIE) {
394 msleep(500);
395
396 t = rt3883_pci_r32(rpc, RT3883_PCI_REG_STATUS(1));
397
398 rpc->pcie_ready = t & BIT(0);
399
400 if (!rpc->pcie_ready) {
401 /* reset the PCIe block */
402 t = rt_sysc_r32(RT3883_SYSC_REG_RSTCTRL);
403 t |= RT3883_RSTCTRL_PCIE;
404 rt_sysc_w32(t, RT3883_SYSC_REG_RSTCTRL);
405 t &= ~RT3883_RSTCTRL_PCIE;
406 rt_sysc_w32(t, RT3883_SYSC_REG_RSTCTRL);
407
408 /* turn off PCIe clock */
409 t = rt_sysc_r32(RT3883_SYSC_REG_CLKCFG1);
410 t &= ~RT3883_CLKCFG1_PCIE_CLK_EN;
411 rt_sysc_w32(t, RT3883_SYSC_REG_CLKCFG1);
412
413 t = rt_sysc_r32(RT3883_SYSC_REG_PCIE_CLK_GEN0);
414 t &= ~0xf000c080;
415 rt_sysc_w32(t, RT3883_SYSC_REG_PCIE_CLK_GEN0);
416 }
417 }
418
419 /* enable PCI arbiter */
420 rt3883_pci_w32(rpc, 0x79, RT3883_PCI_REG_ARBCTL);
421}
422
423static int rt3883_pci_probe(struct platform_device *pdev)
424{
425 struct rt3883_pci_controller *rpc;
426 struct device *dev = &pdev->dev;
427 struct device_node *np = dev->of_node;
428 struct resource *res;
429 struct device_node *child;
430 u32 val;
431 int err;
432 int mode;
433
434 rpc = devm_kzalloc(dev, sizeof(*rpc), GFP_KERNEL);
435 if (!rpc)
436 return -ENOMEM;
437
438 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
439 if (!res)
440 return -EINVAL;
441
442 rpc->base = devm_ioremap_resource(dev, res);
443 if (IS_ERR(rpc->base))
444 return PTR_ERR(rpc->base);
445
446 /* find the interrupt controller child node */
447 for_each_child_of_node(np, child) {
448 if (of_get_property(child, "interrupt-controller", NULL) &&
449 of_node_get(child)) {
450 rpc->intc_of_node = child;
451 break;
452 }
453 }
454
455 if (!rpc->intc_of_node) {
456 dev_err(dev, "%s has no %s child node",
457 of_node_full_name(rpc->intc_of_node),
458 "interrupt controller");
459 return -EINVAL;
460 }
461
462 /* find the PCI host bridge child node */
463 for_each_child_of_node(np, child) {
464 if (child->type &&
465 of_node_cmp(child->type, "pci") == 0 &&
466 of_node_get(child)) {
467 rpc->pci_controller.of_node = child;
468 break;
469 }
470 }
471
472 if (!rpc->pci_controller.of_node) {
473 dev_err(dev, "%s has no %s child node",
474 of_node_full_name(rpc->intc_of_node),
475 "PCI host bridge");
476 err = -EINVAL;
477 goto err_put_intc_node;
478 }
479
480 mode = RT3883_PCI_MODE_NONE;
481 for_each_available_child_of_node(rpc->pci_controller.of_node, child) {
482 int devfn;
483
484 if (!child->type ||
485 of_node_cmp(child->type, "pci") != 0)
486 continue;
487
488 devfn = of_pci_get_devfn(child);
489 if (devfn < 0)
490 continue;
491
492 switch (PCI_SLOT(devfn)) {
493 case 1:
494 mode |= RT3883_PCI_MODE_PCIE;
495 break;
496
497 case 17:
498 case 18:
499 mode |= RT3883_PCI_MODE_PCI;
500 break;
501 }
502 }
503
504 if (mode == RT3883_PCI_MODE_NONE) {
505 dev_err(dev, "unable to determine PCI mode\n");
506 err = -EINVAL;
507 goto err_put_hb_node;
508 }
509
510 dev_info(dev, "mode:%s%s\n",
511 (mode & RT3883_PCI_MODE_PCI) ? " PCI" : "",
512 (mode & RT3883_PCI_MODE_PCIE) ? " PCIe" : "");
513
514 rt3883_pci_preinit(rpc, mode);
515
516 rpc->pci_controller.pci_ops = &rt3883_pci_ops;
517 rpc->pci_controller.io_resource = &rpc->io_res;
518 rpc->pci_controller.mem_resource = &rpc->mem_res;
519
520 /* Load PCI I/O and memory resources from DT */
521 pci_load_of_ranges(&rpc->pci_controller,
522 rpc->pci_controller.of_node);
523
524 rt3883_pci_w32(rpc, rpc->mem_res.start, RT3883_PCI_REG_MEMBASE);
525 rt3883_pci_w32(rpc, rpc->io_res.start, RT3883_PCI_REG_IOBASE);
526
527 ioport_resource.start = rpc->io_res.start;
528 ioport_resource.end = rpc->io_res.end;
529
530 /* PCI */
531 rt3883_pci_w32(rpc, 0x03ff0000, RT3883_PCI_REG_BAR0SETUP(0));
532 rt3883_pci_w32(rpc, RT3883_MEMORY_BASE, RT3883_PCI_REG_IMBASEBAR0(0));
533 rt3883_pci_w32(rpc, 0x08021814, RT3883_PCI_REG_ID(0));
534 rt3883_pci_w32(rpc, 0x00800001, RT3883_PCI_REG_CLASS(0));
535 rt3883_pci_w32(rpc, 0x28801814, RT3883_PCI_REG_SUBID(0));
536
537 /* PCIe */
538 rt3883_pci_w32(rpc, 0x03ff0000, RT3883_PCI_REG_BAR0SETUP(1));
539 rt3883_pci_w32(rpc, RT3883_MEMORY_BASE, RT3883_PCI_REG_IMBASEBAR0(1));
540 rt3883_pci_w32(rpc, 0x08021814, RT3883_PCI_REG_ID(1));
541 rt3883_pci_w32(rpc, 0x06040001, RT3883_PCI_REG_CLASS(1));
542 rt3883_pci_w32(rpc, 0x28801814, RT3883_PCI_REG_SUBID(1));
543
544 err = rt3883_pci_irq_init(dev, rpc);
545 if (err)
546 goto err_put_hb_node;
547
548 /* PCIe */
549 val = rt3883_pci_read_cfg32(rpc, 0, 0x01, 0, PCI_COMMAND);
550 val |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER;
551 rt3883_pci_write_cfg32(rpc, 0, 0x01, 0, PCI_COMMAND, val);
552
553 /* PCI */
554 val = rt3883_pci_read_cfg32(rpc, 0, 0x00, 0, PCI_COMMAND);
555 val |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER;
556 rt3883_pci_write_cfg32(rpc, 0, 0x00, 0, PCI_COMMAND, val);
557
558 if (mode == RT3883_PCI_MODE_PCIE) {
559 rt3883_pci_w32(rpc, 0x03ff0001, RT3883_PCI_REG_BAR0SETUP(0));
560 rt3883_pci_w32(rpc, 0x03ff0001, RT3883_PCI_REG_BAR0SETUP(1));
561
562 rt3883_pci_write_cfg32(rpc, 0, RT3883_P2P_BR_DEVNUM, 0,
563 PCI_BASE_ADDRESS_0,
564 RT3883_MEMORY_BASE);
565 /* flush write */
566 rt3883_pci_read_cfg32(rpc, 0, RT3883_P2P_BR_DEVNUM, 0,
567 PCI_BASE_ADDRESS_0);
568 } else {
569 rt3883_pci_write_cfg32(rpc, 0, RT3883_P2P_BR_DEVNUM, 0,
570 PCI_IO_BASE, 0x00000101);
571 }
572
573 register_pci_controller(&rpc->pci_controller);
574
575 return 0;
576
577err_put_hb_node:
578 of_node_put(rpc->pci_controller.of_node);
579err_put_intc_node:
580 of_node_put(rpc->intc_of_node);
581 return err;
582}
583
584int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
585{
586 struct of_irq dev_irq;
587 int err;
588 int irq;
589
590 err = of_irq_map_pci(dev, &dev_irq);
591 if (err) {
592 pr_err("pci %s: unable to get irq map, err=%d\n",
593 pci_name((struct pci_dev *) dev), err);
594 return 0;
595 }
596
597 irq = irq_create_of_mapping(dev_irq.controller,
598 dev_irq.specifier,
599 dev_irq.size);
600
601 if (irq == 0)
602 pr_crit("pci %s: no irq found for pin %u\n",
603 pci_name((struct pci_dev *) dev), pin);
604 else
605 pr_info("pci %s: using irq %d for pin %u\n",
606 pci_name((struct pci_dev *) dev), irq, pin);
607
608 return irq;
609}
610
611int pcibios_plat_dev_init(struct pci_dev *dev)
612{
613 return 0;
614}
615
616static const struct of_device_id rt3883_pci_ids[] = {
617 { .compatible = "ralink,rt3883-pci" },
618 {},
619};
620MODULE_DEVICE_TABLE(of, rt3883_pci_ids);
621
622static struct platform_driver rt3883_pci_driver = {
623 .probe = rt3883_pci_probe,
624 .driver = {
625 .name = "rt3883-pci",
626 .owner = THIS_MODULE,
627 .of_match_table = of_match_ptr(rt3883_pci_ids),
628 },
629};
630
631static int __init rt3883_pci_init(void)
632{
633 return platform_driver_register(&rt3883_pci_driver);
634}
635
636postcore_initcall(rt3883_pci_init);
diff --git a/arch/mips/pci/pci.c b/arch/mips/pci/pci.c
index 594e60d6a43b..33e7aa52d9c4 100644
--- a/arch/mips/pci/pci.c
+++ b/arch/mips/pci/pci.c
@@ -113,7 +113,6 @@ static void pcibios_scanbus(struct pci_controller *hose)
113 if (!pci_has_flag(PCI_PROBE_ONLY)) { 113 if (!pci_has_flag(PCI_PROBE_ONLY)) {
114 pci_bus_size_bridges(bus); 114 pci_bus_size_bridges(bus);
115 pci_bus_assign_resources(bus); 115 pci_bus_assign_resources(bus);
116 pci_enable_bridges(bus);
117 } 116 }
118 } 117 }
119} 118}
diff --git a/arch/mips/powertv/Kconfig b/arch/mips/powertv/Kconfig
index 1a1b03ea6398..dd91fbacbcba 100644
--- a/arch/mips/powertv/Kconfig
+++ b/arch/mips/powertv/Kconfig
@@ -1,14 +1,7 @@
1config BOOTLOADER_DRIVER
2 bool "PowerTV Bootloader Driver Support"
3 default n
4 depends on POWERTV
5 help
6 Use this option if you want to load bootloader driver.
7
8config BOOTLOADER_FAMILY 1config BOOTLOADER_FAMILY
9 string "POWERTV Bootloader Family string" 2 string "POWERTV Bootloader Family string"
10 default "85" 3 default "85"
11 depends on POWERTV && !BOOTLOADER_DRIVER 4 depends on POWERTV
12 help 5 help
13 This value should be specified when the bootloader driver is disabled 6 This value should be specified when the bootloader driver is disabled
14 and must be exactly two characters long. Families supported are: 7 and must be exactly two characters long. Families supported are:
diff --git a/arch/mips/powertv/asic/asic_devices.c b/arch/mips/powertv/asic/asic_devices.c
index 0238af1ba503..8380605d597d 100644
--- a/arch/mips/powertv/asic/asic_devices.c
+++ b/arch/mips/powertv/asic/asic_devices.c
@@ -147,20 +147,10 @@ static __init noinline void platform_set_family(void)
147 if (check_forcefamily(forced_family) == 0) 147 if (check_forcefamily(forced_family) == 0)
148 bootldr_family = BOOTLDRFAMILY(forced_family[0], 148 bootldr_family = BOOTLDRFAMILY(forced_family[0],
149 forced_family[1]); 149 forced_family[1]);
150 else { 150 else
151
152#ifdef CONFIG_BOOTLOADER_DRIVER
153 bootldr_family = (unsigned short) kbldr_GetSWFamily();
154#else
155#if defined(CONFIG_BOOTLOADER_FAMILY)
156 bootldr_family = (unsigned short) BOOTLDRFAMILY( 151 bootldr_family = (unsigned short) BOOTLDRFAMILY(
157 CONFIG_BOOTLOADER_FAMILY[0], 152 CONFIG_BOOTLOADER_FAMILY[0],
158 CONFIG_BOOTLOADER_FAMILY[1]); 153 CONFIG_BOOTLOADER_FAMILY[1]);
159#else
160#error "Unknown Bootloader Family"
161#endif
162#endif
163 }
164 154
165 pr_info("Bootloader Family = 0x%04X\n", bootldr_family); 155 pr_info("Bootloader Family = 0x%04X\n", bootldr_family);
166 156
diff --git a/arch/mips/powertv/init.c b/arch/mips/powertv/init.c
index a01baff52cae..498926377e51 100644
--- a/arch/mips/powertv/init.c
+++ b/arch/mips/powertv/init.c
@@ -87,8 +87,4 @@ void __init prom_init(void)
87 87
88 configure_platform(); 88 configure_platform();
89 prom_meminit(); 89 prom_meminit();
90
91#ifndef CONFIG_BOOTLOADER_DRIVER
92 pr_info("\nBootloader driver isn't loaded...\n");
93#endif
94} 90}
diff --git a/arch/mips/powertv/reset.c b/arch/mips/powertv/reset.c
index 0007652cb774..11c32fbf2784 100644
--- a/arch/mips/powertv/reset.c
+++ b/arch/mips/powertv/reset.c
@@ -21,24 +21,12 @@
21#include <linux/io.h> 21#include <linux/io.h>
22#include <asm/reboot.h> /* Not included by linux/reboot.h */ 22#include <asm/reboot.h> /* Not included by linux/reboot.h */
23 23
24#ifdef CONFIG_BOOTLOADER_DRIVER
25#include <asm/mach-powertv/kbldr.h>
26#endif
27
28#include <asm/mach-powertv/asic_regs.h> 24#include <asm/mach-powertv/asic_regs.h>
29#include "reset.h" 25#include "reset.h"
30 26
31static void mips_machine_restart(char *command) 27static void mips_machine_restart(char *command)
32{ 28{
33#ifdef CONFIG_BOOTLOADER_DRIVER
34 /*
35 * Call the bootloader's reset function to ensure
36 * that persistent data is flushed before hard reset
37 */
38 kbldr_SetCauseAndReset();
39#else
40 writel(0x1, asic_reg_addr(watchdog)); 29 writel(0x1, asic_reg_addr(watchdog));
41#endif
42} 30}
43 31
44void mips_reboot_setup(void) 32void mips_reboot_setup(void)
diff --git a/arch/mips/ralink/Kconfig b/arch/mips/ralink/Kconfig
index 026e823d871d..424f03496d14 100644
--- a/arch/mips/ralink/Kconfig
+++ b/arch/mips/ralink/Kconfig
@@ -1,5 +1,12 @@
1if RALINK 1if RALINK
2 2
3config CLKEVT_RT3352
4 bool
5 depends on SOC_RT305X || SOC_MT7620
6 default y
7 select CLKSRC_OF
8 select CLKSRC_MMIO
9
3choice 10choice
4 prompt "Ralink SoC selection" 11 prompt "Ralink SoC selection"
5 default SOC_RT305X 12 default SOC_RT305X
@@ -19,9 +26,12 @@ choice
19 bool "RT3883" 26 bool "RT3883"
20 select USB_ARCH_HAS_OHCI 27 select USB_ARCH_HAS_OHCI
21 select USB_ARCH_HAS_EHCI 28 select USB_ARCH_HAS_EHCI
29 select HW_HAS_PCI
22 30
23 config SOC_MT7620 31 config SOC_MT7620
24 bool "MT7620" 32 bool "MT7620"
33 select USB_ARCH_HAS_OHCI
34 select USB_ARCH_HAS_EHCI
25 35
26endchoice 36endchoice
27 37
diff --git a/arch/mips/ralink/Makefile b/arch/mips/ralink/Makefile
index 38cf1a880aaa..98ae349827be 100644
--- a/arch/mips/ralink/Makefile
+++ b/arch/mips/ralink/Makefile
@@ -6,7 +6,9 @@
6# Copyright (C) 2009-2011 Gabor Juhos <juhosg@openwrt.org> 6# Copyright (C) 2009-2011 Gabor Juhos <juhosg@openwrt.org>
7# Copyright (C) 2013 John Crispin <blogic@openwrt.org> 7# Copyright (C) 2013 John Crispin <blogic@openwrt.org>
8 8
9obj-y := prom.o of.o reset.o clk.o irq.o 9obj-y := prom.o of.o reset.o clk.o irq.o timer.o
10
11obj-$(CONFIG_CLKEVT_RT3352) += cevt-rt3352.o
10 12
11obj-$(CONFIG_SOC_RT288X) += rt288x.o 13obj-$(CONFIG_SOC_RT288X) += rt288x.o
12obj-$(CONFIG_SOC_RT305X) += rt305x.o 14obj-$(CONFIG_SOC_RT305X) += rt305x.o
diff --git a/arch/mips/ralink/Platform b/arch/mips/ralink/Platform
index cda4b6645c50..6d9c8c499f98 100644
--- a/arch/mips/ralink/Platform
+++ b/arch/mips/ralink/Platform
@@ -26,3 +26,4 @@ cflags-$(CONFIG_SOC_RT3883) += -I$(srctree)/arch/mips/include/asm/mach-ralink/rt
26# Ralink MT7620 26# Ralink MT7620
27# 27#
28load-$(CONFIG_SOC_MT7620) += 0xffffffff80000000 28load-$(CONFIG_SOC_MT7620) += 0xffffffff80000000
29cflags-$(CONFIG_SOC_MT7620) += -I$(srctree)/arch/mips/include/asm/mach-ralink/mt7620
diff --git a/arch/mips/ralink/cevt-rt3352.c b/arch/mips/ralink/cevt-rt3352.c
new file mode 100644
index 000000000000..cc17566d1934
--- /dev/null
+++ b/arch/mips/ralink/cevt-rt3352.c
@@ -0,0 +1,145 @@
1/*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details.
5 *
6 * Copyright (C) 2013 by John Crispin <blogic@openwrt.org>
7 */
8
9#include <linux/clockchips.h>
10#include <linux/clocksource.h>
11#include <linux/interrupt.h>
12#include <linux/reset.h>
13#include <linux/init.h>
14#include <linux/time.h>
15#include <linux/of.h>
16#include <linux/of_irq.h>
17#include <linux/of_address.h>
18
19#include <asm/mach-ralink/ralink_regs.h>
20
21#define SYSTICK_FREQ (50 * 1000)
22
23#define SYSTICK_CONFIG 0x00
24#define SYSTICK_COMPARE 0x04
25#define SYSTICK_COUNT 0x08
26
27/* route systick irq to mips irq 7 instead of the r4k-timer */
28#define CFG_EXT_STK_EN 0x2
29/* enable the counter */
30#define CFG_CNT_EN 0x1
31
32struct systick_device {
33 void __iomem *membase;
34 struct clock_event_device dev;
35 int irq_requested;
36 int freq_scale;
37};
38
39static void systick_set_clock_mode(enum clock_event_mode mode,
40 struct clock_event_device *evt);
41
42static int systick_next_event(unsigned long delta,
43 struct clock_event_device *evt)
44{
45 struct systick_device *sdev;
46 u32 count;
47
48 sdev = container_of(evt, struct systick_device, dev);
49 count = ioread32(sdev->membase + SYSTICK_COUNT);
50 count = (count + delta) % SYSTICK_FREQ;
51 iowrite32(count + delta, sdev->membase + SYSTICK_COMPARE);
52
53 return 0;
54}
55
56static void systick_event_handler(struct clock_event_device *dev)
57{
58 /* noting to do here */
59}
60
61static irqreturn_t systick_interrupt(int irq, void *dev_id)
62{
63 struct clock_event_device *dev = (struct clock_event_device *) dev_id;
64
65 dev->event_handler(dev);
66
67 return IRQ_HANDLED;
68}
69
70static struct systick_device systick = {
71 .dev = {
72 /*
73 * cevt-r4k uses 300, make sure systick
74 * gets used if available
75 */
76 .rating = 310,
77 .features = CLOCK_EVT_FEAT_ONESHOT,
78 .set_next_event = systick_next_event,
79 .set_mode = systick_set_clock_mode,
80 .event_handler = systick_event_handler,
81 },
82};
83
84static struct irqaction systick_irqaction = {
85 .handler = systick_interrupt,
86 .flags = IRQF_PERCPU | IRQF_TIMER,
87 .dev_id = &systick.dev,
88};
89
90static void systick_set_clock_mode(enum clock_event_mode mode,
91 struct clock_event_device *evt)
92{
93 struct systick_device *sdev;
94
95 sdev = container_of(evt, struct systick_device, dev);
96
97 switch (mode) {
98 case CLOCK_EVT_MODE_ONESHOT:
99 if (!sdev->irq_requested)
100 setup_irq(systick.dev.irq, &systick_irqaction);
101 sdev->irq_requested = 1;
102 iowrite32(CFG_EXT_STK_EN | CFG_CNT_EN,
103 systick.membase + SYSTICK_CONFIG);
104 break;
105
106 case CLOCK_EVT_MODE_SHUTDOWN:
107 if (sdev->irq_requested)
108 free_irq(systick.dev.irq, &systick_irqaction);
109 sdev->irq_requested = 0;
110 iowrite32(0, systick.membase + SYSTICK_CONFIG);
111 break;
112
113 default:
114 pr_err("%s: Unhandeled mips clock_mode\n", systick.dev.name);
115 break;
116 }
117}
118
119static void __init ralink_systick_init(struct device_node *np)
120{
121 systick.membase = of_iomap(np, 0);
122 if (!systick.membase)
123 return;
124
125 systick_irqaction.name = np->name;
126 systick.dev.name = np->name;
127 clockevents_calc_mult_shift(&systick.dev, SYSTICK_FREQ, 60);
128 systick.dev.max_delta_ns = clockevent_delta2ns(0x7fff, &systick.dev);
129 systick.dev.min_delta_ns = clockevent_delta2ns(0x3, &systick.dev);
130 systick.dev.irq = irq_of_parse_and_map(np, 0);
131 if (!systick.dev.irq) {
132 pr_err("%s: request_irq failed", np->name);
133 return;
134 }
135
136 clocksource_mmio_init(systick.membase + SYSTICK_COUNT, np->name,
137 SYSTICK_FREQ, 301, 16, clocksource_mmio_readl_up);
138
139 clockevents_register_device(&systick.dev);
140
141 pr_info("%s: runing - mult: %d, shift: %d\n",
142 np->name, systick.dev.mult, systick.dev.shift);
143}
144
145CLOCKSOURCE_OF_DECLARE(systick, "ralink,cevt-systick", ralink_systick_init);
diff --git a/arch/mips/ralink/clk.c b/arch/mips/ralink/clk.c
index 8dfa22ff300b..bba0cdfd83bc 100644
--- a/arch/mips/ralink/clk.c
+++ b/arch/mips/ralink/clk.c
@@ -69,4 +69,5 @@ void __init plat_time_init(void)
69 pr_info("CPU Clock: %ldMHz\n", clk_get_rate(clk) / 1000000); 69 pr_info("CPU Clock: %ldMHz\n", clk_get_rate(clk) / 1000000);
70 mips_hpt_frequency = clk_get_rate(clk) / 2; 70 mips_hpt_frequency = clk_get_rate(clk) / 2;
71 clk_put(clk); 71 clk_put(clk);
72 clocksource_of_init();
72} 73}
diff --git a/arch/mips/ralink/common.h b/arch/mips/ralink/common.h
index 83144c3fc5ac..42dfd6100a2d 100644
--- a/arch/mips/ralink/common.h
+++ b/arch/mips/ralink/common.h
@@ -46,6 +46,8 @@ extern void ralink_of_remap(void);
46extern void ralink_clk_init(void); 46extern void ralink_clk_init(void);
47extern void ralink_clk_add(const char *dev, unsigned long rate); 47extern void ralink_clk_add(const char *dev, unsigned long rate);
48 48
49extern void ralink_rst_init(void);
50
49extern void prom_soc_init(struct ralink_soc_info *soc_info); 51extern void prom_soc_init(struct ralink_soc_info *soc_info);
50 52
51__iomem void *plat_of_remap_node(const char *node); 53__iomem void *plat_of_remap_node(const char *node);
diff --git a/arch/mips/ralink/mt7620.c b/arch/mips/ralink/mt7620.c
index 0018b1a661f6..d217509e5300 100644
--- a/arch/mips/ralink/mt7620.c
+++ b/arch/mips/ralink/mt7620.c
@@ -23,9 +23,6 @@
23/* does the board have sdram or ddram */ 23/* does the board have sdram or ddram */
24static int dram_type; 24static int dram_type;
25 25
26/* the pll dividers */
27static u32 mt7620_clk_divider[] = { 2, 3, 4, 8 };
28
29static struct ralink_pinmux_grp mode_mux[] = { 26static struct ralink_pinmux_grp mode_mux[] = {
30 { 27 {
31 .name = "i2c", 28 .name = "i2c",
@@ -140,34 +137,189 @@ struct ralink_pinmux rt_gpio_pinmux = {
140 .uart_mask = MT7620_GPIO_MODE_UART0_MASK, 137 .uart_mask = MT7620_GPIO_MODE_UART0_MASK,
141}; 138};
142 139
143void __init ralink_clk_init(void) 140static __init u32
141mt7620_calc_rate(u32 ref_rate, u32 mul, u32 div)
144{ 142{
145 unsigned long cpu_rate, sys_rate; 143 u64 t;
146 u32 c0 = rt_sysc_r32(SYSC_REG_CPLL_CONFIG0);
147 u32 c1 = rt_sysc_r32(SYSC_REG_CPLL_CONFIG1);
148 u32 swconfig = (c0 >> CPLL_SW_CONFIG_SHIFT) & CPLL_SW_CONFIG_MASK;
149 u32 cpu_clk = (c1 >> CPLL_CPU_CLK_SHIFT) & CPLL_CPU_CLK_MASK;
150
151 if (cpu_clk) {
152 cpu_rate = 480000000;
153 } else if (!swconfig) {
154 cpu_rate = 600000000;
155 } else {
156 u32 m = (c0 >> CPLL_MULT_RATIO_SHIFT) & CPLL_MULT_RATIO;
157 u32 d = (c0 >> CPLL_DIV_RATIO_SHIFT) & CPLL_DIV_RATIO;
158 144
159 cpu_rate = ((40 * (m + 24)) / mt7620_clk_divider[d]) * 1000000; 145 t = ref_rate;
160 } 146 t *= mul;
147 do_div(t, div);
148
149 return t;
150}
151
152#define MHZ(x) ((x) * 1000 * 1000)
153
154static __init unsigned long
155mt7620_get_xtal_rate(void)
156{
157 u32 reg;
158
159 reg = rt_sysc_r32(SYSC_REG_SYSTEM_CONFIG0);
160 if (reg & SYSCFG0_XTAL_FREQ_SEL)
161 return MHZ(40);
162
163 return MHZ(20);
164}
165
166static __init unsigned long
167mt7620_get_periph_rate(unsigned long xtal_rate)
168{
169 u32 reg;
170
171 reg = rt_sysc_r32(SYSC_REG_CLKCFG0);
172 if (reg & CLKCFG0_PERI_CLK_SEL)
173 return xtal_rate;
174
175 return MHZ(40);
176}
177
178static const u32 mt7620_clk_divider[] __initconst = { 2, 3, 4, 8 };
179
180static __init unsigned long
181mt7620_get_cpu_pll_rate(unsigned long xtal_rate)
182{
183 u32 reg;
184 u32 mul;
185 u32 div;
186
187 reg = rt_sysc_r32(SYSC_REG_CPLL_CONFIG0);
188 if (reg & CPLL_CFG0_BYPASS_REF_CLK)
189 return xtal_rate;
190
191 if ((reg & CPLL_CFG0_SW_CFG) == 0)
192 return MHZ(600);
193
194 mul = (reg >> CPLL_CFG0_PLL_MULT_RATIO_SHIFT) &
195 CPLL_CFG0_PLL_MULT_RATIO_MASK;
196 mul += 24;
197 if (reg & CPLL_CFG0_LC_CURFCK)
198 mul *= 2;
199
200 div = (reg >> CPLL_CFG0_PLL_DIV_RATIO_SHIFT) &
201 CPLL_CFG0_PLL_DIV_RATIO_MASK;
202
203 WARN_ON(div >= ARRAY_SIZE(mt7620_clk_divider));
204
205 return mt7620_calc_rate(xtal_rate, mul, mt7620_clk_divider[div]);
206}
207
208static __init unsigned long
209mt7620_get_pll_rate(unsigned long xtal_rate, unsigned long cpu_pll_rate)
210{
211 u32 reg;
212
213 reg = rt_sysc_r32(SYSC_REG_CPLL_CONFIG1);
214 if (reg & CPLL_CFG1_CPU_AUX1)
215 return xtal_rate;
216
217 if (reg & CPLL_CFG1_CPU_AUX0)
218 return MHZ(480);
161 219
220 return cpu_pll_rate;
221}
222
223static __init unsigned long
224mt7620_get_cpu_rate(unsigned long pll_rate)
225{
226 u32 reg;
227 u32 mul;
228 u32 div;
229
230 reg = rt_sysc_r32(SYSC_REG_CPU_SYS_CLKCFG);
231
232 mul = reg & CPU_SYS_CLKCFG_CPU_FFRAC_MASK;
233 div = (reg >> CPU_SYS_CLKCFG_CPU_FDIV_SHIFT) &
234 CPU_SYS_CLKCFG_CPU_FDIV_MASK;
235
236 return mt7620_calc_rate(pll_rate, mul, div);
237}
238
239static const u32 mt7620_ocp_dividers[16] __initconst = {
240 [CPU_SYS_CLKCFG_OCP_RATIO_2] = 2,
241 [CPU_SYS_CLKCFG_OCP_RATIO_3] = 3,
242 [CPU_SYS_CLKCFG_OCP_RATIO_4] = 4,
243 [CPU_SYS_CLKCFG_OCP_RATIO_5] = 5,
244 [CPU_SYS_CLKCFG_OCP_RATIO_10] = 10,
245};
246
247static __init unsigned long
248mt7620_get_dram_rate(unsigned long pll_rate)
249{
162 if (dram_type == SYSCFG0_DRAM_TYPE_SDRAM) 250 if (dram_type == SYSCFG0_DRAM_TYPE_SDRAM)
163 sys_rate = cpu_rate / 4; 251 return pll_rate / 4;
164 else 252
165 sys_rate = cpu_rate / 3; 253 return pll_rate / 3;
254}
255
256static __init unsigned long
257mt7620_get_sys_rate(unsigned long cpu_rate)
258{
259 u32 reg;
260 u32 ocp_ratio;
261 u32 div;
262
263 reg = rt_sysc_r32(SYSC_REG_CPU_SYS_CLKCFG);
264
265 ocp_ratio = (reg >> CPU_SYS_CLKCFG_OCP_RATIO_SHIFT) &
266 CPU_SYS_CLKCFG_OCP_RATIO_MASK;
267
268 if (WARN_ON(ocp_ratio >= ARRAY_SIZE(mt7620_ocp_dividers)))
269 return cpu_rate;
270
271 div = mt7620_ocp_dividers[ocp_ratio];
272 if (WARN(!div, "invalid divider for OCP ratio %u", ocp_ratio))
273 return cpu_rate;
274
275 return cpu_rate / div;
276}
277
278void __init ralink_clk_init(void)
279{
280 unsigned long xtal_rate;
281 unsigned long cpu_pll_rate;
282 unsigned long pll_rate;
283 unsigned long cpu_rate;
284 unsigned long sys_rate;
285 unsigned long dram_rate;
286 unsigned long periph_rate;
287
288 xtal_rate = mt7620_get_xtal_rate();
289
290 cpu_pll_rate = mt7620_get_cpu_pll_rate(xtal_rate);
291 pll_rate = mt7620_get_pll_rate(xtal_rate, cpu_pll_rate);
292
293 cpu_rate = mt7620_get_cpu_rate(pll_rate);
294 dram_rate = mt7620_get_dram_rate(pll_rate);
295 sys_rate = mt7620_get_sys_rate(cpu_rate);
296 periph_rate = mt7620_get_periph_rate(xtal_rate);
297
298#define RFMT(label) label ":%lu.%03luMHz "
299#define RINT(x) ((x) / 1000000)
300#define RFRAC(x) (((x) / 1000) % 1000)
301
302 pr_debug(RFMT("XTAL") RFMT("CPU_PLL") RFMT("PLL"),
303 RINT(xtal_rate), RFRAC(xtal_rate),
304 RINT(cpu_pll_rate), RFRAC(cpu_pll_rate),
305 RINT(pll_rate), RFRAC(pll_rate));
306
307 pr_debug(RFMT("CPU") RFMT("DRAM") RFMT("SYS") RFMT("PERIPH"),
308 RINT(cpu_rate), RFRAC(cpu_rate),
309 RINT(dram_rate), RFRAC(dram_rate),
310 RINT(sys_rate), RFRAC(sys_rate),
311 RINT(periph_rate), RFRAC(periph_rate));
312
313#undef RFRAC
314#undef RINT
315#undef RFMT
166 316
167 ralink_clk_add("cpu", cpu_rate); 317 ralink_clk_add("cpu", cpu_rate);
168 ralink_clk_add("10000100.timer", 40000000); 318 ralink_clk_add("10000100.timer", periph_rate);
169 ralink_clk_add("10000500.uart", 40000000); 319 ralink_clk_add("10000120.watchdog", periph_rate);
170 ralink_clk_add("10000c00.uartlite", 40000000); 320 ralink_clk_add("10000500.uart", periph_rate);
321 ralink_clk_add("10000b00.spi", sys_rate);
322 ralink_clk_add("10000c00.uartlite", periph_rate);
171} 323}
172 324
173void __init ralink_of_remap(void) 325void __init ralink_of_remap(void)
@@ -214,16 +366,19 @@ void prom_soc_init(struct ralink_soc_info *soc_info)
214 366
215 switch (dram_type) { 367 switch (dram_type) {
216 case SYSCFG0_DRAM_TYPE_SDRAM: 368 case SYSCFG0_DRAM_TYPE_SDRAM:
369 pr_info("Board has SDRAM\n");
217 soc_info->mem_size_min = MT7620_SDRAM_SIZE_MIN; 370 soc_info->mem_size_min = MT7620_SDRAM_SIZE_MIN;
218 soc_info->mem_size_max = MT7620_SDRAM_SIZE_MAX; 371 soc_info->mem_size_max = MT7620_SDRAM_SIZE_MAX;
219 break; 372 break;
220 373
221 case SYSCFG0_DRAM_TYPE_DDR1: 374 case SYSCFG0_DRAM_TYPE_DDR1:
375 pr_info("Board has DDR1\n");
222 soc_info->mem_size_min = MT7620_DDR1_SIZE_MIN; 376 soc_info->mem_size_min = MT7620_DDR1_SIZE_MIN;
223 soc_info->mem_size_max = MT7620_DDR1_SIZE_MAX; 377 soc_info->mem_size_max = MT7620_DDR1_SIZE_MAX;
224 break; 378 break;
225 379
226 case SYSCFG0_DRAM_TYPE_DDR2: 380 case SYSCFG0_DRAM_TYPE_DDR2:
381 pr_info("Board has DDR2\n");
227 soc_info->mem_size_min = MT7620_DDR2_SIZE_MIN; 382 soc_info->mem_size_min = MT7620_DDR2_SIZE_MIN;
228 soc_info->mem_size_max = MT7620_DDR2_SIZE_MAX; 383 soc_info->mem_size_max = MT7620_DDR2_SIZE_MAX;
229 break; 384 break;
diff --git a/arch/mips/ralink/of.c b/arch/mips/ralink/of.c
index f25ea5b45051..ce38d11f9da5 100644
--- a/arch/mips/ralink/of.c
+++ b/arch/mips/ralink/of.c
@@ -110,6 +110,9 @@ static int __init plat_of_setup(void)
110 if (of_platform_populate(NULL, of_ids, NULL, NULL)) 110 if (of_platform_populate(NULL, of_ids, NULL, NULL))
111 panic("failed to populate DT\n"); 111 panic("failed to populate DT\n");
112 112
113 /* make sure ithat the reset controller is setup early */
114 ralink_rst_init();
115
113 return 0; 116 return 0;
114} 117}
115 118
diff --git a/arch/mips/ralink/reset.c b/arch/mips/ralink/reset.c
index 22120e512e7e..55c7ec59df3c 100644
--- a/arch/mips/ralink/reset.c
+++ b/arch/mips/ralink/reset.c
@@ -10,6 +10,8 @@
10 10
11#include <linux/pm.h> 11#include <linux/pm.h>
12#include <linux/io.h> 12#include <linux/io.h>
13#include <linux/of.h>
14#include <linux/reset-controller.h>
13 15
14#include <asm/reboot.h> 16#include <asm/reboot.h>
15 17
@@ -19,6 +21,66 @@
19#define SYSC_REG_RESET_CTRL 0x034 21#define SYSC_REG_RESET_CTRL 0x034
20#define RSTCTL_RESET_SYSTEM BIT(0) 22#define RSTCTL_RESET_SYSTEM BIT(0)
21 23
24static int ralink_assert_device(struct reset_controller_dev *rcdev,
25 unsigned long id)
26{
27 u32 val;
28
29 if (id < 8)
30 return -1;
31
32 val = rt_sysc_r32(SYSC_REG_RESET_CTRL);
33 val |= BIT(id);
34 rt_sysc_w32(val, SYSC_REG_RESET_CTRL);
35
36 return 0;
37}
38
39static int ralink_deassert_device(struct reset_controller_dev *rcdev,
40 unsigned long id)
41{
42 u32 val;
43
44 if (id < 8)
45 return -1;
46
47 val = rt_sysc_r32(SYSC_REG_RESET_CTRL);
48 val &= ~BIT(id);
49 rt_sysc_w32(val, SYSC_REG_RESET_CTRL);
50
51 return 0;
52}
53
54static int ralink_reset_device(struct reset_controller_dev *rcdev,
55 unsigned long id)
56{
57 ralink_assert_device(rcdev, id);
58 return ralink_deassert_device(rcdev, id);
59}
60
61static struct reset_control_ops reset_ops = {
62 .reset = ralink_reset_device,
63 .assert = ralink_assert_device,
64 .deassert = ralink_deassert_device,
65};
66
67static struct reset_controller_dev reset_dev = {
68 .ops = &reset_ops,
69 .owner = THIS_MODULE,
70 .nr_resets = 32,
71 .of_reset_n_cells = 1,
72};
73
74void ralink_rst_init(void)
75{
76 reset_dev.of_node = of_find_compatible_node(NULL, NULL,
77 "ralink,rt2880-reset");
78 if (!reset_dev.of_node)
79 pr_err("Failed to find reset controller node");
80 else
81 reset_controller_register(&reset_dev);
82}
83
22static void ralink_restart(char *command) 84static void ralink_restart(char *command)
23{ 85{
24 local_irq_disable(); 86 local_irq_disable();
diff --git a/arch/mips/ralink/timer.c b/arch/mips/ralink/timer.c
new file mode 100644
index 000000000000..e49241a2c39a
--- /dev/null
+++ b/arch/mips/ralink/timer.c
@@ -0,0 +1,185 @@
1/*
2 * This program is free software; you can redistribute it and/or modify it
3 * under the terms of the GNU General Public License version 2 as published
4 * by the Free Software Foundation.
5 *
6 * Copyright (C) 2013 John Crispin <blogic@openwrt.org>
7*/
8
9#include <linux/module.h>
10#include <linux/platform_device.h>
11#include <linux/interrupt.h>
12#include <linux/timer.h>
13#include <linux/of_gpio.h>
14#include <linux/clk.h>
15
16#include <asm/mach-ralink/ralink_regs.h>
17
18#define TIMER_REG_TMRSTAT 0x00
19#define TIMER_REG_TMR0LOAD 0x10
20#define TIMER_REG_TMR0CTL 0x18
21
22#define TMRSTAT_TMR0INT BIT(0)
23
24#define TMR0CTL_ENABLE BIT(7)
25#define TMR0CTL_MODE_PERIODIC BIT(4)
26#define TMR0CTL_PRESCALER 1
27#define TMR0CTL_PRESCALE_VAL (0xf - TMR0CTL_PRESCALER)
28#define TMR0CTL_PRESCALE_DIV (65536 / BIT(TMR0CTL_PRESCALER))
29
30struct rt_timer {
31 struct device *dev;
32 void __iomem *membase;
33 int irq;
34 unsigned long timer_freq;
35 unsigned long timer_div;
36};
37
38static inline void rt_timer_w32(struct rt_timer *rt, u8 reg, u32 val)
39{
40 __raw_writel(val, rt->membase + reg);
41}
42
43static inline u32 rt_timer_r32(struct rt_timer *rt, u8 reg)
44{
45 return __raw_readl(rt->membase + reg);
46}
47
48static irqreturn_t rt_timer_irq(int irq, void *_rt)
49{
50 struct rt_timer *rt = (struct rt_timer *) _rt;
51
52 rt_timer_w32(rt, TIMER_REG_TMR0LOAD, rt->timer_freq / rt->timer_div);
53 rt_timer_w32(rt, TIMER_REG_TMRSTAT, TMRSTAT_TMR0INT);
54
55 return IRQ_HANDLED;
56}
57
58
59static int rt_timer_request(struct rt_timer *rt)
60{
61 int err = request_irq(rt->irq, rt_timer_irq, IRQF_DISABLED,
62 dev_name(rt->dev), rt);
63 if (err) {
64 dev_err(rt->dev, "failed to request irq\n");
65 } else {
66 u32 t = TMR0CTL_MODE_PERIODIC | TMR0CTL_PRESCALE_VAL;
67 rt_timer_w32(rt, TIMER_REG_TMR0CTL, t);
68 }
69 return err;
70}
71
72static void rt_timer_free(struct rt_timer *rt)
73{
74 free_irq(rt->irq, rt);
75}
76
77static int rt_timer_config(struct rt_timer *rt, unsigned long divisor)
78{
79 if (rt->timer_freq < divisor)
80 rt->timer_div = rt->timer_freq;
81 else
82 rt->timer_div = divisor;
83
84 rt_timer_w32(rt, TIMER_REG_TMR0LOAD, rt->timer_freq / rt->timer_div);
85
86 return 0;
87}
88
89static int rt_timer_enable(struct rt_timer *rt)
90{
91 u32 t;
92
93 rt_timer_w32(rt, TIMER_REG_TMR0LOAD, rt->timer_freq / rt->timer_div);
94
95 t = rt_timer_r32(rt, TIMER_REG_TMR0CTL);
96 t |= TMR0CTL_ENABLE;
97 rt_timer_w32(rt, TIMER_REG_TMR0CTL, t);
98
99 return 0;
100}
101
102static void rt_timer_disable(struct rt_timer *rt)
103{
104 u32 t;
105
106 t = rt_timer_r32(rt, TIMER_REG_TMR0CTL);
107 t &= ~TMR0CTL_ENABLE;
108 rt_timer_w32(rt, TIMER_REG_TMR0CTL, t);
109}
110
111static int rt_timer_probe(struct platform_device *pdev)
112{
113 struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
114 struct rt_timer *rt;
115 struct clk *clk;
116
117 rt = devm_kzalloc(&pdev->dev, sizeof(*rt), GFP_KERNEL);
118 if (!rt) {
119 dev_err(&pdev->dev, "failed to allocate memory\n");
120 return -ENOMEM;
121 }
122
123 rt->irq = platform_get_irq(pdev, 0);
124 if (!rt->irq) {
125 dev_err(&pdev->dev, "failed to load irq\n");
126 return -ENOENT;
127 }
128
129 rt->membase = devm_request_and_ioremap(&pdev->dev, res);
130 if (IS_ERR(rt->membase))
131 return PTR_ERR(rt->membase);
132
133 clk = devm_clk_get(&pdev->dev, NULL);
134 if (IS_ERR(clk)) {
135 dev_err(&pdev->dev, "failed get clock rate\n");
136 return PTR_ERR(clk);
137 }
138
139 rt->timer_freq = clk_get_rate(clk) / TMR0CTL_PRESCALE_DIV;
140 if (!rt->timer_freq)
141 return -EINVAL;
142
143 rt->dev = &pdev->dev;
144 platform_set_drvdata(pdev, rt);
145
146 rt_timer_request(rt);
147 rt_timer_config(rt, 2);
148 rt_timer_enable(rt);
149
150 dev_info(&pdev->dev, "maximum frequncy is %luHz\n", rt->timer_freq);
151
152 return 0;
153}
154
155static int rt_timer_remove(struct platform_device *pdev)
156{
157 struct rt_timer *rt = platform_get_drvdata(pdev);
158
159 rt_timer_disable(rt);
160 rt_timer_free(rt);
161
162 return 0;
163}
164
165static const struct of_device_id rt_timer_match[] = {
166 { .compatible = "ralink,rt2880-timer" },
167 {},
168};
169MODULE_DEVICE_TABLE(of, rt_timer_match);
170
171static struct platform_driver rt_timer_driver = {
172 .probe = rt_timer_probe,
173 .remove = rt_timer_remove,
174 .driver = {
175 .name = "rt-timer",
176 .owner = THIS_MODULE,
177 .of_match_table = rt_timer_match
178 },
179};
180
181module_platform_driver(rt_timer_driver);
182
183MODULE_DESCRIPTION("Ralink RT2880 timer");
184MODULE_AUTHOR("John Crispin <blogic@openwrt.org");
185MODULE_LICENSE("GPL");
diff --git a/arch/mips/sibyte/bcm1480/setup.c b/arch/mips/sibyte/bcm1480/setup.c
index 05ed92c92b69..8e2e04f77870 100644
--- a/arch/mips/sibyte/bcm1480/setup.c
+++ b/arch/mips/sibyte/bcm1480/setup.c
@@ -22,6 +22,7 @@
22#include <linux/string.h> 22#include <linux/string.h>
23 23
24#include <asm/bootinfo.h> 24#include <asm/bootinfo.h>
25#include <asm/cpu.h>
25#include <asm/mipsregs.h> 26#include <asm/mipsregs.h>
26#include <asm/io.h> 27#include <asm/io.h>
27#include <asm/sibyte/sb1250.h> 28#include <asm/sibyte/sb1250.h>
@@ -119,7 +120,7 @@ void __init bcm1480_setup(void)
119 uint64_t sys_rev; 120 uint64_t sys_rev;
120 int plldiv; 121 int plldiv;
121 122
122 sb1_pass = read_c0_prid() & 0xff; 123 sb1_pass = read_c0_prid() & PRID_REV_MASK;
123 sys_rev = __raw_readq(IOADDR(A_SCD_SYSTEM_REVISION)); 124 sys_rev = __raw_readq(IOADDR(A_SCD_SYSTEM_REVISION));
124 soc_type = SYS_SOC_TYPE(sys_rev); 125 soc_type = SYS_SOC_TYPE(sys_rev);
125 part_type = G_SYS_PART(sys_rev); 126 part_type = G_SYS_PART(sys_rev);
diff --git a/arch/mips/sibyte/sb1250/setup.c b/arch/mips/sibyte/sb1250/setup.c
index a14bd4cb0bc0..3c02b2a77ae9 100644
--- a/arch/mips/sibyte/sb1250/setup.c
+++ b/arch/mips/sibyte/sb1250/setup.c
@@ -22,6 +22,7 @@
22#include <linux/string.h> 22#include <linux/string.h>
23 23
24#include <asm/bootinfo.h> 24#include <asm/bootinfo.h>
25#include <asm/cpu.h>
25#include <asm/mipsregs.h> 26#include <asm/mipsregs.h>
26#include <asm/io.h> 27#include <asm/io.h>
27#include <asm/sibyte/sb1250.h> 28#include <asm/sibyte/sb1250.h>
@@ -182,7 +183,7 @@ void __init sb1250_setup(void)
182 int plldiv; 183 int plldiv;
183 int bad_config = 0; 184 int bad_config = 0;
184 185
185 sb1_pass = read_c0_prid() & 0xff; 186 sb1_pass = read_c0_prid() & PRID_REV_MASK;
186 sys_rev = __raw_readq(IOADDR(A_SCD_SYSTEM_REVISION)); 187 sys_rev = __raw_readq(IOADDR(A_SCD_SYSTEM_REVISION));
187 soc_type = SYS_SOC_TYPE(sys_rev); 188 soc_type = SYS_SOC_TYPE(sys_rev);
188 soc_pass = G_SYS_REVISION(sys_rev); 189 soc_pass = G_SYS_REVISION(sys_rev);
diff --git a/arch/mips/sni/a20r.c b/arch/mips/sni/a20r.c
index dd0ab982d77e..f9407e170476 100644
--- a/arch/mips/sni/a20r.c
+++ b/arch/mips/sni/a20r.c
@@ -122,7 +122,6 @@ static struct resource sc26xx_rsrc[] = {
122 122
123static struct sccnxp_pdata sccnxp_data = { 123static struct sccnxp_pdata sccnxp_data = {
124 .reg_shift = 2, 124 .reg_shift = 2,
125 .frequency = 3686400,
126 .mctrl_cfg[0] = MCTRL_SIG(DTR_OP, LINE_OP7) | 125 .mctrl_cfg[0] = MCTRL_SIG(DTR_OP, LINE_OP7) |
127 MCTRL_SIG(RTS_OP, LINE_OP3) | 126 MCTRL_SIG(RTS_OP, LINE_OP3) |
128 MCTRL_SIG(DSR_IP, LINE_IP5) | 127 MCTRL_SIG(DSR_IP, LINE_IP5) |
diff --git a/arch/mips/sni/setup.c b/arch/mips/sni/setup.c
index 5b09b3544edd..efad85c8c823 100644
--- a/arch/mips/sni/setup.c
+++ b/arch/mips/sni/setup.c
@@ -25,6 +25,7 @@
25#endif 25#endif
26 26
27#include <asm/bootinfo.h> 27#include <asm/bootinfo.h>
28#include <asm/cpu.h>
28#include <asm/io.h> 29#include <asm/io.h>
29#include <asm/reboot.h> 30#include <asm/reboot.h>
30#include <asm/sni.h> 31#include <asm/sni.h>
@@ -173,7 +174,7 @@ void __init plat_mem_setup(void)
173 system_type = "RM300-Cxx"; 174 system_type = "RM300-Cxx";
174 break; 175 break;
175 case SNI_BRD_PCI_DESKTOP: 176 case SNI_BRD_PCI_DESKTOP:
176 switch (read_c0_prid() & 0xff00) { 177 switch (read_c0_prid() & PRID_IMP_MASK) {
177 case PRID_IMP_R4600: 178 case PRID_IMP_R4600:
178 case PRID_IMP_R4700: 179 case PRID_IMP_R4700:
179 system_type = "RM200-C20"; 180 system_type = "RM200-C20";
diff --git a/arch/mips/txx9/generic/setup.c b/arch/mips/txx9/generic/setup.c
index 681e7f86c080..2b0b83c171e0 100644
--- a/arch/mips/txx9/generic/setup.c
+++ b/arch/mips/txx9/generic/setup.c
@@ -350,7 +350,7 @@ static void __init select_board(void)
350 } 350 }
351 351
352 /* select "default" board */ 352 /* select "default" board */
353#ifdef CONFIG_CPU_TX39XX 353#ifdef CONFIG_TOSHIBA_JMR3927
354 txx9_board_vec = &jmr3927_vec; 354 txx9_board_vec = &jmr3927_vec;
355#endif 355#endif
356#ifdef CONFIG_CPU_TX49XX 356#ifdef CONFIG_CPU_TX49XX
diff --git a/arch/mn10300/Kconfig b/arch/mn10300/Kconfig
index 70e4f663ebd2..6aaa1607001a 100644
--- a/arch/mn10300/Kconfig
+++ b/arch/mn10300/Kconfig
@@ -1,7 +1,6 @@
1config MN10300 1config MN10300
2 def_bool y 2 def_bool y
3 select HAVE_OPROFILE 3 select HAVE_OPROFILE
4 select HAVE_GENERIC_HARDIRQS
5 select GENERIC_IRQ_SHOW 4 select GENERIC_IRQ_SHOW
6 select ARCH_WANT_IPC_PARSE_VERSION 5 select ARCH_WANT_IPC_PARSE_VERSION
7 select HAVE_ARCH_TRACEHOOK 6 select HAVE_ARCH_TRACEHOOK
diff --git a/arch/mn10300/kernel/entry.S b/arch/mn10300/kernel/entry.S
index 222152a3f751..177d61de51c9 100644
--- a/arch/mn10300/kernel/entry.S
+++ b/arch/mn10300/kernel/entry.S
@@ -171,10 +171,10 @@ ret_from_intr:
171 mov (REG_EPSW,fp),d0 # need to deliver signals before 171 mov (REG_EPSW,fp),d0 # need to deliver signals before
172 # returning to userspace 172 # returning to userspace
173 and EPSW_nSL,d0 173 and EPSW_nSL,d0
174 beq resume_kernel # returning to supervisor mode 174 bne resume_userspace # returning to userspace
175 175
176#ifdef CONFIG_PREEMPT 176#ifdef CONFIG_PREEMPT
177ENTRY(resume_kernel) 177resume_kernel:
178 LOCAL_IRQ_DISABLE 178 LOCAL_IRQ_DISABLE
179 mov (TI_preempt_count,a2),d0 # non-zero preempt_count ? 179 mov (TI_preempt_count,a2),d0 # non-zero preempt_count ?
180 cmp 0,d0 180 cmp 0,d0
@@ -189,6 +189,8 @@ need_resched:
189 bne restore_all 189 bne restore_all
190 call preempt_schedule_irq[],0 190 call preempt_schedule_irq[],0
191 jmp need_resched 191 jmp need_resched
192#else
193 jmp resume_kernel
192#endif 194#endif
193 195
194 196
diff --git a/arch/mn10300/mm/fault.c b/arch/mn10300/mm/fault.c
index 8a2e6ded9a44..3516cbdf1ee9 100644
--- a/arch/mn10300/mm/fault.c
+++ b/arch/mn10300/mm/fault.c
@@ -171,6 +171,8 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long fault_code,
171 if (in_atomic() || !mm) 171 if (in_atomic() || !mm)
172 goto no_context; 172 goto no_context;
173 173
174 if ((fault_code & MMUFCR_xFC_ACCESS) == MMUFCR_xFC_ACCESS_USR)
175 flags |= FAULT_FLAG_USER;
174retry: 176retry:
175 down_read(&mm->mmap_sem); 177 down_read(&mm->mmap_sem);
176 178
diff --git a/arch/openrisc/Kconfig b/arch/openrisc/Kconfig
index d60bf98fa5cf..9488209a5253 100644
--- a/arch/openrisc/Kconfig
+++ b/arch/openrisc/Kconfig
@@ -11,7 +11,6 @@ config OPENRISC
11 select HAVE_MEMBLOCK 11 select HAVE_MEMBLOCK
12 select ARCH_REQUIRE_GPIOLIB 12 select ARCH_REQUIRE_GPIOLIB
13 select HAVE_ARCH_TRACEHOOK 13 select HAVE_ARCH_TRACEHOOK
14 select HAVE_GENERIC_HARDIRQS
15 select GENERIC_IRQ_CHIP 14 select GENERIC_IRQ_CHIP
16 select GENERIC_IRQ_PROBE 15 select GENERIC_IRQ_PROBE
17 select GENERIC_IRQ_SHOW 16 select GENERIC_IRQ_SHOW
diff --git a/arch/openrisc/include/asm/prom.h b/arch/openrisc/include/asm/prom.h
index bbb34e5343a2..eb59bfe23e85 100644
--- a/arch/openrisc/include/asm/prom.h
+++ b/arch/openrisc/include/asm/prom.h
@@ -44,9 +44,6 @@ void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop,
44 44
45extern void kdump_move_device_tree(void); 45extern void kdump_move_device_tree(void);
46 46
47/* CPU OF node matching */
48struct device_node *of_get_cpu_node(int cpu, unsigned int *thread);
49
50/* Get the MAC address */ 47/* Get the MAC address */
51extern const void *of_get_mac_address(struct device_node *np); 48extern const void *of_get_mac_address(struct device_node *np);
52 49
diff --git a/arch/openrisc/kernel/prom.c b/arch/openrisc/kernel/prom.c
index 5869e3fa5dd3..a63e76872f84 100644
--- a/arch/openrisc/kernel/prom.c
+++ b/arch/openrisc/kernel/prom.c
@@ -55,11 +55,6 @@ void __init early_init_dt_add_memory_arch(u64 base, u64 size)
55 memblock_add(base, size); 55 memblock_add(base, size);
56} 56}
57 57
58void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align)
59{
60 return __va(memblock_alloc(size, align));
61}
62
63void __init early_init_devtree(void *params) 58void __init early_init_devtree(void *params)
64{ 59{
65 void *alloc; 60 void *alloc;
@@ -96,8 +91,7 @@ void __init early_init_devtree(void *params)
96} 91}
97 92
98#ifdef CONFIG_BLK_DEV_INITRD 93#ifdef CONFIG_BLK_DEV_INITRD
99void __init early_init_dt_setup_initrd_arch(unsigned long start, 94void __init early_init_dt_setup_initrd_arch(u64 start, u64 end)
100 unsigned long end)
101{ 95{
102 initrd_start = (unsigned long)__va(start); 96 initrd_start = (unsigned long)__va(start);
103 initrd_end = (unsigned long)__va(end); 97 initrd_end = (unsigned long)__va(end);
diff --git a/arch/openrisc/mm/fault.c b/arch/openrisc/mm/fault.c
index 4a41f8493ab0..0703acf7d327 100644
--- a/arch/openrisc/mm/fault.c
+++ b/arch/openrisc/mm/fault.c
@@ -86,6 +86,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long address,
86 if (user_mode(regs)) { 86 if (user_mode(regs)) {
87 /* Exception was in userspace: reenable interrupts */ 87 /* Exception was in userspace: reenable interrupts */
88 local_irq_enable(); 88 local_irq_enable();
89 flags |= FAULT_FLAG_USER;
89 } else { 90 } else {
90 /* If exception was in a syscall, then IRQ's may have 91 /* If exception was in a syscall, then IRQ's may have
91 * been enabled or disabled. If they were enabled, 92 * been enabled or disabled. If they were enabled,
diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig
index aa399a5259b6..ad2ce8dab996 100644
--- a/arch/parisc/Kconfig
+++ b/arch/parisc/Kconfig
@@ -14,7 +14,6 @@ config PARISC
14 select HAVE_PERF_EVENTS 14 select HAVE_PERF_EVENTS
15 select GENERIC_ATOMIC64 if !64BIT 15 select GENERIC_ATOMIC64 if !64BIT
16 select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE 16 select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
17 select HAVE_GENERIC_HARDIRQS
18 select BROKEN_RODATA 17 select BROKEN_RODATA
19 select GENERIC_IRQ_PROBE 18 select GENERIC_IRQ_PROBE
20 select GENERIC_PCI_IOMAP 19 select GENERIC_PCI_IOMAP
diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c
index 07349b002687..1cba8f29bb49 100644
--- a/arch/parisc/kernel/signal.c
+++ b/arch/parisc/kernel/signal.c
@@ -78,7 +78,7 @@ restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs)
78 err |= __copy_from_user(regs->iaoq, sc->sc_iaoq, sizeof(regs->iaoq)); 78 err |= __copy_from_user(regs->iaoq, sc->sc_iaoq, sizeof(regs->iaoq));
79 err |= __copy_from_user(regs->iasq, sc->sc_iasq, sizeof(regs->iasq)); 79 err |= __copy_from_user(regs->iasq, sc->sc_iasq, sizeof(regs->iasq));
80 err |= __get_user(regs->sar, &sc->sc_sar); 80 err |= __get_user(regs->sar, &sc->sc_sar);
81 DBG(2,"restore_sigcontext: iaoq is 0x%#lx / 0x%#lx\n", 81 DBG(2,"restore_sigcontext: iaoq is %#lx / %#lx\n",
82 regs->iaoq[0],regs->iaoq[1]); 82 regs->iaoq[0],regs->iaoq[1]);
83 DBG(2,"restore_sigcontext: r28 is %ld\n", regs->gr[28]); 83 DBG(2,"restore_sigcontext: r28 is %ld\n", regs->gr[28]);
84 return err; 84 return err;
diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c
index f247a3480e8e..d10d27a720c0 100644
--- a/arch/parisc/mm/fault.c
+++ b/arch/parisc/mm/fault.c
@@ -180,6 +180,10 @@ void do_page_fault(struct pt_regs *regs, unsigned long code,
180 if (in_atomic() || !mm) 180 if (in_atomic() || !mm)
181 goto no_context; 181 goto no_context;
182 182
183 if (user_mode(regs))
184 flags |= FAULT_FLAG_USER;
185 if (acc_type & VM_WRITE)
186 flags |= FAULT_FLAG_WRITE;
183retry: 187retry:
184 down_read(&mm->mmap_sem); 188 down_read(&mm->mmap_sem);
185 vma = find_vma_prev(mm, address, &prev_vma); 189 vma = find_vma_prev(mm, address, &prev_vma);
@@ -203,8 +207,7 @@ good_area:
203 * fault. 207 * fault.
204 */ 208 */
205 209
206 fault = handle_mm_fault(mm, vma, address, 210 fault = handle_mm_fault(mm, vma, address, flags);
207 flags | ((acc_type & VM_WRITE) ? FAULT_FLAG_WRITE : 0));
208 211
209 if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) 212 if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current))
210 return; 213 return;
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index dbd9d3c991e8..38f3b7e47ec5 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -114,7 +114,6 @@ config PPC
114 select HAVE_PERF_EVENTS 114 select HAVE_PERF_EVENTS
115 select HAVE_REGS_AND_STACK_ACCESS_API 115 select HAVE_REGS_AND_STACK_ACCESS_API
116 select HAVE_HW_BREAKPOINT if PERF_EVENTS && PPC_BOOK3S_64 116 select HAVE_HW_BREAKPOINT if PERF_EVENTS && PPC_BOOK3S_64
117 select HAVE_GENERIC_HARDIRQS
118 select ARCH_WANT_IPC_PARSE_VERSION 117 select ARCH_WANT_IPC_PARSE_VERSION
119 select SPARSE_IRQ 118 select SPARSE_IRQ
120 select IRQ_DOMAIN 119 select IRQ_DOMAIN
@@ -312,6 +311,26 @@ config MATH_EMULATION
312 such as fsqrt on cores that do have an FPU but do not implement 311 such as fsqrt on cores that do have an FPU but do not implement
313 them (such as Freescale BookE). 312 them (such as Freescale BookE).
314 313
314choice
315 prompt "Math emulation options"
316 default MATH_EMULATION_FULL
317 depends on MATH_EMULATION
318
319config MATH_EMULATION_FULL
320 bool "Emulate all the floating point instructions"
321 ---help---
322 Select this option will enable the kernel to support to emulate
323 all the floating point instructions. If your SoC doesn't have
324 a FPU, you should select this.
325
326config MATH_EMULATION_HW_UNIMPLEMENTED
327 bool "Just emulate the FPU unimplemented instructions"
328 ---help---
329 Select this if you know there does have a hardware FPU on your
330 SoC, but some floating point instructions are not implemented by that.
331
332endchoice
333
315config PPC_TRANSACTIONAL_MEM 334config PPC_TRANSACTIONAL_MEM
316 bool "Transactional Memory support for POWERPC" 335 bool "Transactional Memory support for POWERPC"
317 depends on PPC_BOOK3S_64 336 depends on PPC_BOOK3S_64
@@ -369,9 +388,9 @@ config KEXEC
369 388
370 It is an ongoing process to be certain the hardware in a machine 389 It is an ongoing process to be certain the hardware in a machine
371 is properly shutdown, so do not be surprised if this code does not 390 is properly shutdown, so do not be surprised if this code does not
372 initially work for you. It may help to enable device hotplugging 391 initially work for you. As of this writing the exact hardware
373 support. As of this writing the exact hardware interface is 392 interface is strongly in flux, so no good recommendation can be
374 strongly in flux, so no good recommendation can be made. 393 made.
375 394
376config CRASH_DUMP 395config CRASH_DUMP
377 bool "Build a kdump crash kernel" 396 bool "Build a kdump crash kernel"
@@ -727,7 +746,6 @@ config PCI
727 default y if !40x && !CPM2 && !8xx && !PPC_83xx \ 746 default y if !40x && !CPM2 && !8xx && !PPC_83xx \
728 && !PPC_85xx && !PPC_86xx && !GAMECUBE_COMMON 747 && !PPC_85xx && !PPC_86xx && !GAMECUBE_COMMON
729 default PCI_QSPAN if !4xx && !CPM2 && 8xx 748 default PCI_QSPAN if !4xx && !CPM2 && 8xx
730 select ARCH_SUPPORTS_MSI
731 select GENERIC_PCI_IOMAP 749 select GENERIC_PCI_IOMAP
732 help 750 help
733 Find out whether your system includes a PCI bus. PCI is the name of 751 Find out whether your system includes a PCI bus. PCI is the name of
@@ -979,6 +997,7 @@ config RELOCATABLE
979 must live at a different physical address than the primary 997 must live at a different physical address than the primary
980 kernel. 998 kernel.
981 999
1000# This value must have zeroes in the bottom 60 bits otherwise lots will break
982config PAGE_OFFSET 1001config PAGE_OFFSET
983 hex 1002 hex
984 default "0xc000000000000000" 1003 default "0xc000000000000000"
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
index 967fd23ace78..51cfb78d4061 100644
--- a/arch/powerpc/Makefile
+++ b/arch/powerpc/Makefile
@@ -88,13 +88,30 @@ CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mcmodel=medium,-mminimal-toc)
88CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mno-pointers-to-nested-functions) 88CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mno-pointers-to-nested-functions)
89CFLAGS-$(CONFIG_PPC32) := -ffixed-r2 -mmultiple 89CFLAGS-$(CONFIG_PPC32) := -ffixed-r2 -mmultiple
90 90
91ifeq ($(CONFIG_PPC_BOOK3S_64),y)
91CFLAGS-$(CONFIG_GENERIC_CPU) += $(call cc-option,-mtune=power7,-mtune=power4) 92CFLAGS-$(CONFIG_GENERIC_CPU) += $(call cc-option,-mtune=power7,-mtune=power4)
93else
94CFLAGS-$(CONFIG_GENERIC_CPU) += -mcpu=powerpc64
95endif
96
92CFLAGS-$(CONFIG_CELL_CPU) += $(call cc-option,-mcpu=cell) 97CFLAGS-$(CONFIG_CELL_CPU) += $(call cc-option,-mcpu=cell)
93CFLAGS-$(CONFIG_POWER4_CPU) += $(call cc-option,-mcpu=power4) 98CFLAGS-$(CONFIG_POWER4_CPU) += $(call cc-option,-mcpu=power4)
94CFLAGS-$(CONFIG_POWER5_CPU) += $(call cc-option,-mcpu=power5) 99CFLAGS-$(CONFIG_POWER5_CPU) += $(call cc-option,-mcpu=power5)
95CFLAGS-$(CONFIG_POWER6_CPU) += $(call cc-option,-mcpu=power6) 100CFLAGS-$(CONFIG_POWER6_CPU) += $(call cc-option,-mcpu=power6)
96CFLAGS-$(CONFIG_POWER7_CPU) += $(call cc-option,-mcpu=power7) 101CFLAGS-$(CONFIG_POWER7_CPU) += $(call cc-option,-mcpu=power7)
97 102
103E5500_CPU := $(call cc-option,-mcpu=e500mc64,-mcpu=powerpc64)
104CFLAGS-$(CONFIG_E5500_CPU) += $(E5500_CPU)
105CFLAGS-$(CONFIG_E6500_CPU) += $(call cc-option,-mcpu=e6500,$(E5500_CPU))
106
107ifeq ($(CONFIG_PPC32),y)
108ifeq ($(CONFIG_PPC_E500MC),y)
109CFLAGS-y += $(call cc-option,-mcpu=e500mc,-mcpu=powerpc)
110else
111CFLAGS-$(CONFIG_E500) += $(call cc-option,-mcpu=8540 -msoft-float,-mcpu=powerpc)
112endif
113endif
114
98CFLAGS-$(CONFIG_TUNE_CELL) += $(call cc-option,-mtune=cell) 115CFLAGS-$(CONFIG_TUNE_CELL) += $(call cc-option,-mtune=cell)
99 116
100KBUILD_CPPFLAGS += -Iarch/$(ARCH) 117KBUILD_CPPFLAGS += -Iarch/$(ARCH)
@@ -139,7 +156,6 @@ endif
139 156
140cpu-as-$(CONFIG_4xx) += -Wa,-m405 157cpu-as-$(CONFIG_4xx) += -Wa,-m405
141cpu-as-$(CONFIG_ALTIVEC) += -Wa,-maltivec 158cpu-as-$(CONFIG_ALTIVEC) += -Wa,-maltivec
142cpu-as-$(CONFIG_E500) += -Wa,-me500
143cpu-as-$(CONFIG_E200) += -Wa,-me200 159cpu-as-$(CONFIG_E200) += -Wa,-me200
144 160
145KBUILD_AFLAGS += $(cpu-as-y) 161KBUILD_AFLAGS += $(cpu-as-y)
diff --git a/arch/powerpc/boot/.gitignore b/arch/powerpc/boot/.gitignore
index c32ae5ce9fff..554734ff302e 100644
--- a/arch/powerpc/boot/.gitignore
+++ b/arch/powerpc/boot/.gitignore
@@ -22,6 +22,7 @@ zImage.initrd
22zImage.bin.* 22zImage.bin.*
23zImage.chrp 23zImage.chrp
24zImage.coff 24zImage.coff
25zImage.epapr
25zImage.holly 26zImage.holly
26zImage.*lds 27zImage.*lds
27zImage.miboot 28zImage.miboot
diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile
index 6a15c968d214..15ca2255f438 100644
--- a/arch/powerpc/boot/Makefile
+++ b/arch/powerpc/boot/Makefile
@@ -74,7 +74,7 @@ src-wlib-$(CONFIG_8xx) += mpc8xx.c planetcore.c
74src-wlib-$(CONFIG_PPC_82xx) += pq2.c fsl-soc.c planetcore.c 74src-wlib-$(CONFIG_PPC_82xx) += pq2.c fsl-soc.c planetcore.c
75src-wlib-$(CONFIG_EMBEDDED6xx) += mv64x60.c mv64x60_i2c.c ugecon.c 75src-wlib-$(CONFIG_EMBEDDED6xx) += mv64x60.c mv64x60_i2c.c ugecon.c
76 76
77src-plat-y := of.c 77src-plat-y := of.c epapr.c
78src-plat-$(CONFIG_40x) += fixed-head.S ep405.c cuboot-hotfoot.c \ 78src-plat-$(CONFIG_40x) += fixed-head.S ep405.c cuboot-hotfoot.c \
79 treeboot-walnut.c cuboot-acadia.c \ 79 treeboot-walnut.c cuboot-acadia.c \
80 cuboot-kilauea.c simpleboot.c \ 80 cuboot-kilauea.c simpleboot.c \
@@ -97,7 +97,7 @@ src-plat-$(CONFIG_EMBEDDED6xx) += cuboot-pq2.c cuboot-mpc7448hpc2.c \
97 prpmc2800.c 97 prpmc2800.c
98src-plat-$(CONFIG_AMIGAONE) += cuboot-amigaone.c 98src-plat-$(CONFIG_AMIGAONE) += cuboot-amigaone.c
99src-plat-$(CONFIG_PPC_PS3) += ps3-head.S ps3-hvcall.S ps3.c 99src-plat-$(CONFIG_PPC_PS3) += ps3-head.S ps3-hvcall.S ps3.c
100src-plat-$(CONFIG_EPAPR_BOOT) += epapr.c 100src-plat-$(CONFIG_EPAPR_BOOT) += epapr.c epapr-wrapper.c
101 101
102src-wlib := $(sort $(src-wlib-y)) 102src-wlib := $(sort $(src-wlib-y))
103src-plat := $(sort $(src-plat-y)) 103src-plat := $(sort $(src-plat-y))
diff --git a/arch/powerpc/boot/dts/ac14xx.dts b/arch/powerpc/boot/dts/ac14xx.dts
index a27a4609bb42..a543c4088cba 100644
--- a/arch/powerpc/boot/dts/ac14xx.dts
+++ b/arch/powerpc/boot/dts/ac14xx.dts
@@ -10,7 +10,7 @@
10 */ 10 */
11 11
12 12
13/include/ "mpc5121.dtsi" 13#include <mpc5121.dtsi>
14 14
15/ { 15/ {
16 model = "ac14xx"; 16 model = "ac14xx";
diff --git a/arch/powerpc/boot/dts/b4420qds.dts b/arch/powerpc/boot/dts/b4420qds.dts
index 923156d03b30..508dbdf33c81 100644
--- a/arch/powerpc/boot/dts/b4420qds.dts
+++ b/arch/powerpc/boot/dts/b4420qds.dts
@@ -33,7 +33,7 @@
33 */ 33 */
34 34
35/include/ "fsl/b4420si-pre.dtsi" 35/include/ "fsl/b4420si-pre.dtsi"
36/include/ "b4qds.dts" 36/include/ "b4qds.dtsi"
37 37
38/ { 38/ {
39 model = "fsl,B4420QDS"; 39 model = "fsl,B4420QDS";
diff --git a/arch/powerpc/boot/dts/b4860qds.dts b/arch/powerpc/boot/dts/b4860qds.dts
index 78907f38bb77..6bb3707ffe3d 100644
--- a/arch/powerpc/boot/dts/b4860qds.dts
+++ b/arch/powerpc/boot/dts/b4860qds.dts
@@ -33,7 +33,7 @@
33 */ 33 */
34 34
35/include/ "fsl/b4860si-pre.dtsi" 35/include/ "fsl/b4860si-pre.dtsi"
36/include/ "b4qds.dts" 36/include/ "b4qds.dtsi"
37 37
38/ { 38/ {
39 model = "fsl,B4860QDS"; 39 model = "fsl,B4860QDS";
diff --git a/arch/powerpc/boot/dts/b4qds.dts b/arch/powerpc/boot/dts/b4qds.dtsi
index e6d2f8f90544..e6d2f8f90544 100644
--- a/arch/powerpc/boot/dts/b4qds.dts
+++ b/arch/powerpc/boot/dts/b4qds.dtsi
diff --git a/arch/powerpc/boot/dts/c293pcie.dts b/arch/powerpc/boot/dts/c293pcie.dts
new file mode 100644
index 000000000000..1238bda8901f
--- /dev/null
+++ b/arch/powerpc/boot/dts/c293pcie.dts
@@ -0,0 +1,223 @@
1/*
2 * C293 PCIE Device Tree Source
3 *
4 * Copyright 2013 Freescale Semiconductor Inc.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * * Neither the name of Freescale Semiconductor nor the
14 * names of its contributors may be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 *
18 * ALTERNATIVELY, this software may be distributed under the terms of the
19 * GNU General Public License ("GPL") as published by the Free Software
20 * Foundation, either version 2 of that License or (at your option) any
21 * later version.
22 *
23 * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor "AS IS" AND ANY
24 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
27 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 */
34
35/include/ "fsl/c293si-pre.dtsi"
36
37/ {
38 model = "fsl,C293PCIE";
39 compatible = "fsl,C293PCIE";
40
41 memory {
42 device_type = "memory";
43 };
44
45 ifc: ifc@fffe1e000 {
46 reg = <0xf 0xffe1e000 0 0x2000>;
47 ranges = <0x0 0x0 0xf 0xec000000 0x04000000
48 0x2 0x0 0xf 0xffdf0000 0x00010000>;
49
50 };
51
52 soc: soc@fffe00000 {
53 ranges = <0x0 0xf 0xffe00000 0x100000>;
54 };
55
56 pci0: pcie@fffe0a000 {
57 reg = <0xf 0xffe0a000 0 0x1000>;
58 ranges = <0x2000000 0x0 0x80000000 0xc 0x00000000 0x0 0x20000000
59 0x1000000 0x0 0x00000000 0xf 0xffc00000 0x0 0x10000>;
60 pcie@0 {
61 ranges = <0x2000000 0x0 0x80000000
62 0x2000000 0x0 0x80000000
63 0x0 0x20000000
64
65 0x1000000 0x0 0x0
66 0x1000000 0x0 0x0
67 0x0 0x100000>;
68 };
69 };
70};
71
72&ifc {
73 nor@0,0 {
74 #address-cells = <1>;
75 #size-cells = <1>;
76 compatible = "cfi-flash";
77 reg = <0x0 0x0 0x4000000>;
78 bank-width = <2>;
79 device-width = <1>;
80
81 partition@0 {
82 /* 1MB for DTB Image */
83 reg = <0x0 0x00100000>;
84 label = "NOR DTB Image";
85 };
86
87 partition@100000 {
88 /* 8 MB for Linux Kernel Image */
89 reg = <0x00100000 0x00800000>;
90 label = "NOR Linux Kernel Image";
91 };
92
93 partition@900000 {
94 /* 53MB for rootfs */
95 reg = <0x00900000 0x03500000>;
96 label = "NOR Rootfs Image";
97 };
98
99 partition@3e00000 {
100 /* 1MB for blob encrypted key */
101 reg = <0x03e00000 0x00100000>;
102 label = "NOR blob encrypted key";
103 };
104
105 partition@3f00000 {
106 /* 512KB for u-boot Bootloader Image and evn */
107 reg = <0x03f00000 0x00100000>;
108 label = "NOR U-Boot Image";
109 read-only;
110 };
111 };
112
113 nand@1,0 {
114 #address-cells = <1>;
115 #size-cells = <1>;
116 compatible = "fsl,ifc-nand";
117 reg = <0x1 0x0 0x10000>;
118
119 partition@0 {
120 /* This location must not be altered */
121 /* 1MB for u-boot Bootloader Image */
122 reg = <0x0 0x00100000>;
123 label = "NAND U-Boot Image";
124 read-only;
125 };
126
127 partition@100000 {
128 /* 1MB for DTB Image */
129 reg = <0x00100000 0x00100000>;
130 label = "NAND DTB Image";
131 };
132
133 partition@200000 {
134 /* 16MB for Linux Kernel Image */
135 reg = <0x00200000 0x01000000>;
136 label = "NAND Linux Kernel Image";
137 };
138
139 partition@1200000 {
140 /* 4078MB for Root file System Image */
141 reg = <0x00600000 0xfee00000>;
142 label = "NAND RFS Image";
143 };
144 };
145
146 cpld@2,0 {
147 compatible = "fsl,c293pcie-cpld";
148 reg = <0x2 0x0 0x20>;
149 };
150};
151
152&soc {
153 i2c@3000 {
154 eeprom@50 {
155 compatible = "st,24c1024";
156 reg = <0x50>;
157 };
158
159 adt7461@4c {
160 compatible = "adi,adt7461";
161 reg = <0x4c>;
162 };
163 };
164
165 spi@7000 {
166 flash@0 {
167 #address-cells = <1>;
168 #size-cells = <1>;
169 compatible = "spansion,s25sl12801";
170 reg = <0>;
171 spi-max-frequency = <50000000>;
172
173 partition@0 {
174 /* 1MB for u-boot Bootloader Image */
175 /* 1MB for Environment */
176 reg = <0x0 0x00100000>;
177 label = "SPI Flash U-Boot Image";
178 read-only;
179 };
180
181 partition@100000 {
182 /* 512KB for DTB Image */
183 reg = <0x00100000 0x00080000>;
184 label = "SPI Flash DTB Image";
185 };
186
187 partition@180000 {
188 /* 4MB for Linux Kernel Image */
189 reg = <0x00180000 0x00400000>;
190 label = "SPI Flash Linux Kernel Image";
191 };
192
193 partition@580000 {
194 /* 10.5MB for RFS Image */
195 reg = <0x00580000 0x00a80000>;
196 label = "SPI Flash RFS Image";
197 };
198 };
199 };
200
201 mdio@24000 {
202 phy0: ethernet-phy@0 {
203 interrupts = <2 1 0 0>;
204 reg = <0x0>;
205 };
206
207 phy1: ethernet-phy@1 {
208 interrupts = <2 1 0 0>;
209 reg = <0x2>;
210 };
211 };
212
213 enet0: ethernet@b0000 {
214 phy-handle = <&phy0>;
215 phy-connection-type = "rgmii-id";
216 };
217
218 enet1: ethernet@b1000 {
219 phy-handle = <&phy1>;
220 phy-connection-type = "rgmii-id";
221 };
222};
223/include/ "fsl/c293si-post.dtsi"
diff --git a/arch/powerpc/boot/dts/fsl/b4si-post.dtsi b/arch/powerpc/boot/dts/fsl/b4si-post.dtsi
index 73991547c69b..4c617bf8cdb2 100644
--- a/arch/powerpc/boot/dts/fsl/b4si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/b4si-post.dtsi
@@ -204,7 +204,7 @@
204 }; 204 };
205 }; 205 };
206 206
207/include/ "qoriq-mpic.dtsi" 207/include/ "qoriq-mpic4.3.dtsi"
208 208
209 guts: global-utilities@e0000 { 209 guts: global-utilities@e0000 {
210 compatible = "fsl,b4-device-config"; 210 compatible = "fsl,b4-device-config";
diff --git a/arch/powerpc/boot/dts/fsl/c293si-post.dtsi b/arch/powerpc/boot/dts/fsl/c293si-post.dtsi
new file mode 100644
index 000000000000..bd208320bff5
--- /dev/null
+++ b/arch/powerpc/boot/dts/fsl/c293si-post.dtsi
@@ -0,0 +1,193 @@
1/*
2 * C293 Silicon/SoC Device Tree Source (post include)
3 *
4 * Copyright 2012 Freescale Semiconductor Inc.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * * Neither the name of Freescale Semiconductor nor the
14 * names of its contributors may be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 *
18 * ALTERNATIVELY, this software may be distributed under the terms of the
19 * GNU General Public License ("GPL") as published by the Free Software
20 * Foundation, either version 2 of that License or (at your option) any
21 * later version.
22 *
23 * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
24 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
27 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 */
34
35&ifc {
36 #address-cells = <2>;
37 #size-cells = <1>;
38 compatible = "fsl,ifc", "simple-bus";
39 interrupts = <19 2 0 0>;
40};
41
42/* controller at 0xa000 */
43&pci0 {
44 compatible = "fsl,qoriq-pcie-v2.2", "fsl,qoriq-pcie";
45 device_type = "pci";
46 #size-cells = <2>;
47 #address-cells = <3>;
48 bus-range = <0 255>;
49 clock-frequency = <33333333>;
50 interrupts = <16 2 0 0>;
51
52 pcie@0 {
53 reg = <0 0 0 0 0>;
54 #interrupt-cells = <1>;
55 #size-cells = <2>;
56 #address-cells = <3>;
57 device_type = "pci";
58 interrupts = <16 2 0 0>;
59 interrupt-map-mask = <0xf800 0 0 7>;
60 interrupt-map = <
61 /* IDSEL 0x0 */
62 0000 0x0 0x0 0x1 &mpic 0x0 0x1 0x0 0x0
63 0000 0x0 0x0 0x2 &mpic 0x1 0x1 0x0 0x0
64 0000 0x0 0x0 0x3 &mpic 0x2 0x1 0x0 0x0
65 0000 0x0 0x0 0x4 &mpic 0x3 0x1 0x0 0x0
66 >;
67 };
68};
69
70&soc {
71 #address-cells = <1>;
72 #size-cells = <1>;
73 device_type = "soc";
74 compatible = "simple-bus";
75 bus-frequency = <0>; // Filled out by uboot.
76
77 ecm-law@0 {
78 compatible = "fsl,ecm-law";
79 reg = <0x0 0x1000>;
80 fsl,num-laws = <12>;
81 };
82
83 ecm@1000 {
84 compatible = "fsl,c293-ecm", "fsl,ecm";
85 reg = <0x1000 0x1000>;
86 interrupts = <16 2 0 0>;
87 };
88
89 memory-controller@2000 {
90 compatible = "fsl,c293-memory-controller";
91 reg = <0x2000 0x1000>;
92 interrupts = <16 2 0 0>;
93 };
94
95/include/ "pq3-i2c-0.dtsi"
96/include/ "pq3-i2c-1.dtsi"
97/include/ "pq3-duart-0.dtsi"
98/include/ "pq3-espi-0.dtsi"
99 spi0: spi@7000 {
100 fsl,espi-num-chipselects = <1>;
101 };
102
103/include/ "pq3-gpio-0.dtsi"
104 L2: l2-cache-controller@20000 {
105 compatible = "fsl,c293-l2-cache-controller";
106 reg = <0x20000 0x1000>;
107 cache-line-size = <32>; // 32 bytes
108 cache-size = <0x80000>; // L2,512K
109 interrupts = <16 2 0 0>;
110 };
111
112/include/ "pq3-dma-0.dtsi"
113/include/ "pq3-esdhc-0.dtsi"
114 sdhc@2e000 {
115 compatible = "fsl,c293-esdhc", "fsl,esdhc";
116 sdhci,auto-cmd12;
117 };
118
119 crypto@80000 {
120/include/ "qoriq-sec6.0-0.dtsi"
121 };
122
123 crypto@80000 {
124 reg = <0x80000 0x20000>;
125 ranges = <0x0 0x80000 0x20000>;
126
127 jr@1000{
128 interrupts = <45 2 0 0>;
129 };
130 jr@2000{
131 interrupts = <57 2 0 0>;
132 };
133 };
134
135 crypto@a0000 {
136/include/ "qoriq-sec6.0-0.dtsi"
137 };
138
139 crypto@a0000 {
140 reg = <0xa0000 0x20000>;
141 ranges = <0x0 0xa0000 0x20000>;
142
143 jr@1000{
144 interrupts = <49 2 0 0>;
145 };
146 jr@2000{
147 interrupts = <50 2 0 0>;
148 };
149 };
150
151 crypto@c0000 {
152/include/ "qoriq-sec6.0-0.dtsi"
153 };
154
155 crypto@c0000 {
156 reg = <0xc0000 0x20000>;
157 ranges = <0x0 0xc0000 0x20000>;
158
159 jr@1000{
160 interrupts = <55 2 0 0>;
161 };
162 jr@2000{
163 interrupts = <56 2 0 0>;
164 };
165 };
166
167/include/ "pq3-mpic.dtsi"
168/include/ "pq3-mpic-timer-B.dtsi"
169
170/include/ "pq3-etsec2-0.dtsi"
171 enet0: ethernet@b0000 {
172 queue-group@b0000 {
173 reg = <0x10000 0x1000>;
174 fsl,rx-bit-map = <0xff>;
175 fsl,tx-bit-map = <0xff>;
176 };
177 };
178
179/include/ "pq3-etsec2-1.dtsi"
180 enet1: ethernet@b1000 {
181 queue-group@b1000 {
182 reg = <0x11000 0x1000>;
183 fsl,rx-bit-map = <0xff>;
184 fsl,tx-bit-map = <0xff>;
185 };
186 };
187
188 global-utilities@e0000 {
189 compatible = "fsl,c293-guts";
190 reg = <0xe0000 0x1000>;
191 fsl,has-rstcr;
192 };
193};
diff --git a/arch/powerpc/boot/dts/fsl/c293si-pre.dtsi b/arch/powerpc/boot/dts/fsl/c293si-pre.dtsi
new file mode 100644
index 000000000000..065049d76245
--- /dev/null
+++ b/arch/powerpc/boot/dts/fsl/c293si-pre.dtsi
@@ -0,0 +1,63 @@
1/*
2 * C293 Silicon/SoC Device Tree Source (pre include)
3 *
4 * Copyright 2012 Freescale Semiconductor Inc.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * * Neither the name of Freescale Semiconductor nor the
14 * names of its contributors may be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 *
18 * ALTERNATIVELY, this software may be distributed under the terms of the
19 * GNU General Public License ("GPL") as published by the Free Software
20 * Foundation, either version 2 of that License or (at your option) any
21 * later version.
22 *
23 * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
24 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
27 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 */
34
35/dts-v1/;
36
37/include/ "e500v2_power_isa.dtsi"
38
39/ {
40 compatible = "fsl,C293";
41 #address-cells = <2>;
42 #size-cells = <2>;
43 interrupt-parent = <&mpic>;
44
45 aliases {
46 serial0 = &serial0;
47 serial1 = &serial1;
48 ethernet0 = &enet0;
49 ethernet1 = &enet1;
50 pci0 = &pci0;
51 };
52
53 cpus {
54 #address-cells = <1>;
55 #size-cells = <0>;
56
57 PowerPC,e500v2@0 {
58 device_type = "cpu";
59 reg = <0x0>;
60 next-level-cache = <&L2>;
61 };
62 };
63};
diff --git a/arch/powerpc/boot/dts/fsl/qoriq-mpic4.3.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-mpic4.3.dtsi
new file mode 100644
index 000000000000..64f713c24825
--- /dev/null
+++ b/arch/powerpc/boot/dts/fsl/qoriq-mpic4.3.dtsi
@@ -0,0 +1,149 @@
1/*
2 * QorIQ MPIC device tree stub [ controller @ offset 0x40000 ]
3 *
4 * Copyright 2013 Freescale Semiconductor Inc.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * * Neither the name of Freescale Semiconductor nor the
14 * names of its contributors may be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 *
18 * ALTERNATIVELY, this software may be distributed under the terms of the
19 * GNU General Public License ("GPL") as published by the Free Software
20 * Foundation, either version 2 of that License or (at your option) any
21 * later version.
22 *
23 * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
24 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
27 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 */
34
35mpic: pic@40000 {
36 interrupt-controller;
37 #address-cells = <0>;
38 #interrupt-cells = <4>;
39 reg = <0x40000 0x40000>;
40 compatible = "fsl,mpic";
41 device_type = "open-pic";
42 clock-frequency = <0x0>;
43};
44
45timer@41100 {
46 compatible = "fsl,mpic-global-timer";
47 reg = <0x41100 0x100 0x41300 4>;
48 interrupts = <0 0 3 0
49 1 0 3 0
50 2 0 3 0
51 3 0 3 0>;
52};
53
54msi0: msi@41600 {
55 compatible = "fsl,mpic-msi-v4.3";
56 reg = <0x41600 0x200 0x44148 4>;
57 interrupts = <
58 0xe0 0 0 0
59 0xe1 0 0 0
60 0xe2 0 0 0
61 0xe3 0 0 0
62 0xe4 0 0 0
63 0xe5 0 0 0
64 0xe6 0 0 0
65 0xe7 0 0 0
66 0x100 0 0 0
67 0x101 0 0 0
68 0x102 0 0 0
69 0x103 0 0 0
70 0x104 0 0 0
71 0x105 0 0 0
72 0x106 0 0 0
73 0x107 0 0 0>;
74};
75
76msi1: msi@41800 {
77 compatible = "fsl,mpic-msi-v4.3";
78 reg = <0x41800 0x200 0x45148 4>;
79 interrupts = <
80 0xe8 0 0 0
81 0xe9 0 0 0
82 0xea 0 0 0
83 0xeb 0 0 0
84 0xec 0 0 0
85 0xed 0 0 0
86 0xee 0 0 0
87 0xef 0 0 0
88 0x108 0 0 0
89 0x109 0 0 0
90 0x10a 0 0 0
91 0x10b 0 0 0
92 0x10c 0 0 0
93 0x10d 0 0 0
94 0x10e 0 0 0
95 0x10f 0 0 0>;
96};
97
98msi2: msi@41a00 {
99 compatible = "fsl,mpic-msi-v4.3";
100 reg = <0x41a00 0x200 0x46148 4>;
101 interrupts = <
102 0xf0 0 0 0
103 0xf1 0 0 0
104 0xf2 0 0 0
105 0xf3 0 0 0
106 0xf4 0 0 0
107 0xf5 0 0 0
108 0xf6 0 0 0
109 0xf7 0 0 0
110 0x110 0 0 0
111 0x111 0 0 0
112 0x112 0 0 0
113 0x113 0 0 0
114 0x114 0 0 0
115 0x115 0 0 0
116 0x116 0 0 0
117 0x117 0 0 0>;
118};
119
120msi3: msi@41c00 {
121 compatible = "fsl,mpic-msi-v4.3";
122 reg = <0x41c00 0x200 0x47148 4>;
123 interrupts = <
124 0xf8 0 0 0
125 0xf9 0 0 0
126 0xfa 0 0 0
127 0xfb 0 0 0
128 0xfc 0 0 0
129 0xfd 0 0 0
130 0xfe 0 0 0
131 0xff 0 0 0
132 0x118 0 0 0
133 0x119 0 0 0
134 0x11a 0 0 0
135 0x11b 0 0 0
136 0x11c 0 0 0
137 0x11d 0 0 0
138 0x11e 0 0 0
139 0x11f 0 0 0>;
140};
141
142timer@42100 {
143 compatible = "fsl,mpic-global-timer";
144 reg = <0x42100 0x100 0x42300 4>;
145 interrupts = <4 0 3 0
146 5 0 3 0
147 6 0 3 0
148 7 0 3 0>;
149};
diff --git a/arch/powerpc/boot/dts/fsl/qoriq-sec6.0-0.dtsi b/arch/powerpc/boot/dts/fsl/qoriq-sec6.0-0.dtsi
new file mode 100644
index 000000000000..f75b4f820c3c
--- /dev/null
+++ b/arch/powerpc/boot/dts/fsl/qoriq-sec6.0-0.dtsi
@@ -0,0 +1,56 @@
1/*
2 * QorIQ Sec/Crypto 6.0 device tree stub
3 *
4 * Copyright 2013 Freescale Semiconductor Inc.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * * Neither the name of Freescale Semiconductor nor the
14 * names of its contributors may be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 *
18 * ALTERNATIVELY, this software may be distributed under the terms of the
19 * GNU General Public License ("GPL") as published by the Free Software
20 * Foundation, either version 2 of that License or (at your option) any
21 * later version.
22 *
23 * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
24 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
27 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 */
34
35 compatible = "fsl,sec-v6.0";
36 fsl,sec-era = <6>;
37 #address-cells = <1>;
38 #size-cells = <1>;
39
40 jr@1000 {
41 compatible = "fsl,sec-v6.0-job-ring",
42 "fsl,sec-v5.2-job-ring",
43 "fsl,sec-v5.0-job-ring",
44 "fsl,sec-v4.4-job-ring",
45 "fsl,sec-v4.0-job-ring";
46 reg = <0x1000 0x1000>;
47 };
48
49 jr@2000 {
50 compatible = "fsl,sec-v6.0-job-ring",
51 "fsl,sec-v5.2-job-ring",
52 "fsl,sec-v5.0-job-ring",
53 "fsl,sec-v4.4-job-ring",
54 "fsl,sec-v4.0-job-ring";
55 reg = <0x2000 0x1000>;
56 };
diff --git a/arch/powerpc/boot/dts/fsl/t4240si-post.dtsi b/arch/powerpc/boot/dts/fsl/t4240si-post.dtsi
index bd611a9cad32..510afa362de1 100644
--- a/arch/powerpc/boot/dts/fsl/t4240si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/t4240si-post.dtsi
@@ -358,7 +358,7 @@
358 16 2 1 30>; 358 16 2 1 30>;
359 }; 359 };
360 360
361/include/ "qoriq-mpic.dtsi" 361/include/ "qoriq-mpic4.3.dtsi"
362 362
363 guts: global-utilities@e0000 { 363 guts: global-utilities@e0000 {
364 compatible = "fsl,t4240-device-config", "fsl,qoriq-device-config-2.0"; 364 compatible = "fsl,t4240-device-config", "fsl,qoriq-device-config-2.0";
diff --git a/arch/powerpc/boot/dts/include/dt-bindings b/arch/powerpc/boot/dts/include/dt-bindings
new file mode 120000
index 000000000000..08c00e4972fa
--- /dev/null
+++ b/arch/powerpc/boot/dts/include/dt-bindings
@@ -0,0 +1 @@
../../../../../include/dt-bindings \ No newline at end of file
diff --git a/arch/powerpc/boot/dts/mpc5121ads.dts b/arch/powerpc/boot/dts/mpc5121ads.dts
index 7d3cb79185cb..c228a0a232a6 100644
--- a/arch/powerpc/boot/dts/mpc5121ads.dts
+++ b/arch/powerpc/boot/dts/mpc5121ads.dts
@@ -9,7 +9,7 @@
9 * option) any later version. 9 * option) any later version.
10 */ 10 */
11 11
12/include/ "mpc5121.dtsi" 12#include <mpc5121.dtsi>
13 13
14/ { 14/ {
15 model = "mpc5121ads"; 15 model = "mpc5121ads";
diff --git a/arch/powerpc/boot/dts/p1020rdb-pd.dts b/arch/powerpc/boot/dts/p1020rdb-pd.dts
new file mode 100644
index 000000000000..987017ea36b6
--- /dev/null
+++ b/arch/powerpc/boot/dts/p1020rdb-pd.dts
@@ -0,0 +1,280 @@
1/*
2 * P1020 RDB-PD Device Tree Source (32-bit address map)
3 *
4 * Copyright 2013 Freescale Semiconductor Inc.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * * Neither the name of Freescale Semiconductor nor the
14 * names of its contributors may be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 *
18 * ALTERNATIVELY, this software may be distributed under the terms of the
19 * GNU General Public License ("GPL") as published by the Free Software
20 * Foundation, either version 2 of that License or (at your option) any
21 * later version.
22 *
23 * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
24 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
27 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 */
34
35/include/ "fsl/p1020si-pre.dtsi"
36/ {
37 model = "fsl,P1020RDB-PD";
38 compatible = "fsl,P1020RDB-PD";
39
40 memory {
41 device_type = "memory";
42 };
43
44 lbc: localbus@ffe05000 {
45 reg = <0x0 0xffe05000 0x0 0x1000>;
46
47 /* NOR, NAND flash, L2 switch and CPLD */
48 ranges = <0x0 0x0 0x0 0xec000000 0x04000000
49 0x1 0x0 0x0 0xff800000 0x00040000
50 0x2 0x0 0x0 0xffa00000 0x00020000
51 0x3 0x0 0x0 0xffb00000 0x00020000>;
52
53 nor@0,0 {
54 #address-cells = <1>;
55 #size-cells = <1>;
56 compatible = "cfi-flash";
57 reg = <0x0 0x0 0x4000000>;
58 bank-width = <2>;
59 device-width = <1>;
60
61 partition@0 {
62 /* 128KB for DTB Image */
63 reg = <0x0 0x00020000>;
64 label = "NOR DTB Image";
65 };
66
67 partition@20000 {
68 /* 3.875 MB for Linux Kernel Image */
69 reg = <0x00020000 0x003e0000>;
70 label = "NOR Linux Kernel Image";
71 };
72
73 partition@400000 {
74 /* 58MB for Root file System */
75 reg = <0x00400000 0x03a00000>;
76 label = "NOR Root File System";
77 };
78
79 partition@3e00000 {
80 /* This location must not be altered */
81 /* 1M for Vitesse 7385 Switch firmware */
82 reg = <0x3e00000 0x00100000>;
83 label = "NOR Vitesse-7385 Firmware";
84 read-only;
85 };
86
87 partition@3f00000 {
88 /* This location must not be altered */
89 /* 512KB for u-boot Bootloader Image */
90 /* 512KB for u-boot Environment Variables */
91 reg = <0x03f00000 0x00100000>;
92 label = "NOR U-Boot Image";
93 read-only;
94 };
95 };
96
97 nand@1,0 {
98 #address-cells = <1>;
99 #size-cells = <1>;
100 compatible = "fsl,p1020-fcm-nand",
101 "fsl,elbc-fcm-nand";
102 reg = <0x1 0x0 0x40000>;
103
104 partition@0 {
105 /* This location must not be altered */
106 /* 1MB for u-boot Bootloader Image */
107 reg = <0x0 0x00100000>;
108 label = "NAND U-Boot Image";
109 read-only;
110 };
111
112 partition@100000 {
113 /* 1MB for DTB Image */
114 reg = <0x00100000 0x00100000>;
115 label = "NAND DTB Image";
116 };
117
118 partition@200000 {
119 /* 4MB for Linux Kernel Image */
120 reg = <0x00200000 0x00400000>;
121 label = "NAND Linux Kernel Image";
122 };
123
124 partition@600000 {
125 /* 122MB for File System Image */
126 reg = <0x00600000 0x07a00000>;
127 label = "NAND File System Image";
128 };
129 };
130
131 cpld@2,0 {
132 compatible = "fsl,p1020rdb-pd-cpld";
133 reg = <0x2 0x0 0x20000>;
134 };
135
136 L2switch@3,0 {
137 #address-cells = <1>;
138 #size-cells = <1>;
139 compatible = "vitesse-7385";
140 reg = <0x3 0x0 0x20000>;
141 };
142 };
143
144 soc: soc@ffe00000 {
145 ranges = <0x0 0x0 0xffe00000 0x100000>;
146
147 i2c@3000 {
148 rtc@68 {
149 compatible = "dallas,ds1339";
150 reg = <0x68>;
151 };
152 };
153
154 spi@7000 {
155 flash@0 {
156 #address-cells = <1>;
157 #size-cells = <1>;
158 compatible = "spansion,s25sl12801";
159 reg = <0>;
160 /* input clock */
161 spi-max-frequency = <40000000>;
162
163 partition@0 {
164 /* 512KB for u-boot Bootloader Image */
165 reg = <0x0 0x00080000>;
166 label = "SPI U-Boot Image";
167 read-only;
168 };
169
170 partition@80000 {
171 /* 512KB for DTB Image*/
172 reg = <0x00080000 0x00080000>;
173 label = "SPI DTB Image";
174 };
175
176 partition@100000 {
177 /* 4MB for Linux Kernel Image */
178 reg = <0x00100000 0x00400000>;
179 label = "SPI Linux Kernel Image";
180 };
181
182 partition@500000 {
183 /* 11MB for FS System Image */
184 reg = <0x00500000 0x00b00000>;
185 label = "SPI File System Image";
186 };
187 };
188
189 slic@0 {
190 compatible = "zarlink,le88266";
191 reg = <1>;
192 spi-max-frequency = <8000000>;
193 };
194
195 slic@1 {
196 compatible = "zarlink,le88266";
197 reg = <2>;
198 spi-max-frequency = <8000000>;
199 };
200 };
201
202 mdio@24000 {
203 phy0: ethernet-phy@0 {
204 interrupts = <3 1 0 0>;
205 reg = <0x0>;
206 };
207
208 phy1: ethernet-phy@1 {
209 interrupts = <2 1 0 0>;
210 reg = <0x1>;
211 };
212 };
213
214 mdio@25000 {
215 tbi1: tbi-phy@11 {
216 reg = <0x11>;
217 device_type = "tbi-phy";
218 };
219 };
220
221 mdio@26000 {
222 tbi2: tbi-phy@11 {
223 reg = <0x11>;
224 device_type = "tbi-phy";
225 };
226 };
227
228 enet0: ethernet@b0000 {
229 fixed-link = <1 1 1000 0 0>;
230 phy-connection-type = "rgmii-id";
231 };
232
233 enet1: ethernet@b1000 {
234 phy-handle = <&phy0>;
235 tbi-handle = <&tbi1>;
236 phy-connection-type = "sgmii";
237 };
238
239 enet2: ethernet@b2000 {
240 phy-handle = <&phy1>;
241 phy-connection-type = "rgmii-id";
242 };
243
244 usb@22000 {
245 phy_type = "ulpi";
246 };
247 };
248
249 pci0: pcie@ffe09000 {
250 reg = <0x0 0xffe09000 0x0 0x1000>;
251 ranges = <0x2000000 0x0 0xa0000000 0x0 0xa0000000 0x0 0x20000000
252 0x1000000 0x0 0x00000000 0x0 0xffc10000 0x0 0x10000>;
253 pcie@0 {
254 ranges = <0x2000000 0x0 0xa0000000
255 0x2000000 0x0 0xa0000000
256 0x0 0x20000000
257
258 0x1000000 0x0 0x0
259 0x1000000 0x0 0x0
260 0x0 0x100000>;
261 };
262 };
263
264 pci1: pcie@ffe0a000 {
265 reg = <0x0 0xffe0a000 0x0 0x1000>;
266 ranges = <0x2000000 0x0 0x80000000 0x0 0x80000000 0x0 0x20000000
267 0x1000000 0x0 0x00000000 0x0 0xffc00000 0x0 0x10000>;
268 pcie@0 {
269 ranges = <0x2000000 0x0 0x80000000
270 0x2000000 0x0 0x80000000
271 0x0 0x20000000
272
273 0x1000000 0x0 0x0
274 0x1000000 0x0 0x0
275 0x0 0x100000>;
276 };
277 };
278};
279
280/include/ "fsl/p1020si-post.dtsi"
diff --git a/arch/powerpc/boot/dts/p1023rdb.dts b/arch/powerpc/boot/dts/p1023rdb.dts
new file mode 100644
index 000000000000..0a06a88ddbd5
--- /dev/null
+++ b/arch/powerpc/boot/dts/p1023rdb.dts
@@ -0,0 +1,234 @@
1/*
2 * P1023 RDB Device Tree Source
3 *
4 * Copyright 2013 Freescale Semiconductor Inc.
5 *
6 * Author: Chunhe Lan <Chunhe.Lan@freescale.com>
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are met:
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * * Neither the name of Freescale Semiconductor nor the
16 * names of its contributors may be used to endorse or promote products
17 * derived from this software without specific prior written permission.
18 *
19 *
20 * ALTERNATIVELY, this software may be distributed under the terms of the
21 * GNU General Public License ("GPL") as published by the Free Software
22 * Foundation, either version 2 of that License or (at your option) any
23 * later version.
24 *
25 * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
26 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
27 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
28 * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
29 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
30 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
32 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
34 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 */
36
37/include/ "fsl/p1023si-pre.dtsi"
38
39/ {
40 model = "fsl,P1023";
41 compatible = "fsl,P1023RDB";
42 #address-cells = <2>;
43 #size-cells = <2>;
44 interrupt-parent = <&mpic>;
45
46 memory {
47 device_type = "memory";
48 };
49
50 soc: soc@ff600000 {
51 ranges = <0x0 0x0 0xff600000 0x200000>;
52
53 i2c@3000 {
54 eeprom@53 {
55 compatible = "at24,24c04";
56 reg = <0x53>;
57 };
58
59 rtc@6f {
60 compatible = "microchip,mcp7941x";
61 reg = <0x6f>;
62 };
63 };
64
65 usb@22000 {
66 dr_mode = "host";
67 phy_type = "ulpi";
68 };
69 };
70
71 lbc: localbus@ff605000 {
72 reg = <0 0xff605000 0 0x1000>;
73
74 /* NOR, NAND Flashes */
75 ranges = <0x0 0x0 0x0 0xec000000 0x04000000
76 0x1 0x0 0x0 0xffa00000 0x08000000>;
77
78 nor@0,0 {
79 #address-cells = <1>;
80 #size-cells = <1>;
81 compatible = "cfi-flash";
82 reg = <0x0 0x0 0x04000000>;
83 bank-width = <2>;
84 device-width = <1>;
85
86 partition@0 {
87 /* 48MB for Root File System */
88 reg = <0x00000000 0x03000000>;
89 label = "NOR Root File System";
90 };
91
92 partition@3000000 {
93 /* 1MB for DTB Image */
94 reg = <0x03000000 0x00100000>;
95 label = "NOR DTB Image";
96 };
97
98 partition@3100000 {
99 /* 14MB for Linux Kernel Image */
100 reg = <0x03100000 0x00e00000>;
101 label = "NOR Linux Kernel Image";
102 };
103
104 partition@3f00000 {
105 /* This location must not be altered */
106 /* 512KB for u-boot Bootloader Image */
107 /* 512KB for u-boot Environment Variables */
108 reg = <0x03f00000 0x00100000>;
109 label = "NOR U-Boot Image";
110 read-only;
111 };
112 };
113
114 nand@1,0 {
115 #address-cells = <1>;
116 #size-cells = <1>;
117 compatible = "fsl,elbc-fcm-nand";
118 reg = <0x1 0x0 0x40000>;
119
120 partition@0 {
121 /* This location must not be altered */
122 /* 1MB for u-boot Bootloader Image */
123 reg = <0x0 0x00100000>;
124 label = "NAND U-Boot Image";
125 read-only;
126 };
127
128 partition@100000 {
129 /* 1MB for DTB Image */
130 reg = <0x00100000 0x00100000>;
131 label = "NAND DTB Image";
132 };
133
134 partition@200000 {
135 /* 14MB for Linux Kernel Image */
136 reg = <0x00200000 0x00e00000>;
137 label = "NAND Linux Kernel Image";
138 };
139
140 partition@1000000 {
141 /* 96MB for Root File System Image */
142 reg = <0x01000000 0x06000000>;
143 label = "NAND Root File System";
144 };
145
146 partition@7000000 {
147 /* 16MB for User Writable Area */
148 reg = <0x07000000 0x01000000>;
149 label = "NAND Writable User area";
150 };
151 };
152 };
153
154 pci0: pcie@ff60a000 {
155 reg = <0 0xff60a000 0 0x1000>;
156 ranges = <0x2000000 0x0 0xc0000000 0 0xc0000000 0x0 0x20000000
157 0x1000000 0x0 0x00000000 0 0xffc20000 0x0 0x10000>;
158 pcie@0 {
159 /* IRQ[0:3] are pulled up on board, set to active-low */
160 interrupt-map-mask = <0xf800 0 0 7>;
161 interrupt-map = <
162 /* IDSEL 0x0 */
163 0000 0 0 1 &mpic 0 1 0 0
164 0000 0 0 2 &mpic 1 1 0 0
165 0000 0 0 3 &mpic 2 1 0 0
166 0000 0 0 4 &mpic 3 1 0 0
167 >;
168 ranges = <0x2000000 0x0 0xc0000000
169 0x2000000 0x0 0xc0000000
170 0x0 0x20000000
171
172 0x1000000 0x0 0x0
173 0x1000000 0x0 0x0
174 0x0 0x100000>;
175 };
176 };
177
178 board_pci1: pci1: pcie@ff609000 {
179 reg = <0 0xff609000 0 0x1000>;
180 ranges = <0x2000000 0x0 0xa0000000 0 0xa0000000 0x0 0x20000000
181 0x1000000 0x0 0x00000000 0 0xffc10000 0x0 0x10000>;
182 pcie@0 {
183 /*
184 * IRQ[4:6] only for PCIe, set to active-high,
185 * IRQ[7] is pulled up on board, set to active-low
186 */
187 interrupt-map-mask = <0xf800 0 0 7>;
188 interrupt-map = <
189 /* IDSEL 0x0 */
190 0000 0 0 1 &mpic 4 2 0 0
191 0000 0 0 2 &mpic 5 2 0 0
192 0000 0 0 3 &mpic 6 2 0 0
193 0000 0 0 4 &mpic 7 1 0 0
194 >;
195 ranges = <0x2000000 0x0 0xa0000000
196 0x2000000 0x0 0xa0000000
197 0x0 0x20000000
198
199 0x1000000 0x0 0x0
200 0x1000000 0x0 0x0
201 0x0 0x100000>;
202 };
203 };
204
205 pci2: pcie@ff60b000 {
206 reg = <0 0xff60b000 0 0x1000>;
207 ranges = <0x2000000 0x0 0x80000000 0 0x80000000 0x0 0x20000000
208 0x1000000 0x0 0x00000000 0 0xffc00000 0x0 0x10000>;
209 pcie@0 {
210 /*
211 * IRQ[8:10] are pulled up on board, set to active-low
212 * IRQ[11] only for PCIe, set to active-high,
213 */
214 interrupt-map-mask = <0xf800 0 0 7>;
215 interrupt-map = <
216 /* IDSEL 0x0 */
217 0000 0 0 1 &mpic 8 1 0 0
218 0000 0 0 2 &mpic 9 1 0 0
219 0000 0 0 3 &mpic 10 1 0 0
220 0000 0 0 4 &mpic 11 2 0 0
221 >;
222 ranges = <0x2000000 0x0 0x80000000
223 0x2000000 0x0 0x80000000
224 0x0 0x20000000
225
226 0x1000000 0x0 0x0
227 0x1000000 0x0 0x0
228 0x0 0x100000>;
229 };
230 };
231
232};
233
234/include/ "fsl/p1023si-post.dtsi"
diff --git a/arch/powerpc/boot/dts/pdm360ng.dts b/arch/powerpc/boot/dts/pdm360ng.dts
index 74337403faee..871c16d1ad5e 100644
--- a/arch/powerpc/boot/dts/pdm360ng.dts
+++ b/arch/powerpc/boot/dts/pdm360ng.dts
@@ -13,7 +13,7 @@
13 * option) any later version. 13 * option) any later version.
14 */ 14 */
15 15
16/include/ "mpc5121.dtsi" 16#include <mpc5121.dtsi>
17 17
18/ { 18/ {
19 model = "pdm360ng"; 19 model = "pdm360ng";
diff --git a/arch/powerpc/boot/epapr-wrapper.c b/arch/powerpc/boot/epapr-wrapper.c
new file mode 100644
index 000000000000..c10191006673
--- /dev/null
+++ b/arch/powerpc/boot/epapr-wrapper.c
@@ -0,0 +1,9 @@
1extern void epapr_platform_init(unsigned long r3, unsigned long r4,
2 unsigned long r5, unsigned long r6,
3 unsigned long r7);
4
5void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
6 unsigned long r6, unsigned long r7)
7{
8 epapr_platform_init(r3, r4, r5, r6, r7);
9}
diff --git a/arch/powerpc/boot/epapr.c b/arch/powerpc/boot/epapr.c
index 06c1961bd124..02e91aa2194a 100644
--- a/arch/powerpc/boot/epapr.c
+++ b/arch/powerpc/boot/epapr.c
@@ -48,8 +48,8 @@ static void platform_fixups(void)
48 fdt_addr, fdt_totalsize((void *)fdt_addr), ima_size); 48 fdt_addr, fdt_totalsize((void *)fdt_addr), ima_size);
49} 49}
50 50
51void platform_init(unsigned long r3, unsigned long r4, unsigned long r5, 51void epapr_platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
52 unsigned long r6, unsigned long r7) 52 unsigned long r6, unsigned long r7)
53{ 53{
54 epapr_magic = r6; 54 epapr_magic = r6;
55 ima_size = r7; 55 ima_size = r7;
diff --git a/arch/powerpc/boot/of.c b/arch/powerpc/boot/of.c
index 61d9899aa0d0..62e2f43ec1df 100644
--- a/arch/powerpc/boot/of.c
+++ b/arch/powerpc/boot/of.c
@@ -26,6 +26,9 @@
26 26
27static unsigned long claim_base; 27static unsigned long claim_base;
28 28
29void epapr_platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
30 unsigned long r6, unsigned long r7);
31
29static void *of_try_claim(unsigned long size) 32static void *of_try_claim(unsigned long size)
30{ 33{
31 unsigned long addr = 0; 34 unsigned long addr = 0;
@@ -61,7 +64,7 @@ static void of_image_hdr(const void *hdr)
61 } 64 }
62} 65}
63 66
64void platform_init(unsigned long a1, unsigned long a2, void *promptr) 67static void of_platform_init(unsigned long a1, unsigned long a2, void *promptr)
65{ 68{
66 platform_ops.image_hdr = of_image_hdr; 69 platform_ops.image_hdr = of_image_hdr;
67 platform_ops.malloc = of_try_claim; 70 platform_ops.malloc = of_try_claim;
@@ -81,3 +84,14 @@ void platform_init(unsigned long a1, unsigned long a2, void *promptr)
81 loader_info.initrd_size = a2; 84 loader_info.initrd_size = a2;
82 } 85 }
83} 86}
87
88void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
89 unsigned long r6, unsigned long r7)
90{
91 /* Detect OF vs. ePAPR boot */
92 if (r5)
93 of_platform_init(r3, r4, (void *)r5);
94 else
95 epapr_platform_init(r3, r4, r5, r6, r7);
96}
97
diff --git a/arch/powerpc/boot/ppc_asm.h b/arch/powerpc/boot/ppc_asm.h
index 1c2c2817f9b7..eb0e98be69e0 100644
--- a/arch/powerpc/boot/ppc_asm.h
+++ b/arch/powerpc/boot/ppc_asm.h
@@ -59,4 +59,7 @@
59#define r30 30 59#define r30 30
60#define r31 31 60#define r31 31
61 61
62#define SPRN_TBRL 268
63#define SPRN_TBRU 269
64
62#endif /* _PPC64_PPC_ASM_H */ 65#endif /* _PPC64_PPC_ASM_H */
diff --git a/arch/powerpc/boot/util.S b/arch/powerpc/boot/util.S
index 427ddfc11991..5143228e3e5f 100644
--- a/arch/powerpc/boot/util.S
+++ b/arch/powerpc/boot/util.S
@@ -71,18 +71,18 @@ udelay:
71 add r4,r4,r5 71 add r4,r4,r5
72 addi r4,r4,-1 72 addi r4,r4,-1
73 divw r4,r4,r5 /* BUS ticks */ 73 divw r4,r4,r5 /* BUS ticks */
741: mftbu r5 741: mfspr r5, SPRN_TBRU
75 mftb r6 75 mfspr r6, SPRN_TBRL
76 mftbu r7 76 mfspr r7, SPRN_TBRU
77 cmpw 0,r5,r7 77 cmpw 0,r5,r7
78 bne 1b /* Get [synced] base time */ 78 bne 1b /* Get [synced] base time */
79 addc r9,r6,r4 /* Compute end time */ 79 addc r9,r6,r4 /* Compute end time */
80 addze r8,r5 80 addze r8,r5
812: mftbu r5 812: mfspr r5, SPRN_TBRU
82 cmpw 0,r5,r8 82 cmpw 0,r5,r8
83 blt 2b 83 blt 2b
84 bgt 3f 84 bgt 3f
85 mftb r6 85 mfspr r6, SPRN_TBRL
86 cmpw 0,r6,r9 86 cmpw 0,r6,r9
87 blt 2b 87 blt 2b
883: blr 883: blr
diff --git a/arch/powerpc/boot/wrapper b/arch/powerpc/boot/wrapper
index 6761c746048d..cd7af841ba05 100755
--- a/arch/powerpc/boot/wrapper
+++ b/arch/powerpc/boot/wrapper
@@ -148,18 +148,18 @@ make_space=y
148 148
149case "$platform" in 149case "$platform" in
150pseries) 150pseries)
151 platformo=$object/of.o 151 platformo="$object/of.o $object/epapr.o"
152 link_address='0x4000000' 152 link_address='0x4000000'
153 ;; 153 ;;
154maple) 154maple)
155 platformo=$object/of.o 155 platformo="$object/of.o $object/epapr.o"
156 link_address='0x400000' 156 link_address='0x400000'
157 ;; 157 ;;
158pmac|chrp) 158pmac|chrp)
159 platformo=$object/of.o 159 platformo="$object/of.o $object/epapr.o"
160 ;; 160 ;;
161coff) 161coff)
162 platformo="$object/crt0.o $object/of.o" 162 platformo="$object/crt0.o $object/of.o $object/epapr.o"
163 lds=$object/zImage.coff.lds 163 lds=$object/zImage.coff.lds
164 link_address='0x500000' 164 link_address='0x500000'
165 pie= 165 pie=
@@ -253,6 +253,7 @@ treeboot-iss4xx-mpic)
253 platformo="$object/treeboot-iss4xx.o" 253 platformo="$object/treeboot-iss4xx.o"
254 ;; 254 ;;
255epapr) 255epapr)
256 platformo="$object/epapr.o $object/epapr-wrapper.o"
256 link_address='0x20000000' 257 link_address='0x20000000'
257 pie=-pie 258 pie=-pie
258 ;; 259 ;;
diff --git a/arch/powerpc/configs/85xx/p1023rds_defconfig b/arch/powerpc/configs/85xx/p1023_defconfig
index b80bcc69d1f7..b06d37da44f4 100644
--- a/arch/powerpc/configs/85xx/p1023rds_defconfig
+++ b/arch/powerpc/configs/85xx/p1023_defconfig
@@ -1,14 +1,13 @@
1CONFIG_PPC_85xx=y 1CONFIG_PPC_85xx=y
2CONFIG_SMP=y 2CONFIG_SMP=y
3CONFIG_NR_CPUS=2 3CONFIG_NR_CPUS=2
4CONFIG_EXPERIMENTAL=y
5CONFIG_SYSVIPC=y 4CONFIG_SYSVIPC=y
6CONFIG_POSIX_MQUEUE=y 5CONFIG_POSIX_MQUEUE=y
7CONFIG_BSD_PROCESS_ACCT=y 6CONFIG_BSD_PROCESS_ACCT=y
8CONFIG_AUDIT=y 7CONFIG_AUDIT=y
9CONFIG_IRQ_DOMAIN_DEBUG=y
10CONFIG_NO_HZ=y 8CONFIG_NO_HZ=y
11CONFIG_HIGH_RES_TIMERS=y 9CONFIG_HIGH_RES_TIMERS=y
10CONFIG_RCU_FANOUT=32
12CONFIG_IKCONFIG=y 11CONFIG_IKCONFIG=y
13CONFIG_IKCONFIG_PROC=y 12CONFIG_IKCONFIG_PROC=y
14CONFIG_LOG_BUF_SHIFT=14 13CONFIG_LOG_BUF_SHIFT=14
@@ -22,6 +21,8 @@ CONFIG_MODVERSIONS=y
22# CONFIG_BLK_DEV_BSG is not set 21# CONFIG_BLK_DEV_BSG is not set
23CONFIG_PARTITION_ADVANCED=y 22CONFIG_PARTITION_ADVANCED=y
24CONFIG_MAC_PARTITION=y 23CONFIG_MAC_PARTITION=y
24CONFIG_PHYSICAL_START=0x00000000
25CONFIG_P1023_RDB=y
25CONFIG_P1023_RDS=y 26CONFIG_P1023_RDS=y
26CONFIG_QUICC_ENGINE=y 27CONFIG_QUICC_ENGINE=y
27CONFIG_QE_GPIO=y 28CONFIG_QE_GPIO=y
@@ -63,10 +64,21 @@ CONFIG_IPV6=y
63CONFIG_IP_SCTP=m 64CONFIG_IP_SCTP=m
64CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" 65CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
65CONFIG_DEVTMPFS=y 66CONFIG_DEVTMPFS=y
67CONFIG_DEVTMPFS_MOUNT=y
68CONFIG_MTD=y
69CONFIG_MTD_CMDLINE_PARTS=y
70CONFIG_MTD_CHAR=y
71CONFIG_MTD_BLOCK=y
72CONFIG_MTD_CFI=y
73CONFIG_MTD_CFI_AMDSTD=y
74CONFIG_MTD_PHYSMAP_OF=y
75CONFIG_MTD_NAND=y
76CONFIG_MTD_NAND_FSL_ELBC=y
66CONFIG_PROC_DEVICETREE=y 77CONFIG_PROC_DEVICETREE=y
67CONFIG_BLK_DEV_LOOP=y 78CONFIG_BLK_DEV_LOOP=y
68CONFIG_BLK_DEV_RAM=y 79CONFIG_BLK_DEV_RAM=y
69CONFIG_BLK_DEV_RAM_SIZE=131072 80CONFIG_BLK_DEV_RAM_SIZE=131072
81CONFIG_EEPROM_AT24=y
70CONFIG_EEPROM_LEGACY=y 82CONFIG_EEPROM_LEGACY=y
71CONFIG_BLK_DEV_SD=y 83CONFIG_BLK_DEV_SD=y
72CONFIG_CHR_DEV_ST=y 84CONFIG_CHR_DEV_ST=y
@@ -82,6 +94,8 @@ CONFIG_DUMMY=y
82CONFIG_FS_ENET=y 94CONFIG_FS_ENET=y
83CONFIG_FSL_PQ_MDIO=y 95CONFIG_FSL_PQ_MDIO=y
84CONFIG_E1000E=y 96CONFIG_E1000E=y
97CONFIG_PHYLIB=y
98CONFIG_AT803X_PHY=y
85CONFIG_MARVELL_PHY=y 99CONFIG_MARVELL_PHY=y
86CONFIG_DAVICOM_PHY=y 100CONFIG_DAVICOM_PHY=y
87CONFIG_CICADA_PHY=y 101CONFIG_CICADA_PHY=y
@@ -96,12 +110,15 @@ CONFIG_SERIAL_8250=y
96CONFIG_SERIAL_8250_CONSOLE=y 110CONFIG_SERIAL_8250_CONSOLE=y
97CONFIG_SERIAL_8250_NR_UARTS=2 111CONFIG_SERIAL_8250_NR_UARTS=2
98CONFIG_SERIAL_8250_RUNTIME_UARTS=2 112CONFIG_SERIAL_8250_RUNTIME_UARTS=2
113CONFIG_SERIAL_8250_EXTENDED=y
99CONFIG_SERIAL_8250_MANY_PORTS=y 114CONFIG_SERIAL_8250_MANY_PORTS=y
115CONFIG_SERIAL_8250_SHARE_IRQ=y
100CONFIG_SERIAL_8250_DETECT_IRQ=y 116CONFIG_SERIAL_8250_DETECT_IRQ=y
101CONFIG_SERIAL_8250_RSA=y 117CONFIG_SERIAL_8250_RSA=y
102CONFIG_SERIAL_QE=m 118CONFIG_HW_RANDOM=y
103CONFIG_NVRAM=y 119CONFIG_NVRAM=y
104CONFIG_I2C=y 120CONFIG_I2C=y
121CONFIG_I2C_CHARDEV=y
105CONFIG_I2C_CPM=m 122CONFIG_I2C_CPM=m
106CONFIG_I2C_MPC=y 123CONFIG_I2C_MPC=y
107CONFIG_GPIO_MPC8XXX=y 124CONFIG_GPIO_MPC8XXX=y
@@ -121,6 +138,7 @@ CONFIG_USB_STORAGE=y
121CONFIG_EDAC=y 138CONFIG_EDAC=y
122CONFIG_EDAC_MM_EDAC=y 139CONFIG_EDAC_MM_EDAC=y
123CONFIG_RTC_CLASS=y 140CONFIG_RTC_CLASS=y
141CONFIG_RTC_DRV_DS1307=y
124CONFIG_RTC_DRV_CMOS=y 142CONFIG_RTC_DRV_CMOS=y
125CONFIG_DMADEVICES=y 143CONFIG_DMADEVICES=y
126CONFIG_FSL_DMA=y 144CONFIG_FSL_DMA=y
@@ -161,6 +179,7 @@ CONFIG_DEBUG_FS=y
161CONFIG_DETECT_HUNG_TASK=y 179CONFIG_DETECT_HUNG_TASK=y
162# CONFIG_DEBUG_BUGVERBOSE is not set 180# CONFIG_DEBUG_BUGVERBOSE is not set
163CONFIG_DEBUG_INFO=y 181CONFIG_DEBUG_INFO=y
182CONFIG_STRICT_DEVMEM=y
164CONFIG_CRYPTO_PCBC=m 183CONFIG_CRYPTO_PCBC=m
165CONFIG_CRYPTO_SHA256=y 184CONFIG_CRYPTO_SHA256=y
166CONFIG_CRYPTO_SHA512=y 185CONFIG_CRYPTO_SHA512=y
diff --git a/arch/powerpc/configs/corenet32_smp_defconfig b/arch/powerpc/configs/corenet32_smp_defconfig
index 60027c2a7034..3dfab4c40c76 100644
--- a/arch/powerpc/configs/corenet32_smp_defconfig
+++ b/arch/powerpc/configs/corenet32_smp_defconfig
@@ -70,6 +70,7 @@ CONFIG_IPV6=y
70CONFIG_IP_SCTP=m 70CONFIG_IP_SCTP=m
71CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" 71CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
72CONFIG_DEVTMPFS=y 72CONFIG_DEVTMPFS=y
73CONFIG_DEVTMPFS_MOUNT=y
73CONFIG_MTD=y 74CONFIG_MTD=y
74CONFIG_MTD_CMDLINE_PARTS=y 75CONFIG_MTD_CMDLINE_PARTS=y
75CONFIG_MTD_CHAR=y 76CONFIG_MTD_CHAR=y
diff --git a/arch/powerpc/configs/corenet64_smp_defconfig b/arch/powerpc/configs/corenet64_smp_defconfig
index 6c8b020806ff..fa94fb3bb44d 100644
--- a/arch/powerpc/configs/corenet64_smp_defconfig
+++ b/arch/powerpc/configs/corenet64_smp_defconfig
@@ -27,6 +27,8 @@ CONFIG_P5040_DS=y
27CONFIG_T4240_QDS=y 27CONFIG_T4240_QDS=y
28# CONFIG_PPC_OF_BOOT_TRAMPOLINE is not set 28# CONFIG_PPC_OF_BOOT_TRAMPOLINE is not set
29CONFIG_BINFMT_MISC=m 29CONFIG_BINFMT_MISC=m
30CONFIG_MATH_EMULATION=y
31CONFIG_MATH_EMULATION_HW_UNIMPLEMENTED=y
30CONFIG_FSL_IFC=y 32CONFIG_FSL_IFC=y
31CONFIG_PCIEPORTBUS=y 33CONFIG_PCIEPORTBUS=y
32CONFIG_PCI_MSI=y 34CONFIG_PCI_MSI=y
@@ -59,6 +61,7 @@ CONFIG_IPV6=y
59CONFIG_IP_SCTP=m 61CONFIG_IP_SCTP=m
60CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" 62CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
61CONFIG_DEVTMPFS=y 63CONFIG_DEVTMPFS=y
64CONFIG_DEVTMPFS_MOUNT=y
62CONFIG_MTD=y 65CONFIG_MTD=y
63CONFIG_MTD_PARTITIONS=y 66CONFIG_MTD_PARTITIONS=y
64CONFIG_MTD_OF_PARTS=y 67CONFIG_MTD_OF_PARTS=y
diff --git a/arch/powerpc/configs/mpc83xx_defconfig b/arch/powerpc/configs/mpc83xx_defconfig
index 09116c6a6719..23fec79964cf 100644
--- a/arch/powerpc/configs/mpc83xx_defconfig
+++ b/arch/powerpc/configs/mpc83xx_defconfig
@@ -42,6 +42,7 @@ CONFIG_INET_ESP=y
42# CONFIG_IPV6 is not set 42# CONFIG_IPV6 is not set
43CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" 43CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
44CONFIG_DEVTMPFS=y 44CONFIG_DEVTMPFS=y
45CONFIG_DEVTMPFS_MOUNT=y
45# CONFIG_FW_LOADER is not set 46# CONFIG_FW_LOADER is not set
46CONFIG_MTD=y 47CONFIG_MTD=y
47CONFIG_MTD_CHAR=y 48CONFIG_MTD_CHAR=y
diff --git a/arch/powerpc/configs/mpc85xx_defconfig b/arch/powerpc/configs/mpc85xx_defconfig
index 5a58882e351e..dc098d988211 100644
--- a/arch/powerpc/configs/mpc85xx_defconfig
+++ b/arch/powerpc/configs/mpc85xx_defconfig
@@ -27,6 +27,7 @@ CONFIG_MPC85xx_MDS=y
27CONFIG_MPC8536_DS=y 27CONFIG_MPC8536_DS=y
28CONFIG_MPC85xx_DS=y 28CONFIG_MPC85xx_DS=y
29CONFIG_MPC85xx_RDB=y 29CONFIG_MPC85xx_RDB=y
30CONFIG_C293_PCIE=y
30CONFIG_P1010_RDB=y 31CONFIG_P1010_RDB=y
31CONFIG_P1022_DS=y 32CONFIG_P1022_DS=y
32CONFIG_P1022_RDK=y 33CONFIG_P1022_RDK=y
@@ -78,6 +79,7 @@ CONFIG_IPV6=y
78CONFIG_IP_SCTP=m 79CONFIG_IP_SCTP=m
79CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" 80CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
80CONFIG_DEVTMPFS=y 81CONFIG_DEVTMPFS=y
82CONFIG_DEVTMPFS_MOUNT=y
81CONFIG_MTD=y 83CONFIG_MTD=y
82CONFIG_MTD_PARTITIONS=y 84CONFIG_MTD_PARTITIONS=y
83CONFIG_MTD_OF_PARTS=y 85CONFIG_MTD_OF_PARTS=y
diff --git a/arch/powerpc/configs/mpc85xx_smp_defconfig b/arch/powerpc/configs/mpc85xx_smp_defconfig
index 152fa05b15e4..5bca60161bb3 100644
--- a/arch/powerpc/configs/mpc85xx_smp_defconfig
+++ b/arch/powerpc/configs/mpc85xx_smp_defconfig
@@ -30,6 +30,7 @@ CONFIG_MPC85xx_MDS=y
30CONFIG_MPC8536_DS=y 30CONFIG_MPC8536_DS=y
31CONFIG_MPC85xx_DS=y 31CONFIG_MPC85xx_DS=y
32CONFIG_MPC85xx_RDB=y 32CONFIG_MPC85xx_RDB=y
33CONFIG_C293_PCIE=y
33CONFIG_P1010_RDB=y 34CONFIG_P1010_RDB=y
34CONFIG_P1022_DS=y 35CONFIG_P1022_DS=y
35CONFIG_P1022_RDK=y 36CONFIG_P1022_RDK=y
@@ -81,6 +82,7 @@ CONFIG_IPV6=y
81CONFIG_IP_SCTP=m 82CONFIG_IP_SCTP=m
82CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" 83CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
83CONFIG_DEVTMPFS=y 84CONFIG_DEVTMPFS=y
85CONFIG_DEVTMPFS_MOUNT=y
84CONFIG_MTD=y 86CONFIG_MTD=y
85CONFIG_MTD_PARTITIONS=y 87CONFIG_MTD_PARTITIONS=y
86CONFIG_MTD_OF_PARTS=y 88CONFIG_MTD_OF_PARTS=y
diff --git a/arch/powerpc/include/asm/Kbuild b/arch/powerpc/include/asm/Kbuild
index 650757c300db..704e6f10ae80 100644
--- a/arch/powerpc/include/asm/Kbuild
+++ b/arch/powerpc/include/asm/Kbuild
@@ -2,3 +2,4 @@
2generic-y += clkdev.h 2generic-y += clkdev.h
3generic-y += rwsem.h 3generic-y += rwsem.h
4generic-y += trace_clock.h 4generic-y += trace_clock.h
5generic-y += vtime.h \ No newline at end of file
diff --git a/arch/powerpc/include/asm/asm-compat.h b/arch/powerpc/include/asm/asm-compat.h
index 6e82f5f9a6fd..4b237aa35660 100644
--- a/arch/powerpc/include/asm/asm-compat.h
+++ b/arch/powerpc/include/asm/asm-compat.h
@@ -32,6 +32,15 @@
32#define PPC_MTOCRF(FXM, RS) MTOCRF((FXM), RS) 32#define PPC_MTOCRF(FXM, RS) MTOCRF((FXM), RS)
33#define PPC_LR_STKOFF 16 33#define PPC_LR_STKOFF 16
34#define PPC_MIN_STKFRM 112 34#define PPC_MIN_STKFRM 112
35
36#ifdef __BIG_ENDIAN__
37#define LDX_BE stringify_in_c(ldx)
38#define STDX_BE stringify_in_c(stdx)
39#else
40#define LDX_BE stringify_in_c(ldbrx)
41#define STDX_BE stringify_in_c(stdbrx)
42#endif
43
35#else /* 32-bit */ 44#else /* 32-bit */
36 45
37/* operations for longs and pointers */ 46/* operations for longs and pointers */
diff --git a/arch/powerpc/include/asm/btext.h b/arch/powerpc/include/asm/btext.h
index 906f46e31006..89fc382648bc 100644
--- a/arch/powerpc/include/asm/btext.h
+++ b/arch/powerpc/include/asm/btext.h
@@ -13,6 +13,7 @@ extern void btext_update_display(unsigned long phys, int width, int height,
13extern void btext_setup_display(int width, int height, int depth, int pitch, 13extern void btext_setup_display(int width, int height, int depth, int pitch,
14 unsigned long address); 14 unsigned long address);
15extern void btext_prepare_BAT(void); 15extern void btext_prepare_BAT(void);
16extern void btext_map(void);
16extern void btext_unmap(void); 17extern void btext_unmap(void);
17 18
18extern void btext_drawchar(char c); 19extern void btext_drawchar(char c);
diff --git a/arch/powerpc/include/asm/cacheflush.h b/arch/powerpc/include/asm/cacheflush.h
index b843e35122e8..5b9312220e84 100644
--- a/arch/powerpc/include/asm/cacheflush.h
+++ b/arch/powerpc/include/asm/cacheflush.h
@@ -32,13 +32,7 @@ extern void flush_dcache_page(struct page *page);
32 32
33extern void __flush_disable_L1(void); 33extern void __flush_disable_L1(void);
34 34
35extern void __flush_icache_range(unsigned long, unsigned long); 35extern void flush_icache_range(unsigned long, unsigned long);
36static inline void flush_icache_range(unsigned long start, unsigned long stop)
37{
38 if (!cpu_has_feature(CPU_FTR_COHERENT_ICACHE))
39 __flush_icache_range(start, stop);
40}
41
42extern void flush_icache_user_range(struct vm_area_struct *vma, 36extern void flush_icache_user_range(struct vm_area_struct *vma,
43 struct page *page, unsigned long addr, 37 struct page *page, unsigned long addr,
44 int len); 38 int len);
diff --git a/arch/powerpc/include/asm/cputable.h b/arch/powerpc/include/asm/cputable.h
index 6f3887d884d2..0d4939ba48e7 100644
--- a/arch/powerpc/include/asm/cputable.h
+++ b/arch/powerpc/include/asm/cputable.h
@@ -371,14 +371,19 @@ extern const char *powerpc_base_platform;
371#define CPU_FTRS_E500MC (CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN | \ 371#define CPU_FTRS_E500MC (CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN | \
372 CPU_FTR_L2CSR | CPU_FTR_LWSYNC | CPU_FTR_NOEXECUTE | \ 372 CPU_FTR_L2CSR | CPU_FTR_LWSYNC | CPU_FTR_NOEXECUTE | \
373 CPU_FTR_DBELL | CPU_FTR_DEBUG_LVL_EXC | CPU_FTR_EMB_HV) 373 CPU_FTR_DBELL | CPU_FTR_DEBUG_LVL_EXC | CPU_FTR_EMB_HV)
374/*
375 * e5500/e6500 erratum A-006958 is a timebase bug that can use the
376 * same workaround as CPU_FTR_CELL_TB_BUG.
377 */
374#define CPU_FTRS_E5500 (CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN | \ 378#define CPU_FTRS_E5500 (CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN | \
375 CPU_FTR_L2CSR | CPU_FTR_LWSYNC | CPU_FTR_NOEXECUTE | \ 379 CPU_FTR_L2CSR | CPU_FTR_LWSYNC | CPU_FTR_NOEXECUTE | \
376 CPU_FTR_DBELL | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \ 380 CPU_FTR_DBELL | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \
377 CPU_FTR_DEBUG_LVL_EXC | CPU_FTR_EMB_HV) 381 CPU_FTR_DEBUG_LVL_EXC | CPU_FTR_EMB_HV | CPU_FTR_CELL_TB_BUG)
378#define CPU_FTRS_E6500 (CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN | \ 382#define CPU_FTRS_E6500 (CPU_FTR_USE_TB | CPU_FTR_NODSISRALIGN | \
379 CPU_FTR_L2CSR | CPU_FTR_LWSYNC | CPU_FTR_NOEXECUTE | \ 383 CPU_FTR_L2CSR | CPU_FTR_LWSYNC | CPU_FTR_NOEXECUTE | \
380 CPU_FTR_DBELL | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \ 384 CPU_FTR_DBELL | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \
381 CPU_FTR_DEBUG_LVL_EXC | CPU_FTR_EMB_HV | CPU_FTR_ALTIVEC_COMP) 385 CPU_FTR_DEBUG_LVL_EXC | CPU_FTR_EMB_HV | CPU_FTR_ALTIVEC_COMP | \
386 CPU_FTR_CELL_TB_BUG)
382#define CPU_FTRS_GENERIC_32 (CPU_FTR_COMMON | CPU_FTR_NODSISRALIGN) 387#define CPU_FTRS_GENERIC_32 (CPU_FTR_COMMON | CPU_FTR_NODSISRALIGN)
383 388
384/* 64-bit CPUs */ 389/* 64-bit CPUs */
diff --git a/arch/powerpc/include/asm/device.h b/arch/powerpc/include/asm/device.h
index 77e97dd0c15d..38faeded7d59 100644
--- a/arch/powerpc/include/asm/device.h
+++ b/arch/powerpc/include/asm/device.h
@@ -28,6 +28,9 @@ struct dev_archdata {
28 void *iommu_table_base; 28 void *iommu_table_base;
29 } dma_data; 29 } dma_data;
30 30
31#ifdef CONFIG_IOMMU_API
32 void *iommu_domain;
33#endif
31#ifdef CONFIG_SWIOTLB 34#ifdef CONFIG_SWIOTLB
32 dma_addr_t max_direct_dma_addr; 35 dma_addr_t max_direct_dma_addr;
33#endif 36#endif
diff --git a/arch/powerpc/include/asm/emulated_ops.h b/arch/powerpc/include/asm/emulated_ops.h
index 63f2a22e9954..5a8b82aa7241 100644
--- a/arch/powerpc/include/asm/emulated_ops.h
+++ b/arch/powerpc/include/asm/emulated_ops.h
@@ -46,8 +46,6 @@ extern struct ppc_emulated {
46 struct ppc_emulated_entry unaligned; 46 struct ppc_emulated_entry unaligned;
47#ifdef CONFIG_MATH_EMULATION 47#ifdef CONFIG_MATH_EMULATION
48 struct ppc_emulated_entry math; 48 struct ppc_emulated_entry math;
49#elif defined(CONFIG_8XX_MINIMAL_FPEMU)
50 struct ppc_emulated_entry 8xx;
51#endif 49#endif
52#ifdef CONFIG_VSX 50#ifdef CONFIG_VSX
53 struct ppc_emulated_entry vsx; 51 struct ppc_emulated_entry vsx;
diff --git a/arch/powerpc/include/asm/epapr_hcalls.h b/arch/powerpc/include/asm/epapr_hcalls.h
index d3d634274d2c..86b0ac79990c 100644
--- a/arch/powerpc/include/asm/epapr_hcalls.h
+++ b/arch/powerpc/include/asm/epapr_hcalls.h
@@ -105,6 +105,12 @@
105extern bool epapr_paravirt_enabled; 105extern bool epapr_paravirt_enabled;
106extern u32 epapr_hypercall_start[]; 106extern u32 epapr_hypercall_start[];
107 107
108#ifdef CONFIG_EPAPR_PARAVIRT
109int __init epapr_paravirt_early_init(void);
110#else
111static inline int epapr_paravirt_early_init(void) { return 0; }
112#endif
113
108/* 114/*
109 * We use "uintptr_t" to define a register because it's guaranteed to be a 115 * We use "uintptr_t" to define a register because it's guaranteed to be a
110 * 32-bit integer on a 32-bit platform, and a 64-bit integer on a 64-bit 116 * 32-bit integer on a 32-bit platform, and a 64-bit integer on a 64-bit
diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h
index 07ca627e52c0..cca12f084842 100644
--- a/arch/powerpc/include/asm/exception-64s.h
+++ b/arch/powerpc/include/asm/exception-64s.h
@@ -48,17 +48,18 @@
48#define EX_LR 72 48#define EX_LR 72
49#define EX_CFAR 80 49#define EX_CFAR 80
50#define EX_PPR 88 /* SMT thread status register (priority) */ 50#define EX_PPR 88 /* SMT thread status register (priority) */
51#define EX_CTR 96
51 52
52#ifdef CONFIG_RELOCATABLE 53#ifdef CONFIG_RELOCATABLE
53#define __EXCEPTION_RELON_PROLOG_PSERIES_1(label, h) \ 54#define __EXCEPTION_RELON_PROLOG_PSERIES_1(label, h) \
54 ld r12,PACAKBASE(r13); /* get high part of &label */ \ 55 ld r12,PACAKBASE(r13); /* get high part of &label */ \
55 mfspr r11,SPRN_##h##SRR0; /* save SRR0 */ \ 56 mfspr r11,SPRN_##h##SRR0; /* save SRR0 */ \
56 LOAD_HANDLER(r12,label); \ 57 LOAD_HANDLER(r12,label); \
57 mtlr r12; \ 58 mtctr r12; \
58 mfspr r12,SPRN_##h##SRR1; /* and SRR1 */ \ 59 mfspr r12,SPRN_##h##SRR1; /* and SRR1 */ \
59 li r10,MSR_RI; \ 60 li r10,MSR_RI; \
60 mtmsrd r10,1; /* Set RI (EE=0) */ \ 61 mtmsrd r10,1; /* Set RI (EE=0) */ \
61 blr; 62 bctr;
62#else 63#else
63/* If not relocatable, we can jump directly -- and save messing with LR */ 64/* If not relocatable, we can jump directly -- and save messing with LR */
64#define __EXCEPTION_RELON_PROLOG_PSERIES_1(label, h) \ 65#define __EXCEPTION_RELON_PROLOG_PSERIES_1(label, h) \
@@ -97,18 +98,18 @@
97 98
98#if defined(CONFIG_RELOCATABLE) 99#if defined(CONFIG_RELOCATABLE)
99/* 100/*
100 * If we support interrupts with relocation on AND we're a relocatable 101 * If we support interrupts with relocation on AND we're a relocatable kernel,
101 * kernel, we need to use LR to get to the 2nd level handler. So, save/restore 102 * we need to use CTR to get to the 2nd level handler. So, save/restore it
102 * it when required. 103 * when required.
103 */ 104 */
104#define SAVE_LR(reg, area) mflr reg ; std reg,area+EX_LR(r13) 105#define SAVE_CTR(reg, area) mfctr reg ; std reg,area+EX_CTR(r13)
105#define GET_LR(reg, area) ld reg,area+EX_LR(r13) 106#define GET_CTR(reg, area) ld reg,area+EX_CTR(r13)
106#define RESTORE_LR(reg, area) ld reg,area+EX_LR(r13) ; mtlr reg 107#define RESTORE_CTR(reg, area) ld reg,area+EX_CTR(r13) ; mtctr reg
107#else 108#else
108/* ...else LR is unused and in register. */ 109/* ...else CTR is unused and in register. */
109#define SAVE_LR(reg, area) 110#define SAVE_CTR(reg, area)
110#define GET_LR(reg, area) mflr reg 111#define GET_CTR(reg, area) mfctr reg
111#define RESTORE_LR(reg, area) 112#define RESTORE_CTR(reg, area)
112#endif 113#endif
113 114
114/* 115/*
@@ -164,7 +165,7 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
164#define __EXCEPTION_PROLOG_1(area, extra, vec) \ 165#define __EXCEPTION_PROLOG_1(area, extra, vec) \
165 OPT_SAVE_REG_TO_PACA(area+EX_PPR, r9, CPU_FTR_HAS_PPR); \ 166 OPT_SAVE_REG_TO_PACA(area+EX_PPR, r9, CPU_FTR_HAS_PPR); \
166 OPT_SAVE_REG_TO_PACA(area+EX_CFAR, r10, CPU_FTR_CFAR); \ 167 OPT_SAVE_REG_TO_PACA(area+EX_CFAR, r10, CPU_FTR_CFAR); \
167 SAVE_LR(r10, area); \ 168 SAVE_CTR(r10, area); \
168 mfcr r9; \ 169 mfcr r9; \
169 extra(vec); \ 170 extra(vec); \
170 std r11,area+EX_R11(r13); \ 171 std r11,area+EX_R11(r13); \
@@ -270,7 +271,7 @@ do_kvm_##n: \
270 sth r1,PACA_TRAP_SAVE(r13); \ 271 sth r1,PACA_TRAP_SAVE(r13); \
271 std r3,area+EX_R3(r13); \ 272 std r3,area+EX_R3(r13); \
272 addi r3,r13,area; /* r3 -> where regs are saved*/ \ 273 addi r3,r13,area; /* r3 -> where regs are saved*/ \
273 RESTORE_LR(r1, area); \ 274 RESTORE_CTR(r1, area); \
274 b bad_stack; \ 275 b bad_stack; \
2753: std r9,_CCR(r1); /* save CR in stackframe */ \ 2763: std r9,_CCR(r1); /* save CR in stackframe */ \
276 std r11,_NIP(r1); /* save SRR0 in stackframe */ \ 277 std r11,_NIP(r1); /* save SRR0 in stackframe */ \
@@ -298,10 +299,10 @@ do_kvm_##n: \
298 ld r10,area+EX_CFAR(r13); \ 299 ld r10,area+EX_CFAR(r13); \
299 std r10,ORIG_GPR3(r1); \ 300 std r10,ORIG_GPR3(r1); \
300 END_FTR_SECTION_NESTED(CPU_FTR_CFAR, CPU_FTR_CFAR, 66); \ 301 END_FTR_SECTION_NESTED(CPU_FTR_CFAR, CPU_FTR_CFAR, 66); \
301 GET_LR(r9,area); /* Get LR, later save to stack */ \ 302 mflr r9; /* Get LR, later save to stack */ \
302 ld r2,PACATOC(r13); /* get kernel TOC into r2 */ \ 303 ld r2,PACATOC(r13); /* get kernel TOC into r2 */ \
303 std r9,_LINK(r1); \ 304 std r9,_LINK(r1); \
304 mfctr r10; /* save CTR in stackframe */ \ 305 GET_CTR(r10, area); \
305 std r10,_CTR(r1); \ 306 std r10,_CTR(r1); \
306 lbz r10,PACASOFTIRQEN(r13); \ 307 lbz r10,PACASOFTIRQEN(r13); \
307 mfspr r11,SPRN_XER; /* save XER in stackframe */ \ 308 mfspr r11,SPRN_XER; /* save XER in stackframe */ \
@@ -479,7 +480,7 @@ label##_relon_hv: \
479 */ 480 */
480 481
481/* Exception addition: Hard disable interrupts */ 482/* Exception addition: Hard disable interrupts */
482#define DISABLE_INTS SOFT_DISABLE_INTS(r10,r11) 483#define DISABLE_INTS RECONCILE_IRQ_STATE(r10,r11)
483 484
484#define ADD_NVGPRS \ 485#define ADD_NVGPRS \
485 bl .save_nvgprs 486 bl .save_nvgprs
diff --git a/arch/powerpc/include/asm/fsl_pamu_stash.h b/arch/powerpc/include/asm/fsl_pamu_stash.h
new file mode 100644
index 000000000000..caa1b21c25cd
--- /dev/null
+++ b/arch/powerpc/include/asm/fsl_pamu_stash.h
@@ -0,0 +1,39 @@
1/*
2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License, version 2, as
4 * published by the Free Software Foundation.
5 *
6 * This program is distributed in the hope that it will be useful,
7 * but WITHOUT ANY WARRANTY; without even the implied warranty of
8 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 * GNU General Public License for more details.
10 *
11 * You should have received a copy of the GNU General Public License
12 * along with this program; if not, write to the Free Software
13 * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
14 *
15 * Copyright (C) 2013 Freescale Semiconductor, Inc.
16 *
17 */
18
19#ifndef __FSL_PAMU_STASH_H
20#define __FSL_PAMU_STASH_H
21
22/* cache stash targets */
23enum pamu_stash_target {
24 PAMU_ATTR_CACHE_L1 = 1,
25 PAMU_ATTR_CACHE_L2,
26 PAMU_ATTR_CACHE_L3,
27};
28
29/*
30 * This attribute allows configuring stashig specific parameters
31 * in the PAMU hardware.
32 */
33
34struct pamu_stash_attribute {
35 u32 cpu; /* cpu number */
36 u32 cache; /* cache to stash to: L1,L2,L3 */
37};
38
39#endif /* __FSL_PAMU_STASH_H */
diff --git a/arch/powerpc/include/asm/io.h b/arch/powerpc/include/asm/io.h
index dd15e5e37d6d..5a64757dc0d1 100644
--- a/arch/powerpc/include/asm/io.h
+++ b/arch/powerpc/include/asm/io.h
@@ -69,8 +69,18 @@ extern unsigned long pci_dram_offset;
69 69
70extern resource_size_t isa_mem_base; 70extern resource_size_t isa_mem_base;
71 71
72#if defined(CONFIG_PPC32) && defined(CONFIG_PPC_INDIRECT_IO) 72/* Boolean set by platform if PIO accesses are suppored while _IO_BASE
73#error CONFIG_PPC_INDIRECT_IO is not yet supported on 32 bits 73 * is not set or addresses cannot be translated to MMIO. This is typically
74 * set when the platform supports "special" PIO accesses via a non memory
75 * mapped mechanism, and allows things like the early udbg UART code to
76 * function.
77 */
78extern bool isa_io_special;
79
80#ifdef CONFIG_PPC32
81#if defined(CONFIG_PPC_INDIRECT_PIO) || defined(CONFIG_PPC_INDIRECT_MMIO)
82#error CONFIG_PPC_INDIRECT_{PIO,MMIO} are not yet supported on 32 bits
83#endif
74#endif 84#endif
75 85
76/* 86/*
@@ -222,9 +232,9 @@ extern void _memcpy_toio(volatile void __iomem *dest, const void *src,
222 * for PowerPC is as close as possible to the x86 version of these, and thus 232 * for PowerPC is as close as possible to the x86 version of these, and thus
223 * provides fairly heavy weight barriers for the non-raw versions 233 * provides fairly heavy weight barriers for the non-raw versions
224 * 234 *
225 * In addition, they support a hook mechanism when CONFIG_PPC_INDIRECT_IO 235 * In addition, they support a hook mechanism when CONFIG_PPC_INDIRECT_MMIO
226 * allowing the platform to provide its own implementation of some or all 236 * or CONFIG_PPC_INDIRECT_PIO are set allowing the platform to provide its
227 * of the accessors. 237 * own implementation of some or all of the accessors.
228 */ 238 */
229 239
230/* 240/*
@@ -240,8 +250,8 @@ extern void _memcpy_toio(volatile void __iomem *dest, const void *src,
240 250
241/* Indirect IO address tokens: 251/* Indirect IO address tokens:
242 * 252 *
243 * When CONFIG_PPC_INDIRECT_IO is set, the platform can provide hooks 253 * When CONFIG_PPC_INDIRECT_MMIO is set, the platform can provide hooks
244 * on all IOs. (Note that this is all 64 bits only for now) 254 * on all MMIOs. (Note that this is all 64 bits only for now)
245 * 255 *
246 * To help platforms who may need to differenciate MMIO addresses in 256 * To help platforms who may need to differenciate MMIO addresses in
247 * their hooks, a bitfield is reserved for use by the platform near the 257 * their hooks, a bitfield is reserved for use by the platform near the
@@ -263,11 +273,14 @@ extern void _memcpy_toio(volatile void __iomem *dest, const void *src,
263 * 273 *
264 * The direct IO mapping operations will then mask off those bits 274 * The direct IO mapping operations will then mask off those bits
265 * before doing the actual access, though that only happen when 275 * before doing the actual access, though that only happen when
266 * CONFIG_PPC_INDIRECT_IO is set, thus be careful when you use that 276 * CONFIG_PPC_INDIRECT_MMIO is set, thus be careful when you use that
267 * mechanism 277 * mechanism
278 *
279 * For PIO, there is a separate CONFIG_PPC_INDIRECT_PIO which makes
280 * all PIO functions call through a hook.
268 */ 281 */
269 282
270#ifdef CONFIG_PPC_INDIRECT_IO 283#ifdef CONFIG_PPC_INDIRECT_MMIO
271#define PCI_IO_IND_TOKEN_MASK 0x0fff000000000000ul 284#define PCI_IO_IND_TOKEN_MASK 0x0fff000000000000ul
272#define PCI_IO_IND_TOKEN_SHIFT 48 285#define PCI_IO_IND_TOKEN_SHIFT 48
273#define PCI_FIX_ADDR(addr) \ 286#define PCI_FIX_ADDR(addr) \
@@ -672,7 +685,7 @@ extern void __iomem * __ioremap_at(phys_addr_t pa, void *ea,
672extern void __iounmap_at(void *ea, unsigned long size); 685extern void __iounmap_at(void *ea, unsigned long size);
673 686
674/* 687/*
675 * When CONFIG_PPC_INDIRECT_IO is set, we use the generic iomap implementation 688 * When CONFIG_PPC_INDIRECT_PIO is set, we use the generic iomap implementation
676 * which needs some additional definitions here. They basically allow PIO 689 * which needs some additional definitions here. They basically allow PIO
677 * space overall to be 1GB. This will work as long as we never try to use 690 * space overall to be 1GB. This will work as long as we never try to use
678 * iomap to map MMIO below 1GB which should be fine on ppc64 691 * iomap to map MMIO below 1GB which should be fine on ppc64
diff --git a/arch/powerpc/include/asm/irq.h b/arch/powerpc/include/asm/irq.h
index 0e40843a1c6e..41f13cec8a8f 100644
--- a/arch/powerpc/include/asm/irq.h
+++ b/arch/powerpc/include/asm/irq.h
@@ -69,9 +69,9 @@ extern struct thread_info *softirq_ctx[NR_CPUS];
69 69
70extern void irq_ctx_init(void); 70extern void irq_ctx_init(void);
71extern void call_do_softirq(struct thread_info *tp); 71extern void call_do_softirq(struct thread_info *tp);
72extern int call_handle_irq(int irq, void *p1, 72extern void call_do_irq(struct pt_regs *regs, struct thread_info *tp);
73 struct thread_info *tp, void *func);
74extern void do_IRQ(struct pt_regs *regs); 73extern void do_IRQ(struct pt_regs *regs);
74extern void __do_irq(struct pt_regs *regs);
75 75
76int irq_choose_cpu(const struct cpumask *mask); 76int irq_choose_cpu(const struct cpumask *mask);
77 77
diff --git a/arch/powerpc/include/asm/irqflags.h b/arch/powerpc/include/asm/irqflags.h
index 6f9b6e23dc5a..f51a5580bfd0 100644
--- a/arch/powerpc/include/asm/irqflags.h
+++ b/arch/powerpc/include/asm/irqflags.h
@@ -40,9 +40,10 @@
40#define TRACE_DISABLE_INTS TRACE_WITH_FRAME_BUFFER(.trace_hardirqs_off) 40#define TRACE_DISABLE_INTS TRACE_WITH_FRAME_BUFFER(.trace_hardirqs_off)
41 41
42/* 42/*
43 * This is used by assembly code to soft-disable interrupts 43 * This is used by assembly code to soft-disable interrupts first and
44 * reconcile irq state.
44 */ 45 */
45#define SOFT_DISABLE_INTS(__rA, __rB) \ 46#define RECONCILE_IRQ_STATE(__rA, __rB) \
46 lbz __rA,PACASOFTIRQEN(r13); \ 47 lbz __rA,PACASOFTIRQEN(r13); \
47 lbz __rB,PACAIRQHAPPENED(r13); \ 48 lbz __rB,PACAIRQHAPPENED(r13); \
48 cmpwi cr0,__rA,0; \ 49 cmpwi cr0,__rA,0; \
@@ -58,7 +59,7 @@
58#define TRACE_ENABLE_INTS 59#define TRACE_ENABLE_INTS
59#define TRACE_DISABLE_INTS 60#define TRACE_DISABLE_INTS
60 61
61#define SOFT_DISABLE_INTS(__rA, __rB) \ 62#define RECONCILE_IRQ_STATE(__rA, __rB) \
62 lbz __rA,PACAIRQHAPPENED(r13); \ 63 lbz __rA,PACAIRQHAPPENED(r13); \
63 li __rB,0; \ 64 li __rB,0; \
64 ori __rA,__rA,PACA_IRQ_HARD_DIS; \ 65 ori __rA,__rA,PACA_IRQ_HARD_DIS; \
diff --git a/arch/powerpc/include/asm/kvm_book3s.h b/arch/powerpc/include/asm/kvm_book3s.h
index 08891d07aeb6..fa19e2f1a874 100644
--- a/arch/powerpc/include/asm/kvm_book3s.h
+++ b/arch/powerpc/include/asm/kvm_book3s.h
@@ -334,6 +334,27 @@ static inline u32 kvmppc_get_last_inst(struct kvm_vcpu *vcpu)
334 return r; 334 return r;
335} 335}
336 336
337/*
338 * Like kvmppc_get_last_inst(), but for fetching a sc instruction.
339 * Because the sc instruction sets SRR0 to point to the following
340 * instruction, we have to fetch from pc - 4.
341 */
342static inline u32 kvmppc_get_last_sc(struct kvm_vcpu *vcpu)
343{
344 ulong pc = kvmppc_get_pc(vcpu) - 4;
345 struct kvmppc_book3s_shadow_vcpu *svcpu = svcpu_get(vcpu);
346 u32 r;
347
348 /* Load the instruction manually if it failed to do so in the
349 * exit path */
350 if (svcpu->last_inst == KVM_INST_FETCH_FAILED)
351 kvmppc_ld(vcpu, &pc, sizeof(u32), &svcpu->last_inst, false);
352
353 r = svcpu->last_inst;
354 svcpu_put(svcpu);
355 return r;
356}
357
337static inline ulong kvmppc_get_fault_dar(struct kvm_vcpu *vcpu) 358static inline ulong kvmppc_get_fault_dar(struct kvm_vcpu *vcpu)
338{ 359{
339 struct kvmppc_book3s_shadow_vcpu *svcpu = svcpu_get(vcpu); 360 struct kvmppc_book3s_shadow_vcpu *svcpu = svcpu_get(vcpu);
@@ -446,6 +467,23 @@ static inline u32 kvmppc_get_last_inst(struct kvm_vcpu *vcpu)
446 return vcpu->arch.last_inst; 467 return vcpu->arch.last_inst;
447} 468}
448 469
470/*
471 * Like kvmppc_get_last_inst(), but for fetching a sc instruction.
472 * Because the sc instruction sets SRR0 to point to the following
473 * instruction, we have to fetch from pc - 4.
474 */
475static inline u32 kvmppc_get_last_sc(struct kvm_vcpu *vcpu)
476{
477 ulong pc = kvmppc_get_pc(vcpu) - 4;
478
479 /* Load the instruction manually if it failed to do so in the
480 * exit path */
481 if (vcpu->arch.last_inst == KVM_INST_FETCH_FAILED)
482 kvmppc_ld(vcpu, &pc, sizeof(u32), &vcpu->arch.last_inst, false);
483
484 return vcpu->arch.last_inst;
485}
486
449static inline ulong kvmppc_get_fault_dar(struct kvm_vcpu *vcpu) 487static inline ulong kvmppc_get_fault_dar(struct kvm_vcpu *vcpu)
450{ 488{
451 return vcpu->arch.fault_dar; 489 return vcpu->arch.fault_dar;
diff --git a/arch/powerpc/include/asm/kvm_book3s_64.h b/arch/powerpc/include/asm/kvm_book3s_64.h
index a1ecb14e4442..86d638a3b359 100644
--- a/arch/powerpc/include/asm/kvm_book3s_64.h
+++ b/arch/powerpc/include/asm/kvm_book3s_64.h
@@ -37,7 +37,7 @@ static inline void svcpu_put(struct kvmppc_book3s_shadow_vcpu *svcpu)
37 37
38#ifdef CONFIG_KVM_BOOK3S_64_HV 38#ifdef CONFIG_KVM_BOOK3S_64_HV
39#define KVM_DEFAULT_HPT_ORDER 24 /* 16MB HPT by default */ 39#define KVM_DEFAULT_HPT_ORDER 24 /* 16MB HPT by default */
40extern int kvm_hpt_order; /* order of preallocated HPTs */ 40extern unsigned long kvm_rma_pages;
41#endif 41#endif
42 42
43#define VRMA_VSID 0x1ffffffUL /* 1TB VSID reserved for VRMA */ 43#define VRMA_VSID 0x1ffffffUL /* 1TB VSID reserved for VRMA */
@@ -100,7 +100,7 @@ static inline unsigned long compute_tlbie_rb(unsigned long v, unsigned long r,
100 /* (masks depend on page size) */ 100 /* (masks depend on page size) */
101 rb |= 0x1000; /* page encoding in LP field */ 101 rb |= 0x1000; /* page encoding in LP field */
102 rb |= (va_low & 0x7f) << 16; /* 7b of VA in AVA/LP field */ 102 rb |= (va_low & 0x7f) << 16; /* 7b of VA in AVA/LP field */
103 rb |= (va_low & 0xfe); /* AVAL field (P7 doesn't seem to care) */ 103 rb |= ((va_low << 4) & 0xf0); /* AVAL field (P7 doesn't seem to care) */
104 } 104 }
105 } else { 105 } else {
106 /* 4kB page */ 106 /* 4kB page */
diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h
index af326cde7cb6..33283532e9d8 100644
--- a/arch/powerpc/include/asm/kvm_host.h
+++ b/arch/powerpc/include/asm/kvm_host.h
@@ -183,13 +183,9 @@ struct kvmppc_spapr_tce_table {
183 struct page *pages[0]; 183 struct page *pages[0];
184}; 184};
185 185
186struct kvmppc_linear_info { 186struct kvm_rma_info {
187 void *base_virt; 187 atomic_t use_count;
188 unsigned long base_pfn; 188 unsigned long base_pfn;
189 unsigned long npages;
190 struct list_head list;
191 atomic_t use_count;
192 int type;
193}; 189};
194 190
195/* XICS components, defined in book3s_xics.c */ 191/* XICS components, defined in book3s_xics.c */
@@ -246,7 +242,7 @@ struct kvm_arch {
246 int tlbie_lock; 242 int tlbie_lock;
247 unsigned long lpcr; 243 unsigned long lpcr;
248 unsigned long rmor; 244 unsigned long rmor;
249 struct kvmppc_linear_info *rma; 245 struct kvm_rma_info *rma;
250 unsigned long vrma_slb_v; 246 unsigned long vrma_slb_v;
251 int rma_setup_done; 247 int rma_setup_done;
252 int using_mmu_notifiers; 248 int using_mmu_notifiers;
@@ -259,7 +255,7 @@ struct kvm_arch {
259 spinlock_t slot_phys_lock; 255 spinlock_t slot_phys_lock;
260 cpumask_t need_tlb_flush; 256 cpumask_t need_tlb_flush;
261 struct kvmppc_vcore *vcores[KVM_MAX_VCORES]; 257 struct kvmppc_vcore *vcores[KVM_MAX_VCORES];
262 struct kvmppc_linear_info *hpt_li; 258 int hpt_cma_alloc;
263#endif /* CONFIG_KVM_BOOK3S_64_HV */ 259#endif /* CONFIG_KVM_BOOK3S_64_HV */
264#ifdef CONFIG_PPC_BOOK3S_64 260#ifdef CONFIG_PPC_BOOK3S_64
265 struct list_head spapr_tce_tables; 261 struct list_head spapr_tce_tables;
diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h
index a5287fe03d77..b15554a26c20 100644
--- a/arch/powerpc/include/asm/kvm_ppc.h
+++ b/arch/powerpc/include/asm/kvm_ppc.h
@@ -137,10 +137,10 @@ extern long kvmppc_h_put_tce(struct kvm_vcpu *vcpu, unsigned long liobn,
137 unsigned long ioba, unsigned long tce); 137 unsigned long ioba, unsigned long tce);
138extern long kvm_vm_ioctl_allocate_rma(struct kvm *kvm, 138extern long kvm_vm_ioctl_allocate_rma(struct kvm *kvm,
139 struct kvm_allocate_rma *rma); 139 struct kvm_allocate_rma *rma);
140extern struct kvmppc_linear_info *kvm_alloc_rma(void); 140extern struct kvm_rma_info *kvm_alloc_rma(void);
141extern void kvm_release_rma(struct kvmppc_linear_info *ri); 141extern void kvm_release_rma(struct kvm_rma_info *ri);
142extern struct kvmppc_linear_info *kvm_alloc_hpt(void); 142extern struct page *kvm_alloc_hpt(unsigned long nr_pages);
143extern void kvm_release_hpt(struct kvmppc_linear_info *li); 143extern void kvm_release_hpt(struct page *page, unsigned long nr_pages);
144extern int kvmppc_core_init_vm(struct kvm *kvm); 144extern int kvmppc_core_init_vm(struct kvm *kvm);
145extern void kvmppc_core_destroy_vm(struct kvm *kvm); 145extern void kvmppc_core_destroy_vm(struct kvm *kvm);
146extern void kvmppc_core_free_memslot(struct kvm_memory_slot *free, 146extern void kvmppc_core_free_memslot(struct kvm_memory_slot *free,
@@ -261,6 +261,7 @@ void kvmppc_set_pid(struct kvm_vcpu *vcpu, u32 pid);
261struct openpic; 261struct openpic;
262 262
263#ifdef CONFIG_KVM_BOOK3S_64_HV 263#ifdef CONFIG_KVM_BOOK3S_64_HV
264extern void kvm_cma_reserve(void) __init;
264static inline void kvmppc_set_xics_phys(int cpu, unsigned long addr) 265static inline void kvmppc_set_xics_phys(int cpu, unsigned long addr)
265{ 266{
266 paca[cpu].kvm_hstate.xics_phys = addr; 267 paca[cpu].kvm_hstate.xics_phys = addr;
@@ -281,13 +282,12 @@ static inline void kvmppc_set_host_ipi(int cpu, u8 host_ipi)
281} 282}
282 283
283extern void kvmppc_fast_vcpu_kick(struct kvm_vcpu *vcpu); 284extern void kvmppc_fast_vcpu_kick(struct kvm_vcpu *vcpu);
284extern void kvm_linear_init(void);
285 285
286#else 286#else
287static inline void kvmppc_set_xics_phys(int cpu, unsigned long addr) 287static inline void __init kvm_cma_reserve(void)
288{} 288{}
289 289
290static inline void kvm_linear_init(void) 290static inline void kvmppc_set_xics_phys(int cpu, unsigned long addr)
291{} 291{}
292 292
293static inline u32 kvmppc_get_xics_latch(void) 293static inline u32 kvmppc_get_xics_latch(void)
@@ -394,10 +394,15 @@ static inline void kvmppc_mmu_flush_icache(pfn_t pfn)
394 } 394 }
395} 395}
396 396
397/* Please call after prepare_to_enter. This function puts the lazy ee state 397/*
398 back to normal mode, without actually enabling interrupts. */ 398 * Please call after prepare_to_enter. This function puts the lazy ee and irq
399static inline void kvmppc_lazy_ee_enable(void) 399 * disabled tracking state back to normal mode, without actually enabling
400 * interrupts.
401 */
402static inline void kvmppc_fix_ee_before_entry(void)
400{ 403{
404 trace_hardirqs_on();
405
401#ifdef CONFIG_PPC64 406#ifdef CONFIG_PPC64
402 /* Only need to enable IRQs by hard enabling them after this */ 407 /* Only need to enable IRQs by hard enabling them after this */
403 local_paca->irq_happened = 0; 408 local_paca->irq_happened = 0;
diff --git a/arch/powerpc/include/asm/lppaca.h b/arch/powerpc/include/asm/lppaca.h
index 9b12f88d4adb..4470d1e34d23 100644
--- a/arch/powerpc/include/asm/lppaca.h
+++ b/arch/powerpc/include/asm/lppaca.h
@@ -48,15 +48,13 @@
48struct lppaca { 48struct lppaca {
49 /* cacheline 1 contains read-only data */ 49 /* cacheline 1 contains read-only data */
50 50
51 u32 desc; /* Eye catcher 0xD397D781 */ 51 __be32 desc; /* Eye catcher 0xD397D781 */
52 u16 size; /* Size of this struct */ 52 __be16 size; /* Size of this struct */
53 u16 reserved1; 53 u8 reserved1[3];
54 u16 reserved2:14; 54 u8 __old_status; /* Old status, including shared proc */
55 u8 shared_proc:1; /* Shared processor indicator */
56 u8 secondary_thread:1; /* Secondary thread indicator */
57 u8 reserved3[14]; 55 u8 reserved3[14];
58 volatile u32 dyn_hw_node_id; /* Dynamic hardware node id */ 56 volatile __be32 dyn_hw_node_id; /* Dynamic hardware node id */
59 volatile u32 dyn_hw_proc_id; /* Dynamic hardware proc id */ 57 volatile __be32 dyn_hw_proc_id; /* Dynamic hardware proc id */
60 u8 reserved4[56]; 58 u8 reserved4[56];
61 volatile u8 vphn_assoc_counts[8]; /* Virtual processor home node */ 59 volatile u8 vphn_assoc_counts[8]; /* Virtual processor home node */
62 /* associativity change counters */ 60 /* associativity change counters */
@@ -73,9 +71,9 @@ struct lppaca {
73 u8 fpregs_in_use; 71 u8 fpregs_in_use;
74 u8 pmcregs_in_use; 72 u8 pmcregs_in_use;
75 u8 reserved8[28]; 73 u8 reserved8[28];
76 u64 wait_state_cycles; /* Wait cycles for this proc */ 74 __be64 wait_state_cycles; /* Wait cycles for this proc */
77 u8 reserved9[28]; 75 u8 reserved9[28];
78 u16 slb_count; /* # of SLBs to maintain */ 76 __be16 slb_count; /* # of SLBs to maintain */
79 u8 idle; /* Indicate OS is idle */ 77 u8 idle; /* Indicate OS is idle */
80 u8 vmxregs_in_use; 78 u8 vmxregs_in_use;
81 79
@@ -89,17 +87,17 @@ struct lppaca {
89 * NOTE: This value will ALWAYS be zero for dedicated processors and 87 * NOTE: This value will ALWAYS be zero for dedicated processors and
90 * will NEVER be zero for shared processors (ie, initialized to a 1). 88 * will NEVER be zero for shared processors (ie, initialized to a 1).
91 */ 89 */
92 volatile u32 yield_count; 90 volatile __be32 yield_count;
93 volatile u32 dispersion_count; /* dispatch changed physical cpu */ 91 volatile __be32 dispersion_count; /* dispatch changed physical cpu */
94 volatile u64 cmo_faults; /* CMO page fault count */ 92 volatile __be64 cmo_faults; /* CMO page fault count */
95 volatile u64 cmo_fault_time; /* CMO page fault time */ 93 volatile __be64 cmo_fault_time; /* CMO page fault time */
96 u8 reserved10[104]; 94 u8 reserved10[104];
97 95
98 /* cacheline 4-5 */ 96 /* cacheline 4-5 */
99 97
100 u32 page_ins; /* CMO Hint - # page ins by OS */ 98 __be32 page_ins; /* CMO Hint - # page ins by OS */
101 u8 reserved11[148]; 99 u8 reserved11[148];
102 volatile u64 dtl_idx; /* Dispatch Trace Log head index */ 100 volatile __be64 dtl_idx; /* Dispatch Trace Log head index */
103 u8 reserved12[96]; 101 u8 reserved12[96];
104} __attribute__((__aligned__(0x400))); 102} __attribute__((__aligned__(0x400)));
105 103
@@ -108,17 +106,29 @@ extern struct lppaca lppaca[];
108#define lppaca_of(cpu) (*paca[cpu].lppaca_ptr) 106#define lppaca_of(cpu) (*paca[cpu].lppaca_ptr)
109 107
110/* 108/*
109 * Old kernels used a reserved bit in the VPA to determine if it was running
110 * in shared processor mode. New kernels look for a non zero yield count
111 * but KVM still needs to set the bit to keep the old stuff happy.
112 */
113#define LPPACA_OLD_SHARED_PROC 2
114
115static inline bool lppaca_shared_proc(struct lppaca *l)
116{
117 return l->yield_count != 0;
118}
119
120/*
111 * SLB shadow buffer structure as defined in the PAPR. The save_area 121 * SLB shadow buffer structure as defined in the PAPR. The save_area
112 * contains adjacent ESID and VSID pairs for each shadowed SLB. The 122 * contains adjacent ESID and VSID pairs for each shadowed SLB. The
113 * ESID is stored in the lower 64bits, then the VSID. 123 * ESID is stored in the lower 64bits, then the VSID.
114 */ 124 */
115struct slb_shadow { 125struct slb_shadow {
116 u32 persistent; /* Number of persistent SLBs */ 126 __be32 persistent; /* Number of persistent SLBs */
117 u32 buffer_length; /* Total shadow buffer length */ 127 __be32 buffer_length; /* Total shadow buffer length */
118 u64 reserved; 128 __be64 reserved;
119 struct { 129 struct {
120 u64 esid; 130 __be64 esid;
121 u64 vsid; 131 __be64 vsid;
122 } save_area[SLB_NUM_BOLTED]; 132 } save_area[SLB_NUM_BOLTED];
123} ____cacheline_aligned; 133} ____cacheline_aligned;
124 134
@@ -130,14 +140,14 @@ extern struct slb_shadow slb_shadow[];
130struct dtl_entry { 140struct dtl_entry {
131 u8 dispatch_reason; 141 u8 dispatch_reason;
132 u8 preempt_reason; 142 u8 preempt_reason;
133 u16 processor_id; 143 __be16 processor_id;
134 u32 enqueue_to_dispatch_time; 144 __be32 enqueue_to_dispatch_time;
135 u32 ready_to_enqueue_time; 145 __be32 ready_to_enqueue_time;
136 u32 waiting_to_ready_time; 146 __be32 waiting_to_ready_time;
137 u64 timebase; 147 __be64 timebase;
138 u64 fault_addr; 148 __be64 fault_addr;
139 u64 srr0; 149 __be64 srr0;
140 u64 srr1; 150 __be64 srr1;
141}; 151};
142 152
143#define DISPATCH_LOG_BYTES 4096 /* bytes per cpu */ 153#define DISPATCH_LOG_BYTES 4096 /* bytes per cpu */
diff --git a/arch/powerpc/include/asm/mpc5121.h b/arch/powerpc/include/asm/mpc5121.h
index 8ae133eaf9fa..887d3d6133e3 100644
--- a/arch/powerpc/include/asm/mpc5121.h
+++ b/arch/powerpc/include/asm/mpc5121.h
@@ -32,25 +32,11 @@ struct mpc512x_ccm {
32 u32 scfr2; /* System Clock Frequency Register 2 */ 32 u32 scfr2; /* System Clock Frequency Register 2 */
33 u32 scfr2s; /* System Clock Frequency Shadow Register 2 */ 33 u32 scfr2s; /* System Clock Frequency Shadow Register 2 */
34 u32 bcr; /* Bread Crumb Register */ 34 u32 bcr; /* Bread Crumb Register */
35 u32 p0ccr; /* PSC0 Clock Control Register */ 35 u32 psc_ccr[12]; /* PSC Clock Control Registers */
36 u32 p1ccr; /* PSC1 CCR */
37 u32 p2ccr; /* PSC2 CCR */
38 u32 p3ccr; /* PSC3 CCR */
39 u32 p4ccr; /* PSC4 CCR */
40 u32 p5ccr; /* PSC5 CCR */
41 u32 p6ccr; /* PSC6 CCR */
42 u32 p7ccr; /* PSC7 CCR */
43 u32 p8ccr; /* PSC8 CCR */
44 u32 p9ccr; /* PSC9 CCR */
45 u32 p10ccr; /* PSC10 CCR */
46 u32 p11ccr; /* PSC11 CCR */
47 u32 spccr; /* SPDIF Clock Control Register */ 36 u32 spccr; /* SPDIF Clock Control Register */
48 u32 cccr; /* CFM Clock Control Register */ 37 u32 cccr; /* CFM Clock Control Register */
49 u32 dccr; /* DIU Clock Control Register */ 38 u32 dccr; /* DIU Clock Control Register */
50 u32 m1ccr; /* MSCAN1 CCR */ 39 u32 mscan_ccr[4]; /* MSCAN Clock Control Registers */
51 u32 m2ccr; /* MSCAN2 CCR */
52 u32 m3ccr; /* MSCAN3 CCR */
53 u32 m4ccr; /* MSCAN4 CCR */
54 u8 res[0x98]; /* Reserved */ 40 u8 res[0x98]; /* Reserved */
55}; 41};
56 42
diff --git a/arch/powerpc/include/asm/mpc85xx.h b/arch/powerpc/include/asm/mpc85xx.h
new file mode 100644
index 000000000000..736d4acc05a8
--- /dev/null
+++ b/arch/powerpc/include/asm/mpc85xx.h
@@ -0,0 +1,92 @@
1/*
2 * MPC85xx cpu type detection
3 *
4 * Copyright 2011-2012 Freescale Semiconductor, Inc.
5 *
6 * This is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 */
11
12#ifndef __ASM_PPC_MPC85XX_H
13#define __ASM_PPC_MPC85XX_H
14
15#define SVR_REV(svr) ((svr) & 0xFF) /* SOC design resision */
16#define SVR_MAJ(svr) (((svr) >> 4) & 0xF) /* Major revision field*/
17#define SVR_MIN(svr) (((svr) >> 0) & 0xF) /* Minor revision field*/
18
19/* Some parts define SVR[0:23] as the SOC version */
20#define SVR_SOC_VER(svr) (((svr) >> 8) & 0xFFF7FF) /* SOC Version fields */
21
22#define SVR_8533 0x803400
23#define SVR_8535 0x803701
24#define SVR_8536 0x803700
25#define SVR_8540 0x803000
26#define SVR_8541 0x807200
27#define SVR_8543 0x803200
28#define SVR_8544 0x803401
29#define SVR_8545 0x803102
30#define SVR_8547 0x803101
31#define SVR_8548 0x803100
32#define SVR_8555 0x807100
33#define SVR_8560 0x807000
34#define SVR_8567 0x807501
35#define SVR_8568 0x807500
36#define SVR_8569 0x808000
37#define SVR_8572 0x80E000
38#define SVR_P1010 0x80F100
39#define SVR_P1011 0x80E500
40#define SVR_P1012 0x80E501
41#define SVR_P1013 0x80E700
42#define SVR_P1014 0x80F101
43#define SVR_P1017 0x80F700
44#define SVR_P1020 0x80E400
45#define SVR_P1021 0x80E401
46#define SVR_P1022 0x80E600
47#define SVR_P1023 0x80F600
48#define SVR_P1024 0x80E402
49#define SVR_P1025 0x80E403
50#define SVR_P2010 0x80E300
51#define SVR_P2020 0x80E200
52#define SVR_P2040 0x821000
53#define SVR_P2041 0x821001
54#define SVR_P3041 0x821103
55#define SVR_P4040 0x820100
56#define SVR_P4080 0x820000
57#define SVR_P5010 0x822100
58#define SVR_P5020 0x822000
59#define SVR_P5021 0X820500
60#define SVR_P5040 0x820400
61#define SVR_T4240 0x824000
62#define SVR_T4120 0x824001
63#define SVR_T4160 0x824100
64#define SVR_C291 0x850000
65#define SVR_C292 0x850020
66#define SVR_C293 0x850030
67#define SVR_B4860 0X868000
68#define SVR_G4860 0x868001
69#define SVR_G4060 0x868003
70#define SVR_B4440 0x868100
71#define SVR_G4440 0x868101
72#define SVR_B4420 0x868102
73#define SVR_B4220 0x868103
74#define SVR_T1040 0x852000
75#define SVR_T1041 0x852001
76#define SVR_T1042 0x852002
77#define SVR_T1020 0x852100
78#define SVR_T1021 0x852101
79#define SVR_T1022 0x852102
80
81#define SVR_8610 0x80A000
82#define SVR_8641 0x809000
83#define SVR_8641D 0x809001
84
85#define SVR_9130 0x860001
86#define SVR_9131 0x860000
87#define SVR_9132 0x861000
88#define SVR_9232 0x861400
89
90#define SVR_Unknown 0xFFFFFF
91
92#endif
diff --git a/arch/powerpc/include/asm/mpic.h b/arch/powerpc/include/asm/mpic.h
index 4a1ac9fbf186..754f93d208fa 100644
--- a/arch/powerpc/include/asm/mpic.h
+++ b/arch/powerpc/include/asm/mpic.h
@@ -396,7 +396,14 @@ extern struct bus_type mpic_subsys;
396#define MPIC_REGSET_TSI108 MPIC_REGSET(1) /* Tsi108/109 PIC */ 396#define MPIC_REGSET_TSI108 MPIC_REGSET(1) /* Tsi108/109 PIC */
397 397
398/* Get the version of primary MPIC */ 398/* Get the version of primary MPIC */
399#ifdef CONFIG_MPIC
399extern u32 fsl_mpic_primary_get_version(void); 400extern u32 fsl_mpic_primary_get_version(void);
401#else
402static inline u32 fsl_mpic_primary_get_version(void)
403{
404 return 0;
405}
406#endif
400 407
401/* Allocate the controller structure and setup the linux irq descs 408/* Allocate the controller structure and setup the linux irq descs
402 * for the range if interrupts passed in. No HW initialization is 409 * for the range if interrupts passed in. No HW initialization is
diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h
index 029fe85722aa..c5cd72833d6e 100644
--- a/arch/powerpc/include/asm/opal.h
+++ b/arch/powerpc/include/asm/opal.h
@@ -124,6 +124,11 @@ extern int opal_enter_rtas(struct rtas_args *args,
124#define OPAL_PCI_POLL 62 124#define OPAL_PCI_POLL 62
125#define OPAL_PCI_MSI_EOI 63 125#define OPAL_PCI_MSI_EOI 63
126#define OPAL_PCI_GET_PHB_DIAG_DATA2 64 126#define OPAL_PCI_GET_PHB_DIAG_DATA2 64
127#define OPAL_XSCOM_READ 65
128#define OPAL_XSCOM_WRITE 66
129#define OPAL_LPC_READ 67
130#define OPAL_LPC_WRITE 68
131#define OPAL_RETURN_CPU 69
127 132
128#ifndef __ASSEMBLY__ 133#ifndef __ASSEMBLY__
129 134
@@ -337,6 +342,17 @@ enum OpalEpowStatus {
337 OPAL_EPOW_OVER_INTERNAL_TEMP = 3 342 OPAL_EPOW_OVER_INTERNAL_TEMP = 3
338}; 343};
339 344
345/*
346 * Address cycle types for LPC accesses. These also correspond
347 * to the content of the first cell of the "reg" property for
348 * device nodes on the LPC bus
349 */
350enum OpalLPCAddressType {
351 OPAL_LPC_MEM = 0,
352 OPAL_LPC_IO = 1,
353 OPAL_LPC_FW = 2,
354};
355
340struct opal_machine_check_event { 356struct opal_machine_check_event {
341 enum OpalMCE_Version version:8; /* 0x00 */ 357 enum OpalMCE_Version version:8; /* 0x00 */
342 uint8_t in_use; /* 0x01 */ 358 uint8_t in_use; /* 0x01 */
@@ -631,6 +647,15 @@ int64_t opal_set_system_attention_led(uint8_t led_action);
631int64_t opal_pci_next_error(uint64_t phb_id, uint64_t *first_frozen_pe, 647int64_t opal_pci_next_error(uint64_t phb_id, uint64_t *first_frozen_pe,
632 uint16_t *pci_error_type, uint16_t *severity); 648 uint16_t *pci_error_type, uint16_t *severity);
633int64_t opal_pci_poll(uint64_t phb_id); 649int64_t opal_pci_poll(uint64_t phb_id);
650int64_t opal_return_cpu(void);
651
652int64_t opal_xscom_read(uint32_t gcid, uint32_t pcb_addr, uint64_t *val);
653int64_t opal_xscom_write(uint32_t gcid, uint32_t pcb_addr, uint64_t val);
654
655int64_t opal_lpc_write(uint32_t chip_id, enum OpalLPCAddressType addr_type,
656 uint32_t addr, uint32_t data, uint32_t sz);
657int64_t opal_lpc_read(uint32_t chip_id, enum OpalLPCAddressType addr_type,
658 uint32_t addr, uint32_t *data, uint32_t sz);
634 659
635/* Internal functions */ 660/* Internal functions */
636extern int early_init_dt_scan_opal(unsigned long node, const char *uname, int depth, void *data); 661extern int early_init_dt_scan_opal(unsigned long node, const char *uname, int depth, void *data);
@@ -664,6 +689,8 @@ extern int opal_machine_check(struct pt_regs *regs);
664 689
665extern void opal_shutdown(void); 690extern void opal_shutdown(void);
666 691
692extern void opal_lpc_init(void);
693
667#endif /* __ASSEMBLY__ */ 694#endif /* __ASSEMBLY__ */
668 695
669#endif /* __OPAL_H */ 696#endif /* __OPAL_H */
diff --git a/arch/powerpc/include/asm/paca.h b/arch/powerpc/include/asm/paca.h
index 77c91e74b612..a5954cebbc55 100644
--- a/arch/powerpc/include/asm/paca.h
+++ b/arch/powerpc/include/asm/paca.h
@@ -68,8 +68,13 @@ struct paca_struct {
68 * instruction. They must travel together and be properly 68 * instruction. They must travel together and be properly
69 * aligned. 69 * aligned.
70 */ 70 */
71#ifdef __BIG_ENDIAN__
71 u16 lock_token; /* Constant 0x8000, used in locks */ 72 u16 lock_token; /* Constant 0x8000, used in locks */
72 u16 paca_index; /* Logical processor number */ 73 u16 paca_index; /* Logical processor number */
74#else
75 u16 paca_index; /* Logical processor number */
76 u16 lock_token; /* Constant 0x8000, used in locks */
77#endif
73 78
74 u64 kernel_toc; /* Kernel TOC address */ 79 u64 kernel_toc; /* Kernel TOC address */
75 u64 kernelbase; /* Base address of kernel */ 80 u64 kernelbase; /* Base address of kernel */
@@ -93,9 +98,9 @@ struct paca_struct {
93 * Now, starting in cacheline 2, the exception save areas 98 * Now, starting in cacheline 2, the exception save areas
94 */ 99 */
95 /* used for most interrupts/exceptions */ 100 /* used for most interrupts/exceptions */
96 u64 exgen[12] __attribute__((aligned(0x80))); 101 u64 exgen[13] __attribute__((aligned(0x80)));
97 u64 exmc[12]; /* used for machine checks */ 102 u64 exmc[13]; /* used for machine checks */
98 u64 exslb[12]; /* used for SLB/segment table misses 103 u64 exslb[13]; /* used for SLB/segment table misses
99 * on the linear mapping */ 104 * on the linear mapping */
100 /* SLB related definitions */ 105 /* SLB related definitions */
101 u16 vmalloc_sllp; 106 u16 vmalloc_sllp;
diff --git a/arch/powerpc/include/asm/page.h b/arch/powerpc/include/asm/page.h
index 988c812aab5b..b9f426212d3a 100644
--- a/arch/powerpc/include/asm/page.h
+++ b/arch/powerpc/include/asm/page.h
@@ -211,9 +211,19 @@ extern long long virt_phys_offset;
211#define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) + VIRT_PHYS_OFFSET)) 211#define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) + VIRT_PHYS_OFFSET))
212#define __pa(x) ((unsigned long)(x) - VIRT_PHYS_OFFSET) 212#define __pa(x) ((unsigned long)(x) - VIRT_PHYS_OFFSET)
213#else 213#else
214#ifdef CONFIG_PPC64
215/*
216 * gcc miscompiles (unsigned long)(&static_var) - PAGE_OFFSET
217 * with -mcmodel=medium, so we use & and | instead of - and + on 64-bit.
218 */
219#define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) | PAGE_OFFSET))
220#define __pa(x) ((unsigned long)(x) & 0x0fffffffffffffffUL)
221
222#else /* 32-bit, non book E */
214#define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) + PAGE_OFFSET - MEMORY_START)) 223#define __va(x) ((void *)(unsigned long)((phys_addr_t)(x) + PAGE_OFFSET - MEMORY_START))
215#define __pa(x) ((unsigned long)(x) - PAGE_OFFSET + MEMORY_START) 224#define __pa(x) ((unsigned long)(x) - PAGE_OFFSET + MEMORY_START)
216#endif 225#endif
226#endif
217 227
218/* 228/*
219 * Unfortunately the PLT is in the BSS in the PPC32 ELF ABI, 229 * Unfortunately the PLT is in the BSS in the PPC32 ELF ABI,
diff --git a/arch/powerpc/include/asm/pci-bridge.h b/arch/powerpc/include/asm/pci-bridge.h
index 32d0d2018faf..4ca90a39d6d0 100644
--- a/arch/powerpc/include/asm/pci-bridge.h
+++ b/arch/powerpc/include/asm/pci-bridge.h
@@ -159,7 +159,7 @@ struct pci_dn {
159 159
160 int pci_ext_config_space; /* for pci devices */ 160 int pci_ext_config_space; /* for pci devices */
161 161
162 int force_32bit_msi:1; 162 bool force_32bit_msi;
163 163
164 struct pci_dev *pcidev; /* back-pointer to the pci device */ 164 struct pci_dev *pcidev; /* back-pointer to the pci device */
165#ifdef CONFIG_EEH 165#ifdef CONFIG_EEH
diff --git a/arch/powerpc/include/asm/pci.h b/arch/powerpc/include/asm/pci.h
index 6653f2743c4e..95145a15c708 100644
--- a/arch/powerpc/include/asm/pci.h
+++ b/arch/powerpc/include/asm/pci.h
@@ -113,11 +113,6 @@ extern int pci_domain_nr(struct pci_bus *bus);
113/* Decide whether to display the domain number in /proc */ 113/* Decide whether to display the domain number in /proc */
114extern int pci_proc_domain(struct pci_bus *bus); 114extern int pci_proc_domain(struct pci_bus *bus);
115 115
116/* MSI arch hooks */
117#define arch_setup_msi_irqs arch_setup_msi_irqs
118#define arch_teardown_msi_irqs arch_teardown_msi_irqs
119#define arch_msi_check_device arch_msi_check_device
120
121struct vm_area_struct; 116struct vm_area_struct;
122/* Map a range of PCI memory or I/O space for a device into user space */ 117/* Map a range of PCI memory or I/O space for a device into user space */
123int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma, 118int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma,
diff --git a/arch/powerpc/include/asm/perf_event_fsl_emb.h b/arch/powerpc/include/asm/perf_event_fsl_emb.h
index 718a9fa94e68..a58165450f6f 100644
--- a/arch/powerpc/include/asm/perf_event_fsl_emb.h
+++ b/arch/powerpc/include/asm/perf_event_fsl_emb.h
@@ -13,7 +13,7 @@
13#include <linux/types.h> 13#include <linux/types.h>
14#include <asm/hw_irq.h> 14#include <asm/hw_irq.h>
15 15
16#define MAX_HWEVENTS 4 16#define MAX_HWEVENTS 6
17 17
18/* event flags */ 18/* event flags */
19#define FSL_EMB_EVENT_VALID 1 19#define FSL_EMB_EVENT_VALID 1
diff --git a/arch/powerpc/include/asm/perf_event_server.h b/arch/powerpc/include/asm/perf_event_server.h
index 8b2492644754..3fd2f1b6f906 100644
--- a/arch/powerpc/include/asm/perf_event_server.h
+++ b/arch/powerpc/include/asm/perf_event_server.h
@@ -138,11 +138,11 @@ extern ssize_t power_events_sysfs_show(struct device *dev,
138#define EVENT_PTR(_id, _suffix) &EVENT_VAR(_id, _suffix).attr.attr 138#define EVENT_PTR(_id, _suffix) &EVENT_VAR(_id, _suffix).attr.attr
139 139
140#define EVENT_ATTR(_name, _id, _suffix) \ 140#define EVENT_ATTR(_name, _id, _suffix) \
141 PMU_EVENT_ATTR(_name, EVENT_VAR(_id, _suffix), PME_PM_##_id, \ 141 PMU_EVENT_ATTR(_name, EVENT_VAR(_id, _suffix), PME_##_id, \
142 power_events_sysfs_show) 142 power_events_sysfs_show)
143 143
144#define GENERIC_EVENT_ATTR(_name, _id) EVENT_ATTR(_name, _id, _g) 144#define GENERIC_EVENT_ATTR(_name, _id) EVENT_ATTR(_name, _id, _g)
145#define GENERIC_EVENT_PTR(_id) EVENT_PTR(_id, _g) 145#define GENERIC_EVENT_PTR(_id) EVENT_PTR(_id, _g)
146 146
147#define POWER_EVENT_ATTR(_name, _id) EVENT_ATTR(PM_##_name, _id, _p) 147#define POWER_EVENT_ATTR(_name, _id) EVENT_ATTR(_name, _id, _p)
148#define POWER_EVENT_PTR(_id) EVENT_PTR(_id, _p) 148#define POWER_EVENT_PTR(_id) EVENT_PTR(_id, _p)
diff --git a/arch/powerpc/platforms/pseries/plpar_wrappers.h b/arch/powerpc/include/asm/plpar_wrappers.h
index f35787b6a5e0..a63b045e707c 100644
--- a/arch/powerpc/platforms/pseries/plpar_wrappers.h
+++ b/arch/powerpc/include/asm/plpar_wrappers.h
@@ -1,5 +1,5 @@
1#ifndef _PSERIES_PLPAR_WRAPPERS_H 1#ifndef _ASM_POWERPC_PLPAR_WRAPPERS_H
2#define _PSERIES_PLPAR_WRAPPERS_H 2#define _ASM_POWERPC_PLPAR_WRAPPERS_H
3 3
4#include <linux/string.h> 4#include <linux/string.h>
5#include <linux/irqflags.h> 5#include <linux/irqflags.h>
@@ -256,30 +256,6 @@ static inline long plpar_tce_stuff(unsigned long liobn, unsigned long ioba,
256 return plpar_hcall_norets(H_STUFF_TCE, liobn, ioba, tceval, count); 256 return plpar_hcall_norets(H_STUFF_TCE, liobn, ioba, tceval, count);
257} 257}
258 258
259static inline long plpar_get_term_char(unsigned long termno,
260 unsigned long *len_ret, char *buf_ret)
261{
262 long rc;
263 unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
264 unsigned long *lbuf = (unsigned long *)buf_ret; /* TODO: alignment? */
265
266 rc = plpar_hcall(H_GET_TERM_CHAR, retbuf, termno);
267
268 *len_ret = retbuf[0];
269 lbuf[0] = retbuf[1];
270 lbuf[1] = retbuf[2];
271
272 return rc;
273}
274
275static inline long plpar_put_term_char(unsigned long termno, unsigned long len,
276 const char *buffer)
277{
278 unsigned long *lbuf = (unsigned long *)buffer; /* TODO: alignment? */
279 return plpar_hcall_norets(H_PUT_TERM_CHAR, termno, len, lbuf[0],
280 lbuf[1]);
281}
282
283/* Set various resource mode parameters */ 259/* Set various resource mode parameters */
284static inline long plpar_set_mode(unsigned long mflags, unsigned long resource, 260static inline long plpar_set_mode(unsigned long mflags, unsigned long resource,
285 unsigned long value1, unsigned long value2) 261 unsigned long value1, unsigned long value2)
@@ -321,4 +297,4 @@ static inline long plapr_set_watchpoint0(unsigned long dawr0, unsigned long dawr
321 return plpar_set_mode(0, 2, dawr0, dawrx0); 297 return plpar_set_mode(0, 2, dawr0, dawrx0);
322} 298}
323 299
324#endif /* _PSERIES_PLPAR_WRAPPERS_H */ 300#endif /* _ASM_POWERPC_PLPAR_WRAPPERS_H */
diff --git a/arch/powerpc/include/asm/ppc-opcode.h b/arch/powerpc/include/asm/ppc-opcode.h
index eccfc161e58e..d7fe9f5b46d4 100644
--- a/arch/powerpc/include/asm/ppc-opcode.h
+++ b/arch/powerpc/include/asm/ppc-opcode.h
@@ -81,6 +81,53 @@
81#define __REGA0_R30 30 81#define __REGA0_R30 30
82#define __REGA0_R31 31 82#define __REGA0_R31 31
83 83
84/* opcode and xopcode for instructions */
85#define OP_TRAP 3
86#define OP_TRAP_64 2
87
88#define OP_31_XOP_TRAP 4
89#define OP_31_XOP_LWZX 23
90#define OP_31_XOP_DCBST 54
91#define OP_31_XOP_LWZUX 55
92#define OP_31_XOP_TRAP_64 68
93#define OP_31_XOP_DCBF 86
94#define OP_31_XOP_LBZX 87
95#define OP_31_XOP_STWX 151
96#define OP_31_XOP_STBX 215
97#define OP_31_XOP_LBZUX 119
98#define OP_31_XOP_STBUX 247
99#define OP_31_XOP_LHZX 279
100#define OP_31_XOP_LHZUX 311
101#define OP_31_XOP_MFSPR 339
102#define OP_31_XOP_LHAX 343
103#define OP_31_XOP_LHAUX 375
104#define OP_31_XOP_STHX 407
105#define OP_31_XOP_STHUX 439
106#define OP_31_XOP_MTSPR 467
107#define OP_31_XOP_DCBI 470
108#define OP_31_XOP_LWBRX 534
109#define OP_31_XOP_TLBSYNC 566
110#define OP_31_XOP_STWBRX 662
111#define OP_31_XOP_LHBRX 790
112#define OP_31_XOP_STHBRX 918
113
114#define OP_LWZ 32
115#define OP_LD 58
116#define OP_LWZU 33
117#define OP_LBZ 34
118#define OP_LBZU 35
119#define OP_STW 36
120#define OP_STWU 37
121#define OP_STD 62
122#define OP_STB 38
123#define OP_STBU 39
124#define OP_LHZ 40
125#define OP_LHZU 41
126#define OP_LHA 42
127#define OP_LHAU 43
128#define OP_STH 44
129#define OP_STHU 45
130
84/* sorted alphabetically */ 131/* sorted alphabetically */
85#define PPC_INST_BHRBE 0x7c00025c 132#define PPC_INST_BHRBE 0x7c00025c
86#define PPC_INST_CLRBHRB 0x7c00035c 133#define PPC_INST_CLRBHRB 0x7c00035c
diff --git a/arch/powerpc/include/asm/ppc_asm.h b/arch/powerpc/include/asm/ppc_asm.h
index 2f1b6c5f8174..599545738af3 100644
--- a/arch/powerpc/include/asm/ppc_asm.h
+++ b/arch/powerpc/include/asm/ppc_asm.h
@@ -54,7 +54,8 @@ BEGIN_FW_FTR_SECTION; \
54 /* from user - see if there are any DTL entries to process */ \ 54 /* from user - see if there are any DTL entries to process */ \
55 ld r10,PACALPPACAPTR(r13); /* get ptr to VPA */ \ 55 ld r10,PACALPPACAPTR(r13); /* get ptr to VPA */ \
56 ld r11,PACA_DTL_RIDX(r13); /* get log read index */ \ 56 ld r11,PACA_DTL_RIDX(r13); /* get log read index */ \
57 ld r10,LPPACA_DTLIDX(r10); /* get log write index */ \ 57 addi r10,r10,LPPACA_DTLIDX; \
58 LDX_BE r10,0,r10; /* get log write index */ \
58 cmpd cr1,r11,r10; \ 59 cmpd cr1,r11,r10; \
59 beq+ cr1,33f; \ 60 beq+ cr1,33f; \
60 bl .accumulate_stolen_time; \ 61 bl .accumulate_stolen_time; \
@@ -219,19 +220,6 @@ END_FW_FTR_SECTION_IFSET(FW_FEATURE_SPLPAR)
219#define REST_8VSRS(n,b,base) REST_4VSRS(n,b,base); REST_4VSRS(n+4,b,base) 220#define REST_8VSRS(n,b,base) REST_4VSRS(n,b,base); REST_4VSRS(n+4,b,base)
220#define REST_16VSRS(n,b,base) REST_8VSRS(n,b,base); REST_8VSRS(n+8,b,base) 221#define REST_16VSRS(n,b,base) REST_8VSRS(n,b,base); REST_8VSRS(n+8,b,base)
221#define REST_32VSRS(n,b,base) REST_16VSRS(n,b,base); REST_16VSRS(n+16,b,base) 222#define REST_32VSRS(n,b,base) REST_16VSRS(n,b,base); REST_16VSRS(n+16,b,base)
222/* Save the upper 32 VSRs (32-63) in the thread VSX region (0-31) */
223#define SAVE_VSRU(n,b,base) li b,THREAD_VR0+(16*(n)); STXVD2X(n+32,R##base,R##b)
224#define SAVE_2VSRSU(n,b,base) SAVE_VSRU(n,b,base); SAVE_VSRU(n+1,b,base)
225#define SAVE_4VSRSU(n,b,base) SAVE_2VSRSU(n,b,base); SAVE_2VSRSU(n+2,b,base)
226#define SAVE_8VSRSU(n,b,base) SAVE_4VSRSU(n,b,base); SAVE_4VSRSU(n+4,b,base)
227#define SAVE_16VSRSU(n,b,base) SAVE_8VSRSU(n,b,base); SAVE_8VSRSU(n+8,b,base)
228#define SAVE_32VSRSU(n,b,base) SAVE_16VSRSU(n,b,base); SAVE_16VSRSU(n+16,b,base)
229#define REST_VSRU(n,b,base) li b,THREAD_VR0+(16*(n)); LXVD2X(n+32,R##base,R##b)
230#define REST_2VSRSU(n,b,base) REST_VSRU(n,b,base); REST_VSRU(n+1,b,base)
231#define REST_4VSRSU(n,b,base) REST_2VSRSU(n,b,base); REST_2VSRSU(n+2,b,base)
232#define REST_8VSRSU(n,b,base) REST_4VSRSU(n,b,base); REST_4VSRSU(n+4,b,base)
233#define REST_16VSRSU(n,b,base) REST_8VSRSU(n,b,base); REST_8VSRSU(n+8,b,base)
234#define REST_32VSRSU(n,b,base) REST_16VSRSU(n,b,base); REST_16VSRSU(n+16,b,base)
235 223
236/* 224/*
237 * b = base register for addressing, o = base offset from register of 1st EVR 225 * b = base register for addressing, o = base offset from register of 1st EVR
@@ -443,15 +431,15 @@ END_FTR_SECTION_IFSET(CPU_FTR_601)
443#define ISYNC_601 431#define ISYNC_601
444#endif 432#endif
445 433
446#ifdef CONFIG_PPC_CELL 434#if defined(CONFIG_PPC_CELL) || defined(CONFIG_PPC_FSL_BOOK3E)
447#define MFTB(dest) \ 435#define MFTB(dest) \
44890: mftb dest; \ 43690: mfspr dest, SPRN_TBRL; \
449BEGIN_FTR_SECTION_NESTED(96); \ 437BEGIN_FTR_SECTION_NESTED(96); \
450 cmpwi dest,0; \ 438 cmpwi dest,0; \
451 beq- 90b; \ 439 beq- 90b; \
452END_FTR_SECTION_NESTED(CPU_FTR_CELL_TB_BUG, CPU_FTR_CELL_TB_BUG, 96) 440END_FTR_SECTION_NESTED(CPU_FTR_CELL_TB_BUG, CPU_FTR_CELL_TB_BUG, 96)
453#else 441#else
454#define MFTB(dest) mftb dest 442#define MFTB(dest) mfspr dest, SPRN_TBRL
455#endif 443#endif
456 444
457#ifndef CONFIG_SMP 445#ifndef CONFIG_SMP
diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h
index e378cccfca55..ce4de5aed7b5 100644
--- a/arch/powerpc/include/asm/processor.h
+++ b/arch/powerpc/include/asm/processor.h
@@ -149,8 +149,6 @@ typedef struct {
149 149
150struct thread_struct { 150struct thread_struct {
151 unsigned long ksp; /* Kernel stack pointer */ 151 unsigned long ksp; /* Kernel stack pointer */
152 unsigned long ksp_limit; /* if ksp <= ksp_limit stack overflow */
153
154#ifdef CONFIG_PPC64 152#ifdef CONFIG_PPC64
155 unsigned long ksp_vsid; 153 unsigned long ksp_vsid;
156#endif 154#endif
@@ -162,6 +160,7 @@ struct thread_struct {
162#endif 160#endif
163#ifdef CONFIG_PPC32 161#ifdef CONFIG_PPC32
164 void *pgdir; /* root of page-table tree */ 162 void *pgdir; /* root of page-table tree */
163 unsigned long ksp_limit; /* if ksp <= ksp_limit stack overflow */
165#endif 164#endif
166#ifdef CONFIG_PPC_ADV_DEBUG_REGS 165#ifdef CONFIG_PPC_ADV_DEBUG_REGS
167 /* 166 /*
@@ -321,7 +320,6 @@ struct thread_struct {
321#else 320#else
322#define INIT_THREAD { \ 321#define INIT_THREAD { \
323 .ksp = INIT_SP, \ 322 .ksp = INIT_SP, \
324 .ksp_limit = INIT_SP_LIMIT, \
325 .regs = (struct pt_regs *)INIT_SP - 1, /* XXX bogus, I think */ \ 323 .regs = (struct pt_regs *)INIT_SP - 1, /* XXX bogus, I think */ \
326 .fs = KERNEL_DS, \ 324 .fs = KERNEL_DS, \
327 .fpr = {{0}}, \ 325 .fpr = {{0}}, \
diff --git a/arch/powerpc/include/asm/prom.h b/arch/powerpc/include/asm/prom.h
index bc2da154f68b..7d0c7f3a7171 100644
--- a/arch/powerpc/include/asm/prom.h
+++ b/arch/powerpc/include/asm/prom.h
@@ -38,14 +38,12 @@ extern unsigned long pci_address_to_pio(phys_addr_t address);
38/* Parse the ibm,dma-window property of an OF node into the busno, phys and 38/* Parse the ibm,dma-window property of an OF node into the busno, phys and
39 * size parameters. 39 * size parameters.
40 */ 40 */
41void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop, 41void of_parse_dma_window(struct device_node *dn, const __be32 *dma_window,
42 unsigned long *busno, unsigned long *phys, unsigned long *size); 42 unsigned long *busno, unsigned long *phys,
43 unsigned long *size);
43 44
44extern void kdump_move_device_tree(void); 45extern void kdump_move_device_tree(void);
45 46
46/* CPU OF node matching */
47struct device_node *of_get_cpu_node(int cpu, unsigned int *thread);
48
49/* cache lookup */ 47/* cache lookup */
50struct device_node *of_find_next_cache_node(struct device_node *np); 48struct device_node *of_find_next_cache_node(struct device_node *np);
51 49
@@ -58,6 +56,8 @@ static inline int of_node_to_nid(struct device_node *device) { return 0; }
58 56
59extern void of_instantiate_rtc(void); 57extern void of_instantiate_rtc(void);
60 58
59extern int of_get_ibm_chip_id(struct device_node *np);
60
61/* The of_drconf_cell struct defines the layout of the LMB array 61/* The of_drconf_cell struct defines the layout of the LMB array
62 * specified in the device tree property 62 * specified in the device tree property
63 * ibm,dynamic-reconfiguration-memory/ibm,dynamic-memory 63 * ibm,dynamic-reconfiguration-memory/ibm,dynamic-memory
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
index 99222e27f173..10d1ef016bf1 100644
--- a/arch/powerpc/include/asm/reg.h
+++ b/arch/powerpc/include/asm/reg.h
@@ -115,10 +115,10 @@
115#define MSR_64BIT MSR_SF 115#define MSR_64BIT MSR_SF
116 116
117/* Server variant */ 117/* Server variant */
118#define MSR_ MSR_ME | MSR_RI | MSR_IR | MSR_DR | MSR_ISF |MSR_HV 118#define MSR_ (MSR_ME | MSR_RI | MSR_IR | MSR_DR | MSR_ISF |MSR_HV)
119#define MSR_KERNEL MSR_ | MSR_64BIT 119#define MSR_KERNEL (MSR_ | MSR_64BIT)
120#define MSR_USER32 MSR_ | MSR_PR | MSR_EE 120#define MSR_USER32 (MSR_ | MSR_PR | MSR_EE)
121#define MSR_USER64 MSR_USER32 | MSR_64BIT 121#define MSR_USER64 (MSR_USER32 | MSR_64BIT)
122#elif defined(CONFIG_PPC_BOOK3S_32) || defined(CONFIG_8xx) 122#elif defined(CONFIG_PPC_BOOK3S_32) || defined(CONFIG_8xx)
123/* Default MSR for kernel mode. */ 123/* Default MSR for kernel mode. */
124#define MSR_KERNEL (MSR_ME|MSR_RI|MSR_IR|MSR_DR) 124#define MSR_KERNEL (MSR_ME|MSR_RI|MSR_IR|MSR_DR)
@@ -258,8 +258,8 @@
258#define FSCR_TAR_LG 8 /* Enable Target Address Register */ 258#define FSCR_TAR_LG 8 /* Enable Target Address Register */
259#define FSCR_EBB_LG 7 /* Enable Event Based Branching */ 259#define FSCR_EBB_LG 7 /* Enable Event Based Branching */
260#define FSCR_TM_LG 5 /* Enable Transactional Memory */ 260#define FSCR_TM_LG 5 /* Enable Transactional Memory */
261#define FSCR_PM_LG 4 /* Enable prob/priv access to PMU SPRs */ 261#define FSCR_BHRB_LG 4 /* Enable Branch History Rolling Buffer*/
262#define FSCR_BHRB_LG 3 /* Enable Branch History Rolling Buffer*/ 262#define FSCR_PM_LG 3 /* Enable prob/priv access to PMU SPRs */
263#define FSCR_DSCR_LG 2 /* Enable Data Stream Control Register */ 263#define FSCR_DSCR_LG 2 /* Enable Data Stream Control Register */
264#define FSCR_VECVSX_LG 1 /* Enable VMX/VSX */ 264#define FSCR_VECVSX_LG 1 /* Enable VMX/VSX */
265#define FSCR_FP_LG 0 /* Enable Floating Point */ 265#define FSCR_FP_LG 0 /* Enable Floating Point */
@@ -1126,10 +1126,10 @@
1126 : "memory") 1126 : "memory")
1127 1127
1128#ifdef __powerpc64__ 1128#ifdef __powerpc64__
1129#ifdef CONFIG_PPC_CELL 1129#if defined(CONFIG_PPC_CELL) || defined(CONFIG_PPC_FSL_BOOK3E)
1130#define mftb() ({unsigned long rval; \ 1130#define mftb() ({unsigned long rval; \
1131 asm volatile( \ 1131 asm volatile( \
1132 "90: mftb %0;\n" \ 1132 "90: mfspr %0, %2;\n" \
1133 "97: cmpwi %0,0;\n" \ 1133 "97: cmpwi %0,0;\n" \
1134 " beq- 90b;\n" \ 1134 " beq- 90b;\n" \
1135 "99:\n" \ 1135 "99:\n" \
@@ -1143,18 +1143,23 @@
1143 " .llong 0\n" \ 1143 " .llong 0\n" \
1144 " .llong 0\n" \ 1144 " .llong 0\n" \
1145 ".previous" \ 1145 ".previous" \
1146 : "=r" (rval) : "i" (CPU_FTR_CELL_TB_BUG)); rval;}) 1146 : "=r" (rval) \
1147 : "i" (CPU_FTR_CELL_TB_BUG), "i" (SPRN_TBRL)); \
1148 rval;})
1147#else 1149#else
1148#define mftb() ({unsigned long rval; \ 1150#define mftb() ({unsigned long rval; \
1149 asm volatile("mftb %0" : "=r" (rval)); rval;}) 1151 asm volatile("mfspr %0, %1" : \
1152 "=r" (rval) : "i" (SPRN_TBRL)); rval;})
1150#endif /* !CONFIG_PPC_CELL */ 1153#endif /* !CONFIG_PPC_CELL */
1151 1154
1152#else /* __powerpc64__ */ 1155#else /* __powerpc64__ */
1153 1156
1154#define mftbl() ({unsigned long rval; \ 1157#define mftbl() ({unsigned long rval; \
1155 asm volatile("mftbl %0" : "=r" (rval)); rval;}) 1158 asm volatile("mfspr %0, %1" : "=r" (rval) : \
1159 "i" (SPRN_TBRL)); rval;})
1156#define mftbu() ({unsigned long rval; \ 1160#define mftbu() ({unsigned long rval; \
1157 asm volatile("mftbu %0" : "=r" (rval)); rval;}) 1161 asm volatile("mfspr %0, %1" : "=r" (rval) : \
1162 "i" (SPRN_TBRU)); rval;})
1158#endif /* !__powerpc64__ */ 1163#endif /* !__powerpc64__ */
1159 1164
1160#define mttbl(v) asm volatile("mttbl %0":: "r"(v)) 1165#define mttbl(v) asm volatile("mttbl %0":: "r"(v))
diff --git a/arch/powerpc/include/asm/reg_booke.h b/arch/powerpc/include/asm/reg_booke.h
index b417de3cc2c4..ed8f836da094 100644
--- a/arch/powerpc/include/asm/reg_booke.h
+++ b/arch/powerpc/include/asm/reg_booke.h
@@ -29,10 +29,10 @@
29#if defined(CONFIG_PPC_BOOK3E_64) 29#if defined(CONFIG_PPC_BOOK3E_64)
30#define MSR_64BIT MSR_CM 30#define MSR_64BIT MSR_CM
31 31
32#define MSR_ MSR_ME | MSR_CE 32#define MSR_ (MSR_ME | MSR_CE)
33#define MSR_KERNEL MSR_ | MSR_64BIT 33#define MSR_KERNEL (MSR_ | MSR_64BIT)
34#define MSR_USER32 MSR_ | MSR_PR | MSR_EE 34#define MSR_USER32 (MSR_ | MSR_PR | MSR_EE)
35#define MSR_USER64 MSR_USER32 | MSR_64BIT 35#define MSR_USER64 (MSR_USER32 | MSR_64BIT)
36#elif defined (CONFIG_40x) 36#elif defined (CONFIG_40x)
37#define MSR_KERNEL (MSR_ME|MSR_RI|MSR_IR|MSR_DR|MSR_CE) 37#define MSR_KERNEL (MSR_ME|MSR_RI|MSR_IR|MSR_DR|MSR_CE)
38#define MSR_USER (MSR_KERNEL|MSR_PR|MSR_EE) 38#define MSR_USER (MSR_KERNEL|MSR_PR|MSR_EE)
diff --git a/arch/powerpc/include/asm/reg_fsl_emb.h b/arch/powerpc/include/asm/reg_fsl_emb.h
index 77bb71cfd991..0e3ddf5177f6 100644
--- a/arch/powerpc/include/asm/reg_fsl_emb.h
+++ b/arch/powerpc/include/asm/reg_fsl_emb.h
@@ -17,12 +17,16 @@
17/* Freescale Book E Performance Monitor APU Registers */ 17/* Freescale Book E Performance Monitor APU Registers */
18#define PMRN_PMC0 0x010 /* Performance Monitor Counter 0 */ 18#define PMRN_PMC0 0x010 /* Performance Monitor Counter 0 */
19#define PMRN_PMC1 0x011 /* Performance Monitor Counter 1 */ 19#define PMRN_PMC1 0x011 /* Performance Monitor Counter 1 */
20#define PMRN_PMC2 0x012 /* Performance Monitor Counter 1 */ 20#define PMRN_PMC2 0x012 /* Performance Monitor Counter 2 */
21#define PMRN_PMC3 0x013 /* Performance Monitor Counter 1 */ 21#define PMRN_PMC3 0x013 /* Performance Monitor Counter 3 */
22#define PMRN_PMC4 0x014 /* Performance Monitor Counter 4 */
23#define PMRN_PMC5 0x015 /* Performance Monitor Counter 5 */
22#define PMRN_PMLCA0 0x090 /* PM Local Control A0 */ 24#define PMRN_PMLCA0 0x090 /* PM Local Control A0 */
23#define PMRN_PMLCA1 0x091 /* PM Local Control A1 */ 25#define PMRN_PMLCA1 0x091 /* PM Local Control A1 */
24#define PMRN_PMLCA2 0x092 /* PM Local Control A2 */ 26#define PMRN_PMLCA2 0x092 /* PM Local Control A2 */
25#define PMRN_PMLCA3 0x093 /* PM Local Control A3 */ 27#define PMRN_PMLCA3 0x093 /* PM Local Control A3 */
28#define PMRN_PMLCA4 0x094 /* PM Local Control A4 */
29#define PMRN_PMLCA5 0x095 /* PM Local Control A5 */
26 30
27#define PMLCA_FC 0x80000000 /* Freeze Counter */ 31#define PMLCA_FC 0x80000000 /* Freeze Counter */
28#define PMLCA_FCS 0x40000000 /* Freeze in Supervisor */ 32#define PMLCA_FCS 0x40000000 /* Freeze in Supervisor */
@@ -30,14 +34,18 @@
30#define PMLCA_FCM1 0x10000000 /* Freeze when PMM==1 */ 34#define PMLCA_FCM1 0x10000000 /* Freeze when PMM==1 */
31#define PMLCA_FCM0 0x08000000 /* Freeze when PMM==0 */ 35#define PMLCA_FCM0 0x08000000 /* Freeze when PMM==0 */
32#define PMLCA_CE 0x04000000 /* Condition Enable */ 36#define PMLCA_CE 0x04000000 /* Condition Enable */
37#define PMLCA_FGCS1 0x00000002 /* Freeze in guest state */
38#define PMLCA_FGCS0 0x00000001 /* Freeze in hypervisor state */
33 39
34#define PMLCA_EVENT_MASK 0x00ff0000 /* Event field */ 40#define PMLCA_EVENT_MASK 0x01ff0000 /* Event field */
35#define PMLCA_EVENT_SHIFT 16 41#define PMLCA_EVENT_SHIFT 16
36 42
37#define PMRN_PMLCB0 0x110 /* PM Local Control B0 */ 43#define PMRN_PMLCB0 0x110 /* PM Local Control B0 */
38#define PMRN_PMLCB1 0x111 /* PM Local Control B1 */ 44#define PMRN_PMLCB1 0x111 /* PM Local Control B1 */
39#define PMRN_PMLCB2 0x112 /* PM Local Control B2 */ 45#define PMRN_PMLCB2 0x112 /* PM Local Control B2 */
40#define PMRN_PMLCB3 0x113 /* PM Local Control B3 */ 46#define PMRN_PMLCB3 0x113 /* PM Local Control B3 */
47#define PMRN_PMLCB4 0x114 /* PM Local Control B4 */
48#define PMRN_PMLCB5 0x115 /* PM Local Control B5 */
41 49
42#define PMLCB_THRESHMUL_MASK 0x0700 /* Threshold Multiple Field */ 50#define PMLCB_THRESHMUL_MASK 0x0700 /* Threshold Multiple Field */
43#define PMLCB_THRESHMUL_SHIFT 8 51#define PMLCB_THRESHMUL_SHIFT 8
@@ -55,16 +63,22 @@
55 63
56#define PMRN_UPMC0 0x000 /* User Performance Monitor Counter 0 */ 64#define PMRN_UPMC0 0x000 /* User Performance Monitor Counter 0 */
57#define PMRN_UPMC1 0x001 /* User Performance Monitor Counter 1 */ 65#define PMRN_UPMC1 0x001 /* User Performance Monitor Counter 1 */
58#define PMRN_UPMC2 0x002 /* User Performance Monitor Counter 1 */ 66#define PMRN_UPMC2 0x002 /* User Performance Monitor Counter 2 */
59#define PMRN_UPMC3 0x003 /* User Performance Monitor Counter 1 */ 67#define PMRN_UPMC3 0x003 /* User Performance Monitor Counter 3 */
68#define PMRN_UPMC4 0x004 /* User Performance Monitor Counter 4 */
69#define PMRN_UPMC5 0x005 /* User Performance Monitor Counter 5 */
60#define PMRN_UPMLCA0 0x080 /* User PM Local Control A0 */ 70#define PMRN_UPMLCA0 0x080 /* User PM Local Control A0 */
61#define PMRN_UPMLCA1 0x081 /* User PM Local Control A1 */ 71#define PMRN_UPMLCA1 0x081 /* User PM Local Control A1 */
62#define PMRN_UPMLCA2 0x082 /* User PM Local Control A2 */ 72#define PMRN_UPMLCA2 0x082 /* User PM Local Control A2 */
63#define PMRN_UPMLCA3 0x083 /* User PM Local Control A3 */ 73#define PMRN_UPMLCA3 0x083 /* User PM Local Control A3 */
74#define PMRN_UPMLCA4 0x084 /* User PM Local Control A4 */
75#define PMRN_UPMLCA5 0x085 /* User PM Local Control A5 */
64#define PMRN_UPMLCB0 0x100 /* User PM Local Control B0 */ 76#define PMRN_UPMLCB0 0x100 /* User PM Local Control B0 */
65#define PMRN_UPMLCB1 0x101 /* User PM Local Control B1 */ 77#define PMRN_UPMLCB1 0x101 /* User PM Local Control B1 */
66#define PMRN_UPMLCB2 0x102 /* User PM Local Control B2 */ 78#define PMRN_UPMLCB2 0x102 /* User PM Local Control B2 */
67#define PMRN_UPMLCB3 0x103 /* User PM Local Control B3 */ 79#define PMRN_UPMLCB3 0x103 /* User PM Local Control B3 */
80#define PMRN_UPMLCB4 0x104 /* User PM Local Control B4 */
81#define PMRN_UPMLCB5 0x105 /* User PM Local Control B5 */
68#define PMRN_UPMGC0 0x180 /* User PM Global Control 0 */ 82#define PMRN_UPMGC0 0x180 /* User PM Global Control 0 */
69 83
70 84
diff --git a/arch/powerpc/include/asm/rtas.h b/arch/powerpc/include/asm/rtas.h
index c7a8bfc9f6f5..9bd52c65e66f 100644
--- a/arch/powerpc/include/asm/rtas.h
+++ b/arch/powerpc/include/asm/rtas.h
@@ -44,12 +44,12 @@
44 * 44 *
45 */ 45 */
46 46
47typedef u32 rtas_arg_t; 47typedef __be32 rtas_arg_t;
48 48
49struct rtas_args { 49struct rtas_args {
50 u32 token; 50 __be32 token;
51 u32 nargs; 51 __be32 nargs;
52 u32 nret; 52 __be32 nret;
53 rtas_arg_t args[16]; 53 rtas_arg_t args[16];
54 rtas_arg_t *rets; /* Pointer to return values in args[]. */ 54 rtas_arg_t *rets; /* Pointer to return values in args[]. */
55}; 55};
diff --git a/arch/powerpc/include/asm/smp.h b/arch/powerpc/include/asm/smp.h
index 48cfc858abd6..98da78e0c2c0 100644
--- a/arch/powerpc/include/asm/smp.h
+++ b/arch/powerpc/include/asm/smp.h
@@ -112,6 +112,7 @@ static inline struct cpumask *cpu_core_mask(int cpu)
112} 112}
113 113
114extern int cpu_to_core_id(int cpu); 114extern int cpu_to_core_id(int cpu);
115extern int cpu_to_chip_id(int cpu);
115 116
116/* Since OpenPIC has only 4 IPIs, we use slightly different message numbers. 117/* Since OpenPIC has only 4 IPIs, we use slightly different message numbers.
117 * 118 *
@@ -186,6 +187,8 @@ extern int smt_enabled_at_boot;
186extern int smp_mpic_probe(void); 187extern int smp_mpic_probe(void);
187extern void smp_mpic_setup_cpu(int cpu); 188extern void smp_mpic_setup_cpu(int cpu);
188extern int smp_generic_kick_cpu(int nr); 189extern int smp_generic_kick_cpu(int nr);
190extern int smp_generic_cpu_bootable(unsigned int nr);
191
189 192
190extern void smp_generic_give_timebase(void); 193extern void smp_generic_give_timebase(void);
191extern void smp_generic_take_timebase(void); 194extern void smp_generic_take_timebase(void);
diff --git a/arch/powerpc/include/asm/spinlock.h b/arch/powerpc/include/asm/spinlock.h
index 5b23f910ee57..5f54a744dcc5 100644
--- a/arch/powerpc/include/asm/spinlock.h
+++ b/arch/powerpc/include/asm/spinlock.h
@@ -32,8 +32,12 @@
32 32
33#ifdef CONFIG_PPC64 33#ifdef CONFIG_PPC64
34/* use 0x800000yy when locked, where yy == CPU number */ 34/* use 0x800000yy when locked, where yy == CPU number */
35#ifdef __BIG_ENDIAN__
35#define LOCK_TOKEN (*(u32 *)(&get_paca()->lock_token)) 36#define LOCK_TOKEN (*(u32 *)(&get_paca()->lock_token))
36#else 37#else
38#define LOCK_TOKEN (*(u32 *)(&get_paca()->paca_index))
39#endif
40#else
37#define LOCK_TOKEN 1 41#define LOCK_TOKEN 1
38#endif 42#endif
39 43
@@ -96,7 +100,7 @@ static inline int arch_spin_trylock(arch_spinlock_t *lock)
96 100
97#if defined(CONFIG_PPC_SPLPAR) 101#if defined(CONFIG_PPC_SPLPAR)
98/* We only yield to the hypervisor if we are in shared processor mode */ 102/* We only yield to the hypervisor if we are in shared processor mode */
99#define SHARED_PROCESSOR (local_paca->lppaca_ptr->shared_proc) 103#define SHARED_PROCESSOR (lppaca_shared_proc(local_paca->lppaca_ptr))
100extern void __spin_yield(arch_spinlock_t *lock); 104extern void __spin_yield(arch_spinlock_t *lock);
101extern void __rw_yield(arch_rwlock_t *lock); 105extern void __rw_yield(arch_rwlock_t *lock);
102#else /* SPLPAR */ 106#else /* SPLPAR */
diff --git a/arch/powerpc/include/asm/switch_to.h b/arch/powerpc/include/asm/switch_to.h
index 294c2cedcf7a..2be5618cdec6 100644
--- a/arch/powerpc/include/asm/switch_to.h
+++ b/arch/powerpc/include/asm/switch_to.h
@@ -25,11 +25,8 @@ static inline void save_tar(struct thread_struct *prev)
25static inline void save_tar(struct thread_struct *prev) {} 25static inline void save_tar(struct thread_struct *prev) {}
26#endif 26#endif
27 27
28extern void giveup_fpu(struct task_struct *);
29extern void load_up_fpu(void); 28extern void load_up_fpu(void);
30extern void disable_kernel_fp(void);
31extern void enable_kernel_fp(void); 29extern void enable_kernel_fp(void);
32extern void flush_fp_to_thread(struct task_struct *);
33extern void enable_kernel_altivec(void); 30extern void enable_kernel_altivec(void);
34extern void load_up_altivec(struct task_struct *); 31extern void load_up_altivec(struct task_struct *);
35extern int emulate_altivec(struct pt_regs *); 32extern int emulate_altivec(struct pt_regs *);
@@ -47,6 +44,14 @@ static inline void discard_lazy_cpu_state(void)
47} 44}
48#endif 45#endif
49 46
47#ifdef CONFIG_PPC_FPU
48extern void flush_fp_to_thread(struct task_struct *);
49extern void giveup_fpu(struct task_struct *);
50#else
51static inline void flush_fp_to_thread(struct task_struct *t) { }
52static inline void giveup_fpu(struct task_struct *t) { }
53#endif
54
50#ifdef CONFIG_ALTIVEC 55#ifdef CONFIG_ALTIVEC
51extern void flush_altivec_to_thread(struct task_struct *); 56extern void flush_altivec_to_thread(struct task_struct *);
52extern void giveup_altivec(struct task_struct *); 57extern void giveup_altivec(struct task_struct *);
diff --git a/arch/powerpc/include/asm/timex.h b/arch/powerpc/include/asm/timex.h
index c55e14f7ef44..18908caa1f3b 100644
--- a/arch/powerpc/include/asm/timex.h
+++ b/arch/powerpc/include/asm/timex.h
@@ -29,7 +29,7 @@ static inline cycles_t get_cycles(void)
29 ret = 0; 29 ret = 0;
30 30
31 __asm__ __volatile__( 31 __asm__ __volatile__(
32 "97: mftb %0\n" 32 "97: mfspr %0, %2\n"
33 "99:\n" 33 "99:\n"
34 ".section __ftr_fixup,\"a\"\n" 34 ".section __ftr_fixup,\"a\"\n"
35 ".align 2\n" 35 ".align 2\n"
@@ -41,7 +41,7 @@ static inline cycles_t get_cycles(void)
41 " .long 0\n" 41 " .long 0\n"
42 " .long 0\n" 42 " .long 0\n"
43 ".previous" 43 ".previous"
44 : "=r" (ret) : "i" (CPU_FTR_601)); 44 : "=r" (ret) : "i" (CPU_FTR_601), "i" (SPRN_TBRL));
45 return ret; 45 return ret;
46#endif 46#endif
47} 47}
diff --git a/arch/powerpc/include/asm/topology.h b/arch/powerpc/include/asm/topology.h
index 161ab662843b..89e3ef2496ac 100644
--- a/arch/powerpc/include/asm/topology.h
+++ b/arch/powerpc/include/asm/topology.h
@@ -96,6 +96,7 @@ static inline int prrn_is_enabled(void)
96#ifdef CONFIG_PPC64 96#ifdef CONFIG_PPC64
97#include <asm/smp.h> 97#include <asm/smp.h>
98 98
99#define topology_physical_package_id(cpu) (cpu_to_chip_id(cpu))
99#define topology_thread_cpumask(cpu) (per_cpu(cpu_sibling_map, cpu)) 100#define topology_thread_cpumask(cpu) (per_cpu(cpu_sibling_map, cpu))
100#define topology_core_cpumask(cpu) (per_cpu(cpu_core_map, cpu)) 101#define topology_core_cpumask(cpu) (per_cpu(cpu_core_map, cpu))
101#define topology_core_id(cpu) (cpu_to_core_id(cpu)) 102#define topology_core_id(cpu) (cpu_to_core_id(cpu))
diff --git a/arch/powerpc/include/asm/udbg.h b/arch/powerpc/include/asm/udbg.h
index dc590919f8eb..b51fba10e733 100644
--- a/arch/powerpc/include/asm/udbg.h
+++ b/arch/powerpc/include/asm/udbg.h
@@ -27,10 +27,11 @@ extern void udbg_printf(const char *fmt, ...)
27 __attribute__ ((format (printf, 1, 2))); 27 __attribute__ ((format (printf, 1, 2)));
28extern void udbg_progress(char *s, unsigned short hex); 28extern void udbg_progress(char *s, unsigned short hex);
29 29
30extern void udbg_init_uart(void __iomem *comport, unsigned int speed, 30extern void udbg_uart_init_mmio(void __iomem *addr, unsigned int stride);
31 unsigned int clock); 31extern void udbg_uart_init_pio(unsigned long port, unsigned int stride);
32extern unsigned int udbg_probe_uart_speed(void __iomem *comport, 32
33 unsigned int clock); 33extern void udbg_uart_setup(unsigned int speed, unsigned int clock);
34extern unsigned int udbg_probe_uart_speed(unsigned int clock);
34 35
35struct device_node; 36struct device_node;
36extern void udbg_scc_init(int force_scc); 37extern void udbg_scc_init(int force_scc);
diff --git a/arch/powerpc/include/uapi/asm/elf.h b/arch/powerpc/include/uapi/asm/elf.h
index 05b8d560cfba..7e39c9146a71 100644
--- a/arch/powerpc/include/uapi/asm/elf.h
+++ b/arch/powerpc/include/uapi/asm/elf.h
@@ -107,26 +107,25 @@ typedef elf_gregset_t32 compat_elf_gregset_t;
107# define ELF_NVRREG 34 /* includes vscr & vrsave in split vectors */ 107# define ELF_NVRREG 34 /* includes vscr & vrsave in split vectors */
108# define ELF_NVSRHALFREG 32 /* Half the vsx registers */ 108# define ELF_NVSRHALFREG 32 /* Half the vsx registers */
109# define ELF_GREG_TYPE elf_greg_t64 109# define ELF_GREG_TYPE elf_greg_t64
110# define ELF_ARCH EM_PPC64
111# define ELF_CLASS ELFCLASS64
112typedef elf_greg_t64 elf_greg_t;
113typedef elf_gregset_t64 elf_gregset_t;
110#else 114#else
111# define ELF_NEVRREG 34 /* includes acc (as 2) */ 115# define ELF_NEVRREG 34 /* includes acc (as 2) */
112# define ELF_NVRREG 33 /* includes vscr */ 116# define ELF_NVRREG 33 /* includes vscr */
113# define ELF_GREG_TYPE elf_greg_t32 117# define ELF_GREG_TYPE elf_greg_t32
114# define ELF_ARCH EM_PPC 118# define ELF_ARCH EM_PPC
115# define ELF_CLASS ELFCLASS32 119# define ELF_CLASS ELFCLASS32
116# define ELF_DATA ELFDATA2MSB 120typedef elf_greg_t32 elf_greg_t;
121typedef elf_gregset_t32 elf_gregset_t;
117#endif /* __powerpc64__ */ 122#endif /* __powerpc64__ */
118 123
119#ifndef ELF_ARCH 124#ifdef __BIG_ENDIAN__
120# define ELF_ARCH EM_PPC64 125#define ELF_DATA ELFDATA2MSB
121# define ELF_CLASS ELFCLASS64
122# define ELF_DATA ELFDATA2MSB
123 typedef elf_greg_t64 elf_greg_t;
124 typedef elf_gregset_t64 elf_gregset_t;
125#else 126#else
126 /* Assumption: ELF_ARCH == EM_PPC and ELF_CLASS == ELFCLASS32 */ 127#define ELF_DATA ELFDATA2LSB
127 typedef elf_greg_t32 elf_greg_t; 128#endif
128 typedef elf_gregset_t32 elf_gregset_t;
129#endif /* ELF_ARCH */
130 129
131/* Floating point registers */ 130/* Floating point registers */
132typedef double elf_fpreg_t; 131typedef double elf_fpreg_t;
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile
index a8619bfe879e..445cb6e39d5b 100644
--- a/arch/powerpc/kernel/Makefile
+++ b/arch/powerpc/kernel/Makefile
@@ -55,7 +55,6 @@ obj-$(CONFIG_PPC_RTAS) += rtas.o rtas-rtc.o $(rtaspci-y-y)
55obj-$(CONFIG_PPC_RTAS_DAEMON) += rtasd.o 55obj-$(CONFIG_PPC_RTAS_DAEMON) += rtasd.o
56obj-$(CONFIG_RTAS_FLASH) += rtas_flash.o 56obj-$(CONFIG_RTAS_FLASH) += rtas_flash.o
57obj-$(CONFIG_RTAS_PROC) += rtas-proc.o 57obj-$(CONFIG_RTAS_PROC) += rtas-proc.o
58obj-$(CONFIG_LPARCFG) += lparcfg.o
59obj-$(CONFIG_IBMVIO) += vio.o 58obj-$(CONFIG_IBMVIO) += vio.o
60obj-$(CONFIG_IBMEBUS) += ibmebus.o 59obj-$(CONFIG_IBMEBUS) += ibmebus.o
61obj-$(CONFIG_EEH) += eeh.o eeh_pe.o eeh_dev.o eeh_cache.o \ 60obj-$(CONFIG_EEH) += eeh.o eeh_pe.o eeh_dev.o eeh_cache.o \
@@ -117,9 +116,7 @@ obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o
117obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o 116obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o
118obj-$(CONFIG_FTRACE_SYSCALLS) += ftrace.o 117obj-$(CONFIG_FTRACE_SYSCALLS) += ftrace.o
119 118
120obj-$(CONFIG_8XX_MINIMAL_FPEMU) += softemu8xx.o 119ifneq ($(CONFIG_PPC_INDIRECT_PIO),y)
121
122ifneq ($(CONFIG_PPC_INDIRECT_IO),y)
123obj-y += iomap.o 120obj-y += iomap.o
124endif 121endif
125 122
diff --git a/arch/powerpc/kernel/align.c b/arch/powerpc/kernel/align.c
index ee5b690a0bed..a27ccd5dc6b9 100644
--- a/arch/powerpc/kernel/align.c
+++ b/arch/powerpc/kernel/align.c
@@ -651,6 +651,10 @@ static int emulate_vsx(unsigned char __user *addr, unsigned int reg,
651 int sw = 0; 651 int sw = 0;
652 int i, j; 652 int i, j;
653 653
654 /* userland only */
655 if (unlikely(!user_mode(regs)))
656 return 0;
657
654 flush_vsx_to_thread(current); 658 flush_vsx_to_thread(current);
655 659
656 if (reg < 32) 660 if (reg < 32)
@@ -764,6 +768,16 @@ int fix_alignment(struct pt_regs *regs)
764 nb = aligninfo[instr].len; 768 nb = aligninfo[instr].len;
765 flags = aligninfo[instr].flags; 769 flags = aligninfo[instr].flags;
766 770
771 /* ldbrx/stdbrx overlap lfs/stfs in the DSISR unfortunately */
772 if (IS_XFORM(instruction) && ((instruction >> 1) & 0x3ff) == 532) {
773 nb = 8;
774 flags = LD+SW;
775 } else if (IS_XFORM(instruction) &&
776 ((instruction >> 1) & 0x3ff) == 660) {
777 nb = 8;
778 flags = ST+SW;
779 }
780
767 /* Byteswap little endian loads and stores */ 781 /* Byteswap little endian loads and stores */
768 swiz = 0; 782 swiz = 0;
769 if (regs->msr & MSR_LE) { 783 if (regs->msr & MSR_LE) {
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c
index 8207459efe56..502c7a4e73f7 100644
--- a/arch/powerpc/kernel/asm-offsets.c
+++ b/arch/powerpc/kernel/asm-offsets.c
@@ -80,10 +80,11 @@ int main(void)
80 DEFINE(TASKTHREADPPR, offsetof(struct task_struct, thread.ppr)); 80 DEFINE(TASKTHREADPPR, offsetof(struct task_struct, thread.ppr));
81#else 81#else
82 DEFINE(THREAD_INFO, offsetof(struct task_struct, stack)); 82 DEFINE(THREAD_INFO, offsetof(struct task_struct, stack));
83 DEFINE(THREAD_INFO_GAP, _ALIGN_UP(sizeof(struct thread_info), 16));
84 DEFINE(KSP_LIMIT, offsetof(struct thread_struct, ksp_limit));
83#endif /* CONFIG_PPC64 */ 85#endif /* CONFIG_PPC64 */
84 86
85 DEFINE(KSP, offsetof(struct thread_struct, ksp)); 87 DEFINE(KSP, offsetof(struct thread_struct, ksp));
86 DEFINE(KSP_LIMIT, offsetof(struct thread_struct, ksp_limit));
87 DEFINE(PT_REGS, offsetof(struct thread_struct, regs)); 88 DEFINE(PT_REGS, offsetof(struct thread_struct, regs));
88#ifdef CONFIG_BOOKE 89#ifdef CONFIG_BOOKE
89 DEFINE(THREAD_NORMSAVES, offsetof(struct thread_struct, normsave[0])); 90 DEFINE(THREAD_NORMSAVES, offsetof(struct thread_struct, normsave[0]));
@@ -454,6 +455,7 @@ int main(void)
454 DEFINE(VCPU_SPRG2, offsetof(struct kvm_vcpu, arch.shregs.sprg2)); 455 DEFINE(VCPU_SPRG2, offsetof(struct kvm_vcpu, arch.shregs.sprg2));
455 DEFINE(VCPU_SPRG3, offsetof(struct kvm_vcpu, arch.shregs.sprg3)); 456 DEFINE(VCPU_SPRG3, offsetof(struct kvm_vcpu, arch.shregs.sprg3));
456#endif 457#endif
458 DEFINE(VCPU_SHARED_SPRG3, offsetof(struct kvm_vcpu_arch_shared, sprg3));
457 DEFINE(VCPU_SHARED_SPRG4, offsetof(struct kvm_vcpu_arch_shared, sprg4)); 459 DEFINE(VCPU_SHARED_SPRG4, offsetof(struct kvm_vcpu_arch_shared, sprg4));
458 DEFINE(VCPU_SHARED_SPRG5, offsetof(struct kvm_vcpu_arch_shared, sprg5)); 460 DEFINE(VCPU_SHARED_SPRG5, offsetof(struct kvm_vcpu_arch_shared, sprg5));
459 DEFINE(VCPU_SHARED_SPRG6, offsetof(struct kvm_vcpu_arch_shared, sprg6)); 461 DEFINE(VCPU_SHARED_SPRG6, offsetof(struct kvm_vcpu_arch_shared, sprg6));
diff --git a/arch/powerpc/kernel/btext.c b/arch/powerpc/kernel/btext.c
index ac8f52732fde..41c011cb6070 100644
--- a/arch/powerpc/kernel/btext.c
+++ b/arch/powerpc/kernel/btext.c
@@ -25,11 +25,6 @@
25static void scrollscreen(void); 25static void scrollscreen(void);
26#endif 26#endif
27 27
28static void draw_byte(unsigned char c, long locX, long locY);
29static void draw_byte_32(unsigned char *bits, unsigned int *base, int rb);
30static void draw_byte_16(unsigned char *bits, unsigned int *base, int rb);
31static void draw_byte_8(unsigned char *bits, unsigned int *base, int rb);
32
33#define __force_data __attribute__((__section__(".data"))) 28#define __force_data __attribute__((__section__(".data")))
34 29
35static int g_loc_X __force_data; 30static int g_loc_X __force_data;
@@ -52,6 +47,26 @@ static unsigned char vga_font[cmapsz];
52int boot_text_mapped __force_data = 0; 47int boot_text_mapped __force_data = 0;
53int force_printk_to_btext = 0; 48int force_printk_to_btext = 0;
54 49
50extern void rmci_on(void);
51extern void rmci_off(void);
52
53static inline void rmci_maybe_on(void)
54{
55#if defined(CONFIG_PPC_EARLY_DEBUG_BOOTX) && defined(CONFIG_PPC64)
56 if (!(mfmsr() & MSR_DR))
57 rmci_on();
58#endif
59}
60
61static inline void rmci_maybe_off(void)
62{
63#if defined(CONFIG_PPC_EARLY_DEBUG_BOOTX) && defined(CONFIG_PPC64)
64 if (!(mfmsr() & MSR_DR))
65 rmci_off();
66#endif
67}
68
69
55#ifdef CONFIG_PPC32 70#ifdef CONFIG_PPC32
56/* Calc BAT values for mapping the display and store them 71/* Calc BAT values for mapping the display and store them
57 * in disp_BAT. Those values are then used from head.S to map 72 * in disp_BAT. Those values are then used from head.S to map
@@ -134,7 +149,7 @@ void __init btext_unmap(void)
134 * changes. 149 * changes.
135 */ 150 */
136 151
137static void map_boot_text(void) 152void btext_map(void)
138{ 153{
139 unsigned long base, offset, size; 154 unsigned long base, offset, size;
140 unsigned char *vbase; 155 unsigned char *vbase;
@@ -209,7 +224,7 @@ int btext_initialize(struct device_node *np)
209 dispDeviceRect[2] = width; 224 dispDeviceRect[2] = width;
210 dispDeviceRect[3] = height; 225 dispDeviceRect[3] = height;
211 226
212 map_boot_text(); 227 btext_map();
213 228
214 return 0; 229 return 0;
215} 230}
@@ -283,7 +298,7 @@ void btext_update_display(unsigned long phys, int width, int height,
283 iounmap(logicalDisplayBase); 298 iounmap(logicalDisplayBase);
284 boot_text_mapped = 0; 299 boot_text_mapped = 0;
285 } 300 }
286 map_boot_text(); 301 btext_map();
287 g_loc_X = 0; 302 g_loc_X = 0;
288 g_loc_Y = 0; 303 g_loc_Y = 0;
289 g_max_loc_X = width / 8; 304 g_max_loc_X = width / 8;
@@ -298,6 +313,7 @@ void btext_clearscreen(void)
298 (dispDeviceDepth >> 3)) >> 2; 313 (dispDeviceDepth >> 3)) >> 2;
299 int i,j; 314 int i,j;
300 315
316 rmci_maybe_on();
301 for (i=0; i<(dispDeviceRect[3] - dispDeviceRect[1]); i++) 317 for (i=0; i<(dispDeviceRect[3] - dispDeviceRect[1]); i++)
302 { 318 {
303 unsigned int *ptr = base; 319 unsigned int *ptr = base;
@@ -305,6 +321,7 @@ void btext_clearscreen(void)
305 *(ptr++) = 0; 321 *(ptr++) = 0;
306 base += (dispDeviceRowBytes >> 2); 322 base += (dispDeviceRowBytes >> 2);
307 } 323 }
324 rmci_maybe_off();
308} 325}
309 326
310void btext_flushscreen(void) 327void btext_flushscreen(void)
@@ -355,6 +372,8 @@ static void scrollscreen(void)
355 (dispDeviceDepth >> 3)) >> 2; 372 (dispDeviceDepth >> 3)) >> 2;
356 int i,j; 373 int i,j;
357 374
375 rmci_maybe_on();
376
358 for (i=0; i<(dispDeviceRect[3] - dispDeviceRect[1] - 16); i++) 377 for (i=0; i<(dispDeviceRect[3] - dispDeviceRect[1] - 16); i++)
359 { 378 {
360 unsigned int *src_ptr = src; 379 unsigned int *src_ptr = src;
@@ -371,9 +390,116 @@ static void scrollscreen(void)
371 *(dst_ptr++) = 0; 390 *(dst_ptr++) = 0;
372 dst += (dispDeviceRowBytes >> 2); 391 dst += (dispDeviceRowBytes >> 2);
373 } 392 }
393
394 rmci_maybe_off();
374} 395}
375#endif /* ndef NO_SCROLL */ 396#endif /* ndef NO_SCROLL */
376 397
398static unsigned int expand_bits_8[16] = {
399 0x00000000,
400 0x000000ff,
401 0x0000ff00,
402 0x0000ffff,
403 0x00ff0000,
404 0x00ff00ff,
405 0x00ffff00,
406 0x00ffffff,
407 0xff000000,
408 0xff0000ff,
409 0xff00ff00,
410 0xff00ffff,
411 0xffff0000,
412 0xffff00ff,
413 0xffffff00,
414 0xffffffff
415};
416
417static unsigned int expand_bits_16[4] = {
418 0x00000000,
419 0x0000ffff,
420 0xffff0000,
421 0xffffffff
422};
423
424
425static void draw_byte_32(unsigned char *font, unsigned int *base, int rb)
426{
427 int l, bits;
428 int fg = 0xFFFFFFFFUL;
429 int bg = 0x00000000UL;
430
431 for (l = 0; l < 16; ++l)
432 {
433 bits = *font++;
434 base[0] = (-(bits >> 7) & fg) ^ bg;
435 base[1] = (-((bits >> 6) & 1) & fg) ^ bg;
436 base[2] = (-((bits >> 5) & 1) & fg) ^ bg;
437 base[3] = (-((bits >> 4) & 1) & fg) ^ bg;
438 base[4] = (-((bits >> 3) & 1) & fg) ^ bg;
439 base[5] = (-((bits >> 2) & 1) & fg) ^ bg;
440 base[6] = (-((bits >> 1) & 1) & fg) ^ bg;
441 base[7] = (-(bits & 1) & fg) ^ bg;
442 base = (unsigned int *) ((char *)base + rb);
443 }
444}
445
446static inline void draw_byte_16(unsigned char *font, unsigned int *base, int rb)
447{
448 int l, bits;
449 int fg = 0xFFFFFFFFUL;
450 int bg = 0x00000000UL;
451 unsigned int *eb = (int *)expand_bits_16;
452
453 for (l = 0; l < 16; ++l)
454 {
455 bits = *font++;
456 base[0] = (eb[bits >> 6] & fg) ^ bg;
457 base[1] = (eb[(bits >> 4) & 3] & fg) ^ bg;
458 base[2] = (eb[(bits >> 2) & 3] & fg) ^ bg;
459 base[3] = (eb[bits & 3] & fg) ^ bg;
460 base = (unsigned int *) ((char *)base + rb);
461 }
462}
463
464static inline void draw_byte_8(unsigned char *font, unsigned int *base, int rb)
465{
466 int l, bits;
467 int fg = 0x0F0F0F0FUL;
468 int bg = 0x00000000UL;
469 unsigned int *eb = (int *)expand_bits_8;
470
471 for (l = 0; l < 16; ++l)
472 {
473 bits = *font++;
474 base[0] = (eb[bits >> 4] & fg) ^ bg;
475 base[1] = (eb[bits & 0xf] & fg) ^ bg;
476 base = (unsigned int *) ((char *)base + rb);
477 }
478}
479
480static noinline void draw_byte(unsigned char c, long locX, long locY)
481{
482 unsigned char *base = calc_base(locX << 3, locY << 4);
483 unsigned char *font = &vga_font[((unsigned int)c) * 16];
484 int rb = dispDeviceRowBytes;
485
486 rmci_maybe_on();
487 switch(dispDeviceDepth) {
488 case 24:
489 case 32:
490 draw_byte_32(font, (unsigned int *)base, rb);
491 break;
492 case 15:
493 case 16:
494 draw_byte_16(font, (unsigned int *)base, rb);
495 break;
496 case 8:
497 draw_byte_8(font, (unsigned int *)base, rb);
498 break;
499 }
500 rmci_maybe_off();
501}
502
377void btext_drawchar(char c) 503void btext_drawchar(char c)
378{ 504{
379 int cline = 0; 505 int cline = 0;
@@ -465,107 +591,12 @@ void btext_drawhex(unsigned long v)
465 btext_drawchar(' '); 591 btext_drawchar(' ');
466} 592}
467 593
468static void draw_byte(unsigned char c, long locX, long locY) 594void __init udbg_init_btext(void)
469{
470 unsigned char *base = calc_base(locX << 3, locY << 4);
471 unsigned char *font = &vga_font[((unsigned int)c) * 16];
472 int rb = dispDeviceRowBytes;
473
474 switch(dispDeviceDepth) {
475 case 24:
476 case 32:
477 draw_byte_32(font, (unsigned int *)base, rb);
478 break;
479 case 15:
480 case 16:
481 draw_byte_16(font, (unsigned int *)base, rb);
482 break;
483 case 8:
484 draw_byte_8(font, (unsigned int *)base, rb);
485 break;
486 }
487}
488
489static unsigned int expand_bits_8[16] = {
490 0x00000000,
491 0x000000ff,
492 0x0000ff00,
493 0x0000ffff,
494 0x00ff0000,
495 0x00ff00ff,
496 0x00ffff00,
497 0x00ffffff,
498 0xff000000,
499 0xff0000ff,
500 0xff00ff00,
501 0xff00ffff,
502 0xffff0000,
503 0xffff00ff,
504 0xffffff00,
505 0xffffffff
506};
507
508static unsigned int expand_bits_16[4] = {
509 0x00000000,
510 0x0000ffff,
511 0xffff0000,
512 0xffffffff
513};
514
515
516static void draw_byte_32(unsigned char *font, unsigned int *base, int rb)
517{
518 int l, bits;
519 int fg = 0xFFFFFFFFUL;
520 int bg = 0x00000000UL;
521
522 for (l = 0; l < 16; ++l)
523 {
524 bits = *font++;
525 base[0] = (-(bits >> 7) & fg) ^ bg;
526 base[1] = (-((bits >> 6) & 1) & fg) ^ bg;
527 base[2] = (-((bits >> 5) & 1) & fg) ^ bg;
528 base[3] = (-((bits >> 4) & 1) & fg) ^ bg;
529 base[4] = (-((bits >> 3) & 1) & fg) ^ bg;
530 base[5] = (-((bits >> 2) & 1) & fg) ^ bg;
531 base[6] = (-((bits >> 1) & 1) & fg) ^ bg;
532 base[7] = (-(bits & 1) & fg) ^ bg;
533 base = (unsigned int *) ((char *)base + rb);
534 }
535}
536
537static void draw_byte_16(unsigned char *font, unsigned int *base, int rb)
538{
539 int l, bits;
540 int fg = 0xFFFFFFFFUL;
541 int bg = 0x00000000UL;
542 unsigned int *eb = (int *)expand_bits_16;
543
544 for (l = 0; l < 16; ++l)
545 {
546 bits = *font++;
547 base[0] = (eb[bits >> 6] & fg) ^ bg;
548 base[1] = (eb[(bits >> 4) & 3] & fg) ^ bg;
549 base[2] = (eb[(bits >> 2) & 3] & fg) ^ bg;
550 base[3] = (eb[bits & 3] & fg) ^ bg;
551 base = (unsigned int *) ((char *)base + rb);
552 }
553}
554
555static void draw_byte_8(unsigned char *font, unsigned int *base, int rb)
556{ 595{
557 int l, bits; 596 /* If btext is enabled, we might have a BAT setup for early display,
558 int fg = 0x0F0F0F0FUL; 597 * thus we do enable some very basic udbg output
559 int bg = 0x00000000UL; 598 */
560 unsigned int *eb = (int *)expand_bits_8; 599 udbg_putc = btext_drawchar;
561
562 for (l = 0; l < 16; ++l)
563 {
564 bits = *font++;
565 base[0] = (eb[bits >> 4] & fg) ^ bg;
566 base[1] = (eb[bits & 0xf] & fg) ^ bg;
567 base = (unsigned int *) ((char *)base + rb);
568 }
569} 600}
570 601
571static unsigned char vga_font[cmapsz] = { 602static unsigned char vga_font[cmapsz] = {
@@ -913,10 +944,3 @@ static unsigned char vga_font[cmapsz] = {
9130x00, 0x00, 0x00, 0x00, 9440x00, 0x00, 0x00, 0x00,
914}; 945};
915 946
916void __init udbg_init_btext(void)
917{
918 /* If btext is enabled, we might have a BAT setup for early display,
919 * thus we do enable some very basic udbg output
920 */
921 udbg_putc = btext_drawchar;
922}
diff --git a/arch/powerpc/kernel/cacheinfo.c b/arch/powerpc/kernel/cacheinfo.c
index 9262cf2bec4b..654932727873 100644
--- a/arch/powerpc/kernel/cacheinfo.c
+++ b/arch/powerpc/kernel/cacheinfo.c
@@ -196,7 +196,7 @@ static void cache_cpu_set(struct cache *cache, int cpu)
196static int cache_size(const struct cache *cache, unsigned int *ret) 196static int cache_size(const struct cache *cache, unsigned int *ret)
197{ 197{
198 const char *propname; 198 const char *propname;
199 const u32 *cache_size; 199 const __be32 *cache_size;
200 200
201 propname = cache_type_info[cache->type].size_prop; 201 propname = cache_type_info[cache->type].size_prop;
202 202
@@ -204,7 +204,7 @@ static int cache_size(const struct cache *cache, unsigned int *ret)
204 if (!cache_size) 204 if (!cache_size)
205 return -ENODEV; 205 return -ENODEV;
206 206
207 *ret = *cache_size; 207 *ret = of_read_number(cache_size, 1);
208 return 0; 208 return 0;
209} 209}
210 210
@@ -222,7 +222,7 @@ static int cache_size_kb(const struct cache *cache, unsigned int *ret)
222/* not cache_line_size() because that's a macro in include/linux/cache.h */ 222/* not cache_line_size() because that's a macro in include/linux/cache.h */
223static int cache_get_line_size(const struct cache *cache, unsigned int *ret) 223static int cache_get_line_size(const struct cache *cache, unsigned int *ret)
224{ 224{
225 const u32 *line_size; 225 const __be32 *line_size;
226 int i, lim; 226 int i, lim;
227 227
228 lim = ARRAY_SIZE(cache_type_info[cache->type].line_size_props); 228 lim = ARRAY_SIZE(cache_type_info[cache->type].line_size_props);
@@ -239,14 +239,14 @@ static int cache_get_line_size(const struct cache *cache, unsigned int *ret)
239 if (!line_size) 239 if (!line_size)
240 return -ENODEV; 240 return -ENODEV;
241 241
242 *ret = *line_size; 242 *ret = of_read_number(line_size, 1);
243 return 0; 243 return 0;
244} 244}
245 245
246static int cache_nr_sets(const struct cache *cache, unsigned int *ret) 246static int cache_nr_sets(const struct cache *cache, unsigned int *ret)
247{ 247{
248 const char *propname; 248 const char *propname;
249 const u32 *nr_sets; 249 const __be32 *nr_sets;
250 250
251 propname = cache_type_info[cache->type].nr_sets_prop; 251 propname = cache_type_info[cache->type].nr_sets_prop;
252 252
@@ -254,7 +254,7 @@ static int cache_nr_sets(const struct cache *cache, unsigned int *ret)
254 if (!nr_sets) 254 if (!nr_sets)
255 return -ENODEV; 255 return -ENODEV;
256 256
257 *ret = *nr_sets; 257 *ret = of_read_number(nr_sets, 1);
258 return 0; 258 return 0;
259} 259}
260 260
diff --git a/arch/powerpc/kernel/cpu_setup_fsl_booke.S b/arch/powerpc/kernel/cpu_setup_fsl_booke.S
index 0b9af015bedc..bfb18c7290b7 100644
--- a/arch/powerpc/kernel/cpu_setup_fsl_booke.S
+++ b/arch/powerpc/kernel/cpu_setup_fsl_booke.S
@@ -75,7 +75,7 @@ _GLOBAL(__setup_cpu_e500v2)
75 bl __e500_icache_setup 75 bl __e500_icache_setup
76 bl __e500_dcache_setup 76 bl __e500_dcache_setup
77 bl __setup_e500_ivors 77 bl __setup_e500_ivors
78#ifdef CONFIG_FSL_RIO 78#if defined(CONFIG_FSL_RIO) || defined(CONFIG_FSL_PCI)
79 /* Ensure that RFXE is set */ 79 /* Ensure that RFXE is set */
80 mfspr r3,SPRN_HID1 80 mfspr r3,SPRN_HID1
81 oris r3,r3,HID1_RFXE@h 81 oris r3,r3,HID1_RFXE@h
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c
index 22973a74df73..597d954e5860 100644
--- a/arch/powerpc/kernel/cputable.c
+++ b/arch/powerpc/kernel/cputable.c
@@ -2105,7 +2105,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
2105 MMU_FTR_USE_TLBILX, 2105 MMU_FTR_USE_TLBILX,
2106 .icache_bsize = 64, 2106 .icache_bsize = 64,
2107 .dcache_bsize = 64, 2107 .dcache_bsize = 64,
2108 .num_pmcs = 4, 2108 .num_pmcs = 6,
2109 .oprofile_cpu_type = "ppc/e6500", 2109 .oprofile_cpu_type = "ppc/e6500",
2110 .oprofile_type = PPC_OPROFILE_FSL_EMB, 2110 .oprofile_type = PPC_OPROFILE_FSL_EMB,
2111 .cpu_setup = __setup_cpu_e6500, 2111 .cpu_setup = __setup_cpu_e6500,
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
index 2bd0b885b0fe..c04cdf70d487 100644
--- a/arch/powerpc/kernel/entry_64.S
+++ b/arch/powerpc/kernel/entry_64.S
@@ -102,7 +102,8 @@ BEGIN_FW_FTR_SECTION
102 /* if from user, see if there are any DTL entries to process */ 102 /* if from user, see if there are any DTL entries to process */
103 ld r10,PACALPPACAPTR(r13) /* get ptr to VPA */ 103 ld r10,PACALPPACAPTR(r13) /* get ptr to VPA */
104 ld r11,PACA_DTL_RIDX(r13) /* get log read index */ 104 ld r11,PACA_DTL_RIDX(r13) /* get log read index */
105 ld r10,LPPACA_DTLIDX(r10) /* get log write index */ 105 addi r10,r10,LPPACA_DTLIDX
106 LDX_BE r10,0,r10 /* get log write index */
106 cmpd cr1,r11,r10 107 cmpd cr1,r11,r10
107 beq+ cr1,33f 108 beq+ cr1,33f
108 bl .accumulate_stolen_time 109 bl .accumulate_stolen_time
@@ -522,9 +523,11 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)
522 */ 523 */
523 ld r9,PACA_SLBSHADOWPTR(r13) 524 ld r9,PACA_SLBSHADOWPTR(r13)
524 li r12,0 525 li r12,0
525 std r12,SLBSHADOW_STACKESID(r9) /* Clear ESID */ 526 std r12,SLBSHADOW_STACKESID(r9) /* Clear ESID */
526 std r7,SLBSHADOW_STACKVSID(r9) /* Save VSID */ 527 li r12,SLBSHADOW_STACKVSID
527 std r0,SLBSHADOW_STACKESID(r9) /* Save ESID */ 528 STDX_BE r7,r12,r9 /* Save VSID */
529 li r12,SLBSHADOW_STACKESID
530 STDX_BE r0,r12,r9 /* Save ESID */
528 531
529 /* No need to check for MMU_FTR_NO_SLBIE_B here, since when 532 /* No need to check for MMU_FTR_NO_SLBIE_B here, since when
530 * we have 1TB segments, the only CPUs known to have the errata 533 * we have 1TB segments, the only CPUs known to have the errata
@@ -575,34 +578,15 @@ BEGIN_FTR_SECTION
575 ld r7,DSCR_DEFAULT@toc(2) 578 ld r7,DSCR_DEFAULT@toc(2)
576 ld r0,THREAD_DSCR(r4) 579 ld r0,THREAD_DSCR(r4)
577 cmpwi r6,0 580 cmpwi r6,0
578 li r8, FSCR_DSCR
579 bne 1f 581 bne 1f
580 ld r0,0(r7) 582 ld r0,0(r7)
581 b 3f
5821: 5831:
583 BEGIN_FTR_SECTION_NESTED(70) 584BEGIN_FTR_SECTION_NESTED(70)
584 mfspr r6, SPRN_FSCR 585 mfspr r8, SPRN_FSCR
585 or r6, r6, r8 586 rldimi r8, r6, FSCR_DSCR_LG, (63 - FSCR_DSCR_LG)
586 mtspr SPRN_FSCR, r6 587 mtspr SPRN_FSCR, r8
587 BEGIN_FTR_SECTION_NESTED(69) 588END_FTR_SECTION_NESTED(CPU_FTR_ARCH_207S, CPU_FTR_ARCH_207S, 70)
588 mfspr r6, SPRN_HFSCR 589 cmpd r0,r25
589 or r6, r6, r8
590 mtspr SPRN_HFSCR, r6
591 END_FTR_SECTION_NESTED(CPU_FTR_HVMODE, CPU_FTR_HVMODE, 69)
592 b 4f
593 END_FTR_SECTION_NESTED(CPU_FTR_ARCH_207S, CPU_FTR_ARCH_207S, 70)
5943:
595 BEGIN_FTR_SECTION_NESTED(70)
596 mfspr r6, SPRN_FSCR
597 andc r6, r6, r8
598 mtspr SPRN_FSCR, r6
599 BEGIN_FTR_SECTION_NESTED(69)
600 mfspr r6, SPRN_HFSCR
601 andc r6, r6, r8
602 mtspr SPRN_HFSCR, r6
603 END_FTR_SECTION_NESTED(CPU_FTR_HVMODE, CPU_FTR_HVMODE, 69)
604 END_FTR_SECTION_NESTED(CPU_FTR_ARCH_207S, CPU_FTR_ARCH_207S, 70)
6054: cmpd r0,r25
606 beq 2f 590 beq 2f
607 mtspr SPRN_DSCR,r0 591 mtspr SPRN_DSCR,r0
6082: 5922:
@@ -737,9 +721,9 @@ resume_kernel:
737 721
738 /* 722 /*
739 * Here we are preempting the current task. We want to make 723 * Here we are preempting the current task. We want to make
740 * sure we are soft-disabled first 724 * sure we are soft-disabled first and reconcile irq state.
741 */ 725 */
742 SOFT_DISABLE_INTS(r3,r4) 726 RECONCILE_IRQ_STATE(r3,r4)
7431: bl .preempt_schedule_irq 7271: bl .preempt_schedule_irq
744 728
745 /* Re-test flags and eventually loop */ 729 /* Re-test flags and eventually loop */
diff --git a/arch/powerpc/kernel/epapr_paravirt.c b/arch/powerpc/kernel/epapr_paravirt.c
index d44a571e45a7..6300c13bbde4 100644
--- a/arch/powerpc/kernel/epapr_paravirt.c
+++ b/arch/powerpc/kernel/epapr_paravirt.c
@@ -30,22 +30,20 @@ extern u32 epapr_ev_idle_start[];
30 30
31bool epapr_paravirt_enabled; 31bool epapr_paravirt_enabled;
32 32
33static int __init epapr_paravirt_init(void) 33static int __init early_init_dt_scan_epapr(unsigned long node,
34 const char *uname,
35 int depth, void *data)
34{ 36{
35 struct device_node *hyper_node;
36 const u32 *insts; 37 const u32 *insts;
37 int len, i; 38 unsigned long len;
39 int i;
38 40
39 hyper_node = of_find_node_by_path("/hypervisor"); 41 insts = of_get_flat_dt_prop(node, "hcall-instructions", &len);
40 if (!hyper_node)
41 return -ENODEV;
42
43 insts = of_get_property(hyper_node, "hcall-instructions", &len);
44 if (!insts) 42 if (!insts)
45 return -ENODEV; 43 return 0;
46 44
47 if (len % 4 || len > (4 * 4)) 45 if (len % 4 || len > (4 * 4))
48 return -ENODEV; 46 return -1;
49 47
50 for (i = 0; i < (len / 4); i++) { 48 for (i = 0; i < (len / 4); i++) {
51 patch_instruction(epapr_hypercall_start + i, insts[i]); 49 patch_instruction(epapr_hypercall_start + i, insts[i]);
@@ -55,13 +53,19 @@ static int __init epapr_paravirt_init(void)
55 } 53 }
56 54
57#if !defined(CONFIG_64BIT) || defined(CONFIG_PPC_BOOK3E_64) 55#if !defined(CONFIG_64BIT) || defined(CONFIG_PPC_BOOK3E_64)
58 if (of_get_property(hyper_node, "has-idle", NULL)) 56 if (of_get_flat_dt_prop(node, "has-idle", NULL))
59 ppc_md.power_save = epapr_ev_idle; 57 ppc_md.power_save = epapr_ev_idle;
60#endif 58#endif
61 59
62 epapr_paravirt_enabled = true; 60 epapr_paravirt_enabled = true;
63 61
62 return 1;
63}
64
65int __init epapr_paravirt_early_init(void)
66{
67 of_scan_flat_dt(early_init_dt_scan_epapr, NULL);
68
64 return 0; 69 return 0;
65} 70}
66 71
67early_initcall(epapr_paravirt_init);
diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S
index 645170a07ada..2d067049db27 100644
--- a/arch/powerpc/kernel/exceptions-64e.S
+++ b/arch/powerpc/kernel/exceptions-64e.S
@@ -198,9 +198,9 @@ exc_##n##_common: \
198/* This second version is meant for exceptions that don't immediately 198/* This second version is meant for exceptions that don't immediately
199 * hard-enable. We set a bit in paca->irq_happened to ensure that 199 * hard-enable. We set a bit in paca->irq_happened to ensure that
200 * a subsequent call to arch_local_irq_restore() will properly 200 * a subsequent call to arch_local_irq_restore() will properly
201 * hard-enable and avoid the fast-path 201 * hard-enable and avoid the fast-path, and then reconcile irq state.
202 */ 202 */
203#define INTS_DISABLE SOFT_DISABLE_INTS(r3,r4) 203#define INTS_DISABLE RECONCILE_IRQ_STATE(r3,r4)
204 204
205/* This is called by exceptions that used INTS_KEEP (that did not touch 205/* This is called by exceptions that used INTS_KEEP (that did not touch
206 * irq indicators in the PACA). This will restore MSR:EE to it's previous 206 * irq indicators in the PACA). This will restore MSR:EE to it's previous
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index 902ca3c6b4b6..3a9ed6ac224b 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -293,27 +293,31 @@ system_call_pSeries:
293 * out of line to handle them 293 * out of line to handle them
294 */ 294 */
295 . = 0xe00 295 . = 0xe00
296hv_exception_trampoline: 296hv_data_storage_trampoline:
297 SET_SCRATCH0(r13) 297 SET_SCRATCH0(r13)
298 EXCEPTION_PROLOG_0(PACA_EXGEN) 298 EXCEPTION_PROLOG_0(PACA_EXGEN)
299 b h_data_storage_hv 299 b h_data_storage_hv
300 300
301 . = 0xe20 301 . = 0xe20
302hv_instr_storage_trampoline:
302 SET_SCRATCH0(r13) 303 SET_SCRATCH0(r13)
303 EXCEPTION_PROLOG_0(PACA_EXGEN) 304 EXCEPTION_PROLOG_0(PACA_EXGEN)
304 b h_instr_storage_hv 305 b h_instr_storage_hv
305 306
306 . = 0xe40 307 . = 0xe40
308emulation_assist_trampoline:
307 SET_SCRATCH0(r13) 309 SET_SCRATCH0(r13)
308 EXCEPTION_PROLOG_0(PACA_EXGEN) 310 EXCEPTION_PROLOG_0(PACA_EXGEN)
309 b emulation_assist_hv 311 b emulation_assist_hv
310 312
311 . = 0xe60 313 . = 0xe60
314hv_exception_trampoline:
312 SET_SCRATCH0(r13) 315 SET_SCRATCH0(r13)
313 EXCEPTION_PROLOG_0(PACA_EXGEN) 316 EXCEPTION_PROLOG_0(PACA_EXGEN)
314 b hmi_exception_hv 317 b hmi_exception_hv
315 318
316 . = 0xe80 319 . = 0xe80
320hv_doorbell_trampoline:
317 SET_SCRATCH0(r13) 321 SET_SCRATCH0(r13)
318 EXCEPTION_PROLOG_0(PACA_EXGEN) 322 EXCEPTION_PROLOG_0(PACA_EXGEN)
319 b h_doorbell_hv 323 b h_doorbell_hv
@@ -323,32 +327,32 @@ hv_exception_trampoline:
323 * prolog code of the PerformanceMonitor one. A little 327 * prolog code of the PerformanceMonitor one. A little
324 * trickery is thus necessary 328 * trickery is thus necessary
325 */ 329 */
326performance_monitor_pSeries_1:
327 . = 0xf00 330 . = 0xf00
331performance_monitor_pseries_trampoline:
328 SET_SCRATCH0(r13) 332 SET_SCRATCH0(r13)
329 EXCEPTION_PROLOG_0(PACA_EXGEN) 333 EXCEPTION_PROLOG_0(PACA_EXGEN)
330 b performance_monitor_pSeries 334 b performance_monitor_pSeries
331 335
332altivec_unavailable_pSeries_1:
333 . = 0xf20 336 . = 0xf20
337altivec_unavailable_pseries_trampoline:
334 SET_SCRATCH0(r13) 338 SET_SCRATCH0(r13)
335 EXCEPTION_PROLOG_0(PACA_EXGEN) 339 EXCEPTION_PROLOG_0(PACA_EXGEN)
336 b altivec_unavailable_pSeries 340 b altivec_unavailable_pSeries
337 341
338vsx_unavailable_pSeries_1:
339 . = 0xf40 342 . = 0xf40
343vsx_unavailable_pseries_trampoline:
340 SET_SCRATCH0(r13) 344 SET_SCRATCH0(r13)
341 EXCEPTION_PROLOG_0(PACA_EXGEN) 345 EXCEPTION_PROLOG_0(PACA_EXGEN)
342 b vsx_unavailable_pSeries 346 b vsx_unavailable_pSeries
343 347
344facility_unavailable_trampoline:
345 . = 0xf60 348 . = 0xf60
349facility_unavailable_trampoline:
346 SET_SCRATCH0(r13) 350 SET_SCRATCH0(r13)
347 EXCEPTION_PROLOG_0(PACA_EXGEN) 351 EXCEPTION_PROLOG_0(PACA_EXGEN)
348 b facility_unavailable_pSeries 352 b facility_unavailable_pSeries
349 353
350hv_facility_unavailable_trampoline:
351 . = 0xf80 354 . = 0xf80
355hv_facility_unavailable_trampoline:
352 SET_SCRATCH0(r13) 356 SET_SCRATCH0(r13)
353 EXCEPTION_PROLOG_0(PACA_EXGEN) 357 EXCEPTION_PROLOG_0(PACA_EXGEN)
354 b facility_unavailable_hv 358 b facility_unavailable_hv
@@ -367,11 +371,7 @@ denorm_exception_hv:
367 HMT_MEDIUM_PPR_DISCARD 371 HMT_MEDIUM_PPR_DISCARD
368 mtspr SPRN_SPRG_HSCRATCH0,r13 372 mtspr SPRN_SPRG_HSCRATCH0,r13
369 EXCEPTION_PROLOG_0(PACA_EXGEN) 373 EXCEPTION_PROLOG_0(PACA_EXGEN)
370 std r11,PACA_EXGEN+EX_R11(r13) 374 EXCEPTION_PROLOG_1(PACA_EXGEN, NOTEST, 0x1500)
371 std r12,PACA_EXGEN+EX_R12(r13)
372 mfspr r9,SPRN_SPRG_HSCRATCH0
373 std r9,PACA_EXGEN+EX_R13(r13)
374 mfcr r9
375 375
376#ifdef CONFIG_PPC_DENORMALISATION 376#ifdef CONFIG_PPC_DENORMALISATION
377 mfspr r10,SPRN_HSRR1 377 mfspr r10,SPRN_HSRR1
@@ -381,6 +381,7 @@ denorm_exception_hv:
381 bne+ denorm_assist 381 bne+ denorm_assist
382#endif 382#endif
383 383
384 KVMTEST(0x1500)
384 EXCEPTION_PROLOG_PSERIES_1(denorm_common, EXC_HV) 385 EXCEPTION_PROLOG_PSERIES_1(denorm_common, EXC_HV)
385 KVM_HANDLER_SKIP(PACA_EXGEN, EXC_STD, 0x1500) 386 KVM_HANDLER_SKIP(PACA_EXGEN, EXC_STD, 0x1500)
386 387
@@ -501,6 +502,10 @@ denorm_done:
501 mtcrf 0x80,r9 502 mtcrf 0x80,r9
502 ld r9,PACA_EXGEN+EX_R9(r13) 503 ld r9,PACA_EXGEN+EX_R9(r13)
503 RESTORE_PPR_PACA(PACA_EXGEN, r10) 504 RESTORE_PPR_PACA(PACA_EXGEN, r10)
505BEGIN_FTR_SECTION
506 ld r10,PACA_EXGEN+EX_CFAR(r13)
507 mtspr SPRN_CFAR,r10
508END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
504 ld r10,PACA_EXGEN+EX_R10(r13) 509 ld r10,PACA_EXGEN+EX_R10(r13)
505 ld r11,PACA_EXGEN+EX_R11(r13) 510 ld r11,PACA_EXGEN+EX_R11(r13)
506 ld r12,PACA_EXGEN+EX_R12(r13) 511 ld r12,PACA_EXGEN+EX_R12(r13)
@@ -808,6 +813,7 @@ system_call_relon_pSeries:
808 b . /* Can't happen, see v2.07 Book III-S section 6.5 */ 813 b . /* Can't happen, see v2.07 Book III-S section 6.5 */
809 814
810 . = 0x4e40 815 . = 0x4e40
816emulation_assist_relon_trampoline:
811 SET_SCRATCH0(r13) 817 SET_SCRATCH0(r13)
812 EXCEPTION_PROLOG_0(PACA_EXGEN) 818 EXCEPTION_PROLOG_0(PACA_EXGEN)
813 b emulation_assist_relon_hv 819 b emulation_assist_relon_hv
@@ -816,36 +822,37 @@ system_call_relon_pSeries:
816 b . /* Can't happen, see v2.07 Book III-S section 6.5 */ 822 b . /* Can't happen, see v2.07 Book III-S section 6.5 */
817 823
818 . = 0x4e80 824 . = 0x4e80
825h_doorbell_relon_trampoline:
819 SET_SCRATCH0(r13) 826 SET_SCRATCH0(r13)
820 EXCEPTION_PROLOG_0(PACA_EXGEN) 827 EXCEPTION_PROLOG_0(PACA_EXGEN)
821 b h_doorbell_relon_hv 828 b h_doorbell_relon_hv
822 829
823performance_monitor_relon_pSeries_1:
824 . = 0x4f00 830 . = 0x4f00
831performance_monitor_relon_pseries_trampoline:
825 SET_SCRATCH0(r13) 832 SET_SCRATCH0(r13)
826 EXCEPTION_PROLOG_0(PACA_EXGEN) 833 EXCEPTION_PROLOG_0(PACA_EXGEN)
827 b performance_monitor_relon_pSeries 834 b performance_monitor_relon_pSeries
828 835
829altivec_unavailable_relon_pSeries_1:
830 . = 0x4f20 836 . = 0x4f20
837altivec_unavailable_relon_pseries_trampoline:
831 SET_SCRATCH0(r13) 838 SET_SCRATCH0(r13)
832 EXCEPTION_PROLOG_0(PACA_EXGEN) 839 EXCEPTION_PROLOG_0(PACA_EXGEN)
833 b altivec_unavailable_relon_pSeries 840 b altivec_unavailable_relon_pSeries
834 841
835vsx_unavailable_relon_pSeries_1:
836 . = 0x4f40 842 . = 0x4f40
843vsx_unavailable_relon_pseries_trampoline:
837 SET_SCRATCH0(r13) 844 SET_SCRATCH0(r13)
838 EXCEPTION_PROLOG_0(PACA_EXGEN) 845 EXCEPTION_PROLOG_0(PACA_EXGEN)
839 b vsx_unavailable_relon_pSeries 846 b vsx_unavailable_relon_pSeries
840 847
841facility_unavailable_relon_trampoline:
842 . = 0x4f60 848 . = 0x4f60
849facility_unavailable_relon_trampoline:
843 SET_SCRATCH0(r13) 850 SET_SCRATCH0(r13)
844 EXCEPTION_PROLOG_0(PACA_EXGEN) 851 EXCEPTION_PROLOG_0(PACA_EXGEN)
845 b facility_unavailable_relon_pSeries 852 b facility_unavailable_relon_pSeries
846 853
847hv_facility_unavailable_relon_trampoline:
848 . = 0x4f80 854 . = 0x4f80
855hv_facility_unavailable_relon_trampoline:
849 SET_SCRATCH0(r13) 856 SET_SCRATCH0(r13)
850 EXCEPTION_PROLOG_0(PACA_EXGEN) 857 EXCEPTION_PROLOG_0(PACA_EXGEN)
851 b hv_facility_unavailable_relon_hv 858 b hv_facility_unavailable_relon_hv
diff --git a/arch/powerpc/kernel/head_40x.S b/arch/powerpc/kernel/head_40x.S
index 8a9b6f59822d..67ee0d6c1070 100644
--- a/arch/powerpc/kernel/head_40x.S
+++ b/arch/powerpc/kernel/head_40x.S
@@ -822,14 +822,6 @@ finish_tlb_load:
822 rfi /* Should sync shadow TLBs */ 822 rfi /* Should sync shadow TLBs */
823 b . /* prevent prefetch past rfi */ 823 b . /* prevent prefetch past rfi */
824 824
825/* extern void giveup_fpu(struct task_struct *prev)
826 *
827 * The PowerPC 4xx family of processors do not have an FPU, so this just
828 * returns.
829 */
830_ENTRY(giveup_fpu)
831 blr
832
833/* This is where the main kernel code starts. 825/* This is where the main kernel code starts.
834 */ 826 */
835start_here: 827start_here:
diff --git a/arch/powerpc/kernel/head_44x.S b/arch/powerpc/kernel/head_44x.S
index 97e2671cde7f..c334f53453f7 100644
--- a/arch/powerpc/kernel/head_44x.S
+++ b/arch/powerpc/kernel/head_44x.S
@@ -784,16 +784,6 @@ _GLOBAL(__fixup_440A_mcheck)
784 sync 784 sync
785 blr 785 blr
786 786
787/*
788 * extern void giveup_fpu(struct task_struct *prev)
789 *
790 * The 44x core does not have an FPU.
791 */
792#ifndef CONFIG_PPC_FPU
793_GLOBAL(giveup_fpu)
794 blr
795#endif
796
797_GLOBAL(set_context) 787_GLOBAL(set_context)
798 788
799#ifdef CONFIG_BDI_SWITCH 789#ifdef CONFIG_BDI_SWITCH
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S
index b61363d557b5..3d11d8038dee 100644
--- a/arch/powerpc/kernel/head_64.S
+++ b/arch/powerpc/kernel/head_64.S
@@ -703,6 +703,7 @@ _GLOBAL(relative_toc)
703 mtlr r0 703 mtlr r0
704 blr 704 blr
705 705
706.balign 8
706p_toc: .llong __toc_start + 0x8000 - 0b 707p_toc: .llong __toc_start + 0x8000 - 0b
707 708
708/* 709/*
diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S
index b2a5860accfb..1b92a97b1b04 100644
--- a/arch/powerpc/kernel/head_8xx.S
+++ b/arch/powerpc/kernel/head_8xx.S
@@ -691,10 +691,6 @@ modified_instr:
691 b 151b 691 b 151b
692#endif 692#endif
693 693
694 .globl giveup_fpu
695giveup_fpu:
696 blr
697
698/* 694/*
699 * This is where the main kernel code starts. 695 * This is where the main kernel code starts.
700 */ 696 */
diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S
index d10a7cacccd2..289afaffbbb5 100644
--- a/arch/powerpc/kernel/head_fsl_booke.S
+++ b/arch/powerpc/kernel/head_fsl_booke.S
@@ -948,16 +948,6 @@ _GLOBAL(giveup_spe)
948#endif /* CONFIG_SPE */ 948#endif /* CONFIG_SPE */
949 949
950/* 950/*
951 * extern void giveup_fpu(struct task_struct *prev)
952 *
953 * Not all FSL Book-E cores have an FPU
954 */
955#ifndef CONFIG_PPC_FPU
956_GLOBAL(giveup_fpu)
957 blr
958#endif
959
960/*
961 * extern void abort(void) 951 * extern void abort(void)
962 * 952 *
963 * At present, this routine just applies a system reset. 953 * At present, this routine just applies a system reset.
diff --git a/arch/powerpc/kernel/io-workarounds.c b/arch/powerpc/kernel/io-workarounds.c
index fa0b54b2a362..24b968f8e4d8 100644
--- a/arch/powerpc/kernel/io-workarounds.c
+++ b/arch/powerpc/kernel/io-workarounds.c
@@ -53,6 +53,7 @@ static struct iowa_bus *iowa_pci_find(unsigned long vaddr, unsigned long paddr)
53 return NULL; 53 return NULL;
54} 54}
55 55
56#ifdef CONFIG_PPC_INDIRECT_MMIO
56struct iowa_bus *iowa_mem_find_bus(const PCI_IO_ADDR addr) 57struct iowa_bus *iowa_mem_find_bus(const PCI_IO_ADDR addr)
57{ 58{
58 unsigned hugepage_shift; 59 unsigned hugepage_shift;
@@ -90,13 +91,25 @@ struct iowa_bus *iowa_mem_find_bus(const PCI_IO_ADDR addr)
90 91
91 return bus; 92 return bus;
92} 93}
94#else /* CONFIG_PPC_INDIRECT_MMIO */
95struct iowa_bus *iowa_mem_find_bus(const PCI_IO_ADDR addr)
96{
97 return NULL;
98}
99#endif /* !CONFIG_PPC_INDIRECT_MMIO */
93 100
101#ifdef CONFIG_PPC_INDIRECT_PIO
94struct iowa_bus *iowa_pio_find_bus(unsigned long port) 102struct iowa_bus *iowa_pio_find_bus(unsigned long port)
95{ 103{
96 unsigned long vaddr = (unsigned long)pci_io_base + port; 104 unsigned long vaddr = (unsigned long)pci_io_base + port;
97 return iowa_pci_find(vaddr, 0); 105 return iowa_pci_find(vaddr, 0);
98} 106}
99 107#else
108struct iowa_bus *iowa_pio_find_bus(unsigned long port)
109{
110 return NULL;
111}
112#endif
100 113
101#define DEF_PCI_AC_RET(name, ret, at, al, space, aa) \ 114#define DEF_PCI_AC_RET(name, ret, at, al, space, aa) \
102static ret iowa_##name at \ 115static ret iowa_##name at \
@@ -137,6 +150,7 @@ static const struct ppc_pci_io iowa_pci_io = {
137 150
138}; 151};
139 152
153#ifdef CONFIG_PPC_INDIRECT_MMIO
140static void __iomem *iowa_ioremap(phys_addr_t addr, unsigned long size, 154static void __iomem *iowa_ioremap(phys_addr_t addr, unsigned long size,
141 unsigned long flags, void *caller) 155 unsigned long flags, void *caller)
142{ 156{
@@ -151,6 +165,9 @@ static void __iomem *iowa_ioremap(phys_addr_t addr, unsigned long size,
151 } 165 }
152 return res; 166 return res;
153} 167}
168#else /* CONFIG_PPC_INDIRECT_MMIO */
169#define iowa_ioremap NULL
170#endif /* !CONFIG_PPC_INDIRECT_MMIO */
154 171
155/* Enable IO workaround */ 172/* Enable IO workaround */
156static void io_workaround_init(void) 173static void io_workaround_init(void)
diff --git a/arch/powerpc/kernel/io.c b/arch/powerpc/kernel/io.c
index 886381f32c3d..2a2b4aeab80f 100644
--- a/arch/powerpc/kernel/io.c
+++ b/arch/powerpc/kernel/io.c
@@ -25,6 +25,9 @@
25#include <asm/firmware.h> 25#include <asm/firmware.h>
26#include <asm/bug.h> 26#include <asm/bug.h>
27 27
28/* See definition in io.h */
29bool isa_io_special;
30
28void _insb(const volatile u8 __iomem *port, void *buf, long count) 31void _insb(const volatile u8 __iomem *port, void *buf, long count)
29{ 32{
30 u8 *tbuf = buf; 33 u8 *tbuf = buf;
diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c
index b20ff173a671..0adab06ce5c0 100644
--- a/arch/powerpc/kernel/iommu.c
+++ b/arch/powerpc/kernel/iommu.c
@@ -105,7 +105,7 @@ static int __init fail_iommu_debugfs(void)
105 struct dentry *dir = fault_create_debugfs_attr("fail_iommu", 105 struct dentry *dir = fault_create_debugfs_attr("fail_iommu",
106 NULL, &fail_iommu); 106 NULL, &fail_iommu);
107 107
108 return PTR_RET(dir); 108 return PTR_ERR_OR_ZERO(dir);
109} 109}
110late_initcall(fail_iommu_debugfs); 110late_initcall(fail_iommu_debugfs);
111 111
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
index c69440cef7af..57d286a78f86 100644
--- a/arch/powerpc/kernel/irq.c
+++ b/arch/powerpc/kernel/irq.c
@@ -441,50 +441,6 @@ void migrate_irqs(void)
441} 441}
442#endif 442#endif
443 443
444static inline void handle_one_irq(unsigned int irq)
445{
446 struct thread_info *curtp, *irqtp;
447 unsigned long saved_sp_limit;
448 struct irq_desc *desc;
449
450 desc = irq_to_desc(irq);
451 if (!desc)
452 return;
453
454 /* Switch to the irq stack to handle this */
455 curtp = current_thread_info();
456 irqtp = hardirq_ctx[smp_processor_id()];
457
458 if (curtp == irqtp) {
459 /* We're already on the irq stack, just handle it */
460 desc->handle_irq(irq, desc);
461 return;
462 }
463
464 saved_sp_limit = current->thread.ksp_limit;
465
466 irqtp->task = curtp->task;
467 irqtp->flags = 0;
468
469 /* Copy the softirq bits in preempt_count so that the
470 * softirq checks work in the hardirq context. */
471 irqtp->preempt_count = (irqtp->preempt_count & ~SOFTIRQ_MASK) |
472 (curtp->preempt_count & SOFTIRQ_MASK);
473
474 current->thread.ksp_limit = (unsigned long)irqtp +
475 _ALIGN_UP(sizeof(struct thread_info), 16);
476
477 call_handle_irq(irq, desc, irqtp, desc->handle_irq);
478 current->thread.ksp_limit = saved_sp_limit;
479 irqtp->task = NULL;
480
481 /* Set any flag that may have been set on the
482 * alternate stack
483 */
484 if (irqtp->flags)
485 set_bits(irqtp->flags, &curtp->flags);
486}
487
488static inline void check_stack_overflow(void) 444static inline void check_stack_overflow(void)
489{ 445{
490#ifdef CONFIG_DEBUG_STACKOVERFLOW 446#ifdef CONFIG_DEBUG_STACKOVERFLOW
@@ -501,9 +457,9 @@ static inline void check_stack_overflow(void)
501#endif 457#endif
502} 458}
503 459
504void do_IRQ(struct pt_regs *regs) 460void __do_irq(struct pt_regs *regs)
505{ 461{
506 struct pt_regs *old_regs = set_irq_regs(regs); 462 struct irq_desc *desc;
507 unsigned int irq; 463 unsigned int irq;
508 464
509 irq_enter(); 465 irq_enter();
@@ -519,18 +475,56 @@ void do_IRQ(struct pt_regs *regs)
519 */ 475 */
520 irq = ppc_md.get_irq(); 476 irq = ppc_md.get_irq();
521 477
522 /* We can hard enable interrupts now */ 478 /* We can hard enable interrupts now to allow perf interrupts */
523 may_hard_irq_enable(); 479 may_hard_irq_enable();
524 480
525 /* And finally process it */ 481 /* And finally process it */
526 if (irq != NO_IRQ) 482 if (unlikely(irq == NO_IRQ))
527 handle_one_irq(irq);
528 else
529 __get_cpu_var(irq_stat).spurious_irqs++; 483 __get_cpu_var(irq_stat).spurious_irqs++;
484 else {
485 desc = irq_to_desc(irq);
486 if (likely(desc))
487 desc->handle_irq(irq, desc);
488 }
530 489
531 trace_irq_exit(regs); 490 trace_irq_exit(regs);
532 491
533 irq_exit(); 492 irq_exit();
493}
494
495void do_IRQ(struct pt_regs *regs)
496{
497 struct pt_regs *old_regs = set_irq_regs(regs);
498 struct thread_info *curtp, *irqtp;
499
500 /* Switch to the irq stack to handle this */
501 curtp = current_thread_info();
502 irqtp = hardirq_ctx[raw_smp_processor_id()];
503
504 /* Already there ? */
505 if (unlikely(curtp == irqtp)) {
506 __do_irq(regs);
507 set_irq_regs(old_regs);
508 return;
509 }
510
511 /* Prepare the thread_info in the irq stack */
512 irqtp->task = curtp->task;
513 irqtp->flags = 0;
514
515 /* Copy the preempt_count so that the [soft]irq checks work. */
516 irqtp->preempt_count = curtp->preempt_count;
517
518 /* Switch stack and call */
519 call_do_irq(regs, irqtp);
520
521 /* Restore stack limit */
522 irqtp->task = NULL;
523
524 /* Copy back updates to the thread_info */
525 if (irqtp->flags)
526 set_bits(irqtp->flags, &curtp->flags);
527
534 set_irq_regs(old_regs); 528 set_irq_regs(old_regs);
535} 529}
536 530
@@ -592,28 +586,22 @@ void irq_ctx_init(void)
592 memset((void *)softirq_ctx[i], 0, THREAD_SIZE); 586 memset((void *)softirq_ctx[i], 0, THREAD_SIZE);
593 tp = softirq_ctx[i]; 587 tp = softirq_ctx[i];
594 tp->cpu = i; 588 tp->cpu = i;
595 tp->preempt_count = 0;
596 589
597 memset((void *)hardirq_ctx[i], 0, THREAD_SIZE); 590 memset((void *)hardirq_ctx[i], 0, THREAD_SIZE);
598 tp = hardirq_ctx[i]; 591 tp = hardirq_ctx[i];
599 tp->cpu = i; 592 tp->cpu = i;
600 tp->preempt_count = HARDIRQ_OFFSET;
601 } 593 }
602} 594}
603 595
604static inline void do_softirq_onstack(void) 596static inline void do_softirq_onstack(void)
605{ 597{
606 struct thread_info *curtp, *irqtp; 598 struct thread_info *curtp, *irqtp;
607 unsigned long saved_sp_limit = current->thread.ksp_limit;
608 599
609 curtp = current_thread_info(); 600 curtp = current_thread_info();
610 irqtp = softirq_ctx[smp_processor_id()]; 601 irqtp = softirq_ctx[smp_processor_id()];
611 irqtp->task = curtp->task; 602 irqtp->task = curtp->task;
612 irqtp->flags = 0; 603 irqtp->flags = 0;
613 current->thread.ksp_limit = (unsigned long)irqtp +
614 _ALIGN_UP(sizeof(struct thread_info), 16);
615 call_do_softirq(irqtp); 604 call_do_softirq(irqtp);
616 current->thread.ksp_limit = saved_sp_limit;
617 irqtp->task = NULL; 605 irqtp->task = NULL;
618 606
619 /* Set any flag that may have been set on the 607 /* Set any flag that may have been set on the
diff --git a/arch/powerpc/kernel/legacy_serial.c b/arch/powerpc/kernel/legacy_serial.c
index 0733b05eb856..22e88dd2f34a 100644
--- a/arch/powerpc/kernel/legacy_serial.c
+++ b/arch/powerpc/kernel/legacy_serial.c
@@ -99,7 +99,7 @@ static int __init add_legacy_port(struct device_node *np, int want_index,
99 legacy_serial_count = index + 1; 99 legacy_serial_count = index + 1;
100 100
101 /* Check if there is a port who already claimed our slot */ 101 /* Check if there is a port who already claimed our slot */
102 if (legacy_serial_infos[index].np != 0) { 102 if (legacy_serial_infos[index].np != NULL) {
103 /* if we still have some room, move it, else override */ 103 /* if we still have some room, move it, else override */
104 if (legacy_serial_count < MAX_LEGACY_SERIAL_PORTS) { 104 if (legacy_serial_count < MAX_LEGACY_SERIAL_PORTS) {
105 printk(KERN_DEBUG "Moved legacy port %d -> %d\n", 105 printk(KERN_DEBUG "Moved legacy port %d -> %d\n",
@@ -152,7 +152,7 @@ static int __init add_legacy_soc_port(struct device_node *np,
152 struct device_node *soc_dev) 152 struct device_node *soc_dev)
153{ 153{
154 u64 addr; 154 u64 addr;
155 const u32 *addrp; 155 const __be32 *addrp;
156 upf_t flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ 156 upf_t flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ
157 | UPF_FIXED_PORT; 157 | UPF_FIXED_PORT;
158 struct device_node *tsi = of_get_parent(np); 158 struct device_node *tsi = of_get_parent(np);
@@ -221,14 +221,19 @@ static int __init add_legacy_isa_port(struct device_node *np,
221 /* Translate ISA address. If it fails, we still register the port 221 /* Translate ISA address. If it fails, we still register the port
222 * with no translated address so that it can be picked up as an IO 222 * with no translated address so that it can be picked up as an IO
223 * port later by the serial driver 223 * port later by the serial driver
224 *
225 * Note: Don't even try on P8 lpc, we know it's not directly mapped
224 */ 226 */
225 taddr = of_translate_address(np, reg); 227 if (!of_device_is_compatible(isa_brg, "ibm,power8-lpc")) {
226 if (taddr == OF_BAD_ADDR) 228 taddr = of_translate_address(np, reg);
229 if (taddr == OF_BAD_ADDR)
230 taddr = 0;
231 } else
227 taddr = 0; 232 taddr = 0;
228 233
229 /* Add port, irq will be dealt with later */ 234 /* Add port, irq will be dealt with later */
230 return add_legacy_port(np, index, UPIO_PORT, be32_to_cpu(reg[1]), taddr, 235 return add_legacy_port(np, index, UPIO_PORT, be32_to_cpu(reg[1]),
231 NO_IRQ, UPF_BOOT_AUTOCONF, 0); 236 taddr, NO_IRQ, UPF_BOOT_AUTOCONF, 0);
232 237
233} 238}
234 239
@@ -237,7 +242,7 @@ static int __init add_legacy_pci_port(struct device_node *np,
237 struct device_node *pci_dev) 242 struct device_node *pci_dev)
238{ 243{
239 u64 addr, base; 244 u64 addr, base;
240 const u32 *addrp; 245 const __be32 *addrp;
241 unsigned int flags; 246 unsigned int flags;
242 int iotype, index = -1, lindex = 0; 247 int iotype, index = -1, lindex = 0;
243 248
@@ -270,7 +275,7 @@ static int __init add_legacy_pci_port(struct device_node *np,
270 if (iotype == UPIO_MEM) 275 if (iotype == UPIO_MEM)
271 base = addr; 276 base = addr;
272 else 277 else
273 base = addrp[2]; 278 base = of_read_number(&addrp[2], 1);
274 279
275 /* Try to guess an index... If we have subdevices of the pci dev, 280 /* Try to guess an index... If we have subdevices of the pci dev,
276 * we get to their "reg" property 281 * we get to their "reg" property
@@ -307,19 +312,31 @@ static int __init add_legacy_pci_port(struct device_node *np,
307 312
308static void __init setup_legacy_serial_console(int console) 313static void __init setup_legacy_serial_console(int console)
309{ 314{
310 struct legacy_serial_info *info = 315 struct legacy_serial_info *info = &legacy_serial_infos[console];
311 &legacy_serial_infos[console]; 316 struct plat_serial8250_port *port = &legacy_serial_ports[console];
312 void __iomem *addr; 317 void __iomem *addr;
313 318
314 if (info->taddr == 0) 319 /* Check if a translated MMIO address has been found */
315 return; 320 if (info->taddr) {
316 addr = ioremap(info->taddr, 0x1000); 321 addr = ioremap(info->taddr, 0x1000);
317 if (addr == NULL) 322 if (addr == NULL)
318 return; 323 return;
324 udbg_uart_init_mmio(addr, 1);
325 } else {
326 /* Check if it's PIO and we support untranslated PIO */
327 if (port->iotype == UPIO_PORT && isa_io_special)
328 udbg_uart_init_pio(port->iobase, 1);
329 else
330 return;
331 }
332
333 /* Try to query the current speed */
319 if (info->speed == 0) 334 if (info->speed == 0)
320 info->speed = udbg_probe_uart_speed(addr, info->clock); 335 info->speed = udbg_probe_uart_speed(info->clock);
336
337 /* Set it up */
321 DBG("default console speed = %d\n", info->speed); 338 DBG("default console speed = %d\n", info->speed);
322 udbg_init_uart(addr, info->speed, info->clock); 339 udbg_uart_setup(info->speed, info->clock);
323} 340}
324 341
325/* 342/*
@@ -367,10 +384,13 @@ void __init find_legacy_serial_ports(void)
367 /* Next, fill our array with ISA ports */ 384 /* Next, fill our array with ISA ports */
368 for_each_node_by_type(np, "serial") { 385 for_each_node_by_type(np, "serial") {
369 struct device_node *isa = of_get_parent(np); 386 struct device_node *isa = of_get_parent(np);
370 if (isa && !strcmp(isa->name, "isa")) { 387 if (isa && (!strcmp(isa->name, "isa") ||
371 index = add_legacy_isa_port(np, isa); 388 !strcmp(isa->name, "lpc"))) {
372 if (index >= 0 && np == stdout) 389 if (of_device_is_available(np)) {
373 legacy_serial_console = index; 390 index = add_legacy_isa_port(np, isa);
391 if (index >= 0 && np == stdout)
392 legacy_serial_console = index;
393 }
374 } 394 }
375 of_node_put(isa); 395 of_node_put(isa);
376 } 396 }
diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S
index e469f30e6eeb..2b0ad9845363 100644
--- a/arch/powerpc/kernel/misc_32.S
+++ b/arch/powerpc/kernel/misc_32.S
@@ -36,26 +36,41 @@
36 36
37 .text 37 .text
38 38
39/*
40 * We store the saved ksp_limit in the unused part
41 * of the STACK_FRAME_OVERHEAD
42 */
39_GLOBAL(call_do_softirq) 43_GLOBAL(call_do_softirq)
40 mflr r0 44 mflr r0
41 stw r0,4(r1) 45 stw r0,4(r1)
46 lwz r10,THREAD+KSP_LIMIT(r2)
47 addi r11,r3,THREAD_INFO_GAP
42 stwu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r3) 48 stwu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r3)
43 mr r1,r3 49 mr r1,r3
50 stw r10,8(r1)
51 stw r11,THREAD+KSP_LIMIT(r2)
44 bl __do_softirq 52 bl __do_softirq
53 lwz r10,8(r1)
45 lwz r1,0(r1) 54 lwz r1,0(r1)
46 lwz r0,4(r1) 55 lwz r0,4(r1)
56 stw r10,THREAD+KSP_LIMIT(r2)
47 mtlr r0 57 mtlr r0
48 blr 58 blr
49 59
50_GLOBAL(call_handle_irq) 60_GLOBAL(call_do_irq)
51 mflr r0 61 mflr r0
52 stw r0,4(r1) 62 stw r0,4(r1)
53 mtctr r6 63 lwz r10,THREAD+KSP_LIMIT(r2)
54 stwu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r5) 64 addi r11,r3,THREAD_INFO_GAP
55 mr r1,r5 65 stwu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r4)
56 bctrl 66 mr r1,r4
67 stw r10,8(r1)
68 stw r11,THREAD+KSP_LIMIT(r2)
69 bl __do_irq
70 lwz r10,8(r1)
57 lwz r1,0(r1) 71 lwz r1,0(r1)
58 lwz r0,4(r1) 72 lwz r0,4(r1)
73 stw r10,THREAD+KSP_LIMIT(r2)
59 mtlr r0 74 mtlr r0
60 blr 75 blr
61 76
@@ -327,8 +342,9 @@ END_FTR_SECTION_IFSET(CPU_FTR_UNIFIED_ID_CACHE)
327 * 342 *
328 * flush_icache_range(unsigned long start, unsigned long stop) 343 * flush_icache_range(unsigned long start, unsigned long stop)
329 */ 344 */
330_KPROBE(__flush_icache_range) 345_KPROBE(flush_icache_range)
331BEGIN_FTR_SECTION 346BEGIN_FTR_SECTION
347 isync
332 blr /* for 601, do nothing */ 348 blr /* for 601, do nothing */
333END_FTR_SECTION_IFSET(CPU_FTR_COHERENT_ICACHE) 349END_FTR_SECTION_IFSET(CPU_FTR_COHERENT_ICACHE)
334 li r5,L1_CACHE_BYTES-1 350 li r5,L1_CACHE_BYTES-1
diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S
index 6820e45f557b..e59caf874d05 100644
--- a/arch/powerpc/kernel/misc_64.S
+++ b/arch/powerpc/kernel/misc_64.S
@@ -40,14 +40,12 @@ _GLOBAL(call_do_softirq)
40 mtlr r0 40 mtlr r0
41 blr 41 blr
42 42
43_GLOBAL(call_handle_irq) 43_GLOBAL(call_do_irq)
44 ld r8,0(r6)
45 mflr r0 44 mflr r0
46 std r0,16(r1) 45 std r0,16(r1)
47 mtctr r8 46 stdu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r4)
48 stdu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r5) 47 mr r1,r4
49 mr r1,r5 48 bl .__do_irq
50 bctrl
51 ld r1,0(r1) 49 ld r1,0(r1)
52 ld r0,16(r1) 50 ld r0,16(r1)
53 mtlr r0 51 mtlr r0
@@ -67,8 +65,10 @@ PPC64_CACHES:
67 * flush all bytes from start through stop-1 inclusive 65 * flush all bytes from start through stop-1 inclusive
68 */ 66 */
69 67
70_KPROBE(__flush_icache_range) 68_KPROBE(flush_icache_range)
71 69BEGIN_FTR_SECTION
70 blr
71END_FTR_SECTION_IFSET(CPU_FTR_COHERENT_ICACHE)
72/* 72/*
73 * Flush the data cache to memory 73 * Flush the data cache to memory
74 * 74 *
@@ -247,6 +247,37 @@ _GLOBAL(__bswapdi2)
247 blr 247 blr
248 248
249#if defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE) 249#if defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE)
250
251_GLOBAL(rmci_on)
252 sync
253 isync
254 li r3,0x100
255 rldicl r3,r3,32,0
256 mfspr r5,SPRN_HID4
257 or r5,r5,r3
258 sync
259 mtspr SPRN_HID4,r5
260 isync
261 slbia
262 isync
263 sync
264 blr
265
266_GLOBAL(rmci_off)
267 sync
268 isync
269 li r3,0x100
270 rldicl r3,r3,32,0
271 mfspr r5,SPRN_HID4
272 andc r5,r5,r3
273 sync
274 mtspr SPRN_HID4,r5
275 isync
276 slbia
277 isync
278 sync
279 blr
280
250/* 281/*
251 * Do an IO access in real mode 282 * Do an IO access in real mode
252 */ 283 */
@@ -416,19 +447,6 @@ _GLOBAL(scom970_write)
416 blr 447 blr
417#endif /* CONFIG_CPU_FREQ_PMAC64 || CONFIG_CPU_FREQ_MAPLE */ 448#endif /* CONFIG_CPU_FREQ_PMAC64 || CONFIG_CPU_FREQ_MAPLE */
418 449
419
420/*
421 * disable_kernel_fp()
422 * Disable the FPU.
423 */
424_GLOBAL(disable_kernel_fp)
425 mfmsr r3
426 rldicl r0,r3,(63-MSR_FP_LG),1
427 rldicl r3,r0,(MSR_FP_LG+1),0
428 mtmsrd r3 /* disable use of fpu now */
429 isync
430 blr
431
432/* kexec_wait(phys_cpu) 450/* kexec_wait(phys_cpu)
433 * 451 *
434 * wait for the flag to change, indicating this kernel is going away but 452 * wait for the flag to change, indicating this kernel is going away but
diff --git a/arch/powerpc/kernel/paca.c b/arch/powerpc/kernel/paca.c
index f8f24685f10a..3fc16e3beb9f 100644
--- a/arch/powerpc/kernel/paca.c
+++ b/arch/powerpc/kernel/paca.c
@@ -34,10 +34,10 @@ extern unsigned long __toc_start;
34 */ 34 */
35struct lppaca lppaca[] = { 35struct lppaca lppaca[] = {
36 [0 ... (NR_LPPACAS-1)] = { 36 [0 ... (NR_LPPACAS-1)] = {
37 .desc = 0xd397d781, /* "LpPa" */ 37 .desc = cpu_to_be32(0xd397d781), /* "LpPa" */
38 .size = sizeof(struct lppaca), 38 .size = cpu_to_be16(sizeof(struct lppaca)),
39 .fpregs_in_use = 1, 39 .fpregs_in_use = 1,
40 .slb_count = 64, 40 .slb_count = cpu_to_be16(64),
41 .vmxregs_in_use = 0, 41 .vmxregs_in_use = 0,
42 .page_ins = 0, 42 .page_ins = 0,
43 }, 43 },
@@ -101,8 +101,8 @@ static inline void free_lppacas(void) { }
101 */ 101 */
102struct slb_shadow slb_shadow[] __cacheline_aligned = { 102struct slb_shadow slb_shadow[] __cacheline_aligned = {
103 [0 ... (NR_CPUS-1)] = { 103 [0 ... (NR_CPUS-1)] = {
104 .persistent = SLB_NUM_BOLTED, 104 .persistent = cpu_to_be32(SLB_NUM_BOLTED),
105 .buffer_length = sizeof(struct slb_shadow), 105 .buffer_length = cpu_to_be32(sizeof(struct slb_shadow)),
106 }, 106 },
107}; 107};
108 108
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
index 7d22a675fe1a..905a24bb7acc 100644
--- a/arch/powerpc/kernel/pci-common.c
+++ b/arch/powerpc/kernel/pci-common.c
@@ -306,7 +306,7 @@ static struct resource *__pci_mmap_make_offset(struct pci_dev *dev,
306 unsigned long io_offset = 0; 306 unsigned long io_offset = 0;
307 int i, res_bit; 307 int i, res_bit;
308 308
309 if (hose == 0) 309 if (hose == NULL)
310 return NULL; /* should never happen */ 310 return NULL; /* should never happen */
311 311
312 /* If memory, add on the PCI bridge address offset */ 312 /* If memory, add on the PCI bridge address offset */
@@ -667,7 +667,7 @@ void pci_resource_to_user(const struct pci_dev *dev, int bar,
667void pci_process_bridge_OF_ranges(struct pci_controller *hose, 667void pci_process_bridge_OF_ranges(struct pci_controller *hose,
668 struct device_node *dev, int primary) 668 struct device_node *dev, int primary)
669{ 669{
670 const u32 *ranges; 670 const __be32 *ranges;
671 int rlen; 671 int rlen;
672 int pna = of_n_addr_cells(dev); 672 int pna = of_n_addr_cells(dev);
673 int np = pna + 5; 673 int np = pna + 5;
@@ -687,7 +687,7 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose,
687 /* Parse it */ 687 /* Parse it */
688 while ((rlen -= np * 4) >= 0) { 688 while ((rlen -= np * 4) >= 0) {
689 /* Read next ranges element */ 689 /* Read next ranges element */
690 pci_space = ranges[0]; 690 pci_space = of_read_number(ranges, 1);
691 pci_addr = of_read_number(ranges + 1, 2); 691 pci_addr = of_read_number(ranges + 1, 2);
692 cpu_addr = of_translate_address(dev, ranges + 3); 692 cpu_addr = of_translate_address(dev, ranges + 3);
693 size = of_read_number(ranges + pna + 3, 2); 693 size = of_read_number(ranges + pna + 3, 2);
@@ -704,7 +704,7 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose,
704 /* Now consume following elements while they are contiguous */ 704 /* Now consume following elements while they are contiguous */
705 for (; rlen >= np * sizeof(u32); 705 for (; rlen >= np * sizeof(u32);
706 ranges += np, rlen -= np * 4) { 706 ranges += np, rlen -= np * 4) {
707 if (ranges[0] != pci_space) 707 if (of_read_number(ranges, 1) != pci_space)
708 break; 708 break;
709 pci_next = of_read_number(ranges + 1, 2); 709 pci_next = of_read_number(ranges + 1, 2);
710 cpu_next = of_translate_address(dev, ranges + 3); 710 cpu_next = of_translate_address(dev, ranges + 3);
@@ -1055,8 +1055,7 @@ void pcibios_fixup_bus(struct pci_bus *bus)
1055 * bases. This is -not- called when generating the PCI tree from 1055 * bases. This is -not- called when generating the PCI tree from
1056 * the OF device-tree. 1056 * the OF device-tree.
1057 */ 1057 */
1058 if (bus->self != NULL) 1058 pci_read_bridge_bases(bus);
1059 pci_read_bridge_bases(bus);
1060 1059
1061 /* Now fixup the bus bus */ 1060 /* Now fixup the bus bus */
1062 pcibios_setup_bus_self(bus); 1061 pcibios_setup_bus_self(bus);
@@ -1578,7 +1577,7 @@ fake_pci_bus(struct pci_controller *hose, int busnr)
1578{ 1577{
1579 static struct pci_bus bus; 1578 static struct pci_bus bus;
1580 1579
1581 if (hose == 0) { 1580 if (hose == NULL) {
1582 printk(KERN_ERR "Can't find hose for PCI bus %d!\n", busnr); 1581 printk(KERN_ERR "Can't find hose for PCI bus %d!\n", busnr);
1583 } 1582 }
1584 bus.number = busnr; 1583 bus.number = busnr;
@@ -1674,12 +1673,8 @@ void pcibios_scan_phb(struct pci_controller *hose)
1674 /* Configure PCI Express settings */ 1673 /* Configure PCI Express settings */
1675 if (bus && !pci_has_flag(PCI_PROBE_ONLY)) { 1674 if (bus && !pci_has_flag(PCI_PROBE_ONLY)) {
1676 struct pci_bus *child; 1675 struct pci_bus *child;
1677 list_for_each_entry(child, &bus->children, node) { 1676 list_for_each_entry(child, &bus->children, node)
1678 struct pci_dev *self = child->self; 1677 pcie_bus_configure_settings(child);
1679 if (!self)
1680 continue;
1681 pcie_bus_configure_settings(child, self->pcie_mpss);
1682 }
1683 } 1678 }
1684} 1679}
1685 1680
diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c
index 2e8629654ca8..a9e311f7a9dd 100644
--- a/arch/powerpc/kernel/pci_64.c
+++ b/arch/powerpc/kernel/pci_64.c
@@ -109,7 +109,7 @@ int pcibios_unmap_io_space(struct pci_bus *bus)
109 hose = pci_bus_to_host(bus); 109 hose = pci_bus_to_host(bus);
110 110
111 /* Check if we have IOs allocated */ 111 /* Check if we have IOs allocated */
112 if (hose->io_base_alloc == 0) 112 if (hose->io_base_alloc == NULL)
113 return 0; 113 return 0;
114 114
115 pr_debug("IO unmapping for PHB %s\n", hose->dn->full_name); 115 pr_debug("IO unmapping for PHB %s\n", hose->dn->full_name);
@@ -272,7 +272,7 @@ static void quirk_radeon_32bit_msi(struct pci_dev *dev)
272 struct pci_dn *pdn = pci_get_pdn(dev); 272 struct pci_dn *pdn = pci_get_pdn(dev);
273 273
274 if (pdn) 274 if (pdn)
275 pdn->force_32bit_msi = 1; 275 pdn->force_32bit_msi = true;
276} 276}
277DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x68f2, quirk_radeon_32bit_msi); 277DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x68f2, quirk_radeon_32bit_msi);
278DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0xaa68, quirk_radeon_32bit_msi); 278DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0xaa68, quirk_radeon_32bit_msi);
diff --git a/arch/powerpc/kernel/pci_dn.c b/arch/powerpc/kernel/pci_dn.c
index df038442548a..1f61fab59d9b 100644
--- a/arch/powerpc/kernel/pci_dn.c
+++ b/arch/powerpc/kernel/pci_dn.c
@@ -47,9 +47,8 @@ struct pci_dn *pci_get_pdn(struct pci_dev *pdev)
47void *update_dn_pci_info(struct device_node *dn, void *data) 47void *update_dn_pci_info(struct device_node *dn, void *data)
48{ 48{
49 struct pci_controller *phb = data; 49 struct pci_controller *phb = data;
50 const int *type = 50 const __be32 *type = of_get_property(dn, "ibm,pci-config-space-type", NULL);
51 of_get_property(dn, "ibm,pci-config-space-type", NULL); 51 const __be32 *regs;
52 const u32 *regs;
53 struct pci_dn *pdn; 52 struct pci_dn *pdn;
54 53
55 pdn = zalloc_maybe_bootmem(sizeof(*pdn), GFP_KERNEL); 54 pdn = zalloc_maybe_bootmem(sizeof(*pdn), GFP_KERNEL);
@@ -63,12 +62,14 @@ void *update_dn_pci_info(struct device_node *dn, void *data)
63#endif 62#endif
64 regs = of_get_property(dn, "reg", NULL); 63 regs = of_get_property(dn, "reg", NULL);
65 if (regs) { 64 if (regs) {
65 u32 addr = of_read_number(regs, 1);
66
66 /* First register entry is addr (00BBSS00) */ 67 /* First register entry is addr (00BBSS00) */
67 pdn->busno = (regs[0] >> 16) & 0xff; 68 pdn->busno = (addr >> 16) & 0xff;
68 pdn->devfn = (regs[0] >> 8) & 0xff; 69 pdn->devfn = (addr >> 8) & 0xff;
69 } 70 }
70 71
71 pdn->pci_ext_config_space = (type && *type == 1); 72 pdn->pci_ext_config_space = (type && of_read_number(type, 1) == 1);
72 return NULL; 73 return NULL;
73} 74}
74 75
@@ -98,12 +99,13 @@ void *traverse_pci_devices(struct device_node *start, traverse_func pre,
98 99
99 /* We started with a phb, iterate all childs */ 100 /* We started with a phb, iterate all childs */
100 for (dn = start->child; dn; dn = nextdn) { 101 for (dn = start->child; dn; dn = nextdn) {
101 const u32 *classp; 102 const __be32 *classp;
102 u32 class; 103 u32 class = 0;
103 104
104 nextdn = NULL; 105 nextdn = NULL;
105 classp = of_get_property(dn, "class-code", NULL); 106 classp = of_get_property(dn, "class-code", NULL);
106 class = classp ? *classp : 0; 107 if (classp)
108 class = of_read_number(classp, 1);
107 109
108 if (pre && ((ret = pre(dn, data)) != NULL)) 110 if (pre && ((ret = pre(dn, data)) != NULL))
109 return ret; 111 return ret;
diff --git a/arch/powerpc/kernel/pci_of_scan.c b/arch/powerpc/kernel/pci_of_scan.c
index 15d9105323bf..4368ec6fdc8c 100644
--- a/arch/powerpc/kernel/pci_of_scan.c
+++ b/arch/powerpc/kernel/pci_of_scan.c
@@ -24,12 +24,12 @@
24 */ 24 */
25static u32 get_int_prop(struct device_node *np, const char *name, u32 def) 25static u32 get_int_prop(struct device_node *np, const char *name, u32 def)
26{ 26{
27 const u32 *prop; 27 const __be32 *prop;
28 int len; 28 int len;
29 29
30 prop = of_get_property(np, name, &len); 30 prop = of_get_property(np, name, &len);
31 if (prop && len >= 4) 31 if (prop && len >= 4)
32 return *prop; 32 return of_read_number(prop, 1);
33 return def; 33 return def;
34} 34}
35 35
@@ -77,7 +77,7 @@ static void of_pci_parse_addrs(struct device_node *node, struct pci_dev *dev)
77 unsigned int flags; 77 unsigned int flags;
78 struct pci_bus_region region; 78 struct pci_bus_region region;
79 struct resource *res; 79 struct resource *res;
80 const u32 *addrs; 80 const __be32 *addrs;
81 u32 i; 81 u32 i;
82 int proplen; 82 int proplen;
83 83
@@ -86,14 +86,14 @@ static void of_pci_parse_addrs(struct device_node *node, struct pci_dev *dev)
86 return; 86 return;
87 pr_debug(" parse addresses (%d bytes) @ %p\n", proplen, addrs); 87 pr_debug(" parse addresses (%d bytes) @ %p\n", proplen, addrs);
88 for (; proplen >= 20; proplen -= 20, addrs += 5) { 88 for (; proplen >= 20; proplen -= 20, addrs += 5) {
89 flags = pci_parse_of_flags(addrs[0], 0); 89 flags = pci_parse_of_flags(of_read_number(addrs, 1), 0);
90 if (!flags) 90 if (!flags)
91 continue; 91 continue;
92 base = of_read_number(&addrs[1], 2); 92 base = of_read_number(&addrs[1], 2);
93 size = of_read_number(&addrs[3], 2); 93 size = of_read_number(&addrs[3], 2);
94 if (!size) 94 if (!size)
95 continue; 95 continue;
96 i = addrs[0] & 0xff; 96 i = of_read_number(addrs, 1) & 0xff;
97 pr_debug(" base: %llx, size: %llx, i: %x\n", 97 pr_debug(" base: %llx, size: %llx, i: %x\n",
98 (unsigned long long)base, 98 (unsigned long long)base,
99 (unsigned long long)size, i); 99 (unsigned long long)size, i);
@@ -207,7 +207,7 @@ void of_scan_pci_bridge(struct pci_dev *dev)
207{ 207{
208 struct device_node *node = dev->dev.of_node; 208 struct device_node *node = dev->dev.of_node;
209 struct pci_bus *bus; 209 struct pci_bus *bus;
210 const u32 *busrange, *ranges; 210 const __be32 *busrange, *ranges;
211 int len, i, mode; 211 int len, i, mode;
212 struct pci_bus_region region; 212 struct pci_bus_region region;
213 struct resource *res; 213 struct resource *res;
@@ -230,9 +230,11 @@ void of_scan_pci_bridge(struct pci_dev *dev)
230 return; 230 return;
231 } 231 }
232 232
233 bus = pci_find_bus(pci_domain_nr(dev->bus), busrange[0]); 233 bus = pci_find_bus(pci_domain_nr(dev->bus),
234 of_read_number(busrange, 1));
234 if (!bus) { 235 if (!bus) {
235 bus = pci_add_new_bus(dev->bus, dev, busrange[0]); 236 bus = pci_add_new_bus(dev->bus, dev,
237 of_read_number(busrange, 1));
236 if (!bus) { 238 if (!bus) {
237 printk(KERN_ERR "Failed to create pci bus for %s\n", 239 printk(KERN_ERR "Failed to create pci bus for %s\n",
238 node->full_name); 240 node->full_name);
@@ -241,7 +243,8 @@ void of_scan_pci_bridge(struct pci_dev *dev)
241 } 243 }
242 244
243 bus->primary = dev->bus->number; 245 bus->primary = dev->bus->number;
244 pci_bus_insert_busn_res(bus, busrange[0], busrange[1]); 246 pci_bus_insert_busn_res(bus, of_read_number(busrange, 1),
247 of_read_number(busrange+1, 1));
245 bus->bridge_ctl = 0; 248 bus->bridge_ctl = 0;
246 249
247 /* parse ranges property */ 250 /* parse ranges property */
@@ -254,7 +257,7 @@ void of_scan_pci_bridge(struct pci_dev *dev)
254 } 257 }
255 i = 1; 258 i = 1;
256 for (; len >= 32; len -= 32, ranges += 8) { 259 for (; len >= 32; len -= 32, ranges += 8) {
257 flags = pci_parse_of_flags(ranges[0], 1); 260 flags = pci_parse_of_flags(of_read_number(ranges, 1), 1);
258 size = of_read_number(&ranges[6], 2); 261 size = of_read_number(&ranges[6], 2);
259 if (flags == 0 || size == 0) 262 if (flags == 0 || size == 0)
260 continue; 263 continue;
diff --git a/arch/powerpc/kernel/ppc_ksyms.c b/arch/powerpc/kernel/ppc_ksyms.c
index c29666586998..21646dbe1bb3 100644
--- a/arch/powerpc/kernel/ppc_ksyms.c
+++ b/arch/powerpc/kernel/ppc_ksyms.c
@@ -96,7 +96,9 @@ EXPORT_SYMBOL(pci_dram_offset);
96 96
97EXPORT_SYMBOL(start_thread); 97EXPORT_SYMBOL(start_thread);
98 98
99#ifdef CONFIG_PPC_FPU
99EXPORT_SYMBOL(giveup_fpu); 100EXPORT_SYMBOL(giveup_fpu);
101#endif
100#ifdef CONFIG_ALTIVEC 102#ifdef CONFIG_ALTIVEC
101EXPORT_SYMBOL(giveup_altivec); 103EXPORT_SYMBOL(giveup_altivec);
102#endif /* CONFIG_ALTIVEC */ 104#endif /* CONFIG_ALTIVEC */
@@ -111,7 +113,6 @@ EXPORT_SYMBOL(giveup_spe);
111#ifndef CONFIG_PPC64 113#ifndef CONFIG_PPC64
112EXPORT_SYMBOL(flush_instruction_cache); 114EXPORT_SYMBOL(flush_instruction_cache);
113#endif 115#endif
114EXPORT_SYMBOL(__flush_icache_range);
115EXPORT_SYMBOL(flush_dcache_range); 116EXPORT_SYMBOL(flush_dcache_range);
116 117
117#ifdef CONFIG_SMP 118#ifdef CONFIG_SMP
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
index 8083be20fe5e..96d2fdf3aa9e 100644
--- a/arch/powerpc/kernel/process.c
+++ b/arch/powerpc/kernel/process.c
@@ -74,6 +74,7 @@ struct task_struct *last_task_used_vsx = NULL;
74struct task_struct *last_task_used_spe = NULL; 74struct task_struct *last_task_used_spe = NULL;
75#endif 75#endif
76 76
77#ifdef CONFIG_PPC_FPU
77/* 78/*
78 * Make sure the floating-point register state in the 79 * Make sure the floating-point register state in the
79 * the thread_struct is up to date for task tsk. 80 * the thread_struct is up to date for task tsk.
@@ -107,6 +108,7 @@ void flush_fp_to_thread(struct task_struct *tsk)
107 } 108 }
108} 109}
109EXPORT_SYMBOL_GPL(flush_fp_to_thread); 110EXPORT_SYMBOL_GPL(flush_fp_to_thread);
111#endif
110 112
111void enable_kernel_fp(void) 113void enable_kernel_fp(void)
112{ 114{
@@ -998,9 +1000,10 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
998 kregs = (struct pt_regs *) sp; 1000 kregs = (struct pt_regs *) sp;
999 sp -= STACK_FRAME_OVERHEAD; 1001 sp -= STACK_FRAME_OVERHEAD;
1000 p->thread.ksp = sp; 1002 p->thread.ksp = sp;
1003#ifdef CONFIG_PPC32
1001 p->thread.ksp_limit = (unsigned long)task_stack_page(p) + 1004 p->thread.ksp_limit = (unsigned long)task_stack_page(p) +
1002 _ALIGN_UP(sizeof(struct thread_info), 16); 1005 _ALIGN_UP(sizeof(struct thread_info), 16);
1003 1006#endif
1004#ifdef CONFIG_HAVE_HW_BREAKPOINT 1007#ifdef CONFIG_HAVE_HW_BREAKPOINT
1005 p->thread.ptrace_bps[0] = NULL; 1008 p->thread.ptrace_bps[0] = NULL;
1006#endif 1009#endif
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c
index eb23ac92abb9..b7634ce41dbc 100644
--- a/arch/powerpc/kernel/prom.c
+++ b/arch/powerpc/kernel/prom.c
@@ -215,16 +215,16 @@ static void __init check_cpu_pa_features(unsigned long node)
215#ifdef CONFIG_PPC_STD_MMU_64 215#ifdef CONFIG_PPC_STD_MMU_64
216static void __init check_cpu_slb_size(unsigned long node) 216static void __init check_cpu_slb_size(unsigned long node)
217{ 217{
218 u32 *slb_size_ptr; 218 __be32 *slb_size_ptr;
219 219
220 slb_size_ptr = of_get_flat_dt_prop(node, "slb-size", NULL); 220 slb_size_ptr = of_get_flat_dt_prop(node, "slb-size", NULL);
221 if (slb_size_ptr != NULL) { 221 if (slb_size_ptr != NULL) {
222 mmu_slb_size = *slb_size_ptr; 222 mmu_slb_size = be32_to_cpup(slb_size_ptr);
223 return; 223 return;
224 } 224 }
225 slb_size_ptr = of_get_flat_dt_prop(node, "ibm,slb-size", NULL); 225 slb_size_ptr = of_get_flat_dt_prop(node, "ibm,slb-size", NULL);
226 if (slb_size_ptr != NULL) { 226 if (slb_size_ptr != NULL) {
227 mmu_slb_size = *slb_size_ptr; 227 mmu_slb_size = be32_to_cpup(slb_size_ptr);
228 } 228 }
229} 229}
230#else 230#else
@@ -279,11 +279,11 @@ static void __init check_cpu_feature_properties(unsigned long node)
279{ 279{
280 unsigned long i; 280 unsigned long i;
281 struct feature_property *fp = feature_properties; 281 struct feature_property *fp = feature_properties;
282 const u32 *prop; 282 const __be32 *prop;
283 283
284 for (i = 0; i < ARRAY_SIZE(feature_properties); ++i, ++fp) { 284 for (i = 0; i < ARRAY_SIZE(feature_properties); ++i, ++fp) {
285 prop = of_get_flat_dt_prop(node, fp->name, NULL); 285 prop = of_get_flat_dt_prop(node, fp->name, NULL);
286 if (prop && *prop >= fp->min_value) { 286 if (prop && be32_to_cpup(prop) >= fp->min_value) {
287 cur_cpu_spec->cpu_features |= fp->cpu_feature; 287 cur_cpu_spec->cpu_features |= fp->cpu_feature;
288 cur_cpu_spec->cpu_user_features |= fp->cpu_user_ftr; 288 cur_cpu_spec->cpu_user_features |= fp->cpu_user_ftr;
289 } 289 }
@@ -295,8 +295,8 @@ static int __init early_init_dt_scan_cpus(unsigned long node,
295 void *data) 295 void *data)
296{ 296{
297 char *type = of_get_flat_dt_prop(node, "device_type", NULL); 297 char *type = of_get_flat_dt_prop(node, "device_type", NULL);
298 const u32 *prop; 298 const __be32 *prop;
299 const u32 *intserv; 299 const __be32 *intserv;
300 int i, nthreads; 300 int i, nthreads;
301 unsigned long len; 301 unsigned long len;
302 int found = -1; 302 int found = -1;
@@ -324,8 +324,9 @@ static int __init early_init_dt_scan_cpus(unsigned long node,
324 * version 2 of the kexec param format adds the phys cpuid of 324 * version 2 of the kexec param format adds the phys cpuid of
325 * booted proc. 325 * booted proc.
326 */ 326 */
327 if (initial_boot_params->version >= 2) { 327 if (be32_to_cpu(initial_boot_params->version) >= 2) {
328 if (intserv[i] == initial_boot_params->boot_cpuid_phys) { 328 if (be32_to_cpu(intserv[i]) ==
329 be32_to_cpu(initial_boot_params->boot_cpuid_phys)) {
329 found = boot_cpu_count; 330 found = boot_cpu_count;
330 found_thread = i; 331 found_thread = i;
331 } 332 }
@@ -347,9 +348,10 @@ static int __init early_init_dt_scan_cpus(unsigned long node,
347 348
348 if (found >= 0) { 349 if (found >= 0) {
349 DBG("boot cpu: logical %d physical %d\n", found, 350 DBG("boot cpu: logical %d physical %d\n", found,
350 intserv[found_thread]); 351 be32_to_cpu(intserv[found_thread]));
351 boot_cpuid = found; 352 boot_cpuid = found;
352 set_hard_smp_processor_id(found, intserv[found_thread]); 353 set_hard_smp_processor_id(found,
354 be32_to_cpu(intserv[found_thread]));
353 355
354 /* 356 /*
355 * PAPR defines "logical" PVR values for cpus that 357 * PAPR defines "logical" PVR values for cpus that
@@ -366,8 +368,8 @@ static int __init early_init_dt_scan_cpus(unsigned long node,
366 * it uses 0x0f000001. 368 * it uses 0x0f000001.
367 */ 369 */
368 prop = of_get_flat_dt_prop(node, "cpu-version", NULL); 370 prop = of_get_flat_dt_prop(node, "cpu-version", NULL);
369 if (prop && (*prop & 0xff000000) == 0x0f000000) 371 if (prop && (be32_to_cpup(prop) & 0xff000000) == 0x0f000000)
370 identify_cpu(0, *prop); 372 identify_cpu(0, be32_to_cpup(prop));
371 373
372 identical_pvr_fixup(node); 374 identical_pvr_fixup(node);
373 } 375 }
@@ -389,7 +391,7 @@ static int __init early_init_dt_scan_cpus(unsigned long node,
389int __init early_init_dt_scan_chosen_ppc(unsigned long node, const char *uname, 391int __init early_init_dt_scan_chosen_ppc(unsigned long node, const char *uname,
390 int depth, void *data) 392 int depth, void *data)
391{ 393{
392 unsigned long *lprop; 394 unsigned long *lprop; /* All these set by kernel, so no need to convert endian */
393 395
394 /* Use common scan routine to determine if this is the chosen node */ 396 /* Use common scan routine to determine if this is the chosen node */
395 if (early_init_dt_scan_chosen(node, uname, depth, data) == 0) 397 if (early_init_dt_scan_chosen(node, uname, depth, data) == 0)
@@ -454,7 +456,7 @@ static int __init early_init_dt_scan_drconf_memory(unsigned long node)
454 if (dm == NULL || l < sizeof(__be32)) 456 if (dm == NULL || l < sizeof(__be32))
455 return 0; 457 return 0;
456 458
457 n = *dm++; /* number of entries */ 459 n = of_read_number(dm++, 1); /* number of entries */
458 if (l < (n * (dt_root_addr_cells + 4) + 1) * sizeof(__be32)) 460 if (l < (n * (dt_root_addr_cells + 4) + 1) * sizeof(__be32))
459 return 0; 461 return 0;
460 462
@@ -466,7 +468,7 @@ static int __init early_init_dt_scan_drconf_memory(unsigned long node)
466 468
467 for (; n != 0; --n) { 469 for (; n != 0; --n) {
468 base = dt_mem_next_cell(dt_root_addr_cells, &dm); 470 base = dt_mem_next_cell(dt_root_addr_cells, &dm);
469 flags = dm[3]; 471 flags = of_read_number(&dm[3], 1);
470 /* skip DRC index, pad, assoc. list index, flags */ 472 /* skip DRC index, pad, assoc. list index, flags */
471 dm += 4; 473 dm += 4;
472 /* skip this block if the reserved bit is set in flags (0x80) 474 /* skip this block if the reserved bit is set in flags (0x80)
@@ -544,14 +546,8 @@ void __init early_init_dt_add_memory_arch(u64 base, u64 size)
544 memblock_add(base, size); 546 memblock_add(base, size);
545} 547}
546 548
547void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align)
548{
549 return __va(memblock_alloc(size, align));
550}
551
552#ifdef CONFIG_BLK_DEV_INITRD 549#ifdef CONFIG_BLK_DEV_INITRD
553void __init early_init_dt_setup_initrd_arch(unsigned long start, 550void __init early_init_dt_setup_initrd_arch(u64 start, u64 end)
554 unsigned long end)
555{ 551{
556 initrd_start = (unsigned long)__va(start); 552 initrd_start = (unsigned long)__va(start);
557 initrd_end = (unsigned long)__va(end); 553 initrd_end = (unsigned long)__va(end);
@@ -591,16 +587,16 @@ static void __init early_reserve_mem_dt(void)
591static void __init early_reserve_mem(void) 587static void __init early_reserve_mem(void)
592{ 588{
593 u64 base, size; 589 u64 base, size;
594 u64 *reserve_map; 590 __be64 *reserve_map;
595 unsigned long self_base; 591 unsigned long self_base;
596 unsigned long self_size; 592 unsigned long self_size;
597 593
598 reserve_map = (u64 *)(((unsigned long)initial_boot_params) + 594 reserve_map = (__be64 *)(((unsigned long)initial_boot_params) +
599 initial_boot_params->off_mem_rsvmap); 595 be32_to_cpu(initial_boot_params->off_mem_rsvmap));
600 596
601 /* before we do anything, lets reserve the dt blob */ 597 /* before we do anything, lets reserve the dt blob */
602 self_base = __pa((unsigned long)initial_boot_params); 598 self_base = __pa((unsigned long)initial_boot_params);
603 self_size = initial_boot_params->totalsize; 599 self_size = be32_to_cpu(initial_boot_params->totalsize);
604 memblock_reserve(self_base, self_size); 600 memblock_reserve(self_base, self_size);
605 601
606 /* Look for the new "reserved-regions" property in the DT */ 602 /* Look for the new "reserved-regions" property in the DT */
@@ -620,15 +616,15 @@ static void __init early_reserve_mem(void)
620 * Handle the case where we might be booting from an old kexec 616 * Handle the case where we might be booting from an old kexec
621 * image that setup the mem_rsvmap as pairs of 32-bit values 617 * image that setup the mem_rsvmap as pairs of 32-bit values
622 */ 618 */
623 if (*reserve_map > 0xffffffffull) { 619 if (be64_to_cpup(reserve_map) > 0xffffffffull) {
624 u32 base_32, size_32; 620 u32 base_32, size_32;
625 u32 *reserve_map_32 = (u32 *)reserve_map; 621 __be32 *reserve_map_32 = (__be32 *)reserve_map;
626 622
627 DBG("Found old 32-bit reserve map\n"); 623 DBG("Found old 32-bit reserve map\n");
628 624
629 while (1) { 625 while (1) {
630 base_32 = *(reserve_map_32++); 626 base_32 = be32_to_cpup(reserve_map_32++);
631 size_32 = *(reserve_map_32++); 627 size_32 = be32_to_cpup(reserve_map_32++);
632 if (size_32 == 0) 628 if (size_32 == 0)
633 break; 629 break;
634 /* skip if the reservation is for the blob */ 630 /* skip if the reservation is for the blob */
@@ -644,8 +640,8 @@ static void __init early_reserve_mem(void)
644 640
645 /* Handle the reserve map in the fdt blob if it exists */ 641 /* Handle the reserve map in the fdt blob if it exists */
646 while (1) { 642 while (1) {
647 base = *(reserve_map++); 643 base = be64_to_cpup(reserve_map++);
648 size = *(reserve_map++); 644 size = be64_to_cpup(reserve_map++);
649 if (size == 0) 645 if (size == 0)
650 break; 646 break;
651 DBG("reserving: %llx -> %llx\n", base, size); 647 DBG("reserving: %llx -> %llx\n", base, size);
@@ -795,6 +791,32 @@ struct device_node *of_find_next_cache_node(struct device_node *np)
795 return NULL; 791 return NULL;
796} 792}
797 793
794/**
795 * of_get_ibm_chip_id - Returns the IBM "chip-id" of a device
796 * @np: device node of the device
797 *
798 * This looks for a property "ibm,chip-id" in the node or any
799 * of its parents and returns its content, or -1 if it cannot
800 * be found.
801 */
802int of_get_ibm_chip_id(struct device_node *np)
803{
804 of_node_get(np);
805 while(np) {
806 struct device_node *old = np;
807 const __be32 *prop;
808
809 prop = of_get_property(np, "ibm,chip-id", NULL);
810 if (prop) {
811 of_node_put(np);
812 return be32_to_cpup(prop);
813 }
814 np = of_get_parent(np);
815 of_node_put(old);
816 }
817 return -1;
818}
819
798#ifdef CONFIG_PPC_PSERIES 820#ifdef CONFIG_PPC_PSERIES
799/* 821/*
800 * Fix up the uninitialized fields in a new device node: 822 * Fix up the uninitialized fields in a new device node:
@@ -865,49 +887,10 @@ static int __init prom_reconfig_setup(void)
865__initcall(prom_reconfig_setup); 887__initcall(prom_reconfig_setup);
866#endif 888#endif
867 889
868/* Find the device node for a given logical cpu number, also returns the cpu 890bool arch_match_cpu_phys_id(int cpu, u64 phys_id)
869 * local thread number (index in ibm,interrupt-server#s) if relevant and
870 * asked for (non NULL)
871 */
872struct device_node *of_get_cpu_node(int cpu, unsigned int *thread)
873{ 891{
874 int hardid; 892 return (int)phys_id == get_hard_smp_processor_id(cpu);
875 struct device_node *np;
876
877 hardid = get_hard_smp_processor_id(cpu);
878
879 for_each_node_by_type(np, "cpu") {
880 const u32 *intserv;
881 unsigned int plen, t;
882
883 /* Check for ibm,ppc-interrupt-server#s. If it doesn't exist
884 * fallback to "reg" property and assume no threads
885 */
886 intserv = of_get_property(np, "ibm,ppc-interrupt-server#s",
887 &plen);
888 if (intserv == NULL) {
889 const u32 *reg = of_get_property(np, "reg", NULL);
890 if (reg == NULL)
891 continue;
892 if (*reg == hardid) {
893 if (thread)
894 *thread = 0;
895 return np;
896 }
897 } else {
898 plen /= sizeof(u32);
899 for (t = 0; t < plen; t++) {
900 if (hardid == intserv[t]) {
901 if (thread)
902 *thread = t;
903 return np;
904 }
905 }
906 }
907 }
908 return NULL;
909} 893}
910EXPORT_SYMBOL(of_get_cpu_node);
911 894
912#if defined(CONFIG_DEBUG_FS) && defined(DEBUG) 895#if defined(CONFIG_DEBUG_FS) && defined(DEBUG)
913static struct debugfs_blob_wrapper flat_dt_blob; 896static struct debugfs_blob_wrapper flat_dt_blob;
@@ -917,7 +900,7 @@ static int __init export_flat_device_tree(void)
917 struct dentry *d; 900 struct dentry *d;
918 901
919 flat_dt_blob.data = initial_boot_params; 902 flat_dt_blob.data = initial_boot_params;
920 flat_dt_blob.size = initial_boot_params->totalsize; 903 flat_dt_blob.size = be32_to_cpu(initial_boot_params->totalsize);
921 904
922 d = debugfs_create_blob("flat-device-tree", S_IFREG | S_IRUSR, 905 d = debugfs_create_blob("flat-device-tree", S_IFREG | S_IRUSR,
923 powerpc_debugfs_root, &flat_dt_blob); 906 powerpc_debugfs_root, &flat_dt_blob);
diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c
index 607902424e73..5fe2842e8bab 100644
--- a/arch/powerpc/kernel/prom_init.c
+++ b/arch/powerpc/kernel/prom_init.c
@@ -107,10 +107,10 @@ int of_workarounds;
107typedef u32 prom_arg_t; 107typedef u32 prom_arg_t;
108 108
109struct prom_args { 109struct prom_args {
110 u32 service; 110 __be32 service;
111 u32 nargs; 111 __be32 nargs;
112 u32 nret; 112 __be32 nret;
113 prom_arg_t args[10]; 113 __be32 args[10];
114}; 114};
115 115
116struct prom_t { 116struct prom_t {
@@ -123,11 +123,11 @@ struct prom_t {
123}; 123};
124 124
125struct mem_map_entry { 125struct mem_map_entry {
126 u64 base; 126 __be64 base;
127 u64 size; 127 __be64 size;
128}; 128};
129 129
130typedef u32 cell_t; 130typedef __be32 cell_t;
131 131
132extern void __start(unsigned long r3, unsigned long r4, unsigned long r5, 132extern void __start(unsigned long r3, unsigned long r4, unsigned long r5,
133 unsigned long r6, unsigned long r7, unsigned long r8, 133 unsigned long r6, unsigned long r7, unsigned long r8,
@@ -196,6 +196,8 @@ static int __initdata mem_reserve_cnt;
196 196
197static cell_t __initdata regbuf[1024]; 197static cell_t __initdata regbuf[1024];
198 198
199static bool rtas_has_query_cpu_stopped;
200
199 201
200/* 202/*
201 * Error results ... some OF calls will return "-1" on error, some 203 * Error results ... some OF calls will return "-1" on error, some
@@ -219,13 +221,13 @@ static int __init call_prom(const char *service, int nargs, int nret, ...)
219 struct prom_args args; 221 struct prom_args args;
220 va_list list; 222 va_list list;
221 223
222 args.service = ADDR(service); 224 args.service = cpu_to_be32(ADDR(service));
223 args.nargs = nargs; 225 args.nargs = cpu_to_be32(nargs);
224 args.nret = nret; 226 args.nret = cpu_to_be32(nret);
225 227
226 va_start(list, nret); 228 va_start(list, nret);
227 for (i = 0; i < nargs; i++) 229 for (i = 0; i < nargs; i++)
228 args.args[i] = va_arg(list, prom_arg_t); 230 args.args[i] = cpu_to_be32(va_arg(list, prom_arg_t));
229 va_end(list); 231 va_end(list);
230 232
231 for (i = 0; i < nret; i++) 233 for (i = 0; i < nret; i++)
@@ -234,7 +236,7 @@ static int __init call_prom(const char *service, int nargs, int nret, ...)
234 if (enter_prom(&args, prom_entry) < 0) 236 if (enter_prom(&args, prom_entry) < 0)
235 return PROM_ERROR; 237 return PROM_ERROR;
236 238
237 return (nret > 0) ? args.args[nargs] : 0; 239 return (nret > 0) ? be32_to_cpu(args.args[nargs]) : 0;
238} 240}
239 241
240static int __init call_prom_ret(const char *service, int nargs, int nret, 242static int __init call_prom_ret(const char *service, int nargs, int nret,
@@ -244,13 +246,13 @@ static int __init call_prom_ret(const char *service, int nargs, int nret,
244 struct prom_args args; 246 struct prom_args args;
245 va_list list; 247 va_list list;
246 248
247 args.service = ADDR(service); 249 args.service = cpu_to_be32(ADDR(service));
248 args.nargs = nargs; 250 args.nargs = cpu_to_be32(nargs);
249 args.nret = nret; 251 args.nret = cpu_to_be32(nret);
250 252
251 va_start(list, rets); 253 va_start(list, rets);
252 for (i = 0; i < nargs; i++) 254 for (i = 0; i < nargs; i++)
253 args.args[i] = va_arg(list, prom_arg_t); 255 args.args[i] = cpu_to_be32(va_arg(list, prom_arg_t));
254 va_end(list); 256 va_end(list);
255 257
256 for (i = 0; i < nret; i++) 258 for (i = 0; i < nret; i++)
@@ -261,9 +263,9 @@ static int __init call_prom_ret(const char *service, int nargs, int nret,
261 263
262 if (rets != NULL) 264 if (rets != NULL)
263 for (i = 1; i < nret; ++i) 265 for (i = 1; i < nret; ++i)
264 rets[i-1] = args.args[nargs+i]; 266 rets[i-1] = be32_to_cpu(args.args[nargs+i]);
265 267
266 return (nret > 0) ? args.args[nargs] : 0; 268 return (nret > 0) ? be32_to_cpu(args.args[nargs]) : 0;
267} 269}
268 270
269 271
@@ -527,7 +529,7 @@ static int __init prom_setprop(phandle node, const char *nodename,
527#define islower(c) ('a' <= (c) && (c) <= 'z') 529#define islower(c) ('a' <= (c) && (c) <= 'z')
528#define toupper(c) (islower(c) ? ((c) - 'a' + 'A') : (c)) 530#define toupper(c) (islower(c) ? ((c) - 'a' + 'A') : (c))
529 531
530unsigned long prom_strtoul(const char *cp, const char **endp) 532static unsigned long prom_strtoul(const char *cp, const char **endp)
531{ 533{
532 unsigned long result = 0, base = 10, value; 534 unsigned long result = 0, base = 10, value;
533 535
@@ -552,7 +554,7 @@ unsigned long prom_strtoul(const char *cp, const char **endp)
552 return result; 554 return result;
553} 555}
554 556
555unsigned long prom_memparse(const char *ptr, const char **retptr) 557static unsigned long prom_memparse(const char *ptr, const char **retptr)
556{ 558{
557 unsigned long ret = prom_strtoul(ptr, retptr); 559 unsigned long ret = prom_strtoul(ptr, retptr);
558 int shift = 0; 560 int shift = 0;
@@ -724,7 +726,8 @@ unsigned char ibm_architecture_vec[] = {
724 726
725}; 727};
726 728
727/* Old method - ELF header with PT_NOTE sections */ 729/* Old method - ELF header with PT_NOTE sections only works on BE */
730#ifdef __BIG_ENDIAN__
728static struct fake_elf { 731static struct fake_elf {
729 Elf32_Ehdr elfhdr; 732 Elf32_Ehdr elfhdr;
730 Elf32_Phdr phdr[2]; 733 Elf32_Phdr phdr[2];
@@ -810,6 +813,7 @@ static struct fake_elf {
810 } 813 }
811 } 814 }
812}; 815};
816#endif /* __BIG_ENDIAN__ */
813 817
814static int __init prom_count_smt_threads(void) 818static int __init prom_count_smt_threads(void)
815{ 819{
@@ -852,9 +856,9 @@ static int __init prom_count_smt_threads(void)
852 856
853static void __init prom_send_capabilities(void) 857static void __init prom_send_capabilities(void)
854{ 858{
855 ihandle elfloader, root; 859 ihandle root;
856 prom_arg_t ret; 860 prom_arg_t ret;
857 u32 *cores; 861 __be32 *cores;
858 862
859 root = call_prom("open", 1, 1, ADDR("/")); 863 root = call_prom("open", 1, 1, ADDR("/"));
860 if (root != 0) { 864 if (root != 0) {
@@ -864,15 +868,15 @@ static void __init prom_send_capabilities(void)
864 * (we assume this is the same for all cores) and use it to 868 * (we assume this is the same for all cores) and use it to
865 * divide NR_CPUS. 869 * divide NR_CPUS.
866 */ 870 */
867 cores = (u32 *)&ibm_architecture_vec[IBM_ARCH_VEC_NRCORES_OFFSET]; 871 cores = (__be32 *)&ibm_architecture_vec[IBM_ARCH_VEC_NRCORES_OFFSET];
868 if (*cores != NR_CPUS) { 872 if (be32_to_cpup(cores) != NR_CPUS) {
869 prom_printf("WARNING ! " 873 prom_printf("WARNING ! "
870 "ibm_architecture_vec structure inconsistent: %lu!\n", 874 "ibm_architecture_vec structure inconsistent: %lu!\n",
871 *cores); 875 be32_to_cpup(cores));
872 } else { 876 } else {
873 *cores = DIV_ROUND_UP(NR_CPUS, prom_count_smt_threads()); 877 *cores = cpu_to_be32(DIV_ROUND_UP(NR_CPUS, prom_count_smt_threads()));
874 prom_printf("Max number of cores passed to firmware: %lu (NR_CPUS = %lu)\n", 878 prom_printf("Max number of cores passed to firmware: %lu (NR_CPUS = %lu)\n",
875 *cores, NR_CPUS); 879 be32_to_cpup(cores), NR_CPUS);
876 } 880 }
877 881
878 /* try calling the ibm,client-architecture-support method */ 882 /* try calling the ibm,client-architecture-support method */
@@ -893,17 +897,24 @@ static void __init prom_send_capabilities(void)
893 prom_printf(" not implemented\n"); 897 prom_printf(" not implemented\n");
894 } 898 }
895 899
896 /* no ibm,client-architecture-support call, try the old way */ 900#ifdef __BIG_ENDIAN__
897 elfloader = call_prom("open", 1, 1, ADDR("/packages/elf-loader")); 901 {
898 if (elfloader == 0) { 902 ihandle elfloader;
899 prom_printf("couldn't open /packages/elf-loader\n"); 903
900 return; 904 /* no ibm,client-architecture-support call, try the old way */
905 elfloader = call_prom("open", 1, 1,
906 ADDR("/packages/elf-loader"));
907 if (elfloader == 0) {
908 prom_printf("couldn't open /packages/elf-loader\n");
909 return;
910 }
911 call_prom("call-method", 3, 1, ADDR("process-elf-header"),
912 elfloader, ADDR(&fake_elf));
913 call_prom("close", 1, 0, elfloader);
901 } 914 }
902 call_prom("call-method", 3, 1, ADDR("process-elf-header"), 915#endif /* __BIG_ENDIAN__ */
903 elfloader, ADDR(&fake_elf));
904 call_prom("close", 1, 0, elfloader);
905} 916}
906#endif 917#endif /* #if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV) */
907 918
908/* 919/*
909 * Memory allocation strategy... our layout is normally: 920 * Memory allocation strategy... our layout is normally:
@@ -1050,11 +1061,11 @@ static unsigned long __init prom_next_cell(int s, cell_t **cellp)
1050 p++; 1061 p++;
1051 s--; 1062 s--;
1052 } 1063 }
1053 r = *p++; 1064 r = be32_to_cpu(*p++);
1054#ifdef CONFIG_PPC64 1065#ifdef CONFIG_PPC64
1055 if (s > 1) { 1066 if (s > 1) {
1056 r <<= 32; 1067 r <<= 32;
1057 r |= *(p++); 1068 r |= be32_to_cpu(*(p++));
1058 } 1069 }
1059#endif 1070#endif
1060 *cellp = p; 1071 *cellp = p;
@@ -1087,8 +1098,8 @@ static void __init reserve_mem(u64 base, u64 size)
1087 1098
1088 if (cnt >= (MEM_RESERVE_MAP_SIZE - 1)) 1099 if (cnt >= (MEM_RESERVE_MAP_SIZE - 1))
1089 prom_panic("Memory reserve map exhausted !\n"); 1100 prom_panic("Memory reserve map exhausted !\n");
1090 mem_reserve_map[cnt].base = base; 1101 mem_reserve_map[cnt].base = cpu_to_be64(base);
1091 mem_reserve_map[cnt].size = size; 1102 mem_reserve_map[cnt].size = cpu_to_be64(size);
1092 mem_reserve_cnt = cnt + 1; 1103 mem_reserve_cnt = cnt + 1;
1093} 1104}
1094 1105
@@ -1102,6 +1113,7 @@ static void __init prom_init_mem(void)
1102 char *path, type[64]; 1113 char *path, type[64];
1103 unsigned int plen; 1114 unsigned int plen;
1104 cell_t *p, *endp; 1115 cell_t *p, *endp;
1116 __be32 val;
1105 u32 rac, rsc; 1117 u32 rac, rsc;
1106 1118
1107 /* 1119 /*
@@ -1109,12 +1121,14 @@ static void __init prom_init_mem(void)
1109 * 1) top of RMO (first node) 1121 * 1) top of RMO (first node)
1110 * 2) top of memory 1122 * 2) top of memory
1111 */ 1123 */
1112 rac = 2; 1124 val = cpu_to_be32(2);
1113 prom_getprop(prom.root, "#address-cells", &rac, sizeof(rac)); 1125 prom_getprop(prom.root, "#address-cells", &val, sizeof(val));
1114 rsc = 1; 1126 rac = be32_to_cpu(val);
1115 prom_getprop(prom.root, "#size-cells", &rsc, sizeof(rsc)); 1127 val = cpu_to_be32(1);
1116 prom_debug("root_addr_cells: %x\n", (unsigned long) rac); 1128 prom_getprop(prom.root, "#size-cells", &val, sizeof(rsc));
1117 prom_debug("root_size_cells: %x\n", (unsigned long) rsc); 1129 rsc = be32_to_cpu(val);
1130 prom_debug("root_addr_cells: %x\n", rac);
1131 prom_debug("root_size_cells: %x\n", rsc);
1118 1132
1119 prom_debug("scanning memory:\n"); 1133 prom_debug("scanning memory:\n");
1120 path = prom_scratch; 1134 path = prom_scratch;
@@ -1222,25 +1236,23 @@ static void __init prom_init_mem(void)
1222 1236
1223static void __init prom_close_stdin(void) 1237static void __init prom_close_stdin(void)
1224{ 1238{
1225 ihandle val; 1239 __be32 val;
1240 ihandle stdin;
1226 1241
1227 if (prom_getprop(prom.chosen, "stdin", &val, sizeof(val)) > 0) 1242 if (prom_getprop(prom.chosen, "stdin", &val, sizeof(val)) > 0) {
1228 call_prom("close", 1, 0, val); 1243 stdin = be32_to_cpu(val);
1244 call_prom("close", 1, 0, stdin);
1245 }
1229} 1246}
1230 1247
1231#ifdef CONFIG_PPC_POWERNV 1248#ifdef CONFIG_PPC_POWERNV
1232 1249
1233static u64 __initdata prom_opal_size;
1234static u64 __initdata prom_opal_align;
1235static int __initdata prom_rtas_start_cpu;
1236static u64 __initdata prom_rtas_data;
1237static u64 __initdata prom_rtas_entry;
1238
1239#ifdef CONFIG_PPC_EARLY_DEBUG_OPAL 1250#ifdef CONFIG_PPC_EARLY_DEBUG_OPAL
1240static u64 __initdata prom_opal_base; 1251static u64 __initdata prom_opal_base;
1241static u64 __initdata prom_opal_entry; 1252static u64 __initdata prom_opal_entry;
1242#endif 1253#endif
1243 1254
1255#ifdef __BIG_ENDIAN__
1244/* XXX Don't change this structure without updating opal-takeover.S */ 1256/* XXX Don't change this structure without updating opal-takeover.S */
1245static struct opal_secondary_data { 1257static struct opal_secondary_data {
1246 s64 ack; /* 0 */ 1258 s64 ack; /* 0 */
@@ -1248,6 +1260,12 @@ static struct opal_secondary_data {
1248 struct opal_takeover_args args; /* 16 */ 1260 struct opal_takeover_args args; /* 16 */
1249} opal_secondary_data; 1261} opal_secondary_data;
1250 1262
1263static u64 __initdata prom_opal_align;
1264static u64 __initdata prom_opal_size;
1265static int __initdata prom_rtas_start_cpu;
1266static u64 __initdata prom_rtas_data;
1267static u64 __initdata prom_rtas_entry;
1268
1251extern char opal_secondary_entry; 1269extern char opal_secondary_entry;
1252 1270
1253static void __init prom_query_opal(void) 1271static void __init prom_query_opal(void)
@@ -1265,6 +1283,7 @@ static void __init prom_query_opal(void)
1265 } 1283 }
1266 1284
1267 prom_printf("Querying for OPAL presence... "); 1285 prom_printf("Querying for OPAL presence... ");
1286
1268 rc = opal_query_takeover(&prom_opal_size, 1287 rc = opal_query_takeover(&prom_opal_size,
1269 &prom_opal_align); 1288 &prom_opal_align);
1270 prom_debug("(rc = %ld) ", rc); 1289 prom_debug("(rc = %ld) ", rc);
@@ -1280,7 +1299,8 @@ static void __init prom_query_opal(void)
1280 prom_opal_align = 0x10000; 1299 prom_opal_align = 0x10000;
1281} 1300}
1282 1301
1283static int prom_rtas_call(int token, int nargs, int nret, int *outputs, ...) 1302static int __init prom_rtas_call(int token, int nargs, int nret,
1303 int *outputs, ...)
1284{ 1304{
1285 struct rtas_args rtas_args; 1305 struct rtas_args rtas_args;
1286 va_list list; 1306 va_list list;
@@ -1425,6 +1445,7 @@ static void __init prom_opal_takeover(void)
1425 for (;;) 1445 for (;;)
1426 opal_do_takeover(args); 1446 opal_do_takeover(args);
1427} 1447}
1448#endif /* __BIG_ENDIAN__ */
1428 1449
1429/* 1450/*
1430 * Allocate room for and instantiate OPAL 1451 * Allocate room for and instantiate OPAL
@@ -1435,6 +1456,7 @@ static void __init prom_instantiate_opal(void)
1435 ihandle opal_inst; 1456 ihandle opal_inst;
1436 u64 base, entry; 1457 u64 base, entry;
1437 u64 size = 0, align = 0x10000; 1458 u64 size = 0, align = 0x10000;
1459 __be64 val64;
1438 u32 rets[2]; 1460 u32 rets[2];
1439 1461
1440 prom_debug("prom_instantiate_opal: start...\n"); 1462 prom_debug("prom_instantiate_opal: start...\n");
@@ -1444,11 +1466,14 @@ static void __init prom_instantiate_opal(void)
1444 if (!PHANDLE_VALID(opal_node)) 1466 if (!PHANDLE_VALID(opal_node))
1445 return; 1467 return;
1446 1468
1447 prom_getprop(opal_node, "opal-runtime-size", &size, sizeof(size)); 1469 val64 = 0;
1470 prom_getprop(opal_node, "opal-runtime-size", &val64, sizeof(val64));
1471 size = be64_to_cpu(val64);
1448 if (size == 0) 1472 if (size == 0)
1449 return; 1473 return;
1450 prom_getprop(opal_node, "opal-runtime-alignment", &align, 1474 val64 = 0;
1451 sizeof(align)); 1475 prom_getprop(opal_node, "opal-runtime-alignment", &val64,sizeof(val64));
1476 align = be64_to_cpu(val64);
1452 1477
1453 base = alloc_down(size, align, 0); 1478 base = alloc_down(size, align, 0);
1454 if (base == 0) { 1479 if (base == 0) {
@@ -1505,6 +1530,7 @@ static void __init prom_instantiate_rtas(void)
1505 phandle rtas_node; 1530 phandle rtas_node;
1506 ihandle rtas_inst; 1531 ihandle rtas_inst;
1507 u32 base, entry = 0; 1532 u32 base, entry = 0;
1533 __be32 val;
1508 u32 size = 0; 1534 u32 size = 0;
1509 1535
1510 prom_debug("prom_instantiate_rtas: start...\n"); 1536 prom_debug("prom_instantiate_rtas: start...\n");
@@ -1514,7 +1540,9 @@ static void __init prom_instantiate_rtas(void)
1514 if (!PHANDLE_VALID(rtas_node)) 1540 if (!PHANDLE_VALID(rtas_node))
1515 return; 1541 return;
1516 1542
1517 prom_getprop(rtas_node, "rtas-size", &size, sizeof(size)); 1543 val = 0;
1544 prom_getprop(rtas_node, "rtas-size", &val, sizeof(size));
1545 size = be32_to_cpu(val);
1518 if (size == 0) 1546 if (size == 0)
1519 return; 1547 return;
1520 1548
@@ -1541,12 +1569,19 @@ static void __init prom_instantiate_rtas(void)
1541 1569
1542 reserve_mem(base, size); 1570 reserve_mem(base, size);
1543 1571
1572 val = cpu_to_be32(base);
1544 prom_setprop(rtas_node, "/rtas", "linux,rtas-base", 1573 prom_setprop(rtas_node, "/rtas", "linux,rtas-base",
1545 &base, sizeof(base)); 1574 &val, sizeof(val));
1575 val = cpu_to_be32(entry);
1546 prom_setprop(rtas_node, "/rtas", "linux,rtas-entry", 1576 prom_setprop(rtas_node, "/rtas", "linux,rtas-entry",
1547 &entry, sizeof(entry)); 1577 &val, sizeof(val));
1548 1578
1549#ifdef CONFIG_PPC_POWERNV 1579 /* Check if it supports "query-cpu-stopped-state" */
1580 if (prom_getprop(rtas_node, "query-cpu-stopped-state",
1581 &val, sizeof(val)) != PROM_ERROR)
1582 rtas_has_query_cpu_stopped = true;
1583
1584#if defined(CONFIG_PPC_POWERNV) && defined(__BIG_ENDIAN__)
1550 /* PowerVN takeover hack */ 1585 /* PowerVN takeover hack */
1551 prom_rtas_data = base; 1586 prom_rtas_data = base;
1552 prom_rtas_entry = entry; 1587 prom_rtas_entry = entry;
@@ -1620,6 +1655,7 @@ static void __init prom_instantiate_sml(void)
1620/* 1655/*
1621 * Allocate room for and initialize TCE tables 1656 * Allocate room for and initialize TCE tables
1622 */ 1657 */
1658#ifdef __BIG_ENDIAN__
1623static void __init prom_initialize_tce_table(void) 1659static void __init prom_initialize_tce_table(void)
1624{ 1660{
1625 phandle node; 1661 phandle node;
@@ -1748,7 +1784,8 @@ static void __init prom_initialize_tce_table(void)
1748 /* Flag the first invalid entry */ 1784 /* Flag the first invalid entry */
1749 prom_debug("ending prom_initialize_tce_table\n"); 1785 prom_debug("ending prom_initialize_tce_table\n");
1750} 1786}
1751#endif 1787#endif /* __BIG_ENDIAN__ */
1788#endif /* CONFIG_PPC64 */
1752 1789
1753/* 1790/*
1754 * With CHRP SMP we need to use the OF to start the other processors. 1791 * With CHRP SMP we need to use the OF to start the other processors.
@@ -1777,7 +1814,6 @@ static void __init prom_initialize_tce_table(void)
1777static void __init prom_hold_cpus(void) 1814static void __init prom_hold_cpus(void)
1778{ 1815{
1779 unsigned long i; 1816 unsigned long i;
1780 unsigned int reg;
1781 phandle node; 1817 phandle node;
1782 char type[64]; 1818 char type[64];
1783 unsigned long *spinloop 1819 unsigned long *spinloop
@@ -1786,6 +1822,18 @@ static void __init prom_hold_cpus(void)
1786 = (void *) LOW_ADDR(__secondary_hold_acknowledge); 1822 = (void *) LOW_ADDR(__secondary_hold_acknowledge);
1787 unsigned long secondary_hold = LOW_ADDR(__secondary_hold); 1823 unsigned long secondary_hold = LOW_ADDR(__secondary_hold);
1788 1824
1825 /*
1826 * On pseries, if RTAS supports "query-cpu-stopped-state",
1827 * we skip this stage, the CPUs will be started by the
1828 * kernel using RTAS.
1829 */
1830 if ((of_platform == PLATFORM_PSERIES ||
1831 of_platform == PLATFORM_PSERIES_LPAR) &&
1832 rtas_has_query_cpu_stopped) {
1833 prom_printf("prom_hold_cpus: skipped\n");
1834 return;
1835 }
1836
1789 prom_debug("prom_hold_cpus: start...\n"); 1837 prom_debug("prom_hold_cpus: start...\n");
1790 prom_debug(" 1) spinloop = 0x%x\n", (unsigned long)spinloop); 1838 prom_debug(" 1) spinloop = 0x%x\n", (unsigned long)spinloop);
1791 prom_debug(" 1) *spinloop = 0x%x\n", *spinloop); 1839 prom_debug(" 1) *spinloop = 0x%x\n", *spinloop);
@@ -1803,6 +1851,9 @@ static void __init prom_hold_cpus(void)
1803 1851
1804 /* look for cpus */ 1852 /* look for cpus */
1805 for (node = 0; prom_next_node(&node); ) { 1853 for (node = 0; prom_next_node(&node); ) {
1854 unsigned int cpu_no;
1855 __be32 reg;
1856
1806 type[0] = 0; 1857 type[0] = 0;
1807 prom_getprop(node, "device_type", type, sizeof(type)); 1858 prom_getprop(node, "device_type", type, sizeof(type));
1808 if (strcmp(type, "cpu") != 0) 1859 if (strcmp(type, "cpu") != 0)
@@ -1813,10 +1864,11 @@ static void __init prom_hold_cpus(void)
1813 if (strcmp(type, "okay") != 0) 1864 if (strcmp(type, "okay") != 0)
1814 continue; 1865 continue;
1815 1866
1816 reg = -1; 1867 reg = cpu_to_be32(-1); /* make sparse happy */
1817 prom_getprop(node, "reg", &reg, sizeof(reg)); 1868 prom_getprop(node, "reg", &reg, sizeof(reg));
1869 cpu_no = be32_to_cpu(reg);
1818 1870
1819 prom_debug("cpu hw idx = %lu\n", reg); 1871 prom_debug("cpu hw idx = %lu\n", cpu_no);
1820 1872
1821 /* Init the acknowledge var which will be reset by 1873 /* Init the acknowledge var which will be reset by
1822 * the secondary cpu when it awakens from its OF 1874 * the secondary cpu when it awakens from its OF
@@ -1824,24 +1876,24 @@ static void __init prom_hold_cpus(void)
1824 */ 1876 */
1825 *acknowledge = (unsigned long)-1; 1877 *acknowledge = (unsigned long)-1;
1826 1878
1827 if (reg != prom.cpu) { 1879 if (cpu_no != prom.cpu) {
1828 /* Primary Thread of non-boot cpu or any thread */ 1880 /* Primary Thread of non-boot cpu or any thread */
1829 prom_printf("starting cpu hw idx %lu... ", reg); 1881 prom_printf("starting cpu hw idx %lu... ", cpu_no);
1830 call_prom("start-cpu", 3, 0, node, 1882 call_prom("start-cpu", 3, 0, node,
1831 secondary_hold, reg); 1883 secondary_hold, cpu_no);
1832 1884
1833 for (i = 0; (i < 100000000) && 1885 for (i = 0; (i < 100000000) &&
1834 (*acknowledge == ((unsigned long)-1)); i++ ) 1886 (*acknowledge == ((unsigned long)-1)); i++ )
1835 mb(); 1887 mb();
1836 1888
1837 if (*acknowledge == reg) 1889 if (*acknowledge == cpu_no)
1838 prom_printf("done\n"); 1890 prom_printf("done\n");
1839 else 1891 else
1840 prom_printf("failed: %x\n", *acknowledge); 1892 prom_printf("failed: %x\n", *acknowledge);
1841 } 1893 }
1842#ifdef CONFIG_SMP 1894#ifdef CONFIG_SMP
1843 else 1895 else
1844 prom_printf("boot cpu hw idx %lu\n", reg); 1896 prom_printf("boot cpu hw idx %lu\n", cpu_no);
1845#endif /* CONFIG_SMP */ 1897#endif /* CONFIG_SMP */
1846 } 1898 }
1847 1899
@@ -1895,6 +1947,7 @@ static void __init prom_find_mmu(void)
1895 prom.memory = call_prom("open", 1, 1, ADDR("/memory")); 1947 prom.memory = call_prom("open", 1, 1, ADDR("/memory"));
1896 prom_getprop(prom.chosen, "mmu", &prom.mmumap, 1948 prom_getprop(prom.chosen, "mmu", &prom.mmumap,
1897 sizeof(prom.mmumap)); 1949 sizeof(prom.mmumap));
1950 prom.mmumap = be32_to_cpu(prom.mmumap);
1898 if (!IHANDLE_VALID(prom.memory) || !IHANDLE_VALID(prom.mmumap)) 1951 if (!IHANDLE_VALID(prom.memory) || !IHANDLE_VALID(prom.mmumap))
1899 of_workarounds &= ~OF_WA_CLAIM; /* hmmm */ 1952 of_workarounds &= ~OF_WA_CLAIM; /* hmmm */
1900} 1953}
@@ -1906,17 +1959,19 @@ static void __init prom_init_stdout(void)
1906{ 1959{
1907 char *path = of_stdout_device; 1960 char *path = of_stdout_device;
1908 char type[16]; 1961 char type[16];
1909 u32 val; 1962 phandle stdout_node;
1963 __be32 val;
1910 1964
1911 if (prom_getprop(prom.chosen, "stdout", &val, sizeof(val)) <= 0) 1965 if (prom_getprop(prom.chosen, "stdout", &val, sizeof(val)) <= 0)
1912 prom_panic("cannot find stdout"); 1966 prom_panic("cannot find stdout");
1913 1967
1914 prom.stdout = val; 1968 prom.stdout = be32_to_cpu(val);
1915 1969
1916 /* Get the full OF pathname of the stdout device */ 1970 /* Get the full OF pathname of the stdout device */
1917 memset(path, 0, 256); 1971 memset(path, 0, 256);
1918 call_prom("instance-to-path", 3, 1, prom.stdout, path, 255); 1972 call_prom("instance-to-path", 3, 1, prom.stdout, path, 255);
1919 val = call_prom("instance-to-package", 1, 1, prom.stdout); 1973 stdout_node = call_prom("instance-to-package", 1, 1, prom.stdout);
1974 val = cpu_to_be32(stdout_node);
1920 prom_setprop(prom.chosen, "/chosen", "linux,stdout-package", 1975 prom_setprop(prom.chosen, "/chosen", "linux,stdout-package",
1921 &val, sizeof(val)); 1976 &val, sizeof(val));
1922 prom_printf("OF stdout device is: %s\n", of_stdout_device); 1977 prom_printf("OF stdout device is: %s\n", of_stdout_device);
@@ -1925,9 +1980,9 @@ static void __init prom_init_stdout(void)
1925 1980
1926 /* If it's a display, note it */ 1981 /* If it's a display, note it */
1927 memset(type, 0, sizeof(type)); 1982 memset(type, 0, sizeof(type));
1928 prom_getprop(val, "device_type", type, sizeof(type)); 1983 prom_getprop(stdout_node, "device_type", type, sizeof(type));
1929 if (strcmp(type, "display") == 0) 1984 if (strcmp(type, "display") == 0)
1930 prom_setprop(val, path, "linux,boot-display", NULL, 0); 1985 prom_setprop(stdout_node, path, "linux,boot-display", NULL, 0);
1931} 1986}
1932 1987
1933static int __init prom_find_machine_type(void) 1988static int __init prom_find_machine_type(void)
@@ -2082,6 +2137,22 @@ static void __init prom_check_displays(void)
2082 clut[2]) != 0) 2137 clut[2]) != 0)
2083 break; 2138 break;
2084#endif /* CONFIG_LOGO_LINUX_CLUT224 */ 2139#endif /* CONFIG_LOGO_LINUX_CLUT224 */
2140
2141#ifdef CONFIG_PPC_EARLY_DEBUG_BOOTX
2142 if (prom_getprop(node, "linux,boot-display", NULL, 0) !=
2143 PROM_ERROR) {
2144 u32 width, height, pitch, addr;
2145
2146 prom_printf("Setting btext !\n");
2147 prom_getprop(node, "width", &width, 4);
2148 prom_getprop(node, "height", &height, 4);
2149 prom_getprop(node, "linebytes", &pitch, 4);
2150 prom_getprop(node, "address", &addr, 4);
2151 prom_printf("W=%d H=%d LB=%d addr=0x%x\n",
2152 width, height, pitch, addr);
2153 btext_setup_display(width, height, 8, pitch, addr);
2154 }
2155#endif /* CONFIG_PPC_EARLY_DEBUG_BOOTX */
2085 } 2156 }
2086} 2157}
2087 2158
@@ -2117,8 +2188,10 @@ static void __init *make_room(unsigned long *mem_start, unsigned long *mem_end,
2117 return ret; 2188 return ret;
2118} 2189}
2119 2190
2120#define dt_push_token(token, mem_start, mem_end) \ 2191#define dt_push_token(token, mem_start, mem_end) do { \
2121 do { *((u32 *)make_room(mem_start, mem_end, 4, 4)) = token; } while(0) 2192 void *room = make_room(mem_start, mem_end, 4, 4); \
2193 *(__be32 *)room = cpu_to_be32(token); \
2194 } while(0)
2122 2195
2123static unsigned long __init dt_find_string(char *str) 2196static unsigned long __init dt_find_string(char *str)
2124{ 2197{
@@ -2291,7 +2364,7 @@ static void __init scan_dt_build_struct(phandle node, unsigned long *mem_start,
2291 dt_push_token(4, mem_start, mem_end); 2364 dt_push_token(4, mem_start, mem_end);
2292 dt_push_token(soff, mem_start, mem_end); 2365 dt_push_token(soff, mem_start, mem_end);
2293 valp = make_room(mem_start, mem_end, 4, 4); 2366 valp = make_room(mem_start, mem_end, 4, 4);
2294 *(u32 *)valp = node; 2367 *(__be32 *)valp = cpu_to_be32(node);
2295 } 2368 }
2296 } 2369 }
2297 2370
@@ -2364,16 +2437,16 @@ static void __init flatten_device_tree(void)
2364 dt_struct_end = PAGE_ALIGN(mem_start); 2437 dt_struct_end = PAGE_ALIGN(mem_start);
2365 2438
2366 /* Finish header */ 2439 /* Finish header */
2367 hdr->boot_cpuid_phys = prom.cpu; 2440 hdr->boot_cpuid_phys = cpu_to_be32(prom.cpu);
2368 hdr->magic = OF_DT_HEADER; 2441 hdr->magic = cpu_to_be32(OF_DT_HEADER);
2369 hdr->totalsize = dt_struct_end - dt_header_start; 2442 hdr->totalsize = cpu_to_be32(dt_struct_end - dt_header_start);
2370 hdr->off_dt_struct = dt_struct_start - dt_header_start; 2443 hdr->off_dt_struct = cpu_to_be32(dt_struct_start - dt_header_start);
2371 hdr->off_dt_strings = dt_string_start - dt_header_start; 2444 hdr->off_dt_strings = cpu_to_be32(dt_string_start - dt_header_start);
2372 hdr->dt_strings_size = dt_string_end - dt_string_start; 2445 hdr->dt_strings_size = cpu_to_be32(dt_string_end - dt_string_start);
2373 hdr->off_mem_rsvmap = ((unsigned long)rsvmap) - dt_header_start; 2446 hdr->off_mem_rsvmap = cpu_to_be32(((unsigned long)rsvmap) - dt_header_start);
2374 hdr->version = OF_DT_VERSION; 2447 hdr->version = cpu_to_be32(OF_DT_VERSION);
2375 /* Version 16 is not backward compatible */ 2448 /* Version 16 is not backward compatible */
2376 hdr->last_comp_version = 0x10; 2449 hdr->last_comp_version = cpu_to_be32(0x10);
2377 2450
2378 /* Copy the reserve map in */ 2451 /* Copy the reserve map in */
2379 memcpy(rsvmap, mem_reserve_map, sizeof(mem_reserve_map)); 2452 memcpy(rsvmap, mem_reserve_map, sizeof(mem_reserve_map));
@@ -2384,8 +2457,8 @@ static void __init flatten_device_tree(void)
2384 prom_printf("reserved memory map:\n"); 2457 prom_printf("reserved memory map:\n");
2385 for (i = 0; i < mem_reserve_cnt; i++) 2458 for (i = 0; i < mem_reserve_cnt; i++)
2386 prom_printf(" %x - %x\n", 2459 prom_printf(" %x - %x\n",
2387 mem_reserve_map[i].base, 2460 be64_to_cpu(mem_reserve_map[i].base),
2388 mem_reserve_map[i].size); 2461 be64_to_cpu(mem_reserve_map[i].size));
2389 } 2462 }
2390#endif 2463#endif
2391 /* Bump mem_reserve_cnt to cause further reservations to fail 2464 /* Bump mem_reserve_cnt to cause further reservations to fail
@@ -2397,7 +2470,6 @@ static void __init flatten_device_tree(void)
2397 dt_string_start, dt_string_end); 2470 dt_string_start, dt_string_end);
2398 prom_printf("Device tree struct 0x%x -> 0x%x\n", 2471 prom_printf("Device tree struct 0x%x -> 0x%x\n",
2399 dt_struct_start, dt_struct_end); 2472 dt_struct_start, dt_struct_end);
2400
2401} 2473}
2402 2474
2403#ifdef CONFIG_PPC_MAPLE 2475#ifdef CONFIG_PPC_MAPLE
@@ -2730,18 +2802,19 @@ static void __init fixup_device_tree(void)
2730 2802
2731static void __init prom_find_boot_cpu(void) 2803static void __init prom_find_boot_cpu(void)
2732{ 2804{
2733 u32 getprop_rval; 2805 __be32 rval;
2734 ihandle prom_cpu; 2806 ihandle prom_cpu;
2735 phandle cpu_pkg; 2807 phandle cpu_pkg;
2736 2808
2737 prom.cpu = 0; 2809 rval = 0;
2738 if (prom_getprop(prom.chosen, "cpu", &prom_cpu, sizeof(prom_cpu)) <= 0) 2810 if (prom_getprop(prom.chosen, "cpu", &rval, sizeof(rval)) <= 0)
2739 return; 2811 return;
2812 prom_cpu = be32_to_cpu(rval);
2740 2813
2741 cpu_pkg = call_prom("instance-to-package", 1, 1, prom_cpu); 2814 cpu_pkg = call_prom("instance-to-package", 1, 1, prom_cpu);
2742 2815
2743 prom_getprop(cpu_pkg, "reg", &getprop_rval, sizeof(getprop_rval)); 2816 prom_getprop(cpu_pkg, "reg", &rval, sizeof(rval));
2744 prom.cpu = getprop_rval; 2817 prom.cpu = be32_to_cpu(rval);
2745 2818
2746 prom_debug("Booting CPU hw index = %lu\n", prom.cpu); 2819 prom_debug("Booting CPU hw index = %lu\n", prom.cpu);
2747} 2820}
@@ -2750,15 +2823,15 @@ static void __init prom_check_initrd(unsigned long r3, unsigned long r4)
2750{ 2823{
2751#ifdef CONFIG_BLK_DEV_INITRD 2824#ifdef CONFIG_BLK_DEV_INITRD
2752 if (r3 && r4 && r4 != 0xdeadbeef) { 2825 if (r3 && r4 && r4 != 0xdeadbeef) {
2753 unsigned long val; 2826 __be64 val;
2754 2827
2755 prom_initrd_start = is_kernel_addr(r3) ? __pa(r3) : r3; 2828 prom_initrd_start = is_kernel_addr(r3) ? __pa(r3) : r3;
2756 prom_initrd_end = prom_initrd_start + r4; 2829 prom_initrd_end = prom_initrd_start + r4;
2757 2830
2758 val = prom_initrd_start; 2831 val = cpu_to_be64(prom_initrd_start);
2759 prom_setprop(prom.chosen, "/chosen", "linux,initrd-start", 2832 prom_setprop(prom.chosen, "/chosen", "linux,initrd-start",
2760 &val, sizeof(val)); 2833 &val, sizeof(val));
2761 val = prom_initrd_end; 2834 val = cpu_to_be64(prom_initrd_end);
2762 prom_setprop(prom.chosen, "/chosen", "linux,initrd-end", 2835 prom_setprop(prom.chosen, "/chosen", "linux,initrd-end",
2763 &val, sizeof(val)); 2836 &val, sizeof(val));
2764 2837
@@ -2915,7 +2988,7 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
2915 */ 2988 */
2916 prom_check_displays(); 2989 prom_check_displays();
2917 2990
2918#ifdef CONFIG_PPC64 2991#if defined(CONFIG_PPC64) && defined(__BIG_ENDIAN__)
2919 /* 2992 /*
2920 * Initialize IOMMU (TCE tables) on pSeries. Do that before anything else 2993 * Initialize IOMMU (TCE tables) on pSeries. Do that before anything else
2921 * that uses the allocator, we need to make sure we get the top of memory 2994 * that uses the allocator, we need to make sure we get the top of memory
@@ -2934,6 +3007,7 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
2934 prom_instantiate_rtas(); 3007 prom_instantiate_rtas();
2935 3008
2936#ifdef CONFIG_PPC_POWERNV 3009#ifdef CONFIG_PPC_POWERNV
3010#ifdef __BIG_ENDIAN__
2937 /* Detect HAL and try instanciating it & doing takeover */ 3011 /* Detect HAL and try instanciating it & doing takeover */
2938 if (of_platform == PLATFORM_PSERIES_LPAR) { 3012 if (of_platform == PLATFORM_PSERIES_LPAR) {
2939 prom_query_opal(); 3013 prom_query_opal();
@@ -2941,9 +3015,11 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
2941 prom_opal_hold_cpus(); 3015 prom_opal_hold_cpus();
2942 prom_opal_takeover(); 3016 prom_opal_takeover();
2943 } 3017 }
2944 } else if (of_platform == PLATFORM_OPAL) 3018 } else
3019#endif /* __BIG_ENDIAN__ */
3020 if (of_platform == PLATFORM_OPAL)
2945 prom_instantiate_opal(); 3021 prom_instantiate_opal();
2946#endif 3022#endif /* CONFIG_PPC_POWERNV */
2947 3023
2948#ifdef CONFIG_PPC64 3024#ifdef CONFIG_PPC64
2949 /* instantiate sml */ 3025 /* instantiate sml */
@@ -2954,6 +3030,8 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
2954 * On non-powermacs, put all CPUs in spin-loops. 3030 * On non-powermacs, put all CPUs in spin-loops.
2955 * 3031 *
2956 * PowerMacs use a different mechanism to spin CPUs 3032 * PowerMacs use a different mechanism to spin CPUs
3033 *
3034 * (This must be done after instanciating RTAS)
2957 */ 3035 */
2958 if (of_platform != PLATFORM_POWERMAC && 3036 if (of_platform != PLATFORM_POWERMAC &&
2959 of_platform != PLATFORM_OPAL) 3037 of_platform != PLATFORM_OPAL)
@@ -2962,10 +3040,11 @@ unsigned long __init prom_init(unsigned long r3, unsigned long r4,
2962 /* 3040 /*
2963 * Fill in some infos for use by the kernel later on 3041 * Fill in some infos for use by the kernel later on
2964 */ 3042 */
2965 if (prom_memory_limit) 3043 if (prom_memory_limit) {
3044 __be64 val = cpu_to_be64(prom_memory_limit);
2966 prom_setprop(prom.chosen, "/chosen", "linux,memory-limit", 3045 prom_setprop(prom.chosen, "/chosen", "linux,memory-limit",
2967 &prom_memory_limit, 3046 &val, sizeof(val));
2968 sizeof(prom_memory_limit)); 3047 }
2969#ifdef CONFIG_PPC64 3048#ifdef CONFIG_PPC64
2970 if (prom_iommu_off) 3049 if (prom_iommu_off)
2971 prom_setprop(prom.chosen, "/chosen", "linux,iommu-off", 3050 prom_setprop(prom.chosen, "/chosen", "linux,iommu-off",
diff --git a/arch/powerpc/kernel/prom_init_check.sh b/arch/powerpc/kernel/prom_init_check.sh
index 3765da6be4f2..b0c263da219a 100644
--- a/arch/powerpc/kernel/prom_init_check.sh
+++ b/arch/powerpc/kernel/prom_init_check.sh
@@ -22,7 +22,8 @@ __secondary_hold_acknowledge __secondary_hold_spinloop __start
22strcmp strcpy strlcpy strlen strncmp strstr logo_linux_clut224 22strcmp strcpy strlcpy strlen strncmp strstr logo_linux_clut224
23reloc_got2 kernstart_addr memstart_addr linux_banner _stext 23reloc_got2 kernstart_addr memstart_addr linux_banner _stext
24opal_query_takeover opal_do_takeover opal_enter_rtas opal_secondary_entry 24opal_query_takeover opal_do_takeover opal_enter_rtas opal_secondary_entry
25boot_command_line __prom_init_toc_start __prom_init_toc_end" 25boot_command_line __prom_init_toc_start __prom_init_toc_end
26btext_setup_display"
26 27
27NM="$1" 28NM="$1"
28OBJ="$2" 29OBJ="$2"
diff --git a/arch/powerpc/kernel/prom_parse.c b/arch/powerpc/kernel/prom_parse.c
index 4e1331b8eb33..6295e646f78c 100644
--- a/arch/powerpc/kernel/prom_parse.c
+++ b/arch/powerpc/kernel/prom_parse.c
@@ -7,28 +7,27 @@
7#include <linux/of_address.h> 7#include <linux/of_address.h>
8#include <asm/prom.h> 8#include <asm/prom.h>
9 9
10void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop, 10void of_parse_dma_window(struct device_node *dn, const __be32 *dma_window,
11 unsigned long *busno, unsigned long *phys, unsigned long *size) 11 unsigned long *busno, unsigned long *phys,
12 unsigned long *size)
12{ 13{
13 const u32 *dma_window;
14 u32 cells; 14 u32 cells;
15 const unsigned char *prop; 15 const __be32 *prop;
16
17 dma_window = dma_window_prop;
18 16
19 /* busno is always one cell */ 17 /* busno is always one cell */
20 *busno = *(dma_window++); 18 *busno = of_read_number(dma_window, 1);
19 dma_window++;
21 20
22 prop = of_get_property(dn, "ibm,#dma-address-cells", NULL); 21 prop = of_get_property(dn, "ibm,#dma-address-cells", NULL);
23 if (!prop) 22 if (!prop)
24 prop = of_get_property(dn, "#address-cells", NULL); 23 prop = of_get_property(dn, "#address-cells", NULL);
25 24
26 cells = prop ? *(u32 *)prop : of_n_addr_cells(dn); 25 cells = prop ? of_read_number(prop, 1) : of_n_addr_cells(dn);
27 *phys = of_read_number(dma_window, cells); 26 *phys = of_read_number(dma_window, cells);
28 27
29 dma_window += cells; 28 dma_window += cells;
30 29
31 prop = of_get_property(dn, "ibm,#dma-size-cells", NULL); 30 prop = of_get_property(dn, "ibm,#dma-size-cells", NULL);
32 cells = prop ? *(u32 *)prop : of_n_size_cells(dn); 31 cells = prop ? of_read_number(prop, 1) : of_n_size_cells(dn);
33 *size = of_read_number(dma_window, cells); 32 *size = of_read_number(dma_window, cells);
34} 33}
diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c
index 80b5ef403f68..4cf674d7d5ae 100644
--- a/arch/powerpc/kernel/rtas.c
+++ b/arch/powerpc/kernel/rtas.c
@@ -91,7 +91,7 @@ static void unlock_rtas(unsigned long flags)
91 * are designed only for very early low-level debugging, which 91 * are designed only for very early low-level debugging, which
92 * is why the token is hard-coded to 10. 92 * is why the token is hard-coded to 10.
93 */ 93 */
94static void call_rtas_display_status(char c) 94static void call_rtas_display_status(unsigned char c)
95{ 95{
96 struct rtas_args *args = &rtas.args; 96 struct rtas_args *args = &rtas.args;
97 unsigned long s; 97 unsigned long s;
@@ -100,11 +100,11 @@ static void call_rtas_display_status(char c)
100 return; 100 return;
101 s = lock_rtas(); 101 s = lock_rtas();
102 102
103 args->token = 10; 103 args->token = cpu_to_be32(10);
104 args->nargs = 1; 104 args->nargs = cpu_to_be32(1);
105 args->nret = 1; 105 args->nret = cpu_to_be32(1);
106 args->rets = (rtas_arg_t *)&(args->args[1]); 106 args->rets = &(args->args[1]);
107 args->args[0] = (unsigned char)c; 107 args->args[0] = cpu_to_be32(c);
108 108
109 enter_rtas(__pa(args)); 109 enter_rtas(__pa(args));
110 110
@@ -204,7 +204,7 @@ void rtas_progress(char *s, unsigned short hex)
204{ 204{
205 struct device_node *root; 205 struct device_node *root;
206 int width; 206 int width;
207 const int *p; 207 const __be32 *p;
208 char *os; 208 char *os;
209 static int display_character, set_indicator; 209 static int display_character, set_indicator;
210 static int display_width, display_lines, form_feed; 210 static int display_width, display_lines, form_feed;
@@ -221,13 +221,13 @@ void rtas_progress(char *s, unsigned short hex)
221 if ((root = of_find_node_by_path("/rtas"))) { 221 if ((root = of_find_node_by_path("/rtas"))) {
222 if ((p = of_get_property(root, 222 if ((p = of_get_property(root,
223 "ibm,display-line-length", NULL))) 223 "ibm,display-line-length", NULL)))
224 display_width = *p; 224 display_width = be32_to_cpu(*p);
225 if ((p = of_get_property(root, 225 if ((p = of_get_property(root,
226 "ibm,form-feed", NULL))) 226 "ibm,form-feed", NULL)))
227 form_feed = *p; 227 form_feed = be32_to_cpu(*p);
228 if ((p = of_get_property(root, 228 if ((p = of_get_property(root,
229 "ibm,display-number-of-lines", NULL))) 229 "ibm,display-number-of-lines", NULL)))
230 display_lines = *p; 230 display_lines = be32_to_cpu(*p);
231 row_width = of_get_property(root, 231 row_width = of_get_property(root,
232 "ibm,display-truncation-length", NULL); 232 "ibm,display-truncation-length", NULL);
233 of_node_put(root); 233 of_node_put(root);
@@ -322,11 +322,11 @@ EXPORT_SYMBOL(rtas_progress); /* needed by rtas_flash module */
322 322
323int rtas_token(const char *service) 323int rtas_token(const char *service)
324{ 324{
325 const int *tokp; 325 const __be32 *tokp;
326 if (rtas.dev == NULL) 326 if (rtas.dev == NULL)
327 return RTAS_UNKNOWN_SERVICE; 327 return RTAS_UNKNOWN_SERVICE;
328 tokp = of_get_property(rtas.dev, service, NULL); 328 tokp = of_get_property(rtas.dev, service, NULL);
329 return tokp ? *tokp : RTAS_UNKNOWN_SERVICE; 329 return tokp ? be32_to_cpu(*tokp) : RTAS_UNKNOWN_SERVICE;
330} 330}
331EXPORT_SYMBOL(rtas_token); 331EXPORT_SYMBOL(rtas_token);
332 332
@@ -380,11 +380,11 @@ static char *__fetch_rtas_last_error(char *altbuf)
380 380
381 bufsz = rtas_get_error_log_max(); 381 bufsz = rtas_get_error_log_max();
382 382
383 err_args.token = rtas_last_error_token; 383 err_args.token = cpu_to_be32(rtas_last_error_token);
384 err_args.nargs = 2; 384 err_args.nargs = cpu_to_be32(2);
385 err_args.nret = 1; 385 err_args.nret = cpu_to_be32(1);
386 err_args.args[0] = (rtas_arg_t)__pa(rtas_err_buf); 386 err_args.args[0] = cpu_to_be32(__pa(rtas_err_buf));
387 err_args.args[1] = bufsz; 387 err_args.args[1] = cpu_to_be32(bufsz);
388 err_args.args[2] = 0; 388 err_args.args[2] = 0;
389 389
390 save_args = rtas.args; 390 save_args = rtas.args;
@@ -433,13 +433,13 @@ int rtas_call(int token, int nargs, int nret, int *outputs, ...)
433 s = lock_rtas(); 433 s = lock_rtas();
434 rtas_args = &rtas.args; 434 rtas_args = &rtas.args;
435 435
436 rtas_args->token = token; 436 rtas_args->token = cpu_to_be32(token);
437 rtas_args->nargs = nargs; 437 rtas_args->nargs = cpu_to_be32(nargs);
438 rtas_args->nret = nret; 438 rtas_args->nret = cpu_to_be32(nret);
439 rtas_args->rets = (rtas_arg_t *)&(rtas_args->args[nargs]); 439 rtas_args->rets = &(rtas_args->args[nargs]);
440 va_start(list, outputs); 440 va_start(list, outputs);
441 for (i = 0; i < nargs; ++i) 441 for (i = 0; i < nargs; ++i)
442 rtas_args->args[i] = va_arg(list, rtas_arg_t); 442 rtas_args->args[i] = cpu_to_be32(va_arg(list, __u32));
443 va_end(list); 443 va_end(list);
444 444
445 for (i = 0; i < nret; ++i) 445 for (i = 0; i < nret; ++i)
@@ -449,13 +449,13 @@ int rtas_call(int token, int nargs, int nret, int *outputs, ...)
449 449
450 /* A -1 return code indicates that the last command couldn't 450 /* A -1 return code indicates that the last command couldn't
451 be completed due to a hardware error. */ 451 be completed due to a hardware error. */
452 if (rtas_args->rets[0] == -1) 452 if (be32_to_cpu(rtas_args->rets[0]) == -1)
453 buff_copy = __fetch_rtas_last_error(NULL); 453 buff_copy = __fetch_rtas_last_error(NULL);
454 454
455 if (nret > 1 && outputs != NULL) 455 if (nret > 1 && outputs != NULL)
456 for (i = 0; i < nret-1; ++i) 456 for (i = 0; i < nret-1; ++i)
457 outputs[i] = rtas_args->rets[i+1]; 457 outputs[i] = be32_to_cpu(rtas_args->rets[i+1]);
458 ret = (nret > 0)? rtas_args->rets[0]: 0; 458 ret = (nret > 0)? be32_to_cpu(rtas_args->rets[0]): 0;
459 459
460 unlock_rtas(s); 460 unlock_rtas(s);
461 461
@@ -588,8 +588,8 @@ bool rtas_indicator_present(int token, int *maxindex)
588{ 588{
589 int proplen, count, i; 589 int proplen, count, i;
590 const struct indicator_elem { 590 const struct indicator_elem {
591 u32 token; 591 __be32 token;
592 u32 maxindex; 592 __be32 maxindex;
593 } *indicators; 593 } *indicators;
594 594
595 indicators = of_get_property(rtas.dev, "rtas-indicators", &proplen); 595 indicators = of_get_property(rtas.dev, "rtas-indicators", &proplen);
@@ -599,10 +599,10 @@ bool rtas_indicator_present(int token, int *maxindex)
599 count = proplen / sizeof(struct indicator_elem); 599 count = proplen / sizeof(struct indicator_elem);
600 600
601 for (i = 0; i < count; i++) { 601 for (i = 0; i < count; i++) {
602 if (indicators[i].token != token) 602 if (__be32_to_cpu(indicators[i].token) != token)
603 continue; 603 continue;
604 if (maxindex) 604 if (maxindex)
605 *maxindex = indicators[i].maxindex; 605 *maxindex = __be32_to_cpu(indicators[i].maxindex);
606 return true; 606 return true;
607 } 607 }
608 608
@@ -1097,19 +1097,19 @@ void __init rtas_initialize(void)
1097 */ 1097 */
1098 rtas.dev = of_find_node_by_name(NULL, "rtas"); 1098 rtas.dev = of_find_node_by_name(NULL, "rtas");
1099 if (rtas.dev) { 1099 if (rtas.dev) {
1100 const u32 *basep, *entryp, *sizep; 1100 const __be32 *basep, *entryp, *sizep;
1101 1101
1102 basep = of_get_property(rtas.dev, "linux,rtas-base", NULL); 1102 basep = of_get_property(rtas.dev, "linux,rtas-base", NULL);
1103 sizep = of_get_property(rtas.dev, "rtas-size", NULL); 1103 sizep = of_get_property(rtas.dev, "rtas-size", NULL);
1104 if (basep != NULL && sizep != NULL) { 1104 if (basep != NULL && sizep != NULL) {
1105 rtas.base = *basep; 1105 rtas.base = __be32_to_cpu(*basep);
1106 rtas.size = *sizep; 1106 rtas.size = __be32_to_cpu(*sizep);
1107 entryp = of_get_property(rtas.dev, 1107 entryp = of_get_property(rtas.dev,
1108 "linux,rtas-entry", NULL); 1108 "linux,rtas-entry", NULL);
1109 if (entryp == NULL) /* Ugh */ 1109 if (entryp == NULL) /* Ugh */
1110 rtas.entry = rtas.base; 1110 rtas.entry = rtas.base;
1111 else 1111 else
1112 rtas.entry = *entryp; 1112 rtas.entry = __be32_to_cpu(*entryp);
1113 } else 1113 } else
1114 rtas.dev = NULL; 1114 rtas.dev = NULL;
1115 } 1115 }
diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c
index 63d051f5b7a5..3d261c071fc8 100644
--- a/arch/powerpc/kernel/setup-common.c
+++ b/arch/powerpc/kernel/setup-common.c
@@ -436,7 +436,8 @@ void __init smp_setup_cpu_maps(void)
436 DBG("smp_setup_cpu_maps()\n"); 436 DBG("smp_setup_cpu_maps()\n");
437 437
438 while ((dn = of_find_node_by_type(dn, "cpu")) && cpu < nr_cpu_ids) { 438 while ((dn = of_find_node_by_type(dn, "cpu")) && cpu < nr_cpu_ids) {
439 const int *intserv; 439 const __be32 *intserv;
440 __be32 cpu_be;
440 int j, len; 441 int j, len;
441 442
442 DBG(" * %s...\n", dn->full_name); 443 DBG(" * %s...\n", dn->full_name);
@@ -450,15 +451,17 @@ void __init smp_setup_cpu_maps(void)
450 } else { 451 } else {
451 DBG(" no ibm,ppc-interrupt-server#s -> 1 thread\n"); 452 DBG(" no ibm,ppc-interrupt-server#s -> 1 thread\n");
452 intserv = of_get_property(dn, "reg", NULL); 453 intserv = of_get_property(dn, "reg", NULL);
453 if (!intserv) 454 if (!intserv) {
454 intserv = &cpu; /* assume logical == phys */ 455 cpu_be = cpu_to_be32(cpu);
456 intserv = &cpu_be; /* assume logical == phys */
457 }
455 } 458 }
456 459
457 for (j = 0; j < nthreads && cpu < nr_cpu_ids; j++) { 460 for (j = 0; j < nthreads && cpu < nr_cpu_ids; j++) {
458 DBG(" thread %d -> cpu %d (hard id %d)\n", 461 DBG(" thread %d -> cpu %d (hard id %d)\n",
459 j, cpu, intserv[j]); 462 j, cpu, be32_to_cpu(intserv[j]));
460 set_cpu_present(cpu, true); 463 set_cpu_present(cpu, true);
461 set_hard_smp_processor_id(cpu, intserv[j]); 464 set_hard_smp_processor_id(cpu, be32_to_cpu(intserv[j]));
462 set_cpu_possible(cpu, true); 465 set_cpu_possible(cpu, true);
463 cpu++; 466 cpu++;
464 } 467 }
diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c
index a8f54ecb091f..a4bbcae72578 100644
--- a/arch/powerpc/kernel/setup_32.c
+++ b/arch/powerpc/kernel/setup_32.c
@@ -38,6 +38,7 @@
38#include <asm/serial.h> 38#include <asm/serial.h>
39#include <asm/udbg.h> 39#include <asm/udbg.h>
40#include <asm/mmu_context.h> 40#include <asm/mmu_context.h>
41#include <asm/epapr_hcalls.h>
41 42
42#include "setup.h" 43#include "setup.h"
43 44
@@ -128,6 +129,8 @@ notrace void __init machine_init(u64 dt_ptr)
128 /* Do some early initialization based on the flat device tree */ 129 /* Do some early initialization based on the flat device tree */
129 early_init_devtree(__va(dt_ptr)); 130 early_init_devtree(__va(dt_ptr));
130 131
132 epapr_paravirt_early_init();
133
131 early_init_mmu(); 134 early_init_mmu();
132 135
133 probe_machine(); 136 probe_machine();
@@ -326,5 +329,4 @@ void __init setup_arch(char **cmdline_p)
326 329
327 /* Initialize the MMU context management stuff */ 330 /* Initialize the MMU context management stuff */
328 mmu_context_init(); 331 mmu_context_init();
329
330} 332}
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
index 389fb8077cc9..278ca93e1f28 100644
--- a/arch/powerpc/kernel/setup_64.c
+++ b/arch/powerpc/kernel/setup_64.c
@@ -10,7 +10,7 @@
10 * 2 of the License, or (at your option) any later version. 10 * 2 of the License, or (at your option) any later version.
11 */ 11 */
12 12
13#undef DEBUG 13#define DEBUG
14 14
15#include <linux/export.h> 15#include <linux/export.h>
16#include <linux/string.h> 16#include <linux/string.h>
@@ -66,6 +66,7 @@
66#include <asm/code-patching.h> 66#include <asm/code-patching.h>
67#include <asm/kvm_ppc.h> 67#include <asm/kvm_ppc.h>
68#include <asm/hugetlb.h> 68#include <asm/hugetlb.h>
69#include <asm/epapr_hcalls.h>
69 70
70#include "setup.h" 71#include "setup.h"
71 72
@@ -215,6 +216,8 @@ void __init early_setup(unsigned long dt_ptr)
215 */ 216 */
216 early_init_devtree(__va(dt_ptr)); 217 early_init_devtree(__va(dt_ptr));
217 218
219 epapr_paravirt_early_init();
220
218 /* Now we know the logical id of our boot cpu, setup the paca. */ 221 /* Now we know the logical id of our boot cpu, setup the paca. */
219 setup_paca(&paca[boot_cpuid]); 222 setup_paca(&paca[boot_cpuid]);
220 fixup_boot_paca(); 223 fixup_boot_paca();
@@ -229,6 +232,8 @@ void __init early_setup(unsigned long dt_ptr)
229 /* Initialize the hash table or TLB handling */ 232 /* Initialize the hash table or TLB handling */
230 early_init_mmu(); 233 early_init_mmu();
231 234
235 kvm_cma_reserve();
236
232 /* 237 /*
233 * Reserve any gigantic pages requested on the command line. 238 * Reserve any gigantic pages requested on the command line.
234 * memblock needs to have been initialized by the time this is 239 * memblock needs to have been initialized by the time this is
@@ -237,6 +242,18 @@ void __init early_setup(unsigned long dt_ptr)
237 reserve_hugetlb_gpages(); 242 reserve_hugetlb_gpages();
238 243
239 DBG(" <- early_setup()\n"); 244 DBG(" <- early_setup()\n");
245
246#ifdef CONFIG_PPC_EARLY_DEBUG_BOOTX
247 /*
248 * This needs to be done *last* (after the above DBG() even)
249 *
250 * Right after we return from this function, we turn on the MMU
251 * which means the real-mode access trick that btext does will
252 * no longer work, it needs to switch to using a real MMU
253 * mapping. This call will ensure that it does
254 */
255 btext_map();
256#endif /* CONFIG_PPC_EARLY_DEBUG_BOOTX */
240} 257}
241 258
242#ifdef CONFIG_SMP 259#ifdef CONFIG_SMP
@@ -305,14 +322,14 @@ static void __init initialize_cache_info(void)
305 * d-cache and i-cache sizes... -Peter 322 * d-cache and i-cache sizes... -Peter
306 */ 323 */
307 if (num_cpus == 1) { 324 if (num_cpus == 1) {
308 const u32 *sizep, *lsizep; 325 const __be32 *sizep, *lsizep;
309 u32 size, lsize; 326 u32 size, lsize;
310 327
311 size = 0; 328 size = 0;
312 lsize = cur_cpu_spec->dcache_bsize; 329 lsize = cur_cpu_spec->dcache_bsize;
313 sizep = of_get_property(np, "d-cache-size", NULL); 330 sizep = of_get_property(np, "d-cache-size", NULL);
314 if (sizep != NULL) 331 if (sizep != NULL)
315 size = *sizep; 332 size = be32_to_cpu(*sizep);
316 lsizep = of_get_property(np, "d-cache-block-size", 333 lsizep = of_get_property(np, "d-cache-block-size",
317 NULL); 334 NULL);
318 /* fallback if block size missing */ 335 /* fallback if block size missing */
@@ -321,8 +338,8 @@ static void __init initialize_cache_info(void)
321 "d-cache-line-size", 338 "d-cache-line-size",
322 NULL); 339 NULL);
323 if (lsizep != NULL) 340 if (lsizep != NULL)
324 lsize = *lsizep; 341 lsize = be32_to_cpu(*lsizep);
325 if (sizep == 0 || lsizep == 0) 342 if (sizep == NULL || lsizep == NULL)
326 DBG("Argh, can't find dcache properties ! " 343 DBG("Argh, can't find dcache properties ! "
327 "sizep: %p, lsizep: %p\n", sizep, lsizep); 344 "sizep: %p, lsizep: %p\n", sizep, lsizep);
328 345
@@ -335,7 +352,7 @@ static void __init initialize_cache_info(void)
335 lsize = cur_cpu_spec->icache_bsize; 352 lsize = cur_cpu_spec->icache_bsize;
336 sizep = of_get_property(np, "i-cache-size", NULL); 353 sizep = of_get_property(np, "i-cache-size", NULL);
337 if (sizep != NULL) 354 if (sizep != NULL)
338 size = *sizep; 355 size = be32_to_cpu(*sizep);
339 lsizep = of_get_property(np, "i-cache-block-size", 356 lsizep = of_get_property(np, "i-cache-block-size",
340 NULL); 357 NULL);
341 if (lsizep == NULL) 358 if (lsizep == NULL)
@@ -343,8 +360,8 @@ static void __init initialize_cache_info(void)
343 "i-cache-line-size", 360 "i-cache-line-size",
344 NULL); 361 NULL);
345 if (lsizep != NULL) 362 if (lsizep != NULL)
346 lsize = *lsizep; 363 lsize = be32_to_cpu(*lsizep);
347 if (sizep == 0 || lsizep == 0) 364 if (sizep == NULL || lsizep == NULL)
348 DBG("Argh, can't find icache properties ! " 365 DBG("Argh, can't find icache properties ! "
349 "sizep: %p, lsizep: %p\n", sizep, lsizep); 366 "sizep: %p, lsizep: %p\n", sizep, lsizep);
350 367
@@ -609,8 +626,6 @@ void __init setup_arch(char **cmdline_p)
609 /* Initialize the MMU context management stuff */ 626 /* Initialize the MMU context management stuff */
610 mmu_context_init(); 627 mmu_context_init();
611 628
612 kvm_linear_init();
613
614 /* Interrupt code needs to be 64K-aligned */ 629 /* Interrupt code needs to be 64K-aligned */
615 if ((unsigned long)_stext & 0xffff) 630 if ((unsigned long)_stext & 0xffff)
616 panic("Kernelbase not 64K-aligned (0x%lx)!\n", 631 panic("Kernelbase not 64K-aligned (0x%lx)!\n",
@@ -701,8 +716,7 @@ void __init setup_per_cpu_areas(void)
701#endif 716#endif
702 717
703 718
704#ifdef CONFIG_PPC_INDIRECT_IO 719#if defined(CONFIG_PPC_INDIRECT_PIO) || defined(CONFIG_PPC_INDIRECT_MMIO)
705struct ppc_pci_io ppc_pci_io; 720struct ppc_pci_io ppc_pci_io;
706EXPORT_SYMBOL(ppc_pci_io); 721EXPORT_SYMBOL(ppc_pci_io);
707#endif /* CONFIG_PPC_INDIRECT_IO */ 722#endif
708
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c
index 0f83122e6676..bebdf1a1a540 100644
--- a/arch/powerpc/kernel/signal_32.c
+++ b/arch/powerpc/kernel/signal_32.c
@@ -436,7 +436,10 @@ static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame,
436 * use altivec. Since VSCR only contains 32 bits saved in the least 436 * use altivec. Since VSCR only contains 32 bits saved in the least
437 * significant bits of a vector, we "cheat" and stuff VRSAVE in the 437 * significant bits of a vector, we "cheat" and stuff VRSAVE in the
438 * most significant bits of that same vector. --BenH 438 * most significant bits of that same vector. --BenH
439 * Note that the current VRSAVE value is in the SPR at this point.
439 */ 440 */
441 if (cpu_has_feature(CPU_FTR_ALTIVEC))
442 current->thread.vrsave = mfspr(SPRN_VRSAVE);
440 if (__put_user(current->thread.vrsave, (u32 __user *)&frame->mc_vregs[32])) 443 if (__put_user(current->thread.vrsave, (u32 __user *)&frame->mc_vregs[32]))
441 return 1; 444 return 1;
442#endif /* CONFIG_ALTIVEC */ 445#endif /* CONFIG_ALTIVEC */
@@ -557,6 +560,8 @@ static int save_tm_user_regs(struct pt_regs *regs,
557 * significant bits of a vector, we "cheat" and stuff VRSAVE in the 560 * significant bits of a vector, we "cheat" and stuff VRSAVE in the
558 * most significant bits of that same vector. --BenH 561 * most significant bits of that same vector. --BenH
559 */ 562 */
563 if (cpu_has_feature(CPU_FTR_ALTIVEC))
564 current->thread.vrsave = mfspr(SPRN_VRSAVE);
560 if (__put_user(current->thread.vrsave, 565 if (__put_user(current->thread.vrsave,
561 (u32 __user *)&frame->mc_vregs[32])) 566 (u32 __user *)&frame->mc_vregs[32]))
562 return 1; 567 return 1;
@@ -696,6 +701,8 @@ static long restore_user_regs(struct pt_regs *regs,
696 /* Always get VRSAVE back */ 701 /* Always get VRSAVE back */
697 if (__get_user(current->thread.vrsave, (u32 __user *)&sr->mc_vregs[32])) 702 if (__get_user(current->thread.vrsave, (u32 __user *)&sr->mc_vregs[32]))
698 return 1; 703 return 1;
704 if (cpu_has_feature(CPU_FTR_ALTIVEC))
705 mtspr(SPRN_VRSAVE, current->thread.vrsave);
699#endif /* CONFIG_ALTIVEC */ 706#endif /* CONFIG_ALTIVEC */
700 if (copy_fpr_from_user(current, &sr->mc_fregs)) 707 if (copy_fpr_from_user(current, &sr->mc_fregs))
701 return 1; 708 return 1;
@@ -809,6 +816,8 @@ static long restore_tm_user_regs(struct pt_regs *regs,
809 __get_user(current->thread.transact_vrsave, 816 __get_user(current->thread.transact_vrsave,
810 (u32 __user *)&tm_sr->mc_vregs[32])) 817 (u32 __user *)&tm_sr->mc_vregs[32]))
811 return 1; 818 return 1;
819 if (cpu_has_feature(CPU_FTR_ALTIVEC))
820 mtspr(SPRN_VRSAVE, current->thread.vrsave);
812#endif /* CONFIG_ALTIVEC */ 821#endif /* CONFIG_ALTIVEC */
813 822
814 regs->msr &= ~(MSR_FP | MSR_FE0 | MSR_FE1); 823 regs->msr &= ~(MSR_FP | MSR_FE0 | MSR_FE1);
diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c
index 887e99d85bc2..f93ec2835a13 100644
--- a/arch/powerpc/kernel/signal_64.c
+++ b/arch/powerpc/kernel/signal_64.c
@@ -96,8 +96,6 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
96 unsigned long msr = regs->msr; 96 unsigned long msr = regs->msr;
97 long err = 0; 97 long err = 0;
98 98
99 flush_fp_to_thread(current);
100
101#ifdef CONFIG_ALTIVEC 99#ifdef CONFIG_ALTIVEC
102 err |= __put_user(v_regs, &sc->v_regs); 100 err |= __put_user(v_regs, &sc->v_regs);
103 101
@@ -114,6 +112,8 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
114 /* We always copy to/from vrsave, it's 0 if we don't have or don't 112 /* We always copy to/from vrsave, it's 0 if we don't have or don't
115 * use altivec. 113 * use altivec.
116 */ 114 */
115 if (cpu_has_feature(CPU_FTR_ALTIVEC))
116 current->thread.vrsave = mfspr(SPRN_VRSAVE);
117 err |= __put_user(current->thread.vrsave, (u32 __user *)&v_regs[33]); 117 err |= __put_user(current->thread.vrsave, (u32 __user *)&v_regs[33]);
118#else /* CONFIG_ALTIVEC */ 118#else /* CONFIG_ALTIVEC */
119 err |= __put_user(0, &sc->v_regs); 119 err |= __put_user(0, &sc->v_regs);
@@ -217,6 +217,8 @@ static long setup_tm_sigcontexts(struct sigcontext __user *sc,
217 /* We always copy to/from vrsave, it's 0 if we don't have or don't 217 /* We always copy to/from vrsave, it's 0 if we don't have or don't
218 * use altivec. 218 * use altivec.
219 */ 219 */
220 if (cpu_has_feature(CPU_FTR_ALTIVEC))
221 current->thread.vrsave = mfspr(SPRN_VRSAVE);
220 err |= __put_user(current->thread.vrsave, (u32 __user *)&v_regs[33]); 222 err |= __put_user(current->thread.vrsave, (u32 __user *)&v_regs[33]);
221 if (msr & MSR_VEC) 223 if (msr & MSR_VEC)
222 err |= __put_user(current->thread.transact_vrsave, 224 err |= __put_user(current->thread.transact_vrsave,
@@ -346,16 +348,18 @@ static long restore_sigcontext(struct pt_regs *regs, sigset_t *set, int sig,
346 if (v_regs && !access_ok(VERIFY_READ, v_regs, 34 * sizeof(vector128))) 348 if (v_regs && !access_ok(VERIFY_READ, v_regs, 34 * sizeof(vector128)))
347 return -EFAULT; 349 return -EFAULT;
348 /* Copy 33 vec registers (vr0..31 and vscr) from the stack */ 350 /* Copy 33 vec registers (vr0..31 and vscr) from the stack */
349 if (v_regs != 0 && (msr & MSR_VEC) != 0) 351 if (v_regs != NULL && (msr & MSR_VEC) != 0)
350 err |= __copy_from_user(current->thread.vr, v_regs, 352 err |= __copy_from_user(current->thread.vr, v_regs,
351 33 * sizeof(vector128)); 353 33 * sizeof(vector128));
352 else if (current->thread.used_vr) 354 else if (current->thread.used_vr)
353 memset(current->thread.vr, 0, 33 * sizeof(vector128)); 355 memset(current->thread.vr, 0, 33 * sizeof(vector128));
354 /* Always get VRSAVE back */ 356 /* Always get VRSAVE back */
355 if (v_regs != 0) 357 if (v_regs != NULL)
356 err |= __get_user(current->thread.vrsave, (u32 __user *)&v_regs[33]); 358 err |= __get_user(current->thread.vrsave, (u32 __user *)&v_regs[33]);
357 else 359 else
358 current->thread.vrsave = 0; 360 current->thread.vrsave = 0;
361 if (cpu_has_feature(CPU_FTR_ALTIVEC))
362 mtspr(SPRN_VRSAVE, current->thread.vrsave);
359#endif /* CONFIG_ALTIVEC */ 363#endif /* CONFIG_ALTIVEC */
360 /* restore floating point */ 364 /* restore floating point */
361 err |= copy_fpr_from_user(current, &sc->fp_regs); 365 err |= copy_fpr_from_user(current, &sc->fp_regs);
@@ -463,7 +467,7 @@ static long restore_tm_sigcontexts(struct pt_regs *regs,
463 tm_v_regs, 34 * sizeof(vector128))) 467 tm_v_regs, 34 * sizeof(vector128)))
464 return -EFAULT; 468 return -EFAULT;
465 /* Copy 33 vec registers (vr0..31 and vscr) from the stack */ 469 /* Copy 33 vec registers (vr0..31 and vscr) from the stack */
466 if (v_regs != 0 && tm_v_regs != 0 && (msr & MSR_VEC) != 0) { 470 if (v_regs != NULL && tm_v_regs != NULL && (msr & MSR_VEC) != 0) {
467 err |= __copy_from_user(current->thread.vr, v_regs, 471 err |= __copy_from_user(current->thread.vr, v_regs,
468 33 * sizeof(vector128)); 472 33 * sizeof(vector128));
469 err |= __copy_from_user(current->thread.transact_vr, tm_v_regs, 473 err |= __copy_from_user(current->thread.transact_vr, tm_v_regs,
@@ -474,7 +478,7 @@ static long restore_tm_sigcontexts(struct pt_regs *regs,
474 memset(current->thread.transact_vr, 0, 33 * sizeof(vector128)); 478 memset(current->thread.transact_vr, 0, 33 * sizeof(vector128));
475 } 479 }
476 /* Always get VRSAVE back */ 480 /* Always get VRSAVE back */
477 if (v_regs != 0 && tm_v_regs != 0) { 481 if (v_regs != NULL && tm_v_regs != NULL) {
478 err |= __get_user(current->thread.vrsave, 482 err |= __get_user(current->thread.vrsave,
479 (u32 __user *)&v_regs[33]); 483 (u32 __user *)&v_regs[33]);
480 err |= __get_user(current->thread.transact_vrsave, 484 err |= __get_user(current->thread.transact_vrsave,
@@ -484,6 +488,8 @@ static long restore_tm_sigcontexts(struct pt_regs *regs,
484 current->thread.vrsave = 0; 488 current->thread.vrsave = 0;
485 current->thread.transact_vrsave = 0; 489 current->thread.transact_vrsave = 0;
486 } 490 }
491 if (cpu_has_feature(CPU_FTR_ALTIVEC))
492 mtspr(SPRN_VRSAVE, current->thread.vrsave);
487#endif /* CONFIG_ALTIVEC */ 493#endif /* CONFIG_ALTIVEC */
488 /* restore floating point */ 494 /* restore floating point */
489 err |= copy_fpr_from_user(current, &sc->fp_regs); 495 err |= copy_fpr_from_user(current, &sc->fp_regs);
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
index 38b0ba65a735..8e59abc237d7 100644
--- a/arch/powerpc/kernel/smp.c
+++ b/arch/powerpc/kernel/smp.c
@@ -81,6 +81,28 @@ int smt_enabled_at_boot = 1;
81 81
82static void (*crash_ipi_function_ptr)(struct pt_regs *) = NULL; 82static void (*crash_ipi_function_ptr)(struct pt_regs *) = NULL;
83 83
84/*
85 * Returns 1 if the specified cpu should be brought up during boot.
86 * Used to inhibit booting threads if they've been disabled or
87 * limited on the command line
88 */
89int smp_generic_cpu_bootable(unsigned int nr)
90{
91 /* Special case - we inhibit secondary thread startup
92 * during boot if the user requests it.
93 */
94 if (system_state == SYSTEM_BOOTING && cpu_has_feature(CPU_FTR_SMT)) {
95 if (!smt_enabled_at_boot && cpu_thread_in_core(nr) != 0)
96 return 0;
97 if (smt_enabled_at_boot
98 && cpu_thread_in_core(nr) >= smt_enabled_at_boot)
99 return 0;
100 }
101
102 return 1;
103}
104
105
84#ifdef CONFIG_PPC64 106#ifdef CONFIG_PPC64
85int smp_generic_kick_cpu(int nr) 107int smp_generic_kick_cpu(int nr)
86{ 108{
@@ -172,7 +194,7 @@ int smp_request_message_ipi(int virq, int msg)
172#endif 194#endif
173 err = request_irq(virq, smp_ipi_action[msg], 195 err = request_irq(virq, smp_ipi_action[msg],
174 IRQF_PERCPU | IRQF_NO_THREAD | IRQF_NO_SUSPEND, 196 IRQF_PERCPU | IRQF_NO_THREAD | IRQF_NO_SUSPEND,
175 smp_ipi_name[msg], 0); 197 smp_ipi_name[msg], NULL);
176 WARN(err < 0, "unable to request_irq %d for %s (rc %d)\n", 198 WARN(err < 0, "unable to request_irq %d for %s (rc %d)\n",
177 virq, smp_ipi_name[msg], err); 199 virq, smp_ipi_name[msg], err);
178 200
@@ -210,6 +232,12 @@ void smp_muxed_ipi_message_pass(int cpu, int msg)
210 smp_ops->cause_ipi(cpu, info->data); 232 smp_ops->cause_ipi(cpu, info->data);
211} 233}
212 234
235#ifdef __BIG_ENDIAN__
236#define IPI_MESSAGE(A) (1 << (24 - 8 * (A)))
237#else
238#define IPI_MESSAGE(A) (1 << (8 * (A)))
239#endif
240
213irqreturn_t smp_ipi_demux(void) 241irqreturn_t smp_ipi_demux(void)
214{ 242{
215 struct cpu_messages *info = &__get_cpu_var(ipi_message); 243 struct cpu_messages *info = &__get_cpu_var(ipi_message);
@@ -219,19 +247,14 @@ irqreturn_t smp_ipi_demux(void)
219 247
220 do { 248 do {
221 all = xchg(&info->messages, 0); 249 all = xchg(&info->messages, 0);
222 250 if (all & IPI_MESSAGE(PPC_MSG_CALL_FUNCTION))
223#ifdef __BIG_ENDIAN
224 if (all & (1 << (24 - 8 * PPC_MSG_CALL_FUNCTION)))
225 generic_smp_call_function_interrupt(); 251 generic_smp_call_function_interrupt();
226 if (all & (1 << (24 - 8 * PPC_MSG_RESCHEDULE))) 252 if (all & IPI_MESSAGE(PPC_MSG_RESCHEDULE))
227 scheduler_ipi(); 253 scheduler_ipi();
228 if (all & (1 << (24 - 8 * PPC_MSG_CALL_FUNC_SINGLE))) 254 if (all & IPI_MESSAGE(PPC_MSG_CALL_FUNC_SINGLE))
229 generic_smp_call_function_single_interrupt(); 255 generic_smp_call_function_single_interrupt();
230 if (all & (1 << (24 - 8 * PPC_MSG_DEBUGGER_BREAK))) 256 if (all & IPI_MESSAGE(PPC_MSG_DEBUGGER_BREAK))
231 debug_ipi_action(0, NULL); 257 debug_ipi_action(0, NULL);
232#else
233#error Unsupported ENDIAN
234#endif
235 } while (info->messages); 258 } while (info->messages);
236 259
237 return IRQ_HANDLED; 260 return IRQ_HANDLED;
@@ -574,6 +597,22 @@ out:
574 return id; 597 return id;
575} 598}
576 599
600/* Return the value of the chip-id property corresponding
601 * to the given logical cpu.
602 */
603int cpu_to_chip_id(int cpu)
604{
605 struct device_node *np;
606
607 np = of_get_cpu_node(cpu, NULL);
608 if (!np)
609 return -1;
610
611 of_node_put(np);
612 return of_get_ibm_chip_id(np);
613}
614EXPORT_SYMBOL(cpu_to_chip_id);
615
577/* Helper routines for cpu to core mapping */ 616/* Helper routines for cpu to core mapping */
578int cpu_core_index_of_thread(int cpu) 617int cpu_core_index_of_thread(int cpu)
579{ 618{
@@ -587,6 +626,33 @@ int cpu_first_thread_of_core(int core)
587} 626}
588EXPORT_SYMBOL_GPL(cpu_first_thread_of_core); 627EXPORT_SYMBOL_GPL(cpu_first_thread_of_core);
589 628
629static void traverse_siblings_chip_id(int cpu, bool add, int chipid)
630{
631 const struct cpumask *mask;
632 struct device_node *np;
633 int i, plen;
634 const __be32 *prop;
635
636 mask = add ? cpu_online_mask : cpu_present_mask;
637 for_each_cpu(i, mask) {
638 np = of_get_cpu_node(i, NULL);
639 if (!np)
640 continue;
641 prop = of_get_property(np, "ibm,chip-id", &plen);
642 if (prop && plen == sizeof(int) &&
643 of_read_number(prop, 1) == chipid) {
644 if (add) {
645 cpumask_set_cpu(cpu, cpu_core_mask(i));
646 cpumask_set_cpu(i, cpu_core_mask(cpu));
647 } else {
648 cpumask_clear_cpu(cpu, cpu_core_mask(i));
649 cpumask_clear_cpu(i, cpu_core_mask(cpu));
650 }
651 }
652 of_node_put(np);
653 }
654}
655
590/* Must be called when no change can occur to cpu_present_mask, 656/* Must be called when no change can occur to cpu_present_mask,
591 * i.e. during cpu online or offline. 657 * i.e. during cpu online or offline.
592 */ 658 */
@@ -609,11 +675,51 @@ static struct device_node *cpu_to_l2cache(int cpu)
609 return cache; 675 return cache;
610} 676}
611 677
678static void traverse_core_siblings(int cpu, bool add)
679{
680 struct device_node *l2_cache, *np;
681 const struct cpumask *mask;
682 int i, chip, plen;
683 const __be32 *prop;
684
685 /* First see if we have ibm,chip-id properties in cpu nodes */
686 np = of_get_cpu_node(cpu, NULL);
687 if (np) {
688 chip = -1;
689 prop = of_get_property(np, "ibm,chip-id", &plen);
690 if (prop && plen == sizeof(int))
691 chip = of_read_number(prop, 1);
692 of_node_put(np);
693 if (chip >= 0) {
694 traverse_siblings_chip_id(cpu, add, chip);
695 return;
696 }
697 }
698
699 l2_cache = cpu_to_l2cache(cpu);
700 mask = add ? cpu_online_mask : cpu_present_mask;
701 for_each_cpu(i, mask) {
702 np = cpu_to_l2cache(i);
703 if (!np)
704 continue;
705 if (np == l2_cache) {
706 if (add) {
707 cpumask_set_cpu(cpu, cpu_core_mask(i));
708 cpumask_set_cpu(i, cpu_core_mask(cpu));
709 } else {
710 cpumask_clear_cpu(cpu, cpu_core_mask(i));
711 cpumask_clear_cpu(i, cpu_core_mask(cpu));
712 }
713 }
714 of_node_put(np);
715 }
716 of_node_put(l2_cache);
717}
718
612/* Activate a secondary processor. */ 719/* Activate a secondary processor. */
613void start_secondary(void *unused) 720void start_secondary(void *unused)
614{ 721{
615 unsigned int cpu = smp_processor_id(); 722 unsigned int cpu = smp_processor_id();
616 struct device_node *l2_cache;
617 int i, base; 723 int i, base;
618 724
619 atomic_inc(&init_mm.mm_count); 725 atomic_inc(&init_mm.mm_count);
@@ -652,18 +758,7 @@ void start_secondary(void *unused)
652 cpumask_set_cpu(cpu, cpu_core_mask(base + i)); 758 cpumask_set_cpu(cpu, cpu_core_mask(base + i));
653 cpumask_set_cpu(base + i, cpu_core_mask(cpu)); 759 cpumask_set_cpu(base + i, cpu_core_mask(cpu));
654 } 760 }
655 l2_cache = cpu_to_l2cache(cpu); 761 traverse_core_siblings(cpu, true);
656 for_each_online_cpu(i) {
657 struct device_node *np = cpu_to_l2cache(i);
658 if (!np)
659 continue;
660 if (np == l2_cache) {
661 cpumask_set_cpu(cpu, cpu_core_mask(i));
662 cpumask_set_cpu(i, cpu_core_mask(cpu));
663 }
664 of_node_put(np);
665 }
666 of_node_put(l2_cache);
667 762
668 smp_wmb(); 763 smp_wmb();
669 notify_cpu_starting(cpu); 764 notify_cpu_starting(cpu);
@@ -719,7 +814,6 @@ int arch_sd_sibling_asym_packing(void)
719#ifdef CONFIG_HOTPLUG_CPU 814#ifdef CONFIG_HOTPLUG_CPU
720int __cpu_disable(void) 815int __cpu_disable(void)
721{ 816{
722 struct device_node *l2_cache;
723 int cpu = smp_processor_id(); 817 int cpu = smp_processor_id();
724 int base, i; 818 int base, i;
725 int err; 819 int err;
@@ -739,20 +833,7 @@ int __cpu_disable(void)
739 cpumask_clear_cpu(cpu, cpu_core_mask(base + i)); 833 cpumask_clear_cpu(cpu, cpu_core_mask(base + i));
740 cpumask_clear_cpu(base + i, cpu_core_mask(cpu)); 834 cpumask_clear_cpu(base + i, cpu_core_mask(cpu));
741 } 835 }
742 836 traverse_core_siblings(cpu, false);
743 l2_cache = cpu_to_l2cache(cpu);
744 for_each_present_cpu(i) {
745 struct device_node *np = cpu_to_l2cache(i);
746 if (!np)
747 continue;
748 if (np == l2_cache) {
749 cpumask_clear_cpu(cpu, cpu_core_mask(i));
750 cpumask_clear_cpu(i, cpu_core_mask(cpu));
751 }
752 of_node_put(np);
753 }
754 of_node_put(l2_cache);
755
756 837
757 return 0; 838 return 0;
758} 839}
diff --git a/arch/powerpc/kernel/softemu8xx.c b/arch/powerpc/kernel/softemu8xx.c
deleted file mode 100644
index 29b2f81dd709..000000000000
--- a/arch/powerpc/kernel/softemu8xx.c
+++ /dev/null
@@ -1,199 +0,0 @@
1/*
2 * Software emulation of some PPC instructions for the 8xx core.
3 *
4 * Copyright (C) 1998 Dan Malek (dmalek@jlc.net)
5 *
6 * Software floating emuation for the MPC8xx processor. I did this mostly
7 * because it was easier than trying to get the libraries compiled for
8 * software floating point. The goal is still to get the libraries done,
9 * but I lost patience and needed some hacks to at least get init and
10 * shells running. The first problem is the setjmp/longjmp that save
11 * and restore the floating point registers.
12 *
13 * For this emulation, our working registers are found on the register
14 * save area.
15 */
16
17#include <linux/errno.h>
18#include <linux/sched.h>
19#include <linux/kernel.h>
20#include <linux/mm.h>
21#include <linux/stddef.h>
22#include <linux/unistd.h>
23#include <linux/ptrace.h>
24#include <linux/user.h>
25#include <linux/interrupt.h>
26
27#include <asm/pgtable.h>
28#include <asm/uaccess.h>
29#include <asm/io.h>
30
31/* Eventually we may need a look-up table, but this works for now.
32*/
33#define LFS 48
34#define LFD 50
35#define LFDU 51
36#define STFD 54
37#define STFDU 55
38#define FMR 63
39
40void print_8xx_pte(struct mm_struct *mm, unsigned long addr)
41{
42 pgd_t *pgd;
43 pmd_t *pmd;
44 pte_t *pte;
45
46 printk(" pte @ 0x%8lx: ", addr);
47 pgd = pgd_offset(mm, addr & PAGE_MASK);
48 if (pgd) {
49 pmd = pmd_offset(pud_offset(pgd, addr & PAGE_MASK),
50 addr & PAGE_MASK);
51 if (pmd && pmd_present(*pmd)) {
52 pte = pte_offset_kernel(pmd, addr & PAGE_MASK);
53 if (pte) {
54 printk(" (0x%08lx)->(0x%08lx)->0x%08lx\n",
55 (long)pgd, (long)pte, (long)pte_val(*pte));
56#define pp ((long)pte_val(*pte))
57 printk(" RPN: %05lx PP: %lx SPS: %lx SH: %lx "
58 "CI: %lx v: %lx\n",
59 pp>>12, /* rpn */
60 (pp>>10)&3, /* pp */
61 (pp>>3)&1, /* small */
62 (pp>>2)&1, /* shared */
63 (pp>>1)&1, /* cache inhibit */
64 pp&1 /* valid */
65 );
66#undef pp
67 }
68 else {
69 printk("no pte\n");
70 }
71 }
72 else {
73 printk("no pmd\n");
74 }
75 }
76 else {
77 printk("no pgd\n");
78 }
79}
80
81int get_8xx_pte(struct mm_struct *mm, unsigned long addr)
82{
83 pgd_t *pgd;
84 pmd_t *pmd;
85 pte_t *pte;
86 int retval = 0;
87
88 pgd = pgd_offset(mm, addr & PAGE_MASK);
89 if (pgd) {
90 pmd = pmd_offset(pud_offset(pgd, addr & PAGE_MASK),
91 addr & PAGE_MASK);
92 if (pmd && pmd_present(*pmd)) {
93 pte = pte_offset_kernel(pmd, addr & PAGE_MASK);
94 if (pte) {
95 retval = (int)pte_val(*pte);
96 }
97 }
98 }
99 return retval;
100}
101
102/*
103 * We return 0 on success, 1 on unimplemented instruction, and EFAULT
104 * if a load/store faulted.
105 */
106int Soft_emulate_8xx(struct pt_regs *regs)
107{
108 u32 inst, instword;
109 u32 flreg, idxreg, disp;
110 int retval;
111 s16 sdisp;
112 u32 *ea, *ip;
113
114 retval = 0;
115
116 instword = *((u32 *)regs->nip);
117 inst = instword >> 26;
118
119 flreg = (instword >> 21) & 0x1f;
120 idxreg = (instword >> 16) & 0x1f;
121 disp = instword & 0xffff;
122
123 ea = (u32 *)(regs->gpr[idxreg] + disp);
124 ip = (u32 *)&current->thread.TS_FPR(flreg);
125
126 switch ( inst )
127 {
128 case LFD:
129 /* this is a 16 bit quantity that is sign extended
130 * so use a signed short here -- Cort
131 */
132 sdisp = (instword & 0xffff);
133 ea = (u32 *)(regs->gpr[idxreg] + sdisp);
134 if (copy_from_user(ip, ea, sizeof(double)))
135 retval = -EFAULT;
136 break;
137
138 case LFDU:
139 if (copy_from_user(ip, ea, sizeof(double)))
140 retval = -EFAULT;
141 else
142 regs->gpr[idxreg] = (u32)ea;
143 break;
144 case LFS:
145 sdisp = (instword & 0xffff);
146 ea = (u32 *)(regs->gpr[idxreg] + sdisp);
147 if (copy_from_user(ip, ea, sizeof(float)))
148 retval = -EFAULT;
149 break;
150 case STFD:
151 /* this is a 16 bit quantity that is sign extended
152 * so use a signed short here -- Cort
153 */
154 sdisp = (instword & 0xffff);
155 ea = (u32 *)(regs->gpr[idxreg] + sdisp);
156 if (copy_to_user(ea, ip, sizeof(double)))
157 retval = -EFAULT;
158 break;
159
160 case STFDU:
161 if (copy_to_user(ea, ip, sizeof(double)))
162 retval = -EFAULT;
163 else
164 regs->gpr[idxreg] = (u32)ea;
165 break;
166 case FMR:
167 /* assume this is a fp move -- Cort */
168 memcpy(ip, &current->thread.TS_FPR((instword>>11)&0x1f),
169 sizeof(double));
170 break;
171 default:
172 retval = 1;
173 printk("Bad emulation %s/%d\n"
174 " NIP: %08lx instruction: %08x opcode: %x "
175 "A: %x B: %x C: %x code: %x rc: %x\n",
176 current->comm,current->pid,
177 regs->nip,
178 instword,inst,
179 (instword>>16)&0x1f,
180 (instword>>11)&0x1f,
181 (instword>>6)&0x1f,
182 (instword>>1)&0x3ff,
183 instword&1);
184 {
185 int pa;
186 print_8xx_pte(current->mm,regs->nip);
187 pa = get_8xx_pte(current->mm,regs->nip) & PAGE_MASK;
188 pa |= (regs->nip & ~PAGE_MASK);
189 pa = (unsigned long)__va(pa);
190 printk("Kernel VA for NIP %x ", pa);
191 print_8xx_pte(current->mm,pa);
192 }
193 }
194
195 if (retval == 0)
196 regs->nip += 4;
197
198 return retval;
199}
diff --git a/arch/powerpc/kernel/swsusp_asm64.S b/arch/powerpc/kernel/swsusp_asm64.S
index 86ac1d90d02b..22045984835f 100644
--- a/arch/powerpc/kernel/swsusp_asm64.S
+++ b/arch/powerpc/kernel/swsusp_asm64.S
@@ -46,10 +46,19 @@
46#define SL_r29 0xe8 46#define SL_r29 0xe8
47#define SL_r30 0xf0 47#define SL_r30 0xf0
48#define SL_r31 0xf8 48#define SL_r31 0xf8
49#define SL_SIZE SL_r31+8 49#define SL_SPRG1 0x100
50#define SL_TCR 0x108
51#define SL_SIZE SL_TCR+8
50 52
51/* these macros rely on the save area being 53/* these macros rely on the save area being
52 * pointed to by r11 */ 54 * pointed to by r11 */
55
56#define SAVE_SPR(register) \
57 mfspr r0, SPRN_##register ;\
58 std r0, SL_##register(r11)
59#define RESTORE_SPR(register) \
60 ld r0, SL_##register(r11) ;\
61 mtspr SPRN_##register, r0
53#define SAVE_SPECIAL(special) \ 62#define SAVE_SPECIAL(special) \
54 mf##special r0 ;\ 63 mf##special r0 ;\
55 std r0, SL_##special(r11) 64 std r0, SL_##special(r11)
@@ -103,8 +112,15 @@ _GLOBAL(swsusp_arch_suspend)
103 SAVE_REGISTER(r30) 112 SAVE_REGISTER(r30)
104 SAVE_REGISTER(r31) 113 SAVE_REGISTER(r31)
105 SAVE_SPECIAL(MSR) 114 SAVE_SPECIAL(MSR)
106 SAVE_SPECIAL(SDR1)
107 SAVE_SPECIAL(XER) 115 SAVE_SPECIAL(XER)
116#ifdef CONFIG_PPC_BOOK3S_64
117 SAVE_SPECIAL(SDR1)
118#else
119 SAVE_SPR(TCR)
120
121 /* Save SPRG1, SPRG1 be used save paca */
122 SAVE_SPR(SPRG1)
123#endif
108 124
109 /* we push the stack up 128 bytes but don't store the 125 /* we push the stack up 128 bytes but don't store the
110 * stack pointer on the stack like a real stackframe */ 126 * stack pointer on the stack like a real stackframe */
@@ -151,6 +167,7 @@ copy_page_loop:
151 bne+ copyloop 167 bne+ copyloop
152nothing_to_copy: 168nothing_to_copy:
153 169
170#ifdef CONFIG_PPC_BOOK3S_64
154 /* flush caches */ 171 /* flush caches */
155 lis r3, 0x10 172 lis r3, 0x10
156 mtctr r3 173 mtctr r3
@@ -167,6 +184,7 @@ nothing_to_copy:
167 sync 184 sync
168 185
169 tlbia 186 tlbia
187#endif
170 188
171 ld r11,swsusp_save_area_ptr@toc(r2) 189 ld r11,swsusp_save_area_ptr@toc(r2)
172 190
@@ -208,16 +226,39 @@ nothing_to_copy:
208 RESTORE_REGISTER(r29) 226 RESTORE_REGISTER(r29)
209 RESTORE_REGISTER(r30) 227 RESTORE_REGISTER(r30)
210 RESTORE_REGISTER(r31) 228 RESTORE_REGISTER(r31)
229
230#ifdef CONFIG_PPC_BOOK3S_64
211 /* can't use RESTORE_SPECIAL(MSR) */ 231 /* can't use RESTORE_SPECIAL(MSR) */
212 ld r0, SL_MSR(r11) 232 ld r0, SL_MSR(r11)
213 mtmsrd r0, 0 233 mtmsrd r0, 0
214 RESTORE_SPECIAL(SDR1) 234 RESTORE_SPECIAL(SDR1)
235#else
236 /* Restore SPRG1, be used to save paca */
237 ld r0, SL_SPRG1(r11)
238 mtsprg 1, r0
239
240 RESTORE_SPECIAL(MSR)
241
242 /* Restore TCR and clear any pending bits in TSR. */
243 RESTORE_SPR(TCR)
244 lis r0, (TSR_ENW | TSR_WIS | TSR_DIS | TSR_FIS)@h
245 mtspr SPRN_TSR, r0
246
247 /* Kick decrementer */
248 li r0, 1
249 mtdec r0
250
251 /* Invalidate all tlbs */
252 bl _tlbil_all
253#endif
215 RESTORE_SPECIAL(XER) 254 RESTORE_SPECIAL(XER)
216 255
217 sync 256 sync
218 257
219 addi r1,r1,-128 258 addi r1,r1,-128
259#ifdef CONFIG_PPC_BOOK3S_64
220 bl slb_flush_and_rebolt 260 bl slb_flush_and_rebolt
261#endif
221 bl do_after_copyback 262 bl do_after_copyback
222 addi r1,r1,128 263 addi r1,r1,128
223 264
diff --git a/arch/powerpc/kernel/swsusp_booke.S b/arch/powerpc/kernel/swsusp_booke.S
index 11a39307dd71..0f204053e5b5 100644
--- a/arch/powerpc/kernel/swsusp_booke.S
+++ b/arch/powerpc/kernel/swsusp_booke.S
@@ -141,6 +141,14 @@ _GLOBAL(swsusp_arch_resume)
141 lis r11,swsusp_save_area@h 141 lis r11,swsusp_save_area@h
142 ori r11,r11,swsusp_save_area@l 142 ori r11,r11,swsusp_save_area@l
143 143
144 /*
145 * Mappings from virtual addresses to physical addresses may be
146 * different than they were prior to restoring hibernation state.
147 * Invalidate the TLB so that the boot CPU is using the new
148 * mappings.
149 */
150 bl _tlbil_all
151
144 lwz r4,SL_SPRG0(r11) 152 lwz r4,SL_SPRG0(r11)
145 mtsprg 0,r4 153 mtsprg 0,r4
146 lwz r4,SL_SPRG1(r11) 154 lwz r4,SL_SPRG1(r11)
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
index 65ab9e909377..192b051df97e 100644
--- a/arch/powerpc/kernel/time.c
+++ b/arch/powerpc/kernel/time.c
@@ -210,18 +210,18 @@ static u64 scan_dispatch_log(u64 stop_tb)
210 if (!dtl) 210 if (!dtl)
211 return 0; 211 return 0;
212 212
213 if (i == vpa->dtl_idx) 213 if (i == be64_to_cpu(vpa->dtl_idx))
214 return 0; 214 return 0;
215 while (i < vpa->dtl_idx) { 215 while (i < be64_to_cpu(vpa->dtl_idx)) {
216 if (dtl_consumer) 216 if (dtl_consumer)
217 dtl_consumer(dtl, i); 217 dtl_consumer(dtl, i);
218 dtb = dtl->timebase; 218 dtb = be64_to_cpu(dtl->timebase);
219 tb_delta = dtl->enqueue_to_dispatch_time + 219 tb_delta = be32_to_cpu(dtl->enqueue_to_dispatch_time) +
220 dtl->ready_to_enqueue_time; 220 be32_to_cpu(dtl->ready_to_enqueue_time);
221 barrier(); 221 barrier();
222 if (i + N_DISPATCH_LOG < vpa->dtl_idx) { 222 if (i + N_DISPATCH_LOG < be64_to_cpu(vpa->dtl_idx)) {
223 /* buffer has overflowed */ 223 /* buffer has overflowed */
224 i = vpa->dtl_idx - N_DISPATCH_LOG; 224 i = be64_to_cpu(vpa->dtl_idx) - N_DISPATCH_LOG;
225 dtl = local_paca->dispatch_log + (i % N_DISPATCH_LOG); 225 dtl = local_paca->dispatch_log + (i % N_DISPATCH_LOG);
226 continue; 226 continue;
227 } 227 }
@@ -269,7 +269,7 @@ static inline u64 calculate_stolen_time(u64 stop_tb)
269{ 269{
270 u64 stolen = 0; 270 u64 stolen = 0;
271 271
272 if (get_paca()->dtl_ridx != get_paca()->lppaca_ptr->dtl_idx) { 272 if (get_paca()->dtl_ridx != be64_to_cpu(get_lppaca()->dtl_idx)) {
273 stolen = scan_dispatch_log(stop_tb); 273 stolen = scan_dispatch_log(stop_tb);
274 get_paca()->system_time -= stolen; 274 get_paca()->system_time -= stolen;
275 } 275 }
@@ -612,7 +612,7 @@ unsigned long long sched_clock(void)
612static int __init get_freq(char *name, int cells, unsigned long *val) 612static int __init get_freq(char *name, int cells, unsigned long *val)
613{ 613{
614 struct device_node *cpu; 614 struct device_node *cpu;
615 const unsigned int *fp; 615 const __be32 *fp;
616 int found = 0; 616 int found = 0;
617 617
618 /* The cpu node should have timebase and clock frequency properties */ 618 /* The cpu node should have timebase and clock frequency properties */
@@ -1049,7 +1049,7 @@ static int __init rtc_init(void)
1049 1049
1050 pdev = platform_device_register_simple("rtc-generic", -1, NULL, 0); 1050 pdev = platform_device_register_simple("rtc-generic", -1, NULL, 0);
1051 1051
1052 return PTR_RET(pdev); 1052 return PTR_ERR_OR_ZERO(pdev);
1053} 1053}
1054 1054
1055module_init(rtc_init); 1055module_init(rtc_init);
diff --git a/arch/powerpc/kernel/tm.S b/arch/powerpc/kernel/tm.S
index 0554d1f6d70d..7b60b9851469 100644
--- a/arch/powerpc/kernel/tm.S
+++ b/arch/powerpc/kernel/tm.S
@@ -155,10 +155,10 @@ _GLOBAL(tm_reclaim)
155 mfvscr vr0 155 mfvscr vr0
156 li r6, THREAD_TRANSACT_VSCR 156 li r6, THREAD_TRANSACT_VSCR
157 stvx vr0, r3, r6 157 stvx vr0, r3, r6
158dont_backup_vec:
158 mfspr r0, SPRN_VRSAVE 159 mfspr r0, SPRN_VRSAVE
159 std r0, THREAD_TRANSACT_VRSAVE(r3) 160 std r0, THREAD_TRANSACT_VRSAVE(r3)
160 161
161dont_backup_vec:
162 andi. r0, r4, MSR_FP 162 andi. r0, r4, MSR_FP
163 beq dont_backup_fp 163 beq dont_backup_fp
164 164
@@ -341,11 +341,11 @@ _GLOBAL(tm_recheckpoint)
341 lvx vr0, r3, r5 341 lvx vr0, r3, r5
342 mtvscr vr0 342 mtvscr vr0
343 REST_32VRS(0, r5, r3) /* r5 scratch, r3 THREAD ptr */ 343 REST_32VRS(0, r5, r3) /* r5 scratch, r3 THREAD ptr */
344dont_restore_vec:
344 ld r5, THREAD_VRSAVE(r3) 345 ld r5, THREAD_VRSAVE(r3)
345 mtspr SPRN_VRSAVE, r5 346 mtspr SPRN_VRSAVE, r5
346#endif 347#endif
347 348
348dont_restore_vec:
349 andi. r0, r4, MSR_FP 349 andi. r0, r4, MSR_FP
350 beq dont_restore_fp 350 beq dont_restore_fp
351 351
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
index e435bc089ea3..f783c932faeb 100644
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -60,6 +60,7 @@
60#include <asm/switch_to.h> 60#include <asm/switch_to.h>
61#include <asm/tm.h> 61#include <asm/tm.h>
62#include <asm/debug.h> 62#include <asm/debug.h>
63#include <sysdev/fsl_pci.h>
63 64
64#if defined(CONFIG_DEBUGGER) || defined(CONFIG_KEXEC) 65#if defined(CONFIG_DEBUGGER) || defined(CONFIG_KEXEC)
65int (*__debugger)(struct pt_regs *regs) __read_mostly; 66int (*__debugger)(struct pt_regs *regs) __read_mostly;
@@ -565,6 +566,8 @@ int machine_check_e500(struct pt_regs *regs)
565 if (reason & MCSR_BUS_RBERR) { 566 if (reason & MCSR_BUS_RBERR) {
566 if (fsl_rio_mcheck_exception(regs)) 567 if (fsl_rio_mcheck_exception(regs))
567 return 1; 568 return 1;
569 if (fsl_pci_mcheck_exception(regs))
570 return 1;
568 } 571 }
569 572
570 printk("Machine check in kernel mode.\n"); 573 printk("Machine check in kernel mode.\n");
@@ -962,7 +965,7 @@ static int emulate_instruction(struct pt_regs *regs)
962 u32 instword; 965 u32 instword;
963 u32 rd; 966 u32 rd;
964 967
965 if (!user_mode(regs) || (regs->msr & MSR_LE)) 968 if (!user_mode(regs))
966 return -EINVAL; 969 return -EINVAL;
967 CHECK_FULL_REGS(regs); 970 CHECK_FULL_REGS(regs);
968 971
@@ -1050,11 +1053,41 @@ int is_valid_bugaddr(unsigned long addr)
1050 return is_kernel_addr(addr); 1053 return is_kernel_addr(addr);
1051} 1054}
1052 1055
1056#ifdef CONFIG_MATH_EMULATION
1057static int emulate_math(struct pt_regs *regs)
1058{
1059 int ret;
1060 extern int do_mathemu(struct pt_regs *regs);
1061
1062 ret = do_mathemu(regs);
1063 if (ret >= 0)
1064 PPC_WARN_EMULATED(math, regs);
1065
1066 switch (ret) {
1067 case 0:
1068 emulate_single_step(regs);
1069 return 0;
1070 case 1: {
1071 int code = 0;
1072 code = __parse_fpscr(current->thread.fpscr.val);
1073 _exception(SIGFPE, regs, code, regs->nip);
1074 return 0;
1075 }
1076 case -EFAULT:
1077 _exception(SIGSEGV, regs, SEGV_MAPERR, regs->nip);
1078 return 0;
1079 }
1080
1081 return -1;
1082}
1083#else
1084static inline int emulate_math(struct pt_regs *regs) { return -1; }
1085#endif
1086
1053void __kprobes program_check_exception(struct pt_regs *regs) 1087void __kprobes program_check_exception(struct pt_regs *regs)
1054{ 1088{
1055 enum ctx_state prev_state = exception_enter(); 1089 enum ctx_state prev_state = exception_enter();
1056 unsigned int reason = get_reason(regs); 1090 unsigned int reason = get_reason(regs);
1057 extern int do_mathemu(struct pt_regs *regs);
1058 1091
1059 /* We can now get here via a FP Unavailable exception if the core 1092 /* We can now get here via a FP Unavailable exception if the core
1060 * has no FPU, in that case the reason flags will be 0 */ 1093 * has no FPU, in that case the reason flags will be 0 */
@@ -1116,11 +1149,20 @@ void __kprobes program_check_exception(struct pt_regs *regs)
1116 } 1149 }
1117#endif 1150#endif
1118 1151
1152 /*
1153 * If we took the program check in the kernel skip down to sending a
1154 * SIGILL. The subsequent cases all relate to emulating instructions
1155 * which we should only do for userspace. We also do not want to enable
1156 * interrupts for kernel faults because that might lead to further
1157 * faults, and loose the context of the original exception.
1158 */
1159 if (!user_mode(regs))
1160 goto sigill;
1161
1119 /* We restore the interrupt state now */ 1162 /* We restore the interrupt state now */
1120 if (!arch_irq_disabled_regs(regs)) 1163 if (!arch_irq_disabled_regs(regs))
1121 local_irq_enable(); 1164 local_irq_enable();
1122 1165
1123#ifdef CONFIG_MATH_EMULATION
1124 /* (reason & REASON_ILLEGAL) would be the obvious thing here, 1166 /* (reason & REASON_ILLEGAL) would be the obvious thing here,
1125 * but there seems to be a hardware bug on the 405GP (RevD) 1167 * but there seems to be a hardware bug on the 405GP (RevD)
1126 * that means ESR is sometimes set incorrectly - either to 1168 * that means ESR is sometimes set incorrectly - either to
@@ -1129,31 +1171,8 @@ void __kprobes program_check_exception(struct pt_regs *regs)
1129 * instruction or only on FP instructions, whether there is a 1171 * instruction or only on FP instructions, whether there is a
1130 * pattern to occurrences etc. -dgibson 31/Mar/2003 1172 * pattern to occurrences etc. -dgibson 31/Mar/2003
1131 */ 1173 */
1132 1174 if (!emulate_math(regs))
1133 /*
1134 * If we support a HW FPU, we need to ensure the FP state
1135 * if flushed into the thread_struct before attempting
1136 * emulation
1137 */
1138#ifdef CONFIG_PPC_FPU
1139 flush_fp_to_thread(current);
1140#endif
1141 switch (do_mathemu(regs)) {
1142 case 0:
1143 emulate_single_step(regs);
1144 goto bail;
1145 case 1: {
1146 int code = 0;
1147 code = __parse_fpscr(current->thread.fpscr.val);
1148 _exception(SIGFPE, regs, code, regs->nip);
1149 goto bail;
1150 }
1151 case -EFAULT:
1152 _exception(SIGSEGV, regs, SEGV_MAPERR, regs->nip);
1153 goto bail; 1175 goto bail;
1154 }
1155 /* fall through on any other errors */
1156#endif /* CONFIG_MATH_EMULATION */
1157 1176
1158 /* Try to emulate it if we should. */ 1177 /* Try to emulate it if we should. */
1159 if (reason & (REASON_ILLEGAL | REASON_PRIVILEGED)) { 1178 if (reason & (REASON_ILLEGAL | REASON_PRIVILEGED)) {
@@ -1168,6 +1187,7 @@ void __kprobes program_check_exception(struct pt_regs *regs)
1168 } 1187 }
1169 } 1188 }
1170 1189
1190sigill:
1171 if (reason & REASON_PRIVILEGED) 1191 if (reason & REASON_PRIVILEGED)
1172 _exception(SIGILL, regs, ILL_PRVOPC, regs->nip); 1192 _exception(SIGILL, regs, ILL_PRVOPC, regs->nip);
1173 else 1193 else
@@ -1322,13 +1342,10 @@ void facility_unavailable_exception(struct pt_regs *regs)
1322 if (status == FSCR_DSCR_LG) { 1342 if (status == FSCR_DSCR_LG) {
1323 /* User is acessing the DSCR. Set the inherit bit and allow 1343 /* User is acessing the DSCR. Set the inherit bit and allow
1324 * the user to set it directly in future by setting via the 1344 * the user to set it directly in future by setting via the
1325 * H/FSCR DSCR bit. 1345 * FSCR DSCR bit. We always leave HFSCR DSCR set.
1326 */ 1346 */
1327 current->thread.dscr_inherit = 1; 1347 current->thread.dscr_inherit = 1;
1328 if (hv) 1348 mtspr(SPRN_FSCR, value | FSCR_DSCR);
1329 mtspr(SPRN_HFSCR, value | HFSCR_DSCR);
1330 else
1331 mtspr(SPRN_FSCR, value | FSCR_DSCR);
1332 return; 1349 return;
1333 } 1350 }
1334 1351
@@ -1444,11 +1461,6 @@ void performance_monitor_exception(struct pt_regs *regs)
1444#ifdef CONFIG_8xx 1461#ifdef CONFIG_8xx
1445void SoftwareEmulation(struct pt_regs *regs) 1462void SoftwareEmulation(struct pt_regs *regs)
1446{ 1463{
1447 extern int do_mathemu(struct pt_regs *);
1448#if defined(CONFIG_MATH_EMULATION)
1449 int errcode;
1450#endif
1451
1452 CHECK_FULL_REGS(regs); 1464 CHECK_FULL_REGS(regs);
1453 1465
1454 if (!user_mode(regs)) { 1466 if (!user_mode(regs)) {
@@ -1456,31 +1468,10 @@ void SoftwareEmulation(struct pt_regs *regs)
1456 die("Kernel Mode Software FPU Emulation", regs, SIGFPE); 1468 die("Kernel Mode Software FPU Emulation", regs, SIGFPE);
1457 } 1469 }
1458 1470
1459#ifdef CONFIG_MATH_EMULATION 1471 if (!emulate_math(regs))
1460 errcode = do_mathemu(regs);
1461 if (errcode >= 0)
1462 PPC_WARN_EMULATED(math, regs);
1463
1464 switch (errcode) {
1465 case 0:
1466 emulate_single_step(regs);
1467 return; 1472 return;
1468 case 1: { 1473
1469 int code = 0;
1470 code = __parse_fpscr(current->thread.fpscr.val);
1471 _exception(SIGFPE, regs, code, regs->nip);
1472 return;
1473 }
1474 case -EFAULT:
1475 _exception(SIGSEGV, regs, SEGV_MAPERR, regs->nip);
1476 return;
1477 default:
1478 _exception(SIGILL, regs, ILL_ILLOPC, regs->nip);
1479 return;
1480 }
1481#else
1482 _exception(SIGILL, regs, ILL_ILLOPC, regs->nip); 1474 _exception(SIGILL, regs, ILL_ILLOPC, regs->nip);
1483#endif
1484} 1475}
1485#endif /* CONFIG_8xx */ 1476#endif /* CONFIG_8xx */
1486 1477
diff --git a/arch/powerpc/kernel/udbg_16550.c b/arch/powerpc/kernel/udbg_16550.c
index 6837f839ab78..75702e207b29 100644
--- a/arch/powerpc/kernel/udbg_16550.c
+++ b/arch/powerpc/kernel/udbg_16550.c
@@ -18,23 +18,19 @@ extern void real_writeb(u8 data, volatile u8 __iomem *addr);
18extern u8 real_205_readb(volatile u8 __iomem *addr); 18extern u8 real_205_readb(volatile u8 __iomem *addr);
19extern void real_205_writeb(u8 data, volatile u8 __iomem *addr); 19extern void real_205_writeb(u8 data, volatile u8 __iomem *addr);
20 20
21struct NS16550 { 21#define UART_RBR 0
22 /* this struct must be packed */ 22#define UART_IER 1
23 unsigned char rbr; /* 0 */ 23#define UART_FCR 2
24 unsigned char ier; /* 1 */ 24#define UART_LCR 3
25 unsigned char fcr; /* 2 */ 25#define UART_MCR 4
26 unsigned char lcr; /* 3 */ 26#define UART_LSR 5
27 unsigned char mcr; /* 4 */ 27#define UART_MSR 6
28 unsigned char lsr; /* 5 */ 28#define UART_SCR 7
29 unsigned char msr; /* 6 */ 29#define UART_THR UART_RBR
30 unsigned char scr; /* 7 */ 30#define UART_IIR UART_FCR
31}; 31#define UART_DLL UART_RBR
32 32#define UART_DLM UART_IER
33#define thr rbr 33#define UART_DLAB UART_LCR
34#define iir fcr
35#define dll rbr
36#define dlm ier
37#define dlab lcr
38 34
39#define LSR_DR 0x01 /* Data ready */ 35#define LSR_DR 0x01 /* Data ready */
40#define LSR_OE 0x02 /* Overrun */ 36#define LSR_OE 0x02 /* Overrun */
@@ -47,52 +43,62 @@ struct NS16550 {
47 43
48#define LCR_DLAB 0x80 44#define LCR_DLAB 0x80
49 45
50static struct NS16550 __iomem *udbg_comport; 46static u8 (*udbg_uart_in)(unsigned int reg);
47static void (*udbg_uart_out)(unsigned int reg, u8 data);
51 48
52static void udbg_550_flush(void) 49static void udbg_uart_flush(void)
53{ 50{
54 if (udbg_comport) { 51 if (!udbg_uart_in)
55 while ((in_8(&udbg_comport->lsr) & LSR_THRE) == 0) 52 return;
56 /* wait for idle */; 53
57 } 54 /* wait for idle */
55 while ((udbg_uart_in(UART_LSR) & LSR_THRE) == 0)
56 cpu_relax();
58} 57}
59 58
60static void udbg_550_putc(char c) 59static void udbg_uart_putc(char c)
61{ 60{
62 if (udbg_comport) { 61 if (!udbg_uart_out)
63 if (c == '\n') 62 return;
64 udbg_550_putc('\r'); 63
65 udbg_550_flush(); 64 if (c == '\n')
66 out_8(&udbg_comport->thr, c); 65 udbg_uart_putc('\r');
67 } 66 udbg_uart_flush();
67 udbg_uart_out(UART_THR, c);
68} 68}
69 69
70static int udbg_550_getc_poll(void) 70static int udbg_uart_getc_poll(void)
71{ 71{
72 if (udbg_comport) { 72 if (!udbg_uart_in || !(udbg_uart_in(UART_LSR) & LSR_DR))
73 if ((in_8(&udbg_comport->lsr) & LSR_DR) != 0) 73 return udbg_uart_in(UART_RBR);
74 return in_8(&udbg_comport->rbr);
75 else
76 return -1;
77 }
78 return -1; 74 return -1;
79} 75}
80 76
81static int udbg_550_getc(void) 77static int udbg_uart_getc(void)
82{ 78{
83 if (udbg_comport) { 79 if (!udbg_uart_in)
84 while ((in_8(&udbg_comport->lsr) & LSR_DR) == 0) 80 return -1;
85 /* wait for char */; 81 /* wait for char */
86 return in_8(&udbg_comport->rbr); 82 while (!(udbg_uart_in(UART_LSR) & LSR_DR))
87 } 83 cpu_relax();
88 return -1; 84 return udbg_uart_in(UART_RBR);
85}
86
87static void udbg_use_uart(void)
88{
89 udbg_putc = udbg_uart_putc;
90 udbg_flush = udbg_uart_flush;
91 udbg_getc = udbg_uart_getc;
92 udbg_getc_poll = udbg_uart_getc_poll;
89} 93}
90 94
91void udbg_init_uart(void __iomem *comport, unsigned int speed, 95void udbg_uart_setup(unsigned int speed, unsigned int clock)
92 unsigned int clock)
93{ 96{
94 unsigned int dll, base_bauds; 97 unsigned int dll, base_bauds;
95 98
99 if (!udbg_uart_out)
100 return;
101
96 if (clock == 0) 102 if (clock == 0)
97 clock = 1843200; 103 clock = 1843200;
98 if (speed == 0) 104 if (speed == 0)
@@ -101,51 +107,43 @@ void udbg_init_uart(void __iomem *comport, unsigned int speed,
101 base_bauds = clock / 16; 107 base_bauds = clock / 16;
102 dll = base_bauds / speed; 108 dll = base_bauds / speed;
103 109
104 if (comport) { 110 udbg_uart_out(UART_LCR, 0x00);
105 udbg_comport = (struct NS16550 __iomem *)comport; 111 udbg_uart_out(UART_IER, 0xff);
106 out_8(&udbg_comport->lcr, 0x00); 112 udbg_uart_out(UART_IER, 0x00);
107 out_8(&udbg_comport->ier, 0xff); 113 udbg_uart_out(UART_LCR, LCR_DLAB);
108 out_8(&udbg_comport->ier, 0x00); 114 udbg_uart_out(UART_DLL, dll & 0xff);
109 out_8(&udbg_comport->lcr, LCR_DLAB); 115 udbg_uart_out(UART_DLM, dll >> 8);
110 out_8(&udbg_comport->dll, dll & 0xff); 116 /* 8 data, 1 stop, no parity */
111 out_8(&udbg_comport->dlm, dll >> 8); 117 udbg_uart_out(UART_LCR, 0x3);
112 /* 8 data, 1 stop, no parity */ 118 /* RTS/DTR */
113 out_8(&udbg_comport->lcr, 0x03); 119 udbg_uart_out(UART_MCR, 0x3);
114 /* RTS/DTR */ 120 /* Clear & enable FIFOs */
115 out_8(&udbg_comport->mcr, 0x03); 121 udbg_uart_out(UART_FCR, 0x7);
116 /* Clear & enable FIFOs */
117 out_8(&udbg_comport->fcr ,0x07);
118 udbg_putc = udbg_550_putc;
119 udbg_flush = udbg_550_flush;
120 udbg_getc = udbg_550_getc;
121 udbg_getc_poll = udbg_550_getc_poll;
122 }
123} 122}
124 123
125unsigned int udbg_probe_uart_speed(void __iomem *comport, unsigned int clock) 124unsigned int udbg_probe_uart_speed(unsigned int clock)
126{ 125{
127 unsigned int dll, dlm, divisor, prescaler, speed; 126 unsigned int dll, dlm, divisor, prescaler, speed;
128 u8 old_lcr; 127 u8 old_lcr;
129 struct NS16550 __iomem *port = comport;
130 128
131 old_lcr = in_8(&port->lcr); 129 old_lcr = udbg_uart_in(UART_LCR);
132 130
133 /* select divisor latch registers. */ 131 /* select divisor latch registers. */
134 out_8(&port->lcr, LCR_DLAB); 132 udbg_uart_out(UART_LCR, old_lcr | LCR_DLAB);
135 133
136 /* now, read the divisor */ 134 /* now, read the divisor */
137 dll = in_8(&port->dll); 135 dll = udbg_uart_in(UART_DLL);
138 dlm = in_8(&port->dlm); 136 dlm = udbg_uart_in(UART_DLM);
139 divisor = dlm << 8 | dll; 137 divisor = dlm << 8 | dll;
140 138
141 /* check prescaling */ 139 /* check prescaling */
142 if (in_8(&port->mcr) & 0x80) 140 if (udbg_uart_in(UART_MCR) & 0x80)
143 prescaler = 4; 141 prescaler = 4;
144 else 142 else
145 prescaler = 1; 143 prescaler = 1;
146 144
147 /* restore the LCR */ 145 /* restore the LCR */
148 out_8(&port->lcr, old_lcr); 146 udbg_uart_out(UART_LCR, old_lcr);
149 147
150 /* calculate speed */ 148 /* calculate speed */
151 speed = (clock / prescaler) / (divisor * 16); 149 speed = (clock / prescaler) / (divisor * 16);
@@ -157,195 +155,155 @@ unsigned int udbg_probe_uart_speed(void __iomem *comport, unsigned int clock)
157 return speed; 155 return speed;
158} 156}
159 157
160#ifdef CONFIG_PPC_MAPLE 158static union {
161void udbg_maple_real_flush(void) 159 unsigned char __iomem *mmio_base;
160 unsigned long pio_base;
161} udbg_uart;
162
163static unsigned int udbg_uart_stride = 1;
164
165static u8 udbg_uart_in_pio(unsigned int reg)
162{ 166{
163 if (udbg_comport) { 167 return inb(udbg_uart.pio_base + (reg * udbg_uart_stride));
164 while ((real_readb(&udbg_comport->lsr) & LSR_THRE) == 0)
165 /* wait for idle */;
166 }
167} 168}
168 169
169void udbg_maple_real_putc(char c) 170static void udbg_uart_out_pio(unsigned int reg, u8 data)
170{ 171{
171 if (udbg_comport) { 172 outb(data, udbg_uart.pio_base + (reg * udbg_uart_stride));
172 if (c == '\n')
173 udbg_maple_real_putc('\r');
174 udbg_maple_real_flush();
175 real_writeb(c, &udbg_comport->thr); eieio();
176 }
177} 173}
178 174
179void __init udbg_init_maple_realmode(void) 175void udbg_uart_init_pio(unsigned long port, unsigned int stride)
180{ 176{
181 udbg_comport = (struct NS16550 __iomem *)0xf40003f8; 177 if (!port)
182 178 return;
183 udbg_putc = udbg_maple_real_putc; 179 udbg_uart.pio_base = port;
184 udbg_flush = udbg_maple_real_flush; 180 udbg_uart_stride = stride;
185 udbg_getc = NULL; 181 udbg_uart_in = udbg_uart_in_pio;
186 udbg_getc_poll = NULL; 182 udbg_uart_out = udbg_uart_out_pio;
183 udbg_use_uart();
187} 184}
188#endif /* CONFIG_PPC_MAPLE */
189 185
190#ifdef CONFIG_PPC_PASEMI 186static u8 udbg_uart_in_mmio(unsigned int reg)
191void udbg_pas_real_flush(void)
192{ 187{
193 if (udbg_comport) { 188 return in_8(udbg_uart.mmio_base + (reg * udbg_uart_stride));
194 while ((real_205_readb(&udbg_comport->lsr) & LSR_THRE) == 0)
195 /* wait for idle */;
196 }
197} 189}
198 190
199void udbg_pas_real_putc(char c) 191static void udbg_uart_out_mmio(unsigned int reg, u8 data)
200{ 192{
201 if (udbg_comport) { 193 out_8(udbg_uart.mmio_base + (reg * udbg_uart_stride), data);
202 if (c == '\n')
203 udbg_pas_real_putc('\r');
204 udbg_pas_real_flush();
205 real_205_writeb(c, &udbg_comport->thr); eieio();
206 }
207} 194}
208 195
209void udbg_init_pas_realmode(void)
210{
211 udbg_comport = (struct NS16550 __iomem *)0xfcff03f8UL;
212 196
213 udbg_putc = udbg_pas_real_putc; 197void udbg_uart_init_mmio(void __iomem *addr, unsigned int stride)
214 udbg_flush = udbg_pas_real_flush; 198{
215 udbg_getc = NULL; 199 if (!addr)
216 udbg_getc_poll = NULL; 200 return;
201 udbg_uart.mmio_base = addr;
202 udbg_uart_stride = stride;
203 udbg_uart_in = udbg_uart_in_mmio;
204 udbg_uart_out = udbg_uart_out_mmio;
205 udbg_use_uart();
217} 206}
218#endif /* CONFIG_PPC_MAPLE */
219 207
220#ifdef CONFIG_PPC_EARLY_DEBUG_44x 208#ifdef CONFIG_PPC_MAPLE
221#include <platforms/44x/44x.h> 209
210#define UDBG_UART_MAPLE_ADDR ((void __iomem *)0xf40003f8)
222 211
223static void udbg_44x_as1_flush(void) 212static u8 udbg_uart_in_maple(unsigned int reg)
224{ 213{
225 if (udbg_comport) { 214 return real_readb(UDBG_UART_MAPLE_ADDR + reg);
226 while ((as1_readb(&udbg_comport->lsr) & LSR_THRE) == 0)
227 /* wait for idle */;
228 }
229} 215}
230 216
231static void udbg_44x_as1_putc(char c) 217static void udbg_uart_out_maple(unsigned int reg, u8 val)
232{ 218{
233 if (udbg_comport) { 219 real_writeb(val, UDBG_UART_MAPLE_ADDR + reg);
234 if (c == '\n')
235 udbg_44x_as1_putc('\r');
236 udbg_44x_as1_flush();
237 as1_writeb(c, &udbg_comport->thr); eieio();
238 }
239} 220}
240 221
241static int udbg_44x_as1_getc(void) 222void __init udbg_init_maple_realmode(void)
242{ 223{
243 if (udbg_comport) { 224 udbg_uart_in = udbg_uart_in_maple;
244 while ((as1_readb(&udbg_comport->lsr) & LSR_DR) == 0) 225 udbg_uart_out = udbg_uart_out_maple;
245 ; /* wait for char */ 226 udbg_use_uart();
246 return as1_readb(&udbg_comport->rbr);
247 }
248 return -1;
249} 227}
250 228
251void __init udbg_init_44x_as1(void) 229#endif /* CONFIG_PPC_MAPLE */
252{
253 udbg_comport =
254 (struct NS16550 __iomem *)PPC44x_EARLY_DEBUG_VIRTADDR;
255 230
256 udbg_putc = udbg_44x_as1_putc; 231#ifdef CONFIG_PPC_PASEMI
257 udbg_flush = udbg_44x_as1_flush;
258 udbg_getc = udbg_44x_as1_getc;
259}
260#endif /* CONFIG_PPC_EARLY_DEBUG_44x */
261 232
262#ifdef CONFIG_PPC_EARLY_DEBUG_40x 233#define UDBG_UART_PAS_ADDR ((void __iomem *)0xfcff03f8UL)
263static void udbg_40x_real_flush(void) 234
235static u8 udbg_uart_in_pas(unsigned int reg)
264{ 236{
265 if (udbg_comport) { 237 return real_205_readb(UDBG_UART_PAS_ADDR + reg);
266 while ((real_readb(&udbg_comport->lsr) & LSR_THRE) == 0)
267 /* wait for idle */;
268 }
269} 238}
270 239
271static void udbg_40x_real_putc(char c) 240static void udbg_uart_out_pas(unsigned int reg, u8 val)
272{ 241{
273 if (udbg_comport) { 242 real_205_writeb(val, UDBG_UART_PAS_ADDR + reg);
274 if (c == '\n')
275 udbg_40x_real_putc('\r');
276 udbg_40x_real_flush();
277 real_writeb(c, &udbg_comport->thr); eieio();
278 }
279} 243}
280 244
281static int udbg_40x_real_getc(void) 245void __init udbg_init_pas_realmode(void)
282{ 246{
283 if (udbg_comport) { 247 udbg_uart_in = udbg_uart_in_pas;
284 while ((real_readb(&udbg_comport->lsr) & LSR_DR) == 0) 248 udbg_uart_out = udbg_uart_out_pas;
285 ; /* wait for char */ 249 udbg_use_uart();
286 return real_readb(&udbg_comport->rbr);
287 }
288 return -1;
289} 250}
290 251
291void __init udbg_init_40x_realmode(void) 252#endif /* CONFIG_PPC_PASEMI */
292{ 253
293 udbg_comport = (struct NS16550 __iomem *) 254#ifdef CONFIG_PPC_EARLY_DEBUG_44x
294 CONFIG_PPC_EARLY_DEBUG_40x_PHYSADDR;
295 255
296 udbg_putc = udbg_40x_real_putc; 256#include <platforms/44x/44x.h>
297 udbg_flush = udbg_40x_real_flush; 257
298 udbg_getc = udbg_40x_real_getc; 258static u8 udbg_uart_in_44x_as1(unsigned int reg)
299 udbg_getc_poll = NULL; 259{
260 return as1_readb((void __iomem *)PPC44x_EARLY_DEBUG_VIRTADDR + reg);
300} 261}
301#endif /* CONFIG_PPC_EARLY_DEBUG_40x */
302 262
303#ifdef CONFIG_PPC_EARLY_DEBUG_WSP 263static void udbg_uart_out_44x_as1(unsigned int reg, u8 val)
304static void udbg_wsp_flush(void)
305{ 264{
306 if (udbg_comport) { 265 as1_writeb(val, (void __iomem *)PPC44x_EARLY_DEBUG_VIRTADDR + reg);
307 while ((readb(&udbg_comport->lsr) & LSR_THRE) == 0)
308 /* wait for idle */;
309 }
310} 266}
311 267
312static void udbg_wsp_putc(char c) 268void __init udbg_init_44x_as1(void)
313{ 269{
314 if (udbg_comport) { 270 udbg_uart_in = udbg_uart_in_44x_as1;
315 if (c == '\n') 271 udbg_uart_out = udbg_uart_out_44x_as1;
316 udbg_wsp_putc('\r'); 272 udbg_use_uart();
317 udbg_wsp_flush();
318 writeb(c, &udbg_comport->thr); eieio();
319 }
320} 273}
321 274
322static int udbg_wsp_getc(void) 275#endif /* CONFIG_PPC_EARLY_DEBUG_44x */
276
277#ifdef CONFIG_PPC_EARLY_DEBUG_40x
278
279static u8 udbg_uart_in_40x(unsigned int reg)
323{ 280{
324 if (udbg_comport) { 281 return real_readb((void __iomem *)CONFIG_PPC_EARLY_DEBUG_40x_PHYSADDR
325 while ((readb(&udbg_comport->lsr) & LSR_DR) == 0) 282 + reg);
326 ; /* wait for char */
327 return readb(&udbg_comport->rbr);
328 }
329 return -1;
330} 283}
331 284
332static int udbg_wsp_getc_poll(void) 285static void udbg_uart_out_40x(unsigned int reg, u8 val)
333{ 286{
334 if (udbg_comport) 287 real_writeb(val, (void __iomem *)CONFIG_PPC_EARLY_DEBUG_40x_PHYSADDR
335 if (readb(&udbg_comport->lsr) & LSR_DR) 288 + reg);
336 return readb(&udbg_comport->rbr);
337 return -1;
338} 289}
339 290
340void __init udbg_init_wsp(void) 291void __init udbg_init_40x_realmode(void)
341{ 292{
342 udbg_comport = (struct NS16550 __iomem *)WSP_UART_VIRT; 293 udbg_uart_in = udbg_uart_in_40x;
294 udbg_uart_out = udbg_uart_out_40x;
295 udbg_use_uart();
296}
343 297
344 udbg_init_uart(udbg_comport, 57600, 50000000); 298#endif /* CONFIG_PPC_EARLY_DEBUG_40x */
299
300
301#ifdef CONFIG_PPC_EARLY_DEBUG_WSP
345 302
346 udbg_putc = udbg_wsp_putc; 303void __init udbg_init_wsp(void)
347 udbg_flush = udbg_wsp_flush; 304{
348 udbg_getc = udbg_wsp_getc; 305 udbg_uart_init_mmio((void *)WSP_UART_VIRT, 1);
349 udbg_getc_poll = udbg_wsp_getc_poll; 306 udbg_uart_setup(57600, 50000000);
350} 307}
308
351#endif /* CONFIG_PPC_EARLY_DEBUG_WSP */ 309#endif /* CONFIG_PPC_EARLY_DEBUG_WSP */
diff --git a/arch/powerpc/kernel/vdso32/gettimeofday.S b/arch/powerpc/kernel/vdso32/gettimeofday.S
index 27e2f623210b..6b1f2a6d5517 100644
--- a/arch/powerpc/kernel/vdso32/gettimeofday.S
+++ b/arch/powerpc/kernel/vdso32/gettimeofday.S
@@ -232,9 +232,9 @@ __do_get_tspec:
232 lwz r6,(CFG_TB_ORIG_STAMP+4)(r9) 232 lwz r6,(CFG_TB_ORIG_STAMP+4)(r9)
233 233
234 /* Get a stable TB value */ 234 /* Get a stable TB value */
2352: mftbu r3 2352: mfspr r3, SPRN_TBRU
236 mftbl r4 236 mfspr r4, SPRN_TBRL
237 mftbu r0 237 mfspr r0, SPRN_TBRU
238 cmplw cr0,r3,r0 238 cmplw cr0,r3,r0
239 bne- 2b 239 bne- 2b
240 240
diff --git a/arch/powerpc/kernel/vio.c b/arch/powerpc/kernel/vio.c
index 536016d792ba..78a350670de3 100644
--- a/arch/powerpc/kernel/vio.c
+++ b/arch/powerpc/kernel/vio.c
@@ -1153,7 +1153,7 @@ EXPORT_SYMBOL(vio_h_cop_sync);
1153 1153
1154static struct iommu_table *vio_build_iommu_table(struct vio_dev *dev) 1154static struct iommu_table *vio_build_iommu_table(struct vio_dev *dev)
1155{ 1155{
1156 const unsigned char *dma_window; 1156 const __be32 *dma_window;
1157 struct iommu_table *tbl; 1157 struct iommu_table *tbl;
1158 unsigned long offset, size; 1158 unsigned long offset, size;
1159 1159
@@ -1312,8 +1312,7 @@ struct vio_dev *vio_register_device_node(struct device_node *of_node)
1312{ 1312{
1313 struct vio_dev *viodev; 1313 struct vio_dev *viodev;
1314 struct device_node *parent_node; 1314 struct device_node *parent_node;
1315 const unsigned int *unit_address; 1315 const __be32 *prop;
1316 const unsigned int *pfo_resid = NULL;
1317 enum vio_dev_family family; 1316 enum vio_dev_family family;
1318 const char *of_node_name = of_node->name ? of_node->name : "<unknown>"; 1317 const char *of_node_name = of_node->name ? of_node->name : "<unknown>";
1319 1318
@@ -1360,6 +1359,8 @@ struct vio_dev *vio_register_device_node(struct device_node *of_node)
1360 /* we need the 'device_type' property, in order to match with drivers */ 1359 /* we need the 'device_type' property, in order to match with drivers */
1361 viodev->family = family; 1360 viodev->family = family;
1362 if (viodev->family == VDEVICE) { 1361 if (viodev->family == VDEVICE) {
1362 unsigned int unit_address;
1363
1363 if (of_node->type != NULL) 1364 if (of_node->type != NULL)
1364 viodev->type = of_node->type; 1365 viodev->type = of_node->type;
1365 else { 1366 else {
@@ -1368,24 +1369,24 @@ struct vio_dev *vio_register_device_node(struct device_node *of_node)
1368 goto out; 1369 goto out;
1369 } 1370 }
1370 1371
1371 unit_address = of_get_property(of_node, "reg", NULL); 1372 prop = of_get_property(of_node, "reg", NULL);
1372 if (unit_address == NULL) { 1373 if (prop == NULL) {
1373 pr_warn("%s: node %s missing 'reg'\n", 1374 pr_warn("%s: node %s missing 'reg'\n",
1374 __func__, of_node_name); 1375 __func__, of_node_name);
1375 goto out; 1376 goto out;
1376 } 1377 }
1377 dev_set_name(&viodev->dev, "%x", *unit_address); 1378 unit_address = of_read_number(prop, 1);
1379 dev_set_name(&viodev->dev, "%x", unit_address);
1378 viodev->irq = irq_of_parse_and_map(of_node, 0); 1380 viodev->irq = irq_of_parse_and_map(of_node, 0);
1379 viodev->unit_address = *unit_address; 1381 viodev->unit_address = unit_address;
1380 } else { 1382 } else {
1381 /* PFO devices need their resource_id for submitting COP_OPs 1383 /* PFO devices need their resource_id for submitting COP_OPs
1382 * This is an optional field for devices, but is required when 1384 * This is an optional field for devices, but is required when
1383 * performing synchronous ops */ 1385 * performing synchronous ops */
1384 pfo_resid = of_get_property(of_node, "ibm,resource-id", NULL); 1386 prop = of_get_property(of_node, "ibm,resource-id", NULL);
1385 if (pfo_resid != NULL) 1387 if (prop != NULL)
1386 viodev->resource_id = *pfo_resid; 1388 viodev->resource_id = of_read_number(prop, 1);
1387 1389
1388 unit_address = NULL;
1389 dev_set_name(&viodev->dev, "%s", of_node_name); 1390 dev_set_name(&viodev->dev, "%s", of_node_name);
1390 viodev->type = of_node_name; 1391 viodev->type = of_node_name;
1391 viodev->irq = 0; 1392 viodev->irq = 0;
@@ -1622,7 +1623,6 @@ static struct vio_dev *vio_find_name(const char *name)
1622 */ 1623 */
1623struct vio_dev *vio_find_node(struct device_node *vnode) 1624struct vio_dev *vio_find_node(struct device_node *vnode)
1624{ 1625{
1625 const uint32_t *unit_address;
1626 char kobj_name[20]; 1626 char kobj_name[20];
1627 struct device_node *vnode_parent; 1627 struct device_node *vnode_parent;
1628 const char *dev_type; 1628 const char *dev_type;
@@ -1638,10 +1638,13 @@ struct vio_dev *vio_find_node(struct device_node *vnode)
1638 1638
1639 /* construct the kobject name from the device node */ 1639 /* construct the kobject name from the device node */
1640 if (!strcmp(dev_type, "vdevice")) { 1640 if (!strcmp(dev_type, "vdevice")) {
1641 unit_address = of_get_property(vnode, "reg", NULL); 1641 const __be32 *prop;
1642 if (!unit_address) 1642
1643 prop = of_get_property(vnode, "reg", NULL);
1644 if (!prop)
1643 return NULL; 1645 return NULL;
1644 snprintf(kobj_name, sizeof(kobj_name), "%x", *unit_address); 1646 snprintf(kobj_name, sizeof(kobj_name), "%x",
1647 (uint32_t)of_read_number(prop, 1));
1645 } else if (!strcmp(dev_type, "ibm,platform-facilities")) 1648 } else if (!strcmp(dev_type, "ibm,platform-facilities"))
1646 snprintf(kobj_name, sizeof(kobj_name), "%s", vnode->name); 1649 snprintf(kobj_name, sizeof(kobj_name), "%s", vnode->name);
1647 else 1650 else
diff --git a/arch/powerpc/kvm/Kconfig b/arch/powerpc/kvm/Kconfig
index eb643f862579..ffaef2cb101a 100644
--- a/arch/powerpc/kvm/Kconfig
+++ b/arch/powerpc/kvm/Kconfig
@@ -72,6 +72,7 @@ config KVM_BOOK3S_64_HV
72 bool "KVM support for POWER7 and PPC970 using hypervisor mode in host" 72 bool "KVM support for POWER7 and PPC970 using hypervisor mode in host"
73 depends on KVM_BOOK3S_64 73 depends on KVM_BOOK3S_64
74 select MMU_NOTIFIER 74 select MMU_NOTIFIER
75 select CMA
75 ---help--- 76 ---help---
76 Support running unmodified book3s_64 guest kernels in 77 Support running unmodified book3s_64 guest kernels in
77 virtual machines on POWER7 and PPC970 processors that have 78 virtual machines on POWER7 and PPC970 processors that have
diff --git a/arch/powerpc/kvm/Makefile b/arch/powerpc/kvm/Makefile
index 008cd856c5b5..6646c952c5e3 100644
--- a/arch/powerpc/kvm/Makefile
+++ b/arch/powerpc/kvm/Makefile
@@ -81,6 +81,7 @@ kvm-book3s_64-builtin-objs-$(CONFIG_KVM_BOOK3S_64_HV) := \
81 book3s_64_vio_hv.o \ 81 book3s_64_vio_hv.o \
82 book3s_hv_ras.o \ 82 book3s_hv_ras.o \
83 book3s_hv_builtin.o \ 83 book3s_hv_builtin.o \
84 book3s_hv_cma.o \
84 $(kvm-book3s_64-builtin-xics-objs-y) 85 $(kvm-book3s_64-builtin-xics-objs-y)
85 86
86kvm-book3s_64-objs-$(CONFIG_KVM_XICS) += \ 87kvm-book3s_64-objs-$(CONFIG_KVM_XICS) += \
diff --git a/arch/powerpc/kvm/book3s_64_mmu.c b/arch/powerpc/kvm/book3s_64_mmu.c
index 739bfbadb85e..7e345e00661a 100644
--- a/arch/powerpc/kvm/book3s_64_mmu.c
+++ b/arch/powerpc/kvm/book3s_64_mmu.c
@@ -182,10 +182,13 @@ static int kvmppc_mmu_book3s_64_xlate(struct kvm_vcpu *vcpu, gva_t eaddr,
182 hva_t ptegp; 182 hva_t ptegp;
183 u64 pteg[16]; 183 u64 pteg[16];
184 u64 avpn = 0; 184 u64 avpn = 0;
185 u64 v, r;
186 u64 v_val, v_mask;
187 u64 eaddr_mask;
185 int i; 188 int i;
186 u8 key = 0; 189 u8 pp, key = 0;
187 bool found = false; 190 bool found = false;
188 int second = 0; 191 bool second = false;
189 ulong mp_ea = vcpu->arch.magic_page_ea; 192 ulong mp_ea = vcpu->arch.magic_page_ea;
190 193
191 /* Magic page override */ 194 /* Magic page override */
@@ -208,8 +211,16 @@ static int kvmppc_mmu_book3s_64_xlate(struct kvm_vcpu *vcpu, gva_t eaddr,
208 goto no_seg_found; 211 goto no_seg_found;
209 212
210 avpn = kvmppc_mmu_book3s_64_get_avpn(slbe, eaddr); 213 avpn = kvmppc_mmu_book3s_64_get_avpn(slbe, eaddr);
214 v_val = avpn & HPTE_V_AVPN;
215
211 if (slbe->tb) 216 if (slbe->tb)
212 avpn |= SLB_VSID_B_1T; 217 v_val |= SLB_VSID_B_1T;
218 if (slbe->large)
219 v_val |= HPTE_V_LARGE;
220 v_val |= HPTE_V_VALID;
221
222 v_mask = SLB_VSID_B | HPTE_V_AVPN | HPTE_V_LARGE | HPTE_V_VALID |
223 HPTE_V_SECONDARY;
213 224
214do_second: 225do_second:
215 ptegp = kvmppc_mmu_book3s_64_get_pteg(vcpu_book3s, slbe, eaddr, second); 226 ptegp = kvmppc_mmu_book3s_64_get_pteg(vcpu_book3s, slbe, eaddr, second);
@@ -227,91 +238,74 @@ do_second:
227 key = 4; 238 key = 4;
228 239
229 for (i=0; i<16; i+=2) { 240 for (i=0; i<16; i+=2) {
230 u64 v = pteg[i]; 241 /* Check all relevant fields of 1st dword */
231 u64 r = pteg[i+1]; 242 if ((pteg[i] & v_mask) == v_val) {
232
233 /* Valid check */
234 if (!(v & HPTE_V_VALID))
235 continue;
236 /* Hash check */
237 if ((v & HPTE_V_SECONDARY) != second)
238 continue;
239
240 /* AVPN compare */
241 if (HPTE_V_COMPARE(avpn, v)) {
242 u8 pp = (r & HPTE_R_PP) | key;
243 int eaddr_mask = 0xFFF;
244
245 gpte->eaddr = eaddr;
246 gpte->vpage = kvmppc_mmu_book3s_64_ea_to_vp(vcpu,
247 eaddr,
248 data);
249 if (slbe->large)
250 eaddr_mask = 0xFFFFFF;
251 gpte->raddr = (r & HPTE_R_RPN) | (eaddr & eaddr_mask);
252 gpte->may_execute = ((r & HPTE_R_N) ? false : true);
253 gpte->may_read = false;
254 gpte->may_write = false;
255
256 switch (pp) {
257 case 0:
258 case 1:
259 case 2:
260 case 6:
261 gpte->may_write = true;
262 /* fall through */
263 case 3:
264 case 5:
265 case 7:
266 gpte->may_read = true;
267 break;
268 }
269
270 dprintk("KVM MMU: Translated 0x%lx [0x%llx] -> 0x%llx "
271 "-> 0x%lx\n",
272 eaddr, avpn, gpte->vpage, gpte->raddr);
273 found = true; 243 found = true;
274 break; 244 break;
275 } 245 }
276 } 246 }
277 247
278 /* Update PTE R and C bits, so the guest's swapper knows we used the 248 if (!found) {
279 * page */ 249 if (second)
280 if (found) { 250 goto no_page_found;
281 u32 oldr = pteg[i+1]; 251 v_val |= HPTE_V_SECONDARY;
252 second = true;
253 goto do_second;
254 }
282 255
283 if (gpte->may_read) { 256 v = pteg[i];
284 /* Set the accessed flag */ 257 r = pteg[i+1];
285 pteg[i+1] |= HPTE_R_R; 258 pp = (r & HPTE_R_PP) | key;
286 } 259 eaddr_mask = 0xFFF;
287 if (gpte->may_write) { 260
288 /* Set the dirty flag */ 261 gpte->eaddr = eaddr;
289 pteg[i+1] |= HPTE_R_C; 262 gpte->vpage = kvmppc_mmu_book3s_64_ea_to_vp(vcpu, eaddr, data);
290 } else { 263 if (slbe->large)
291 dprintk("KVM: Mapping read-only page!\n"); 264 eaddr_mask = 0xFFFFFF;
292 } 265 gpte->raddr = (r & HPTE_R_RPN & ~eaddr_mask) | (eaddr & eaddr_mask);
266 gpte->may_execute = ((r & HPTE_R_N) ? false : true);
267 gpte->may_read = false;
268 gpte->may_write = false;
269
270 switch (pp) {
271 case 0:
272 case 1:
273 case 2:
274 case 6:
275 gpte->may_write = true;
276 /* fall through */
277 case 3:
278 case 5:
279 case 7:
280 gpte->may_read = true;
281 break;
282 }
293 283
294 /* Write back into the PTEG */ 284 dprintk("KVM MMU: Translated 0x%lx [0x%llx] -> 0x%llx "
295 if (pteg[i+1] != oldr) 285 "-> 0x%lx\n",
296 copy_to_user((void __user *)ptegp, pteg, sizeof(pteg)); 286 eaddr, avpn, gpte->vpage, gpte->raddr);
297 287
298 if (!gpte->may_read) 288 /* Update PTE R and C bits, so the guest's swapper knows we used the
299 return -EPERM; 289 * page */
300 return 0; 290 if (gpte->may_read) {
301 } else { 291 /* Set the accessed flag */
302 dprintk("KVM MMU: No PTE found (ea=0x%lx sdr1=0x%llx " 292 r |= HPTE_R_R;
303 "ptegp=0x%lx)\n", 293 }
304 eaddr, to_book3s(vcpu)->sdr1, ptegp); 294 if (data && gpte->may_write) {
305 for (i = 0; i < 16; i += 2) 295 /* Set the dirty flag -- XXX even if not writing */
306 dprintk(" %02d: 0x%llx - 0x%llx (0x%llx)\n", 296 r |= HPTE_R_C;
307 i, pteg[i], pteg[i+1], avpn); 297 }
308 298
309 if (!second) { 299 /* Write back into the PTEG */
310 second = HPTE_V_SECONDARY; 300 if (pteg[i+1] != r) {
311 goto do_second; 301 pteg[i+1] = r;
312 } 302 copy_to_user((void __user *)ptegp, pteg, sizeof(pteg));
313 } 303 }
314 304
305 if (!gpte->may_read)
306 return -EPERM;
307 return 0;
308
315no_page_found: 309no_page_found:
316 return -ENOENT; 310 return -ENOENT;
317 311
diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c
index 710d31317d81..043eec8461e7 100644
--- a/arch/powerpc/kvm/book3s_64_mmu_hv.c
+++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c
@@ -37,6 +37,8 @@
37#include <asm/ppc-opcode.h> 37#include <asm/ppc-opcode.h>
38#include <asm/cputable.h> 38#include <asm/cputable.h>
39 39
40#include "book3s_hv_cma.h"
41
40/* POWER7 has 10-bit LPIDs, PPC970 has 6-bit LPIDs */ 42/* POWER7 has 10-bit LPIDs, PPC970 has 6-bit LPIDs */
41#define MAX_LPID_970 63 43#define MAX_LPID_970 63
42 44
@@ -52,8 +54,8 @@ long kvmppc_alloc_hpt(struct kvm *kvm, u32 *htab_orderp)
52{ 54{
53 unsigned long hpt; 55 unsigned long hpt;
54 struct revmap_entry *rev; 56 struct revmap_entry *rev;
55 struct kvmppc_linear_info *li; 57 struct page *page = NULL;
56 long order = kvm_hpt_order; 58 long order = KVM_DEFAULT_HPT_ORDER;
57 59
58 if (htab_orderp) { 60 if (htab_orderp) {
59 order = *htab_orderp; 61 order = *htab_orderp;
@@ -61,26 +63,23 @@ long kvmppc_alloc_hpt(struct kvm *kvm, u32 *htab_orderp)
61 order = PPC_MIN_HPT_ORDER; 63 order = PPC_MIN_HPT_ORDER;
62 } 64 }
63 65
66 kvm->arch.hpt_cma_alloc = 0;
64 /* 67 /*
65 * If the user wants a different size from default,
66 * try first to allocate it from the kernel page allocator. 68 * try first to allocate it from the kernel page allocator.
69 * We keep the CMA reserved for failed allocation.
67 */ 70 */
68 hpt = 0; 71 hpt = __get_free_pages(GFP_KERNEL | __GFP_ZERO | __GFP_REPEAT |
69 if (order != kvm_hpt_order) { 72 __GFP_NOWARN, order - PAGE_SHIFT);
70 hpt = __get_free_pages(GFP_KERNEL|__GFP_ZERO|__GFP_REPEAT|
71 __GFP_NOWARN, order - PAGE_SHIFT);
72 if (!hpt)
73 --order;
74 }
75 73
76 /* Next try to allocate from the preallocated pool */ 74 /* Next try to allocate from the preallocated pool */
77 if (!hpt) { 75 if (!hpt) {
78 li = kvm_alloc_hpt(); 76 VM_BUG_ON(order < KVM_CMA_CHUNK_ORDER);
79 if (li) { 77 page = kvm_alloc_hpt(1 << (order - PAGE_SHIFT));
80 hpt = (ulong)li->base_virt; 78 if (page) {
81 kvm->arch.hpt_li = li; 79 hpt = (unsigned long)pfn_to_kaddr(page_to_pfn(page));
82 order = kvm_hpt_order; 80 kvm->arch.hpt_cma_alloc = 1;
83 } 81 } else
82 --order;
84 } 83 }
85 84
86 /* Lastly try successively smaller sizes from the page allocator */ 85 /* Lastly try successively smaller sizes from the page allocator */
@@ -118,8 +117,8 @@ long kvmppc_alloc_hpt(struct kvm *kvm, u32 *htab_orderp)
118 return 0; 117 return 0;
119 118
120 out_freehpt: 119 out_freehpt:
121 if (kvm->arch.hpt_li) 120 if (kvm->arch.hpt_cma_alloc)
122 kvm_release_hpt(kvm->arch.hpt_li); 121 kvm_release_hpt(page, 1 << (order - PAGE_SHIFT));
123 else 122 else
124 free_pages(hpt, order - PAGE_SHIFT); 123 free_pages(hpt, order - PAGE_SHIFT);
125 return -ENOMEM; 124 return -ENOMEM;
@@ -165,8 +164,9 @@ void kvmppc_free_hpt(struct kvm *kvm)
165{ 164{
166 kvmppc_free_lpid(kvm->arch.lpid); 165 kvmppc_free_lpid(kvm->arch.lpid);
167 vfree(kvm->arch.revmap); 166 vfree(kvm->arch.revmap);
168 if (kvm->arch.hpt_li) 167 if (kvm->arch.hpt_cma_alloc)
169 kvm_release_hpt(kvm->arch.hpt_li); 168 kvm_release_hpt(virt_to_page(kvm->arch.hpt_virt),
169 1 << (kvm->arch.hpt_order - PAGE_SHIFT));
170 else 170 else
171 free_pages(kvm->arch.hpt_virt, 171 free_pages(kvm->arch.hpt_virt,
172 kvm->arch.hpt_order - PAGE_SHIFT); 172 kvm->arch.hpt_order - PAGE_SHIFT);
@@ -1579,7 +1579,7 @@ int kvm_vm_ioctl_get_htab_fd(struct kvm *kvm, struct kvm_get_htab_fd *ghf)
1579 ctx->first_pass = 1; 1579 ctx->first_pass = 1;
1580 1580
1581 rwflag = (ghf->flags & KVM_GET_HTAB_WRITE) ? O_WRONLY : O_RDONLY; 1581 rwflag = (ghf->flags & KVM_GET_HTAB_WRITE) ? O_WRONLY : O_RDONLY;
1582 ret = anon_inode_getfd("kvm-htab", &kvm_htab_fops, ctx, rwflag); 1582 ret = anon_inode_getfd("kvm-htab", &kvm_htab_fops, ctx, rwflag | O_CLOEXEC);
1583 if (ret < 0) { 1583 if (ret < 0) {
1584 kvm_put_kvm(kvm); 1584 kvm_put_kvm(kvm);
1585 return ret; 1585 return ret;
diff --git a/arch/powerpc/kvm/book3s_64_slb.S b/arch/powerpc/kvm/book3s_64_slb.S
index 4f0caecc0f9d..4f12e8f0c718 100644
--- a/arch/powerpc/kvm/book3s_64_slb.S
+++ b/arch/powerpc/kvm/book3s_64_slb.S
@@ -17,6 +17,10 @@
17 * Authors: Alexander Graf <agraf@suse.de> 17 * Authors: Alexander Graf <agraf@suse.de>
18 */ 18 */
19 19
20#ifdef __LITTLE_ENDIAN__
21#error Need to fix SLB shadow accesses in little endian mode
22#endif
23
20#define SHADOW_SLB_ESID(num) (SLBSHADOW_SAVEAREA + (num * 0x10)) 24#define SHADOW_SLB_ESID(num) (SLBSHADOW_SAVEAREA + (num * 0x10))
21#define SHADOW_SLB_VSID(num) (SLBSHADOW_SAVEAREA + (num * 0x10) + 0x8) 25#define SHADOW_SLB_VSID(num) (SLBSHADOW_SAVEAREA + (num * 0x10) + 0x8)
22#define UNBOLT_SLB_ENTRY(num) \ 26#define UNBOLT_SLB_ENTRY(num) \
diff --git a/arch/powerpc/kvm/book3s_64_vio.c b/arch/powerpc/kvm/book3s_64_vio.c
index b2d3f3b2de72..54cf9bc94dad 100644
--- a/arch/powerpc/kvm/book3s_64_vio.c
+++ b/arch/powerpc/kvm/book3s_64_vio.c
@@ -136,7 +136,7 @@ long kvm_vm_ioctl_create_spapr_tce(struct kvm *kvm,
136 mutex_unlock(&kvm->lock); 136 mutex_unlock(&kvm->lock);
137 137
138 return anon_inode_getfd("kvm-spapr-tce", &kvm_spapr_tce_fops, 138 return anon_inode_getfd("kvm-spapr-tce", &kvm_spapr_tce_fops,
139 stt, O_RDWR); 139 stt, O_RDWR | O_CLOEXEC);
140 140
141fail: 141fail:
142 if (stt) { 142 if (stt) {
diff --git a/arch/powerpc/kvm/book3s_emulate.c b/arch/powerpc/kvm/book3s_emulate.c
index 1f6344c4408d..360ce68c9809 100644
--- a/arch/powerpc/kvm/book3s_emulate.c
+++ b/arch/powerpc/kvm/book3s_emulate.c
@@ -458,6 +458,7 @@ int kvmppc_core_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, ulong spr_val)
458 case SPRN_PMC4_GEKKO: 458 case SPRN_PMC4_GEKKO:
459 case SPRN_WPAR_GEKKO: 459 case SPRN_WPAR_GEKKO:
460 case SPRN_MSSSR0: 460 case SPRN_MSSSR0:
461 case SPRN_DABR:
461 break; 462 break;
462unprivileged: 463unprivileged:
463 default: 464 default:
@@ -555,6 +556,7 @@ int kvmppc_core_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val)
555 case SPRN_PMC4_GEKKO: 556 case SPRN_PMC4_GEKKO:
556 case SPRN_WPAR_GEKKO: 557 case SPRN_WPAR_GEKKO:
557 case SPRN_MSSSR0: 558 case SPRN_MSSSR0:
559 case SPRN_DABR:
558 *spr_val = 0; 560 *spr_val = 0;
559 break; 561 break;
560 default: 562 default:
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c
index 7629cd3eb91a..62a2b5ab08ed 100644
--- a/arch/powerpc/kvm/book3s_hv.c
+++ b/arch/powerpc/kvm/book3s_hv.c
@@ -217,7 +217,7 @@ struct kvm_vcpu *kvmppc_find_vcpu(struct kvm *kvm, int id)
217 217
218static void init_vpa(struct kvm_vcpu *vcpu, struct lppaca *vpa) 218static void init_vpa(struct kvm_vcpu *vcpu, struct lppaca *vpa)
219{ 219{
220 vpa->shared_proc = 1; 220 vpa->__old_status |= LPPACA_OLD_SHARED_PROC;
221 vpa->yield_count = 1; 221 vpa->yield_count = 1;
222} 222}
223 223
@@ -680,13 +680,12 @@ static int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
680} 680}
681 681
682int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu, 682int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,
683 struct kvm_sregs *sregs) 683 struct kvm_sregs *sregs)
684{ 684{
685 int i; 685 int i;
686 686
687 sregs->pvr = vcpu->arch.pvr;
688
689 memset(sregs, 0, sizeof(struct kvm_sregs)); 687 memset(sregs, 0, sizeof(struct kvm_sregs));
688 sregs->pvr = vcpu->arch.pvr;
690 for (i = 0; i < vcpu->arch.slb_max; i++) { 689 for (i = 0; i < vcpu->arch.slb_max; i++) {
691 sregs->u.s.ppc64.slb[i].slbe = vcpu->arch.slb[i].orige; 690 sregs->u.s.ppc64.slb[i].slbe = vcpu->arch.slb[i].orige;
692 sregs->u.s.ppc64.slb[i].slbv = vcpu->arch.slb[i].origv; 691 sregs->u.s.ppc64.slb[i].slbv = vcpu->arch.slb[i].origv;
@@ -696,7 +695,7 @@ int kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,
696} 695}
697 696
698int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, 697int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
699 struct kvm_sregs *sregs) 698 struct kvm_sregs *sregs)
700{ 699{
701 int i, j; 700 int i, j;
702 701
@@ -1511,10 +1510,10 @@ static inline int lpcr_rmls(unsigned long rma_size)
1511 1510
1512static int kvm_rma_fault(struct vm_area_struct *vma, struct vm_fault *vmf) 1511static int kvm_rma_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
1513{ 1512{
1514 struct kvmppc_linear_info *ri = vma->vm_file->private_data;
1515 struct page *page; 1513 struct page *page;
1514 struct kvm_rma_info *ri = vma->vm_file->private_data;
1516 1515
1517 if (vmf->pgoff >= ri->npages) 1516 if (vmf->pgoff >= kvm_rma_pages)
1518 return VM_FAULT_SIGBUS; 1517 return VM_FAULT_SIGBUS;
1519 1518
1520 page = pfn_to_page(ri->base_pfn + vmf->pgoff); 1519 page = pfn_to_page(ri->base_pfn + vmf->pgoff);
@@ -1536,7 +1535,7 @@ static int kvm_rma_mmap(struct file *file, struct vm_area_struct *vma)
1536 1535
1537static int kvm_rma_release(struct inode *inode, struct file *filp) 1536static int kvm_rma_release(struct inode *inode, struct file *filp)
1538{ 1537{
1539 struct kvmppc_linear_info *ri = filp->private_data; 1538 struct kvm_rma_info *ri = filp->private_data;
1540 1539
1541 kvm_release_rma(ri); 1540 kvm_release_rma(ri);
1542 return 0; 1541 return 0;
@@ -1549,18 +1548,27 @@ static const struct file_operations kvm_rma_fops = {
1549 1548
1550long kvm_vm_ioctl_allocate_rma(struct kvm *kvm, struct kvm_allocate_rma *ret) 1549long kvm_vm_ioctl_allocate_rma(struct kvm *kvm, struct kvm_allocate_rma *ret)
1551{ 1550{
1552 struct kvmppc_linear_info *ri;
1553 long fd; 1551 long fd;
1552 struct kvm_rma_info *ri;
1553 /*
1554 * Only do this on PPC970 in HV mode
1555 */
1556 if (!cpu_has_feature(CPU_FTR_HVMODE) ||
1557 !cpu_has_feature(CPU_FTR_ARCH_201))
1558 return -EINVAL;
1559
1560 if (!kvm_rma_pages)
1561 return -EINVAL;
1554 1562
1555 ri = kvm_alloc_rma(); 1563 ri = kvm_alloc_rma();
1556 if (!ri) 1564 if (!ri)
1557 return -ENOMEM; 1565 return -ENOMEM;
1558 1566
1559 fd = anon_inode_getfd("kvm-rma", &kvm_rma_fops, ri, O_RDWR); 1567 fd = anon_inode_getfd("kvm-rma", &kvm_rma_fops, ri, O_RDWR | O_CLOEXEC);
1560 if (fd < 0) 1568 if (fd < 0)
1561 kvm_release_rma(ri); 1569 kvm_release_rma(ri);
1562 1570
1563 ret->rma_size = ri->npages << PAGE_SHIFT; 1571 ret->rma_size = kvm_rma_pages << PAGE_SHIFT;
1564 return fd; 1572 return fd;
1565} 1573}
1566 1574
@@ -1725,7 +1733,7 @@ static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu)
1725{ 1733{
1726 int err = 0; 1734 int err = 0;
1727 struct kvm *kvm = vcpu->kvm; 1735 struct kvm *kvm = vcpu->kvm;
1728 struct kvmppc_linear_info *ri = NULL; 1736 struct kvm_rma_info *ri = NULL;
1729 unsigned long hva; 1737 unsigned long hva;
1730 struct kvm_memory_slot *memslot; 1738 struct kvm_memory_slot *memslot;
1731 struct vm_area_struct *vma; 1739 struct vm_area_struct *vma;
@@ -1803,7 +1811,7 @@ static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu)
1803 1811
1804 } else { 1812 } else {
1805 /* Set up to use an RMO region */ 1813 /* Set up to use an RMO region */
1806 rma_size = ri->npages; 1814 rma_size = kvm_rma_pages;
1807 if (rma_size > memslot->npages) 1815 if (rma_size > memslot->npages)
1808 rma_size = memslot->npages; 1816 rma_size = memslot->npages;
1809 rma_size <<= PAGE_SHIFT; 1817 rma_size <<= PAGE_SHIFT;
@@ -1831,14 +1839,14 @@ static int kvmppc_hv_setup_htab_rma(struct kvm_vcpu *vcpu)
1831 /* POWER7 */ 1839 /* POWER7 */
1832 lpcr &= ~(LPCR_VPM0 | LPCR_VRMA_L); 1840 lpcr &= ~(LPCR_VPM0 | LPCR_VRMA_L);
1833 lpcr |= rmls << LPCR_RMLS_SH; 1841 lpcr |= rmls << LPCR_RMLS_SH;
1834 kvm->arch.rmor = kvm->arch.rma->base_pfn << PAGE_SHIFT; 1842 kvm->arch.rmor = ri->base_pfn << PAGE_SHIFT;
1835 } 1843 }
1836 kvm->arch.lpcr = lpcr; 1844 kvm->arch.lpcr = lpcr;
1837 pr_info("KVM: Using RMO at %lx size %lx (LPCR = %lx)\n", 1845 pr_info("KVM: Using RMO at %lx size %lx (LPCR = %lx)\n",
1838 ri->base_pfn << PAGE_SHIFT, rma_size, lpcr); 1846 ri->base_pfn << PAGE_SHIFT, rma_size, lpcr);
1839 1847
1840 /* Initialize phys addrs of pages in RMO */ 1848 /* Initialize phys addrs of pages in RMO */
1841 npages = ri->npages; 1849 npages = kvm_rma_pages;
1842 porder = __ilog2(npages); 1850 porder = __ilog2(npages);
1843 physp = memslot->arch.slot_phys; 1851 physp = memslot->arch.slot_phys;
1844 if (physp) { 1852 if (physp) {
diff --git a/arch/powerpc/kvm/book3s_hv_builtin.c b/arch/powerpc/kvm/book3s_hv_builtin.c
index ec0a9e5de100..8cd0daebb82d 100644
--- a/arch/powerpc/kvm/book3s_hv_builtin.c
+++ b/arch/powerpc/kvm/book3s_hv_builtin.c
@@ -13,33 +13,34 @@
13#include <linux/spinlock.h> 13#include <linux/spinlock.h>
14#include <linux/bootmem.h> 14#include <linux/bootmem.h>
15#include <linux/init.h> 15#include <linux/init.h>
16#include <linux/memblock.h>
17#include <linux/sizes.h>
16 18
17#include <asm/cputable.h> 19#include <asm/cputable.h>
18#include <asm/kvm_ppc.h> 20#include <asm/kvm_ppc.h>
19#include <asm/kvm_book3s.h> 21#include <asm/kvm_book3s.h>
20 22
21#define KVM_LINEAR_RMA 0 23#include "book3s_hv_cma.h"
22#define KVM_LINEAR_HPT 1 24/*
23 25 * Hash page table alignment on newer cpus(CPU_FTR_ARCH_206)
24static void __init kvm_linear_init_one(ulong size, int count, int type); 26 * should be power of 2.
25static struct kvmppc_linear_info *kvm_alloc_linear(int type); 27 */
26static void kvm_release_linear(struct kvmppc_linear_info *ri); 28#define HPT_ALIGN_PAGES ((1 << 18) >> PAGE_SHIFT) /* 256k */
27 29/*
28int kvm_hpt_order = KVM_DEFAULT_HPT_ORDER; 30 * By default we reserve 5% of memory for hash pagetable allocation.
29EXPORT_SYMBOL_GPL(kvm_hpt_order); 31 */
30 32static unsigned long kvm_cma_resv_ratio = 5;
31/*************** RMA *************/
32
33/* 33/*
34 * This maintains a list of RMAs (real mode areas) for KVM guests to use. 34 * We allocate RMAs (real mode areas) for KVM guests from the KVM CMA area.
35 * Each RMA has to be physically contiguous and of a size that the 35 * Each RMA has to be physically contiguous and of a size that the
36 * hardware supports. PPC970 and POWER7 support 64MB, 128MB and 256MB, 36 * hardware supports. PPC970 and POWER7 support 64MB, 128MB and 256MB,
37 * and other larger sizes. Since we are unlikely to be allocate that 37 * and other larger sizes. Since we are unlikely to be allocate that
38 * much physically contiguous memory after the system is up and running, 38 * much physically contiguous memory after the system is up and running,
39 * we preallocate a set of RMAs in early boot for KVM to use. 39 * we preallocate a set of RMAs in early boot using CMA.
40 * should be power of 2.
40 */ 41 */
41static unsigned long kvm_rma_size = 64 << 20; /* 64MB */ 42unsigned long kvm_rma_pages = (1 << 27) >> PAGE_SHIFT; /* 128MB */
42static unsigned long kvm_rma_count; 43EXPORT_SYMBOL_GPL(kvm_rma_pages);
43 44
44/* Work out RMLS (real mode limit selector) field value for a given RMA size. 45/* Work out RMLS (real mode limit selector) field value for a given RMA size.
45 Assumes POWER7 or PPC970. */ 46 Assumes POWER7 or PPC970. */
@@ -69,165 +70,114 @@ static inline int lpcr_rmls(unsigned long rma_size)
69 70
70static int __init early_parse_rma_size(char *p) 71static int __init early_parse_rma_size(char *p)
71{ 72{
72 if (!p) 73 unsigned long kvm_rma_size;
73 return 1;
74 74
75 pr_debug("%s(%s)\n", __func__, p);
76 if (!p)
77 return -EINVAL;
75 kvm_rma_size = memparse(p, &p); 78 kvm_rma_size = memparse(p, &p);
76 79 /*
80 * Check that the requested size is one supported in hardware
81 */
82 if (lpcr_rmls(kvm_rma_size) < 0) {
83 pr_err("RMA size of 0x%lx not supported\n", kvm_rma_size);
84 return -EINVAL;
85 }
86 kvm_rma_pages = kvm_rma_size >> PAGE_SHIFT;
77 return 0; 87 return 0;
78} 88}
79early_param("kvm_rma_size", early_parse_rma_size); 89early_param("kvm_rma_size", early_parse_rma_size);
80 90
81static int __init early_parse_rma_count(char *p) 91struct kvm_rma_info *kvm_alloc_rma()
82{ 92{
83 if (!p) 93 struct page *page;
84 return 1; 94 struct kvm_rma_info *ri;
85 95
86 kvm_rma_count = simple_strtoul(p, NULL, 0); 96 ri = kmalloc(sizeof(struct kvm_rma_info), GFP_KERNEL);
87 97 if (!ri)
88 return 0; 98 return NULL;
89} 99 page = kvm_alloc_cma(kvm_rma_pages, kvm_rma_pages);
90early_param("kvm_rma_count", early_parse_rma_count); 100 if (!page)
91 101 goto err_out;
92struct kvmppc_linear_info *kvm_alloc_rma(void) 102 atomic_set(&ri->use_count, 1);
93{ 103 ri->base_pfn = page_to_pfn(page);
94 return kvm_alloc_linear(KVM_LINEAR_RMA); 104 return ri;
105err_out:
106 kfree(ri);
107 return NULL;
95} 108}
96EXPORT_SYMBOL_GPL(kvm_alloc_rma); 109EXPORT_SYMBOL_GPL(kvm_alloc_rma);
97 110
98void kvm_release_rma(struct kvmppc_linear_info *ri) 111void kvm_release_rma(struct kvm_rma_info *ri)
99{ 112{
100 kvm_release_linear(ri); 113 if (atomic_dec_and_test(&ri->use_count)) {
114 kvm_release_cma(pfn_to_page(ri->base_pfn), kvm_rma_pages);
115 kfree(ri);
116 }
101} 117}
102EXPORT_SYMBOL_GPL(kvm_release_rma); 118EXPORT_SYMBOL_GPL(kvm_release_rma);
103 119
104/*************** HPT *************/ 120static int __init early_parse_kvm_cma_resv(char *p)
105
106/*
107 * This maintains a list of big linear HPT tables that contain the GVA->HPA
108 * memory mappings. If we don't reserve those early on, we might not be able
109 * to get a big (usually 16MB) linear memory region from the kernel anymore.
110 */
111
112static unsigned long kvm_hpt_count;
113
114static int __init early_parse_hpt_count(char *p)
115{ 121{
122 pr_debug("%s(%s)\n", __func__, p);
116 if (!p) 123 if (!p)
117 return 1; 124 return -EINVAL;
118 125 return kstrtoul(p, 0, &kvm_cma_resv_ratio);
119 kvm_hpt_count = simple_strtoul(p, NULL, 0);
120
121 return 0;
122} 126}
123early_param("kvm_hpt_count", early_parse_hpt_count); 127early_param("kvm_cma_resv_ratio", early_parse_kvm_cma_resv);
124 128
125struct kvmppc_linear_info *kvm_alloc_hpt(void) 129struct page *kvm_alloc_hpt(unsigned long nr_pages)
126{ 130{
127 return kvm_alloc_linear(KVM_LINEAR_HPT); 131 unsigned long align_pages = HPT_ALIGN_PAGES;
132
133 /* Old CPUs require HPT aligned on a multiple of its size */
134 if (!cpu_has_feature(CPU_FTR_ARCH_206))
135 align_pages = nr_pages;
136 return kvm_alloc_cma(nr_pages, align_pages);
128} 137}
129EXPORT_SYMBOL_GPL(kvm_alloc_hpt); 138EXPORT_SYMBOL_GPL(kvm_alloc_hpt);
130 139
131void kvm_release_hpt(struct kvmppc_linear_info *li) 140void kvm_release_hpt(struct page *page, unsigned long nr_pages)
132{ 141{
133 kvm_release_linear(li); 142 kvm_release_cma(page, nr_pages);
134} 143}
135EXPORT_SYMBOL_GPL(kvm_release_hpt); 144EXPORT_SYMBOL_GPL(kvm_release_hpt);
136 145
137/*************** generic *************/ 146/**
138 147 * kvm_cma_reserve() - reserve area for kvm hash pagetable
139static LIST_HEAD(free_linears); 148 *
140static DEFINE_SPINLOCK(linear_lock); 149 * This function reserves memory from early allocator. It should be
141 150 * called by arch specific code once the early allocator (memblock or bootmem)
142static void __init kvm_linear_init_one(ulong size, int count, int type) 151 * has been activated and all other subsystems have already allocated/reserved
143{ 152 * memory.
144 unsigned long i;
145 unsigned long j, npages;
146 void *linear;
147 struct page *pg;
148 const char *typestr;
149 struct kvmppc_linear_info *linear_info;
150
151 if (!count)
152 return;
153
154 typestr = (type == KVM_LINEAR_RMA) ? "RMA" : "HPT";
155
156 npages = size >> PAGE_SHIFT;
157 linear_info = alloc_bootmem(count * sizeof(struct kvmppc_linear_info));
158 for (i = 0; i < count; ++i) {
159 linear = alloc_bootmem_align(size, size);
160 pr_debug("Allocated KVM %s at %p (%ld MB)\n", typestr, linear,
161 size >> 20);
162 linear_info[i].base_virt = linear;
163 linear_info[i].base_pfn = __pa(linear) >> PAGE_SHIFT;
164 linear_info[i].npages = npages;
165 linear_info[i].type = type;
166 list_add_tail(&linear_info[i].list, &free_linears);
167 atomic_set(&linear_info[i].use_count, 0);
168
169 pg = pfn_to_page(linear_info[i].base_pfn);
170 for (j = 0; j < npages; ++j) {
171 atomic_inc(&pg->_count);
172 ++pg;
173 }
174 }
175}
176
177static struct kvmppc_linear_info *kvm_alloc_linear(int type)
178{
179 struct kvmppc_linear_info *ri, *ret;
180
181 ret = NULL;
182 spin_lock(&linear_lock);
183 list_for_each_entry(ri, &free_linears, list) {
184 if (ri->type != type)
185 continue;
186
187 list_del(&ri->list);
188 atomic_inc(&ri->use_count);
189 memset(ri->base_virt, 0, ri->npages << PAGE_SHIFT);
190 ret = ri;
191 break;
192 }
193 spin_unlock(&linear_lock);
194 return ret;
195}
196
197static void kvm_release_linear(struct kvmppc_linear_info *ri)
198{
199 if (atomic_dec_and_test(&ri->use_count)) {
200 spin_lock(&linear_lock);
201 list_add_tail(&ri->list, &free_linears);
202 spin_unlock(&linear_lock);
203
204 }
205}
206
207/*
208 * Called at boot time while the bootmem allocator is active,
209 * to allocate contiguous physical memory for the hash page
210 * tables for guests.
211 */ 153 */
212void __init kvm_linear_init(void) 154void __init kvm_cma_reserve(void)
213{ 155{
214 /* HPT */ 156 unsigned long align_size;
215 kvm_linear_init_one(1 << kvm_hpt_order, kvm_hpt_count, KVM_LINEAR_HPT); 157 struct memblock_region *reg;
216 158 phys_addr_t selected_size = 0;
217 /* RMA */ 159 /*
218 /* Only do this on PPC970 in HV mode */ 160 * We cannot use memblock_phys_mem_size() here, because
219 if (!cpu_has_feature(CPU_FTR_HVMODE) || 161 * memblock_analyze() has not been called yet.
220 !cpu_has_feature(CPU_FTR_ARCH_201)) 162 */
221 return; 163 for_each_memblock(memory, reg)
222 164 selected_size += memblock_region_memory_end_pfn(reg) -
223 if (!kvm_rma_size || !kvm_rma_count) 165 memblock_region_memory_base_pfn(reg);
224 return; 166
225 167 selected_size = (selected_size * kvm_cma_resv_ratio / 100) << PAGE_SHIFT;
226 /* Check that the requested size is one supported in hardware */ 168 if (selected_size) {
227 if (lpcr_rmls(kvm_rma_size) < 0) { 169 pr_debug("%s: reserving %ld MiB for global area\n", __func__,
228 pr_err("RMA size of 0x%lx not supported\n", kvm_rma_size); 170 (unsigned long)selected_size / SZ_1M);
229 return; 171 /*
172 * Old CPUs require HPT aligned on a multiple of its size. So for them
173 * make the alignment as max size we could request.
174 */
175 if (!cpu_has_feature(CPU_FTR_ARCH_206))
176 align_size = __rounddown_pow_of_two(selected_size);
177 else
178 align_size = HPT_ALIGN_PAGES << PAGE_SHIFT;
179
180 align_size = max(kvm_rma_pages << PAGE_SHIFT, align_size);
181 kvm_cma_declare_contiguous(selected_size, align_size);
230 } 182 }
231
232 kvm_linear_init_one(kvm_rma_size, kvm_rma_count, KVM_LINEAR_RMA);
233} 183}
diff --git a/arch/powerpc/kvm/book3s_hv_cma.c b/arch/powerpc/kvm/book3s_hv_cma.c
new file mode 100644
index 000000000000..d9d3d8553d51
--- /dev/null
+++ b/arch/powerpc/kvm/book3s_hv_cma.c
@@ -0,0 +1,240 @@
1/*
2 * Contiguous Memory Allocator for ppc KVM hash pagetable based on CMA
3 * for DMA mapping framework
4 *
5 * Copyright IBM Corporation, 2013
6 * Author Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of the
11 * License or (at your optional) any later version of the license.
12 *
13 */
14#define pr_fmt(fmt) "kvm_cma: " fmt
15
16#ifdef CONFIG_CMA_DEBUG
17#ifndef DEBUG
18# define DEBUG
19#endif
20#endif
21
22#include <linux/memblock.h>
23#include <linux/mutex.h>
24#include <linux/sizes.h>
25#include <linux/slab.h>
26
27#include "book3s_hv_cma.h"
28
29struct kvm_cma {
30 unsigned long base_pfn;
31 unsigned long count;
32 unsigned long *bitmap;
33};
34
35static DEFINE_MUTEX(kvm_cma_mutex);
36static struct kvm_cma kvm_cma_area;
37
38/**
39 * kvm_cma_declare_contiguous() - reserve area for contiguous memory handling
40 * for kvm hash pagetable
41 * @size: Size of the reserved memory.
42 * @alignment: Alignment for the contiguous memory area
43 *
44 * This function reserves memory for kvm cma area. It should be
45 * called by arch code when early allocator (memblock or bootmem)
46 * is still activate.
47 */
48long __init kvm_cma_declare_contiguous(phys_addr_t size, phys_addr_t alignment)
49{
50 long base_pfn;
51 phys_addr_t addr;
52 struct kvm_cma *cma = &kvm_cma_area;
53
54 pr_debug("%s(size %lx)\n", __func__, (unsigned long)size);
55
56 if (!size)
57 return -EINVAL;
58 /*
59 * Sanitise input arguments.
60 * We should be pageblock aligned for CMA.
61 */
62 alignment = max(alignment, (phys_addr_t)(PAGE_SIZE << pageblock_order));
63 size = ALIGN(size, alignment);
64 /*
65 * Reserve memory
66 * Use __memblock_alloc_base() since
67 * memblock_alloc_base() panic()s.
68 */
69 addr = __memblock_alloc_base(size, alignment, 0);
70 if (!addr) {
71 base_pfn = -ENOMEM;
72 goto err;
73 } else
74 base_pfn = PFN_DOWN(addr);
75
76 /*
77 * Each reserved area must be initialised later, when more kernel
78 * subsystems (like slab allocator) are available.
79 */
80 cma->base_pfn = base_pfn;
81 cma->count = size >> PAGE_SHIFT;
82 pr_info("CMA: reserved %ld MiB\n", (unsigned long)size / SZ_1M);
83 return 0;
84err:
85 pr_err("CMA: failed to reserve %ld MiB\n", (unsigned long)size / SZ_1M);
86 return base_pfn;
87}
88
89/**
90 * kvm_alloc_cma() - allocate pages from contiguous area
91 * @nr_pages: Requested number of pages.
92 * @align_pages: Requested alignment in number of pages
93 *
94 * This function allocates memory buffer for hash pagetable.
95 */
96struct page *kvm_alloc_cma(unsigned long nr_pages, unsigned long align_pages)
97{
98 int ret;
99 struct page *page = NULL;
100 struct kvm_cma *cma = &kvm_cma_area;
101 unsigned long chunk_count, nr_chunk;
102 unsigned long mask, pfn, pageno, start = 0;
103
104
105 if (!cma || !cma->count)
106 return NULL;
107
108 pr_debug("%s(cma %p, count %lu, align pages %lu)\n", __func__,
109 (void *)cma, nr_pages, align_pages);
110
111 if (!nr_pages)
112 return NULL;
113 /*
114 * align mask with chunk size. The bit tracks pages in chunk size
115 */
116 VM_BUG_ON(!is_power_of_2(align_pages));
117 mask = (align_pages >> (KVM_CMA_CHUNK_ORDER - PAGE_SHIFT)) - 1;
118 BUILD_BUG_ON(PAGE_SHIFT > KVM_CMA_CHUNK_ORDER);
119
120 chunk_count = cma->count >> (KVM_CMA_CHUNK_ORDER - PAGE_SHIFT);
121 nr_chunk = nr_pages >> (KVM_CMA_CHUNK_ORDER - PAGE_SHIFT);
122
123 mutex_lock(&kvm_cma_mutex);
124 for (;;) {
125 pageno = bitmap_find_next_zero_area(cma->bitmap, chunk_count,
126 start, nr_chunk, mask);
127 if (pageno >= chunk_count)
128 break;
129
130 pfn = cma->base_pfn + (pageno << (KVM_CMA_CHUNK_ORDER - PAGE_SHIFT));
131 ret = alloc_contig_range(pfn, pfn + nr_pages, MIGRATE_CMA);
132 if (ret == 0) {
133 bitmap_set(cma->bitmap, pageno, nr_chunk);
134 page = pfn_to_page(pfn);
135 memset(pfn_to_kaddr(pfn), 0, nr_pages << PAGE_SHIFT);
136 break;
137 } else if (ret != -EBUSY) {
138 break;
139 }
140 pr_debug("%s(): memory range at %p is busy, retrying\n",
141 __func__, pfn_to_page(pfn));
142 /* try again with a bit different memory target */
143 start = pageno + mask + 1;
144 }
145 mutex_unlock(&kvm_cma_mutex);
146 pr_debug("%s(): returned %p\n", __func__, page);
147 return page;
148}
149
150/**
151 * kvm_release_cma() - release allocated pages for hash pagetable
152 * @pages: Allocated pages.
153 * @nr_pages: Number of allocated pages.
154 *
155 * This function releases memory allocated by kvm_alloc_cma().
156 * It returns false when provided pages do not belong to contiguous area and
157 * true otherwise.
158 */
159bool kvm_release_cma(struct page *pages, unsigned long nr_pages)
160{
161 unsigned long pfn;
162 unsigned long nr_chunk;
163 struct kvm_cma *cma = &kvm_cma_area;
164
165 if (!cma || !pages)
166 return false;
167
168 pr_debug("%s(page %p count %lu)\n", __func__, (void *)pages, nr_pages);
169
170 pfn = page_to_pfn(pages);
171
172 if (pfn < cma->base_pfn || pfn >= cma->base_pfn + cma->count)
173 return false;
174
175 VM_BUG_ON(pfn + nr_pages > cma->base_pfn + cma->count);
176 nr_chunk = nr_pages >> (KVM_CMA_CHUNK_ORDER - PAGE_SHIFT);
177
178 mutex_lock(&kvm_cma_mutex);
179 bitmap_clear(cma->bitmap,
180 (pfn - cma->base_pfn) >> (KVM_CMA_CHUNK_ORDER - PAGE_SHIFT),
181 nr_chunk);
182 free_contig_range(pfn, nr_pages);
183 mutex_unlock(&kvm_cma_mutex);
184
185 return true;
186}
187
188static int __init kvm_cma_activate_area(unsigned long base_pfn,
189 unsigned long count)
190{
191 unsigned long pfn = base_pfn;
192 unsigned i = count >> pageblock_order;
193 struct zone *zone;
194
195 WARN_ON_ONCE(!pfn_valid(pfn));
196 zone = page_zone(pfn_to_page(pfn));
197 do {
198 unsigned j;
199 base_pfn = pfn;
200 for (j = pageblock_nr_pages; j; --j, pfn++) {
201 WARN_ON_ONCE(!pfn_valid(pfn));
202 /*
203 * alloc_contig_range requires the pfn range
204 * specified to be in the same zone. Make this
205 * simple by forcing the entire CMA resv range
206 * to be in the same zone.
207 */
208 if (page_zone(pfn_to_page(pfn)) != zone)
209 return -EINVAL;
210 }
211 init_cma_reserved_pageblock(pfn_to_page(base_pfn));
212 } while (--i);
213 return 0;
214}
215
216static int __init kvm_cma_init_reserved_areas(void)
217{
218 int bitmap_size, ret;
219 unsigned long chunk_count;
220 struct kvm_cma *cma = &kvm_cma_area;
221
222 pr_debug("%s()\n", __func__);
223 if (!cma->count)
224 return 0;
225 chunk_count = cma->count >> (KVM_CMA_CHUNK_ORDER - PAGE_SHIFT);
226 bitmap_size = BITS_TO_LONGS(chunk_count) * sizeof(long);
227 cma->bitmap = kzalloc(bitmap_size, GFP_KERNEL);
228 if (!cma->bitmap)
229 return -ENOMEM;
230
231 ret = kvm_cma_activate_area(cma->base_pfn, cma->count);
232 if (ret)
233 goto error;
234 return 0;
235
236error:
237 kfree(cma->bitmap);
238 return ret;
239}
240core_initcall(kvm_cma_init_reserved_areas);
diff --git a/arch/powerpc/kvm/book3s_hv_cma.h b/arch/powerpc/kvm/book3s_hv_cma.h
new file mode 100644
index 000000000000..655144f75fa5
--- /dev/null
+++ b/arch/powerpc/kvm/book3s_hv_cma.h
@@ -0,0 +1,27 @@
1/*
2 * Contiguous Memory Allocator for ppc KVM hash pagetable based on CMA
3 * for DMA mapping framework
4 *
5 * Copyright IBM Corporation, 2013
6 * Author Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of the
11 * License or (at your optional) any later version of the license.
12 *
13 */
14
15#ifndef __POWERPC_KVM_CMA_ALLOC_H__
16#define __POWERPC_KVM_CMA_ALLOC_H__
17/*
18 * Both RMA and Hash page allocation will be multiple of 256K.
19 */
20#define KVM_CMA_CHUNK_ORDER 18
21
22extern struct page *kvm_alloc_cma(unsigned long nr_pages,
23 unsigned long align_pages);
24extern bool kvm_release_cma(struct page *pages, unsigned long nr_pages);
25extern long kvm_cma_declare_contiguous(phys_addr_t size,
26 phys_addr_t alignment) __init;
27#endif
diff --git a/arch/powerpc/kvm/book3s_hv_rm_mmu.c b/arch/powerpc/kvm/book3s_hv_rm_mmu.c
index fc25689a9f35..9c515440ad1a 100644
--- a/arch/powerpc/kvm/book3s_hv_rm_mmu.c
+++ b/arch/powerpc/kvm/book3s_hv_rm_mmu.c
@@ -363,7 +363,11 @@ long kvmppc_h_enter(struct kvm_vcpu *vcpu, unsigned long flags,
363 vcpu->arch.pgdir, true, &vcpu->arch.gpr[4]); 363 vcpu->arch.pgdir, true, &vcpu->arch.gpr[4]);
364} 364}
365 365
366#ifdef __BIG_ENDIAN__
366#define LOCK_TOKEN (*(u32 *)(&get_paca()->lock_token)) 367#define LOCK_TOKEN (*(u32 *)(&get_paca()->lock_token))
368#else
369#define LOCK_TOKEN (*(u32 *)(&get_paca()->paca_index))
370#endif
367 371
368static inline int try_lock_tlbie(unsigned int *lock) 372static inline int try_lock_tlbie(unsigned int *lock)
369{ 373{
@@ -383,6 +387,80 @@ static inline int try_lock_tlbie(unsigned int *lock)
383 return old == 0; 387 return old == 0;
384} 388}
385 389
390/*
391 * tlbie/tlbiel is a bit different on the PPC970 compared to later
392 * processors such as POWER7; the large page bit is in the instruction
393 * not RB, and the top 16 bits and the bottom 12 bits of the VA
394 * in RB must be 0.
395 */
396static void do_tlbies_970(struct kvm *kvm, unsigned long *rbvalues,
397 long npages, int global, bool need_sync)
398{
399 long i;
400
401 if (global) {
402 while (!try_lock_tlbie(&kvm->arch.tlbie_lock))
403 cpu_relax();
404 if (need_sync)
405 asm volatile("ptesync" : : : "memory");
406 for (i = 0; i < npages; ++i) {
407 unsigned long rb = rbvalues[i];
408
409 if (rb & 1) /* large page */
410 asm volatile("tlbie %0,1" : :
411 "r" (rb & 0x0000fffffffff000ul));
412 else
413 asm volatile("tlbie %0,0" : :
414 "r" (rb & 0x0000fffffffff000ul));
415 }
416 asm volatile("eieio; tlbsync; ptesync" : : : "memory");
417 kvm->arch.tlbie_lock = 0;
418 } else {
419 if (need_sync)
420 asm volatile("ptesync" : : : "memory");
421 for (i = 0; i < npages; ++i) {
422 unsigned long rb = rbvalues[i];
423
424 if (rb & 1) /* large page */
425 asm volatile("tlbiel %0,1" : :
426 "r" (rb & 0x0000fffffffff000ul));
427 else
428 asm volatile("tlbiel %0,0" : :
429 "r" (rb & 0x0000fffffffff000ul));
430 }
431 asm volatile("ptesync" : : : "memory");
432 }
433}
434
435static void do_tlbies(struct kvm *kvm, unsigned long *rbvalues,
436 long npages, int global, bool need_sync)
437{
438 long i;
439
440 if (cpu_has_feature(CPU_FTR_ARCH_201)) {
441 /* PPC970 tlbie instruction is a bit different */
442 do_tlbies_970(kvm, rbvalues, npages, global, need_sync);
443 return;
444 }
445 if (global) {
446 while (!try_lock_tlbie(&kvm->arch.tlbie_lock))
447 cpu_relax();
448 if (need_sync)
449 asm volatile("ptesync" : : : "memory");
450 for (i = 0; i < npages; ++i)
451 asm volatile(PPC_TLBIE(%1,%0) : :
452 "r" (rbvalues[i]), "r" (kvm->arch.lpid));
453 asm volatile("eieio; tlbsync; ptesync" : : : "memory");
454 kvm->arch.tlbie_lock = 0;
455 } else {
456 if (need_sync)
457 asm volatile("ptesync" : : : "memory");
458 for (i = 0; i < npages; ++i)
459 asm volatile("tlbiel %0" : : "r" (rbvalues[i]));
460 asm volatile("ptesync" : : : "memory");
461 }
462}
463
386long kvmppc_do_h_remove(struct kvm *kvm, unsigned long flags, 464long kvmppc_do_h_remove(struct kvm *kvm, unsigned long flags,
387 unsigned long pte_index, unsigned long avpn, 465 unsigned long pte_index, unsigned long avpn,
388 unsigned long *hpret) 466 unsigned long *hpret)
@@ -408,19 +486,7 @@ long kvmppc_do_h_remove(struct kvm *kvm, unsigned long flags,
408 if (v & HPTE_V_VALID) { 486 if (v & HPTE_V_VALID) {
409 hpte[0] &= ~HPTE_V_VALID; 487 hpte[0] &= ~HPTE_V_VALID;
410 rb = compute_tlbie_rb(v, hpte[1], pte_index); 488 rb = compute_tlbie_rb(v, hpte[1], pte_index);
411 if (global_invalidates(kvm, flags)) { 489 do_tlbies(kvm, &rb, 1, global_invalidates(kvm, flags), true);
412 while (!try_lock_tlbie(&kvm->arch.tlbie_lock))
413 cpu_relax();
414 asm volatile("ptesync" : : : "memory");
415 asm volatile(PPC_TLBIE(%1,%0)"; eieio; tlbsync"
416 : : "r" (rb), "r" (kvm->arch.lpid));
417 asm volatile("ptesync" : : : "memory");
418 kvm->arch.tlbie_lock = 0;
419 } else {
420 asm volatile("ptesync" : : : "memory");
421 asm volatile("tlbiel %0" : : "r" (rb));
422 asm volatile("ptesync" : : : "memory");
423 }
424 /* Read PTE low word after tlbie to get final R/C values */ 490 /* Read PTE low word after tlbie to get final R/C values */
425 remove_revmap_chain(kvm, pte_index, rev, v, hpte[1]); 491 remove_revmap_chain(kvm, pte_index, rev, v, hpte[1]);
426 } 492 }
@@ -448,12 +514,11 @@ long kvmppc_h_bulk_remove(struct kvm_vcpu *vcpu)
448 unsigned long *hp, *hptes[4], tlbrb[4]; 514 unsigned long *hp, *hptes[4], tlbrb[4];
449 long int i, j, k, n, found, indexes[4]; 515 long int i, j, k, n, found, indexes[4];
450 unsigned long flags, req, pte_index, rcbits; 516 unsigned long flags, req, pte_index, rcbits;
451 long int local = 0; 517 int global;
452 long int ret = H_SUCCESS; 518 long int ret = H_SUCCESS;
453 struct revmap_entry *rev, *revs[4]; 519 struct revmap_entry *rev, *revs[4];
454 520
455 if (atomic_read(&kvm->online_vcpus) == 1) 521 global = global_invalidates(kvm, 0);
456 local = 1;
457 for (i = 0; i < 4 && ret == H_SUCCESS; ) { 522 for (i = 0; i < 4 && ret == H_SUCCESS; ) {
458 n = 0; 523 n = 0;
459 for (; i < 4; ++i) { 524 for (; i < 4; ++i) {
@@ -529,22 +594,7 @@ long kvmppc_h_bulk_remove(struct kvm_vcpu *vcpu)
529 break; 594 break;
530 595
531 /* Now that we've collected a batch, do the tlbies */ 596 /* Now that we've collected a batch, do the tlbies */
532 if (!local) { 597 do_tlbies(kvm, tlbrb, n, global, true);
533 while(!try_lock_tlbie(&kvm->arch.tlbie_lock))
534 cpu_relax();
535 asm volatile("ptesync" : : : "memory");
536 for (k = 0; k < n; ++k)
537 asm volatile(PPC_TLBIE(%1,%0) : :
538 "r" (tlbrb[k]),
539 "r" (kvm->arch.lpid));
540 asm volatile("eieio; tlbsync; ptesync" : : : "memory");
541 kvm->arch.tlbie_lock = 0;
542 } else {
543 asm volatile("ptesync" : : : "memory");
544 for (k = 0; k < n; ++k)
545 asm volatile("tlbiel %0" : : "r" (tlbrb[k]));
546 asm volatile("ptesync" : : : "memory");
547 }
548 598
549 /* Read PTE low words after tlbie to get final R/C values */ 599 /* Read PTE low words after tlbie to get final R/C values */
550 for (k = 0; k < n; ++k) { 600 for (k = 0; k < n; ++k) {
@@ -603,19 +653,7 @@ long kvmppc_h_protect(struct kvm_vcpu *vcpu, unsigned long flags,
603 if (v & HPTE_V_VALID) { 653 if (v & HPTE_V_VALID) {
604 rb = compute_tlbie_rb(v, r, pte_index); 654 rb = compute_tlbie_rb(v, r, pte_index);
605 hpte[0] = v & ~HPTE_V_VALID; 655 hpte[0] = v & ~HPTE_V_VALID;
606 if (global_invalidates(kvm, flags)) { 656 do_tlbies(kvm, &rb, 1, global_invalidates(kvm, flags), true);
607 while(!try_lock_tlbie(&kvm->arch.tlbie_lock))
608 cpu_relax();
609 asm volatile("ptesync" : : : "memory");
610 asm volatile(PPC_TLBIE(%1,%0)"; eieio; tlbsync"
611 : : "r" (rb), "r" (kvm->arch.lpid));
612 asm volatile("ptesync" : : : "memory");
613 kvm->arch.tlbie_lock = 0;
614 } else {
615 asm volatile("ptesync" : : : "memory");
616 asm volatile("tlbiel %0" : : "r" (rb));
617 asm volatile("ptesync" : : : "memory");
618 }
619 /* 657 /*
620 * If the host has this page as readonly but the guest 658 * If the host has this page as readonly but the guest
621 * wants to make it read/write, reduce the permissions. 659 * wants to make it read/write, reduce the permissions.
@@ -686,13 +724,7 @@ void kvmppc_invalidate_hpte(struct kvm *kvm, unsigned long *hptep,
686 724
687 hptep[0] &= ~HPTE_V_VALID; 725 hptep[0] &= ~HPTE_V_VALID;
688 rb = compute_tlbie_rb(hptep[0], hptep[1], pte_index); 726 rb = compute_tlbie_rb(hptep[0], hptep[1], pte_index);
689 while (!try_lock_tlbie(&kvm->arch.tlbie_lock)) 727 do_tlbies(kvm, &rb, 1, 1, true);
690 cpu_relax();
691 asm volatile("ptesync" : : : "memory");
692 asm volatile(PPC_TLBIE(%1,%0)"; eieio; tlbsync"
693 : : "r" (rb), "r" (kvm->arch.lpid));
694 asm volatile("ptesync" : : : "memory");
695 kvm->arch.tlbie_lock = 0;
696} 728}
697EXPORT_SYMBOL_GPL(kvmppc_invalidate_hpte); 729EXPORT_SYMBOL_GPL(kvmppc_invalidate_hpte);
698 730
@@ -706,12 +738,7 @@ void kvmppc_clear_ref_hpte(struct kvm *kvm, unsigned long *hptep,
706 rbyte = (hptep[1] & ~HPTE_R_R) >> 8; 738 rbyte = (hptep[1] & ~HPTE_R_R) >> 8;
707 /* modify only the second-last byte, which contains the ref bit */ 739 /* modify only the second-last byte, which contains the ref bit */
708 *((char *)hptep + 14) = rbyte; 740 *((char *)hptep + 14) = rbyte;
709 while (!try_lock_tlbie(&kvm->arch.tlbie_lock)) 741 do_tlbies(kvm, &rb, 1, 1, false);
710 cpu_relax();
711 asm volatile(PPC_TLBIE(%1,%0)"; eieio; tlbsync"
712 : : "r" (rb), "r" (kvm->arch.lpid));
713 asm volatile("ptesync" : : : "memory");
714 kvm->arch.tlbie_lock = 0;
715} 742}
716EXPORT_SYMBOL_GPL(kvmppc_clear_ref_hpte); 743EXPORT_SYMBOL_GPL(kvmppc_clear_ref_hpte);
717 744
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
index b02f91e4c70d..294b7af28cdd 100644
--- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S
+++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
@@ -29,6 +29,10 @@
29#include <asm/kvm_book3s_asm.h> 29#include <asm/kvm_book3s_asm.h>
30#include <asm/mmu-hash64.h> 30#include <asm/mmu-hash64.h>
31 31
32#ifdef __LITTLE_ENDIAN__
33#error Need to fix lppaca and SLB shadow accesses in little endian mode
34#endif
35
32/***************************************************************************** 36/*****************************************************************************
33 * * 37 * *
34 * Real Mode handlers that need to be in the linear mapping * 38 * Real Mode handlers that need to be in the linear mapping *
@@ -389,7 +393,11 @@ toc_tlbie_lock:
389 .tc native_tlbie_lock[TC],native_tlbie_lock 393 .tc native_tlbie_lock[TC],native_tlbie_lock
390 .previous 394 .previous
391 ld r3,toc_tlbie_lock@toc(2) 395 ld r3,toc_tlbie_lock@toc(2)
396#ifdef __BIG_ENDIAN__
392 lwz r8,PACA_LOCK_TOKEN(r13) 397 lwz r8,PACA_LOCK_TOKEN(r13)
398#else
399 lwz r8,PACAPACAINDEX(r13)
400#endif
39324: lwarx r0,0,r3 40124: lwarx r0,0,r3
394 cmpwi r0,0 402 cmpwi r0,0
395 bne 24b 403 bne 24b
@@ -964,7 +972,11 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_201)
96432: ld r4,VCPU_KVM(r9) /* pointer to struct kvm */ 97232: ld r4,VCPU_KVM(r9) /* pointer to struct kvm */
965 973
966 /* Take the guest's tlbie_lock */ 974 /* Take the guest's tlbie_lock */
975#ifdef __BIG_ENDIAN__
967 lwz r8,PACA_LOCK_TOKEN(r13) 976 lwz r8,PACA_LOCK_TOKEN(r13)
977#else
978 lwz r8,PACAPACAINDEX(r13)
979#endif
968 addi r3,r4,KVM_TLBIE_LOCK 980 addi r3,r4,KVM_TLBIE_LOCK
96924: lwarx r0,0,r3 98124: lwarx r0,0,r3
970 cmpwi r0,0 982 cmpwi r0,0
@@ -1381,7 +1393,7 @@ hcall_try_real_mode:
1381 cmpldi r3,hcall_real_table_end - hcall_real_table 1393 cmpldi r3,hcall_real_table_end - hcall_real_table
1382 bge guest_exit_cont 1394 bge guest_exit_cont
1383 LOAD_REG_ADDR(r4, hcall_real_table) 1395 LOAD_REG_ADDR(r4, hcall_real_table)
1384 lwzx r3,r3,r4 1396 lwax r3,r3,r4
1385 cmpwi r3,0 1397 cmpwi r3,0
1386 beq guest_exit_cont 1398 beq guest_exit_cont
1387 add r3,r3,r4 1399 add r3,r3,r4
diff --git a/arch/powerpc/kvm/book3s_interrupts.S b/arch/powerpc/kvm/book3s_interrupts.S
index 48cbbf862958..17cfae5497a3 100644
--- a/arch/powerpc/kvm/book3s_interrupts.S
+++ b/arch/powerpc/kvm/book3s_interrupts.S
@@ -92,6 +92,11 @@ kvm_start_lightweight:
92 PPC_LL r3, VCPU_HFLAGS(r4) 92 PPC_LL r3, VCPU_HFLAGS(r4)
93 rldicl r3, r3, 0, 63 /* r3 &= 1 */ 93 rldicl r3, r3, 0, 63 /* r3 &= 1 */
94 stb r3, HSTATE_RESTORE_HID5(r13) 94 stb r3, HSTATE_RESTORE_HID5(r13)
95
96 /* Load up guest SPRG3 value, since it's user readable */
97 ld r3, VCPU_SHARED(r4)
98 ld r3, VCPU_SHARED_SPRG3(r3)
99 mtspr SPRN_SPRG3, r3
95#endif /* CONFIG_PPC_BOOK3S_64 */ 100#endif /* CONFIG_PPC_BOOK3S_64 */
96 101
97 PPC_LL r4, VCPU_SHADOW_MSR(r4) /* get shadow_msr */ 102 PPC_LL r4, VCPU_SHADOW_MSR(r4) /* get shadow_msr */
@@ -123,6 +128,15 @@ kvmppc_handler_highmem:
123 /* R7 = vcpu */ 128 /* R7 = vcpu */
124 PPC_LL r7, GPR4(r1) 129 PPC_LL r7, GPR4(r1)
125 130
131#ifdef CONFIG_PPC_BOOK3S_64
132 /*
133 * Reload kernel SPRG3 value.
134 * No need to save guest value as usermode can't modify SPRG3.
135 */
136 ld r3, PACA_SPRG3(r13)
137 mtspr SPRN_SPRG3, r3
138#endif /* CONFIG_PPC_BOOK3S_64 */
139
126 PPC_STL r14, VCPU_GPR(R14)(r7) 140 PPC_STL r14, VCPU_GPR(R14)(r7)
127 PPC_STL r15, VCPU_GPR(R15)(r7) 141 PPC_STL r15, VCPU_GPR(R15)(r7)
128 PPC_STL r16, VCPU_GPR(R16)(r7) 142 PPC_STL r16, VCPU_GPR(R16)(r7)
diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c
index c6e13d9a9e15..27db1e665959 100644
--- a/arch/powerpc/kvm/book3s_pr.c
+++ b/arch/powerpc/kvm/book3s_pr.c
@@ -468,7 +468,8 @@ void kvmppc_giveup_ext(struct kvm_vcpu *vcpu, ulong msr)
468 * both the traditional FP registers and the added VSX 468 * both the traditional FP registers and the added VSX
469 * registers into thread.fpr[]. 469 * registers into thread.fpr[].
470 */ 470 */
471 giveup_fpu(current); 471 if (current->thread.regs->msr & MSR_FP)
472 giveup_fpu(current);
472 for (i = 0; i < ARRAY_SIZE(vcpu->arch.fpr); i++) 473 for (i = 0; i < ARRAY_SIZE(vcpu->arch.fpr); i++)
473 vcpu_fpr[i] = thread_fpr[get_fpr_index(i)]; 474 vcpu_fpr[i] = thread_fpr[get_fpr_index(i)];
474 475
@@ -483,7 +484,8 @@ void kvmppc_giveup_ext(struct kvm_vcpu *vcpu, ulong msr)
483 484
484#ifdef CONFIG_ALTIVEC 485#ifdef CONFIG_ALTIVEC
485 if (msr & MSR_VEC) { 486 if (msr & MSR_VEC) {
486 giveup_altivec(current); 487 if (current->thread.regs->msr & MSR_VEC)
488 giveup_altivec(current);
487 memcpy(vcpu->arch.vr, t->vr, sizeof(vcpu->arch.vr)); 489 memcpy(vcpu->arch.vr, t->vr, sizeof(vcpu->arch.vr));
488 vcpu->arch.vscr = t->vscr; 490 vcpu->arch.vscr = t->vscr;
489 } 491 }
@@ -575,8 +577,6 @@ static int kvmppc_handle_ext(struct kvm_vcpu *vcpu, unsigned int exit_nr,
575 printk(KERN_INFO "Loading up ext 0x%lx\n", msr); 577 printk(KERN_INFO "Loading up ext 0x%lx\n", msr);
576#endif 578#endif
577 579
578 current->thread.regs->msr |= msr;
579
580 if (msr & MSR_FP) { 580 if (msr & MSR_FP) {
581 for (i = 0; i < ARRAY_SIZE(vcpu->arch.fpr); i++) 581 for (i = 0; i < ARRAY_SIZE(vcpu->arch.fpr); i++)
582 thread_fpr[get_fpr_index(i)] = vcpu_fpr[i]; 582 thread_fpr[get_fpr_index(i)] = vcpu_fpr[i];
@@ -598,12 +598,32 @@ static int kvmppc_handle_ext(struct kvm_vcpu *vcpu, unsigned int exit_nr,
598#endif 598#endif
599 } 599 }
600 600
601 current->thread.regs->msr |= msr;
601 vcpu->arch.guest_owned_ext |= msr; 602 vcpu->arch.guest_owned_ext |= msr;
602 kvmppc_recalc_shadow_msr(vcpu); 603 kvmppc_recalc_shadow_msr(vcpu);
603 604
604 return RESUME_GUEST; 605 return RESUME_GUEST;
605} 606}
606 607
608/*
609 * Kernel code using FP or VMX could have flushed guest state to
610 * the thread_struct; if so, get it back now.
611 */
612static void kvmppc_handle_lost_ext(struct kvm_vcpu *vcpu)
613{
614 unsigned long lost_ext;
615
616 lost_ext = vcpu->arch.guest_owned_ext & ~current->thread.regs->msr;
617 if (!lost_ext)
618 return;
619
620 if (lost_ext & MSR_FP)
621 kvmppc_load_up_fpu();
622 if (lost_ext & MSR_VEC)
623 kvmppc_load_up_altivec();
624 current->thread.regs->msr |= lost_ext;
625}
626
607int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu, 627int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
608 unsigned int exit_nr) 628 unsigned int exit_nr)
609{ 629{
@@ -772,7 +792,7 @@ program_interrupt:
772 } 792 }
773 case BOOK3S_INTERRUPT_SYSCALL: 793 case BOOK3S_INTERRUPT_SYSCALL:
774 if (vcpu->arch.papr_enabled && 794 if (vcpu->arch.papr_enabled &&
775 (kvmppc_get_last_inst(vcpu) == 0x44000022) && 795 (kvmppc_get_last_sc(vcpu) == 0x44000022) &&
776 !(vcpu->arch.shared->msr & MSR_PR)) { 796 !(vcpu->arch.shared->msr & MSR_PR)) {
777 /* SC 1 papr hypercalls */ 797 /* SC 1 papr hypercalls */
778 ulong cmd = kvmppc_get_gpr(vcpu, 3); 798 ulong cmd = kvmppc_get_gpr(vcpu, 3);
@@ -890,8 +910,9 @@ program_interrupt:
890 local_irq_enable(); 910 local_irq_enable();
891 r = s; 911 r = s;
892 } else { 912 } else {
893 kvmppc_lazy_ee_enable(); 913 kvmppc_fix_ee_before_entry();
894 } 914 }
915 kvmppc_handle_lost_ext(vcpu);
895 } 916 }
896 917
897 trace_kvm_book3s_reenter(r, vcpu); 918 trace_kvm_book3s_reenter(r, vcpu);
@@ -1162,7 +1183,7 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
1162 if (vcpu->arch.shared->msr & MSR_FP) 1183 if (vcpu->arch.shared->msr & MSR_FP)
1163 kvmppc_handle_ext(vcpu, BOOK3S_INTERRUPT_FP_UNAVAIL, MSR_FP); 1184 kvmppc_handle_ext(vcpu, BOOK3S_INTERRUPT_FP_UNAVAIL, MSR_FP);
1164 1185
1165 kvmppc_lazy_ee_enable(); 1186 kvmppc_fix_ee_before_entry();
1166 1187
1167 ret = __kvmppc_vcpu_run(kvm_run, vcpu); 1188 ret = __kvmppc_vcpu_run(kvm_run, vcpu);
1168 1189
diff --git a/arch/powerpc/kvm/book3s_xics.c b/arch/powerpc/kvm/book3s_xics.c
index 94c1dd46b83d..a3a5cb8ee7ea 100644
--- a/arch/powerpc/kvm/book3s_xics.c
+++ b/arch/powerpc/kvm/book3s_xics.c
@@ -19,6 +19,7 @@
19#include <asm/hvcall.h> 19#include <asm/hvcall.h>
20#include <asm/xics.h> 20#include <asm/xics.h>
21#include <asm/debug.h> 21#include <asm/debug.h>
22#include <asm/time.h>
22 23
23#include <linux/debugfs.h> 24#include <linux/debugfs.h>
24#include <linux/seq_file.h> 25#include <linux/seq_file.h>
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c
index dcc94f016007..17722d82f1d1 100644
--- a/arch/powerpc/kvm/booke.c
+++ b/arch/powerpc/kvm/booke.c
@@ -674,8 +674,6 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
674 goto out; 674 goto out;
675 } 675 }
676 676
677 kvm_guest_enter();
678
679#ifdef CONFIG_PPC_FPU 677#ifdef CONFIG_PPC_FPU
680 /* Save userspace FPU state in stack */ 678 /* Save userspace FPU state in stack */
681 enable_kernel_fp(); 679 enable_kernel_fp();
@@ -698,7 +696,7 @@ int kvmppc_vcpu_run(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
698 kvmppc_load_guest_fp(vcpu); 696 kvmppc_load_guest_fp(vcpu);
699#endif 697#endif
700 698
701 kvmppc_lazy_ee_enable(); 699 kvmppc_fix_ee_before_entry();
702 700
703 ret = __kvmppc_vcpu_run(kvm_run, vcpu); 701 ret = __kvmppc_vcpu_run(kvm_run, vcpu);
704 702
@@ -1168,7 +1166,7 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
1168 local_irq_enable(); 1166 local_irq_enable();
1169 r = (s << 2) | RESUME_HOST | (r & RESUME_FLAG_NV); 1167 r = (s << 2) | RESUME_HOST | (r & RESUME_FLAG_NV);
1170 } else { 1168 } else {
1171 kvmppc_lazy_ee_enable(); 1169 kvmppc_fix_ee_before_entry();
1172 } 1170 }
1173 } 1171 }
1174 1172
diff --git a/arch/powerpc/kvm/emulate.c b/arch/powerpc/kvm/emulate.c
index 2c52ada30775..751cd45f65a0 100644
--- a/arch/powerpc/kvm/emulate.c
+++ b/arch/powerpc/kvm/emulate.c
@@ -30,53 +30,10 @@
30#include <asm/byteorder.h> 30#include <asm/byteorder.h>
31#include <asm/kvm_ppc.h> 31#include <asm/kvm_ppc.h>
32#include <asm/disassemble.h> 32#include <asm/disassemble.h>
33#include <asm/ppc-opcode.h>
33#include "timing.h" 34#include "timing.h"
34#include "trace.h" 35#include "trace.h"
35 36
36#define OP_TRAP 3
37#define OP_TRAP_64 2
38
39#define OP_31_XOP_TRAP 4
40#define OP_31_XOP_LWZX 23
41#define OP_31_XOP_DCBST 54
42#define OP_31_XOP_TRAP_64 68
43#define OP_31_XOP_DCBF 86
44#define OP_31_XOP_LBZX 87
45#define OP_31_XOP_STWX 151
46#define OP_31_XOP_STBX 215
47#define OP_31_XOP_LBZUX 119
48#define OP_31_XOP_STBUX 247
49#define OP_31_XOP_LHZX 279
50#define OP_31_XOP_LHZUX 311
51#define OP_31_XOP_MFSPR 339
52#define OP_31_XOP_LHAX 343
53#define OP_31_XOP_STHX 407
54#define OP_31_XOP_STHUX 439
55#define OP_31_XOP_MTSPR 467
56#define OP_31_XOP_DCBI 470
57#define OP_31_XOP_LWBRX 534
58#define OP_31_XOP_TLBSYNC 566
59#define OP_31_XOP_STWBRX 662
60#define OP_31_XOP_LHBRX 790
61#define OP_31_XOP_STHBRX 918
62
63#define OP_LWZ 32
64#define OP_LD 58
65#define OP_LWZU 33
66#define OP_LBZ 34
67#define OP_LBZU 35
68#define OP_STW 36
69#define OP_STWU 37
70#define OP_STD 62
71#define OP_STB 38
72#define OP_STBU 39
73#define OP_LHZ 40
74#define OP_LHZU 41
75#define OP_LHA 42
76#define OP_LHAU 43
77#define OP_STH 44
78#define OP_STHU 45
79
80void kvmppc_emulate_dec(struct kvm_vcpu *vcpu) 37void kvmppc_emulate_dec(struct kvm_vcpu *vcpu)
81{ 38{
82 unsigned long dec_nsec; 39 unsigned long dec_nsec;
diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
index 6316ee336e88..07c0106fab76 100644
--- a/arch/powerpc/kvm/powerpc.c
+++ b/arch/powerpc/kvm/powerpc.c
@@ -117,8 +117,6 @@ int kvmppc_prepare_to_enter(struct kvm_vcpu *vcpu)
117 kvm_guest_exit(); 117 kvm_guest_exit();
118 continue; 118 continue;
119 } 119 }
120
121 trace_hardirqs_on();
122#endif 120#endif
123 121
124 kvm_guest_enter(); 122 kvm_guest_enter();
@@ -420,6 +418,10 @@ int kvm_arch_create_memslot(struct kvm_memory_slot *slot, unsigned long npages)
420 return kvmppc_core_create_memslot(slot, npages); 418 return kvmppc_core_create_memslot(slot, npages);
421} 419}
422 420
421void kvm_arch_memslots_updated(struct kvm *kvm)
422{
423}
424
423int kvm_arch_prepare_memory_region(struct kvm *kvm, 425int kvm_arch_prepare_memory_region(struct kvm *kvm,
424 struct kvm_memory_slot *memslot, 426 struct kvm_memory_slot *memslot,
425 struct kvm_userspace_memory_region *mem, 427 struct kvm_userspace_memory_region *mem,
@@ -823,39 +825,39 @@ static int kvm_vcpu_ioctl_enable_cap(struct kvm_vcpu *vcpu,
823#endif 825#endif
824#ifdef CONFIG_KVM_MPIC 826#ifdef CONFIG_KVM_MPIC
825 case KVM_CAP_IRQ_MPIC: { 827 case KVM_CAP_IRQ_MPIC: {
826 struct file *filp; 828 struct fd f;
827 struct kvm_device *dev; 829 struct kvm_device *dev;
828 830
829 r = -EBADF; 831 r = -EBADF;
830 filp = fget(cap->args[0]); 832 f = fdget(cap->args[0]);
831 if (!filp) 833 if (!f.file)
832 break; 834 break;
833 835
834 r = -EPERM; 836 r = -EPERM;
835 dev = kvm_device_from_filp(filp); 837 dev = kvm_device_from_filp(f.file);
836 if (dev) 838 if (dev)
837 r = kvmppc_mpic_connect_vcpu(dev, vcpu, cap->args[1]); 839 r = kvmppc_mpic_connect_vcpu(dev, vcpu, cap->args[1]);
838 840
839 fput(filp); 841 fdput(f);
840 break; 842 break;
841 } 843 }
842#endif 844#endif
843#ifdef CONFIG_KVM_XICS 845#ifdef CONFIG_KVM_XICS
844 case KVM_CAP_IRQ_XICS: { 846 case KVM_CAP_IRQ_XICS: {
845 struct file *filp; 847 struct fd f;
846 struct kvm_device *dev; 848 struct kvm_device *dev;
847 849
848 r = -EBADF; 850 r = -EBADF;
849 filp = fget(cap->args[0]); 851 f = fdget(cap->args[0]);
850 if (!filp) 852 if (!f.file)
851 break; 853 break;
852 854
853 r = -EPERM; 855 r = -EPERM;
854 dev = kvm_device_from_filp(filp); 856 dev = kvm_device_from_filp(f.file);
855 if (dev) 857 if (dev)
856 r = kvmppc_xics_connect_vcpu(dev, vcpu, cap->args[1]); 858 r = kvmppc_xics_connect_vcpu(dev, vcpu, cap->args[1]);
857 859
858 fput(filp); 860 fdput(f);
859 break; 861 break;
860 } 862 }
861#endif /* CONFIG_KVM_XICS */ 863#endif /* CONFIG_KVM_XICS */
diff --git a/arch/powerpc/lib/locks.c b/arch/powerpc/lib/locks.c
index bb7cfecf2788..0c9c8d7d0734 100644
--- a/arch/powerpc/lib/locks.c
+++ b/arch/powerpc/lib/locks.c
@@ -32,7 +32,7 @@ void __spin_yield(arch_spinlock_t *lock)
32 return; 32 return;
33 holder_cpu = lock_value & 0xffff; 33 holder_cpu = lock_value & 0xffff;
34 BUG_ON(holder_cpu >= NR_CPUS); 34 BUG_ON(holder_cpu >= NR_CPUS);
35 yield_count = lppaca_of(holder_cpu).yield_count; 35 yield_count = be32_to_cpu(lppaca_of(holder_cpu).yield_count);
36 if ((yield_count & 1) == 0) 36 if ((yield_count & 1) == 0)
37 return; /* virtual cpu is currently running */ 37 return; /* virtual cpu is currently running */
38 rmb(); 38 rmb();
@@ -57,7 +57,7 @@ void __rw_yield(arch_rwlock_t *rw)
57 return; /* no write lock at present */ 57 return; /* no write lock at present */
58 holder_cpu = lock_value & 0xffff; 58 holder_cpu = lock_value & 0xffff;
59 BUG_ON(holder_cpu >= NR_CPUS); 59 BUG_ON(holder_cpu >= NR_CPUS);
60 yield_count = lppaca_of(holder_cpu).yield_count; 60 yield_count = be32_to_cpu(lppaca_of(holder_cpu).yield_count);
61 if ((yield_count & 1) == 0) 61 if ((yield_count & 1) == 0)
62 return; /* virtual cpu is currently running */ 62 return; /* virtual cpu is currently running */
63 rmb(); 63 rmb();
diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c
index 99c7fc16dc0d..b1faa1593c90 100644
--- a/arch/powerpc/lib/sstep.c
+++ b/arch/powerpc/lib/sstep.c
@@ -100,8 +100,10 @@ static unsigned long __kprobes dform_ea(unsigned int instr, struct pt_regs *regs
100 ea = (signed short) instr; /* sign-extend */ 100 ea = (signed short) instr; /* sign-extend */
101 if (ra) { 101 if (ra) {
102 ea += regs->gpr[ra]; 102 ea += regs->gpr[ra];
103 if (instr & 0x04000000) /* update forms */ 103 if (instr & 0x04000000) { /* update forms */
104 regs->gpr[ra] = ea; 104 if ((instr>>26) != 47) /* stmw is not an update form */
105 regs->gpr[ra] = ea;
106 }
105 } 107 }
106 108
107 return truncate_if_32bit(regs->msr, ea); 109 return truncate_if_32bit(regs->msr, ea);
@@ -279,7 +281,7 @@ static int __kprobes write_mem_unaligned(unsigned long val, unsigned long ea,
279 err = write_mem_aligned(val >> (nb - c) * 8, ea, c); 281 err = write_mem_aligned(val >> (nb - c) * 8, ea, c);
280 if (err) 282 if (err)
281 return err; 283 return err;
282 ++ea; 284 ea += c;
283 } 285 }
284 return 0; 286 return 0;
285} 287}
@@ -1503,6 +1505,7 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)
1503 */ 1505 */
1504 if ((ra == 1) && !(regs->msr & MSR_PR) \ 1506 if ((ra == 1) && !(regs->msr & MSR_PR) \
1505 && (val3 >= (regs->gpr[1] - STACK_INT_FRAME_SIZE))) { 1507 && (val3 >= (regs->gpr[1] - STACK_INT_FRAME_SIZE))) {
1508#ifdef CONFIG_PPC32
1506 /* 1509 /*
1507 * Check if we will touch kernel sack overflow 1510 * Check if we will touch kernel sack overflow
1508 */ 1511 */
@@ -1511,7 +1514,7 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)
1511 err = -EINVAL; 1514 err = -EINVAL;
1512 break; 1515 break;
1513 } 1516 }
1514 1517#endif /* CONFIG_PPC32 */
1515 /* 1518 /*
1516 * Check if we already set since that means we'll 1519 * Check if we already set since that means we'll
1517 * lose the previous value. 1520 * lose the previous value.
diff --git a/arch/powerpc/math-emu/Makefile b/arch/powerpc/math-emu/Makefile
index 8d035d2d42a6..1b46ab4f6417 100644
--- a/arch/powerpc/math-emu/Makefile
+++ b/arch/powerpc/math-emu/Makefile
@@ -1,15 +1,15 @@
1 1math-emu-common-objs = math.o fre.o fsqrt.o fsqrts.o frsqrtes.o mtfsf.o mtfsfi.o
2obj-$(CONFIG_MATH_EMULATION) += fabs.o fadd.o fadds.o fcmpo.o fcmpu.o \ 2obj-$(CONFIG_MATH_EMULATION_HW_UNIMPLEMENTED) += $(math-emu-common-objs)
3 fctiw.o fctiwz.o fdiv.o fdivs.o \ 3obj-$(CONFIG_MATH_EMULATION_FULL) += $(math-emu-common-objs) fabs.o fadd.o \
4 fmadd.o fmadds.o fmsub.o fmsubs.o \ 4 fadds.o fcmpo.o fcmpu.o fctiw.o \
5 fmul.o fmuls.o fnabs.o fneg.o \ 5 fctiwz.o fdiv.o fdivs.o fmadd.o \
6 fnmadd.o fnmadds.o fnmsub.o fnmsubs.o \ 6 fmadds.o fmsub.o fmsubs.o fmul.o \
7 fres.o fre.o frsp.o fsel.o lfs.o \ 7 fmuls.o fnabs.o fneg.o fnmadd.o \
8 frsqrte.o frsqrtes.o \ 8 fnmadds.o fnmsub.o fnmsubs.o fres.o \
9 fsqrt.o fsqrts.o fsub.o fsubs.o \ 9 frsp.o fsel.o lfs.o frsqrte.o fsub.o \
10 mcrfs.o mffs.o mtfsb0.o mtfsb1.o \ 10 fsubs.o mcrfs.o mffs.o mtfsb0.o \
11 mtfsf.o mtfsfi.o stfiwx.o stfs.o \ 11 mtfsb1.o stfiwx.o stfs.o math.o \
12 math.o fmr.o lfd.o stfd.o 12 fmr.o lfd.o stfd.o
13 13
14obj-$(CONFIG_SPE) += math_efp.o 14obj-$(CONFIG_SPE) += math_efp.o
15 15
diff --git a/arch/powerpc/math-emu/math.c b/arch/powerpc/math-emu/math.c
index 0328e66e0799..ab151f040502 100644
--- a/arch/powerpc/math-emu/math.c
+++ b/arch/powerpc/math-emu/math.c
@@ -7,12 +7,27 @@
7 7
8#include <asm/uaccess.h> 8#include <asm/uaccess.h>
9#include <asm/reg.h> 9#include <asm/reg.h>
10#include <asm/switch_to.h>
10 11
11#include <asm/sfp-machine.h> 12#include <asm/sfp-machine.h>
12#include <math-emu/double.h> 13#include <math-emu/double.h>
13 14
14#define FLOATFUNC(x) extern int x(void *, void *, void *, void *) 15#define FLOATFUNC(x) extern int x(void *, void *, void *, void *)
15 16
17/* The instructions list which may be not implemented by a hardware FPU */
18FLOATFUNC(fre);
19FLOATFUNC(frsqrtes);
20FLOATFUNC(fsqrt);
21FLOATFUNC(fsqrts);
22FLOATFUNC(mtfsf);
23FLOATFUNC(mtfsfi);
24
25#ifdef CONFIG_MATH_EMULATION_HW_UNIMPLEMENTED
26#undef FLOATFUNC(x)
27#define FLOATFUNC(x) static inline int x(void *op1, void *op2, void *op3, \
28 void *op4) { }
29#endif
30
16FLOATFUNC(fadd); 31FLOATFUNC(fadd);
17FLOATFUNC(fadds); 32FLOATFUNC(fadds);
18FLOATFUNC(fdiv); 33FLOATFUNC(fdiv);
@@ -42,8 +57,6 @@ FLOATFUNC(mcrfs);
42FLOATFUNC(mffs); 57FLOATFUNC(mffs);
43FLOATFUNC(mtfsb0); 58FLOATFUNC(mtfsb0);
44FLOATFUNC(mtfsb1); 59FLOATFUNC(mtfsb1);
45FLOATFUNC(mtfsf);
46FLOATFUNC(mtfsfi);
47 60
48FLOATFUNC(lfd); 61FLOATFUNC(lfd);
49FLOATFUNC(lfs); 62FLOATFUNC(lfs);
@@ -58,13 +71,9 @@ FLOATFUNC(fnabs);
58FLOATFUNC(fneg); 71FLOATFUNC(fneg);
59 72
60/* Optional */ 73/* Optional */
61FLOATFUNC(fre);
62FLOATFUNC(fres); 74FLOATFUNC(fres);
63FLOATFUNC(frsqrte); 75FLOATFUNC(frsqrte);
64FLOATFUNC(frsqrtes);
65FLOATFUNC(fsel); 76FLOATFUNC(fsel);
66FLOATFUNC(fsqrt);
67FLOATFUNC(fsqrts);
68 77
69 78
70#define OP31 0x1f /* 31 */ 79#define OP31 0x1f /* 31 */
@@ -154,7 +163,6 @@ FLOATFUNC(fsqrts);
154#define XEU 15 163#define XEU 15
155#define XFLB 10 164#define XFLB 10
156 165
157#ifdef CONFIG_MATH_EMULATION
158static int 166static int
159record_exception(struct pt_regs *regs, int eflag) 167record_exception(struct pt_regs *regs, int eflag)
160{ 168{
@@ -212,7 +220,6 @@ record_exception(struct pt_regs *regs, int eflag)
212 220
213 return (fpscr & FPSCR_FEX) ? 1 : 0; 221 return (fpscr & FPSCR_FEX) ? 1 : 0;
214} 222}
215#endif /* CONFIG_MATH_EMULATION */
216 223
217int 224int
218do_mathemu(struct pt_regs *regs) 225do_mathemu(struct pt_regs *regs)
@@ -222,56 +229,13 @@ do_mathemu(struct pt_regs *regs)
222 signed short sdisp; 229 signed short sdisp;
223 u32 insn = 0; 230 u32 insn = 0;
224 int idx = 0; 231 int idx = 0;
225#ifdef CONFIG_MATH_EMULATION
226 int (*func)(void *, void *, void *, void *); 232 int (*func)(void *, void *, void *, void *);
227 int type = 0; 233 int type = 0;
228 int eflag, trap; 234 int eflag, trap;
229#endif
230 235
231 if (get_user(insn, (u32 *)pc)) 236 if (get_user(insn, (u32 *)pc))
232 return -EFAULT; 237 return -EFAULT;
233 238
234#ifndef CONFIG_MATH_EMULATION
235 switch (insn >> 26) {
236 case LFD:
237 idx = (insn >> 16) & 0x1f;
238 sdisp = (insn & 0xffff);
239 op0 = (void *)&current->thread.TS_FPR((insn >> 21) & 0x1f);
240 op1 = (void *)((idx ? regs->gpr[idx] : 0) + sdisp);
241 lfd(op0, op1, op2, op3);
242 break;
243 case LFDU:
244 idx = (insn >> 16) & 0x1f;
245 sdisp = (insn & 0xffff);
246 op0 = (void *)&current->thread.TS_FPR((insn >> 21) & 0x1f);
247 op1 = (void *)((idx ? regs->gpr[idx] : 0) + sdisp);
248 lfd(op0, op1, op2, op3);
249 regs->gpr[idx] = (unsigned long)op1;
250 break;
251 case STFD:
252 idx = (insn >> 16) & 0x1f;
253 sdisp = (insn & 0xffff);
254 op0 = (void *)&current->thread.TS_FPR((insn >> 21) & 0x1f);
255 op1 = (void *)((idx ? regs->gpr[idx] : 0) + sdisp);
256 stfd(op0, op1, op2, op3);
257 break;
258 case STFDU:
259 idx = (insn >> 16) & 0x1f;
260 sdisp = (insn & 0xffff);
261 op0 = (void *)&current->thread.TS_FPR((insn >> 21) & 0x1f);
262 op1 = (void *)((idx ? regs->gpr[idx] : 0) + sdisp);
263 stfd(op0, op1, op2, op3);
264 regs->gpr[idx] = (unsigned long)op1;
265 break;
266 case OP63:
267 op0 = (void *)&current->thread.TS_FPR((insn >> 21) & 0x1f);
268 op1 = (void *)&current->thread.TS_FPR((insn >> 11) & 0x1f);
269 fmr(op0, op1, op2, op3);
270 break;
271 default:
272 goto illegal;
273 }
274#else /* CONFIG_MATH_EMULATION */
275 switch (insn >> 26) { 239 switch (insn >> 26) {
276 case LFS: func = lfs; type = D; break; 240 case LFS: func = lfs; type = D; break;
277 case LFSU: func = lfs; type = DU; break; 241 case LFSU: func = lfs; type = DU; break;
@@ -416,21 +380,16 @@ do_mathemu(struct pt_regs *regs)
416 case XE: 380 case XE:
417 idx = (insn >> 16) & 0x1f; 381 idx = (insn >> 16) & 0x1f;
418 op0 = (void *)&current->thread.TS_FPR((insn >> 21) & 0x1f); 382 op0 = (void *)&current->thread.TS_FPR((insn >> 21) & 0x1f);
419 if (!idx) { 383 op1 = (void *)((idx ? regs->gpr[idx] : 0)
420 if (((insn >> 1) & 0x3ff) == STFIWX) 384 + regs->gpr[(insn >> 11) & 0x1f]);
421 op1 = (void *)(regs->gpr[(insn >> 11) & 0x1f]);
422 else
423 goto illegal;
424 } else {
425 op1 = (void *)(regs->gpr[idx] + regs->gpr[(insn >> 11) & 0x1f]);
426 }
427
428 break; 385 break;
429 386
430 case XEU: 387 case XEU:
431 idx = (insn >> 16) & 0x1f; 388 idx = (insn >> 16) & 0x1f;
389 if (!idx)
390 goto illegal;
432 op0 = (void *)&current->thread.TS_FPR((insn >> 21) & 0x1f); 391 op0 = (void *)&current->thread.TS_FPR((insn >> 21) & 0x1f);
433 op1 = (void *)((idx ? regs->gpr[idx] : 0) 392 op1 = (void *)(regs->gpr[idx]
434 + regs->gpr[(insn >> 11) & 0x1f]); 393 + regs->gpr[(insn >> 11) & 0x1f]);
435 break; 394 break;
436 395
@@ -465,6 +424,13 @@ do_mathemu(struct pt_regs *regs)
465 goto illegal; 424 goto illegal;
466 } 425 }
467 426
427 /*
428 * If we support a HW FPU, we need to ensure the FP state
429 * is flushed into the thread_struct before attempting
430 * emulation
431 */
432 flush_fp_to_thread(current);
433
468 eflag = func(op0, op1, op2, op3); 434 eflag = func(op0, op1, op2, op3);
469 435
470 if (insn & 1) { 436 if (insn & 1) {
@@ -485,7 +451,6 @@ do_mathemu(struct pt_regs *regs)
485 default: 451 default:
486 break; 452 break;
487 } 453 }
488#endif /* CONFIG_MATH_EMULATION */
489 454
490 regs->nip += 4; 455 regs->nip += 4;
491 return 0; 456 return 0;
diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c
index 8726779e1409..51ab9e7e6c39 100644
--- a/arch/powerpc/mm/fault.c
+++ b/arch/powerpc/mm/fault.c
@@ -206,7 +206,7 @@ int __kprobes do_page_fault(struct pt_regs *regs, unsigned long address,
206 int trap = TRAP(regs); 206 int trap = TRAP(regs);
207 int is_exec = trap == 0x400; 207 int is_exec = trap == 0x400;
208 int fault; 208 int fault;
209 int rc = 0; 209 int rc = 0, store_update_sp = 0;
210 210
211#if !(defined(CONFIG_4xx) || defined(CONFIG_BOOKE)) 211#if !(defined(CONFIG_4xx) || defined(CONFIG_BOOKE))
212 /* 212 /*
@@ -223,9 +223,6 @@ int __kprobes do_page_fault(struct pt_regs *regs, unsigned long address,
223 is_write = error_code & ESR_DST; 223 is_write = error_code & ESR_DST;
224#endif /* CONFIG_4xx || CONFIG_BOOKE */ 224#endif /* CONFIG_4xx || CONFIG_BOOKE */
225 225
226 if (is_write)
227 flags |= FAULT_FLAG_WRITE;
228
229#ifdef CONFIG_PPC_ICSWX 226#ifdef CONFIG_PPC_ICSWX
230 /* 227 /*
231 * we need to do this early because this "data storage 228 * we need to do this early because this "data storage
@@ -280,6 +277,17 @@ int __kprobes do_page_fault(struct pt_regs *regs, unsigned long address,
280 277
281 perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); 278 perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address);
282 279
280 /*
281 * We want to do this outside mmap_sem, because reading code around nip
282 * can result in fault, which will cause a deadlock when called with
283 * mmap_sem held
284 */
285 if (user_mode(regs))
286 store_update_sp = store_updates_sp(regs);
287
288 if (user_mode(regs))
289 flags |= FAULT_FLAG_USER;
290
283 /* When running in the kernel we expect faults to occur only to 291 /* When running in the kernel we expect faults to occur only to
284 * addresses in user space. All other faults represent errors in the 292 * addresses in user space. All other faults represent errors in the
285 * kernel and should generate an OOPS. Unfortunately, in the case of an 293 * kernel and should generate an OOPS. Unfortunately, in the case of an
@@ -345,8 +353,7 @@ retry:
345 * between the last mapped region and the stack will 353 * between the last mapped region and the stack will
346 * expand the stack rather than segfaulting. 354 * expand the stack rather than segfaulting.
347 */ 355 */
348 if (address + 2048 < uregs->gpr[1] 356 if (address + 2048 < uregs->gpr[1] && !store_update_sp)
349 && (!user_mode(regs) || !store_updates_sp(regs)))
350 goto bad_area; 357 goto bad_area;
351 } 358 }
352 if (expand_stack(vma, address)) 359 if (expand_stack(vma, address))
@@ -408,6 +415,7 @@ good_area:
408 } else if (is_write) { 415 } else if (is_write) {
409 if (!(vma->vm_flags & VM_WRITE)) 416 if (!(vma->vm_flags & VM_WRITE))
410 goto bad_area; 417 goto bad_area;
418 flags |= FAULT_FLAG_WRITE;
411 /* a read */ 419 /* a read */
412 } else { 420 } else {
413 /* protection fault */ 421 /* protection fault */
@@ -443,8 +451,12 @@ good_area:
443 regs, address); 451 regs, address);
444#ifdef CONFIG_PPC_SMLPAR 452#ifdef CONFIG_PPC_SMLPAR
445 if (firmware_has_feature(FW_FEATURE_CMO)) { 453 if (firmware_has_feature(FW_FEATURE_CMO)) {
454 u32 page_ins;
455
446 preempt_disable(); 456 preempt_disable();
447 get_lppaca()->page_ins += (1 << PAGE_FACTOR); 457 page_ins = be32_to_cpu(get_lppaca()->page_ins);
458 page_ins += 1 << PAGE_FACTOR;
459 get_lppaca()->page_ins = cpu_to_be32(page_ins);
448 preempt_enable(); 460 preempt_enable();
449 } 461 }
450#endif /* CONFIG_PPC_SMLPAR */ 462#endif /* CONFIG_PPC_SMLPAR */
diff --git a/arch/powerpc/mm/gup.c b/arch/powerpc/mm/gup.c
index 49822d90ea96..6936547018b8 100644
--- a/arch/powerpc/mm/gup.c
+++ b/arch/powerpc/mm/gup.c
@@ -117,8 +117,8 @@ static int gup_pud_range(pgd_t pgd, unsigned long addr, unsigned long end,
117 return 1; 117 return 1;
118} 118}
119 119
120int get_user_pages_fast(unsigned long start, int nr_pages, int write, 120int __get_user_pages_fast(unsigned long start, int nr_pages, int write,
121 struct page **pages) 121 struct page **pages)
122{ 122{
123 struct mm_struct *mm = current->mm; 123 struct mm_struct *mm = current->mm;
124 unsigned long addr, len, end; 124 unsigned long addr, len, end;
@@ -135,7 +135,7 @@ int get_user_pages_fast(unsigned long start, int nr_pages, int write,
135 135
136 if (unlikely(!access_ok(write ? VERIFY_WRITE : VERIFY_READ, 136 if (unlikely(!access_ok(write ? VERIFY_WRITE : VERIFY_READ,
137 start, len))) 137 start, len)))
138 goto slow_irqon; 138 return 0;
139 139
140 pr_devel(" aligned: %lx .. %lx\n", start, end); 140 pr_devel(" aligned: %lx .. %lx\n", start, end);
141 141
@@ -166,30 +166,35 @@ int get_user_pages_fast(unsigned long start, int nr_pages, int write,
166 (void *)pgd_val(pgd)); 166 (void *)pgd_val(pgd));
167 next = pgd_addr_end(addr, end); 167 next = pgd_addr_end(addr, end);
168 if (pgd_none(pgd)) 168 if (pgd_none(pgd))
169 goto slow; 169 break;
170 if (pgd_huge(pgd)) { 170 if (pgd_huge(pgd)) {
171 if (!gup_hugepte((pte_t *)pgdp, PGDIR_SIZE, addr, next, 171 if (!gup_hugepte((pte_t *)pgdp, PGDIR_SIZE, addr, next,
172 write, pages, &nr)) 172 write, pages, &nr))
173 goto slow; 173 break;
174 } else if (is_hugepd(pgdp)) { 174 } else if (is_hugepd(pgdp)) {
175 if (!gup_hugepd((hugepd_t *)pgdp, PGDIR_SHIFT, 175 if (!gup_hugepd((hugepd_t *)pgdp, PGDIR_SHIFT,
176 addr, next, write, pages, &nr)) 176 addr, next, write, pages, &nr))
177 goto slow; 177 break;
178 } else if (!gup_pud_range(pgd, addr, next, write, pages, &nr)) 178 } else if (!gup_pud_range(pgd, addr, next, write, pages, &nr))
179 goto slow; 179 break;
180 } while (pgdp++, addr = next, addr != end); 180 } while (pgdp++, addr = next, addr != end);
181 181
182 local_irq_enable(); 182 local_irq_enable();
183 183
184 VM_BUG_ON(nr != (end - start) >> PAGE_SHIFT);
185 return nr; 184 return nr;
185}
186 186
187 { 187int get_user_pages_fast(unsigned long start, int nr_pages, int write,
188 int ret; 188 struct page **pages)
189{
190 struct mm_struct *mm = current->mm;
191 int nr, ret;
192
193 start &= PAGE_MASK;
194 nr = __get_user_pages_fast(start, nr_pages, write, pages);
195 ret = nr;
189 196
190slow: 197 if (nr < nr_pages) {
191 local_irq_enable();
192slow_irqon:
193 pr_devel(" slow path ! nr = %d\n", nr); 198 pr_devel(" slow path ! nr = %d\n", nr);
194 199
195 /* Try to get the remaining pages with get_user_pages */ 200 /* Try to get the remaining pages with get_user_pages */
@@ -198,7 +203,7 @@ slow_irqon:
198 203
199 down_read(&mm->mmap_sem); 204 down_read(&mm->mmap_sem);
200 ret = get_user_pages(current, mm, start, 205 ret = get_user_pages(current, mm, start,
201 (end - start) >> PAGE_SHIFT, write, 0, pages, NULL); 206 nr_pages - nr, write, 0, pages, NULL);
202 up_read(&mm->mmap_sem); 207 up_read(&mm->mmap_sem);
203 208
204 /* Have to be a bit careful with return values */ 209 /* Have to be a bit careful with return values */
@@ -208,9 +213,9 @@ slow_irqon:
208 else 213 else
209 ret += nr; 214 ret += nr;
210 } 215 }
211
212 return ret;
213 } 216 }
217
218 return ret;
214} 219}
215 220
216#endif /* __HAVE_ARCH_PTE_SPECIAL */ 221#endif /* __HAVE_ARCH_PTE_SPECIAL */
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c
index 6ecc38bd5b24..bde8b5589755 100644
--- a/arch/powerpc/mm/hash_utils_64.c
+++ b/arch/powerpc/mm/hash_utils_64.c
@@ -907,7 +907,7 @@ static int subpage_protection(struct mm_struct *mm, unsigned long ea)
907 907
908 if (ea >= spt->maxaddr) 908 if (ea >= spt->maxaddr)
909 return 0; 909 return 0;
910 if (ea < 0x100000000) { 910 if (ea < 0x100000000UL) {
911 /* addresses below 4GB use spt->low_prot */ 911 /* addresses below 4GB use spt->low_prot */
912 sbpm = spt->low_prot; 912 sbpm = spt->low_prot;
913 } else { 913 } else {
diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c
index 834ca8eb38f2..d67db4bd672d 100644
--- a/arch/powerpc/mm/hugetlbpage.c
+++ b/arch/powerpc/mm/hugetlbpage.c
@@ -86,6 +86,11 @@ int pgd_huge(pgd_t pgd)
86 */ 86 */
87 return ((pgd_val(pgd) & 0x3) != 0x0); 87 return ((pgd_val(pgd) & 0x3) != 0x0);
88} 88}
89
90int pmd_huge_support(void)
91{
92 return 1;
93}
89#else 94#else
90int pmd_huge(pmd_t pmd) 95int pmd_huge(pmd_t pmd)
91{ 96{
@@ -101,6 +106,11 @@ int pgd_huge(pgd_t pgd)
101{ 106{
102 return 0; 107 return 0;
103} 108}
109
110int pmd_huge_support(void)
111{
112 return 0;
113}
104#endif 114#endif
105 115
106pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr) 116pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
diff --git a/arch/powerpc/mm/init_32.c b/arch/powerpc/mm/init_32.c
index 01e2db97a210..d47d3dab4870 100644
--- a/arch/powerpc/mm/init_32.c
+++ b/arch/powerpc/mm/init_32.c
@@ -52,7 +52,7 @@
52#if defined(CONFIG_KERNEL_START_BOOL) || defined(CONFIG_LOWMEM_SIZE_BOOL) 52#if defined(CONFIG_KERNEL_START_BOOL) || defined(CONFIG_LOWMEM_SIZE_BOOL)
53/* The amount of lowmem must be within 0xF0000000 - KERNELBASE. */ 53/* The amount of lowmem must be within 0xF0000000 - KERNELBASE. */
54#if (CONFIG_LOWMEM_SIZE > (0xF0000000 - PAGE_OFFSET)) 54#if (CONFIG_LOWMEM_SIZE > (0xF0000000 - PAGE_OFFSET))
55#error "You must adjust CONFIG_LOWMEM_SIZE or CONFIG_START_KERNEL" 55#error "You must adjust CONFIG_LOWMEM_SIZE or CONFIG_KERNEL_START"
56#endif 56#endif
57#endif 57#endif
58#define MAX_LOW_MEM CONFIG_LOWMEM_SIZE 58#define MAX_LOW_MEM CONFIG_LOWMEM_SIZE
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c
index 7f4bea162026..1cf9c5b67f24 100644
--- a/arch/powerpc/mm/mem.c
+++ b/arch/powerpc/mm/mem.c
@@ -514,7 +514,7 @@ static int add_system_ram_resources(void)
514 res->name = "System RAM"; 514 res->name = "System RAM";
515 res->start = base; 515 res->start = base;
516 res->end = base + size - 1; 516 res->end = base + size - 1;
517 res->flags = IORESOURCE_MEM; 517 res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
518 WARN_ON(request_resource(&iomem_resource, res) < 0); 518 WARN_ON(request_resource(&iomem_resource, res) < 0);
519 } 519 }
520 } 520 }
diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c
index 5850798826cd..c916127f10c3 100644
--- a/arch/powerpc/mm/numa.c
+++ b/arch/powerpc/mm/numa.c
@@ -58,7 +58,7 @@ static int form1_affinity;
58 58
59#define MAX_DISTANCE_REF_POINTS 4 59#define MAX_DISTANCE_REF_POINTS 4
60static int distance_ref_points_depth; 60static int distance_ref_points_depth;
61static const unsigned int *distance_ref_points; 61static const __be32 *distance_ref_points;
62static int distance_lookup_table[MAX_NUMNODES][MAX_DISTANCE_REF_POINTS]; 62static int distance_lookup_table[MAX_NUMNODES][MAX_DISTANCE_REF_POINTS];
63 63
64/* 64/*
@@ -179,7 +179,7 @@ static void unmap_cpu_from_node(unsigned long cpu)
179#endif /* CONFIG_HOTPLUG_CPU || CONFIG_PPC_SPLPAR */ 179#endif /* CONFIG_HOTPLUG_CPU || CONFIG_PPC_SPLPAR */
180 180
181/* must hold reference to node during call */ 181/* must hold reference to node during call */
182static const int *of_get_associativity(struct device_node *dev) 182static const __be32 *of_get_associativity(struct device_node *dev)
183{ 183{
184 return of_get_property(dev, "ibm,associativity", NULL); 184 return of_get_property(dev, "ibm,associativity", NULL);
185} 185}
@@ -189,9 +189,9 @@ static const int *of_get_associativity(struct device_node *dev)
189 * it exists (the property exists only in kexec/kdump kernels, 189 * it exists (the property exists only in kexec/kdump kernels,
190 * added by kexec-tools) 190 * added by kexec-tools)
191 */ 191 */
192static const u32 *of_get_usable_memory(struct device_node *memory) 192static const __be32 *of_get_usable_memory(struct device_node *memory)
193{ 193{
194 const u32 *prop; 194 const __be32 *prop;
195 u32 len; 195 u32 len;
196 prop = of_get_property(memory, "linux,drconf-usable-memory", &len); 196 prop = of_get_property(memory, "linux,drconf-usable-memory", &len);
197 if (!prop || len < sizeof(unsigned int)) 197 if (!prop || len < sizeof(unsigned int))
@@ -219,7 +219,7 @@ int __node_distance(int a, int b)
219} 219}
220 220
221static void initialize_distance_lookup_table(int nid, 221static void initialize_distance_lookup_table(int nid,
222 const unsigned int *associativity) 222 const __be32 *associativity)
223{ 223{
224 int i; 224 int i;
225 225
@@ -227,29 +227,32 @@ static void initialize_distance_lookup_table(int nid,
227 return; 227 return;
228 228
229 for (i = 0; i < distance_ref_points_depth; i++) { 229 for (i = 0; i < distance_ref_points_depth; i++) {
230 distance_lookup_table[nid][i] = 230 const __be32 *entry;
231 associativity[distance_ref_points[i]]; 231
232 entry = &associativity[be32_to_cpu(distance_ref_points[i])];
233 distance_lookup_table[nid][i] = of_read_number(entry, 1);
232 } 234 }
233} 235}
234 236
235/* Returns nid in the range [0..MAX_NUMNODES-1], or -1 if no useful numa 237/* Returns nid in the range [0..MAX_NUMNODES-1], or -1 if no useful numa
236 * info is found. 238 * info is found.
237 */ 239 */
238static int associativity_to_nid(const unsigned int *associativity) 240static int associativity_to_nid(const __be32 *associativity)
239{ 241{
240 int nid = -1; 242 int nid = -1;
241 243
242 if (min_common_depth == -1) 244 if (min_common_depth == -1)
243 goto out; 245 goto out;
244 246
245 if (associativity[0] >= min_common_depth) 247 if (of_read_number(associativity, 1) >= min_common_depth)
246 nid = associativity[min_common_depth]; 248 nid = of_read_number(&associativity[min_common_depth], 1);
247 249
248 /* POWER4 LPAR uses 0xffff as invalid node */ 250 /* POWER4 LPAR uses 0xffff as invalid node */
249 if (nid == 0xffff || nid >= MAX_NUMNODES) 251 if (nid == 0xffff || nid >= MAX_NUMNODES)
250 nid = -1; 252 nid = -1;
251 253
252 if (nid > 0 && associativity[0] >= distance_ref_points_depth) 254 if (nid > 0 &&
255 of_read_number(associativity, 1) >= distance_ref_points_depth)
253 initialize_distance_lookup_table(nid, associativity); 256 initialize_distance_lookup_table(nid, associativity);
254 257
255out: 258out:
@@ -262,7 +265,7 @@ out:
262static int of_node_to_nid_single(struct device_node *device) 265static int of_node_to_nid_single(struct device_node *device)
263{ 266{
264 int nid = -1; 267 int nid = -1;
265 const unsigned int *tmp; 268 const __be32 *tmp;
266 269
267 tmp = of_get_associativity(device); 270 tmp = of_get_associativity(device);
268 if (tmp) 271 if (tmp)
@@ -334,7 +337,7 @@ static int __init find_min_common_depth(void)
334 } 337 }
335 338
336 if (form1_affinity) { 339 if (form1_affinity) {
337 depth = distance_ref_points[0]; 340 depth = of_read_number(distance_ref_points, 1);
338 } else { 341 } else {
339 if (distance_ref_points_depth < 2) { 342 if (distance_ref_points_depth < 2) {
340 printk(KERN_WARNING "NUMA: " 343 printk(KERN_WARNING "NUMA: "
@@ -342,7 +345,7 @@ static int __init find_min_common_depth(void)
342 goto err; 345 goto err;
343 } 346 }
344 347
345 depth = distance_ref_points[1]; 348 depth = of_read_number(&distance_ref_points[1], 1);
346 } 349 }
347 350
348 /* 351 /*
@@ -376,12 +379,12 @@ static void __init get_n_mem_cells(int *n_addr_cells, int *n_size_cells)
376 of_node_put(memory); 379 of_node_put(memory);
377} 380}
378 381
379static unsigned long read_n_cells(int n, const unsigned int **buf) 382static unsigned long read_n_cells(int n, const __be32 **buf)
380{ 383{
381 unsigned long result = 0; 384 unsigned long result = 0;
382 385
383 while (n--) { 386 while (n--) {
384 result = (result << 32) | **buf; 387 result = (result << 32) | of_read_number(*buf, 1);
385 (*buf)++; 388 (*buf)++;
386 } 389 }
387 return result; 390 return result;
@@ -391,17 +394,17 @@ static unsigned long read_n_cells(int n, const unsigned int **buf)
391 * Read the next memblock list entry from the ibm,dynamic-memory property 394 * Read the next memblock list entry from the ibm,dynamic-memory property
392 * and return the information in the provided of_drconf_cell structure. 395 * and return the information in the provided of_drconf_cell structure.
393 */ 396 */
394static void read_drconf_cell(struct of_drconf_cell *drmem, const u32 **cellp) 397static void read_drconf_cell(struct of_drconf_cell *drmem, const __be32 **cellp)
395{ 398{
396 const u32 *cp; 399 const __be32 *cp;
397 400
398 drmem->base_addr = read_n_cells(n_mem_addr_cells, cellp); 401 drmem->base_addr = read_n_cells(n_mem_addr_cells, cellp);
399 402
400 cp = *cellp; 403 cp = *cellp;
401 drmem->drc_index = cp[0]; 404 drmem->drc_index = of_read_number(cp, 1);
402 drmem->reserved = cp[1]; 405 drmem->reserved = of_read_number(&cp[1], 1);
403 drmem->aa_index = cp[2]; 406 drmem->aa_index = of_read_number(&cp[2], 1);
404 drmem->flags = cp[3]; 407 drmem->flags = of_read_number(&cp[3], 1);
405 408
406 *cellp = cp + 4; 409 *cellp = cp + 4;
407} 410}
@@ -413,16 +416,16 @@ static void read_drconf_cell(struct of_drconf_cell *drmem, const u32 **cellp)
413 * list entries followed by N memblock list entries. Each memblock list entry 416 * list entries followed by N memblock list entries. Each memblock list entry
414 * contains information as laid out in the of_drconf_cell struct above. 417 * contains information as laid out in the of_drconf_cell struct above.
415 */ 418 */
416static int of_get_drconf_memory(struct device_node *memory, const u32 **dm) 419static int of_get_drconf_memory(struct device_node *memory, const __be32 **dm)
417{ 420{
418 const u32 *prop; 421 const __be32 *prop;
419 u32 len, entries; 422 u32 len, entries;
420 423
421 prop = of_get_property(memory, "ibm,dynamic-memory", &len); 424 prop = of_get_property(memory, "ibm,dynamic-memory", &len);
422 if (!prop || len < sizeof(unsigned int)) 425 if (!prop || len < sizeof(unsigned int))
423 return 0; 426 return 0;
424 427
425 entries = *prop++; 428 entries = of_read_number(prop++, 1);
426 429
427 /* Now that we know the number of entries, revalidate the size 430 /* Now that we know the number of entries, revalidate the size
428 * of the property read in to ensure we have everything 431 * of the property read in to ensure we have everything
@@ -440,7 +443,7 @@ static int of_get_drconf_memory(struct device_node *memory, const u32 **dm)
440 */ 443 */
441static u64 of_get_lmb_size(struct device_node *memory) 444static u64 of_get_lmb_size(struct device_node *memory)
442{ 445{
443 const u32 *prop; 446 const __be32 *prop;
444 u32 len; 447 u32 len;
445 448
446 prop = of_get_property(memory, "ibm,lmb-size", &len); 449 prop = of_get_property(memory, "ibm,lmb-size", &len);
@@ -453,7 +456,7 @@ static u64 of_get_lmb_size(struct device_node *memory)
453struct assoc_arrays { 456struct assoc_arrays {
454 u32 n_arrays; 457 u32 n_arrays;
455 u32 array_sz; 458 u32 array_sz;
456 const u32 *arrays; 459 const __be32 *arrays;
457}; 460};
458 461
459/* 462/*
@@ -469,15 +472,15 @@ struct assoc_arrays {
469static int of_get_assoc_arrays(struct device_node *memory, 472static int of_get_assoc_arrays(struct device_node *memory,
470 struct assoc_arrays *aa) 473 struct assoc_arrays *aa)
471{ 474{
472 const u32 *prop; 475 const __be32 *prop;
473 u32 len; 476 u32 len;
474 477
475 prop = of_get_property(memory, "ibm,associativity-lookup-arrays", &len); 478 prop = of_get_property(memory, "ibm,associativity-lookup-arrays", &len);
476 if (!prop || len < 2 * sizeof(unsigned int)) 479 if (!prop || len < 2 * sizeof(unsigned int))
477 return -1; 480 return -1;
478 481
479 aa->n_arrays = *prop++; 482 aa->n_arrays = of_read_number(prop++, 1);
480 aa->array_sz = *prop++; 483 aa->array_sz = of_read_number(prop++, 1);
481 484
482 /* Now that we know the number of arrays and size of each array, 485 /* Now that we know the number of arrays and size of each array,
483 * revalidate the size of the property read in. 486 * revalidate the size of the property read in.
@@ -504,7 +507,7 @@ static int of_drconf_to_nid_single(struct of_drconf_cell *drmem,
504 !(drmem->flags & DRCONF_MEM_AI_INVALID) && 507 !(drmem->flags & DRCONF_MEM_AI_INVALID) &&
505 drmem->aa_index < aa->n_arrays) { 508 drmem->aa_index < aa->n_arrays) {
506 index = drmem->aa_index * aa->array_sz + min_common_depth - 1; 509 index = drmem->aa_index * aa->array_sz + min_common_depth - 1;
507 nid = aa->arrays[index]; 510 nid = of_read_number(&aa->arrays[index], 1);
508 511
509 if (nid == 0xffff || nid >= MAX_NUMNODES) 512 if (nid == 0xffff || nid >= MAX_NUMNODES)
510 nid = default_nid; 513 nid = default_nid;
@@ -595,7 +598,7 @@ static unsigned long __init numa_enforce_memory_limit(unsigned long start,
595 * Reads the counter for a given entry in 598 * Reads the counter for a given entry in
596 * linux,drconf-usable-memory property 599 * linux,drconf-usable-memory property
597 */ 600 */
598static inline int __init read_usm_ranges(const u32 **usm) 601static inline int __init read_usm_ranges(const __be32 **usm)
599{ 602{
600 /* 603 /*
601 * For each lmb in ibm,dynamic-memory a corresponding 604 * For each lmb in ibm,dynamic-memory a corresponding
@@ -612,7 +615,7 @@ static inline int __init read_usm_ranges(const u32 **usm)
612 */ 615 */
613static void __init parse_drconf_memory(struct device_node *memory) 616static void __init parse_drconf_memory(struct device_node *memory)
614{ 617{
615 const u32 *uninitialized_var(dm), *usm; 618 const __be32 *uninitialized_var(dm), *usm;
616 unsigned int n, rc, ranges, is_kexec_kdump = 0; 619 unsigned int n, rc, ranges, is_kexec_kdump = 0;
617 unsigned long lmb_size, base, size, sz; 620 unsigned long lmb_size, base, size, sz;
618 int nid; 621 int nid;
@@ -721,7 +724,7 @@ static int __init parse_numa_properties(void)
721 unsigned long size; 724 unsigned long size;
722 int nid; 725 int nid;
723 int ranges; 726 int ranges;
724 const unsigned int *memcell_buf; 727 const __be32 *memcell_buf;
725 unsigned int len; 728 unsigned int len;
726 729
727 memcell_buf = of_get_property(memory, 730 memcell_buf = of_get_property(memory,
@@ -1106,7 +1109,7 @@ early_param("numa", early_numa);
1106static int hot_add_drconf_scn_to_nid(struct device_node *memory, 1109static int hot_add_drconf_scn_to_nid(struct device_node *memory,
1107 unsigned long scn_addr) 1110 unsigned long scn_addr)
1108{ 1111{
1109 const u32 *dm; 1112 const __be32 *dm;
1110 unsigned int drconf_cell_cnt, rc; 1113 unsigned int drconf_cell_cnt, rc;
1111 unsigned long lmb_size; 1114 unsigned long lmb_size;
1112 struct assoc_arrays aa; 1115 struct assoc_arrays aa;
@@ -1159,7 +1162,7 @@ int hot_add_node_scn_to_nid(unsigned long scn_addr)
1159 for_each_node_by_type(memory, "memory") { 1162 for_each_node_by_type(memory, "memory") {
1160 unsigned long start, size; 1163 unsigned long start, size;
1161 int ranges; 1164 int ranges;
1162 const unsigned int *memcell_buf; 1165 const __be32 *memcell_buf;
1163 unsigned int len; 1166 unsigned int len;
1164 1167
1165 memcell_buf = of_get_property(memory, "reg", &len); 1168 memcell_buf = of_get_property(memory, "reg", &len);
@@ -1232,7 +1235,7 @@ static u64 hot_add_drconf_memory_max(void)
1232 struct device_node *memory = NULL; 1235 struct device_node *memory = NULL;
1233 unsigned int drconf_cell_cnt = 0; 1236 unsigned int drconf_cell_cnt = 0;
1234 u64 lmb_size = 0; 1237 u64 lmb_size = 0;
1235 const u32 *dm = 0; 1238 const __be32 *dm = 0;
1236 1239
1237 memory = of_find_node_by_path("/ibm,dynamic-reconfiguration-memory"); 1240 memory = of_find_node_by_path("/ibm,dynamic-reconfiguration-memory");
1238 if (memory) { 1241 if (memory) {
@@ -1337,40 +1340,41 @@ static int update_cpu_associativity_changes_mask(void)
1337 * Convert the associativity domain numbers returned from the hypervisor 1340 * Convert the associativity domain numbers returned from the hypervisor
1338 * to the sequence they would appear in the ibm,associativity property. 1341 * to the sequence they would appear in the ibm,associativity property.
1339 */ 1342 */
1340static int vphn_unpack_associativity(const long *packed, unsigned int *unpacked) 1343static int vphn_unpack_associativity(const long *packed, __be32 *unpacked)
1341{ 1344{
1342 int i, nr_assoc_doms = 0; 1345 int i, nr_assoc_doms = 0;
1343 const u16 *field = (const u16*) packed; 1346 const __be16 *field = (const __be16 *) packed;
1344 1347
1345#define VPHN_FIELD_UNUSED (0xffff) 1348#define VPHN_FIELD_UNUSED (0xffff)
1346#define VPHN_FIELD_MSB (0x8000) 1349#define VPHN_FIELD_MSB (0x8000)
1347#define VPHN_FIELD_MASK (~VPHN_FIELD_MSB) 1350#define VPHN_FIELD_MASK (~VPHN_FIELD_MSB)
1348 1351
1349 for (i = 1; i < VPHN_ASSOC_BUFSIZE; i++) { 1352 for (i = 1; i < VPHN_ASSOC_BUFSIZE; i++) {
1350 if (*field == VPHN_FIELD_UNUSED) { 1353 if (be16_to_cpup(field) == VPHN_FIELD_UNUSED) {
1351 /* All significant fields processed, and remaining 1354 /* All significant fields processed, and remaining
1352 * fields contain the reserved value of all 1's. 1355 * fields contain the reserved value of all 1's.
1353 * Just store them. 1356 * Just store them.
1354 */ 1357 */
1355 unpacked[i] = *((u32*)field); 1358 unpacked[i] = *((__be32 *)field);
1356 field += 2; 1359 field += 2;
1357 } else if (*field & VPHN_FIELD_MSB) { 1360 } else if (be16_to_cpup(field) & VPHN_FIELD_MSB) {
1358 /* Data is in the lower 15 bits of this field */ 1361 /* Data is in the lower 15 bits of this field */
1359 unpacked[i] = *field & VPHN_FIELD_MASK; 1362 unpacked[i] = cpu_to_be32(
1363 be16_to_cpup(field) & VPHN_FIELD_MASK);
1360 field++; 1364 field++;
1361 nr_assoc_doms++; 1365 nr_assoc_doms++;
1362 } else { 1366 } else {
1363 /* Data is in the lower 15 bits of this field 1367 /* Data is in the lower 15 bits of this field
1364 * concatenated with the next 16 bit field 1368 * concatenated with the next 16 bit field
1365 */ 1369 */
1366 unpacked[i] = *((u32*)field); 1370 unpacked[i] = *((__be32 *)field);
1367 field += 2; 1371 field += 2;
1368 nr_assoc_doms++; 1372 nr_assoc_doms++;
1369 } 1373 }
1370 } 1374 }
1371 1375
1372 /* The first cell contains the length of the property */ 1376 /* The first cell contains the length of the property */
1373 unpacked[0] = nr_assoc_doms; 1377 unpacked[0] = cpu_to_be32(nr_assoc_doms);
1374 1378
1375 return nr_assoc_doms; 1379 return nr_assoc_doms;
1376} 1380}
@@ -1379,7 +1383,7 @@ static int vphn_unpack_associativity(const long *packed, unsigned int *unpacked)
1379 * Retrieve the new associativity information for a virtual processor's 1383 * Retrieve the new associativity information for a virtual processor's
1380 * home node. 1384 * home node.
1381 */ 1385 */
1382static long hcall_vphn(unsigned long cpu, unsigned int *associativity) 1386static long hcall_vphn(unsigned long cpu, __be32 *associativity)
1383{ 1387{
1384 long rc; 1388 long rc;
1385 long retbuf[PLPAR_HCALL9_BUFSIZE] = {0}; 1389 long retbuf[PLPAR_HCALL9_BUFSIZE] = {0};
@@ -1393,7 +1397,7 @@ static long hcall_vphn(unsigned long cpu, unsigned int *associativity)
1393} 1397}
1394 1398
1395static long vphn_get_associativity(unsigned long cpu, 1399static long vphn_get_associativity(unsigned long cpu,
1396 unsigned int *associativity) 1400 __be32 *associativity)
1397{ 1401{
1398 long rc; 1402 long rc;
1399 1403
@@ -1450,7 +1454,7 @@ int arch_update_cpu_topology(void)
1450{ 1454{
1451 unsigned int cpu, sibling, changed = 0; 1455 unsigned int cpu, sibling, changed = 0;
1452 struct topology_update_data *updates, *ud; 1456 struct topology_update_data *updates, *ud;
1453 unsigned int associativity[VPHN_ASSOC_BUFSIZE] = {0}; 1457 __be32 associativity[VPHN_ASSOC_BUFSIZE] = {0};
1454 cpumask_t updated_cpus; 1458 cpumask_t updated_cpus;
1455 struct device *dev; 1459 struct device *dev;
1456 int weight, new_nid, i = 0; 1460 int weight, new_nid, i = 0;
@@ -1609,7 +1613,7 @@ int start_topology_update(void)
1609#endif 1613#endif
1610 } 1614 }
1611 } else if (firmware_has_feature(FW_FEATURE_VPHN) && 1615 } else if (firmware_has_feature(FW_FEATURE_VPHN) &&
1612 get_lppaca()->shared_proc) { 1616 lppaca_shared_proc(get_lppaca())) {
1613 if (!vphn_enabled) { 1617 if (!vphn_enabled) {
1614 prrn_enabled = 0; 1618 prrn_enabled = 0;
1615 vphn_enabled = 1; 1619 vphn_enabled = 1;
diff --git a/arch/powerpc/mm/slb.c b/arch/powerpc/mm/slb.c
index a538c80db2df..9d1d33cd2be5 100644
--- a/arch/powerpc/mm/slb.c
+++ b/arch/powerpc/mm/slb.c
@@ -66,8 +66,10 @@ static inline void slb_shadow_update(unsigned long ea, int ssize,
66 * we only update the current CPU's SLB shadow buffer. 66 * we only update the current CPU's SLB shadow buffer.
67 */ 67 */
68 get_slb_shadow()->save_area[entry].esid = 0; 68 get_slb_shadow()->save_area[entry].esid = 0;
69 get_slb_shadow()->save_area[entry].vsid = mk_vsid_data(ea, ssize, flags); 69 get_slb_shadow()->save_area[entry].vsid =
70 get_slb_shadow()->save_area[entry].esid = mk_esid_data(ea, ssize, entry); 70 cpu_to_be64(mk_vsid_data(ea, ssize, flags));
71 get_slb_shadow()->save_area[entry].esid =
72 cpu_to_be64(mk_esid_data(ea, ssize, entry));
71} 73}
72 74
73static inline void slb_shadow_clear(unsigned long entry) 75static inline void slb_shadow_clear(unsigned long entry)
@@ -112,7 +114,8 @@ static void __slb_flush_and_rebolt(void)
112 } else { 114 } else {
113 /* Update stack entry; others don't change */ 115 /* Update stack entry; others don't change */
114 slb_shadow_update(get_paca()->kstack, mmu_kernel_ssize, lflags, 2); 116 slb_shadow_update(get_paca()->kstack, mmu_kernel_ssize, lflags, 2);
115 ksp_vsid_data = get_slb_shadow()->save_area[2].vsid; 117 ksp_vsid_data =
118 be64_to_cpu(get_slb_shadow()->save_area[2].vsid);
116 } 119 }
117 120
118 /* We need to do this all in asm, so we're sure we don't touch 121 /* We need to do this all in asm, so we're sure we don't touch
diff --git a/arch/powerpc/mm/subpage-prot.c b/arch/powerpc/mm/subpage-prot.c
index aa74acb0fdfc..a770df2dae70 100644
--- a/arch/powerpc/mm/subpage-prot.c
+++ b/arch/powerpc/mm/subpage-prot.c
@@ -105,7 +105,7 @@ static void subpage_prot_clear(unsigned long addr, unsigned long len)
105 limit = spt->maxaddr; 105 limit = spt->maxaddr;
106 for (; addr < limit; addr = next) { 106 for (; addr < limit; addr = next) {
107 next = pmd_addr_end(addr, limit); 107 next = pmd_addr_end(addr, limit);
108 if (addr < 0x100000000) { 108 if (addr < 0x100000000UL) {
109 spm = spt->low_prot; 109 spm = spt->low_prot;
110 } else { 110 } else {
111 spm = spt->protptrs[addr >> SBP_L3_SHIFT]; 111 spm = spt->protptrs[addr >> SBP_L3_SHIFT];
@@ -219,7 +219,7 @@ long sys_subpage_prot(unsigned long addr, unsigned long len, u32 __user *map)
219 for (limit = addr + len; addr < limit; addr = next) { 219 for (limit = addr + len; addr < limit; addr = next) {
220 next = pmd_addr_end(addr, limit); 220 next = pmd_addr_end(addr, limit);
221 err = -ENOMEM; 221 err = -ENOMEM;
222 if (addr < 0x100000000) { 222 if (addr < 0x100000000UL) {
223 spm = spt->low_prot; 223 spm = spt->low_prot;
224 } else { 224 } else {
225 spm = spt->protptrs[addr >> SBP_L3_SHIFT]; 225 spm = spt->protptrs[addr >> SBP_L3_SHIFT];
diff --git a/arch/powerpc/oprofile/common.c b/arch/powerpc/oprofile/common.c
index 4f51025f5b00..c77348c5d463 100644
--- a/arch/powerpc/oprofile/common.c
+++ b/arch/powerpc/oprofile/common.c
@@ -119,7 +119,7 @@ static void op_powerpc_stop(void)
119 model->global_stop(); 119 model->global_stop();
120} 120}
121 121
122static int op_powerpc_create_files(struct super_block *sb, struct dentry *root) 122static int op_powerpc_create_files(struct dentry *root)
123{ 123{
124 int i; 124 int i;
125 125
@@ -128,9 +128,9 @@ static int op_powerpc_create_files(struct super_block *sb, struct dentry *root)
128 * There is one mmcr0, mmcr1 and mmcra for setting the events for 128 * There is one mmcr0, mmcr1 and mmcra for setting the events for
129 * all of the counters. 129 * all of the counters.
130 */ 130 */
131 oprofilefs_create_ulong(sb, root, "mmcr0", &sys.mmcr0); 131 oprofilefs_create_ulong(root, "mmcr0", &sys.mmcr0);
132 oprofilefs_create_ulong(sb, root, "mmcr1", &sys.mmcr1); 132 oprofilefs_create_ulong(root, "mmcr1", &sys.mmcr1);
133 oprofilefs_create_ulong(sb, root, "mmcra", &sys.mmcra); 133 oprofilefs_create_ulong(root, "mmcra", &sys.mmcra);
134#ifdef CONFIG_OPROFILE_CELL 134#ifdef CONFIG_OPROFILE_CELL
135 /* create a file the user tool can check to see what level of profiling 135 /* create a file the user tool can check to see what level of profiling
136 * support exits with this kernel. Initialize bit mask to indicate 136 * support exits with this kernel. Initialize bit mask to indicate
@@ -142,7 +142,7 @@ static int op_powerpc_create_files(struct super_block *sb, struct dentry *root)
142 * If the file does not exist, then the kernel only supports SPU 142 * If the file does not exist, then the kernel only supports SPU
143 * cycle profiling, PPU event and cycle profiling. 143 * cycle profiling, PPU event and cycle profiling.
144 */ 144 */
145 oprofilefs_create_ulong(sb, root, "cell_support", &sys.cell_support); 145 oprofilefs_create_ulong(root, "cell_support", &sys.cell_support);
146 sys.cell_support = 0x1; /* Note, the user OProfile tool must check 146 sys.cell_support = 0x1; /* Note, the user OProfile tool must check
147 * that this bit is set before attempting to 147 * that this bit is set before attempting to
148 * user SPU event profiling. Older kernels 148 * user SPU event profiling. Older kernels
@@ -160,11 +160,11 @@ static int op_powerpc_create_files(struct super_block *sb, struct dentry *root)
160 char buf[4]; 160 char buf[4];
161 161
162 snprintf(buf, sizeof buf, "%d", i); 162 snprintf(buf, sizeof buf, "%d", i);
163 dir = oprofilefs_mkdir(sb, root, buf); 163 dir = oprofilefs_mkdir(root, buf);
164 164
165 oprofilefs_create_ulong(sb, dir, "enabled", &ctr[i].enabled); 165 oprofilefs_create_ulong(dir, "enabled", &ctr[i].enabled);
166 oprofilefs_create_ulong(sb, dir, "event", &ctr[i].event); 166 oprofilefs_create_ulong(dir, "event", &ctr[i].event);
167 oprofilefs_create_ulong(sb, dir, "count", &ctr[i].count); 167 oprofilefs_create_ulong(dir, "count", &ctr[i].count);
168 168
169 /* 169 /*
170 * Classic PowerPC doesn't support per-counter 170 * Classic PowerPC doesn't support per-counter
@@ -173,14 +173,14 @@ static int op_powerpc_create_files(struct super_block *sb, struct dentry *root)
173 * Book-E style performance monitors, we do 173 * Book-E style performance monitors, we do
174 * support them. 174 * support them.
175 */ 175 */
176 oprofilefs_create_ulong(sb, dir, "kernel", &ctr[i].kernel); 176 oprofilefs_create_ulong(dir, "kernel", &ctr[i].kernel);
177 oprofilefs_create_ulong(sb, dir, "user", &ctr[i].user); 177 oprofilefs_create_ulong(dir, "user", &ctr[i].user);
178 178
179 oprofilefs_create_ulong(sb, dir, "unit_mask", &ctr[i].unit_mask); 179 oprofilefs_create_ulong(dir, "unit_mask", &ctr[i].unit_mask);
180 } 180 }
181 181
182 oprofilefs_create_ulong(sb, root, "enable_kernel", &sys.enable_kernel); 182 oprofilefs_create_ulong(root, "enable_kernel", &sys.enable_kernel);
183 oprofilefs_create_ulong(sb, root, "enable_user", &sys.enable_user); 183 oprofilefs_create_ulong(root, "enable_user", &sys.enable_user);
184 184
185 /* Default to tracing both kernel and user */ 185 /* Default to tracing both kernel and user */
186 sys.enable_kernel = 1; 186 sys.enable_kernel = 1;
diff --git a/arch/powerpc/oprofile/op_model_fsl_emb.c b/arch/powerpc/oprofile/op_model_fsl_emb.c
index ccc1daa33aed..2a82d3ed464d 100644
--- a/arch/powerpc/oprofile/op_model_fsl_emb.c
+++ b/arch/powerpc/oprofile/op_model_fsl_emb.c
@@ -46,6 +46,12 @@ static inline u32 get_pmlca(int ctr)
46 case 3: 46 case 3:
47 pmlca = mfpmr(PMRN_PMLCA3); 47 pmlca = mfpmr(PMRN_PMLCA3);
48 break; 48 break;
49 case 4:
50 pmlca = mfpmr(PMRN_PMLCA4);
51 break;
52 case 5:
53 pmlca = mfpmr(PMRN_PMLCA5);
54 break;
49 default: 55 default:
50 panic("Bad ctr number\n"); 56 panic("Bad ctr number\n");
51 } 57 }
@@ -68,6 +74,12 @@ static inline void set_pmlca(int ctr, u32 pmlca)
68 case 3: 74 case 3:
69 mtpmr(PMRN_PMLCA3, pmlca); 75 mtpmr(PMRN_PMLCA3, pmlca);
70 break; 76 break;
77 case 4:
78 mtpmr(PMRN_PMLCA4, pmlca);
79 break;
80 case 5:
81 mtpmr(PMRN_PMLCA5, pmlca);
82 break;
71 default: 83 default:
72 panic("Bad ctr number\n"); 84 panic("Bad ctr number\n");
73 } 85 }
@@ -84,6 +96,10 @@ static inline unsigned int ctr_read(unsigned int i)
84 return mfpmr(PMRN_PMC2); 96 return mfpmr(PMRN_PMC2);
85 case 3: 97 case 3:
86 return mfpmr(PMRN_PMC3); 98 return mfpmr(PMRN_PMC3);
99 case 4:
100 return mfpmr(PMRN_PMC4);
101 case 5:
102 return mfpmr(PMRN_PMC5);
87 default: 103 default:
88 return 0; 104 return 0;
89 } 105 }
@@ -104,6 +120,12 @@ static inline void ctr_write(unsigned int i, unsigned int val)
104 case 3: 120 case 3:
105 mtpmr(PMRN_PMC3, val); 121 mtpmr(PMRN_PMC3, val);
106 break; 122 break;
123 case 4:
124 mtpmr(PMRN_PMC4, val);
125 break;
126 case 5:
127 mtpmr(PMRN_PMC5, val);
128 break;
107 default: 129 default:
108 break; 130 break;
109 } 131 }
@@ -133,6 +155,14 @@ static void init_pmc_stop(int ctr)
133 mtpmr(PMRN_PMLCA3, pmlca); 155 mtpmr(PMRN_PMLCA3, pmlca);
134 mtpmr(PMRN_PMLCB3, pmlcb); 156 mtpmr(PMRN_PMLCB3, pmlcb);
135 break; 157 break;
158 case 4:
159 mtpmr(PMRN_PMLCA4, pmlca);
160 mtpmr(PMRN_PMLCB4, pmlcb);
161 break;
162 case 5:
163 mtpmr(PMRN_PMLCA5, pmlca);
164 mtpmr(PMRN_PMLCB5, pmlcb);
165 break;
136 default: 166 default:
137 panic("Bad ctr number!\n"); 167 panic("Bad ctr number!\n");
138 } 168 }
diff --git a/arch/powerpc/perf/Makefile b/arch/powerpc/perf/Makefile
index 510fae10513d..60d71eea919c 100644
--- a/arch/powerpc/perf/Makefile
+++ b/arch/powerpc/perf/Makefile
@@ -9,7 +9,7 @@ obj64-$(CONFIG_PPC_PERF_CTRS) += power4-pmu.o ppc970-pmu.o power5-pmu.o \
9obj32-$(CONFIG_PPC_PERF_CTRS) += mpc7450-pmu.o 9obj32-$(CONFIG_PPC_PERF_CTRS) += mpc7450-pmu.o
10 10
11obj-$(CONFIG_FSL_EMB_PERF_EVENT) += core-fsl-emb.o 11obj-$(CONFIG_FSL_EMB_PERF_EVENT) += core-fsl-emb.o
12obj-$(CONFIG_FSL_EMB_PERF_EVENT_E500) += e500-pmu.o 12obj-$(CONFIG_FSL_EMB_PERF_EVENT_E500) += e500-pmu.o e6500-pmu.o
13 13
14obj-$(CONFIG_PPC64) += $(obj64-y) 14obj-$(CONFIG_PPC64) += $(obj64-y)
15obj-$(CONFIG_PPC32) += $(obj32-y) 15obj-$(CONFIG_PPC32) += $(obj32-y)
diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c
index eeae308cf982..29b89e863d7c 100644
--- a/arch/powerpc/perf/core-book3s.c
+++ b/arch/powerpc/perf/core-book3s.c
@@ -24,7 +24,7 @@
24#define BHRB_MAX_ENTRIES 32 24#define BHRB_MAX_ENTRIES 32
25#define BHRB_TARGET 0x0000000000000002 25#define BHRB_TARGET 0x0000000000000002
26#define BHRB_PREDICTION 0x0000000000000001 26#define BHRB_PREDICTION 0x0000000000000001
27#define BHRB_EA 0xFFFFFFFFFFFFFFFC 27#define BHRB_EA 0xFFFFFFFFFFFFFFFCUL
28 28
29struct cpu_hw_events { 29struct cpu_hw_events {
30 int n_events; 30 int n_events;
diff --git a/arch/powerpc/perf/core-fsl-emb.c b/arch/powerpc/perf/core-fsl-emb.c
index 106c53354675..d35ae52c69dc 100644
--- a/arch/powerpc/perf/core-fsl-emb.c
+++ b/arch/powerpc/perf/core-fsl-emb.c
@@ -70,6 +70,12 @@ static unsigned long read_pmc(int idx)
70 case 3: 70 case 3:
71 val = mfpmr(PMRN_PMC3); 71 val = mfpmr(PMRN_PMC3);
72 break; 72 break;
73 case 4:
74 val = mfpmr(PMRN_PMC4);
75 break;
76 case 5:
77 val = mfpmr(PMRN_PMC5);
78 break;
73 default: 79 default:
74 printk(KERN_ERR "oops trying to read PMC%d\n", idx); 80 printk(KERN_ERR "oops trying to read PMC%d\n", idx);
75 val = 0; 81 val = 0;
@@ -95,6 +101,12 @@ static void write_pmc(int idx, unsigned long val)
95 case 3: 101 case 3:
96 mtpmr(PMRN_PMC3, val); 102 mtpmr(PMRN_PMC3, val);
97 break; 103 break;
104 case 4:
105 mtpmr(PMRN_PMC4, val);
106 break;
107 case 5:
108 mtpmr(PMRN_PMC5, val);
109 break;
98 default: 110 default:
99 printk(KERN_ERR "oops trying to write PMC%d\n", idx); 111 printk(KERN_ERR "oops trying to write PMC%d\n", idx);
100 } 112 }
@@ -120,6 +132,12 @@ static void write_pmlca(int idx, unsigned long val)
120 case 3: 132 case 3:
121 mtpmr(PMRN_PMLCA3, val); 133 mtpmr(PMRN_PMLCA3, val);
122 break; 134 break;
135 case 4:
136 mtpmr(PMRN_PMLCA4, val);
137 break;
138 case 5:
139 mtpmr(PMRN_PMLCA5, val);
140 break;
123 default: 141 default:
124 printk(KERN_ERR "oops trying to write PMLCA%d\n", idx); 142 printk(KERN_ERR "oops trying to write PMLCA%d\n", idx);
125 } 143 }
@@ -145,6 +163,12 @@ static void write_pmlcb(int idx, unsigned long val)
145 case 3: 163 case 3:
146 mtpmr(PMRN_PMLCB3, val); 164 mtpmr(PMRN_PMLCB3, val);
147 break; 165 break;
166 case 4:
167 mtpmr(PMRN_PMLCB4, val);
168 break;
169 case 5:
170 mtpmr(PMRN_PMLCB5, val);
171 break;
148 default: 172 default:
149 printk(KERN_ERR "oops trying to write PMLCB%d\n", idx); 173 printk(KERN_ERR "oops trying to write PMLCB%d\n", idx);
150 } 174 }
@@ -462,6 +486,12 @@ static int fsl_emb_pmu_event_init(struct perf_event *event)
462 int num_restricted; 486 int num_restricted;
463 int i; 487 int i;
464 488
489 if (ppmu->n_counter > MAX_HWEVENTS) {
490 WARN(1, "No. of perf counters (%d) is higher than max array size(%d)\n",
491 ppmu->n_counter, MAX_HWEVENTS);
492 ppmu->n_counter = MAX_HWEVENTS;
493 }
494
465 switch (event->attr.type) { 495 switch (event->attr.type) {
466 case PERF_TYPE_HARDWARE: 496 case PERF_TYPE_HARDWARE:
467 ev = event->attr.config; 497 ev = event->attr.config;
diff --git a/arch/powerpc/perf/e6500-pmu.c b/arch/powerpc/perf/e6500-pmu.c
new file mode 100644
index 000000000000..3d877aa777b5
--- /dev/null
+++ b/arch/powerpc/perf/e6500-pmu.c
@@ -0,0 +1,121 @@
1/*
2 * Performance counter support for e6500 family processors.
3 *
4 * Author: Priyanka Jain, Priyanka.Jain@freescale.com
5 * Based on e500-pmu.c
6 * Copyright 2013 Freescale Semiconductor, Inc.
7 * Copyright 2008-2009 Paul Mackerras, IBM Corporation.
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version
12 * 2 of the License, or (at your option) any later version.
13 */
14
15#include <linux/string.h>
16#include <linux/perf_event.h>
17#include <asm/reg.h>
18#include <asm/cputable.h>
19
20/*
21 * Map of generic hardware event types to hardware events
22 * Zero if unsupported
23 */
24static int e6500_generic_events[] = {
25 [PERF_COUNT_HW_CPU_CYCLES] = 1,
26 [PERF_COUNT_HW_INSTRUCTIONS] = 2,
27 [PERF_COUNT_HW_CACHE_MISSES] = 221,
28 [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = 12,
29 [PERF_COUNT_HW_BRANCH_MISSES] = 15,
30};
31
32#define C(x) PERF_COUNT_HW_CACHE_##x
33
34/*
35 * Table of generalized cache-related events.
36 * 0 means not supported, -1 means nonsensical, other values
37 * are event codes.
38 */
39static int e6500_cache_events[C(MAX)][C(OP_MAX)][C(RESULT_MAX)] = {
40 [C(L1D)] = {
41 /*RESULT_ACCESS RESULT_MISS */
42 [C(OP_READ)] = { 27, 222 },
43 [C(OP_WRITE)] = { 28, 223 },
44 [C(OP_PREFETCH)] = { 29, 0 },
45 },
46 [C(L1I)] = {
47 /*RESULT_ACCESS RESULT_MISS */
48 [C(OP_READ)] = { 2, 254 },
49 [C(OP_WRITE)] = { -1, -1 },
50 [C(OP_PREFETCH)] = { 37, 0 },
51 },
52 /*
53 * Assuming LL means L2, it's not a good match for this model.
54 * It does not have separate read/write events (but it does have
55 * separate instruction/data events).
56 */
57 [C(LL)] = {
58 /*RESULT_ACCESS RESULT_MISS */
59 [C(OP_READ)] = { 0, 0 },
60 [C(OP_WRITE)] = { 0, 0 },
61 [C(OP_PREFETCH)] = { 0, 0 },
62 },
63 /*
64 * There are data/instruction MMU misses, but that's a miss on
65 * the chip's internal level-one TLB which is probably not
66 * what the user wants. Instead, unified level-two TLB misses
67 * are reported here.
68 */
69 [C(DTLB)] = {
70 /*RESULT_ACCESS RESULT_MISS */
71 [C(OP_READ)] = { 26, 66 },
72 [C(OP_WRITE)] = { -1, -1 },
73 [C(OP_PREFETCH)] = { -1, -1 },
74 },
75 [C(BPU)] = {
76 /*RESULT_ACCESS RESULT_MISS */
77 [C(OP_READ)] = { 12, 15 },
78 [C(OP_WRITE)] = { -1, -1 },
79 [C(OP_PREFETCH)] = { -1, -1 },
80 },
81 [C(NODE)] = {
82 /* RESULT_ACCESS RESULT_MISS */
83 [C(OP_READ)] = { -1, -1 },
84 [C(OP_WRITE)] = { -1, -1 },
85 [C(OP_PREFETCH)] = { -1, -1 },
86 },
87};
88
89static int num_events = 512;
90
91/* Upper half of event id is PMLCb, for threshold events */
92static u64 e6500_xlate_event(u64 event_id)
93{
94 u32 event_low = (u32)event_id;
95 if (event_low >= num_events ||
96 (event_id & (FSL_EMB_EVENT_THRESHMUL | FSL_EMB_EVENT_THRESH)))
97 return 0;
98
99 return FSL_EMB_EVENT_VALID;
100}
101
102static struct fsl_emb_pmu e6500_pmu = {
103 .name = "e6500 family",
104 .n_counter = 6,
105 .n_restricted = 0,
106 .xlate_event = e6500_xlate_event,
107 .n_generic = ARRAY_SIZE(e6500_generic_events),
108 .generic_events = e6500_generic_events,
109 .cache_events = &e6500_cache_events,
110};
111
112static int init_e6500_pmu(void)
113{
114 if (!cur_cpu_spec->oprofile_cpu_type ||
115 strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc/e6500"))
116 return -ENODEV;
117
118 return register_fsl_emb_pmu(&e6500_pmu);
119}
120
121early_initcall(init_e6500_pmu);
diff --git a/arch/powerpc/perf/power7-events-list.h b/arch/powerpc/perf/power7-events-list.h
new file mode 100644
index 000000000000..687790a2c0b8
--- /dev/null
+++ b/arch/powerpc/perf/power7-events-list.h
@@ -0,0 +1,548 @@
1/*
2 * Performance counter support for POWER7 processors.
3 *
4 * Copyright 2013 Runzhen Wang, IBM Corporation.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
10 */
11
12EVENT(PM_IC_DEMAND_L2_BR_ALL, 0x04898)
13EVENT(PM_GCT_UTIL_7_TO_10_SLOTS, 0x020a0)
14EVENT(PM_PMC2_SAVED, 0x10022)
15EVENT(PM_CMPLU_STALL_DFU, 0x2003c)
16EVENT(PM_VSU0_16FLOP, 0x0a0a4)
17EVENT(PM_MRK_LSU_DERAT_MISS, 0x3d05a)
18EVENT(PM_MRK_ST_CMPL, 0x10034)
19EVENT(PM_NEST_PAIR3_ADD, 0x40881)
20EVENT(PM_L2_ST_DISP, 0x46180)
21EVENT(PM_L2_CASTOUT_MOD, 0x16180)
22EVENT(PM_ISEG, 0x020a4)
23EVENT(PM_MRK_INST_TIMEO, 0x40034)
24EVENT(PM_L2_RCST_DISP_FAIL_ADDR, 0x36282)
25EVENT(PM_LSU1_DC_PREF_STREAM_CONFIRM, 0x0d0b6)
26EVENT(PM_IERAT_WR_64K, 0x040be)
27EVENT(PM_MRK_DTLB_MISS_16M, 0x4d05e)
28EVENT(PM_IERAT_MISS, 0x100f6)
29EVENT(PM_MRK_PTEG_FROM_LMEM, 0x4d052)
30EVENT(PM_FLOP, 0x100f4)
31EVENT(PM_THRD_PRIO_4_5_CYC, 0x040b4)
32EVENT(PM_BR_PRED_TA, 0x040aa)
33EVENT(PM_CMPLU_STALL_FXU, 0x20014)
34EVENT(PM_EXT_INT, 0x200f8)
35EVENT(PM_VSU_FSQRT_FDIV, 0x0a888)
36EVENT(PM_MRK_LD_MISS_EXPOSED_CYC, 0x1003e)
37EVENT(PM_LSU1_LDF, 0x0c086)
38EVENT(PM_IC_WRITE_ALL, 0x0488c)
39EVENT(PM_LSU0_SRQ_STFWD, 0x0c0a0)
40EVENT(PM_PTEG_FROM_RL2L3_MOD, 0x1c052)
41EVENT(PM_MRK_DATA_FROM_L31_SHR, 0x1d04e)
42EVENT(PM_DATA_FROM_L21_MOD, 0x3c046)
43EVENT(PM_VSU1_SCAL_DOUBLE_ISSUED, 0x0b08a)
44EVENT(PM_VSU0_8FLOP, 0x0a0a0)
45EVENT(PM_POWER_EVENT1, 0x1006e)
46EVENT(PM_DISP_CLB_HELD_BAL, 0x02092)
47EVENT(PM_VSU1_2FLOP, 0x0a09a)
48EVENT(PM_LWSYNC_HELD, 0x0209a)
49EVENT(PM_PTEG_FROM_DL2L3_SHR, 0x3c054)
50EVENT(PM_INST_FROM_L21_MOD, 0x34046)
51EVENT(PM_IERAT_XLATE_WR_16MPLUS, 0x040bc)
52EVENT(PM_IC_REQ_ALL, 0x04888)
53EVENT(PM_DSLB_MISS, 0x0d090)
54EVENT(PM_L3_MISS, 0x1f082)
55EVENT(PM_LSU0_L1_PREF, 0x0d0b8)
56EVENT(PM_VSU_SCALAR_SINGLE_ISSUED, 0x0b884)
57EVENT(PM_LSU1_DC_PREF_STREAM_CONFIRM_STRIDE, 0x0d0be)
58EVENT(PM_L2_INST, 0x36080)
59EVENT(PM_VSU0_FRSP, 0x0a0b4)
60EVENT(PM_FLUSH_DISP, 0x02082)
61EVENT(PM_PTEG_FROM_L2MISS, 0x4c058)
62EVENT(PM_VSU1_DQ_ISSUED, 0x0b09a)
63EVENT(PM_CMPLU_STALL_LSU, 0x20012)
64EVENT(PM_MRK_DATA_FROM_DMEM, 0x1d04a)
65EVENT(PM_LSU_FLUSH_ULD, 0x0c8b0)
66EVENT(PM_PTEG_FROM_LMEM, 0x4c052)
67EVENT(PM_MRK_DERAT_MISS_16M, 0x3d05c)
68EVENT(PM_THRD_ALL_RUN_CYC, 0x2000c)
69EVENT(PM_MEM0_PREFETCH_DISP, 0x20083)
70EVENT(PM_MRK_STALL_CMPLU_CYC_COUNT, 0x3003f)
71EVENT(PM_DATA_FROM_DL2L3_MOD, 0x3c04c)
72EVENT(PM_VSU_FRSP, 0x0a8b4)
73EVENT(PM_MRK_DATA_FROM_L21_MOD, 0x3d046)
74EVENT(PM_PMC1_OVERFLOW, 0x20010)
75EVENT(PM_VSU0_SINGLE, 0x0a0a8)
76EVENT(PM_MRK_PTEG_FROM_L3MISS, 0x2d058)
77EVENT(PM_MRK_PTEG_FROM_L31_SHR, 0x2d056)
78EVENT(PM_VSU0_VECTOR_SP_ISSUED, 0x0b090)
79EVENT(PM_VSU1_FEST, 0x0a0ba)
80EVENT(PM_MRK_INST_DISP, 0x20030)
81EVENT(PM_VSU0_COMPLEX_ISSUED, 0x0b096)
82EVENT(PM_LSU1_FLUSH_UST, 0x0c0b6)
83EVENT(PM_INST_CMPL, 0x00002)
84EVENT(PM_FXU_IDLE, 0x1000e)
85EVENT(PM_LSU0_FLUSH_ULD, 0x0c0b0)
86EVENT(PM_MRK_DATA_FROM_DL2L3_MOD, 0x3d04c)
87EVENT(PM_LSU_LMQ_SRQ_EMPTY_ALL_CYC, 0x3001c)
88EVENT(PM_LSU1_REJECT_LMQ_FULL, 0x0c0a6)
89EVENT(PM_INST_PTEG_FROM_L21_MOD, 0x3e056)
90EVENT(PM_INST_FROM_RL2L3_MOD, 0x14042)
91EVENT(PM_SHL_CREATED, 0x05082)
92EVENT(PM_L2_ST_HIT, 0x46182)
93EVENT(PM_DATA_FROM_DMEM, 0x1c04a)
94EVENT(PM_L3_LD_MISS, 0x2f082)
95EVENT(PM_FXU1_BUSY_FXU0_IDLE, 0x4000e)
96EVENT(PM_DISP_CLB_HELD_RES, 0x02094)
97EVENT(PM_L2_SN_SX_I_DONE, 0x36382)
98EVENT(PM_GRP_CMPL, 0x30004)
99EVENT(PM_STCX_CMPL, 0x0c098)
100EVENT(PM_VSU0_2FLOP, 0x0a098)
101EVENT(PM_L3_PREF_MISS, 0x3f082)
102EVENT(PM_LSU_SRQ_SYNC_CYC, 0x0d096)
103EVENT(PM_LSU_REJECT_ERAT_MISS, 0x20064)
104EVENT(PM_L1_ICACHE_MISS, 0x200fc)
105EVENT(PM_LSU1_FLUSH_SRQ, 0x0c0be)
106EVENT(PM_LD_REF_L1_LSU0, 0x0c080)
107EVENT(PM_VSU0_FEST, 0x0a0b8)
108EVENT(PM_VSU_VECTOR_SINGLE_ISSUED, 0x0b890)
109EVENT(PM_FREQ_UP, 0x4000c)
110EVENT(PM_DATA_FROM_LMEM, 0x3c04a)
111EVENT(PM_LSU1_LDX, 0x0c08a)
112EVENT(PM_PMC3_OVERFLOW, 0x40010)
113EVENT(PM_MRK_BR_MPRED, 0x30036)
114EVENT(PM_SHL_MATCH, 0x05086)
115EVENT(PM_MRK_BR_TAKEN, 0x10036)
116EVENT(PM_CMPLU_STALL_BRU, 0x4004e)
117EVENT(PM_ISLB_MISS, 0x0d092)
118EVENT(PM_CYC, 0x0001e)
119EVENT(PM_DISP_HELD_THERMAL, 0x30006)
120EVENT(PM_INST_PTEG_FROM_RL2L3_SHR, 0x2e054)
121EVENT(PM_LSU1_SRQ_STFWD, 0x0c0a2)
122EVENT(PM_GCT_NOSLOT_BR_MPRED, 0x4001a)
123EVENT(PM_1PLUS_PPC_CMPL, 0x100f2)
124EVENT(PM_PTEG_FROM_DMEM, 0x2c052)
125EVENT(PM_VSU_2FLOP, 0x0a898)
126EVENT(PM_GCT_FULL_CYC, 0x04086)
127EVENT(PM_MRK_DATA_FROM_L3_CYC, 0x40020)
128EVENT(PM_LSU_SRQ_S0_ALLOC, 0x0d09d)
129EVENT(PM_MRK_DERAT_MISS_4K, 0x1d05c)
130EVENT(PM_BR_MPRED_TA, 0x040ae)
131EVENT(PM_INST_PTEG_FROM_L2MISS, 0x4e058)
132EVENT(PM_DPU_HELD_POWER, 0x20006)
133EVENT(PM_RUN_INST_CMPL, 0x400fa)
134EVENT(PM_MRK_VSU_FIN, 0x30032)
135EVENT(PM_LSU_SRQ_S0_VALID, 0x0d09c)
136EVENT(PM_GCT_EMPTY_CYC, 0x20008)
137EVENT(PM_IOPS_DISP, 0x30014)
138EVENT(PM_RUN_SPURR, 0x10008)
139EVENT(PM_PTEG_FROM_L21_MOD, 0x3c056)
140EVENT(PM_VSU0_1FLOP, 0x0a080)
141EVENT(PM_SNOOP_TLBIE, 0x0d0b2)
142EVENT(PM_DATA_FROM_L3MISS, 0x2c048)
143EVENT(PM_VSU_SINGLE, 0x0a8a8)
144EVENT(PM_DTLB_MISS_16G, 0x1c05e)
145EVENT(PM_CMPLU_STALL_VECTOR, 0x2001c)
146EVENT(PM_FLUSH, 0x400f8)
147EVENT(PM_L2_LD_HIT, 0x36182)
148EVENT(PM_NEST_PAIR2_AND, 0x30883)
149EVENT(PM_VSU1_1FLOP, 0x0a082)
150EVENT(PM_IC_PREF_REQ, 0x0408a)
151EVENT(PM_L3_LD_HIT, 0x2f080)
152EVENT(PM_GCT_NOSLOT_IC_MISS, 0x2001a)
153EVENT(PM_DISP_HELD, 0x10006)
154EVENT(PM_L2_LD, 0x16080)
155EVENT(PM_LSU_FLUSH_SRQ, 0x0c8bc)
156EVENT(PM_BC_PLUS_8_CONV, 0x040b8)
157EVENT(PM_MRK_DATA_FROM_L31_MOD_CYC, 0x40026)
158EVENT(PM_CMPLU_STALL_VECTOR_LONG, 0x4004a)
159EVENT(PM_L2_RCST_BUSY_RC_FULL, 0x26282)
160EVENT(PM_TB_BIT_TRANS, 0x300f8)
161EVENT(PM_THERMAL_MAX, 0x40006)
162EVENT(PM_LSU1_FLUSH_ULD, 0x0c0b2)
163EVENT(PM_LSU1_REJECT_LHS, 0x0c0ae)
164EVENT(PM_LSU_LRQ_S0_ALLOC, 0x0d09f)
165EVENT(PM_L3_CO_L31, 0x4f080)
166EVENT(PM_POWER_EVENT4, 0x4006e)
167EVENT(PM_DATA_FROM_L31_SHR, 0x1c04e)
168EVENT(PM_BR_UNCOND, 0x0409e)
169EVENT(PM_LSU1_DC_PREF_STREAM_ALLOC, 0x0d0aa)
170EVENT(PM_PMC4_REWIND, 0x10020)
171EVENT(PM_L2_RCLD_DISP, 0x16280)
172EVENT(PM_THRD_PRIO_2_3_CYC, 0x040b2)
173EVENT(PM_MRK_PTEG_FROM_L2MISS, 0x4d058)
174EVENT(PM_IC_DEMAND_L2_BHT_REDIRECT, 0x04098)
175EVENT(PM_LSU_DERAT_MISS, 0x200f6)
176EVENT(PM_IC_PREF_CANCEL_L2, 0x04094)
177EVENT(PM_MRK_FIN_STALL_CYC_COUNT, 0x1003d)
178EVENT(PM_BR_PRED_CCACHE, 0x040a0)
179EVENT(PM_GCT_UTIL_1_TO_2_SLOTS, 0x0209c)
180EVENT(PM_MRK_ST_CMPL_INT, 0x30034)
181EVENT(PM_LSU_TWO_TABLEWALK_CYC, 0x0d0a6)
182EVENT(PM_MRK_DATA_FROM_L3MISS, 0x2d048)
183EVENT(PM_GCT_NOSLOT_CYC, 0x100f8)
184EVENT(PM_LSU_SET_MPRED, 0x0c0a8)
185EVENT(PM_FLUSH_DISP_TLBIE, 0x0208a)
186EVENT(PM_VSU1_FCONV, 0x0a0b2)
187EVENT(PM_DERAT_MISS_16G, 0x4c05c)
188EVENT(PM_INST_FROM_LMEM, 0x3404a)
189EVENT(PM_IC_DEMAND_L2_BR_REDIRECT, 0x0409a)
190EVENT(PM_CMPLU_STALL_SCALAR_LONG, 0x20018)
191EVENT(PM_INST_PTEG_FROM_L2, 0x1e050)
192EVENT(PM_PTEG_FROM_L2, 0x1c050)
193EVENT(PM_MRK_DATA_FROM_L21_SHR_CYC, 0x20024)
194EVENT(PM_MRK_DTLB_MISS_4K, 0x2d05a)
195EVENT(PM_VSU0_FPSCR, 0x0b09c)
196EVENT(PM_VSU1_VECT_DOUBLE_ISSUED, 0x0b082)
197EVENT(PM_MRK_PTEG_FROM_RL2L3_MOD, 0x1d052)
198EVENT(PM_MEM0_RQ_DISP, 0x10083)
199EVENT(PM_L2_LD_MISS, 0x26080)
200EVENT(PM_VMX_RESULT_SAT_1, 0x0b0a0)
201EVENT(PM_L1_PREF, 0x0d8b8)
202EVENT(PM_MRK_DATA_FROM_LMEM_CYC, 0x2002c)
203EVENT(PM_GRP_IC_MISS_NONSPEC, 0x1000c)
204EVENT(PM_PB_NODE_PUMP, 0x10081)
205EVENT(PM_SHL_MERGED, 0x05084)
206EVENT(PM_NEST_PAIR1_ADD, 0x20881)
207EVENT(PM_DATA_FROM_L3, 0x1c048)
208EVENT(PM_LSU_FLUSH, 0x0208e)
209EVENT(PM_LSU_SRQ_SYNC_COUNT, 0x0d097)
210EVENT(PM_PMC2_OVERFLOW, 0x30010)
211EVENT(PM_LSU_LDF, 0x0c884)
212EVENT(PM_POWER_EVENT3, 0x3006e)
213EVENT(PM_DISP_WT, 0x30008)
214EVENT(PM_CMPLU_STALL_REJECT, 0x40016)
215EVENT(PM_IC_BANK_CONFLICT, 0x04082)
216EVENT(PM_BR_MPRED_CR_TA, 0x048ae)
217EVENT(PM_L2_INST_MISS, 0x36082)
218EVENT(PM_CMPLU_STALL_ERAT_MISS, 0x40018)
219EVENT(PM_NEST_PAIR2_ADD, 0x30881)
220EVENT(PM_MRK_LSU_FLUSH, 0x0d08c)
221EVENT(PM_L2_LDST, 0x16880)
222EVENT(PM_INST_FROM_L31_SHR, 0x1404e)
223EVENT(PM_VSU0_FIN, 0x0a0bc)
224EVENT(PM_LARX_LSU, 0x0c894)
225EVENT(PM_INST_FROM_RMEM, 0x34042)
226EVENT(PM_DISP_CLB_HELD_TLBIE, 0x02096)
227EVENT(PM_MRK_DATA_FROM_DMEM_CYC, 0x2002e)
228EVENT(PM_BR_PRED_CR, 0x040a8)
229EVENT(PM_LSU_REJECT, 0x10064)
230EVENT(PM_GCT_UTIL_3_TO_6_SLOTS, 0x0209e)
231EVENT(PM_CMPLU_STALL_END_GCT_NOSLOT, 0x10028)
232EVENT(PM_LSU0_REJECT_LMQ_FULL, 0x0c0a4)
233EVENT(PM_VSU_FEST, 0x0a8b8)
234EVENT(PM_NEST_PAIR0_AND, 0x10883)
235EVENT(PM_PTEG_FROM_L3, 0x2c050)
236EVENT(PM_POWER_EVENT2, 0x2006e)
237EVENT(PM_IC_PREF_CANCEL_PAGE, 0x04090)
238EVENT(PM_VSU0_FSQRT_FDIV, 0x0a088)
239EVENT(PM_MRK_GRP_CMPL, 0x40030)
240EVENT(PM_VSU0_SCAL_DOUBLE_ISSUED, 0x0b088)
241EVENT(PM_GRP_DISP, 0x3000a)
242EVENT(PM_LSU0_LDX, 0x0c088)
243EVENT(PM_DATA_FROM_L2, 0x1c040)
244EVENT(PM_MRK_DATA_FROM_RL2L3_MOD, 0x1d042)
245EVENT(PM_LD_REF_L1, 0x0c880)
246EVENT(PM_VSU0_VECT_DOUBLE_ISSUED, 0x0b080)
247EVENT(PM_VSU1_2FLOP_DOUBLE, 0x0a08e)
248EVENT(PM_THRD_PRIO_6_7_CYC, 0x040b6)
249EVENT(PM_BC_PLUS_8_RSLV_TAKEN, 0x040ba)
250EVENT(PM_BR_MPRED_CR, 0x040ac)
251EVENT(PM_L3_CO_MEM, 0x4f082)
252EVENT(PM_LD_MISS_L1, 0x400f0)
253EVENT(PM_DATA_FROM_RL2L3_MOD, 0x1c042)
254EVENT(PM_LSU_SRQ_FULL_CYC, 0x1001a)
255EVENT(PM_TABLEWALK_CYC, 0x10026)
256EVENT(PM_MRK_PTEG_FROM_RMEM, 0x3d052)
257EVENT(PM_LSU_SRQ_STFWD, 0x0c8a0)
258EVENT(PM_INST_PTEG_FROM_RMEM, 0x3e052)
259EVENT(PM_FXU0_FIN, 0x10004)
260EVENT(PM_LSU1_L1_SW_PREF, 0x0c09e)
261EVENT(PM_PTEG_FROM_L31_MOD, 0x1c054)
262EVENT(PM_PMC5_OVERFLOW, 0x10024)
263EVENT(PM_LD_REF_L1_LSU1, 0x0c082)
264EVENT(PM_INST_PTEG_FROM_L21_SHR, 0x4e056)
265EVENT(PM_CMPLU_STALL_THRD, 0x1001c)
266EVENT(PM_DATA_FROM_RMEM, 0x3c042)
267EVENT(PM_VSU0_SCAL_SINGLE_ISSUED, 0x0b084)
268EVENT(PM_BR_MPRED_LSTACK, 0x040a6)
269EVENT(PM_MRK_DATA_FROM_RL2L3_MOD_CYC, 0x40028)
270EVENT(PM_LSU0_FLUSH_UST, 0x0c0b4)
271EVENT(PM_LSU_NCST, 0x0c090)
272EVENT(PM_BR_TAKEN, 0x20004)
273EVENT(PM_INST_PTEG_FROM_LMEM, 0x4e052)
274EVENT(PM_GCT_NOSLOT_BR_MPRED_IC_MISS, 0x4001c)
275EVENT(PM_DTLB_MISS_4K, 0x2c05a)
276EVENT(PM_PMC4_SAVED, 0x30022)
277EVENT(PM_VSU1_PERMUTE_ISSUED, 0x0b092)
278EVENT(PM_SLB_MISS, 0x0d890)
279EVENT(PM_LSU1_FLUSH_LRQ, 0x0c0ba)
280EVENT(PM_DTLB_MISS, 0x300fc)
281EVENT(PM_VSU1_FRSP, 0x0a0b6)
282EVENT(PM_VSU_VECTOR_DOUBLE_ISSUED, 0x0b880)
283EVENT(PM_L2_CASTOUT_SHR, 0x16182)
284EVENT(PM_DATA_FROM_DL2L3_SHR, 0x3c044)
285EVENT(PM_VSU1_STF, 0x0b08e)
286EVENT(PM_ST_FIN, 0x200f0)
287EVENT(PM_PTEG_FROM_L21_SHR, 0x4c056)
288EVENT(PM_L2_LOC_GUESS_WRONG, 0x26480)
289EVENT(PM_MRK_STCX_FAIL, 0x0d08e)
290EVENT(PM_LSU0_REJECT_LHS, 0x0c0ac)
291EVENT(PM_IC_PREF_CANCEL_HIT, 0x04092)
292EVENT(PM_L3_PREF_BUSY, 0x4f080)
293EVENT(PM_MRK_BRU_FIN, 0x2003a)
294EVENT(PM_LSU1_NCLD, 0x0c08e)
295EVENT(PM_INST_PTEG_FROM_L31_MOD, 0x1e054)
296EVENT(PM_LSU_NCLD, 0x0c88c)
297EVENT(PM_LSU_LDX, 0x0c888)
298EVENT(PM_L2_LOC_GUESS_CORRECT, 0x16480)
299EVENT(PM_THRESH_TIMEO, 0x10038)
300EVENT(PM_L3_PREF_ST, 0x0d0ae)
301EVENT(PM_DISP_CLB_HELD_SYNC, 0x02098)
302EVENT(PM_VSU_SIMPLE_ISSUED, 0x0b894)
303EVENT(PM_VSU1_SINGLE, 0x0a0aa)
304EVENT(PM_DATA_TABLEWALK_CYC, 0x3001a)
305EVENT(PM_L2_RC_ST_DONE, 0x36380)
306EVENT(PM_MRK_PTEG_FROM_L21_MOD, 0x3d056)
307EVENT(PM_LARX_LSU1, 0x0c096)
308EVENT(PM_MRK_DATA_FROM_RMEM, 0x3d042)
309EVENT(PM_DISP_CLB_HELD, 0x02090)
310EVENT(PM_DERAT_MISS_4K, 0x1c05c)
311EVENT(PM_L2_RCLD_DISP_FAIL_ADDR, 0x16282)
312EVENT(PM_SEG_EXCEPTION, 0x028a4)
313EVENT(PM_FLUSH_DISP_SB, 0x0208c)
314EVENT(PM_L2_DC_INV, 0x26182)
315EVENT(PM_PTEG_FROM_DL2L3_MOD, 0x4c054)
316EVENT(PM_DSEG, 0x020a6)
317EVENT(PM_BR_PRED_LSTACK, 0x040a2)
318EVENT(PM_VSU0_STF, 0x0b08c)
319EVENT(PM_LSU_FX_FIN, 0x10066)
320EVENT(PM_DERAT_MISS_16M, 0x3c05c)
321EVENT(PM_MRK_PTEG_FROM_DL2L3_MOD, 0x4d054)
322EVENT(PM_GCT_UTIL_11_PLUS_SLOTS, 0x020a2)
323EVENT(PM_INST_FROM_L3, 0x14048)
324EVENT(PM_MRK_IFU_FIN, 0x3003a)
325EVENT(PM_ITLB_MISS, 0x400fc)
326EVENT(PM_VSU_STF, 0x0b88c)
327EVENT(PM_LSU_FLUSH_UST, 0x0c8b4)
328EVENT(PM_L2_LDST_MISS, 0x26880)
329EVENT(PM_FXU1_FIN, 0x40004)
330EVENT(PM_SHL_DEALLOCATED, 0x05080)
331EVENT(PM_L2_SN_M_WR_DONE, 0x46382)
332EVENT(PM_LSU_REJECT_SET_MPRED, 0x0c8a8)
333EVENT(PM_L3_PREF_LD, 0x0d0ac)
334EVENT(PM_L2_SN_M_RD_DONE, 0x46380)
335EVENT(PM_MRK_DERAT_MISS_16G, 0x4d05c)
336EVENT(PM_VSU_FCONV, 0x0a8b0)
337EVENT(PM_ANY_THRD_RUN_CYC, 0x100fa)
338EVENT(PM_LSU_LMQ_FULL_CYC, 0x0d0a4)
339EVENT(PM_MRK_LSU_REJECT_LHS, 0x0d082)
340EVENT(PM_MRK_LD_MISS_L1_CYC, 0x4003e)
341EVENT(PM_MRK_DATA_FROM_L2_CYC, 0x20020)
342EVENT(PM_INST_IMC_MATCH_DISP, 0x30016)
343EVENT(PM_MRK_DATA_FROM_RMEM_CYC, 0x4002c)
344EVENT(PM_VSU0_SIMPLE_ISSUED, 0x0b094)
345EVENT(PM_CMPLU_STALL_DIV, 0x40014)
346EVENT(PM_MRK_PTEG_FROM_RL2L3_SHR, 0x2d054)
347EVENT(PM_VSU_FMA_DOUBLE, 0x0a890)
348EVENT(PM_VSU_4FLOP, 0x0a89c)
349EVENT(PM_VSU1_FIN, 0x0a0be)
350EVENT(PM_NEST_PAIR1_AND, 0x20883)
351EVENT(PM_INST_PTEG_FROM_RL2L3_MOD, 0x1e052)
352EVENT(PM_RUN_CYC, 0x200f4)
353EVENT(PM_PTEG_FROM_RMEM, 0x3c052)
354EVENT(PM_LSU_LRQ_S0_VALID, 0x0d09e)
355EVENT(PM_LSU0_LDF, 0x0c084)
356EVENT(PM_FLUSH_COMPLETION, 0x30012)
357EVENT(PM_ST_MISS_L1, 0x300f0)
358EVENT(PM_L2_NODE_PUMP, 0x36480)
359EVENT(PM_INST_FROM_DL2L3_SHR, 0x34044)
360EVENT(PM_MRK_STALL_CMPLU_CYC, 0x3003e)
361EVENT(PM_VSU1_DENORM, 0x0a0ae)
362EVENT(PM_MRK_DATA_FROM_L31_SHR_CYC, 0x20026)
363EVENT(PM_NEST_PAIR0_ADD, 0x10881)
364EVENT(PM_INST_FROM_L3MISS, 0x24048)
365EVENT(PM_EE_OFF_EXT_INT, 0x02080)
366EVENT(PM_INST_PTEG_FROM_DMEM, 0x2e052)
367EVENT(PM_INST_FROM_DL2L3_MOD, 0x3404c)
368EVENT(PM_PMC6_OVERFLOW, 0x30024)
369EVENT(PM_VSU_2FLOP_DOUBLE, 0x0a88c)
370EVENT(PM_TLB_MISS, 0x20066)
371EVENT(PM_FXU_BUSY, 0x2000e)
372EVENT(PM_L2_RCLD_DISP_FAIL_OTHER, 0x26280)
373EVENT(PM_LSU_REJECT_LMQ_FULL, 0x0c8a4)
374EVENT(PM_IC_RELOAD_SHR, 0x04096)
375EVENT(PM_GRP_MRK, 0x10031)
376EVENT(PM_MRK_ST_NEST, 0x20034)
377EVENT(PM_VSU1_FSQRT_FDIV, 0x0a08a)
378EVENT(PM_LSU0_FLUSH_LRQ, 0x0c0b8)
379EVENT(PM_LARX_LSU0, 0x0c094)
380EVENT(PM_IBUF_FULL_CYC, 0x04084)
381EVENT(PM_MRK_DATA_FROM_DL2L3_SHR_CYC, 0x2002a)
382EVENT(PM_LSU_DC_PREF_STREAM_ALLOC, 0x0d8a8)
383EVENT(PM_GRP_MRK_CYC, 0x10030)
384EVENT(PM_MRK_DATA_FROM_RL2L3_SHR_CYC, 0x20028)
385EVENT(PM_L2_GLOB_GUESS_CORRECT, 0x16482)
386EVENT(PM_LSU_REJECT_LHS, 0x0c8ac)
387EVENT(PM_MRK_DATA_FROM_LMEM, 0x3d04a)
388EVENT(PM_INST_PTEG_FROM_L3, 0x2e050)
389EVENT(PM_FREQ_DOWN, 0x3000c)
390EVENT(PM_PB_RETRY_NODE_PUMP, 0x30081)
391EVENT(PM_INST_FROM_RL2L3_SHR, 0x1404c)
392EVENT(PM_MRK_INST_ISSUED, 0x10032)
393EVENT(PM_PTEG_FROM_L3MISS, 0x2c058)
394EVENT(PM_RUN_PURR, 0x400f4)
395EVENT(PM_MRK_GRP_IC_MISS, 0x40038)
396EVENT(PM_MRK_DATA_FROM_L3, 0x1d048)
397EVENT(PM_CMPLU_STALL_DCACHE_MISS, 0x20016)
398EVENT(PM_PTEG_FROM_RL2L3_SHR, 0x2c054)
399EVENT(PM_LSU_FLUSH_LRQ, 0x0c8b8)
400EVENT(PM_MRK_DERAT_MISS_64K, 0x2d05c)
401EVENT(PM_INST_PTEG_FROM_DL2L3_MOD, 0x4e054)
402EVENT(PM_L2_ST_MISS, 0x26082)
403EVENT(PM_MRK_PTEG_FROM_L21_SHR, 0x4d056)
404EVENT(PM_LWSYNC, 0x0d094)
405EVENT(PM_LSU0_DC_PREF_STREAM_CONFIRM_STRIDE, 0x0d0bc)
406EVENT(PM_MRK_LSU_FLUSH_LRQ, 0x0d088)
407EVENT(PM_INST_IMC_MATCH_CMPL, 0x100f0)
408EVENT(PM_NEST_PAIR3_AND, 0x40883)
409EVENT(PM_PB_RETRY_SYS_PUMP, 0x40081)
410EVENT(PM_MRK_INST_FIN, 0x30030)
411EVENT(PM_MRK_PTEG_FROM_DL2L3_SHR, 0x3d054)
412EVENT(PM_INST_FROM_L31_MOD, 0x14044)
413EVENT(PM_MRK_DTLB_MISS_64K, 0x3d05e)
414EVENT(PM_LSU_FIN, 0x30066)
415EVENT(PM_MRK_LSU_REJECT, 0x40064)
416EVENT(PM_L2_CO_FAIL_BUSY, 0x16382)
417EVENT(PM_MEM0_WQ_DISP, 0x40083)
418EVENT(PM_DATA_FROM_L31_MOD, 0x1c044)
419EVENT(PM_THERMAL_WARN, 0x10016)
420EVENT(PM_VSU0_4FLOP, 0x0a09c)
421EVENT(PM_BR_MPRED_CCACHE, 0x040a4)
422EVENT(PM_CMPLU_STALL_IFU, 0x4004c)
423EVENT(PM_L1_DEMAND_WRITE, 0x0408c)
424EVENT(PM_FLUSH_BR_MPRED, 0x02084)
425EVENT(PM_MRK_DTLB_MISS_16G, 0x1d05e)
426EVENT(PM_MRK_PTEG_FROM_DMEM, 0x2d052)
427EVENT(PM_L2_RCST_DISP, 0x36280)
428EVENT(PM_CMPLU_STALL, 0x4000a)
429EVENT(PM_LSU_PARTIAL_CDF, 0x0c0aa)
430EVENT(PM_DISP_CLB_HELD_SB, 0x020a8)
431EVENT(PM_VSU0_FMA_DOUBLE, 0x0a090)
432EVENT(PM_FXU0_BUSY_FXU1_IDLE, 0x3000e)
433EVENT(PM_IC_DEMAND_CYC, 0x10018)
434EVENT(PM_MRK_DATA_FROM_L21_SHR, 0x3d04e)
435EVENT(PM_MRK_LSU_FLUSH_UST, 0x0d086)
436EVENT(PM_INST_PTEG_FROM_L3MISS, 0x2e058)
437EVENT(PM_VSU_DENORM, 0x0a8ac)
438EVENT(PM_MRK_LSU_PARTIAL_CDF, 0x0d080)
439EVENT(PM_INST_FROM_L21_SHR, 0x3404e)
440EVENT(PM_IC_PREF_WRITE, 0x0408e)
441EVENT(PM_BR_PRED, 0x0409c)
442EVENT(PM_INST_FROM_DMEM, 0x1404a)
443EVENT(PM_IC_PREF_CANCEL_ALL, 0x04890)
444EVENT(PM_LSU_DC_PREF_STREAM_CONFIRM, 0x0d8b4)
445EVENT(PM_MRK_LSU_FLUSH_SRQ, 0x0d08a)
446EVENT(PM_MRK_FIN_STALL_CYC, 0x1003c)
447EVENT(PM_L2_RCST_DISP_FAIL_OTHER, 0x46280)
448EVENT(PM_VSU1_DD_ISSUED, 0x0b098)
449EVENT(PM_PTEG_FROM_L31_SHR, 0x2c056)
450EVENT(PM_DATA_FROM_L21_SHR, 0x3c04e)
451EVENT(PM_LSU0_NCLD, 0x0c08c)
452EVENT(PM_VSU1_4FLOP, 0x0a09e)
453EVENT(PM_VSU1_8FLOP, 0x0a0a2)
454EVENT(PM_VSU_8FLOP, 0x0a8a0)
455EVENT(PM_LSU_LMQ_SRQ_EMPTY_CYC, 0x2003e)
456EVENT(PM_DTLB_MISS_64K, 0x3c05e)
457EVENT(PM_THRD_CONC_RUN_INST, 0x300f4)
458EVENT(PM_MRK_PTEG_FROM_L2, 0x1d050)
459EVENT(PM_PB_SYS_PUMP, 0x20081)
460EVENT(PM_VSU_FIN, 0x0a8bc)
461EVENT(PM_MRK_DATA_FROM_L31_MOD, 0x1d044)
462EVENT(PM_THRD_PRIO_0_1_CYC, 0x040b0)
463EVENT(PM_DERAT_MISS_64K, 0x2c05c)
464EVENT(PM_PMC2_REWIND, 0x30020)
465EVENT(PM_INST_FROM_L2, 0x14040)
466EVENT(PM_GRP_BR_MPRED_NONSPEC, 0x1000a)
467EVENT(PM_INST_DISP, 0x200f2)
468EVENT(PM_MEM0_RD_CANCEL_TOTAL, 0x30083)
469EVENT(PM_LSU0_DC_PREF_STREAM_CONFIRM, 0x0d0b4)
470EVENT(PM_L1_DCACHE_RELOAD_VALID, 0x300f6)
471EVENT(PM_VSU_SCALAR_DOUBLE_ISSUED, 0x0b888)
472EVENT(PM_L3_PREF_HIT, 0x3f080)
473EVENT(PM_MRK_PTEG_FROM_L31_MOD, 0x1d054)
474EVENT(PM_CMPLU_STALL_STORE, 0x2004a)
475EVENT(PM_MRK_FXU_FIN, 0x20038)
476EVENT(PM_PMC4_OVERFLOW, 0x10010)
477EVENT(PM_MRK_PTEG_FROM_L3, 0x2d050)
478EVENT(PM_LSU0_LMQ_LHR_MERGE, 0x0d098)
479EVENT(PM_BTAC_HIT, 0x0508a)
480EVENT(PM_L3_RD_BUSY, 0x4f082)
481EVENT(PM_LSU0_L1_SW_PREF, 0x0c09c)
482EVENT(PM_INST_FROM_L2MISS, 0x44048)
483EVENT(PM_LSU0_DC_PREF_STREAM_ALLOC, 0x0d0a8)
484EVENT(PM_L2_ST, 0x16082)
485EVENT(PM_VSU0_DENORM, 0x0a0ac)
486EVENT(PM_MRK_DATA_FROM_DL2L3_SHR, 0x3d044)
487EVENT(PM_BR_PRED_CR_TA, 0x048aa)
488EVENT(PM_VSU0_FCONV, 0x0a0b0)
489EVENT(PM_MRK_LSU_FLUSH_ULD, 0x0d084)
490EVENT(PM_BTAC_MISS, 0x05088)
491EVENT(PM_MRK_LD_MISS_EXPOSED_CYC_COUNT, 0x1003f)
492EVENT(PM_MRK_DATA_FROM_L2, 0x1d040)
493EVENT(PM_LSU_DCACHE_RELOAD_VALID, 0x0d0a2)
494EVENT(PM_VSU_FMA, 0x0a884)
495EVENT(PM_LSU0_FLUSH_SRQ, 0x0c0bc)
496EVENT(PM_LSU1_L1_PREF, 0x0d0ba)
497EVENT(PM_IOPS_CMPL, 0x10014)
498EVENT(PM_L2_SYS_PUMP, 0x36482)
499EVENT(PM_L2_RCLD_BUSY_RC_FULL, 0x46282)
500EVENT(PM_LSU_LMQ_S0_ALLOC, 0x0d0a1)
501EVENT(PM_FLUSH_DISP_SYNC, 0x02088)
502EVENT(PM_MRK_DATA_FROM_DL2L3_MOD_CYC, 0x4002a)
503EVENT(PM_L2_IC_INV, 0x26180)
504EVENT(PM_MRK_DATA_FROM_L21_MOD_CYC, 0x40024)
505EVENT(PM_L3_PREF_LDST, 0x0d8ac)
506EVENT(PM_LSU_SRQ_EMPTY_CYC, 0x40008)
507EVENT(PM_LSU_LMQ_S0_VALID, 0x0d0a0)
508EVENT(PM_FLUSH_PARTIAL, 0x02086)
509EVENT(PM_VSU1_FMA_DOUBLE, 0x0a092)
510EVENT(PM_1PLUS_PPC_DISP, 0x400f2)
511EVENT(PM_DATA_FROM_L2MISS, 0x200fe)
512EVENT(PM_SUSPENDED, 0x00000)
513EVENT(PM_VSU0_FMA, 0x0a084)
514EVENT(PM_CMPLU_STALL_SCALAR, 0x40012)
515EVENT(PM_STCX_FAIL, 0x0c09a)
516EVENT(PM_VSU0_FSQRT_FDIV_DOUBLE, 0x0a094)
517EVENT(PM_DC_PREF_DST, 0x0d0b0)
518EVENT(PM_VSU1_SCAL_SINGLE_ISSUED, 0x0b086)
519EVENT(PM_L3_HIT, 0x1f080)
520EVENT(PM_L2_GLOB_GUESS_WRONG, 0x26482)
521EVENT(PM_MRK_DFU_FIN, 0x20032)
522EVENT(PM_INST_FROM_L1, 0x04080)
523EVENT(PM_BRU_FIN, 0x10068)
524EVENT(PM_IC_DEMAND_REQ, 0x04088)
525EVENT(PM_VSU1_FSQRT_FDIV_DOUBLE, 0x0a096)
526EVENT(PM_VSU1_FMA, 0x0a086)
527EVENT(PM_MRK_LD_MISS_L1, 0x20036)
528EVENT(PM_VSU0_2FLOP_DOUBLE, 0x0a08c)
529EVENT(PM_LSU_DC_PREF_STRIDED_STREAM_CONFIRM, 0x0d8bc)
530EVENT(PM_INST_PTEG_FROM_L31_SHR, 0x2e056)
531EVENT(PM_MRK_LSU_REJECT_ERAT_MISS, 0x30064)
532EVENT(PM_MRK_DATA_FROM_L2MISS, 0x4d048)
533EVENT(PM_DATA_FROM_RL2L3_SHR, 0x1c04c)
534EVENT(PM_INST_FROM_PREF, 0x14046)
535EVENT(PM_VSU1_SQ, 0x0b09e)
536EVENT(PM_L2_LD_DISP, 0x36180)
537EVENT(PM_L2_DISP_ALL, 0x46080)
538EVENT(PM_THRD_GRP_CMPL_BOTH_CYC, 0x10012)
539EVENT(PM_VSU_FSQRT_FDIV_DOUBLE, 0x0a894)
540EVENT(PM_BR_MPRED, 0x400f6)
541EVENT(PM_INST_PTEG_FROM_DL2L3_SHR, 0x3e054)
542EVENT(PM_VSU_1FLOP, 0x0a880)
543EVENT(PM_HV_CYC, 0x2000a)
544EVENT(PM_MRK_LSU_FIN, 0x40032)
545EVENT(PM_MRK_DATA_FROM_RL2L3_SHR, 0x1d04c)
546EVENT(PM_DTLB_MISS_16M, 0x4c05e)
547EVENT(PM_LSU1_LMQ_LHR_MERGE, 0x0d09a)
548EVENT(PM_IFU_FIN, 0x40066)
diff --git a/arch/powerpc/perf/power7-pmu.c b/arch/powerpc/perf/power7-pmu.c
index d1821b8bbc4c..56c67bca2f75 100644
--- a/arch/powerpc/perf/power7-pmu.c
+++ b/arch/powerpc/perf/power7-pmu.c
@@ -53,37 +53,13 @@
53/* 53/*
54 * Power7 event codes. 54 * Power7 event codes.
55 */ 55 */
56#define PME_PM_CYC 0x1e 56#define EVENT(_name, _code) \
57#define PME_PM_GCT_NOSLOT_CYC 0x100f8 57 PME_##_name = _code,
58#define PME_PM_CMPLU_STALL 0x4000a 58
59#define PME_PM_INST_CMPL 0x2 59enum {
60#define PME_PM_LD_REF_L1 0xc880 60#include "power7-events-list.h"
61#define PME_PM_LD_MISS_L1 0x400f0 61};
62#define PME_PM_BRU_FIN 0x10068 62#undef EVENT
63#define PME_PM_BR_MPRED 0x400f6
64
65#define PME_PM_CMPLU_STALL_FXU 0x20014
66#define PME_PM_CMPLU_STALL_DIV 0x40014
67#define PME_PM_CMPLU_STALL_SCALAR 0x40012
68#define PME_PM_CMPLU_STALL_SCALAR_LONG 0x20018
69#define PME_PM_CMPLU_STALL_VECTOR 0x2001c
70#define PME_PM_CMPLU_STALL_VECTOR_LONG 0x4004a
71#define PME_PM_CMPLU_STALL_LSU 0x20012
72#define PME_PM_CMPLU_STALL_REJECT 0x40016
73#define PME_PM_CMPLU_STALL_ERAT_MISS 0x40018
74#define PME_PM_CMPLU_STALL_DCACHE_MISS 0x20016
75#define PME_PM_CMPLU_STALL_STORE 0x2004a
76#define PME_PM_CMPLU_STALL_THRD 0x1001c
77#define PME_PM_CMPLU_STALL_IFU 0x4004c
78#define PME_PM_CMPLU_STALL_BRU 0x4004e
79#define PME_PM_GCT_NOSLOT_IC_MISS 0x2001a
80#define PME_PM_GCT_NOSLOT_BR_MPRED 0x4001a
81#define PME_PM_GCT_NOSLOT_BR_MPRED_IC_MISS 0x4001c
82#define PME_PM_GRP_CMPL 0x30004
83#define PME_PM_1PLUS_PPC_CMPL 0x100f2
84#define PME_PM_CMPLU_STALL_DFU 0x2003c
85#define PME_PM_RUN_CYC 0x200f4
86#define PME_PM_RUN_INST_CMPL 0x400fa
87 63
88/* 64/*
89 * Layout of constraint bits: 65 * Layout of constraint bits:
@@ -398,96 +374,36 @@ static int power7_cache_events[C(MAX)][C(OP_MAX)][C(RESULT_MAX)] = {
398}; 374};
399 375
400 376
401GENERIC_EVENT_ATTR(cpu-cycles, CYC); 377GENERIC_EVENT_ATTR(cpu-cycles, PM_CYC);
402GENERIC_EVENT_ATTR(stalled-cycles-frontend, GCT_NOSLOT_CYC); 378GENERIC_EVENT_ATTR(stalled-cycles-frontend, PM_GCT_NOSLOT_CYC);
403GENERIC_EVENT_ATTR(stalled-cycles-backend, CMPLU_STALL); 379GENERIC_EVENT_ATTR(stalled-cycles-backend, PM_CMPLU_STALL);
404GENERIC_EVENT_ATTR(instructions, INST_CMPL); 380GENERIC_EVENT_ATTR(instructions, PM_INST_CMPL);
405GENERIC_EVENT_ATTR(cache-references, LD_REF_L1); 381GENERIC_EVENT_ATTR(cache-references, PM_LD_REF_L1);
406GENERIC_EVENT_ATTR(cache-misses, LD_MISS_L1); 382GENERIC_EVENT_ATTR(cache-misses, PM_LD_MISS_L1);
407GENERIC_EVENT_ATTR(branch-instructions, BRU_FIN); 383GENERIC_EVENT_ATTR(branch-instructions, PM_BRU_FIN);
408GENERIC_EVENT_ATTR(branch-misses, BR_MPRED); 384GENERIC_EVENT_ATTR(branch-misses, PM_BR_MPRED);
409 385
410POWER_EVENT_ATTR(CYC, CYC); 386#define EVENT(_name, _code) POWER_EVENT_ATTR(_name, _name);
411POWER_EVENT_ATTR(GCT_NOSLOT_CYC, GCT_NOSLOT_CYC); 387#include "power7-events-list.h"
412POWER_EVENT_ATTR(CMPLU_STALL, CMPLU_STALL); 388#undef EVENT
413POWER_EVENT_ATTR(INST_CMPL, INST_CMPL); 389
414POWER_EVENT_ATTR(LD_REF_L1, LD_REF_L1); 390#define EVENT(_name, _code) POWER_EVENT_PTR(_name),
415POWER_EVENT_ATTR(LD_MISS_L1, LD_MISS_L1);
416POWER_EVENT_ATTR(BRU_FIN, BRU_FIN)
417POWER_EVENT_ATTR(BR_MPRED, BR_MPRED);
418
419POWER_EVENT_ATTR(CMPLU_STALL_FXU, CMPLU_STALL_FXU);
420POWER_EVENT_ATTR(CMPLU_STALL_DIV, CMPLU_STALL_DIV);
421POWER_EVENT_ATTR(CMPLU_STALL_SCALAR, CMPLU_STALL_SCALAR);
422POWER_EVENT_ATTR(CMPLU_STALL_SCALAR_LONG, CMPLU_STALL_SCALAR_LONG);
423POWER_EVENT_ATTR(CMPLU_STALL_VECTOR, CMPLU_STALL_VECTOR);
424POWER_EVENT_ATTR(CMPLU_STALL_VECTOR_LONG, CMPLU_STALL_VECTOR_LONG);
425POWER_EVENT_ATTR(CMPLU_STALL_LSU, CMPLU_STALL_LSU);
426POWER_EVENT_ATTR(CMPLU_STALL_REJECT, CMPLU_STALL_REJECT);
427
428POWER_EVENT_ATTR(CMPLU_STALL_ERAT_MISS, CMPLU_STALL_ERAT_MISS);
429POWER_EVENT_ATTR(CMPLU_STALL_DCACHE_MISS, CMPLU_STALL_DCACHE_MISS);
430POWER_EVENT_ATTR(CMPLU_STALL_STORE, CMPLU_STALL_STORE);
431POWER_EVENT_ATTR(CMPLU_STALL_THRD, CMPLU_STALL_THRD);
432POWER_EVENT_ATTR(CMPLU_STALL_IFU, CMPLU_STALL_IFU);
433POWER_EVENT_ATTR(CMPLU_STALL_BRU, CMPLU_STALL_BRU);
434POWER_EVENT_ATTR(GCT_NOSLOT_IC_MISS, GCT_NOSLOT_IC_MISS);
435
436POWER_EVENT_ATTR(GCT_NOSLOT_BR_MPRED, GCT_NOSLOT_BR_MPRED);
437POWER_EVENT_ATTR(GCT_NOSLOT_BR_MPRED_IC_MISS, GCT_NOSLOT_BR_MPRED_IC_MISS);
438POWER_EVENT_ATTR(GRP_CMPL, GRP_CMPL);
439POWER_EVENT_ATTR(1PLUS_PPC_CMPL, 1PLUS_PPC_CMPL);
440POWER_EVENT_ATTR(CMPLU_STALL_DFU, CMPLU_STALL_DFU);
441POWER_EVENT_ATTR(RUN_CYC, RUN_CYC);
442POWER_EVENT_ATTR(RUN_INST_CMPL, RUN_INST_CMPL);
443 391
444static struct attribute *power7_events_attr[] = { 392static struct attribute *power7_events_attr[] = {
445 GENERIC_EVENT_PTR(CYC), 393 GENERIC_EVENT_PTR(PM_CYC),
446 GENERIC_EVENT_PTR(GCT_NOSLOT_CYC), 394 GENERIC_EVENT_PTR(PM_GCT_NOSLOT_CYC),
447 GENERIC_EVENT_PTR(CMPLU_STALL), 395 GENERIC_EVENT_PTR(PM_CMPLU_STALL),
448 GENERIC_EVENT_PTR(INST_CMPL), 396 GENERIC_EVENT_PTR(PM_INST_CMPL),
449 GENERIC_EVENT_PTR(LD_REF_L1), 397 GENERIC_EVENT_PTR(PM_LD_REF_L1),
450 GENERIC_EVENT_PTR(LD_MISS_L1), 398 GENERIC_EVENT_PTR(PM_LD_MISS_L1),
451 GENERIC_EVENT_PTR(BRU_FIN), 399 GENERIC_EVENT_PTR(PM_BRU_FIN),
452 GENERIC_EVENT_PTR(BR_MPRED), 400 GENERIC_EVENT_PTR(PM_BR_MPRED),
453 401
454 POWER_EVENT_PTR(CYC), 402 #include "power7-events-list.h"
455 POWER_EVENT_PTR(GCT_NOSLOT_CYC), 403 #undef EVENT
456 POWER_EVENT_PTR(CMPLU_STALL),
457 POWER_EVENT_PTR(INST_CMPL),
458 POWER_EVENT_PTR(LD_REF_L1),
459 POWER_EVENT_PTR(LD_MISS_L1),
460 POWER_EVENT_PTR(BRU_FIN),
461 POWER_EVENT_PTR(BR_MPRED),
462
463 POWER_EVENT_PTR(CMPLU_STALL_FXU),
464 POWER_EVENT_PTR(CMPLU_STALL_DIV),
465 POWER_EVENT_PTR(CMPLU_STALL_SCALAR),
466 POWER_EVENT_PTR(CMPLU_STALL_SCALAR_LONG),
467 POWER_EVENT_PTR(CMPLU_STALL_VECTOR),
468 POWER_EVENT_PTR(CMPLU_STALL_VECTOR_LONG),
469 POWER_EVENT_PTR(CMPLU_STALL_LSU),
470 POWER_EVENT_PTR(CMPLU_STALL_REJECT),
471
472 POWER_EVENT_PTR(CMPLU_STALL_ERAT_MISS),
473 POWER_EVENT_PTR(CMPLU_STALL_DCACHE_MISS),
474 POWER_EVENT_PTR(CMPLU_STALL_STORE),
475 POWER_EVENT_PTR(CMPLU_STALL_THRD),
476 POWER_EVENT_PTR(CMPLU_STALL_IFU),
477 POWER_EVENT_PTR(CMPLU_STALL_BRU),
478 POWER_EVENT_PTR(GCT_NOSLOT_IC_MISS),
479 POWER_EVENT_PTR(GCT_NOSLOT_BR_MPRED),
480
481 POWER_EVENT_PTR(GCT_NOSLOT_BR_MPRED_IC_MISS),
482 POWER_EVENT_PTR(GRP_CMPL),
483 POWER_EVENT_PTR(1PLUS_PPC_CMPL),
484 POWER_EVENT_PTR(CMPLU_STALL_DFU),
485 POWER_EVENT_PTR(RUN_CYC),
486 POWER_EVENT_PTR(RUN_INST_CMPL),
487 NULL 404 NULL
488}; 405};
489 406
490
491static struct attribute_group power7_pmu_events_group = { 407static struct attribute_group power7_pmu_events_group = {
492 .name = "events", 408 .name = "events",
493 .attrs = power7_events_attr, 409 .attrs = power7_events_attr,
diff --git a/arch/powerpc/platforms/44x/warp.c b/arch/powerpc/platforms/44x/warp.c
index 4cfa49901c02..534574a97ec9 100644
--- a/arch/powerpc/platforms/44x/warp.c
+++ b/arch/powerpc/platforms/44x/warp.c
@@ -16,7 +16,6 @@
16#include <linux/interrupt.h> 16#include <linux/interrupt.h>
17#include <linux/delay.h> 17#include <linux/delay.h>
18#include <linux/of_gpio.h> 18#include <linux/of_gpio.h>
19#include <linux/of_i2c.h>
20#include <linux/slab.h> 19#include <linux/slab.h>
21#include <linux/export.h> 20#include <linux/export.h>
22 21
diff --git a/arch/powerpc/platforms/52xx/mpc52xx_pic.c b/arch/powerpc/platforms/52xx/mpc52xx_pic.c
index b89ef65392dc..b69221ba07fd 100644
--- a/arch/powerpc/platforms/52xx/mpc52xx_pic.c
+++ b/arch/powerpc/platforms/52xx/mpc52xx_pic.c
@@ -373,8 +373,9 @@ static int mpc52xx_irqhost_map(struct irq_domain *h, unsigned int virq,
373 case MPC52xx_IRQ_L1_PERP: irqchip = &mpc52xx_periph_irqchip; break; 373 case MPC52xx_IRQ_L1_PERP: irqchip = &mpc52xx_periph_irqchip; break;
374 case MPC52xx_IRQ_L1_SDMA: irqchip = &mpc52xx_sdma_irqchip; break; 374 case MPC52xx_IRQ_L1_SDMA: irqchip = &mpc52xx_sdma_irqchip; break;
375 case MPC52xx_IRQ_L1_CRIT: 375 case MPC52xx_IRQ_L1_CRIT:
376 default:
376 pr_warn("%s: Critical IRQ #%d is unsupported! Nopping it.\n", 377 pr_warn("%s: Critical IRQ #%d is unsupported! Nopping it.\n",
377 __func__, l2irq); 378 __func__, l1irq);
378 irq_set_chip(virq, &no_irq_chip); 379 irq_set_chip(virq, &no_irq_chip);
379 return 0; 380 return 0;
380 } 381 }
diff --git a/arch/powerpc/platforms/85xx/Kconfig b/arch/powerpc/platforms/85xx/Kconfig
index efdd37c775ad..de2eb9320993 100644
--- a/arch/powerpc/platforms/85xx/Kconfig
+++ b/arch/powerpc/platforms/85xx/Kconfig
@@ -32,6 +32,12 @@ config BSC9131_RDB
32 StarCore SC3850 DSP 32 StarCore SC3850 DSP
33 Manufacturer : Freescale Semiconductor, Inc 33 Manufacturer : Freescale Semiconductor, Inc
34 34
35config C293_PCIE
36 bool "Freescale C293PCIE"
37 select DEFAULT_UIMAGE
38 help
39 This option enables support for the C293PCIE board
40
35config MPC8540_ADS 41config MPC8540_ADS
36 bool "Freescale MPC8540 ADS" 42 bool "Freescale MPC8540 ADS"
37 select DEFAULT_UIMAGE 43 select DEFAULT_UIMAGE
@@ -112,10 +118,10 @@ config P1022_RDK
112 reference board. 118 reference board.
113 119
114config P1023_RDS 120config P1023_RDS
115 bool "Freescale P1023 RDS" 121 bool "Freescale P1023 RDS/RDB"
116 select DEFAULT_UIMAGE 122 select DEFAULT_UIMAGE
117 help 123 help
118 This option enables support for the P1023 RDS board 124 This option enables support for the P1023 RDS and RDB boards
119 125
120config SOCRATES 126config SOCRATES
121 bool "Socrates" 127 bool "Socrates"
diff --git a/arch/powerpc/platforms/85xx/Makefile b/arch/powerpc/platforms/85xx/Makefile
index 2eab37ea4a9d..53c9f75a6907 100644
--- a/arch/powerpc/platforms/85xx/Makefile
+++ b/arch/powerpc/platforms/85xx/Makefile
@@ -6,6 +6,7 @@ obj-$(CONFIG_SMP) += smp.o
6obj-y += common.o 6obj-y += common.o
7 7
8obj-$(CONFIG_BSC9131_RDB) += bsc913x_rdb.o 8obj-$(CONFIG_BSC9131_RDB) += bsc913x_rdb.o
9obj-$(CONFIG_C293_PCIE) += c293pcie.o
9obj-$(CONFIG_MPC8540_ADS) += mpc85xx_ads.o 10obj-$(CONFIG_MPC8540_ADS) += mpc85xx_ads.o
10obj-$(CONFIG_MPC8560_ADS) += mpc85xx_ads.o 11obj-$(CONFIG_MPC8560_ADS) += mpc85xx_ads.o
11obj-$(CONFIG_MPC85xx_CDS) += mpc85xx_cds.o 12obj-$(CONFIG_MPC85xx_CDS) += mpc85xx_cds.o
diff --git a/arch/powerpc/platforms/85xx/c293pcie.c b/arch/powerpc/platforms/85xx/c293pcie.c
new file mode 100644
index 000000000000..6208e49142bf
--- /dev/null
+++ b/arch/powerpc/platforms/85xx/c293pcie.c
@@ -0,0 +1,75 @@
1/*
2 * C293PCIE Board Setup
3 *
4 * Copyright 2013 Freescale Semiconductor Inc.
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2 of the License, or (at your
9 * option) any later version.
10 */
11
12#include <linux/stddef.h>
13#include <linux/kernel.h>
14#include <linux/of_platform.h>
15
16#include <asm/machdep.h>
17#include <asm/udbg.h>
18#include <asm/mpic.h>
19
20#include <sysdev/fsl_soc.h>
21#include <sysdev/fsl_pci.h>
22
23#include "mpc85xx.h"
24
25void __init c293_pcie_pic_init(void)
26{
27 struct mpic *mpic = mpic_alloc(NULL, 0, MPIC_BIG_ENDIAN |
28 MPIC_SINGLE_DEST_CPU, 0, 256, " OpenPIC ");
29
30 BUG_ON(mpic == NULL);
31
32 mpic_init(mpic);
33}
34
35
36/*
37 * Setup the architecture
38 */
39static void __init c293_pcie_setup_arch(void)
40{
41 if (ppc_md.progress)
42 ppc_md.progress("c293_pcie_setup_arch()", 0);
43
44 fsl_pci_assign_primary();
45
46 printk(KERN_INFO "C293 PCIE board from Freescale Semiconductor\n");
47}
48
49machine_arch_initcall(c293_pcie, mpc85xx_common_publish_devices);
50
51/*
52 * Called very early, device-tree isn't unflattened
53 */
54static int __init c293_pcie_probe(void)
55{
56 unsigned long root = of_get_flat_dt_root();
57
58 if (of_flat_dt_is_compatible(root, "fsl,C293PCIE"))
59 return 1;
60 return 0;
61}
62
63define_machine(c293_pcie) {
64 .name = "C293 PCIE",
65 .probe = c293_pcie_probe,
66 .setup_arch = c293_pcie_setup_arch,
67 .init_IRQ = c293_pcie_pic_init,
68#ifdef CONFIG_PCI
69 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
70#endif
71 .get_irq = mpic_get_irq,
72 .restart = fsl_rstcr_restart,
73 .calibrate_decr = generic_calibrate_decr,
74 .progress = udbg_progress,
75};
diff --git a/arch/powerpc/platforms/85xx/corenet_ds.c b/arch/powerpc/platforms/85xx/corenet_ds.c
index c59c617eee93..aa3690bae415 100644
--- a/arch/powerpc/platforms/85xx/corenet_ds.c
+++ b/arch/powerpc/platforms/85xx/corenet_ds.c
@@ -53,12 +53,6 @@ void __init corenet_ds_setup_arch(void)
53{ 53{
54 mpc85xx_smp_init(); 54 mpc85xx_smp_init();
55 55
56#if defined(CONFIG_PCI) && defined(CONFIG_PPC64)
57 pci_devs_phb_init();
58#endif
59
60 fsl_pci_assign_primary();
61
62 swiotlb_detect_4g(); 56 swiotlb_detect_4g();
63 57
64 pr_info("%s board from Freescale Semiconductor\n", ppc_md.name); 58 pr_info("%s board from Freescale Semiconductor\n", ppc_md.name);
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_rdb.c b/arch/powerpc/platforms/85xx/mpc85xx_rdb.c
index ede8771d6f02..53b6fb0a3d56 100644
--- a/arch/powerpc/platforms/85xx/mpc85xx_rdb.c
+++ b/arch/powerpc/platforms/85xx/mpc85xx_rdb.c
@@ -160,6 +160,7 @@ machine_arch_initcall(p2020_rdb_pc, mpc85xx_common_publish_devices);
160machine_arch_initcall(p1020_mbg_pc, mpc85xx_common_publish_devices); 160machine_arch_initcall(p1020_mbg_pc, mpc85xx_common_publish_devices);
161machine_arch_initcall(p1020_rdb, mpc85xx_common_publish_devices); 161machine_arch_initcall(p1020_rdb, mpc85xx_common_publish_devices);
162machine_arch_initcall(p1020_rdb_pc, mpc85xx_common_publish_devices); 162machine_arch_initcall(p1020_rdb_pc, mpc85xx_common_publish_devices);
163machine_arch_initcall(p1020_rdb_pd, mpc85xx_common_publish_devices);
163machine_arch_initcall(p1020_utm_pc, mpc85xx_common_publish_devices); 164machine_arch_initcall(p1020_utm_pc, mpc85xx_common_publish_devices);
164machine_arch_initcall(p1021_rdb_pc, mpc85xx_common_publish_devices); 165machine_arch_initcall(p1021_rdb_pc, mpc85xx_common_publish_devices);
165machine_arch_initcall(p1025_rdb, mpc85xx_common_publish_devices); 166machine_arch_initcall(p1025_rdb, mpc85xx_common_publish_devices);
@@ -193,6 +194,13 @@ static int __init p1020_rdb_pc_probe(void)
193 return of_flat_dt_is_compatible(root, "fsl,P1020RDB-PC"); 194 return of_flat_dt_is_compatible(root, "fsl,P1020RDB-PC");
194} 195}
195 196
197static int __init p1020_rdb_pd_probe(void)
198{
199 unsigned long root = of_get_flat_dt_root();
200
201 return of_flat_dt_is_compatible(root, "fsl,P1020RDB-PD");
202}
203
196static int __init p1021_rdb_pc_probe(void) 204static int __init p1021_rdb_pc_probe(void)
197{ 205{
198 unsigned long root = of_get_flat_dt_root(); 206 unsigned long root = of_get_flat_dt_root();
@@ -351,6 +359,20 @@ define_machine(p1020_rdb_pc) {
351 .progress = udbg_progress, 359 .progress = udbg_progress,
352}; 360};
353 361
362define_machine(p1020_rdb_pd) {
363 .name = "P1020RDB-PD",
364 .probe = p1020_rdb_pd_probe,
365 .setup_arch = mpc85xx_rdb_setup_arch,
366 .init_IRQ = mpc85xx_rdb_pic_init,
367#ifdef CONFIG_PCI
368 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
369#endif
370 .get_irq = mpic_get_irq,
371 .restart = fsl_rstcr_restart,
372 .calibrate_decr = generic_calibrate_decr,
373 .progress = udbg_progress,
374};
375
354define_machine(p1024_rdb) { 376define_machine(p1024_rdb) {
355 .name = "P1024 RDB", 377 .name = "P1024 RDB",
356 .probe = p1024_rdb_probe, 378 .probe = p1024_rdb_probe,
diff --git a/arch/powerpc/platforms/85xx/p1023_rds.c b/arch/powerpc/platforms/85xx/p1023_rds.c
index 9cc60a738834..2ae9d490c3d9 100644
--- a/arch/powerpc/platforms/85xx/p1023_rds.c
+++ b/arch/powerpc/platforms/85xx/p1023_rds.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright 2010-2011 Freescale Semiconductor, Inc. 2 * Copyright 2010-2011, 2013 Freescale Semiconductor, Inc.
3 * 3 *
4 * Author: Roy Zang <tie-fei.zang@freescale.com> 4 * Author: Roy Zang <tie-fei.zang@freescale.com>
5 * 5 *
@@ -86,6 +86,7 @@ static void __init mpc85xx_rds_setup_arch(void)
86} 86}
87 87
88machine_arch_initcall(p1023_rds, mpc85xx_common_publish_devices); 88machine_arch_initcall(p1023_rds, mpc85xx_common_publish_devices);
89machine_arch_initcall(p1023_rdb, mpc85xx_common_publish_devices);
89 90
90static void __init mpc85xx_rds_pic_init(void) 91static void __init mpc85xx_rds_pic_init(void)
91{ 92{
@@ -106,6 +107,14 @@ static int __init p1023_rds_probe(void)
106 107
107} 108}
108 109
110static int __init p1023_rdb_probe(void)
111{
112 unsigned long root = of_get_flat_dt_root();
113
114 return of_flat_dt_is_compatible(root, "fsl,P1023RDB");
115
116}
117
109define_machine(p1023_rds) { 118define_machine(p1023_rds) {
110 .name = "P1023 RDS", 119 .name = "P1023 RDS",
111 .probe = p1023_rds_probe, 120 .probe = p1023_rds_probe,
@@ -120,3 +129,16 @@ define_machine(p1023_rds) {
120#endif 129#endif
121}; 130};
122 131
132define_machine(p1023_rdb) {
133 .name = "P1023 RDB",
134 .probe = p1023_rdb_probe,
135 .setup_arch = mpc85xx_rds_setup_arch,
136 .init_IRQ = mpc85xx_rds_pic_init,
137 .get_irq = mpic_get_irq,
138 .restart = fsl_rstcr_restart,
139 .calibrate_decr = generic_calibrate_decr,
140 .progress = udbg_progress,
141#ifdef CONFIG_PCI
142 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
143#endif
144};
diff --git a/arch/powerpc/platforms/85xx/smp.c b/arch/powerpc/platforms/85xx/smp.c
index 5ced4f5bb2b2..281b7f01df63 100644
--- a/arch/powerpc/platforms/85xx/smp.c
+++ b/arch/powerpc/platforms/85xx/smp.c
@@ -69,7 +69,32 @@ static void mpc85xx_give_timebase(void)
69 tb_req = 0; 69 tb_req = 0;
70 70
71 mpc85xx_timebase_freeze(1); 71 mpc85xx_timebase_freeze(1);
72#ifdef CONFIG_PPC64
73 /*
74 * e5500/e6500 have a workaround for erratum A-006958 in place
75 * that will reread the timebase until TBL is non-zero.
76 * That would be a bad thing when the timebase is frozen.
77 *
78 * Thus, we read it manually, and instead of checking that
79 * TBL is non-zero, we ensure that TB does not change. We don't
80 * do that for the main mftb implementation, because it requires
81 * a scratch register
82 */
83 {
84 u64 prev;
85
86 asm volatile("mfspr %0, %1" : "=r" (timebase) :
87 "i" (SPRN_TBRL));
88
89 do {
90 prev = timebase;
91 asm volatile("mfspr %0, %1" : "=r" (timebase) :
92 "i" (SPRN_TBRL));
93 } while (prev != timebase);
94 }
95#else
72 timebase = get_tb(); 96 timebase = get_tb();
97#endif
73 mb(); 98 mb();
74 tb_valid = 1; 99 tb_valid = 1;
75 100
@@ -255,6 +280,7 @@ out:
255 280
256struct smp_ops_t smp_85xx_ops = { 281struct smp_ops_t smp_85xx_ops = {
257 .kick_cpu = smp_85xx_kick_cpu, 282 .kick_cpu = smp_85xx_kick_cpu,
283 .cpu_bootable = smp_generic_cpu_bootable,
258#ifdef CONFIG_HOTPLUG_CPU 284#ifdef CONFIG_HOTPLUG_CPU
259 .cpu_disable = generic_cpu_disable, 285 .cpu_disable = generic_cpu_disable,
260 .cpu_die = generic_cpu_die, 286 .cpu_die = generic_cpu_die,
diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig
index d703775bda30..bf9c6d4cd26c 100644
--- a/arch/powerpc/platforms/Kconfig
+++ b/arch/powerpc/platforms/Kconfig
@@ -202,17 +202,12 @@ config PPC_P7_NAP
202 bool 202 bool
203 default n 203 default n
204 204
205config PPC_INDIRECT_IO
206 bool
207 select GENERIC_IOMAP
208
209config PPC_INDIRECT_PIO 205config PPC_INDIRECT_PIO
210 bool 206 bool
211 select PPC_INDIRECT_IO 207 select GENERIC_IOMAP
212 208
213config PPC_INDIRECT_MMIO 209config PPC_INDIRECT_MMIO
214 bool 210 bool
215 select PPC_INDIRECT_IO
216 211
217config PPC_IO_WORKAROUNDS 212config PPC_IO_WORKAROUNDS
218 bool 213 bool
diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype
index 47d9a03dd415..6704e2e20e6b 100644
--- a/arch/powerpc/platforms/Kconfig.cputype
+++ b/arch/powerpc/platforms/Kconfig.cputype
@@ -96,18 +96,31 @@ config GENERIC_CPU
96 96
97config CELL_CPU 97config CELL_CPU
98 bool "Cell Broadband Engine" 98 bool "Cell Broadband Engine"
99 depends on PPC_BOOK3S_64
99 100
100config POWER4_CPU 101config POWER4_CPU
101 bool "POWER4" 102 bool "POWER4"
103 depends on PPC_BOOK3S_64
102 104
103config POWER5_CPU 105config POWER5_CPU
104 bool "POWER5" 106 bool "POWER5"
107 depends on PPC_BOOK3S_64
105 108
106config POWER6_CPU 109config POWER6_CPU
107 bool "POWER6" 110 bool "POWER6"
111 depends on PPC_BOOK3S_64
108 112
109config POWER7_CPU 113config POWER7_CPU
110 bool "POWER7" 114 bool "POWER7"
115 depends on PPC_BOOK3S_64
116
117config E5500_CPU
118 bool "Freescale e5500"
119 depends on E500
120
121config E6500_CPU
122 bool "Freescale e6500"
123 depends on E500
111 124
112endchoice 125endchoice
113 126
diff --git a/arch/powerpc/platforms/cell/iommu.c b/arch/powerpc/platforms/cell/iommu.c
index 946306b1bb4e..b53560660b72 100644
--- a/arch/powerpc/platforms/cell/iommu.c
+++ b/arch/powerpc/platforms/cell/iommu.c
@@ -697,7 +697,7 @@ static int __init cell_iommu_get_window(struct device_node *np,
697 unsigned long *base, 697 unsigned long *base,
698 unsigned long *size) 698 unsigned long *size)
699{ 699{
700 const void *dma_window; 700 const __be32 *dma_window;
701 unsigned long index; 701 unsigned long index;
702 702
703 /* Use ibm,dma-window if available, else, hard code ! */ 703 /* Use ibm,dma-window if available, else, hard code ! */
diff --git a/arch/powerpc/platforms/cell/smp.c b/arch/powerpc/platforms/cell/smp.c
index f75f6fcac729..90745eaa45fe 100644
--- a/arch/powerpc/platforms/cell/smp.c
+++ b/arch/powerpc/platforms/cell/smp.c
@@ -136,25 +136,12 @@ static int smp_cell_kick_cpu(int nr)
136 return 0; 136 return 0;
137} 137}
138 138
139static int smp_cell_cpu_bootable(unsigned int nr)
140{
141 /* Special case - we inhibit secondary thread startup
142 * during boot if the user requests it. Odd-numbered
143 * cpus are assumed to be secondary threads.
144 */
145 if (system_state == SYSTEM_BOOTING &&
146 cpu_has_feature(CPU_FTR_SMT) &&
147 !smt_enabled_at_boot && cpu_thread_in_core(nr) != 0)
148 return 0;
149
150 return 1;
151}
152static struct smp_ops_t bpa_iic_smp_ops = { 139static struct smp_ops_t bpa_iic_smp_ops = {
153 .message_pass = iic_message_pass, 140 .message_pass = iic_message_pass,
154 .probe = smp_iic_probe, 141 .probe = smp_iic_probe,
155 .kick_cpu = smp_cell_kick_cpu, 142 .kick_cpu = smp_cell_kick_cpu,
156 .setup_cpu = smp_cell_setup_cpu, 143 .setup_cpu = smp_cell_setup_cpu,
157 .cpu_bootable = smp_cell_cpu_bootable, 144 .cpu_bootable = smp_generic_cpu_bootable,
158}; 145};
159 146
160/* This is called very early */ 147/* This is called very early */
diff --git a/arch/powerpc/platforms/cell/spufs/inode.c b/arch/powerpc/platforms/cell/spufs/inode.c
index f3900427ffab..87ba7cf99cd7 100644
--- a/arch/powerpc/platforms/cell/spufs/inode.c
+++ b/arch/powerpc/platforms/cell/spufs/inode.c
@@ -620,12 +620,16 @@ spufs_parse_options(struct super_block *sb, char *options, struct inode *root)
620 case Opt_uid: 620 case Opt_uid:
621 if (match_int(&args[0], &option)) 621 if (match_int(&args[0], &option))
622 return 0; 622 return 0;
623 root->i_uid = option; 623 root->i_uid = make_kuid(current_user_ns(), option);
624 if (!uid_valid(root->i_uid))
625 return 0;
624 break; 626 break;
625 case Opt_gid: 627 case Opt_gid:
626 if (match_int(&args[0], &option)) 628 if (match_int(&args[0], &option))
627 return 0; 629 return 0;
628 root->i_gid = option; 630 root->i_gid = make_kgid(current_user_ns(), option);
631 if (!gid_valid(root->i_gid))
632 return 0;
629 break; 633 break;
630 case Opt_mode: 634 case Opt_mode:
631 if (match_octal(&args[0], &option)) 635 if (match_octal(&args[0], &option))
diff --git a/arch/powerpc/platforms/powernv/Kconfig b/arch/powerpc/platforms/powernv/Kconfig
index c24684c818ab..6fae5eb99ea6 100644
--- a/arch/powerpc/platforms/powernv/Kconfig
+++ b/arch/powerpc/platforms/powernv/Kconfig
@@ -7,6 +7,8 @@ config PPC_POWERNV
7 select PPC_P7_NAP 7 select PPC_P7_NAP
8 select PPC_PCI_CHOICE if EMBEDDED 8 select PPC_PCI_CHOICE if EMBEDDED
9 select EPAPR_BOOT 9 select EPAPR_BOOT
10 select PPC_INDIRECT_PIO
11 select PPC_UDBG_16550
10 default y 12 default y
11 13
12config POWERNV_MSI 14config POWERNV_MSI
diff --git a/arch/powerpc/platforms/powernv/Makefile b/arch/powerpc/platforms/powernv/Makefile
index 7fe595152478..300c437d713c 100644
--- a/arch/powerpc/platforms/powernv/Makefile
+++ b/arch/powerpc/platforms/powernv/Makefile
@@ -1,5 +1,5 @@
1obj-y += setup.o opal-takeover.o opal-wrappers.o opal.o 1obj-y += setup.o opal-takeover.o opal-wrappers.o opal.o
2obj-y += opal-rtc.o opal-nvram.o 2obj-y += opal-rtc.o opal-nvram.o opal-lpc.o
3 3
4obj-$(CONFIG_SMP) += smp.o 4obj-$(CONFIG_SMP) += smp.o
5obj-$(CONFIG_PCI) += pci.o pci-p5ioc2.o pci-ioda.o 5obj-$(CONFIG_PCI) += pci.o pci-p5ioc2.o pci-ioda.o
diff --git a/arch/powerpc/platforms/powernv/eeh-ioda.c b/arch/powerpc/platforms/powernv/eeh-ioda.c
index 0cd1c4a71755..cf42e74514fa 100644
--- a/arch/powerpc/platforms/powernv/eeh-ioda.c
+++ b/arch/powerpc/platforms/powernv/eeh-ioda.c
@@ -36,13 +36,6 @@
36#include "powernv.h" 36#include "powernv.h"
37#include "pci.h" 37#include "pci.h"
38 38
39/* Debugging option */
40#ifdef IODA_EEH_DBG_ON
41#define IODA_EEH_DBG(args...) pr_info(args)
42#else
43#define IODA_EEH_DBG(args...)
44#endif
45
46static char *hub_diag = NULL; 39static char *hub_diag = NULL;
47static int ioda_eeh_nb_init = 0; 40static int ioda_eeh_nb_init = 0;
48 41
@@ -823,17 +816,17 @@ static int ioda_eeh_next_error(struct eeh_pe **pe)
823 816
824 /* If OPAL API returns error, we needn't proceed */ 817 /* If OPAL API returns error, we needn't proceed */
825 if (rc != OPAL_SUCCESS) { 818 if (rc != OPAL_SUCCESS) {
826 IODA_EEH_DBG("%s: Invalid return value on " 819 pr_devel("%s: Invalid return value on "
827 "PHB#%x (0x%lx) from opal_pci_next_error", 820 "PHB#%x (0x%lx) from opal_pci_next_error",
828 __func__, hose->global_number, rc); 821 __func__, hose->global_number, rc);
829 continue; 822 continue;
830 } 823 }
831 824
832 /* If the PHB doesn't have error, stop processing */ 825 /* If the PHB doesn't have error, stop processing */
833 if (err_type == OPAL_EEH_NO_ERROR || 826 if (err_type == OPAL_EEH_NO_ERROR ||
834 severity == OPAL_EEH_SEV_NO_ERROR) { 827 severity == OPAL_EEH_SEV_NO_ERROR) {
835 IODA_EEH_DBG("%s: No error found on PHB#%x\n", 828 pr_devel("%s: No error found on PHB#%x\n",
836 __func__, hose->global_number); 829 __func__, hose->global_number);
837 continue; 830 continue;
838 } 831 }
839 832
@@ -842,8 +835,9 @@ static int ioda_eeh_next_error(struct eeh_pe **pe)
842 * highest priority reported upon multiple errors on the 835 * highest priority reported upon multiple errors on the
843 * specific PHB. 836 * specific PHB.
844 */ 837 */
845 IODA_EEH_DBG("%s: Error (%d, %d, %d) on PHB#%x\n", 838 pr_devel("%s: Error (%d, %d, %llu) on PHB#%x\n",
846 err_type, severity, pe_no, hose->global_number); 839 __func__, err_type, severity,
840 frozen_pe_no, hose->global_number);
847 switch (err_type) { 841 switch (err_type) {
848 case OPAL_EEH_IOC_ERROR: 842 case OPAL_EEH_IOC_ERROR:
849 if (severity == OPAL_EEH_SEV_IOC_DEAD) { 843 if (severity == OPAL_EEH_SEV_IOC_DEAD) {
diff --git a/arch/powerpc/platforms/powernv/opal-lpc.c b/arch/powerpc/platforms/powernv/opal-lpc.c
new file mode 100644
index 000000000000..a7614bb14e17
--- /dev/null
+++ b/arch/powerpc/platforms/powernv/opal-lpc.c
@@ -0,0 +1,203 @@
1/*
2 * PowerNV LPC bus handling.
3 *
4 * Copyright 2013 IBM Corp.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version
9 * 2 of the License, or (at your option) any later version.
10 */
11
12#include <linux/kernel.h>
13#include <linux/of.h>
14#include <linux/bug.h>
15
16#include <asm/machdep.h>
17#include <asm/firmware.h>
18#include <asm/xics.h>
19#include <asm/opal.h>
20
21static int opal_lpc_chip_id = -1;
22
23static u8 opal_lpc_inb(unsigned long port)
24{
25 int64_t rc;
26 uint32_t data;
27
28 if (opal_lpc_chip_id < 0 || port > 0xffff)
29 return 0xff;
30 rc = opal_lpc_read(opal_lpc_chip_id, OPAL_LPC_IO, port, &data, 1);
31 return rc ? 0xff : data;
32}
33
34static __le16 __opal_lpc_inw(unsigned long port)
35{
36 int64_t rc;
37 uint32_t data;
38
39 if (opal_lpc_chip_id < 0 || port > 0xfffe)
40 return 0xffff;
41 if (port & 1)
42 return (__le16)opal_lpc_inb(port) << 8 | opal_lpc_inb(port + 1);
43 rc = opal_lpc_read(opal_lpc_chip_id, OPAL_LPC_IO, port, &data, 2);
44 return rc ? 0xffff : data;
45}
46static u16 opal_lpc_inw(unsigned long port)
47{
48 return le16_to_cpu(__opal_lpc_inw(port));
49}
50
51static __le32 __opal_lpc_inl(unsigned long port)
52{
53 int64_t rc;
54 uint32_t data;
55
56 if (opal_lpc_chip_id < 0 || port > 0xfffc)
57 return 0xffffffff;
58 if (port & 3)
59 return (__le32)opal_lpc_inb(port ) << 24 |
60 (__le32)opal_lpc_inb(port + 1) << 16 |
61 (__le32)opal_lpc_inb(port + 2) << 8 |
62 opal_lpc_inb(port + 3);
63 rc = opal_lpc_read(opal_lpc_chip_id, OPAL_LPC_IO, port, &data, 4);
64 return rc ? 0xffffffff : data;
65}
66
67static u32 opal_lpc_inl(unsigned long port)
68{
69 return le32_to_cpu(__opal_lpc_inl(port));
70}
71
72static void opal_lpc_outb(u8 val, unsigned long port)
73{
74 if (opal_lpc_chip_id < 0 || port > 0xffff)
75 return;
76 opal_lpc_write(opal_lpc_chip_id, OPAL_LPC_IO, port, val, 1);
77}
78
79static void __opal_lpc_outw(__le16 val, unsigned long port)
80{
81 if (opal_lpc_chip_id < 0 || port > 0xfffe)
82 return;
83 if (port & 1) {
84 opal_lpc_outb(val >> 8, port);
85 opal_lpc_outb(val , port + 1);
86 return;
87 }
88 opal_lpc_write(opal_lpc_chip_id, OPAL_LPC_IO, port, val, 2);
89}
90
91static void opal_lpc_outw(u16 val, unsigned long port)
92{
93 __opal_lpc_outw(cpu_to_le16(val), port);
94}
95
96static void __opal_lpc_outl(__le32 val, unsigned long port)
97{
98 if (opal_lpc_chip_id < 0 || port > 0xfffc)
99 return;
100 if (port & 3) {
101 opal_lpc_outb(val >> 24, port);
102 opal_lpc_outb(val >> 16, port + 1);
103 opal_lpc_outb(val >> 8, port + 2);
104 opal_lpc_outb(val , port + 3);
105 return;
106 }
107 opal_lpc_write(opal_lpc_chip_id, OPAL_LPC_IO, port, val, 4);
108}
109
110static void opal_lpc_outl(u32 val, unsigned long port)
111{
112 __opal_lpc_outl(cpu_to_le32(val), port);
113}
114
115static void opal_lpc_insb(unsigned long p, void *b, unsigned long c)
116{
117 u8 *ptr = b;
118
119 while(c--)
120 *(ptr++) = opal_lpc_inb(p);
121}
122
123static void opal_lpc_insw(unsigned long p, void *b, unsigned long c)
124{
125 __le16 *ptr = b;
126
127 while(c--)
128 *(ptr++) = __opal_lpc_inw(p);
129}
130
131static void opal_lpc_insl(unsigned long p, void *b, unsigned long c)
132{
133 __le32 *ptr = b;
134
135 while(c--)
136 *(ptr++) = __opal_lpc_inl(p);
137}
138
139static void opal_lpc_outsb(unsigned long p, const void *b, unsigned long c)
140{
141 const u8 *ptr = b;
142
143 while(c--)
144 opal_lpc_outb(*(ptr++), p);
145}
146
147static void opal_lpc_outsw(unsigned long p, const void *b, unsigned long c)
148{
149 const __le16 *ptr = b;
150
151 while(c--)
152 __opal_lpc_outw(*(ptr++), p);
153}
154
155static void opal_lpc_outsl(unsigned long p, const void *b, unsigned long c)
156{
157 const __le32 *ptr = b;
158
159 while(c--)
160 __opal_lpc_outl(*(ptr++), p);
161}
162
163static const struct ppc_pci_io opal_lpc_io = {
164 .inb = opal_lpc_inb,
165 .inw = opal_lpc_inw,
166 .inl = opal_lpc_inl,
167 .outb = opal_lpc_outb,
168 .outw = opal_lpc_outw,
169 .outl = opal_lpc_outl,
170 .insb = opal_lpc_insb,
171 .insw = opal_lpc_insw,
172 .insl = opal_lpc_insl,
173 .outsb = opal_lpc_outsb,
174 .outsw = opal_lpc_outsw,
175 .outsl = opal_lpc_outsl,
176};
177
178void opal_lpc_init(void)
179{
180 struct device_node *np;
181
182 /*
183 * Look for a Power8 LPC bus tagged as "primary",
184 * we currently support only one though the OPAL APIs
185 * support any number.
186 */
187 for_each_compatible_node(np, NULL, "ibm,power8-lpc") {
188 if (!of_device_is_available(np))
189 continue;
190 if (!of_get_property(np, "primary", NULL))
191 continue;
192 opal_lpc_chip_id = of_get_ibm_chip_id(np);
193 break;
194 }
195 if (opal_lpc_chip_id < 0)
196 return;
197
198 /* Setup special IO ops */
199 ppc_pci_io = opal_lpc_io;
200 isa_io_special = true;
201
202 pr_info("OPAL: Power8 LPC bus found, chip ID %d\n", opal_lpc_chip_id);
203}
diff --git a/arch/powerpc/platforms/powernv/opal-wrappers.S b/arch/powerpc/platforms/powernv/opal-wrappers.S
index e88863ffb135..8f3844535fbb 100644
--- a/arch/powerpc/platforms/powernv/opal-wrappers.S
+++ b/arch/powerpc/platforms/powernv/opal-wrappers.S
@@ -111,3 +111,8 @@ OPAL_CALL(opal_pci_next_error, OPAL_PCI_NEXT_ERROR);
111OPAL_CALL(opal_pci_poll, OPAL_PCI_POLL); 111OPAL_CALL(opal_pci_poll, OPAL_PCI_POLL);
112OPAL_CALL(opal_pci_msi_eoi, OPAL_PCI_MSI_EOI); 112OPAL_CALL(opal_pci_msi_eoi, OPAL_PCI_MSI_EOI);
113OPAL_CALL(opal_pci_get_phb_diag_data2, OPAL_PCI_GET_PHB_DIAG_DATA2); 113OPAL_CALL(opal_pci_get_phb_diag_data2, OPAL_PCI_GET_PHB_DIAG_DATA2);
114OPAL_CALL(opal_xscom_read, OPAL_XSCOM_READ);
115OPAL_CALL(opal_xscom_write, OPAL_XSCOM_WRITE);
116OPAL_CALL(opal_lpc_read, OPAL_LPC_READ);
117OPAL_CALL(opal_lpc_write, OPAL_LPC_WRITE);
118OPAL_CALL(opal_return_cpu, OPAL_RETURN_CPU);
diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c
index 106301fd2fa5..2911abe550f1 100644
--- a/arch/powerpc/platforms/powernv/opal.c
+++ b/arch/powerpc/platforms/powernv/opal.c
@@ -380,18 +380,20 @@ static int __init opal_init(void)
380 pr_warn("opal: Node not found\n"); 380 pr_warn("opal: Node not found\n");
381 return -ENODEV; 381 return -ENODEV;
382 } 382 }
383
384 /* Register OPAL consoles if any ports */
383 if (firmware_has_feature(FW_FEATURE_OPALv2)) 385 if (firmware_has_feature(FW_FEATURE_OPALv2))
384 consoles = of_find_node_by_path("/ibm,opal/consoles"); 386 consoles = of_find_node_by_path("/ibm,opal/consoles");
385 else 387 else
386 consoles = of_node_get(opal_node); 388 consoles = of_node_get(opal_node);
387 389 if (consoles) {
388 /* Register serial ports */ 390 for_each_child_of_node(consoles, np) {
389 for_each_child_of_node(consoles, np) { 391 if (strcmp(np->name, "serial"))
390 if (strcmp(np->name, "serial")) 392 continue;
391 continue; 393 of_platform_device_create(np, NULL, NULL);
392 of_platform_device_create(np, NULL, NULL); 394 }
395 of_node_put(consoles);
393 } 396 }
394 of_node_put(consoles);
395 397
396 /* Find all OPAL interrupts and request them */ 398 /* Find all OPAL interrupts and request them */
397 irqs = of_get_property(opal_node, "opal-interrupts", &irqlen); 399 irqs = of_get_property(opal_node, "opal-interrupts", &irqlen);
@@ -422,7 +424,7 @@ void opal_shutdown(void)
422 424
423 for (i = 0; i < opal_irq_count; i++) { 425 for (i = 0; i < opal_irq_count; i++) {
424 if (opal_irqs[i]) 426 if (opal_irqs[i])
425 free_irq(opal_irqs[i], 0); 427 free_irq(opal_irqs[i], NULL);
426 opal_irqs[i] = 0; 428 opal_irqs[i] = 0;
427 } 429 }
428} 430}
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
index d8140b125e62..74a5a5773b1f 100644
--- a/arch/powerpc/platforms/powernv/pci-ioda.c
+++ b/arch/powerpc/platforms/powernv/pci-ioda.c
@@ -1104,16 +1104,16 @@ void __init pnv_pci_init_ioda_phb(struct device_node *np,
1104 u64 hub_id, int ioda_type) 1104 u64 hub_id, int ioda_type)
1105{ 1105{
1106 struct pci_controller *hose; 1106 struct pci_controller *hose;
1107 static int primary = 1;
1108 struct pnv_phb *phb; 1107 struct pnv_phb *phb;
1109 unsigned long size, m32map_off, iomap_off, pemap_off; 1108 unsigned long size, m32map_off, iomap_off, pemap_off;
1110 const u64 *prop64; 1109 const u64 *prop64;
1111 const u32 *prop32; 1110 const u32 *prop32;
1111 int len;
1112 u64 phb_id; 1112 u64 phb_id;
1113 void *aux; 1113 void *aux;
1114 long rc; 1114 long rc;
1115 1115
1116 pr_info(" Initializing IODA%d OPAL PHB %s\n", ioda_type, np->full_name); 1116 pr_info("Initializing IODA%d OPAL PHB %s\n", ioda_type, np->full_name);
1117 1117
1118 prop64 = of_get_property(np, "ibm,opal-phbid", NULL); 1118 prop64 = of_get_property(np, "ibm,opal-phbid", NULL);
1119 if (!prop64) { 1119 if (!prop64) {
@@ -1124,20 +1124,31 @@ void __init pnv_pci_init_ioda_phb(struct device_node *np,
1124 pr_debug(" PHB-ID : 0x%016llx\n", phb_id); 1124 pr_debug(" PHB-ID : 0x%016llx\n", phb_id);
1125 1125
1126 phb = alloc_bootmem(sizeof(struct pnv_phb)); 1126 phb = alloc_bootmem(sizeof(struct pnv_phb));
1127 if (phb) { 1127 if (!phb) {
1128 memset(phb, 0, sizeof(struct pnv_phb)); 1128 pr_err(" Out of memory !\n");
1129 phb->hose = hose = pcibios_alloc_controller(np); 1129 return;
1130 } 1130 }
1131 if (!phb || !phb->hose) { 1131
1132 pr_err("PCI: Failed to allocate PCI controller for %s\n", 1132 /* Allocate PCI controller */
1133 memset(phb, 0, sizeof(struct pnv_phb));
1134 phb->hose = hose = pcibios_alloc_controller(np);
1135 if (!phb->hose) {
1136 pr_err(" Can't allocate PCI controller for %s\n",
1133 np->full_name); 1137 np->full_name);
1138 free_bootmem((unsigned long)phb, sizeof(struct pnv_phb));
1134 return; 1139 return;
1135 } 1140 }
1136 1141
1137 spin_lock_init(&phb->lock); 1142 spin_lock_init(&phb->lock);
1138 /* XXX Use device-tree */ 1143 prop32 = of_get_property(np, "bus-range", &len);
1139 hose->first_busno = 0; 1144 if (prop32 && len == 8) {
1140 hose->last_busno = 0xff; 1145 hose->first_busno = prop32[0];
1146 hose->last_busno = prop32[1];
1147 } else {
1148 pr_warn(" Broken <bus-range> on %s\n", np->full_name);
1149 hose->first_busno = 0;
1150 hose->last_busno = 0xff;
1151 }
1141 hose->private_data = phb; 1152 hose->private_data = phb;
1142 phb->hub_id = hub_id; 1153 phb->hub_id = hub_id;
1143 phb->opal_id = phb_id; 1154 phb->opal_id = phb_id;
@@ -1152,8 +1163,7 @@ void __init pnv_pci_init_ioda_phb(struct device_node *np,
1152 phb->model = PNV_PHB_MODEL_UNKNOWN; 1163 phb->model = PNV_PHB_MODEL_UNKNOWN;
1153 1164
1154 /* Parse 32-bit and IO ranges (if any) */ 1165 /* Parse 32-bit and IO ranges (if any) */
1155 pci_process_bridge_OF_ranges(phb->hose, np, primary); 1166 pci_process_bridge_OF_ranges(hose, np, !hose->global_number);
1156 primary = 0;
1157 1167
1158 /* Get registers */ 1168 /* Get registers */
1159 phb->regs = of_iomap(np, 0); 1169 phb->regs = of_iomap(np, 0);
@@ -1177,22 +1187,23 @@ void __init pnv_pci_init_ioda_phb(struct device_node *np,
1177 phb->ioda.io_segsize = phb->ioda.io_size / phb->ioda.total_pe; 1187 phb->ioda.io_segsize = phb->ioda.io_size / phb->ioda.total_pe;
1178 phb->ioda.io_pci_base = 0; /* XXX calculate this ? */ 1188 phb->ioda.io_pci_base = 0; /* XXX calculate this ? */
1179 1189
1180 /* Allocate aux data & arrays 1190 /* Allocate aux data & arrays. We don't have IO ports on PHB3 */
1181 *
1182 * XXX TODO: Don't allocate io segmap on PHB3
1183 */
1184 size = _ALIGN_UP(phb->ioda.total_pe / 8, sizeof(unsigned long)); 1191 size = _ALIGN_UP(phb->ioda.total_pe / 8, sizeof(unsigned long));
1185 m32map_off = size; 1192 m32map_off = size;
1186 size += phb->ioda.total_pe * sizeof(phb->ioda.m32_segmap[0]); 1193 size += phb->ioda.total_pe * sizeof(phb->ioda.m32_segmap[0]);
1187 iomap_off = size; 1194 iomap_off = size;
1188 size += phb->ioda.total_pe * sizeof(phb->ioda.io_segmap[0]); 1195 if (phb->type == PNV_PHB_IODA1) {
1196 iomap_off = size;
1197 size += phb->ioda.total_pe * sizeof(phb->ioda.io_segmap[0]);
1198 }
1189 pemap_off = size; 1199 pemap_off = size;
1190 size += phb->ioda.total_pe * sizeof(struct pnv_ioda_pe); 1200 size += phb->ioda.total_pe * sizeof(struct pnv_ioda_pe);
1191 aux = alloc_bootmem(size); 1201 aux = alloc_bootmem(size);
1192 memset(aux, 0, size); 1202 memset(aux, 0, size);
1193 phb->ioda.pe_alloc = aux; 1203 phb->ioda.pe_alloc = aux;
1194 phb->ioda.m32_segmap = aux + m32map_off; 1204 phb->ioda.m32_segmap = aux + m32map_off;
1195 phb->ioda.io_segmap = aux + iomap_off; 1205 if (phb->type == PNV_PHB_IODA1)
1206 phb->ioda.io_segmap = aux + iomap_off;
1196 phb->ioda.pe_array = aux + pemap_off; 1207 phb->ioda.pe_array = aux + pemap_off;
1197 set_bit(0, phb->ioda.pe_alloc); 1208 set_bit(0, phb->ioda.pe_alloc);
1198 1209
diff --git a/arch/powerpc/platforms/powernv/powernv.h b/arch/powerpc/platforms/powernv/powernv.h
index a1c6f83fc391..de6819be1f95 100644
--- a/arch/powerpc/platforms/powernv/powernv.h
+++ b/arch/powerpc/platforms/powernv/powernv.h
@@ -15,4 +15,6 @@ static inline void pnv_pci_init(void) { }
15static inline void pnv_pci_shutdown(void) { } 15static inline void pnv_pci_shutdown(void) { }
16#endif 16#endif
17 17
18extern void pnv_lpc_init(void);
19
18#endif /* _POWERNV_H */ 20#endif /* _POWERNV_H */
diff --git a/arch/powerpc/platforms/powernv/setup.c b/arch/powerpc/platforms/powernv/setup.c
index 84438af96c05..e239dcfa224c 100644
--- a/arch/powerpc/platforms/powernv/setup.c
+++ b/arch/powerpc/platforms/powernv/setup.c
@@ -31,6 +31,7 @@
31#include <asm/xics.h> 31#include <asm/xics.h>
32#include <asm/rtas.h> 32#include <asm/rtas.h>
33#include <asm/opal.h> 33#include <asm/opal.h>
34#include <asm/kexec.h>
34 35
35#include "powernv.h" 36#include "powernv.h"
36 37
@@ -54,6 +55,12 @@ static void __init pnv_setup_arch(void)
54 55
55static void __init pnv_init_early(void) 56static void __init pnv_init_early(void)
56{ 57{
58 /*
59 * Initialize the LPC bus now so that legacy serial
60 * ports can be found on it
61 */
62 opal_lpc_init();
63
57#ifdef CONFIG_HVC_OPAL 64#ifdef CONFIG_HVC_OPAL
58 if (firmware_has_feature(FW_FEATURE_OPAL)) 65 if (firmware_has_feature(FW_FEATURE_OPAL))
59 hvc_opal_init_early(); 66 hvc_opal_init_early();
@@ -147,6 +154,16 @@ static void pnv_shutdown(void)
147static void pnv_kexec_cpu_down(int crash_shutdown, int secondary) 154static void pnv_kexec_cpu_down(int crash_shutdown, int secondary)
148{ 155{
149 xics_kexec_teardown_cpu(secondary); 156 xics_kexec_teardown_cpu(secondary);
157
158 /* Return secondary CPUs to firmware on OPAL v3 */
159 if (firmware_has_feature(FW_FEATURE_OPALv3) && secondary) {
160 mb();
161 get_paca()->kexec_state = KEXEC_STATE_REAL_MODE;
162 mb();
163
164 /* Return the CPU to OPAL */
165 opal_return_cpu();
166 }
150} 167}
151#endif /* CONFIG_KEXEC */ 168#endif /* CONFIG_KEXEC */
152 169
diff --git a/arch/powerpc/platforms/powernv/smp.c b/arch/powerpc/platforms/powernv/smp.c
index 89e3857af4e0..908672bdcea6 100644
--- a/arch/powerpc/platforms/powernv/smp.c
+++ b/arch/powerpc/platforms/powernv/smp.c
@@ -46,22 +46,6 @@ static void pnv_smp_setup_cpu(int cpu)
46 xics_setup_cpu(); 46 xics_setup_cpu();
47} 47}
48 48
49static int pnv_smp_cpu_bootable(unsigned int nr)
50{
51 /* Special case - we inhibit secondary thread startup
52 * during boot if the user requests it.
53 */
54 if (system_state == SYSTEM_BOOTING && cpu_has_feature(CPU_FTR_SMT)) {
55 if (!smt_enabled_at_boot && cpu_thread_in_core(nr) != 0)
56 return 0;
57 if (smt_enabled_at_boot
58 && cpu_thread_in_core(nr) >= smt_enabled_at_boot)
59 return 0;
60 }
61
62 return 1;
63}
64
65int pnv_smp_kick_cpu(int nr) 49int pnv_smp_kick_cpu(int nr)
66{ 50{
67 unsigned int pcpu = get_hard_smp_processor_id(nr); 51 unsigned int pcpu = get_hard_smp_processor_id(nr);
@@ -195,7 +179,7 @@ static struct smp_ops_t pnv_smp_ops = {
195 .probe = xics_smp_probe, 179 .probe = xics_smp_probe,
196 .kick_cpu = pnv_smp_kick_cpu, 180 .kick_cpu = pnv_smp_kick_cpu,
197 .setup_cpu = pnv_smp_setup_cpu, 181 .setup_cpu = pnv_smp_setup_cpu,
198 .cpu_bootable = pnv_smp_cpu_bootable, 182 .cpu_bootable = smp_generic_cpu_bootable,
199#ifdef CONFIG_HOTPLUG_CPU 183#ifdef CONFIG_HOTPLUG_CPU
200 .cpu_disable = pnv_smp_cpu_disable, 184 .cpu_disable = pnv_smp_cpu_disable,
201 .cpu_die = generic_cpu_die, 185 .cpu_die = generic_cpu_die,
diff --git a/arch/powerpc/platforms/ps3/time.c b/arch/powerpc/platforms/ps3/time.c
index cba1e6be68e5..ce73ce865613 100644
--- a/arch/powerpc/platforms/ps3/time.c
+++ b/arch/powerpc/platforms/ps3/time.c
@@ -90,7 +90,7 @@ static int __init ps3_rtc_init(void)
90 90
91 pdev = platform_device_register_simple("rtc-ps3", -1, NULL, 0); 91 pdev = platform_device_register_simple("rtc-ps3", -1, NULL, 0);
92 92
93 return PTR_RET(pdev); 93 return PTR_ERR_OR_ZERO(pdev);
94} 94}
95 95
96module_init(ps3_rtc_init); 96module_init(ps3_rtc_init);
diff --git a/arch/powerpc/platforms/pseries/Makefile b/arch/powerpc/platforms/pseries/Makefile
index 8ae010381316..6c61ec5ee914 100644
--- a/arch/powerpc/platforms/pseries/Makefile
+++ b/arch/powerpc/platforms/pseries/Makefile
@@ -22,6 +22,7 @@ obj-$(CONFIG_CMM) += cmm.o
22obj-$(CONFIG_DTL) += dtl.o 22obj-$(CONFIG_DTL) += dtl.o
23obj-$(CONFIG_IO_EVENT_IRQ) += io_event_irq.o 23obj-$(CONFIG_IO_EVENT_IRQ) += io_event_irq.o
24obj-$(CONFIG_PSERIES_IDLE) += processor_idle.o 24obj-$(CONFIG_PSERIES_IDLE) += processor_idle.o
25obj-$(CONFIG_LPARCFG) += lparcfg.o
25 26
26ifeq ($(CONFIG_PPC_PSERIES),y) 27ifeq ($(CONFIG_PPC_PSERIES),y)
27obj-$(CONFIG_SUSPEND) += suspend.o 28obj-$(CONFIG_SUSPEND) += suspend.o
diff --git a/arch/powerpc/platforms/pseries/cmm.c b/arch/powerpc/platforms/pseries/cmm.c
index c638535753df..1e561bef459b 100644
--- a/arch/powerpc/platforms/pseries/cmm.c
+++ b/arch/powerpc/platforms/pseries/cmm.c
@@ -40,8 +40,7 @@
40#include <asm/pgalloc.h> 40#include <asm/pgalloc.h>
41#include <asm/uaccess.h> 41#include <asm/uaccess.h>
42#include <linux/memory.h> 42#include <linux/memory.h>
43 43#include <asm/plpar_wrappers.h>
44#include "plpar_wrappers.h"
45 44
46#define CMM_DRIVER_VERSION "1.0.0" 45#define CMM_DRIVER_VERSION "1.0.0"
47#define CMM_DEFAULT_DELAY 1 46#define CMM_DEFAULT_DELAY 1
diff --git a/arch/powerpc/platforms/pseries/dlpar.c b/arch/powerpc/platforms/pseries/dlpar.c
index a1a7b9a67ffd..7cfdaae1721a 100644
--- a/arch/powerpc/platforms/pseries/dlpar.c
+++ b/arch/powerpc/platforms/pseries/dlpar.c
@@ -63,26 +63,32 @@ static struct property *dlpar_parse_cc_property(struct cc_workarea *ccwa)
63 return prop; 63 return prop;
64} 64}
65 65
66static struct device_node *dlpar_parse_cc_node(struct cc_workarea *ccwa) 66static struct device_node *dlpar_parse_cc_node(struct cc_workarea *ccwa,
67 const char *path)
67{ 68{
68 struct device_node *dn; 69 struct device_node *dn;
69 char *name; 70 char *name;
70 71
72 /* If parent node path is "/" advance path to NULL terminator to
73 * prevent double leading slashs in full_name.
74 */
75 if (!path[1])
76 path++;
77
71 dn = kzalloc(sizeof(*dn), GFP_KERNEL); 78 dn = kzalloc(sizeof(*dn), GFP_KERNEL);
72 if (!dn) 79 if (!dn)
73 return NULL; 80 return NULL;
74 81
75 /* The configure connector reported name does not contain a
76 * preceding '/', so we allocate a buffer large enough to
77 * prepend this to the full_name.
78 */
79 name = (char *)ccwa + ccwa->name_offset; 82 name = (char *)ccwa + ccwa->name_offset;
80 dn->full_name = kasprintf(GFP_KERNEL, "/%s", name); 83 dn->full_name = kasprintf(GFP_KERNEL, "%s/%s", path, name);
81 if (!dn->full_name) { 84 if (!dn->full_name) {
82 kfree(dn); 85 kfree(dn);
83 return NULL; 86 return NULL;
84 } 87 }
85 88
89 of_node_set_flag(dn, OF_DYNAMIC);
90 kref_init(&dn->kref);
91
86 return dn; 92 return dn;
87} 93}
88 94
@@ -120,7 +126,8 @@ void dlpar_free_cc_nodes(struct device_node *dn)
120#define CALL_AGAIN -2 126#define CALL_AGAIN -2
121#define ERR_CFG_USE -9003 127#define ERR_CFG_USE -9003
122 128
123struct device_node *dlpar_configure_connector(u32 drc_index) 129struct device_node *dlpar_configure_connector(u32 drc_index,
130 struct device_node *parent)
124{ 131{
125 struct device_node *dn; 132 struct device_node *dn;
126 struct device_node *first_dn = NULL; 133 struct device_node *first_dn = NULL;
@@ -129,6 +136,7 @@ struct device_node *dlpar_configure_connector(u32 drc_index)
129 struct property *last_property = NULL; 136 struct property *last_property = NULL;
130 struct cc_workarea *ccwa; 137 struct cc_workarea *ccwa;
131 char *data_buf; 138 char *data_buf;
139 const char *parent_path = parent->full_name;
132 int cc_token; 140 int cc_token;
133 int rc = -1; 141 int rc = -1;
134 142
@@ -162,7 +170,7 @@ struct device_node *dlpar_configure_connector(u32 drc_index)
162 break; 170 break;
163 171
164 case NEXT_SIBLING: 172 case NEXT_SIBLING:
165 dn = dlpar_parse_cc_node(ccwa); 173 dn = dlpar_parse_cc_node(ccwa, parent_path);
166 if (!dn) 174 if (!dn)
167 goto cc_error; 175 goto cc_error;
168 176
@@ -172,13 +180,17 @@ struct device_node *dlpar_configure_connector(u32 drc_index)
172 break; 180 break;
173 181
174 case NEXT_CHILD: 182 case NEXT_CHILD:
175 dn = dlpar_parse_cc_node(ccwa); 183 if (first_dn)
184 parent_path = last_dn->full_name;
185
186 dn = dlpar_parse_cc_node(ccwa, parent_path);
176 if (!dn) 187 if (!dn)
177 goto cc_error; 188 goto cc_error;
178 189
179 if (!first_dn) 190 if (!first_dn) {
191 dn->parent = parent;
180 first_dn = dn; 192 first_dn = dn;
181 else { 193 } else {
182 dn->parent = last_dn; 194 dn->parent = last_dn;
183 if (last_dn) 195 if (last_dn)
184 last_dn->child = dn; 196 last_dn->child = dn;
@@ -202,6 +214,7 @@ struct device_node *dlpar_configure_connector(u32 drc_index)
202 214
203 case PREV_PARENT: 215 case PREV_PARENT:
204 last_dn = last_dn->parent; 216 last_dn = last_dn->parent;
217 parent_path = last_dn->parent->full_name;
205 break; 218 break;
206 219
207 case CALL_AGAIN: 220 case CALL_AGAIN:
@@ -256,8 +269,6 @@ int dlpar_attach_node(struct device_node *dn)
256{ 269{
257 int rc; 270 int rc;
258 271
259 of_node_set_flag(dn, OF_DYNAMIC);
260 kref_init(&dn->kref);
261 dn->parent = derive_parent(dn->full_name); 272 dn->parent = derive_parent(dn->full_name);
262 if (!dn->parent) 273 if (!dn->parent)
263 return -ENOMEM; 274 return -ENOMEM;
@@ -275,8 +286,15 @@ int dlpar_attach_node(struct device_node *dn)
275 286
276int dlpar_detach_node(struct device_node *dn) 287int dlpar_detach_node(struct device_node *dn)
277{ 288{
289 struct device_node *child;
278 int rc; 290 int rc;
279 291
292 child = of_get_next_child(dn, NULL);
293 while (child) {
294 dlpar_detach_node(child);
295 child = of_get_next_child(dn, child);
296 }
297
280 rc = of_detach_node(dn); 298 rc = of_detach_node(dn);
281 if (rc) 299 if (rc)
282 return rc; 300 return rc;
@@ -382,9 +400,8 @@ out:
382 400
383static ssize_t dlpar_cpu_probe(const char *buf, size_t count) 401static ssize_t dlpar_cpu_probe(const char *buf, size_t count)
384{ 402{
385 struct device_node *dn; 403 struct device_node *dn, *parent;
386 unsigned long drc_index; 404 unsigned long drc_index;
387 char *cpu_name;
388 int rc; 405 int rc;
389 406
390 cpu_hotplug_driver_lock(); 407 cpu_hotplug_driver_lock();
@@ -394,25 +411,19 @@ static ssize_t dlpar_cpu_probe(const char *buf, size_t count)
394 goto out; 411 goto out;
395 } 412 }
396 413
397 dn = dlpar_configure_connector(drc_index); 414 parent = of_find_node_by_path("/cpus");
398 if (!dn) { 415 if (!parent) {
399 rc = -EINVAL; 416 rc = -ENODEV;
400 goto out; 417 goto out;
401 } 418 }
402 419
403 /* configure-connector reports cpus as living in the base 420 dn = dlpar_configure_connector(drc_index, parent);
404 * directory of the device tree. CPUs actually live in the 421 if (!dn) {
405 * cpus directory so we need to fixup the full_name. 422 rc = -EINVAL;
406 */
407 cpu_name = kasprintf(GFP_KERNEL, "/cpus%s", dn->full_name);
408 if (!cpu_name) {
409 dlpar_free_cc_nodes(dn);
410 rc = -ENOMEM;
411 goto out; 423 goto out;
412 } 424 }
413 425
414 kfree(dn->full_name); 426 of_node_put(parent);
415 dn->full_name = cpu_name;
416 427
417 rc = dlpar_acquire_drc(drc_index); 428 rc = dlpar_acquire_drc(drc_index);
418 if (rc) { 429 if (rc) {
diff --git a/arch/powerpc/platforms/pseries/dtl.c b/arch/powerpc/platforms/pseries/dtl.c
index 0cc0ac07a55d..5db66f1fbc26 100644
--- a/arch/powerpc/platforms/pseries/dtl.c
+++ b/arch/powerpc/platforms/pseries/dtl.c
@@ -29,8 +29,7 @@
29#include <asm/firmware.h> 29#include <asm/firmware.h>
30#include <asm/lppaca.h> 30#include <asm/lppaca.h>
31#include <asm/debug.h> 31#include <asm/debug.h>
32 32#include <asm/plpar_wrappers.h>
33#include "plpar_wrappers.h"
34 33
35struct dtl { 34struct dtl {
36 struct dtl_entry *buf; 35 struct dtl_entry *buf;
@@ -87,7 +86,7 @@ static void consume_dtle(struct dtl_entry *dtle, u64 index)
87 barrier(); 86 barrier();
88 87
89 /* check for hypervisor ring buffer overflow, ignore this entry if so */ 88 /* check for hypervisor ring buffer overflow, ignore this entry if so */
90 if (index + N_DISPATCH_LOG < vpa->dtl_idx) 89 if (index + N_DISPATCH_LOG < be64_to_cpu(vpa->dtl_idx))
91 return; 90 return;
92 91
93 ++wp; 92 ++wp;
diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c b/arch/powerpc/platforms/pseries/hotplug-cpu.c
index 217ca5c75b20..82789e79e539 100644
--- a/arch/powerpc/platforms/pseries/hotplug-cpu.c
+++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c
@@ -30,7 +30,8 @@
30#include <asm/machdep.h> 30#include <asm/machdep.h>
31#include <asm/vdso_datapage.h> 31#include <asm/vdso_datapage.h>
32#include <asm/xics.h> 32#include <asm/xics.h>
33#include "plpar_wrappers.h" 33#include <asm/plpar_wrappers.h>
34
34#include "offline_states.h" 35#include "offline_states.h"
35 36
36/* This version can't take the spinlock, because it never returns */ 37/* This version can't take the spinlock, because it never returns */
@@ -123,7 +124,7 @@ static void pseries_mach_cpu_die(void)
123 cede_latency_hint = 2; 124 cede_latency_hint = 2;
124 125
125 get_lppaca()->idle = 1; 126 get_lppaca()->idle = 1;
126 if (!get_lppaca()->shared_proc) 127 if (!lppaca_shared_proc(get_lppaca()))
127 get_lppaca()->donate_dedicated_cpu = 1; 128 get_lppaca()->donate_dedicated_cpu = 1;
128 129
129 while (get_preferred_offline_state(cpu) == CPU_STATE_INACTIVE) { 130 while (get_preferred_offline_state(cpu) == CPU_STATE_INACTIVE) {
@@ -137,7 +138,7 @@ static void pseries_mach_cpu_die(void)
137 138
138 local_irq_disable(); 139 local_irq_disable();
139 140
140 if (!get_lppaca()->shared_proc) 141 if (!lppaca_shared_proc(get_lppaca()))
141 get_lppaca()->donate_dedicated_cpu = 0; 142 get_lppaca()->donate_dedicated_cpu = 0;
142 get_lppaca()->idle = 0; 143 get_lppaca()->idle = 0;
143 144
diff --git a/arch/powerpc/platforms/pseries/hvconsole.c b/arch/powerpc/platforms/pseries/hvconsole.c
index b344f94b0400..849b29b3e9ae 100644
--- a/arch/powerpc/platforms/pseries/hvconsole.c
+++ b/arch/powerpc/platforms/pseries/hvconsole.c
@@ -28,7 +28,7 @@
28#include <linux/errno.h> 28#include <linux/errno.h>
29#include <asm/hvcall.h> 29#include <asm/hvcall.h>
30#include <asm/hvconsole.h> 30#include <asm/hvconsole.h>
31#include "plpar_wrappers.h" 31#include <asm/plpar_wrappers.h>
32 32
33/** 33/**
34 * hvc_get_chars - retrieve characters from firmware for denoted vterm adatper 34 * hvc_get_chars - retrieve characters from firmware for denoted vterm adatper
@@ -40,10 +40,16 @@
40 */ 40 */
41int hvc_get_chars(uint32_t vtermno, char *buf, int count) 41int hvc_get_chars(uint32_t vtermno, char *buf, int count)
42{ 42{
43 unsigned long got; 43 long ret;
44 unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
45 unsigned long *lbuf = (unsigned long *)buf;
46
47 ret = plpar_hcall(H_GET_TERM_CHAR, retbuf, vtermno);
48 lbuf[0] = be64_to_cpu(retbuf[1]);
49 lbuf[1] = be64_to_cpu(retbuf[2]);
44 50
45 if (plpar_get_term_char(vtermno, &got, buf) == H_SUCCESS) 51 if (ret == H_SUCCESS)
46 return got; 52 return retbuf[0];
47 53
48 return 0; 54 return 0;
49} 55}
@@ -69,8 +75,9 @@ int hvc_put_chars(uint32_t vtermno, const char *buf, int count)
69 if (count > MAX_VIO_PUT_CHARS) 75 if (count > MAX_VIO_PUT_CHARS)
70 count = MAX_VIO_PUT_CHARS; 76 count = MAX_VIO_PUT_CHARS;
71 77
72 ret = plpar_hcall_norets(H_PUT_TERM_CHAR, vtermno, count, lbuf[0], 78 ret = plpar_hcall_norets(H_PUT_TERM_CHAR, vtermno, count,
73 lbuf[1]); 79 cpu_to_be64(lbuf[0]),
80 cpu_to_be64(lbuf[1]));
74 if (ret == H_SUCCESS) 81 if (ret == H_SUCCESS)
75 return count; 82 return count;
76 if (ret == H_BUSY) 83 if (ret == H_BUSY)
diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c
index 23fc1dcf4434..0307901e4132 100644
--- a/arch/powerpc/platforms/pseries/iommu.c
+++ b/arch/powerpc/platforms/pseries/iommu.c
@@ -48,8 +48,7 @@
48#include <asm/ppc-pci.h> 48#include <asm/ppc-pci.h>
49#include <asm/udbg.h> 49#include <asm/udbg.h>
50#include <asm/mmzone.h> 50#include <asm/mmzone.h>
51 51#include <asm/plpar_wrappers.h>
52#include "plpar_wrappers.h"
53 52
54 53
55static void tce_invalidate_pSeries_sw(struct iommu_table *tbl, 54static void tce_invalidate_pSeries_sw(struct iommu_table *tbl,
@@ -530,7 +529,7 @@ static void iommu_table_setparms(struct pci_controller *phb,
530static void iommu_table_setparms_lpar(struct pci_controller *phb, 529static void iommu_table_setparms_lpar(struct pci_controller *phb,
531 struct device_node *dn, 530 struct device_node *dn,
532 struct iommu_table *tbl, 531 struct iommu_table *tbl,
533 const void *dma_window) 532 const __be32 *dma_window)
534{ 533{
535 unsigned long offset, size; 534 unsigned long offset, size;
536 535
@@ -630,7 +629,7 @@ static void pci_dma_bus_setup_pSeriesLP(struct pci_bus *bus)
630 struct iommu_table *tbl; 629 struct iommu_table *tbl;
631 struct device_node *dn, *pdn; 630 struct device_node *dn, *pdn;
632 struct pci_dn *ppci; 631 struct pci_dn *ppci;
633 const void *dma_window = NULL; 632 const __be32 *dma_window = NULL;
634 633
635 dn = pci_bus_to_OF_node(bus); 634 dn = pci_bus_to_OF_node(bus);
636 635
@@ -1152,7 +1151,7 @@ static void pci_dma_dev_setup_pSeriesLP(struct pci_dev *dev)
1152{ 1151{
1153 struct device_node *pdn, *dn; 1152 struct device_node *pdn, *dn;
1154 struct iommu_table *tbl; 1153 struct iommu_table *tbl;
1155 const void *dma_window = NULL; 1154 const __be32 *dma_window = NULL;
1156 struct pci_dn *pci; 1155 struct pci_dn *pci;
1157 1156
1158 pr_debug("pci_dma_dev_setup_pSeriesLP: %s\n", pci_name(dev)); 1157 pr_debug("pci_dma_dev_setup_pSeriesLP: %s\n", pci_name(dev));
@@ -1201,7 +1200,7 @@ static int dma_set_mask_pSeriesLP(struct device *dev, u64 dma_mask)
1201 bool ddw_enabled = false; 1200 bool ddw_enabled = false;
1202 struct device_node *pdn, *dn; 1201 struct device_node *pdn, *dn;
1203 struct pci_dev *pdev; 1202 struct pci_dev *pdev;
1204 const void *dma_window = NULL; 1203 const __be32 *dma_window = NULL;
1205 u64 dma_offset; 1204 u64 dma_offset;
1206 1205
1207 if (!dev->dma_mask) 1206 if (!dev->dma_mask)
diff --git a/arch/powerpc/platforms/pseries/kexec.c b/arch/powerpc/platforms/pseries/kexec.c
index 7d94bdc63d50..13fa95b3aa8b 100644
--- a/arch/powerpc/platforms/pseries/kexec.c
+++ b/arch/powerpc/platforms/pseries/kexec.c
@@ -17,9 +17,9 @@
17#include <asm/mpic.h> 17#include <asm/mpic.h>
18#include <asm/xics.h> 18#include <asm/xics.h>
19#include <asm/smp.h> 19#include <asm/smp.h>
20#include <asm/plpar_wrappers.h>
20 21
21#include "pseries.h" 22#include "pseries.h"
22#include "plpar_wrappers.h"
23 23
24static void pseries_kexec_cpu_down(int crash_shutdown, int secondary) 24static void pseries_kexec_cpu_down(int crash_shutdown, int secondary)
25{ 25{
diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c
index 8bad880bd177..356bc75ca74f 100644
--- a/arch/powerpc/platforms/pseries/lpar.c
+++ b/arch/powerpc/platforms/pseries/lpar.c
@@ -41,8 +41,8 @@
41#include <asm/smp.h> 41#include <asm/smp.h>
42#include <asm/trace.h> 42#include <asm/trace.h>
43#include <asm/firmware.h> 43#include <asm/firmware.h>
44#include <asm/plpar_wrappers.h>
44 45
45#include "plpar_wrappers.h"
46#include "pseries.h" 46#include "pseries.h"
47 47
48/* Flag bits for H_BULK_REMOVE */ 48/* Flag bits for H_BULK_REMOVE */
@@ -68,6 +68,12 @@ void vpa_init(int cpu)
68 struct paca_struct *pp; 68 struct paca_struct *pp;
69 struct dtl_entry *dtl; 69 struct dtl_entry *dtl;
70 70
71 /*
72 * The spec says it "may be problematic" if CPU x registers the VPA of
73 * CPU y. We should never do that, but wail if we ever do.
74 */
75 WARN_ON(cpu != smp_processor_id());
76
71 if (cpu_has_feature(CPU_FTR_ALTIVEC)) 77 if (cpu_has_feature(CPU_FTR_ALTIVEC))
72 lppaca_of(cpu).vmxregs_in_use = 1; 78 lppaca_of(cpu).vmxregs_in_use = 1;
73 79
@@ -106,7 +112,7 @@ void vpa_init(int cpu)
106 lppaca_of(cpu).dtl_idx = 0; 112 lppaca_of(cpu).dtl_idx = 0;
107 113
108 /* hypervisor reads buffer length from this field */ 114 /* hypervisor reads buffer length from this field */
109 dtl->enqueue_to_dispatch_time = DISPATCH_LOG_BYTES; 115 dtl->enqueue_to_dispatch_time = cpu_to_be32(DISPATCH_LOG_BYTES);
110 ret = register_dtl(hwcpu, __pa(dtl)); 116 ret = register_dtl(hwcpu, __pa(dtl));
111 if (ret) 117 if (ret)
112 pr_err("WARNING: DTL registration of cpu %d (hw %d) " 118 pr_err("WARNING: DTL registration of cpu %d (hw %d) "
@@ -724,7 +730,7 @@ int h_get_mpp(struct hvcall_mpp_data *mpp_data)
724 730
725 mpp_data->mem_weight = (retbuf[3] >> 7 * 8) & 0xff; 731 mpp_data->mem_weight = (retbuf[3] >> 7 * 8) & 0xff;
726 mpp_data->unallocated_mem_weight = (retbuf[3] >> 6 * 8) & 0xff; 732 mpp_data->unallocated_mem_weight = (retbuf[3] >> 6 * 8) & 0xff;
727 mpp_data->unallocated_entitlement = retbuf[3] & 0xffffffffffff; 733 mpp_data->unallocated_entitlement = retbuf[3] & 0xffffffffffffUL;
728 734
729 mpp_data->pool_size = retbuf[4]; 735 mpp_data->pool_size = retbuf[4];
730 mpp_data->loan_request = retbuf[5]; 736 mpp_data->loan_request = retbuf[5];
diff --git a/arch/powerpc/kernel/lparcfg.c b/arch/powerpc/platforms/pseries/lparcfg.c
index d92f3871e9cf..e738007eae64 100644
--- a/arch/powerpc/kernel/lparcfg.c
+++ b/arch/powerpc/platforms/pseries/lparcfg.c
@@ -35,7 +35,13 @@
35#include <asm/vdso_datapage.h> 35#include <asm/vdso_datapage.h>
36#include <asm/vio.h> 36#include <asm/vio.h>
37#include <asm/mmu.h> 37#include <asm/mmu.h>
38#include <asm/machdep.h>
38 39
40
41/*
42 * This isn't a module but we expose that to userspace
43 * via /proc so leave the definitions here
44 */
39#define MODULE_VERS "1.9" 45#define MODULE_VERS "1.9"
40#define MODULE_NAME "lparcfg" 46#define MODULE_NAME "lparcfg"
41 47
@@ -165,7 +171,7 @@ static void parse_ppp_data(struct seq_file *m)
165 ppp_data.active_system_procs); 171 ppp_data.active_system_procs);
166 172
167 /* pool related entries are appropriate for shared configs */ 173 /* pool related entries are appropriate for shared configs */
168 if (lppaca_of(0).shared_proc) { 174 if (lppaca_shared_proc(get_lppaca())) {
169 unsigned long pool_idle_time, pool_procs; 175 unsigned long pool_idle_time, pool_procs;
170 176
171 seq_printf(m, "pool=%d\n", ppp_data.pool_num); 177 seq_printf(m, "pool=%d\n", ppp_data.pool_num);
@@ -387,8 +393,8 @@ static void pseries_cmo_data(struct seq_file *m)
387 return; 393 return;
388 394
389 for_each_possible_cpu(cpu) { 395 for_each_possible_cpu(cpu) {
390 cmo_faults += lppaca_of(cpu).cmo_faults; 396 cmo_faults += be64_to_cpu(lppaca_of(cpu).cmo_faults);
391 cmo_fault_time += lppaca_of(cpu).cmo_fault_time; 397 cmo_fault_time += be64_to_cpu(lppaca_of(cpu).cmo_fault_time);
392 } 398 }
393 399
394 seq_printf(m, "cmo_faults=%lu\n", cmo_faults); 400 seq_printf(m, "cmo_faults=%lu\n", cmo_faults);
@@ -406,8 +412,9 @@ static void splpar_dispatch_data(struct seq_file *m)
406 unsigned long dispatch_dispersions = 0; 412 unsigned long dispatch_dispersions = 0;
407 413
408 for_each_possible_cpu(cpu) { 414 for_each_possible_cpu(cpu) {
409 dispatches += lppaca_of(cpu).yield_count; 415 dispatches += be32_to_cpu(lppaca_of(cpu).yield_count);
410 dispatch_dispersions += lppaca_of(cpu).dispersion_count; 416 dispatch_dispersions +=
417 be32_to_cpu(lppaca_of(cpu).dispersion_count);
411 } 418 }
412 419
413 seq_printf(m, "dispatches=%lu\n", dispatches); 420 seq_printf(m, "dispatches=%lu\n", dispatches);
@@ -418,7 +425,8 @@ static void parse_em_data(struct seq_file *m)
418{ 425{
419 unsigned long retbuf[PLPAR_HCALL_BUFSIZE]; 426 unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
420 427
421 if (plpar_hcall(H_GET_EM_PARMS, retbuf) == H_SUCCESS) 428 if (firmware_has_feature(FW_FEATURE_LPAR) &&
429 plpar_hcall(H_GET_EM_PARMS, retbuf) == H_SUCCESS)
422 seq_printf(m, "power_mode_data=%016lx\n", retbuf[0]); 430 seq_printf(m, "power_mode_data=%016lx\n", retbuf[0]);
423} 431}
424 432
@@ -473,7 +481,8 @@ static int pseries_lparcfg_data(struct seq_file *m, void *v)
473 seq_printf(m, "partition_potential_processors=%d\n", 481 seq_printf(m, "partition_potential_processors=%d\n",
474 partition_potential_processors); 482 partition_potential_processors);
475 483
476 seq_printf(m, "shared_processor_mode=%d\n", lppaca_of(0).shared_proc); 484 seq_printf(m, "shared_processor_mode=%d\n",
485 lppaca_shared_proc(get_lppaca()));
477 486
478 seq_printf(m, "slb_size=%d\n", mmu_slb_size); 487 seq_printf(m, "slb_size=%d\n", mmu_slb_size);
479 488
@@ -677,7 +686,6 @@ static int lparcfg_open(struct inode *inode, struct file *file)
677} 686}
678 687
679static const struct file_operations lparcfg_fops = { 688static const struct file_operations lparcfg_fops = {
680 .owner = THIS_MODULE,
681 .read = seq_read, 689 .read = seq_read,
682 .write = lparcfg_write, 690 .write = lparcfg_write,
683 .open = lparcfg_open, 691 .open = lparcfg_open,
@@ -699,14 +707,4 @@ static int __init lparcfg_init(void)
699 } 707 }
700 return 0; 708 return 0;
701} 709}
702 710machine_device_initcall(pseries, lparcfg_init);
703static void __exit lparcfg_cleanup(void)
704{
705 remove_proc_subtree("powerpc/lparcfg", NULL);
706}
707
708module_init(lparcfg_init);
709module_exit(lparcfg_cleanup);
710MODULE_DESCRIPTION("Interface for LPAR configuration data");
711MODULE_AUTHOR("Dave Engebretsen");
712MODULE_LICENSE("GPL");
diff --git a/arch/powerpc/platforms/pseries/mobility.c b/arch/powerpc/platforms/pseries/mobility.c
index 3d01eee9ffb1..cde4e0a095ae 100644
--- a/arch/powerpc/platforms/pseries/mobility.c
+++ b/arch/powerpc/platforms/pseries/mobility.c
@@ -28,7 +28,7 @@ struct update_props_workarea {
28 u32 state; 28 u32 state;
29 u64 reserved; 29 u64 reserved;
30 u32 nprops; 30 u32 nprops;
31}; 31} __packed;
32 32
33#define NODE_ACTION_MASK 0xff000000 33#define NODE_ACTION_MASK 0xff000000
34#define NODE_COUNT_MASK 0x00ffffff 34#define NODE_COUNT_MASK 0x00ffffff
@@ -62,6 +62,7 @@ static int delete_dt_node(u32 phandle)
62 return -ENOENT; 62 return -ENOENT;
63 63
64 dlpar_detach_node(dn); 64 dlpar_detach_node(dn);
65 of_node_put(dn);
65 return 0; 66 return 0;
66} 67}
67 68
@@ -119,7 +120,7 @@ static int update_dt_property(struct device_node *dn, struct property **prop,
119 120
120 if (!more) { 121 if (!more) {
121 of_update_property(dn, new_prop); 122 of_update_property(dn, new_prop);
122 new_prop = NULL; 123 *prop = NULL;
123 } 124 }
124 125
125 return 0; 126 return 0;
@@ -130,7 +131,7 @@ static int update_dt_node(u32 phandle, s32 scope)
130 struct update_props_workarea *upwa; 131 struct update_props_workarea *upwa;
131 struct device_node *dn; 132 struct device_node *dn;
132 struct property *prop = NULL; 133 struct property *prop = NULL;
133 int i, rc; 134 int i, rc, rtas_rc;
134 char *prop_data; 135 char *prop_data;
135 char *rtas_buf; 136 char *rtas_buf;
136 int update_properties_token; 137 int update_properties_token;
@@ -154,25 +155,26 @@ static int update_dt_node(u32 phandle, s32 scope)
154 upwa->phandle = phandle; 155 upwa->phandle = phandle;
155 156
156 do { 157 do {
157 rc = mobility_rtas_call(update_properties_token, rtas_buf, 158 rtas_rc = mobility_rtas_call(update_properties_token, rtas_buf,
158 scope); 159 scope);
159 if (rc < 0) 160 if (rtas_rc < 0)
160 break; 161 break;
161 162
162 prop_data = rtas_buf + sizeof(*upwa); 163 prop_data = rtas_buf + sizeof(*upwa);
163 164
164 /* The first element of the buffer is the path of the node 165 /* On the first call to ibm,update-properties for a node the
165 * being updated in the form of a 8 byte string length 166 * the first property value descriptor contains an empty
166 * followed by the string. Skip past this to get to the 167 * property name, the property value length encoded as u32,
167 * properties being updated. 168 * and the property value is the node path being updated.
168 */ 169 */
169 vd = *prop_data++; 170 if (*prop_data == 0) {
170 prop_data += vd; 171 prop_data++;
172 vd = *(u32 *)prop_data;
173 prop_data += vd + sizeof(vd);
174 upwa->nprops--;
175 }
171 176
172 /* The path we skipped over is counted as one of the elements 177 for (i = 0; i < upwa->nprops; i++) {
173 * returned so start counting at one.
174 */
175 for (i = 1; i < upwa->nprops; i++) {
176 char *prop_name; 178 char *prop_name;
177 179
178 prop_name = prop_data; 180 prop_name = prop_data;
@@ -202,7 +204,7 @@ static int update_dt_node(u32 phandle, s32 scope)
202 prop_data += vd; 204 prop_data += vd;
203 } 205 }
204 } 206 }
205 } while (rc == 1); 207 } while (rtas_rc == 1);
206 208
207 of_node_put(dn); 209 of_node_put(dn);
208 kfree(rtas_buf); 210 kfree(rtas_buf);
@@ -215,17 +217,14 @@ static int add_dt_node(u32 parent_phandle, u32 drc_index)
215 struct device_node *parent_dn; 217 struct device_node *parent_dn;
216 int rc; 218 int rc;
217 219
218 dn = dlpar_configure_connector(drc_index); 220 parent_dn = of_find_node_by_phandle(parent_phandle);
219 if (!dn) 221 if (!parent_dn)
220 return -ENOENT; 222 return -ENOENT;
221 223
222 parent_dn = of_find_node_by_phandle(parent_phandle); 224 dn = dlpar_configure_connector(drc_index, parent_dn);
223 if (!parent_dn) { 225 if (!dn)
224 dlpar_free_cc_nodes(dn);
225 return -ENOENT; 226 return -ENOENT;
226 }
227 227
228 dn->parent = parent_dn;
229 rc = dlpar_attach_node(dn); 228 rc = dlpar_attach_node(dn);
230 if (rc) 229 if (rc)
231 dlpar_free_cc_nodes(dn); 230 dlpar_free_cc_nodes(dn);
diff --git a/arch/powerpc/platforms/pseries/nvram.c b/arch/powerpc/platforms/pseries/nvram.c
index 6a5f2b1f32ca..d276cd3edd8f 100644
--- a/arch/powerpc/platforms/pseries/nvram.c
+++ b/arch/powerpc/platforms/pseries/nvram.c
@@ -539,36 +539,6 @@ static int zip_oops(size_t text_len)
539} 539}
540 540
541#ifdef CONFIG_PSTORE 541#ifdef CONFIG_PSTORE
542/* Derived from logfs_uncompress */
543int nvram_decompress(void *in, void *out, size_t inlen, size_t outlen)
544{
545 int err, ret;
546
547 ret = -EIO;
548 err = zlib_inflateInit(&stream);
549 if (err != Z_OK)
550 goto error;
551
552 stream.next_in = in;
553 stream.avail_in = inlen;
554 stream.total_in = 0;
555 stream.next_out = out;
556 stream.avail_out = outlen;
557 stream.total_out = 0;
558
559 err = zlib_inflate(&stream, Z_FINISH);
560 if (err != Z_STREAM_END)
561 goto error;
562
563 err = zlib_inflateEnd(&stream);
564 if (err != Z_OK)
565 goto error;
566
567 ret = stream.total_out;
568error:
569 return ret;
570}
571
572static int nvram_pstore_open(struct pstore_info *psi) 542static int nvram_pstore_open(struct pstore_info *psi)
573{ 543{
574 /* Reset the iterator to start reading partitions again */ 544 /* Reset the iterator to start reading partitions again */
@@ -584,7 +554,7 @@ static int nvram_pstore_open(struct pstore_info *psi)
584 * @part: pstore writes data to registered buffer in parts, 554 * @part: pstore writes data to registered buffer in parts,
585 * part number will indicate the same. 555 * part number will indicate the same.
586 * @count: Indicates oops count 556 * @count: Indicates oops count
587 * @hsize: Size of header added by pstore 557 * @compressed: Flag to indicate the log is compressed
588 * @size: number of bytes written to the registered buffer 558 * @size: number of bytes written to the registered buffer
589 * @psi: registered pstore_info structure 559 * @psi: registered pstore_info structure
590 * 560 *
@@ -595,7 +565,7 @@ static int nvram_pstore_open(struct pstore_info *psi)
595static int nvram_pstore_write(enum pstore_type_id type, 565static int nvram_pstore_write(enum pstore_type_id type,
596 enum kmsg_dump_reason reason, 566 enum kmsg_dump_reason reason,
597 u64 *id, unsigned int part, int count, 567 u64 *id, unsigned int part, int count,
598 size_t hsize, size_t size, 568 bool compressed, size_t size,
599 struct pstore_info *psi) 569 struct pstore_info *psi)
600{ 570{
601 int rc; 571 int rc;
@@ -611,30 +581,11 @@ static int nvram_pstore_write(enum pstore_type_id type,
611 oops_hdr->report_length = (u16) size; 581 oops_hdr->report_length = (u16) size;
612 oops_hdr->timestamp = get_seconds(); 582 oops_hdr->timestamp = get_seconds();
613 583
614 if (big_oops_buf) { 584 if (compressed)
615 rc = zip_oops(size); 585 err_type = ERR_TYPE_KERNEL_PANIC_GZ;
616 /*
617 * If compression fails copy recent log messages from
618 * big_oops_buf to oops_data.
619 */
620 if (rc != 0) {
621 size_t diff = size - oops_data_sz + hsize;
622
623 if (size > oops_data_sz) {
624 memcpy(oops_data, big_oops_buf, hsize);
625 memcpy(oops_data + hsize, big_oops_buf + diff,
626 oops_data_sz - hsize);
627
628 oops_hdr->report_length = (u16) oops_data_sz;
629 } else
630 memcpy(oops_data, big_oops_buf, size);
631 } else
632 err_type = ERR_TYPE_KERNEL_PANIC_GZ;
633 }
634 586
635 rc = nvram_write_os_partition(&oops_log_partition, oops_buf, 587 rc = nvram_write_os_partition(&oops_log_partition, oops_buf,
636 (int) (sizeof(*oops_hdr) + oops_hdr->report_length), err_type, 588 (int) (sizeof(*oops_hdr) + size), err_type, count);
637 count);
638 589
639 if (rc != 0) 590 if (rc != 0)
640 return rc; 591 return rc;
@@ -650,12 +601,12 @@ static int nvram_pstore_write(enum pstore_type_id type,
650 */ 601 */
651static ssize_t nvram_pstore_read(u64 *id, enum pstore_type_id *type, 602static ssize_t nvram_pstore_read(u64 *id, enum pstore_type_id *type,
652 int *count, struct timespec *time, char **buf, 603 int *count, struct timespec *time, char **buf,
653 struct pstore_info *psi) 604 bool *compressed, struct pstore_info *psi)
654{ 605{
655 struct oops_log_info *oops_hdr; 606 struct oops_log_info *oops_hdr;
656 unsigned int err_type, id_no, size = 0; 607 unsigned int err_type, id_no, size = 0;
657 struct nvram_os_partition *part = NULL; 608 struct nvram_os_partition *part = NULL;
658 char *buff = NULL, *big_buff = NULL; 609 char *buff = NULL;
659 int sig = 0; 610 int sig = 0;
660 loff_t p; 611 loff_t p;
661 612
@@ -719,8 +670,7 @@ static ssize_t nvram_pstore_read(u64 *id, enum pstore_type_id *type,
719 *id = id_no; 670 *id = id_no;
720 671
721 if (nvram_type_ids[read_type] == PSTORE_TYPE_DMESG) { 672 if (nvram_type_ids[read_type] == PSTORE_TYPE_DMESG) {
722 int length, unzipped_len; 673 size_t length, hdr_size;
723 size_t hdr_size;
724 674
725 oops_hdr = (struct oops_log_info *)buff; 675 oops_hdr = (struct oops_log_info *)buff;
726 if (oops_hdr->version < OOPS_HDR_VERSION) { 676 if (oops_hdr->version < OOPS_HDR_VERSION) {
@@ -741,23 +691,10 @@ static ssize_t nvram_pstore_read(u64 *id, enum pstore_type_id *type,
741 memcpy(*buf, buff + hdr_size, length); 691 memcpy(*buf, buff + hdr_size, length);
742 kfree(buff); 692 kfree(buff);
743 693
744 if (err_type == ERR_TYPE_KERNEL_PANIC_GZ) { 694 if (err_type == ERR_TYPE_KERNEL_PANIC_GZ)
745 big_buff = kmalloc(big_oops_buf_sz, GFP_KERNEL); 695 *compressed = true;
746 if (!big_buff) 696 else
747 return -ENOMEM; 697 *compressed = false;
748
749 unzipped_len = nvram_decompress(*buf, big_buff,
750 length, big_oops_buf_sz);
751
752 if (unzipped_len < 0) {
753 pr_err("nvram: decompression failed, returned "
754 "rc %d\n", unzipped_len);
755 kfree(big_buff);
756 } else {
757 *buf = big_buff;
758 length = unzipped_len;
759 }
760 }
761 return length; 698 return length;
762 } 699 }
763 700
@@ -777,13 +714,8 @@ static int nvram_pstore_init(void)
777{ 714{
778 int rc = 0; 715 int rc = 0;
779 716
780 if (big_oops_buf) { 717 nvram_pstore_info.buf = oops_data;
781 nvram_pstore_info.buf = big_oops_buf; 718 nvram_pstore_info.bufsize = oops_data_sz;
782 nvram_pstore_info.bufsize = big_oops_buf_sz;
783 } else {
784 nvram_pstore_info.buf = oops_data;
785 nvram_pstore_info.bufsize = oops_data_sz;
786 }
787 719
788 rc = pstore_register(&nvram_pstore_info); 720 rc = pstore_register(&nvram_pstore_info);
789 if (rc != 0) 721 if (rc != 0)
@@ -802,7 +734,6 @@ static int nvram_pstore_init(void)
802static void __init nvram_init_oops_partition(int rtas_partition_exists) 734static void __init nvram_init_oops_partition(int rtas_partition_exists)
803{ 735{
804 int rc; 736 int rc;
805 size_t size;
806 737
807 rc = pseries_nvram_init_os_partition(&oops_log_partition); 738 rc = pseries_nvram_init_os_partition(&oops_log_partition);
808 if (rc != 0) { 739 if (rc != 0) {
@@ -823,6 +754,11 @@ static void __init nvram_init_oops_partition(int rtas_partition_exists)
823 oops_data = oops_buf + sizeof(struct oops_log_info); 754 oops_data = oops_buf + sizeof(struct oops_log_info);
824 oops_data_sz = oops_log_partition.size - sizeof(struct oops_log_info); 755 oops_data_sz = oops_log_partition.size - sizeof(struct oops_log_info);
825 756
757 rc = nvram_pstore_init();
758
759 if (!rc)
760 return;
761
826 /* 762 /*
827 * Figure compression (preceded by elimination of each line's <n> 763 * Figure compression (preceded by elimination of each line's <n>
828 * severity prefix) will reduce the oops/panic report to at most 764 * severity prefix) will reduce the oops/panic report to at most
@@ -831,9 +767,8 @@ static void __init nvram_init_oops_partition(int rtas_partition_exists)
831 big_oops_buf_sz = (oops_data_sz * 100) / 45; 767 big_oops_buf_sz = (oops_data_sz * 100) / 45;
832 big_oops_buf = kmalloc(big_oops_buf_sz, GFP_KERNEL); 768 big_oops_buf = kmalloc(big_oops_buf_sz, GFP_KERNEL);
833 if (big_oops_buf) { 769 if (big_oops_buf) {
834 size = max(zlib_deflate_workspacesize(WINDOW_BITS, MEM_LEVEL), 770 stream.workspace = kmalloc(zlib_deflate_workspacesize(
835 zlib_inflate_workspacesize()); 771 WINDOW_BITS, MEM_LEVEL), GFP_KERNEL);
836 stream.workspace = kmalloc(size, GFP_KERNEL);
837 if (!stream.workspace) { 772 if (!stream.workspace) {
838 pr_err("nvram: No memory for compression workspace; " 773 pr_err("nvram: No memory for compression workspace; "
839 "skipping compression of %s partition data\n", 774 "skipping compression of %s partition data\n",
@@ -847,11 +782,6 @@ static void __init nvram_init_oops_partition(int rtas_partition_exists)
847 stream.workspace = NULL; 782 stream.workspace = NULL;
848 } 783 }
849 784
850 rc = nvram_pstore_init();
851
852 if (!rc)
853 return;
854
855 rc = kmsg_dump_register(&nvram_kmsg_dumper); 785 rc = kmsg_dump_register(&nvram_kmsg_dumper);
856 if (rc != 0) { 786 if (rc != 0) {
857 pr_err("nvram: kmsg_dump_register() failed; returned %d\n", rc); 787 pr_err("nvram: kmsg_dump_register() failed; returned %d\n", rc);
diff --git a/arch/powerpc/platforms/pseries/processor_idle.c b/arch/powerpc/platforms/pseries/processor_idle.c
index 4644efa06941..a166e38bd683 100644
--- a/arch/powerpc/platforms/pseries/processor_idle.c
+++ b/arch/powerpc/platforms/pseries/processor_idle.c
@@ -18,9 +18,7 @@
18#include <asm/machdep.h> 18#include <asm/machdep.h>
19#include <asm/firmware.h> 19#include <asm/firmware.h>
20#include <asm/runlatch.h> 20#include <asm/runlatch.h>
21 21#include <asm/plpar_wrappers.h>
22#include "plpar_wrappers.h"
23#include "pseries.h"
24 22
25struct cpuidle_driver pseries_idle_driver = { 23struct cpuidle_driver pseries_idle_driver = {
26 .name = "pseries_idle", 24 .name = "pseries_idle",
@@ -45,7 +43,11 @@ static inline void idle_loop_prolog(unsigned long *in_purr)
45 43
46static inline void idle_loop_epilog(unsigned long in_purr) 44static inline void idle_loop_epilog(unsigned long in_purr)
47{ 45{
48 get_lppaca()->wait_state_cycles += mfspr(SPRN_PURR) - in_purr; 46 u64 wait_cycles;
47
48 wait_cycles = be64_to_cpu(get_lppaca()->wait_state_cycles);
49 wait_cycles += mfspr(SPRN_PURR) - in_purr;
50 get_lppaca()->wait_state_cycles = cpu_to_be64(wait_cycles);
49 get_lppaca()->idle = 0; 51 get_lppaca()->idle = 0;
50} 52}
51 53
@@ -308,7 +310,7 @@ static int pseries_idle_probe(void)
308 return -EPERM; 310 return -EPERM;
309 } 311 }
310 312
311 if (get_lppaca()->shared_proc) 313 if (lppaca_shared_proc(get_lppaca()))
312 cpuidle_state_table = shared_states; 314 cpuidle_state_table = shared_states;
313 else 315 else
314 cpuidle_state_table = dedicated_states; 316 cpuidle_state_table = dedicated_states;
diff --git a/arch/powerpc/platforms/pseries/pseries.h b/arch/powerpc/platforms/pseries/pseries.h
index c2a3a258001c..99219530ea4a 100644
--- a/arch/powerpc/platforms/pseries/pseries.h
+++ b/arch/powerpc/platforms/pseries/pseries.h
@@ -56,13 +56,10 @@ extern void hvc_vio_init_early(void);
56/* Dynamic logical Partitioning/Mobility */ 56/* Dynamic logical Partitioning/Mobility */
57extern void dlpar_free_cc_nodes(struct device_node *); 57extern void dlpar_free_cc_nodes(struct device_node *);
58extern void dlpar_free_cc_property(struct property *); 58extern void dlpar_free_cc_property(struct property *);
59extern struct device_node *dlpar_configure_connector(u32); 59extern struct device_node *dlpar_configure_connector(u32, struct device_node *);
60extern int dlpar_attach_node(struct device_node *); 60extern int dlpar_attach_node(struct device_node *);
61extern int dlpar_detach_node(struct device_node *); 61extern int dlpar_detach_node(struct device_node *);
62 62
63/* Snooze Delay, pseries_idle */
64DECLARE_PER_CPU(long, smt_snooze_delay);
65
66/* PCI root bridge prepare function override for pseries */ 63/* PCI root bridge prepare function override for pseries */
67struct pci_host_bridge; 64struct pci_host_bridge;
68int pseries_root_bridge_prepare(struct pci_host_bridge *bridge); 65int pseries_root_bridge_prepare(struct pci_host_bridge *bridge);
diff --git a/arch/powerpc/platforms/pseries/pseries_energy.c b/arch/powerpc/platforms/pseries/pseries_energy.c
index a91e6dadda2c..92767791f93b 100644
--- a/arch/powerpc/platforms/pseries/pseries_energy.c
+++ b/arch/powerpc/platforms/pseries/pseries_energy.c
@@ -108,8 +108,8 @@ err:
108 * energy consumption. 108 * energy consumption.
109 */ 109 */
110 110
111#define FLAGS_MODE1 0x004E200000080E01 111#define FLAGS_MODE1 0x004E200000080E01UL
112#define FLAGS_MODE2 0x004E200000080401 112#define FLAGS_MODE2 0x004E200000080401UL
113#define FLAGS_ACTIVATE 0x100 113#define FLAGS_ACTIVATE 0x100
114 114
115static ssize_t get_best_energy_list(char *page, int activate) 115static ssize_t get_best_energy_list(char *page, int activate)
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c
index c11c8238797c..1f97e2b87a62 100644
--- a/arch/powerpc/platforms/pseries/setup.c
+++ b/arch/powerpc/platforms/pseries/setup.c
@@ -66,8 +66,8 @@
66#include <asm/firmware.h> 66#include <asm/firmware.h>
67#include <asm/eeh.h> 67#include <asm/eeh.h>
68#include <asm/reg.h> 68#include <asm/reg.h>
69#include <asm/plpar_wrappers.h>
69 70
70#include "plpar_wrappers.h"
71#include "pseries.h" 71#include "pseries.h"
72 72
73int CMO_PrPSP = -1; 73int CMO_PrPSP = -1;
@@ -183,7 +183,7 @@ static void __init pseries_mpic_init_IRQ(void)
183 np = of_find_node_by_path("/"); 183 np = of_find_node_by_path("/");
184 naddr = of_n_addr_cells(np); 184 naddr = of_n_addr_cells(np);
185 opprop = of_get_property(np, "platform-open-pic", &opplen); 185 opprop = of_get_property(np, "platform-open-pic", &opplen);
186 if (opprop != 0) { 186 if (opprop != NULL) {
187 openpic_addr = of_read_number(opprop, naddr); 187 openpic_addr = of_read_number(opprop, naddr);
188 printk(KERN_DEBUG "OpenPIC addr: %lx\n", openpic_addr); 188 printk(KERN_DEBUG "OpenPIC addr: %lx\n", openpic_addr);
189 } 189 }
@@ -323,7 +323,7 @@ static int alloc_dispatch_logs(void)
323 get_paca()->lppaca_ptr->dtl_idx = 0; 323 get_paca()->lppaca_ptr->dtl_idx = 0;
324 324
325 /* hypervisor reads buffer length from this field */ 325 /* hypervisor reads buffer length from this field */
326 dtl->enqueue_to_dispatch_time = DISPATCH_LOG_BYTES; 326 dtl->enqueue_to_dispatch_time = cpu_to_be32(DISPATCH_LOG_BYTES);
327 ret = register_dtl(hard_smp_processor_id(), __pa(dtl)); 327 ret = register_dtl(hard_smp_processor_id(), __pa(dtl));
328 if (ret) 328 if (ret)
329 pr_err("WARNING: DTL registration of cpu %d (hw %d) failed " 329 pr_err("WARNING: DTL registration of cpu %d (hw %d) failed "
@@ -354,7 +354,7 @@ static int alloc_dispatch_log_kmem_cache(void)
354} 354}
355early_initcall(alloc_dispatch_log_kmem_cache); 355early_initcall(alloc_dispatch_log_kmem_cache);
356 356
357static void pSeries_idle(void) 357static void pseries_lpar_idle(void)
358{ 358{
359 /* This would call on the cpuidle framework, and the back-end pseries 359 /* This would call on the cpuidle framework, and the back-end pseries
360 * driver to go to idle states 360 * driver to go to idle states
@@ -362,10 +362,22 @@ static void pSeries_idle(void)
362 if (cpuidle_idle_call()) { 362 if (cpuidle_idle_call()) {
363 /* On error, execute default handler 363 /* On error, execute default handler
364 * to go into low thread priority and possibly 364 * to go into low thread priority and possibly
365 * low power mode. 365 * low power mode by cedeing processor to hypervisor
366 */ 366 */
367 HMT_low(); 367
368 HMT_very_low(); 368 /* Indicate to hypervisor that we are idle. */
369 get_lppaca()->idle = 1;
370
371 /*
372 * Yield the processor to the hypervisor. We return if
373 * an external interrupt occurs (which are driven prior
374 * to returning here) or if a prod occurs from another
375 * processor. When returning here, external interrupts
376 * are enabled.
377 */
378 cede_processor();
379
380 get_lppaca()->idle = 0;
369 } 381 }
370} 382}
371 383
@@ -456,15 +468,14 @@ static void __init pSeries_setup_arch(void)
456 468
457 pSeries_nvram_init(); 469 pSeries_nvram_init();
458 470
459 if (firmware_has_feature(FW_FEATURE_SPLPAR)) { 471 if (firmware_has_feature(FW_FEATURE_LPAR)) {
460 vpa_init(boot_cpuid); 472 vpa_init(boot_cpuid);
461 ppc_md.power_save = pSeries_idle; 473 ppc_md.power_save = pseries_lpar_idle;
462 }
463
464 if (firmware_has_feature(FW_FEATURE_LPAR))
465 ppc_md.enable_pmcs = pseries_lpar_enable_pmcs; 474 ppc_md.enable_pmcs = pseries_lpar_enable_pmcs;
466 else 475 } else {
476 /* No special idle routine */
467 ppc_md.enable_pmcs = power4_enable_pmcs; 477 ppc_md.enable_pmcs = power4_enable_pmcs;
478 }
468 479
469 ppc_md.pcibios_root_bridge_prepare = pseries_root_bridge_prepare; 480 ppc_md.pcibios_root_bridge_prepare = pseries_root_bridge_prepare;
470 481
diff --git a/arch/powerpc/platforms/pseries/smp.c b/arch/powerpc/platforms/pseries/smp.c
index 306643cc9dbc..24f58cb0a543 100644
--- a/arch/powerpc/platforms/pseries/smp.c
+++ b/arch/powerpc/platforms/pseries/smp.c
@@ -43,8 +43,8 @@
43#include <asm/cputhreads.h> 43#include <asm/cputhreads.h>
44#include <asm/xics.h> 44#include <asm/xics.h>
45#include <asm/dbell.h> 45#include <asm/dbell.h>
46#include <asm/plpar_wrappers.h>
46 47
47#include "plpar_wrappers.h"
48#include "pseries.h" 48#include "pseries.h"
49#include "offline_states.h" 49#include "offline_states.h"
50 50
@@ -187,22 +187,6 @@ static int smp_pSeries_kick_cpu(int nr)
187 return 0; 187 return 0;
188} 188}
189 189
190static int smp_pSeries_cpu_bootable(unsigned int nr)
191{
192 /* Special case - we inhibit secondary thread startup
193 * during boot if the user requests it.
194 */
195 if (system_state == SYSTEM_BOOTING && cpu_has_feature(CPU_FTR_SMT)) {
196 if (!smt_enabled_at_boot && cpu_thread_in_core(nr) != 0)
197 return 0;
198 if (smt_enabled_at_boot
199 && cpu_thread_in_core(nr) >= smt_enabled_at_boot)
200 return 0;
201 }
202
203 return 1;
204}
205
206/* Only used on systems that support multiple IPI mechanisms */ 190/* Only used on systems that support multiple IPI mechanisms */
207static void pSeries_cause_ipi_mux(int cpu, unsigned long data) 191static void pSeries_cause_ipi_mux(int cpu, unsigned long data)
208{ 192{
@@ -237,7 +221,7 @@ static struct smp_ops_t pSeries_xics_smp_ops = {
237 .probe = pSeries_smp_probe, 221 .probe = pSeries_smp_probe,
238 .kick_cpu = smp_pSeries_kick_cpu, 222 .kick_cpu = smp_pSeries_kick_cpu,
239 .setup_cpu = smp_xics_setup_cpu, 223 .setup_cpu = smp_xics_setup_cpu,
240 .cpu_bootable = smp_pSeries_cpu_bootable, 224 .cpu_bootable = smp_generic_cpu_bootable,
241}; 225};
242 226
243/* This is called very early */ 227/* This is called very early */
@@ -249,18 +233,24 @@ static void __init smp_init_pseries(void)
249 233
250 alloc_bootmem_cpumask_var(&of_spin_mask); 234 alloc_bootmem_cpumask_var(&of_spin_mask);
251 235
252 /* Mark threads which are still spinning in hold loops. */ 236 /*
253 if (cpu_has_feature(CPU_FTR_SMT)) { 237 * Mark threads which are still spinning in hold loops
254 for_each_present_cpu(i) { 238 *
255 if (cpu_thread_in_core(i) == 0) 239 * We know prom_init will not have started them if RTAS supports
256 cpumask_set_cpu(i, of_spin_mask); 240 * query-cpu-stopped-state.
257 } 241 */
258 } else { 242 if (rtas_token("query-cpu-stopped-state") == RTAS_UNKNOWN_SERVICE) {
259 cpumask_copy(of_spin_mask, cpu_present_mask); 243 if (cpu_has_feature(CPU_FTR_SMT)) {
244 for_each_present_cpu(i) {
245 if (cpu_thread_in_core(i) == 0)
246 cpumask_set_cpu(i, of_spin_mask);
247 }
248 } else
249 cpumask_copy(of_spin_mask, cpu_present_mask);
250
251 cpumask_clear_cpu(boot_cpuid, of_spin_mask);
260 } 252 }
261 253
262 cpumask_clear_cpu(boot_cpuid, of_spin_mask);
263
264 /* Non-lpar has additional take/give timebase */ 254 /* Non-lpar has additional take/give timebase */
265 if (rtas_token("freeze-time-base") != RTAS_UNKNOWN_SERVICE) { 255 if (rtas_token("freeze-time-base") != RTAS_UNKNOWN_SERVICE) {
266 smp_ops->give_timebase = rtas_give_timebase; 256 smp_ops->give_timebase = rtas_give_timebase;
diff --git a/arch/powerpc/platforms/wsp/wsp.h b/arch/powerpc/platforms/wsp/wsp.h
index 62ef21afb89a..a563a8aaf812 100644
--- a/arch/powerpc/platforms/wsp/wsp.h
+++ b/arch/powerpc/platforms/wsp/wsp.h
@@ -17,7 +17,6 @@ extern void scom_init_wsp(void);
17extern void a2_setup_smp(void); 17extern void a2_setup_smp(void);
18extern int a2_scom_startup_cpu(unsigned int lcpu, int thr_idx, 18extern int a2_scom_startup_cpu(unsigned int lcpu, int thr_idx,
19 struct device_node *np); 19 struct device_node *np);
20extern int smp_a2_cpu_bootable(unsigned int nr);
21extern int smp_a2_kick_cpu(int nr); 20extern int smp_a2_kick_cpu(int nr);
22 21
23extern void opb_pic_init(void); 22extern void opb_pic_init(void);
diff --git a/arch/powerpc/sysdev/fsl_msi.c b/arch/powerpc/sysdev/fsl_msi.c
index ab02db3d02d8..77efbaec7b9c 100644
--- a/arch/powerpc/sysdev/fsl_msi.c
+++ b/arch/powerpc/sysdev/fsl_msi.c
@@ -28,6 +28,18 @@
28#include "fsl_msi.h" 28#include "fsl_msi.h"
29#include "fsl_pci.h" 29#include "fsl_pci.h"
30 30
31#define MSIIR_OFFSET_MASK 0xfffff
32#define MSIIR_IBS_SHIFT 0
33#define MSIIR_SRS_SHIFT 5
34#define MSIIR1_IBS_SHIFT 4
35#define MSIIR1_SRS_SHIFT 0
36#define MSI_SRS_MASK 0xf
37#define MSI_IBS_MASK 0x1f
38
39#define msi_hwirq(msi, msir_index, intr_index) \
40 ((msir_index) << (msi)->srs_shift | \
41 ((intr_index) << (msi)->ibs_shift))
42
31static LIST_HEAD(msi_head); 43static LIST_HEAD(msi_head);
32 44
33struct fsl_msi_feature { 45struct fsl_msi_feature {
@@ -80,18 +92,19 @@ static const struct irq_domain_ops fsl_msi_host_ops = {
80 92
81static int fsl_msi_init_allocator(struct fsl_msi *msi_data) 93static int fsl_msi_init_allocator(struct fsl_msi *msi_data)
82{ 94{
83 int rc; 95 int rc, hwirq;
84 96
85 rc = msi_bitmap_alloc(&msi_data->bitmap, NR_MSI_IRQS, 97 rc = msi_bitmap_alloc(&msi_data->bitmap, NR_MSI_IRQS_MAX,
86 msi_data->irqhost->of_node); 98 msi_data->irqhost->of_node);
87 if (rc) 99 if (rc)
88 return rc; 100 return rc;
89 101
90 rc = msi_bitmap_reserve_dt_hwirqs(&msi_data->bitmap); 102 /*
91 if (rc < 0) { 103 * Reserve all the hwirqs
92 msi_bitmap_free(&msi_data->bitmap); 104 * The available hwirqs will be released in fsl_msi_setup_hwirq()
93 return rc; 105 */
94 } 106 for (hwirq = 0; hwirq < NR_MSI_IRQS_MAX; hwirq++)
107 msi_bitmap_reserve_hwirq(&msi_data->bitmap, hwirq);
95 108
96 return 0; 109 return 0;
97} 110}
@@ -144,8 +157,9 @@ static void fsl_compose_msi_msg(struct pci_dev *pdev, int hwirq,
144 157
145 msg->data = hwirq; 158 msg->data = hwirq;
146 159
147 pr_debug("%s: allocated srs: %d, ibs: %d\n", 160 pr_debug("%s: allocated srs: %d, ibs: %d\n", __func__,
148 __func__, hwirq / IRQS_PER_MSI_REG, hwirq % IRQS_PER_MSI_REG); 161 (hwirq >> msi_data->srs_shift) & MSI_SRS_MASK,
162 (hwirq >> msi_data->ibs_shift) & MSI_IBS_MASK);
149} 163}
150 164
151static int fsl_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type) 165static int fsl_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
@@ -255,7 +269,7 @@ static void fsl_msi_cascade(unsigned int irq, struct irq_desc *desc)
255 269
256 msir_index = cascade_data->index; 270 msir_index = cascade_data->index;
257 271
258 if (msir_index >= NR_MSI_REG) 272 if (msir_index >= NR_MSI_REG_MAX)
259 cascade_irq = NO_IRQ; 273 cascade_irq = NO_IRQ;
260 274
261 irqd_set_chained_irq_inprogress(idata); 275 irqd_set_chained_irq_inprogress(idata);
@@ -285,8 +299,8 @@ static void fsl_msi_cascade(unsigned int irq, struct irq_desc *desc)
285 intr_index = ffs(msir_value) - 1; 299 intr_index = ffs(msir_value) - 1;
286 300
287 cascade_irq = irq_linear_revmap(msi_data->irqhost, 301 cascade_irq = irq_linear_revmap(msi_data->irqhost,
288 msir_index * IRQS_PER_MSI_REG + 302 msi_hwirq(msi_data, msir_index,
289 intr_index + have_shift); 303 intr_index + have_shift));
290 if (cascade_irq != NO_IRQ) 304 if (cascade_irq != NO_IRQ)
291 generic_handle_irq(cascade_irq); 305 generic_handle_irq(cascade_irq);
292 have_shift += intr_index + 1; 306 have_shift += intr_index + 1;
@@ -316,7 +330,7 @@ static int fsl_of_msi_remove(struct platform_device *ofdev)
316 330
317 if (msi->list.prev != NULL) 331 if (msi->list.prev != NULL)
318 list_del(&msi->list); 332 list_del(&msi->list);
319 for (i = 0; i < NR_MSI_REG; i++) { 333 for (i = 0; i < NR_MSI_REG_MAX; i++) {
320 virq = msi->msi_virqs[i]; 334 virq = msi->msi_virqs[i];
321 if (virq != NO_IRQ) { 335 if (virq != NO_IRQ) {
322 cascade_data = irq_get_handler_data(virq); 336 cascade_data = irq_get_handler_data(virq);
@@ -339,7 +353,7 @@ static int fsl_msi_setup_hwirq(struct fsl_msi *msi, struct platform_device *dev,
339 int offset, int irq_index) 353 int offset, int irq_index)
340{ 354{
341 struct fsl_msi_cascade_data *cascade_data = NULL; 355 struct fsl_msi_cascade_data *cascade_data = NULL;
342 int virt_msir; 356 int virt_msir, i;
343 357
344 virt_msir = irq_of_parse_and_map(dev->dev.of_node, irq_index); 358 virt_msir = irq_of_parse_and_map(dev->dev.of_node, irq_index);
345 if (virt_msir == NO_IRQ) { 359 if (virt_msir == NO_IRQ) {
@@ -360,6 +374,11 @@ static int fsl_msi_setup_hwirq(struct fsl_msi *msi, struct platform_device *dev,
360 irq_set_handler_data(virt_msir, cascade_data); 374 irq_set_handler_data(virt_msir, cascade_data);
361 irq_set_chained_handler(virt_msir, fsl_msi_cascade); 375 irq_set_chained_handler(virt_msir, fsl_msi_cascade);
362 376
377 /* Release the hwirqs corresponding to this MSI register */
378 for (i = 0; i < IRQS_PER_MSI_REG; i++)
379 msi_bitmap_free_hwirqs(&msi->bitmap,
380 msi_hwirq(msi, offset, i), 1);
381
363 return 0; 382 return 0;
364} 383}
365 384
@@ -368,14 +387,12 @@ static int fsl_of_msi_probe(struct platform_device *dev)
368{ 387{
369 const struct of_device_id *match; 388 const struct of_device_id *match;
370 struct fsl_msi *msi; 389 struct fsl_msi *msi;
371 struct resource res; 390 struct resource res, msiir;
372 int err, i, j, irq_index, count; 391 int err, i, j, irq_index, count;
373 int rc;
374 const u32 *p; 392 const u32 *p;
375 const struct fsl_msi_feature *features; 393 const struct fsl_msi_feature *features;
376 int len; 394 int len;
377 u32 offset; 395 u32 offset;
378 static const u32 all_avail[] = { 0, NR_MSI_IRQS };
379 396
380 match = of_match_device(fsl_of_msi_ids, &dev->dev); 397 match = of_match_device(fsl_of_msi_ids, &dev->dev);
381 if (!match) 398 if (!match)
@@ -392,7 +409,7 @@ static int fsl_of_msi_probe(struct platform_device *dev)
392 platform_set_drvdata(dev, msi); 409 platform_set_drvdata(dev, msi);
393 410
394 msi->irqhost = irq_domain_add_linear(dev->dev.of_node, 411 msi->irqhost = irq_domain_add_linear(dev->dev.of_node,
395 NR_MSI_IRQS, &fsl_msi_host_ops, msi); 412 NR_MSI_IRQS_MAX, &fsl_msi_host_ops, msi);
396 413
397 if (msi->irqhost == NULL) { 414 if (msi->irqhost == NULL) {
398 dev_err(&dev->dev, "No memory for MSI irqhost\n"); 415 dev_err(&dev->dev, "No memory for MSI irqhost\n");
@@ -421,6 +438,16 @@ static int fsl_of_msi_probe(struct platform_device *dev)
421 } 438 }
422 msi->msiir_offset = 439 msi->msiir_offset =
423 features->msiir_offset + (res.start & 0xfffff); 440 features->msiir_offset + (res.start & 0xfffff);
441
442 /*
443 * First read the MSIIR/MSIIR1 offset from dts
444 * On failure use the hardcode MSIIR offset
445 */
446 if (of_address_to_resource(dev->dev.of_node, 1, &msiir))
447 msi->msiir_offset = features->msiir_offset +
448 (res.start & MSIIR_OFFSET_MASK);
449 else
450 msi->msiir_offset = msiir.start & MSIIR_OFFSET_MASK;
424 } 451 }
425 452
426 msi->feature = features->fsl_pic_ip; 453 msi->feature = features->fsl_pic_ip;
@@ -431,42 +458,66 @@ static int fsl_of_msi_probe(struct platform_device *dev)
431 */ 458 */
432 msi->phandle = dev->dev.of_node->phandle; 459 msi->phandle = dev->dev.of_node->phandle;
433 460
434 rc = fsl_msi_init_allocator(msi); 461 err = fsl_msi_init_allocator(msi);
435 if (rc) { 462 if (err) {
436 dev_err(&dev->dev, "Error allocating MSI bitmap\n"); 463 dev_err(&dev->dev, "Error allocating MSI bitmap\n");
437 goto error_out; 464 goto error_out;
438 } 465 }
439 466
440 p = of_get_property(dev->dev.of_node, "msi-available-ranges", &len); 467 p = of_get_property(dev->dev.of_node, "msi-available-ranges", &len);
441 if (p && len % (2 * sizeof(u32)) != 0) {
442 dev_err(&dev->dev, "%s: Malformed msi-available-ranges property\n",
443 __func__);
444 err = -EINVAL;
445 goto error_out;
446 }
447 468
448 if (!p) { 469 if (of_device_is_compatible(dev->dev.of_node, "fsl,mpic-msi-v4.3")) {
449 p = all_avail; 470 msi->srs_shift = MSIIR1_SRS_SHIFT;
450 len = sizeof(all_avail); 471 msi->ibs_shift = MSIIR1_IBS_SHIFT;
451 } 472 if (p)
473 dev_warn(&dev->dev, "%s: dose not support msi-available-ranges property\n",
474 __func__);
475
476 for (irq_index = 0; irq_index < NR_MSI_REG_MSIIR1;
477 irq_index++) {
478 err = fsl_msi_setup_hwirq(msi, dev,
479 irq_index, irq_index);
480 if (err)
481 goto error_out;
482 }
483 } else {
484 static const u32 all_avail[] =
485 { 0, NR_MSI_REG_MSIIR * IRQS_PER_MSI_REG };
452 486
453 for (irq_index = 0, i = 0; i < len / (2 * sizeof(u32)); i++) { 487 msi->srs_shift = MSIIR_SRS_SHIFT;
454 if (p[i * 2] % IRQS_PER_MSI_REG || 488 msi->ibs_shift = MSIIR_IBS_SHIFT;
455 p[i * 2 + 1] % IRQS_PER_MSI_REG) { 489
456 printk(KERN_WARNING "%s: %s: msi available range of %u at %u is not IRQ-aligned\n", 490 if (p && len % (2 * sizeof(u32)) != 0) {
457 __func__, dev->dev.of_node->full_name, 491 dev_err(&dev->dev, "%s: Malformed msi-available-ranges property\n",
458 p[i * 2 + 1], p[i * 2]); 492 __func__);
459 err = -EINVAL; 493 err = -EINVAL;
460 goto error_out; 494 goto error_out;
461 } 495 }
462 496
463 offset = p[i * 2] / IRQS_PER_MSI_REG; 497 if (!p) {
464 count = p[i * 2 + 1] / IRQS_PER_MSI_REG; 498 p = all_avail;
499 len = sizeof(all_avail);
500 }
465 501
466 for (j = 0; j < count; j++, irq_index++) { 502 for (irq_index = 0, i = 0; i < len / (2 * sizeof(u32)); i++) {
467 err = fsl_msi_setup_hwirq(msi, dev, offset + j, irq_index); 503 if (p[i * 2] % IRQS_PER_MSI_REG ||
468 if (err) 504 p[i * 2 + 1] % IRQS_PER_MSI_REG) {
505 pr_warn("%s: %s: msi available range of %u at %u is not IRQ-aligned\n",
506 __func__, dev->dev.of_node->full_name,
507 p[i * 2 + 1], p[i * 2]);
508 err = -EINVAL;
469 goto error_out; 509 goto error_out;
510 }
511
512 offset = p[i * 2] / IRQS_PER_MSI_REG;
513 count = p[i * 2 + 1] / IRQS_PER_MSI_REG;
514
515 for (j = 0; j < count; j++, irq_index++) {
516 err = fsl_msi_setup_hwirq(msi, dev, offset + j,
517 irq_index);
518 if (err)
519 goto error_out;
520 }
470 } 521 }
471 } 522 }
472 523
@@ -509,6 +560,10 @@ static const struct of_device_id fsl_of_msi_ids[] = {
509 .data = &mpic_msi_feature, 560 .data = &mpic_msi_feature,
510 }, 561 },
511 { 562 {
563 .compatible = "fsl,mpic-msi-v4.3",
564 .data = &mpic_msi_feature,
565 },
566 {
512 .compatible = "fsl,ipic-msi", 567 .compatible = "fsl,ipic-msi",
513 .data = &ipic_msi_feature, 568 .data = &ipic_msi_feature,
514 }, 569 },
diff --git a/arch/powerpc/sysdev/fsl_msi.h b/arch/powerpc/sysdev/fsl_msi.h
index 8225f8653f78..df9aa9fe0933 100644
--- a/arch/powerpc/sysdev/fsl_msi.h
+++ b/arch/powerpc/sysdev/fsl_msi.h
@@ -16,9 +16,11 @@
16#include <linux/of.h> 16#include <linux/of.h>
17#include <asm/msi_bitmap.h> 17#include <asm/msi_bitmap.h>
18 18
19#define NR_MSI_REG 8 19#define NR_MSI_REG_MSIIR 8 /* MSIIR can index 8 MSI registers */
20#define NR_MSI_REG_MSIIR1 16 /* MSIIR1 can index 16 MSI registers */
21#define NR_MSI_REG_MAX NR_MSI_REG_MSIIR1
20#define IRQS_PER_MSI_REG 32 22#define IRQS_PER_MSI_REG 32
21#define NR_MSI_IRQS (NR_MSI_REG * IRQS_PER_MSI_REG) 23#define NR_MSI_IRQS_MAX (NR_MSI_REG_MAX * IRQS_PER_MSI_REG)
22 24
23#define FSL_PIC_IP_MASK 0x0000000F 25#define FSL_PIC_IP_MASK 0x0000000F
24#define FSL_PIC_IP_MPIC 0x00000001 26#define FSL_PIC_IP_MPIC 0x00000001
@@ -31,9 +33,11 @@ struct fsl_msi {
31 unsigned long cascade_irq; 33 unsigned long cascade_irq;
32 34
33 u32 msiir_offset; /* Offset of MSIIR, relative to start of CCSR */ 35 u32 msiir_offset; /* Offset of MSIIR, relative to start of CCSR */
36 u32 ibs_shift; /* Shift of interrupt bit select */
37 u32 srs_shift; /* Shift of the shared interrupt register select */
34 void __iomem *msi_regs; 38 void __iomem *msi_regs;
35 u32 feature; 39 u32 feature;
36 int msi_virqs[NR_MSI_REG]; 40 int msi_virqs[NR_MSI_REG_MAX];
37 41
38 struct msi_bitmap bitmap; 42 struct msi_bitmap bitmap;
39 43
diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c
index 46ac1ddea683..ccfb50ddfe38 100644
--- a/arch/powerpc/sysdev/fsl_pci.c
+++ b/arch/powerpc/sysdev/fsl_pci.c
@@ -26,11 +26,15 @@
26#include <linux/memblock.h> 26#include <linux/memblock.h>
27#include <linux/log2.h> 27#include <linux/log2.h>
28#include <linux/slab.h> 28#include <linux/slab.h>
29#include <linux/uaccess.h>
29 30
30#include <asm/io.h> 31#include <asm/io.h>
31#include <asm/prom.h> 32#include <asm/prom.h>
32#include <asm/pci-bridge.h> 33#include <asm/pci-bridge.h>
34#include <asm/ppc-pci.h>
33#include <asm/machdep.h> 35#include <asm/machdep.h>
36#include <asm/disassemble.h>
37#include <asm/ppc-opcode.h>
34#include <sysdev/fsl_soc.h> 38#include <sysdev/fsl_soc.h>
35#include <sysdev/fsl_pci.h> 39#include <sysdev/fsl_pci.h>
36 40
@@ -64,7 +68,7 @@ static int fsl_pcie_check_link(struct pci_controller *hose)
64 if (hose->indirect_type & PPC_INDIRECT_TYPE_FSL_CFG_REG_LINK) { 68 if (hose->indirect_type & PPC_INDIRECT_TYPE_FSL_CFG_REG_LINK) {
65 if (hose->ops->read == fsl_indirect_read_config) { 69 if (hose->ops->read == fsl_indirect_read_config) {
66 struct pci_bus bus; 70 struct pci_bus bus;
67 bus.number = 0; 71 bus.number = hose->first_busno;
68 bus.sysdata = hose; 72 bus.sysdata = hose;
69 bus.ops = hose->ops; 73 bus.ops = hose->ops;
70 indirect_read_config(&bus, 0, PCIE_LTSSM, 4, &val); 74 indirect_read_config(&bus, 0, PCIE_LTSSM, 4, &val);
@@ -297,10 +301,10 @@ static void setup_pci_atmu(struct pci_controller *hose)
297 if (early_find_capability(hose, 0, 0, PCI_CAP_ID_EXP)) { 301 if (early_find_capability(hose, 0, 0, PCI_CAP_ID_EXP)) {
298 /* Size window to exact size if power-of-two or one size up */ 302 /* Size window to exact size if power-of-two or one size up */
299 if ((1ull << mem_log) != mem) { 303 if ((1ull << mem_log) != mem) {
304 mem_log++;
300 if ((1ull << mem_log) > mem) 305 if ((1ull << mem_log) > mem)
301 pr_info("%s: Setting PCI inbound window " 306 pr_info("%s: Setting PCI inbound window "
302 "greater than memory size\n", name); 307 "greater than memory size\n", name);
303 mem_log++;
304 } 308 }
305 309
306 piwar |= ((mem_log - 1) & PIWAR_SZ_MASK); 310 piwar |= ((mem_log - 1) & PIWAR_SZ_MASK);
@@ -373,7 +377,9 @@ static void setup_pci_atmu(struct pci_controller *hose)
373 } 377 }
374 378
375 if (hose->dma_window_size < mem) { 379 if (hose->dma_window_size < mem) {
376#ifndef CONFIG_SWIOTLB 380#ifdef CONFIG_SWIOTLB
381 ppc_swiotlb_enable = 1;
382#else
377 pr_err("%s: ERROR: Memory size exceeds PCI ATMU ability to " 383 pr_err("%s: ERROR: Memory size exceeds PCI ATMU ability to "
378 "map - enable CONFIG_SWIOTLB to avoid dma errors.\n", 384 "map - enable CONFIG_SWIOTLB to avoid dma errors.\n",
379 name); 385 name);
@@ -868,6 +874,160 @@ u64 fsl_pci_immrbar_base(struct pci_controller *hose)
868 return 0; 874 return 0;
869} 875}
870 876
877#ifdef CONFIG_E500
878static int mcheck_handle_load(struct pt_regs *regs, u32 inst)
879{
880 unsigned int rd, ra, rb, d;
881
882 rd = get_rt(inst);
883 ra = get_ra(inst);
884 rb = get_rb(inst);
885 d = get_d(inst);
886
887 switch (get_op(inst)) {
888 case 31:
889 switch (get_xop(inst)) {
890 case OP_31_XOP_LWZX:
891 case OP_31_XOP_LWBRX:
892 regs->gpr[rd] = 0xffffffff;
893 break;
894
895 case OP_31_XOP_LWZUX:
896 regs->gpr[rd] = 0xffffffff;
897 regs->gpr[ra] += regs->gpr[rb];
898 break;
899
900 case OP_31_XOP_LBZX:
901 regs->gpr[rd] = 0xff;
902 break;
903
904 case OP_31_XOP_LBZUX:
905 regs->gpr[rd] = 0xff;
906 regs->gpr[ra] += regs->gpr[rb];
907 break;
908
909 case OP_31_XOP_LHZX:
910 case OP_31_XOP_LHBRX:
911 regs->gpr[rd] = 0xffff;
912 break;
913
914 case OP_31_XOP_LHZUX:
915 regs->gpr[rd] = 0xffff;
916 regs->gpr[ra] += regs->gpr[rb];
917 break;
918
919 case OP_31_XOP_LHAX:
920 regs->gpr[rd] = ~0UL;
921 break;
922
923 case OP_31_XOP_LHAUX:
924 regs->gpr[rd] = ~0UL;
925 regs->gpr[ra] += regs->gpr[rb];
926 break;
927
928 default:
929 return 0;
930 }
931 break;
932
933 case OP_LWZ:
934 regs->gpr[rd] = 0xffffffff;
935 break;
936
937 case OP_LWZU:
938 regs->gpr[rd] = 0xffffffff;
939 regs->gpr[ra] += (s16)d;
940 break;
941
942 case OP_LBZ:
943 regs->gpr[rd] = 0xff;
944 break;
945
946 case OP_LBZU:
947 regs->gpr[rd] = 0xff;
948 regs->gpr[ra] += (s16)d;
949 break;
950
951 case OP_LHZ:
952 regs->gpr[rd] = 0xffff;
953 break;
954
955 case OP_LHZU:
956 regs->gpr[rd] = 0xffff;
957 regs->gpr[ra] += (s16)d;
958 break;
959
960 case OP_LHA:
961 regs->gpr[rd] = ~0UL;
962 break;
963
964 case OP_LHAU:
965 regs->gpr[rd] = ~0UL;
966 regs->gpr[ra] += (s16)d;
967 break;
968
969 default:
970 return 0;
971 }
972
973 return 1;
974}
975
976static int is_in_pci_mem_space(phys_addr_t addr)
977{
978 struct pci_controller *hose;
979 struct resource *res;
980 int i;
981
982 list_for_each_entry(hose, &hose_list, list_node) {
983 if (!(hose->indirect_type & PPC_INDIRECT_TYPE_EXT_REG))
984 continue;
985
986 for (i = 0; i < 3; i++) {
987 res = &hose->mem_resources[i];
988 if ((res->flags & IORESOURCE_MEM) &&
989 addr >= res->start && addr <= res->end)
990 return 1;
991 }
992 }
993 return 0;
994}
995
996int fsl_pci_mcheck_exception(struct pt_regs *regs)
997{
998 u32 inst;
999 int ret;
1000 phys_addr_t addr = 0;
1001
1002 /* Let KVM/QEMU deal with the exception */
1003 if (regs->msr & MSR_GS)
1004 return 0;
1005
1006#ifdef CONFIG_PHYS_64BIT
1007 addr = mfspr(SPRN_MCARU);
1008 addr <<= 32;
1009#endif
1010 addr += mfspr(SPRN_MCAR);
1011
1012 if (is_in_pci_mem_space(addr)) {
1013 if (user_mode(regs)) {
1014 pagefault_disable();
1015 ret = get_user(regs->nip, &inst);
1016 pagefault_enable();
1017 } else {
1018 ret = probe_kernel_address(regs->nip, inst);
1019 }
1020
1021 if (mcheck_handle_load(regs, inst)) {
1022 regs->nip += 4;
1023 return 1;
1024 }
1025 }
1026
1027 return 0;
1028}
1029#endif
1030
871#if defined(CONFIG_FSL_SOC_BOOKE) || defined(CONFIG_PPC_86xx) 1031#if defined(CONFIG_FSL_SOC_BOOKE) || defined(CONFIG_PPC_86xx)
872static const struct of_device_id pci_ids[] = { 1032static const struct of_device_id pci_ids[] = {
873 { .compatible = "fsl,mpc8540-pci", }, 1033 { .compatible = "fsl,mpc8540-pci", },
@@ -928,28 +1088,10 @@ static int fsl_pci_probe(struct platform_device *pdev)
928{ 1088{
929 int ret; 1089 int ret;
930 struct device_node *node; 1090 struct device_node *node;
931#ifdef CONFIG_SWIOTLB
932 struct pci_controller *hose;
933#endif
934 1091
935 node = pdev->dev.of_node; 1092 node = pdev->dev.of_node;
936 ret = fsl_add_bridge(pdev, fsl_pci_primary == node); 1093 ret = fsl_add_bridge(pdev, fsl_pci_primary == node);
937 1094
938#ifdef CONFIG_SWIOTLB
939 if (ret == 0) {
940 hose = pci_find_hose_for_OF_device(pdev->dev.of_node);
941
942 /*
943 * if we couldn't map all of DRAM via the dma windows
944 * we need SWIOTLB to handle buffers located outside of
945 * dma capable memory region
946 */
947 if (memblock_end_of_DRAM() - 1 > hose->dma_window_base_cur +
948 hose->dma_window_size)
949 ppc_swiotlb_enable = 1;
950 }
951#endif
952
953 mpc85xx_pci_err_probe(pdev); 1095 mpc85xx_pci_err_probe(pdev);
954 1096
955 return 0; 1097 return 0;
diff --git a/arch/powerpc/sysdev/fsl_pci.h b/arch/powerpc/sysdev/fsl_pci.h
index 72b5625330e2..8d455df58471 100644
--- a/arch/powerpc/sysdev/fsl_pci.h
+++ b/arch/powerpc/sysdev/fsl_pci.h
@@ -16,6 +16,11 @@
16 16
17struct platform_device; 17struct platform_device;
18 18
19
20/* FSL PCI controller BRR1 register */
21#define PCI_FSL_BRR1 0xbf8
22#define PCI_FSL_BRR1_VER 0xffff
23
19#define PCIE_LTSSM 0x0404 /* PCIE Link Training and Status */ 24#define PCIE_LTSSM 0x0404 /* PCIE Link Training and Status */
20#define PCIE_LTSSM_L0 0x16 /* L0 state */ 25#define PCIE_LTSSM_L0 0x16 /* L0 state */
21#define PCIE_IP_REV_2_2 0x02080202 /* PCIE IP block version Rev2.2 */ 26#define PCIE_IP_REV_2_2 0x02080202 /* PCIE IP block version Rev2.2 */
@@ -126,5 +131,11 @@ static inline int mpc85xx_pci_err_probe(struct platform_device *op)
126} 131}
127#endif 132#endif
128 133
134#ifdef CONFIG_FSL_PCI
135extern int fsl_pci_mcheck_exception(struct pt_regs *);
136#else
137static inline int fsl_pci_mcheck_exception(struct pt_regs *regs) {return 0; }
138#endif
139
129#endif /* __POWERPC_FSL_PCI_H */ 140#endif /* __POWERPC_FSL_PCI_H */
130#endif /* __KERNEL__ */ 141#endif /* __KERNEL__ */
diff --git a/arch/powerpc/sysdev/rtc_cmos_setup.c b/arch/powerpc/sysdev/rtc_cmos_setup.c
index af79e1ea74b6..af0f9beddca9 100644
--- a/arch/powerpc/sysdev/rtc_cmos_setup.c
+++ b/arch/powerpc/sysdev/rtc_cmos_setup.c
@@ -62,7 +62,7 @@ static int __init add_rtc(void)
62 pd = platform_device_register_simple("rtc_cmos", -1, 62 pd = platform_device_register_simple("rtc_cmos", -1,
63 &res[0], num_res); 63 &res[0], num_res);
64 64
65 return PTR_RET(pd); 65 return PTR_ERR_OR_ZERO(pd);
66} 66}
67fs_initcall(add_rtc); 67fs_initcall(add_rtc);
68 68
diff --git a/arch/powerpc/sysdev/xics/icp-native.c b/arch/powerpc/sysdev/xics/icp-native.c
index 7cd728b3b5e4..9dee47071af8 100644
--- a/arch/powerpc/sysdev/xics/icp-native.c
+++ b/arch/powerpc/sysdev/xics/icp-native.c
@@ -216,7 +216,7 @@ static int __init icp_native_init_one_node(struct device_node *np,
216 unsigned int *indx) 216 unsigned int *indx)
217{ 217{
218 unsigned int ilen; 218 unsigned int ilen;
219 const u32 *ireg; 219 const __be32 *ireg;
220 int i; 220 int i;
221 int reg_tuple_size; 221 int reg_tuple_size;
222 int num_servers = 0; 222 int num_servers = 0;
diff --git a/arch/powerpc/sysdev/xics/xics-common.c b/arch/powerpc/sysdev/xics/xics-common.c
index 9049d9f44485..fe0cca477164 100644
--- a/arch/powerpc/sysdev/xics/xics-common.c
+++ b/arch/powerpc/sysdev/xics/xics-common.c
@@ -49,7 +49,7 @@ void xics_update_irq_servers(void)
49 int i, j; 49 int i, j;
50 struct device_node *np; 50 struct device_node *np;
51 u32 ilen; 51 u32 ilen;
52 const u32 *ireg; 52 const __be32 *ireg;
53 u32 hcpuid; 53 u32 hcpuid;
54 54
55 /* Find the server numbers for the boot cpu. */ 55 /* Find the server numbers for the boot cpu. */
@@ -75,8 +75,8 @@ void xics_update_irq_servers(void)
75 * default distribution server 75 * default distribution server
76 */ 76 */
77 for (j = 0; j < i; j += 2) { 77 for (j = 0; j < i; j += 2) {
78 if (ireg[j] == hcpuid) { 78 if (be32_to_cpu(ireg[j]) == hcpuid) {
79 xics_default_distrib_server = ireg[j+1]; 79 xics_default_distrib_server = be32_to_cpu(ireg[j+1]);
80 break; 80 break;
81 } 81 }
82 } 82 }
@@ -383,7 +383,7 @@ void __init xics_register_ics(struct ics *ics)
383static void __init xics_get_server_size(void) 383static void __init xics_get_server_size(void)
384{ 384{
385 struct device_node *np; 385 struct device_node *np;
386 const u32 *isize; 386 const __be32 *isize;
387 387
388 /* We fetch the interrupt server size from the first ICS node 388 /* We fetch the interrupt server size from the first ICS node
389 * we find if any 389 * we find if any
@@ -394,7 +394,7 @@ static void __init xics_get_server_size(void)
394 isize = of_get_property(np, "ibm,interrupt-server#-size", NULL); 394 isize = of_get_property(np, "ibm,interrupt-server#-size", NULL);
395 if (!isize) 395 if (!isize)
396 return; 396 return;
397 xics_interrupt_server_size = *isize; 397 xics_interrupt_server_size = be32_to_cpu(*isize);
398 of_node_put(np); 398 of_node_put(np);
399} 399}
400 400
diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
index 96bf5bd30fbc..af9d3469fb99 100644
--- a/arch/powerpc/xmon/xmon.c
+++ b/arch/powerpc/xmon/xmon.c
@@ -972,27 +972,27 @@ static void bootcmds(void)
972static int cpu_cmd(void) 972static int cpu_cmd(void)
973{ 973{
974#ifdef CONFIG_SMP 974#ifdef CONFIG_SMP
975 unsigned long cpu; 975 unsigned long cpu, first_cpu, last_cpu;
976 int timeout; 976 int timeout;
977 int count;
978 977
979 if (!scanhex(&cpu)) { 978 if (!scanhex(&cpu)) {
980 /* print cpus waiting or in xmon */ 979 /* print cpus waiting or in xmon */
981 printf("cpus stopped:"); 980 printf("cpus stopped:");
982 count = 0; 981 last_cpu = first_cpu = NR_CPUS;
983 for_each_possible_cpu(cpu) { 982 for_each_possible_cpu(cpu) {
984 if (cpumask_test_cpu(cpu, &cpus_in_xmon)) { 983 if (cpumask_test_cpu(cpu, &cpus_in_xmon)) {
985 if (count == 0) 984 if (cpu == last_cpu + 1) {
986 printf(" %x", cpu); 985 last_cpu = cpu;
987 ++count; 986 } else {
988 } else { 987 if (last_cpu != first_cpu)
989 if (count > 1) 988 printf("-%lx", last_cpu);
990 printf("-%x", cpu - 1); 989 last_cpu = first_cpu = cpu;
991 count = 0; 990 printf(" %lx", cpu);
991 }
992 } 992 }
993 } 993 }
994 if (count > 1) 994 if (last_cpu != first_cpu)
995 printf("-%x", NR_CPUS - 1); 995 printf("-%lx", last_cpu);
996 printf("\n"); 996 printf("\n");
997 return 0; 997 return 0;
998 } 998 }
@@ -1256,11 +1256,18 @@ const char *getvecname(unsigned long vec)
1256 case 0x700: ret = "(Program Check)"; break; 1256 case 0x700: ret = "(Program Check)"; break;
1257 case 0x800: ret = "(FPU Unavailable)"; break; 1257 case 0x800: ret = "(FPU Unavailable)"; break;
1258 case 0x900: ret = "(Decrementer)"; break; 1258 case 0x900: ret = "(Decrementer)"; break;
1259 case 0x980: ret = "(Hypervisor Decrementer)"; break;
1260 case 0xa00: ret = "(Doorbell)"; break;
1259 case 0xc00: ret = "(System Call)"; break; 1261 case 0xc00: ret = "(System Call)"; break;
1260 case 0xd00: ret = "(Single Step)"; break; 1262 case 0xd00: ret = "(Single Step)"; break;
1263 case 0xe40: ret = "(Emulation Assist)"; break;
1264 case 0xe60: ret = "(HMI)"; break;
1265 case 0xe80: ret = "(Hypervisor Doorbell)"; break;
1261 case 0xf00: ret = "(Performance Monitor)"; break; 1266 case 0xf00: ret = "(Performance Monitor)"; break;
1262 case 0xf20: ret = "(Altivec Unavailable)"; break; 1267 case 0xf20: ret = "(Altivec Unavailable)"; break;
1263 case 0x1300: ret = "(Instruction Breakpoint)"; break; 1268 case 0x1300: ret = "(Instruction Breakpoint)"; break;
1269 case 0x1500: ret = "(Denormalisation)"; break;
1270 case 0x1700: ret = "(Altivec Assist)"; break;
1264 default: ret = ""; 1271 default: ret = "";
1265 } 1272 }
1266 return ret; 1273 return ret;
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig
index 8a4cae78f03c..dcc6ac2d8026 100644
--- a/arch/s390/Kconfig
+++ b/arch/s390/Kconfig
@@ -62,6 +62,7 @@ config S390
62 def_bool y 62 def_bool y
63 select ARCH_DISCARD_MEMBLOCK 63 select ARCH_DISCARD_MEMBLOCK
64 select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE 64 select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
65 select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
65 select ARCH_HAVE_NMI_SAFE_CMPXCHG 66 select ARCH_HAVE_NMI_SAFE_CMPXCHG
66 select ARCH_INLINE_READ_LOCK 67 select ARCH_INLINE_READ_LOCK
67 select ARCH_INLINE_READ_LOCK_BH 68 select ARCH_INLINE_READ_LOCK_BH
@@ -91,7 +92,6 @@ config S390
91 select ARCH_INLINE_WRITE_UNLOCK_BH 92 select ARCH_INLINE_WRITE_UNLOCK_BH
92 select ARCH_INLINE_WRITE_UNLOCK_IRQ 93 select ARCH_INLINE_WRITE_UNLOCK_IRQ
93 select ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE 94 select ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE
94 select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
95 select ARCH_SAVE_PAGE_KEYS if HIBERNATION 95 select ARCH_SAVE_PAGE_KEYS if HIBERNATION
96 select ARCH_WANT_IPC_PARSE_VERSION 96 select ARCH_WANT_IPC_PARSE_VERSION
97 select BUILDTIME_EXTABLE_SORT 97 select BUILDTIME_EXTABLE_SORT
@@ -134,15 +134,15 @@ config S390
134 select HAVE_SYSCALL_TRACEPOINTS 134 select HAVE_SYSCALL_TRACEPOINTS
135 select HAVE_UID16 if 32BIT 135 select HAVE_UID16 if 32BIT
136 select HAVE_VIRT_CPU_ACCOUNTING 136 select HAVE_VIRT_CPU_ACCOUNTING
137 select VIRT_TO_BUS
138 select INIT_ALL_POSSIBLE 137 select INIT_ALL_POSSIBLE
139 select KTIME_SCALAR if 32BIT 138 select KTIME_SCALAR if 32BIT
140 select MODULES_USE_ELF_RELA 139 select MODULES_USE_ELF_RELA
141 select OLD_SIGSUSPEND3
142 select OLD_SIGACTION 140 select OLD_SIGACTION
141 select OLD_SIGSUSPEND3
143 select SYSCTL_EXCEPTION_TRACE 142 select SYSCTL_EXCEPTION_TRACE
144 select USE_GENERIC_SMP_HELPERS if SMP 143 select USE_GENERIC_SMP_HELPERS if SMP
145 select VIRT_CPU_ACCOUNTING 144 select VIRT_CPU_ACCOUNTING
145 select VIRT_TO_BUS
146 146
147config SCHED_OMIT_FRAME_POINTER 147config SCHED_OMIT_FRAME_POINTER
148 def_bool y 148 def_bool y
@@ -430,7 +430,6 @@ menuconfig PCI
430 bool "PCI support" 430 bool "PCI support"
431 default n 431 default n
432 depends on 64BIT 432 depends on 64BIT
433 select ARCH_SUPPORTS_MSI
434 select PCI_MSI 433 select PCI_MSI
435 help 434 help
436 Enable PCI support. 435 Enable PCI support.
@@ -445,6 +444,16 @@ config PCI_NR_FUNCTIONS
445 This allows you to specify the maximum number of PCI functions which 444 This allows you to specify the maximum number of PCI functions which
446 this kernel will support. 445 this kernel will support.
447 446
447config PCI_NR_MSI
448 int "Maximum number of MSI interrupts (64-32768)"
449 range 64 32768
450 default "256"
451 help
452 This defines the number of virtual interrupts the kernel will
453 provide for MSI interrupts. If you configure your system to have
454 too few drivers will fail to allocate MSI interrupts for all
455 PCI devices.
456
448source "drivers/pci/Kconfig" 457source "drivers/pci/Kconfig"
449source "drivers/pci/pcie/Kconfig" 458source "drivers/pci/pcie/Kconfig"
450source "drivers/pci/hotplug/Kconfig" 459source "drivers/pci/hotplug/Kconfig"
@@ -516,6 +525,7 @@ config CRASH_DUMP
516 bool "kernel crash dumps" 525 bool "kernel crash dumps"
517 depends on 64BIT && SMP 526 depends on 64BIT && SMP
518 select KEXEC 527 select KEXEC
528 select ZFCPDUMP
519 help 529 help
520 Generate crash dump after being started by kexec. 530 Generate crash dump after being started by kexec.
521 Crash dump kernels are loaded in the main kernel with kexec-tools 531 Crash dump kernels are loaded in the main kernel with kexec-tools
@@ -526,7 +536,7 @@ config CRASH_DUMP
526config ZFCPDUMP 536config ZFCPDUMP
527 def_bool n 537 def_bool n
528 prompt "zfcpdump support" 538 prompt "zfcpdump support"
529 select SMP 539 depends on SMP
530 help 540 help
531 Select this option if you want to build an zfcpdump enabled kernel. 541 Select this option if you want to build an zfcpdump enabled kernel.
532 Refer to <file:Documentation/s390/zfcpdump.txt> for more details on this. 542 Refer to <file:Documentation/s390/zfcpdump.txt> for more details on this.
diff --git a/arch/s390/defconfig b/arch/s390/defconfig
index b74400e3e035..d204c65bf722 100644
--- a/arch/s390/defconfig
+++ b/arch/s390/defconfig
@@ -1,14 +1,13 @@
1CONFIG_EXPERIMENTAL=y
2CONFIG_SYSVIPC=y 1CONFIG_SYSVIPC=y
3CONFIG_POSIX_MQUEUE=y 2CONFIG_POSIX_MQUEUE=y
4CONFIG_FHANDLE=y 3CONFIG_FHANDLE=y
4CONFIG_AUDIT=y
5CONFIG_NO_HZ=y
6CONFIG_HIGH_RES_TIMERS=y
5CONFIG_TASKSTATS=y 7CONFIG_TASKSTATS=y
6CONFIG_TASK_DELAY_ACCT=y 8CONFIG_TASK_DELAY_ACCT=y
7CONFIG_TASK_XACCT=y 9CONFIG_TASK_XACCT=y
8CONFIG_TASK_IO_ACCOUNTING=y 10CONFIG_TASK_IO_ACCOUNTING=y
9CONFIG_AUDIT=y
10CONFIG_NO_HZ=y
11CONFIG_HIGH_RES_TIMERS=y
12CONFIG_RCU_FAST_NO_HZ=y 11CONFIG_RCU_FAST_NO_HZ=y
13CONFIG_IKCONFIG=y 12CONFIG_IKCONFIG=y
14CONFIG_IKCONFIG_PROC=y 13CONFIG_IKCONFIG_PROC=y
@@ -27,6 +26,7 @@ CONFIG_RD_BZIP2=y
27CONFIG_RD_LZMA=y 26CONFIG_RD_LZMA=y
28CONFIG_RD_XZ=y 27CONFIG_RD_XZ=y
29CONFIG_RD_LZO=y 28CONFIG_RD_LZO=y
29CONFIG_RD_LZ4=y
30CONFIG_EXPERT=y 30CONFIG_EXPERT=y
31# CONFIG_COMPAT_BRK is not set 31# CONFIG_COMPAT_BRK is not set
32CONFIG_PROFILING=y 32CONFIG_PROFILING=y
@@ -38,11 +38,13 @@ CONFIG_MODULE_UNLOAD=y
38CONFIG_MODVERSIONS=y 38CONFIG_MODVERSIONS=y
39CONFIG_PARTITION_ADVANCED=y 39CONFIG_PARTITION_ADVANCED=y
40CONFIG_IBM_PARTITION=y 40CONFIG_IBM_PARTITION=y
41# CONFIG_EFI_PARTITION is not set
41CONFIG_DEFAULT_DEADLINE=y 42CONFIG_DEFAULT_DEADLINE=y
42CONFIG_HZ_100=y 43CONFIG_HZ_100=y
43CONFIG_MEMORY_HOTPLUG=y 44CONFIG_MEMORY_HOTPLUG=y
44CONFIG_MEMORY_HOTREMOVE=y 45CONFIG_MEMORY_HOTREMOVE=y
45CONFIG_KSM=y 46CONFIG_KSM=y
47CONFIG_TRANSPARENT_HUGEPAGE=y
46CONFIG_CRASH_DUMP=y 48CONFIG_CRASH_DUMP=y
47CONFIG_BINFMT_MISC=m 49CONFIG_BINFMT_MISC=m
48CONFIG_HIBERNATION=y 50CONFIG_HIBERNATION=y
@@ -92,40 +94,49 @@ CONFIG_SCSI_CONSTANTS=y
92CONFIG_SCSI_LOGGING=y 94CONFIG_SCSI_LOGGING=y
93CONFIG_SCSI_SCAN_ASYNC=y 95CONFIG_SCSI_SCAN_ASYNC=y
94CONFIG_ZFCP=y 96CONFIG_ZFCP=y
97CONFIG_SCSI_VIRTIO=y
95CONFIG_NETDEVICES=y 98CONFIG_NETDEVICES=y
96CONFIG_BONDING=m 99CONFIG_BONDING=m
97CONFIG_DUMMY=m 100CONFIG_DUMMY=m
98CONFIG_EQUALIZER=m 101CONFIG_EQUALIZER=m
99CONFIG_TUN=m 102CONFIG_TUN=m
100CONFIG_VIRTIO_NET=y 103CONFIG_VIRTIO_NET=y
104# CONFIG_INPUT is not set
105# CONFIG_SERIO is not set
101CONFIG_RAW_DRIVER=m 106CONFIG_RAW_DRIVER=m
102CONFIG_VIRTIO_BALLOON=y 107CONFIG_VIRTIO_BALLOON=y
103CONFIG_EXT2_FS=y
104CONFIG_EXT3_FS=y
105# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
106CONFIG_EXT4_FS=y 108CONFIG_EXT4_FS=y
107CONFIG_EXT4_FS_POSIX_ACL=y 109CONFIG_EXT4_FS_POSIX_ACL=y
108CONFIG_EXT4_FS_SECURITY=y 110CONFIG_EXT4_FS_SECURITY=y
111CONFIG_XFS_FS=y
112CONFIG_XFS_QUOTA=y
113CONFIG_XFS_POSIX_ACL=y
114CONFIG_XFS_RT=y
115CONFIG_BTRFS_FS=y
116CONFIG_BTRFS_FS_POSIX_ACL=y
117CONFIG_FANOTIFY=y
118CONFIG_FUSE_FS=y
109CONFIG_PROC_KCORE=y 119CONFIG_PROC_KCORE=y
110CONFIG_TMPFS=y 120CONFIG_TMPFS=y
111CONFIG_TMPFS_POSIX_ACL=y 121CONFIG_TMPFS_POSIX_ACL=y
122CONFIG_HUGETLBFS=y
112# CONFIG_NETWORK_FILESYSTEMS is not set 123# CONFIG_NETWORK_FILESYSTEMS is not set
124CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y
113CONFIG_MAGIC_SYSRQ=y 125CONFIG_MAGIC_SYSRQ=y
126CONFIG_DEBUG_PAGEALLOC=y
114CONFIG_TIMER_STATS=y 127CONFIG_TIMER_STATS=y
115CONFIG_PROVE_LOCKING=y 128CONFIG_PROVE_LOCKING=y
116CONFIG_PROVE_RCU=y
117CONFIG_LOCK_STAT=y 129CONFIG_LOCK_STAT=y
118CONFIG_DEBUG_LOCKDEP=y 130CONFIG_DEBUG_LOCKDEP=y
119CONFIG_DEBUG_LIST=y 131CONFIG_DEBUG_LIST=y
120CONFIG_DEBUG_NOTIFIERS=y 132CONFIG_DEBUG_NOTIFIERS=y
133CONFIG_PROVE_RCU=y
134CONFIG_RCU_CPU_STALL_TIMEOUT=60
121CONFIG_RCU_TRACE=y 135CONFIG_RCU_TRACE=y
122CONFIG_KPROBES_SANITY_TEST=y
123CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y
124CONFIG_LATENCYTOP=y 136CONFIG_LATENCYTOP=y
125CONFIG_DEBUG_PAGEALLOC=y
126CONFIG_BLK_DEV_IO_TRACE=y 137CONFIG_BLK_DEV_IO_TRACE=y
138CONFIG_KPROBES_SANITY_TEST=y
127# CONFIG_STRICT_DEVMEM is not set 139# CONFIG_STRICT_DEVMEM is not set
128CONFIG_CRYPTO_NULL=m
129CONFIG_CRYPTO_CRYPTD=m 140CONFIG_CRYPTO_CRYPTD=m
130CONFIG_CRYPTO_AUTHENC=m 141CONFIG_CRYPTO_AUTHENC=m
131CONFIG_CRYPTO_TEST=m 142CONFIG_CRYPTO_TEST=m
@@ -137,8 +148,10 @@ CONFIG_CRYPTO_ECB=m
137CONFIG_CRYPTO_LRW=m 148CONFIG_CRYPTO_LRW=m
138CONFIG_CRYPTO_PCBC=m 149CONFIG_CRYPTO_PCBC=m
139CONFIG_CRYPTO_XTS=m 150CONFIG_CRYPTO_XTS=m
151CONFIG_CRYPTO_CMAC=m
140CONFIG_CRYPTO_XCBC=m 152CONFIG_CRYPTO_XCBC=m
141CONFIG_CRYPTO_VMAC=m 153CONFIG_CRYPTO_VMAC=m
154CONFIG_CRYPTO_CRC32=m
142CONFIG_CRYPTO_MD4=m 155CONFIG_CRYPTO_MD4=m
143CONFIG_CRYPTO_MICHAEL_MIC=m 156CONFIG_CRYPTO_MICHAEL_MIC=m
144CONFIG_CRYPTO_RMD128=m 157CONFIG_CRYPTO_RMD128=m
@@ -165,6 +178,8 @@ CONFIG_CRYPTO_TWOFISH=m
165CONFIG_CRYPTO_DEFLATE=m 178CONFIG_CRYPTO_DEFLATE=m
166CONFIG_CRYPTO_ZLIB=m 179CONFIG_CRYPTO_ZLIB=m
167CONFIG_CRYPTO_LZO=m 180CONFIG_CRYPTO_LZO=m
181CONFIG_CRYPTO_LZ4=m
182CONFIG_CRYPTO_LZ4HC=m
168CONFIG_ZCRYPT=m 183CONFIG_ZCRYPT=m
169CONFIG_CRYPTO_SHA1_S390=m 184CONFIG_CRYPTO_SHA1_S390=m
170CONFIG_CRYPTO_SHA256_S390=m 185CONFIG_CRYPTO_SHA256_S390=m
diff --git a/arch/s390/hypfs/hypfs.h b/arch/s390/hypfs/hypfs.h
index f41e0ef7fdf9..79f2ac55253f 100644
--- a/arch/s390/hypfs/hypfs.h
+++ b/arch/s390/hypfs/hypfs.h
@@ -18,26 +18,23 @@
18#define UPDATE_FILE_MODE 0220 18#define UPDATE_FILE_MODE 0220
19#define DIR_MODE 0550 19#define DIR_MODE 0550
20 20
21extern struct dentry *hypfs_mkdir(struct super_block *sb, struct dentry *parent, 21extern struct dentry *hypfs_mkdir(struct dentry *parent, const char *name);
22 const char *name);
23 22
24extern struct dentry *hypfs_create_u64(struct super_block *sb, 23extern struct dentry *hypfs_create_u64(struct dentry *dir, const char *name,
25 struct dentry *dir, const char *name,
26 __u64 value); 24 __u64 value);
27 25
28extern struct dentry *hypfs_create_str(struct super_block *sb, 26extern struct dentry *hypfs_create_str(struct dentry *dir, const char *name,
29 struct dentry *dir, const char *name,
30 char *string); 27 char *string);
31 28
32/* LPAR Hypervisor */ 29/* LPAR Hypervisor */
33extern int hypfs_diag_init(void); 30extern int hypfs_diag_init(void);
34extern void hypfs_diag_exit(void); 31extern void hypfs_diag_exit(void);
35extern int hypfs_diag_create_files(struct super_block *sb, struct dentry *root); 32extern int hypfs_diag_create_files(struct dentry *root);
36 33
37/* VM Hypervisor */ 34/* VM Hypervisor */
38extern int hypfs_vm_init(void); 35extern int hypfs_vm_init(void);
39extern void hypfs_vm_exit(void); 36extern void hypfs_vm_exit(void);
40extern int hypfs_vm_create_files(struct super_block *sb, struct dentry *root); 37extern int hypfs_vm_create_files(struct dentry *root);
41 38
42/* debugfs interface */ 39/* debugfs interface */
43struct hypfs_dbfs_file; 40struct hypfs_dbfs_file;
diff --git a/arch/s390/hypfs/hypfs_dbfs.c b/arch/s390/hypfs/hypfs_dbfs.c
index bb5dd496614f..17ab8b7b53cc 100644
--- a/arch/s390/hypfs/hypfs_dbfs.c
+++ b/arch/s390/hypfs/hypfs_dbfs.c
@@ -105,7 +105,7 @@ void hypfs_dbfs_remove_file(struct hypfs_dbfs_file *df)
105int hypfs_dbfs_init(void) 105int hypfs_dbfs_init(void)
106{ 106{
107 dbfs_dir = debugfs_create_dir("s390_hypfs", NULL); 107 dbfs_dir = debugfs_create_dir("s390_hypfs", NULL);
108 return PTR_RET(dbfs_dir); 108 return PTR_ERR_OR_ZERO(dbfs_dir);
109} 109}
110 110
111void hypfs_dbfs_exit(void) 111void hypfs_dbfs_exit(void)
diff --git a/arch/s390/hypfs/hypfs_diag.c b/arch/s390/hypfs/hypfs_diag.c
index 138893e5f736..5eeffeefae06 100644
--- a/arch/s390/hypfs/hypfs_diag.c
+++ b/arch/s390/hypfs/hypfs_diag.c
@@ -623,8 +623,7 @@ void hypfs_diag_exit(void)
623 * ******************************************* 623 * *******************************************
624 */ 624 */
625 625
626static int hypfs_create_cpu_files(struct super_block *sb, 626static int hypfs_create_cpu_files(struct dentry *cpus_dir, void *cpu_info)
627 struct dentry *cpus_dir, void *cpu_info)
628{ 627{
629 struct dentry *cpu_dir; 628 struct dentry *cpu_dir;
630 char buffer[TMP_SIZE]; 629 char buffer[TMP_SIZE];
@@ -632,30 +631,29 @@ static int hypfs_create_cpu_files(struct super_block *sb,
632 631
633 snprintf(buffer, TMP_SIZE, "%d", cpu_info__cpu_addr(diag204_info_type, 632 snprintf(buffer, TMP_SIZE, "%d", cpu_info__cpu_addr(diag204_info_type,
634 cpu_info)); 633 cpu_info));
635 cpu_dir = hypfs_mkdir(sb, cpus_dir, buffer); 634 cpu_dir = hypfs_mkdir(cpus_dir, buffer);
636 rc = hypfs_create_u64(sb, cpu_dir, "mgmtime", 635 rc = hypfs_create_u64(cpu_dir, "mgmtime",
637 cpu_info__acc_time(diag204_info_type, cpu_info) - 636 cpu_info__acc_time(diag204_info_type, cpu_info) -
638 cpu_info__lp_time(diag204_info_type, cpu_info)); 637 cpu_info__lp_time(diag204_info_type, cpu_info));
639 if (IS_ERR(rc)) 638 if (IS_ERR(rc))
640 return PTR_ERR(rc); 639 return PTR_ERR(rc);
641 rc = hypfs_create_u64(sb, cpu_dir, "cputime", 640 rc = hypfs_create_u64(cpu_dir, "cputime",
642 cpu_info__lp_time(diag204_info_type, cpu_info)); 641 cpu_info__lp_time(diag204_info_type, cpu_info));
643 if (IS_ERR(rc)) 642 if (IS_ERR(rc))
644 return PTR_ERR(rc); 643 return PTR_ERR(rc);
645 if (diag204_info_type == INFO_EXT) { 644 if (diag204_info_type == INFO_EXT) {
646 rc = hypfs_create_u64(sb, cpu_dir, "onlinetime", 645 rc = hypfs_create_u64(cpu_dir, "onlinetime",
647 cpu_info__online_time(diag204_info_type, 646 cpu_info__online_time(diag204_info_type,
648 cpu_info)); 647 cpu_info));
649 if (IS_ERR(rc)) 648 if (IS_ERR(rc))
650 return PTR_ERR(rc); 649 return PTR_ERR(rc);
651 } 650 }
652 diag224_idx2name(cpu_info__ctidx(diag204_info_type, cpu_info), buffer); 651 diag224_idx2name(cpu_info__ctidx(diag204_info_type, cpu_info), buffer);
653 rc = hypfs_create_str(sb, cpu_dir, "type", buffer); 652 rc = hypfs_create_str(cpu_dir, "type", buffer);
654 return PTR_RET(rc); 653 return PTR_RET(rc);
655} 654}
656 655
657static void *hypfs_create_lpar_files(struct super_block *sb, 656static void *hypfs_create_lpar_files(struct dentry *systems_dir, void *part_hdr)
658 struct dentry *systems_dir, void *part_hdr)
659{ 657{
660 struct dentry *cpus_dir; 658 struct dentry *cpus_dir;
661 struct dentry *lpar_dir; 659 struct dentry *lpar_dir;
@@ -665,16 +663,16 @@ static void *hypfs_create_lpar_files(struct super_block *sb,
665 663
666 part_hdr__part_name(diag204_info_type, part_hdr, lpar_name); 664 part_hdr__part_name(diag204_info_type, part_hdr, lpar_name);
667 lpar_name[LPAR_NAME_LEN] = 0; 665 lpar_name[LPAR_NAME_LEN] = 0;
668 lpar_dir = hypfs_mkdir(sb, systems_dir, lpar_name); 666 lpar_dir = hypfs_mkdir(systems_dir, lpar_name);
669 if (IS_ERR(lpar_dir)) 667 if (IS_ERR(lpar_dir))
670 return lpar_dir; 668 return lpar_dir;
671 cpus_dir = hypfs_mkdir(sb, lpar_dir, "cpus"); 669 cpus_dir = hypfs_mkdir(lpar_dir, "cpus");
672 if (IS_ERR(cpus_dir)) 670 if (IS_ERR(cpus_dir))
673 return cpus_dir; 671 return cpus_dir;
674 cpu_info = part_hdr + part_hdr__size(diag204_info_type); 672 cpu_info = part_hdr + part_hdr__size(diag204_info_type);
675 for (i = 0; i < part_hdr__rcpus(diag204_info_type, part_hdr); i++) { 673 for (i = 0; i < part_hdr__rcpus(diag204_info_type, part_hdr); i++) {
676 int rc; 674 int rc;
677 rc = hypfs_create_cpu_files(sb, cpus_dir, cpu_info); 675 rc = hypfs_create_cpu_files(cpus_dir, cpu_info);
678 if (rc) 676 if (rc)
679 return ERR_PTR(rc); 677 return ERR_PTR(rc);
680 cpu_info += cpu_info__size(diag204_info_type); 678 cpu_info += cpu_info__size(diag204_info_type);
@@ -682,8 +680,7 @@ static void *hypfs_create_lpar_files(struct super_block *sb,
682 return cpu_info; 680 return cpu_info;
683} 681}
684 682
685static int hypfs_create_phys_cpu_files(struct super_block *sb, 683static int hypfs_create_phys_cpu_files(struct dentry *cpus_dir, void *cpu_info)
686 struct dentry *cpus_dir, void *cpu_info)
687{ 684{
688 struct dentry *cpu_dir; 685 struct dentry *cpu_dir;
689 char buffer[TMP_SIZE]; 686 char buffer[TMP_SIZE];
@@ -691,32 +688,31 @@ static int hypfs_create_phys_cpu_files(struct super_block *sb,
691 688
692 snprintf(buffer, TMP_SIZE, "%i", phys_cpu__cpu_addr(diag204_info_type, 689 snprintf(buffer, TMP_SIZE, "%i", phys_cpu__cpu_addr(diag204_info_type,
693 cpu_info)); 690 cpu_info));
694 cpu_dir = hypfs_mkdir(sb, cpus_dir, buffer); 691 cpu_dir = hypfs_mkdir(cpus_dir, buffer);
695 if (IS_ERR(cpu_dir)) 692 if (IS_ERR(cpu_dir))
696 return PTR_ERR(cpu_dir); 693 return PTR_ERR(cpu_dir);
697 rc = hypfs_create_u64(sb, cpu_dir, "mgmtime", 694 rc = hypfs_create_u64(cpu_dir, "mgmtime",
698 phys_cpu__mgm_time(diag204_info_type, cpu_info)); 695 phys_cpu__mgm_time(diag204_info_type, cpu_info));
699 if (IS_ERR(rc)) 696 if (IS_ERR(rc))
700 return PTR_ERR(rc); 697 return PTR_ERR(rc);
701 diag224_idx2name(phys_cpu__ctidx(diag204_info_type, cpu_info), buffer); 698 diag224_idx2name(phys_cpu__ctidx(diag204_info_type, cpu_info), buffer);
702 rc = hypfs_create_str(sb, cpu_dir, "type", buffer); 699 rc = hypfs_create_str(cpu_dir, "type", buffer);
703 return PTR_RET(rc); 700 return PTR_RET(rc);
704} 701}
705 702
706static void *hypfs_create_phys_files(struct super_block *sb, 703static void *hypfs_create_phys_files(struct dentry *parent_dir, void *phys_hdr)
707 struct dentry *parent_dir, void *phys_hdr)
708{ 704{
709 int i; 705 int i;
710 void *cpu_info; 706 void *cpu_info;
711 struct dentry *cpus_dir; 707 struct dentry *cpus_dir;
712 708
713 cpus_dir = hypfs_mkdir(sb, parent_dir, "cpus"); 709 cpus_dir = hypfs_mkdir(parent_dir, "cpus");
714 if (IS_ERR(cpus_dir)) 710 if (IS_ERR(cpus_dir))
715 return cpus_dir; 711 return cpus_dir;
716 cpu_info = phys_hdr + phys_hdr__size(diag204_info_type); 712 cpu_info = phys_hdr + phys_hdr__size(diag204_info_type);
717 for (i = 0; i < phys_hdr__cpus(diag204_info_type, phys_hdr); i++) { 713 for (i = 0; i < phys_hdr__cpus(diag204_info_type, phys_hdr); i++) {
718 int rc; 714 int rc;
719 rc = hypfs_create_phys_cpu_files(sb, cpus_dir, cpu_info); 715 rc = hypfs_create_phys_cpu_files(cpus_dir, cpu_info);
720 if (rc) 716 if (rc)
721 return ERR_PTR(rc); 717 return ERR_PTR(rc);
722 cpu_info += phys_cpu__size(diag204_info_type); 718 cpu_info += phys_cpu__size(diag204_info_type);
@@ -724,7 +720,7 @@ static void *hypfs_create_phys_files(struct super_block *sb,
724 return cpu_info; 720 return cpu_info;
725} 721}
726 722
727int hypfs_diag_create_files(struct super_block *sb, struct dentry *root) 723int hypfs_diag_create_files(struct dentry *root)
728{ 724{
729 struct dentry *systems_dir, *hyp_dir; 725 struct dentry *systems_dir, *hyp_dir;
730 void *time_hdr, *part_hdr; 726 void *time_hdr, *part_hdr;
@@ -735,7 +731,7 @@ int hypfs_diag_create_files(struct super_block *sb, struct dentry *root)
735 if (IS_ERR(buffer)) 731 if (IS_ERR(buffer))
736 return PTR_ERR(buffer); 732 return PTR_ERR(buffer);
737 733
738 systems_dir = hypfs_mkdir(sb, root, "systems"); 734 systems_dir = hypfs_mkdir(root, "systems");
739 if (IS_ERR(systems_dir)) { 735 if (IS_ERR(systems_dir)) {
740 rc = PTR_ERR(systems_dir); 736 rc = PTR_ERR(systems_dir);
741 goto err_out; 737 goto err_out;
@@ -743,25 +739,25 @@ int hypfs_diag_create_files(struct super_block *sb, struct dentry *root)
743 time_hdr = (struct x_info_blk_hdr *)buffer; 739 time_hdr = (struct x_info_blk_hdr *)buffer;
744 part_hdr = time_hdr + info_blk_hdr__size(diag204_info_type); 740 part_hdr = time_hdr + info_blk_hdr__size(diag204_info_type);
745 for (i = 0; i < info_blk_hdr__npar(diag204_info_type, time_hdr); i++) { 741 for (i = 0; i < info_blk_hdr__npar(diag204_info_type, time_hdr); i++) {
746 part_hdr = hypfs_create_lpar_files(sb, systems_dir, part_hdr); 742 part_hdr = hypfs_create_lpar_files(systems_dir, part_hdr);
747 if (IS_ERR(part_hdr)) { 743 if (IS_ERR(part_hdr)) {
748 rc = PTR_ERR(part_hdr); 744 rc = PTR_ERR(part_hdr);
749 goto err_out; 745 goto err_out;
750 } 746 }
751 } 747 }
752 if (info_blk_hdr__flags(diag204_info_type, time_hdr) & LPAR_PHYS_FLG) { 748 if (info_blk_hdr__flags(diag204_info_type, time_hdr) & LPAR_PHYS_FLG) {
753 ptr = hypfs_create_phys_files(sb, root, part_hdr); 749 ptr = hypfs_create_phys_files(root, part_hdr);
754 if (IS_ERR(ptr)) { 750 if (IS_ERR(ptr)) {
755 rc = PTR_ERR(ptr); 751 rc = PTR_ERR(ptr);
756 goto err_out; 752 goto err_out;
757 } 753 }
758 } 754 }
759 hyp_dir = hypfs_mkdir(sb, root, "hyp"); 755 hyp_dir = hypfs_mkdir(root, "hyp");
760 if (IS_ERR(hyp_dir)) { 756 if (IS_ERR(hyp_dir)) {
761 rc = PTR_ERR(hyp_dir); 757 rc = PTR_ERR(hyp_dir);
762 goto err_out; 758 goto err_out;
763 } 759 }
764 ptr = hypfs_create_str(sb, hyp_dir, "type", "LPAR Hypervisor"); 760 ptr = hypfs_create_str(hyp_dir, "type", "LPAR Hypervisor");
765 if (IS_ERR(ptr)) { 761 if (IS_ERR(ptr)) {
766 rc = PTR_ERR(ptr); 762 rc = PTR_ERR(ptr);
767 goto err_out; 763 goto err_out;
diff --git a/arch/s390/hypfs/hypfs_vm.c b/arch/s390/hypfs/hypfs_vm.c
index f364dcf77e8e..24908ce149f1 100644
--- a/arch/s390/hypfs/hypfs_vm.c
+++ b/arch/s390/hypfs/hypfs_vm.c
@@ -107,16 +107,15 @@ static void diag2fc_free(const void *data)
107 vfree(data); 107 vfree(data);
108} 108}
109 109
110#define ATTRIBUTE(sb, dir, name, member) \ 110#define ATTRIBUTE(dir, name, member) \
111do { \ 111do { \
112 void *rc; \ 112 void *rc; \
113 rc = hypfs_create_u64(sb, dir, name, member); \ 113 rc = hypfs_create_u64(dir, name, member); \
114 if (IS_ERR(rc)) \ 114 if (IS_ERR(rc)) \
115 return PTR_ERR(rc); \ 115 return PTR_ERR(rc); \
116} while(0) 116} while(0)
117 117
118static int hpyfs_vm_create_guest(struct super_block *sb, 118static int hpyfs_vm_create_guest(struct dentry *systems_dir,
119 struct dentry *systems_dir,
120 struct diag2fc_data *data) 119 struct diag2fc_data *data)
121{ 120{
122 char guest_name[NAME_LEN + 1] = {}; 121 char guest_name[NAME_LEN + 1] = {};
@@ -130,46 +129,46 @@ static int hpyfs_vm_create_guest(struct super_block *sb,
130 memcpy(guest_name, data->guest_name, NAME_LEN); 129 memcpy(guest_name, data->guest_name, NAME_LEN);
131 EBCASC(guest_name, NAME_LEN); 130 EBCASC(guest_name, NAME_LEN);
132 strim(guest_name); 131 strim(guest_name);
133 guest_dir = hypfs_mkdir(sb, systems_dir, guest_name); 132 guest_dir = hypfs_mkdir(systems_dir, guest_name);
134 if (IS_ERR(guest_dir)) 133 if (IS_ERR(guest_dir))
135 return PTR_ERR(guest_dir); 134 return PTR_ERR(guest_dir);
136 ATTRIBUTE(sb, guest_dir, "onlinetime_us", data->el_time); 135 ATTRIBUTE(guest_dir, "onlinetime_us", data->el_time);
137 136
138 /* logical cpu information */ 137 /* logical cpu information */
139 cpus_dir = hypfs_mkdir(sb, guest_dir, "cpus"); 138 cpus_dir = hypfs_mkdir(guest_dir, "cpus");
140 if (IS_ERR(cpus_dir)) 139 if (IS_ERR(cpus_dir))
141 return PTR_ERR(cpus_dir); 140 return PTR_ERR(cpus_dir);
142 ATTRIBUTE(sb, cpus_dir, "cputime_us", data->used_cpu); 141 ATTRIBUTE(cpus_dir, "cputime_us", data->used_cpu);
143 ATTRIBUTE(sb, cpus_dir, "capped", capped_value); 142 ATTRIBUTE(cpus_dir, "capped", capped_value);
144 ATTRIBUTE(sb, cpus_dir, "dedicated", dedicated_flag); 143 ATTRIBUTE(cpus_dir, "dedicated", dedicated_flag);
145 ATTRIBUTE(sb, cpus_dir, "count", data->vcpus); 144 ATTRIBUTE(cpus_dir, "count", data->vcpus);
146 ATTRIBUTE(sb, cpus_dir, "weight_min", data->cpu_min); 145 ATTRIBUTE(cpus_dir, "weight_min", data->cpu_min);
147 ATTRIBUTE(sb, cpus_dir, "weight_max", data->cpu_max); 146 ATTRIBUTE(cpus_dir, "weight_max", data->cpu_max);
148 ATTRIBUTE(sb, cpus_dir, "weight_cur", data->cpu_shares); 147 ATTRIBUTE(cpus_dir, "weight_cur", data->cpu_shares);
149 148
150 /* memory information */ 149 /* memory information */
151 mem_dir = hypfs_mkdir(sb, guest_dir, "mem"); 150 mem_dir = hypfs_mkdir(guest_dir, "mem");
152 if (IS_ERR(mem_dir)) 151 if (IS_ERR(mem_dir))
153 return PTR_ERR(mem_dir); 152 return PTR_ERR(mem_dir);
154 ATTRIBUTE(sb, mem_dir, "min_KiB", data->mem_min_kb); 153 ATTRIBUTE(mem_dir, "min_KiB", data->mem_min_kb);
155 ATTRIBUTE(sb, mem_dir, "max_KiB", data->mem_max_kb); 154 ATTRIBUTE(mem_dir, "max_KiB", data->mem_max_kb);
156 ATTRIBUTE(sb, mem_dir, "used_KiB", data->mem_used_kb); 155 ATTRIBUTE(mem_dir, "used_KiB", data->mem_used_kb);
157 ATTRIBUTE(sb, mem_dir, "share_KiB", data->mem_share_kb); 156 ATTRIBUTE(mem_dir, "share_KiB", data->mem_share_kb);
158 157
159 /* samples */ 158 /* samples */
160 samples_dir = hypfs_mkdir(sb, guest_dir, "samples"); 159 samples_dir = hypfs_mkdir(guest_dir, "samples");
161 if (IS_ERR(samples_dir)) 160 if (IS_ERR(samples_dir))
162 return PTR_ERR(samples_dir); 161 return PTR_ERR(samples_dir);
163 ATTRIBUTE(sb, samples_dir, "cpu_using", data->cpu_use_samp); 162 ATTRIBUTE(samples_dir, "cpu_using", data->cpu_use_samp);
164 ATTRIBUTE(sb, samples_dir, "cpu_delay", data->cpu_delay_samp); 163 ATTRIBUTE(samples_dir, "cpu_delay", data->cpu_delay_samp);
165 ATTRIBUTE(sb, samples_dir, "mem_delay", data->page_wait_samp); 164 ATTRIBUTE(samples_dir, "mem_delay", data->page_wait_samp);
166 ATTRIBUTE(sb, samples_dir, "idle", data->idle_samp); 165 ATTRIBUTE(samples_dir, "idle", data->idle_samp);
167 ATTRIBUTE(sb, samples_dir, "other", data->other_samp); 166 ATTRIBUTE(samples_dir, "other", data->other_samp);
168 ATTRIBUTE(sb, samples_dir, "total", data->total_samp); 167 ATTRIBUTE(samples_dir, "total", data->total_samp);
169 return 0; 168 return 0;
170} 169}
171 170
172int hypfs_vm_create_files(struct super_block *sb, struct dentry *root) 171int hypfs_vm_create_files(struct dentry *root)
173{ 172{
174 struct dentry *dir, *file; 173 struct dentry *dir, *file;
175 struct diag2fc_data *data; 174 struct diag2fc_data *data;
@@ -181,38 +180,38 @@ int hypfs_vm_create_files(struct super_block *sb, struct dentry *root)
181 return PTR_ERR(data); 180 return PTR_ERR(data);
182 181
183 /* Hpervisor Info */ 182 /* Hpervisor Info */
184 dir = hypfs_mkdir(sb, root, "hyp"); 183 dir = hypfs_mkdir(root, "hyp");
185 if (IS_ERR(dir)) { 184 if (IS_ERR(dir)) {
186 rc = PTR_ERR(dir); 185 rc = PTR_ERR(dir);
187 goto failed; 186 goto failed;
188 } 187 }
189 file = hypfs_create_str(sb, dir, "type", "z/VM Hypervisor"); 188 file = hypfs_create_str(dir, "type", "z/VM Hypervisor");
190 if (IS_ERR(file)) { 189 if (IS_ERR(file)) {
191 rc = PTR_ERR(file); 190 rc = PTR_ERR(file);
192 goto failed; 191 goto failed;
193 } 192 }
194 193
195 /* physical cpus */ 194 /* physical cpus */
196 dir = hypfs_mkdir(sb, root, "cpus"); 195 dir = hypfs_mkdir(root, "cpus");
197 if (IS_ERR(dir)) { 196 if (IS_ERR(dir)) {
198 rc = PTR_ERR(dir); 197 rc = PTR_ERR(dir);
199 goto failed; 198 goto failed;
200 } 199 }
201 file = hypfs_create_u64(sb, dir, "count", data->lcpus); 200 file = hypfs_create_u64(dir, "count", data->lcpus);
202 if (IS_ERR(file)) { 201 if (IS_ERR(file)) {
203 rc = PTR_ERR(file); 202 rc = PTR_ERR(file);
204 goto failed; 203 goto failed;
205 } 204 }
206 205
207 /* guests */ 206 /* guests */
208 dir = hypfs_mkdir(sb, root, "systems"); 207 dir = hypfs_mkdir(root, "systems");
209 if (IS_ERR(dir)) { 208 if (IS_ERR(dir)) {
210 rc = PTR_ERR(dir); 209 rc = PTR_ERR(dir);
211 goto failed; 210 goto failed;
212 } 211 }
213 212
214 for (i = 0; i < count; i++) { 213 for (i = 0; i < count; i++) {
215 rc = hpyfs_vm_create_guest(sb, dir, &(data[i])); 214 rc = hpyfs_vm_create_guest(dir, &(data[i]));
216 if (rc) 215 if (rc)
217 goto failed; 216 goto failed;
218 } 217 }
diff --git a/arch/s390/hypfs/inode.c b/arch/s390/hypfs/inode.c
index 7a539f4f5e30..ddfe09b45134 100644
--- a/arch/s390/hypfs/inode.c
+++ b/arch/s390/hypfs/inode.c
@@ -28,8 +28,7 @@
28#define HYPFS_MAGIC 0x687970 /* ASCII 'hyp' */ 28#define HYPFS_MAGIC 0x687970 /* ASCII 'hyp' */
29#define TMP_SIZE 64 /* size of temporary buffers */ 29#define TMP_SIZE 64 /* size of temporary buffers */
30 30
31static struct dentry *hypfs_create_update_file(struct super_block *sb, 31static struct dentry *hypfs_create_update_file(struct dentry *dir);
32 struct dentry *dir);
33 32
34struct hypfs_sb_info { 33struct hypfs_sb_info {
35 kuid_t uid; /* uid used for files and dirs */ 34 kuid_t uid; /* uid used for files and dirs */
@@ -193,9 +192,9 @@ static ssize_t hypfs_aio_write(struct kiocb *iocb, const struct iovec *iov,
193 } 192 }
194 hypfs_delete_tree(sb->s_root); 193 hypfs_delete_tree(sb->s_root);
195 if (MACHINE_IS_VM) 194 if (MACHINE_IS_VM)
196 rc = hypfs_vm_create_files(sb, sb->s_root); 195 rc = hypfs_vm_create_files(sb->s_root);
197 else 196 else
198 rc = hypfs_diag_create_files(sb, sb->s_root); 197 rc = hypfs_diag_create_files(sb->s_root);
199 if (rc) { 198 if (rc) {
200 pr_err("Updating the hypfs tree failed\n"); 199 pr_err("Updating the hypfs tree failed\n");
201 hypfs_delete_tree(sb->s_root); 200 hypfs_delete_tree(sb->s_root);
@@ -302,12 +301,12 @@ static int hypfs_fill_super(struct super_block *sb, void *data, int silent)
302 if (!root_dentry) 301 if (!root_dentry)
303 return -ENOMEM; 302 return -ENOMEM;
304 if (MACHINE_IS_VM) 303 if (MACHINE_IS_VM)
305 rc = hypfs_vm_create_files(sb, root_dentry); 304 rc = hypfs_vm_create_files(root_dentry);
306 else 305 else
307 rc = hypfs_diag_create_files(sb, root_dentry); 306 rc = hypfs_diag_create_files(root_dentry);
308 if (rc) 307 if (rc)
309 return rc; 308 return rc;
310 sbi->update_file = hypfs_create_update_file(sb, root_dentry); 309 sbi->update_file = hypfs_create_update_file(root_dentry);
311 if (IS_ERR(sbi->update_file)) 310 if (IS_ERR(sbi->update_file))
312 return PTR_ERR(sbi->update_file); 311 return PTR_ERR(sbi->update_file);
313 hypfs_update_update(sb); 312 hypfs_update_update(sb);
@@ -334,8 +333,7 @@ static void hypfs_kill_super(struct super_block *sb)
334 kill_litter_super(sb); 333 kill_litter_super(sb);
335} 334}
336 335
337static struct dentry *hypfs_create_file(struct super_block *sb, 336static struct dentry *hypfs_create_file(struct dentry *parent, const char *name,
338 struct dentry *parent, const char *name,
339 char *data, umode_t mode) 337 char *data, umode_t mode)
340{ 338{
341 struct dentry *dentry; 339 struct dentry *dentry;
@@ -347,7 +345,7 @@ static struct dentry *hypfs_create_file(struct super_block *sb,
347 dentry = ERR_PTR(-ENOMEM); 345 dentry = ERR_PTR(-ENOMEM);
348 goto fail; 346 goto fail;
349 } 347 }
350 inode = hypfs_make_inode(sb, mode); 348 inode = hypfs_make_inode(parent->d_sb, mode);
351 if (!inode) { 349 if (!inode) {
352 dput(dentry); 350 dput(dentry);
353 dentry = ERR_PTR(-ENOMEM); 351 dentry = ERR_PTR(-ENOMEM);
@@ -373,24 +371,22 @@ fail:
373 return dentry; 371 return dentry;
374} 372}
375 373
376struct dentry *hypfs_mkdir(struct super_block *sb, struct dentry *parent, 374struct dentry *hypfs_mkdir(struct dentry *parent, const char *name)
377 const char *name)
378{ 375{
379 struct dentry *dentry; 376 struct dentry *dentry;
380 377
381 dentry = hypfs_create_file(sb, parent, name, NULL, S_IFDIR | DIR_MODE); 378 dentry = hypfs_create_file(parent, name, NULL, S_IFDIR | DIR_MODE);
382 if (IS_ERR(dentry)) 379 if (IS_ERR(dentry))
383 return dentry; 380 return dentry;
384 hypfs_add_dentry(dentry); 381 hypfs_add_dentry(dentry);
385 return dentry; 382 return dentry;
386} 383}
387 384
388static struct dentry *hypfs_create_update_file(struct super_block *sb, 385static struct dentry *hypfs_create_update_file(struct dentry *dir)
389 struct dentry *dir)
390{ 386{
391 struct dentry *dentry; 387 struct dentry *dentry;
392 388
393 dentry = hypfs_create_file(sb, dir, "update", NULL, 389 dentry = hypfs_create_file(dir, "update", NULL,
394 S_IFREG | UPDATE_FILE_MODE); 390 S_IFREG | UPDATE_FILE_MODE);
395 /* 391 /*
396 * We do not put the update file on the 'delete' list with 392 * We do not put the update file on the 'delete' list with
@@ -400,7 +396,7 @@ static struct dentry *hypfs_create_update_file(struct super_block *sb,
400 return dentry; 396 return dentry;
401} 397}
402 398
403struct dentry *hypfs_create_u64(struct super_block *sb, struct dentry *dir, 399struct dentry *hypfs_create_u64(struct dentry *dir,
404 const char *name, __u64 value) 400 const char *name, __u64 value)
405{ 401{
406 char *buffer; 402 char *buffer;
@@ -412,7 +408,7 @@ struct dentry *hypfs_create_u64(struct super_block *sb, struct dentry *dir,
412 if (!buffer) 408 if (!buffer)
413 return ERR_PTR(-ENOMEM); 409 return ERR_PTR(-ENOMEM);
414 dentry = 410 dentry =
415 hypfs_create_file(sb, dir, name, buffer, S_IFREG | REG_FILE_MODE); 411 hypfs_create_file(dir, name, buffer, S_IFREG | REG_FILE_MODE);
416 if (IS_ERR(dentry)) { 412 if (IS_ERR(dentry)) {
417 kfree(buffer); 413 kfree(buffer);
418 return ERR_PTR(-ENOMEM); 414 return ERR_PTR(-ENOMEM);
@@ -421,7 +417,7 @@ struct dentry *hypfs_create_u64(struct super_block *sb, struct dentry *dir,
421 return dentry; 417 return dentry;
422} 418}
423 419
424struct dentry *hypfs_create_str(struct super_block *sb, struct dentry *dir, 420struct dentry *hypfs_create_str(struct dentry *dir,
425 const char *name, char *string) 421 const char *name, char *string)
426{ 422{
427 char *buffer; 423 char *buffer;
@@ -432,7 +428,7 @@ struct dentry *hypfs_create_str(struct super_block *sb, struct dentry *dir,
432 return ERR_PTR(-ENOMEM); 428 return ERR_PTR(-ENOMEM);
433 sprintf(buffer, "%s\n", string); 429 sprintf(buffer, "%s\n", string);
434 dentry = 430 dentry =
435 hypfs_create_file(sb, dir, name, buffer, S_IFREG | REG_FILE_MODE); 431 hypfs_create_file(dir, name, buffer, S_IFREG | REG_FILE_MODE);
436 if (IS_ERR(dentry)) { 432 if (IS_ERR(dentry)) {
437 kfree(buffer); 433 kfree(buffer);
438 return ERR_PTR(-ENOMEM); 434 return ERR_PTR(-ENOMEM);
diff --git a/arch/s390/include/asm/airq.h b/arch/s390/include/asm/airq.h
index 4066cee0c2d2..4bbb5957ed1b 100644
--- a/arch/s390/include/asm/airq.h
+++ b/arch/s390/include/asm/airq.h
@@ -9,6 +9,8 @@
9#ifndef _ASM_S390_AIRQ_H 9#ifndef _ASM_S390_AIRQ_H
10#define _ASM_S390_AIRQ_H 10#define _ASM_S390_AIRQ_H
11 11
12#include <linux/bit_spinlock.h>
13
12struct airq_struct { 14struct airq_struct {
13 struct hlist_node list; /* Handler queueing. */ 15 struct hlist_node list; /* Handler queueing. */
14 void (*handler)(struct airq_struct *); /* Thin-interrupt handler */ 16 void (*handler)(struct airq_struct *); /* Thin-interrupt handler */
@@ -23,4 +25,69 @@ struct airq_struct {
23int register_adapter_interrupt(struct airq_struct *airq); 25int register_adapter_interrupt(struct airq_struct *airq);
24void unregister_adapter_interrupt(struct airq_struct *airq); 26void unregister_adapter_interrupt(struct airq_struct *airq);
25 27
28/* Adapter interrupt bit vector */
29struct airq_iv {
30 unsigned long *vector; /* Adapter interrupt bit vector */
31 unsigned long *avail; /* Allocation bit mask for the bit vector */
32 unsigned long *bitlock; /* Lock bit mask for the bit vector */
33 unsigned long *ptr; /* Pointer associated with each bit */
34 unsigned int *data; /* 32 bit value associated with each bit */
35 unsigned long bits; /* Number of bits in the vector */
36 unsigned long end; /* Number of highest allocated bit + 1 */
37 spinlock_t lock; /* Lock to protect alloc & free */
38};
39
40#define AIRQ_IV_ALLOC 1 /* Use an allocation bit mask */
41#define AIRQ_IV_BITLOCK 2 /* Allocate the lock bit mask */
42#define AIRQ_IV_PTR 4 /* Allocate the ptr array */
43#define AIRQ_IV_DATA 8 /* Allocate the data array */
44
45struct airq_iv *airq_iv_create(unsigned long bits, unsigned long flags);
46void airq_iv_release(struct airq_iv *iv);
47unsigned long airq_iv_alloc_bit(struct airq_iv *iv);
48void airq_iv_free_bit(struct airq_iv *iv, unsigned long bit);
49unsigned long airq_iv_scan(struct airq_iv *iv, unsigned long start,
50 unsigned long end);
51
52static inline unsigned long airq_iv_end(struct airq_iv *iv)
53{
54 return iv->end;
55}
56
57static inline void airq_iv_lock(struct airq_iv *iv, unsigned long bit)
58{
59 const unsigned long be_to_le = BITS_PER_LONG - 1;
60 bit_spin_lock(bit ^ be_to_le, iv->bitlock);
61}
62
63static inline void airq_iv_unlock(struct airq_iv *iv, unsigned long bit)
64{
65 const unsigned long be_to_le = BITS_PER_LONG - 1;
66 bit_spin_unlock(bit ^ be_to_le, iv->bitlock);
67}
68
69static inline void airq_iv_set_data(struct airq_iv *iv, unsigned long bit,
70 unsigned int data)
71{
72 iv->data[bit] = data;
73}
74
75static inline unsigned int airq_iv_get_data(struct airq_iv *iv,
76 unsigned long bit)
77{
78 return iv->data[bit];
79}
80
81static inline void airq_iv_set_ptr(struct airq_iv *iv, unsigned long bit,
82 unsigned long ptr)
83{
84 iv->ptr[bit] = ptr;
85}
86
87static inline unsigned long airq_iv_get_ptr(struct airq_iv *iv,
88 unsigned long bit)
89{
90 return iv->ptr[bit];
91}
92
26#endif /* _ASM_S390_AIRQ_H */ 93#endif /* _ASM_S390_AIRQ_H */
diff --git a/arch/s390/include/asm/bitops.h b/arch/s390/include/asm/bitops.h
index 7d4676758733..10135a38673c 100644
--- a/arch/s390/include/asm/bitops.h
+++ b/arch/s390/include/asm/bitops.h
@@ -216,7 +216,7 @@ static inline void __set_bit(unsigned long nr, volatile unsigned long *ptr)
216 addr = (unsigned long) ptr + ((nr ^ (BITS_PER_LONG - 8)) >> 3); 216 addr = (unsigned long) ptr + ((nr ^ (BITS_PER_LONG - 8)) >> 3);
217 asm volatile( 217 asm volatile(
218 " oc %O0(1,%R0),%1" 218 " oc %O0(1,%R0),%1"
219 : "=Q" (*(char *) addr) : "Q" (_oi_bitmap[nr & 7]) : "cc" ); 219 : "+Q" (*(char *) addr) : "Q" (_oi_bitmap[nr & 7]) : "cc");
220} 220}
221 221
222static inline void 222static inline void
@@ -244,7 +244,7 @@ __clear_bit(unsigned long nr, volatile unsigned long *ptr)
244 addr = (unsigned long) ptr + ((nr ^ (BITS_PER_LONG - 8)) >> 3); 244 addr = (unsigned long) ptr + ((nr ^ (BITS_PER_LONG - 8)) >> 3);
245 asm volatile( 245 asm volatile(
246 " nc %O0(1,%R0),%1" 246 " nc %O0(1,%R0),%1"
247 : "=Q" (*(char *) addr) : "Q" (_ni_bitmap[nr & 7]) : "cc" ); 247 : "+Q" (*(char *) addr) : "Q" (_ni_bitmap[nr & 7]) : "cc");
248} 248}
249 249
250static inline void 250static inline void
@@ -271,7 +271,7 @@ static inline void __change_bit(unsigned long nr, volatile unsigned long *ptr)
271 addr = (unsigned long) ptr + ((nr ^ (BITS_PER_LONG - 8)) >> 3); 271 addr = (unsigned long) ptr + ((nr ^ (BITS_PER_LONG - 8)) >> 3);
272 asm volatile( 272 asm volatile(
273 " xc %O0(1,%R0),%1" 273 " xc %O0(1,%R0),%1"
274 : "=Q" (*(char *) addr) : "Q" (_oi_bitmap[nr & 7]) : "cc" ); 274 : "+Q" (*(char *) addr) : "Q" (_oi_bitmap[nr & 7]) : "cc");
275} 275}
276 276
277static inline void 277static inline void
@@ -301,7 +301,7 @@ test_and_set_bit_simple(unsigned long nr, volatile unsigned long *ptr)
301 ch = *(unsigned char *) addr; 301 ch = *(unsigned char *) addr;
302 asm volatile( 302 asm volatile(
303 " oc %O0(1,%R0),%1" 303 " oc %O0(1,%R0),%1"
304 : "=Q" (*(char *) addr) : "Q" (_oi_bitmap[nr & 7]) 304 : "+Q" (*(char *) addr) : "Q" (_oi_bitmap[nr & 7])
305 : "cc", "memory"); 305 : "cc", "memory");
306 return (ch >> (nr & 7)) & 1; 306 return (ch >> (nr & 7)) & 1;
307} 307}
@@ -320,7 +320,7 @@ test_and_clear_bit_simple(unsigned long nr, volatile unsigned long *ptr)
320 ch = *(unsigned char *) addr; 320 ch = *(unsigned char *) addr;
321 asm volatile( 321 asm volatile(
322 " nc %O0(1,%R0),%1" 322 " nc %O0(1,%R0),%1"
323 : "=Q" (*(char *) addr) : "Q" (_ni_bitmap[nr & 7]) 323 : "+Q" (*(char *) addr) : "Q" (_ni_bitmap[nr & 7])
324 : "cc", "memory"); 324 : "cc", "memory");
325 return (ch >> (nr & 7)) & 1; 325 return (ch >> (nr & 7)) & 1;
326} 326}
@@ -339,7 +339,7 @@ test_and_change_bit_simple(unsigned long nr, volatile unsigned long *ptr)
339 ch = *(unsigned char *) addr; 339 ch = *(unsigned char *) addr;
340 asm volatile( 340 asm volatile(
341 " xc %O0(1,%R0),%1" 341 " xc %O0(1,%R0),%1"
342 : "=Q" (*(char *) addr) : "Q" (_oi_bitmap[nr & 7]) 342 : "+Q" (*(char *) addr) : "Q" (_oi_bitmap[nr & 7])
343 : "cc", "memory"); 343 : "cc", "memory");
344 return (ch >> (nr & 7)) & 1; 344 return (ch >> (nr & 7)) & 1;
345} 345}
diff --git a/arch/s390/include/asm/cio.h b/arch/s390/include/asm/cio.h
index ffb898961c8d..d42625053c37 100644
--- a/arch/s390/include/asm/cio.h
+++ b/arch/s390/include/asm/cio.h
@@ -296,6 +296,7 @@ static inline int ccw_dev_id_is_equal(struct ccw_dev_id *dev_id1,
296 return 0; 296 return 0;
297} 297}
298 298
299void channel_subsystem_reinit(void);
299extern void css_schedule_reprobe(void); 300extern void css_schedule_reprobe(void);
300 301
301extern void reipl_ccw_dev(struct ccw_dev_id *id); 302extern void reipl_ccw_dev(struct ccw_dev_id *id);
diff --git a/arch/s390/include/asm/cputime.h b/arch/s390/include/asm/cputime.h
index d2ff41370c0c..f65bd3634519 100644
--- a/arch/s390/include/asm/cputime.h
+++ b/arch/s390/include/asm/cputime.h
@@ -13,9 +13,6 @@
13#include <asm/div64.h> 13#include <asm/div64.h>
14 14
15 15
16#define __ARCH_HAS_VTIME_ACCOUNT
17#define __ARCH_HAS_VTIME_TASK_SWITCH
18
19/* We want to use full resolution of the CPU timer: 2**-12 micro-seconds. */ 16/* We want to use full resolution of the CPU timer: 2**-12 micro-seconds. */
20 17
21typedef unsigned long long __nocast cputime_t; 18typedef unsigned long long __nocast cputime_t;
diff --git a/arch/s390/include/asm/hardirq.h b/arch/s390/include/asm/hardirq.h
index 0c82ba86e997..a908d2941c5d 100644
--- a/arch/s390/include/asm/hardirq.h
+++ b/arch/s390/include/asm/hardirq.h
@@ -20,4 +20,9 @@
20 20
21#define HARDIRQ_BITS 8 21#define HARDIRQ_BITS 8
22 22
23static inline void ack_bad_irq(unsigned int irq)
24{
25 printk(KERN_CRIT "unexpected IRQ trap at vector %02x\n", irq);
26}
27
23#endif /* __ASM_HARDIRQ_H */ 28#endif /* __ASM_HARDIRQ_H */
diff --git a/arch/s390/include/asm/hugetlb.h b/arch/s390/include/asm/hugetlb.h
index bd90359d6d22..11eae5f55b70 100644
--- a/arch/s390/include/asm/hugetlb.h
+++ b/arch/s390/include/asm/hugetlb.h
@@ -17,6 +17,9 @@
17 17
18void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, 18void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
19 pte_t *ptep, pte_t pte); 19 pte_t *ptep, pte_t pte);
20pte_t huge_ptep_get(pte_t *ptep);
21pte_t huge_ptep_get_and_clear(struct mm_struct *mm,
22 unsigned long addr, pte_t *ptep);
20 23
21/* 24/*
22 * If the arch doesn't supply something else, assume that hugepage 25 * If the arch doesn't supply something else, assume that hugepage
@@ -38,147 +41,75 @@ static inline int prepare_hugepage_range(struct file *file,
38int arch_prepare_hugepage(struct page *page); 41int arch_prepare_hugepage(struct page *page);
39void arch_release_hugepage(struct page *page); 42void arch_release_hugepage(struct page *page);
40 43
41static inline pte_t huge_pte_wrprotect(pte_t pte) 44static inline void huge_pte_clear(struct mm_struct *mm, unsigned long addr,
45 pte_t *ptep)
42{ 46{
43 pte_val(pte) |= _PAGE_RO; 47 pte_val(*ptep) = _SEGMENT_ENTRY_EMPTY;
44 return pte;
45} 48}
46 49
47static inline int huge_pte_none(pte_t pte) 50static inline void huge_ptep_clear_flush(struct vm_area_struct *vma,
51 unsigned long address, pte_t *ptep)
48{ 52{
49 return (pte_val(pte) & _SEGMENT_ENTRY_INV) && 53 huge_ptep_get_and_clear(vma->vm_mm, address, ptep);
50 !(pte_val(pte) & _SEGMENT_ENTRY_RO);
51} 54}
52 55
53static inline pte_t huge_ptep_get(pte_t *ptep) 56static inline int huge_ptep_set_access_flags(struct vm_area_struct *vma,
57 unsigned long addr, pte_t *ptep,
58 pte_t pte, int dirty)
54{ 59{
55 pte_t pte = *ptep; 60 int changed = !pte_same(huge_ptep_get(ptep), pte);
56 unsigned long mask; 61 if (changed) {
57 62 huge_ptep_get_and_clear(vma->vm_mm, addr, ptep);
58 if (!MACHINE_HAS_HPAGE) { 63 set_huge_pte_at(vma->vm_mm, addr, ptep, pte);
59 ptep = (pte_t *) (pte_val(pte) & _SEGMENT_ENTRY_ORIGIN);
60 if (ptep) {
61 mask = pte_val(pte) &
62 (_SEGMENT_ENTRY_INV | _SEGMENT_ENTRY_RO);
63 pte = pte_mkhuge(*ptep);
64 pte_val(pte) |= mask;
65 }
66 } 64 }
67 return pte; 65 return changed;
68} 66}
69 67
70static inline void __pmd_csp(pmd_t *pmdp) 68static inline void huge_ptep_set_wrprotect(struct mm_struct *mm,
69 unsigned long addr, pte_t *ptep)
71{ 70{
72 register unsigned long reg2 asm("2") = pmd_val(*pmdp); 71 pte_t pte = huge_ptep_get_and_clear(mm, addr, ptep);
73 register unsigned long reg3 asm("3") = pmd_val(*pmdp) | 72 set_huge_pte_at(mm, addr, ptep, pte_wrprotect(pte));
74 _SEGMENT_ENTRY_INV;
75 register unsigned long reg4 asm("4") = ((unsigned long) pmdp) + 5;
76
77 asm volatile(
78 " csp %1,%3"
79 : "=m" (*pmdp)
80 : "d" (reg2), "d" (reg3), "d" (reg4), "m" (*pmdp) : "cc");
81} 73}
82 74
83static inline void huge_ptep_invalidate(struct mm_struct *mm, 75static inline pte_t mk_huge_pte(struct page *page, pgprot_t pgprot)
84 unsigned long address, pte_t *ptep)
85{
86 pmd_t *pmdp = (pmd_t *) ptep;
87
88 if (MACHINE_HAS_IDTE)
89 __pmd_idte(address, pmdp);
90 else
91 __pmd_csp(pmdp);
92 pmd_val(*pmdp) = _SEGMENT_ENTRY_INV | _SEGMENT_ENTRY;
93}
94
95static inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm,
96 unsigned long addr, pte_t *ptep)
97{
98 pte_t pte = huge_ptep_get(ptep);
99
100 huge_ptep_invalidate(mm, addr, ptep);
101 return pte;
102}
103
104#define huge_ptep_set_access_flags(__vma, __addr, __ptep, __entry, __dirty) \
105({ \
106 int __changed = !pte_same(huge_ptep_get(__ptep), __entry); \
107 if (__changed) { \
108 huge_ptep_invalidate((__vma)->vm_mm, __addr, __ptep); \
109 set_huge_pte_at((__vma)->vm_mm, __addr, __ptep, __entry); \
110 } \
111 __changed; \
112})
113
114#define huge_ptep_set_wrprotect(__mm, __addr, __ptep) \
115({ \
116 pte_t __pte = huge_ptep_get(__ptep); \
117 if (huge_pte_write(__pte)) { \
118 huge_ptep_invalidate(__mm, __addr, __ptep); \
119 set_huge_pte_at(__mm, __addr, __ptep, \
120 huge_pte_wrprotect(__pte)); \
121 } \
122})
123
124static inline void huge_ptep_clear_flush(struct vm_area_struct *vma,
125 unsigned long address, pte_t *ptep)
126{ 76{
127 huge_ptep_invalidate(vma->vm_mm, address, ptep); 77 return mk_pte(page, pgprot);
128} 78}
129 79
130static inline pte_t mk_huge_pte(struct page *page, pgprot_t pgprot) 80static inline int huge_pte_none(pte_t pte)
131{ 81{
132 pte_t pte; 82 return pte_none(pte);
133 pmd_t pmd;
134
135 pmd = mk_pmd_phys(page_to_phys(page), pgprot);
136 pte_val(pte) = pmd_val(pmd);
137 return pte;
138} 83}
139 84
140static inline int huge_pte_write(pte_t pte) 85static inline int huge_pte_write(pte_t pte)
141{ 86{
142 pmd_t pmd; 87 return pte_write(pte);
143
144 pmd_val(pmd) = pte_val(pte);
145 return pmd_write(pmd);
146} 88}
147 89
148static inline int huge_pte_dirty(pte_t pte) 90static inline int huge_pte_dirty(pte_t pte)
149{ 91{
150 /* No dirty bit in the segment table entry. */ 92 return pte_dirty(pte);
151 return 0;
152} 93}
153 94
154static inline pte_t huge_pte_mkwrite(pte_t pte) 95static inline pte_t huge_pte_mkwrite(pte_t pte)
155{ 96{
156 pmd_t pmd; 97 return pte_mkwrite(pte);
157
158 pmd_val(pmd) = pte_val(pte);
159 pte_val(pte) = pmd_val(pmd_mkwrite(pmd));
160 return pte;
161} 98}
162 99
163static inline pte_t huge_pte_mkdirty(pte_t pte) 100static inline pte_t huge_pte_mkdirty(pte_t pte)
164{ 101{
165 /* No dirty bit in the segment table entry. */ 102 return pte_mkdirty(pte);
166 return pte;
167} 103}
168 104
169static inline pte_t huge_pte_modify(pte_t pte, pgprot_t newprot) 105static inline pte_t huge_pte_wrprotect(pte_t pte)
170{ 106{
171 pmd_t pmd; 107 return pte_wrprotect(pte);
172
173 pmd_val(pmd) = pte_val(pte);
174 pte_val(pte) = pmd_val(pmd_modify(pmd, newprot));
175 return pte;
176} 108}
177 109
178static inline void huge_pte_clear(struct mm_struct *mm, unsigned long addr, 110static inline pte_t huge_pte_modify(pte_t pte, pgprot_t newprot)
179 pte_t *ptep)
180{ 111{
181 pmd_clear((pmd_t *) ptep); 112 return pte_modify(pte, newprot);
182} 113}
183 114
184#endif /* _ASM_S390_HUGETLB_H */ 115#endif /* _ASM_S390_HUGETLB_H */
diff --git a/arch/s390/include/asm/hw_irq.h b/arch/s390/include/asm/hw_irq.h
index 7e3d2586c1ff..ee96a8b697f9 100644
--- a/arch/s390/include/asm/hw_irq.h
+++ b/arch/s390/include/asm/hw_irq.h
@@ -4,19 +4,8 @@
4#include <linux/msi.h> 4#include <linux/msi.h>
5#include <linux/pci.h> 5#include <linux/pci.h>
6 6
7static inline struct msi_desc *irq_get_msi_desc(unsigned int irq) 7void __init init_airq_interrupts(void);
8{ 8void __init init_cio_interrupts(void);
9 return __irq_get_msi_desc(irq); 9void __init init_ext_interrupts(void);
10}
11
12/* Must be called with msi map lock held */
13static inline int irq_set_msi_desc(unsigned int irq, struct msi_desc *msi)
14{
15 if (!msi)
16 return -EINVAL;
17
18 msi->irq = irq;
19 return 0;
20}
21 10
22#endif 11#endif
diff --git a/arch/s390/include/asm/irq.h b/arch/s390/include/asm/irq.h
index 87c17bfb2968..5f8bcc5fe423 100644
--- a/arch/s390/include/asm/irq.h
+++ b/arch/s390/include/asm/irq.h
@@ -1,17 +1,28 @@
1#ifndef _ASM_IRQ_H 1#ifndef _ASM_IRQ_H
2#define _ASM_IRQ_H 2#define _ASM_IRQ_H
3 3
4#define EXT_INTERRUPT 1
5#define IO_INTERRUPT 2
6#define THIN_INTERRUPT 3
7
8#define NR_IRQS_BASE 4
9
10#ifdef CONFIG_PCI_NR_MSI
11# define NR_IRQS (NR_IRQS_BASE + CONFIG_PCI_NR_MSI)
12#else
13# define NR_IRQS NR_IRQS_BASE
14#endif
15
16/* This number is used when no interrupt has been assigned */
17#define NO_IRQ 0
18
19#ifndef __ASSEMBLY__
20
4#include <linux/hardirq.h> 21#include <linux/hardirq.h>
5#include <linux/percpu.h> 22#include <linux/percpu.h>
6#include <linux/cache.h> 23#include <linux/cache.h>
7#include <linux/types.h> 24#include <linux/types.h>
8 25
9enum interruption_main_class {
10 EXTERNAL_INTERRUPT,
11 IO_INTERRUPT,
12 NR_IRQS
13};
14
15enum interruption_class { 26enum interruption_class {
16 IRQEXT_CLK, 27 IRQEXT_CLK,
17 IRQEXT_EXC, 28 IRQEXT_EXC,
@@ -67,19 +78,17 @@ typedef void (*ext_int_handler_t)(struct ext_code, unsigned int, unsigned long);
67 78
68int register_external_interrupt(u16 code, ext_int_handler_t handler); 79int register_external_interrupt(u16 code, ext_int_handler_t handler);
69int unregister_external_interrupt(u16 code, ext_int_handler_t handler); 80int unregister_external_interrupt(u16 code, ext_int_handler_t handler);
70void service_subclass_irq_register(void); 81
71void service_subclass_irq_unregister(void); 82enum irq_subclass {
72void measurement_alert_subclass_register(void); 83 IRQ_SUBCLASS_MEASUREMENT_ALERT = 5,
73void measurement_alert_subclass_unregister(void); 84 IRQ_SUBCLASS_SERVICE_SIGNAL = 9,
74 85};
75#ifdef CONFIG_LOCKDEP 86
76# define disable_irq_nosync_lockdep(irq) disable_irq_nosync(irq) 87void irq_subclass_register(enum irq_subclass subclass);
77# define disable_irq_nosync_lockdep_irqsave(irq, flags) \ 88void irq_subclass_unregister(enum irq_subclass subclass);
78 disable_irq_nosync(irq) 89
79# define disable_irq_lockdep(irq) disable_irq(irq) 90#define irq_canonicalize(irq) (irq)
80# define enable_irq_lockdep(irq) enable_irq(irq) 91
81# define enable_irq_lockdep_irqrestore(irq, flags) \ 92#endif /* __ASSEMBLY__ */
82 enable_irq(irq)
83#endif
84 93
85#endif /* _ASM_IRQ_H */ 94#endif /* _ASM_IRQ_H */
diff --git a/arch/s390/include/asm/kprobes.h b/arch/s390/include/asm/kprobes.h
index dcf6948a875c..4176dfe0fba1 100644
--- a/arch/s390/include/asm/kprobes.h
+++ b/arch/s390/include/asm/kprobes.h
@@ -31,6 +31,8 @@
31#include <linux/ptrace.h> 31#include <linux/ptrace.h>
32#include <linux/percpu.h> 32#include <linux/percpu.h>
33 33
34#define __ARCH_WANT_KPROBES_INSN_SLOT
35
34struct pt_regs; 36struct pt_regs;
35struct kprobe; 37struct kprobe;
36 38
@@ -57,7 +59,7 @@ typedef u16 kprobe_opcode_t;
57/* Architecture specific copy of original instruction */ 59/* Architecture specific copy of original instruction */
58struct arch_specific_insn { 60struct arch_specific_insn {
59 /* copy of original instruction */ 61 /* copy of original instruction */
60 kprobe_opcode_t insn[MAX_INSN_SIZE]; 62 kprobe_opcode_t *insn;
61}; 63};
62 64
63struct prev_kprobe { 65struct prev_kprobe {
diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h
index 3238d4004e84..e87ecaa2c569 100644
--- a/arch/s390/include/asm/kvm_host.h
+++ b/arch/s390/include/asm/kvm_host.h
@@ -274,6 +274,14 @@ struct kvm_arch{
274 int css_support; 274 int css_support;
275}; 275};
276 276
277#define KVM_HVA_ERR_BAD (-1UL)
278#define KVM_HVA_ERR_RO_BAD (-2UL)
279
280static inline bool kvm_is_error_hva(unsigned long addr)
281{
282 return IS_ERR_VALUE(addr);
283}
284
277extern int sie64a(struct kvm_s390_sie_block *, u64 *); 285extern int sie64a(struct kvm_s390_sie_block *, u64 *);
278extern char sie_exit; 286extern char sie_exit;
279#endif 287#endif
diff --git a/arch/s390/include/asm/mmu.h b/arch/s390/include/asm/mmu.h
index 6340178748bf..ff132ac64ddd 100644
--- a/arch/s390/include/asm/mmu.h
+++ b/arch/s390/include/asm/mmu.h
@@ -12,8 +12,6 @@ typedef struct {
12 unsigned long asce_bits; 12 unsigned long asce_bits;
13 unsigned long asce_limit; 13 unsigned long asce_limit;
14 unsigned long vdso_base; 14 unsigned long vdso_base;
15 /* Cloned contexts will be created with extended page tables. */
16 unsigned int alloc_pgste:1;
17 /* The mmu context has extended page tables. */ 15 /* The mmu context has extended page tables. */
18 unsigned int has_pgste:1; 16 unsigned int has_pgste:1;
19} mm_context_t; 17} mm_context_t;
diff --git a/arch/s390/include/asm/mmu_context.h b/arch/s390/include/asm/mmu_context.h
index 084e7755ed9b..9f973d8de90e 100644
--- a/arch/s390/include/asm/mmu_context.h
+++ b/arch/s390/include/asm/mmu_context.h
@@ -21,24 +21,7 @@ static inline int init_new_context(struct task_struct *tsk,
21#ifdef CONFIG_64BIT 21#ifdef CONFIG_64BIT
22 mm->context.asce_bits |= _ASCE_TYPE_REGION3; 22 mm->context.asce_bits |= _ASCE_TYPE_REGION3;
23#endif 23#endif
24 if (current->mm && current->mm->context.alloc_pgste) { 24 mm->context.has_pgste = 0;
25 /*
26 * alloc_pgste indicates, that any NEW context will be created
27 * with extended page tables. The old context is unchanged. The
28 * page table allocation and the page table operations will
29 * look at has_pgste to distinguish normal and extended page
30 * tables. The only way to create extended page tables is to
31 * set alloc_pgste and then create a new context (e.g. dup_mm).
32 * The page table allocation is called after init_new_context
33 * and if has_pgste is set, it will create extended page
34 * tables.
35 */
36 mm->context.has_pgste = 1;
37 mm->context.alloc_pgste = 1;
38 } else {
39 mm->context.has_pgste = 0;
40 mm->context.alloc_pgste = 0;
41 }
42 mm->context.asce_limit = STACK_TOP_MAX; 25 mm->context.asce_limit = STACK_TOP_MAX;
43 crst_table_init((unsigned long *) mm->pgd, pgd_entry_type(mm)); 26 crst_table_init((unsigned long *) mm->pgd, pgd_entry_type(mm));
44 return 0; 27 return 0;
@@ -77,8 +60,7 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
77 WARN_ON(atomic_read(&prev->context.attach_count) < 0); 60 WARN_ON(atomic_read(&prev->context.attach_count) < 0);
78 atomic_inc(&next->context.attach_count); 61 atomic_inc(&next->context.attach_count);
79 /* Check for TLBs not flushed yet */ 62 /* Check for TLBs not flushed yet */
80 if (next->context.flush_mm) 63 __tlb_flush_mm_lazy(next);
81 __tlb_flush_mm(next);
82} 64}
83 65
84#define enter_lazy_tlb(mm,tsk) do { } while (0) 66#define enter_lazy_tlb(mm,tsk) do { } while (0)
diff --git a/arch/s390/include/asm/page.h b/arch/s390/include/asm/page.h
index 5d64fb7619cc..1e51f2915b2e 100644
--- a/arch/s390/include/asm/page.h
+++ b/arch/s390/include/asm/page.h
@@ -32,16 +32,6 @@
32 32
33void storage_key_init_range(unsigned long start, unsigned long end); 33void storage_key_init_range(unsigned long start, unsigned long end);
34 34
35static inline unsigned long pfmf(unsigned long function, unsigned long address)
36{
37 asm volatile(
38 " .insn rre,0xb9af0000,%[function],%[address]"
39 : [address] "+a" (address)
40 : [function] "d" (function)
41 : "memory");
42 return address;
43}
44
45static inline void clear_page(void *page) 35static inline void clear_page(void *page)
46{ 36{
47 register unsigned long reg1 asm ("1") = 0; 37 register unsigned long reg1 asm ("1") = 0;
@@ -150,15 +140,6 @@ static inline int page_reset_referenced(unsigned long addr)
150#define _PAGE_FP_BIT 0x08 /* HW fetch protection bit */ 140#define _PAGE_FP_BIT 0x08 /* HW fetch protection bit */
151#define _PAGE_ACC_BITS 0xf0 /* HW access control bits */ 141#define _PAGE_ACC_BITS 0xf0 /* HW access control bits */
152 142
153/*
154 * Test and clear referenced bit in storage key.
155 */
156#define __HAVE_ARCH_PAGE_TEST_AND_CLEAR_YOUNG
157static inline int page_test_and_clear_young(unsigned long pfn)
158{
159 return page_reset_referenced(pfn << PAGE_SHIFT);
160}
161
162struct page; 143struct page;
163void arch_free_page(struct page *page, int order); 144void arch_free_page(struct page *page, int order);
164void arch_alloc_page(struct page *page, int order); 145void arch_alloc_page(struct page *page, int order);
diff --git a/arch/s390/include/asm/pci.h b/arch/s390/include/asm/pci.h
index 6e577ba0e5da..1cc185da9d38 100644
--- a/arch/s390/include/asm/pci.h
+++ b/arch/s390/include/asm/pci.h
@@ -6,6 +6,7 @@
6/* must be set before including pci_clp.h */ 6/* must be set before including pci_clp.h */
7#define PCI_BAR_COUNT 6 7#define PCI_BAR_COUNT 6
8 8
9#include <linux/pci.h>
9#include <asm-generic/pci.h> 10#include <asm-generic/pci.h>
10#include <asm-generic/pci-dma-compat.h> 11#include <asm-generic/pci-dma-compat.h>
11#include <asm/pci_clp.h> 12#include <asm/pci_clp.h>
@@ -21,10 +22,6 @@ void pci_iounmap(struct pci_dev *, void __iomem *);
21int pci_domain_nr(struct pci_bus *); 22int pci_domain_nr(struct pci_bus *);
22int pci_proc_domain(struct pci_bus *); 23int pci_proc_domain(struct pci_bus *);
23 24
24/* MSI arch hooks */
25#define arch_setup_msi_irqs arch_setup_msi_irqs
26#define arch_teardown_msi_irqs arch_teardown_msi_irqs
27
28#define ZPCI_BUS_NR 0 /* default bus number */ 25#define ZPCI_BUS_NR 0 /* default bus number */
29#define ZPCI_DEVFN 0 /* default device number */ 26#define ZPCI_DEVFN 0 /* default device number */
30 27
@@ -53,14 +50,9 @@ struct zpci_fmb {
53 atomic64_t unmapped_pages; 50 atomic64_t unmapped_pages;
54} __packed __aligned(16); 51} __packed __aligned(16);
55 52
56struct msi_map { 53#define ZPCI_MSI_VEC_BITS 11
57 unsigned long irq; 54#define ZPCI_MSI_VEC_MAX (1 << ZPCI_MSI_VEC_BITS)
58 struct msi_desc *msi; 55#define ZPCI_MSI_VEC_MASK (ZPCI_MSI_VEC_MAX - 1)
59 struct hlist_node msi_chain;
60};
61
62#define ZPCI_NR_MSI_VECS 64
63#define ZPCI_MSI_MASK (ZPCI_NR_MSI_VECS - 1)
64 56
65enum zpci_state { 57enum zpci_state {
66 ZPCI_FN_STATE_RESERVED, 58 ZPCI_FN_STATE_RESERVED,
@@ -91,8 +83,7 @@ struct zpci_dev {
91 83
92 /* IRQ stuff */ 84 /* IRQ stuff */
93 u64 msi_addr; /* MSI address */ 85 u64 msi_addr; /* MSI address */
94 struct zdev_irq_map *irq_map; 86 struct airq_iv *aibv; /* adapter interrupt bit vector */
95 struct msi_map *msi_map[ZPCI_NR_MSI_VECS];
96 unsigned int aisb; /* number of the summary bit */ 87 unsigned int aisb; /* number of the summary bit */
97 88
98 /* DMA stuff */ 89 /* DMA stuff */
@@ -122,11 +113,6 @@ struct zpci_dev {
122 struct dentry *debugfs_perf; 113 struct dentry *debugfs_perf;
123}; 114};
124 115
125struct pci_hp_callback_ops {
126 int (*create_slot) (struct zpci_dev *zdev);
127 void (*remove_slot) (struct zpci_dev *zdev);
128};
129
130static inline bool zdev_enabled(struct zpci_dev *zdev) 116static inline bool zdev_enabled(struct zpci_dev *zdev)
131{ 117{
132 return (zdev->fh & (1UL << 31)) ? true : false; 118 return (zdev->fh & (1UL << 31)) ? true : false;
@@ -146,32 +132,38 @@ int zpci_register_ioat(struct zpci_dev *, u8, u64, u64, u64);
146int zpci_unregister_ioat(struct zpci_dev *, u8); 132int zpci_unregister_ioat(struct zpci_dev *, u8);
147 133
148/* CLP */ 134/* CLP */
149int clp_find_pci_devices(void); 135int clp_scan_pci_devices(void);
136int clp_rescan_pci_devices(void);
137int clp_rescan_pci_devices_simple(void);
150int clp_add_pci_device(u32, u32, int); 138int clp_add_pci_device(u32, u32, int);
151int clp_enable_fh(struct zpci_dev *, u8); 139int clp_enable_fh(struct zpci_dev *, u8);
152int clp_disable_fh(struct zpci_dev *); 140int clp_disable_fh(struct zpci_dev *);
153 141
154/* MSI */
155struct msi_desc *__irq_get_msi_desc(unsigned int);
156int zpci_msi_set_mask_bits(struct msi_desc *, u32, u32);
157int zpci_setup_msi_irq(struct zpci_dev *, struct msi_desc *, unsigned int, int);
158void zpci_teardown_msi_irq(struct zpci_dev *, struct msi_desc *);
159int zpci_msihash_init(void);
160void zpci_msihash_exit(void);
161
162#ifdef CONFIG_PCI 142#ifdef CONFIG_PCI
163/* Error handling and recovery */ 143/* Error handling and recovery */
164void zpci_event_error(void *); 144void zpci_event_error(void *);
165void zpci_event_availability(void *); 145void zpci_event_availability(void *);
146void zpci_rescan(void);
166#else /* CONFIG_PCI */ 147#else /* CONFIG_PCI */
167static inline void zpci_event_error(void *e) {} 148static inline void zpci_event_error(void *e) {}
168static inline void zpci_event_availability(void *e) {} 149static inline void zpci_event_availability(void *e) {}
150static inline void zpci_rescan(void) {}
169#endif /* CONFIG_PCI */ 151#endif /* CONFIG_PCI */
170 152
153#ifdef CONFIG_HOTPLUG_PCI_S390
154int zpci_init_slot(struct zpci_dev *);
155void zpci_exit_slot(struct zpci_dev *);
156#else /* CONFIG_HOTPLUG_PCI_S390 */
157static inline int zpci_init_slot(struct zpci_dev *zdev)
158{
159 return 0;
160}
161static inline void zpci_exit_slot(struct zpci_dev *zdev) {}
162#endif /* CONFIG_HOTPLUG_PCI_S390 */
163
171/* Helpers */ 164/* Helpers */
172struct zpci_dev *get_zdev(struct pci_dev *); 165struct zpci_dev *get_zdev(struct pci_dev *);
173struct zpci_dev *get_zdev_by_fid(u32); 166struct zpci_dev *get_zdev_by_fid(u32);
174bool zpci_fid_present(u32);
175 167
176/* sysfs */ 168/* sysfs */
177int zpci_sysfs_add_device(struct device *); 169int zpci_sysfs_add_device(struct device *);
@@ -181,14 +173,6 @@ void zpci_sysfs_remove_device(struct device *);
181int zpci_dma_init(void); 173int zpci_dma_init(void);
182void zpci_dma_exit(void); 174void zpci_dma_exit(void);
183 175
184/* Hotplug */
185extern struct mutex zpci_list_lock;
186extern struct list_head zpci_list;
187extern unsigned int s390_pci_probe;
188
189void zpci_register_hp_ops(struct pci_hp_callback_ops *);
190void zpci_deregister_hp_ops(void);
191
192/* FMB */ 176/* FMB */
193int zpci_fmb_enable_device(struct zpci_dev *); 177int zpci_fmb_enable_device(struct zpci_dev *);
194int zpci_fmb_disable_device(struct zpci_dev *); 178int zpci_fmb_disable_device(struct zpci_dev *);
diff --git a/arch/s390/include/asm/pci_insn.h b/arch/s390/include/asm/pci_insn.h
index e6a2bdd4d705..df6eac9f0cb4 100644
--- a/arch/s390/include/asm/pci_insn.h
+++ b/arch/s390/include/asm/pci_insn.h
@@ -79,11 +79,11 @@ struct zpci_fib {
79} __packed; 79} __packed;
80 80
81 81
82int s390pci_mod_fc(u64 req, struct zpci_fib *fib); 82int zpci_mod_fc(u64 req, struct zpci_fib *fib);
83int s390pci_refresh_trans(u64 fn, u64 addr, u64 range); 83int zpci_refresh_trans(u64 fn, u64 addr, u64 range);
84int s390pci_load(u64 *data, u64 req, u64 offset); 84int zpci_load(u64 *data, u64 req, u64 offset);
85int s390pci_store(u64 data, u64 req, u64 offset); 85int zpci_store(u64 data, u64 req, u64 offset);
86int s390pci_store_block(const u64 *data, u64 req, u64 offset); 86int zpci_store_block(const u64 *data, u64 req, u64 offset);
87void set_irq_ctrl(u16 ctl, char *unused, u8 isc); 87void zpci_set_irq_ctrl(u16 ctl, char *unused, u8 isc);
88 88
89#endif 89#endif
diff --git a/arch/s390/include/asm/pci_io.h b/arch/s390/include/asm/pci_io.h
index 83a9caa6ae53..d194d544d694 100644
--- a/arch/s390/include/asm/pci_io.h
+++ b/arch/s390/include/asm/pci_io.h
@@ -36,7 +36,7 @@ static inline RETTYPE zpci_read_##RETTYPE(const volatile void __iomem *addr) \
36 u64 data; \ 36 u64 data; \
37 int rc; \ 37 int rc; \
38 \ 38 \
39 rc = s390pci_load(&data, req, ZPCI_OFFSET(addr)); \ 39 rc = zpci_load(&data, req, ZPCI_OFFSET(addr)); \
40 if (rc) \ 40 if (rc) \
41 data = -1ULL; \ 41 data = -1ULL; \
42 return (RETTYPE) data; \ 42 return (RETTYPE) data; \
@@ -50,7 +50,7 @@ static inline void zpci_write_##VALTYPE(VALTYPE val, \
50 u64 req = ZPCI_CREATE_REQ(entry->fh, entry->bar, LENGTH); \ 50 u64 req = ZPCI_CREATE_REQ(entry->fh, entry->bar, LENGTH); \
51 u64 data = (VALTYPE) val; \ 51 u64 data = (VALTYPE) val; \
52 \ 52 \
53 s390pci_store(data, req, ZPCI_OFFSET(addr)); \ 53 zpci_store(data, req, ZPCI_OFFSET(addr)); \
54} 54}
55 55
56zpci_read(8, u64) 56zpci_read(8, u64)
@@ -83,7 +83,7 @@ static inline int zpci_write_single(u64 req, const u64 *data, u64 offset, u8 len
83 val = 0; /* let FW report error */ 83 val = 0; /* let FW report error */
84 break; 84 break;
85 } 85 }
86 return s390pci_store(val, req, offset); 86 return zpci_store(val, req, offset);
87} 87}
88 88
89static inline int zpci_read_single(u64 req, u64 *dst, u64 offset, u8 len) 89static inline int zpci_read_single(u64 req, u64 *dst, u64 offset, u8 len)
@@ -91,7 +91,7 @@ static inline int zpci_read_single(u64 req, u64 *dst, u64 offset, u8 len)
91 u64 data; 91 u64 data;
92 int cc; 92 int cc;
93 93
94 cc = s390pci_load(&data, req, offset); 94 cc = zpci_load(&data, req, offset);
95 if (cc) 95 if (cc)
96 goto out; 96 goto out;
97 97
@@ -115,7 +115,7 @@ out:
115 115
116static inline int zpci_write_block(u64 req, const u64 *data, u64 offset) 116static inline int zpci_write_block(u64 req, const u64 *data, u64 offset)
117{ 117{
118 return s390pci_store_block(data, req, offset); 118 return zpci_store_block(data, req, offset);
119} 119}
120 120
121static inline u8 zpci_get_max_write_size(u64 src, u64 dst, int len, int max) 121static inline u8 zpci_get_max_write_size(u64 src, u64 dst, int len, int max)
diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h
index 75fb726de91f..9b60a36c348d 100644
--- a/arch/s390/include/asm/pgtable.h
+++ b/arch/s390/include/asm/pgtable.h
@@ -217,63 +217,57 @@ extern unsigned long MODULES_END;
217 217
218/* Hardware bits in the page table entry */ 218/* Hardware bits in the page table entry */
219#define _PAGE_CO 0x100 /* HW Change-bit override */ 219#define _PAGE_CO 0x100 /* HW Change-bit override */
220#define _PAGE_RO 0x200 /* HW read-only bit */ 220#define _PAGE_PROTECT 0x200 /* HW read-only bit */
221#define _PAGE_INVALID 0x400 /* HW invalid bit */ 221#define _PAGE_INVALID 0x400 /* HW invalid bit */
222#define _PAGE_LARGE 0x800 /* Bit to mark a large pte */
222 223
223/* Software bits in the page table entry */ 224/* Software bits in the page table entry */
224#define _PAGE_SWT 0x001 /* SW pte type bit t */ 225#define _PAGE_PRESENT 0x001 /* SW pte present bit */
225#define _PAGE_SWX 0x002 /* SW pte type bit x */ 226#define _PAGE_TYPE 0x002 /* SW pte type bit */
226#define _PAGE_SWC 0x004 /* SW pte changed bit */ 227#define _PAGE_YOUNG 0x004 /* SW pte young bit */
227#define _PAGE_SWR 0x008 /* SW pte referenced bit */ 228#define _PAGE_DIRTY 0x008 /* SW pte dirty bit */
228#define _PAGE_SWW 0x010 /* SW pte write bit */ 229#define _PAGE_READ 0x010 /* SW pte read bit */
229#define _PAGE_SPECIAL 0x020 /* SW associated with special page */ 230#define _PAGE_WRITE 0x020 /* SW pte write bit */
231#define _PAGE_SPECIAL 0x040 /* SW associated with special page */
230#define __HAVE_ARCH_PTE_SPECIAL 232#define __HAVE_ARCH_PTE_SPECIAL
231 233
232/* Set of bits not changed in pte_modify */ 234/* Set of bits not changed in pte_modify */
233#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_SPECIAL | _PAGE_CO | \ 235#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_SPECIAL | _PAGE_CO | \
234 _PAGE_SWC | _PAGE_SWR) 236 _PAGE_DIRTY | _PAGE_YOUNG)
235
236/* Six different types of pages. */
237#define _PAGE_TYPE_EMPTY 0x400
238#define _PAGE_TYPE_NONE 0x401
239#define _PAGE_TYPE_SWAP 0x403
240#define _PAGE_TYPE_FILE 0x601 /* bit 0x002 is used for offset !! */
241#define _PAGE_TYPE_RO 0x200
242#define _PAGE_TYPE_RW 0x000
243
244/*
245 * Only four types for huge pages, using the invalid bit and protection bit
246 * of a segment table entry.
247 */
248#define _HPAGE_TYPE_EMPTY 0x020 /* _SEGMENT_ENTRY_INV */
249#define _HPAGE_TYPE_NONE 0x220
250#define _HPAGE_TYPE_RO 0x200 /* _SEGMENT_ENTRY_RO */
251#define _HPAGE_TYPE_RW 0x000
252 237
253/* 238/*
254 * PTE type bits are rather complicated. handle_pte_fault uses pte_present, 239 * handle_pte_fault uses pte_present, pte_none and pte_file to find out the
255 * pte_none and pte_file to find out the pte type WITHOUT holding the page 240 * pte type WITHOUT holding the page table lock. The _PAGE_PRESENT bit
256 * table lock. ptep_clear_flush on the other hand uses ptep_clear_flush to 241 * is used to distinguish present from not-present ptes. It is changed only
257 * invalidate a given pte. ipte sets the hw invalid bit and clears all tlbs 242 * with the page table lock held.
258 * for the page. The page table entry is set to _PAGE_TYPE_EMPTY afterwards. 243 *
259 * This change is done while holding the lock, but the intermediate step 244 * The following table gives the different possible bit combinations for
260 * of a previously valid pte with the hw invalid bit set can be observed by 245 * the pte hardware and software bits in the last 12 bits of a pte:
261 * handle_pte_fault. That makes it necessary that all valid pte types with
262 * the hw invalid bit set must be distinguishable from the four pte types
263 * empty, none, swap and file.
264 * 246 *
265 * irxt ipte irxt 247 * 842100000000
266 * _PAGE_TYPE_EMPTY 1000 -> 1000 248 * 000084210000
267 * _PAGE_TYPE_NONE 1001 -> 1001 249 * 000000008421
268 * _PAGE_TYPE_SWAP 1011 -> 1011 250 * .IR...wrdytp
269 * _PAGE_TYPE_FILE 11?1 -> 11?1 251 * empty .10...000000
270 * _PAGE_TYPE_RO 0100 -> 1100 252 * swap .10...xxxx10
271 * _PAGE_TYPE_RW 0000 -> 1000 253 * file .11...xxxxx0
254 * prot-none, clean, old .11...000001
255 * prot-none, clean, young .11...000101
256 * prot-none, dirty, old .10...001001
257 * prot-none, dirty, young .10...001101
258 * read-only, clean, old .11...010001
259 * read-only, clean, young .01...010101
260 * read-only, dirty, old .11...011001
261 * read-only, dirty, young .01...011101
262 * read-write, clean, old .11...110001
263 * read-write, clean, young .01...110101
264 * read-write, dirty, old .10...111001
265 * read-write, dirty, young .00...111101
272 * 266 *
273 * pte_none is true for bits combinations 1000, 1010, 1100, 1110 267 * pte_present is true for the bit pattern .xx...xxxxx1, (pte & 0x001) == 0x001
274 * pte_present is true for bits combinations 0000, 0010, 0100, 0110, 1001 268 * pte_none is true for the bit pattern .10...xxxx00, (pte & 0x603) == 0x400
275 * pte_file is true for bits combinations 1101, 1111 269 * pte_file is true for the bit pattern .11...xxxxx0, (pte & 0x601) == 0x600
276 * swap pte is 1011 and 0001, 0011, 0101, 0111 are invalid. 270 * pte_swap is true for the bit pattern .10...xxxx10, (pte & 0x603) == 0x402
277 */ 271 */
278 272
279#ifndef CONFIG_64BIT 273#ifndef CONFIG_64BIT
@@ -286,14 +280,25 @@ extern unsigned long MODULES_END;
286#define _ASCE_TABLE_LENGTH 0x7f /* 128 x 64 entries = 8k */ 280#define _ASCE_TABLE_LENGTH 0x7f /* 128 x 64 entries = 8k */
287 281
288/* Bits in the segment table entry */ 282/* Bits in the segment table entry */
283#define _SEGMENT_ENTRY_BITS 0x7fffffffUL /* Valid segment table bits */
289#define _SEGMENT_ENTRY_ORIGIN 0x7fffffc0UL /* page table origin */ 284#define _SEGMENT_ENTRY_ORIGIN 0x7fffffc0UL /* page table origin */
290#define _SEGMENT_ENTRY_RO 0x200 /* page protection bit */ 285#define _SEGMENT_ENTRY_PROTECT 0x200 /* page protection bit */
291#define _SEGMENT_ENTRY_INV 0x20 /* invalid segment table entry */ 286#define _SEGMENT_ENTRY_INVALID 0x20 /* invalid segment table entry */
292#define _SEGMENT_ENTRY_COMMON 0x10 /* common segment bit */ 287#define _SEGMENT_ENTRY_COMMON 0x10 /* common segment bit */
293#define _SEGMENT_ENTRY_PTL 0x0f /* page table length */ 288#define _SEGMENT_ENTRY_PTL 0x0f /* page table length */
289#define _SEGMENT_ENTRY_NONE _SEGMENT_ENTRY_PROTECT
294 290
295#define _SEGMENT_ENTRY (_SEGMENT_ENTRY_PTL) 291#define _SEGMENT_ENTRY (_SEGMENT_ENTRY_PTL)
296#define _SEGMENT_ENTRY_EMPTY (_SEGMENT_ENTRY_INV) 292#define _SEGMENT_ENTRY_EMPTY (_SEGMENT_ENTRY_INVALID)
293
294/*
295 * Segment table entry encoding (I = invalid, R = read-only bit):
296 * ..R...I.....
297 * prot-none ..1...1.....
298 * read-only ..1...0.....
299 * read-write ..0...0.....
300 * empty ..0...1.....
301 */
297 302
298/* Page status table bits for virtualization */ 303/* Page status table bits for virtualization */
299#define PGSTE_ACC_BITS 0xf0000000UL 304#define PGSTE_ACC_BITS 0xf0000000UL
@@ -303,9 +308,7 @@ extern unsigned long MODULES_END;
303#define PGSTE_HC_BIT 0x00200000UL 308#define PGSTE_HC_BIT 0x00200000UL
304#define PGSTE_GR_BIT 0x00040000UL 309#define PGSTE_GR_BIT 0x00040000UL
305#define PGSTE_GC_BIT 0x00020000UL 310#define PGSTE_GC_BIT 0x00020000UL
306#define PGSTE_UR_BIT 0x00008000UL 311#define PGSTE_IN_BIT 0x00008000UL /* IPTE notify bit */
307#define PGSTE_UC_BIT 0x00004000UL /* user dirty (migration) */
308#define PGSTE_IN_BIT 0x00002000UL /* IPTE notify bit */
309 312
310#else /* CONFIG_64BIT */ 313#else /* CONFIG_64BIT */
311 314
@@ -324,8 +327,8 @@ extern unsigned long MODULES_END;
324 327
325/* Bits in the region table entry */ 328/* Bits in the region table entry */
326#define _REGION_ENTRY_ORIGIN ~0xfffUL/* region/segment table origin */ 329#define _REGION_ENTRY_ORIGIN ~0xfffUL/* region/segment table origin */
327#define _REGION_ENTRY_RO 0x200 /* region protection bit */ 330#define _REGION_ENTRY_PROTECT 0x200 /* region protection bit */
328#define _REGION_ENTRY_INV 0x20 /* invalid region table entry */ 331#define _REGION_ENTRY_INVALID 0x20 /* invalid region table entry */
329#define _REGION_ENTRY_TYPE_MASK 0x0c /* region/segment table type mask */ 332#define _REGION_ENTRY_TYPE_MASK 0x0c /* region/segment table type mask */
330#define _REGION_ENTRY_TYPE_R1 0x0c /* region first table type */ 333#define _REGION_ENTRY_TYPE_R1 0x0c /* region first table type */
331#define _REGION_ENTRY_TYPE_R2 0x08 /* region second table type */ 334#define _REGION_ENTRY_TYPE_R2 0x08 /* region second table type */
@@ -333,29 +336,47 @@ extern unsigned long MODULES_END;
333#define _REGION_ENTRY_LENGTH 0x03 /* region third length */ 336#define _REGION_ENTRY_LENGTH 0x03 /* region third length */
334 337
335#define _REGION1_ENTRY (_REGION_ENTRY_TYPE_R1 | _REGION_ENTRY_LENGTH) 338#define _REGION1_ENTRY (_REGION_ENTRY_TYPE_R1 | _REGION_ENTRY_LENGTH)
336#define _REGION1_ENTRY_EMPTY (_REGION_ENTRY_TYPE_R1 | _REGION_ENTRY_INV) 339#define _REGION1_ENTRY_EMPTY (_REGION_ENTRY_TYPE_R1 | _REGION_ENTRY_INVALID)
337#define _REGION2_ENTRY (_REGION_ENTRY_TYPE_R2 | _REGION_ENTRY_LENGTH) 340#define _REGION2_ENTRY (_REGION_ENTRY_TYPE_R2 | _REGION_ENTRY_LENGTH)
338#define _REGION2_ENTRY_EMPTY (_REGION_ENTRY_TYPE_R2 | _REGION_ENTRY_INV) 341#define _REGION2_ENTRY_EMPTY (_REGION_ENTRY_TYPE_R2 | _REGION_ENTRY_INVALID)
339#define _REGION3_ENTRY (_REGION_ENTRY_TYPE_R3 | _REGION_ENTRY_LENGTH) 342#define _REGION3_ENTRY (_REGION_ENTRY_TYPE_R3 | _REGION_ENTRY_LENGTH)
340#define _REGION3_ENTRY_EMPTY (_REGION_ENTRY_TYPE_R3 | _REGION_ENTRY_INV) 343#define _REGION3_ENTRY_EMPTY (_REGION_ENTRY_TYPE_R3 | _REGION_ENTRY_INVALID)
341 344
342#define _REGION3_ENTRY_LARGE 0x400 /* RTTE-format control, large page */ 345#define _REGION3_ENTRY_LARGE 0x400 /* RTTE-format control, large page */
343#define _REGION3_ENTRY_RO 0x200 /* page protection bit */ 346#define _REGION3_ENTRY_RO 0x200 /* page protection bit */
344#define _REGION3_ENTRY_CO 0x100 /* change-recording override */ 347#define _REGION3_ENTRY_CO 0x100 /* change-recording override */
345 348
346/* Bits in the segment table entry */ 349/* Bits in the segment table entry */
350#define _SEGMENT_ENTRY_BITS 0xfffffffffffffe33UL
351#define _SEGMENT_ENTRY_BITS_LARGE 0xfffffffffff1ff33UL
347#define _SEGMENT_ENTRY_ORIGIN_LARGE ~0xfffffUL /* large page address */ 352#define _SEGMENT_ENTRY_ORIGIN_LARGE ~0xfffffUL /* large page address */
348#define _SEGMENT_ENTRY_ORIGIN ~0x7ffUL/* segment table origin */ 353#define _SEGMENT_ENTRY_ORIGIN ~0x7ffUL/* segment table origin */
349#define _SEGMENT_ENTRY_RO 0x200 /* page protection bit */ 354#define _SEGMENT_ENTRY_PROTECT 0x200 /* page protection bit */
350#define _SEGMENT_ENTRY_INV 0x20 /* invalid segment table entry */ 355#define _SEGMENT_ENTRY_INVALID 0x20 /* invalid segment table entry */
351 356
352#define _SEGMENT_ENTRY (0) 357#define _SEGMENT_ENTRY (0)
353#define _SEGMENT_ENTRY_EMPTY (_SEGMENT_ENTRY_INV) 358#define _SEGMENT_ENTRY_EMPTY (_SEGMENT_ENTRY_INVALID)
354 359
355#define _SEGMENT_ENTRY_LARGE 0x400 /* STE-format control, large page */ 360#define _SEGMENT_ENTRY_LARGE 0x400 /* STE-format control, large page */
356#define _SEGMENT_ENTRY_CO 0x100 /* change-recording override */ 361#define _SEGMENT_ENTRY_CO 0x100 /* change-recording override */
362#define _SEGMENT_ENTRY_SPLIT 0x001 /* THP splitting bit */
363#define _SEGMENT_ENTRY_YOUNG 0x002 /* SW segment young bit */
364#define _SEGMENT_ENTRY_NONE _SEGMENT_ENTRY_YOUNG
365
366/*
367 * Segment table entry encoding (R = read-only, I = invalid, y = young bit):
368 * ..R...I...y.
369 * prot-none, old ..0...1...1.
370 * prot-none, young ..1...1...1.
371 * read-only, old ..1...1...0.
372 * read-only, young ..1...0...1.
373 * read-write, old ..0...1...0.
374 * read-write, young ..0...0...1.
375 * The segment table origin is used to distinguish empty (origin==0) from
376 * read-write, old segment table entries (origin!=0)
377 */
378
357#define _SEGMENT_ENTRY_SPLIT_BIT 0 /* THP splitting bit number */ 379#define _SEGMENT_ENTRY_SPLIT_BIT 0 /* THP splitting bit number */
358#define _SEGMENT_ENTRY_SPLIT (1UL << _SEGMENT_ENTRY_SPLIT_BIT)
359 380
360/* Set of bits not changed in pmd_modify */ 381/* Set of bits not changed in pmd_modify */
361#define _SEGMENT_CHG_MASK (_SEGMENT_ENTRY_ORIGIN | _SEGMENT_ENTRY_LARGE \ 382#define _SEGMENT_CHG_MASK (_SEGMENT_ENTRY_ORIGIN | _SEGMENT_ENTRY_LARGE \
@@ -369,9 +390,7 @@ extern unsigned long MODULES_END;
369#define PGSTE_HC_BIT 0x0020000000000000UL 390#define PGSTE_HC_BIT 0x0020000000000000UL
370#define PGSTE_GR_BIT 0x0004000000000000UL 391#define PGSTE_GR_BIT 0x0004000000000000UL
371#define PGSTE_GC_BIT 0x0002000000000000UL 392#define PGSTE_GC_BIT 0x0002000000000000UL
372#define PGSTE_UR_BIT 0x0000800000000000UL 393#define PGSTE_IN_BIT 0x0000800000000000UL /* IPTE notify bit */
373#define PGSTE_UC_BIT 0x0000400000000000UL /* user dirty (migration) */
374#define PGSTE_IN_BIT 0x0000200000000000UL /* IPTE notify bit */
375 394
376#endif /* CONFIG_64BIT */ 395#endif /* CONFIG_64BIT */
377 396
@@ -386,14 +405,18 @@ extern unsigned long MODULES_END;
386/* 405/*
387 * Page protection definitions. 406 * Page protection definitions.
388 */ 407 */
389#define PAGE_NONE __pgprot(_PAGE_TYPE_NONE) 408#define PAGE_NONE __pgprot(_PAGE_PRESENT | _PAGE_INVALID)
390#define PAGE_RO __pgprot(_PAGE_TYPE_RO) 409#define PAGE_READ __pgprot(_PAGE_PRESENT | _PAGE_READ | \
391#define PAGE_RW __pgprot(_PAGE_TYPE_RO | _PAGE_SWW) 410 _PAGE_INVALID | _PAGE_PROTECT)
392#define PAGE_RWC __pgprot(_PAGE_TYPE_RW | _PAGE_SWW | _PAGE_SWC) 411#define PAGE_WRITE __pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \
393 412 _PAGE_INVALID | _PAGE_PROTECT)
394#define PAGE_KERNEL PAGE_RWC 413
395#define PAGE_SHARED PAGE_KERNEL 414#define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \
396#define PAGE_COPY PAGE_RO 415 _PAGE_YOUNG | _PAGE_DIRTY)
416#define PAGE_KERNEL __pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_WRITE | \
417 _PAGE_YOUNG | _PAGE_DIRTY)
418#define PAGE_KERNEL_RO __pgprot(_PAGE_PRESENT | _PAGE_READ | _PAGE_YOUNG | \
419 _PAGE_PROTECT)
397 420
398/* 421/*
399 * On s390 the page table entry has an invalid bit and a read-only bit. 422 * On s390 the page table entry has an invalid bit and a read-only bit.
@@ -402,35 +425,31 @@ extern unsigned long MODULES_END;
402 */ 425 */
403 /*xwr*/ 426 /*xwr*/
404#define __P000 PAGE_NONE 427#define __P000 PAGE_NONE
405#define __P001 PAGE_RO 428#define __P001 PAGE_READ
406#define __P010 PAGE_RO 429#define __P010 PAGE_READ
407#define __P011 PAGE_RO 430#define __P011 PAGE_READ
408#define __P100 PAGE_RO 431#define __P100 PAGE_READ
409#define __P101 PAGE_RO 432#define __P101 PAGE_READ
410#define __P110 PAGE_RO 433#define __P110 PAGE_READ
411#define __P111 PAGE_RO 434#define __P111 PAGE_READ
412 435
413#define __S000 PAGE_NONE 436#define __S000 PAGE_NONE
414#define __S001 PAGE_RO 437#define __S001 PAGE_READ
415#define __S010 PAGE_RW 438#define __S010 PAGE_WRITE
416#define __S011 PAGE_RW 439#define __S011 PAGE_WRITE
417#define __S100 PAGE_RO 440#define __S100 PAGE_READ
418#define __S101 PAGE_RO 441#define __S101 PAGE_READ
419#define __S110 PAGE_RW 442#define __S110 PAGE_WRITE
420#define __S111 PAGE_RW 443#define __S111 PAGE_WRITE
421 444
422/* 445/*
423 * Segment entry (large page) protection definitions. 446 * Segment entry (large page) protection definitions.
424 */ 447 */
425#define SEGMENT_NONE __pgprot(_HPAGE_TYPE_NONE) 448#define SEGMENT_NONE __pgprot(_SEGMENT_ENTRY_INVALID | \
426#define SEGMENT_RO __pgprot(_HPAGE_TYPE_RO) 449 _SEGMENT_ENTRY_NONE)
427#define SEGMENT_RW __pgprot(_HPAGE_TYPE_RW) 450#define SEGMENT_READ __pgprot(_SEGMENT_ENTRY_INVALID | \
428 451 _SEGMENT_ENTRY_PROTECT)
429static inline int mm_exclusive(struct mm_struct *mm) 452#define SEGMENT_WRITE __pgprot(_SEGMENT_ENTRY_INVALID)
430{
431 return likely(mm == current->active_mm &&
432 atomic_read(&mm->context.attach_count) <= 1);
433}
434 453
435static inline int mm_has_pgste(struct mm_struct *mm) 454static inline int mm_has_pgste(struct mm_struct *mm)
436{ 455{
@@ -467,7 +486,7 @@ static inline int pgd_none(pgd_t pgd)
467{ 486{
468 if ((pgd_val(pgd) & _REGION_ENTRY_TYPE_MASK) < _REGION_ENTRY_TYPE_R2) 487 if ((pgd_val(pgd) & _REGION_ENTRY_TYPE_MASK) < _REGION_ENTRY_TYPE_R2)
469 return 0; 488 return 0;
470 return (pgd_val(pgd) & _REGION_ENTRY_INV) != 0UL; 489 return (pgd_val(pgd) & _REGION_ENTRY_INVALID) != 0UL;
471} 490}
472 491
473static inline int pgd_bad(pgd_t pgd) 492static inline int pgd_bad(pgd_t pgd)
@@ -478,7 +497,7 @@ static inline int pgd_bad(pgd_t pgd)
478 * invalid for either table entry. 497 * invalid for either table entry.
479 */ 498 */
480 unsigned long mask = 499 unsigned long mask =
481 ~_SEGMENT_ENTRY_ORIGIN & ~_REGION_ENTRY_INV & 500 ~_SEGMENT_ENTRY_ORIGIN & ~_REGION_ENTRY_INVALID &
482 ~_REGION_ENTRY_TYPE_MASK & ~_REGION_ENTRY_LENGTH; 501 ~_REGION_ENTRY_TYPE_MASK & ~_REGION_ENTRY_LENGTH;
483 return (pgd_val(pgd) & mask) != 0; 502 return (pgd_val(pgd) & mask) != 0;
484} 503}
@@ -494,7 +513,7 @@ static inline int pud_none(pud_t pud)
494{ 513{
495 if ((pud_val(pud) & _REGION_ENTRY_TYPE_MASK) < _REGION_ENTRY_TYPE_R3) 514 if ((pud_val(pud) & _REGION_ENTRY_TYPE_MASK) < _REGION_ENTRY_TYPE_R3)
496 return 0; 515 return 0;
497 return (pud_val(pud) & _REGION_ENTRY_INV) != 0UL; 516 return (pud_val(pud) & _REGION_ENTRY_INVALID) != 0UL;
498} 517}
499 518
500static inline int pud_large(pud_t pud) 519static inline int pud_large(pud_t pud)
@@ -512,7 +531,7 @@ static inline int pud_bad(pud_t pud)
512 * invalid for either table entry. 531 * invalid for either table entry.
513 */ 532 */
514 unsigned long mask = 533 unsigned long mask =
515 ~_SEGMENT_ENTRY_ORIGIN & ~_REGION_ENTRY_INV & 534 ~_SEGMENT_ENTRY_ORIGIN & ~_REGION_ENTRY_INVALID &
516 ~_REGION_ENTRY_TYPE_MASK & ~_REGION_ENTRY_LENGTH; 535 ~_REGION_ENTRY_TYPE_MASK & ~_REGION_ENTRY_LENGTH;
517 return (pud_val(pud) & mask) != 0; 536 return (pud_val(pud) & mask) != 0;
518} 537}
@@ -521,30 +540,36 @@ static inline int pud_bad(pud_t pud)
521 540
522static inline int pmd_present(pmd_t pmd) 541static inline int pmd_present(pmd_t pmd)
523{ 542{
524 unsigned long mask = _SEGMENT_ENTRY_INV | _SEGMENT_ENTRY_RO; 543 return pmd_val(pmd) != _SEGMENT_ENTRY_INVALID;
525 return (pmd_val(pmd) & mask) == _HPAGE_TYPE_NONE ||
526 !(pmd_val(pmd) & _SEGMENT_ENTRY_INV);
527} 544}
528 545
529static inline int pmd_none(pmd_t pmd) 546static inline int pmd_none(pmd_t pmd)
530{ 547{
531 return (pmd_val(pmd) & _SEGMENT_ENTRY_INV) && 548 return pmd_val(pmd) == _SEGMENT_ENTRY_INVALID;
532 !(pmd_val(pmd) & _SEGMENT_ENTRY_RO);
533} 549}
534 550
535static inline int pmd_large(pmd_t pmd) 551static inline int pmd_large(pmd_t pmd)
536{ 552{
537#ifdef CONFIG_64BIT 553#ifdef CONFIG_64BIT
538 return !!(pmd_val(pmd) & _SEGMENT_ENTRY_LARGE); 554 return (pmd_val(pmd) & _SEGMENT_ENTRY_LARGE) != 0;
539#else 555#else
540 return 0; 556 return 0;
541#endif 557#endif
542} 558}
543 559
560static inline int pmd_prot_none(pmd_t pmd)
561{
562 return (pmd_val(pmd) & _SEGMENT_ENTRY_INVALID) &&
563 (pmd_val(pmd) & _SEGMENT_ENTRY_NONE);
564}
565
544static inline int pmd_bad(pmd_t pmd) 566static inline int pmd_bad(pmd_t pmd)
545{ 567{
546 unsigned long mask = ~_SEGMENT_ENTRY_ORIGIN & ~_SEGMENT_ENTRY_INV; 568#ifdef CONFIG_64BIT
547 return (pmd_val(pmd) & mask) != _SEGMENT_ENTRY; 569 if (pmd_large(pmd))
570 return (pmd_val(pmd) & ~_SEGMENT_ENTRY_BITS_LARGE) != 0;
571#endif
572 return (pmd_val(pmd) & ~_SEGMENT_ENTRY_BITS) != 0;
548} 573}
549 574
550#define __HAVE_ARCH_PMDP_SPLITTING_FLUSH 575#define __HAVE_ARCH_PMDP_SPLITTING_FLUSH
@@ -563,31 +588,40 @@ extern int pmdp_clear_flush_young(struct vm_area_struct *vma,
563#define __HAVE_ARCH_PMD_WRITE 588#define __HAVE_ARCH_PMD_WRITE
564static inline int pmd_write(pmd_t pmd) 589static inline int pmd_write(pmd_t pmd)
565{ 590{
566 return (pmd_val(pmd) & _SEGMENT_ENTRY_RO) == 0; 591 if (pmd_prot_none(pmd))
592 return 0;
593 return (pmd_val(pmd) & _SEGMENT_ENTRY_PROTECT) == 0;
567} 594}
568 595
569static inline int pmd_young(pmd_t pmd) 596static inline int pmd_young(pmd_t pmd)
570{ 597{
571 return 0; 598 int young = 0;
599#ifdef CONFIG_64BIT
600 if (pmd_prot_none(pmd))
601 young = (pmd_val(pmd) & _SEGMENT_ENTRY_PROTECT) != 0;
602 else
603 young = (pmd_val(pmd) & _SEGMENT_ENTRY_YOUNG) != 0;
604#endif
605 return young;
572} 606}
573 607
574static inline int pte_none(pte_t pte) 608static inline int pte_present(pte_t pte)
575{ 609{
576 return (pte_val(pte) & _PAGE_INVALID) && !(pte_val(pte) & _PAGE_SWT); 610 /* Bit pattern: (pte & 0x001) == 0x001 */
611 return (pte_val(pte) & _PAGE_PRESENT) != 0;
577} 612}
578 613
579static inline int pte_present(pte_t pte) 614static inline int pte_none(pte_t pte)
580{ 615{
581 unsigned long mask = _PAGE_RO | _PAGE_INVALID | _PAGE_SWT | _PAGE_SWX; 616 /* Bit pattern: pte == 0x400 */
582 return (pte_val(pte) & mask) == _PAGE_TYPE_NONE || 617 return pte_val(pte) == _PAGE_INVALID;
583 (!(pte_val(pte) & _PAGE_INVALID) &&
584 !(pte_val(pte) & _PAGE_SWT));
585} 618}
586 619
587static inline int pte_file(pte_t pte) 620static inline int pte_file(pte_t pte)
588{ 621{
589 unsigned long mask = _PAGE_RO | _PAGE_INVALID | _PAGE_SWT; 622 /* Bit pattern: (pte & 0x601) == 0x600 */
590 return (pte_val(pte) & mask) == _PAGE_TYPE_FILE; 623 return (pte_val(pte) & (_PAGE_INVALID | _PAGE_PROTECT | _PAGE_PRESENT))
624 == (_PAGE_INVALID | _PAGE_PROTECT);
591} 625}
592 626
593static inline int pte_special(pte_t pte) 627static inline int pte_special(pte_t pte)
@@ -634,6 +668,15 @@ static inline void pgste_set_unlock(pte_t *ptep, pgste_t pgste)
634#endif 668#endif
635} 669}
636 670
671static inline pgste_t pgste_get(pte_t *ptep)
672{
673 unsigned long pgste = 0;
674#ifdef CONFIG_PGSTE
675 pgste = *(unsigned long *)(ptep + PTRS_PER_PTE);
676#endif
677 return __pgste(pgste);
678}
679
637static inline void pgste_set(pte_t *ptep, pgste_t pgste) 680static inline void pgste_set(pte_t *ptep, pgste_t pgste)
638{ 681{
639#ifdef CONFIG_PGSTE 682#ifdef CONFIG_PGSTE
@@ -644,33 +687,28 @@ static inline void pgste_set(pte_t *ptep, pgste_t pgste)
644static inline pgste_t pgste_update_all(pte_t *ptep, pgste_t pgste) 687static inline pgste_t pgste_update_all(pte_t *ptep, pgste_t pgste)
645{ 688{
646#ifdef CONFIG_PGSTE 689#ifdef CONFIG_PGSTE
647 unsigned long address, bits; 690 unsigned long address, bits, skey;
648 unsigned char skey;
649 691
650 if (pte_val(*ptep) & _PAGE_INVALID) 692 if (pte_val(*ptep) & _PAGE_INVALID)
651 return pgste; 693 return pgste;
652 address = pte_val(*ptep) & PAGE_MASK; 694 address = pte_val(*ptep) & PAGE_MASK;
653 skey = page_get_storage_key(address); 695 skey = (unsigned long) page_get_storage_key(address);
654 bits = skey & (_PAGE_CHANGED | _PAGE_REFERENCED); 696 bits = skey & (_PAGE_CHANGED | _PAGE_REFERENCED);
655 /* Clear page changed & referenced bit in the storage key */ 697 if (!(pgste_val(pgste) & PGSTE_HC_BIT) && (bits & _PAGE_CHANGED)) {
656 if (bits & _PAGE_CHANGED) 698 /* Transfer dirty + referenced bit to host bits in pgste */
699 pgste_val(pgste) |= bits << 52;
657 page_set_storage_key(address, skey ^ bits, 0); 700 page_set_storage_key(address, skey ^ bits, 0);
658 else if (bits) 701 } else if (!(pgste_val(pgste) & PGSTE_HR_BIT) &&
702 (bits & _PAGE_REFERENCED)) {
703 /* Transfer referenced bit to host bit in pgste */
704 pgste_val(pgste) |= PGSTE_HR_BIT;
659 page_reset_referenced(address); 705 page_reset_referenced(address);
706 }
660 /* Transfer page changed & referenced bit to guest bits in pgste */ 707 /* Transfer page changed & referenced bit to guest bits in pgste */
661 pgste_val(pgste) |= bits << 48; /* GR bit & GC bit */ 708 pgste_val(pgste) |= bits << 48; /* GR bit & GC bit */
662 /* Get host changed & referenced bits from pgste */
663 bits |= (pgste_val(pgste) & (PGSTE_HR_BIT | PGSTE_HC_BIT)) >> 52;
664 /* Transfer page changed & referenced bit to kvm user bits */
665 pgste_val(pgste) |= bits << 45; /* PGSTE_UR_BIT & PGSTE_UC_BIT */
666 /* Clear relevant host bits in pgste. */
667 pgste_val(pgste) &= ~(PGSTE_HR_BIT | PGSTE_HC_BIT);
668 pgste_val(pgste) &= ~(PGSTE_ACC_BITS | PGSTE_FP_BIT);
669 /* Copy page access key and fetch protection bit to pgste */ 709 /* Copy page access key and fetch protection bit to pgste */
670 pgste_val(pgste) |= 710 pgste_val(pgste) &= ~(PGSTE_ACC_BITS | PGSTE_FP_BIT);
671 (unsigned long) (skey & (_PAGE_ACC_BITS | _PAGE_FP_BIT)) << 56; 711 pgste_val(pgste) |= (skey & (_PAGE_ACC_BITS | _PAGE_FP_BIT)) << 56;
672 /* Transfer referenced bit to pte */
673 pte_val(*ptep) |= (bits & _PAGE_REFERENCED) << 1;
674#endif 712#endif
675 return pgste; 713 return pgste;
676 714
@@ -679,24 +717,11 @@ static inline pgste_t pgste_update_all(pte_t *ptep, pgste_t pgste)
679static inline pgste_t pgste_update_young(pte_t *ptep, pgste_t pgste) 717static inline pgste_t pgste_update_young(pte_t *ptep, pgste_t pgste)
680{ 718{
681#ifdef CONFIG_PGSTE 719#ifdef CONFIG_PGSTE
682 int young;
683
684 if (pte_val(*ptep) & _PAGE_INVALID) 720 if (pte_val(*ptep) & _PAGE_INVALID)
685 return pgste; 721 return pgste;
686 /* Get referenced bit from storage key */ 722 /* Get referenced bit from storage key */
687 young = page_reset_referenced(pte_val(*ptep) & PAGE_MASK); 723 if (page_reset_referenced(pte_val(*ptep) & PAGE_MASK))
688 if (young) 724 pgste_val(pgste) |= PGSTE_HR_BIT | PGSTE_GR_BIT;
689 pgste_val(pgste) |= PGSTE_GR_BIT;
690 /* Get host referenced bit from pgste */
691 if (pgste_val(pgste) & PGSTE_HR_BIT) {
692 pgste_val(pgste) &= ~PGSTE_HR_BIT;
693 young = 1;
694 }
695 /* Transfer referenced bit to kvm user bits and pte */
696 if (young) {
697 pgste_val(pgste) |= PGSTE_UR_BIT;
698 pte_val(*ptep) |= _PAGE_SWR;
699 }
700#endif 725#endif
701 return pgste; 726 return pgste;
702} 727}
@@ -723,13 +748,13 @@ static inline void pgste_set_key(pte_t *ptep, pgste_t pgste, pte_t entry)
723 748
724static inline void pgste_set_pte(pte_t *ptep, pte_t entry) 749static inline void pgste_set_pte(pte_t *ptep, pte_t entry)
725{ 750{
726 if (!MACHINE_HAS_ESOP && (pte_val(entry) & _PAGE_SWW)) { 751 if (!MACHINE_HAS_ESOP && (pte_val(entry) & _PAGE_WRITE)) {
727 /* 752 /*
728 * Without enhanced suppression-on-protection force 753 * Without enhanced suppression-on-protection force
729 * the dirty bit on for all writable ptes. 754 * the dirty bit on for all writable ptes.
730 */ 755 */
731 pte_val(entry) |= _PAGE_SWC; 756 pte_val(entry) |= _PAGE_DIRTY;
732 pte_val(entry) &= ~_PAGE_RO; 757 pte_val(entry) &= ~_PAGE_PROTECT;
733 } 758 }
734 *ptep = entry; 759 *ptep = entry;
735} 760}
@@ -841,21 +866,17 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
841 */ 866 */
842static inline int pte_write(pte_t pte) 867static inline int pte_write(pte_t pte)
843{ 868{
844 return (pte_val(pte) & _PAGE_SWW) != 0; 869 return (pte_val(pte) & _PAGE_WRITE) != 0;
845} 870}
846 871
847static inline int pte_dirty(pte_t pte) 872static inline int pte_dirty(pte_t pte)
848{ 873{
849 return (pte_val(pte) & _PAGE_SWC) != 0; 874 return (pte_val(pte) & _PAGE_DIRTY) != 0;
850} 875}
851 876
852static inline int pte_young(pte_t pte) 877static inline int pte_young(pte_t pte)
853{ 878{
854#ifdef CONFIG_PGSTE 879 return (pte_val(pte) & _PAGE_YOUNG) != 0;
855 if (pte_val(pte) & _PAGE_SWR)
856 return 1;
857#endif
858 return 0;
859} 880}
860 881
861/* 882/*
@@ -880,12 +901,12 @@ static inline void pud_clear(pud_t *pud)
880 901
881static inline void pmd_clear(pmd_t *pmdp) 902static inline void pmd_clear(pmd_t *pmdp)
882{ 903{
883 pmd_val(*pmdp) = _SEGMENT_ENTRY_EMPTY; 904 pmd_val(*pmdp) = _SEGMENT_ENTRY_INVALID;
884} 905}
885 906
886static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep) 907static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
887{ 908{
888 pte_val(*ptep) = _PAGE_TYPE_EMPTY; 909 pte_val(*ptep) = _PAGE_INVALID;
889} 910}
890 911
891/* 912/*
@@ -896,55 +917,63 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
896{ 917{
897 pte_val(pte) &= _PAGE_CHG_MASK; 918 pte_val(pte) &= _PAGE_CHG_MASK;
898 pte_val(pte) |= pgprot_val(newprot); 919 pte_val(pte) |= pgprot_val(newprot);
899 if ((pte_val(pte) & _PAGE_SWC) && (pte_val(pte) & _PAGE_SWW)) 920 /*
900 pte_val(pte) &= ~_PAGE_RO; 921 * newprot for PAGE_NONE, PAGE_READ and PAGE_WRITE has the
922 * invalid bit set, clear it again for readable, young pages
923 */
924 if ((pte_val(pte) & _PAGE_YOUNG) && (pte_val(pte) & _PAGE_READ))
925 pte_val(pte) &= ~_PAGE_INVALID;
926 /*
927 * newprot for PAGE_READ and PAGE_WRITE has the page protection
928 * bit set, clear it again for writable, dirty pages
929 */
930 if ((pte_val(pte) & _PAGE_DIRTY) && (pte_val(pte) & _PAGE_WRITE))
931 pte_val(pte) &= ~_PAGE_PROTECT;
901 return pte; 932 return pte;
902} 933}
903 934
904static inline pte_t pte_wrprotect(pte_t pte) 935static inline pte_t pte_wrprotect(pte_t pte)
905{ 936{
906 pte_val(pte) &= ~_PAGE_SWW; 937 pte_val(pte) &= ~_PAGE_WRITE;
907 /* Do not clobber _PAGE_TYPE_NONE pages! */ 938 pte_val(pte) |= _PAGE_PROTECT;
908 if (!(pte_val(pte) & _PAGE_INVALID))
909 pte_val(pte) |= _PAGE_RO;
910 return pte; 939 return pte;
911} 940}
912 941
913static inline pte_t pte_mkwrite(pte_t pte) 942static inline pte_t pte_mkwrite(pte_t pte)
914{ 943{
915 pte_val(pte) |= _PAGE_SWW; 944 pte_val(pte) |= _PAGE_WRITE;
916 if (pte_val(pte) & _PAGE_SWC) 945 if (pte_val(pte) & _PAGE_DIRTY)
917 pte_val(pte) &= ~_PAGE_RO; 946 pte_val(pte) &= ~_PAGE_PROTECT;
918 return pte; 947 return pte;
919} 948}
920 949
921static inline pte_t pte_mkclean(pte_t pte) 950static inline pte_t pte_mkclean(pte_t pte)
922{ 951{
923 pte_val(pte) &= ~_PAGE_SWC; 952 pte_val(pte) &= ~_PAGE_DIRTY;
924 /* Do not clobber _PAGE_TYPE_NONE pages! */ 953 pte_val(pte) |= _PAGE_PROTECT;
925 if (!(pte_val(pte) & _PAGE_INVALID))
926 pte_val(pte) |= _PAGE_RO;
927 return pte; 954 return pte;
928} 955}
929 956
930static inline pte_t pte_mkdirty(pte_t pte) 957static inline pte_t pte_mkdirty(pte_t pte)
931{ 958{
932 pte_val(pte) |= _PAGE_SWC; 959 pte_val(pte) |= _PAGE_DIRTY;
933 if (pte_val(pte) & _PAGE_SWW) 960 if (pte_val(pte) & _PAGE_WRITE)
934 pte_val(pte) &= ~_PAGE_RO; 961 pte_val(pte) &= ~_PAGE_PROTECT;
935 return pte; 962 return pte;
936} 963}
937 964
938static inline pte_t pte_mkold(pte_t pte) 965static inline pte_t pte_mkold(pte_t pte)
939{ 966{
940#ifdef CONFIG_PGSTE 967 pte_val(pte) &= ~_PAGE_YOUNG;
941 pte_val(pte) &= ~_PAGE_SWR; 968 pte_val(pte) |= _PAGE_INVALID;
942#endif
943 return pte; 969 return pte;
944} 970}
945 971
946static inline pte_t pte_mkyoung(pte_t pte) 972static inline pte_t pte_mkyoung(pte_t pte)
947{ 973{
974 pte_val(pte) |= _PAGE_YOUNG;
975 if (pte_val(pte) & _PAGE_READ)
976 pte_val(pte) &= ~_PAGE_INVALID;
948 return pte; 977 return pte;
949} 978}
950 979
@@ -957,7 +986,7 @@ static inline pte_t pte_mkspecial(pte_t pte)
957#ifdef CONFIG_HUGETLB_PAGE 986#ifdef CONFIG_HUGETLB_PAGE
958static inline pte_t pte_mkhuge(pte_t pte) 987static inline pte_t pte_mkhuge(pte_t pte)
959{ 988{
960 pte_val(pte) |= (_SEGMENT_ENTRY_LARGE | _SEGMENT_ENTRY_CO); 989 pte_val(pte) |= _PAGE_LARGE;
961 return pte; 990 return pte;
962} 991}
963#endif 992#endif
@@ -974,8 +1003,8 @@ static inline int ptep_test_and_clear_user_dirty(struct mm_struct *mm,
974 if (mm_has_pgste(mm)) { 1003 if (mm_has_pgste(mm)) {
975 pgste = pgste_get_lock(ptep); 1004 pgste = pgste_get_lock(ptep);
976 pgste = pgste_update_all(ptep, pgste); 1005 pgste = pgste_update_all(ptep, pgste);
977 dirty = !!(pgste_val(pgste) & PGSTE_UC_BIT); 1006 dirty = !!(pgste_val(pgste) & PGSTE_HC_BIT);
978 pgste_val(pgste) &= ~PGSTE_UC_BIT; 1007 pgste_val(pgste) &= ~PGSTE_HC_BIT;
979 pgste_set_unlock(ptep, pgste); 1008 pgste_set_unlock(ptep, pgste);
980 return dirty; 1009 return dirty;
981 } 1010 }
@@ -994,59 +1023,75 @@ static inline int ptep_test_and_clear_user_young(struct mm_struct *mm,
994 if (mm_has_pgste(mm)) { 1023 if (mm_has_pgste(mm)) {
995 pgste = pgste_get_lock(ptep); 1024 pgste = pgste_get_lock(ptep);
996 pgste = pgste_update_young(ptep, pgste); 1025 pgste = pgste_update_young(ptep, pgste);
997 young = !!(pgste_val(pgste) & PGSTE_UR_BIT); 1026 young = !!(pgste_val(pgste) & PGSTE_HR_BIT);
998 pgste_val(pgste) &= ~PGSTE_UR_BIT; 1027 pgste_val(pgste) &= ~PGSTE_HR_BIT;
999 pgste_set_unlock(ptep, pgste); 1028 pgste_set_unlock(ptep, pgste);
1000 } 1029 }
1001 return young; 1030 return young;
1002} 1031}
1003 1032
1033static inline void __ptep_ipte(unsigned long address, pte_t *ptep)
1034{
1035 if (!(pte_val(*ptep) & _PAGE_INVALID)) {
1036#ifndef CONFIG_64BIT
1037 /* pto must point to the start of the segment table */
1038 pte_t *pto = (pte_t *) (((unsigned long) ptep) & 0x7ffffc00);
1039#else
1040 /* ipte in zarch mode can do the math */
1041 pte_t *pto = ptep;
1042#endif
1043 asm volatile(
1044 " ipte %2,%3"
1045 : "=m" (*ptep) : "m" (*ptep),
1046 "a" (pto), "a" (address));
1047 }
1048}
1049
1050static inline void ptep_flush_lazy(struct mm_struct *mm,
1051 unsigned long address, pte_t *ptep)
1052{
1053 int active = (mm == current->active_mm) ? 1 : 0;
1054
1055 if (atomic_read(&mm->context.attach_count) > active)
1056 __ptep_ipte(address, ptep);
1057 else
1058 mm->context.flush_mm = 1;
1059}
1060
1004#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG 1061#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
1005static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, 1062static inline int ptep_test_and_clear_young(struct vm_area_struct *vma,
1006 unsigned long addr, pte_t *ptep) 1063 unsigned long addr, pte_t *ptep)
1007{ 1064{
1008 pgste_t pgste; 1065 pgste_t pgste;
1009 pte_t pte; 1066 pte_t pte;
1067 int young;
1010 1068
1011 if (mm_has_pgste(vma->vm_mm)) { 1069 if (mm_has_pgste(vma->vm_mm)) {
1012 pgste = pgste_get_lock(ptep); 1070 pgste = pgste_get_lock(ptep);
1013 pgste = pgste_update_young(ptep, pgste); 1071 pgste = pgste_ipte_notify(vma->vm_mm, addr, ptep, pgste);
1014 pte = *ptep;
1015 *ptep = pte_mkold(pte);
1016 pgste_set_unlock(ptep, pgste);
1017 return pte_young(pte);
1018 } 1072 }
1019 return 0; 1073
1074 pte = *ptep;
1075 __ptep_ipte(addr, ptep);
1076 young = pte_young(pte);
1077 pte = pte_mkold(pte);
1078
1079 if (mm_has_pgste(vma->vm_mm)) {
1080 pgste_set_pte(ptep, pte);
1081 pgste_set_unlock(ptep, pgste);
1082 } else
1083 *ptep = pte;
1084
1085 return young;
1020} 1086}
1021 1087
1022#define __HAVE_ARCH_PTEP_CLEAR_YOUNG_FLUSH 1088#define __HAVE_ARCH_PTEP_CLEAR_YOUNG_FLUSH
1023static inline int ptep_clear_flush_young(struct vm_area_struct *vma, 1089static inline int ptep_clear_flush_young(struct vm_area_struct *vma,
1024 unsigned long address, pte_t *ptep) 1090 unsigned long address, pte_t *ptep)
1025{ 1091{
1026 /* No need to flush TLB
1027 * On s390 reference bits are in storage key and never in TLB
1028 * With virtualization we handle the reference bit, without we
1029 * we can simply return */
1030 return ptep_test_and_clear_young(vma, address, ptep); 1092 return ptep_test_and_clear_young(vma, address, ptep);
1031} 1093}
1032 1094
1033static inline void __ptep_ipte(unsigned long address, pte_t *ptep)
1034{
1035 if (!(pte_val(*ptep) & _PAGE_INVALID)) {
1036#ifndef CONFIG_64BIT
1037 /* pto must point to the start of the segment table */
1038 pte_t *pto = (pte_t *) (((unsigned long) ptep) & 0x7ffffc00);
1039#else
1040 /* ipte in zarch mode can do the math */
1041 pte_t *pto = ptep;
1042#endif
1043 asm volatile(
1044 " ipte %2,%3"
1045 : "=m" (*ptep) : "m" (*ptep),
1046 "a" (pto), "a" (address));
1047 }
1048}
1049
1050/* 1095/*
1051 * This is hard to understand. ptep_get_and_clear and ptep_clear_flush 1096 * This is hard to understand. ptep_get_and_clear and ptep_clear_flush
1052 * both clear the TLB for the unmapped pte. The reason is that 1097 * both clear the TLB for the unmapped pte. The reason is that
@@ -1067,16 +1112,14 @@ static inline pte_t ptep_get_and_clear(struct mm_struct *mm,
1067 pgste_t pgste; 1112 pgste_t pgste;
1068 pte_t pte; 1113 pte_t pte;
1069 1114
1070 mm->context.flush_mm = 1;
1071 if (mm_has_pgste(mm)) { 1115 if (mm_has_pgste(mm)) {
1072 pgste = pgste_get_lock(ptep); 1116 pgste = pgste_get_lock(ptep);
1073 pgste = pgste_ipte_notify(mm, address, ptep, pgste); 1117 pgste = pgste_ipte_notify(mm, address, ptep, pgste);
1074 } 1118 }
1075 1119
1076 pte = *ptep; 1120 pte = *ptep;
1077 if (!mm_exclusive(mm)) 1121 ptep_flush_lazy(mm, address, ptep);
1078 __ptep_ipte(address, ptep); 1122 pte_val(*ptep) = _PAGE_INVALID;
1079 pte_val(*ptep) = _PAGE_TYPE_EMPTY;
1080 1123
1081 if (mm_has_pgste(mm)) { 1124 if (mm_has_pgste(mm)) {
1082 pgste = pgste_update_all(&pte, pgste); 1125 pgste = pgste_update_all(&pte, pgste);
@@ -1093,15 +1136,14 @@ static inline pte_t ptep_modify_prot_start(struct mm_struct *mm,
1093 pgste_t pgste; 1136 pgste_t pgste;
1094 pte_t pte; 1137 pte_t pte;
1095 1138
1096 mm->context.flush_mm = 1;
1097 if (mm_has_pgste(mm)) { 1139 if (mm_has_pgste(mm)) {
1098 pgste = pgste_get_lock(ptep); 1140 pgste = pgste_get_lock(ptep);
1099 pgste_ipte_notify(mm, address, ptep, pgste); 1141 pgste_ipte_notify(mm, address, ptep, pgste);
1100 } 1142 }
1101 1143
1102 pte = *ptep; 1144 pte = *ptep;
1103 if (!mm_exclusive(mm)) 1145 ptep_flush_lazy(mm, address, ptep);
1104 __ptep_ipte(address, ptep); 1146 pte_val(*ptep) |= _PAGE_INVALID;
1105 1147
1106 if (mm_has_pgste(mm)) { 1148 if (mm_has_pgste(mm)) {
1107 pgste = pgste_update_all(&pte, pgste); 1149 pgste = pgste_update_all(&pte, pgste);
@@ -1117,7 +1159,7 @@ static inline void ptep_modify_prot_commit(struct mm_struct *mm,
1117 pgste_t pgste; 1159 pgste_t pgste;
1118 1160
1119 if (mm_has_pgste(mm)) { 1161 if (mm_has_pgste(mm)) {
1120 pgste = *(pgste_t *)(ptep + PTRS_PER_PTE); 1162 pgste = pgste_get(ptep);
1121 pgste_set_key(ptep, pgste, pte); 1163 pgste_set_key(ptep, pgste, pte);
1122 pgste_set_pte(ptep, pte); 1164 pgste_set_pte(ptep, pte);
1123 pgste_set_unlock(ptep, pgste); 1165 pgste_set_unlock(ptep, pgste);
@@ -1139,7 +1181,7 @@ static inline pte_t ptep_clear_flush(struct vm_area_struct *vma,
1139 1181
1140 pte = *ptep; 1182 pte = *ptep;
1141 __ptep_ipte(address, ptep); 1183 __ptep_ipte(address, ptep);
1142 pte_val(*ptep) = _PAGE_TYPE_EMPTY; 1184 pte_val(*ptep) = _PAGE_INVALID;
1143 1185
1144 if (mm_has_pgste(vma->vm_mm)) { 1186 if (mm_has_pgste(vma->vm_mm)) {
1145 pgste = pgste_update_all(&pte, pgste); 1187 pgste = pgste_update_all(&pte, pgste);
@@ -1163,18 +1205,17 @@ static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm,
1163 pgste_t pgste; 1205 pgste_t pgste;
1164 pte_t pte; 1206 pte_t pte;
1165 1207
1166 if (mm_has_pgste(mm)) { 1208 if (!full && mm_has_pgste(mm)) {
1167 pgste = pgste_get_lock(ptep); 1209 pgste = pgste_get_lock(ptep);
1168 if (!full) 1210 pgste = pgste_ipte_notify(mm, address, ptep, pgste);
1169 pgste = pgste_ipte_notify(mm, address, ptep, pgste);
1170 } 1211 }
1171 1212
1172 pte = *ptep; 1213 pte = *ptep;
1173 if (!full) 1214 if (!full)
1174 __ptep_ipte(address, ptep); 1215 ptep_flush_lazy(mm, address, ptep);
1175 pte_val(*ptep) = _PAGE_TYPE_EMPTY; 1216 pte_val(*ptep) = _PAGE_INVALID;
1176 1217
1177 if (mm_has_pgste(mm)) { 1218 if (!full && mm_has_pgste(mm)) {
1178 pgste = pgste_update_all(&pte, pgste); 1219 pgste = pgste_update_all(&pte, pgste);
1179 pgste_set_unlock(ptep, pgste); 1220 pgste_set_unlock(ptep, pgste);
1180 } 1221 }
@@ -1189,14 +1230,12 @@ static inline pte_t ptep_set_wrprotect(struct mm_struct *mm,
1189 pte_t pte = *ptep; 1230 pte_t pte = *ptep;
1190 1231
1191 if (pte_write(pte)) { 1232 if (pte_write(pte)) {
1192 mm->context.flush_mm = 1;
1193 if (mm_has_pgste(mm)) { 1233 if (mm_has_pgste(mm)) {
1194 pgste = pgste_get_lock(ptep); 1234 pgste = pgste_get_lock(ptep);
1195 pgste = pgste_ipte_notify(mm, address, ptep, pgste); 1235 pgste = pgste_ipte_notify(mm, address, ptep, pgste);
1196 } 1236 }
1197 1237
1198 if (!mm_exclusive(mm)) 1238 ptep_flush_lazy(mm, address, ptep);
1199 __ptep_ipte(address, ptep);
1200 pte = pte_wrprotect(pte); 1239 pte = pte_wrprotect(pte);
1201 1240
1202 if (mm_has_pgste(mm)) { 1241 if (mm_has_pgste(mm)) {
@@ -1240,7 +1279,7 @@ static inline pte_t mk_pte_phys(unsigned long physpage, pgprot_t pgprot)
1240{ 1279{
1241 pte_t __pte; 1280 pte_t __pte;
1242 pte_val(__pte) = physpage + pgprot_val(pgprot); 1281 pte_val(__pte) = physpage + pgprot_val(pgprot);
1243 return __pte; 1282 return pte_mkyoung(__pte);
1244} 1283}
1245 1284
1246static inline pte_t mk_pte(struct page *page, pgprot_t pgprot) 1285static inline pte_t mk_pte(struct page *page, pgprot_t pgprot)
@@ -1248,10 +1287,8 @@ static inline pte_t mk_pte(struct page *page, pgprot_t pgprot)
1248 unsigned long physpage = page_to_phys(page); 1287 unsigned long physpage = page_to_phys(page);
1249 pte_t __pte = mk_pte_phys(physpage, pgprot); 1288 pte_t __pte = mk_pte_phys(physpage, pgprot);
1250 1289
1251 if ((pte_val(__pte) & _PAGE_SWW) && PageDirty(page)) { 1290 if (pte_write(__pte) && PageDirty(page))
1252 pte_val(__pte) |= _PAGE_SWC; 1291 __pte = pte_mkdirty(__pte);
1253 pte_val(__pte) &= ~_PAGE_RO;
1254 }
1255 return __pte; 1292 return __pte;
1256} 1293}
1257 1294
@@ -1313,7 +1350,7 @@ static inline void __pmd_idte(unsigned long address, pmd_t *pmdp)
1313 unsigned long sto = (unsigned long) pmdp - 1350 unsigned long sto = (unsigned long) pmdp -
1314 pmd_index(address) * sizeof(pmd_t); 1351 pmd_index(address) * sizeof(pmd_t);
1315 1352
1316 if (!(pmd_val(*pmdp) & _SEGMENT_ENTRY_INV)) { 1353 if (!(pmd_val(*pmdp) & _SEGMENT_ENTRY_INVALID)) {
1317 asm volatile( 1354 asm volatile(
1318 " .insn rrf,0xb98e0000,%2,%3,0,0" 1355 " .insn rrf,0xb98e0000,%2,%3,0,0"
1319 : "=m" (*pmdp) 1356 : "=m" (*pmdp)
@@ -1324,24 +1361,68 @@ static inline void __pmd_idte(unsigned long address, pmd_t *pmdp)
1324 } 1361 }
1325} 1362}
1326 1363
1364static inline void __pmd_csp(pmd_t *pmdp)
1365{
1366 register unsigned long reg2 asm("2") = pmd_val(*pmdp);
1367 register unsigned long reg3 asm("3") = pmd_val(*pmdp) |
1368 _SEGMENT_ENTRY_INVALID;
1369 register unsigned long reg4 asm("4") = ((unsigned long) pmdp) + 5;
1370
1371 asm volatile(
1372 " csp %1,%3"
1373 : "=m" (*pmdp)
1374 : "d" (reg2), "d" (reg3), "d" (reg4), "m" (*pmdp) : "cc");
1375}
1376
1327#if defined(CONFIG_TRANSPARENT_HUGEPAGE) || defined(CONFIG_HUGETLB_PAGE) 1377#if defined(CONFIG_TRANSPARENT_HUGEPAGE) || defined(CONFIG_HUGETLB_PAGE)
1328static inline unsigned long massage_pgprot_pmd(pgprot_t pgprot) 1378static inline unsigned long massage_pgprot_pmd(pgprot_t pgprot)
1329{ 1379{
1330 /* 1380 /*
1331 * pgprot is PAGE_NONE, PAGE_RO, or PAGE_RW (see __Pxxx / __Sxxx) 1381 * pgprot is PAGE_NONE, PAGE_READ, or PAGE_WRITE (see __Pxxx / __Sxxx)
1332 * Convert to segment table entry format. 1382 * Convert to segment table entry format.
1333 */ 1383 */
1334 if (pgprot_val(pgprot) == pgprot_val(PAGE_NONE)) 1384 if (pgprot_val(pgprot) == pgprot_val(PAGE_NONE))
1335 return pgprot_val(SEGMENT_NONE); 1385 return pgprot_val(SEGMENT_NONE);
1336 if (pgprot_val(pgprot) == pgprot_val(PAGE_RO)) 1386 if (pgprot_val(pgprot) == pgprot_val(PAGE_READ))
1337 return pgprot_val(SEGMENT_RO); 1387 return pgprot_val(SEGMENT_READ);
1338 return pgprot_val(SEGMENT_RW); 1388 return pgprot_val(SEGMENT_WRITE);
1389}
1390
1391static inline pmd_t pmd_mkyoung(pmd_t pmd)
1392{
1393#ifdef CONFIG_64BIT
1394 if (pmd_prot_none(pmd)) {
1395 pmd_val(pmd) |= _SEGMENT_ENTRY_PROTECT;
1396 } else {
1397 pmd_val(pmd) |= _SEGMENT_ENTRY_YOUNG;
1398 pmd_val(pmd) &= ~_SEGMENT_ENTRY_INVALID;
1399 }
1400#endif
1401 return pmd;
1402}
1403
1404static inline pmd_t pmd_mkold(pmd_t pmd)
1405{
1406#ifdef CONFIG_64BIT
1407 if (pmd_prot_none(pmd)) {
1408 pmd_val(pmd) &= ~_SEGMENT_ENTRY_PROTECT;
1409 } else {
1410 pmd_val(pmd) &= ~_SEGMENT_ENTRY_YOUNG;
1411 pmd_val(pmd) |= _SEGMENT_ENTRY_INVALID;
1412 }
1413#endif
1414 return pmd;
1339} 1415}
1340 1416
1341static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot) 1417static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot)
1342{ 1418{
1419 int young;
1420
1421 young = pmd_young(pmd);
1343 pmd_val(pmd) &= _SEGMENT_CHG_MASK; 1422 pmd_val(pmd) &= _SEGMENT_CHG_MASK;
1344 pmd_val(pmd) |= massage_pgprot_pmd(newprot); 1423 pmd_val(pmd) |= massage_pgprot_pmd(newprot);
1424 if (young)
1425 pmd = pmd_mkyoung(pmd);
1345 return pmd; 1426 return pmd;
1346} 1427}
1347 1428
@@ -1349,18 +1430,29 @@ static inline pmd_t mk_pmd_phys(unsigned long physpage, pgprot_t pgprot)
1349{ 1430{
1350 pmd_t __pmd; 1431 pmd_t __pmd;
1351 pmd_val(__pmd) = physpage + massage_pgprot_pmd(pgprot); 1432 pmd_val(__pmd) = physpage + massage_pgprot_pmd(pgprot);
1352 return __pmd; 1433 return pmd_mkyoung(__pmd);
1353} 1434}
1354 1435
1355static inline pmd_t pmd_mkwrite(pmd_t pmd) 1436static inline pmd_t pmd_mkwrite(pmd_t pmd)
1356{ 1437{
1357 /* Do not clobber _HPAGE_TYPE_NONE pages! */ 1438 /* Do not clobber PROT_NONE segments! */
1358 if (!(pmd_val(pmd) & _SEGMENT_ENTRY_INV)) 1439 if (!pmd_prot_none(pmd))
1359 pmd_val(pmd) &= ~_SEGMENT_ENTRY_RO; 1440 pmd_val(pmd) &= ~_SEGMENT_ENTRY_PROTECT;
1360 return pmd; 1441 return pmd;
1361} 1442}
1362#endif /* CONFIG_TRANSPARENT_HUGEPAGE || CONFIG_HUGETLB_PAGE */ 1443#endif /* CONFIG_TRANSPARENT_HUGEPAGE || CONFIG_HUGETLB_PAGE */
1363 1444
1445static inline void pmdp_flush_lazy(struct mm_struct *mm,
1446 unsigned long address, pmd_t *pmdp)
1447{
1448 int active = (mm == current->active_mm) ? 1 : 0;
1449
1450 if ((atomic_read(&mm->context.attach_count) & 0xffff) > active)
1451 __pmd_idte(address, pmdp);
1452 else
1453 mm->context.flush_mm = 1;
1454}
1455
1364#ifdef CONFIG_TRANSPARENT_HUGEPAGE 1456#ifdef CONFIG_TRANSPARENT_HUGEPAGE
1365 1457
1366#define __HAVE_ARCH_PGTABLE_DEPOSIT 1458#define __HAVE_ARCH_PGTABLE_DEPOSIT
@@ -1378,7 +1470,7 @@ static inline int pmd_trans_splitting(pmd_t pmd)
1378static inline void set_pmd_at(struct mm_struct *mm, unsigned long addr, 1470static inline void set_pmd_at(struct mm_struct *mm, unsigned long addr,
1379 pmd_t *pmdp, pmd_t entry) 1471 pmd_t *pmdp, pmd_t entry)
1380{ 1472{
1381 if (!(pmd_val(entry) & _SEGMENT_ENTRY_INV) && MACHINE_HAS_EDAT1) 1473 if (!(pmd_val(entry) & _SEGMENT_ENTRY_INVALID) && MACHINE_HAS_EDAT1)
1382 pmd_val(entry) |= _SEGMENT_ENTRY_CO; 1474 pmd_val(entry) |= _SEGMENT_ENTRY_CO;
1383 *pmdp = entry; 1475 *pmdp = entry;
1384} 1476}
@@ -1391,7 +1483,9 @@ static inline pmd_t pmd_mkhuge(pmd_t pmd)
1391 1483
1392static inline pmd_t pmd_wrprotect(pmd_t pmd) 1484static inline pmd_t pmd_wrprotect(pmd_t pmd)
1393{ 1485{
1394 pmd_val(pmd) |= _SEGMENT_ENTRY_RO; 1486 /* Do not clobber PROT_NONE segments! */
1487 if (!pmd_prot_none(pmd))
1488 pmd_val(pmd) |= _SEGMENT_ENTRY_PROTECT;
1395 return pmd; 1489 return pmd;
1396} 1490}
1397 1491
@@ -1401,50 +1495,16 @@ static inline pmd_t pmd_mkdirty(pmd_t pmd)
1401 return pmd; 1495 return pmd;
1402} 1496}
1403 1497
1404static inline pmd_t pmd_mkold(pmd_t pmd)
1405{
1406 /* No referenced bit in the segment table entry. */
1407 return pmd;
1408}
1409
1410static inline pmd_t pmd_mkyoung(pmd_t pmd)
1411{
1412 /* No referenced bit in the segment table entry. */
1413 return pmd;
1414}
1415
1416#define __HAVE_ARCH_PMDP_TEST_AND_CLEAR_YOUNG 1498#define __HAVE_ARCH_PMDP_TEST_AND_CLEAR_YOUNG
1417static inline int pmdp_test_and_clear_young(struct vm_area_struct *vma, 1499static inline int pmdp_test_and_clear_young(struct vm_area_struct *vma,
1418 unsigned long address, pmd_t *pmdp) 1500 unsigned long address, pmd_t *pmdp)
1419{ 1501{
1420 unsigned long pmd_addr = pmd_val(*pmdp) & HPAGE_MASK; 1502 pmd_t pmd;
1421 long tmp, rc;
1422 int counter;
1423 1503
1424 rc = 0; 1504 pmd = *pmdp;
1425 if (MACHINE_HAS_RRBM) { 1505 __pmd_idte(address, pmdp);
1426 counter = PTRS_PER_PTE >> 6; 1506 *pmdp = pmd_mkold(pmd);
1427 asm volatile( 1507 return pmd_young(pmd);
1428 "0: .insn rre,0xb9ae0000,%0,%3\n" /* rrbm */
1429 " ogr %1,%0\n"
1430 " la %3,0(%4,%3)\n"
1431 " brct %2,0b\n"
1432 : "=&d" (tmp), "+&d" (rc), "+d" (counter),
1433 "+a" (pmd_addr)
1434 : "a" (64 * 4096UL) : "cc");
1435 rc = !!rc;
1436 } else {
1437 counter = PTRS_PER_PTE;
1438 asm volatile(
1439 "0: rrbe 0,%2\n"
1440 " la %2,0(%3,%2)\n"
1441 " brc 12,1f\n"
1442 " lhi %0,1\n"
1443 "1: brct %1,0b\n"
1444 : "+d" (rc), "+d" (counter), "+a" (pmd_addr)
1445 : "a" (4096UL) : "cc");
1446 }
1447 return rc;
1448} 1508}
1449 1509
1450#define __HAVE_ARCH_PMDP_GET_AND_CLEAR 1510#define __HAVE_ARCH_PMDP_GET_AND_CLEAR
@@ -1510,10 +1570,8 @@ static inline unsigned long pmd_pfn(pmd_t pmd)
1510 * exception will occur instead of a page translation exception. The 1570 * exception will occur instead of a page translation exception. The
1511 * specifiation exception has the bad habit not to store necessary 1571 * specifiation exception has the bad habit not to store necessary
1512 * information in the lowcore. 1572 * information in the lowcore.
1513 * Bit 21 and bit 22 are the page invalid bit and the page protection 1573 * Bits 21, 22, 30 and 31 are used to indicate the page type.
1514 * bit. We set both to indicate a swapped page. 1574 * A swap pte is indicated by bit pattern (pte & 0x603) == 0x402
1515 * Bit 30 and 31 are used to distinguish the different page types. For
1516 * a swapped page these bits need to be zero.
1517 * This leaves the bits 1-19 and bits 24-29 to store type and offset. 1575 * This leaves the bits 1-19 and bits 24-29 to store type and offset.
1518 * We use the 5 bits from 25-29 for the type and the 20 bits from 1-19 1576 * We use the 5 bits from 25-29 for the type and the 20 bits from 1-19
1519 * plus 24 for the offset. 1577 * plus 24 for the offset.
@@ -1527,10 +1585,8 @@ static inline unsigned long pmd_pfn(pmd_t pmd)
1527 * exception will occur instead of a page translation exception. The 1585 * exception will occur instead of a page translation exception. The
1528 * specifiation exception has the bad habit not to store necessary 1586 * specifiation exception has the bad habit not to store necessary
1529 * information in the lowcore. 1587 * information in the lowcore.
1530 * Bit 53 and bit 54 are the page invalid bit and the page protection 1588 * Bits 53, 54, 62 and 63 are used to indicate the page type.
1531 * bit. We set both to indicate a swapped page. 1589 * A swap pte is indicated by bit pattern (pte & 0x603) == 0x402
1532 * Bit 62 and 63 are used to distinguish the different page types. For
1533 * a swapped page these bits need to be zero.
1534 * This leaves the bits 0-51 and bits 56-61 to store type and offset. 1590 * This leaves the bits 0-51 and bits 56-61 to store type and offset.
1535 * We use the 5 bits from 57-61 for the type and the 53 bits from 0-51 1591 * We use the 5 bits from 57-61 for the type and the 53 bits from 0-51
1536 * plus 56 for the offset. 1592 * plus 56 for the offset.
@@ -1547,7 +1603,7 @@ static inline pte_t mk_swap_pte(unsigned long type, unsigned long offset)
1547{ 1603{
1548 pte_t pte; 1604 pte_t pte;
1549 offset &= __SWP_OFFSET_MASK; 1605 offset &= __SWP_OFFSET_MASK;
1550 pte_val(pte) = _PAGE_TYPE_SWAP | ((type & 0x1f) << 2) | 1606 pte_val(pte) = _PAGE_INVALID | _PAGE_TYPE | ((type & 0x1f) << 2) |
1551 ((offset & 1UL) << 7) | ((offset & ~1UL) << 11); 1607 ((offset & 1UL) << 7) | ((offset & ~1UL) << 11);
1552 return pte; 1608 return pte;
1553} 1609}
@@ -1570,7 +1626,7 @@ static inline pte_t mk_swap_pte(unsigned long type, unsigned long offset)
1570 1626
1571#define pgoff_to_pte(__off) \ 1627#define pgoff_to_pte(__off) \
1572 ((pte_t) { ((((__off) & 0x7f) << 1) + (((__off) >> 7) << 12)) \ 1628 ((pte_t) { ((((__off) & 0x7f) << 1) + (((__off) >> 7) << 12)) \
1573 | _PAGE_TYPE_FILE }) 1629 | _PAGE_INVALID | _PAGE_PROTECT })
1574 1630
1575#endif /* !__ASSEMBLY__ */ 1631#endif /* !__ASSEMBLY__ */
1576 1632
diff --git a/arch/s390/include/asm/processor.h b/arch/s390/include/asm/processor.h
index b0e6435b2f02..0eb37505cab1 100644
--- a/arch/s390/include/asm/processor.h
+++ b/arch/s390/include/asm/processor.h
@@ -43,6 +43,7 @@ extern void execve_tail(void);
43#ifndef CONFIG_64BIT 43#ifndef CONFIG_64BIT
44 44
45#define TASK_SIZE (1UL << 31) 45#define TASK_SIZE (1UL << 31)
46#define TASK_MAX_SIZE (1UL << 31)
46#define TASK_UNMAPPED_BASE (1UL << 30) 47#define TASK_UNMAPPED_BASE (1UL << 30)
47 48
48#else /* CONFIG_64BIT */ 49#else /* CONFIG_64BIT */
@@ -51,6 +52,7 @@ extern void execve_tail(void);
51#define TASK_UNMAPPED_BASE (test_thread_flag(TIF_31BIT) ? \ 52#define TASK_UNMAPPED_BASE (test_thread_flag(TIF_31BIT) ? \
52 (1UL << 30) : (1UL << 41)) 53 (1UL << 30) : (1UL << 41))
53#define TASK_SIZE TASK_SIZE_OF(current) 54#define TASK_SIZE TASK_SIZE_OF(current)
55#define TASK_MAX_SIZE (1UL << 53)
54 56
55#endif /* CONFIG_64BIT */ 57#endif /* CONFIG_64BIT */
56 58
diff --git a/arch/s390/include/asm/sclp.h b/arch/s390/include/asm/sclp.h
index 06a136136047..7dc7f9c63b65 100644
--- a/arch/s390/include/asm/sclp.h
+++ b/arch/s390/include/asm/sclp.h
@@ -56,5 +56,6 @@ bool sclp_has_linemode(void);
56bool sclp_has_vt220(void); 56bool sclp_has_vt220(void);
57int sclp_pci_configure(u32 fid); 57int sclp_pci_configure(u32 fid);
58int sclp_pci_deconfigure(u32 fid); 58int sclp_pci_deconfigure(u32 fid);
59int memcpy_hsa(void *dest, unsigned long src, size_t count, int mode);
59 60
60#endif /* _ASM_S390_SCLP_H */ 61#endif /* _ASM_S390_SCLP_H */
diff --git a/arch/s390/include/asm/serial.h b/arch/s390/include/asm/serial.h
new file mode 100644
index 000000000000..5b3e48ef534b
--- /dev/null
+++ b/arch/s390/include/asm/serial.h
@@ -0,0 +1,6 @@
1#ifndef _ASM_S390_SERIAL_H
2#define _ASM_S390_SERIAL_H
3
4#define BASE_BAUD 0
5
6#endif /* _ASM_S390_SERIAL_H */
diff --git a/arch/s390/include/asm/switch_to.h b/arch/s390/include/asm/switch_to.h
index 80b6f11263c4..6dbd559763c9 100644
--- a/arch/s390/include/asm/switch_to.h
+++ b/arch/s390/include/asm/switch_to.h
@@ -8,6 +8,7 @@
8#define __ASM_SWITCH_TO_H 8#define __ASM_SWITCH_TO_H
9 9
10#include <linux/thread_info.h> 10#include <linux/thread_info.h>
11#include <asm/ptrace.h>
11 12
12extern struct task_struct *__switch_to(void *, void *); 13extern struct task_struct *__switch_to(void *, void *);
13extern void update_cr_regs(struct task_struct *task); 14extern void update_cr_regs(struct task_struct *task);
@@ -68,12 +69,16 @@ static inline void restore_fp_regs(s390_fp_regs *fpregs)
68 69
69static inline void save_access_regs(unsigned int *acrs) 70static inline void save_access_regs(unsigned int *acrs)
70{ 71{
71 asm volatile("stam 0,15,%0" : "=Q" (*acrs)); 72 typedef struct { int _[NUM_ACRS]; } acrstype;
73
74 asm volatile("stam 0,15,%0" : "=Q" (*(acrstype *)acrs));
72} 75}
73 76
74static inline void restore_access_regs(unsigned int *acrs) 77static inline void restore_access_regs(unsigned int *acrs)
75{ 78{
76 asm volatile("lam 0,15,%0" : : "Q" (*acrs)); 79 typedef struct { int _[NUM_ACRS]; } acrstype;
80
81 asm volatile("lam 0,15,%0" : : "Q" (*(acrstype *)acrs));
77} 82}
78 83
79#define switch_to(prev,next,last) do { \ 84#define switch_to(prev,next,last) do { \
diff --git a/arch/s390/include/asm/tlb.h b/arch/s390/include/asm/tlb.h
index 6d6d92b4ea11..2cb846c4b37f 100644
--- a/arch/s390/include/asm/tlb.h
+++ b/arch/s390/include/asm/tlb.h
@@ -63,13 +63,14 @@ static inline void tlb_gather_mmu(struct mmu_gather *tlb,
63 63
64static inline void tlb_flush_mmu(struct mmu_gather *tlb) 64static inline void tlb_flush_mmu(struct mmu_gather *tlb)
65{ 65{
66 __tlb_flush_mm_lazy(tlb->mm);
66 tlb_table_flush(tlb); 67 tlb_table_flush(tlb);
67} 68}
68 69
69static inline void tlb_finish_mmu(struct mmu_gather *tlb, 70static inline void tlb_finish_mmu(struct mmu_gather *tlb,
70 unsigned long start, unsigned long end) 71 unsigned long start, unsigned long end)
71{ 72{
72 tlb_table_flush(tlb); 73 tlb_flush_mmu(tlb);
73} 74}
74 75
75/* 76/*
diff --git a/arch/s390/include/asm/tlbflush.h b/arch/s390/include/asm/tlbflush.h
index 6b32af30878c..f9fef0425fee 100644
--- a/arch/s390/include/asm/tlbflush.h
+++ b/arch/s390/include/asm/tlbflush.h
@@ -86,7 +86,7 @@ static inline void __tlb_flush_mm(struct mm_struct * mm)
86 __tlb_flush_full(mm); 86 __tlb_flush_full(mm);
87} 87}
88 88
89static inline void __tlb_flush_mm_cond(struct mm_struct * mm) 89static inline void __tlb_flush_mm_lazy(struct mm_struct * mm)
90{ 90{
91 if (mm->context.flush_mm) { 91 if (mm->context.flush_mm) {
92 __tlb_flush_mm(mm); 92 __tlb_flush_mm(mm);
@@ -118,13 +118,13 @@ static inline void __tlb_flush_mm_cond(struct mm_struct * mm)
118 118
119static inline void flush_tlb_mm(struct mm_struct *mm) 119static inline void flush_tlb_mm(struct mm_struct *mm)
120{ 120{
121 __tlb_flush_mm_cond(mm); 121 __tlb_flush_mm_lazy(mm);
122} 122}
123 123
124static inline void flush_tlb_range(struct vm_area_struct *vma, 124static inline void flush_tlb_range(struct vm_area_struct *vma,
125 unsigned long start, unsigned long end) 125 unsigned long start, unsigned long end)
126{ 126{
127 __tlb_flush_mm_cond(vma->vm_mm); 127 __tlb_flush_mm_lazy(vma->vm_mm);
128} 128}
129 129
130static inline void flush_tlb_kernel_range(unsigned long start, 130static inline void flush_tlb_kernel_range(unsigned long start,
diff --git a/arch/s390/include/asm/vtime.h b/arch/s390/include/asm/vtime.h
new file mode 100644
index 000000000000..af9896c53eb3
--- /dev/null
+++ b/arch/s390/include/asm/vtime.h
@@ -0,0 +1,7 @@
1#ifndef _S390_VTIME_H
2#define _S390_VTIME_H
3
4#define __ARCH_HAS_VTIME_ACCOUNT
5#define __ARCH_HAS_VTIME_TASK_SWITCH
6
7#endif /* _S390_VTIME_H */
diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c
index 8b6e4f5288a2..1f1b8c70ab97 100644
--- a/arch/s390/kernel/compat_linux.c
+++ b/arch/s390/kernel/compat_linux.c
@@ -221,25 +221,26 @@ static int groups16_from_user(struct group_info *group_info, u16 __user *groupli
221 221
222asmlinkage long sys32_getgroups16(int gidsetsize, u16 __user *grouplist) 222asmlinkage long sys32_getgroups16(int gidsetsize, u16 __user *grouplist)
223{ 223{
224 const struct cred *cred = current_cred();
224 int i; 225 int i;
225 226
226 if (gidsetsize < 0) 227 if (gidsetsize < 0)
227 return -EINVAL; 228 return -EINVAL;
228 229
229 get_group_info(current->cred->group_info); 230 get_group_info(cred->group_info);
230 i = current->cred->group_info->ngroups; 231 i = cred->group_info->ngroups;
231 if (gidsetsize) { 232 if (gidsetsize) {
232 if (i > gidsetsize) { 233 if (i > gidsetsize) {
233 i = -EINVAL; 234 i = -EINVAL;
234 goto out; 235 goto out;
235 } 236 }
236 if (groups16_to_user(grouplist, current->cred->group_info)) { 237 if (groups16_to_user(grouplist, cred->group_info)) {
237 i = -EFAULT; 238 i = -EFAULT;
238 goto out; 239 goto out;
239 } 240 }
240 } 241 }
241out: 242out:
242 put_group_info(current->cred->group_info); 243 put_group_info(cred->group_info);
243 return i; 244 return i;
244} 245}
245 246
diff --git a/arch/s390/kernel/compat_signal.c b/arch/s390/kernel/compat_signal.c
index c439ac9ced09..1389b637dae5 100644
--- a/arch/s390/kernel/compat_signal.c
+++ b/arch/s390/kernel/compat_signal.c
@@ -332,9 +332,9 @@ static int setup_frame32(int sig, struct k_sigaction *ka,
332 /* Set up to return from userspace. If provided, use a stub 332 /* Set up to return from userspace. If provided, use a stub
333 already in userspace. */ 333 already in userspace. */
334 if (ka->sa.sa_flags & SA_RESTORER) { 334 if (ka->sa.sa_flags & SA_RESTORER) {
335 regs->gprs[14] = (__u64) ka->sa.sa_restorer | PSW32_ADDR_AMODE; 335 regs->gprs[14] = (__u64 __force) ka->sa.sa_restorer | PSW32_ADDR_AMODE;
336 } else { 336 } else {
337 regs->gprs[14] = (__u64) frame->retcode | PSW32_ADDR_AMODE; 337 regs->gprs[14] = (__u64 __force) frame->retcode | PSW32_ADDR_AMODE;
338 if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn, 338 if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn,
339 (u16 __force __user *)(frame->retcode))) 339 (u16 __force __user *)(frame->retcode)))
340 goto give_sigsegv; 340 goto give_sigsegv;
@@ -400,9 +400,9 @@ static int setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info,
400 /* Set up to return from userspace. If provided, use a stub 400 /* Set up to return from userspace. If provided, use a stub
401 already in userspace. */ 401 already in userspace. */
402 if (ka->sa.sa_flags & SA_RESTORER) { 402 if (ka->sa.sa_flags & SA_RESTORER) {
403 regs->gprs[14] = (__u64) ka->sa.sa_restorer | PSW32_ADDR_AMODE; 403 regs->gprs[14] = (__u64 __force) ka->sa.sa_restorer | PSW32_ADDR_AMODE;
404 } else { 404 } else {
405 regs->gprs[14] = (__u64) frame->retcode | PSW32_ADDR_AMODE; 405 regs->gprs[14] = (__u64 __force) frame->retcode | PSW32_ADDR_AMODE;
406 err |= __put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn, 406 err |= __put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn,
407 (u16 __force __user *)(frame->retcode)); 407 (u16 __force __user *)(frame->retcode));
408 } 408 }
@@ -417,7 +417,7 @@ static int setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info,
417 regs->psw.mask = PSW_MASK_BA | 417 regs->psw.mask = PSW_MASK_BA |
418 (psw_user_bits & PSW_MASK_ASC) | 418 (psw_user_bits & PSW_MASK_ASC) |
419 (regs->psw.mask & ~PSW_MASK_ASC); 419 (regs->psw.mask & ~PSW_MASK_ASC);
420 regs->psw.addr = (__u64) ka->sa.sa_handler; 420 regs->psw.addr = (__u64 __force) ka->sa.sa_handler;
421 421
422 regs->gprs[2] = map_signal(sig); 422 regs->gprs[2] = map_signal(sig);
423 regs->gprs[3] = (__force __u64) &frame->info; 423 regs->gprs[3] = (__force __u64) &frame->info;
diff --git a/arch/s390/kernel/crash_dump.c b/arch/s390/kernel/crash_dump.c
index d8f355657171..c84f33d51f7b 100644
--- a/arch/s390/kernel/crash_dump.c
+++ b/arch/s390/kernel/crash_dump.c
@@ -16,6 +16,7 @@
16#include <asm/os_info.h> 16#include <asm/os_info.h>
17#include <asm/elf.h> 17#include <asm/elf.h>
18#include <asm/ipl.h> 18#include <asm/ipl.h>
19#include <asm/sclp.h>
19 20
20#define PTR_ADD(x, y) (((char *) (x)) + ((unsigned long) (y))) 21#define PTR_ADD(x, y) (((char *) (x)) + ((unsigned long) (y)))
21#define PTR_SUB(x, y) (((char *) (x)) - ((unsigned long) (y))) 22#define PTR_SUB(x, y) (((char *) (x)) - ((unsigned long) (y)))
@@ -64,22 +65,46 @@ static ssize_t copy_page_real(void *buf, void *src, size_t csize)
64} 65}
65 66
66/* 67/*
67 * Copy one page from "oldmem" 68 * Pointer to ELF header in new kernel
69 */
70static void *elfcorehdr_newmem;
71
72/*
73 * Copy one page from zfcpdump "oldmem"
74 *
75 * For pages below ZFCPDUMP_HSA_SIZE memory from the HSA is copied. Otherwise
76 * real memory copy is used.
77 */
78static ssize_t copy_oldmem_page_zfcpdump(char *buf, size_t csize,
79 unsigned long src, int userbuf)
80{
81 int rc;
82
83 if (src < ZFCPDUMP_HSA_SIZE) {
84 rc = memcpy_hsa(buf, src, csize, userbuf);
85 } else {
86 if (userbuf)
87 rc = copy_to_user_real((void __force __user *) buf,
88 (void *) src, csize);
89 else
90 rc = memcpy_real(buf, (void *) src, csize);
91 }
92 return rc ? rc : csize;
93}
94
95/*
96 * Copy one page from kdump "oldmem"
68 * 97 *
69 * For the kdump reserved memory this functions performs a swap operation: 98 * For the kdump reserved memory this functions performs a swap operation:
70 * - [OLDMEM_BASE - OLDMEM_BASE + OLDMEM_SIZE] is mapped to [0 - OLDMEM_SIZE]. 99 * - [OLDMEM_BASE - OLDMEM_BASE + OLDMEM_SIZE] is mapped to [0 - OLDMEM_SIZE].
71 * - [0 - OLDMEM_SIZE] is mapped to [OLDMEM_BASE - OLDMEM_BASE + OLDMEM_SIZE] 100 * - [0 - OLDMEM_SIZE] is mapped to [OLDMEM_BASE - OLDMEM_BASE + OLDMEM_SIZE]
72 */ 101 */
73ssize_t copy_oldmem_page(unsigned long pfn, char *buf, 102static ssize_t copy_oldmem_page_kdump(char *buf, size_t csize,
74 size_t csize, unsigned long offset, int userbuf) 103 unsigned long src, int userbuf)
104
75{ 105{
76 unsigned long src;
77 int rc; 106 int rc;
78 107
79 if (!csize)
80 return 0;
81
82 src = (pfn << PAGE_SHIFT) + offset;
83 if (src < OLDMEM_SIZE) 108 if (src < OLDMEM_SIZE)
84 src += OLDMEM_BASE; 109 src += OLDMEM_BASE;
85 else if (src > OLDMEM_BASE && 110 else if (src > OLDMEM_BASE &&
@@ -90,7 +115,88 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf,
90 (void *) src, csize); 115 (void *) src, csize);
91 else 116 else
92 rc = copy_page_real(buf, (void *) src, csize); 117 rc = copy_page_real(buf, (void *) src, csize);
93 return (rc == 0) ? csize : rc; 118 return (rc == 0) ? rc : csize;
119}
120
121/*
122 * Copy one page from "oldmem"
123 */
124ssize_t copy_oldmem_page(unsigned long pfn, char *buf, size_t csize,
125 unsigned long offset, int userbuf)
126{
127 unsigned long src;
128
129 if (!csize)
130 return 0;
131 src = (pfn << PAGE_SHIFT) + offset;
132 if (OLDMEM_BASE)
133 return copy_oldmem_page_kdump(buf, csize, src, userbuf);
134 else
135 return copy_oldmem_page_zfcpdump(buf, csize, src, userbuf);
136}
137
138/*
139 * Remap "oldmem" for kdump
140 *
141 * For the kdump reserved memory this functions performs a swap operation:
142 * [0 - OLDMEM_SIZE] is mapped to [OLDMEM_BASE - OLDMEM_BASE + OLDMEM_SIZE]
143 */
144static int remap_oldmem_pfn_range_kdump(struct vm_area_struct *vma,
145 unsigned long from, unsigned long pfn,
146 unsigned long size, pgprot_t prot)
147{
148 unsigned long size_old;
149 int rc;
150
151 if (pfn < OLDMEM_SIZE >> PAGE_SHIFT) {
152 size_old = min(size, OLDMEM_SIZE - (pfn << PAGE_SHIFT));
153 rc = remap_pfn_range(vma, from,
154 pfn + (OLDMEM_BASE >> PAGE_SHIFT),
155 size_old, prot);
156 if (rc || size == size_old)
157 return rc;
158 size -= size_old;
159 from += size_old;
160 pfn += size_old >> PAGE_SHIFT;
161 }
162 return remap_pfn_range(vma, from, pfn, size, prot);
163}
164
165/*
166 * Remap "oldmem" for zfcpdump
167 *
168 * We only map available memory above ZFCPDUMP_HSA_SIZE. Memory below
169 * ZFCPDUMP_HSA_SIZE is read on demand using the copy_oldmem_page() function.
170 */
171static int remap_oldmem_pfn_range_zfcpdump(struct vm_area_struct *vma,
172 unsigned long from,
173 unsigned long pfn,
174 unsigned long size, pgprot_t prot)
175{
176 unsigned long size_hsa;
177
178 if (pfn < ZFCPDUMP_HSA_SIZE >> PAGE_SHIFT) {
179 size_hsa = min(size, ZFCPDUMP_HSA_SIZE - (pfn << PAGE_SHIFT));
180 if (size == size_hsa)
181 return 0;
182 size -= size_hsa;
183 from += size_hsa;
184 pfn += size_hsa >> PAGE_SHIFT;
185 }
186 return remap_pfn_range(vma, from, pfn, size, prot);
187}
188
189/*
190 * Remap "oldmem" for kdump or zfcpdump
191 */
192int remap_oldmem_pfn_range(struct vm_area_struct *vma, unsigned long from,
193 unsigned long pfn, unsigned long size, pgprot_t prot)
194{
195 if (OLDMEM_BASE)
196 return remap_oldmem_pfn_range_kdump(vma, from, pfn, size, prot);
197 else
198 return remap_oldmem_pfn_range_zfcpdump(vma, from, pfn, size,
199 prot);
94} 200}
95 201
96/* 202/*
@@ -101,11 +207,21 @@ int copy_from_oldmem(void *dest, void *src, size_t count)
101 unsigned long copied = 0; 207 unsigned long copied = 0;
102 int rc; 208 int rc;
103 209
104 if ((unsigned long) src < OLDMEM_SIZE) { 210 if (OLDMEM_BASE) {
105 copied = min(count, OLDMEM_SIZE - (unsigned long) src); 211 if ((unsigned long) src < OLDMEM_SIZE) {
106 rc = memcpy_real(dest, src + OLDMEM_BASE, copied); 212 copied = min(count, OLDMEM_SIZE - (unsigned long) src);
107 if (rc) 213 rc = memcpy_real(dest, src + OLDMEM_BASE, copied);
108 return rc; 214 if (rc)
215 return rc;
216 }
217 } else {
218 if ((unsigned long) src < ZFCPDUMP_HSA_SIZE) {
219 copied = min(count,
220 ZFCPDUMP_HSA_SIZE - (unsigned long) src);
221 rc = memcpy_hsa(dest, (unsigned long) src, copied, 0);
222 if (rc)
223 return rc;
224 }
109 } 225 }
110 return memcpy_real(dest + copied, src + copied, count - copied); 226 return memcpy_real(dest + copied, src + copied, count - copied);
111} 227}
@@ -368,14 +484,6 @@ static int get_mem_chunk_cnt(void)
368} 484}
369 485
370/* 486/*
371 * Relocate pointer in order to allow vmcore code access the data
372 */
373static inline unsigned long relocate(unsigned long addr)
374{
375 return OLDMEM_BASE + addr;
376}
377
378/*
379 * Initialize ELF loads (new kernel) 487 * Initialize ELF loads (new kernel)
380 */ 488 */
381static int loads_init(Elf64_Phdr *phdr, u64 loads_offset) 489static int loads_init(Elf64_Phdr *phdr, u64 loads_offset)
@@ -426,7 +534,7 @@ static void *notes_init(Elf64_Phdr *phdr, void *ptr, u64 notes_offset)
426 ptr = nt_vmcoreinfo(ptr); 534 ptr = nt_vmcoreinfo(ptr);
427 memset(phdr, 0, sizeof(*phdr)); 535 memset(phdr, 0, sizeof(*phdr));
428 phdr->p_type = PT_NOTE; 536 phdr->p_type = PT_NOTE;
429 phdr->p_offset = relocate(notes_offset); 537 phdr->p_offset = notes_offset;
430 phdr->p_filesz = (unsigned long) PTR_SUB(ptr, ptr_start); 538 phdr->p_filesz = (unsigned long) PTR_SUB(ptr, ptr_start);
431 phdr->p_memsz = phdr->p_filesz; 539 phdr->p_memsz = phdr->p_filesz;
432 return ptr; 540 return ptr;
@@ -435,7 +543,7 @@ static void *notes_init(Elf64_Phdr *phdr, void *ptr, u64 notes_offset)
435/* 543/*
436 * Create ELF core header (new kernel) 544 * Create ELF core header (new kernel)
437 */ 545 */
438static void s390_elf_corehdr_create(char **elfcorebuf, size_t *elfcorebuf_sz) 546int elfcorehdr_alloc(unsigned long long *addr, unsigned long long *size)
439{ 547{
440 Elf64_Phdr *phdr_notes, *phdr_loads; 548 Elf64_Phdr *phdr_notes, *phdr_loads;
441 int mem_chunk_cnt; 549 int mem_chunk_cnt;
@@ -443,6 +551,12 @@ static void s390_elf_corehdr_create(char **elfcorebuf, size_t *elfcorebuf_sz)
443 u32 alloc_size; 551 u32 alloc_size;
444 u64 hdr_off; 552 u64 hdr_off;
445 553
554 /* If we are not in kdump or zfcpdump mode return */
555 if (!OLDMEM_BASE && ipl_info.type != IPL_TYPE_FCP_DUMP)
556 return 0;
557 /* If elfcorehdr= has been passed via cmdline, we use that one */
558 if (elfcorehdr_addr != ELFCORE_ADDR_MAX)
559 return 0;
446 mem_chunk_cnt = get_mem_chunk_cnt(); 560 mem_chunk_cnt = get_mem_chunk_cnt();
447 561
448 alloc_size = 0x1000 + get_cpu_cnt() * 0x300 + 562 alloc_size = 0x1000 + get_cpu_cnt() * 0x300 +
@@ -460,27 +574,52 @@ static void s390_elf_corehdr_create(char **elfcorebuf, size_t *elfcorebuf_sz)
460 ptr = notes_init(phdr_notes, ptr, ((unsigned long) hdr) + hdr_off); 574 ptr = notes_init(phdr_notes, ptr, ((unsigned long) hdr) + hdr_off);
461 /* Init loads */ 575 /* Init loads */
462 hdr_off = PTR_DIFF(ptr, hdr); 576 hdr_off = PTR_DIFF(ptr, hdr);
463 loads_init(phdr_loads, ((unsigned long) hdr) + hdr_off); 577 loads_init(phdr_loads, hdr_off);
464 *elfcorebuf_sz = hdr_off; 578 *addr = (unsigned long long) hdr;
465 *elfcorebuf = (void *) relocate((unsigned long) hdr); 579 elfcorehdr_newmem = hdr;
466 BUG_ON(*elfcorebuf_sz > alloc_size); 580 *size = (unsigned long long) hdr_off;
581 BUG_ON(elfcorehdr_size > alloc_size);
582 return 0;
467} 583}
468 584
469/* 585/*
470 * Create kdump ELF core header in new kernel, if it has not been passed via 586 * Free ELF core header (new kernel)
471 * the "elfcorehdr" kernel parameter
472 */ 587 */
473static int setup_kdump_elfcorehdr(void) 588void elfcorehdr_free(unsigned long long addr)
474{ 589{
475 size_t elfcorebuf_sz; 590 if (!elfcorehdr_newmem)
476 char *elfcorebuf; 591 return;
592 kfree((void *)(unsigned long)addr);
593}
477 594
478 if (!OLDMEM_BASE || is_kdump_kernel()) 595/*
479 return -EINVAL; 596 * Read from ELF header
480 s390_elf_corehdr_create(&elfcorebuf, &elfcorebuf_sz); 597 */
481 elfcorehdr_addr = (unsigned long long) elfcorebuf; 598ssize_t elfcorehdr_read(char *buf, size_t count, u64 *ppos)
482 elfcorehdr_size = elfcorebuf_sz; 599{
483 return 0; 600 void *src = (void *)(unsigned long)*ppos;
601
602 src = elfcorehdr_newmem ? src : src - OLDMEM_BASE;
603 memcpy(buf, src, count);
604 *ppos += count;
605 return count;
484} 606}
485 607
486subsys_initcall(setup_kdump_elfcorehdr); 608/*
609 * Read from ELF notes data
610 */
611ssize_t elfcorehdr_read_notes(char *buf, size_t count, u64 *ppos)
612{
613 void *src = (void *)(unsigned long)*ppos;
614 int rc;
615
616 if (elfcorehdr_newmem) {
617 memcpy(buf, src, count);
618 } else {
619 rc = copy_from_oldmem(buf, src, count);
620 if (rc)
621 return rc;
622 }
623 *ppos += count;
624 return count;
625}
diff --git a/arch/s390/kernel/dumpstack.c b/arch/s390/kernel/dumpstack.c
index 87acc38f73c6..99e7f6035895 100644
--- a/arch/s390/kernel/dumpstack.c
+++ b/arch/s390/kernel/dumpstack.c
@@ -40,14 +40,15 @@ __show_trace(unsigned long sp, unsigned long low, unsigned long high)
40{ 40{
41 struct stack_frame *sf; 41 struct stack_frame *sf;
42 struct pt_regs *regs; 42 struct pt_regs *regs;
43 unsigned long addr;
43 44
44 while (1) { 45 while (1) {
45 sp = sp & PSW_ADDR_INSN; 46 sp = sp & PSW_ADDR_INSN;
46 if (sp < low || sp > high - sizeof(*sf)) 47 if (sp < low || sp > high - sizeof(*sf))
47 return sp; 48 return sp;
48 sf = (struct stack_frame *) sp; 49 sf = (struct stack_frame *) sp;
49 printk("([<%016lx>] ", sf->gprs[8] & PSW_ADDR_INSN); 50 addr = sf->gprs[8] & PSW_ADDR_INSN;
50 print_symbol("%s)\n", sf->gprs[8] & PSW_ADDR_INSN); 51 printk("([<%016lx>] %pSR)\n", addr, (void *)addr);
51 /* Follow the backchain. */ 52 /* Follow the backchain. */
52 while (1) { 53 while (1) {
53 low = sp; 54 low = sp;
@@ -57,16 +58,16 @@ __show_trace(unsigned long sp, unsigned long low, unsigned long high)
57 if (sp <= low || sp > high - sizeof(*sf)) 58 if (sp <= low || sp > high - sizeof(*sf))
58 return sp; 59 return sp;
59 sf = (struct stack_frame *) sp; 60 sf = (struct stack_frame *) sp;
60 printk(" [<%016lx>] ", sf->gprs[8] & PSW_ADDR_INSN); 61 addr = sf->gprs[8] & PSW_ADDR_INSN;
61 print_symbol("%s\n", sf->gprs[8] & PSW_ADDR_INSN); 62 printk(" [<%016lx>] %pSR\n", addr, (void *)addr);
62 } 63 }
63 /* Zero backchain detected, check for interrupt frame. */ 64 /* Zero backchain detected, check for interrupt frame. */
64 sp = (unsigned long) (sf + 1); 65 sp = (unsigned long) (sf + 1);
65 if (sp <= low || sp > high - sizeof(*regs)) 66 if (sp <= low || sp > high - sizeof(*regs))
66 return sp; 67 return sp;
67 regs = (struct pt_regs *) sp; 68 regs = (struct pt_regs *) sp;
68 printk(" [<%016lx>] ", regs->psw.addr & PSW_ADDR_INSN); 69 addr = regs->psw.addr & PSW_ADDR_INSN;
69 print_symbol("%s\n", regs->psw.addr & PSW_ADDR_INSN); 70 printk(" [<%016lx>] %pSR\n", addr, (void *)addr);
70 low = sp; 71 low = sp;
71 sp = regs->gprs[15]; 72 sp = regs->gprs[15];
72 } 73 }
@@ -128,8 +129,7 @@ static void show_last_breaking_event(struct pt_regs *regs)
128{ 129{
129#ifdef CONFIG_64BIT 130#ifdef CONFIG_64BIT
130 printk("Last Breaking-Event-Address:\n"); 131 printk("Last Breaking-Event-Address:\n");
131 printk(" [<%016lx>] ", regs->args[0] & PSW_ADDR_INSN); 132 printk(" [<%016lx>] %pSR\n", regs->args[0], (void *)regs->args[0]);
132 print_symbol("%s\n", regs->args[0] & PSW_ADDR_INSN);
133#endif 133#endif
134} 134}
135 135
@@ -143,10 +143,10 @@ void show_registers(struct pt_regs *regs)
143 char *mode; 143 char *mode;
144 144
145 mode = user_mode(regs) ? "User" : "Krnl"; 145 mode = user_mode(regs) ? "User" : "Krnl";
146 printk("%s PSW : %p %p", 146 printk("%s PSW : %p %p (%pSR)\n",
147 mode, (void *) regs->psw.mask, 147 mode, (void *) regs->psw.mask,
148 (void *) regs->psw.addr,
148 (void *) regs->psw.addr); 149 (void *) regs->psw.addr);
149 print_symbol(" (%s)\n", regs->psw.addr & PSW_ADDR_INSN);
150 printk(" R:%x T:%x IO:%x EX:%x Key:%x M:%x W:%x " 150 printk(" R:%x T:%x IO:%x EX:%x Key:%x M:%x W:%x "
151 "P:%x AS:%x CC:%x PM:%x", mask_bits(regs, PSW_MASK_PER), 151 "P:%x AS:%x CC:%x PM:%x", mask_bits(regs, PSW_MASK_PER),
152 mask_bits(regs, PSW_MASK_DAT), mask_bits(regs, PSW_MASK_IO), 152 mask_bits(regs, PSW_MASK_DAT), mask_bits(regs, PSW_MASK_IO),
diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S
index be7a408be7a1..cc30d1fb000c 100644
--- a/arch/s390/kernel/entry.S
+++ b/arch/s390/kernel/entry.S
@@ -18,6 +18,7 @@
18#include <asm/unistd.h> 18#include <asm/unistd.h>
19#include <asm/page.h> 19#include <asm/page.h>
20#include <asm/sigp.h> 20#include <asm/sigp.h>
21#include <asm/irq.h>
21 22
22__PT_R0 = __PT_GPRS 23__PT_R0 = __PT_GPRS
23__PT_R1 = __PT_GPRS + 4 24__PT_R1 = __PT_GPRS + 4
@@ -435,6 +436,11 @@ io_skip:
435io_loop: 436io_loop:
436 l %r1,BASED(.Ldo_IRQ) 437 l %r1,BASED(.Ldo_IRQ)
437 lr %r2,%r11 # pass pointer to pt_regs 438 lr %r2,%r11 # pass pointer to pt_regs
439 lhi %r3,IO_INTERRUPT
440 tm __PT_INT_CODE+8(%r11),0x80 # adapter interrupt ?
441 jz io_call
442 lhi %r3,THIN_INTERRUPT
443io_call:
438 basr %r14,%r1 # call do_IRQ 444 basr %r14,%r1 # call do_IRQ
439 tm __LC_MACHINE_FLAGS+2,0x10 # MACHINE_FLAG_LPAR 445 tm __LC_MACHINE_FLAGS+2,0x10 # MACHINE_FLAG_LPAR
440 jz io_return 446 jz io_return
@@ -584,9 +590,10 @@ ext_skip:
584 mvc __PT_INT_CODE(4,%r11),__LC_EXT_CPU_ADDR 590 mvc __PT_INT_CODE(4,%r11),__LC_EXT_CPU_ADDR
585 mvc __PT_INT_PARM(4,%r11),__LC_EXT_PARAMS 591 mvc __PT_INT_PARM(4,%r11),__LC_EXT_PARAMS
586 TRACE_IRQS_OFF 592 TRACE_IRQS_OFF
593 l %r1,BASED(.Ldo_IRQ)
587 lr %r2,%r11 # pass pointer to pt_regs 594 lr %r2,%r11 # pass pointer to pt_regs
588 l %r1,BASED(.Ldo_extint) 595 lhi %r3,EXT_INTERRUPT
589 basr %r14,%r1 # call do_extint 596 basr %r14,%r1 # call do_IRQ
590 j io_return 597 j io_return
591 598
592/* 599/*
@@ -879,13 +886,13 @@ cleanup_idle:
879 stm %r9,%r10,__LC_SYSTEM_TIMER 886 stm %r9,%r10,__LC_SYSTEM_TIMER
880 mvc __LC_LAST_UPDATE_TIMER(8),__TIMER_IDLE_EXIT(%r2) 887 mvc __LC_LAST_UPDATE_TIMER(8),__TIMER_IDLE_EXIT(%r2)
881 # prepare return psw 888 # prepare return psw
882 n %r8,BASED(cleanup_idle_wait) # clear wait state bit 889 n %r8,BASED(cleanup_idle_wait) # clear irq & wait state bits
883 l %r9,24(%r11) # return from psw_idle 890 l %r9,24(%r11) # return from psw_idle
884 br %r14 891 br %r14
885cleanup_idle_insn: 892cleanup_idle_insn:
886 .long psw_idle_lpsw + 0x80000000 893 .long psw_idle_lpsw + 0x80000000
887cleanup_idle_wait: 894cleanup_idle_wait:
888 .long 0xfffdffff 895 .long 0xfcfdffff
889 896
890/* 897/*
891 * Integer constants 898 * Integer constants
@@ -902,7 +909,6 @@ cleanup_idle_wait:
902.Ldo_machine_check: .long s390_do_machine_check 909.Ldo_machine_check: .long s390_do_machine_check
903.Lhandle_mcck: .long s390_handle_mcck 910.Lhandle_mcck: .long s390_handle_mcck
904.Ldo_IRQ: .long do_IRQ 911.Ldo_IRQ: .long do_IRQ
905.Ldo_extint: .long do_extint
906.Ldo_signal: .long do_signal 912.Ldo_signal: .long do_signal
907.Ldo_notify_resume: .long do_notify_resume 913.Ldo_notify_resume: .long do_notify_resume
908.Ldo_per_trap: .long do_per_trap 914.Ldo_per_trap: .long do_per_trap
diff --git a/arch/s390/kernel/entry.h b/arch/s390/kernel/entry.h
index 3ddbc26d246e..e9b04c33d383 100644
--- a/arch/s390/kernel/entry.h
+++ b/arch/s390/kernel/entry.h
@@ -53,27 +53,21 @@ void handle_signal32(unsigned long sig, struct k_sigaction *ka,
53 siginfo_t *info, sigset_t *oldset, struct pt_regs *regs); 53 siginfo_t *info, sigset_t *oldset, struct pt_regs *regs);
54void do_notify_resume(struct pt_regs *regs); 54void do_notify_resume(struct pt_regs *regs);
55 55
56struct ext_code; 56void __init init_IRQ(void);
57void do_extint(struct pt_regs *regs); 57void do_IRQ(struct pt_regs *regs, int irq);
58void do_restart(void); 58void do_restart(void);
59void __init startup_init(void); 59void __init startup_init(void);
60void die(struct pt_regs *regs, const char *str); 60void die(struct pt_regs *regs, const char *str);
61 61int setup_profiling_timer(unsigned int multiplier);
62void __init time_init(void); 62void __init time_init(void);
63int pfn_is_nosave(unsigned long);
64void s390_early_resume(void);
65unsigned long prepare_ftrace_return(unsigned long parent, unsigned long ip);
63 66
64struct s390_mmap_arg_struct; 67struct s390_mmap_arg_struct;
65struct fadvise64_64_args; 68struct fadvise64_64_args;
66struct old_sigaction; 69struct old_sigaction;
67 70
68long sys_mmap2(struct s390_mmap_arg_struct __user *arg);
69long sys_s390_ipc(uint call, int first, unsigned long second,
70 unsigned long third, void __user *ptr);
71long sys_s390_personality(unsigned int personality);
72long sys_s390_fadvise64(int fd, u32 offset_high, u32 offset_low,
73 size_t len, int advice);
74long sys_s390_fadvise64_64(struct fadvise64_64_args __user *args);
75long sys_s390_fallocate(int fd, int mode, loff_t offset, u32 len_high,
76 u32 len_low);
77long sys_sigreturn(void); 71long sys_sigreturn(void);
78long sys_rt_sigreturn(void); 72long sys_rt_sigreturn(void);
79long sys32_sigreturn(void); 73long sys32_sigreturn(void);
diff --git a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S
index 1c039d0c24c7..2b2188b97c6a 100644
--- a/arch/s390/kernel/entry64.S
+++ b/arch/s390/kernel/entry64.S
@@ -19,6 +19,7 @@
19#include <asm/unistd.h> 19#include <asm/unistd.h>
20#include <asm/page.h> 20#include <asm/page.h>
21#include <asm/sigp.h> 21#include <asm/sigp.h>
22#include <asm/irq.h>
22 23
23__PT_R0 = __PT_GPRS 24__PT_R0 = __PT_GPRS
24__PT_R1 = __PT_GPRS + 8 25__PT_R1 = __PT_GPRS + 8
@@ -468,6 +469,11 @@ io_skip:
468 xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) 469 xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
469io_loop: 470io_loop:
470 lgr %r2,%r11 # pass pointer to pt_regs 471 lgr %r2,%r11 # pass pointer to pt_regs
472 lghi %r3,IO_INTERRUPT
473 tm __PT_INT_CODE+8(%r11),0x80 # adapter interrupt ?
474 jz io_call
475 lghi %r3,THIN_INTERRUPT
476io_call:
471 brasl %r14,do_IRQ 477 brasl %r14,do_IRQ
472 tm __LC_MACHINE_FLAGS+6,0x10 # MACHINE_FLAG_LPAR 478 tm __LC_MACHINE_FLAGS+6,0x10 # MACHINE_FLAG_LPAR
473 jz io_return 479 jz io_return
@@ -623,7 +629,8 @@ ext_skip:
623 TRACE_IRQS_OFF 629 TRACE_IRQS_OFF
624 xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) 630 xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
625 lgr %r2,%r11 # pass pointer to pt_regs 631 lgr %r2,%r11 # pass pointer to pt_regs
626 brasl %r14,do_extint 632 lghi %r3,EXT_INTERRUPT
633 brasl %r14,do_IRQ
627 j io_return 634 j io_return
628 635
629/* 636/*
@@ -922,7 +929,7 @@ cleanup_idle:
922 stg %r9,__LC_SYSTEM_TIMER 929 stg %r9,__LC_SYSTEM_TIMER
923 mvc __LC_LAST_UPDATE_TIMER(8),__TIMER_IDLE_EXIT(%r2) 930 mvc __LC_LAST_UPDATE_TIMER(8),__TIMER_IDLE_EXIT(%r2)
924 # prepare return psw 931 # prepare return psw
925 nihh %r8,0xfffd # clear wait state bit 932 nihh %r8,0xfcfd # clear irq & wait state bits
926 lg %r9,48(%r11) # return from psw_idle 933 lg %r9,48(%r11) # return from psw_idle
927 br %r14 934 br %r14
928cleanup_idle_insn: 935cleanup_idle_insn:
diff --git a/arch/s390/kernel/ftrace.c b/arch/s390/kernel/ftrace.c
index e3043aef87a9..1014ad5f7693 100644
--- a/arch/s390/kernel/ftrace.c
+++ b/arch/s390/kernel/ftrace.c
@@ -15,6 +15,7 @@
15#include <linux/kprobes.h> 15#include <linux/kprobes.h>
16#include <trace/syscall.h> 16#include <trace/syscall.h>
17#include <asm/asm-offsets.h> 17#include <asm/asm-offsets.h>
18#include "entry.h"
18 19
19#ifdef CONFIG_DYNAMIC_FTRACE 20#ifdef CONFIG_DYNAMIC_FTRACE
20 21
@@ -177,7 +178,7 @@ int ftrace_enable_ftrace_graph_caller(void)
177 178
178 offset = ((void *) prepare_ftrace_return - 179 offset = ((void *) prepare_ftrace_return -
179 (void *) ftrace_graph_caller) / 2; 180 (void *) ftrace_graph_caller) / 2;
180 return probe_kernel_write(ftrace_graph_caller + 2, 181 return probe_kernel_write((void *) ftrace_graph_caller + 2,
181 &offset, sizeof(offset)); 182 &offset, sizeof(offset));
182} 183}
183 184
@@ -185,7 +186,7 @@ int ftrace_disable_ftrace_graph_caller(void)
185{ 186{
186 static unsigned short offset = 0x0002; 187 static unsigned short offset = 0x0002;
187 188
188 return probe_kernel_write(ftrace_graph_caller + 2, 189 return probe_kernel_write((void *) ftrace_graph_caller + 2,
189 &offset, sizeof(offset)); 190 &offset, sizeof(offset));
190} 191}
191 192
diff --git a/arch/s390/kernel/irq.c b/arch/s390/kernel/irq.c
index 54b0995514e8..8ac2097f13d4 100644
--- a/arch/s390/kernel/irq.c
+++ b/arch/s390/kernel/irq.c
@@ -22,6 +22,7 @@
22#include <asm/cputime.h> 22#include <asm/cputime.h>
23#include <asm/lowcore.h> 23#include <asm/lowcore.h>
24#include <asm/irq.h> 24#include <asm/irq.h>
25#include <asm/hw_irq.h>
25#include "entry.h" 26#include "entry.h"
26 27
27DEFINE_PER_CPU_SHARED_ALIGNED(struct irq_stat, irq_stat); 28DEFINE_PER_CPU_SHARED_ALIGNED(struct irq_stat, irq_stat);
@@ -42,9 +43,10 @@ struct irq_class {
42 * Since the external and I/O interrupt fields are already sums we would end 43 * Since the external and I/O interrupt fields are already sums we would end
43 * up with having a sum which accounts each interrupt twice. 44 * up with having a sum which accounts each interrupt twice.
44 */ 45 */
45static const struct irq_class irqclass_main_desc[NR_IRQS] = { 46static const struct irq_class irqclass_main_desc[NR_IRQS_BASE] = {
46 [EXTERNAL_INTERRUPT] = {.name = "EXT"}, 47 [EXT_INTERRUPT] = {.name = "EXT"},
47 [IO_INTERRUPT] = {.name = "I/O"} 48 [IO_INTERRUPT] = {.name = "I/O"},
49 [THIN_INTERRUPT] = {.name = "AIO"},
48}; 50};
49 51
50/* 52/*
@@ -86,6 +88,28 @@ static const struct irq_class irqclass_sub_desc[NR_ARCH_IRQS] = {
86 [CPU_RST] = {.name = "RST", .desc = "[CPU] CPU Restart"}, 88 [CPU_RST] = {.name = "RST", .desc = "[CPU] CPU Restart"},
87}; 89};
88 90
91void __init init_IRQ(void)
92{
93 irq_reserve_irqs(0, THIN_INTERRUPT);
94 init_cio_interrupts();
95 init_airq_interrupts();
96 init_ext_interrupts();
97}
98
99void do_IRQ(struct pt_regs *regs, int irq)
100{
101 struct pt_regs *old_regs;
102
103 old_regs = set_irq_regs(regs);
104 irq_enter();
105 if (S390_lowcore.int_clock >= S390_lowcore.clock_comparator)
106 /* Serve timer interrupts first. */
107 clock_comparator_work();
108 generic_handle_irq(irq);
109 irq_exit();
110 set_irq_regs(old_regs);
111}
112
89/* 113/*
90 * show_interrupts is needed by /proc/interrupts. 114 * show_interrupts is needed by /proc/interrupts.
91 */ 115 */
@@ -100,27 +124,36 @@ int show_interrupts(struct seq_file *p, void *v)
100 for_each_online_cpu(cpu) 124 for_each_online_cpu(cpu)
101 seq_printf(p, "CPU%d ", cpu); 125 seq_printf(p, "CPU%d ", cpu);
102 seq_putc(p, '\n'); 126 seq_putc(p, '\n');
127 goto out;
103 } 128 }
104 if (irq < NR_IRQS) { 129 if (irq < NR_IRQS) {
130 if (irq >= NR_IRQS_BASE)
131 goto out;
105 seq_printf(p, "%s: ", irqclass_main_desc[irq].name); 132 seq_printf(p, "%s: ", irqclass_main_desc[irq].name);
106 for_each_online_cpu(cpu) 133 for_each_online_cpu(cpu)
107 seq_printf(p, "%10u ", kstat_cpu(cpu).irqs[irq]); 134 seq_printf(p, "%10u ", kstat_irqs_cpu(irq, cpu));
108 seq_putc(p, '\n'); 135 seq_putc(p, '\n');
109 goto skip_arch_irqs; 136 goto out;
110 } 137 }
111 for (irq = 0; irq < NR_ARCH_IRQS; irq++) { 138 for (irq = 0; irq < NR_ARCH_IRQS; irq++) {
112 seq_printf(p, "%s: ", irqclass_sub_desc[irq].name); 139 seq_printf(p, "%s: ", irqclass_sub_desc[irq].name);
113 for_each_online_cpu(cpu) 140 for_each_online_cpu(cpu)
114 seq_printf(p, "%10u ", per_cpu(irq_stat, cpu).irqs[irq]); 141 seq_printf(p, "%10u ",
142 per_cpu(irq_stat, cpu).irqs[irq]);
115 if (irqclass_sub_desc[irq].desc) 143 if (irqclass_sub_desc[irq].desc)
116 seq_printf(p, " %s", irqclass_sub_desc[irq].desc); 144 seq_printf(p, " %s", irqclass_sub_desc[irq].desc);
117 seq_putc(p, '\n'); 145 seq_putc(p, '\n');
118 } 146 }
119skip_arch_irqs: 147out:
120 put_online_cpus(); 148 put_online_cpus();
121 return 0; 149 return 0;
122} 150}
123 151
152int arch_show_interrupts(struct seq_file *p, int prec)
153{
154 return 0;
155}
156
124/* 157/*
125 * Switch to the asynchronous interrupt stack for softirq execution. 158 * Switch to the asynchronous interrupt stack for softirq execution.
126 */ 159 */
@@ -159,41 +192,27 @@ asmlinkage void do_softirq(void)
159 local_irq_restore(flags); 192 local_irq_restore(flags);
160} 193}
161 194
162#ifdef CONFIG_PROC_FS
163void init_irq_proc(void)
164{
165 if (proc_mkdir("irq", NULL))
166 create_prof_cpu_mask();
167}
168#endif
169
170/* 195/*
171 * ext_int_hash[index] is the list head for all external interrupts that hash 196 * ext_int_hash[index] is the list head for all external interrupts that hash
172 * to this index. 197 * to this index.
173 */ 198 */
174static struct list_head ext_int_hash[256]; 199static struct hlist_head ext_int_hash[32] ____cacheline_aligned;
175 200
176struct ext_int_info { 201struct ext_int_info {
177 ext_int_handler_t handler; 202 ext_int_handler_t handler;
178 u16 code; 203 struct hlist_node entry;
179 struct list_head entry;
180 struct rcu_head rcu; 204 struct rcu_head rcu;
205 u16 code;
181}; 206};
182 207
183/* ext_int_hash_lock protects the handler lists for external interrupts */ 208/* ext_int_hash_lock protects the handler lists for external interrupts */
184DEFINE_SPINLOCK(ext_int_hash_lock); 209static DEFINE_SPINLOCK(ext_int_hash_lock);
185
186static void __init init_external_interrupts(void)
187{
188 int idx;
189
190 for (idx = 0; idx < ARRAY_SIZE(ext_int_hash); idx++)
191 INIT_LIST_HEAD(&ext_int_hash[idx]);
192}
193 210
194static inline int ext_hash(u16 code) 211static inline int ext_hash(u16 code)
195{ 212{
196 return (code + (code >> 9)) & 0xff; 213 BUILD_BUG_ON(!is_power_of_2(ARRAY_SIZE(ext_int_hash)));
214
215 return (code + (code >> 9)) & (ARRAY_SIZE(ext_int_hash) - 1);
197} 216}
198 217
199int register_external_interrupt(u16 code, ext_int_handler_t handler) 218int register_external_interrupt(u16 code, ext_int_handler_t handler)
@@ -210,7 +229,7 @@ int register_external_interrupt(u16 code, ext_int_handler_t handler)
210 index = ext_hash(code); 229 index = ext_hash(code);
211 230
212 spin_lock_irqsave(&ext_int_hash_lock, flags); 231 spin_lock_irqsave(&ext_int_hash_lock, flags);
213 list_add_rcu(&p->entry, &ext_int_hash[index]); 232 hlist_add_head_rcu(&p->entry, &ext_int_hash[index]);
214 spin_unlock_irqrestore(&ext_int_hash_lock, flags); 233 spin_unlock_irqrestore(&ext_int_hash_lock, flags);
215 return 0; 234 return 0;
216} 235}
@@ -223,9 +242,9 @@ int unregister_external_interrupt(u16 code, ext_int_handler_t handler)
223 int index = ext_hash(code); 242 int index = ext_hash(code);
224 243
225 spin_lock_irqsave(&ext_int_hash_lock, flags); 244 spin_lock_irqsave(&ext_int_hash_lock, flags);
226 list_for_each_entry_rcu(p, &ext_int_hash[index], entry) { 245 hlist_for_each_entry_rcu(p, &ext_int_hash[index], entry) {
227 if (p->code == code && p->handler == handler) { 246 if (p->code == code && p->handler == handler) {
228 list_del_rcu(&p->entry); 247 hlist_del_rcu(&p->entry);
229 kfree_rcu(p, rcu); 248 kfree_rcu(p, rcu);
230 } 249 }
231 } 250 }
@@ -234,148 +253,64 @@ int unregister_external_interrupt(u16 code, ext_int_handler_t handler)
234} 253}
235EXPORT_SYMBOL(unregister_external_interrupt); 254EXPORT_SYMBOL(unregister_external_interrupt);
236 255
237void __irq_entry do_extint(struct pt_regs *regs) 256static irqreturn_t do_ext_interrupt(int irq, void *dummy)
238{ 257{
258 struct pt_regs *regs = get_irq_regs();
239 struct ext_code ext_code; 259 struct ext_code ext_code;
240 struct pt_regs *old_regs;
241 struct ext_int_info *p; 260 struct ext_int_info *p;
242 int index; 261 int index;
243 262
244 old_regs = set_irq_regs(regs);
245 irq_enter();
246 if (S390_lowcore.int_clock >= S390_lowcore.clock_comparator) {
247 /* Serve timer interrupts first. */
248 clock_comparator_work();
249 }
250 kstat_incr_irqs_this_cpu(EXTERNAL_INTERRUPT, NULL);
251 ext_code = *(struct ext_code *) &regs->int_code; 263 ext_code = *(struct ext_code *) &regs->int_code;
252 if (ext_code.code != 0x1004) 264 if (ext_code.code != 0x1004)
253 __get_cpu_var(s390_idle).nohz_delay = 1; 265 __get_cpu_var(s390_idle).nohz_delay = 1;
254 266
255 index = ext_hash(ext_code.code); 267 index = ext_hash(ext_code.code);
256 rcu_read_lock(); 268 rcu_read_lock();
257 list_for_each_entry_rcu(p, &ext_int_hash[index], entry) 269 hlist_for_each_entry_rcu(p, &ext_int_hash[index], entry) {
258 if (likely(p->code == ext_code.code)) 270 if (unlikely(p->code != ext_code.code))
259 p->handler(ext_code, regs->int_parm, 271 continue;
260 regs->int_parm_long); 272 p->handler(ext_code, regs->int_parm, regs->int_parm_long);
273 }
261 rcu_read_unlock(); 274 rcu_read_unlock();
262 irq_exit(); 275 return IRQ_HANDLED;
263 set_irq_regs(old_regs);
264} 276}
265 277
266void __init init_IRQ(void) 278static struct irqaction external_interrupt = {
267{ 279 .name = "EXT",
268 init_external_interrupts(); 280 .handler = do_ext_interrupt,
269} 281};
270
271static DEFINE_SPINLOCK(sc_irq_lock);
272static int sc_irq_refcount;
273
274void service_subclass_irq_register(void)
275{
276 spin_lock(&sc_irq_lock);
277 if (!sc_irq_refcount)
278 ctl_set_bit(0, 9);
279 sc_irq_refcount++;
280 spin_unlock(&sc_irq_lock);
281}
282EXPORT_SYMBOL(service_subclass_irq_register);
283
284void service_subclass_irq_unregister(void)
285{
286 spin_lock(&sc_irq_lock);
287 sc_irq_refcount--;
288 if (!sc_irq_refcount)
289 ctl_clear_bit(0, 9);
290 spin_unlock(&sc_irq_lock);
291}
292EXPORT_SYMBOL(service_subclass_irq_unregister);
293
294static DEFINE_SPINLOCK(ma_subclass_lock);
295static int ma_subclass_refcount;
296
297void measurement_alert_subclass_register(void)
298{
299 spin_lock(&ma_subclass_lock);
300 if (!ma_subclass_refcount)
301 ctl_set_bit(0, 5);
302 ma_subclass_refcount++;
303 spin_unlock(&ma_subclass_lock);
304}
305EXPORT_SYMBOL(measurement_alert_subclass_register);
306
307void measurement_alert_subclass_unregister(void)
308{
309 spin_lock(&ma_subclass_lock);
310 ma_subclass_refcount--;
311 if (!ma_subclass_refcount)
312 ctl_clear_bit(0, 5);
313 spin_unlock(&ma_subclass_lock);
314}
315EXPORT_SYMBOL(measurement_alert_subclass_unregister);
316
317#ifdef CONFIG_SMP
318void synchronize_irq(unsigned int irq)
319{
320 /*
321 * Not needed, the handler is protected by a lock and IRQs that occur
322 * after the handler is deleted are just NOPs.
323 */
324}
325EXPORT_SYMBOL_GPL(synchronize_irq);
326#endif
327
328#ifndef CONFIG_PCI
329
330/* Only PCI devices have dynamically-defined IRQ handlers */
331
332int request_irq(unsigned int irq, irq_handler_t handler,
333 unsigned long irqflags, const char *devname, void *dev_id)
334{
335 return -EINVAL;
336}
337EXPORT_SYMBOL_GPL(request_irq);
338
339void free_irq(unsigned int irq, void *dev_id)
340{
341 WARN_ON(1);
342}
343EXPORT_SYMBOL_GPL(free_irq);
344
345void enable_irq(unsigned int irq)
346{
347 WARN_ON(1);
348}
349EXPORT_SYMBOL_GPL(enable_irq);
350 282
351void disable_irq(unsigned int irq) 283void __init init_ext_interrupts(void)
352{ 284{
353 WARN_ON(1); 285 int idx;
354}
355EXPORT_SYMBOL_GPL(disable_irq);
356 286
357#endif /* !CONFIG_PCI */ 287 for (idx = 0; idx < ARRAY_SIZE(ext_int_hash); idx++)
288 INIT_HLIST_HEAD(&ext_int_hash[idx]);
358 289
359void disable_irq_nosync(unsigned int irq) 290 irq_set_chip_and_handler(EXT_INTERRUPT,
360{ 291 &dummy_irq_chip, handle_percpu_irq);
361 disable_irq(irq); 292 setup_irq(EXT_INTERRUPT, &external_interrupt);
362} 293}
363EXPORT_SYMBOL_GPL(disable_irq_nosync);
364 294
365unsigned long probe_irq_on(void) 295static DEFINE_SPINLOCK(irq_subclass_lock);
366{ 296static unsigned char irq_subclass_refcount[64];
367 return 0;
368}
369EXPORT_SYMBOL_GPL(probe_irq_on);
370 297
371int probe_irq_off(unsigned long val) 298void irq_subclass_register(enum irq_subclass subclass)
372{ 299{
373 return 0; 300 spin_lock(&irq_subclass_lock);
301 if (!irq_subclass_refcount[subclass])
302 ctl_set_bit(0, subclass);
303 irq_subclass_refcount[subclass]++;
304 spin_unlock(&irq_subclass_lock);
374} 305}
375EXPORT_SYMBOL_GPL(probe_irq_off); 306EXPORT_SYMBOL(irq_subclass_register);
376 307
377unsigned int probe_irq_mask(unsigned long val) 308void irq_subclass_unregister(enum irq_subclass subclass)
378{ 309{
379 return val; 310 spin_lock(&irq_subclass_lock);
311 irq_subclass_refcount[subclass]--;
312 if (!irq_subclass_refcount[subclass])
313 ctl_clear_bit(0, subclass);
314 spin_unlock(&irq_subclass_lock);
380} 315}
381EXPORT_SYMBOL_GPL(probe_irq_mask); 316EXPORT_SYMBOL(irq_subclass_unregister);
diff --git a/arch/s390/kernel/kprobes.c b/arch/s390/kernel/kprobes.c
index 3388b2b2a07d..0ce9fb245034 100644
--- a/arch/s390/kernel/kprobes.c
+++ b/arch/s390/kernel/kprobes.c
@@ -37,6 +37,26 @@ DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
37 37
38struct kretprobe_blackpoint kretprobe_blacklist[] = { }; 38struct kretprobe_blackpoint kretprobe_blacklist[] = { };
39 39
40DEFINE_INSN_CACHE_OPS(dmainsn);
41
42static void *alloc_dmainsn_page(void)
43{
44 return (void *)__get_free_page(GFP_KERNEL | GFP_DMA);
45}
46
47static void free_dmainsn_page(void *page)
48{
49 free_page((unsigned long)page);
50}
51
52struct kprobe_insn_cache kprobe_dmainsn_slots = {
53 .mutex = __MUTEX_INITIALIZER(kprobe_dmainsn_slots.mutex),
54 .alloc = alloc_dmainsn_page,
55 .free = free_dmainsn_page,
56 .pages = LIST_HEAD_INIT(kprobe_dmainsn_slots.pages),
57 .insn_size = MAX_INSN_SIZE,
58};
59
40static int __kprobes is_prohibited_opcode(kprobe_opcode_t *insn) 60static int __kprobes is_prohibited_opcode(kprobe_opcode_t *insn)
41{ 61{
42 switch (insn[0] >> 8) { 62 switch (insn[0] >> 8) {
@@ -100,35 +120,161 @@ static int __kprobes get_fixup_type(kprobe_opcode_t *insn)
100 fixup |= FIXUP_RETURN_REGISTER; 120 fixup |= FIXUP_RETURN_REGISTER;
101 break; 121 break;
102 case 0xc0: 122 case 0xc0:
103 if ((insn[0] & 0x0f) == 0x00 || /* larl */ 123 if ((insn[0] & 0x0f) == 0x05) /* brasl */
104 (insn[0] & 0x0f) == 0x05) /* brasl */ 124 fixup |= FIXUP_RETURN_REGISTER;
105 fixup |= FIXUP_RETURN_REGISTER;
106 break; 125 break;
107 case 0xeb: 126 case 0xeb:
108 if ((insn[2] & 0xff) == 0x44 || /* bxhg */ 127 switch (insn[2] & 0xff) {
109 (insn[2] & 0xff) == 0x45) /* bxleg */ 128 case 0x44: /* bxhg */
129 case 0x45: /* bxleg */
110 fixup = FIXUP_BRANCH_NOT_TAKEN; 130 fixup = FIXUP_BRANCH_NOT_TAKEN;
131 break;
132 }
111 break; 133 break;
112 case 0xe3: /* bctg */ 134 case 0xe3: /* bctg */
113 if ((insn[2] & 0xff) == 0x46) 135 if ((insn[2] & 0xff) == 0x46)
114 fixup = FIXUP_BRANCH_NOT_TAKEN; 136 fixup = FIXUP_BRANCH_NOT_TAKEN;
115 break; 137 break;
138 case 0xec:
139 switch (insn[2] & 0xff) {
140 case 0xe5: /* clgrb */
141 case 0xe6: /* cgrb */
142 case 0xf6: /* crb */
143 case 0xf7: /* clrb */
144 case 0xfc: /* cgib */
145 case 0xfd: /* cglib */
146 case 0xfe: /* cib */
147 case 0xff: /* clib */
148 fixup = FIXUP_BRANCH_NOT_TAKEN;
149 break;
150 }
151 break;
116 } 152 }
117 return fixup; 153 return fixup;
118} 154}
119 155
156static int __kprobes is_insn_relative_long(kprobe_opcode_t *insn)
157{
158 /* Check if we have a RIL-b or RIL-c format instruction which
159 * we need to modify in order to avoid instruction emulation. */
160 switch (insn[0] >> 8) {
161 case 0xc0:
162 if ((insn[0] & 0x0f) == 0x00) /* larl */
163 return true;
164 break;
165 case 0xc4:
166 switch (insn[0] & 0x0f) {
167 case 0x02: /* llhrl */
168 case 0x04: /* lghrl */
169 case 0x05: /* lhrl */
170 case 0x06: /* llghrl */
171 case 0x07: /* sthrl */
172 case 0x08: /* lgrl */
173 case 0x0b: /* stgrl */
174 case 0x0c: /* lgfrl */
175 case 0x0d: /* lrl */
176 case 0x0e: /* llgfrl */
177 case 0x0f: /* strl */
178 return true;
179 }
180 break;
181 case 0xc6:
182 switch (insn[0] & 0x0f) {
183 case 0x00: /* exrl */
184 case 0x02: /* pfdrl */
185 case 0x04: /* cghrl */
186 case 0x05: /* chrl */
187 case 0x06: /* clghrl */
188 case 0x07: /* clhrl */
189 case 0x08: /* cgrl */
190 case 0x0a: /* clgrl */
191 case 0x0c: /* cgfrl */
192 case 0x0d: /* crl */
193 case 0x0e: /* clgfrl */
194 case 0x0f: /* clrl */
195 return true;
196 }
197 break;
198 }
199 return false;
200}
201
202static void __kprobes copy_instruction(struct kprobe *p)
203{
204 s64 disp, new_disp;
205 u64 addr, new_addr;
206
207 memcpy(p->ainsn.insn, p->addr, ((p->opcode >> 14) + 3) & -2);
208 if (!is_insn_relative_long(p->ainsn.insn))
209 return;
210 /*
211 * For pc-relative instructions in RIL-b or RIL-c format patch the
212 * RI2 displacement field. We have already made sure that the insn
213 * slot for the patched instruction is within the same 2GB area
214 * as the original instruction (either kernel image or module area).
215 * Therefore the new displacement will always fit.
216 */
217 disp = *(s32 *)&p->ainsn.insn[1];
218 addr = (u64)(unsigned long)p->addr;
219 new_addr = (u64)(unsigned long)p->ainsn.insn;
220 new_disp = ((addr + (disp * 2)) - new_addr) / 2;
221 *(s32 *)&p->ainsn.insn[1] = new_disp;
222}
223
224static inline int is_kernel_addr(void *addr)
225{
226 return addr < (void *)_end;
227}
228
229static inline int is_module_addr(void *addr)
230{
231#ifdef CONFIG_64BIT
232 BUILD_BUG_ON(MODULES_LEN > (1UL << 31));
233 if (addr < (void *)MODULES_VADDR)
234 return 0;
235 if (addr > (void *)MODULES_END)
236 return 0;
237#endif
238 return 1;
239}
240
241static int __kprobes s390_get_insn_slot(struct kprobe *p)
242{
243 /*
244 * Get an insn slot that is within the same 2GB area like the original
245 * instruction. That way instructions with a 32bit signed displacement
246 * field can be patched and executed within the insn slot.
247 */
248 p->ainsn.insn = NULL;
249 if (is_kernel_addr(p->addr))
250 p->ainsn.insn = get_dmainsn_slot();
251 if (is_module_addr(p->addr))
252 p->ainsn.insn = get_insn_slot();
253 return p->ainsn.insn ? 0 : -ENOMEM;
254}
255
256static void __kprobes s390_free_insn_slot(struct kprobe *p)
257{
258 if (!p->ainsn.insn)
259 return;
260 if (is_kernel_addr(p->addr))
261 free_dmainsn_slot(p->ainsn.insn, 0);
262 else
263 free_insn_slot(p->ainsn.insn, 0);
264 p->ainsn.insn = NULL;
265}
266
120int __kprobes arch_prepare_kprobe(struct kprobe *p) 267int __kprobes arch_prepare_kprobe(struct kprobe *p)
121{ 268{
122 if ((unsigned long) p->addr & 0x01) 269 if ((unsigned long) p->addr & 0x01)
123 return -EINVAL; 270 return -EINVAL;
124
125 /* Make sure the probe isn't going on a difficult instruction */ 271 /* Make sure the probe isn't going on a difficult instruction */
126 if (is_prohibited_opcode(p->addr)) 272 if (is_prohibited_opcode(p->addr))
127 return -EINVAL; 273 return -EINVAL;
128 274 if (s390_get_insn_slot(p))
275 return -ENOMEM;
129 p->opcode = *p->addr; 276 p->opcode = *p->addr;
130 memcpy(p->ainsn.insn, p->addr, ((p->opcode >> 14) + 3) & -2); 277 copy_instruction(p);
131
132 return 0; 278 return 0;
133} 279}
134 280
@@ -169,6 +315,7 @@ void __kprobes arch_disarm_kprobe(struct kprobe *p)
169 315
170void __kprobes arch_remove_kprobe(struct kprobe *p) 316void __kprobes arch_remove_kprobe(struct kprobe *p)
171{ 317{
318 s390_free_insn_slot(p);
172} 319}
173 320
174static void __kprobes enable_singlestep(struct kprobe_ctlblk *kcb, 321static void __kprobes enable_singlestep(struct kprobe_ctlblk *kcb,
diff --git a/arch/s390/kernel/machine_kexec.c b/arch/s390/kernel/machine_kexec.c
index ac2178161ec3..719e27b2cf22 100644
--- a/arch/s390/kernel/machine_kexec.c
+++ b/arch/s390/kernel/machine_kexec.c
@@ -50,7 +50,7 @@ static void add_elf_notes(int cpu)
50/* 50/*
51 * Initialize CPU ELF notes 51 * Initialize CPU ELF notes
52 */ 52 */
53void setup_regs(void) 53static void setup_regs(void)
54{ 54{
55 unsigned long sa = S390_lowcore.prefixreg_save_area + SAVE_AREA_BASE; 55 unsigned long sa = S390_lowcore.prefixreg_save_area + SAVE_AREA_BASE;
56 int cpu, this_cpu; 56 int cpu, this_cpu;
diff --git a/arch/s390/kernel/nmi.c b/arch/s390/kernel/nmi.c
index 504175ebf8b0..c4c033819879 100644
--- a/arch/s390/kernel/nmi.c
+++ b/arch/s390/kernel/nmi.c
@@ -214,10 +214,7 @@ static int notrace s390_revalidate_registers(struct mci *mci)
214 : "0", "cc"); 214 : "0", "cc");
215#endif 215#endif
216 /* Revalidate clock comparator register */ 216 /* Revalidate clock comparator register */
217 if (S390_lowcore.clock_comparator == -1) 217 set_clock_comparator(S390_lowcore.clock_comparator);
218 set_clock_comparator(S390_lowcore.mcck_clock);
219 else
220 set_clock_comparator(S390_lowcore.clock_comparator);
221 /* Check if old PSW is valid */ 218 /* Check if old PSW is valid */
222 if (!mci->wp) 219 if (!mci->wp)
223 /* 220 /*
diff --git a/arch/s390/kernel/perf_cpum_cf.c b/arch/s390/kernel/perf_cpum_cf.c
index fb99c2057b85..1105502bf6e9 100644
--- a/arch/s390/kernel/perf_cpum_cf.c
+++ b/arch/s390/kernel/perf_cpum_cf.c
@@ -274,7 +274,7 @@ static int reserve_pmc_hardware(void)
274 int flags = PMC_INIT; 274 int flags = PMC_INIT;
275 275
276 on_each_cpu(setup_pmc_cpu, &flags, 1); 276 on_each_cpu(setup_pmc_cpu, &flags, 1);
277 measurement_alert_subclass_register(); 277 irq_subclass_register(IRQ_SUBCLASS_MEASUREMENT_ALERT);
278 278
279 return 0; 279 return 0;
280} 280}
@@ -285,7 +285,7 @@ static void release_pmc_hardware(void)
285 int flags = PMC_RELEASE; 285 int flags = PMC_RELEASE;
286 286
287 on_each_cpu(setup_pmc_cpu, &flags, 1); 287 on_each_cpu(setup_pmc_cpu, &flags, 1);
288 measurement_alert_subclass_unregister(); 288 irq_subclass_unregister(IRQ_SUBCLASS_MEASUREMENT_ALERT);
289} 289}
290 290
291/* Release the PMU if event is the last perf event */ 291/* Release the PMU if event is the last perf event */
diff --git a/arch/s390/kernel/perf_event.c b/arch/s390/kernel/perf_event.c
index 500aa1029bcb..2343c218b8f9 100644
--- a/arch/s390/kernel/perf_event.c
+++ b/arch/s390/kernel/perf_event.c
@@ -105,13 +105,10 @@ void perf_event_print_debug(void)
105 105
106 cpu = smp_processor_id(); 106 cpu = smp_processor_id();
107 memset(&cf_info, 0, sizeof(cf_info)); 107 memset(&cf_info, 0, sizeof(cf_info));
108 if (!qctri(&cf_info)) { 108 if (!qctri(&cf_info))
109 pr_info("CPU[%i] CPUM_CF: ver=%u.%u A=%04x E=%04x C=%04x\n", 109 pr_info("CPU[%i] CPUM_CF: ver=%u.%u A=%04x E=%04x C=%04x\n",
110 cpu, cf_info.cfvn, cf_info.csvn, 110 cpu, cf_info.cfvn, cf_info.csvn,
111 cf_info.auth_ctl, cf_info.enable_ctl, cf_info.act_ctl); 111 cf_info.auth_ctl, cf_info.enable_ctl, cf_info.act_ctl);
112 print_hex_dump_bytes("CPUMF Query: ", DUMP_PREFIX_OFFSET,
113 &cf_info, sizeof(cf_info));
114 }
115 112
116 local_irq_restore(flags); 113 local_irq_restore(flags);
117} 114}
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c
index 2bc3eddae34a..c5dbb335716d 100644
--- a/arch/s390/kernel/process.c
+++ b/arch/s390/kernel/process.c
@@ -71,6 +71,7 @@ void arch_cpu_idle(void)
71 } 71 }
72 /* Halt the cpu and keep track of cpu time accounting. */ 72 /* Halt the cpu and keep track of cpu time accounting. */
73 vtime_stop_cpu(); 73 vtime_stop_cpu();
74 local_irq_enable();
74} 75}
75 76
76void arch_cpu_idle_exit(void) 77void arch_cpu_idle_exit(void)
diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c
index e9fadb04e3c6..9556905bd3ce 100644
--- a/arch/s390/kernel/ptrace.c
+++ b/arch/s390/kernel/ptrace.c
@@ -60,11 +60,11 @@ void update_cr_regs(struct task_struct *task)
60 60
61 __ctl_store(cr, 0, 2); 61 __ctl_store(cr, 0, 2);
62 cr_new[1] = cr[1]; 62 cr_new[1] = cr[1];
63 /* Set or clear transaction execution TXC/PIFO bits 8 and 9. */ 63 /* Set or clear transaction execution TXC bit 8. */
64 if (task->thread.per_flags & PER_FLAG_NO_TE) 64 if (task->thread.per_flags & PER_FLAG_NO_TE)
65 cr_new[0] = cr[0] & ~(3UL << 54); 65 cr_new[0] = cr[0] & ~(1UL << 55);
66 else 66 else
67 cr_new[0] = cr[0] | (3UL << 54); 67 cr_new[0] = cr[0] | (1UL << 55);
68 /* Set or clear transaction execution TDC bits 62 and 63. */ 68 /* Set or clear transaction execution TDC bits 62 and 63. */
69 cr_new[2] = cr[2] & ~3UL; 69 cr_new[2] = cr[2] & ~3UL;
70 if (task->thread.per_flags & PER_FLAG_TE_ABORT_RAND) { 70 if (task->thread.per_flags & PER_FLAG_TE_ABORT_RAND) {
@@ -1299,7 +1299,7 @@ int regs_query_register_offset(const char *name)
1299 1299
1300 if (!name || *name != 'r') 1300 if (!name || *name != 'r')
1301 return -EINVAL; 1301 return -EINVAL;
1302 if (strict_strtoul(name + 1, 10, &offset)) 1302 if (kstrtoul(name + 1, 10, &offset))
1303 return -EINVAL; 1303 return -EINVAL;
1304 if (offset >= NUM_GPRS) 1304 if (offset >= NUM_GPRS)
1305 return -EINVAL; 1305 return -EINVAL;
diff --git a/arch/s390/kernel/runtime_instr.c b/arch/s390/kernel/runtime_instr.c
index 077a99389b07..e1c9d1c292fa 100644
--- a/arch/s390/kernel/runtime_instr.c
+++ b/arch/s390/kernel/runtime_instr.c
@@ -139,10 +139,10 @@ static int __init runtime_instr_init(void)
139 if (!runtime_instr_avail()) 139 if (!runtime_instr_avail())
140 return 0; 140 return 0;
141 141
142 measurement_alert_subclass_register(); 142 irq_subclass_register(IRQ_SUBCLASS_MEASUREMENT_ALERT);
143 rc = register_external_interrupt(0x1407, runtime_instr_int_handler); 143 rc = register_external_interrupt(0x1407, runtime_instr_int_handler);
144 if (rc) 144 if (rc)
145 measurement_alert_subclass_unregister(); 145 irq_subclass_unregister(IRQ_SUBCLASS_MEASUREMENT_ALERT);
146 else 146 else
147 pr_info("Runtime instrumentation facility initialized\n"); 147 pr_info("Runtime instrumentation facility initialized\n");
148 return rc; 148 return rc;
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c
index d386c4e9d2e5..1a4313a1b60f 100644
--- a/arch/s390/kernel/smp.c
+++ b/arch/s390/kernel/smp.c
@@ -362,7 +362,7 @@ void smp_yield_cpu(int cpu)
362 * Send cpus emergency shutdown signal. This gives the cpus the 362 * Send cpus emergency shutdown signal. This gives the cpus the
363 * opportunity to complete outstanding interrupts. 363 * opportunity to complete outstanding interrupts.
364 */ 364 */
365void smp_emergency_stop(cpumask_t *cpumask) 365static void smp_emergency_stop(cpumask_t *cpumask)
366{ 366{
367 u64 end; 367 u64 end;
368 int cpu; 368 int cpu;
diff --git a/arch/s390/kernel/suspend.c b/arch/s390/kernel/suspend.c
index c479d2f9605b..a7a7537ce1e7 100644
--- a/arch/s390/kernel/suspend.c
+++ b/arch/s390/kernel/suspend.c
@@ -10,6 +10,10 @@
10#include <linux/suspend.h> 10#include <linux/suspend.h>
11#include <linux/mm.h> 11#include <linux/mm.h>
12#include <asm/ctl_reg.h> 12#include <asm/ctl_reg.h>
13#include <asm/ipl.h>
14#include <asm/cio.h>
15#include <asm/pci.h>
16#include "entry.h"
13 17
14/* 18/*
15 * References to section boundaries 19 * References to section boundaries
@@ -211,3 +215,11 @@ void restore_processor_state(void)
211 __ctl_set_bit(0,28); 215 __ctl_set_bit(0,28);
212 local_mcck_enable(); 216 local_mcck_enable();
213} 217}
218
219/* Called at the end of swsusp_arch_resume */
220void s390_early_resume(void)
221{
222 lgr_info_log();
223 channel_subsystem_reinit();
224 zpci_rescan();
225}
diff --git a/arch/s390/kernel/swsusp_asm64.S b/arch/s390/kernel/swsusp_asm64.S
index c487be4cfc81..6b09fdffbd2f 100644
--- a/arch/s390/kernel/swsusp_asm64.S
+++ b/arch/s390/kernel/swsusp_asm64.S
@@ -281,11 +281,8 @@ restore_registers:
281 lghi %r2,0 281 lghi %r2,0
282 brasl %r14,arch_set_page_states 282 brasl %r14,arch_set_page_states
283 283
284 /* Log potential guest relocation */ 284 /* Call arch specific early resume code */
285 brasl %r14,lgr_info_log 285 brasl %r14,s390_early_resume
286
287 /* Reinitialize the channel subsystem */
288 brasl %r14,channel_subsystem_reinit
289 286
290 /* Return 0 */ 287 /* Return 0 */
291 lmg %r6,%r15,STACK_FRAME_OVERHEAD + __SF_GPRS(%r15) 288 lmg %r6,%r15,STACK_FRAME_OVERHEAD + __SF_GPRS(%r15)
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c
index 876546b9cfa1..064c3082ab33 100644
--- a/arch/s390/kernel/time.c
+++ b/arch/s390/kernel/time.c
@@ -92,7 +92,6 @@ void clock_comparator_work(void)
92 struct clock_event_device *cd; 92 struct clock_event_device *cd;
93 93
94 S390_lowcore.clock_comparator = -1ULL; 94 S390_lowcore.clock_comparator = -1ULL;
95 set_clock_comparator(S390_lowcore.clock_comparator);
96 cd = &__get_cpu_var(comparators); 95 cd = &__get_cpu_var(comparators);
97 cd->event_handler(cd); 96 cd->event_handler(cd);
98} 97}
diff --git a/arch/s390/kernel/vdso.c b/arch/s390/kernel/vdso.c
index d7776281cb60..05d75c413137 100644
--- a/arch/s390/kernel/vdso.c
+++ b/arch/s390/kernel/vdso.c
@@ -63,7 +63,7 @@ static int __init vdso_setup(char *s)
63 else if (strncmp(s, "off", 4) == 0) 63 else if (strncmp(s, "off", 4) == 0)
64 vdso_enabled = 0; 64 vdso_enabled = 0;
65 else { 65 else {
66 rc = strict_strtoul(s, 0, &val); 66 rc = kstrtoul(s, 0, &val);
67 vdso_enabled = rc ? 0 : !!val; 67 vdso_enabled = rc ? 0 : !!val;
68 } 68 }
69 return !rc; 69 return !rc;
@@ -113,11 +113,11 @@ int vdso_alloc_per_cpu(struct _lowcore *lowcore)
113 113
114 clear_table((unsigned long *) segment_table, _SEGMENT_ENTRY_EMPTY, 114 clear_table((unsigned long *) segment_table, _SEGMENT_ENTRY_EMPTY,
115 PAGE_SIZE << SEGMENT_ORDER); 115 PAGE_SIZE << SEGMENT_ORDER);
116 clear_table((unsigned long *) page_table, _PAGE_TYPE_EMPTY, 116 clear_table((unsigned long *) page_table, _PAGE_INVALID,
117 256*sizeof(unsigned long)); 117 256*sizeof(unsigned long));
118 118
119 *(unsigned long *) segment_table = _SEGMENT_ENTRY + page_table; 119 *(unsigned long *) segment_table = _SEGMENT_ENTRY + page_table;
120 *(unsigned long *) page_table = _PAGE_RO + page_frame; 120 *(unsigned long *) page_table = _PAGE_PROTECT + page_frame;
121 121
122 psal = (u32 *) (page_table + 256*sizeof(unsigned long)); 122 psal = (u32 *) (page_table + 256*sizeof(unsigned long));
123 aste = psal + 32; 123 aste = psal + 32;
diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c
index 9b9c1b78ec67..abcfab55f99b 100644
--- a/arch/s390/kernel/vtime.c
+++ b/arch/s390/kernel/vtime.c
@@ -19,6 +19,7 @@
19#include <asm/irq_regs.h> 19#include <asm/irq_regs.h>
20#include <asm/cputime.h> 20#include <asm/cputime.h>
21#include <asm/vtimer.h> 21#include <asm/vtimer.h>
22#include <asm/vtime.h>
22#include <asm/irq.h> 23#include <asm/irq.h>
23#include "entry.h" 24#include "entry.h"
24 25
diff --git a/arch/s390/kvm/diag.c b/arch/s390/kvm/diag.c
index 3074475c8ae0..3a74d8af0d69 100644
--- a/arch/s390/kvm/diag.c
+++ b/arch/s390/kvm/diag.c
@@ -119,12 +119,21 @@ static int __diag_virtio_hypercall(struct kvm_vcpu *vcpu)
119 * The layout is as follows: 119 * The layout is as follows:
120 * - gpr 2 contains the subchannel id (passed as addr) 120 * - gpr 2 contains the subchannel id (passed as addr)
121 * - gpr 3 contains the virtqueue index (passed as datamatch) 121 * - gpr 3 contains the virtqueue index (passed as datamatch)
122 * - gpr 4 contains the index on the bus (optionally)
122 */ 123 */
123 ret = kvm_io_bus_write(vcpu->kvm, KVM_VIRTIO_CCW_NOTIFY_BUS, 124 ret = kvm_io_bus_write_cookie(vcpu->kvm, KVM_VIRTIO_CCW_NOTIFY_BUS,
124 vcpu->run->s.regs.gprs[2], 125 vcpu->run->s.regs.gprs[2],
125 8, &vcpu->run->s.regs.gprs[3]); 126 8, &vcpu->run->s.regs.gprs[3],
127 vcpu->run->s.regs.gprs[4]);
126 srcu_read_unlock(&vcpu->kvm->srcu, idx); 128 srcu_read_unlock(&vcpu->kvm->srcu, idx);
127 /* kvm_io_bus_write returns -EOPNOTSUPP if it found no match. */ 129
130 /*
131 * Return cookie in gpr 2, but don't overwrite the register if the
132 * diagnose will be handled by userspace.
133 */
134 if (ret != -EOPNOTSUPP)
135 vcpu->run->s.regs.gprs[2] = ret;
136 /* kvm_io_bus_write_cookie returns -EOPNOTSUPP if it found no match. */
128 return ret < 0 ? ret : 0; 137 return ret < 0 ? ret : 0;
129} 138}
130 139
diff --git a/arch/s390/kvm/gaccess.h b/arch/s390/kvm/gaccess.h
index 302e0e52b009..99d789e8a018 100644
--- a/arch/s390/kvm/gaccess.h
+++ b/arch/s390/kvm/gaccess.h
@@ -42,9 +42,11 @@ static inline void __user *__gptr_to_uptr(struct kvm_vcpu *vcpu,
42({ \ 42({ \
43 __typeof__(gptr) __uptr = __gptr_to_uptr(vcpu, gptr, 1);\ 43 __typeof__(gptr) __uptr = __gptr_to_uptr(vcpu, gptr, 1);\
44 int __mask = sizeof(__typeof__(*(gptr))) - 1; \ 44 int __mask = sizeof(__typeof__(*(gptr))) - 1; \
45 int __ret = PTR_RET((void __force *)__uptr); \ 45 int __ret; \
46 \ 46 \
47 if (!__ret) { \ 47 if (IS_ERR((void __force *)__uptr)) { \
48 __ret = PTR_ERR((void __force *)__uptr); \
49 } else { \
48 BUG_ON((unsigned long)__uptr & __mask); \ 50 BUG_ON((unsigned long)__uptr & __mask); \
49 __ret = get_user(x, __uptr); \ 51 __ret = get_user(x, __uptr); \
50 } \ 52 } \
@@ -55,9 +57,11 @@ static inline void __user *__gptr_to_uptr(struct kvm_vcpu *vcpu,
55({ \ 57({ \
56 __typeof__(gptr) __uptr = __gptr_to_uptr(vcpu, gptr, 1);\ 58 __typeof__(gptr) __uptr = __gptr_to_uptr(vcpu, gptr, 1);\
57 int __mask = sizeof(__typeof__(*(gptr))) - 1; \ 59 int __mask = sizeof(__typeof__(*(gptr))) - 1; \
58 int __ret = PTR_RET((void __force *)__uptr); \ 60 int __ret; \
59 \ 61 \
60 if (!__ret) { \ 62 if (IS_ERR((void __force *)__uptr)) { \
63 __ret = PTR_ERR((void __force *)__uptr); \
64 } else { \
61 BUG_ON((unsigned long)__uptr & __mask); \ 65 BUG_ON((unsigned long)__uptr & __mask); \
62 __ret = put_user(x, __uptr); \ 66 __ret = put_user(x, __uptr); \
63 } \ 67 } \
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 34c1c9a90be2..776dafe918db 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -28,6 +28,7 @@
28#include <asm/pgtable.h> 28#include <asm/pgtable.h>
29#include <asm/nmi.h> 29#include <asm/nmi.h>
30#include <asm/switch_to.h> 30#include <asm/switch_to.h>
31#include <asm/facility.h>
31#include <asm/sclp.h> 32#include <asm/sclp.h>
32#include "kvm-s390.h" 33#include "kvm-s390.h"
33#include "gaccess.h" 34#include "gaccess.h"
@@ -84,9 +85,15 @@ struct kvm_stats_debugfs_item debugfs_entries[] = {
84 { NULL } 85 { NULL }
85}; 86};
86 87
87static unsigned long long *facilities; 88unsigned long *vfacilities;
88static struct gmap_notifier gmap_notifier; 89static struct gmap_notifier gmap_notifier;
89 90
91/* test availability of vfacility */
92static inline int test_vfacility(unsigned long nr)
93{
94 return __test_facility(nr, (void *) vfacilities);
95}
96
90/* Section: not file related */ 97/* Section: not file related */
91int kvm_arch_hardware_enable(void *garbage) 98int kvm_arch_hardware_enable(void *garbage)
92{ 99{
@@ -387,7 +394,7 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
387 vcpu->arch.sie_block->ecb = 6; 394 vcpu->arch.sie_block->ecb = 6;
388 vcpu->arch.sie_block->ecb2 = 8; 395 vcpu->arch.sie_block->ecb2 = 8;
389 vcpu->arch.sie_block->eca = 0xC1002001U; 396 vcpu->arch.sie_block->eca = 0xC1002001U;
390 vcpu->arch.sie_block->fac = (int) (long) facilities; 397 vcpu->arch.sie_block->fac = (int) (long) vfacilities;
391 hrtimer_init(&vcpu->arch.ckc_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS); 398 hrtimer_init(&vcpu->arch.ckc_timer, CLOCK_REALTIME, HRTIMER_MODE_ABS);
392 tasklet_init(&vcpu->arch.tasklet, kvm_s390_tasklet, 399 tasklet_init(&vcpu->arch.tasklet, kvm_s390_tasklet,
393 (unsigned long) vcpu); 400 (unsigned long) vcpu);
@@ -1063,6 +1070,10 @@ int kvm_arch_create_memslot(struct kvm_memory_slot *slot, unsigned long npages)
1063 return 0; 1070 return 0;
1064} 1071}
1065 1072
1073void kvm_arch_memslots_updated(struct kvm *kvm)
1074{
1075}
1076
1066/* Section: memory related */ 1077/* Section: memory related */
1067int kvm_arch_prepare_memory_region(struct kvm *kvm, 1078int kvm_arch_prepare_memory_region(struct kvm *kvm,
1068 struct kvm_memory_slot *memslot, 1079 struct kvm_memory_slot *memslot,
@@ -1129,20 +1140,20 @@ static int __init kvm_s390_init(void)
1129 * to hold the maximum amount of facilities. On the other hand, we 1140 * to hold the maximum amount of facilities. On the other hand, we
1130 * only set facilities that are known to work in KVM. 1141 * only set facilities that are known to work in KVM.
1131 */ 1142 */
1132 facilities = (unsigned long long *) get_zeroed_page(GFP_KERNEL|GFP_DMA); 1143 vfacilities = (unsigned long *) get_zeroed_page(GFP_KERNEL|GFP_DMA);
1133 if (!facilities) { 1144 if (!vfacilities) {
1134 kvm_exit(); 1145 kvm_exit();
1135 return -ENOMEM; 1146 return -ENOMEM;
1136 } 1147 }
1137 memcpy(facilities, S390_lowcore.stfle_fac_list, 16); 1148 memcpy(vfacilities, S390_lowcore.stfle_fac_list, 16);
1138 facilities[0] &= 0xff82fff3f47c0000ULL; 1149 vfacilities[0] &= 0xff82fff3f47c0000UL;
1139 facilities[1] &= 0x001c000000000000ULL; 1150 vfacilities[1] &= 0x001c000000000000UL;
1140 return 0; 1151 return 0;
1141} 1152}
1142 1153
1143static void __exit kvm_s390_exit(void) 1154static void __exit kvm_s390_exit(void)
1144{ 1155{
1145 free_page((unsigned long) facilities); 1156 free_page((unsigned long) vfacilities);
1146 kvm_exit(); 1157 kvm_exit();
1147} 1158}
1148 1159
diff --git a/arch/s390/kvm/kvm-s390.h b/arch/s390/kvm/kvm-s390.h
index 028ca9fd2158..dc99f1ca4267 100644
--- a/arch/s390/kvm/kvm-s390.h
+++ b/arch/s390/kvm/kvm-s390.h
@@ -24,6 +24,9 @@
24 24
25typedef int (*intercept_handler_t)(struct kvm_vcpu *vcpu); 25typedef int (*intercept_handler_t)(struct kvm_vcpu *vcpu);
26 26
27/* declare vfacilities extern */
28extern unsigned long *vfacilities;
29
27/* negativ values are error codes, positive values for internal conditions */ 30/* negativ values are error codes, positive values for internal conditions */
28#define SIE_INTERCEPT_RERUNVCPU (1<<0) 31#define SIE_INTERCEPT_RERUNVCPU (1<<0)
29#define SIE_INTERCEPT_UCONTROL (1<<1) 32#define SIE_INTERCEPT_UCONTROL (1<<1)
@@ -112,6 +115,13 @@ static inline u64 kvm_s390_get_base_disp_rs(struct kvm_vcpu *vcpu)
112 return (base2 ? vcpu->run->s.regs.gprs[base2] : 0) + disp2; 115 return (base2 ? vcpu->run->s.regs.gprs[base2] : 0) + disp2;
113} 116}
114 117
118/* Set the condition code in the guest program status word */
119static inline void kvm_s390_set_psw_cc(struct kvm_vcpu *vcpu, unsigned long cc)
120{
121 vcpu->arch.sie_block->gpsw.mask &= ~(3UL << 44);
122 vcpu->arch.sie_block->gpsw.mask |= cc << 44;
123}
124
115int kvm_s390_handle_wait(struct kvm_vcpu *vcpu); 125int kvm_s390_handle_wait(struct kvm_vcpu *vcpu);
116enum hrtimer_restart kvm_s390_idle_wakeup(struct hrtimer *timer); 126enum hrtimer_restart kvm_s390_idle_wakeup(struct hrtimer *timer);
117void kvm_s390_tasklet(unsigned long parm); 127void kvm_s390_tasklet(unsigned long parm);
diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c
index 4cdc54e63ebc..59200ee275e5 100644
--- a/arch/s390/kvm/priv.c
+++ b/arch/s390/kvm/priv.c
@@ -164,8 +164,7 @@ static int handle_tpi(struct kvm_vcpu *vcpu)
164 kfree(inti); 164 kfree(inti);
165no_interrupt: 165no_interrupt:
166 /* Set condition code and we're done. */ 166 /* Set condition code and we're done. */
167 vcpu->arch.sie_block->gpsw.mask &= ~(3ul << 44); 167 kvm_s390_set_psw_cc(vcpu, cc);
168 vcpu->arch.sie_block->gpsw.mask |= (cc & 3ul) << 44;
169 return 0; 168 return 0;
170} 169}
171 170
@@ -220,15 +219,13 @@ static int handle_io_inst(struct kvm_vcpu *vcpu)
220 * Set condition code 3 to stop the guest from issueing channel 219 * Set condition code 3 to stop the guest from issueing channel
221 * I/O instructions. 220 * I/O instructions.
222 */ 221 */
223 vcpu->arch.sie_block->gpsw.mask &= ~(3ul << 44); 222 kvm_s390_set_psw_cc(vcpu, 3);
224 vcpu->arch.sie_block->gpsw.mask |= (3 & 3ul) << 44;
225 return 0; 223 return 0;
226 } 224 }
227} 225}
228 226
229static int handle_stfl(struct kvm_vcpu *vcpu) 227static int handle_stfl(struct kvm_vcpu *vcpu)
230{ 228{
231 unsigned int facility_list;
232 int rc; 229 int rc;
233 230
234 vcpu->stat.instruction_stfl++; 231 vcpu->stat.instruction_stfl++;
@@ -236,15 +233,13 @@ static int handle_stfl(struct kvm_vcpu *vcpu)
236 if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE) 233 if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
237 return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP); 234 return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
238 235
239 /* only pass the facility bits, which we can handle */
240 facility_list = S390_lowcore.stfl_fac_list & 0xff82fff3;
241
242 rc = copy_to_guest(vcpu, offsetof(struct _lowcore, stfl_fac_list), 236 rc = copy_to_guest(vcpu, offsetof(struct _lowcore, stfl_fac_list),
243 &facility_list, sizeof(facility_list)); 237 vfacilities, 4);
244 if (rc) 238 if (rc)
245 return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING); 239 return kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING);
246 VCPU_EVENT(vcpu, 5, "store facility list value %x", facility_list); 240 VCPU_EVENT(vcpu, 5, "store facility list value %x",
247 trace_kvm_s390_handle_stfl(vcpu, facility_list); 241 *(unsigned int *) vfacilities);
242 trace_kvm_s390_handle_stfl(vcpu, *(unsigned int *) vfacilities);
248 return 0; 243 return 0;
249} 244}
250 245
@@ -387,7 +382,7 @@ static int handle_stsi(struct kvm_vcpu *vcpu)
387 return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP); 382 return kvm_s390_inject_program_int(vcpu, PGM_PRIVILEGED_OP);
388 383
389 if (fc > 3) { 384 if (fc > 3) {
390 vcpu->arch.sie_block->gpsw.mask |= 3ul << 44; /* cc 3 */ 385 kvm_s390_set_psw_cc(vcpu, 3);
391 return 0; 386 return 0;
392 } 387 }
393 388
@@ -397,7 +392,7 @@ static int handle_stsi(struct kvm_vcpu *vcpu)
397 392
398 if (fc == 0) { 393 if (fc == 0) {
399 vcpu->run->s.regs.gprs[0] = 3 << 28; 394 vcpu->run->s.regs.gprs[0] = 3 << 28;
400 vcpu->arch.sie_block->gpsw.mask &= ~(3ul << 44); /* cc 0 */ 395 kvm_s390_set_psw_cc(vcpu, 0);
401 return 0; 396 return 0;
402 } 397 }
403 398
@@ -431,12 +426,11 @@ static int handle_stsi(struct kvm_vcpu *vcpu)
431 } 426 }
432 trace_kvm_s390_handle_stsi(vcpu, fc, sel1, sel2, operand2); 427 trace_kvm_s390_handle_stsi(vcpu, fc, sel1, sel2, operand2);
433 free_page(mem); 428 free_page(mem);
434 vcpu->arch.sie_block->gpsw.mask &= ~(3ul << 44); 429 kvm_s390_set_psw_cc(vcpu, 0);
435 vcpu->run->s.regs.gprs[0] = 0; 430 vcpu->run->s.regs.gprs[0] = 0;
436 return 0; 431 return 0;
437out_no_data: 432out_no_data:
438 /* condition code 3 */ 433 kvm_s390_set_psw_cc(vcpu, 3);
439 vcpu->arch.sie_block->gpsw.mask |= 3ul << 44;
440out_exception: 434out_exception:
441 free_page(mem); 435 free_page(mem);
442 return rc; 436 return rc;
@@ -494,12 +488,12 @@ static int handle_epsw(struct kvm_vcpu *vcpu)
494 kvm_s390_get_regs_rre(vcpu, &reg1, &reg2); 488 kvm_s390_get_regs_rre(vcpu, &reg1, &reg2);
495 489
496 /* This basically extracts the mask half of the psw. */ 490 /* This basically extracts the mask half of the psw. */
497 vcpu->run->s.regs.gprs[reg1] &= 0xffffffff00000000; 491 vcpu->run->s.regs.gprs[reg1] &= 0xffffffff00000000UL;
498 vcpu->run->s.regs.gprs[reg1] |= vcpu->arch.sie_block->gpsw.mask >> 32; 492 vcpu->run->s.regs.gprs[reg1] |= vcpu->arch.sie_block->gpsw.mask >> 32;
499 if (reg2) { 493 if (reg2) {
500 vcpu->run->s.regs.gprs[reg2] &= 0xffffffff00000000; 494 vcpu->run->s.regs.gprs[reg2] &= 0xffffffff00000000UL;
501 vcpu->run->s.regs.gprs[reg2] |= 495 vcpu->run->s.regs.gprs[reg2] |=
502 vcpu->arch.sie_block->gpsw.mask & 0x00000000ffffffff; 496 vcpu->arch.sie_block->gpsw.mask & 0x00000000ffffffffUL;
503 } 497 }
504 return 0; 498 return 0;
505} 499}
diff --git a/arch/s390/lib/delay.c b/arch/s390/lib/delay.c
index c61b9fad43cc..57c87d7d7ede 100644
--- a/arch/s390/lib/delay.c
+++ b/arch/s390/lib/delay.c
@@ -44,7 +44,6 @@ static void __udelay_disabled(unsigned long long usecs)
44 do { 44 do {
45 set_clock_comparator(end); 45 set_clock_comparator(end);
46 vtime_stop_cpu(); 46 vtime_stop_cpu();
47 local_irq_disable();
48 } while (get_tod_clock() < end); 47 } while (get_tod_clock() < end);
49 lockdep_on(); 48 lockdep_on();
50 __ctl_load(cr0, 0, 0); 49 __ctl_load(cr0, 0, 0);
@@ -64,7 +63,6 @@ static void __udelay_enabled(unsigned long long usecs)
64 set_clock_comparator(end); 63 set_clock_comparator(end);
65 } 64 }
66 vtime_stop_cpu(); 65 vtime_stop_cpu();
67 local_irq_disable();
68 if (clock_saved) 66 if (clock_saved)
69 local_tick_enable(clock_saved); 67 local_tick_enable(clock_saved);
70 } while (get_tod_clock() < end); 68 } while (get_tod_clock() < end);
diff --git a/arch/s390/lib/uaccess_pt.c b/arch/s390/lib/uaccess_pt.c
index 50ea137a2d3c..1694d738b175 100644
--- a/arch/s390/lib/uaccess_pt.c
+++ b/arch/s390/lib/uaccess_pt.c
@@ -86,28 +86,28 @@ static unsigned long follow_table(struct mm_struct *mm,
86 switch (mm->context.asce_bits & _ASCE_TYPE_MASK) { 86 switch (mm->context.asce_bits & _ASCE_TYPE_MASK) {
87 case _ASCE_TYPE_REGION1: 87 case _ASCE_TYPE_REGION1:
88 table = table + ((address >> 53) & 0x7ff); 88 table = table + ((address >> 53) & 0x7ff);
89 if (unlikely(*table & _REGION_ENTRY_INV)) 89 if (unlikely(*table & _REGION_ENTRY_INVALID))
90 return -0x39UL; 90 return -0x39UL;
91 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); 91 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
92 /* fallthrough */ 92 /* fallthrough */
93 case _ASCE_TYPE_REGION2: 93 case _ASCE_TYPE_REGION2:
94 table = table + ((address >> 42) & 0x7ff); 94 table = table + ((address >> 42) & 0x7ff);
95 if (unlikely(*table & _REGION_ENTRY_INV)) 95 if (unlikely(*table & _REGION_ENTRY_INVALID))
96 return -0x3aUL; 96 return -0x3aUL;
97 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); 97 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
98 /* fallthrough */ 98 /* fallthrough */
99 case _ASCE_TYPE_REGION3: 99 case _ASCE_TYPE_REGION3:
100 table = table + ((address >> 31) & 0x7ff); 100 table = table + ((address >> 31) & 0x7ff);
101 if (unlikely(*table & _REGION_ENTRY_INV)) 101 if (unlikely(*table & _REGION_ENTRY_INVALID))
102 return -0x3bUL; 102 return -0x3bUL;
103 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); 103 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
104 /* fallthrough */ 104 /* fallthrough */
105 case _ASCE_TYPE_SEGMENT: 105 case _ASCE_TYPE_SEGMENT:
106 table = table + ((address >> 20) & 0x7ff); 106 table = table + ((address >> 20) & 0x7ff);
107 if (unlikely(*table & _SEGMENT_ENTRY_INV)) 107 if (unlikely(*table & _SEGMENT_ENTRY_INVALID))
108 return -0x10UL; 108 return -0x10UL;
109 if (unlikely(*table & _SEGMENT_ENTRY_LARGE)) { 109 if (unlikely(*table & _SEGMENT_ENTRY_LARGE)) {
110 if (write && (*table & _SEGMENT_ENTRY_RO)) 110 if (write && (*table & _SEGMENT_ENTRY_PROTECT))
111 return -0x04UL; 111 return -0x04UL;
112 return (*table & _SEGMENT_ENTRY_ORIGIN_LARGE) + 112 return (*table & _SEGMENT_ENTRY_ORIGIN_LARGE) +
113 (address & ~_SEGMENT_ENTRY_ORIGIN_LARGE); 113 (address & ~_SEGMENT_ENTRY_ORIGIN_LARGE);
@@ -117,7 +117,7 @@ static unsigned long follow_table(struct mm_struct *mm,
117 table = table + ((address >> 12) & 0xff); 117 table = table + ((address >> 12) & 0xff);
118 if (unlikely(*table & _PAGE_INVALID)) 118 if (unlikely(*table & _PAGE_INVALID))
119 return -0x11UL; 119 return -0x11UL;
120 if (write && (*table & _PAGE_RO)) 120 if (write && (*table & _PAGE_PROTECT))
121 return -0x04UL; 121 return -0x04UL;
122 return (*table & PAGE_MASK) + (address & ~PAGE_MASK); 122 return (*table & PAGE_MASK) + (address & ~PAGE_MASK);
123} 123}
@@ -130,13 +130,13 @@ static unsigned long follow_table(struct mm_struct *mm,
130 unsigned long *table = (unsigned long *)__pa(mm->pgd); 130 unsigned long *table = (unsigned long *)__pa(mm->pgd);
131 131
132 table = table + ((address >> 20) & 0x7ff); 132 table = table + ((address >> 20) & 0x7ff);
133 if (unlikely(*table & _SEGMENT_ENTRY_INV)) 133 if (unlikely(*table & _SEGMENT_ENTRY_INVALID))
134 return -0x10UL; 134 return -0x10UL;
135 table = (unsigned long *)(*table & _SEGMENT_ENTRY_ORIGIN); 135 table = (unsigned long *)(*table & _SEGMENT_ENTRY_ORIGIN);
136 table = table + ((address >> 12) & 0xff); 136 table = table + ((address >> 12) & 0xff);
137 if (unlikely(*table & _PAGE_INVALID)) 137 if (unlikely(*table & _PAGE_INVALID))
138 return -0x11UL; 138 return -0x11UL;
139 if (write && (*table & _PAGE_RO)) 139 if (write && (*table & _PAGE_PROTECT))
140 return -0x04UL; 140 return -0x04UL;
141 return (*table & PAGE_MASK) + (address & ~PAGE_MASK); 141 return (*table & PAGE_MASK) + (address & ~PAGE_MASK);
142} 142}
diff --git a/arch/s390/mm/dump_pagetables.c b/arch/s390/mm/dump_pagetables.c
index 3ad65b04ac15..46d517c3c763 100644
--- a/arch/s390/mm/dump_pagetables.c
+++ b/arch/s390/mm/dump_pagetables.c
@@ -53,7 +53,7 @@ static void print_prot(struct seq_file *m, unsigned int pr, int level)
53 seq_printf(m, "I\n"); 53 seq_printf(m, "I\n");
54 return; 54 return;
55 } 55 }
56 seq_printf(m, "%s", pr & _PAGE_RO ? "RO " : "RW "); 56 seq_printf(m, "%s", pr & _PAGE_PROTECT ? "RO " : "RW ");
57 seq_printf(m, "%s", pr & _PAGE_CO ? "CO " : " "); 57 seq_printf(m, "%s", pr & _PAGE_CO ? "CO " : " ");
58 seq_putc(m, '\n'); 58 seq_putc(m, '\n');
59} 59}
@@ -105,12 +105,12 @@ static void note_page(struct seq_file *m, struct pg_state *st,
105} 105}
106 106
107/* 107/*
108 * The actual page table walker functions. In order to keep the implementation 108 * The actual page table walker functions. In order to keep the
109 * of print_prot() short, we only check and pass _PAGE_INVALID and _PAGE_RO 109 * implementation of print_prot() short, we only check and pass
110 * flags to note_page() if a region, segment or page table entry is invalid or 110 * _PAGE_INVALID and _PAGE_PROTECT flags to note_page() if a region,
111 * read-only. 111 * segment or page table entry is invalid or read-only.
112 * After all it's just a hint that the current level being walked contains an 112 * After all it's just a hint that the current level being walked
113 * invalid or read-only entry. 113 * contains an invalid or read-only entry.
114 */ 114 */
115static void walk_pte_level(struct seq_file *m, struct pg_state *st, 115static void walk_pte_level(struct seq_file *m, struct pg_state *st,
116 pmd_t *pmd, unsigned long addr) 116 pmd_t *pmd, unsigned long addr)
@@ -122,14 +122,14 @@ static void walk_pte_level(struct seq_file *m, struct pg_state *st,
122 for (i = 0; i < PTRS_PER_PTE && addr < max_addr; i++) { 122 for (i = 0; i < PTRS_PER_PTE && addr < max_addr; i++) {
123 st->current_address = addr; 123 st->current_address = addr;
124 pte = pte_offset_kernel(pmd, addr); 124 pte = pte_offset_kernel(pmd, addr);
125 prot = pte_val(*pte) & (_PAGE_RO | _PAGE_INVALID); 125 prot = pte_val(*pte) & (_PAGE_PROTECT | _PAGE_INVALID);
126 note_page(m, st, prot, 4); 126 note_page(m, st, prot, 4);
127 addr += PAGE_SIZE; 127 addr += PAGE_SIZE;
128 } 128 }
129} 129}
130 130
131#ifdef CONFIG_64BIT 131#ifdef CONFIG_64BIT
132#define _PMD_PROT_MASK (_SEGMENT_ENTRY_RO | _SEGMENT_ENTRY_CO) 132#define _PMD_PROT_MASK (_SEGMENT_ENTRY_PROTECT | _SEGMENT_ENTRY_CO)
133#else 133#else
134#define _PMD_PROT_MASK 0 134#define _PMD_PROT_MASK 0
135#endif 135#endif
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c
index f00aefb66a4e..fc6679210d83 100644
--- a/arch/s390/mm/fault.c
+++ b/arch/s390/mm/fault.c
@@ -302,6 +302,8 @@ static inline int do_exception(struct pt_regs *regs, int access)
302 address = trans_exc_code & __FAIL_ADDR_MASK; 302 address = trans_exc_code & __FAIL_ADDR_MASK;
303 perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address); 303 perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address);
304 flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; 304 flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
305 if (user_mode(regs))
306 flags |= FAULT_FLAG_USER;
305 if (access == VM_WRITE || (trans_exc_code & store_indication) == 0x400) 307 if (access == VM_WRITE || (trans_exc_code & store_indication) == 0x400)
306 flags |= FAULT_FLAG_WRITE; 308 flags |= FAULT_FLAG_WRITE;
307 down_read(&mm->mmap_sem); 309 down_read(&mm->mmap_sem);
@@ -673,7 +675,7 @@ static int __init pfault_irq_init(void)
673 rc = pfault_init() == 0 ? 0 : -EOPNOTSUPP; 675 rc = pfault_init() == 0 ? 0 : -EOPNOTSUPP;
674 if (rc) 676 if (rc)
675 goto out_pfault; 677 goto out_pfault;
676 service_subclass_irq_register(); 678 irq_subclass_register(IRQ_SUBCLASS_SERVICE_SIGNAL);
677 hotcpu_notifier(pfault_cpu_notify, 0); 679 hotcpu_notifier(pfault_cpu_notify, 0);
678 return 0; 680 return 0;
679 681
diff --git a/arch/s390/mm/gup.c b/arch/s390/mm/gup.c
index 1f5315d1215c..5d758db27bdc 100644
--- a/arch/s390/mm/gup.c
+++ b/arch/s390/mm/gup.c
@@ -24,7 +24,7 @@ static inline int gup_pte_range(pmd_t *pmdp, pmd_t pmd, unsigned long addr,
24 pte_t *ptep, pte; 24 pte_t *ptep, pte;
25 struct page *page; 25 struct page *page;
26 26
27 mask = (write ? _PAGE_RO : 0) | _PAGE_INVALID | _PAGE_SPECIAL; 27 mask = (write ? _PAGE_PROTECT : 0) | _PAGE_INVALID | _PAGE_SPECIAL;
28 28
29 ptep = ((pte_t *) pmd_deref(pmd)) + pte_index(addr); 29 ptep = ((pte_t *) pmd_deref(pmd)) + pte_index(addr);
30 do { 30 do {
@@ -55,8 +55,8 @@ static inline int gup_huge_pmd(pmd_t *pmdp, pmd_t pmd, unsigned long addr,
55 struct page *head, *page, *tail; 55 struct page *head, *page, *tail;
56 int refs; 56 int refs;
57 57
58 result = write ? 0 : _SEGMENT_ENTRY_RO; 58 result = write ? 0 : _SEGMENT_ENTRY_PROTECT;
59 mask = result | _SEGMENT_ENTRY_INV; 59 mask = result | _SEGMENT_ENTRY_INVALID;
60 if ((pmd_val(pmd) & mask) != result) 60 if ((pmd_val(pmd) & mask) != result)
61 return 0; 61 return 0;
62 VM_BUG_ON(!pfn_valid(pmd_val(pmd) >> PAGE_SHIFT)); 62 VM_BUG_ON(!pfn_valid(pmd_val(pmd) >> PAGE_SHIFT));
diff --git a/arch/s390/mm/hugetlbpage.c b/arch/s390/mm/hugetlbpage.c
index 121089d57802..d261c62e40a6 100644
--- a/arch/s390/mm/hugetlbpage.c
+++ b/arch/s390/mm/hugetlbpage.c
@@ -8,21 +8,127 @@
8#include <linux/mm.h> 8#include <linux/mm.h>
9#include <linux/hugetlb.h> 9#include <linux/hugetlb.h>
10 10
11static inline pmd_t __pte_to_pmd(pte_t pte)
12{
13 int none, young, prot;
14 pmd_t pmd;
15
16 /*
17 * Convert encoding pte bits pmd bits
18 * .IR...wrdytp ..R...I...y.
19 * empty .10...000000 -> ..0...1...0.
20 * prot-none, clean, old .11...000001 -> ..0...1...1.
21 * prot-none, clean, young .11...000101 -> ..1...1...1.
22 * prot-none, dirty, old .10...001001 -> ..0...1...1.
23 * prot-none, dirty, young .10...001101 -> ..1...1...1.
24 * read-only, clean, old .11...010001 -> ..1...1...0.
25 * read-only, clean, young .01...010101 -> ..1...0...1.
26 * read-only, dirty, old .11...011001 -> ..1...1...0.
27 * read-only, dirty, young .01...011101 -> ..1...0...1.
28 * read-write, clean, old .11...110001 -> ..0...1...0.
29 * read-write, clean, young .01...110101 -> ..0...0...1.
30 * read-write, dirty, old .10...111001 -> ..0...1...0.
31 * read-write, dirty, young .00...111101 -> ..0...0...1.
32 * Huge ptes are dirty by definition, a clean pte is made dirty
33 * by the conversion.
34 */
35 if (pte_present(pte)) {
36 pmd_val(pmd) = pte_val(pte) & PAGE_MASK;
37 if (pte_val(pte) & _PAGE_INVALID)
38 pmd_val(pmd) |= _SEGMENT_ENTRY_INVALID;
39 none = (pte_val(pte) & _PAGE_PRESENT) &&
40 !(pte_val(pte) & _PAGE_READ) &&
41 !(pte_val(pte) & _PAGE_WRITE);
42 prot = (pte_val(pte) & _PAGE_PROTECT) &&
43 !(pte_val(pte) & _PAGE_WRITE);
44 young = pte_val(pte) & _PAGE_YOUNG;
45 if (none || young)
46 pmd_val(pmd) |= _SEGMENT_ENTRY_YOUNG;
47 if (prot || (none && young))
48 pmd_val(pmd) |= _SEGMENT_ENTRY_PROTECT;
49 } else
50 pmd_val(pmd) = _SEGMENT_ENTRY_INVALID;
51 return pmd;
52}
53
54static inline pte_t __pmd_to_pte(pmd_t pmd)
55{
56 pte_t pte;
57
58 /*
59 * Convert encoding pmd bits pte bits
60 * ..R...I...y. .IR...wrdytp
61 * empty ..0...1...0. -> .10...000000
62 * prot-none, old ..0...1...1. -> .10...001001
63 * prot-none, young ..1...1...1. -> .10...001101
64 * read-only, old ..1...1...0. -> .11...011001
65 * read-only, young ..1...0...1. -> .01...011101
66 * read-write, old ..0...1...0. -> .10...111001
67 * read-write, young ..0...0...1. -> .00...111101
68 * Huge ptes are dirty by definition
69 */
70 if (pmd_present(pmd)) {
71 pte_val(pte) = _PAGE_PRESENT | _PAGE_LARGE | _PAGE_DIRTY |
72 (pmd_val(pmd) & PAGE_MASK);
73 if (pmd_val(pmd) & _SEGMENT_ENTRY_INVALID)
74 pte_val(pte) |= _PAGE_INVALID;
75 if (pmd_prot_none(pmd)) {
76 if (pmd_val(pmd) & _SEGMENT_ENTRY_PROTECT)
77 pte_val(pte) |= _PAGE_YOUNG;
78 } else {
79 pte_val(pte) |= _PAGE_READ;
80 if (pmd_val(pmd) & _SEGMENT_ENTRY_PROTECT)
81 pte_val(pte) |= _PAGE_PROTECT;
82 else
83 pte_val(pte) |= _PAGE_WRITE;
84 if (pmd_val(pmd) & _SEGMENT_ENTRY_YOUNG)
85 pte_val(pte) |= _PAGE_YOUNG;
86 }
87 } else
88 pte_val(pte) = _PAGE_INVALID;
89 return pte;
90}
11 91
12void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, 92void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
13 pte_t *pteptr, pte_t pteval) 93 pte_t *ptep, pte_t pte)
14{ 94{
15 pmd_t *pmdp = (pmd_t *) pteptr; 95 pmd_t pmd;
16 unsigned long mask;
17 96
97 pmd = __pte_to_pmd(pte);
18 if (!MACHINE_HAS_HPAGE) { 98 if (!MACHINE_HAS_HPAGE) {
19 pteptr = (pte_t *) pte_page(pteval)[1].index; 99 pmd_val(pmd) &= ~_SEGMENT_ENTRY_ORIGIN;
20 mask = pte_val(pteval) & 100 pmd_val(pmd) |= pte_page(pte)[1].index;
21 (_SEGMENT_ENTRY_INV | _SEGMENT_ENTRY_RO); 101 } else
22 pte_val(pteval) = (_SEGMENT_ENTRY + __pa(pteptr)) | mask; 102 pmd_val(pmd) |= _SEGMENT_ENTRY_LARGE | _SEGMENT_ENTRY_CO;
103 *(pmd_t *) ptep = pmd;
104}
105
106pte_t huge_ptep_get(pte_t *ptep)
107{
108 unsigned long origin;
109 pmd_t pmd;
110
111 pmd = *(pmd_t *) ptep;
112 if (!MACHINE_HAS_HPAGE && pmd_present(pmd)) {
113 origin = pmd_val(pmd) & _SEGMENT_ENTRY_ORIGIN;
114 pmd_val(pmd) &= ~_SEGMENT_ENTRY_ORIGIN;
115 pmd_val(pmd) |= *(unsigned long *) origin;
23 } 116 }
117 return __pmd_to_pte(pmd);
118}
24 119
25 pmd_val(*pmdp) = pte_val(pteval); 120pte_t huge_ptep_get_and_clear(struct mm_struct *mm,
121 unsigned long addr, pte_t *ptep)
122{
123 pmd_t *pmdp = (pmd_t *) ptep;
124 pte_t pte = huge_ptep_get(ptep);
125
126 if (MACHINE_HAS_IDTE)
127 __pmd_idte(addr, pmdp);
128 else
129 __pmd_csp(pmdp);
130 pmd_val(*pmdp) = _SEGMENT_ENTRY_EMPTY;
131 return pte;
26} 132}
27 133
28int arch_prepare_hugepage(struct page *page) 134int arch_prepare_hugepage(struct page *page)
@@ -58,7 +164,7 @@ void arch_release_hugepage(struct page *page)
58 ptep = (pte_t *) page[1].index; 164 ptep = (pte_t *) page[1].index;
59 if (!ptep) 165 if (!ptep)
60 return; 166 return;
61 clear_table((unsigned long *) ptep, _PAGE_TYPE_EMPTY, 167 clear_table((unsigned long *) ptep, _PAGE_INVALID,
62 PTRS_PER_PTE * sizeof(pte_t)); 168 PTRS_PER_PTE * sizeof(pte_t));
63 page_table_free(&init_mm, (unsigned long *) ptep); 169 page_table_free(&init_mm, (unsigned long *) ptep);
64 page[1].index = 0; 170 page[1].index = 0;
@@ -117,6 +223,11 @@ int pud_huge(pud_t pud)
117 return 0; 223 return 0;
118} 224}
119 225
226int pmd_huge_support(void)
227{
228 return 1;
229}
230
120struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address, 231struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address,
121 pmd_t *pmdp, int write) 232 pmd_t *pmdp, int write)
122{ 233{
diff --git a/arch/s390/mm/maccess.c b/arch/s390/mm/maccess.c
index 921fa541dc04..d1e0e0c7a7e2 100644
--- a/arch/s390/mm/maccess.c
+++ b/arch/s390/mm/maccess.c
@@ -14,6 +14,7 @@
14#include <linux/gfp.h> 14#include <linux/gfp.h>
15#include <linux/cpu.h> 15#include <linux/cpu.h>
16#include <asm/ctl_reg.h> 16#include <asm/ctl_reg.h>
17#include <asm/io.h>
17 18
18/* 19/*
19 * This function writes to kernel memory bypassing DAT and possible 20 * This function writes to kernel memory bypassing DAT and possible
diff --git a/arch/s390/mm/pageattr.c b/arch/s390/mm/pageattr.c
index 80adfbf75065..990397420e6b 100644
--- a/arch/s390/mm/pageattr.c
+++ b/arch/s390/mm/pageattr.c
@@ -118,7 +118,7 @@ void kernel_map_pages(struct page *page, int numpages, int enable)
118 pte = pte_offset_kernel(pmd, address); 118 pte = pte_offset_kernel(pmd, address);
119 if (!enable) { 119 if (!enable) {
120 __ptep_ipte(address, pte); 120 __ptep_ipte(address, pte);
121 pte_val(*pte) = _PAGE_TYPE_EMPTY; 121 pte_val(*pte) = _PAGE_INVALID;
122 continue; 122 continue;
123 } 123 }
124 pte_val(*pte) = __pa(address); 124 pte_val(*pte) = __pa(address);
diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c
index a8154a1a2c94..de8cbc30dcd1 100644
--- a/arch/s390/mm/pgtable.c
+++ b/arch/s390/mm/pgtable.c
@@ -161,7 +161,7 @@ static int gmap_unlink_segment(struct gmap *gmap, unsigned long *table)
161 struct gmap_rmap *rmap; 161 struct gmap_rmap *rmap;
162 struct page *page; 162 struct page *page;
163 163
164 if (*table & _SEGMENT_ENTRY_INV) 164 if (*table & _SEGMENT_ENTRY_INVALID)
165 return 0; 165 return 0;
166 page = pfn_to_page(*table >> PAGE_SHIFT); 166 page = pfn_to_page(*table >> PAGE_SHIFT);
167 mp = (struct gmap_pgtable *) page->index; 167 mp = (struct gmap_pgtable *) page->index;
@@ -172,7 +172,7 @@ static int gmap_unlink_segment(struct gmap *gmap, unsigned long *table)
172 kfree(rmap); 172 kfree(rmap);
173 break; 173 break;
174 } 174 }
175 *table = _SEGMENT_ENTRY_INV | _SEGMENT_ENTRY_RO | mp->vmaddr; 175 *table = mp->vmaddr | _SEGMENT_ENTRY_INVALID | _SEGMENT_ENTRY_PROTECT;
176 return 1; 176 return 1;
177} 177}
178 178
@@ -245,7 +245,9 @@ EXPORT_SYMBOL_GPL(gmap_disable);
245 * gmap_alloc_table is assumed to be called with mmap_sem held 245 * gmap_alloc_table is assumed to be called with mmap_sem held
246 */ 246 */
247static int gmap_alloc_table(struct gmap *gmap, 247static int gmap_alloc_table(struct gmap *gmap,
248 unsigned long *table, unsigned long init) 248 unsigned long *table, unsigned long init)
249 __releases(&gmap->mm->page_table_lock)
250 __acquires(&gmap->mm->page_table_lock)
249{ 251{
250 struct page *page; 252 struct page *page;
251 unsigned long *new; 253 unsigned long *new;
@@ -258,7 +260,7 @@ static int gmap_alloc_table(struct gmap *gmap,
258 return -ENOMEM; 260 return -ENOMEM;
259 new = (unsigned long *) page_to_phys(page); 261 new = (unsigned long *) page_to_phys(page);
260 crst_table_init(new, init); 262 crst_table_init(new, init);
261 if (*table & _REGION_ENTRY_INV) { 263 if (*table & _REGION_ENTRY_INVALID) {
262 list_add(&page->lru, &gmap->crst_list); 264 list_add(&page->lru, &gmap->crst_list);
263 *table = (unsigned long) new | _REGION_ENTRY_LENGTH | 265 *table = (unsigned long) new | _REGION_ENTRY_LENGTH |
264 (*table & _REGION_ENTRY_TYPE_MASK); 266 (*table & _REGION_ENTRY_TYPE_MASK);
@@ -292,22 +294,22 @@ int gmap_unmap_segment(struct gmap *gmap, unsigned long to, unsigned long len)
292 for (off = 0; off < len; off += PMD_SIZE) { 294 for (off = 0; off < len; off += PMD_SIZE) {
293 /* Walk the guest addr space page table */ 295 /* Walk the guest addr space page table */
294 table = gmap->table + (((to + off) >> 53) & 0x7ff); 296 table = gmap->table + (((to + off) >> 53) & 0x7ff);
295 if (*table & _REGION_ENTRY_INV) 297 if (*table & _REGION_ENTRY_INVALID)
296 goto out; 298 goto out;
297 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); 299 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
298 table = table + (((to + off) >> 42) & 0x7ff); 300 table = table + (((to + off) >> 42) & 0x7ff);
299 if (*table & _REGION_ENTRY_INV) 301 if (*table & _REGION_ENTRY_INVALID)
300 goto out; 302 goto out;
301 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); 303 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
302 table = table + (((to + off) >> 31) & 0x7ff); 304 table = table + (((to + off) >> 31) & 0x7ff);
303 if (*table & _REGION_ENTRY_INV) 305 if (*table & _REGION_ENTRY_INVALID)
304 goto out; 306 goto out;
305 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); 307 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
306 table = table + (((to + off) >> 20) & 0x7ff); 308 table = table + (((to + off) >> 20) & 0x7ff);
307 309
308 /* Clear segment table entry in guest address space. */ 310 /* Clear segment table entry in guest address space. */
309 flush |= gmap_unlink_segment(gmap, table); 311 flush |= gmap_unlink_segment(gmap, table);
310 *table = _SEGMENT_ENTRY_INV; 312 *table = _SEGMENT_ENTRY_INVALID;
311 } 313 }
312out: 314out:
313 spin_unlock(&gmap->mm->page_table_lock); 315 spin_unlock(&gmap->mm->page_table_lock);
@@ -335,7 +337,7 @@ int gmap_map_segment(struct gmap *gmap, unsigned long from,
335 337
336 if ((from | to | len) & (PMD_SIZE - 1)) 338 if ((from | to | len) & (PMD_SIZE - 1))
337 return -EINVAL; 339 return -EINVAL;
338 if (len == 0 || from + len > PGDIR_SIZE || 340 if (len == 0 || from + len > TASK_MAX_SIZE ||
339 from + len < from || to + len < to) 341 from + len < from || to + len < to)
340 return -EINVAL; 342 return -EINVAL;
341 343
@@ -345,17 +347,17 @@ int gmap_map_segment(struct gmap *gmap, unsigned long from,
345 for (off = 0; off < len; off += PMD_SIZE) { 347 for (off = 0; off < len; off += PMD_SIZE) {
346 /* Walk the gmap address space page table */ 348 /* Walk the gmap address space page table */
347 table = gmap->table + (((to + off) >> 53) & 0x7ff); 349 table = gmap->table + (((to + off) >> 53) & 0x7ff);
348 if ((*table & _REGION_ENTRY_INV) && 350 if ((*table & _REGION_ENTRY_INVALID) &&
349 gmap_alloc_table(gmap, table, _REGION2_ENTRY_EMPTY)) 351 gmap_alloc_table(gmap, table, _REGION2_ENTRY_EMPTY))
350 goto out_unmap; 352 goto out_unmap;
351 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); 353 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
352 table = table + (((to + off) >> 42) & 0x7ff); 354 table = table + (((to + off) >> 42) & 0x7ff);
353 if ((*table & _REGION_ENTRY_INV) && 355 if ((*table & _REGION_ENTRY_INVALID) &&
354 gmap_alloc_table(gmap, table, _REGION3_ENTRY_EMPTY)) 356 gmap_alloc_table(gmap, table, _REGION3_ENTRY_EMPTY))
355 goto out_unmap; 357 goto out_unmap;
356 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); 358 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
357 table = table + (((to + off) >> 31) & 0x7ff); 359 table = table + (((to + off) >> 31) & 0x7ff);
358 if ((*table & _REGION_ENTRY_INV) && 360 if ((*table & _REGION_ENTRY_INVALID) &&
359 gmap_alloc_table(gmap, table, _SEGMENT_ENTRY_EMPTY)) 361 gmap_alloc_table(gmap, table, _SEGMENT_ENTRY_EMPTY))
360 goto out_unmap; 362 goto out_unmap;
361 table = (unsigned long *) (*table & _REGION_ENTRY_ORIGIN); 363 table = (unsigned long *) (*table & _REGION_ENTRY_ORIGIN);
@@ -363,7 +365,8 @@ int gmap_map_segment(struct gmap *gmap, unsigned long from,
363 365
364 /* Store 'from' address in an invalid segment table entry. */ 366 /* Store 'from' address in an invalid segment table entry. */
365 flush |= gmap_unlink_segment(gmap, table); 367 flush |= gmap_unlink_segment(gmap, table);
366 *table = _SEGMENT_ENTRY_INV | _SEGMENT_ENTRY_RO | (from + off); 368 *table = (from + off) | (_SEGMENT_ENTRY_INVALID |
369 _SEGMENT_ENTRY_PROTECT);
367 } 370 }
368 spin_unlock(&gmap->mm->page_table_lock); 371 spin_unlock(&gmap->mm->page_table_lock);
369 up_read(&gmap->mm->mmap_sem); 372 up_read(&gmap->mm->mmap_sem);
@@ -384,15 +387,15 @@ static unsigned long *gmap_table_walk(unsigned long address, struct gmap *gmap)
384 unsigned long *table; 387 unsigned long *table;
385 388
386 table = gmap->table + ((address >> 53) & 0x7ff); 389 table = gmap->table + ((address >> 53) & 0x7ff);
387 if (unlikely(*table & _REGION_ENTRY_INV)) 390 if (unlikely(*table & _REGION_ENTRY_INVALID))
388 return ERR_PTR(-EFAULT); 391 return ERR_PTR(-EFAULT);
389 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); 392 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
390 table = table + ((address >> 42) & 0x7ff); 393 table = table + ((address >> 42) & 0x7ff);
391 if (unlikely(*table & _REGION_ENTRY_INV)) 394 if (unlikely(*table & _REGION_ENTRY_INVALID))
392 return ERR_PTR(-EFAULT); 395 return ERR_PTR(-EFAULT);
393 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); 396 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
394 table = table + ((address >> 31) & 0x7ff); 397 table = table + ((address >> 31) & 0x7ff);
395 if (unlikely(*table & _REGION_ENTRY_INV)) 398 if (unlikely(*table & _REGION_ENTRY_INVALID))
396 return ERR_PTR(-EFAULT); 399 return ERR_PTR(-EFAULT);
397 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); 400 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
398 table = table + ((address >> 20) & 0x7ff); 401 table = table + ((address >> 20) & 0x7ff);
@@ -422,11 +425,11 @@ unsigned long __gmap_translate(unsigned long address, struct gmap *gmap)
422 return PTR_ERR(segment_ptr); 425 return PTR_ERR(segment_ptr);
423 /* Convert the gmap address to an mm address. */ 426 /* Convert the gmap address to an mm address. */
424 segment = *segment_ptr; 427 segment = *segment_ptr;
425 if (!(segment & _SEGMENT_ENTRY_INV)) { 428 if (!(segment & _SEGMENT_ENTRY_INVALID)) {
426 page = pfn_to_page(segment >> PAGE_SHIFT); 429 page = pfn_to_page(segment >> PAGE_SHIFT);
427 mp = (struct gmap_pgtable *) page->index; 430 mp = (struct gmap_pgtable *) page->index;
428 return mp->vmaddr | (address & ~PMD_MASK); 431 return mp->vmaddr | (address & ~PMD_MASK);
429 } else if (segment & _SEGMENT_ENTRY_RO) { 432 } else if (segment & _SEGMENT_ENTRY_PROTECT) {
430 vmaddr = segment & _SEGMENT_ENTRY_ORIGIN; 433 vmaddr = segment & _SEGMENT_ENTRY_ORIGIN;
431 return vmaddr | (address & ~PMD_MASK); 434 return vmaddr | (address & ~PMD_MASK);
432 } 435 }
@@ -517,8 +520,8 @@ static void gmap_disconnect_pgtable(struct mm_struct *mm, unsigned long *table)
517 page = pfn_to_page(__pa(table) >> PAGE_SHIFT); 520 page = pfn_to_page(__pa(table) >> PAGE_SHIFT);
518 mp = (struct gmap_pgtable *) page->index; 521 mp = (struct gmap_pgtable *) page->index;
519 list_for_each_entry_safe(rmap, next, &mp->mapper, list) { 522 list_for_each_entry_safe(rmap, next, &mp->mapper, list) {
520 *rmap->entry = 523 *rmap->entry = mp->vmaddr | (_SEGMENT_ENTRY_INVALID |
521 _SEGMENT_ENTRY_INV | _SEGMENT_ENTRY_RO | mp->vmaddr; 524 _SEGMENT_ENTRY_PROTECT);
522 list_del(&rmap->list); 525 list_del(&rmap->list);
523 kfree(rmap); 526 kfree(rmap);
524 flush = 1; 527 flush = 1;
@@ -545,13 +548,13 @@ unsigned long __gmap_fault(unsigned long address, struct gmap *gmap)
545 /* Convert the gmap address to an mm address. */ 548 /* Convert the gmap address to an mm address. */
546 while (1) { 549 while (1) {
547 segment = *segment_ptr; 550 segment = *segment_ptr;
548 if (!(segment & _SEGMENT_ENTRY_INV)) { 551 if (!(segment & _SEGMENT_ENTRY_INVALID)) {
549 /* Page table is present */ 552 /* Page table is present */
550 page = pfn_to_page(segment >> PAGE_SHIFT); 553 page = pfn_to_page(segment >> PAGE_SHIFT);
551 mp = (struct gmap_pgtable *) page->index; 554 mp = (struct gmap_pgtable *) page->index;
552 return mp->vmaddr | (address & ~PMD_MASK); 555 return mp->vmaddr | (address & ~PMD_MASK);
553 } 556 }
554 if (!(segment & _SEGMENT_ENTRY_RO)) 557 if (!(segment & _SEGMENT_ENTRY_PROTECT))
555 /* Nothing mapped in the gmap address space. */ 558 /* Nothing mapped in the gmap address space. */
556 break; 559 break;
557 rc = gmap_connect_pgtable(address, segment, segment_ptr, gmap); 560 rc = gmap_connect_pgtable(address, segment, segment_ptr, gmap);
@@ -586,25 +589,25 @@ void gmap_discard(unsigned long from, unsigned long to, struct gmap *gmap)
586 while (address < to) { 589 while (address < to) {
587 /* Walk the gmap address space page table */ 590 /* Walk the gmap address space page table */
588 table = gmap->table + ((address >> 53) & 0x7ff); 591 table = gmap->table + ((address >> 53) & 0x7ff);
589 if (unlikely(*table & _REGION_ENTRY_INV)) { 592 if (unlikely(*table & _REGION_ENTRY_INVALID)) {
590 address = (address + PMD_SIZE) & PMD_MASK; 593 address = (address + PMD_SIZE) & PMD_MASK;
591 continue; 594 continue;
592 } 595 }
593 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); 596 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
594 table = table + ((address >> 42) & 0x7ff); 597 table = table + ((address >> 42) & 0x7ff);
595 if (unlikely(*table & _REGION_ENTRY_INV)) { 598 if (unlikely(*table & _REGION_ENTRY_INVALID)) {
596 address = (address + PMD_SIZE) & PMD_MASK; 599 address = (address + PMD_SIZE) & PMD_MASK;
597 continue; 600 continue;
598 } 601 }
599 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); 602 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
600 table = table + ((address >> 31) & 0x7ff); 603 table = table + ((address >> 31) & 0x7ff);
601 if (unlikely(*table & _REGION_ENTRY_INV)) { 604 if (unlikely(*table & _REGION_ENTRY_INVALID)) {
602 address = (address + PMD_SIZE) & PMD_MASK; 605 address = (address + PMD_SIZE) & PMD_MASK;
603 continue; 606 continue;
604 } 607 }
605 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN); 608 table = (unsigned long *)(*table & _REGION_ENTRY_ORIGIN);
606 table = table + ((address >> 20) & 0x7ff); 609 table = table + ((address >> 20) & 0x7ff);
607 if (unlikely(*table & _SEGMENT_ENTRY_INV)) { 610 if (unlikely(*table & _SEGMENT_ENTRY_INVALID)) {
608 address = (address + PMD_SIZE) & PMD_MASK; 611 address = (address + PMD_SIZE) & PMD_MASK;
609 continue; 612 continue;
610 } 613 }
@@ -687,7 +690,7 @@ int gmap_ipte_notify(struct gmap *gmap, unsigned long start, unsigned long len)
687 continue; 690 continue;
688 /* Set notification bit in the pgste of the pte */ 691 /* Set notification bit in the pgste of the pte */
689 entry = *ptep; 692 entry = *ptep;
690 if ((pte_val(entry) & (_PAGE_INVALID | _PAGE_RO)) == 0) { 693 if ((pte_val(entry) & (_PAGE_INVALID | _PAGE_PROTECT)) == 0) {
691 pgste = pgste_get_lock(ptep); 694 pgste = pgste_get_lock(ptep);
692 pgste_val(pgste) |= PGSTE_IN_BIT; 695 pgste_val(pgste) |= PGSTE_IN_BIT;
693 pgste_set_unlock(ptep, pgste); 696 pgste_set_unlock(ptep, pgste);
@@ -731,6 +734,11 @@ void gmap_do_ipte_notify(struct mm_struct *mm, unsigned long addr, pte_t *pte)
731 spin_unlock(&gmap_notifier_lock); 734 spin_unlock(&gmap_notifier_lock);
732} 735}
733 736
737static inline int page_table_with_pgste(struct page *page)
738{
739 return atomic_read(&page->_mapcount) == 0;
740}
741
734static inline unsigned long *page_table_alloc_pgste(struct mm_struct *mm, 742static inline unsigned long *page_table_alloc_pgste(struct mm_struct *mm,
735 unsigned long vmaddr) 743 unsigned long vmaddr)
736{ 744{
@@ -750,10 +758,11 @@ static inline unsigned long *page_table_alloc_pgste(struct mm_struct *mm,
750 mp->vmaddr = vmaddr & PMD_MASK; 758 mp->vmaddr = vmaddr & PMD_MASK;
751 INIT_LIST_HEAD(&mp->mapper); 759 INIT_LIST_HEAD(&mp->mapper);
752 page->index = (unsigned long) mp; 760 page->index = (unsigned long) mp;
753 atomic_set(&page->_mapcount, 3); 761 atomic_set(&page->_mapcount, 0);
754 table = (unsigned long *) page_to_phys(page); 762 table = (unsigned long *) page_to_phys(page);
755 clear_table(table, _PAGE_TYPE_EMPTY, PAGE_SIZE/2); 763 clear_table(table, _PAGE_INVALID, PAGE_SIZE/2);
756 clear_table(table + PTRS_PER_PTE, 0, PAGE_SIZE/2); 764 clear_table(table + PTRS_PER_PTE, PGSTE_HR_BIT | PGSTE_HC_BIT,
765 PAGE_SIZE/2);
757 return table; 766 return table;
758} 767}
759 768
@@ -791,26 +800,21 @@ int set_guest_storage_key(struct mm_struct *mm, unsigned long addr,
791 pgste_val(new) |= (key & (_PAGE_CHANGED | _PAGE_REFERENCED)) << 48; 800 pgste_val(new) |= (key & (_PAGE_CHANGED | _PAGE_REFERENCED)) << 48;
792 pgste_val(new) |= (key & (_PAGE_ACC_BITS | _PAGE_FP_BIT)) << 56; 801 pgste_val(new) |= (key & (_PAGE_ACC_BITS | _PAGE_FP_BIT)) << 56;
793 if (!(pte_val(*ptep) & _PAGE_INVALID)) { 802 if (!(pte_val(*ptep) & _PAGE_INVALID)) {
794 unsigned long address, bits; 803 unsigned long address, bits, skey;
795 unsigned char skey;
796 804
797 address = pte_val(*ptep) & PAGE_MASK; 805 address = pte_val(*ptep) & PAGE_MASK;
798 skey = page_get_storage_key(address); 806 skey = (unsigned long) page_get_storage_key(address);
799 bits = skey & (_PAGE_CHANGED | _PAGE_REFERENCED); 807 bits = skey & (_PAGE_CHANGED | _PAGE_REFERENCED);
808 skey = key & (_PAGE_ACC_BITS | _PAGE_FP_BIT);
800 /* Set storage key ACC and FP */ 809 /* Set storage key ACC and FP */
801 page_set_storage_key(address, 810 page_set_storage_key(address, skey, !nq);
802 (key & (_PAGE_ACC_BITS | _PAGE_FP_BIT)),
803 !nq);
804
805 /* Merge host changed & referenced into pgste */ 811 /* Merge host changed & referenced into pgste */
806 pgste_val(new) |= bits << 52; 812 pgste_val(new) |= bits << 52;
807 /* Transfer skey changed & referenced bit to kvm user bits */
808 pgste_val(new) |= bits << 45; /* PGSTE_UR_BIT & PGSTE_UC_BIT */
809 } 813 }
810 /* changing the guest storage key is considered a change of the page */ 814 /* changing the guest storage key is considered a change of the page */
811 if ((pgste_val(new) ^ pgste_val(old)) & 815 if ((pgste_val(new) ^ pgste_val(old)) &
812 (PGSTE_ACC_BITS | PGSTE_FP_BIT | PGSTE_GR_BIT | PGSTE_GC_BIT)) 816 (PGSTE_ACC_BITS | PGSTE_FP_BIT | PGSTE_GR_BIT | PGSTE_GC_BIT))
813 pgste_val(new) |= PGSTE_UC_BIT; 817 pgste_val(new) |= PGSTE_HC_BIT;
814 818
815 pgste_set_unlock(ptep, new); 819 pgste_set_unlock(ptep, new);
816 pte_unmap_unlock(*ptep, ptl); 820 pte_unmap_unlock(*ptep, ptl);
@@ -821,6 +825,11 @@ EXPORT_SYMBOL(set_guest_storage_key);
821 825
822#else /* CONFIG_PGSTE */ 826#else /* CONFIG_PGSTE */
823 827
828static inline int page_table_with_pgste(struct page *page)
829{
830 return 0;
831}
832
824static inline unsigned long *page_table_alloc_pgste(struct mm_struct *mm, 833static inline unsigned long *page_table_alloc_pgste(struct mm_struct *mm,
825 unsigned long vmaddr) 834 unsigned long vmaddr)
826{ 835{
@@ -878,7 +887,7 @@ unsigned long *page_table_alloc(struct mm_struct *mm, unsigned long vmaddr)
878 pgtable_page_ctor(page); 887 pgtable_page_ctor(page);
879 atomic_set(&page->_mapcount, 1); 888 atomic_set(&page->_mapcount, 1);
880 table = (unsigned long *) page_to_phys(page); 889 table = (unsigned long *) page_to_phys(page);
881 clear_table(table, _PAGE_TYPE_EMPTY, PAGE_SIZE); 890 clear_table(table, _PAGE_INVALID, PAGE_SIZE);
882 spin_lock_bh(&mm->context.list_lock); 891 spin_lock_bh(&mm->context.list_lock);
883 list_add(&page->lru, &mm->context.pgtable_list); 892 list_add(&page->lru, &mm->context.pgtable_list);
884 } else { 893 } else {
@@ -897,12 +906,12 @@ void page_table_free(struct mm_struct *mm, unsigned long *table)
897 struct page *page; 906 struct page *page;
898 unsigned int bit, mask; 907 unsigned int bit, mask;
899 908
900 if (mm_has_pgste(mm)) { 909 page = pfn_to_page(__pa(table) >> PAGE_SHIFT);
910 if (page_table_with_pgste(page)) {
901 gmap_disconnect_pgtable(mm, table); 911 gmap_disconnect_pgtable(mm, table);
902 return page_table_free_pgste(table); 912 return page_table_free_pgste(table);
903 } 913 }
904 /* Free 1K/2K page table fragment of a 4K page */ 914 /* Free 1K/2K page table fragment of a 4K page */
905 page = pfn_to_page(__pa(table) >> PAGE_SHIFT);
906 bit = 1 << ((__pa(table) & ~PAGE_MASK)/(PTRS_PER_PTE*sizeof(pte_t))); 915 bit = 1 << ((__pa(table) & ~PAGE_MASK)/(PTRS_PER_PTE*sizeof(pte_t)));
907 spin_lock_bh(&mm->context.list_lock); 916 spin_lock_bh(&mm->context.list_lock);
908 if ((atomic_read(&page->_mapcount) & FRAG_MASK) != FRAG_MASK) 917 if ((atomic_read(&page->_mapcount) & FRAG_MASK) != FRAG_MASK)
@@ -940,14 +949,14 @@ void page_table_free_rcu(struct mmu_gather *tlb, unsigned long *table)
940 unsigned int bit, mask; 949 unsigned int bit, mask;
941 950
942 mm = tlb->mm; 951 mm = tlb->mm;
943 if (mm_has_pgste(mm)) { 952 page = pfn_to_page(__pa(table) >> PAGE_SHIFT);
953 if (page_table_with_pgste(page)) {
944 gmap_disconnect_pgtable(mm, table); 954 gmap_disconnect_pgtable(mm, table);
945 table = (unsigned long *) (__pa(table) | FRAG_MASK); 955 table = (unsigned long *) (__pa(table) | FRAG_MASK);
946 tlb_remove_table(tlb, table); 956 tlb_remove_table(tlb, table);
947 return; 957 return;
948 } 958 }
949 bit = 1 << ((__pa(table) & ~PAGE_MASK) / (PTRS_PER_PTE*sizeof(pte_t))); 959 bit = 1 << ((__pa(table) & ~PAGE_MASK) / (PTRS_PER_PTE*sizeof(pte_t)));
950 page = pfn_to_page(__pa(table) >> PAGE_SHIFT);
951 spin_lock_bh(&mm->context.list_lock); 960 spin_lock_bh(&mm->context.list_lock);
952 if ((atomic_read(&page->_mapcount) & FRAG_MASK) != FRAG_MASK) 961 if ((atomic_read(&page->_mapcount) & FRAG_MASK) != FRAG_MASK)
953 list_del(&page->lru); 962 list_del(&page->lru);
@@ -959,7 +968,7 @@ void page_table_free_rcu(struct mmu_gather *tlb, unsigned long *table)
959 tlb_remove_table(tlb, table); 968 tlb_remove_table(tlb, table);
960} 969}
961 970
962void __tlb_remove_table(void *_table) 971static void __tlb_remove_table(void *_table)
963{ 972{
964 const unsigned long mask = (FRAG_MASK << 4) | FRAG_MASK; 973 const unsigned long mask = (FRAG_MASK << 4) | FRAG_MASK;
965 void *table = (void *)((unsigned long) _table & ~mask); 974 void *table = (void *)((unsigned long) _table & ~mask);
@@ -1007,7 +1016,6 @@ void tlb_table_flush(struct mmu_gather *tlb)
1007 struct mmu_table_batch **batch = &tlb->batch; 1016 struct mmu_table_batch **batch = &tlb->batch;
1008 1017
1009 if (*batch) { 1018 if (*batch) {
1010 __tlb_flush_mm(tlb->mm);
1011 call_rcu_sched(&(*batch)->rcu, tlb_remove_table_rcu); 1019 call_rcu_sched(&(*batch)->rcu, tlb_remove_table_rcu);
1012 *batch = NULL; 1020 *batch = NULL;
1013 } 1021 }
@@ -1017,11 +1025,12 @@ void tlb_remove_table(struct mmu_gather *tlb, void *table)
1017{ 1025{
1018 struct mmu_table_batch **batch = &tlb->batch; 1026 struct mmu_table_batch **batch = &tlb->batch;
1019 1027
1028 tlb->mm->context.flush_mm = 1;
1020 if (*batch == NULL) { 1029 if (*batch == NULL) {
1021 *batch = (struct mmu_table_batch *) 1030 *batch = (struct mmu_table_batch *)
1022 __get_free_page(GFP_NOWAIT | __GFP_NOWARN); 1031 __get_free_page(GFP_NOWAIT | __GFP_NOWARN);
1023 if (*batch == NULL) { 1032 if (*batch == NULL) {
1024 __tlb_flush_mm(tlb->mm); 1033 __tlb_flush_mm_lazy(tlb->mm);
1025 tlb_remove_table_one(table); 1034 tlb_remove_table_one(table);
1026 return; 1035 return;
1027 } 1036 }
@@ -1029,40 +1038,124 @@ void tlb_remove_table(struct mmu_gather *tlb, void *table)
1029 } 1038 }
1030 (*batch)->tables[(*batch)->nr++] = table; 1039 (*batch)->tables[(*batch)->nr++] = table;
1031 if ((*batch)->nr == MAX_TABLE_BATCH) 1040 if ((*batch)->nr == MAX_TABLE_BATCH)
1032 tlb_table_flush(tlb); 1041 tlb_flush_mmu(tlb);
1033} 1042}
1034 1043
1035#ifdef CONFIG_TRANSPARENT_HUGEPAGE 1044#ifdef CONFIG_TRANSPARENT_HUGEPAGE
1036void thp_split_vma(struct vm_area_struct *vma) 1045static inline void thp_split_vma(struct vm_area_struct *vma)
1037{ 1046{
1038 unsigned long addr; 1047 unsigned long addr;
1039 struct page *page;
1040 1048
1041 for (addr = vma->vm_start; addr < vma->vm_end; addr += PAGE_SIZE) { 1049 for (addr = vma->vm_start; addr < vma->vm_end; addr += PAGE_SIZE)
1042 page = follow_page(vma, addr, FOLL_SPLIT); 1050 follow_page(vma, addr, FOLL_SPLIT);
1043 }
1044} 1051}
1045 1052
1046void thp_split_mm(struct mm_struct *mm) 1053static inline void thp_split_mm(struct mm_struct *mm)
1047{ 1054{
1048 struct vm_area_struct *vma = mm->mmap; 1055 struct vm_area_struct *vma;
1049 1056
1050 while (vma != NULL) { 1057 for (vma = mm->mmap; vma != NULL; vma = vma->vm_next) {
1051 thp_split_vma(vma); 1058 thp_split_vma(vma);
1052 vma->vm_flags &= ~VM_HUGEPAGE; 1059 vma->vm_flags &= ~VM_HUGEPAGE;
1053 vma->vm_flags |= VM_NOHUGEPAGE; 1060 vma->vm_flags |= VM_NOHUGEPAGE;
1054 vma = vma->vm_next;
1055 } 1061 }
1062 mm->def_flags |= VM_NOHUGEPAGE;
1063}
1064#else
1065static inline void thp_split_mm(struct mm_struct *mm)
1066{
1056} 1067}
1057#endif /* CONFIG_TRANSPARENT_HUGEPAGE */ 1068#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
1058 1069
1070static unsigned long page_table_realloc_pmd(struct mmu_gather *tlb,
1071 struct mm_struct *mm, pud_t *pud,
1072 unsigned long addr, unsigned long end)
1073{
1074 unsigned long next, *table, *new;
1075 struct page *page;
1076 pmd_t *pmd;
1077
1078 pmd = pmd_offset(pud, addr);
1079 do {
1080 next = pmd_addr_end(addr, end);
1081again:
1082 if (pmd_none_or_clear_bad(pmd))
1083 continue;
1084 table = (unsigned long *) pmd_deref(*pmd);
1085 page = pfn_to_page(__pa(table) >> PAGE_SHIFT);
1086 if (page_table_with_pgste(page))
1087 continue;
1088 /* Allocate new page table with pgstes */
1089 new = page_table_alloc_pgste(mm, addr);
1090 if (!new) {
1091 mm->context.has_pgste = 0;
1092 continue;
1093 }
1094 spin_lock(&mm->page_table_lock);
1095 if (likely((unsigned long *) pmd_deref(*pmd) == table)) {
1096 /* Nuke pmd entry pointing to the "short" page table */
1097 pmdp_flush_lazy(mm, addr, pmd);
1098 pmd_clear(pmd);
1099 /* Copy ptes from old table to new table */
1100 memcpy(new, table, PAGE_SIZE/2);
1101 clear_table(table, _PAGE_INVALID, PAGE_SIZE/2);
1102 /* Establish new table */
1103 pmd_populate(mm, pmd, (pte_t *) new);
1104 /* Free old table with rcu, there might be a walker! */
1105 page_table_free_rcu(tlb, table);
1106 new = NULL;
1107 }
1108 spin_unlock(&mm->page_table_lock);
1109 if (new) {
1110 page_table_free_pgste(new);
1111 goto again;
1112 }
1113 } while (pmd++, addr = next, addr != end);
1114
1115 return addr;
1116}
1117
1118static unsigned long page_table_realloc_pud(struct mmu_gather *tlb,
1119 struct mm_struct *mm, pgd_t *pgd,
1120 unsigned long addr, unsigned long end)
1121{
1122 unsigned long next;
1123 pud_t *pud;
1124
1125 pud = pud_offset(pgd, addr);
1126 do {
1127 next = pud_addr_end(addr, end);
1128 if (pud_none_or_clear_bad(pud))
1129 continue;
1130 next = page_table_realloc_pmd(tlb, mm, pud, addr, next);
1131 } while (pud++, addr = next, addr != end);
1132
1133 return addr;
1134}
1135
1136static void page_table_realloc(struct mmu_gather *tlb, struct mm_struct *mm,
1137 unsigned long addr, unsigned long end)
1138{
1139 unsigned long next;
1140 pgd_t *pgd;
1141
1142 pgd = pgd_offset(mm, addr);
1143 do {
1144 next = pgd_addr_end(addr, end);
1145 if (pgd_none_or_clear_bad(pgd))
1146 continue;
1147 next = page_table_realloc_pud(tlb, mm, pgd, addr, next);
1148 } while (pgd++, addr = next, addr != end);
1149}
1150
1059/* 1151/*
1060 * switch on pgstes for its userspace process (for kvm) 1152 * switch on pgstes for its userspace process (for kvm)
1061 */ 1153 */
1062int s390_enable_sie(void) 1154int s390_enable_sie(void)
1063{ 1155{
1064 struct task_struct *tsk = current; 1156 struct task_struct *tsk = current;
1065 struct mm_struct *mm, *old_mm; 1157 struct mm_struct *mm = tsk->mm;
1158 struct mmu_gather tlb;
1066 1159
1067 /* Do we have switched amode? If no, we cannot do sie */ 1160 /* Do we have switched amode? If no, we cannot do sie */
1068 if (s390_user_mode == HOME_SPACE_MODE) 1161 if (s390_user_mode == HOME_SPACE_MODE)
@@ -1072,57 +1165,16 @@ int s390_enable_sie(void)
1072 if (mm_has_pgste(tsk->mm)) 1165 if (mm_has_pgste(tsk->mm))
1073 return 0; 1166 return 0;
1074 1167
1075 /* lets check if we are allowed to replace the mm */ 1168 down_write(&mm->mmap_sem);
1076 task_lock(tsk);
1077 if (!tsk->mm || atomic_read(&tsk->mm->mm_users) > 1 ||
1078#ifdef CONFIG_AIO
1079 !hlist_empty(&tsk->mm->ioctx_list) ||
1080#endif
1081 tsk->mm != tsk->active_mm) {
1082 task_unlock(tsk);
1083 return -EINVAL;
1084 }
1085 task_unlock(tsk);
1086
1087 /* we copy the mm and let dup_mm create the page tables with_pgstes */
1088 tsk->mm->context.alloc_pgste = 1;
1089 /* make sure that both mms have a correct rss state */
1090 sync_mm_rss(tsk->mm);
1091 mm = dup_mm(tsk);
1092 tsk->mm->context.alloc_pgste = 0;
1093 if (!mm)
1094 return -ENOMEM;
1095
1096#ifdef CONFIG_TRANSPARENT_HUGEPAGE
1097 /* split thp mappings and disable thp for future mappings */ 1169 /* split thp mappings and disable thp for future mappings */
1098 thp_split_mm(mm); 1170 thp_split_mm(mm);
1099 mm->def_flags |= VM_NOHUGEPAGE; 1171 /* Reallocate the page tables with pgstes */
1100#endif 1172 mm->context.has_pgste = 1;
1101 1173 tlb_gather_mmu(&tlb, mm, 0, TASK_SIZE);
1102 /* Now lets check again if something happened */ 1174 page_table_realloc(&tlb, mm, 0, TASK_SIZE);
1103 task_lock(tsk); 1175 tlb_finish_mmu(&tlb, 0, TASK_SIZE);
1104 if (!tsk->mm || atomic_read(&tsk->mm->mm_users) > 1 || 1176 up_write(&mm->mmap_sem);
1105#ifdef CONFIG_AIO 1177 return mm->context.has_pgste ? 0 : -ENOMEM;
1106 !hlist_empty(&tsk->mm->ioctx_list) ||
1107#endif
1108 tsk->mm != tsk->active_mm) {
1109 mmput(mm);
1110 task_unlock(tsk);
1111 return -EINVAL;
1112 }
1113
1114 /* ok, we are alone. No ptrace, no threads, etc. */
1115 old_mm = tsk->mm;
1116 tsk->mm = tsk->active_mm = mm;
1117 preempt_disable();
1118 update_mm(mm, tsk);
1119 atomic_inc(&mm->context.attach_count);
1120 atomic_dec(&old_mm->context.attach_count);
1121 cpumask_set_cpu(smp_processor_id(), mm_cpumask(mm));
1122 preempt_enable();
1123 task_unlock(tsk);
1124 mmput(old_mm);
1125 return 0;
1126} 1178}
1127EXPORT_SYMBOL_GPL(s390_enable_sie); 1179EXPORT_SYMBOL_GPL(s390_enable_sie);
1128 1180
@@ -1198,9 +1250,9 @@ pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp)
1198 list_del(lh); 1250 list_del(lh);
1199 } 1251 }
1200 ptep = (pte_t *) pgtable; 1252 ptep = (pte_t *) pgtable;
1201 pte_val(*ptep) = _PAGE_TYPE_EMPTY; 1253 pte_val(*ptep) = _PAGE_INVALID;
1202 ptep++; 1254 ptep++;
1203 pte_val(*ptep) = _PAGE_TYPE_EMPTY; 1255 pte_val(*ptep) = _PAGE_INVALID;
1204 return pgtable; 1256 return pgtable;
1205} 1257}
1206#endif /* CONFIG_TRANSPARENT_HUGEPAGE */ 1258#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
diff --git a/arch/s390/mm/vmem.c b/arch/s390/mm/vmem.c
index 8b268fcc4612..bcfb70b60be6 100644
--- a/arch/s390/mm/vmem.c
+++ b/arch/s390/mm/vmem.c
@@ -69,7 +69,7 @@ static pte_t __ref *vmem_pte_alloc(unsigned long address)
69 pte = alloc_bootmem(PTRS_PER_PTE * sizeof(pte_t)); 69 pte = alloc_bootmem(PTRS_PER_PTE * sizeof(pte_t));
70 if (!pte) 70 if (!pte)
71 return NULL; 71 return NULL;
72 clear_table((unsigned long *) pte, _PAGE_TYPE_EMPTY, 72 clear_table((unsigned long *) pte, _PAGE_INVALID,
73 PTRS_PER_PTE * sizeof(pte_t)); 73 PTRS_PER_PTE * sizeof(pte_t));
74 return pte; 74 return pte;
75} 75}
@@ -101,7 +101,7 @@ static int vmem_add_mem(unsigned long start, unsigned long size, int ro)
101 !(address & ~PUD_MASK) && (address + PUD_SIZE <= end)) { 101 !(address & ~PUD_MASK) && (address + PUD_SIZE <= end)) {
102 pud_val(*pu_dir) = __pa(address) | 102 pud_val(*pu_dir) = __pa(address) |
103 _REGION_ENTRY_TYPE_R3 | _REGION3_ENTRY_LARGE | 103 _REGION_ENTRY_TYPE_R3 | _REGION3_ENTRY_LARGE |
104 (ro ? _REGION_ENTRY_RO : 0); 104 (ro ? _REGION_ENTRY_PROTECT : 0);
105 address += PUD_SIZE; 105 address += PUD_SIZE;
106 continue; 106 continue;
107 } 107 }
@@ -118,7 +118,8 @@ static int vmem_add_mem(unsigned long start, unsigned long size, int ro)
118 !(address & ~PMD_MASK) && (address + PMD_SIZE <= end)) { 118 !(address & ~PMD_MASK) && (address + PMD_SIZE <= end)) {
119 pmd_val(*pm_dir) = __pa(address) | 119 pmd_val(*pm_dir) = __pa(address) |
120 _SEGMENT_ENTRY | _SEGMENT_ENTRY_LARGE | 120 _SEGMENT_ENTRY | _SEGMENT_ENTRY_LARGE |
121 (ro ? _SEGMENT_ENTRY_RO : 0); 121 _SEGMENT_ENTRY_YOUNG |
122 (ro ? _SEGMENT_ENTRY_PROTECT : 0);
122 address += PMD_SIZE; 123 address += PMD_SIZE;
123 continue; 124 continue;
124 } 125 }
@@ -131,7 +132,8 @@ static int vmem_add_mem(unsigned long start, unsigned long size, int ro)
131 } 132 }
132 133
133 pt_dir = pte_offset_kernel(pm_dir, address); 134 pt_dir = pte_offset_kernel(pm_dir, address);
134 pte_val(*pt_dir) = __pa(address) | (ro ? _PAGE_RO : 0); 135 pte_val(*pt_dir) = __pa(address) |
136 pgprot_val(ro ? PAGE_KERNEL_RO : PAGE_KERNEL);
135 address += PAGE_SIZE; 137 address += PAGE_SIZE;
136 } 138 }
137 ret = 0; 139 ret = 0;
@@ -154,7 +156,7 @@ static void vmem_remove_range(unsigned long start, unsigned long size)
154 pte_t *pt_dir; 156 pte_t *pt_dir;
155 pte_t pte; 157 pte_t pte;
156 158
157 pte_val(pte) = _PAGE_TYPE_EMPTY; 159 pte_val(pte) = _PAGE_INVALID;
158 while (address < end) { 160 while (address < end) {
159 pg_dir = pgd_offset_k(address); 161 pg_dir = pgd_offset_k(address);
160 if (pgd_none(*pg_dir)) { 162 if (pgd_none(*pg_dir)) {
@@ -255,7 +257,8 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
255 new_page =__pa(vmem_alloc_pages(0)); 257 new_page =__pa(vmem_alloc_pages(0));
256 if (!new_page) 258 if (!new_page)
257 goto out; 259 goto out;
258 pte_val(*pt_dir) = __pa(new_page); 260 pte_val(*pt_dir) =
261 __pa(new_page) | pgprot_val(PAGE_KERNEL);
259 } 262 }
260 address += PAGE_SIZE; 263 address += PAGE_SIZE;
261 } 264 }
diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c
index d5f10a43a58f..709239285869 100644
--- a/arch/s390/net/bpf_jit_comp.c
+++ b/arch/s390/net/bpf_jit_comp.c
@@ -805,7 +805,7 @@ static struct bpf_binary_header *bpf_alloc_binary(unsigned int bpfsize,
805 return NULL; 805 return NULL;
806 memset(header, 0, sz); 806 memset(header, 0, sz);
807 header->pages = sz / PAGE_SIZE; 807 header->pages = sz / PAGE_SIZE;
808 hole = sz - bpfsize + sizeof(*header); 808 hole = sz - (bpfsize + sizeof(*header));
809 /* Insert random number of illegal instructions before BPF code 809 /* Insert random number of illegal instructions before BPF code
810 * and make sure the first instruction starts at an even address. 810 * and make sure the first instruction starts at an even address.
811 */ 811 */
diff --git a/arch/s390/oprofile/hwsampler.c b/arch/s390/oprofile/hwsampler.c
index b5b2916895e0..231cecafc2f1 100644
--- a/arch/s390/oprofile/hwsampler.c
+++ b/arch/s390/oprofile/hwsampler.c
@@ -1001,7 +1001,7 @@ int hwsampler_deallocate(void)
1001 if (hws_state != HWS_STOPPED) 1001 if (hws_state != HWS_STOPPED)
1002 goto deallocate_exit; 1002 goto deallocate_exit;
1003 1003
1004 measurement_alert_subclass_unregister(); 1004 irq_subclass_unregister(IRQ_SUBCLASS_MEASUREMENT_ALERT);
1005 deallocate_sdbt(); 1005 deallocate_sdbt();
1006 1006
1007 hws_state = HWS_DEALLOCATED; 1007 hws_state = HWS_DEALLOCATED;
@@ -1115,7 +1115,7 @@ int hwsampler_shutdown(void)
1115 mutex_lock(&hws_sem); 1115 mutex_lock(&hws_sem);
1116 1116
1117 if (hws_state == HWS_STOPPED) { 1117 if (hws_state == HWS_STOPPED) {
1118 measurement_alert_subclass_unregister(); 1118 irq_subclass_unregister(IRQ_SUBCLASS_MEASUREMENT_ALERT);
1119 deallocate_sdbt(); 1119 deallocate_sdbt();
1120 } 1120 }
1121 if (hws_wq) { 1121 if (hws_wq) {
@@ -1190,7 +1190,7 @@ start_all_exit:
1190 hws_oom = 1; 1190 hws_oom = 1;
1191 hws_flush_all = 0; 1191 hws_flush_all = 0;
1192 /* now let them in, 1407 CPUMF external interrupts */ 1192 /* now let them in, 1407 CPUMF external interrupts */
1193 measurement_alert_subclass_register(); 1193 irq_subclass_register(IRQ_SUBCLASS_MEASUREMENT_ALERT);
1194 1194
1195 return 0; 1195 return 0;
1196} 1196}
diff --git a/arch/s390/oprofile/init.c b/arch/s390/oprofile/init.c
index 930783d2c99b..04e1b6a85362 100644
--- a/arch/s390/oprofile/init.c
+++ b/arch/s390/oprofile/init.c
@@ -346,16 +346,15 @@ static const struct file_operations timer_enabled_fops = {
346}; 346};
347 347
348 348
349static int oprofile_create_hwsampling_files(struct super_block *sb, 349static int oprofile_create_hwsampling_files(struct dentry *root)
350 struct dentry *root)
351{ 350{
352 struct dentry *dir; 351 struct dentry *dir;
353 352
354 dir = oprofilefs_mkdir(sb, root, "timer"); 353 dir = oprofilefs_mkdir(root, "timer");
355 if (!dir) 354 if (!dir)
356 return -EINVAL; 355 return -EINVAL;
357 356
358 oprofilefs_create_file(sb, dir, "enabled", &timer_enabled_fops); 357 oprofilefs_create_file(dir, "enabled", &timer_enabled_fops);
359 358
360 if (!hwsampler_available) 359 if (!hwsampler_available)
361 return 0; 360 return 0;
@@ -376,17 +375,17 @@ static int oprofile_create_hwsampling_files(struct super_block *sb,
376 * and can only be set to 0. 375 * and can only be set to 0.
377 */ 376 */
378 377
379 dir = oprofilefs_mkdir(sb, root, "0"); 378 dir = oprofilefs_mkdir(root, "0");
380 if (!dir) 379 if (!dir)
381 return -EINVAL; 380 return -EINVAL;
382 381
383 oprofilefs_create_file(sb, dir, "enabled", &hwsampler_fops); 382 oprofilefs_create_file(dir, "enabled", &hwsampler_fops);
384 oprofilefs_create_file(sb, dir, "event", &zero_fops); 383 oprofilefs_create_file(dir, "event", &zero_fops);
385 oprofilefs_create_file(sb, dir, "count", &hw_interval_fops); 384 oprofilefs_create_file(dir, "count", &hw_interval_fops);
386 oprofilefs_create_file(sb, dir, "unit_mask", &zero_fops); 385 oprofilefs_create_file(dir, "unit_mask", &zero_fops);
387 oprofilefs_create_file(sb, dir, "kernel", &kernel_fops); 386 oprofilefs_create_file(dir, "kernel", &kernel_fops);
388 oprofilefs_create_file(sb, dir, "user", &user_fops); 387 oprofilefs_create_file(dir, "user", &user_fops);
389 oprofilefs_create_ulong(sb, dir, "hw_sdbt_blocks", 388 oprofilefs_create_ulong(dir, "hw_sdbt_blocks",
390 &oprofile_sdbt_blocks); 389 &oprofile_sdbt_blocks);
391 390
392 } else { 391 } else {
@@ -396,19 +395,19 @@ static int oprofile_create_hwsampling_files(struct super_block *sb,
396 * space tools. The /dev/oprofile/hwsampling fs is 395 * space tools. The /dev/oprofile/hwsampling fs is
397 * provided in that case. 396 * provided in that case.
398 */ 397 */
399 dir = oprofilefs_mkdir(sb, root, "hwsampling"); 398 dir = oprofilefs_mkdir(root, "hwsampling");
400 if (!dir) 399 if (!dir)
401 return -EINVAL; 400 return -EINVAL;
402 401
403 oprofilefs_create_file(sb, dir, "hwsampler", 402 oprofilefs_create_file(dir, "hwsampler",
404 &hwsampler_fops); 403 &hwsampler_fops);
405 oprofilefs_create_file(sb, dir, "hw_interval", 404 oprofilefs_create_file(dir, "hw_interval",
406 &hw_interval_fops); 405 &hw_interval_fops);
407 oprofilefs_create_ro_ulong(sb, dir, "hw_min_interval", 406 oprofilefs_create_ro_ulong(dir, "hw_min_interval",
408 &oprofile_min_interval); 407 &oprofile_min_interval);
409 oprofilefs_create_ro_ulong(sb, dir, "hw_max_interval", 408 oprofilefs_create_ro_ulong(dir, "hw_max_interval",
410 &oprofile_max_interval); 409 &oprofile_max_interval);
411 oprofilefs_create_ulong(sb, dir, "hw_sdbt_blocks", 410 oprofilefs_create_ulong(dir, "hw_sdbt_blocks",
412 &oprofile_sdbt_blocks); 411 &oprofile_sdbt_blocks);
413 } 412 }
414 return 0; 413 return 0;
diff --git a/arch/s390/pci/Makefile b/arch/s390/pci/Makefile
index 086a2e37935d..a9e1dc4ae442 100644
--- a/arch/s390/pci/Makefile
+++ b/arch/s390/pci/Makefile
@@ -2,5 +2,5 @@
2# Makefile for the s390 PCI subsystem. 2# Makefile for the s390 PCI subsystem.
3# 3#
4 4
5obj-$(CONFIG_PCI) += pci.o pci_dma.o pci_clp.o pci_msi.o pci_sysfs.o \ 5obj-$(CONFIG_PCI) += pci.o pci_dma.o pci_clp.o pci_sysfs.o \
6 pci_event.o pci_debug.o pci_insn.o 6 pci_event.o pci_debug.o pci_insn.o
diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c
index e2956ad39a4f..f17a8343e360 100644
--- a/arch/s390/pci/pci.c
+++ b/arch/s390/pci/pci.c
@@ -42,45 +42,26 @@
42#define SIC_IRQ_MODE_SINGLE 1 42#define SIC_IRQ_MODE_SINGLE 1
43 43
44#define ZPCI_NR_DMA_SPACES 1 44#define ZPCI_NR_DMA_SPACES 1
45#define ZPCI_MSI_VEC_BITS 6
46#define ZPCI_NR_DEVICES CONFIG_PCI_NR_FUNCTIONS 45#define ZPCI_NR_DEVICES CONFIG_PCI_NR_FUNCTIONS
47 46
48/* list of all detected zpci devices */ 47/* list of all detected zpci devices */
49LIST_HEAD(zpci_list); 48static LIST_HEAD(zpci_list);
50EXPORT_SYMBOL_GPL(zpci_list); 49static DEFINE_SPINLOCK(zpci_list_lock);
51DEFINE_MUTEX(zpci_list_lock);
52EXPORT_SYMBOL_GPL(zpci_list_lock);
53 50
54static struct pci_hp_callback_ops *hotplug_ops; 51static void zpci_enable_irq(struct irq_data *data);
52static void zpci_disable_irq(struct irq_data *data);
55 53
56static DECLARE_BITMAP(zpci_domain, ZPCI_NR_DEVICES); 54static struct irq_chip zpci_irq_chip = {
57static DEFINE_SPINLOCK(zpci_domain_lock); 55 .name = "zPCI",
58 56 .irq_unmask = zpci_enable_irq,
59struct callback { 57 .irq_mask = zpci_disable_irq,
60 irq_handler_t handler;
61 void *data;
62}; 58};
63 59
64struct zdev_irq_map { 60static DECLARE_BITMAP(zpci_domain, ZPCI_NR_DEVICES);
65 unsigned long aibv; /* AI bit vector */ 61static DEFINE_SPINLOCK(zpci_domain_lock);
66 int msi_vecs; /* consecutive MSI-vectors used */
67 int __unused;
68 struct callback cb[ZPCI_NR_MSI_VECS]; /* callback handler array */
69 spinlock_t lock; /* protect callbacks against de-reg */
70};
71
72struct intr_bucket {
73 /* amap of adapters, one bit per dev, corresponds to one irq nr */
74 unsigned long *alloc;
75 /* AI summary bit, global page for all devices */
76 unsigned long *aisb;
77 /* pointer to aibv and callback data in zdev */
78 struct zdev_irq_map *imap[ZPCI_NR_DEVICES];
79 /* protects the whole bucket struct */
80 spinlock_t lock;
81};
82 62
83static struct intr_bucket *bucket; 63static struct airq_iv *zpci_aisb_iv;
64static struct airq_iv *zpci_aibv[ZPCI_NR_DEVICES];
84 65
85/* Adapter interrupt definitions */ 66/* Adapter interrupt definitions */
86static void zpci_irq_handler(struct airq_struct *airq); 67static void zpci_irq_handler(struct airq_struct *airq);
@@ -96,27 +77,8 @@ static DECLARE_BITMAP(zpci_iomap, ZPCI_IOMAP_MAX_ENTRIES);
96struct zpci_iomap_entry *zpci_iomap_start; 77struct zpci_iomap_entry *zpci_iomap_start;
97EXPORT_SYMBOL_GPL(zpci_iomap_start); 78EXPORT_SYMBOL_GPL(zpci_iomap_start);
98 79
99/* highest irq summary bit */
100static int __read_mostly aisb_max;
101
102static struct kmem_cache *zdev_irq_cache;
103static struct kmem_cache *zdev_fmb_cache; 80static struct kmem_cache *zdev_fmb_cache;
104 81
105static inline int irq_to_msi_nr(unsigned int irq)
106{
107 return irq & ZPCI_MSI_MASK;
108}
109
110static inline int irq_to_dev_nr(unsigned int irq)
111{
112 return irq >> ZPCI_MSI_VEC_BITS;
113}
114
115static inline struct zdev_irq_map *get_imap(unsigned int irq)
116{
117 return bucket->imap[irq_to_dev_nr(irq)];
118}
119
120struct zpci_dev *get_zdev(struct pci_dev *pdev) 82struct zpci_dev *get_zdev(struct pci_dev *pdev)
121{ 83{
122 return (struct zpci_dev *) pdev->sysdata; 84 return (struct zpci_dev *) pdev->sysdata;
@@ -126,22 +88,17 @@ struct zpci_dev *get_zdev_by_fid(u32 fid)
126{ 88{
127 struct zpci_dev *tmp, *zdev = NULL; 89 struct zpci_dev *tmp, *zdev = NULL;
128 90
129 mutex_lock(&zpci_list_lock); 91 spin_lock(&zpci_list_lock);
130 list_for_each_entry(tmp, &zpci_list, entry) { 92 list_for_each_entry(tmp, &zpci_list, entry) {
131 if (tmp->fid == fid) { 93 if (tmp->fid == fid) {
132 zdev = tmp; 94 zdev = tmp;
133 break; 95 break;
134 } 96 }
135 } 97 }
136 mutex_unlock(&zpci_list_lock); 98 spin_unlock(&zpci_list_lock);
137 return zdev; 99 return zdev;
138} 100}
139 101
140bool zpci_fid_present(u32 fid)
141{
142 return (get_zdev_by_fid(fid) != NULL) ? true : false;
143}
144
145static struct zpci_dev *get_zdev_by_bus(struct pci_bus *bus) 102static struct zpci_dev *get_zdev_by_bus(struct pci_bus *bus)
146{ 103{
147 return (bus && bus->sysdata) ? (struct zpci_dev *) bus->sysdata : NULL; 104 return (bus && bus->sysdata) ? (struct zpci_dev *) bus->sysdata : NULL;
@@ -160,8 +117,7 @@ int pci_proc_domain(struct pci_bus *bus)
160EXPORT_SYMBOL_GPL(pci_proc_domain); 117EXPORT_SYMBOL_GPL(pci_proc_domain);
161 118
162/* Modify PCI: Register adapter interruptions */ 119/* Modify PCI: Register adapter interruptions */
163static int zpci_register_airq(struct zpci_dev *zdev, unsigned int aisb, 120static int zpci_set_airq(struct zpci_dev *zdev)
164 u64 aibv)
165{ 121{
166 u64 req = ZPCI_CREATE_REQ(zdev->fh, 0, ZPCI_MOD_FC_REG_INT); 122 u64 req = ZPCI_CREATE_REQ(zdev->fh, 0, ZPCI_MOD_FC_REG_INT);
167 struct zpci_fib *fib; 123 struct zpci_fib *fib;
@@ -172,14 +128,14 @@ static int zpci_register_airq(struct zpci_dev *zdev, unsigned int aisb,
172 return -ENOMEM; 128 return -ENOMEM;
173 129
174 fib->isc = PCI_ISC; 130 fib->isc = PCI_ISC;
175 fib->noi = zdev->irq_map->msi_vecs;
176 fib->sum = 1; /* enable summary notifications */ 131 fib->sum = 1; /* enable summary notifications */
177 fib->aibv = aibv; 132 fib->noi = airq_iv_end(zdev->aibv);
178 fib->aibvo = 0; /* every function has its own page */ 133 fib->aibv = (unsigned long) zdev->aibv->vector;
179 fib->aisb = (u64) bucket->aisb + aisb / 8; 134 fib->aibvo = 0; /* each zdev has its own interrupt vector */
180 fib->aisbo = aisb & ZPCI_MSI_MASK; 135 fib->aisb = (unsigned long) zpci_aisb_iv->vector + (zdev->aisb/64)*8;
136 fib->aisbo = zdev->aisb & 63;
181 137
182 rc = s390pci_mod_fc(req, fib); 138 rc = zpci_mod_fc(req, fib);
183 pr_debug("%s mpcifc returned noi: %d\n", __func__, fib->noi); 139 pr_debug("%s mpcifc returned noi: %d\n", __func__, fib->noi);
184 140
185 free_page((unsigned long) fib); 141 free_page((unsigned long) fib);
@@ -209,7 +165,7 @@ static int mod_pci(struct zpci_dev *zdev, int fn, u8 dmaas, struct mod_pci_args
209 fib->iota = args->iota; 165 fib->iota = args->iota;
210 fib->fmb_addr = args->fmb_addr; 166 fib->fmb_addr = args->fmb_addr;
211 167
212 rc = s390pci_mod_fc(req, fib); 168 rc = zpci_mod_fc(req, fib);
213 free_page((unsigned long) fib); 169 free_page((unsigned long) fib);
214 return rc; 170 return rc;
215} 171}
@@ -234,7 +190,7 @@ int zpci_unregister_ioat(struct zpci_dev *zdev, u8 dmaas)
234} 190}
235 191
236/* Modify PCI: Unregister adapter interruptions */ 192/* Modify PCI: Unregister adapter interruptions */
237static int zpci_unregister_airq(struct zpci_dev *zdev) 193static int zpci_clear_airq(struct zpci_dev *zdev)
238{ 194{
239 struct mod_pci_args args = { 0, 0, 0, 0 }; 195 struct mod_pci_args args = { 0, 0, 0, 0 };
240 196
@@ -283,7 +239,7 @@ static int zpci_cfg_load(struct zpci_dev *zdev, int offset, u32 *val, u8 len)
283 u64 data; 239 u64 data;
284 int rc; 240 int rc;
285 241
286 rc = s390pci_load(&data, req, offset); 242 rc = zpci_load(&data, req, offset);
287 if (!rc) { 243 if (!rc) {
288 data = data << ((8 - len) * 8); 244 data = data << ((8 - len) * 8);
289 data = le64_to_cpu(data); 245 data = le64_to_cpu(data);
@@ -301,25 +257,46 @@ static int zpci_cfg_store(struct zpci_dev *zdev, int offset, u32 val, u8 len)
301 257
302 data = cpu_to_le64(data); 258 data = cpu_to_le64(data);
303 data = data >> ((8 - len) * 8); 259 data = data >> ((8 - len) * 8);
304 rc = s390pci_store(data, req, offset); 260 rc = zpci_store(data, req, offset);
305 return rc; 261 return rc;
306} 262}
307 263
308void enable_irq(unsigned int irq) 264static int zpci_msi_set_mask_bits(struct msi_desc *msi, u32 mask, u32 flag)
265{
266 int offset, pos;
267 u32 mask_bits;
268
269 if (msi->msi_attrib.is_msix) {
270 offset = msi->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE +
271 PCI_MSIX_ENTRY_VECTOR_CTRL;
272 msi->masked = readl(msi->mask_base + offset);
273 writel(flag, msi->mask_base + offset);
274 } else if (msi->msi_attrib.maskbit) {
275 pos = (long) msi->mask_base;
276 pci_read_config_dword(msi->dev, pos, &mask_bits);
277 mask_bits &= ~(mask);
278 mask_bits |= flag & mask;
279 pci_write_config_dword(msi->dev, pos, mask_bits);
280 } else
281 return 0;
282
283 msi->msi_attrib.maskbit = !!flag;
284 return 1;
285}
286
287static void zpci_enable_irq(struct irq_data *data)
309{ 288{
310 struct msi_desc *msi = irq_get_msi_desc(irq); 289 struct msi_desc *msi = irq_get_msi_desc(data->irq);
311 290
312 zpci_msi_set_mask_bits(msi, 1, 0); 291 zpci_msi_set_mask_bits(msi, 1, 0);
313} 292}
314EXPORT_SYMBOL_GPL(enable_irq);
315 293
316void disable_irq(unsigned int irq) 294static void zpci_disable_irq(struct irq_data *data)
317{ 295{
318 struct msi_desc *msi = irq_get_msi_desc(irq); 296 struct msi_desc *msi = irq_get_msi_desc(data->irq);
319 297
320 zpci_msi_set_mask_bits(msi, 1, 1); 298 zpci_msi_set_mask_bits(msi, 1, 1);
321} 299}
322EXPORT_SYMBOL_GPL(disable_irq);
323 300
324void pcibios_fixup_bus(struct pci_bus *bus) 301void pcibios_fixup_bus(struct pci_bus *bus)
325{ 302{
@@ -404,152 +381,147 @@ static struct pci_ops pci_root_ops = {
404 .write = pci_write, 381 .write = pci_write,
405}; 382};
406 383
407/* store the last handled bit to implement fair scheduling of devices */
408static DEFINE_PER_CPU(unsigned long, next_sbit);
409
410static void zpci_irq_handler(struct airq_struct *airq) 384static void zpci_irq_handler(struct airq_struct *airq)
411{ 385{
412 unsigned long sbit, mbit, last = 0, start = __get_cpu_var(next_sbit); 386 unsigned long si, ai;
413 int rescan = 0, max = aisb_max; 387 struct airq_iv *aibv;
414 struct zdev_irq_map *imap; 388 int irqs_on = 0;
415 389
416 inc_irq_stat(IRQIO_PCI); 390 inc_irq_stat(IRQIO_PCI);
417 sbit = start; 391 for (si = 0;;) {
418 392 /* Scan adapter summary indicator bit vector */
419scan: 393 si = airq_iv_scan(zpci_aisb_iv, si, airq_iv_end(zpci_aisb_iv));
420 /* find summary_bit */ 394 if (si == -1UL) {
421 for_each_set_bit_left_cont(sbit, bucket->aisb, max) { 395 if (irqs_on++)
422 clear_bit(63 - (sbit & 63), bucket->aisb + (sbit >> 6)); 396 /* End of second scan with interrupts on. */
423 last = sbit; 397 break;
398 /* First scan complete, reenable interrupts. */
399 zpci_set_irq_ctrl(SIC_IRQ_MODE_SINGLE, NULL, PCI_ISC);
400 si = 0;
401 continue;
402 }
424 403
425 /* find vector bit */ 404 /* Scan the adapter interrupt vector for this device. */
426 imap = bucket->imap[sbit]; 405 aibv = zpci_aibv[si];
427 for_each_set_bit_left(mbit, &imap->aibv, imap->msi_vecs) { 406 for (ai = 0;;) {
407 ai = airq_iv_scan(aibv, ai, airq_iv_end(aibv));
408 if (ai == -1UL)
409 break;
428 inc_irq_stat(IRQIO_MSI); 410 inc_irq_stat(IRQIO_MSI);
429 clear_bit(63 - mbit, &imap->aibv); 411 airq_iv_lock(aibv, ai);
430 412 generic_handle_irq(airq_iv_get_data(aibv, ai));
431 spin_lock(&imap->lock); 413 airq_iv_unlock(aibv, ai);
432 if (imap->cb[mbit].handler)
433 imap->cb[mbit].handler(mbit,
434 imap->cb[mbit].data);
435 spin_unlock(&imap->lock);
436 } 414 }
437 } 415 }
438
439 if (rescan)
440 goto out;
441
442 /* scan the skipped bits */
443 if (start > 0) {
444 sbit = 0;
445 max = start;
446 start = 0;
447 goto scan;
448 }
449
450 /* enable interrupts again */
451 set_irq_ctrl(SIC_IRQ_MODE_SINGLE, NULL, PCI_ISC);
452
453 /* check again to not lose initiative */
454 rmb();
455 max = aisb_max;
456 sbit = find_first_bit_left(bucket->aisb, max);
457 if (sbit != max) {
458 rescan++;
459 goto scan;
460 }
461out:
462 /* store next device bit to scan */
463 __get_cpu_var(next_sbit) = (++last >= aisb_max) ? 0 : last;
464} 416}
465 417
466/* msi_vecs - number of requested interrupts, 0 place function to error state */ 418int arch_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
467static int zpci_setup_msi(struct pci_dev *pdev, int msi_vecs)
468{ 419{
469 struct zpci_dev *zdev = get_zdev(pdev); 420 struct zpci_dev *zdev = get_zdev(pdev);
470 unsigned int aisb, msi_nr; 421 unsigned int hwirq, irq, msi_vecs;
422 unsigned long aisb;
471 struct msi_desc *msi; 423 struct msi_desc *msi;
424 struct msi_msg msg;
472 int rc; 425 int rc;
473 426
474 /* store the number of used MSI vectors */ 427 pr_debug("%s: requesting %d MSI-X interrupts...", __func__, nvec);
475 zdev->irq_map->msi_vecs = min(msi_vecs, ZPCI_NR_MSI_VECS); 428 if (type != PCI_CAP_ID_MSIX && type != PCI_CAP_ID_MSI)
476 429 return -EINVAL;
477 spin_lock(&bucket->lock); 430 msi_vecs = min(nvec, ZPCI_MSI_VEC_MAX);
478 aisb = find_first_zero_bit(bucket->alloc, PAGE_SIZE); 431 msi_vecs = min_t(unsigned int, msi_vecs, CONFIG_PCI_NR_MSI);
479 /* alloc map exhausted? */
480 if (aisb == PAGE_SIZE) {
481 spin_unlock(&bucket->lock);
482 return -EIO;
483 }
484 set_bit(aisb, bucket->alloc);
485 spin_unlock(&bucket->lock);
486 432
433 /* Allocate adapter summary indicator bit */
434 rc = -EIO;
435 aisb = airq_iv_alloc_bit(zpci_aisb_iv);
436 if (aisb == -1UL)
437 goto out;
487 zdev->aisb = aisb; 438 zdev->aisb = aisb;
488 if (aisb + 1 > aisb_max)
489 aisb_max = aisb + 1;
490 439
491 /* wire up IRQ shortcut pointer */ 440 /* Create adapter interrupt vector */
492 bucket->imap[zdev->aisb] = zdev->irq_map; 441 rc = -ENOMEM;
493 pr_debug("%s: imap[%u] linked to %p\n", __func__, zdev->aisb, zdev->irq_map); 442 zdev->aibv = airq_iv_create(msi_vecs, AIRQ_IV_DATA | AIRQ_IV_BITLOCK);
443 if (!zdev->aibv)
444 goto out_si;
494 445
495 /* TODO: irq number 0 wont be found if we return less than requested MSIs. 446 /* Wire up shortcut pointer */
496 * ignore it for now and fix in common code. 447 zpci_aibv[aisb] = zdev->aibv;
497 */
498 msi_nr = aisb << ZPCI_MSI_VEC_BITS;
499 448
449 /* Request MSI interrupts */
450 hwirq = 0;
500 list_for_each_entry(msi, &pdev->msi_list, list) { 451 list_for_each_entry(msi, &pdev->msi_list, list) {
501 rc = zpci_setup_msi_irq(zdev, msi, msi_nr, 452 rc = -EIO;
502 aisb << ZPCI_MSI_VEC_BITS); 453 irq = irq_alloc_desc(0); /* Alloc irq on node 0 */
454 if (irq == NO_IRQ)
455 goto out_msi;
456 rc = irq_set_msi_desc(irq, msi);
503 if (rc) 457 if (rc)
504 return rc; 458 goto out_msi;
505 msi_nr++; 459 irq_set_chip_and_handler(irq, &zpci_irq_chip,
460 handle_simple_irq);
461 msg.data = hwirq;
462 msg.address_lo = zdev->msi_addr & 0xffffffff;
463 msg.address_hi = zdev->msi_addr >> 32;
464 write_msi_msg(irq, &msg);
465 airq_iv_set_data(zdev->aibv, hwirq, irq);
466 hwirq++;
506 } 467 }
507 468
508 rc = zpci_register_airq(zdev, aisb, (u64) &zdev->irq_map->aibv); 469 /* Enable adapter interrupts */
509 if (rc) { 470 rc = zpci_set_airq(zdev);
510 clear_bit(aisb, bucket->alloc); 471 if (rc)
511 dev_err(&pdev->dev, "register MSI failed with: %d\n", rc); 472 goto out_msi;
512 return rc; 473
474 return (msi_vecs == nvec) ? 0 : msi_vecs;
475
476out_msi:
477 list_for_each_entry(msi, &pdev->msi_list, list) {
478 if (hwirq-- == 0)
479 break;
480 irq_set_msi_desc(msi->irq, NULL);
481 irq_free_desc(msi->irq);
482 msi->msg.address_lo = 0;
483 msi->msg.address_hi = 0;
484 msi->msg.data = 0;
485 msi->irq = 0;
513 } 486 }
514 return (zdev->irq_map->msi_vecs == msi_vecs) ? 487 zpci_aibv[aisb] = NULL;
515 0 : zdev->irq_map->msi_vecs; 488 airq_iv_release(zdev->aibv);
489out_si:
490 airq_iv_free_bit(zpci_aisb_iv, aisb);
491out:
492 dev_err(&pdev->dev, "register MSI failed with: %d\n", rc);
493 return rc;
516} 494}
517 495
518static void zpci_teardown_msi(struct pci_dev *pdev) 496void arch_teardown_msi_irqs(struct pci_dev *pdev)
519{ 497{
520 struct zpci_dev *zdev = get_zdev(pdev); 498 struct zpci_dev *zdev = get_zdev(pdev);
521 struct msi_desc *msi; 499 struct msi_desc *msi;
522 int aisb, rc; 500 int rc;
523 501
524 rc = zpci_unregister_airq(zdev); 502 pr_info("%s: on pdev: %p\n", __func__, pdev);
503
504 /* Disable adapter interrupts */
505 rc = zpci_clear_airq(zdev);
525 if (rc) { 506 if (rc) {
526 dev_err(&pdev->dev, "deregister MSI failed with: %d\n", rc); 507 dev_err(&pdev->dev, "deregister MSI failed with: %d\n", rc);
527 return; 508 return;
528 } 509 }
529 510
530 msi = list_first_entry(&pdev->msi_list, struct msi_desc, list); 511 /* Release MSI interrupts */
531 aisb = irq_to_dev_nr(msi->irq); 512 list_for_each_entry(msi, &pdev->msi_list, list) {
532 513 zpci_msi_set_mask_bits(msi, 1, 1);
533 list_for_each_entry(msi, &pdev->msi_list, list) 514 irq_set_msi_desc(msi->irq, NULL);
534 zpci_teardown_msi_irq(zdev, msi); 515 irq_free_desc(msi->irq);
535 516 msi->msg.address_lo = 0;
536 clear_bit(aisb, bucket->alloc); 517 msi->msg.address_hi = 0;
537 if (aisb + 1 == aisb_max) 518 msi->msg.data = 0;
538 aisb_max--; 519 msi->irq = 0;
539} 520 }
540
541int arch_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
542{
543 pr_debug("%s: requesting %d MSI-X interrupts...", __func__, nvec);
544 if (type != PCI_CAP_ID_MSIX && type != PCI_CAP_ID_MSI)
545 return -EINVAL;
546 return zpci_setup_msi(pdev, nvec);
547}
548 521
549void arch_teardown_msi_irqs(struct pci_dev *pdev) 522 zpci_aibv[zdev->aisb] = NULL;
550{ 523 airq_iv_release(zdev->aibv);
551 pr_info("%s: on pdev: %p\n", __func__, pdev); 524 airq_iv_free_bit(zpci_aisb_iv, zdev->aisb);
552 zpci_teardown_msi(pdev);
553} 525}
554 526
555static void zpci_map_resources(struct zpci_dev *zdev) 527static void zpci_map_resources(struct zpci_dev *zdev)
@@ -564,8 +536,6 @@ static void zpci_map_resources(struct zpci_dev *zdev)
564 continue; 536 continue;
565 pdev->resource[i].start = (resource_size_t) pci_iomap(pdev, i, 0); 537 pdev->resource[i].start = (resource_size_t) pci_iomap(pdev, i, 0);
566 pdev->resource[i].end = pdev->resource[i].start + len - 1; 538 pdev->resource[i].end = pdev->resource[i].start + len - 1;
567 pr_debug("BAR%i: -> start: %Lx end: %Lx\n",
568 i, pdev->resource[i].start, pdev->resource[i].end);
569 } 539 }
570} 540}
571 541
@@ -589,162 +559,47 @@ struct zpci_dev *zpci_alloc_device(void)
589 559
590 /* Alloc memory for our private pci device data */ 560 /* Alloc memory for our private pci device data */
591 zdev = kzalloc(sizeof(*zdev), GFP_KERNEL); 561 zdev = kzalloc(sizeof(*zdev), GFP_KERNEL);
592 if (!zdev) 562 return zdev ? : ERR_PTR(-ENOMEM);
593 return ERR_PTR(-ENOMEM);
594
595 /* Alloc aibv & callback space */
596 zdev->irq_map = kmem_cache_zalloc(zdev_irq_cache, GFP_KERNEL);
597 if (!zdev->irq_map)
598 goto error;
599 WARN_ON((u64) zdev->irq_map & 0xff);
600 return zdev;
601
602error:
603 kfree(zdev);
604 return ERR_PTR(-ENOMEM);
605} 563}
606 564
607void zpci_free_device(struct zpci_dev *zdev) 565void zpci_free_device(struct zpci_dev *zdev)
608{ 566{
609 kmem_cache_free(zdev_irq_cache, zdev->irq_map);
610 kfree(zdev); 567 kfree(zdev);
611} 568}
612 569
613/*
614 * Too late for any s390 specific setup, since interrupts must be set up
615 * already which requires DMA setup too and the pci scan will access the
616 * config space, which only works if the function handle is enabled.
617 */
618int pcibios_enable_device(struct pci_dev *pdev, int mask)
619{
620 struct resource *res;
621 u16 cmd;
622 int i;
623
624 pci_read_config_word(pdev, PCI_COMMAND, &cmd);
625
626 for (i = 0; i < PCI_BAR_COUNT; i++) {
627 res = &pdev->resource[i];
628
629 if (res->flags & IORESOURCE_IO)
630 return -EINVAL;
631
632 if (res->flags & IORESOURCE_MEM)
633 cmd |= PCI_COMMAND_MEMORY;
634 }
635 pci_write_config_word(pdev, PCI_COMMAND, cmd);
636 return 0;
637}
638
639int pcibios_add_platform_entries(struct pci_dev *pdev) 570int pcibios_add_platform_entries(struct pci_dev *pdev)
640{ 571{
641 return zpci_sysfs_add_device(&pdev->dev); 572 return zpci_sysfs_add_device(&pdev->dev);
642} 573}
643 574
644int zpci_request_irq(unsigned int irq, irq_handler_t handler, void *data)
645{
646 int msi_nr = irq_to_msi_nr(irq);
647 struct zdev_irq_map *imap;
648 struct msi_desc *msi;
649
650 msi = irq_get_msi_desc(irq);
651 if (!msi)
652 return -EIO;
653
654 imap = get_imap(irq);
655 spin_lock_init(&imap->lock);
656
657 pr_debug("%s: register handler for IRQ:MSI %d:%d\n", __func__, irq >> 6, msi_nr);
658 imap->cb[msi_nr].handler = handler;
659 imap->cb[msi_nr].data = data;
660
661 /*
662 * The generic MSI code returns with the interrupt disabled on the
663 * card, using the MSI mask bits. Firmware doesn't appear to unmask
664 * at that level, so we do it here by hand.
665 */
666 zpci_msi_set_mask_bits(msi, 1, 0);
667 return 0;
668}
669
670void zpci_free_irq(unsigned int irq)
671{
672 struct zdev_irq_map *imap = get_imap(irq);
673 int msi_nr = irq_to_msi_nr(irq);
674 unsigned long flags;
675
676 pr_debug("%s: for irq: %d\n", __func__, irq);
677
678 spin_lock_irqsave(&imap->lock, flags);
679 imap->cb[msi_nr].handler = NULL;
680 imap->cb[msi_nr].data = NULL;
681 spin_unlock_irqrestore(&imap->lock, flags);
682}
683
684int request_irq(unsigned int irq, irq_handler_t handler,
685 unsigned long irqflags, const char *devname, void *dev_id)
686{
687 pr_debug("%s: irq: %d handler: %p flags: %lx dev: %s\n",
688 __func__, irq, handler, irqflags, devname);
689
690 return zpci_request_irq(irq, handler, dev_id);
691}
692EXPORT_SYMBOL_GPL(request_irq);
693
694void free_irq(unsigned int irq, void *dev_id)
695{
696 zpci_free_irq(irq);
697}
698EXPORT_SYMBOL_GPL(free_irq);
699
700static int __init zpci_irq_init(void) 575static int __init zpci_irq_init(void)
701{ 576{
702 int cpu, rc; 577 int rc;
703
704 bucket = kzalloc(sizeof(*bucket), GFP_KERNEL);
705 if (!bucket)
706 return -ENOMEM;
707
708 bucket->aisb = (unsigned long *) get_zeroed_page(GFP_KERNEL);
709 if (!bucket->aisb) {
710 rc = -ENOMEM;
711 goto out_aisb;
712 }
713
714 bucket->alloc = (unsigned long *) get_zeroed_page(GFP_KERNEL);
715 if (!bucket->alloc) {
716 rc = -ENOMEM;
717 goto out_alloc;
718 }
719 578
720 rc = register_adapter_interrupt(&zpci_airq); 579 rc = register_adapter_interrupt(&zpci_airq);
721 if (rc) 580 if (rc)
722 goto out_ai; 581 goto out;
723 /* Set summary to 1 to be called every time for the ISC. */ 582 /* Set summary to 1 to be called every time for the ISC. */
724 *zpci_airq.lsi_ptr = 1; 583 *zpci_airq.lsi_ptr = 1;
725 584
726 for_each_online_cpu(cpu) 585 rc = -ENOMEM;
727 per_cpu(next_sbit, cpu) = 0; 586 zpci_aisb_iv = airq_iv_create(ZPCI_NR_DEVICES, AIRQ_IV_ALLOC);
587 if (!zpci_aisb_iv)
588 goto out_airq;
728 589
729 spin_lock_init(&bucket->lock); 590 zpci_set_irq_ctrl(SIC_IRQ_MODE_SINGLE, NULL, PCI_ISC);
730 set_irq_ctrl(SIC_IRQ_MODE_SINGLE, NULL, PCI_ISC);
731 return 0; 591 return 0;
732 592
733out_ai: 593out_airq:
734 free_page((unsigned long) bucket->alloc); 594 unregister_adapter_interrupt(&zpci_airq);
735out_alloc: 595out:
736 free_page((unsigned long) bucket->aisb);
737out_aisb:
738 kfree(bucket);
739 return rc; 596 return rc;
740} 597}
741 598
742static void zpci_irq_exit(void) 599static void zpci_irq_exit(void)
743{ 600{
744 free_page((unsigned long) bucket->alloc); 601 airq_iv_release(zpci_aisb_iv);
745 free_page((unsigned long) bucket->aisb);
746 unregister_adapter_interrupt(&zpci_airq); 602 unregister_adapter_interrupt(&zpci_airq);
747 kfree(bucket);
748} 603}
749 604
750static struct resource *zpci_alloc_bus_resource(unsigned long start, unsigned long size, 605static struct resource *zpci_alloc_bus_resource(unsigned long start, unsigned long size,
@@ -801,16 +656,49 @@ static void zpci_free_iomap(struct zpci_dev *zdev, int entry)
801int pcibios_add_device(struct pci_dev *pdev) 656int pcibios_add_device(struct pci_dev *pdev)
802{ 657{
803 struct zpci_dev *zdev = get_zdev(pdev); 658 struct zpci_dev *zdev = get_zdev(pdev);
659 struct resource *res;
660 int i;
661
662 zdev->pdev = pdev;
663 zpci_map_resources(zdev);
664
665 for (i = 0; i < PCI_BAR_COUNT; i++) {
666 res = &pdev->resource[i];
667 if (res->parent || !res->flags)
668 continue;
669 pci_claim_resource(pdev, i);
670 }
671
672 return 0;
673}
674
675int pcibios_enable_device(struct pci_dev *pdev, int mask)
676{
677 struct zpci_dev *zdev = get_zdev(pdev);
678 struct resource *res;
679 u16 cmd;
680 int i;
804 681
805 zdev->pdev = pdev; 682 zdev->pdev = pdev;
806 zpci_debug_init_device(zdev); 683 zpci_debug_init_device(zdev);
807 zpci_fmb_enable_device(zdev); 684 zpci_fmb_enable_device(zdev);
808 zpci_map_resources(zdev); 685 zpci_map_resources(zdev);
809 686
687 pci_read_config_word(pdev, PCI_COMMAND, &cmd);
688 for (i = 0; i < PCI_BAR_COUNT; i++) {
689 res = &pdev->resource[i];
690
691 if (res->flags & IORESOURCE_IO)
692 return -EINVAL;
693
694 if (res->flags & IORESOURCE_MEM)
695 cmd |= PCI_COMMAND_MEMORY;
696 }
697 pci_write_config_word(pdev, PCI_COMMAND, cmd);
810 return 0; 698 return 0;
811} 699}
812 700
813void pcibios_release_device(struct pci_dev *pdev) 701void pcibios_disable_device(struct pci_dev *pdev)
814{ 702{
815 struct zpci_dev *zdev = get_zdev(pdev); 703 struct zpci_dev *zdev = get_zdev(pdev);
816 704
@@ -898,6 +786,8 @@ int zpci_enable_device(struct zpci_dev *zdev)
898 rc = zpci_dma_init_device(zdev); 786 rc = zpci_dma_init_device(zdev);
899 if (rc) 787 if (rc)
900 goto out_dma; 788 goto out_dma;
789
790 zdev->state = ZPCI_FN_STATE_ONLINE;
901 return 0; 791 return 0;
902 792
903out_dma: 793out_dma:
@@ -926,18 +816,16 @@ int zpci_create_device(struct zpci_dev *zdev)
926 rc = zpci_enable_device(zdev); 816 rc = zpci_enable_device(zdev);
927 if (rc) 817 if (rc)
928 goto out_free; 818 goto out_free;
929
930 zdev->state = ZPCI_FN_STATE_ONLINE;
931 } 819 }
932 rc = zpci_scan_bus(zdev); 820 rc = zpci_scan_bus(zdev);
933 if (rc) 821 if (rc)
934 goto out_disable; 822 goto out_disable;
935 823
936 mutex_lock(&zpci_list_lock); 824 spin_lock(&zpci_list_lock);
937 list_add_tail(&zdev->entry, &zpci_list); 825 list_add_tail(&zdev->entry, &zpci_list);
938 if (hotplug_ops) 826 spin_unlock(&zpci_list_lock);
939 hotplug_ops->create_slot(zdev); 827
940 mutex_unlock(&zpci_list_lock); 828 zpci_init_slot(zdev);
941 829
942 return 0; 830 return 0;
943 831
@@ -967,15 +855,10 @@ static inline int barsize(u8 size)
967 855
968static int zpci_mem_init(void) 856static int zpci_mem_init(void)
969{ 857{
970 zdev_irq_cache = kmem_cache_create("PCI_IRQ_cache", sizeof(struct zdev_irq_map),
971 L1_CACHE_BYTES, SLAB_HWCACHE_ALIGN, NULL);
972 if (!zdev_irq_cache)
973 goto error_zdev;
974
975 zdev_fmb_cache = kmem_cache_create("PCI_FMB_cache", sizeof(struct zpci_fmb), 858 zdev_fmb_cache = kmem_cache_create("PCI_FMB_cache", sizeof(struct zpci_fmb),
976 16, 0, NULL); 859 16, 0, NULL);
977 if (!zdev_fmb_cache) 860 if (!zdev_fmb_cache)
978 goto error_fmb; 861 goto error_zdev;
979 862
980 /* TODO: use realloc */ 863 /* TODO: use realloc */
981 zpci_iomap_start = kzalloc(ZPCI_IOMAP_MAX_ENTRIES * sizeof(*zpci_iomap_start), 864 zpci_iomap_start = kzalloc(ZPCI_IOMAP_MAX_ENTRIES * sizeof(*zpci_iomap_start),
@@ -986,8 +869,6 @@ static int zpci_mem_init(void)
986 869
987error_iomap: 870error_iomap:
988 kmem_cache_destroy(zdev_fmb_cache); 871 kmem_cache_destroy(zdev_fmb_cache);
989error_fmb:
990 kmem_cache_destroy(zdev_irq_cache);
991error_zdev: 872error_zdev:
992 return -ENOMEM; 873 return -ENOMEM;
993} 874}
@@ -995,28 +876,10 @@ error_zdev:
995static void zpci_mem_exit(void) 876static void zpci_mem_exit(void)
996{ 877{
997 kfree(zpci_iomap_start); 878 kfree(zpci_iomap_start);
998 kmem_cache_destroy(zdev_irq_cache);
999 kmem_cache_destroy(zdev_fmb_cache); 879 kmem_cache_destroy(zdev_fmb_cache);
1000} 880}
1001 881
1002void zpci_register_hp_ops(struct pci_hp_callback_ops *ops) 882static unsigned int s390_pci_probe;
1003{
1004 mutex_lock(&zpci_list_lock);
1005 hotplug_ops = ops;
1006 mutex_unlock(&zpci_list_lock);
1007}
1008EXPORT_SYMBOL_GPL(zpci_register_hp_ops);
1009
1010void zpci_deregister_hp_ops(void)
1011{
1012 mutex_lock(&zpci_list_lock);
1013 hotplug_ops = NULL;
1014 mutex_unlock(&zpci_list_lock);
1015}
1016EXPORT_SYMBOL_GPL(zpci_deregister_hp_ops);
1017
1018unsigned int s390_pci_probe;
1019EXPORT_SYMBOL_GPL(s390_pci_probe);
1020 883
1021char * __init pcibios_setup(char *str) 884char * __init pcibios_setup(char *str)
1022{ 885{
@@ -1044,16 +907,12 @@ static int __init pci_base_init(void)
1044 907
1045 rc = zpci_debug_init(); 908 rc = zpci_debug_init();
1046 if (rc) 909 if (rc)
1047 return rc; 910 goto out;
1048 911
1049 rc = zpci_mem_init(); 912 rc = zpci_mem_init();
1050 if (rc) 913 if (rc)
1051 goto out_mem; 914 goto out_mem;
1052 915
1053 rc = zpci_msihash_init();
1054 if (rc)
1055 goto out_hash;
1056
1057 rc = zpci_irq_init(); 916 rc = zpci_irq_init();
1058 if (rc) 917 if (rc)
1059 goto out_irq; 918 goto out_irq;
@@ -1062,7 +921,7 @@ static int __init pci_base_init(void)
1062 if (rc) 921 if (rc)
1063 goto out_dma; 922 goto out_dma;
1064 923
1065 rc = clp_find_pci_devices(); 924 rc = clp_scan_pci_devices();
1066 if (rc) 925 if (rc)
1067 goto out_find; 926 goto out_find;
1068 927
@@ -1073,11 +932,15 @@ out_find:
1073out_dma: 932out_dma:
1074 zpci_irq_exit(); 933 zpci_irq_exit();
1075out_irq: 934out_irq:
1076 zpci_msihash_exit();
1077out_hash:
1078 zpci_mem_exit(); 935 zpci_mem_exit();
1079out_mem: 936out_mem:
1080 zpci_debug_exit(); 937 zpci_debug_exit();
938out:
1081 return rc; 939 return rc;
1082} 940}
1083subsys_initcall(pci_base_init); 941subsys_initcall_sync(pci_base_init);
942
943void zpci_rescan(void)
944{
945 clp_rescan_pci_devices_simple();
946}
diff --git a/arch/s390/pci/pci_clp.c b/arch/s390/pci/pci_clp.c
index 2e9539625d93..475563c3d1e4 100644
--- a/arch/s390/pci/pci_clp.c
+++ b/arch/s390/pci/pci_clp.c
@@ -36,9 +36,9 @@ static inline u8 clp_instr(void *data)
36 return cc; 36 return cc;
37} 37}
38 38
39static void *clp_alloc_block(void) 39static void *clp_alloc_block(gfp_t gfp_mask)
40{ 40{
41 return (void *) __get_free_pages(GFP_KERNEL, get_order(CLP_BLK_SIZE)); 41 return (void *) __get_free_pages(gfp_mask, get_order(CLP_BLK_SIZE));
42} 42}
43 43
44static void clp_free_block(void *ptr) 44static void clp_free_block(void *ptr)
@@ -70,7 +70,7 @@ static int clp_query_pci_fngrp(struct zpci_dev *zdev, u8 pfgid)
70 struct clp_req_rsp_query_pci_grp *rrb; 70 struct clp_req_rsp_query_pci_grp *rrb;
71 int rc; 71 int rc;
72 72
73 rrb = clp_alloc_block(); 73 rrb = clp_alloc_block(GFP_KERNEL);
74 if (!rrb) 74 if (!rrb)
75 return -ENOMEM; 75 return -ENOMEM;
76 76
@@ -113,7 +113,7 @@ static int clp_query_pci_fn(struct zpci_dev *zdev, u32 fh)
113 struct clp_req_rsp_query_pci *rrb; 113 struct clp_req_rsp_query_pci *rrb;
114 int rc; 114 int rc;
115 115
116 rrb = clp_alloc_block(); 116 rrb = clp_alloc_block(GFP_KERNEL);
117 if (!rrb) 117 if (!rrb)
118 return -ENOMEM; 118 return -ENOMEM;
119 119
@@ -179,9 +179,9 @@ error:
179static int clp_set_pci_fn(u32 *fh, u8 nr_dma_as, u8 command) 179static int clp_set_pci_fn(u32 *fh, u8 nr_dma_as, u8 command)
180{ 180{
181 struct clp_req_rsp_set_pci *rrb; 181 struct clp_req_rsp_set_pci *rrb;
182 int rc, retries = 1000; 182 int rc, retries = 100;
183 183
184 rrb = clp_alloc_block(); 184 rrb = clp_alloc_block(GFP_KERNEL);
185 if (!rrb) 185 if (!rrb)
186 return -ENOMEM; 186 return -ENOMEM;
187 187
@@ -199,7 +199,7 @@ static int clp_set_pci_fn(u32 *fh, u8 nr_dma_as, u8 command)
199 retries--; 199 retries--;
200 if (retries < 0) 200 if (retries < 0)
201 break; 201 break;
202 msleep(1); 202 msleep(20);
203 } 203 }
204 } while (rrb->response.hdr.rsp == CLP_RC_SETPCIFN_BUSY); 204 } while (rrb->response.hdr.rsp == CLP_RC_SETPCIFN_BUSY);
205 205
@@ -245,49 +245,12 @@ int clp_disable_fh(struct zpci_dev *zdev)
245 return rc; 245 return rc;
246} 246}
247 247
248static void clp_check_pcifn_entry(struct clp_fh_list_entry *entry) 248static int clp_list_pci(struct clp_req_rsp_list_pci *rrb,
249 void (*cb)(struct clp_fh_list_entry *entry))
249{ 250{
250 int present, rc;
251
252 if (!entry->vendor_id)
253 return;
254
255 /* TODO: be a little bit more scalable */
256 present = zpci_fid_present(entry->fid);
257
258 if (present)
259 pr_debug("%s: device %x already present\n", __func__, entry->fid);
260
261 /* skip already used functions */
262 if (present && entry->config_state)
263 return;
264
265 /* aev 306: function moved to stand-by state */
266 if (present && !entry->config_state) {
267 /*
268 * The handle is already disabled, that means no iota/irq freeing via
269 * the firmware interfaces anymore. Need to free resources manually
270 * (DMA memory, debug, sysfs)...
271 */
272 zpci_stop_device(get_zdev_by_fid(entry->fid));
273 return;
274 }
275
276 rc = clp_add_pci_device(entry->fid, entry->fh, entry->config_state);
277 if (rc)
278 pr_err("Failed to add fid: 0x%x\n", entry->fid);
279}
280
281int clp_find_pci_devices(void)
282{
283 struct clp_req_rsp_list_pci *rrb;
284 u64 resume_token = 0; 251 u64 resume_token = 0;
285 int entries, i, rc; 252 int entries, i, rc;
286 253
287 rrb = clp_alloc_block();
288 if (!rrb)
289 return -ENOMEM;
290
291 do { 254 do {
292 memset(rrb, 0, sizeof(*rrb)); 255 memset(rrb, 0, sizeof(*rrb));
293 rrb->request.hdr.len = sizeof(rrb->request); 256 rrb->request.hdr.len = sizeof(rrb->request);
@@ -316,12 +279,101 @@ int clp_find_pci_devices(void)
316 resume_token = rrb->response.resume_token; 279 resume_token = rrb->response.resume_token;
317 280
318 for (i = 0; i < entries; i++) 281 for (i = 0; i < entries; i++)
319 clp_check_pcifn_entry(&rrb->response.fh_list[i]); 282 cb(&rrb->response.fh_list[i]);
320 } while (resume_token); 283 } while (resume_token);
321 284
322 pr_debug("Maximum number of supported PCI functions: %u\n", 285 pr_debug("Maximum number of supported PCI functions: %u\n",
323 rrb->response.max_fn); 286 rrb->response.max_fn);
324out: 287out:
288 return rc;
289}
290
291static void __clp_add(struct clp_fh_list_entry *entry)
292{
293 if (!entry->vendor_id)
294 return;
295
296 clp_add_pci_device(entry->fid, entry->fh, entry->config_state);
297}
298
299static void __clp_rescan(struct clp_fh_list_entry *entry)
300{
301 struct zpci_dev *zdev;
302
303 if (!entry->vendor_id)
304 return;
305
306 zdev = get_zdev_by_fid(entry->fid);
307 if (!zdev) {
308 clp_add_pci_device(entry->fid, entry->fh, entry->config_state);
309 return;
310 }
311
312 if (!entry->config_state) {
313 /*
314 * The handle is already disabled, that means no iota/irq freeing via
315 * the firmware interfaces anymore. Need to free resources manually
316 * (DMA memory, debug, sysfs)...
317 */
318 zpci_stop_device(zdev);
319 }
320}
321
322static void __clp_update(struct clp_fh_list_entry *entry)
323{
324 struct zpci_dev *zdev;
325
326 if (!entry->vendor_id)
327 return;
328
329 zdev = get_zdev_by_fid(entry->fid);
330 if (!zdev)
331 return;
332
333 zdev->fh = entry->fh;
334}
335
336int clp_scan_pci_devices(void)
337{
338 struct clp_req_rsp_list_pci *rrb;
339 int rc;
340
341 rrb = clp_alloc_block(GFP_KERNEL);
342 if (!rrb)
343 return -ENOMEM;
344
345 rc = clp_list_pci(rrb, __clp_add);
346
347 clp_free_block(rrb);
348 return rc;
349}
350
351int clp_rescan_pci_devices(void)
352{
353 struct clp_req_rsp_list_pci *rrb;
354 int rc;
355
356 rrb = clp_alloc_block(GFP_KERNEL);
357 if (!rrb)
358 return -ENOMEM;
359
360 rc = clp_list_pci(rrb, __clp_rescan);
361
362 clp_free_block(rrb);
363 return rc;
364}
365
366int clp_rescan_pci_devices_simple(void)
367{
368 struct clp_req_rsp_list_pci *rrb;
369 int rc;
370
371 rrb = clp_alloc_block(GFP_NOWAIT);
372 if (!rrb)
373 return -ENOMEM;
374
375 rc = clp_list_pci(rrb, __clp_update);
376
325 clp_free_block(rrb); 377 clp_free_block(rrb);
326 return rc; 378 return rc;
327} 379}
diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c
index a2343c1f6e04..7e5573acb063 100644
--- a/arch/s390/pci/pci_dma.c
+++ b/arch/s390/pci/pci_dma.c
@@ -10,6 +10,7 @@
10#include <linux/export.h> 10#include <linux/export.h>
11#include <linux/iommu-helper.h> 11#include <linux/iommu-helper.h>
12#include <linux/dma-mapping.h> 12#include <linux/dma-mapping.h>
13#include <linux/vmalloc.h>
13#include <linux/pci.h> 14#include <linux/pci.h>
14#include <asm/pci_dma.h> 15#include <asm/pci_dma.h>
15 16
@@ -170,8 +171,8 @@ static int dma_update_trans(struct zpci_dev *zdev, unsigned long pa,
170 */ 171 */
171 goto no_refresh; 172 goto no_refresh;
172 173
173 rc = s390pci_refresh_trans((u64) zdev->fh << 32, start_dma_addr, 174 rc = zpci_refresh_trans((u64) zdev->fh << 32, start_dma_addr,
174 nr_pages * PAGE_SIZE); 175 nr_pages * PAGE_SIZE);
175 176
176no_refresh: 177no_refresh:
177 spin_unlock_irqrestore(&zdev->dma_table_lock, irq_flags); 178 spin_unlock_irqrestore(&zdev->dma_table_lock, irq_flags);
@@ -407,7 +408,6 @@ static void s390_dma_unmap_sg(struct device *dev, struct scatterlist *sg,
407 408
408int zpci_dma_init_device(struct zpci_dev *zdev) 409int zpci_dma_init_device(struct zpci_dev *zdev)
409{ 410{
410 unsigned int bitmap_order;
411 int rc; 411 int rc;
412 412
413 spin_lock_init(&zdev->iommu_bitmap_lock); 413 spin_lock_init(&zdev->iommu_bitmap_lock);
@@ -421,12 +421,7 @@ int zpci_dma_init_device(struct zpci_dev *zdev)
421 421
422 zdev->iommu_size = (unsigned long) high_memory - PAGE_OFFSET; 422 zdev->iommu_size = (unsigned long) high_memory - PAGE_OFFSET;
423 zdev->iommu_pages = zdev->iommu_size >> PAGE_SHIFT; 423 zdev->iommu_pages = zdev->iommu_size >> PAGE_SHIFT;
424 bitmap_order = get_order(zdev->iommu_pages / 8); 424 zdev->iommu_bitmap = vzalloc(zdev->iommu_pages / 8);
425 pr_info("iommu_size: 0x%lx iommu_pages: 0x%lx bitmap_order: %i\n",
426 zdev->iommu_size, zdev->iommu_pages, bitmap_order);
427
428 zdev->iommu_bitmap = (void *) __get_free_pages(GFP_KERNEL | __GFP_ZERO,
429 bitmap_order);
430 if (!zdev->iommu_bitmap) { 425 if (!zdev->iommu_bitmap) {
431 rc = -ENOMEM; 426 rc = -ENOMEM;
432 goto out_reg; 427 goto out_reg;
@@ -451,8 +446,7 @@ void zpci_dma_exit_device(struct zpci_dev *zdev)
451{ 446{
452 zpci_unregister_ioat(zdev, 0); 447 zpci_unregister_ioat(zdev, 0);
453 dma_cleanup_tables(zdev); 448 dma_cleanup_tables(zdev);
454 free_pages((unsigned long) zdev->iommu_bitmap, 449 vfree(zdev->iommu_bitmap);
455 get_order(zdev->iommu_pages / 8));
456 zdev->iommu_bitmap = NULL; 450 zdev->iommu_bitmap = NULL;
457 zdev->next_bit = 0; 451 zdev->next_bit = 0;
458} 452}
diff --git a/arch/s390/pci/pci_event.c b/arch/s390/pci/pci_event.c
index ec62e3a0dc09..0aecaf954845 100644
--- a/arch/s390/pci/pci_event.c
+++ b/arch/s390/pci/pci_event.c
@@ -69,7 +69,7 @@ static void zpci_event_log_avail(struct zpci_ccdf_avail *ccdf)
69 clp_add_pci_device(ccdf->fid, ccdf->fh, 0); 69 clp_add_pci_device(ccdf->fid, ccdf->fh, 0);
70 break; 70 break;
71 case 0x0306: 71 case 0x0306:
72 clp_find_pci_devices(); 72 clp_rescan_pci_devices();
73 break; 73 break;
74 default: 74 default:
75 break; 75 break;
diff --git a/arch/s390/pci/pci_insn.c b/arch/s390/pci/pci_insn.c
index 22eeb9d7ffeb..85267c058af8 100644
--- a/arch/s390/pci/pci_insn.c
+++ b/arch/s390/pci/pci_insn.c
@@ -27,7 +27,7 @@ static inline u8 __mpcifc(u64 req, struct zpci_fib *fib, u8 *status)
27 return cc; 27 return cc;
28} 28}
29 29
30int s390pci_mod_fc(u64 req, struct zpci_fib *fib) 30int zpci_mod_fc(u64 req, struct zpci_fib *fib)
31{ 31{
32 u8 cc, status; 32 u8 cc, status;
33 33
@@ -61,7 +61,7 @@ static inline u8 __rpcit(u64 fn, u64 addr, u64 range, u8 *status)
61 return cc; 61 return cc;
62} 62}
63 63
64int s390pci_refresh_trans(u64 fn, u64 addr, u64 range) 64int zpci_refresh_trans(u64 fn, u64 addr, u64 range)
65{ 65{
66 u8 cc, status; 66 u8 cc, status;
67 67
@@ -78,7 +78,7 @@ int s390pci_refresh_trans(u64 fn, u64 addr, u64 range)
78} 78}
79 79
80/* Set Interruption Controls */ 80/* Set Interruption Controls */
81void set_irq_ctrl(u16 ctl, char *unused, u8 isc) 81void zpci_set_irq_ctrl(u16 ctl, char *unused, u8 isc)
82{ 82{
83 asm volatile ( 83 asm volatile (
84 " .insn rsy,0xeb00000000d1,%[ctl],%[isc],%[u]\n" 84 " .insn rsy,0xeb00000000d1,%[ctl],%[isc],%[u]\n"
@@ -109,7 +109,7 @@ static inline int __pcilg(u64 *data, u64 req, u64 offset, u8 *status)
109 return cc; 109 return cc;
110} 110}
111 111
112int s390pci_load(u64 *data, u64 req, u64 offset) 112int zpci_load(u64 *data, u64 req, u64 offset)
113{ 113{
114 u8 status; 114 u8 status;
115 int cc; 115 int cc;
@@ -125,7 +125,7 @@ int s390pci_load(u64 *data, u64 req, u64 offset)
125 __func__, cc, status, req, offset); 125 __func__, cc, status, req, offset);
126 return (cc > 0) ? -EIO : cc; 126 return (cc > 0) ? -EIO : cc;
127} 127}
128EXPORT_SYMBOL_GPL(s390pci_load); 128EXPORT_SYMBOL_GPL(zpci_load);
129 129
130/* PCI Store */ 130/* PCI Store */
131static inline int __pcistg(u64 data, u64 req, u64 offset, u8 *status) 131static inline int __pcistg(u64 data, u64 req, u64 offset, u8 *status)
@@ -147,7 +147,7 @@ static inline int __pcistg(u64 data, u64 req, u64 offset, u8 *status)
147 return cc; 147 return cc;
148} 148}
149 149
150int s390pci_store(u64 data, u64 req, u64 offset) 150int zpci_store(u64 data, u64 req, u64 offset)
151{ 151{
152 u8 status; 152 u8 status;
153 int cc; 153 int cc;
@@ -163,7 +163,7 @@ int s390pci_store(u64 data, u64 req, u64 offset)
163 __func__, cc, status, req, offset); 163 __func__, cc, status, req, offset);
164 return (cc > 0) ? -EIO : cc; 164 return (cc > 0) ? -EIO : cc;
165} 165}
166EXPORT_SYMBOL_GPL(s390pci_store); 166EXPORT_SYMBOL_GPL(zpci_store);
167 167
168/* PCI Store Block */ 168/* PCI Store Block */
169static inline int __pcistb(const u64 *data, u64 req, u64 offset, u8 *status) 169static inline int __pcistb(const u64 *data, u64 req, u64 offset, u8 *status)
@@ -183,7 +183,7 @@ static inline int __pcistb(const u64 *data, u64 req, u64 offset, u8 *status)
183 return cc; 183 return cc;
184} 184}
185 185
186int s390pci_store_block(const u64 *data, u64 req, u64 offset) 186int zpci_store_block(const u64 *data, u64 req, u64 offset)
187{ 187{
188 u8 status; 188 u8 status;
189 int cc; 189 int cc;
@@ -199,4 +199,4 @@ int s390pci_store_block(const u64 *data, u64 req, u64 offset)
199 __func__, cc, status, req, offset); 199 __func__, cc, status, req, offset);
200 return (cc > 0) ? -EIO : cc; 200 return (cc > 0) ? -EIO : cc;
201} 201}
202EXPORT_SYMBOL_GPL(s390pci_store_block); 202EXPORT_SYMBOL_GPL(zpci_store_block);
diff --git a/arch/s390/pci/pci_msi.c b/arch/s390/pci/pci_msi.c
deleted file mode 100644
index b097aed05a9b..000000000000
--- a/arch/s390/pci/pci_msi.c
+++ /dev/null
@@ -1,142 +0,0 @@
1/*
2 * Copyright IBM Corp. 2012
3 *
4 * Author(s):
5 * Jan Glauber <jang@linux.vnet.ibm.com>
6 */
7
8#define COMPONENT "zPCI"
9#define pr_fmt(fmt) COMPONENT ": " fmt
10
11#include <linux/kernel.h>
12#include <linux/err.h>
13#include <linux/rculist.h>
14#include <linux/hash.h>
15#include <linux/pci.h>
16#include <linux/msi.h>
17#include <asm/hw_irq.h>
18
19/* mapping of irq numbers to msi_desc */
20static struct hlist_head *msi_hash;
21static const unsigned int msi_hash_bits = 8;
22#define MSI_HASH_BUCKETS (1U << msi_hash_bits)
23#define msi_hashfn(nr) hash_long(nr, msi_hash_bits)
24
25static DEFINE_SPINLOCK(msi_map_lock);
26
27struct msi_desc *__irq_get_msi_desc(unsigned int irq)
28{
29 struct msi_map *map;
30
31 hlist_for_each_entry_rcu(map,
32 &msi_hash[msi_hashfn(irq)], msi_chain)
33 if (map->irq == irq)
34 return map->msi;
35 return NULL;
36}
37
38int zpci_msi_set_mask_bits(struct msi_desc *msi, u32 mask, u32 flag)
39{
40 if (msi->msi_attrib.is_msix) {
41 int offset = msi->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE +
42 PCI_MSIX_ENTRY_VECTOR_CTRL;
43 msi->masked = readl(msi->mask_base + offset);
44 writel(flag, msi->mask_base + offset);
45 } else {
46 if (msi->msi_attrib.maskbit) {
47 int pos;
48 u32 mask_bits;
49
50 pos = (long) msi->mask_base;
51 pci_read_config_dword(msi->dev, pos, &mask_bits);
52 mask_bits &= ~(mask);
53 mask_bits |= flag & mask;
54 pci_write_config_dword(msi->dev, pos, mask_bits);
55 } else {
56 return 0;
57 }
58 }
59
60 msi->msi_attrib.maskbit = !!flag;
61 return 1;
62}
63
64int zpci_setup_msi_irq(struct zpci_dev *zdev, struct msi_desc *msi,
65 unsigned int nr, int offset)
66{
67 struct msi_map *map;
68 struct msi_msg msg;
69 int rc;
70
71 map = kmalloc(sizeof(*map), GFP_KERNEL);
72 if (map == NULL)
73 return -ENOMEM;
74
75 map->irq = nr;
76 map->msi = msi;
77 zdev->msi_map[nr & ZPCI_MSI_MASK] = map;
78 INIT_HLIST_NODE(&map->msi_chain);
79
80 pr_debug("%s hashing irq: %u to bucket nr: %llu\n",
81 __func__, nr, msi_hashfn(nr));
82 hlist_add_head_rcu(&map->msi_chain, &msi_hash[msi_hashfn(nr)]);
83
84 spin_lock(&msi_map_lock);
85 rc = irq_set_msi_desc(nr, msi);
86 if (rc) {
87 spin_unlock(&msi_map_lock);
88 hlist_del_rcu(&map->msi_chain);
89 kfree(map);
90 zdev->msi_map[nr & ZPCI_MSI_MASK] = NULL;
91 return rc;
92 }
93 spin_unlock(&msi_map_lock);
94
95 msg.data = nr - offset;
96 msg.address_lo = zdev->msi_addr & 0xffffffff;
97 msg.address_hi = zdev->msi_addr >> 32;
98 write_msi_msg(nr, &msg);
99 return 0;
100}
101
102void zpci_teardown_msi_irq(struct zpci_dev *zdev, struct msi_desc *msi)
103{
104 int irq = msi->irq & ZPCI_MSI_MASK;
105 struct msi_map *map;
106
107 msi->msg.address_lo = 0;
108 msi->msg.address_hi = 0;
109 msi->msg.data = 0;
110 msi->irq = 0;
111 zpci_msi_set_mask_bits(msi, 1, 1);
112
113 spin_lock(&msi_map_lock);
114 map = zdev->msi_map[irq];
115 hlist_del_rcu(&map->msi_chain);
116 kfree(map);
117 zdev->msi_map[irq] = NULL;
118 spin_unlock(&msi_map_lock);
119}
120
121/*
122 * The msi hash table has 256 entries which is good for 4..20
123 * devices (a typical device allocates 10 + CPUs MSI's). Maybe make
124 * the hash table size adjustable later.
125 */
126int __init zpci_msihash_init(void)
127{
128 unsigned int i;
129
130 msi_hash = kmalloc(MSI_HASH_BUCKETS * sizeof(*msi_hash), GFP_KERNEL);
131 if (!msi_hash)
132 return -ENOMEM;
133
134 for (i = 0; i < MSI_HASH_BUCKETS; i++)
135 INIT_HLIST_HEAD(&msi_hash[i]);
136 return 0;
137}
138
139void __init zpci_msihash_exit(void)
140{
141 kfree(msi_hash);
142}
diff --git a/arch/s390/pci/pci_sysfs.c b/arch/s390/pci/pci_sysfs.c
index e99a2557f186..cf8a12ff733b 100644
--- a/arch/s390/pci/pci_sysfs.c
+++ b/arch/s390/pci/pci_sysfs.c
@@ -48,11 +48,38 @@ static ssize_t show_pfgid(struct device *dev, struct device_attribute *attr,
48} 48}
49static DEVICE_ATTR(pfgid, S_IRUGO, show_pfgid, NULL); 49static DEVICE_ATTR(pfgid, S_IRUGO, show_pfgid, NULL);
50 50
51static void recover_callback(struct device *dev)
52{
53 struct pci_dev *pdev = to_pci_dev(dev);
54 struct zpci_dev *zdev = get_zdev(pdev);
55 int ret;
56
57 pci_stop_and_remove_bus_device(pdev);
58 ret = zpci_disable_device(zdev);
59 if (ret)
60 return;
61
62 ret = zpci_enable_device(zdev);
63 if (ret)
64 return;
65
66 pci_rescan_bus(zdev->bus);
67}
68
69static ssize_t store_recover(struct device *dev, struct device_attribute *attr,
70 const char *buf, size_t count)
71{
72 int rc = device_schedule_callback(dev, recover_callback);
73 return rc ? rc : count;
74}
75static DEVICE_ATTR(recover, S_IWUSR, NULL, store_recover);
76
51static struct device_attribute *zpci_dev_attrs[] = { 77static struct device_attribute *zpci_dev_attrs[] = {
52 &dev_attr_function_id, 78 &dev_attr_function_id,
53 &dev_attr_function_handle, 79 &dev_attr_function_handle,
54 &dev_attr_pchid, 80 &dev_attr_pchid,
55 &dev_attr_pfgid, 81 &dev_attr_pfgid,
82 &dev_attr_recover,
56 NULL, 83 NULL,
57}; 84};
58 85
diff --git a/arch/score/Kconfig b/arch/score/Kconfig
index 5fc237581caf..a1be70db75fe 100644
--- a/arch/score/Kconfig
+++ b/arch/score/Kconfig
@@ -2,7 +2,6 @@ menu "Machine selection"
2 2
3config SCORE 3config SCORE
4 def_bool y 4 def_bool y
5 select HAVE_GENERIC_HARDIRQS
6 select GENERIC_IRQ_SHOW 5 select GENERIC_IRQ_SHOW
7 select GENERIC_IOMAP 6 select GENERIC_IOMAP
8 select GENERIC_ATOMIC64 7 select GENERIC_ATOMIC64
diff --git a/arch/score/mm/fault.c b/arch/score/mm/fault.c
index 6b18fb0189ae..52238983527d 100644
--- a/arch/score/mm/fault.c
+++ b/arch/score/mm/fault.c
@@ -47,6 +47,7 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long write,
47 struct task_struct *tsk = current; 47 struct task_struct *tsk = current;
48 struct mm_struct *mm = tsk->mm; 48 struct mm_struct *mm = tsk->mm;
49 const int field = sizeof(unsigned long) * 2; 49 const int field = sizeof(unsigned long) * 2;
50 unsigned long flags = 0;
50 siginfo_t info; 51 siginfo_t info;
51 int fault; 52 int fault;
52 53
@@ -75,6 +76,9 @@ asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long write,
75 if (in_atomic() || !mm) 76 if (in_atomic() || !mm)
76 goto bad_area_nosemaphore; 77 goto bad_area_nosemaphore;
77 78
79 if (user_mode(regs))
80 flags |= FAULT_FLAG_USER;
81
78 down_read(&mm->mmap_sem); 82 down_read(&mm->mmap_sem);
79 vma = find_vma(mm, address); 83 vma = find_vma(mm, address);
80 if (!vma) 84 if (!vma)
@@ -95,18 +99,18 @@ good_area:
95 if (write) { 99 if (write) {
96 if (!(vma->vm_flags & VM_WRITE)) 100 if (!(vma->vm_flags & VM_WRITE))
97 goto bad_area; 101 goto bad_area;
102 flags |= FAULT_FLAG_WRITE;
98 } else { 103 } else {
99 if (!(vma->vm_flags & (VM_READ | VM_WRITE | VM_EXEC))) 104 if (!(vma->vm_flags & (VM_READ | VM_WRITE | VM_EXEC)))
100 goto bad_area; 105 goto bad_area;
101 } 106 }
102 107
103survive:
104 /* 108 /*
105 * If for any reason at all we couldn't handle the fault, 109 * If for any reason at all we couldn't handle the fault,
106 * make sure we exit gracefully rather than endlessly redo 110 * make sure we exit gracefully rather than endlessly redo
107 * the fault. 111 * the fault.
108 */ 112 */
109 fault = handle_mm_fault(mm, vma, address, write); 113 fault = handle_mm_fault(mm, vma, address, flags);
110 if (unlikely(fault & VM_FAULT_ERROR)) { 114 if (unlikely(fault & VM_FAULT_ERROR)) {
111 if (fault & VM_FAULT_OOM) 115 if (fault & VM_FAULT_OOM)
112 goto out_of_memory; 116 goto out_of_memory;
@@ -167,11 +171,6 @@ no_context:
167 */ 171 */
168out_of_memory: 172out_of_memory:
169 up_read(&mm->mmap_sem); 173 up_read(&mm->mmap_sem);
170 if (is_global_init(tsk)) {
171 yield();
172 down_read(&mm->mmap_sem);
173 goto survive;
174 }
175 if (!user_mode(regs)) 174 if (!user_mode(regs))
176 goto no_context; 175 goto no_context;
177 pagefault_out_of_memory(); 176 pagefault_out_of_memory();
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig
index 1020dd85431a..224f4bc9925e 100644
--- a/arch/sh/Kconfig
+++ b/arch/sh/Kconfig
@@ -26,7 +26,6 @@ config SUPERH
26 select ARCH_WANT_IPC_PARSE_VERSION 26 select ARCH_WANT_IPC_PARSE_VERSION
27 select HAVE_SYSCALL_TRACEPOINTS 27 select HAVE_SYSCALL_TRACEPOINTS
28 select HAVE_REGS_AND_STACK_ACCESS_API 28 select HAVE_REGS_AND_STACK_ACCESS_API
29 select HAVE_GENERIC_HARDIRQS
30 select MAY_HAVE_SPARSE_IRQ 29 select MAY_HAVE_SPARSE_IRQ
31 select IRQ_FORCED_THREADING 30 select IRQ_FORCED_THREADING
32 select RTC_LIB 31 select RTC_LIB
@@ -643,9 +642,9 @@ config KEXEC
643 642
644 It is an ongoing process to be certain the hardware in a machine 643 It is an ongoing process to be certain the hardware in a machine
645 is properly shutdown, so do not be surprised if this code does not 644 is properly shutdown, so do not be surprised if this code does not
646 initially work for you. It may help to enable device hotplugging 645 initially work for you. As of this writing the exact hardware
647 support. As of this writing the exact hardware interface is 646 interface is strongly in flux, so no good recommendation can be
648 strongly in flux, so no good recommendation can be made. 647 made.
649 648
650config CRASH_DUMP 649config CRASH_DUMP
651 bool "kernel crash dumps (EXPERIMENTAL)" 650 bool "kernel crash dumps (EXPERIMENTAL)"
diff --git a/arch/sh/boards/board-espt.c b/arch/sh/boards/board-espt.c
index 4d94dff9015c..7291e2f11a47 100644
--- a/arch/sh/boards/board-espt.c
+++ b/arch/sh/boards/board-espt.c
@@ -80,7 +80,6 @@ static struct resource sh_eth_resources[] = {
80static struct sh_eth_plat_data sh7763_eth_pdata = { 80static struct sh_eth_plat_data sh7763_eth_pdata = {
81 .phy = 0, 81 .phy = 0,
82 .edmac_endian = EDMAC_LITTLE_ENDIAN, 82 .edmac_endian = EDMAC_LITTLE_ENDIAN,
83 .register_type = SH_ETH_REG_GIGABIT,
84 .phy_interface = PHY_INTERFACE_MODE_MII, 83 .phy_interface = PHY_INTERFACE_MODE_MII,
85}; 84};
86 85
diff --git a/arch/sh/boards/board-sh7757lcr.c b/arch/sh/boards/board-sh7757lcr.c
index 4f114d1cd019..25c5a932f9fe 100644
--- a/arch/sh/boards/board-sh7757lcr.c
+++ b/arch/sh/boards/board-sh7757lcr.c
@@ -77,7 +77,6 @@ static struct resource sh_eth0_resources[] = {
77static struct sh_eth_plat_data sh7757_eth0_pdata = { 77static struct sh_eth_plat_data sh7757_eth0_pdata = {
78 .phy = 1, 78 .phy = 1,
79 .edmac_endian = EDMAC_LITTLE_ENDIAN, 79 .edmac_endian = EDMAC_LITTLE_ENDIAN,
80 .register_type = SH_ETH_REG_FAST_SH4,
81 .set_mdio_gate = sh7757_eth_set_mdio_gate, 80 .set_mdio_gate = sh7757_eth_set_mdio_gate,
82}; 81};
83 82
@@ -106,7 +105,6 @@ static struct resource sh_eth1_resources[] = {
106static struct sh_eth_plat_data sh7757_eth1_pdata = { 105static struct sh_eth_plat_data sh7757_eth1_pdata = {
107 .phy = 1, 106 .phy = 1,
108 .edmac_endian = EDMAC_LITTLE_ENDIAN, 107 .edmac_endian = EDMAC_LITTLE_ENDIAN,
109 .register_type = SH_ETH_REG_FAST_SH4,
110 .set_mdio_gate = sh7757_eth_set_mdio_gate, 108 .set_mdio_gate = sh7757_eth_set_mdio_gate,
111}; 109};
112 110
@@ -151,7 +149,6 @@ static struct resource sh_eth_giga0_resources[] = {
151static struct sh_eth_plat_data sh7757_eth_giga0_pdata = { 149static struct sh_eth_plat_data sh7757_eth_giga0_pdata = {
152 .phy = 18, 150 .phy = 18,
153 .edmac_endian = EDMAC_LITTLE_ENDIAN, 151 .edmac_endian = EDMAC_LITTLE_ENDIAN,
154 .register_type = SH_ETH_REG_GIGABIT,
155 .set_mdio_gate = sh7757_eth_giga_set_mdio_gate, 152 .set_mdio_gate = sh7757_eth_giga_set_mdio_gate,
156 .phy_interface = PHY_INTERFACE_MODE_RGMII_ID, 153 .phy_interface = PHY_INTERFACE_MODE_RGMII_ID,
157}; 154};
@@ -186,7 +183,6 @@ static struct resource sh_eth_giga1_resources[] = {
186static struct sh_eth_plat_data sh7757_eth_giga1_pdata = { 183static struct sh_eth_plat_data sh7757_eth_giga1_pdata = {
187 .phy = 19, 184 .phy = 19,
188 .edmac_endian = EDMAC_LITTLE_ENDIAN, 185 .edmac_endian = EDMAC_LITTLE_ENDIAN,
189 .register_type = SH_ETH_REG_GIGABIT,
190 .set_mdio_gate = sh7757_eth_giga_set_mdio_gate, 186 .set_mdio_gate = sh7757_eth_giga_set_mdio_gate,
191 .phy_interface = PHY_INTERFACE_MODE_RGMII_ID, 187 .phy_interface = PHY_INTERFACE_MODE_RGMII_ID,
192}; 188};
diff --git a/arch/sh/boards/mach-ecovec24/setup.c b/arch/sh/boards/mach-ecovec24/setup.c
index 61fade0ffa96..1fa8be409771 100644
--- a/arch/sh/boards/mach-ecovec24/setup.c
+++ b/arch/sh/boards/mach-ecovec24/setup.c
@@ -30,6 +30,7 @@
30#include <linux/spi/mmc_spi.h> 30#include <linux/spi/mmc_spi.h>
31#include <linux/input.h> 31#include <linux/input.h>
32#include <linux/input/sh_keysc.h> 32#include <linux/input/sh_keysc.h>
33#include <linux/platform_data/gpio_backlight.h>
33#include <linux/sh_eth.h> 34#include <linux/sh_eth.h>
34#include <linux/sh_intc.h> 35#include <linux/sh_intc.h>
35#include <linux/videodev2.h> 36#include <linux/videodev2.h>
@@ -159,7 +160,6 @@ static struct resource sh_eth_resources[] = {
159static struct sh_eth_plat_data sh_eth_plat = { 160static struct sh_eth_plat_data sh_eth_plat = {
160 .phy = 0x1f, /* SMSC LAN8700 */ 161 .phy = 0x1f, /* SMSC LAN8700 */
161 .edmac_endian = EDMAC_LITTLE_ENDIAN, 162 .edmac_endian = EDMAC_LITTLE_ENDIAN,
162 .register_type = SH_ETH_REG_FAST_SH4,
163 .phy_interface = PHY_INTERFACE_MODE_MII, 163 .phy_interface = PHY_INTERFACE_MODE_MII,
164 .ether_link_active_low = 1 164 .ether_link_active_low = 1
165}; 165};
@@ -303,7 +303,7 @@ static struct platform_device usbhs_device = {
303 .resource = usbhs_resources, 303 .resource = usbhs_resources,
304}; 304};
305 305
306/* LCDC */ 306/* LCDC and backlight */
307static const struct fb_videomode ecovec_lcd_modes[] = { 307static const struct fb_videomode ecovec_lcd_modes[] = {
308 { 308 {
309 .name = "Panel", 309 .name = "Panel",
@@ -334,13 +334,6 @@ static const struct fb_videomode ecovec_dvi_modes[] = {
334 }, 334 },
335}; 335};
336 336
337static int ecovec24_set_brightness(int brightness)
338{
339 gpio_set_value(GPIO_PTR1, brightness);
340
341 return 0;
342}
343
344static struct sh_mobile_lcdc_info lcdc_info = { 337static struct sh_mobile_lcdc_info lcdc_info = {
345 .ch[0] = { 338 .ch[0] = {
346 .interface_type = RGB18, 339 .interface_type = RGB18,
@@ -350,11 +343,6 @@ static struct sh_mobile_lcdc_info lcdc_info = {
350 .width = 152, 343 .width = 152,
351 .height = 91, 344 .height = 91,
352 }, 345 },
353 .bl_info = {
354 .name = "sh_mobile_lcdc_bl",
355 .max_brightness = 1,
356 .set_brightness = ecovec24_set_brightness,
357 },
358 } 346 }
359}; 347};
360 348
@@ -380,6 +368,20 @@ static struct platform_device lcdc_device = {
380 }, 368 },
381}; 369};
382 370
371static struct gpio_backlight_platform_data gpio_backlight_data = {
372 .fbdev = &lcdc_device.dev,
373 .gpio = GPIO_PTR1,
374 .def_value = 1,
375 .name = "backlight",
376};
377
378static struct platform_device gpio_backlight_device = {
379 .name = "gpio-backlight",
380 .dev = {
381 .platform_data = &gpio_backlight_data,
382 },
383};
384
383/* CEU0 */ 385/* CEU0 */
384static struct sh_mobile_ceu_info sh_mobile_ceu0_info = { 386static struct sh_mobile_ceu_info sh_mobile_ceu0_info = {
385 .flags = SH_CEU_FLAG_USE_8BIT_BUS, 387 .flags = SH_CEU_FLAG_USE_8BIT_BUS,
@@ -598,37 +600,13 @@ static struct platform_device sdhi0_power = {
598 }, 600 },
599}; 601};
600 602
601static void sdhi0_set_pwr(struct platform_device *pdev, int state)
602{
603 static int power_gpio = -EINVAL;
604
605 if (power_gpio < 0) {
606 int ret = gpio_request(GPIO_PTB6, NULL);
607 if (!ret) {
608 power_gpio = GPIO_PTB6;
609 gpio_direction_output(power_gpio, 0);
610 }
611 }
612
613 /*
614 * Toggle the GPIO regardless, whether we managed to grab it above or
615 * the fixed regulator driver did.
616 */
617 gpio_set_value(GPIO_PTB6, state);
618}
619
620static int sdhi0_get_cd(struct platform_device *pdev)
621{
622 return !gpio_get_value(GPIO_PTY7);
623}
624
625static struct sh_mobile_sdhi_info sdhi0_info = { 603static struct sh_mobile_sdhi_info sdhi0_info = {
626 .dma_slave_tx = SHDMA_SLAVE_SDHI0_TX, 604 .dma_slave_tx = SHDMA_SLAVE_SDHI0_TX,
627 .dma_slave_rx = SHDMA_SLAVE_SDHI0_RX, 605 .dma_slave_rx = SHDMA_SLAVE_SDHI0_RX,
628 .set_pwr = sdhi0_set_pwr,
629 .tmio_caps = MMC_CAP_SDIO_IRQ | MMC_CAP_POWER_OFF_CARD | 606 .tmio_caps = MMC_CAP_SDIO_IRQ | MMC_CAP_POWER_OFF_CARD |
630 MMC_CAP_NEEDS_POLL, 607 MMC_CAP_NEEDS_POLL,
631 .get_cd = sdhi0_get_cd, 608 .tmio_flags = TMIO_MMC_USE_GPIO_CD,
609 .cd_gpio = GPIO_PTY7,
632}; 610};
633 611
634static struct resource sdhi0_resources[] = { 612static struct resource sdhi0_resources[] = {
@@ -654,39 +632,15 @@ static struct platform_device sdhi0_device = {
654 }, 632 },
655}; 633};
656 634
657static void cn12_set_pwr(struct platform_device *pdev, int state)
658{
659 static int power_gpio = -EINVAL;
660
661 if (power_gpio < 0) {
662 int ret = gpio_request(GPIO_PTB7, NULL);
663 if (!ret) {
664 power_gpio = GPIO_PTB7;
665 gpio_direction_output(power_gpio, 0);
666 }
667 }
668
669 /*
670 * Toggle the GPIO regardless, whether we managed to grab it above or
671 * the fixed regulator driver did.
672 */
673 gpio_set_value(GPIO_PTB7, state);
674}
675
676#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE) 635#if !defined(CONFIG_MMC_SH_MMCIF) && !defined(CONFIG_MMC_SH_MMCIF_MODULE)
677/* SDHI1 */ 636/* SDHI1 */
678static int sdhi1_get_cd(struct platform_device *pdev)
679{
680 return !gpio_get_value(GPIO_PTW7);
681}
682
683static struct sh_mobile_sdhi_info sdhi1_info = { 637static struct sh_mobile_sdhi_info sdhi1_info = {
684 .dma_slave_tx = SHDMA_SLAVE_SDHI1_TX, 638 .dma_slave_tx = SHDMA_SLAVE_SDHI1_TX,
685 .dma_slave_rx = SHDMA_SLAVE_SDHI1_RX, 639 .dma_slave_rx = SHDMA_SLAVE_SDHI1_RX,
686 .tmio_caps = MMC_CAP_SDIO_IRQ | MMC_CAP_POWER_OFF_CARD | 640 .tmio_caps = MMC_CAP_SDIO_IRQ | MMC_CAP_POWER_OFF_CARD |
687 MMC_CAP_NEEDS_POLL, 641 MMC_CAP_NEEDS_POLL,
688 .set_pwr = cn12_set_pwr, 642 .tmio_flags = TMIO_MMC_USE_GPIO_CD,
689 .get_cd = sdhi1_get_cd, 643 .cd_gpio = GPIO_PTW7,
690}; 644};
691 645
692static struct resource sdhi1_resources[] = { 646static struct resource sdhi1_resources[] = {
@@ -716,27 +670,19 @@ static struct platform_device sdhi1_device = {
716#else 670#else
717 671
718/* MMC SPI */ 672/* MMC SPI */
719static int mmc_spi_get_ro(struct device *dev)
720{
721 return gpio_get_value(GPIO_PTY6);
722}
723
724static int mmc_spi_get_cd(struct device *dev)
725{
726 return !gpio_get_value(GPIO_PTY7);
727}
728
729static void mmc_spi_setpower(struct device *dev, unsigned int maskval) 673static void mmc_spi_setpower(struct device *dev, unsigned int maskval)
730{ 674{
731 gpio_set_value(GPIO_PTB6, maskval ? 1 : 0); 675 gpio_set_value(GPIO_PTB6, maskval ? 1 : 0);
732} 676}
733 677
734static struct mmc_spi_platform_data mmc_spi_info = { 678static struct mmc_spi_platform_data mmc_spi_info = {
735 .get_ro = mmc_spi_get_ro,
736 .get_cd = mmc_spi_get_cd,
737 .caps = MMC_CAP_NEEDS_POLL, 679 .caps = MMC_CAP_NEEDS_POLL,
680 .caps2 = MMC_CAP2_RO_ACTIVE_HIGH,
738 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, /* 3.3V only */ 681 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, /* 3.3V only */
739 .setpower = mmc_spi_setpower, 682 .setpower = mmc_spi_setpower,
683 .flags = MMC_SPI_USE_CD_GPIO | MMC_SPI_USE_RO_GPIO,
684 .cd_gpio = GPIO_PTY7,
685 .ro_gpio = GPIO_PTY6,
740}; 686};
741 687
742static struct spi_board_info spi_bus[] = { 688static struct spi_board_info spi_bus[] = {
@@ -996,11 +942,6 @@ static struct platform_device vou_device = {
996 942
997#if defined(CONFIG_MMC_SH_MMCIF) || defined(CONFIG_MMC_SH_MMCIF_MODULE) 943#if defined(CONFIG_MMC_SH_MMCIF) || defined(CONFIG_MMC_SH_MMCIF_MODULE)
998/* SH_MMCIF */ 944/* SH_MMCIF */
999static void mmcif_down_pwr(struct platform_device *pdev)
1000{
1001 cn12_set_pwr(pdev, 0);
1002}
1003
1004static struct resource sh_mmcif_resources[] = { 945static struct resource sh_mmcif_resources[] = {
1005 [0] = { 946 [0] = {
1006 .name = "SH_MMCIF", 947 .name = "SH_MMCIF",
@@ -1021,8 +962,6 @@ static struct resource sh_mmcif_resources[] = {
1021}; 962};
1022 963
1023static struct sh_mmcif_plat_data sh_mmcif_plat = { 964static struct sh_mmcif_plat_data sh_mmcif_plat = {
1024 .set_pwr = cn12_set_pwr,
1025 .down_pwr = mmcif_down_pwr,
1026 .sup_pclk = 0, /* SH7724: Max Pclk/2 */ 965 .sup_pclk = 0, /* SH7724: Max Pclk/2 */
1027 .caps = MMC_CAP_4_BIT_DATA | 966 .caps = MMC_CAP_4_BIT_DATA |
1028 MMC_CAP_8_BIT_DATA | 967 MMC_CAP_8_BIT_DATA |
@@ -1049,6 +988,7 @@ static struct platform_device *ecovec_devices[] __initdata = {
1049 &usb1_common_device, 988 &usb1_common_device,
1050 &usbhs_device, 989 &usbhs_device,
1051 &lcdc_device, 990 &lcdc_device,
991 &gpio_backlight_device,
1052 &ceu0_device, 992 &ceu0_device,
1053 &ceu1_device, 993 &ceu1_device,
1054 &keysc_device, 994 &keysc_device,
@@ -1239,11 +1179,9 @@ static int __init arch_setup(void)
1239 1179
1240 gpio_request(GPIO_PTE6, NULL); 1180 gpio_request(GPIO_PTE6, NULL);
1241 gpio_request(GPIO_PTU1, NULL); 1181 gpio_request(GPIO_PTU1, NULL);
1242 gpio_request(GPIO_PTR1, NULL);
1243 gpio_request(GPIO_PTA2, NULL); 1182 gpio_request(GPIO_PTA2, NULL);
1244 gpio_direction_input(GPIO_PTE6); 1183 gpio_direction_input(GPIO_PTE6);
1245 gpio_direction_output(GPIO_PTU1, 0); 1184 gpio_direction_output(GPIO_PTU1, 0);
1246 gpio_direction_output(GPIO_PTR1, 0);
1247 gpio_direction_output(GPIO_PTA2, 0); 1185 gpio_direction_output(GPIO_PTA2, 0);
1248 1186
1249 /* I/O buffer drive ability is high */ 1187 /* I/O buffer drive ability is high */
@@ -1256,6 +1194,9 @@ static int __init arch_setup(void)
1256 lcdc_info.ch[0].lcd_modes = ecovec_dvi_modes; 1194 lcdc_info.ch[0].lcd_modes = ecovec_dvi_modes;
1257 lcdc_info.ch[0].num_modes = ARRAY_SIZE(ecovec_dvi_modes); 1195 lcdc_info.ch[0].num_modes = ARRAY_SIZE(ecovec_dvi_modes);
1258 1196
1197 /* No backlight */
1198 gpio_backlight_data.fbdev = NULL;
1199
1259 gpio_set_value(GPIO_PTA2, 1); 1200 gpio_set_value(GPIO_PTA2, 1);
1260 gpio_set_value(GPIO_PTU1, 1); 1201 gpio_set_value(GPIO_PTU1, 1);
1261 } else { 1202 } else {
@@ -1265,8 +1206,6 @@ static int __init arch_setup(void)
1265 lcdc_info.ch[0].lcd_modes = ecovec_lcd_modes; 1206 lcdc_info.ch[0].lcd_modes = ecovec_lcd_modes;
1266 lcdc_info.ch[0].num_modes = ARRAY_SIZE(ecovec_lcd_modes); 1207 lcdc_info.ch[0].num_modes = ARRAY_SIZE(ecovec_lcd_modes);
1267 1208
1268 gpio_set_value(GPIO_PTR1, 1);
1269
1270 /* FIXME 1209 /* FIXME
1271 * 1210 *
1272 * LCDDON control is needed for Panel, 1211 * LCDDON control is needed for Panel,
@@ -1339,10 +1278,6 @@ static int __init arch_setup(void)
1339 gpio_direction_input(GPIO_PTR6); 1278 gpio_direction_input(GPIO_PTR6);
1340 1279
1341 /* SD-card slot CN11 */ 1280 /* SD-card slot CN11 */
1342 /* Card-detect, used on CN11, either with SDHI0 or with SPI */
1343 gpio_request(GPIO_PTY7, NULL);
1344 gpio_direction_input(GPIO_PTY7);
1345
1346#if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE) 1281#if defined(CONFIG_MMC_SDHI) || defined(CONFIG_MMC_SDHI_MODULE)
1347 /* enable SDHI0 on CN11 (needs DS2.4 set to ON) */ 1282 /* enable SDHI0 on CN11 (needs DS2.4 set to ON) */
1348 gpio_request(GPIO_FN_SDHI0WP, NULL); 1283 gpio_request(GPIO_FN_SDHI0WP, NULL);
@@ -1361,8 +1296,6 @@ static int __init arch_setup(void)
1361 gpio_direction_output(GPIO_PTM4, 1); /* active low CS */ 1296 gpio_direction_output(GPIO_PTM4, 1); /* active low CS */
1362 gpio_request(GPIO_PTB6, NULL); /* 3.3V power control */ 1297 gpio_request(GPIO_PTB6, NULL); /* 3.3V power control */
1363 gpio_direction_output(GPIO_PTB6, 0); /* disable power by default */ 1298 gpio_direction_output(GPIO_PTB6, 0); /* disable power by default */
1364 gpio_request(GPIO_PTY6, NULL); /* write protect */
1365 gpio_direction_input(GPIO_PTY6);
1366 1299
1367 spi_register_board_info(spi_bus, ARRAY_SIZE(spi_bus)); 1300 spi_register_board_info(spi_bus, ARRAY_SIZE(spi_bus));
1368#endif 1301#endif
@@ -1392,10 +1325,6 @@ static int __init arch_setup(void)
1392 gpio_request(GPIO_FN_SDHI1D1, NULL); 1325 gpio_request(GPIO_FN_SDHI1D1, NULL);
1393 gpio_request(GPIO_FN_SDHI1D0, NULL); 1326 gpio_request(GPIO_FN_SDHI1D0, NULL);
1394 1327
1395 /* Card-detect, used on CN12 with SDHI1 */
1396 gpio_request(GPIO_PTW7, NULL);
1397 gpio_direction_input(GPIO_PTW7);
1398
1399 cn12_enabled = true; 1328 cn12_enabled = true;
1400#endif 1329#endif
1401 1330
diff --git a/arch/sh/boards/mach-kfr2r09/lcd_wqvga.c b/arch/sh/boards/mach-kfr2r09/lcd_wqvga.c
index c62050332629..355a78a3b313 100644
--- a/arch/sh/boards/mach-kfr2r09/lcd_wqvga.c
+++ b/arch/sh/boards/mach-kfr2r09/lcd_wqvga.c
@@ -276,51 +276,3 @@ void kfr2r09_lcd_start(void *sohandle, struct sh_mobile_lcdc_sys_bus_ops *so)
276{ 276{
277 write_memory_start(sohandle, so); 277 write_memory_start(sohandle, so);
278} 278}
279
280#define CTRL_CKSW 0x10
281#define CTRL_C10 0x20
282#define CTRL_CPSW 0x80
283#define MAIN_MLED4 0x40
284#define MAIN_MSW 0x80
285
286int kfr2r09_lcd_set_brightness(int brightness)
287{
288 struct i2c_adapter *a;
289 struct i2c_msg msg;
290 unsigned char buf[2];
291 int ret;
292
293 a = i2c_get_adapter(0);
294 if (!a)
295 return -ENODEV;
296
297 buf[0] = 0x00;
298 if (brightness)
299 buf[1] = CTRL_CPSW | CTRL_C10 | CTRL_CKSW;
300 else
301 buf[1] = 0;
302
303 msg.addr = 0x75;
304 msg.buf = buf;
305 msg.len = 2;
306 msg.flags = 0;
307 ret = i2c_transfer(a, &msg, 1);
308 if (ret != 1)
309 return -ENODEV;
310
311 buf[0] = 0x01;
312 if (brightness)
313 buf[1] = MAIN_MSW | MAIN_MLED4 | 0x0c;
314 else
315 buf[1] = 0;
316
317 msg.addr = 0x75;
318 msg.buf = buf;
319 msg.len = 2;
320 msg.flags = 0;
321 ret = i2c_transfer(a, &msg, 1);
322 if (ret != 1)
323 return -ENODEV;
324
325 return 0;
326}
diff --git a/arch/sh/boards/mach-kfr2r09/setup.c b/arch/sh/boards/mach-kfr2r09/setup.c
index ab502f12ef57..1df4398f8375 100644
--- a/arch/sh/boards/mach-kfr2r09/setup.c
+++ b/arch/sh/boards/mach-kfr2r09/setup.c
@@ -21,6 +21,7 @@
21#include <linux/input.h> 21#include <linux/input.h>
22#include <linux/input/sh_keysc.h> 22#include <linux/input/sh_keysc.h>
23#include <linux/i2c.h> 23#include <linux/i2c.h>
24#include <linux/platform_data/lv5207lp.h>
24#include <linux/regulator/fixed.h> 25#include <linux/regulator/fixed.h>
25#include <linux/regulator/machine.h> 26#include <linux/regulator/machine.h>
26#include <linux/usb/r8a66597.h> 27#include <linux/usb/r8a66597.h>
@@ -159,11 +160,6 @@ static struct sh_mobile_lcdc_info kfr2r09_sh_lcdc_info = {
159 .setup_sys = kfr2r09_lcd_setup, 160 .setup_sys = kfr2r09_lcd_setup,
160 .start_transfer = kfr2r09_lcd_start, 161 .start_transfer = kfr2r09_lcd_start,
161 }, 162 },
162 .bl_info = {
163 .name = "sh_mobile_lcdc_bl",
164 .max_brightness = 1,
165 .set_brightness = kfr2r09_lcd_set_brightness,
166 },
167 .sys_bus_cfg = { 163 .sys_bus_cfg = {
168 .ldmt2r = 0x07010904, 164 .ldmt2r = 0x07010904,
169 .ldmt3r = 0x14012914, 165 .ldmt3r = 0x14012914,
@@ -195,6 +191,17 @@ static struct platform_device kfr2r09_sh_lcdc_device = {
195 }, 191 },
196}; 192};
197 193
194static struct lv5207lp_platform_data kfr2r09_backlight_data = {
195 .fbdev = &kfr2r09_sh_lcdc_device.dev,
196 .def_value = 13,
197 .max_value = 13,
198};
199
200static struct i2c_board_info kfr2r09_backlight_board_info = {
201 I2C_BOARD_INFO("lv5207lp", 0x75),
202 .platform_data = &kfr2r09_backlight_data,
203};
204
198static struct r8a66597_platdata kfr2r09_usb0_gadget_data = { 205static struct r8a66597_platdata kfr2r09_usb0_gadget_data = {
199 .on_chip = 1, 206 .on_chip = 1,
200}; 207};
@@ -627,6 +634,8 @@ static int __init kfr2r09_devices_setup(void)
627 gpio_request(GPIO_FN_SDHI0CMD, NULL); 634 gpio_request(GPIO_FN_SDHI0CMD, NULL);
628 gpio_request(GPIO_FN_SDHI0CLK, NULL); 635 gpio_request(GPIO_FN_SDHI0CLK, NULL);
629 636
637 i2c_register_board_info(0, &kfr2r09_backlight_board_info, 1);
638
630 return platform_add_devices(kfr2r09_devices, 639 return platform_add_devices(kfr2r09_devices,
631 ARRAY_SIZE(kfr2r09_devices)); 640 ARRAY_SIZE(kfr2r09_devices));
632} 641}
diff --git a/arch/sh/boards/mach-se/7724/setup.c b/arch/sh/boards/mach-se/7724/setup.c
index b70180ef3e29..21e4230659a5 100644
--- a/arch/sh/boards/mach-se/7724/setup.c
+++ b/arch/sh/boards/mach-se/7724/setup.c
@@ -365,7 +365,7 @@ static struct platform_device keysc_device = {
365static struct resource sh_eth_resources[] = { 365static struct resource sh_eth_resources[] = {
366 [0] = { 366 [0] = {
367 .start = SH_ETH_ADDR, 367 .start = SH_ETH_ADDR,
368 .end = SH_ETH_ADDR + 0x1FC, 368 .end = SH_ETH_ADDR + 0x1FC - 1,
369 .flags = IORESOURCE_MEM, 369 .flags = IORESOURCE_MEM,
370 }, 370 },
371 [1] = { 371 [1] = {
@@ -377,6 +377,7 @@ static struct resource sh_eth_resources[] = {
377static struct sh_eth_plat_data sh_eth_plat = { 377static struct sh_eth_plat_data sh_eth_plat = {
378 .phy = 0x1f, /* SMSC LAN8187 */ 378 .phy = 0x1f, /* SMSC LAN8187 */
379 .edmac_endian = EDMAC_LITTLE_ENDIAN, 379 .edmac_endian = EDMAC_LITTLE_ENDIAN,
380 .phy_interface = PHY_INTERFACE_MODE_MII,
380}; 381};
381 382
382static struct platform_device sh_eth_device = { 383static struct platform_device sh_eth_device = {
diff --git a/arch/sh/boards/mach-sh7763rdp/setup.c b/arch/sh/boards/mach-sh7763rdp/setup.c
index 50ba481fa240..2c8fb04685d4 100644
--- a/arch/sh/boards/mach-sh7763rdp/setup.c
+++ b/arch/sh/boards/mach-sh7763rdp/setup.c
@@ -88,7 +88,6 @@ static struct resource sh_eth_resources[] = {
88static struct sh_eth_plat_data sh7763_eth_pdata = { 88static struct sh_eth_plat_data sh7763_eth_pdata = {
89 .phy = 1, 89 .phy = 1,
90 .edmac_endian = EDMAC_LITTLE_ENDIAN, 90 .edmac_endian = EDMAC_LITTLE_ENDIAN,
91 .register_type = SH_ETH_REG_GIGABIT,
92 .phy_interface = PHY_INTERFACE_MODE_MII, 91 .phy_interface = PHY_INTERFACE_MODE_MII,
93}; 92};
94 93
diff --git a/arch/sh/drivers/pci/pci.c b/arch/sh/drivers/pci/pci.c
index 102f5d58b037..60ed3e1c4b75 100644
--- a/arch/sh/drivers/pci/pci.c
+++ b/arch/sh/drivers/pci/pci.c
@@ -69,7 +69,6 @@ static void pcibios_scanbus(struct pci_channel *hose)
69 69
70 pci_bus_size_bridges(bus); 70 pci_bus_size_bridges(bus);
71 pci_bus_assign_resources(bus); 71 pci_bus_assign_resources(bus);
72 pci_enable_bridges(bus);
73 } else { 72 } else {
74 pci_free_resource_list(&resources); 73 pci_free_resource_list(&resources);
75 } 74 }
diff --git a/arch/sh/include/mach-kfr2r09/mach/kfr2r09.h b/arch/sh/include/mach-kfr2r09/mach/kfr2r09.h
index c20c9e5f5eab..79f154e5cb9c 100644
--- a/arch/sh/include/mach-kfr2r09/mach/kfr2r09.h
+++ b/arch/sh/include/mach-kfr2r09/mach/kfr2r09.h
@@ -4,13 +4,11 @@
4#include <video/sh_mobile_lcdc.h> 4#include <video/sh_mobile_lcdc.h>
5 5
6#if defined(CONFIG_FB_SH_MOBILE_LCDC) || defined(CONFIG_FB_SH_MOBILE_LCDC_MODULE) 6#if defined(CONFIG_FB_SH_MOBILE_LCDC) || defined(CONFIG_FB_SH_MOBILE_LCDC_MODULE)
7int kfr2r09_lcd_set_brightness(int brightness);
8int kfr2r09_lcd_setup(void *sys_ops_handle, 7int kfr2r09_lcd_setup(void *sys_ops_handle,
9 struct sh_mobile_lcdc_sys_bus_ops *sys_ops); 8 struct sh_mobile_lcdc_sys_bus_ops *sys_ops);
10void kfr2r09_lcd_start(void *sys_ops_handle, 9void kfr2r09_lcd_start(void *sys_ops_handle,
11 struct sh_mobile_lcdc_sys_bus_ops *sys_ops); 10 struct sh_mobile_lcdc_sys_bus_ops *sys_ops);
12#else 11#else
13static int kfr2r09_lcd_set_brightness(int brightness) {}
14static int kfr2r09_lcd_setup(void *sys_ops_handle, 12static int kfr2r09_lcd_setup(void *sys_ops_handle,
15 struct sh_mobile_lcdc_sys_bus_ops *sys_ops) 13 struct sh_mobile_lcdc_sys_bus_ops *sys_ops)
16{ 14{
diff --git a/arch/sh/kernel/cpu/sh2/setup-sh7619.c b/arch/sh/kernel/cpu/sh2/setup-sh7619.c
index bb11e1925178..4df4d4ffe39b 100644
--- a/arch/sh/kernel/cpu/sh2/setup-sh7619.c
+++ b/arch/sh/kernel/cpu/sh2/setup-sh7619.c
@@ -12,6 +12,7 @@
12#include <linux/init.h> 12#include <linux/init.h>
13#include <linux/serial.h> 13#include <linux/serial.h>
14#include <linux/serial_sci.h> 14#include <linux/serial_sci.h>
15#include <linux/sh_eth.h>
15#include <linux/sh_timer.h> 16#include <linux/sh_timer.h>
16#include <linux/io.h> 17#include <linux/io.h>
17 18
@@ -110,10 +111,16 @@ static struct platform_device scif2_device = {
110 }, 111 },
111}; 112};
112 113
114static struct sh_eth_plat_data eth_platform_data = {
115 .phy = 1,
116 .edmac_endian = EDMAC_LITTLE_ENDIAN,
117 .phy_interface = PHY_INTERFACE_MODE_MII,
118};
119
113static struct resource eth_resources[] = { 120static struct resource eth_resources[] = {
114 [0] = { 121 [0] = {
115 .start = 0xfb000000, 122 .start = 0xfb000000,
116 .end = 0xfb0001c8, 123 .end = 0xfb0001c7,
117 .flags = IORESOURCE_MEM, 124 .flags = IORESOURCE_MEM,
118 }, 125 },
119 [1] = { 126 [1] = {
@@ -127,7 +134,7 @@ static struct platform_device eth_device = {
127 .name = "sh7619-ether", 134 .name = "sh7619-ether",
128 .id = -1, 135 .id = -1,
129 .dev = { 136 .dev = {
130 .platform_data = (void *)1, 137 .platform_data = &eth_platform_data,
131 }, 138 },
132 .num_resources = ARRAY_SIZE(eth_resources), 139 .num_resources = ARRAY_SIZE(eth_resources),
133 .resource = eth_resources, 140 .resource = eth_resources,
diff --git a/arch/sh/kernel/cpu/shmobile/cpuidle.c b/arch/sh/kernel/cpu/shmobile/cpuidle.c
index d30622592116..e3abfd4277e2 100644
--- a/arch/sh/kernel/cpu/shmobile/cpuidle.c
+++ b/arch/sh/kernel/cpu/shmobile/cpuidle.c
@@ -91,13 +91,11 @@ static struct cpuidle_driver cpuidle_driver = {
91 91
92int __init sh_mobile_setup_cpuidle(void) 92int __init sh_mobile_setup_cpuidle(void)
93{ 93{
94 int ret;
95
96 if (sh_mobile_sleep_supported & SUSP_SH_SF) 94 if (sh_mobile_sleep_supported & SUSP_SH_SF)
97 cpuidle_driver.states[1].disabled = false; 95 cpuidle_driver.states[1].disabled = false;
98 96
99 if (sh_mobile_sleep_supported & SUSP_SH_STANDBY) 97 if (sh_mobile_sleep_supported & SUSP_SH_STANDBY)
100 cpuidle_driver.states[2].disabled = false; 98 cpuidle_driver.states[2].disabled = false;
101 99
102 return cpuidle_register(&cpuidle_driver); 100 return cpuidle_register(&cpuidle_driver, NULL);
103} 101}
diff --git a/arch/sh/mm/fault.c b/arch/sh/mm/fault.c
index 1f49c28affa9..541dc6101508 100644
--- a/arch/sh/mm/fault.c
+++ b/arch/sh/mm/fault.c
@@ -400,9 +400,7 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs,
400 struct mm_struct *mm; 400 struct mm_struct *mm;
401 struct vm_area_struct * vma; 401 struct vm_area_struct * vma;
402 int fault; 402 int fault;
403 int write = error_code & FAULT_CODE_WRITE; 403 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
404 unsigned int flags = (FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE |
405 (write ? FAULT_FLAG_WRITE : 0));
406 404
407 tsk = current; 405 tsk = current;
408 mm = tsk->mm; 406 mm = tsk->mm;
@@ -476,6 +474,11 @@ good_area:
476 474
477 set_thread_fault_code(error_code); 475 set_thread_fault_code(error_code);
478 476
477 if (user_mode(regs))
478 flags |= FAULT_FLAG_USER;
479 if (error_code & FAULT_CODE_WRITE)
480 flags |= FAULT_FLAG_WRITE;
481
479 /* 482 /*
480 * If for any reason at all we couldn't handle the fault, 483 * If for any reason at all we couldn't handle the fault,
481 * make sure we exit gracefully rather than endlessly redo 484 * make sure we exit gracefully rather than endlessly redo
diff --git a/arch/sh/mm/hugetlbpage.c b/arch/sh/mm/hugetlbpage.c
index d7762349ea48..0d676a41081e 100644
--- a/arch/sh/mm/hugetlbpage.c
+++ b/arch/sh/mm/hugetlbpage.c
@@ -83,6 +83,11 @@ int pud_huge(pud_t pud)
83 return 0; 83 return 0;
84} 84}
85 85
86int pmd_huge_support(void)
87{
88 return 0;
89}
90
86struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address, 91struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address,
87 pmd_t *pmd, int write) 92 pmd_t *pmd, int write)
88{ 93{
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig
index a00cbd356db5..2137ad667438 100644
--- a/arch/sparc/Kconfig
+++ b/arch/sparc/Kconfig
@@ -26,7 +26,6 @@ config SPARC
26 select HAVE_DMA_ATTRS 26 select HAVE_DMA_ATTRS
27 select HAVE_DMA_API_DEBUG 27 select HAVE_DMA_API_DEBUG
28 select HAVE_ARCH_JUMP_LABEL 28 select HAVE_ARCH_JUMP_LABEL
29 select HAVE_GENERIC_HARDIRQS
30 select GENERIC_IRQ_SHOW 29 select GENERIC_IRQ_SHOW
31 select ARCH_WANT_IPC_PARSE_VERSION 30 select ARCH_WANT_IPC_PARSE_VERSION
32 select USE_GENERIC_SMP_HELPERS if SMP 31 select USE_GENERIC_SMP_HELPERS if SMP
@@ -52,7 +51,6 @@ config SPARC32
52 51
53config SPARC64 52config SPARC64
54 def_bool 64BIT 53 def_bool 64BIT
55 select ARCH_SUPPORTS_MSI
56 select HAVE_FUNCTION_TRACER 54 select HAVE_FUNCTION_TRACER
57 select HAVE_FUNCTION_GRAPH_TRACER 55 select HAVE_FUNCTION_GRAPH_TRACER
58 select HAVE_FUNCTION_GRAPH_FP_TEST 56 select HAVE_FUNCTION_GRAPH_FP_TEST
diff --git a/arch/sparc/include/asm/switch_to_64.h b/arch/sparc/include/asm/switch_to_64.h
index c7de3323819c..8d284801f232 100644
--- a/arch/sparc/include/asm/switch_to_64.h
+++ b/arch/sparc/include/asm/switch_to_64.h
@@ -48,8 +48,8 @@ do { save_and_clear_fpu(); \
48 "wrpr %%g0, 14, %%pil\n\t" \ 48 "wrpr %%g0, 14, %%pil\n\t" \
49 "brz,pt %%o7, switch_to_pc\n\t" \ 49 "brz,pt %%o7, switch_to_pc\n\t" \
50 " mov %%g7, %0\n\t" \ 50 " mov %%g7, %0\n\t" \
51 "sethi %%hi(ret_from_syscall), %%g1\n\t" \ 51 "sethi %%hi(ret_from_fork), %%g1\n\t" \
52 "jmpl %%g1 + %%lo(ret_from_syscall), %%g0\n\t" \ 52 "jmpl %%g1 + %%lo(ret_from_fork), %%g0\n\t" \
53 " nop\n\t" \ 53 " nop\n\t" \
54 ".globl switch_to_pc\n\t" \ 54 ".globl switch_to_pc\n\t" \
55 "switch_to_pc:\n\t" \ 55 "switch_to_pc:\n\t" \
diff --git a/arch/sparc/kernel/cpumap.c b/arch/sparc/kernel/cpumap.c
index e4de74c2c9b0..cb5d272d658a 100644
--- a/arch/sparc/kernel/cpumap.c
+++ b/arch/sparc/kernel/cpumap.c
@@ -327,6 +327,7 @@ static int iterate_cpu(struct cpuinfo_tree *t, unsigned int root_index)
327 case SUN4V_CHIP_NIAGARA3: 327 case SUN4V_CHIP_NIAGARA3:
328 case SUN4V_CHIP_NIAGARA4: 328 case SUN4V_CHIP_NIAGARA4:
329 case SUN4V_CHIP_NIAGARA5: 329 case SUN4V_CHIP_NIAGARA5:
330 case SUN4V_CHIP_SPARC64X:
330 rover_inc_table = niagara_iterate_method; 331 rover_inc_table = niagara_iterate_method;
331 break; 332 break;
332 default: 333 default:
diff --git a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S
index e2a030045089..33c02b15f478 100644
--- a/arch/sparc/kernel/entry.S
+++ b/arch/sparc/kernel/entry.S
@@ -839,7 +839,7 @@ sys_sigreturn:
839 nop 839 nop
840 840
841 call syscall_trace 841 call syscall_trace
842 nop 842 mov 1, %o1
843 843
8441: 8441:
845 /* We don't want to muck with user registers like a 845 /* We don't want to muck with user registers like a
diff --git a/arch/sparc/kernel/kgdb_64.c b/arch/sparc/kernel/kgdb_64.c
index c8759550799f..53c0a82e6030 100644
--- a/arch/sparc/kernel/kgdb_64.c
+++ b/arch/sparc/kernel/kgdb_64.c
@@ -42,7 +42,7 @@ void sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, struct task_struct *p)
42{ 42{
43 struct thread_info *t = task_thread_info(p); 43 struct thread_info *t = task_thread_info(p);
44 extern unsigned int switch_to_pc; 44 extern unsigned int switch_to_pc;
45 extern unsigned int ret_from_syscall; 45 extern unsigned int ret_from_fork;
46 struct reg_window *win; 46 struct reg_window *win;
47 unsigned long pc, cwp; 47 unsigned long pc, cwp;
48 int i; 48 int i;
@@ -66,7 +66,7 @@ void sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, struct task_struct *p)
66 gdb_regs[i] = 0; 66 gdb_regs[i] = 0;
67 67
68 if (t->new_child) 68 if (t->new_child)
69 pc = (unsigned long) &ret_from_syscall; 69 pc = (unsigned long) &ret_from_fork;
70 else 70 else
71 pc = (unsigned long) &switch_to_pc; 71 pc = (unsigned long) &switch_to_pc;
72 72
diff --git a/arch/sparc/kernel/ktlb.S b/arch/sparc/kernel/ktlb.S
index 0746e5e32b37..fde5a419cf27 100644
--- a/arch/sparc/kernel/ktlb.S
+++ b/arch/sparc/kernel/ktlb.S
@@ -25,11 +25,10 @@ kvmap_itlb:
25 */ 25 */
26kvmap_itlb_4v: 26kvmap_itlb_4v:
27 27
28kvmap_itlb_nonlinear:
29 /* Catch kernel NULL pointer calls. */ 28 /* Catch kernel NULL pointer calls. */
30 sethi %hi(PAGE_SIZE), %g5 29 sethi %hi(PAGE_SIZE), %g5
31 cmp %g4, %g5 30 cmp %g4, %g5
32 bleu,pn %xcc, kvmap_dtlb_longpath 31 blu,pn %xcc, kvmap_itlb_longpath
33 nop 32 nop
34 33
35 KERN_TSB_LOOKUP_TL1(%g4, %g6, %g5, %g1, %g2, %g3, kvmap_itlb_load) 34 KERN_TSB_LOOKUP_TL1(%g4, %g6, %g5, %g1, %g2, %g3, kvmap_itlb_load)
diff --git a/arch/sparc/kernel/ptrace_64.c b/arch/sparc/kernel/ptrace_64.c
index 7ff45e4ba681..773c1f2983ce 100644
--- a/arch/sparc/kernel/ptrace_64.c
+++ b/arch/sparc/kernel/ptrace_64.c
@@ -14,6 +14,7 @@
14#include <linux/sched.h> 14#include <linux/sched.h>
15#include <linux/mm.h> 15#include <linux/mm.h>
16#include <linux/errno.h> 16#include <linux/errno.h>
17#include <linux/export.h>
17#include <linux/ptrace.h> 18#include <linux/ptrace.h>
18#include <linux/user.h> 19#include <linux/user.h>
19#include <linux/smp.h> 20#include <linux/smp.h>
@@ -116,6 +117,7 @@ void flush_ptrace_access(struct vm_area_struct *vma, struct page *page,
116 117
117 preempt_enable(); 118 preempt_enable();
118} 119}
120EXPORT_SYMBOL_GPL(flush_ptrace_access);
119 121
120static int get_from_target(struct task_struct *target, unsigned long uaddr, 122static int get_from_target(struct task_struct *target, unsigned long uaddr,
121 void *kbuf, int len) 123 void *kbuf, int len)
@@ -1087,7 +1089,7 @@ asmlinkage void syscall_trace_leave(struct pt_regs *regs)
1087 audit_syscall_exit(regs); 1089 audit_syscall_exit(regs);
1088 1090
1089 if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT))) 1091 if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
1090 trace_sys_exit(regs, regs->u_regs[UREG_G1]); 1092 trace_sys_exit(regs, regs->u_regs[UREG_I0]);
1091 1093
1092 if (test_thread_flag(TIF_SYSCALL_TRACE)) 1094 if (test_thread_flag(TIF_SYSCALL_TRACE))
1093 tracehook_report_syscall_exit(regs, 0); 1095 tracehook_report_syscall_exit(regs, 0);
diff --git a/arch/sparc/kernel/setup_64.c b/arch/sparc/kernel/setup_64.c
index 13785547e435..3fdb455e3318 100644
--- a/arch/sparc/kernel/setup_64.c
+++ b/arch/sparc/kernel/setup_64.c
@@ -499,12 +499,14 @@ static void __init init_sparc64_elf_hwcap(void)
499 sun4v_chip_type == SUN4V_CHIP_NIAGARA2 || 499 sun4v_chip_type == SUN4V_CHIP_NIAGARA2 ||
500 sun4v_chip_type == SUN4V_CHIP_NIAGARA3 || 500 sun4v_chip_type == SUN4V_CHIP_NIAGARA3 ||
501 sun4v_chip_type == SUN4V_CHIP_NIAGARA4 || 501 sun4v_chip_type == SUN4V_CHIP_NIAGARA4 ||
502 sun4v_chip_type == SUN4V_CHIP_NIAGARA5) 502 sun4v_chip_type == SUN4V_CHIP_NIAGARA5 ||
503 sun4v_chip_type == SUN4V_CHIP_SPARC64X)
503 cap |= HWCAP_SPARC_BLKINIT; 504 cap |= HWCAP_SPARC_BLKINIT;
504 if (sun4v_chip_type == SUN4V_CHIP_NIAGARA2 || 505 if (sun4v_chip_type == SUN4V_CHIP_NIAGARA2 ||
505 sun4v_chip_type == SUN4V_CHIP_NIAGARA3 || 506 sun4v_chip_type == SUN4V_CHIP_NIAGARA3 ||
506 sun4v_chip_type == SUN4V_CHIP_NIAGARA4 || 507 sun4v_chip_type == SUN4V_CHIP_NIAGARA4 ||
507 sun4v_chip_type == SUN4V_CHIP_NIAGARA5) 508 sun4v_chip_type == SUN4V_CHIP_NIAGARA5 ||
509 sun4v_chip_type == SUN4V_CHIP_SPARC64X)
508 cap |= HWCAP_SPARC_N2; 510 cap |= HWCAP_SPARC_N2;
509 } 511 }
510 512
@@ -530,13 +532,15 @@ static void __init init_sparc64_elf_hwcap(void)
530 if (sun4v_chip_type == SUN4V_CHIP_NIAGARA2 || 532 if (sun4v_chip_type == SUN4V_CHIP_NIAGARA2 ||
531 sun4v_chip_type == SUN4V_CHIP_NIAGARA3 || 533 sun4v_chip_type == SUN4V_CHIP_NIAGARA3 ||
532 sun4v_chip_type == SUN4V_CHIP_NIAGARA4 || 534 sun4v_chip_type == SUN4V_CHIP_NIAGARA4 ||
533 sun4v_chip_type == SUN4V_CHIP_NIAGARA5) 535 sun4v_chip_type == SUN4V_CHIP_NIAGARA5 ||
536 sun4v_chip_type == SUN4V_CHIP_SPARC64X)
534 cap |= (AV_SPARC_VIS | AV_SPARC_VIS2 | 537 cap |= (AV_SPARC_VIS | AV_SPARC_VIS2 |
535 AV_SPARC_ASI_BLK_INIT | 538 AV_SPARC_ASI_BLK_INIT |
536 AV_SPARC_POPC); 539 AV_SPARC_POPC);
537 if (sun4v_chip_type == SUN4V_CHIP_NIAGARA3 || 540 if (sun4v_chip_type == SUN4V_CHIP_NIAGARA3 ||
538 sun4v_chip_type == SUN4V_CHIP_NIAGARA4 || 541 sun4v_chip_type == SUN4V_CHIP_NIAGARA4 ||
539 sun4v_chip_type == SUN4V_CHIP_NIAGARA5) 542 sun4v_chip_type == SUN4V_CHIP_NIAGARA5 ||
543 sun4v_chip_type == SUN4V_CHIP_SPARC64X)
540 cap |= (AV_SPARC_VIS3 | AV_SPARC_HPC | 544 cap |= (AV_SPARC_VIS3 | AV_SPARC_HPC |
541 AV_SPARC_FMAF); 545 AV_SPARC_FMAF);
542 } 546 }
diff --git a/arch/sparc/kernel/sys_sparc32.c b/arch/sparc/kernel/sys_sparc32.c
index 3d0ddbc005fe..71368850dfc0 100644
--- a/arch/sparc/kernel/sys_sparc32.c
+++ b/arch/sparc/kernel/sys_sparc32.c
@@ -169,10 +169,10 @@ COMPAT_SYSCALL_DEFINE5(rt_sigaction, int, sig,
169 new_ka.ka_restorer = restorer; 169 new_ka.ka_restorer = restorer;
170 ret = get_user(u_handler, &act->sa_handler); 170 ret = get_user(u_handler, &act->sa_handler);
171 new_ka.sa.sa_handler = compat_ptr(u_handler); 171 new_ka.sa.sa_handler = compat_ptr(u_handler);
172 ret |= __copy_from_user(&set32, &act->sa_mask, sizeof(compat_sigset_t)); 172 ret |= copy_from_user(&set32, &act->sa_mask, sizeof(compat_sigset_t));
173 sigset_from_compat(&new_ka.sa.sa_mask, &set32); 173 sigset_from_compat(&new_ka.sa.sa_mask, &set32);
174 ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags); 174 ret |= get_user(new_ka.sa.sa_flags, &act->sa_flags);
175 ret |= __get_user(u_restorer, &act->sa_restorer); 175 ret |= get_user(u_restorer, &act->sa_restorer);
176 new_ka.sa.sa_restorer = compat_ptr(u_restorer); 176 new_ka.sa.sa_restorer = compat_ptr(u_restorer);
177 if (ret) 177 if (ret)
178 return -EFAULT; 178 return -EFAULT;
@@ -183,9 +183,9 @@ COMPAT_SYSCALL_DEFINE5(rt_sigaction, int, sig,
183 if (!ret && oact) { 183 if (!ret && oact) {
184 sigset_to_compat(&set32, &old_ka.sa.sa_mask); 184 sigset_to_compat(&set32, &old_ka.sa.sa_mask);
185 ret = put_user(ptr_to_compat(old_ka.sa.sa_handler), &oact->sa_handler); 185 ret = put_user(ptr_to_compat(old_ka.sa.sa_handler), &oact->sa_handler);
186 ret |= __copy_to_user(&oact->sa_mask, &set32, sizeof(compat_sigset_t)); 186 ret |= copy_to_user(&oact->sa_mask, &set32, sizeof(compat_sigset_t));
187 ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags); 187 ret |= put_user(old_ka.sa.sa_flags, &oact->sa_flags);
188 ret |= __put_user(ptr_to_compat(old_ka.sa.sa_restorer), &oact->sa_restorer); 188 ret |= put_user(ptr_to_compat(old_ka.sa.sa_restorer), &oact->sa_restorer);
189 if (ret) 189 if (ret)
190 ret = -EFAULT; 190 ret = -EFAULT;
191 } 191 }
diff --git a/arch/sparc/kernel/syscalls.S b/arch/sparc/kernel/syscalls.S
index 22a1098961f5..d950197a17e1 100644
--- a/arch/sparc/kernel/syscalls.S
+++ b/arch/sparc/kernel/syscalls.S
@@ -98,8 +98,8 @@ sys_clone:
98 ba,pt %xcc, sparc_do_fork 98 ba,pt %xcc, sparc_do_fork
99 add %sp, PTREGS_OFF, %o2 99 add %sp, PTREGS_OFF, %o2
100 100
101 .globl ret_from_syscall 101 .globl ret_from_fork
102ret_from_syscall: 102ret_from_fork:
103 /* Clear current_thread_info()->new_child. */ 103 /* Clear current_thread_info()->new_child. */
104 stb %g0, [%g6 + TI_NEW_CHILD] 104 stb %g0, [%g6 + TI_NEW_CHILD]
105 call schedule_tail 105 call schedule_tail
@@ -152,7 +152,7 @@ linux_syscall_trace32:
152 srl %i4, 0, %o4 152 srl %i4, 0, %o4
153 srl %i1, 0, %o1 153 srl %i1, 0, %o1
154 srl %i2, 0, %o2 154 srl %i2, 0, %o2
155 ba,pt %xcc, 2f 155 ba,pt %xcc, 5f
156 srl %i3, 0, %o3 156 srl %i3, 0, %o3
157 157
158linux_syscall_trace: 158linux_syscall_trace:
@@ -182,13 +182,13 @@ linux_sparc_syscall32:
182 srl %i1, 0, %o1 ! IEU0 Group 182 srl %i1, 0, %o1 ! IEU0 Group
183 ldx [%g6 + TI_FLAGS], %l0 ! Load 183 ldx [%g6 + TI_FLAGS], %l0 ! Load
184 184
185 srl %i5, 0, %o5 ! IEU1 185 srl %i3, 0, %o3 ! IEU0
186 srl %i2, 0, %o2 ! IEU0 Group 186 srl %i2, 0, %o2 ! IEU0 Group
187 andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %g0 187 andcc %l0, (_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT|_TIF_SYSCALL_TRACEPOINT), %g0
188 bne,pn %icc, linux_syscall_trace32 ! CTI 188 bne,pn %icc, linux_syscall_trace32 ! CTI
189 mov %i0, %l5 ! IEU1 189 mov %i0, %l5 ! IEU1
190 call %l7 ! CTI Group brk forced 1905: call %l7 ! CTI Group brk forced
191 srl %i3, 0, %o3 ! IEU0 191 srl %i5, 0, %o5 ! IEU1
192 ba,a,pt %xcc, 3f 192 ba,a,pt %xcc, 3f
193 193
194 /* Linux native system calls enter here... */ 194 /* Linux native system calls enter here... */
diff --git a/arch/sparc/kernel/trampoline_64.S b/arch/sparc/kernel/trampoline_64.S
index e0b1e13a0736..ad4bde3bb61e 100644
--- a/arch/sparc/kernel/trampoline_64.S
+++ b/arch/sparc/kernel/trampoline_64.S
@@ -129,7 +129,6 @@ startup_continue:
129 clr %l5 129 clr %l5
130 sethi %hi(num_kernel_image_mappings), %l6 130 sethi %hi(num_kernel_image_mappings), %l6
131 lduw [%l6 + %lo(num_kernel_image_mappings)], %l6 131 lduw [%l6 + %lo(num_kernel_image_mappings)], %l6
132 add %l6, 1, %l6
133 132
134 mov 15, %l7 133 mov 15, %l7
135 BRANCH_IF_ANY_CHEETAH(g1,g5,2f) 134 BRANCH_IF_ANY_CHEETAH(g1,g5,2f)
@@ -222,7 +221,6 @@ niagara_lock_tlb:
222 clr %l5 221 clr %l5
223 sethi %hi(num_kernel_image_mappings), %l6 222 sethi %hi(num_kernel_image_mappings), %l6
224 lduw [%l6 + %lo(num_kernel_image_mappings)], %l6 223 lduw [%l6 + %lo(num_kernel_image_mappings)], %l6
225 add %l6, 1, %l6
226 224
2271: 2251:
228 mov HV_FAST_MMU_MAP_PERM_ADDR, %o5 226 mov HV_FAST_MMU_MAP_PERM_ADDR, %o5
diff --git a/arch/sparc/lib/ksyms.c b/arch/sparc/lib/ksyms.c
index 0c4e35e522fa..323335b9cd2b 100644
--- a/arch/sparc/lib/ksyms.c
+++ b/arch/sparc/lib/ksyms.c
@@ -98,15 +98,6 @@ EXPORT_SYMBOL(___copy_from_user);
98EXPORT_SYMBOL(___copy_in_user); 98EXPORT_SYMBOL(___copy_in_user);
99EXPORT_SYMBOL(__clear_user); 99EXPORT_SYMBOL(__clear_user);
100 100
101/* RW semaphores */
102EXPORT_SYMBOL(__down_read);
103EXPORT_SYMBOL(__down_read_trylock);
104EXPORT_SYMBOL(__down_write);
105EXPORT_SYMBOL(__down_write_trylock);
106EXPORT_SYMBOL(__up_read);
107EXPORT_SYMBOL(__up_write);
108EXPORT_SYMBOL(__downgrade_write);
109
110/* Atomic counter implementation. */ 101/* Atomic counter implementation. */
111EXPORT_SYMBOL(atomic_add); 102EXPORT_SYMBOL(atomic_add);
112EXPORT_SYMBOL(atomic_add_ret); 103EXPORT_SYMBOL(atomic_add_ret);
diff --git a/arch/sparc/mm/fault_32.c b/arch/sparc/mm/fault_32.c
index e98bfda205a2..59dbd4645725 100644
--- a/arch/sparc/mm/fault_32.c
+++ b/arch/sparc/mm/fault_32.c
@@ -177,8 +177,7 @@ asmlinkage void do_sparc_fault(struct pt_regs *regs, int text_fault, int write,
177 unsigned long g2; 177 unsigned long g2;
178 int from_user = !(regs->psr & PSR_PS); 178 int from_user = !(regs->psr & PSR_PS);
179 int fault, code; 179 int fault, code;
180 unsigned int flags = (FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE | 180 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
181 (write ? FAULT_FLAG_WRITE : 0));
182 181
183 if (text_fault) 182 if (text_fault)
184 address = regs->pc; 183 address = regs->pc;
@@ -235,6 +234,11 @@ good_area:
235 goto bad_area; 234 goto bad_area;
236 } 235 }
237 236
237 if (from_user)
238 flags |= FAULT_FLAG_USER;
239 if (write)
240 flags |= FAULT_FLAG_WRITE;
241
238 /* 242 /*
239 * If for any reason at all we couldn't handle the fault, 243 * If for any reason at all we couldn't handle the fault,
240 * make sure we exit gracefully rather than endlessly redo 244 * make sure we exit gracefully rather than endlessly redo
@@ -383,6 +387,7 @@ static void force_user_fault(unsigned long address, int write)
383 struct vm_area_struct *vma; 387 struct vm_area_struct *vma;
384 struct task_struct *tsk = current; 388 struct task_struct *tsk = current;
385 struct mm_struct *mm = tsk->mm; 389 struct mm_struct *mm = tsk->mm;
390 unsigned int flags = FAULT_FLAG_USER;
386 int code; 391 int code;
387 392
388 code = SEGV_MAPERR; 393 code = SEGV_MAPERR;
@@ -402,11 +407,12 @@ good_area:
402 if (write) { 407 if (write) {
403 if (!(vma->vm_flags & VM_WRITE)) 408 if (!(vma->vm_flags & VM_WRITE))
404 goto bad_area; 409 goto bad_area;
410 flags |= FAULT_FLAG_WRITE;
405 } else { 411 } else {
406 if (!(vma->vm_flags & (VM_READ | VM_EXEC))) 412 if (!(vma->vm_flags & (VM_READ | VM_EXEC)))
407 goto bad_area; 413 goto bad_area;
408 } 414 }
409 switch (handle_mm_fault(mm, vma, address, write ? FAULT_FLAG_WRITE : 0)) { 415 switch (handle_mm_fault(mm, vma, address, flags)) {
410 case VM_FAULT_SIGBUS: 416 case VM_FAULT_SIGBUS:
411 case VM_FAULT_OOM: 417 case VM_FAULT_OOM:
412 goto do_sigbus; 418 goto do_sigbus;
diff --git a/arch/sparc/mm/fault_64.c b/arch/sparc/mm/fault_64.c
index 5062ff389e83..2ebec263d685 100644
--- a/arch/sparc/mm/fault_64.c
+++ b/arch/sparc/mm/fault_64.c
@@ -315,7 +315,8 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs)
315 bad_kernel_pc(regs, address); 315 bad_kernel_pc(regs, address);
316 return; 316 return;
317 } 317 }
318 } 318 } else
319 flags |= FAULT_FLAG_USER;
319 320
320 /* 321 /*
321 * If we're in an interrupt or have no user 322 * If we're in an interrupt or have no user
@@ -418,13 +419,14 @@ good_area:
418 vma->vm_file != NULL) 419 vma->vm_file != NULL)
419 set_thread_fault_code(fault_code | 420 set_thread_fault_code(fault_code |
420 FAULT_CODE_BLKCOMMIT); 421 FAULT_CODE_BLKCOMMIT);
422
423 flags |= FAULT_FLAG_WRITE;
421 } else { 424 } else {
422 /* Allow reads even for write-only mappings */ 425 /* Allow reads even for write-only mappings */
423 if (!(vma->vm_flags & (VM_READ | VM_EXEC))) 426 if (!(vma->vm_flags & (VM_READ | VM_EXEC)))
424 goto bad_area; 427 goto bad_area;
425 } 428 }
426 429
427 flags |= ((fault_code & FAULT_CODE_WRITE) ? FAULT_FLAG_WRITE : 0);
428 fault = handle_mm_fault(mm, vma, address, flags); 430 fault = handle_mm_fault(mm, vma, address, flags);
429 431
430 if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) 432 if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current))
diff --git a/arch/sparc/mm/hugetlbpage.c b/arch/sparc/mm/hugetlbpage.c
index d2b59441ebdd..96399646570a 100644
--- a/arch/sparc/mm/hugetlbpage.c
+++ b/arch/sparc/mm/hugetlbpage.c
@@ -234,6 +234,11 @@ int pud_huge(pud_t pud)
234 return 0; 234 return 0;
235} 235}
236 236
237int pmd_huge_support(void)
238{
239 return 0;
240}
241
237struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address, 242struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address,
238 pmd_t *pmd, int write) 243 pmd_t *pmd, int write)
239{ 244{
diff --git a/arch/tile/Kconfig b/arch/tile/Kconfig
index 24565a7ffe6d..d45a2c48f185 100644
--- a/arch/tile/Kconfig
+++ b/arch/tile/Kconfig
@@ -11,7 +11,6 @@ config TILE
11 select USE_GENERIC_SMP_HELPERS 11 select USE_GENERIC_SMP_HELPERS
12 select CC_OPTIMIZE_FOR_SIZE 12 select CC_OPTIMIZE_FOR_SIZE
13 select HAVE_DEBUG_KMEMLEAK 13 select HAVE_DEBUG_KMEMLEAK
14 select HAVE_GENERIC_HARDIRQS
15 select GENERIC_IRQ_PROBE 14 select GENERIC_IRQ_PROBE
16 select GENERIC_PENDING_IRQ if SMP 15 select GENERIC_PENDING_IRQ if SMP
17 select GENERIC_IRQ_SHOW 16 select GENERIC_IRQ_SHOW
@@ -26,6 +25,7 @@ config TILE
26 select HAVE_SYSCALL_TRACEPOINTS 25 select HAVE_SYSCALL_TRACEPOINTS
27 select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE 26 select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
28 select HAVE_DEBUG_STACKOVERFLOW 27 select HAVE_DEBUG_STACKOVERFLOW
28 select ARCH_WANT_FRAME_POINTERS
29 29
30# FIXME: investigate whether we need/want these options. 30# FIXME: investigate whether we need/want these options.
31# select HAVE_IOREMAP_PROT 31# select HAVE_IOREMAP_PROT
@@ -64,6 +64,9 @@ config HUGETLB_SUPER_PAGES
64 depends on HUGETLB_PAGE && TILEGX 64 depends on HUGETLB_PAGE && TILEGX
65 def_bool y 65 def_bool y
66 66
67config GENERIC_TIME_VSYSCALL
68 def_bool y
69
67# FIXME: tilegx can implement a more efficient rwsem. 70# FIXME: tilegx can implement a more efficient rwsem.
68config RWSEM_GENERIC_SPINLOCK 71config RWSEM_GENERIC_SPINLOCK
69 def_bool y 72 def_bool y
@@ -112,10 +115,19 @@ config SMP
112config HVC_TILE 115config HVC_TILE
113 depends on TTY 116 depends on TTY
114 select HVC_DRIVER 117 select HVC_DRIVER
118 select HVC_IRQ if TILEGX
115 def_bool y 119 def_bool y
116 120
117config TILEGX 121config TILEGX
118 bool "Building with TILE-Gx (64-bit) compiler and toolchain" 122 bool "Building for TILE-Gx (64-bit) processor"
123 select HAVE_FUNCTION_TRACER
124 select HAVE_FUNCTION_TRACE_MCOUNT_TEST
125 select HAVE_FUNCTION_GRAPH_TRACER
126 select HAVE_DYNAMIC_FTRACE
127 select HAVE_FTRACE_MCOUNT_RECORD
128 select HAVE_KPROBES
129 select HAVE_KRETPROBES
130 select HAVE_ARCH_KGDB
119 131
120config TILEPRO 132config TILEPRO
121 def_bool !TILEGX 133 def_bool !TILEGX
@@ -194,7 +206,7 @@ config SYSVIPC_COMPAT
194 def_bool y 206 def_bool y
195 depends on COMPAT && SYSVIPC 207 depends on COMPAT && SYSVIPC
196 208
197# We do not currently support disabling HIGHMEM on tile64 and tilepro. 209# We do not currently support disabling HIGHMEM on tilepro.
198config HIGHMEM 210config HIGHMEM
199 bool # "Support for more than 512 MB of RAM" 211 bool # "Support for more than 512 MB of RAM"
200 default !TILEGX 212 default !TILEGX
@@ -300,6 +312,8 @@ config PAGE_OFFSET
300 312
301source "mm/Kconfig" 313source "mm/Kconfig"
302 314
315source "kernel/Kconfig.preempt"
316
303config CMDLINE_BOOL 317config CMDLINE_BOOL
304 bool "Built-in kernel command line" 318 bool "Built-in kernel command line"
305 default n 319 default n
@@ -347,7 +361,7 @@ config CMDLINE_OVERRIDE
347 361
348config VMALLOC_RESERVE 362config VMALLOC_RESERVE
349 hex 363 hex
350 default 0x1000000 364 default 0x2000000
351 365
352config HARDWALL 366config HARDWALL
353 bool "Hardwall support to allow access to user dynamic network" 367 bool "Hardwall support to allow access to user dynamic network"
@@ -380,7 +394,6 @@ config PCI
380 select PCI_DOMAINS 394 select PCI_DOMAINS
381 select GENERIC_PCI_IOMAP 395 select GENERIC_PCI_IOMAP
382 select TILE_GXIO_TRIO if TILEGX 396 select TILE_GXIO_TRIO if TILEGX
383 select ARCH_SUPPORTS_MSI if TILEGX
384 select PCI_MSI if TILEGX 397 select PCI_MSI if TILEGX
385 ---help--- 398 ---help---
386 Enable PCI root complex support, so PCIe endpoint devices can 399 Enable PCI root complex support, so PCIe endpoint devices can
@@ -396,8 +409,20 @@ config NO_IOMEM
396config NO_IOPORT 409config NO_IOPORT
397 def_bool !PCI 410 def_bool !PCI
398 411
412config TILE_PCI_IO
413 bool "PCI I/O space support"
414 default n
415 depends on PCI
416 depends on TILEGX
417 ---help---
418 Enable PCI I/O space support on TILEGx. Since the PCI I/O space
419 is used by few modern PCIe endpoint devices, its support is disabled
420 by default to save the TRIO PIO Region resource for other purposes.
421
399source "drivers/pci/Kconfig" 422source "drivers/pci/Kconfig"
400 423
424source "drivers/pci/pcie/Kconfig"
425
401config TILE_USB 426config TILE_USB
402 tristate "Tilera USB host adapter support" 427 tristate "Tilera USB host adapter support"
403 default y 428 default y
diff --git a/arch/tile/Kconfig.debug b/arch/tile/Kconfig.debug
index 9165ea979e85..19734d3ab1e8 100644
--- a/arch/tile/Kconfig.debug
+++ b/arch/tile/Kconfig.debug
@@ -14,14 +14,12 @@ config EARLY_PRINTK
14 with klogd/syslogd. You should normally N here, 14 with klogd/syslogd. You should normally N here,
15 unless you want to debug such a crash. 15 unless you want to debug such a crash.
16 16
17config DEBUG_EXTRA_FLAGS 17config TILE_HVGLUE_TRACE
18 string "Additional compiler arguments when building with '-g'" 18 bool "Provide wrapper functions for hypervisor ABI calls"
19 depends on DEBUG_INFO 19 default n
20 default ""
21 help 20 help
22 Debug info can be large, and flags like 21 Provide wrapper functions for the hypervisor ABI calls
23 `-femit-struct-debug-baseonly' can reduce the kernel file 22 defined in arch/tile/kernel/hvglue.S. This allows tracing
24 size and build time noticeably. Such flags are often 23 mechanisms, etc., to have visibility into those calls.
25 helpful if the main use of debug info is line number info.
26 24
27endmenu 25endmenu
diff --git a/arch/tile/Makefile b/arch/tile/Makefile
index 3d15364c6071..4dc380a519d4 100644
--- a/arch/tile/Makefile
+++ b/arch/tile/Makefile
@@ -30,10 +30,6 @@ endif
30# In kernel modules, this causes load failures due to unsupported relocations. 30# In kernel modules, this causes load failures due to unsupported relocations.
31KBUILD_CFLAGS += -fno-asynchronous-unwind-tables 31KBUILD_CFLAGS += -fno-asynchronous-unwind-tables
32 32
33ifneq ($(CONFIG_DEBUG_EXTRA_FLAGS),"")
34KBUILD_CFLAGS += $(CONFIG_DEBUG_EXTRA_FLAGS)
35endif
36
37LIBGCC_PATH := \ 33LIBGCC_PATH := \
38 $(shell $(CC) $(KBUILD_CFLAGS) $(KCFLAGS) -print-libgcc-file-name) 34 $(shell $(CC) $(KBUILD_CFLAGS) $(KCFLAGS) -print-libgcc-file-name)
39 35
diff --git a/arch/tile/configs/tilegx_defconfig b/arch/tile/configs/tilegx_defconfig
index 47684815e5c8..730e40d9cf62 100644
--- a/arch/tile/configs/tilegx_defconfig
+++ b/arch/tile/configs/tilegx_defconfig
@@ -1,16 +1,15 @@
1CONFIG_TILEGX=y 1CONFIG_TILEGX=y
2CONFIG_EXPERIMENTAL=y
3# CONFIG_LOCALVERSION_AUTO is not set
4CONFIG_SYSVIPC=y 2CONFIG_SYSVIPC=y
5CONFIG_POSIX_MQUEUE=y 3CONFIG_POSIX_MQUEUE=y
4CONFIG_FHANDLE=y
5CONFIG_AUDIT=y
6CONFIG_NO_HZ=y
6CONFIG_BSD_PROCESS_ACCT=y 7CONFIG_BSD_PROCESS_ACCT=y
7CONFIG_BSD_PROCESS_ACCT_V3=y 8CONFIG_BSD_PROCESS_ACCT_V3=y
8CONFIG_FHANDLE=y
9CONFIG_TASKSTATS=y 9CONFIG_TASKSTATS=y
10CONFIG_TASK_DELAY_ACCT=y 10CONFIG_TASK_DELAY_ACCT=y
11CONFIG_TASK_XACCT=y 11CONFIG_TASK_XACCT=y
12CONFIG_TASK_IO_ACCOUNTING=y 12CONFIG_TASK_IO_ACCOUNTING=y
13CONFIG_AUDIT=y
14CONFIG_LOG_BUF_SHIFT=19 13CONFIG_LOG_BUF_SHIFT=19
15CONFIG_CGROUPS=y 14CONFIG_CGROUPS=y
16CONFIG_CGROUP_DEBUG=y 15CONFIG_CGROUP_DEBUG=y
@@ -18,18 +17,18 @@ CONFIG_CGROUP_DEVICE=y
18CONFIG_CPUSETS=y 17CONFIG_CPUSETS=y
19CONFIG_CGROUP_CPUACCT=y 18CONFIG_CGROUP_CPUACCT=y
20CONFIG_RESOURCE_COUNTERS=y 19CONFIG_RESOURCE_COUNTERS=y
21CONFIG_CGROUP_MEMCG=y
22CONFIG_CGROUP_MEMCG_SWAP=y
23CONFIG_CGROUP_SCHED=y 20CONFIG_CGROUP_SCHED=y
24CONFIG_RT_GROUP_SCHED=y 21CONFIG_RT_GROUP_SCHED=y
25CONFIG_BLK_CGROUP=y 22CONFIG_BLK_CGROUP=y
26CONFIG_NAMESPACES=y 23CONFIG_NAMESPACES=y
27CONFIG_RELAY=y 24CONFIG_RELAY=y
28CONFIG_BLK_DEV_INITRD=y 25CONFIG_BLK_DEV_INITRD=y
26CONFIG_RD_XZ=y
29CONFIG_SYSCTL_SYSCALL=y 27CONFIG_SYSCTL_SYSCALL=y
30CONFIG_EMBEDDED=y 28CONFIG_EMBEDDED=y
31# CONFIG_COMPAT_BRK is not set 29# CONFIG_COMPAT_BRK is not set
32CONFIG_PROFILING=y 30CONFIG_PROFILING=y
31CONFIG_KPROBES=y
33CONFIG_MODULES=y 32CONFIG_MODULES=y
34CONFIG_MODULE_FORCE_LOAD=y 33CONFIG_MODULE_FORCE_LOAD=y
35CONFIG_MODULE_UNLOAD=y 34CONFIG_MODULE_UNLOAD=y
@@ -45,12 +44,12 @@ CONFIG_UNIXWARE_DISKLABEL=y
45CONFIG_SGI_PARTITION=y 44CONFIG_SGI_PARTITION=y
46CONFIG_SUN_PARTITION=y 45CONFIG_SUN_PARTITION=y
47CONFIG_KARMA_PARTITION=y 46CONFIG_KARMA_PARTITION=y
48CONFIG_EFI_PARTITION=y
49CONFIG_CFQ_GROUP_IOSCHED=y 47CONFIG_CFQ_GROUP_IOSCHED=y
50CONFIG_NR_CPUS=100 48CONFIG_NR_CPUS=100
51CONFIG_NO_HZ=y
52CONFIG_HIGH_RES_TIMERS=y
53CONFIG_HZ_100=y 49CONFIG_HZ_100=y
50# CONFIG_COMPACTION is not set
51CONFIG_PREEMPT_VOLUNTARY=y
52CONFIG_TILE_PCI_IO=y
54CONFIG_PCI_DEBUG=y 53CONFIG_PCI_DEBUG=y
55# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set 54# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
56CONFIG_BINFMT_MISC=y 55CONFIG_BINFMT_MISC=y
@@ -108,150 +107,9 @@ CONFIG_IPV6_MULTIPLE_TABLES=y
108CONFIG_IPV6_MROUTE=y 107CONFIG_IPV6_MROUTE=y
109CONFIG_IPV6_PIMSM_V2=y 108CONFIG_IPV6_PIMSM_V2=y
110CONFIG_NETLABEL=y 109CONFIG_NETLABEL=y
111CONFIG_NETFILTER=y
112CONFIG_NF_CONNTRACK=m
113CONFIG_NF_CONNTRACK_SECMARK=y
114CONFIG_NF_CONNTRACK_ZONES=y
115CONFIG_NF_CONNTRACK_EVENTS=y
116CONFIG_NF_CT_PROTO_DCCP=m
117CONFIG_NF_CT_PROTO_UDPLITE=m
118CONFIG_NF_CONNTRACK_AMANDA=m
119CONFIG_NF_CONNTRACK_FTP=m
120CONFIG_NF_CONNTRACK_H323=m
121CONFIG_NF_CONNTRACK_IRC=m
122CONFIG_NF_CONNTRACK_NETBIOS_NS=m
123CONFIG_NF_CONNTRACK_PPTP=m
124CONFIG_NF_CONNTRACK_SANE=m
125CONFIG_NF_CONNTRACK_SIP=m
126CONFIG_NF_CONNTRACK_TFTP=m
127CONFIG_NETFILTER_TPROXY=m
128CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
129CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
130CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m
131CONFIG_NETFILTER_XT_TARGET_CT=m
132CONFIG_NETFILTER_XT_TARGET_DSCP=m
133CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m
134CONFIG_NETFILTER_XT_TARGET_MARK=m
135CONFIG_NETFILTER_XT_TARGET_NFLOG=m
136CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
137CONFIG_NETFILTER_XT_TARGET_TEE=m
138CONFIG_NETFILTER_XT_TARGET_TPROXY=m
139CONFIG_NETFILTER_XT_TARGET_TRACE=m
140CONFIG_NETFILTER_XT_TARGET_SECMARK=m
141CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
142CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m
143CONFIG_NETFILTER_XT_MATCH_CLUSTER=m
144CONFIG_NETFILTER_XT_MATCH_COMMENT=m
145CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
146CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m
147CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
148CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
149CONFIG_NETFILTER_XT_MATCH_DCCP=m
150CONFIG_NETFILTER_XT_MATCH_DSCP=m
151CONFIG_NETFILTER_XT_MATCH_ESP=m
152CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
153CONFIG_NETFILTER_XT_MATCH_HELPER=m
154CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
155CONFIG_NETFILTER_XT_MATCH_IPVS=m
156CONFIG_NETFILTER_XT_MATCH_LENGTH=m
157CONFIG_NETFILTER_XT_MATCH_LIMIT=m
158CONFIG_NETFILTER_XT_MATCH_MAC=m
159CONFIG_NETFILTER_XT_MATCH_MARK=m
160CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
161CONFIG_NETFILTER_XT_MATCH_OSF=m
162CONFIG_NETFILTER_XT_MATCH_OWNER=m
163CONFIG_NETFILTER_XT_MATCH_POLICY=m
164CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
165CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
166CONFIG_NETFILTER_XT_MATCH_QUOTA=m
167CONFIG_NETFILTER_XT_MATCH_RATEEST=m
168CONFIG_NETFILTER_XT_MATCH_REALM=m
169CONFIG_NETFILTER_XT_MATCH_RECENT=m
170CONFIG_NETFILTER_XT_MATCH_SOCKET=m
171CONFIG_NETFILTER_XT_MATCH_STATE=m
172CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
173CONFIG_NETFILTER_XT_MATCH_STRING=m
174CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
175CONFIG_NETFILTER_XT_MATCH_TIME=m
176CONFIG_NETFILTER_XT_MATCH_U32=m
177CONFIG_IP_VS=m
178CONFIG_IP_VS_IPV6=y
179CONFIG_IP_VS_PROTO_TCP=y
180CONFIG_IP_VS_PROTO_UDP=y
181CONFIG_IP_VS_PROTO_ESP=y
182CONFIG_IP_VS_PROTO_AH=y
183CONFIG_IP_VS_PROTO_SCTP=y
184CONFIG_IP_VS_RR=m
185CONFIG_IP_VS_WRR=m
186CONFIG_IP_VS_LC=m
187CONFIG_IP_VS_WLC=m
188CONFIG_IP_VS_LBLC=m
189CONFIG_IP_VS_LBLCR=m
190CONFIG_IP_VS_SED=m
191CONFIG_IP_VS_NQ=m
192CONFIG_NF_CONNTRACK_IPV4=m
193# CONFIG_NF_CONNTRACK_PROC_COMPAT is not set
194CONFIG_IP_NF_QUEUE=m
195CONFIG_IP_NF_IPTABLES=y
196CONFIG_IP_NF_MATCH_AH=m
197CONFIG_IP_NF_MATCH_ECN=m
198CONFIG_IP_NF_MATCH_TTL=m
199CONFIG_IP_NF_FILTER=y
200CONFIG_IP_NF_TARGET_REJECT=y
201CONFIG_IP_NF_TARGET_LOG=m
202CONFIG_IP_NF_TARGET_ULOG=m
203CONFIG_IP_NF_MANGLE=m
204CONFIG_IP_NF_TARGET_ECN=m
205CONFIG_IP_NF_TARGET_TTL=m
206CONFIG_IP_NF_RAW=m
207CONFIG_IP_NF_SECURITY=m
208CONFIG_IP_NF_ARPTABLES=m
209CONFIG_IP_NF_ARPFILTER=m
210CONFIG_IP_NF_ARP_MANGLE=m
211CONFIG_NF_CONNTRACK_IPV6=m
212CONFIG_IP6_NF_QUEUE=m
213CONFIG_IP6_NF_IPTABLES=m
214CONFIG_IP6_NF_MATCH_AH=m
215CONFIG_IP6_NF_MATCH_EUI64=m
216CONFIG_IP6_NF_MATCH_FRAG=m
217CONFIG_IP6_NF_MATCH_OPTS=m
218CONFIG_IP6_NF_MATCH_HL=m
219CONFIG_IP6_NF_MATCH_IPV6HEADER=m
220CONFIG_IP6_NF_MATCH_MH=m
221CONFIG_IP6_NF_MATCH_RT=m
222CONFIG_IP6_NF_TARGET_HL=m
223CONFIG_IP6_NF_TARGET_LOG=m
224CONFIG_IP6_NF_FILTER=m
225CONFIG_IP6_NF_TARGET_REJECT=m
226CONFIG_IP6_NF_MANGLE=m
227CONFIG_IP6_NF_RAW=m
228CONFIG_IP6_NF_SECURITY=m
229CONFIG_BRIDGE_NF_EBTABLES=m
230CONFIG_BRIDGE_EBT_BROUTE=m
231CONFIG_BRIDGE_EBT_T_FILTER=m
232CONFIG_BRIDGE_EBT_T_NAT=m
233CONFIG_BRIDGE_EBT_802_3=m
234CONFIG_BRIDGE_EBT_AMONG=m
235CONFIG_BRIDGE_EBT_ARP=m
236CONFIG_BRIDGE_EBT_IP=m
237CONFIG_BRIDGE_EBT_IP6=m
238CONFIG_BRIDGE_EBT_LIMIT=m
239CONFIG_BRIDGE_EBT_MARK=m
240CONFIG_BRIDGE_EBT_PKTTYPE=m
241CONFIG_BRIDGE_EBT_STP=m
242CONFIG_BRIDGE_EBT_VLAN=m
243CONFIG_BRIDGE_EBT_ARPREPLY=m
244CONFIG_BRIDGE_EBT_DNAT=m
245CONFIG_BRIDGE_EBT_MARK_T=m
246CONFIG_BRIDGE_EBT_REDIRECT=m
247CONFIG_BRIDGE_EBT_SNAT=m
248CONFIG_BRIDGE_EBT_LOG=m
249CONFIG_BRIDGE_EBT_ULOG=m
250CONFIG_BRIDGE_EBT_NFLOG=m
251CONFIG_RDS=m 110CONFIG_RDS=m
252CONFIG_RDS_TCP=m 111CONFIG_RDS_TCP=m
253CONFIG_BRIDGE=m 112CONFIG_BRIDGE=m
254CONFIG_NET_DSA=y
255CONFIG_VLAN_8021Q=m 113CONFIG_VLAN_8021Q=m
256CONFIG_VLAN_8021Q_GVRP=y 114CONFIG_VLAN_8021Q_GVRP=y
257CONFIG_PHONET=m 115CONFIG_PHONET=m
@@ -292,13 +150,13 @@ CONFIG_NET_ACT_POLICE=m
292CONFIG_NET_ACT_GACT=m 150CONFIG_NET_ACT_GACT=m
293CONFIG_GACT_PROB=y 151CONFIG_GACT_PROB=y
294CONFIG_NET_ACT_MIRRED=m 152CONFIG_NET_ACT_MIRRED=m
295CONFIG_NET_ACT_IPT=m
296CONFIG_NET_ACT_NAT=m 153CONFIG_NET_ACT_NAT=m
297CONFIG_NET_ACT_PEDIT=m 154CONFIG_NET_ACT_PEDIT=m
298CONFIG_NET_ACT_SIMP=m 155CONFIG_NET_ACT_SIMP=m
299CONFIG_NET_ACT_SKBEDIT=m 156CONFIG_NET_ACT_SKBEDIT=m
300CONFIG_NET_CLS_IND=y 157CONFIG_NET_CLS_IND=y
301CONFIG_DCB=y 158CONFIG_DCB=y
159CONFIG_DNS_RESOLVER=y
302# CONFIG_WIRELESS is not set 160# CONFIG_WIRELESS is not set
303CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" 161CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
304CONFIG_DEVTMPFS=y 162CONFIG_DEVTMPFS=y
@@ -317,10 +175,12 @@ CONFIG_BLK_DEV_SD=y
317CONFIG_SCSI_CONSTANTS=y 175CONFIG_SCSI_CONSTANTS=y
318CONFIG_SCSI_LOGGING=y 176CONFIG_SCSI_LOGGING=y
319CONFIG_SCSI_SAS_ATA=y 177CONFIG_SCSI_SAS_ATA=y
178CONFIG_ISCSI_TCP=m
320CONFIG_SCSI_MVSAS=y 179CONFIG_SCSI_MVSAS=y
321# CONFIG_SCSI_MVSAS_DEBUG is not set 180# CONFIG_SCSI_MVSAS_DEBUG is not set
322CONFIG_SCSI_MVSAS_TASKLET=y 181CONFIG_SCSI_MVSAS_TASKLET=y
323CONFIG_ATA=y 182CONFIG_ATA=y
183CONFIG_SATA_AHCI=y
324CONFIG_SATA_SIL24=y 184CONFIG_SATA_SIL24=y
325# CONFIG_ATA_SFF is not set 185# CONFIG_ATA_SFF is not set
326CONFIG_MD=y 186CONFIG_MD=y
@@ -343,6 +203,12 @@ CONFIG_DM_MULTIPATH_QL=m
343CONFIG_DM_MULTIPATH_ST=m 203CONFIG_DM_MULTIPATH_ST=m
344CONFIG_DM_DELAY=m 204CONFIG_DM_DELAY=m
345CONFIG_DM_UEVENT=y 205CONFIG_DM_UEVENT=y
206CONFIG_TARGET_CORE=m
207CONFIG_TCM_IBLOCK=m
208CONFIG_TCM_FILEIO=m
209CONFIG_TCM_PSCSI=m
210CONFIG_LOOPBACK_TARGET=m
211CONFIG_ISCSI_TARGET=m
346CONFIG_FUSION=y 212CONFIG_FUSION=y
347CONFIG_FUSION_SAS=y 213CONFIG_FUSION_SAS=y
348CONFIG_NETDEVICES=y 214CONFIG_NETDEVICES=y
@@ -359,42 +225,8 @@ CONFIG_VETH=m
359CONFIG_NET_DSA_MV88E6060=y 225CONFIG_NET_DSA_MV88E6060=y
360CONFIG_NET_DSA_MV88E6131=y 226CONFIG_NET_DSA_MV88E6131=y
361CONFIG_NET_DSA_MV88E6123_61_65=y 227CONFIG_NET_DSA_MV88E6123_61_65=y
362# CONFIG_NET_VENDOR_3COM is not set 228CONFIG_SKY2=y
363# CONFIG_NET_VENDOR_ADAPTEC is not set 229CONFIG_PTP_1588_CLOCK_TILEGX=y
364# CONFIG_NET_VENDOR_ALTEON is not set
365# CONFIG_NET_VENDOR_AMD is not set
366# CONFIG_NET_VENDOR_ATHEROS is not set
367# CONFIG_NET_VENDOR_BROADCOM is not set
368# CONFIG_NET_VENDOR_BROCADE is not set
369# CONFIG_NET_VENDOR_CHELSIO is not set
370# CONFIG_NET_VENDOR_CISCO is not set
371# CONFIG_NET_VENDOR_DEC is not set
372# CONFIG_NET_VENDOR_DLINK is not set
373# CONFIG_NET_VENDOR_EMULEX is not set
374# CONFIG_NET_VENDOR_EXAR is not set
375# CONFIG_NET_VENDOR_HP is not set
376# CONFIG_NET_VENDOR_INTEL is not set
377# CONFIG_NET_VENDOR_MARVELL is not set
378# CONFIG_NET_VENDOR_MELLANOX is not set
379# CONFIG_NET_VENDOR_MICREL is not set
380# CONFIG_NET_VENDOR_MYRI is not set
381# CONFIG_NET_VENDOR_NATSEMI is not set
382# CONFIG_NET_VENDOR_NVIDIA is not set
383# CONFIG_NET_VENDOR_OKI is not set
384# CONFIG_NET_PACKET_ENGINE is not set
385# CONFIG_NET_VENDOR_QLOGIC is not set
386# CONFIG_NET_VENDOR_REALTEK is not set
387# CONFIG_NET_VENDOR_RDC is not set
388# CONFIG_NET_VENDOR_SEEQ is not set
389# CONFIG_NET_VENDOR_SILAN is not set
390# CONFIG_NET_VENDOR_SIS is not set
391# CONFIG_NET_VENDOR_SMSC is not set
392# CONFIG_NET_VENDOR_STMICRO is not set
393# CONFIG_NET_VENDOR_SUN is not set
394# CONFIG_NET_VENDOR_TEHUTI is not set
395# CONFIG_NET_VENDOR_TI is not set
396# CONFIG_TILE_NET is not set
397# CONFIG_NET_VENDOR_VIA is not set
398# CONFIG_WLAN is not set 230# CONFIG_WLAN is not set
399# CONFIG_INPUT_MOUSEDEV is not set 231# CONFIG_INPUT_MOUSEDEV is not set
400# CONFIG_INPUT_KEYBOARD is not set 232# CONFIG_INPUT_KEYBOARD is not set
@@ -402,6 +234,7 @@ CONFIG_NET_DSA_MV88E6123_61_65=y
402# CONFIG_SERIO is not set 234# CONFIG_SERIO is not set
403# CONFIG_VT is not set 235# CONFIG_VT is not set
404# CONFIG_LEGACY_PTYS is not set 236# CONFIG_LEGACY_PTYS is not set
237CONFIG_SERIAL_TILEGX=y
405CONFIG_HW_RANDOM=y 238CONFIG_HW_RANDOM=y
406CONFIG_HW_RANDOM_TIMERIOMEM=m 239CONFIG_HW_RANDOM_TIMERIOMEM=m
407CONFIG_I2C=y 240CONFIG_I2C=y
@@ -410,13 +243,16 @@ CONFIG_I2C_CHARDEV=y
410CONFIG_WATCHDOG=y 243CONFIG_WATCHDOG=y
411CONFIG_WATCHDOG_NOWAYOUT=y 244CONFIG_WATCHDOG_NOWAYOUT=y
412# CONFIG_VGA_ARB is not set 245# CONFIG_VGA_ARB is not set
413# CONFIG_HID_SUPPORT is not set 246CONFIG_DRM=m
247CONFIG_DRM_TDFX=m
248CONFIG_DRM_R128=m
249CONFIG_DRM_MGA=m
250CONFIG_DRM_VIA=m
251CONFIG_DRM_SAVAGE=m
414CONFIG_USB=y 252CONFIG_USB=y
415# CONFIG_USB_DEVICE_CLASS is not set
416CONFIG_USB_EHCI_HCD=y 253CONFIG_USB_EHCI_HCD=y
417CONFIG_USB_OHCI_HCD=y 254CONFIG_USB_OHCI_HCD=y
418CONFIG_USB_STORAGE=y 255CONFIG_USB_STORAGE=y
419CONFIG_USB_LIBUSUAL=y
420CONFIG_EDAC=y 256CONFIG_EDAC=y
421CONFIG_EDAC_MM_EDAC=y 257CONFIG_EDAC_MM_EDAC=y
422CONFIG_RTC_CLASS=y 258CONFIG_RTC_CLASS=y
@@ -464,9 +300,8 @@ CONFIG_ECRYPT_FS=m
464CONFIG_CRAMFS=m 300CONFIG_CRAMFS=m
465CONFIG_SQUASHFS=m 301CONFIG_SQUASHFS=m
466CONFIG_NFS_FS=m 302CONFIG_NFS_FS=m
467CONFIG_NFS_V3=y
468CONFIG_NFS_V3_ACL=y 303CONFIG_NFS_V3_ACL=y
469CONFIG_NFS_V4=y 304CONFIG_NFS_V4=m
470CONFIG_NFS_V4_1=y 305CONFIG_NFS_V4_1=y
471CONFIG_NFS_FSCACHE=y 306CONFIG_NFS_FSCACHE=y
472CONFIG_NFSD=m 307CONFIG_NFSD=m
@@ -519,25 +354,28 @@ CONFIG_NLS_ISO8859_15=m
519CONFIG_NLS_KOI8_R=m 354CONFIG_NLS_KOI8_R=m
520CONFIG_NLS_KOI8_U=m 355CONFIG_NLS_KOI8_U=m
521CONFIG_NLS_UTF8=m 356CONFIG_NLS_UTF8=m
357CONFIG_DLM=m
522CONFIG_DLM_DEBUG=y 358CONFIG_DLM_DEBUG=y
359CONFIG_DYNAMIC_DEBUG=y
360CONFIG_DEBUG_INFO=y
361CONFIG_DEBUG_INFO_REDUCED=y
523# CONFIG_ENABLE_WARN_DEPRECATED is not set 362# CONFIG_ENABLE_WARN_DEPRECATED is not set
524CONFIG_MAGIC_SYSRQ=y
525CONFIG_STRIP_ASM_SYMS=y 363CONFIG_STRIP_ASM_SYMS=y
526CONFIG_DEBUG_FS=y 364CONFIG_DEBUG_FS=y
527CONFIG_HEADERS_CHECK=y 365CONFIG_HEADERS_CHECK=y
366# CONFIG_FRAME_POINTER is not set
367CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y
368CONFIG_DEBUG_VM=y
369CONFIG_DEBUG_MEMORY_INIT=y
370CONFIG_DEBUG_STACKOVERFLOW=y
528CONFIG_LOCKUP_DETECTOR=y 371CONFIG_LOCKUP_DETECTOR=y
529CONFIG_SCHEDSTATS=y 372CONFIG_SCHEDSTATS=y
530CONFIG_TIMER_STATS=y 373CONFIG_TIMER_STATS=y
531CONFIG_DEBUG_INFO=y
532CONFIG_DEBUG_INFO_REDUCED=y
533CONFIG_DEBUG_VM=y
534CONFIG_DEBUG_MEMORY_INIT=y
535CONFIG_DEBUG_LIST=y 374CONFIG_DEBUG_LIST=y
536CONFIG_DEBUG_CREDENTIALS=y 375CONFIG_DEBUG_CREDENTIALS=y
537CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y 376CONFIG_RCU_CPU_STALL_TIMEOUT=60
538CONFIG_DYNAMIC_DEBUG=y
539CONFIG_ASYNC_RAID6_TEST=m 377CONFIG_ASYNC_RAID6_TEST=m
540CONFIG_DEBUG_STACKOVERFLOW=y 378CONFIG_KGDB=y
541CONFIG_KEYS_DEBUG_PROC_KEYS=y 379CONFIG_KEYS_DEBUG_PROC_KEYS=y
542CONFIG_SECURITY=y 380CONFIG_SECURITY=y
543CONFIG_SECURITYFS=y 381CONFIG_SECURITYFS=y
@@ -546,7 +384,6 @@ CONFIG_SECURITY_NETWORK_XFRM=y
546CONFIG_SECURITY_SELINUX=y 384CONFIG_SECURITY_SELINUX=y
547CONFIG_SECURITY_SELINUX_BOOTPARAM=y 385CONFIG_SECURITY_SELINUX_BOOTPARAM=y
548CONFIG_SECURITY_SELINUX_DISABLE=y 386CONFIG_SECURITY_SELINUX_DISABLE=y
549CONFIG_CRYPTO_NULL=m
550CONFIG_CRYPTO_PCRYPT=m 387CONFIG_CRYPTO_PCRYPT=m
551CONFIG_CRYPTO_CRYPTD=m 388CONFIG_CRYPTO_CRYPTD=m
552CONFIG_CRYPTO_TEST=m 389CONFIG_CRYPTO_TEST=m
@@ -559,14 +396,12 @@ CONFIG_CRYPTO_XTS=m
559CONFIG_CRYPTO_HMAC=y 396CONFIG_CRYPTO_HMAC=y
560CONFIG_CRYPTO_XCBC=m 397CONFIG_CRYPTO_XCBC=m
561CONFIG_CRYPTO_VMAC=m 398CONFIG_CRYPTO_VMAC=m
562CONFIG_CRYPTO_CRC32C=y
563CONFIG_CRYPTO_MICHAEL_MIC=m 399CONFIG_CRYPTO_MICHAEL_MIC=m
564CONFIG_CRYPTO_RMD128=m 400CONFIG_CRYPTO_RMD128=m
565CONFIG_CRYPTO_RMD160=m 401CONFIG_CRYPTO_RMD160=m
566CONFIG_CRYPTO_RMD256=m 402CONFIG_CRYPTO_RMD256=m
567CONFIG_CRYPTO_RMD320=m 403CONFIG_CRYPTO_RMD320=m
568CONFIG_CRYPTO_SHA1=y 404CONFIG_CRYPTO_SHA1=y
569CONFIG_CRYPTO_SHA256=m
570CONFIG_CRYPTO_SHA512=m 405CONFIG_CRYPTO_SHA512=m
571CONFIG_CRYPTO_TGR192=m 406CONFIG_CRYPTO_TGR192=m
572CONFIG_CRYPTO_WP512=m 407CONFIG_CRYPTO_WP512=m
diff --git a/arch/tile/configs/tilepro_defconfig b/arch/tile/configs/tilepro_defconfig
index dd2b8f0c631f..80fc32ed0491 100644
--- a/arch/tile/configs/tilepro_defconfig
+++ b/arch/tile/configs/tilepro_defconfig
@@ -1,15 +1,14 @@
1CONFIG_EXPERIMENTAL=y
2# CONFIG_LOCALVERSION_AUTO is not set
3CONFIG_SYSVIPC=y 1CONFIG_SYSVIPC=y
4CONFIG_POSIX_MQUEUE=y 2CONFIG_POSIX_MQUEUE=y
3CONFIG_AUDIT=y
4CONFIG_NO_HZ=y
5CONFIG_HIGH_RES_TIMERS=y
5CONFIG_BSD_PROCESS_ACCT=y 6CONFIG_BSD_PROCESS_ACCT=y
6CONFIG_BSD_PROCESS_ACCT_V3=y 7CONFIG_BSD_PROCESS_ACCT_V3=y
7CONFIG_FHANDLE=y
8CONFIG_TASKSTATS=y 8CONFIG_TASKSTATS=y
9CONFIG_TASK_DELAY_ACCT=y 9CONFIG_TASK_DELAY_ACCT=y
10CONFIG_TASK_XACCT=y 10CONFIG_TASK_XACCT=y
11CONFIG_TASK_IO_ACCOUNTING=y 11CONFIG_TASK_IO_ACCOUNTING=y
12CONFIG_AUDIT=y
13CONFIG_LOG_BUF_SHIFT=19 12CONFIG_LOG_BUF_SHIFT=19
14CONFIG_CGROUPS=y 13CONFIG_CGROUPS=y
15CONFIG_CGROUP_DEBUG=y 14CONFIG_CGROUP_DEBUG=y
@@ -17,14 +16,13 @@ CONFIG_CGROUP_DEVICE=y
17CONFIG_CPUSETS=y 16CONFIG_CPUSETS=y
18CONFIG_CGROUP_CPUACCT=y 17CONFIG_CGROUP_CPUACCT=y
19CONFIG_RESOURCE_COUNTERS=y 18CONFIG_RESOURCE_COUNTERS=y
20CONFIG_CGROUP_MEMCG=y
21CONFIG_CGROUP_MEMCG_SWAP=y
22CONFIG_CGROUP_SCHED=y 19CONFIG_CGROUP_SCHED=y
23CONFIG_RT_GROUP_SCHED=y 20CONFIG_RT_GROUP_SCHED=y
24CONFIG_BLK_CGROUP=y 21CONFIG_BLK_CGROUP=y
25CONFIG_NAMESPACES=y 22CONFIG_NAMESPACES=y
26CONFIG_RELAY=y 23CONFIG_RELAY=y
27CONFIG_BLK_DEV_INITRD=y 24CONFIG_BLK_DEV_INITRD=y
25CONFIG_RD_XZ=y
28CONFIG_SYSCTL_SYSCALL=y 26CONFIG_SYSCTL_SYSCALL=y
29CONFIG_EMBEDDED=y 27CONFIG_EMBEDDED=y
30# CONFIG_COMPAT_BRK is not set 28# CONFIG_COMPAT_BRK is not set
@@ -44,11 +42,10 @@ CONFIG_UNIXWARE_DISKLABEL=y
44CONFIG_SGI_PARTITION=y 42CONFIG_SGI_PARTITION=y
45CONFIG_SUN_PARTITION=y 43CONFIG_SUN_PARTITION=y
46CONFIG_KARMA_PARTITION=y 44CONFIG_KARMA_PARTITION=y
47CONFIG_EFI_PARTITION=y
48CONFIG_CFQ_GROUP_IOSCHED=y 45CONFIG_CFQ_GROUP_IOSCHED=y
49CONFIG_NO_HZ=y
50CONFIG_HIGH_RES_TIMERS=y
51CONFIG_HZ_100=y 46CONFIG_HZ_100=y
47# CONFIG_COMPACTION is not set
48CONFIG_PREEMPT_VOLUNTARY=y
52CONFIG_PCI_DEBUG=y 49CONFIG_PCI_DEBUG=y
53# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set 50# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
54CONFIG_BINFMT_MISC=y 51CONFIG_BINFMT_MISC=y
@@ -122,16 +119,15 @@ CONFIG_NF_CONNTRACK_PPTP=m
122CONFIG_NF_CONNTRACK_SANE=m 119CONFIG_NF_CONNTRACK_SANE=m
123CONFIG_NF_CONNTRACK_SIP=m 120CONFIG_NF_CONNTRACK_SIP=m
124CONFIG_NF_CONNTRACK_TFTP=m 121CONFIG_NF_CONNTRACK_TFTP=m
125CONFIG_NETFILTER_TPROXY=m
126CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m 122CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
127CONFIG_NETFILTER_XT_TARGET_CONNMARK=m 123CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
128CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m 124CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m
129CONFIG_NETFILTER_XT_TARGET_CT=m
130CONFIG_NETFILTER_XT_TARGET_DSCP=m 125CONFIG_NETFILTER_XT_TARGET_DSCP=m
131CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m 126CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m
132CONFIG_NETFILTER_XT_TARGET_MARK=m 127CONFIG_NETFILTER_XT_TARGET_MARK=m
133CONFIG_NETFILTER_XT_TARGET_NFLOG=m 128CONFIG_NETFILTER_XT_TARGET_NFLOG=m
134CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m 129CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
130CONFIG_NETFILTER_XT_TARGET_NOTRACK=m
135CONFIG_NETFILTER_XT_TARGET_TEE=m 131CONFIG_NETFILTER_XT_TARGET_TEE=m
136CONFIG_NETFILTER_XT_TARGET_TPROXY=m 132CONFIG_NETFILTER_XT_TARGET_TPROXY=m
137CONFIG_NETFILTER_XT_TARGET_TRACE=m 133CONFIG_NETFILTER_XT_TARGET_TRACE=m
@@ -189,14 +185,12 @@ CONFIG_IP_VS_SED=m
189CONFIG_IP_VS_NQ=m 185CONFIG_IP_VS_NQ=m
190CONFIG_NF_CONNTRACK_IPV4=m 186CONFIG_NF_CONNTRACK_IPV4=m
191# CONFIG_NF_CONNTRACK_PROC_COMPAT is not set 187# CONFIG_NF_CONNTRACK_PROC_COMPAT is not set
192CONFIG_IP_NF_QUEUE=m
193CONFIG_IP_NF_IPTABLES=y 188CONFIG_IP_NF_IPTABLES=y
194CONFIG_IP_NF_MATCH_AH=m 189CONFIG_IP_NF_MATCH_AH=m
195CONFIG_IP_NF_MATCH_ECN=m 190CONFIG_IP_NF_MATCH_ECN=m
196CONFIG_IP_NF_MATCH_TTL=m 191CONFIG_IP_NF_MATCH_TTL=m
197CONFIG_IP_NF_FILTER=y 192CONFIG_IP_NF_FILTER=y
198CONFIG_IP_NF_TARGET_REJECT=y 193CONFIG_IP_NF_TARGET_REJECT=y
199CONFIG_IP_NF_TARGET_LOG=m
200CONFIG_IP_NF_TARGET_ULOG=m 194CONFIG_IP_NF_TARGET_ULOG=m
201CONFIG_IP_NF_MANGLE=m 195CONFIG_IP_NF_MANGLE=m
202CONFIG_IP_NF_TARGET_ECN=m 196CONFIG_IP_NF_TARGET_ECN=m
@@ -207,8 +201,6 @@ CONFIG_IP_NF_ARPTABLES=m
207CONFIG_IP_NF_ARPFILTER=m 201CONFIG_IP_NF_ARPFILTER=m
208CONFIG_IP_NF_ARP_MANGLE=m 202CONFIG_IP_NF_ARP_MANGLE=m
209CONFIG_NF_CONNTRACK_IPV6=m 203CONFIG_NF_CONNTRACK_IPV6=m
210CONFIG_IP6_NF_QUEUE=m
211CONFIG_IP6_NF_IPTABLES=m
212CONFIG_IP6_NF_MATCH_AH=m 204CONFIG_IP6_NF_MATCH_AH=m
213CONFIG_IP6_NF_MATCH_EUI64=m 205CONFIG_IP6_NF_MATCH_EUI64=m
214CONFIG_IP6_NF_MATCH_FRAG=m 206CONFIG_IP6_NF_MATCH_FRAG=m
@@ -218,7 +210,6 @@ CONFIG_IP6_NF_MATCH_IPV6HEADER=m
218CONFIG_IP6_NF_MATCH_MH=m 210CONFIG_IP6_NF_MATCH_MH=m
219CONFIG_IP6_NF_MATCH_RT=m 211CONFIG_IP6_NF_MATCH_RT=m
220CONFIG_IP6_NF_TARGET_HL=m 212CONFIG_IP6_NF_TARGET_HL=m
221CONFIG_IP6_NF_TARGET_LOG=m
222CONFIG_IP6_NF_FILTER=m 213CONFIG_IP6_NF_FILTER=m
223CONFIG_IP6_NF_TARGET_REJECT=m 214CONFIG_IP6_NF_TARGET_REJECT=m
224CONFIG_IP6_NF_MANGLE=m 215CONFIG_IP6_NF_MANGLE=m
@@ -249,7 +240,6 @@ CONFIG_BRIDGE_EBT_NFLOG=m
249CONFIG_RDS=m 240CONFIG_RDS=m
250CONFIG_RDS_TCP=m 241CONFIG_RDS_TCP=m
251CONFIG_BRIDGE=m 242CONFIG_BRIDGE=m
252CONFIG_NET_DSA=y
253CONFIG_VLAN_8021Q=m 243CONFIG_VLAN_8021Q=m
254CONFIG_VLAN_8021Q_GVRP=y 244CONFIG_VLAN_8021Q_GVRP=y
255CONFIG_PHONET=m 245CONFIG_PHONET=m
@@ -297,6 +287,7 @@ CONFIG_NET_ACT_SIMP=m
297CONFIG_NET_ACT_SKBEDIT=m 287CONFIG_NET_ACT_SKBEDIT=m
298CONFIG_NET_CLS_IND=y 288CONFIG_NET_CLS_IND=y
299CONFIG_DCB=y 289CONFIG_DCB=y
290CONFIG_DNS_RESOLVER=y
300# CONFIG_WIRELESS is not set 291# CONFIG_WIRELESS is not set
301CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" 292CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
302CONFIG_DEVTMPFS=y 293CONFIG_DEVTMPFS=y
@@ -354,40 +345,7 @@ CONFIG_NET_DSA_MV88E6060=y
354CONFIG_NET_DSA_MV88E6131=y 345CONFIG_NET_DSA_MV88E6131=y
355CONFIG_NET_DSA_MV88E6123_61_65=y 346CONFIG_NET_DSA_MV88E6123_61_65=y
356# CONFIG_NET_VENDOR_3COM is not set 347# CONFIG_NET_VENDOR_3COM is not set
357# CONFIG_NET_VENDOR_ADAPTEC is not set 348CONFIG_E1000E=y
358# CONFIG_NET_VENDOR_ALTEON is not set
359# CONFIG_NET_VENDOR_AMD is not set
360# CONFIG_NET_VENDOR_ATHEROS is not set
361# CONFIG_NET_VENDOR_BROADCOM is not set
362# CONFIG_NET_VENDOR_BROCADE is not set
363# CONFIG_NET_VENDOR_CHELSIO is not set
364# CONFIG_NET_VENDOR_CISCO is not set
365# CONFIG_NET_VENDOR_DEC is not set
366# CONFIG_NET_VENDOR_DLINK is not set
367# CONFIG_NET_VENDOR_EMULEX is not set
368# CONFIG_NET_VENDOR_EXAR is not set
369# CONFIG_NET_VENDOR_HP is not set
370# CONFIG_NET_VENDOR_INTEL is not set
371# CONFIG_NET_VENDOR_MARVELL is not set
372# CONFIG_NET_VENDOR_MELLANOX is not set
373# CONFIG_NET_VENDOR_MICREL is not set
374# CONFIG_NET_VENDOR_MYRI is not set
375# CONFIG_NET_VENDOR_NATSEMI is not set
376# CONFIG_NET_VENDOR_NVIDIA is not set
377# CONFIG_NET_VENDOR_OKI is not set
378# CONFIG_NET_PACKET_ENGINE is not set
379# CONFIG_NET_VENDOR_QLOGIC is not set
380# CONFIG_NET_VENDOR_REALTEK is not set
381# CONFIG_NET_VENDOR_RDC is not set
382# CONFIG_NET_VENDOR_SEEQ is not set
383# CONFIG_NET_VENDOR_SILAN is not set
384# CONFIG_NET_VENDOR_SIS is not set
385# CONFIG_NET_VENDOR_SMSC is not set
386# CONFIG_NET_VENDOR_STMICRO is not set
387# CONFIG_NET_VENDOR_SUN is not set
388# CONFIG_NET_VENDOR_TEHUTI is not set
389# CONFIG_NET_VENDOR_TI is not set
390# CONFIG_NET_VENDOR_VIA is not set
391# CONFIG_WLAN is not set 349# CONFIG_WLAN is not set
392# CONFIG_INPUT_MOUSEDEV is not set 350# CONFIG_INPUT_MOUSEDEV is not set
393# CONFIG_INPUT_KEYBOARD is not set 351# CONFIG_INPUT_KEYBOARD is not set
@@ -403,7 +361,6 @@ CONFIG_I2C_CHARDEV=y
403CONFIG_WATCHDOG=y 361CONFIG_WATCHDOG=y
404CONFIG_WATCHDOG_NOWAYOUT=y 362CONFIG_WATCHDOG_NOWAYOUT=y
405# CONFIG_VGA_ARB is not set 363# CONFIG_VGA_ARB is not set
406# CONFIG_HID_SUPPORT is not set
407# CONFIG_USB_SUPPORT is not set 364# CONFIG_USB_SUPPORT is not set
408CONFIG_EDAC=y 365CONFIG_EDAC=y
409CONFIG_EDAC_MM_EDAC=y 366CONFIG_EDAC_MM_EDAC=y
@@ -448,13 +405,13 @@ CONFIG_PROC_KCORE=y
448CONFIG_TMPFS=y 405CONFIG_TMPFS=y
449CONFIG_TMPFS_POSIX_ACL=y 406CONFIG_TMPFS_POSIX_ACL=y
450CONFIG_HUGETLBFS=y 407CONFIG_HUGETLBFS=y
408CONFIG_CONFIGFS_FS=m
451CONFIG_ECRYPT_FS=m 409CONFIG_ECRYPT_FS=m
452CONFIG_CRAMFS=m 410CONFIG_CRAMFS=m
453CONFIG_SQUASHFS=m 411CONFIG_SQUASHFS=m
454CONFIG_NFS_FS=m 412CONFIG_NFS_FS=m
455CONFIG_NFS_V3=y
456CONFIG_NFS_V3_ACL=y 413CONFIG_NFS_V3_ACL=y
457CONFIG_NFS_V4=y 414CONFIG_NFS_V4=m
458CONFIG_NFS_V4_1=y 415CONFIG_NFS_V4_1=y
459CONFIG_NFS_FSCACHE=y 416CONFIG_NFS_FSCACHE=y
460CONFIG_NFSD=m 417CONFIG_NFSD=m
@@ -508,26 +465,29 @@ CONFIG_NLS_ISO8859_15=m
508CONFIG_NLS_KOI8_R=m 465CONFIG_NLS_KOI8_R=m
509CONFIG_NLS_KOI8_U=m 466CONFIG_NLS_KOI8_U=m
510CONFIG_NLS_UTF8=m 467CONFIG_NLS_UTF8=m
468CONFIG_DLM=m
511CONFIG_DLM_DEBUG=y 469CONFIG_DLM_DEBUG=y
470CONFIG_DYNAMIC_DEBUG=y
471CONFIG_DEBUG_INFO=y
472CONFIG_DEBUG_INFO_REDUCED=y
512# CONFIG_ENABLE_WARN_DEPRECATED is not set 473# CONFIG_ENABLE_WARN_DEPRECATED is not set
513CONFIG_FRAME_WARN=2048 474CONFIG_FRAME_WARN=2048
514CONFIG_MAGIC_SYSRQ=y
515CONFIG_STRIP_ASM_SYMS=y 475CONFIG_STRIP_ASM_SYMS=y
516CONFIG_DEBUG_FS=y 476CONFIG_DEBUG_FS=y
517CONFIG_HEADERS_CHECK=y 477CONFIG_HEADERS_CHECK=y
478# CONFIG_FRAME_POINTER is not set
479CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y
480CONFIG_MAGIC_SYSRQ=y
481CONFIG_DEBUG_VM=y
482CONFIG_DEBUG_MEMORY_INIT=y
483CONFIG_DEBUG_STACKOVERFLOW=y
518CONFIG_LOCKUP_DETECTOR=y 484CONFIG_LOCKUP_DETECTOR=y
519CONFIG_SCHEDSTATS=y 485CONFIG_SCHEDSTATS=y
520CONFIG_TIMER_STATS=y 486CONFIG_TIMER_STATS=y
521CONFIG_DEBUG_INFO=y
522CONFIG_DEBUG_INFO_REDUCED=y
523CONFIG_DEBUG_VM=y
524CONFIG_DEBUG_MEMORY_INIT=y
525CONFIG_DEBUG_LIST=y 487CONFIG_DEBUG_LIST=y
526CONFIG_DEBUG_CREDENTIALS=y 488CONFIG_DEBUG_CREDENTIALS=y
527CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y 489CONFIG_RCU_CPU_STALL_TIMEOUT=60
528CONFIG_DYNAMIC_DEBUG=y
529CONFIG_ASYNC_RAID6_TEST=m 490CONFIG_ASYNC_RAID6_TEST=m
530CONFIG_DEBUG_STACKOVERFLOW=y
531CONFIG_KEYS_DEBUG_PROC_KEYS=y 491CONFIG_KEYS_DEBUG_PROC_KEYS=y
532CONFIG_SECURITY=y 492CONFIG_SECURITY=y
533CONFIG_SECURITYFS=y 493CONFIG_SECURITYFS=y
@@ -536,7 +496,6 @@ CONFIG_SECURITY_NETWORK_XFRM=y
536CONFIG_SECURITY_SELINUX=y 496CONFIG_SECURITY_SELINUX=y
537CONFIG_SECURITY_SELINUX_BOOTPARAM=y 497CONFIG_SECURITY_SELINUX_BOOTPARAM=y
538CONFIG_SECURITY_SELINUX_DISABLE=y 498CONFIG_SECURITY_SELINUX_DISABLE=y
539CONFIG_CRYPTO_NULL=m
540CONFIG_CRYPTO_PCRYPT=m 499CONFIG_CRYPTO_PCRYPT=m
541CONFIG_CRYPTO_CRYPTD=m 500CONFIG_CRYPTO_CRYPTD=m
542CONFIG_CRYPTO_TEST=m 501CONFIG_CRYPTO_TEST=m
@@ -549,14 +508,12 @@ CONFIG_CRYPTO_XTS=m
549CONFIG_CRYPTO_HMAC=y 508CONFIG_CRYPTO_HMAC=y
550CONFIG_CRYPTO_XCBC=m 509CONFIG_CRYPTO_XCBC=m
551CONFIG_CRYPTO_VMAC=m 510CONFIG_CRYPTO_VMAC=m
552CONFIG_CRYPTO_CRC32C=y
553CONFIG_CRYPTO_MICHAEL_MIC=m 511CONFIG_CRYPTO_MICHAEL_MIC=m
554CONFIG_CRYPTO_RMD128=m 512CONFIG_CRYPTO_RMD128=m
555CONFIG_CRYPTO_RMD160=m 513CONFIG_CRYPTO_RMD160=m
556CONFIG_CRYPTO_RMD256=m 514CONFIG_CRYPTO_RMD256=m
557CONFIG_CRYPTO_RMD320=m 515CONFIG_CRYPTO_RMD320=m
558CONFIG_CRYPTO_SHA1=y 516CONFIG_CRYPTO_SHA1=y
559CONFIG_CRYPTO_SHA256=m
560CONFIG_CRYPTO_SHA512=m 517CONFIG_CRYPTO_SHA512=m
561CONFIG_CRYPTO_TGR192=m 518CONFIG_CRYPTO_TGR192=m
562CONFIG_CRYPTO_WP512=m 519CONFIG_CRYPTO_WP512=m
diff --git a/arch/tile/gxio/Kconfig b/arch/tile/gxio/Kconfig
index d221f8d6de8b..d4e10d58071b 100644
--- a/arch/tile/gxio/Kconfig
+++ b/arch/tile/gxio/Kconfig
@@ -26,3 +26,8 @@ config TILE_GXIO_TRIO
26config TILE_GXIO_USB_HOST 26config TILE_GXIO_USB_HOST
27 bool 27 bool
28 select TILE_GXIO 28 select TILE_GXIO
29
30# Support direct access to the TILE-Gx UART hardware from kernel space.
31config TILE_GXIO_UART
32 bool
33 select TILE_GXIO
diff --git a/arch/tile/gxio/Makefile b/arch/tile/gxio/Makefile
index 8684bcaa74ea..26ae2c727467 100644
--- a/arch/tile/gxio/Makefile
+++ b/arch/tile/gxio/Makefile
@@ -6,4 +6,5 @@ obj-$(CONFIG_TILE_GXIO) += iorpc_globals.o kiorpc.o
6obj-$(CONFIG_TILE_GXIO_DMA) += dma_queue.o 6obj-$(CONFIG_TILE_GXIO_DMA) += dma_queue.o
7obj-$(CONFIG_TILE_GXIO_MPIPE) += mpipe.o iorpc_mpipe.o iorpc_mpipe_info.o 7obj-$(CONFIG_TILE_GXIO_MPIPE) += mpipe.o iorpc_mpipe.o iorpc_mpipe_info.o
8obj-$(CONFIG_TILE_GXIO_TRIO) += trio.o iorpc_trio.o 8obj-$(CONFIG_TILE_GXIO_TRIO) += trio.o iorpc_trio.o
9obj-$(CONFIG_TILE_GXIO_UART) += uart.o iorpc_uart.o
9obj-$(CONFIG_TILE_GXIO_USB_HOST) += usb_host.o iorpc_usb_host.o 10obj-$(CONFIG_TILE_GXIO_USB_HOST) += usb_host.o iorpc_usb_host.o
diff --git a/arch/tile/gxio/iorpc_mpipe.c b/arch/tile/gxio/iorpc_mpipe.c
index 31b87bf8c027..e19325c4c431 100644
--- a/arch/tile/gxio/iorpc_mpipe.c
+++ b/arch/tile/gxio/iorpc_mpipe.c
@@ -21,7 +21,7 @@ struct alloc_buffer_stacks_param {
21 unsigned int flags; 21 unsigned int flags;
22}; 22};
23 23
24int gxio_mpipe_alloc_buffer_stacks(gxio_mpipe_context_t * context, 24int gxio_mpipe_alloc_buffer_stacks(gxio_mpipe_context_t *context,
25 unsigned int count, unsigned int first, 25 unsigned int count, unsigned int first,
26 unsigned int flags) 26 unsigned int flags)
27{ 27{
@@ -45,7 +45,7 @@ struct init_buffer_stack_aux_param {
45 unsigned int buffer_size_enum; 45 unsigned int buffer_size_enum;
46}; 46};
47 47
48int gxio_mpipe_init_buffer_stack_aux(gxio_mpipe_context_t * context, 48int gxio_mpipe_init_buffer_stack_aux(gxio_mpipe_context_t *context,
49 void *mem_va, size_t mem_size, 49 void *mem_va, size_t mem_size,
50 unsigned int mem_flags, unsigned int stack, 50 unsigned int mem_flags, unsigned int stack,
51 unsigned int buffer_size_enum) 51 unsigned int buffer_size_enum)
@@ -80,7 +80,7 @@ struct alloc_notif_rings_param {
80 unsigned int flags; 80 unsigned int flags;
81}; 81};
82 82
83int gxio_mpipe_alloc_notif_rings(gxio_mpipe_context_t * context, 83int gxio_mpipe_alloc_notif_rings(gxio_mpipe_context_t *context,
84 unsigned int count, unsigned int first, 84 unsigned int count, unsigned int first,
85 unsigned int flags) 85 unsigned int flags)
86{ 86{
@@ -102,7 +102,7 @@ struct init_notif_ring_aux_param {
102 unsigned int ring; 102 unsigned int ring;
103}; 103};
104 104
105int gxio_mpipe_init_notif_ring_aux(gxio_mpipe_context_t * context, void *mem_va, 105int gxio_mpipe_init_notif_ring_aux(gxio_mpipe_context_t *context, void *mem_va,
106 size_t mem_size, unsigned int mem_flags, 106 size_t mem_size, unsigned int mem_flags,
107 unsigned int ring) 107 unsigned int ring)
108{ 108{
@@ -133,7 +133,7 @@ struct request_notif_ring_interrupt_param {
133 unsigned int ring; 133 unsigned int ring;
134}; 134};
135 135
136int gxio_mpipe_request_notif_ring_interrupt(gxio_mpipe_context_t * context, 136int gxio_mpipe_request_notif_ring_interrupt(gxio_mpipe_context_t *context,
137 int inter_x, int inter_y, 137 int inter_x, int inter_y,
138 int inter_ipi, int inter_event, 138 int inter_ipi, int inter_event,
139 unsigned int ring) 139 unsigned int ring)
@@ -158,7 +158,7 @@ struct enable_notif_ring_interrupt_param {
158 unsigned int ring; 158 unsigned int ring;
159}; 159};
160 160
161int gxio_mpipe_enable_notif_ring_interrupt(gxio_mpipe_context_t * context, 161int gxio_mpipe_enable_notif_ring_interrupt(gxio_mpipe_context_t *context,
162 unsigned int ring) 162 unsigned int ring)
163{ 163{
164 struct enable_notif_ring_interrupt_param temp; 164 struct enable_notif_ring_interrupt_param temp;
@@ -179,7 +179,7 @@ struct alloc_notif_groups_param {
179 unsigned int flags; 179 unsigned int flags;
180}; 180};
181 181
182int gxio_mpipe_alloc_notif_groups(gxio_mpipe_context_t * context, 182int gxio_mpipe_alloc_notif_groups(gxio_mpipe_context_t *context,
183 unsigned int count, unsigned int first, 183 unsigned int count, unsigned int first,
184 unsigned int flags) 184 unsigned int flags)
185{ 185{
@@ -201,7 +201,7 @@ struct init_notif_group_param {
201 gxio_mpipe_notif_group_bits_t bits; 201 gxio_mpipe_notif_group_bits_t bits;
202}; 202};
203 203
204int gxio_mpipe_init_notif_group(gxio_mpipe_context_t * context, 204int gxio_mpipe_init_notif_group(gxio_mpipe_context_t *context,
205 unsigned int group, 205 unsigned int group,
206 gxio_mpipe_notif_group_bits_t bits) 206 gxio_mpipe_notif_group_bits_t bits)
207{ 207{
@@ -223,7 +223,7 @@ struct alloc_buckets_param {
223 unsigned int flags; 223 unsigned int flags;
224}; 224};
225 225
226int gxio_mpipe_alloc_buckets(gxio_mpipe_context_t * context, unsigned int count, 226int gxio_mpipe_alloc_buckets(gxio_mpipe_context_t *context, unsigned int count,
227 unsigned int first, unsigned int flags) 227 unsigned int first, unsigned int flags)
228{ 228{
229 struct alloc_buckets_param temp; 229 struct alloc_buckets_param temp;
@@ -244,7 +244,7 @@ struct init_bucket_param {
244 MPIPE_LBL_INIT_DAT_BSTS_TBL_t bucket_info; 244 MPIPE_LBL_INIT_DAT_BSTS_TBL_t bucket_info;
245}; 245};
246 246
247int gxio_mpipe_init_bucket(gxio_mpipe_context_t * context, unsigned int bucket, 247int gxio_mpipe_init_bucket(gxio_mpipe_context_t *context, unsigned int bucket,
248 MPIPE_LBL_INIT_DAT_BSTS_TBL_t bucket_info) 248 MPIPE_LBL_INIT_DAT_BSTS_TBL_t bucket_info)
249{ 249{
250 struct init_bucket_param temp; 250 struct init_bucket_param temp;
@@ -265,7 +265,7 @@ struct alloc_edma_rings_param {
265 unsigned int flags; 265 unsigned int flags;
266}; 266};
267 267
268int gxio_mpipe_alloc_edma_rings(gxio_mpipe_context_t * context, 268int gxio_mpipe_alloc_edma_rings(gxio_mpipe_context_t *context,
269 unsigned int count, unsigned int first, 269 unsigned int count, unsigned int first,
270 unsigned int flags) 270 unsigned int flags)
271{ 271{
@@ -288,7 +288,7 @@ struct init_edma_ring_aux_param {
288 unsigned int channel; 288 unsigned int channel;
289}; 289};
290 290
291int gxio_mpipe_init_edma_ring_aux(gxio_mpipe_context_t * context, void *mem_va, 291int gxio_mpipe_init_edma_ring_aux(gxio_mpipe_context_t *context, void *mem_va,
292 size_t mem_size, unsigned int mem_flags, 292 size_t mem_size, unsigned int mem_flags,
293 unsigned int ring, unsigned int channel) 293 unsigned int ring, unsigned int channel)
294{ 294{
@@ -315,7 +315,7 @@ int gxio_mpipe_init_edma_ring_aux(gxio_mpipe_context_t * context, void *mem_va,
315EXPORT_SYMBOL(gxio_mpipe_init_edma_ring_aux); 315EXPORT_SYMBOL(gxio_mpipe_init_edma_ring_aux);
316 316
317 317
318int gxio_mpipe_commit_rules(gxio_mpipe_context_t * context, const void *blob, 318int gxio_mpipe_commit_rules(gxio_mpipe_context_t *context, const void *blob,
319 size_t blob_size) 319 size_t blob_size)
320{ 320{
321 const void *params = blob; 321 const void *params = blob;
@@ -332,7 +332,7 @@ struct register_client_memory_param {
332 unsigned int flags; 332 unsigned int flags;
333}; 333};
334 334
335int gxio_mpipe_register_client_memory(gxio_mpipe_context_t * context, 335int gxio_mpipe_register_client_memory(gxio_mpipe_context_t *context,
336 unsigned int iotlb, HV_PTE pte, 336 unsigned int iotlb, HV_PTE pte,
337 unsigned int flags) 337 unsigned int flags)
338{ 338{
@@ -355,7 +355,7 @@ struct link_open_aux_param {
355 unsigned int flags; 355 unsigned int flags;
356}; 356};
357 357
358int gxio_mpipe_link_open_aux(gxio_mpipe_context_t * context, 358int gxio_mpipe_link_open_aux(gxio_mpipe_context_t *context,
359 _gxio_mpipe_link_name_t name, unsigned int flags) 359 _gxio_mpipe_link_name_t name, unsigned int flags)
360{ 360{
361 struct link_open_aux_param temp; 361 struct link_open_aux_param temp;
@@ -374,7 +374,7 @@ struct link_close_aux_param {
374 int mac; 374 int mac;
375}; 375};
376 376
377int gxio_mpipe_link_close_aux(gxio_mpipe_context_t * context, int mac) 377int gxio_mpipe_link_close_aux(gxio_mpipe_context_t *context, int mac)
378{ 378{
379 struct link_close_aux_param temp; 379 struct link_close_aux_param temp;
380 struct link_close_aux_param *params = &temp; 380 struct link_close_aux_param *params = &temp;
@@ -387,6 +387,27 @@ int gxio_mpipe_link_close_aux(gxio_mpipe_context_t * context, int mac)
387 387
388EXPORT_SYMBOL(gxio_mpipe_link_close_aux); 388EXPORT_SYMBOL(gxio_mpipe_link_close_aux);
389 389
390struct link_set_attr_aux_param {
391 int mac;
392 uint32_t attr;
393 int64_t val;
394};
395
396int gxio_mpipe_link_set_attr_aux(gxio_mpipe_context_t *context, int mac,
397 uint32_t attr, int64_t val)
398{
399 struct link_set_attr_aux_param temp;
400 struct link_set_attr_aux_param *params = &temp;
401
402 params->mac = mac;
403 params->attr = attr;
404 params->val = val;
405
406 return hv_dev_pwrite(context->fd, 0, (HV_VirtAddr) params,
407 sizeof(*params), GXIO_MPIPE_OP_LINK_SET_ATTR_AUX);
408}
409
410EXPORT_SYMBOL(gxio_mpipe_link_set_attr_aux);
390 411
391struct get_timestamp_aux_param { 412struct get_timestamp_aux_param {
392 uint64_t sec; 413 uint64_t sec;
@@ -394,8 +415,8 @@ struct get_timestamp_aux_param {
394 uint64_t cycles; 415 uint64_t cycles;
395}; 416};
396 417
397int gxio_mpipe_get_timestamp_aux(gxio_mpipe_context_t * context, uint64_t * sec, 418int gxio_mpipe_get_timestamp_aux(gxio_mpipe_context_t *context, uint64_t *sec,
398 uint64_t * nsec, uint64_t * cycles) 419 uint64_t *nsec, uint64_t *cycles)
399{ 420{
400 int __result; 421 int __result;
401 struct get_timestamp_aux_param temp; 422 struct get_timestamp_aux_param temp;
@@ -419,7 +440,7 @@ struct set_timestamp_aux_param {
419 uint64_t cycles; 440 uint64_t cycles;
420}; 441};
421 442
422int gxio_mpipe_set_timestamp_aux(gxio_mpipe_context_t * context, uint64_t sec, 443int gxio_mpipe_set_timestamp_aux(gxio_mpipe_context_t *context, uint64_t sec,
423 uint64_t nsec, uint64_t cycles) 444 uint64_t nsec, uint64_t cycles)
424{ 445{
425 struct set_timestamp_aux_param temp; 446 struct set_timestamp_aux_param temp;
@@ -439,8 +460,7 @@ struct adjust_timestamp_aux_param {
439 int64_t nsec; 460 int64_t nsec;
440}; 461};
441 462
442int gxio_mpipe_adjust_timestamp_aux(gxio_mpipe_context_t * context, 463int gxio_mpipe_adjust_timestamp_aux(gxio_mpipe_context_t *context, int64_t nsec)
443 int64_t nsec)
444{ 464{
445 struct adjust_timestamp_aux_param temp; 465 struct adjust_timestamp_aux_param temp;
446 struct adjust_timestamp_aux_param *params = &temp; 466 struct adjust_timestamp_aux_param *params = &temp;
@@ -454,11 +474,55 @@ int gxio_mpipe_adjust_timestamp_aux(gxio_mpipe_context_t * context,
454 474
455EXPORT_SYMBOL(gxio_mpipe_adjust_timestamp_aux); 475EXPORT_SYMBOL(gxio_mpipe_adjust_timestamp_aux);
456 476
477struct config_edma_ring_blks_param {
478 unsigned int ering;
479 unsigned int max_blks;
480 unsigned int min_snf_blks;
481 unsigned int db;
482};
483
484int gxio_mpipe_config_edma_ring_blks(gxio_mpipe_context_t *context,
485 unsigned int ering, unsigned int max_blks,
486 unsigned int min_snf_blks, unsigned int db)
487{
488 struct config_edma_ring_blks_param temp;
489 struct config_edma_ring_blks_param *params = &temp;
490
491 params->ering = ering;
492 params->max_blks = max_blks;
493 params->min_snf_blks = min_snf_blks;
494 params->db = db;
495
496 return hv_dev_pwrite(context->fd, 0, (HV_VirtAddr) params,
497 sizeof(*params),
498 GXIO_MPIPE_OP_CONFIG_EDMA_RING_BLKS);
499}
500
501EXPORT_SYMBOL(gxio_mpipe_config_edma_ring_blks);
502
503struct adjust_timestamp_freq_param {
504 int32_t ppb;
505};
506
507int gxio_mpipe_adjust_timestamp_freq(gxio_mpipe_context_t *context, int32_t ppb)
508{
509 struct adjust_timestamp_freq_param temp;
510 struct adjust_timestamp_freq_param *params = &temp;
511
512 params->ppb = ppb;
513
514 return hv_dev_pwrite(context->fd, 0, (HV_VirtAddr) params,
515 sizeof(*params),
516 GXIO_MPIPE_OP_ADJUST_TIMESTAMP_FREQ);
517}
518
519EXPORT_SYMBOL(gxio_mpipe_adjust_timestamp_freq);
520
457struct arm_pollfd_param { 521struct arm_pollfd_param {
458 union iorpc_pollfd pollfd; 522 union iorpc_pollfd pollfd;
459}; 523};
460 524
461int gxio_mpipe_arm_pollfd(gxio_mpipe_context_t * context, int pollfd_cookie) 525int gxio_mpipe_arm_pollfd(gxio_mpipe_context_t *context, int pollfd_cookie)
462{ 526{
463 struct arm_pollfd_param temp; 527 struct arm_pollfd_param temp;
464 struct arm_pollfd_param *params = &temp; 528 struct arm_pollfd_param *params = &temp;
@@ -475,7 +539,7 @@ struct close_pollfd_param {
475 union iorpc_pollfd pollfd; 539 union iorpc_pollfd pollfd;
476}; 540};
477 541
478int gxio_mpipe_close_pollfd(gxio_mpipe_context_t * context, int pollfd_cookie) 542int gxio_mpipe_close_pollfd(gxio_mpipe_context_t *context, int pollfd_cookie)
479{ 543{
480 struct close_pollfd_param temp; 544 struct close_pollfd_param temp;
481 struct close_pollfd_param *params = &temp; 545 struct close_pollfd_param *params = &temp;
@@ -492,7 +556,7 @@ struct get_mmio_base_param {
492 HV_PTE base; 556 HV_PTE base;
493}; 557};
494 558
495int gxio_mpipe_get_mmio_base(gxio_mpipe_context_t * context, HV_PTE *base) 559int gxio_mpipe_get_mmio_base(gxio_mpipe_context_t *context, HV_PTE *base)
496{ 560{
497 int __result; 561 int __result;
498 struct get_mmio_base_param temp; 562 struct get_mmio_base_param temp;
@@ -513,7 +577,7 @@ struct check_mmio_offset_param {
513 unsigned long size; 577 unsigned long size;
514}; 578};
515 579
516int gxio_mpipe_check_mmio_offset(gxio_mpipe_context_t * context, 580int gxio_mpipe_check_mmio_offset(gxio_mpipe_context_t *context,
517 unsigned long offset, unsigned long size) 581 unsigned long offset, unsigned long size)
518{ 582{
519 struct check_mmio_offset_param temp; 583 struct check_mmio_offset_param temp;
diff --git a/arch/tile/gxio/iorpc_mpipe_info.c b/arch/tile/gxio/iorpc_mpipe_info.c
index d0254aa60cba..77019c6e9b4a 100644
--- a/arch/tile/gxio/iorpc_mpipe_info.c
+++ b/arch/tile/gxio/iorpc_mpipe_info.c
@@ -15,16 +15,33 @@
15/* This file is machine-generated; DO NOT EDIT! */ 15/* This file is machine-generated; DO NOT EDIT! */
16#include "gxio/iorpc_mpipe_info.h" 16#include "gxio/iorpc_mpipe_info.h"
17 17
18struct instance_aux_param {
19 _gxio_mpipe_link_name_t name;
20};
21
22int gxio_mpipe_info_instance_aux(gxio_mpipe_info_context_t *context,
23 _gxio_mpipe_link_name_t name)
24{
25 struct instance_aux_param temp;
26 struct instance_aux_param *params = &temp;
27
28 params->name = name;
29
30 return hv_dev_pwrite(context->fd, 0, (HV_VirtAddr) params,
31 sizeof(*params), GXIO_MPIPE_INFO_OP_INSTANCE_AUX);
32}
33
34EXPORT_SYMBOL(gxio_mpipe_info_instance_aux);
18 35
19struct enumerate_aux_param { 36struct enumerate_aux_param {
20 _gxio_mpipe_link_name_t name; 37 _gxio_mpipe_link_name_t name;
21 _gxio_mpipe_link_mac_t mac; 38 _gxio_mpipe_link_mac_t mac;
22}; 39};
23 40
24int gxio_mpipe_info_enumerate_aux(gxio_mpipe_info_context_t * context, 41int gxio_mpipe_info_enumerate_aux(gxio_mpipe_info_context_t *context,
25 unsigned int idx, 42 unsigned int idx,
26 _gxio_mpipe_link_name_t * name, 43 _gxio_mpipe_link_name_t *name,
27 _gxio_mpipe_link_mac_t * mac) 44 _gxio_mpipe_link_mac_t *mac)
28{ 45{
29 int __result; 46 int __result;
30 struct enumerate_aux_param temp; 47 struct enumerate_aux_param temp;
@@ -32,7 +49,7 @@ int gxio_mpipe_info_enumerate_aux(gxio_mpipe_info_context_t * context,
32 49
33 __result = 50 __result =
34 hv_dev_pread(context->fd, 0, (HV_VirtAddr) params, sizeof(*params), 51 hv_dev_pread(context->fd, 0, (HV_VirtAddr) params, sizeof(*params),
35 (((uint64_t) idx << 32) | 52 (((uint64_t)idx << 32) |
36 GXIO_MPIPE_INFO_OP_ENUMERATE_AUX)); 53 GXIO_MPIPE_INFO_OP_ENUMERATE_AUX));
37 *name = params->name; 54 *name = params->name;
38 *mac = params->mac; 55 *mac = params->mac;
@@ -46,7 +63,7 @@ struct get_mmio_base_param {
46 HV_PTE base; 63 HV_PTE base;
47}; 64};
48 65
49int gxio_mpipe_info_get_mmio_base(gxio_mpipe_info_context_t * context, 66int gxio_mpipe_info_get_mmio_base(gxio_mpipe_info_context_t *context,
50 HV_PTE *base) 67 HV_PTE *base)
51{ 68{
52 int __result; 69 int __result;
@@ -68,7 +85,7 @@ struct check_mmio_offset_param {
68 unsigned long size; 85 unsigned long size;
69}; 86};
70 87
71int gxio_mpipe_info_check_mmio_offset(gxio_mpipe_info_context_t * context, 88int gxio_mpipe_info_check_mmio_offset(gxio_mpipe_info_context_t *context,
72 unsigned long offset, unsigned long size) 89 unsigned long offset, unsigned long size)
73{ 90{
74 struct check_mmio_offset_param temp; 91 struct check_mmio_offset_param temp;
diff --git a/arch/tile/gxio/iorpc_trio.c b/arch/tile/gxio/iorpc_trio.c
index cef4b2209cda..1d3cedb9aeb4 100644
--- a/arch/tile/gxio/iorpc_trio.c
+++ b/arch/tile/gxio/iorpc_trio.c
@@ -21,7 +21,7 @@ struct alloc_asids_param {
21 unsigned int flags; 21 unsigned int flags;
22}; 22};
23 23
24int gxio_trio_alloc_asids(gxio_trio_context_t * context, unsigned int count, 24int gxio_trio_alloc_asids(gxio_trio_context_t *context, unsigned int count,
25 unsigned int first, unsigned int flags) 25 unsigned int first, unsigned int flags)
26{ 26{
27 struct alloc_asids_param temp; 27 struct alloc_asids_param temp;
@@ -44,7 +44,7 @@ struct alloc_memory_maps_param {
44 unsigned int flags; 44 unsigned int flags;
45}; 45};
46 46
47int gxio_trio_alloc_memory_maps(gxio_trio_context_t * context, 47int gxio_trio_alloc_memory_maps(gxio_trio_context_t *context,
48 unsigned int count, unsigned int first, 48 unsigned int count, unsigned int first,
49 unsigned int flags) 49 unsigned int flags)
50{ 50{
@@ -61,6 +61,29 @@ int gxio_trio_alloc_memory_maps(gxio_trio_context_t * context,
61 61
62EXPORT_SYMBOL(gxio_trio_alloc_memory_maps); 62EXPORT_SYMBOL(gxio_trio_alloc_memory_maps);
63 63
64struct alloc_scatter_queues_param {
65 unsigned int count;
66 unsigned int first;
67 unsigned int flags;
68};
69
70int gxio_trio_alloc_scatter_queues(gxio_trio_context_t *context,
71 unsigned int count, unsigned int first,
72 unsigned int flags)
73{
74 struct alloc_scatter_queues_param temp;
75 struct alloc_scatter_queues_param *params = &temp;
76
77 params->count = count;
78 params->first = first;
79 params->flags = flags;
80
81 return hv_dev_pwrite(context->fd, 0, (HV_VirtAddr) params,
82 sizeof(*params),
83 GXIO_TRIO_OP_ALLOC_SCATTER_QUEUES);
84}
85
86EXPORT_SYMBOL(gxio_trio_alloc_scatter_queues);
64 87
65struct alloc_pio_regions_param { 88struct alloc_pio_regions_param {
66 unsigned int count; 89 unsigned int count;
@@ -68,7 +91,7 @@ struct alloc_pio_regions_param {
68 unsigned int flags; 91 unsigned int flags;
69}; 92};
70 93
71int gxio_trio_alloc_pio_regions(gxio_trio_context_t * context, 94int gxio_trio_alloc_pio_regions(gxio_trio_context_t *context,
72 unsigned int count, unsigned int first, 95 unsigned int count, unsigned int first,
73 unsigned int flags) 96 unsigned int flags)
74{ 97{
@@ -92,7 +115,7 @@ struct init_pio_region_aux_param {
92 unsigned int flags; 115 unsigned int flags;
93}; 116};
94 117
95int gxio_trio_init_pio_region_aux(gxio_trio_context_t * context, 118int gxio_trio_init_pio_region_aux(gxio_trio_context_t *context,
96 unsigned int pio_region, unsigned int mac, 119 unsigned int pio_region, unsigned int mac,
97 uint32_t bus_address_hi, unsigned int flags) 120 uint32_t bus_address_hi, unsigned int flags)
98{ 121{
@@ -122,7 +145,7 @@ struct init_memory_map_mmu_aux_param {
122 unsigned int order_mode; 145 unsigned int order_mode;
123}; 146};
124 147
125int gxio_trio_init_memory_map_mmu_aux(gxio_trio_context_t * context, 148int gxio_trio_init_memory_map_mmu_aux(gxio_trio_context_t *context,
126 unsigned int map, unsigned long va, 149 unsigned int map, unsigned long va,
127 uint64_t size, unsigned int asid, 150 uint64_t size, unsigned int asid,
128 unsigned int mac, uint64_t bus_address, 151 unsigned int mac, uint64_t bus_address,
@@ -152,7 +175,7 @@ struct get_port_property_param {
152 struct pcie_trio_ports_property trio_ports; 175 struct pcie_trio_ports_property trio_ports;
153}; 176};
154 177
155int gxio_trio_get_port_property(gxio_trio_context_t * context, 178int gxio_trio_get_port_property(gxio_trio_context_t *context,
156 struct pcie_trio_ports_property *trio_ports) 179 struct pcie_trio_ports_property *trio_ports)
157{ 180{
158 int __result; 181 int __result;
@@ -175,7 +198,7 @@ struct config_legacy_intr_param {
175 unsigned int intx; 198 unsigned int intx;
176}; 199};
177 200
178int gxio_trio_config_legacy_intr(gxio_trio_context_t * context, int inter_x, 201int gxio_trio_config_legacy_intr(gxio_trio_context_t *context, int inter_x,
179 int inter_y, int inter_ipi, int inter_event, 202 int inter_y, int inter_ipi, int inter_event,
180 unsigned int mac, unsigned int intx) 203 unsigned int mac, unsigned int intx)
181{ 204{
@@ -204,7 +227,7 @@ struct config_msi_intr_param {
204 unsigned int asid; 227 unsigned int asid;
205}; 228};
206 229
207int gxio_trio_config_msi_intr(gxio_trio_context_t * context, int inter_x, 230int gxio_trio_config_msi_intr(gxio_trio_context_t *context, int inter_x,
208 int inter_y, int inter_ipi, int inter_event, 231 int inter_y, int inter_ipi, int inter_event,
209 unsigned int mac, unsigned int mem_map, 232 unsigned int mac, unsigned int mem_map,
210 uint64_t mem_map_base, uint64_t mem_map_limit, 233 uint64_t mem_map_base, uint64_t mem_map_limit,
@@ -236,7 +259,7 @@ struct set_mps_mrs_param {
236 unsigned int mac; 259 unsigned int mac;
237}; 260};
238 261
239int gxio_trio_set_mps_mrs(gxio_trio_context_t * context, uint16_t mps, 262int gxio_trio_set_mps_mrs(gxio_trio_context_t *context, uint16_t mps,
240 uint16_t mrs, unsigned int mac) 263 uint16_t mrs, unsigned int mac)
241{ 264{
242 struct set_mps_mrs_param temp; 265 struct set_mps_mrs_param temp;
@@ -256,7 +279,7 @@ struct force_rc_link_up_param {
256 unsigned int mac; 279 unsigned int mac;
257}; 280};
258 281
259int gxio_trio_force_rc_link_up(gxio_trio_context_t * context, unsigned int mac) 282int gxio_trio_force_rc_link_up(gxio_trio_context_t *context, unsigned int mac)
260{ 283{
261 struct force_rc_link_up_param temp; 284 struct force_rc_link_up_param temp;
262 struct force_rc_link_up_param *params = &temp; 285 struct force_rc_link_up_param *params = &temp;
@@ -273,7 +296,7 @@ struct force_ep_link_up_param {
273 unsigned int mac; 296 unsigned int mac;
274}; 297};
275 298
276int gxio_trio_force_ep_link_up(gxio_trio_context_t * context, unsigned int mac) 299int gxio_trio_force_ep_link_up(gxio_trio_context_t *context, unsigned int mac)
277{ 300{
278 struct force_ep_link_up_param temp; 301 struct force_ep_link_up_param temp;
279 struct force_ep_link_up_param *params = &temp; 302 struct force_ep_link_up_param *params = &temp;
@@ -290,7 +313,7 @@ struct get_mmio_base_param {
290 HV_PTE base; 313 HV_PTE base;
291}; 314};
292 315
293int gxio_trio_get_mmio_base(gxio_trio_context_t * context, HV_PTE *base) 316int gxio_trio_get_mmio_base(gxio_trio_context_t *context, HV_PTE *base)
294{ 317{
295 int __result; 318 int __result;
296 struct get_mmio_base_param temp; 319 struct get_mmio_base_param temp;
@@ -311,7 +334,7 @@ struct check_mmio_offset_param {
311 unsigned long size; 334 unsigned long size;
312}; 335};
313 336
314int gxio_trio_check_mmio_offset(gxio_trio_context_t * context, 337int gxio_trio_check_mmio_offset(gxio_trio_context_t *context,
315 unsigned long offset, unsigned long size) 338 unsigned long offset, unsigned long size)
316{ 339{
317 struct check_mmio_offset_param temp; 340 struct check_mmio_offset_param temp;
diff --git a/arch/tile/gxio/iorpc_uart.c b/arch/tile/gxio/iorpc_uart.c
new file mode 100644
index 000000000000..b9a6d6193d73
--- /dev/null
+++ b/arch/tile/gxio/iorpc_uart.c
@@ -0,0 +1,77 @@
1/*
2 * Copyright 2013 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15/* This file is machine-generated; DO NOT EDIT! */
16#include "gxio/iorpc_uart.h"
17
18struct cfg_interrupt_param {
19 union iorpc_interrupt interrupt;
20};
21
22int gxio_uart_cfg_interrupt(gxio_uart_context_t *context, int inter_x,
23 int inter_y, int inter_ipi, int inter_event)
24{
25 struct cfg_interrupt_param temp;
26 struct cfg_interrupt_param *params = &temp;
27
28 params->interrupt.kernel.x = inter_x;
29 params->interrupt.kernel.y = inter_y;
30 params->interrupt.kernel.ipi = inter_ipi;
31 params->interrupt.kernel.event = inter_event;
32
33 return hv_dev_pwrite(context->fd, 0, (HV_VirtAddr) params,
34 sizeof(*params), GXIO_UART_OP_CFG_INTERRUPT);
35}
36
37EXPORT_SYMBOL(gxio_uart_cfg_interrupt);
38
39struct get_mmio_base_param {
40 HV_PTE base;
41};
42
43int gxio_uart_get_mmio_base(gxio_uart_context_t *context, HV_PTE *base)
44{
45 int __result;
46 struct get_mmio_base_param temp;
47 struct get_mmio_base_param *params = &temp;
48
49 __result =
50 hv_dev_pread(context->fd, 0, (HV_VirtAddr) params, sizeof(*params),
51 GXIO_UART_OP_GET_MMIO_BASE);
52 *base = params->base;
53
54 return __result;
55}
56
57EXPORT_SYMBOL(gxio_uart_get_mmio_base);
58
59struct check_mmio_offset_param {
60 unsigned long offset;
61 unsigned long size;
62};
63
64int gxio_uart_check_mmio_offset(gxio_uart_context_t *context,
65 unsigned long offset, unsigned long size)
66{
67 struct check_mmio_offset_param temp;
68 struct check_mmio_offset_param *params = &temp;
69
70 params->offset = offset;
71 params->size = size;
72
73 return hv_dev_pwrite(context->fd, 0, (HV_VirtAddr) params,
74 sizeof(*params), GXIO_UART_OP_CHECK_MMIO_OFFSET);
75}
76
77EXPORT_SYMBOL(gxio_uart_check_mmio_offset);
diff --git a/arch/tile/gxio/iorpc_usb_host.c b/arch/tile/gxio/iorpc_usb_host.c
index cf3c3cc12204..9c820073bfc0 100644
--- a/arch/tile/gxio/iorpc_usb_host.c
+++ b/arch/tile/gxio/iorpc_usb_host.c
@@ -19,7 +19,7 @@ struct cfg_interrupt_param {
19 union iorpc_interrupt interrupt; 19 union iorpc_interrupt interrupt;
20}; 20};
21 21
22int gxio_usb_host_cfg_interrupt(gxio_usb_host_context_t * context, int inter_x, 22int gxio_usb_host_cfg_interrupt(gxio_usb_host_context_t *context, int inter_x,
23 int inter_y, int inter_ipi, int inter_event) 23 int inter_y, int inter_ipi, int inter_event)
24{ 24{
25 struct cfg_interrupt_param temp; 25 struct cfg_interrupt_param temp;
@@ -41,7 +41,7 @@ struct register_client_memory_param {
41 unsigned int flags; 41 unsigned int flags;
42}; 42};
43 43
44int gxio_usb_host_register_client_memory(gxio_usb_host_context_t * context, 44int gxio_usb_host_register_client_memory(gxio_usb_host_context_t *context,
45 HV_PTE pte, unsigned int flags) 45 HV_PTE pte, unsigned int flags)
46{ 46{
47 struct register_client_memory_param temp; 47 struct register_client_memory_param temp;
@@ -61,7 +61,7 @@ struct get_mmio_base_param {
61 HV_PTE base; 61 HV_PTE base;
62}; 62};
63 63
64int gxio_usb_host_get_mmio_base(gxio_usb_host_context_t * context, HV_PTE *base) 64int gxio_usb_host_get_mmio_base(gxio_usb_host_context_t *context, HV_PTE *base)
65{ 65{
66 int __result; 66 int __result;
67 struct get_mmio_base_param temp; 67 struct get_mmio_base_param temp;
@@ -82,7 +82,7 @@ struct check_mmio_offset_param {
82 unsigned long size; 82 unsigned long size;
83}; 83};
84 84
85int gxio_usb_host_check_mmio_offset(gxio_usb_host_context_t * context, 85int gxio_usb_host_check_mmio_offset(gxio_usb_host_context_t *context,
86 unsigned long offset, unsigned long size) 86 unsigned long offset, unsigned long size)
87{ 87{
88 struct check_mmio_offset_param temp; 88 struct check_mmio_offset_param temp;
diff --git a/arch/tile/gxio/mpipe.c b/arch/tile/gxio/mpipe.c
index e71c63390acc..5301a9ffbae1 100644
--- a/arch/tile/gxio/mpipe.c
+++ b/arch/tile/gxio/mpipe.c
@@ -36,8 +36,14 @@ int gxio_mpipe_init(gxio_mpipe_context_t *context, unsigned int mpipe_index)
36 int fd; 36 int fd;
37 int i; 37 int i;
38 38
39 if (mpipe_index >= GXIO_MPIPE_INSTANCE_MAX)
40 return -EINVAL;
41
39 snprintf(file, sizeof(file), "mpipe/%d/iorpc", mpipe_index); 42 snprintf(file, sizeof(file), "mpipe/%d/iorpc", mpipe_index);
40 fd = hv_dev_open((HV_VirtAddr) file, 0); 43 fd = hv_dev_open((HV_VirtAddr) file, 0);
44
45 context->fd = fd;
46
41 if (fd < 0) { 47 if (fd < 0) {
42 if (fd >= GXIO_ERR_MIN && fd <= GXIO_ERR_MAX) 48 if (fd >= GXIO_ERR_MIN && fd <= GXIO_ERR_MAX)
43 return fd; 49 return fd;
@@ -45,8 +51,6 @@ int gxio_mpipe_init(gxio_mpipe_context_t *context, unsigned int mpipe_index)
45 return -ENODEV; 51 return -ENODEV;
46 } 52 }
47 53
48 context->fd = fd;
49
50 /* Map in the MMIO space. */ 54 /* Map in the MMIO space. */
51 context->mmio_cfg_base = (void __force *) 55 context->mmio_cfg_base = (void __force *)
52 iorpc_ioremap(fd, HV_MPIPE_CONFIG_MMIO_OFFSET, 56 iorpc_ioremap(fd, HV_MPIPE_CONFIG_MMIO_OFFSET,
@@ -64,12 +68,15 @@ int gxio_mpipe_init(gxio_mpipe_context_t *context, unsigned int mpipe_index)
64 for (i = 0; i < 8; i++) 68 for (i = 0; i < 8; i++)
65 context->__stacks.stacks[i] = 255; 69 context->__stacks.stacks[i] = 255;
66 70
71 context->instance = mpipe_index;
72
67 return 0; 73 return 0;
68 74
69 fast_failed: 75 fast_failed:
70 iounmap((void __force __iomem *)(context->mmio_cfg_base)); 76 iounmap((void __force __iomem *)(context->mmio_cfg_base));
71 cfg_failed: 77 cfg_failed:
72 hv_dev_close(context->fd); 78 hv_dev_close(context->fd);
79 context->fd = -1;
73 return -ENODEV; 80 return -ENODEV;
74} 81}
75 82
@@ -383,7 +390,7 @@ EXPORT_SYMBOL_GPL(gxio_mpipe_iqueue_init);
383 390
384int gxio_mpipe_equeue_init(gxio_mpipe_equeue_t *equeue, 391int gxio_mpipe_equeue_init(gxio_mpipe_equeue_t *equeue,
385 gxio_mpipe_context_t *context, 392 gxio_mpipe_context_t *context,
386 unsigned int edma_ring_id, 393 unsigned int ering,
387 unsigned int channel, 394 unsigned int channel,
388 void *mem, unsigned int mem_size, 395 void *mem, unsigned int mem_size,
389 unsigned int mem_flags) 396 unsigned int mem_flags)
@@ -394,7 +401,7 @@ int gxio_mpipe_equeue_init(gxio_mpipe_equeue_t *equeue,
394 /* Offset used to read number of completed commands. */ 401 /* Offset used to read number of completed commands. */
395 MPIPE_EDMA_POST_REGION_ADDR_t offset; 402 MPIPE_EDMA_POST_REGION_ADDR_t offset;
396 403
397 int result = gxio_mpipe_init_edma_ring(context, edma_ring_id, channel, 404 int result = gxio_mpipe_init_edma_ring(context, ering, channel,
398 mem, mem_size, mem_flags); 405 mem, mem_size, mem_flags);
399 if (result < 0) 406 if (result < 0)
400 return result; 407 return result;
@@ -405,7 +412,7 @@ int gxio_mpipe_equeue_init(gxio_mpipe_equeue_t *equeue,
405 offset.region = 412 offset.region =
406 MPIPE_MMIO_ADDR__REGION_VAL_EDMA - 413 MPIPE_MMIO_ADDR__REGION_VAL_EDMA -
407 MPIPE_MMIO_ADDR__REGION_VAL_IDMA; 414 MPIPE_MMIO_ADDR__REGION_VAL_IDMA;
408 offset.ring = edma_ring_id; 415 offset.ring = ering;
409 416
410 __gxio_dma_queue_init(&equeue->dma_queue, 417 __gxio_dma_queue_init(&equeue->dma_queue,
411 context->mmio_fast_base + offset.word, 418 context->mmio_fast_base + offset.word,
@@ -413,6 +420,9 @@ int gxio_mpipe_equeue_init(gxio_mpipe_equeue_t *equeue,
413 equeue->edescs = mem; 420 equeue->edescs = mem;
414 equeue->mask_num_entries = num_entries - 1; 421 equeue->mask_num_entries = num_entries - 1;
415 equeue->log2_num_entries = __builtin_ctz(num_entries); 422 equeue->log2_num_entries = __builtin_ctz(num_entries);
423 equeue->context = context;
424 equeue->ering = ering;
425 equeue->channel = channel;
416 426
417 return 0; 427 return 0;
418} 428}
@@ -493,6 +503,20 @@ static gxio_mpipe_context_t *_gxio_get_link_context(void)
493 return contextp; 503 return contextp;
494} 504}
495 505
506int gxio_mpipe_link_instance(const char *link_name)
507{
508 _gxio_mpipe_link_name_t name;
509 gxio_mpipe_context_t *context = _gxio_get_link_context();
510
511 if (!context)
512 return GXIO_ERR_NO_DEVICE;
513
514 strncpy(name.name, link_name, sizeof(name.name));
515 name.name[GXIO_MPIPE_LINK_NAME_LEN - 1] = '\0';
516
517 return gxio_mpipe_info_instance_aux(context, name);
518}
519
496int gxio_mpipe_link_enumerate_mac(int idx, char *link_name, uint8_t *link_mac) 520int gxio_mpipe_link_enumerate_mac(int idx, char *link_name, uint8_t *link_mac)
497{ 521{
498 int rv; 522 int rv;
@@ -543,3 +567,12 @@ int gxio_mpipe_link_close(gxio_mpipe_link_t *link)
543} 567}
544 568
545EXPORT_SYMBOL_GPL(gxio_mpipe_link_close); 569EXPORT_SYMBOL_GPL(gxio_mpipe_link_close);
570
571int gxio_mpipe_link_set_attr(gxio_mpipe_link_t *link, uint32_t attr,
572 int64_t val)
573{
574 return gxio_mpipe_link_set_attr_aux(link->context, link->mac, attr,
575 val);
576}
577
578EXPORT_SYMBOL_GPL(gxio_mpipe_link_set_attr);
diff --git a/arch/tile/gxio/uart.c b/arch/tile/gxio/uart.c
new file mode 100644
index 000000000000..ba585175ef88
--- /dev/null
+++ b/arch/tile/gxio/uart.c
@@ -0,0 +1,87 @@
1/*
2 * Copyright 2013 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15/*
16 * Implementation of UART gxio calls.
17 */
18
19#include <linux/io.h>
20#include <linux/errno.h>
21#include <linux/module.h>
22
23#include <gxio/uart.h>
24#include <gxio/iorpc_globals.h>
25#include <gxio/iorpc_uart.h>
26#include <gxio/kiorpc.h>
27
28int gxio_uart_init(gxio_uart_context_t *context, int uart_index)
29{
30 char file[32];
31 int fd;
32
33 snprintf(file, sizeof(file), "uart/%d/iorpc", uart_index);
34 fd = hv_dev_open((HV_VirtAddr) file, 0);
35 if (fd < 0) {
36 if (fd >= GXIO_ERR_MIN && fd <= GXIO_ERR_MAX)
37 return fd;
38 else
39 return -ENODEV;
40 }
41
42 context->fd = fd;
43
44 /* Map in the MMIO space. */
45 context->mmio_base = (void __force *)
46 iorpc_ioremap(fd, HV_UART_MMIO_OFFSET, HV_UART_MMIO_SIZE);
47
48 if (context->mmio_base == NULL) {
49 hv_dev_close(context->fd);
50 context->fd = -1;
51 return -ENODEV;
52 }
53
54 return 0;
55}
56
57EXPORT_SYMBOL_GPL(gxio_uart_init);
58
59int gxio_uart_destroy(gxio_uart_context_t *context)
60{
61 iounmap((void __force __iomem *)(context->mmio_base));
62 hv_dev_close(context->fd);
63
64 context->mmio_base = NULL;
65 context->fd = -1;
66
67 return 0;
68}
69
70EXPORT_SYMBOL_GPL(gxio_uart_destroy);
71
72/* UART register write wrapper. */
73void gxio_uart_write(gxio_uart_context_t *context, uint64_t offset,
74 uint64_t word)
75{
76 __gxio_mmio_write(context->mmio_base + offset, word);
77}
78
79EXPORT_SYMBOL_GPL(gxio_uart_write);
80
81/* UART register read wrapper. */
82uint64_t gxio_uart_read(gxio_uart_context_t *context, uint64_t offset)
83{
84 return __gxio_mmio_read(context->mmio_base + offset);
85}
86
87EXPORT_SYMBOL_GPL(gxio_uart_read);
diff --git a/arch/tile/gxio/usb_host.c b/arch/tile/gxio/usb_host.c
index 66b002f54ecc..785afad7922e 100644
--- a/arch/tile/gxio/usb_host.c
+++ b/arch/tile/gxio/usb_host.c
@@ -26,7 +26,7 @@
26#include <gxio/kiorpc.h> 26#include <gxio/kiorpc.h>
27#include <gxio/usb_host.h> 27#include <gxio/usb_host.h>
28 28
29int gxio_usb_host_init(gxio_usb_host_context_t * context, int usb_index, 29int gxio_usb_host_init(gxio_usb_host_context_t *context, int usb_index,
30 int is_ehci) 30 int is_ehci)
31{ 31{
32 char file[32]; 32 char file[32];
@@ -63,7 +63,7 @@ int gxio_usb_host_init(gxio_usb_host_context_t * context, int usb_index,
63 63
64EXPORT_SYMBOL_GPL(gxio_usb_host_init); 64EXPORT_SYMBOL_GPL(gxio_usb_host_init);
65 65
66int gxio_usb_host_destroy(gxio_usb_host_context_t * context) 66int gxio_usb_host_destroy(gxio_usb_host_context_t *context)
67{ 67{
68 iounmap((void __force __iomem *)(context->mmio_base)); 68 iounmap((void __force __iomem *)(context->mmio_base));
69 hv_dev_close(context->fd); 69 hv_dev_close(context->fd);
@@ -76,14 +76,14 @@ int gxio_usb_host_destroy(gxio_usb_host_context_t * context)
76 76
77EXPORT_SYMBOL_GPL(gxio_usb_host_destroy); 77EXPORT_SYMBOL_GPL(gxio_usb_host_destroy);
78 78
79void *gxio_usb_host_get_reg_start(gxio_usb_host_context_t * context) 79void *gxio_usb_host_get_reg_start(gxio_usb_host_context_t *context)
80{ 80{
81 return context->mmio_base; 81 return context->mmio_base;
82} 82}
83 83
84EXPORT_SYMBOL_GPL(gxio_usb_host_get_reg_start); 84EXPORT_SYMBOL_GPL(gxio_usb_host_get_reg_start);
85 85
86size_t gxio_usb_host_get_reg_len(gxio_usb_host_context_t * context) 86size_t gxio_usb_host_get_reg_len(gxio_usb_host_context_t *context)
87{ 87{
88 return HV_USB_HOST_MMIO_SIZE; 88 return HV_USB_HOST_MMIO_SIZE;
89} 89}
diff --git a/arch/tile/include/arch/mpipe.h b/arch/tile/include/arch/mpipe.h
index 8a33912fd6cc..904538e754d8 100644
--- a/arch/tile/include/arch/mpipe.h
+++ b/arch/tile/include/arch/mpipe.h
@@ -176,7 +176,18 @@ typedef union
176 */ 176 */
177 uint_reg_t stack_idx : 5; 177 uint_reg_t stack_idx : 5;
178 /* Reserved. */ 178 /* Reserved. */
179 uint_reg_t __reserved_2 : 5; 179 uint_reg_t __reserved_2 : 3;
180 /*
181 * Instance ID. For devices that support automatic buffer return between
182 * mPIPE instances, this field indicates the buffer owner. If the INST
183 * field does not match the mPIPE's instance number when a packet is
184 * egressed, buffers with HWB set will be returned to the other mPIPE
185 * instance. Note that not all devices support multi-mPIPE buffer
186 * return. The MPIPE_EDMA_INFO.REMOTE_BUFF_RTN_SUPPORT bit indicates
187 * whether the INST field in the buffer descriptor is populated by iDMA
188 * hardware. This field is ignored on writes.
189 */
190 uint_reg_t inst : 2;
180 /* 191 /*
181 * Reads as one to indicate that this is a hardware managed buffer. 192 * Reads as one to indicate that this is a hardware managed buffer.
182 * Ignored on writes since all buffers on a given stack are the same size. 193 * Ignored on writes since all buffers on a given stack are the same size.
@@ -205,7 +216,8 @@ typedef union
205 uint_reg_t c : 2; 216 uint_reg_t c : 2;
206 uint_reg_t size : 3; 217 uint_reg_t size : 3;
207 uint_reg_t hwb : 1; 218 uint_reg_t hwb : 1;
208 uint_reg_t __reserved_2 : 5; 219 uint_reg_t inst : 2;
220 uint_reg_t __reserved_2 : 3;
209 uint_reg_t stack_idx : 5; 221 uint_reg_t stack_idx : 5;
210 uint_reg_t __reserved_1 : 6; 222 uint_reg_t __reserved_1 : 6;
211 int_reg_t va : 35; 223 int_reg_t va : 35;
@@ -231,9 +243,9 @@ typedef union
231 /* Reserved. */ 243 /* Reserved. */
232 uint_reg_t __reserved_0 : 3; 244 uint_reg_t __reserved_0 : 3;
233 /* eDMA ring being accessed */ 245 /* eDMA ring being accessed */
234 uint_reg_t ring : 5; 246 uint_reg_t ring : 6;
235 /* Reserved. */ 247 /* Reserved. */
236 uint_reg_t __reserved_1 : 18; 248 uint_reg_t __reserved_1 : 17;
237 /* 249 /*
238 * This field of the address selects the region (address space) to be 250 * This field of the address selects the region (address space) to be
239 * accessed. For the egress DMA post region, this field must be 5. 251 * accessed. For the egress DMA post region, this field must be 5.
@@ -250,8 +262,8 @@ typedef union
250 uint_reg_t svc_dom : 5; 262 uint_reg_t svc_dom : 5;
251 uint_reg_t __reserved_2 : 6; 263 uint_reg_t __reserved_2 : 6;
252 uint_reg_t region : 3; 264 uint_reg_t region : 3;
253 uint_reg_t __reserved_1 : 18; 265 uint_reg_t __reserved_1 : 17;
254 uint_reg_t ring : 5; 266 uint_reg_t ring : 6;
255 uint_reg_t __reserved_0 : 3; 267 uint_reg_t __reserved_0 : 3;
256#endif 268#endif
257 }; 269 };
diff --git a/arch/tile/include/arch/mpipe_constants.h b/arch/tile/include/arch/mpipe_constants.h
index 410a0400e055..84022ac5fe82 100644
--- a/arch/tile/include/arch/mpipe_constants.h
+++ b/arch/tile/include/arch/mpipe_constants.h
@@ -16,13 +16,13 @@
16#ifndef __ARCH_MPIPE_CONSTANTS_H__ 16#ifndef __ARCH_MPIPE_CONSTANTS_H__
17#define __ARCH_MPIPE_CONSTANTS_H__ 17#define __ARCH_MPIPE_CONSTANTS_H__
18 18
19#define MPIPE_NUM_CLASSIFIERS 10 19#define MPIPE_NUM_CLASSIFIERS 16
20#define MPIPE_CLS_MHZ 1200 20#define MPIPE_CLS_MHZ 1200
21 21
22#define MPIPE_NUM_EDMA_RINGS 32 22#define MPIPE_NUM_EDMA_RINGS 64
23 23
24#define MPIPE_NUM_SGMII_MACS 16 24#define MPIPE_NUM_SGMII_MACS 16
25#define MPIPE_NUM_XAUI_MACS 4 25#define MPIPE_NUM_XAUI_MACS 16
26#define MPIPE_NUM_LOOPBACK_CHANNELS 4 26#define MPIPE_NUM_LOOPBACK_CHANNELS 4
27#define MPIPE_NUM_NON_LB_CHANNELS 28 27#define MPIPE_NUM_NON_LB_CHANNELS 28
28 28
diff --git a/arch/tile/include/arch/mpipe_shm.h b/arch/tile/include/arch/mpipe_shm.h
index f2e9e122818d..13b3c4300e50 100644
--- a/arch/tile/include/arch/mpipe_shm.h
+++ b/arch/tile/include/arch/mpipe_shm.h
@@ -44,8 +44,14 @@ typedef union
44 * descriptors toggles each time the ring tail pointer wraps. 44 * descriptors toggles each time the ring tail pointer wraps.
45 */ 45 */
46 uint_reg_t gen : 1; 46 uint_reg_t gen : 1;
47 /**
48 * For devices with EDMA reorder support, this field allows the
49 * descriptor to select the egress FIFO. The associated DMA ring must
50 * have ALLOW_EFIFO_SEL enabled.
51 */
52 uint_reg_t efifo_sel : 6;
47 /** Reserved. Must be zero. */ 53 /** Reserved. Must be zero. */
48 uint_reg_t r0 : 7; 54 uint_reg_t r0 : 1;
49 /** Checksum generation enabled for this transfer. */ 55 /** Checksum generation enabled for this transfer. */
50 uint_reg_t csum : 1; 56 uint_reg_t csum : 1;
51 /** 57 /**
@@ -110,7 +116,8 @@ typedef union
110 uint_reg_t notif : 1; 116 uint_reg_t notif : 1;
111 uint_reg_t ns : 1; 117 uint_reg_t ns : 1;
112 uint_reg_t csum : 1; 118 uint_reg_t csum : 1;
113 uint_reg_t r0 : 7; 119 uint_reg_t r0 : 1;
120 uint_reg_t efifo_sel : 6;
114 uint_reg_t gen : 1; 121 uint_reg_t gen : 1;
115#endif 122#endif
116 123
@@ -126,14 +133,16 @@ typedef union
126 /** Reserved. */ 133 /** Reserved. */
127 uint_reg_t __reserved_1 : 3; 134 uint_reg_t __reserved_1 : 3;
128 /** 135 /**
129 * Instance ID. For devices that support more than one mPIPE instance, 136 * Instance ID. For devices that support automatic buffer return between
130 * this field indicates the buffer owner. If the INST field does not 137 * mPIPE instances, this field indicates the buffer owner. If the INST
131 * match the mPIPE's instance number when a packet is egressed, buffers 138 * field does not match the mPIPE's instance number when a packet is
132 * with HWB set will be returned to the other mPIPE instance. 139 * egressed, buffers with HWB set will be returned to the other mPIPE
140 * instance. Note that not all devices support multi-mPIPE buffer
141 * return. The MPIPE_EDMA_INFO.REMOTE_BUFF_RTN_SUPPORT bit indicates
142 * whether the INST field in the buffer descriptor is populated by iDMA
143 * hardware.
133 */ 144 */
134 uint_reg_t inst : 1; 145 uint_reg_t inst : 2;
135 /** Reserved. */
136 uint_reg_t __reserved_2 : 1;
137 /** 146 /**
138 * Always set to one by hardware in iDMA packet descriptors. For eDMA, 147 * Always set to one by hardware in iDMA packet descriptors. For eDMA,
139 * indicates whether the buffer will be released to the buffer stack 148 * indicates whether the buffer will be released to the buffer stack
@@ -166,8 +175,7 @@ typedef union
166 uint_reg_t c : 2; 175 uint_reg_t c : 2;
167 uint_reg_t size : 3; 176 uint_reg_t size : 3;
168 uint_reg_t hwb : 1; 177 uint_reg_t hwb : 1;
169 uint_reg_t __reserved_2 : 1; 178 uint_reg_t inst : 2;
170 uint_reg_t inst : 1;
171 uint_reg_t __reserved_1 : 3; 179 uint_reg_t __reserved_1 : 3;
172 uint_reg_t stack_idx : 5; 180 uint_reg_t stack_idx : 5;
173 uint_reg_t __reserved_0 : 6; 181 uint_reg_t __reserved_0 : 6;
@@ -408,7 +416,10 @@ typedef union
408 /** 416 /**
409 * Sequence number applied when packet is distributed. Classifier 417 * Sequence number applied when packet is distributed. Classifier
410 * selects which sequence number is to be applied by writing the 13-bit 418 * selects which sequence number is to be applied by writing the 13-bit
411 * SQN-selector into this field. 419 * SQN-selector into this field. For devices that support EXT_SQN (as
420 * indicated in IDMA_INFO.EXT_SQN_SUPPORT), the GP_SQN can be extended to
421 * 32-bits via the IDMA_CTL.EXT_SQN register. In this case the
422 * PACKET_SQN will be reduced to 32 bits.
412 */ 423 */
413 uint_reg_t gp_sqn : 16; 424 uint_reg_t gp_sqn : 16;
414 /** 425 /**
@@ -451,14 +462,16 @@ typedef union
451 /** Reserved. */ 462 /** Reserved. */
452 uint_reg_t __reserved_5 : 3; 463 uint_reg_t __reserved_5 : 3;
453 /** 464 /**
454 * Instance ID. For devices that support more than one mPIPE instance, 465 * Instance ID. For devices that support automatic buffer return between
455 * this field indicates the buffer owner. If the INST field does not 466 * mPIPE instances, this field indicates the buffer owner. If the INST
456 * match the mPIPE's instance number when a packet is egressed, buffers 467 * field does not match the mPIPE's instance number when a packet is
457 * with HWB set will be returned to the other mPIPE instance. 468 * egressed, buffers with HWB set will be returned to the other mPIPE
469 * instance. Note that not all devices support multi-mPIPE buffer
470 * return. The MPIPE_EDMA_INFO.REMOTE_BUFF_RTN_SUPPORT bit indicates
471 * whether the INST field in the buffer descriptor is populated by iDMA
472 * hardware.
458 */ 473 */
459 uint_reg_t inst : 1; 474 uint_reg_t inst : 2;
460 /** Reserved. */
461 uint_reg_t __reserved_6 : 1;
462 /** 475 /**
463 * Always set to one by hardware in iDMA packet descriptors. For eDMA, 476 * Always set to one by hardware in iDMA packet descriptors. For eDMA,
464 * indicates whether the buffer will be released to the buffer stack 477 * indicates whether the buffer will be released to the buffer stack
@@ -491,8 +504,7 @@ typedef union
491 uint_reg_t c : 2; 504 uint_reg_t c : 2;
492 uint_reg_t size : 3; 505 uint_reg_t size : 3;
493 uint_reg_t hwb : 1; 506 uint_reg_t hwb : 1;
494 uint_reg_t __reserved_6 : 1; 507 uint_reg_t inst : 2;
495 uint_reg_t inst : 1;
496 uint_reg_t __reserved_5 : 3; 508 uint_reg_t __reserved_5 : 3;
497 uint_reg_t stack_idx : 5; 509 uint_reg_t stack_idx : 5;
498 uint_reg_t __reserved_4 : 6; 510 uint_reg_t __reserved_4 : 6;
diff --git a/arch/tile/include/arch/trio.h b/arch/tile/include/arch/trio.h
index d3000a871a21..c0ddedcae085 100644
--- a/arch/tile/include/arch/trio.h
+++ b/arch/tile/include/arch/trio.h
@@ -23,6 +23,45 @@
23#ifndef __ASSEMBLER__ 23#ifndef __ASSEMBLER__
24 24
25/* 25/*
26 * Map SQ Doorbell Format.
27 * This describes the format of the write-only doorbell register that exists
28 * in the last 8-bytes of the MAP_SQ_BASE/LIM range. This register is only
29 * writable from PCIe space. Writes to this register will not be written to
30 * Tile memory space and thus no IO VA translation is required if the last
31 * page of the BASE/LIM range is not otherwise written.
32 */
33
34__extension__
35typedef union
36{
37 struct
38 {
39#ifndef __BIG_ENDIAN__
40 /*
41 * When written with a 1, the associated MAP_SQ region's doorbell
42 * interrupt will be triggered once all previous writes are visible to
43 * Tile software.
44 */
45 uint_reg_t doorbell : 1;
46 /*
47 * When written with a 1, the descriptor at the head of the associated
48 * MAP_SQ's FIFO will be dequeued.
49 */
50 uint_reg_t pop : 1;
51 /* Reserved. */
52 uint_reg_t __reserved : 62;
53#else /* __BIG_ENDIAN__ */
54 uint_reg_t __reserved : 62;
55 uint_reg_t pop : 1;
56 uint_reg_t doorbell : 1;
57#endif
58 };
59
60 uint_reg_t word;
61} TRIO_MAP_SQ_DOORBELL_FMT_t;
62
63
64/*
26 * Tile PIO Region Configuration - CFG Address Format. 65 * Tile PIO Region Configuration - CFG Address Format.
27 * This register describes the address format for PIO accesses when the 66 * This register describes the address format for PIO accesses when the
28 * associated region is setup with TYPE=CFG. 67 * associated region is setup with TYPE=CFG.
diff --git a/arch/tile/include/arch/trio_constants.h b/arch/tile/include/arch/trio_constants.h
index 628b045436b8..85647e91a458 100644
--- a/arch/tile/include/arch/trio_constants.h
+++ b/arch/tile/include/arch/trio_constants.h
@@ -16,21 +16,21 @@
16#ifndef __ARCH_TRIO_CONSTANTS_H__ 16#ifndef __ARCH_TRIO_CONSTANTS_H__
17#define __ARCH_TRIO_CONSTANTS_H__ 17#define __ARCH_TRIO_CONSTANTS_H__
18 18
19#define TRIO_NUM_ASIDS 16 19#define TRIO_NUM_ASIDS 32
20#define TRIO_NUM_TLBS_PER_ASID 16 20#define TRIO_NUM_TLBS_PER_ASID 16
21 21
22#define TRIO_NUM_TPIO_REGIONS 8 22#define TRIO_NUM_TPIO_REGIONS 8
23#define TRIO_LOG2_NUM_TPIO_REGIONS 3 23#define TRIO_LOG2_NUM_TPIO_REGIONS 3
24 24
25#define TRIO_NUM_MAP_MEM_REGIONS 16 25#define TRIO_NUM_MAP_MEM_REGIONS 32
26#define TRIO_LOG2_NUM_MAP_MEM_REGIONS 4 26#define TRIO_LOG2_NUM_MAP_MEM_REGIONS 5
27#define TRIO_NUM_MAP_SQ_REGIONS 8 27#define TRIO_NUM_MAP_SQ_REGIONS 8
28#define TRIO_LOG2_NUM_MAP_SQ_REGIONS 3 28#define TRIO_LOG2_NUM_MAP_SQ_REGIONS 3
29 29
30#define TRIO_LOG2_NUM_SQ_FIFO_ENTRIES 6 30#define TRIO_LOG2_NUM_SQ_FIFO_ENTRIES 6
31 31
32#define TRIO_NUM_PUSH_DMA_RINGS 32 32#define TRIO_NUM_PUSH_DMA_RINGS 64
33 33
34#define TRIO_NUM_PULL_DMA_RINGS 32 34#define TRIO_NUM_PULL_DMA_RINGS 64
35 35
36#endif /* __ARCH_TRIO_CONSTANTS_H__ */ 36#endif /* __ARCH_TRIO_CONSTANTS_H__ */
diff --git a/arch/tile/include/arch/uart.h b/arch/tile/include/arch/uart.h
new file mode 100644
index 000000000000..07966970adad
--- /dev/null
+++ b/arch/tile/include/arch/uart.h
@@ -0,0 +1,300 @@
1/*
2 * Copyright 2013 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15/* Machine-generated file; do not edit. */
16
17#ifndef __ARCH_UART_H__
18#define __ARCH_UART_H__
19
20#include <arch/abi.h>
21#include <arch/uart_def.h>
22
23#ifndef __ASSEMBLER__
24
25/* Divisor. */
26
27__extension__
28typedef union
29{
30 struct
31 {
32#ifndef __BIG_ENDIAN__
33 /*
34 * Baud Rate Divisor. Desired_baud_rate = REF_CLK frequency / (baud *
35 * 16).
36 * Note: REF_CLK is always 125 MHz, the default
37 * divisor = 68, baud rate = 125M/(68*16) = 115200 baud.
38 */
39 uint_reg_t divisor : 12;
40 /* Reserved. */
41 uint_reg_t __reserved : 52;
42#else /* __BIG_ENDIAN__ */
43 uint_reg_t __reserved : 52;
44 uint_reg_t divisor : 12;
45#endif
46 };
47
48 uint_reg_t word;
49} UART_DIVISOR_t;
50
51/* FIFO Count. */
52
53__extension__
54typedef union
55{
56 struct
57 {
58#ifndef __BIG_ENDIAN__
59 /*
60 * n: n active entries in the receive FIFO (max is 2**8). Each entry has
61 * 8 bits.
62 * 0: no active entry in the receive FIFO (that is empty).
63 */
64 uint_reg_t rfifo_count : 9;
65 /* Reserved. */
66 uint_reg_t __reserved_0 : 7;
67 /*
68 * n: n active entries in the transmit FIFO (max is 2**8). Each entry has
69 * 8 bits.
70 * 0: no active entry in the transmit FIFO (that is empty).
71 */
72 uint_reg_t tfifo_count : 9;
73 /* Reserved. */
74 uint_reg_t __reserved_1 : 7;
75 /*
76 * n: n active entries in the write FIFO (max is 2**2). Each entry has 8
77 * bits.
78 * 0: no active entry in the write FIFO (that is empty).
79 */
80 uint_reg_t wfifo_count : 3;
81 /* Reserved. */
82 uint_reg_t __reserved_2 : 29;
83#else /* __BIG_ENDIAN__ */
84 uint_reg_t __reserved_2 : 29;
85 uint_reg_t wfifo_count : 3;
86 uint_reg_t __reserved_1 : 7;
87 uint_reg_t tfifo_count : 9;
88 uint_reg_t __reserved_0 : 7;
89 uint_reg_t rfifo_count : 9;
90#endif
91 };
92
93 uint_reg_t word;
94} UART_FIFO_COUNT_t;
95
96/* FLAG. */
97
98__extension__
99typedef union
100{
101 struct
102 {
103#ifndef __BIG_ENDIAN__
104 /* Reserved. */
105 uint_reg_t __reserved_0 : 1;
106 /* 1: receive FIFO is empty */
107 uint_reg_t rfifo_empty : 1;
108 /* 1: write FIFO is empty. */
109 uint_reg_t wfifo_empty : 1;
110 /* 1: transmit FIFO is empty. */
111 uint_reg_t tfifo_empty : 1;
112 /* 1: receive FIFO is full. */
113 uint_reg_t rfifo_full : 1;
114 /* 1: write FIFO is full. */
115 uint_reg_t wfifo_full : 1;
116 /* 1: transmit FIFO is full. */
117 uint_reg_t tfifo_full : 1;
118 /* Reserved. */
119 uint_reg_t __reserved_1 : 57;
120#else /* __BIG_ENDIAN__ */
121 uint_reg_t __reserved_1 : 57;
122 uint_reg_t tfifo_full : 1;
123 uint_reg_t wfifo_full : 1;
124 uint_reg_t rfifo_full : 1;
125 uint_reg_t tfifo_empty : 1;
126 uint_reg_t wfifo_empty : 1;
127 uint_reg_t rfifo_empty : 1;
128 uint_reg_t __reserved_0 : 1;
129#endif
130 };
131
132 uint_reg_t word;
133} UART_FLAG_t;
134
135/*
136 * Interrupt Vector Mask.
137 * Each bit in this register corresponds to a specific interrupt. When set,
138 * the associated interrupt will not be dispatched.
139 */
140
141__extension__
142typedef union
143{
144 struct
145 {
146#ifndef __BIG_ENDIAN__
147 /* Read data FIFO read and no data available */
148 uint_reg_t rdat_err : 1;
149 /* Write FIFO was written but it was full */
150 uint_reg_t wdat_err : 1;
151 /* Stop bit not found when current data was received */
152 uint_reg_t frame_err : 1;
153 /* Parity error was detected when current data was received */
154 uint_reg_t parity_err : 1;
155 /* Data was received but the receive FIFO was full */
156 uint_reg_t rfifo_overflow : 1;
157 /*
158 * An almost full event is reached when data is to be written to the
159 * receive FIFO, and the receive FIFO has more than or equal to
160 * BUFFER_THRESHOLD.RFIFO_AFULL bytes.
161 */
162 uint_reg_t rfifo_afull : 1;
163 /* Reserved. */
164 uint_reg_t __reserved_0 : 1;
165 /* An entry in the transmit FIFO was popped */
166 uint_reg_t tfifo_re : 1;
167 /* An entry has been pushed into the receive FIFO */
168 uint_reg_t rfifo_we : 1;
169 /* An entry of the write FIFO has been popped */
170 uint_reg_t wfifo_re : 1;
171 /* Rshim read receive FIFO in protocol mode */
172 uint_reg_t rfifo_err : 1;
173 /*
174 * An almost empty event is reached when data is to be read from the
175 * transmit FIFO, and the transmit FIFO has less than or equal to
176 * BUFFER_THRESHOLD.TFIFO_AEMPTY bytes.
177 */
178 uint_reg_t tfifo_aempty : 1;
179 /* Reserved. */
180 uint_reg_t __reserved_1 : 52;
181#else /* __BIG_ENDIAN__ */
182 uint_reg_t __reserved_1 : 52;
183 uint_reg_t tfifo_aempty : 1;
184 uint_reg_t rfifo_err : 1;
185 uint_reg_t wfifo_re : 1;
186 uint_reg_t rfifo_we : 1;
187 uint_reg_t tfifo_re : 1;
188 uint_reg_t __reserved_0 : 1;
189 uint_reg_t rfifo_afull : 1;
190 uint_reg_t rfifo_overflow : 1;
191 uint_reg_t parity_err : 1;
192 uint_reg_t frame_err : 1;
193 uint_reg_t wdat_err : 1;
194 uint_reg_t rdat_err : 1;
195#endif
196 };
197
198 uint_reg_t word;
199} UART_INTERRUPT_MASK_t;
200
201/*
202 * Interrupt vector, write-one-to-clear.
203 * Each bit in this register corresponds to a specific interrupt. Hardware
204 * sets the bit when the associated condition has occurred. Writing a 1
205 * clears the status bit.
206 */
207
208__extension__
209typedef union
210{
211 struct
212 {
213#ifndef __BIG_ENDIAN__
214 /* Read data FIFO read and no data available */
215 uint_reg_t rdat_err : 1;
216 /* Write FIFO was written but it was full */
217 uint_reg_t wdat_err : 1;
218 /* Stop bit not found when current data was received */
219 uint_reg_t frame_err : 1;
220 /* Parity error was detected when current data was received */
221 uint_reg_t parity_err : 1;
222 /* Data was received but the receive FIFO was full */
223 uint_reg_t rfifo_overflow : 1;
224 /*
225 * Data was received and the receive FIFO is now almost full (more than
226 * BUFFER_THRESHOLD.RFIFO_AFULL bytes in it)
227 */
228 uint_reg_t rfifo_afull : 1;
229 /* Reserved. */
230 uint_reg_t __reserved_0 : 1;
231 /* An entry in the transmit FIFO was popped */
232 uint_reg_t tfifo_re : 1;
233 /* An entry has been pushed into the receive FIFO */
234 uint_reg_t rfifo_we : 1;
235 /* An entry of the write FIFO has been popped */
236 uint_reg_t wfifo_re : 1;
237 /* Rshim read receive FIFO in protocol mode */
238 uint_reg_t rfifo_err : 1;
239 /*
240 * Data was read from the transmit FIFO and now it is almost empty (less
241 * than or equal to BUFFER_THRESHOLD.TFIFO_AEMPTY bytes in it).
242 */
243 uint_reg_t tfifo_aempty : 1;
244 /* Reserved. */
245 uint_reg_t __reserved_1 : 52;
246#else /* __BIG_ENDIAN__ */
247 uint_reg_t __reserved_1 : 52;
248 uint_reg_t tfifo_aempty : 1;
249 uint_reg_t rfifo_err : 1;
250 uint_reg_t wfifo_re : 1;
251 uint_reg_t rfifo_we : 1;
252 uint_reg_t tfifo_re : 1;
253 uint_reg_t __reserved_0 : 1;
254 uint_reg_t rfifo_afull : 1;
255 uint_reg_t rfifo_overflow : 1;
256 uint_reg_t parity_err : 1;
257 uint_reg_t frame_err : 1;
258 uint_reg_t wdat_err : 1;
259 uint_reg_t rdat_err : 1;
260#endif
261 };
262
263 uint_reg_t word;
264} UART_INTERRUPT_STATUS_t;
265
266/* Type. */
267
268__extension__
269typedef union
270{
271 struct
272 {
273#ifndef __BIG_ENDIAN__
274 /* Number of stop bits, rx and tx */
275 uint_reg_t sbits : 1;
276 /* Reserved. */
277 uint_reg_t __reserved_0 : 1;
278 /* Data word size, rx and tx */
279 uint_reg_t dbits : 1;
280 /* Reserved. */
281 uint_reg_t __reserved_1 : 1;
282 /* Parity selection, rx and tx */
283 uint_reg_t ptype : 3;
284 /* Reserved. */
285 uint_reg_t __reserved_2 : 57;
286#else /* __BIG_ENDIAN__ */
287 uint_reg_t __reserved_2 : 57;
288 uint_reg_t ptype : 3;
289 uint_reg_t __reserved_1 : 1;
290 uint_reg_t dbits : 1;
291 uint_reg_t __reserved_0 : 1;
292 uint_reg_t sbits : 1;
293#endif
294 };
295
296 uint_reg_t word;
297} UART_TYPE_t;
298#endif /* !defined(__ASSEMBLER__) */
299
300#endif /* !defined(__ARCH_UART_H__) */
diff --git a/arch/tile/include/arch/uart_def.h b/arch/tile/include/arch/uart_def.h
new file mode 100644
index 000000000000..42bcaf535379
--- /dev/null
+++ b/arch/tile/include/arch/uart_def.h
@@ -0,0 +1,120 @@
1/*
2 * Copyright 2013 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15/* Machine-generated file; do not edit. */
16
17#ifndef __ARCH_UART_DEF_H__
18#define __ARCH_UART_DEF_H__
19#define UART_DIVISOR 0x0158
20#define UART_FIFO_COUNT 0x0110
21#define UART_FLAG 0x0108
22#define UART_INTERRUPT_MASK 0x0208
23#define UART_INTERRUPT_MASK__RDAT_ERR_SHIFT 0
24#define UART_INTERRUPT_MASK__RDAT_ERR_WIDTH 1
25#define UART_INTERRUPT_MASK__RDAT_ERR_RESET_VAL 1
26#define UART_INTERRUPT_MASK__RDAT_ERR_RMASK 0x1
27#define UART_INTERRUPT_MASK__RDAT_ERR_MASK 0x1
28#define UART_INTERRUPT_MASK__RDAT_ERR_FIELD 0,0
29#define UART_INTERRUPT_MASK__WDAT_ERR_SHIFT 1
30#define UART_INTERRUPT_MASK__WDAT_ERR_WIDTH 1
31#define UART_INTERRUPT_MASK__WDAT_ERR_RESET_VAL 1
32#define UART_INTERRUPT_MASK__WDAT_ERR_RMASK 0x1
33#define UART_INTERRUPT_MASK__WDAT_ERR_MASK 0x2
34#define UART_INTERRUPT_MASK__WDAT_ERR_FIELD 1,1
35#define UART_INTERRUPT_MASK__FRAME_ERR_SHIFT 2
36#define UART_INTERRUPT_MASK__FRAME_ERR_WIDTH 1
37#define UART_INTERRUPT_MASK__FRAME_ERR_RESET_VAL 1
38#define UART_INTERRUPT_MASK__FRAME_ERR_RMASK 0x1
39#define UART_INTERRUPT_MASK__FRAME_ERR_MASK 0x4
40#define UART_INTERRUPT_MASK__FRAME_ERR_FIELD 2,2
41#define UART_INTERRUPT_MASK__PARITY_ERR_SHIFT 3
42#define UART_INTERRUPT_MASK__PARITY_ERR_WIDTH 1
43#define UART_INTERRUPT_MASK__PARITY_ERR_RESET_VAL 1
44#define UART_INTERRUPT_MASK__PARITY_ERR_RMASK 0x1
45#define UART_INTERRUPT_MASK__PARITY_ERR_MASK 0x8
46#define UART_INTERRUPT_MASK__PARITY_ERR_FIELD 3,3
47#define UART_INTERRUPT_MASK__RFIFO_OVERFLOW_SHIFT 4
48#define UART_INTERRUPT_MASK__RFIFO_OVERFLOW_WIDTH 1
49#define UART_INTERRUPT_MASK__RFIFO_OVERFLOW_RESET_VAL 1
50#define UART_INTERRUPT_MASK__RFIFO_OVERFLOW_RMASK 0x1
51#define UART_INTERRUPT_MASK__RFIFO_OVERFLOW_MASK 0x10
52#define UART_INTERRUPT_MASK__RFIFO_OVERFLOW_FIELD 4,4
53#define UART_INTERRUPT_MASK__RFIFO_AFULL_SHIFT 5
54#define UART_INTERRUPT_MASK__RFIFO_AFULL_WIDTH 1
55#define UART_INTERRUPT_MASK__RFIFO_AFULL_RESET_VAL 1
56#define UART_INTERRUPT_MASK__RFIFO_AFULL_RMASK 0x1
57#define UART_INTERRUPT_MASK__RFIFO_AFULL_MASK 0x20
58#define UART_INTERRUPT_MASK__RFIFO_AFULL_FIELD 5,5
59#define UART_INTERRUPT_MASK__TFIFO_RE_SHIFT 7
60#define UART_INTERRUPT_MASK__TFIFO_RE_WIDTH 1
61#define UART_INTERRUPT_MASK__TFIFO_RE_RESET_VAL 1
62#define UART_INTERRUPT_MASK__TFIFO_RE_RMASK 0x1
63#define UART_INTERRUPT_MASK__TFIFO_RE_MASK 0x80
64#define UART_INTERRUPT_MASK__TFIFO_RE_FIELD 7,7
65#define UART_INTERRUPT_MASK__RFIFO_WE_SHIFT 8
66#define UART_INTERRUPT_MASK__RFIFO_WE_WIDTH 1
67#define UART_INTERRUPT_MASK__RFIFO_WE_RESET_VAL 1
68#define UART_INTERRUPT_MASK__RFIFO_WE_RMASK 0x1
69#define UART_INTERRUPT_MASK__RFIFO_WE_MASK 0x100
70#define UART_INTERRUPT_MASK__RFIFO_WE_FIELD 8,8
71#define UART_INTERRUPT_MASK__WFIFO_RE_SHIFT 9
72#define UART_INTERRUPT_MASK__WFIFO_RE_WIDTH 1
73#define UART_INTERRUPT_MASK__WFIFO_RE_RESET_VAL 1
74#define UART_INTERRUPT_MASK__WFIFO_RE_RMASK 0x1
75#define UART_INTERRUPT_MASK__WFIFO_RE_MASK 0x200
76#define UART_INTERRUPT_MASK__WFIFO_RE_FIELD 9,9
77#define UART_INTERRUPT_MASK__RFIFO_ERR_SHIFT 10
78#define UART_INTERRUPT_MASK__RFIFO_ERR_WIDTH 1
79#define UART_INTERRUPT_MASK__RFIFO_ERR_RESET_VAL 1
80#define UART_INTERRUPT_MASK__RFIFO_ERR_RMASK 0x1
81#define UART_INTERRUPT_MASK__RFIFO_ERR_MASK 0x400
82#define UART_INTERRUPT_MASK__RFIFO_ERR_FIELD 10,10
83#define UART_INTERRUPT_MASK__TFIFO_AEMPTY_SHIFT 11
84#define UART_INTERRUPT_MASK__TFIFO_AEMPTY_WIDTH 1
85#define UART_INTERRUPT_MASK__TFIFO_AEMPTY_RESET_VAL 1
86#define UART_INTERRUPT_MASK__TFIFO_AEMPTY_RMASK 0x1
87#define UART_INTERRUPT_MASK__TFIFO_AEMPTY_MASK 0x800
88#define UART_INTERRUPT_MASK__TFIFO_AEMPTY_FIELD 11,11
89#define UART_INTERRUPT_STATUS 0x0200
90#define UART_RECEIVE_DATA 0x0148
91#define UART_TRANSMIT_DATA 0x0140
92#define UART_TYPE 0x0160
93#define UART_TYPE__SBITS_SHIFT 0
94#define UART_TYPE__SBITS_WIDTH 1
95#define UART_TYPE__SBITS_RESET_VAL 1
96#define UART_TYPE__SBITS_RMASK 0x1
97#define UART_TYPE__SBITS_MASK 0x1
98#define UART_TYPE__SBITS_FIELD 0,0
99#define UART_TYPE__SBITS_VAL_ONE_SBITS 0x0
100#define UART_TYPE__SBITS_VAL_TWO_SBITS 0x1
101#define UART_TYPE__DBITS_SHIFT 2
102#define UART_TYPE__DBITS_WIDTH 1
103#define UART_TYPE__DBITS_RESET_VAL 0
104#define UART_TYPE__DBITS_RMASK 0x1
105#define UART_TYPE__DBITS_MASK 0x4
106#define UART_TYPE__DBITS_FIELD 2,2
107#define UART_TYPE__DBITS_VAL_EIGHT_DBITS 0x0
108#define UART_TYPE__DBITS_VAL_SEVEN_DBITS 0x1
109#define UART_TYPE__PTYPE_SHIFT 4
110#define UART_TYPE__PTYPE_WIDTH 3
111#define UART_TYPE__PTYPE_RESET_VAL 3
112#define UART_TYPE__PTYPE_RMASK 0x7
113#define UART_TYPE__PTYPE_MASK 0x70
114#define UART_TYPE__PTYPE_FIELD 4,6
115#define UART_TYPE__PTYPE_VAL_NONE 0x0
116#define UART_TYPE__PTYPE_VAL_MARK 0x1
117#define UART_TYPE__PTYPE_VAL_SPACE 0x2
118#define UART_TYPE__PTYPE_VAL_EVEN 0x3
119#define UART_TYPE__PTYPE_VAL_ODD 0x4
120#endif /* !defined(__ARCH_UART_DEF_H__) */
diff --git a/arch/tile/include/asm/Kbuild b/arch/tile/include/asm/Kbuild
index b17b9b8e53cd..664d6ad23f80 100644
--- a/arch/tile/include/asm/Kbuild
+++ b/arch/tile/include/asm/Kbuild
@@ -11,12 +11,13 @@ generic-y += errno.h
11generic-y += exec.h 11generic-y += exec.h
12generic-y += fb.h 12generic-y += fb.h
13generic-y += fcntl.h 13generic-y += fcntl.h
14generic-y += hw_irq.h
14generic-y += ioctl.h 15generic-y += ioctl.h
15generic-y += ioctls.h 16generic-y += ioctls.h
16generic-y += ipcbuf.h 17generic-y += ipcbuf.h
17generic-y += irq_regs.h 18generic-y += irq_regs.h
18generic-y += kdebug.h
19generic-y += local.h 19generic-y += local.h
20generic-y += local64.h
20generic-y += msgbuf.h 21generic-y += msgbuf.h
21generic-y += mutex.h 22generic-y += mutex.h
22generic-y += param.h 23generic-y += param.h
diff --git a/arch/tile/include/asm/atomic.h b/arch/tile/include/asm/atomic.h
index e71387ab20ca..d385eaadece7 100644
--- a/arch/tile/include/asm/atomic.h
+++ b/arch/tile/include/asm/atomic.h
@@ -114,6 +114,32 @@ static inline int atomic_read(const atomic_t *v)
114#define atomic_inc_and_test(v) (atomic_inc_return(v) == 0) 114#define atomic_inc_and_test(v) (atomic_inc_return(v) == 0)
115 115
116/** 116/**
117 * atomic_xchg - atomically exchange contents of memory with a new value
118 * @v: pointer of type atomic_t
119 * @i: integer value to store in memory
120 *
121 * Atomically sets @v to @i and returns old @v
122 */
123static inline int atomic_xchg(atomic_t *v, int n)
124{
125 return xchg(&v->counter, n);
126}
127
128/**
129 * atomic_cmpxchg - atomically exchange contents of memory if it matches
130 * @v: pointer of type atomic_t
131 * @o: old value that memory should have
132 * @n: new value to write to memory if it matches
133 *
134 * Atomically checks if @v holds @o and replaces it with @n if so.
135 * Returns the old value at @v.
136 */
137static inline int atomic_cmpxchg(atomic_t *v, int o, int n)
138{
139 return cmpxchg(&v->counter, o, n);
140}
141
142/**
117 * atomic_add_negative - add and test if negative 143 * atomic_add_negative - add and test if negative
118 * @v: pointer of type atomic_t 144 * @v: pointer of type atomic_t
119 * @i: integer value to add 145 * @i: integer value to add
@@ -133,6 +159,32 @@ static inline int atomic_read(const atomic_t *v)
133 159
134#ifndef __ASSEMBLY__ 160#ifndef __ASSEMBLY__
135 161
162/**
163 * atomic64_xchg - atomically exchange contents of memory with a new value
164 * @v: pointer of type atomic64_t
165 * @i: integer value to store in memory
166 *
167 * Atomically sets @v to @i and returns old @v
168 */
169static inline u64 atomic64_xchg(atomic64_t *v, u64 n)
170{
171 return xchg64(&v->counter, n);
172}
173
174/**
175 * atomic64_cmpxchg - atomically exchange contents of memory if it matches
176 * @v: pointer of type atomic64_t
177 * @o: old value that memory should have
178 * @n: new value to write to memory if it matches
179 *
180 * Atomically checks if @v holds @o and replaces it with @n if so.
181 * Returns the old value at @v.
182 */
183static inline u64 atomic64_cmpxchg(atomic64_t *v, u64 o, u64 n)
184{
185 return cmpxchg64(&v->counter, o, n);
186}
187
136static inline long long atomic64_dec_if_positive(atomic64_t *v) 188static inline long long atomic64_dec_if_positive(atomic64_t *v)
137{ 189{
138 long long c, old, dec; 190 long long c, old, dec;
diff --git a/arch/tile/include/asm/atomic_32.h b/arch/tile/include/asm/atomic_32.h
index e7fb5cfb9597..0d0395b1b152 100644
--- a/arch/tile/include/asm/atomic_32.h
+++ b/arch/tile/include/asm/atomic_32.h
@@ -22,40 +22,6 @@
22 22
23#ifndef __ASSEMBLY__ 23#ifndef __ASSEMBLY__
24 24
25/* Tile-specific routines to support <linux/atomic.h>. */
26int _atomic_xchg(atomic_t *v, int n);
27int _atomic_xchg_add(atomic_t *v, int i);
28int _atomic_xchg_add_unless(atomic_t *v, int a, int u);
29int _atomic_cmpxchg(atomic_t *v, int o, int n);
30
31/**
32 * atomic_xchg - atomically exchange contents of memory with a new value
33 * @v: pointer of type atomic_t
34 * @i: integer value to store in memory
35 *
36 * Atomically sets @v to @i and returns old @v
37 */
38static inline int atomic_xchg(atomic_t *v, int n)
39{
40 smp_mb(); /* barrier for proper semantics */
41 return _atomic_xchg(v, n);
42}
43
44/**
45 * atomic_cmpxchg - atomically exchange contents of memory if it matches
46 * @v: pointer of type atomic_t
47 * @o: old value that memory should have
48 * @n: new value to write to memory if it matches
49 *
50 * Atomically checks if @v holds @o and replaces it with @n if so.
51 * Returns the old value at @v.
52 */
53static inline int atomic_cmpxchg(atomic_t *v, int o, int n)
54{
55 smp_mb(); /* barrier for proper semantics */
56 return _atomic_cmpxchg(v, o, n);
57}
58
59/** 25/**
60 * atomic_add - add integer to atomic variable 26 * atomic_add - add integer to atomic variable
61 * @i: integer value to add 27 * @i: integer value to add
@@ -65,7 +31,7 @@ static inline int atomic_cmpxchg(atomic_t *v, int o, int n)
65 */ 31 */
66static inline void atomic_add(int i, atomic_t *v) 32static inline void atomic_add(int i, atomic_t *v)
67{ 33{
68 _atomic_xchg_add(v, i); 34 _atomic_xchg_add(&v->counter, i);
69} 35}
70 36
71/** 37/**
@@ -78,7 +44,7 @@ static inline void atomic_add(int i, atomic_t *v)
78static inline int atomic_add_return(int i, atomic_t *v) 44static inline int atomic_add_return(int i, atomic_t *v)
79{ 45{
80 smp_mb(); /* barrier for proper semantics */ 46 smp_mb(); /* barrier for proper semantics */
81 return _atomic_xchg_add(v, i) + i; 47 return _atomic_xchg_add(&v->counter, i) + i;
82} 48}
83 49
84/** 50/**
@@ -93,7 +59,7 @@ static inline int atomic_add_return(int i, atomic_t *v)
93static inline int __atomic_add_unless(atomic_t *v, int a, int u) 59static inline int __atomic_add_unless(atomic_t *v, int a, int u)
94{ 60{
95 smp_mb(); /* barrier for proper semantics */ 61 smp_mb(); /* barrier for proper semantics */
96 return _atomic_xchg_add_unless(v, a, u); 62 return _atomic_xchg_add_unless(&v->counter, a, u);
97} 63}
98 64
99/** 65/**
@@ -108,7 +74,7 @@ static inline int __atomic_add_unless(atomic_t *v, int a, int u)
108 */ 74 */
109static inline void atomic_set(atomic_t *v, int n) 75static inline void atomic_set(atomic_t *v, int n)
110{ 76{
111 _atomic_xchg(v, n); 77 _atomic_xchg(&v->counter, n);
112} 78}
113 79
114/* A 64bit atomic type */ 80/* A 64bit atomic type */
@@ -119,11 +85,6 @@ typedef struct {
119 85
120#define ATOMIC64_INIT(val) { (val) } 86#define ATOMIC64_INIT(val) { (val) }
121 87
122u64 _atomic64_xchg(atomic64_t *v, u64 n);
123u64 _atomic64_xchg_add(atomic64_t *v, u64 i);
124u64 _atomic64_xchg_add_unless(atomic64_t *v, u64 a, u64 u);
125u64 _atomic64_cmpxchg(atomic64_t *v, u64 o, u64 n);
126
127/** 88/**
128 * atomic64_read - read atomic variable 89 * atomic64_read - read atomic variable
129 * @v: pointer of type atomic64_t 90 * @v: pointer of type atomic64_t
@@ -137,35 +98,7 @@ static inline u64 atomic64_read(const atomic64_t *v)
137 * Casting away const is safe since the atomic support routines 98 * Casting away const is safe since the atomic support routines
138 * do not write to memory if the value has not been modified. 99 * do not write to memory if the value has not been modified.
139 */ 100 */
140 return _atomic64_xchg_add((atomic64_t *)v, 0); 101 return _atomic64_xchg_add((u64 *)&v->counter, 0);
141}
142
143/**
144 * atomic64_xchg - atomically exchange contents of memory with a new value
145 * @v: pointer of type atomic64_t
146 * @i: integer value to store in memory
147 *
148 * Atomically sets @v to @i and returns old @v
149 */
150static inline u64 atomic64_xchg(atomic64_t *v, u64 n)
151{
152 smp_mb(); /* barrier for proper semantics */
153 return _atomic64_xchg(v, n);
154}
155
156/**
157 * atomic64_cmpxchg - atomically exchange contents of memory if it matches
158 * @v: pointer of type atomic64_t
159 * @o: old value that memory should have
160 * @n: new value to write to memory if it matches
161 *
162 * Atomically checks if @v holds @o and replaces it with @n if so.
163 * Returns the old value at @v.
164 */
165static inline u64 atomic64_cmpxchg(atomic64_t *v, u64 o, u64 n)
166{
167 smp_mb(); /* barrier for proper semantics */
168 return _atomic64_cmpxchg(v, o, n);
169} 102}
170 103
171/** 104/**
@@ -177,7 +110,7 @@ static inline u64 atomic64_cmpxchg(atomic64_t *v, u64 o, u64 n)
177 */ 110 */
178static inline void atomic64_add(u64 i, atomic64_t *v) 111static inline void atomic64_add(u64 i, atomic64_t *v)
179{ 112{
180 _atomic64_xchg_add(v, i); 113 _atomic64_xchg_add(&v->counter, i);
181} 114}
182 115
183/** 116/**
@@ -190,7 +123,7 @@ static inline void atomic64_add(u64 i, atomic64_t *v)
190static inline u64 atomic64_add_return(u64 i, atomic64_t *v) 123static inline u64 atomic64_add_return(u64 i, atomic64_t *v)
191{ 124{
192 smp_mb(); /* barrier for proper semantics */ 125 smp_mb(); /* barrier for proper semantics */
193 return _atomic64_xchg_add(v, i) + i; 126 return _atomic64_xchg_add(&v->counter, i) + i;
194} 127}
195 128
196/** 129/**
@@ -205,7 +138,7 @@ static inline u64 atomic64_add_return(u64 i, atomic64_t *v)
205static inline u64 atomic64_add_unless(atomic64_t *v, u64 a, u64 u) 138static inline u64 atomic64_add_unless(atomic64_t *v, u64 a, u64 u)
206{ 139{
207 smp_mb(); /* barrier for proper semantics */ 140 smp_mb(); /* barrier for proper semantics */
208 return _atomic64_xchg_add_unless(v, a, u) != u; 141 return _atomic64_xchg_add_unless(&v->counter, a, u) != u;
209} 142}
210 143
211/** 144/**
@@ -220,7 +153,7 @@ static inline u64 atomic64_add_unless(atomic64_t *v, u64 a, u64 u)
220 */ 153 */
221static inline void atomic64_set(atomic64_t *v, u64 n) 154static inline void atomic64_set(atomic64_t *v, u64 n)
222{ 155{
223 _atomic64_xchg(v, n); 156 _atomic64_xchg(&v->counter, n);
224} 157}
225 158
226#define atomic64_add_negative(a, v) (atomic64_add_return((a), (v)) < 0) 159#define atomic64_add_negative(a, v) (atomic64_add_return((a), (v)) < 0)
@@ -252,21 +185,6 @@ static inline void atomic64_set(atomic64_t *v, u64 n)
252 * Internal definitions only beyond this point. 185 * Internal definitions only beyond this point.
253 */ 186 */
254 187
255#define ATOMIC_LOCKS_FOUND_VIA_TABLE() \
256 (!CHIP_HAS_CBOX_HOME_MAP() && defined(CONFIG_SMP))
257
258#if ATOMIC_LOCKS_FOUND_VIA_TABLE()
259
260/* Number of entries in atomic_lock_ptr[]. */
261#define ATOMIC_HASH_L1_SHIFT 6
262#define ATOMIC_HASH_L1_SIZE (1 << ATOMIC_HASH_L1_SHIFT)
263
264/* Number of locks in each struct pointed to by atomic_lock_ptr[]. */
265#define ATOMIC_HASH_L2_SHIFT (CHIP_L2_LOG_LINE_SIZE() - 2)
266#define ATOMIC_HASH_L2_SIZE (1 << ATOMIC_HASH_L2_SHIFT)
267
268#else /* ATOMIC_LOCKS_FOUND_VIA_TABLE() */
269
270/* 188/*
271 * Number of atomic locks in atomic_locks[]. Must be a power of two. 189 * Number of atomic locks in atomic_locks[]. Must be a power of two.
272 * There is no reason for more than PAGE_SIZE / 8 entries, since that 190 * There is no reason for more than PAGE_SIZE / 8 entries, since that
@@ -281,8 +199,6 @@ static inline void atomic64_set(atomic64_t *v, u64 n)
281extern int atomic_locks[]; 199extern int atomic_locks[];
282#endif 200#endif
283 201
284#endif /* ATOMIC_LOCKS_FOUND_VIA_TABLE() */
285
286/* 202/*
287 * All the code that may fault while holding an atomic lock must 203 * All the code that may fault while holding an atomic lock must
288 * place the pointer to the lock in ATOMIC_LOCK_REG so the fault code 204 * place the pointer to the lock in ATOMIC_LOCK_REG so the fault code
diff --git a/arch/tile/include/asm/atomic_64.h b/arch/tile/include/asm/atomic_64.h
index f4500c688ffa..ad220eed05fc 100644
--- a/arch/tile/include/asm/atomic_64.h
+++ b/arch/tile/include/asm/atomic_64.h
@@ -32,25 +32,6 @@
32 * on any routine which updates memory and returns a value. 32 * on any routine which updates memory and returns a value.
33 */ 33 */
34 34
35static inline int atomic_cmpxchg(atomic_t *v, int o, int n)
36{
37 int val;
38 __insn_mtspr(SPR_CMPEXCH_VALUE, o);
39 smp_mb(); /* barrier for proper semantics */
40 val = __insn_cmpexch4((void *)&v->counter, n);
41 smp_mb(); /* barrier for proper semantics */
42 return val;
43}
44
45static inline int atomic_xchg(atomic_t *v, int n)
46{
47 int val;
48 smp_mb(); /* barrier for proper semantics */
49 val = __insn_exch4((void *)&v->counter, n);
50 smp_mb(); /* barrier for proper semantics */
51 return val;
52}
53
54static inline void atomic_add(int i, atomic_t *v) 35static inline void atomic_add(int i, atomic_t *v)
55{ 36{
56 __insn_fetchadd4((void *)&v->counter, i); 37 __insn_fetchadd4((void *)&v->counter, i);
@@ -72,7 +53,7 @@ static inline int __atomic_add_unless(atomic_t *v, int a, int u)
72 if (oldval == u) 53 if (oldval == u)
73 break; 54 break;
74 guess = oldval; 55 guess = oldval;
75 oldval = atomic_cmpxchg(v, guess, guess + a); 56 oldval = cmpxchg(&v->counter, guess, guess + a);
76 } while (guess != oldval); 57 } while (guess != oldval);
77 return oldval; 58 return oldval;
78} 59}
@@ -84,25 +65,6 @@ static inline int __atomic_add_unless(atomic_t *v, int a, int u)
84#define atomic64_read(v) ((v)->counter) 65#define atomic64_read(v) ((v)->counter)
85#define atomic64_set(v, i) ((v)->counter = (i)) 66#define atomic64_set(v, i) ((v)->counter = (i))
86 67
87static inline long atomic64_cmpxchg(atomic64_t *v, long o, long n)
88{
89 long val;
90 smp_mb(); /* barrier for proper semantics */
91 __insn_mtspr(SPR_CMPEXCH_VALUE, o);
92 val = __insn_cmpexch((void *)&v->counter, n);
93 smp_mb(); /* barrier for proper semantics */
94 return val;
95}
96
97static inline long atomic64_xchg(atomic64_t *v, long n)
98{
99 long val;
100 smp_mb(); /* barrier for proper semantics */
101 val = __insn_exch((void *)&v->counter, n);
102 smp_mb(); /* barrier for proper semantics */
103 return val;
104}
105
106static inline void atomic64_add(long i, atomic64_t *v) 68static inline void atomic64_add(long i, atomic64_t *v)
107{ 69{
108 __insn_fetchadd((void *)&v->counter, i); 70 __insn_fetchadd((void *)&v->counter, i);
@@ -124,7 +86,7 @@ static inline long atomic64_add_unless(atomic64_t *v, long a, long u)
124 if (oldval == u) 86 if (oldval == u)
125 break; 87 break;
126 guess = oldval; 88 guess = oldval;
127 oldval = atomic64_cmpxchg(v, guess, guess + a); 89 oldval = cmpxchg(&v->counter, guess, guess + a);
128 } while (guess != oldval); 90 } while (guess != oldval);
129 return oldval != u; 91 return oldval != u;
130} 92}
diff --git a/arch/tile/include/asm/barrier.h b/arch/tile/include/asm/barrier.h
index 990a217a0b72..a9a73da5865d 100644
--- a/arch/tile/include/asm/barrier.h
+++ b/arch/tile/include/asm/barrier.h
@@ -77,7 +77,6 @@
77 77
78#define __sync() __insn_mf() 78#define __sync() __insn_mf()
79 79
80#if !CHIP_HAS_MF_WAITS_FOR_VICTIMS()
81#include <hv/syscall_public.h> 80#include <hv/syscall_public.h>
82/* 81/*
83 * Issue an uncacheable load to each memory controller, then 82 * Issue an uncacheable load to each memory controller, then
@@ -96,7 +95,6 @@ static inline void __mb_incoherent(void)
96 "r20", "r21", "r22", "r23", "r24", 95 "r20", "r21", "r22", "r23", "r24",
97 "r25", "r26", "r27", "r28", "r29"); 96 "r25", "r26", "r27", "r28", "r29");
98} 97}
99#endif
100 98
101/* Fence to guarantee visibility of stores to incoherent memory. */ 99/* Fence to guarantee visibility of stores to incoherent memory. */
102static inline void 100static inline void
@@ -104,7 +102,6 @@ mb_incoherent(void)
104{ 102{
105 __insn_mf(); 103 __insn_mf();
106 104
107#if !CHIP_HAS_MF_WAITS_FOR_VICTIMS()
108 { 105 {
109#if CHIP_HAS_TILE_WRITE_PENDING() 106#if CHIP_HAS_TILE_WRITE_PENDING()
110 const unsigned long WRITE_TIMEOUT_CYCLES = 400; 107 const unsigned long WRITE_TIMEOUT_CYCLES = 400;
@@ -116,7 +113,6 @@ mb_incoherent(void)
116#endif /* CHIP_HAS_TILE_WRITE_PENDING() */ 113#endif /* CHIP_HAS_TILE_WRITE_PENDING() */
117 (void) __mb_incoherent(); 114 (void) __mb_incoherent();
118 } 115 }
119#endif /* CHIP_HAS_MF_WAITS_FOR_VICTIMS() */
120} 116}
121 117
122#define fast_wmb() __sync() 118#define fast_wmb() __sync()
diff --git a/arch/tile/include/asm/bitops.h b/arch/tile/include/asm/bitops.h
index bd186c4eaa50..d5a206865036 100644
--- a/arch/tile/include/asm/bitops.h
+++ b/arch/tile/include/asm/bitops.h
@@ -29,17 +29,6 @@
29#endif 29#endif
30 30
31/** 31/**
32 * __ffs - find first set bit in word
33 * @word: The word to search
34 *
35 * Undefined if no set bit exists, so code should check against 0 first.
36 */
37static inline unsigned long __ffs(unsigned long word)
38{
39 return __builtin_ctzl(word);
40}
41
42/**
43 * ffz - find first zero bit in word 32 * ffz - find first zero bit in word
44 * @word: The word to search 33 * @word: The word to search
45 * 34 *
@@ -50,33 +39,6 @@ static inline unsigned long ffz(unsigned long word)
50 return __builtin_ctzl(~word); 39 return __builtin_ctzl(~word);
51} 40}
52 41
53/**
54 * __fls - find last set bit in word
55 * @word: The word to search
56 *
57 * Undefined if no set bit exists, so code should check against 0 first.
58 */
59static inline unsigned long __fls(unsigned long word)
60{
61 return (sizeof(word) * 8) - 1 - __builtin_clzl(word);
62}
63
64/**
65 * ffs - find first set bit in word
66 * @x: the word to search
67 *
68 * This is defined the same way as the libc and compiler builtin ffs
69 * routines, therefore differs in spirit from the other bitops.
70 *
71 * ffs(value) returns 0 if value is 0 or the position of the first
72 * set bit if value is nonzero. The first (least significant) bit
73 * is at position 1.
74 */
75static inline int ffs(int x)
76{
77 return __builtin_ffs(x);
78}
79
80static inline int fls64(__u64 w) 42static inline int fls64(__u64 w)
81{ 43{
82 return (sizeof(__u64) * 8) - __builtin_clzll(w); 44 return (sizeof(__u64) * 8) - __builtin_clzll(w);
@@ -118,6 +80,9 @@ static inline unsigned long __arch_hweight64(__u64 w)
118 return __builtin_popcountll(w); 80 return __builtin_popcountll(w);
119} 81}
120 82
83#include <asm-generic/bitops/builtin-__ffs.h>
84#include <asm-generic/bitops/builtin-__fls.h>
85#include <asm-generic/bitops/builtin-ffs.h>
121#include <asm-generic/bitops/const_hweight.h> 86#include <asm-generic/bitops/const_hweight.h>
122#include <asm-generic/bitops/lock.h> 87#include <asm-generic/bitops/lock.h>
123#include <asm-generic/bitops/find.h> 88#include <asm-generic/bitops/find.h>
diff --git a/arch/tile/include/asm/bitops_32.h b/arch/tile/include/asm/bitops_32.h
index ddc4c1efde43..386865ad2f55 100644
--- a/arch/tile/include/asm/bitops_32.h
+++ b/arch/tile/include/asm/bitops_32.h
@@ -16,7 +16,7 @@
16#define _ASM_TILE_BITOPS_32_H 16#define _ASM_TILE_BITOPS_32_H
17 17
18#include <linux/compiler.h> 18#include <linux/compiler.h>
19#include <linux/atomic.h> 19#include <asm/barrier.h>
20 20
21/* Tile-specific routines to support <asm/bitops.h>. */ 21/* Tile-specific routines to support <asm/bitops.h>. */
22unsigned long _atomic_or(volatile unsigned long *p, unsigned long mask); 22unsigned long _atomic_or(volatile unsigned long *p, unsigned long mask);
diff --git a/arch/tile/include/asm/bitops_64.h b/arch/tile/include/asm/bitops_64.h
index 60b87ee54fb8..ad34cd056085 100644
--- a/arch/tile/include/asm/bitops_64.h
+++ b/arch/tile/include/asm/bitops_64.h
@@ -16,7 +16,7 @@
16#define _ASM_TILE_BITOPS_64_H 16#define _ASM_TILE_BITOPS_64_H
17 17
18#include <linux/compiler.h> 18#include <linux/compiler.h>
19#include <linux/atomic.h> 19#include <asm/cmpxchg.h>
20 20
21/* See <asm/bitops.h> for API comments. */ 21/* See <asm/bitops.h> for API comments. */
22 22
@@ -44,8 +44,7 @@ static inline void change_bit(unsigned nr, volatile unsigned long *addr)
44 oldval = *addr; 44 oldval = *addr;
45 do { 45 do {
46 guess = oldval; 46 guess = oldval;
47 oldval = atomic64_cmpxchg((atomic64_t *)addr, 47 oldval = cmpxchg(addr, guess, guess ^ mask);
48 guess, guess ^ mask);
49 } while (guess != oldval); 48 } while (guess != oldval);
50} 49}
51 50
@@ -90,8 +89,7 @@ static inline int test_and_change_bit(unsigned nr,
90 oldval = *addr; 89 oldval = *addr;
91 do { 90 do {
92 guess = oldval; 91 guess = oldval;
93 oldval = atomic64_cmpxchg((atomic64_t *)addr, 92 oldval = cmpxchg(addr, guess, guess ^ mask);
94 guess, guess ^ mask);
95 } while (guess != oldval); 93 } while (guess != oldval);
96 return (oldval & mask) != 0; 94 return (oldval & mask) != 0;
97} 95}
diff --git a/arch/tile/include/asm/cache.h b/arch/tile/include/asm/cache.h
index a9a529964e07..6160761d5f61 100644
--- a/arch/tile/include/asm/cache.h
+++ b/arch/tile/include/asm/cache.h
@@ -49,9 +49,16 @@
49#define __read_mostly __attribute__((__section__(".data..read_mostly"))) 49#define __read_mostly __attribute__((__section__(".data..read_mostly")))
50 50
51/* 51/*
52 * Attribute for data that is kept read/write coherent until the end of 52 * Originally we used small TLB pages for kernel data and grouped some
53 * initialization, then bumped to read/only incoherent for performance. 53 * things together as "write once", enforcing the property at the end
54 * of initialization by making those pages read-only and non-coherent.
55 * This allowed better cache utilization since cache inclusion did not
56 * need to be maintained. However, to do this requires an extra TLB
57 * entry, which on balance is more of a performance hit than the
58 * non-coherence is a performance gain, so we now just make "read
59 * mostly" and "write once" be synonyms. We keep the attribute
60 * separate in case we change our minds at a future date.
54 */ 61 */
55#define __write_once __attribute__((__section__(".w1data"))) 62#define __write_once __read_mostly
56 63
57#endif /* _ASM_TILE_CACHE_H */ 64#endif /* _ASM_TILE_CACHE_H */
diff --git a/arch/tile/include/asm/cacheflush.h b/arch/tile/include/asm/cacheflush.h
index 0fc63c488edf..92ee4c8a4f76 100644
--- a/arch/tile/include/asm/cacheflush.h
+++ b/arch/tile/include/asm/cacheflush.h
@@ -75,23 +75,6 @@ static inline void copy_to_user_page(struct vm_area_struct *vma,
75#define copy_from_user_page(vma, page, vaddr, dst, src, len) \ 75#define copy_from_user_page(vma, page, vaddr, dst, src, len) \
76 memcpy((dst), (src), (len)) 76 memcpy((dst), (src), (len))
77 77
78/*
79 * Invalidate a VA range; pads to L2 cacheline boundaries.
80 *
81 * Note that on TILE64, __inv_buffer() actually flushes modified
82 * cache lines in addition to invalidating them, i.e., it's the
83 * same as __finv_buffer().
84 */
85static inline void __inv_buffer(void *buffer, size_t size)
86{
87 char *next = (char *)((long)buffer & -L2_CACHE_BYTES);
88 char *finish = (char *)L2_CACHE_ALIGN((long)buffer + size);
89 while (next < finish) {
90 __insn_inv(next);
91 next += CHIP_INV_STRIDE();
92 }
93}
94
95/* Flush a VA range; pads to L2 cacheline boundaries. */ 78/* Flush a VA range; pads to L2 cacheline boundaries. */
96static inline void __flush_buffer(void *buffer, size_t size) 79static inline void __flush_buffer(void *buffer, size_t size)
97{ 80{
@@ -115,13 +98,6 @@ static inline void __finv_buffer(void *buffer, size_t size)
115} 98}
116 99
117 100
118/* Invalidate a VA range and wait for it to be complete. */
119static inline void inv_buffer(void *buffer, size_t size)
120{
121 __inv_buffer(buffer, size);
122 mb();
123}
124
125/* 101/*
126 * Flush a locally-homecached VA range and wait for the evicted 102 * Flush a locally-homecached VA range and wait for the evicted
127 * cachelines to hit memory. 103 * cachelines to hit memory.
@@ -142,6 +118,26 @@ static inline void finv_buffer_local(void *buffer, size_t size)
142 mb_incoherent(); 118 mb_incoherent();
143} 119}
144 120
121#ifdef __tilepro__
122/* Invalidate a VA range; pads to L2 cacheline boundaries. */
123static inline void __inv_buffer(void *buffer, size_t size)
124{
125 char *next = (char *)((long)buffer & -L2_CACHE_BYTES);
126 char *finish = (char *)L2_CACHE_ALIGN((long)buffer + size);
127 while (next < finish) {
128 __insn_inv(next);
129 next += CHIP_INV_STRIDE();
130 }
131}
132
133/* Invalidate a VA range and wait for it to be complete. */
134static inline void inv_buffer(void *buffer, size_t size)
135{
136 __inv_buffer(buffer, size);
137 mb();
138}
139#endif
140
145/* 141/*
146 * Flush and invalidate a VA range that is homed remotely, waiting 142 * Flush and invalidate a VA range that is homed remotely, waiting
147 * until the memory controller holds the flushed values. If "hfh" is 143 * until the memory controller holds the flushed values. If "hfh" is
diff --git a/arch/tile/include/asm/cmpxchg.h b/arch/tile/include/asm/cmpxchg.h
index 276f067e3640..4001d5eab4bb 100644
--- a/arch/tile/include/asm/cmpxchg.h
+++ b/arch/tile/include/asm/cmpxchg.h
@@ -20,53 +20,108 @@
20 20
21#ifndef __ASSEMBLY__ 21#ifndef __ASSEMBLY__
22 22
23/* Nonexistent functions intended to cause link errors. */ 23#include <asm/barrier.h>
24extern unsigned long __xchg_called_with_bad_pointer(void);
25extern unsigned long __cmpxchg_called_with_bad_pointer(void);
26 24
27#define xchg(ptr, x) \ 25/* Nonexistent functions intended to cause compile errors. */
26extern void __xchg_called_with_bad_pointer(void)
27 __compiletime_error("Bad argument size for xchg");
28extern void __cmpxchg_called_with_bad_pointer(void)
29 __compiletime_error("Bad argument size for cmpxchg");
30
31#ifndef __tilegx__
32
33/* Note the _atomic_xxx() routines include a final mb(). */
34int _atomic_xchg(int *ptr, int n);
35int _atomic_xchg_add(int *v, int i);
36int _atomic_xchg_add_unless(int *v, int a, int u);
37int _atomic_cmpxchg(int *ptr, int o, int n);
38u64 _atomic64_xchg(u64 *v, u64 n);
39u64 _atomic64_xchg_add(u64 *v, u64 i);
40u64 _atomic64_xchg_add_unless(u64 *v, u64 a, u64 u);
41u64 _atomic64_cmpxchg(u64 *v, u64 o, u64 n);
42
43#define xchg(ptr, n) \
44 ({ \
45 if (sizeof(*(ptr)) != 4) \
46 __xchg_called_with_bad_pointer(); \
47 smp_mb(); \
48 (typeof(*(ptr)))_atomic_xchg((int *)(ptr), (int)(n)); \
49 })
50
51#define cmpxchg(ptr, o, n) \
52 ({ \
53 if (sizeof(*(ptr)) != 4) \
54 __cmpxchg_called_with_bad_pointer(); \
55 smp_mb(); \
56 (typeof(*(ptr)))_atomic_cmpxchg((int *)ptr, (int)o, (int)n); \
57 })
58
59#define xchg64(ptr, n) \
60 ({ \
61 if (sizeof(*(ptr)) != 8) \
62 __xchg_called_with_bad_pointer(); \
63 smp_mb(); \
64 (typeof(*(ptr)))_atomic64_xchg((u64 *)(ptr), (u64)(n)); \
65 })
66
67#define cmpxchg64(ptr, o, n) \
68 ({ \
69 if (sizeof(*(ptr)) != 8) \
70 __cmpxchg_called_with_bad_pointer(); \
71 smp_mb(); \
72 (typeof(*(ptr)))_atomic64_cmpxchg((u64 *)ptr, (u64)o, (u64)n); \
73 })
74
75#else
76
77#define xchg(ptr, n) \
28 ({ \ 78 ({ \
29 typeof(*(ptr)) __x; \ 79 typeof(*(ptr)) __x; \
80 smp_mb(); \
30 switch (sizeof(*(ptr))) { \ 81 switch (sizeof(*(ptr))) { \
31 case 4: \ 82 case 4: \
32 __x = (typeof(__x))(typeof(__x-__x))atomic_xchg( \ 83 __x = (typeof(__x))(unsigned long) \
33 (atomic_t *)(ptr), \ 84 __insn_exch4((ptr), (u32)(unsigned long)(n)); \
34 (u32)(typeof((x)-(x)))(x)); \
35 break; \ 85 break; \
36 case 8: \ 86 case 8: \
37 __x = (typeof(__x))(typeof(__x-__x))atomic64_xchg( \ 87 __x = (typeof(__x)) \
38 (atomic64_t *)(ptr), \ 88 __insn_exch((ptr), (unsigned long)(n)); \
39 (u64)(typeof((x)-(x)))(x)); \
40 break; \ 89 break; \
41 default: \ 90 default: \
42 __xchg_called_with_bad_pointer(); \ 91 __xchg_called_with_bad_pointer(); \
92 break; \
43 } \ 93 } \
94 smp_mb(); \
44 __x; \ 95 __x; \
45 }) 96 })
46 97
47#define cmpxchg(ptr, o, n) \ 98#define cmpxchg(ptr, o, n) \
48 ({ \ 99 ({ \
49 typeof(*(ptr)) __x; \ 100 typeof(*(ptr)) __x; \
101 __insn_mtspr(SPR_CMPEXCH_VALUE, (unsigned long)(o)); \
102 smp_mb(); \
50 switch (sizeof(*(ptr))) { \ 103 switch (sizeof(*(ptr))) { \
51 case 4: \ 104 case 4: \
52 __x = (typeof(__x))(typeof(__x-__x))atomic_cmpxchg( \ 105 __x = (typeof(__x))(unsigned long) \
53 (atomic_t *)(ptr), \ 106 __insn_cmpexch4((ptr), (u32)(unsigned long)(n)); \
54 (u32)(typeof((o)-(o)))(o), \
55 (u32)(typeof((n)-(n)))(n)); \
56 break; \ 107 break; \
57 case 8: \ 108 case 8: \
58 __x = (typeof(__x))(typeof(__x-__x))atomic64_cmpxchg( \ 109 __x = (typeof(__x))__insn_cmpexch((ptr), (u64)(n)); \
59 (atomic64_t *)(ptr), \
60 (u64)(typeof((o)-(o)))(o), \
61 (u64)(typeof((n)-(n)))(n)); \
62 break; \ 110 break; \
63 default: \ 111 default: \
64 __cmpxchg_called_with_bad_pointer(); \ 112 __cmpxchg_called_with_bad_pointer(); \
113 break; \
65 } \ 114 } \
115 smp_mb(); \
66 __x; \ 116 __x; \
67 }) 117 })
68 118
69#define tas(ptr) (xchg((ptr), 1)) 119#define xchg64 xchg
120#define cmpxchg64 cmpxchg
121
122#endif
123
124#define tas(ptr) xchg((ptr), 1)
70 125
71#endif /* __ASSEMBLY__ */ 126#endif /* __ASSEMBLY__ */
72 127
diff --git a/arch/tile/include/asm/device.h b/arch/tile/include/asm/device.h
index 5182705bd056..6ab8bf146d4c 100644
--- a/arch/tile/include/asm/device.h
+++ b/arch/tile/include/asm/device.h
@@ -23,7 +23,10 @@ struct dev_archdata {
23 /* Offset of the DMA address from the PA. */ 23 /* Offset of the DMA address from the PA. */
24 dma_addr_t dma_offset; 24 dma_addr_t dma_offset;
25 25
26 /* Highest DMA address that can be generated by this device. */ 26 /*
27 * Highest DMA address that can be generated by devices that
28 * have limited DMA capability, i.e. non 64-bit capable.
29 */
27 dma_addr_t max_direct_dma_addr; 30 dma_addr_t max_direct_dma_addr;
28}; 31};
29 32
diff --git a/arch/tile/include/asm/dma-mapping.h b/arch/tile/include/asm/dma-mapping.h
index f2ff191376b4..1eae359d8315 100644
--- a/arch/tile/include/asm/dma-mapping.h
+++ b/arch/tile/include/asm/dma-mapping.h
@@ -20,9 +20,14 @@
20#include <linux/cache.h> 20#include <linux/cache.h>
21#include <linux/io.h> 21#include <linux/io.h>
22 22
23#ifdef __tilegx__
24#define ARCH_HAS_DMA_GET_REQUIRED_MASK
25#endif
26
23extern struct dma_map_ops *tile_dma_map_ops; 27extern struct dma_map_ops *tile_dma_map_ops;
24extern struct dma_map_ops *gx_pci_dma_map_ops; 28extern struct dma_map_ops *gx_pci_dma_map_ops;
25extern struct dma_map_ops *gx_legacy_pci_dma_map_ops; 29extern struct dma_map_ops *gx_legacy_pci_dma_map_ops;
30extern struct dma_map_ops *gx_hybrid_pci_dma_map_ops;
26 31
27static inline struct dma_map_ops *get_dma_ops(struct device *dev) 32static inline struct dma_map_ops *get_dma_ops(struct device *dev)
28{ 33{
@@ -44,12 +49,12 @@ static inline void set_dma_offset(struct device *dev, dma_addr_t off)
44 49
45static inline dma_addr_t phys_to_dma(struct device *dev, phys_addr_t paddr) 50static inline dma_addr_t phys_to_dma(struct device *dev, phys_addr_t paddr)
46{ 51{
47 return paddr + get_dma_offset(dev); 52 return paddr;
48} 53}
49 54
50static inline phys_addr_t dma_to_phys(struct device *dev, dma_addr_t daddr) 55static inline phys_addr_t dma_to_phys(struct device *dev, dma_addr_t daddr)
51{ 56{
52 return daddr - get_dma_offset(dev); 57 return daddr;
53} 58}
54 59
55static inline void dma_mark_clean(void *addr, size_t size) {} 60static inline void dma_mark_clean(void *addr, size_t size) {}
@@ -87,11 +92,19 @@ dma_set_mask(struct device *dev, u64 mask)
87{ 92{
88 struct dma_map_ops *dma_ops = get_dma_ops(dev); 93 struct dma_map_ops *dma_ops = get_dma_ops(dev);
89 94
90 /* Handle legacy PCI devices with limited memory addressability. */ 95 /*
91 if ((dma_ops == gx_pci_dma_map_ops) && (mask <= DMA_BIT_MASK(32))) { 96 * For PCI devices with 64-bit DMA addressing capability, promote
92 set_dma_ops(dev, gx_legacy_pci_dma_map_ops); 97 * the dma_ops to hybrid, with the consistent memory DMA space limited
93 set_dma_offset(dev, 0); 98 * to 32-bit. For 32-bit capable devices, limit the streaming DMA
94 if (mask > dev->archdata.max_direct_dma_addr) 99 * address range to max_direct_dma_addr.
100 */
101 if (dma_ops == gx_pci_dma_map_ops ||
102 dma_ops == gx_hybrid_pci_dma_map_ops ||
103 dma_ops == gx_legacy_pci_dma_map_ops) {
104 if (mask == DMA_BIT_MASK(64) &&
105 dma_ops == gx_legacy_pci_dma_map_ops)
106 set_dma_ops(dev, gx_hybrid_pci_dma_map_ops);
107 else if (mask > dev->archdata.max_direct_dma_addr)
95 mask = dev->archdata.max_direct_dma_addr; 108 mask = dev->archdata.max_direct_dma_addr;
96 } 109 }
97 110
diff --git a/arch/tile/include/asm/elf.h b/arch/tile/include/asm/elf.h
index ff8a93408823..41d9878a9686 100644
--- a/arch/tile/include/asm/elf.h
+++ b/arch/tile/include/asm/elf.h
@@ -30,7 +30,6 @@ typedef unsigned long elf_greg_t;
30#define ELF_NGREG (sizeof(struct pt_regs) / sizeof(elf_greg_t)) 30#define ELF_NGREG (sizeof(struct pt_regs) / sizeof(elf_greg_t))
31typedef elf_greg_t elf_gregset_t[ELF_NGREG]; 31typedef elf_greg_t elf_gregset_t[ELF_NGREG];
32 32
33#define EM_TILE64 187
34#define EM_TILEPRO 188 33#define EM_TILEPRO 188
35#define EM_TILEGX 191 34#define EM_TILEGX 191
36 35
@@ -132,6 +131,15 @@ extern int dump_task_regs(struct task_struct *, elf_gregset_t *);
132struct linux_binprm; 131struct linux_binprm;
133extern int arch_setup_additional_pages(struct linux_binprm *bprm, 132extern int arch_setup_additional_pages(struct linux_binprm *bprm,
134 int executable_stack); 133 int executable_stack);
134#define ARCH_DLINFO \
135do { \
136 NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_BASE); \
137} while (0)
138
139struct mm_struct;
140extern unsigned long arch_randomize_brk(struct mm_struct *mm);
141#define arch_randomize_brk arch_randomize_brk
142
135#ifdef CONFIG_COMPAT 143#ifdef CONFIG_COMPAT
136 144
137#define COMPAT_ELF_PLATFORM "tilegx-m32" 145#define COMPAT_ELF_PLATFORM "tilegx-m32"
diff --git a/arch/tile/include/asm/fixmap.h b/arch/tile/include/asm/fixmap.h
index e16dbf929cb5..c6b9c1b38fd1 100644
--- a/arch/tile/include/asm/fixmap.h
+++ b/arch/tile/include/asm/fixmap.h
@@ -78,14 +78,6 @@ enum fixed_addresses {
78#endif 78#endif
79}; 79};
80 80
81extern void __set_fixmap(enum fixed_addresses idx,
82 unsigned long phys, pgprot_t flags);
83
84#define set_fixmap(idx, phys) \
85 __set_fixmap(idx, phys, PAGE_KERNEL)
86#define clear_fixmap(idx) \
87 __set_fixmap(idx, 0, __pgprot(0))
88
89#define __FIXADDR_SIZE (__end_of_permanent_fixed_addresses << PAGE_SHIFT) 81#define __FIXADDR_SIZE (__end_of_permanent_fixed_addresses << PAGE_SHIFT)
90#define __FIXADDR_BOOT_SIZE (__end_of_fixed_addresses << PAGE_SHIFT) 82#define __FIXADDR_BOOT_SIZE (__end_of_fixed_addresses << PAGE_SHIFT)
91#define FIXADDR_START (FIXADDR_TOP + PAGE_SIZE - __FIXADDR_SIZE) 83#define FIXADDR_START (FIXADDR_TOP + PAGE_SIZE - __FIXADDR_SIZE)
diff --git a/arch/tile/include/asm/ftrace.h b/arch/tile/include/asm/ftrace.h
index 461459b06d98..13a9bb81a8ab 100644
--- a/arch/tile/include/asm/ftrace.h
+++ b/arch/tile/include/asm/ftrace.h
@@ -15,6 +15,26 @@
15#ifndef _ASM_TILE_FTRACE_H 15#ifndef _ASM_TILE_FTRACE_H
16#define _ASM_TILE_FTRACE_H 16#define _ASM_TILE_FTRACE_H
17 17
18/* empty */ 18#ifdef CONFIG_FUNCTION_TRACER
19
20#define MCOUNT_ADDR ((unsigned long)(__mcount))
21#define MCOUNT_INSN_SIZE 8 /* sizeof mcount call */
22
23#ifndef __ASSEMBLY__
24extern void __mcount(void);
25
26#ifdef CONFIG_DYNAMIC_FTRACE
27static inline unsigned long ftrace_call_adjust(unsigned long addr)
28{
29 return addr;
30}
31
32struct dyn_arch_ftrace {
33};
34#endif /* CONFIG_DYNAMIC_FTRACE */
35
36#endif /* __ASSEMBLY__ */
37
38#endif /* CONFIG_FUNCTION_TRACER */
19 39
20#endif /* _ASM_TILE_FTRACE_H */ 40#endif /* _ASM_TILE_FTRACE_H */
diff --git a/arch/tile/include/asm/futex.h b/arch/tile/include/asm/futex.h
index 5909ac3d7218..1a6ef1b69cb1 100644
--- a/arch/tile/include/asm/futex.h
+++ b/arch/tile/include/asm/futex.h
@@ -43,6 +43,7 @@
43 ".pushsection .fixup,\"ax\"\n" \ 43 ".pushsection .fixup,\"ax\"\n" \
44 "0: { movei %0, %5; j 9f }\n" \ 44 "0: { movei %0, %5; j 9f }\n" \
45 ".section __ex_table,\"a\"\n" \ 45 ".section __ex_table,\"a\"\n" \
46 ".align 8\n" \
46 ".quad 1b, 0b\n" \ 47 ".quad 1b, 0b\n" \
47 ".popsection\n" \ 48 ".popsection\n" \
48 "9:" \ 49 "9:" \
diff --git a/arch/tile/include/asm/homecache.h b/arch/tile/include/asm/homecache.h
index 7b7771328642..7ddd1b8d6910 100644
--- a/arch/tile/include/asm/homecache.h
+++ b/arch/tile/include/asm/homecache.h
@@ -33,8 +33,7 @@ struct zone;
33 33
34/* 34/*
35 * Is this page immutable (unwritable) and thus able to be cached more 35 * Is this page immutable (unwritable) and thus able to be cached more
36 * widely than would otherwise be possible? On tile64 this means we 36 * widely than would otherwise be possible? This means we have "nc" set.
37 * mark the PTE to cache locally; on tilepro it means we have "nc" set.
38 */ 37 */
39#define PAGE_HOME_IMMUTABLE -2 38#define PAGE_HOME_IMMUTABLE -2
40 39
@@ -44,16 +43,8 @@ struct zone;
44 */ 43 */
45#define PAGE_HOME_INCOHERENT -3 44#define PAGE_HOME_INCOHERENT -3
46 45
47#if CHIP_HAS_CBOX_HOME_MAP()
48/* Home for the page is distributed via hash-for-home. */ 46/* Home for the page is distributed via hash-for-home. */
49#define PAGE_HOME_HASH -4 47#define PAGE_HOME_HASH -4
50#endif
51
52/* Homing is unknown or unspecified. Not valid for page_home(). */
53#define PAGE_HOME_UNKNOWN -5
54
55/* Home on the current cpu. Not valid for page_home(). */
56#define PAGE_HOME_HERE -6
57 48
58/* Support wrapper to use instead of explicit hv_flush_remote(). */ 49/* Support wrapper to use instead of explicit hv_flush_remote(). */
59extern void flush_remote(unsigned long cache_pfn, unsigned long cache_length, 50extern void flush_remote(unsigned long cache_pfn, unsigned long cache_length,
diff --git a/arch/tile/include/asm/io.h b/arch/tile/include/asm/io.h
index 31672918064c..9fe434969fab 100644
--- a/arch/tile/include/asm/io.h
+++ b/arch/tile/include/asm/io.h
@@ -19,7 +19,8 @@
19#include <linux/bug.h> 19#include <linux/bug.h>
20#include <asm/page.h> 20#include <asm/page.h>
21 21
22#define IO_SPACE_LIMIT 0xfffffffful 22/* Maximum PCI I/O space address supported. */
23#define IO_SPACE_LIMIT 0xffffffff
23 24
24/* 25/*
25 * Convert a physical pointer to a virtual kernel pointer for /dev/mem 26 * Convert a physical pointer to a virtual kernel pointer for /dev/mem
@@ -254,7 +255,7 @@ static inline void writeq(u64 val, unsigned long addr)
254 255
255static inline void memset_io(volatile void *dst, int val, size_t len) 256static inline void memset_io(volatile void *dst, int val, size_t len)
256{ 257{
257 int x; 258 size_t x;
258 BUG_ON((unsigned long)dst & 0x3); 259 BUG_ON((unsigned long)dst & 0x3);
259 val = (val & 0xff) * 0x01010101; 260 val = (val & 0xff) * 0x01010101;
260 for (x = 0; x < len; x += 4) 261 for (x = 0; x < len; x += 4)
@@ -264,7 +265,7 @@ static inline void memset_io(volatile void *dst, int val, size_t len)
264static inline void memcpy_fromio(void *dst, const volatile void __iomem *src, 265static inline void memcpy_fromio(void *dst, const volatile void __iomem *src,
265 size_t len) 266 size_t len)
266{ 267{
267 int x; 268 size_t x;
268 BUG_ON((unsigned long)src & 0x3); 269 BUG_ON((unsigned long)src & 0x3);
269 for (x = 0; x < len; x += 4) 270 for (x = 0; x < len; x += 4)
270 *(u32 *)(dst + x) = readl(src + x); 271 *(u32 *)(dst + x) = readl(src + x);
@@ -273,7 +274,7 @@ static inline void memcpy_fromio(void *dst, const volatile void __iomem *src,
273static inline void memcpy_toio(volatile void __iomem *dst, const void *src, 274static inline void memcpy_toio(volatile void __iomem *dst, const void *src,
274 size_t len) 275 size_t len)
275{ 276{
276 int x; 277 size_t x;
277 BUG_ON((unsigned long)dst & 0x3); 278 BUG_ON((unsigned long)dst & 0x3);
278 for (x = 0; x < len; x += 4) 279 for (x = 0; x < len; x += 4)
279 writel(*(u32 *)(src + x), dst + x); 280 writel(*(u32 *)(src + x), dst + x);
@@ -281,8 +282,108 @@ static inline void memcpy_toio(volatile void __iomem *dst, const void *src,
281 282
282#endif 283#endif
283 284
285#if CHIP_HAS_MMIO() && defined(CONFIG_TILE_PCI_IO)
286
287static inline u8 inb(unsigned long addr)
288{
289 return readb((volatile void __iomem *) addr);
290}
291
292static inline u16 inw(unsigned long addr)
293{
294 return readw((volatile void __iomem *) addr);
295}
296
297static inline u32 inl(unsigned long addr)
298{
299 return readl((volatile void __iomem *) addr);
300}
301
302static inline void outb(u8 b, unsigned long addr)
303{
304 writeb(b, (volatile void __iomem *) addr);
305}
306
307static inline void outw(u16 b, unsigned long addr)
308{
309 writew(b, (volatile void __iomem *) addr);
310}
311
312static inline void outl(u32 b, unsigned long addr)
313{
314 writel(b, (volatile void __iomem *) addr);
315}
316
317static inline void insb(unsigned long addr, void *buffer, int count)
318{
319 if (count) {
320 u8 *buf = buffer;
321 do {
322 u8 x = inb(addr);
323 *buf++ = x;
324 } while (--count);
325 }
326}
327
328static inline void insw(unsigned long addr, void *buffer, int count)
329{
330 if (count) {
331 u16 *buf = buffer;
332 do {
333 u16 x = inw(addr);
334 *buf++ = x;
335 } while (--count);
336 }
337}
338
339static inline void insl(unsigned long addr, void *buffer, int count)
340{
341 if (count) {
342 u32 *buf = buffer;
343 do {
344 u32 x = inl(addr);
345 *buf++ = x;
346 } while (--count);
347 }
348}
349
350static inline void outsb(unsigned long addr, const void *buffer, int count)
351{
352 if (count) {
353 const u8 *buf = buffer;
354 do {
355 outb(*buf++, addr);
356 } while (--count);
357 }
358}
359
360static inline void outsw(unsigned long addr, const void *buffer, int count)
361{
362 if (count) {
363 const u16 *buf = buffer;
364 do {
365 outw(*buf++, addr);
366 } while (--count);
367 }
368}
369
370static inline void outsl(unsigned long addr, const void *buffer, int count)
371{
372 if (count) {
373 const u32 *buf = buffer;
374 do {
375 outl(*buf++, addr);
376 } while (--count);
377 }
378}
379
380extern void __iomem *ioport_map(unsigned long port, unsigned int len);
381extern void ioport_unmap(void __iomem *addr);
382
383#else
384
284/* 385/*
285 * The Tile architecture does not support IOPORT, even with PCI. 386 * The TilePro architecture does not support IOPORT, even with PCI.
286 * Unfortunately we can't yet simply not declare these methods, 387 * Unfortunately we can't yet simply not declare these methods,
287 * since some generic code that compiles into the kernel, but 388 * since some generic code that compiles into the kernel, but
288 * we never run, uses them unconditionally. 389 * we never run, uses them unconditionally.
@@ -290,7 +391,12 @@ static inline void memcpy_toio(volatile void __iomem *dst, const void *src,
290 391
291static inline long ioport_panic(void) 392static inline long ioport_panic(void)
292{ 393{
394#ifdef __tilegx__
395 panic("PCI IO space support is disabled. Configure the kernel with"
396 " CONFIG_TILE_PCI_IO to enable it");
397#else
293 panic("inb/outb and friends do not exist on tile"); 398 panic("inb/outb and friends do not exist on tile");
399#endif
294 return 0; 400 return 0;
295} 401}
296 402
@@ -335,13 +441,6 @@ static inline void outl(u32 b, unsigned long addr)
335 ioport_panic(); 441 ioport_panic();
336} 442}
337 443
338#define inb_p(addr) inb(addr)
339#define inw_p(addr) inw(addr)
340#define inl_p(addr) inl(addr)
341#define outb_p(x, addr) outb((x), (addr))
342#define outw_p(x, addr) outw((x), (addr))
343#define outl_p(x, addr) outl((x), (addr))
344
345static inline void insb(unsigned long addr, void *buffer, int count) 444static inline void insb(unsigned long addr, void *buffer, int count)
346{ 445{
347 ioport_panic(); 446 ioport_panic();
@@ -372,6 +471,15 @@ static inline void outsl(unsigned long addr, const void *buffer, int count)
372 ioport_panic(); 471 ioport_panic();
373} 472}
374 473
474#endif /* CHIP_HAS_MMIO() && defined(CONFIG_TILE_PCI_IO) */
475
476#define inb_p(addr) inb(addr)
477#define inw_p(addr) inw(addr)
478#define inl_p(addr) inl(addr)
479#define outb_p(x, addr) outb((x), (addr))
480#define outw_p(x, addr) outw((x), (addr))
481#define outl_p(x, addr) outl((x), (addr))
482
375#define ioread16be(addr) be16_to_cpu(ioread16(addr)) 483#define ioread16be(addr) be16_to_cpu(ioread16(addr))
376#define ioread32be(addr) be32_to_cpu(ioread32(addr)) 484#define ioread32be(addr) be32_to_cpu(ioread32(addr))
377#define iowrite16be(v, addr) iowrite16(be16_to_cpu(v), (addr)) 485#define iowrite16be(v, addr) iowrite16(be16_to_cpu(v), (addr))
diff --git a/arch/tile/include/asm/irqflags.h b/arch/tile/include/asm/irqflags.h
index c96f9bbb760d..71af5747874d 100644
--- a/arch/tile/include/asm/irqflags.h
+++ b/arch/tile/include/asm/irqflags.h
@@ -124,6 +124,12 @@
124DECLARE_PER_CPU(unsigned long long, interrupts_enabled_mask); 124DECLARE_PER_CPU(unsigned long long, interrupts_enabled_mask);
125#define INITIAL_INTERRUPTS_ENABLED (1ULL << INT_MEM_ERROR) 125#define INITIAL_INTERRUPTS_ENABLED (1ULL << INT_MEM_ERROR)
126 126
127#ifdef CONFIG_DEBUG_PREEMPT
128/* Due to inclusion issues, we can't rely on <linux/smp.h> here. */
129extern unsigned int debug_smp_processor_id(void);
130# define smp_processor_id() debug_smp_processor_id()
131#endif
132
127/* Disable interrupts. */ 133/* Disable interrupts. */
128#define arch_local_irq_disable() \ 134#define arch_local_irq_disable() \
129 interrupt_mask_set_mask(LINUX_MASKABLE_INTERRUPTS) 135 interrupt_mask_set_mask(LINUX_MASKABLE_INTERRUPTS)
@@ -132,9 +138,18 @@ DECLARE_PER_CPU(unsigned long long, interrupts_enabled_mask);
132#define arch_local_irq_disable_all() \ 138#define arch_local_irq_disable_all() \
133 interrupt_mask_set_mask(-1ULL) 139 interrupt_mask_set_mask(-1ULL)
134 140
141/*
142 * Read the set of maskable interrupts.
143 * We avoid the preemption warning here via __this_cpu_ptr since even
144 * if irqs are already enabled, it's harmless to read the wrong cpu's
145 * enabled mask.
146 */
147#define arch_local_irqs_enabled() \
148 (*__this_cpu_ptr(&interrupts_enabled_mask))
149
135/* Re-enable all maskable interrupts. */ 150/* Re-enable all maskable interrupts. */
136#define arch_local_irq_enable() \ 151#define arch_local_irq_enable() \
137 interrupt_mask_reset_mask(__get_cpu_var(interrupts_enabled_mask)) 152 interrupt_mask_reset_mask(arch_local_irqs_enabled())
138 153
139/* Disable or enable interrupts based on flag argument. */ 154/* Disable or enable interrupts based on flag argument. */
140#define arch_local_irq_restore(disabled) do { \ 155#define arch_local_irq_restore(disabled) do { \
@@ -161,7 +176,7 @@ DECLARE_PER_CPU(unsigned long long, interrupts_enabled_mask);
161 176
162/* Prevent the given interrupt from being enabled next time we enable irqs. */ 177/* Prevent the given interrupt from being enabled next time we enable irqs. */
163#define arch_local_irq_mask(interrupt) \ 178#define arch_local_irq_mask(interrupt) \
164 (__get_cpu_var(interrupts_enabled_mask) &= ~(1ULL << (interrupt))) 179 this_cpu_and(interrupts_enabled_mask, ~(1ULL << (interrupt)))
165 180
166/* Prevent the given interrupt from being enabled immediately. */ 181/* Prevent the given interrupt from being enabled immediately. */
167#define arch_local_irq_mask_now(interrupt) do { \ 182#define arch_local_irq_mask_now(interrupt) do { \
@@ -171,7 +186,7 @@ DECLARE_PER_CPU(unsigned long long, interrupts_enabled_mask);
171 186
172/* Allow the given interrupt to be enabled next time we enable irqs. */ 187/* Allow the given interrupt to be enabled next time we enable irqs. */
173#define arch_local_irq_unmask(interrupt) \ 188#define arch_local_irq_unmask(interrupt) \
174 (__get_cpu_var(interrupts_enabled_mask) |= (1ULL << (interrupt))) 189 this_cpu_or(interrupts_enabled_mask, (1ULL << (interrupt)))
175 190
176/* Allow the given interrupt to be enabled immediately, if !irqs_disabled. */ 191/* Allow the given interrupt to be enabled immediately, if !irqs_disabled. */
177#define arch_local_irq_unmask_now(interrupt) do { \ 192#define arch_local_irq_unmask_now(interrupt) do { \
diff --git a/arch/tile/include/asm/hw_irq.h b/arch/tile/include/asm/kdebug.h
index 4fac5fbf333e..5bbbfa904c2d 100644
--- a/arch/tile/include/asm/hw_irq.h
+++ b/arch/tile/include/asm/kdebug.h
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved. 2 * Copyright 2012 Tilera Corporation. All Rights Reserved.
3 * 3 *
4 * This program is free software; you can redistribute it and/or 4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License 5 * modify it under the terms of the GNU General Public License
@@ -12,7 +12,17 @@
12 * more details. 12 * more details.
13 */ 13 */
14 14
15#ifndef _ASM_TILE_HW_IRQ_H 15#ifndef _ASM_TILE_KDEBUG_H
16#define _ASM_TILE_HW_IRQ_H 16#define _ASM_TILE_KDEBUG_H
17 17
18#endif /* _ASM_TILE_HW_IRQ_H */ 18#include <linux/notifier.h>
19
20enum die_val {
21 DIE_OOPS = 1,
22 DIE_BREAK,
23 DIE_SSTEPBP,
24 DIE_PAGE_FAULT,
25 DIE_COMPILED_BPT
26};
27
28#endif /* _ASM_TILE_KDEBUG_H */
diff --git a/arch/tile/include/asm/kgdb.h b/arch/tile/include/asm/kgdb.h
new file mode 100644
index 000000000000..280c181cf0db
--- /dev/null
+++ b/arch/tile/include/asm/kgdb.h
@@ -0,0 +1,71 @@
1/*
2 * Copyright 2013 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 *
14 * TILE-Gx KGDB support.
15 */
16
17#ifndef __TILE_KGDB_H__
18#define __TILE_KGDB_H__
19
20#include <linux/kdebug.h>
21#include <arch/opcode.h>
22
23#define GDB_SIZEOF_REG sizeof(unsigned long)
24
25/*
26 * TILE-Gx gdb is expecting the following register layout:
27 * 56 GPRs(R0 - R52, TP, SP, LR), 8 special GPRs(networks and ZERO),
28 * plus the PC and the faultnum.
29 *
30 * Even though kernel not use the 8 special GPRs, they need to be present
31 * in the registers sent for correct processing in the host-side gdb.
32 *
33 */
34#define DBG_MAX_REG_NUM (56+8+2)
35#define NUMREGBYTES (DBG_MAX_REG_NUM * GDB_SIZEOF_REG)
36
37/*
38 * BUFMAX defines the maximum number of characters in inbound/outbound
39 * buffers at least NUMREGBYTES*2 are needed for register packets,
40 * Longer buffer is needed to list all threads.
41 */
42#define BUFMAX 2048
43
44#define BREAK_INSTR_SIZE TILEGX_BUNDLE_SIZE_IN_BYTES
45
46/*
47 * Require cache flush for set/clear a software breakpoint or write memory.
48 */
49#define CACHE_FLUSH_IS_SAFE 1
50
51/*
52 * The compiled-in breakpoint instruction can be used to "break" into
53 * the debugger via magic system request key (sysrq-G).
54 */
55static tile_bundle_bits compiled_bpt = TILEGX_BPT_BUNDLE | DIE_COMPILED_BPT;
56
57enum tilegx_regnum {
58 TILEGX_PC_REGNUM = TREG_LAST_GPR + 9,
59 TILEGX_FAULTNUM_REGNUM,
60};
61
62/*
63 * Generate a breakpoint exception to "break" into the debugger.
64 */
65static inline void arch_kgdb_breakpoint(void)
66{
67 asm volatile (".quad %0\n\t"
68 ::""(compiled_bpt));
69}
70
71#endif /* __TILE_KGDB_H__ */
diff --git a/arch/tile/include/asm/kprobes.h b/arch/tile/include/asm/kprobes.h
new file mode 100644
index 000000000000..d8f9a83943b1
--- /dev/null
+++ b/arch/tile/include/asm/kprobes.h
@@ -0,0 +1,79 @@
1/*
2 * arch/tile/include/asm/kprobes.h
3 *
4 * Copyright 2012 Tilera Corporation. All Rights Reserved.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation, version 2.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
13 * NON INFRINGEMENT. See the GNU General Public License for
14 * more details.
15 */
16
17#ifndef _ASM_TILE_KPROBES_H
18#define _ASM_TILE_KPROBES_H
19
20#include <linux/types.h>
21#include <linux/ptrace.h>
22#include <linux/percpu.h>
23
24#include <arch/opcode.h>
25
26#define __ARCH_WANT_KPROBES_INSN_SLOT
27#define MAX_INSN_SIZE 2
28
29#define kretprobe_blacklist_size 0
30
31typedef tile_bundle_bits kprobe_opcode_t;
32
33#define flush_insn_slot(p) \
34 flush_icache_range((unsigned long)p->addr, \
35 (unsigned long)p->addr + \
36 (MAX_INSN_SIZE * sizeof(kprobe_opcode_t)))
37
38struct kprobe;
39
40/* Architecture specific copy of original instruction. */
41struct arch_specific_insn {
42 kprobe_opcode_t *insn;
43};
44
45struct prev_kprobe {
46 struct kprobe *kp;
47 unsigned long status;
48 unsigned long saved_pc;
49};
50
51#define MAX_JPROBES_STACK_SIZE 128
52#define MAX_JPROBES_STACK_ADDR \
53 (((unsigned long)current_thread_info()) + THREAD_SIZE - 32 \
54 - sizeof(struct pt_regs))
55
56#define MIN_JPROBES_STACK_SIZE(ADDR) \
57 ((((ADDR) + MAX_JPROBES_STACK_SIZE) > MAX_JPROBES_STACK_ADDR) \
58 ? MAX_JPROBES_STACK_ADDR - (ADDR) \
59 : MAX_JPROBES_STACK_SIZE)
60
61/* per-cpu kprobe control block. */
62struct kprobe_ctlblk {
63 unsigned long kprobe_status;
64 unsigned long kprobe_saved_pc;
65 unsigned long jprobe_saved_sp;
66 struct prev_kprobe prev_kprobe;
67 struct pt_regs jprobe_saved_regs;
68 char jprobes_stack[MAX_JPROBES_STACK_SIZE];
69};
70
71extern tile_bundle_bits breakpoint2_insn;
72extern tile_bundle_bits breakpoint_insn;
73
74void arch_remove_kprobe(struct kprobe *);
75
76extern int kprobe_exceptions_notify(struct notifier_block *self,
77 unsigned long val, void *data);
78
79#endif /* _ASM_TILE_KPROBES_H */
diff --git a/arch/tile/include/asm/mmu.h b/arch/tile/include/asm/mmu.h
index e2c789096795..0cab1182bde1 100644
--- a/arch/tile/include/asm/mmu.h
+++ b/arch/tile/include/asm/mmu.h
@@ -22,6 +22,7 @@ struct mm_context {
22 * semaphore but atomically, but it is conservatively set. 22 * semaphore but atomically, but it is conservatively set.
23 */ 23 */
24 unsigned long priority_cached; 24 unsigned long priority_cached;
25 unsigned long vdso_base;
25}; 26};
26 27
27typedef struct mm_context mm_context_t; 28typedef struct mm_context mm_context_t;
diff --git a/arch/tile/include/asm/mmu_context.h b/arch/tile/include/asm/mmu_context.h
index 37f0b741dee7..4734215e2ad4 100644
--- a/arch/tile/include/asm/mmu_context.h
+++ b/arch/tile/include/asm/mmu_context.h
@@ -45,7 +45,7 @@ static inline void __install_page_table(pgd_t *pgdir, int asid, pgprot_t prot)
45 45
46static inline void install_page_table(pgd_t *pgdir, int asid) 46static inline void install_page_table(pgd_t *pgdir, int asid)
47{ 47{
48 pte_t *ptep = virt_to_pte(NULL, (unsigned long)pgdir); 48 pte_t *ptep = virt_to_kpte((unsigned long)pgdir);
49 __install_page_table(pgdir, asid, *ptep); 49 __install_page_table(pgdir, asid, *ptep);
50} 50}
51 51
diff --git a/arch/tile/include/asm/mmzone.h b/arch/tile/include/asm/mmzone.h
index 9d3dbce8f953..804f1098b6cd 100644
--- a/arch/tile/include/asm/mmzone.h
+++ b/arch/tile/include/asm/mmzone.h
@@ -42,7 +42,7 @@ static inline int pfn_to_nid(unsigned long pfn)
42 42
43#define kern_addr_valid(kaddr) virt_addr_valid((void *)kaddr) 43#define kern_addr_valid(kaddr) virt_addr_valid((void *)kaddr)
44 44
45static inline int pfn_valid(int pfn) 45static inline int pfn_valid(unsigned long pfn)
46{ 46{
47 int nid = pfn_to_nid(pfn); 47 int nid = pfn_to_nid(pfn);
48 48
diff --git a/arch/tile/include/asm/page.h b/arch/tile/include/asm/page.h
index dd033a4fd627..672768008618 100644
--- a/arch/tile/include/asm/page.h
+++ b/arch/tile/include/asm/page.h
@@ -39,6 +39,12 @@
39#define HPAGE_MASK (~(HPAGE_SIZE - 1)) 39#define HPAGE_MASK (~(HPAGE_SIZE - 1))
40 40
41/* 41/*
42 * We do define AT_SYSINFO_EHDR to support vDSO,
43 * but don't use the gate mechanism.
44 */
45#define __HAVE_ARCH_GATE_AREA 1
46
47/*
42 * If the Kconfig doesn't specify, set a maximum zone order that 48 * If the Kconfig doesn't specify, set a maximum zone order that
43 * is enough so that we can create huge pages from small pages given 49 * is enough so that we can create huge pages from small pages given
44 * the respective sizes of the two page types. See <linux/mmzone.h>. 50 * the respective sizes of the two page types. See <linux/mmzone.h>.
@@ -142,8 +148,12 @@ static inline __attribute_const__ int get_order(unsigned long size)
142#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA 148#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
143#endif 149#endif
144 150
151/* Allow overriding how much VA or PA the kernel will use. */
152#define MAX_PA_WIDTH CHIP_PA_WIDTH()
153#define MAX_VA_WIDTH CHIP_VA_WIDTH()
154
145/* Each memory controller has PAs distinct in their high bits. */ 155/* Each memory controller has PAs distinct in their high bits. */
146#define NR_PA_HIGHBIT_SHIFT (CHIP_PA_WIDTH() - CHIP_LOG_NUM_MSHIMS()) 156#define NR_PA_HIGHBIT_SHIFT (MAX_PA_WIDTH - CHIP_LOG_NUM_MSHIMS())
147#define NR_PA_HIGHBIT_VALUES (1 << CHIP_LOG_NUM_MSHIMS()) 157#define NR_PA_HIGHBIT_VALUES (1 << CHIP_LOG_NUM_MSHIMS())
148#define __pa_to_highbits(pa) ((phys_addr_t)(pa) >> NR_PA_HIGHBIT_SHIFT) 158#define __pa_to_highbits(pa) ((phys_addr_t)(pa) >> NR_PA_HIGHBIT_SHIFT)
149#define __pfn_to_highbits(pfn) ((pfn) >> (NR_PA_HIGHBIT_SHIFT - PAGE_SHIFT)) 159#define __pfn_to_highbits(pfn) ((pfn) >> (NR_PA_HIGHBIT_SHIFT - PAGE_SHIFT))
@@ -154,7 +164,7 @@ static inline __attribute_const__ int get_order(unsigned long size)
154 * We reserve the lower half of memory for user-space programs, and the 164 * We reserve the lower half of memory for user-space programs, and the
155 * upper half for system code. We re-map all of physical memory in the 165 * upper half for system code. We re-map all of physical memory in the
156 * upper half, which takes a quarter of our VA space. Then we have 166 * upper half, which takes a quarter of our VA space. Then we have
157 * the vmalloc regions. The supervisor code lives at 0xfffffff700000000, 167 * the vmalloc regions. The supervisor code lives at the highest address,
158 * with the hypervisor above that. 168 * with the hypervisor above that.
159 * 169 *
160 * Loadable kernel modules are placed immediately after the static 170 * Loadable kernel modules are placed immediately after the static
@@ -166,26 +176,18 @@ static inline __attribute_const__ int get_order(unsigned long size)
166 * Similarly, for now we don't play any struct page mapping games. 176 * Similarly, for now we don't play any struct page mapping games.
167 */ 177 */
168 178
169#if CHIP_PA_WIDTH() + 2 > CHIP_VA_WIDTH() 179#if MAX_PA_WIDTH + 2 > MAX_VA_WIDTH
170# error Too much PA to map with the VA available! 180# error Too much PA to map with the VA available!
171#endif 181#endif
172#define HALF_VA_SPACE (_AC(1, UL) << (CHIP_VA_WIDTH() - 1))
173 182
174#define MEM_LOW_END (HALF_VA_SPACE - 1) /* low half */ 183#define PAGE_OFFSET (-(_AC(1, UL) << (MAX_VA_WIDTH - 1)))
175#define MEM_HIGH_START (-HALF_VA_SPACE) /* high half */ 184#define KERNEL_HIGH_VADDR _AC(0xfffffff800000000, UL) /* high 32GB */
176#define PAGE_OFFSET MEM_HIGH_START 185#define FIXADDR_BASE (KERNEL_HIGH_VADDR - 0x300000000) /* 4 GB */
177#define FIXADDR_BASE _AC(0xfffffff400000000, UL) /* 4 GB */ 186#define FIXADDR_TOP (KERNEL_HIGH_VADDR - 0x200000000) /* 4 GB */
178#define FIXADDR_TOP _AC(0xfffffff500000000, UL) /* 4 GB */
179#define _VMALLOC_START FIXADDR_TOP 187#define _VMALLOC_START FIXADDR_TOP
180#define HUGE_VMAP_BASE _AC(0xfffffff600000000, UL) /* 4 GB */ 188#define MEM_SV_START (KERNEL_HIGH_VADDR - 0x100000000) /* 256 MB */
181#define MEM_SV_START _AC(0xfffffff700000000, UL) /* 256 MB */ 189#define MEM_MODULE_START (MEM_SV_START + (256*1024*1024)) /* 256 MB */
182#define MEM_SV_INTRPT MEM_SV_START
183#define MEM_MODULE_START _AC(0xfffffff710000000, UL) /* 256 MB */
184#define MEM_MODULE_END (MEM_MODULE_START + (256*1024*1024)) 190#define MEM_MODULE_END (MEM_MODULE_START + (256*1024*1024))
185#define MEM_HV_START _AC(0xfffffff800000000, UL) /* 32 GB */
186
187/* Highest DTLB address we will use */
188#define KERNEL_HIGH_VADDR MEM_SV_START
189 191
190#else /* !__tilegx__ */ 192#else /* !__tilegx__ */
191 193
@@ -207,25 +209,18 @@ static inline __attribute_const__ int get_order(unsigned long size)
207 * values, and after that, we show "typical" values, since the actual 209 * values, and after that, we show "typical" values, since the actual
208 * addresses depend on kernel #defines. 210 * addresses depend on kernel #defines.
209 * 211 *
210 * MEM_HV_INTRPT 0xfe000000 212 * MEM_HV_START 0xfe000000
211 * MEM_SV_INTRPT (kernel code) 0xfd000000 213 * MEM_SV_START (kernel code) 0xfd000000
212 * MEM_USER_INTRPT (user vector) 0xfc000000 214 * MEM_USER_INTRPT (user vector) 0xfc000000
213 * FIX_KMAP_xxx 0xf8000000 (via NR_CPUS * KM_TYPE_NR) 215 * FIX_KMAP_xxx 0xfa000000 (via NR_CPUS * KM_TYPE_NR)
214 * PKMAP_BASE 0xf7000000 (via LAST_PKMAP) 216 * PKMAP_BASE 0xf9000000 (via LAST_PKMAP)
215 * HUGE_VMAP 0xf3000000 (via CONFIG_NR_HUGE_VMAPS) 217 * VMALLOC_START 0xf7000000 (via VMALLOC_RESERVE)
216 * VMALLOC_START 0xf0000000 (via __VMALLOC_RESERVE)
217 * mapped LOWMEM 0xc0000000 218 * mapped LOWMEM 0xc0000000
218 */ 219 */
219 220
220#define MEM_USER_INTRPT _AC(0xfc000000, UL) 221#define MEM_USER_INTRPT _AC(0xfc000000, UL)
221#if CONFIG_KERNEL_PL == 1 222#define MEM_SV_START _AC(0xfd000000, UL)
222#define MEM_SV_INTRPT _AC(0xfd000000, UL) 223#define MEM_HV_START _AC(0xfe000000, UL)
223#define MEM_HV_INTRPT _AC(0xfe000000, UL)
224#else
225#define MEM_GUEST_INTRPT _AC(0xfd000000, UL)
226#define MEM_SV_INTRPT _AC(0xfe000000, UL)
227#define MEM_HV_INTRPT _AC(0xff000000, UL)
228#endif
229 224
230#define INTRPT_SIZE 0x4000 225#define INTRPT_SIZE 0x4000
231 226
@@ -246,7 +241,7 @@ static inline __attribute_const__ int get_order(unsigned long size)
246 241
247#endif /* __tilegx__ */ 242#endif /* __tilegx__ */
248 243
249#ifndef __ASSEMBLY__ 244#if !defined(__ASSEMBLY__) && !defined(VDSO_BUILD)
250 245
251#ifdef CONFIG_HIGHMEM 246#ifdef CONFIG_HIGHMEM
252 247
@@ -332,6 +327,7 @@ static inline int pfn_valid(unsigned long pfn)
332 327
333struct mm_struct; 328struct mm_struct;
334extern pte_t *virt_to_pte(struct mm_struct *mm, unsigned long addr); 329extern pte_t *virt_to_pte(struct mm_struct *mm, unsigned long addr);
330extern pte_t *virt_to_kpte(unsigned long kaddr);
335 331
336#endif /* !__ASSEMBLY__ */ 332#endif /* !__ASSEMBLY__ */
337 333
diff --git a/arch/tile/include/asm/pci.h b/arch/tile/include/asm/pci.h
index 54a924208d3c..dfedd7ac7298 100644
--- a/arch/tile/include/asm/pci.h
+++ b/arch/tile/include/asm/pci.h
@@ -17,7 +17,6 @@
17 17
18#include <linux/dma-mapping.h> 18#include <linux/dma-mapping.h>
19#include <linux/pci.h> 19#include <linux/pci.h>
20#include <linux/numa.h>
21#include <asm-generic/pci_iomap.h> 20#include <asm-generic/pci_iomap.h>
22 21
23#ifndef __tilegx__ 22#ifndef __tilegx__
@@ -29,7 +28,6 @@ struct pci_controller {
29 int index; /* PCI domain number */ 28 int index; /* PCI domain number */
30 struct pci_bus *root_bus; 29 struct pci_bus *root_bus;
31 30
32 int first_busno;
33 int last_busno; 31 int last_busno;
34 32
35 int hv_cfg_fd[2]; /* config{0,1} fds for this PCIe controller */ 33 int hv_cfg_fd[2]; /* config{0,1} fds for this PCIe controller */
@@ -124,6 +122,11 @@ static inline void pci_iounmap(struct pci_dev *dev, void __iomem *addr) {}
124 * the CPA plus TILE_PCI_MEM_MAP_BASE_OFFSET. To support 32-bit 122 * the CPA plus TILE_PCI_MEM_MAP_BASE_OFFSET. To support 32-bit
125 * devices, we create a separate map region that handles the low 123 * devices, we create a separate map region that handles the low
126 * 4GB. 124 * 4GB.
125 *
126 * This design lets us avoid the "PCI hole" problem where the host bridge
127 * won't pass DMA traffic with target addresses that happen to fall within the
128 * BAR space. This enables us to use all the physical memory for DMA, instead
129 * of wasting the same amount of physical memory as the BAR window size.
127 */ 130 */
128#define TILE_PCI_MEM_MAP_BASE_OFFSET (1ULL << CHIP_PA_WIDTH()) 131#define TILE_PCI_MEM_MAP_BASE_OFFSET (1ULL << CHIP_PA_WIDTH())
129 132
@@ -145,6 +148,10 @@ struct pci_controller {
145 148
146 int pio_mem_index; /* PIO region index for memory access */ 149 int pio_mem_index; /* PIO region index for memory access */
147 150
151#ifdef CONFIG_TILE_PCI_IO
152 int pio_io_index; /* PIO region index for I/O space access */
153#endif
154
148 /* 155 /*
149 * Mem-Map regions for all the memory controllers so that Linux can 156 * Mem-Map regions for all the memory controllers so that Linux can
150 * map all of its physical memory space to the PCI bus. 157 * map all of its physical memory space to the PCI bus.
@@ -154,6 +161,10 @@ struct pci_controller {
154 int index; /* PCI domain number */ 161 int index; /* PCI domain number */
155 struct pci_bus *root_bus; 162 struct pci_bus *root_bus;
156 163
164 /* PCI I/O space resource for this controller. */
165 struct resource io_space;
166 char io_space_name[32];
167
157 /* PCI memory space resource for this controller. */ 168 /* PCI memory space resource for this controller. */
158 struct resource mem_space; 169 struct resource mem_space;
159 char mem_space_name[32]; 170 char mem_space_name[32];
@@ -166,13 +177,11 @@ struct pci_controller {
166 177
167 /* Table that maps the INTx numbers to Linux irq numbers. */ 178 /* Table that maps the INTx numbers to Linux irq numbers. */
168 int irq_intx_table[4]; 179 int irq_intx_table[4];
169
170 /* Address ranges that are routed to this controller/bridge. */
171 struct resource mem_resources[3];
172}; 180};
173 181
174extern struct pci_controller pci_controllers[TILEGX_NUM_TRIO * TILEGX_TRIO_PCIES]; 182extern struct pci_controller pci_controllers[TILEGX_NUM_TRIO * TILEGX_TRIO_PCIES];
175extern gxio_trio_context_t trio_contexts[TILEGX_NUM_TRIO]; 183extern gxio_trio_context_t trio_contexts[TILEGX_NUM_TRIO];
184extern int num_trio_shims;
176 185
177extern void pci_iounmap(struct pci_dev *dev, void __iomem *); 186extern void pci_iounmap(struct pci_dev *dev, void __iomem *);
178 187
@@ -211,7 +220,8 @@ static inline int pcibios_assign_all_busses(void)
211} 220}
212 221
213#define PCIBIOS_MIN_MEM 0 222#define PCIBIOS_MIN_MEM 0
214#define PCIBIOS_MIN_IO 0 223/* Minimum PCI I/O address, starting at the page boundary. */
224#define PCIBIOS_MIN_IO PAGE_SIZE
215 225
216/* Use any cpu for PCI. */ 226/* Use any cpu for PCI. */
217#define cpumask_of_pcibus(bus) cpu_online_mask 227#define cpumask_of_pcibus(bus) cpu_online_mask
diff --git a/arch/tile/include/asm/pgtable_32.h b/arch/tile/include/asm/pgtable_32.h
index 4ce4a7a99c24..d26a42279036 100644
--- a/arch/tile/include/asm/pgtable_32.h
+++ b/arch/tile/include/asm/pgtable_32.h
@@ -55,17 +55,9 @@
55#define PKMAP_BASE ((FIXADDR_BOOT_START - PAGE_SIZE*LAST_PKMAP) & PGDIR_MASK) 55#define PKMAP_BASE ((FIXADDR_BOOT_START - PAGE_SIZE*LAST_PKMAP) & PGDIR_MASK)
56 56
57#ifdef CONFIG_HIGHMEM 57#ifdef CONFIG_HIGHMEM
58# define __VMAPPING_END (PKMAP_BASE & ~(HPAGE_SIZE-1)) 58# define _VMALLOC_END (PKMAP_BASE & ~(HPAGE_SIZE-1))
59#else 59#else
60# define __VMAPPING_END (FIXADDR_START & ~(HPAGE_SIZE-1)) 60# define _VMALLOC_END (FIXADDR_START & ~(HPAGE_SIZE-1))
61#endif
62
63#ifdef CONFIG_HUGEVMAP
64#define HUGE_VMAP_END __VMAPPING_END
65#define HUGE_VMAP_BASE (HUGE_VMAP_END - CONFIG_NR_HUGE_VMAPS * HPAGE_SIZE)
66#define _VMALLOC_END HUGE_VMAP_BASE
67#else
68#define _VMALLOC_END __VMAPPING_END
69#endif 61#endif
70 62
71/* 63/*
@@ -84,10 +76,12 @@ extern unsigned long VMALLOC_RESERVE /* = CONFIG_VMALLOC_RESERVE */;
84/* We have no pmd or pud since we are strictly a two-level page table */ 76/* We have no pmd or pud since we are strictly a two-level page table */
85#include <asm-generic/pgtable-nopmd.h> 77#include <asm-generic/pgtable-nopmd.h>
86 78
79static inline int pud_huge_page(pud_t pud) { return 0; }
80
87/* We don't define any pgds for these addresses. */ 81/* We don't define any pgds for these addresses. */
88static inline int pgd_addr_invalid(unsigned long addr) 82static inline int pgd_addr_invalid(unsigned long addr)
89{ 83{
90 return addr >= MEM_HV_INTRPT; 84 return addr >= MEM_HV_START;
91} 85}
92 86
93/* 87/*
diff --git a/arch/tile/include/asm/pgtable_64.h b/arch/tile/include/asm/pgtable_64.h
index 2492fa5478e7..2c8a9cd102d3 100644
--- a/arch/tile/include/asm/pgtable_64.h
+++ b/arch/tile/include/asm/pgtable_64.h
@@ -52,17 +52,24 @@
52 * memory allocation code). The vmalloc code puts in an internal 52 * memory allocation code). The vmalloc code puts in an internal
53 * guard page between each allocation. 53 * guard page between each allocation.
54 */ 54 */
55#define _VMALLOC_END HUGE_VMAP_BASE 55#define _VMALLOC_END MEM_SV_START
56#define VMALLOC_END _VMALLOC_END 56#define VMALLOC_END _VMALLOC_END
57#define VMALLOC_START _VMALLOC_START 57#define VMALLOC_START _VMALLOC_START
58 58
59#define HUGE_VMAP_END (HUGE_VMAP_BASE + PGDIR_SIZE)
60
61#ifndef __ASSEMBLY__ 59#ifndef __ASSEMBLY__
62 60
63/* We have no pud since we are a three-level page table. */ 61/* We have no pud since we are a three-level page table. */
64#include <asm-generic/pgtable-nopud.h> 62#include <asm-generic/pgtable-nopud.h>
65 63
64/*
65 * pmds are the same as pgds and ptes, so converting is a no-op.
66 */
67#define pmd_pte(pmd) (pmd)
68#define pmdp_ptep(pmdp) (pmdp)
69#define pte_pmd(pte) (pte)
70
71#define pud_pte(pud) ((pud).pgd)
72
66static inline int pud_none(pud_t pud) 73static inline int pud_none(pud_t pud)
67{ 74{
68 return pud_val(pud) == 0; 75 return pud_val(pud) == 0;
@@ -73,6 +80,11 @@ static inline int pud_present(pud_t pud)
73 return pud_val(pud) & _PAGE_PRESENT; 80 return pud_val(pud) & _PAGE_PRESENT;
74} 81}
75 82
83static inline int pud_huge_page(pud_t pud)
84{
85 return pud_val(pud) & _PAGE_HUGE_PAGE;
86}
87
76#define pmd_ERROR(e) \ 88#define pmd_ERROR(e) \
77 pr_err("%s:%d: bad pmd 0x%016llx.\n", __FILE__, __LINE__, pmd_val(e)) 89 pr_err("%s:%d: bad pmd 0x%016llx.\n", __FILE__, __LINE__, pmd_val(e))
78 90
@@ -89,6 +101,9 @@ static inline int pud_bad(pud_t pud)
89/* Return the page-table frame number (ptfn) that a pud_t points at. */ 101/* Return the page-table frame number (ptfn) that a pud_t points at. */
90#define pud_ptfn(pud) hv_pte_get_ptfn((pud).pgd) 102#define pud_ptfn(pud) hv_pte_get_ptfn((pud).pgd)
91 103
104/* Return the page frame number (pfn) that a pud_t points at. */
105#define pud_pfn(pud) pte_pfn(pud_pte(pud))
106
92/* 107/*
93 * A given kernel pud_t maps to a kernel pmd_t table at a specific 108 * A given kernel pud_t maps to a kernel pmd_t table at a specific
94 * virtual address. Since kernel pmd_t tables can be aligned at 109 * virtual address. Since kernel pmd_t tables can be aligned at
@@ -123,8 +138,7 @@ static inline unsigned long pgd_addr_normalize(unsigned long addr)
123/* We don't define any pgds for these addresses. */ 138/* We don't define any pgds for these addresses. */
124static inline int pgd_addr_invalid(unsigned long addr) 139static inline int pgd_addr_invalid(unsigned long addr)
125{ 140{
126 return addr >= MEM_HV_START || 141 return addr >= KERNEL_HIGH_VADDR || addr != pgd_addr_normalize(addr);
127 (addr > MEM_LOW_END && addr < MEM_HIGH_START);
128} 142}
129 143
130/* 144/*
@@ -152,13 +166,6 @@ static inline pte_t ptep_get_and_clear(struct mm_struct *mm,
152 return hv_pte(__insn_exch(&ptep->val, 0UL)); 166 return hv_pte(__insn_exch(&ptep->val, 0UL));
153} 167}
154 168
155/*
156 * pmds are the same as pgds and ptes, so converting is a no-op.
157 */
158#define pmd_pte(pmd) (pmd)
159#define pmdp_ptep(pmdp) (pmdp)
160#define pte_pmd(pte) (pte)
161
162#endif /* __ASSEMBLY__ */ 169#endif /* __ASSEMBLY__ */
163 170
164#endif /* _ASM_TILE_PGTABLE_64_H */ 171#endif /* _ASM_TILE_PGTABLE_64_H */
diff --git a/arch/tile/include/asm/processor.h b/arch/tile/include/asm/processor.h
index b3f104953da2..42323636c459 100644
--- a/arch/tile/include/asm/processor.h
+++ b/arch/tile/include/asm/processor.h
@@ -15,6 +15,8 @@
15#ifndef _ASM_TILE_PROCESSOR_H 15#ifndef _ASM_TILE_PROCESSOR_H
16#define _ASM_TILE_PROCESSOR_H 16#define _ASM_TILE_PROCESSOR_H
17 17
18#include <arch/chip.h>
19
18#ifndef __ASSEMBLY__ 20#ifndef __ASSEMBLY__
19 21
20/* 22/*
@@ -25,7 +27,6 @@
25#include <asm/ptrace.h> 27#include <asm/ptrace.h>
26#include <asm/percpu.h> 28#include <asm/percpu.h>
27 29
28#include <arch/chip.h>
29#include <arch/spr_def.h> 30#include <arch/spr_def.h>
30 31
31struct task_struct; 32struct task_struct;
@@ -110,18 +111,16 @@ struct thread_struct {
110 unsigned long long interrupt_mask; 111 unsigned long long interrupt_mask;
111 /* User interrupt-control 0 state */ 112 /* User interrupt-control 0 state */
112 unsigned long intctrl_0; 113 unsigned long intctrl_0;
113#if CHIP_HAS_PROC_STATUS_SPR() 114 /* Is this task currently doing a backtrace? */
115 bool in_backtrace;
114 /* Any other miscellaneous processor state bits */ 116 /* Any other miscellaneous processor state bits */
115 unsigned long proc_status; 117 unsigned long proc_status;
116#endif
117#if !CHIP_HAS_FIXED_INTVEC_BASE() 118#if !CHIP_HAS_FIXED_INTVEC_BASE()
118 /* Interrupt base for PL0 interrupts */ 119 /* Interrupt base for PL0 interrupts */
119 unsigned long interrupt_vector_base; 120 unsigned long interrupt_vector_base;
120#endif 121#endif
121#if CHIP_HAS_TILE_RTF_HWM()
122 /* Tile cache retry fifo high-water mark */ 122 /* Tile cache retry fifo high-water mark */
123 unsigned long tile_rtf_hwm; 123 unsigned long tile_rtf_hwm;
124#endif
125#if CHIP_HAS_DSTREAM_PF() 124#if CHIP_HAS_DSTREAM_PF()
126 /* Data stream prefetch control */ 125 /* Data stream prefetch control */
127 unsigned long dstream_pf; 126 unsigned long dstream_pf;
@@ -134,21 +133,16 @@ struct thread_struct {
134 /* Async DMA TLB fault information */ 133 /* Async DMA TLB fault information */
135 struct async_tlb dma_async_tlb; 134 struct async_tlb dma_async_tlb;
136#endif 135#endif
137#if CHIP_HAS_SN_PROC()
138 /* Was static network processor when we were switched out? */
139 int sn_proc_running;
140 /* Async SNI TLB fault information */
141 struct async_tlb sn_async_tlb;
142#endif
143}; 136};
144 137
145#endif /* !__ASSEMBLY__ */ 138#endif /* !__ASSEMBLY__ */
146 139
147/* 140/*
148 * Start with "sp" this many bytes below the top of the kernel stack. 141 * Start with "sp" this many bytes below the top of the kernel stack.
149 * This preserves the invariant that a called function may write to *sp. 142 * This allows us to be cache-aware when handling the initial save
143 * of the pt_regs value to the stack.
150 */ 144 */
151#define STACK_TOP_DELTA 8 145#define STACK_TOP_DELTA 64
152 146
153/* 147/*
154 * When entering the kernel via a fault, start with the top of the 148 * When entering the kernel via a fault, start with the top of the
@@ -164,7 +158,7 @@ struct thread_struct {
164#ifndef __ASSEMBLY__ 158#ifndef __ASSEMBLY__
165 159
166#ifdef __tilegx__ 160#ifdef __tilegx__
167#define TASK_SIZE_MAX (MEM_LOW_END + 1) 161#define TASK_SIZE_MAX (_AC(1, UL) << (MAX_VA_WIDTH - 1))
168#else 162#else
169#define TASK_SIZE_MAX PAGE_OFFSET 163#define TASK_SIZE_MAX PAGE_OFFSET
170#endif 164#endif
@@ -178,10 +172,10 @@ struct thread_struct {
178#define TASK_SIZE TASK_SIZE_MAX 172#define TASK_SIZE TASK_SIZE_MAX
179#endif 173#endif
180 174
181/* We provide a minimal "vdso" a la x86; just the sigreturn code for now. */ 175#define VDSO_BASE ((unsigned long)current->active_mm->context.vdso_base)
182#define VDSO_BASE (TASK_SIZE - PAGE_SIZE) 176#define VDSO_SYM(x) (VDSO_BASE + (unsigned long)(x))
183 177
184#define STACK_TOP VDSO_BASE 178#define STACK_TOP TASK_SIZE
185 179
186/* STACK_TOP_MAX is used temporarily in execve and should not check COMPAT. */ 180/* STACK_TOP_MAX is used temporarily in execve and should not check COMPAT. */
187#define STACK_TOP_MAX TASK_SIZE_MAX 181#define STACK_TOP_MAX TASK_SIZE_MAX
@@ -232,21 +226,28 @@ extern int do_work_pending(struct pt_regs *regs, u32 flags);
232unsigned long get_wchan(struct task_struct *p); 226unsigned long get_wchan(struct task_struct *p);
233 227
234/* Return initial ksp value for given task. */ 228/* Return initial ksp value for given task. */
235#define task_ksp0(task) ((unsigned long)(task)->stack + THREAD_SIZE) 229#define task_ksp0(task) \
230 ((unsigned long)(task)->stack + THREAD_SIZE - STACK_TOP_DELTA)
236 231
237/* Return some info about the user process TASK. */ 232/* Return some info about the user process TASK. */
238#define KSTK_TOP(task) (task_ksp0(task) - STACK_TOP_DELTA)
239#define task_pt_regs(task) \ 233#define task_pt_regs(task) \
240 ((struct pt_regs *)(task_ksp0(task) - KSTK_PTREGS_GAP) - 1) 234 ((struct pt_regs *)(task_ksp0(task) - KSTK_PTREGS_GAP) - 1)
241#define current_pt_regs() \ 235#define current_pt_regs() \
242 ((struct pt_regs *)((stack_pointer | (THREAD_SIZE - 1)) - \ 236 ((struct pt_regs *)((stack_pointer | (THREAD_SIZE - 1)) - \
243 (KSTK_PTREGS_GAP - 1)) - 1) 237 STACK_TOP_DELTA - (KSTK_PTREGS_GAP - 1)) - 1)
244#define task_sp(task) (task_pt_regs(task)->sp) 238#define task_sp(task) (task_pt_regs(task)->sp)
245#define task_pc(task) (task_pt_regs(task)->pc) 239#define task_pc(task) (task_pt_regs(task)->pc)
246/* Aliases for pc and sp (used in fs/proc/array.c) */ 240/* Aliases for pc and sp (used in fs/proc/array.c) */
247#define KSTK_EIP(task) task_pc(task) 241#define KSTK_EIP(task) task_pc(task)
248#define KSTK_ESP(task) task_sp(task) 242#define KSTK_ESP(task) task_sp(task)
249 243
244/* Fine-grained unaligned JIT support */
245#define GET_UNALIGN_CTL(tsk, adr) get_unalign_ctl((tsk), (adr))
246#define SET_UNALIGN_CTL(tsk, val) set_unalign_ctl((tsk), (val))
247
248extern int get_unalign_ctl(struct task_struct *tsk, unsigned long adr);
249extern int set_unalign_ctl(struct task_struct *tsk, unsigned int val);
250
250/* Standard format for printing registers and other word-size data. */ 251/* Standard format for printing registers and other word-size data. */
251#ifdef __tilegx__ 252#ifdef __tilegx__
252# define REGFMT "0x%016lx" 253# define REGFMT "0x%016lx"
@@ -275,7 +276,6 @@ extern char chip_model[64];
275/* Data on which physical memory controller corresponds to which NUMA node. */ 276/* Data on which physical memory controller corresponds to which NUMA node. */
276extern int node_controller[]; 277extern int node_controller[];
277 278
278#if CHIP_HAS_CBOX_HOME_MAP()
279/* Does the heap allocator return hash-for-home pages by default? */ 279/* Does the heap allocator return hash-for-home pages by default? */
280extern int hash_default; 280extern int hash_default;
281 281
@@ -285,11 +285,6 @@ extern int kstack_hash;
285/* Does MAP_ANONYMOUS return hash-for-home pages by default? */ 285/* Does MAP_ANONYMOUS return hash-for-home pages by default? */
286#define uheap_hash hash_default 286#define uheap_hash hash_default
287 287
288#else
289#define hash_default 0
290#define kstack_hash 0
291#define uheap_hash 0
292#endif
293 288
294/* Are we using huge pages in the TLB for kernel data? */ 289/* Are we using huge pages in the TLB for kernel data? */
295extern int kdata_huge; 290extern int kdata_huge;
@@ -337,7 +332,6 @@ extern int kdata_huge;
337 332
338/* 333/*
339 * Provide symbolic constants for PLs. 334 * Provide symbolic constants for PLs.
340 * Note that assembly code assumes that USER_PL is zero.
341 */ 335 */
342#define USER_PL 0 336#define USER_PL 0
343#if CONFIG_KERNEL_PL == 2 337#if CONFIG_KERNEL_PL == 2
@@ -346,20 +340,38 @@ extern int kdata_huge;
346#define KERNEL_PL CONFIG_KERNEL_PL 340#define KERNEL_PL CONFIG_KERNEL_PL
347 341
348/* SYSTEM_SAVE_K_0 holds the current cpu number ORed with ksp0. */ 342/* SYSTEM_SAVE_K_0 holds the current cpu number ORed with ksp0. */
349#define CPU_LOG_MASK_VALUE 12 343#ifdef __tilegx__
350#define CPU_MASK_VALUE ((1 << CPU_LOG_MASK_VALUE) - 1) 344#define CPU_SHIFT 48
351#if CONFIG_NR_CPUS > CPU_MASK_VALUE 345#if CHIP_VA_WIDTH() > CPU_SHIFT
352# error Too many cpus! 346# error Too many VA bits!
353#endif 347#endif
348#define MAX_CPU_ID ((1 << (64 - CPU_SHIFT)) - 1)
349#define raw_smp_processor_id() \
350 ((int)(__insn_mfspr(SPR_SYSTEM_SAVE_K_0) >> CPU_SHIFT))
351#define get_current_ksp0() \
352 ((unsigned long)(((long)__insn_mfspr(SPR_SYSTEM_SAVE_K_0) << \
353 (64 - CPU_SHIFT)) >> (64 - CPU_SHIFT)))
354#define next_current_ksp0(task) ({ \
355 unsigned long __ksp0 = task_ksp0(task) & ((1UL << CPU_SHIFT) - 1); \
356 unsigned long __cpu = (long)raw_smp_processor_id() << CPU_SHIFT; \
357 __ksp0 | __cpu; \
358})
359#else
360#define LOG2_NR_CPU_IDS 6
361#define MAX_CPU_ID ((1 << LOG2_NR_CPU_IDS) - 1)
354#define raw_smp_processor_id() \ 362#define raw_smp_processor_id() \
355 ((int)__insn_mfspr(SPR_SYSTEM_SAVE_K_0) & CPU_MASK_VALUE) 363 ((int)__insn_mfspr(SPR_SYSTEM_SAVE_K_0) & MAX_CPU_ID)
356#define get_current_ksp0() \ 364#define get_current_ksp0() \
357 (__insn_mfspr(SPR_SYSTEM_SAVE_K_0) & ~CPU_MASK_VALUE) 365 (__insn_mfspr(SPR_SYSTEM_SAVE_K_0) & ~MAX_CPU_ID)
358#define next_current_ksp0(task) ({ \ 366#define next_current_ksp0(task) ({ \
359 unsigned long __ksp0 = task_ksp0(task); \ 367 unsigned long __ksp0 = task_ksp0(task); \
360 int __cpu = raw_smp_processor_id(); \ 368 int __cpu = raw_smp_processor_id(); \
361 BUG_ON(__ksp0 & CPU_MASK_VALUE); \ 369 BUG_ON(__ksp0 & MAX_CPU_ID); \
362 __ksp0 | __cpu; \ 370 __ksp0 | __cpu; \
363}) 371})
372#endif
373#if CONFIG_NR_CPUS > (MAX_CPU_ID + 1)
374# error Too many cpus!
375#endif
364 376
365#endif /* _ASM_TILE_PROCESSOR_H */ 377#endif /* _ASM_TILE_PROCESSOR_H */
diff --git a/arch/tile/include/asm/ptrace.h b/arch/tile/include/asm/ptrace.h
index fd412260aff7..b9620c077abc 100644
--- a/arch/tile/include/asm/ptrace.h
+++ b/arch/tile/include/asm/ptrace.h
@@ -33,12 +33,13 @@ typedef unsigned long pt_reg_t;
33 33
34#ifndef __ASSEMBLY__ 34#ifndef __ASSEMBLY__
35 35
36#define regs_return_value(regs) ((regs)->regs[0])
36#define instruction_pointer(regs) ((regs)->pc) 37#define instruction_pointer(regs) ((regs)->pc)
37#define profile_pc(regs) instruction_pointer(regs) 38#define profile_pc(regs) instruction_pointer(regs)
38#define user_stack_pointer(regs) ((regs)->sp) 39#define user_stack_pointer(regs) ((regs)->sp)
39 40
40/* Does the process account for user or for system time? */ 41/* Does the process account for user or for system time? */
41#define user_mode(regs) (EX1_PL((regs)->ex1) == USER_PL) 42#define user_mode(regs) (EX1_PL((regs)->ex1) < KERNEL_PL)
42 43
43/* Fill in a struct pt_regs with the current kernel registers. */ 44/* Fill in a struct pt_regs with the current kernel registers. */
44struct pt_regs *get_pt_regs(struct pt_regs *); 45struct pt_regs *get_pt_regs(struct pt_regs *);
@@ -79,8 +80,7 @@ extern void single_step_execve(void);
79 80
80struct task_struct; 81struct task_struct;
81 82
82extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, 83extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs);
83 int error_code);
84 84
85#ifdef __tilegx__ 85#ifdef __tilegx__
86/* We need this since sigval_t has a user pointer in it, for GETSIGINFO etc. */ 86/* We need this since sigval_t has a user pointer in it, for GETSIGINFO etc. */
diff --git a/arch/tile/include/asm/sections.h b/arch/tile/include/asm/sections.h
index 7d8a935a9238..5d5d3b739a6b 100644
--- a/arch/tile/include/asm/sections.h
+++ b/arch/tile/include/asm/sections.h
@@ -25,10 +25,16 @@ extern char _sinitdata[], _einitdata[];
25/* Write-once data is writable only till the end of initialization. */ 25/* Write-once data is writable only till the end of initialization. */
26extern char __w1data_begin[], __w1data_end[]; 26extern char __w1data_begin[], __w1data_end[];
27 27
28extern char vdso_start[], vdso_end[];
29#ifdef CONFIG_COMPAT
30extern char vdso32_start[], vdso32_end[];
31#endif
28 32
29/* Not exactly sections, but PC comparison points in the code. */ 33/* Not exactly sections, but PC comparison points in the code. */
30extern char __rt_sigreturn[], __rt_sigreturn_end[]; 34extern char __rt_sigreturn[], __rt_sigreturn_end[];
31#ifndef __tilegx__ 35#ifdef __tilegx__
36extern char __start_unalign_asm_code[], __end_unalign_asm_code[];
37#else
32extern char sys_cmpxchg[], __sys_cmpxchg_end[]; 38extern char sys_cmpxchg[], __sys_cmpxchg_end[];
33extern char __sys_cmpxchg_grab_lock[]; 39extern char __sys_cmpxchg_grab_lock[];
34extern char __start_atomic_asm_code[], __end_atomic_asm_code[]; 40extern char __start_atomic_asm_code[], __end_atomic_asm_code[];
diff --git a/arch/tile/include/asm/setup.h b/arch/tile/include/asm/setup.h
index d048888c5d9a..e98909033e5b 100644
--- a/arch/tile/include/asm/setup.h
+++ b/arch/tile/include/asm/setup.h
@@ -24,9 +24,8 @@
24 */ 24 */
25#define MAXMEM_PFN PFN_DOWN(MAXMEM) 25#define MAXMEM_PFN PFN_DOWN(MAXMEM)
26 26
27int tile_console_write(const char *buf, int count);
27void early_panic(const char *fmt, ...); 28void early_panic(const char *fmt, ...);
28void warn_early_printk(void);
29void __init disable_early_printk(void);
30 29
31/* Init-time routine to do tile-specific per-cpu setup. */ 30/* Init-time routine to do tile-specific per-cpu setup. */
32void setup_cpu(int boot); 31void setup_cpu(int boot);
diff --git a/arch/tile/include/asm/smp.h b/arch/tile/include/asm/smp.h
index 1aa759aeb5b3..9a326b64f7ae 100644
--- a/arch/tile/include/asm/smp.h
+++ b/arch/tile/include/asm/smp.h
@@ -101,10 +101,8 @@ void print_disabled_cpus(void);
101extern struct cpumask cpu_lotar_map; 101extern struct cpumask cpu_lotar_map;
102#define cpu_is_valid_lotar(cpu) cpumask_test_cpu((cpu), &cpu_lotar_map) 102#define cpu_is_valid_lotar(cpu) cpumask_test_cpu((cpu), &cpu_lotar_map)
103 103
104#if CHIP_HAS_CBOX_HOME_MAP()
105/* Which processors are used for hash-for-home mapping */ 104/* Which processors are used for hash-for-home mapping */
106extern struct cpumask hash_for_home_map; 105extern struct cpumask hash_for_home_map;
107#endif
108 106
109/* Which cpus can have their cache flushed by hv_flush_remote(). */ 107/* Which cpus can have their cache flushed by hv_flush_remote(). */
110extern struct cpumask cpu_cacheable_map; 108extern struct cpumask cpu_cacheable_map;
diff --git a/arch/tile/include/asm/spinlock_64.h b/arch/tile/include/asm/spinlock_64.h
index 5f8b6a095fd8..9a12b9c7e5d3 100644
--- a/arch/tile/include/asm/spinlock_64.h
+++ b/arch/tile/include/asm/spinlock_64.h
@@ -27,7 +27,7 @@
27 * Return the "current" portion of a ticket lock value, 27 * Return the "current" portion of a ticket lock value,
28 * i.e. the number that currently owns the lock. 28 * i.e. the number that currently owns the lock.
29 */ 29 */
30static inline int arch_spin_current(u32 val) 30static inline u32 arch_spin_current(u32 val)
31{ 31{
32 return val >> __ARCH_SPIN_CURRENT_SHIFT; 32 return val >> __ARCH_SPIN_CURRENT_SHIFT;
33} 33}
@@ -36,7 +36,7 @@ static inline int arch_spin_current(u32 val)
36 * Return the "next" portion of a ticket lock value, 36 * Return the "next" portion of a ticket lock value,
37 * i.e. the number that the next task to try to acquire the lock will get. 37 * i.e. the number that the next task to try to acquire the lock will get.
38 */ 38 */
39static inline int arch_spin_next(u32 val) 39static inline u32 arch_spin_next(u32 val)
40{ 40{
41 return val & __ARCH_SPIN_NEXT_MASK; 41 return val & __ARCH_SPIN_NEXT_MASK;
42} 42}
diff --git a/arch/tile/include/asm/string.h b/arch/tile/include/asm/string.h
index 7535cf1a30e4..92b271bd9ebd 100644
--- a/arch/tile/include/asm/string.h
+++ b/arch/tile/include/asm/string.h
@@ -21,8 +21,10 @@
21#define __HAVE_ARCH_MEMMOVE 21#define __HAVE_ARCH_MEMMOVE
22#define __HAVE_ARCH_STRCHR 22#define __HAVE_ARCH_STRCHR
23#define __HAVE_ARCH_STRLEN 23#define __HAVE_ARCH_STRLEN
24#define __HAVE_ARCH_STRNLEN
24 25
25extern __kernel_size_t strlen(const char *); 26extern __kernel_size_t strlen(const char *);
27extern __kernel_size_t strnlen(const char *, __kernel_size_t);
26extern char *strchr(const char *s, int c); 28extern char *strchr(const char *s, int c);
27extern void *memchr(const void *s, int c, size_t n); 29extern void *memchr(const void *s, int c, size_t n);
28extern void *memset(void *, int, __kernel_size_t); 30extern void *memset(void *, int, __kernel_size_t);
diff --git a/arch/tile/include/asm/thread_info.h b/arch/tile/include/asm/thread_info.h
index d1733dee98a2..b8aa6df3e102 100644
--- a/arch/tile/include/asm/thread_info.h
+++ b/arch/tile/include/asm/thread_info.h
@@ -39,6 +39,11 @@ struct thread_info {
39 struct restart_block restart_block; 39 struct restart_block restart_block;
40 struct single_step_state *step_state; /* single step state 40 struct single_step_state *step_state; /* single step state
41 (if non-zero) */ 41 (if non-zero) */
42 int align_ctl; /* controls unaligned access */
43#ifdef __tilegx__
44 unsigned long unalign_jit_tmp[4]; /* temp r0..r3 storage */
45 void __user *unalign_jit_base; /* unalign fixup JIT base */
46#endif
42}; 47};
43 48
44/* 49/*
@@ -56,6 +61,7 @@ struct thread_info {
56 .fn = do_no_restart_syscall, \ 61 .fn = do_no_restart_syscall, \
57 }, \ 62 }, \
58 .step_state = NULL, \ 63 .step_state = NULL, \
64 .align_ctl = 0, \
59} 65}
60 66
61#define init_thread_info (init_thread_union.thread_info) 67#define init_thread_info (init_thread_union.thread_info)
diff --git a/arch/tile/include/asm/topology.h b/arch/tile/include/asm/topology.h
index d5e86c9f74fd..d15c0d8d550f 100644
--- a/arch/tile/include/asm/topology.h
+++ b/arch/tile/include/asm/topology.h
@@ -89,9 +89,6 @@ static inline const struct cpumask *cpumask_of_node(int node)
89#define topology_core_id(cpu) (cpu) 89#define topology_core_id(cpu) (cpu)
90#define topology_core_cpumask(cpu) ((void)(cpu), cpu_online_mask) 90#define topology_core_cpumask(cpu) ((void)(cpu), cpu_online_mask)
91#define topology_thread_cpumask(cpu) cpumask_of(cpu) 91#define topology_thread_cpumask(cpu) cpumask_of(cpu)
92
93/* indicates that pointers to the topology struct cpumask maps are valid */
94#define arch_provides_topology_pointers yes
95#endif 92#endif
96 93
97#endif /* _ASM_TILE_TOPOLOGY_H */ 94#endif /* _ASM_TILE_TOPOLOGY_H */
diff --git a/arch/tile/include/asm/traps.h b/arch/tile/include/asm/traps.h
index e28c3df4176a..4b99a1c3aab2 100644
--- a/arch/tile/include/asm/traps.h
+++ b/arch/tile/include/asm/traps.h
@@ -15,12 +15,13 @@
15#ifndef _ASM_TILE_TRAPS_H 15#ifndef _ASM_TILE_TRAPS_H
16#define _ASM_TILE_TRAPS_H 16#define _ASM_TILE_TRAPS_H
17 17
18#ifndef __ASSEMBLY__
18#include <arch/chip.h> 19#include <arch/chip.h>
19 20
20/* mm/fault.c */ 21/* mm/fault.c */
21void do_page_fault(struct pt_regs *, int fault_num, 22void do_page_fault(struct pt_regs *, int fault_num,
22 unsigned long address, unsigned long write); 23 unsigned long address, unsigned long write);
23#if CHIP_HAS_TILE_DMA() || CHIP_HAS_SN_PROC() 24#if CHIP_HAS_TILE_DMA()
24void do_async_page_fault(struct pt_regs *); 25void do_async_page_fault(struct pt_regs *);
25#endif 26#endif
26 27
@@ -69,6 +70,16 @@ void gx_singlestep_handle(struct pt_regs *, int fault_num);
69 70
70/* kernel/intvec_64.S */ 71/* kernel/intvec_64.S */
71void fill_ra_stack(void); 72void fill_ra_stack(void);
73
74/* Handle unalign data fixup. */
75extern void do_unaligned(struct pt_regs *regs, int vecnum);
76#endif
77
78#endif /* __ASSEMBLY__ */
79
80#ifdef __tilegx__
81/* 128 byte JIT per unalign fixup. */
82#define UNALIGN_JIT_SHIFT 7
72#endif 83#endif
73 84
74#endif /* _ASM_TILE_TRAPS_H */ 85#endif /* _ASM_TILE_TRAPS_H */
diff --git a/arch/tile/include/asm/uaccess.h b/arch/tile/include/asm/uaccess.h
index e4d44bd7df27..b6cde3209b96 100644
--- a/arch/tile/include/asm/uaccess.h
+++ b/arch/tile/include/asm/uaccess.h
@@ -127,8 +127,10 @@ extern int fixup_exception(struct pt_regs *regs);
127 127
128#ifdef __LP64__ 128#ifdef __LP64__
129#define _ASM_PTR ".quad" 129#define _ASM_PTR ".quad"
130#define _ASM_ALIGN ".align 8"
130#else 131#else
131#define _ASM_PTR ".long" 132#define _ASM_PTR ".long"
133#define _ASM_ALIGN ".align 4"
132#endif 134#endif
133 135
134#define __get_user_asm(OP, x, ptr, ret) \ 136#define __get_user_asm(OP, x, ptr, ret) \
@@ -137,6 +139,7 @@ extern int fixup_exception(struct pt_regs *regs);
137 "0: { movei %1, 0; movei %0, %3 }\n" \ 139 "0: { movei %1, 0; movei %0, %3 }\n" \
138 "j 9f\n" \ 140 "j 9f\n" \
139 ".section __ex_table,\"a\"\n" \ 141 ".section __ex_table,\"a\"\n" \
142 _ASM_ALIGN "\n" \
140 _ASM_PTR " 1b, 0b\n" \ 143 _ASM_PTR " 1b, 0b\n" \
141 ".popsection\n" \ 144 ".popsection\n" \
142 "9:" \ 145 "9:" \
@@ -168,6 +171,7 @@ extern int fixup_exception(struct pt_regs *regs);
168 "0: { movei %1, 0; movei %2, 0 }\n" \ 171 "0: { movei %1, 0; movei %2, 0 }\n" \
169 "{ movei %0, %4; j 9f }\n" \ 172 "{ movei %0, %4; j 9f }\n" \
170 ".section __ex_table,\"a\"\n" \ 173 ".section __ex_table,\"a\"\n" \
174 ".align 4\n" \
171 ".word 1b, 0b\n" \ 175 ".word 1b, 0b\n" \
172 ".word 2b, 0b\n" \ 176 ".word 2b, 0b\n" \
173 ".popsection\n" \ 177 ".popsection\n" \
@@ -224,6 +228,7 @@ extern int __get_user_bad(void)
224 ".pushsection .fixup,\"ax\"\n" \ 228 ".pushsection .fixup,\"ax\"\n" \
225 "0: { movei %0, %3; j 9f }\n" \ 229 "0: { movei %0, %3; j 9f }\n" \
226 ".section __ex_table,\"a\"\n" \ 230 ".section __ex_table,\"a\"\n" \
231 _ASM_ALIGN "\n" \
227 _ASM_PTR " 1b, 0b\n" \ 232 _ASM_PTR " 1b, 0b\n" \
228 ".popsection\n" \ 233 ".popsection\n" \
229 "9:" \ 234 "9:" \
@@ -248,6 +253,7 @@ extern int __get_user_bad(void)
248 ".pushsection .fixup,\"ax\"\n" \ 253 ".pushsection .fixup,\"ax\"\n" \
249 "0: { movei %0, %4; j 9f }\n" \ 254 "0: { movei %0, %4; j 9f }\n" \
250 ".section __ex_table,\"a\"\n" \ 255 ".section __ex_table,\"a\"\n" \
256 ".align 4\n" \
251 ".word 1b, 0b\n" \ 257 ".word 1b, 0b\n" \
252 ".word 2b, 0b\n" \ 258 ".word 2b, 0b\n" \
253 ".popsection\n" \ 259 ".popsection\n" \
@@ -567,37 +573,6 @@ static inline unsigned long __must_check flush_user(
567} 573}
568 574
569/** 575/**
570 * inv_user: - Invalidate a block of memory in user space from cache.
571 * @mem: Destination address, in user space.
572 * @len: Number of bytes to invalidate.
573 *
574 * Returns number of bytes that could not be invalidated.
575 * On success, this will be zero.
576 *
577 * Note that on Tile64, the "inv" operation is in fact a
578 * "flush and invalidate", so cache write-backs will occur prior
579 * to the cache being marked invalid.
580 */
581extern unsigned long inv_user_asm(void __user *mem, unsigned long len);
582static inline unsigned long __must_check __inv_user(
583 void __user *mem, unsigned long len)
584{
585 int retval;
586
587 might_fault();
588 retval = inv_user_asm(mem, len);
589 mb_incoherent();
590 return retval;
591}
592static inline unsigned long __must_check inv_user(
593 void __user *mem, unsigned long len)
594{
595 if (access_ok(VERIFY_WRITE, mem, len))
596 return __inv_user(mem, len);
597 return len;
598}
599
600/**
601 * finv_user: - Flush-inval a block of memory in user space from cache. 576 * finv_user: - Flush-inval a block of memory in user space from cache.
602 * @mem: Destination address, in user space. 577 * @mem: Destination address, in user space.
603 * @len: Number of bytes to invalidate. 578 * @len: Number of bytes to invalidate.
diff --git a/arch/tile/include/asm/unaligned.h b/arch/tile/include/asm/unaligned.h
index 37dfbe598872..5a58a0d11449 100644
--- a/arch/tile/include/asm/unaligned.h
+++ b/arch/tile/include/asm/unaligned.h
@@ -15,11 +15,15 @@
15#ifndef _ASM_TILE_UNALIGNED_H 15#ifndef _ASM_TILE_UNALIGNED_H
16#define _ASM_TILE_UNALIGNED_H 16#define _ASM_TILE_UNALIGNED_H
17 17
18#include <linux/unaligned/le_struct.h> 18/*
19#include <linux/unaligned/be_byteshift.h> 19 * We could implement faster get_unaligned_[be/le]64 using the ldna
20#include <linux/unaligned/generic.h> 20 * instruction on tilegx; however, we need to either copy all of the
21#define get_unaligned __get_unaligned_le 21 * other generic functions to here (which is pretty ugly) or else
22#define put_unaligned __put_unaligned_le 22 * modify both the generic code and other arch code to allow arch
23 * specific unaligned data access functions. Given these functions
24 * are not often called, we'll stick with the generic version.
25 */
26#include <asm-generic/unaligned.h>
23 27
24/* 28/*
25 * Is the kernel doing fixups of unaligned accesses? If <0, no kernel 29 * Is the kernel doing fixups of unaligned accesses? If <0, no kernel
diff --git a/arch/tile/include/asm/vdso.h b/arch/tile/include/asm/vdso.h
new file mode 100644
index 000000000000..9f6a78d665fa
--- /dev/null
+++ b/arch/tile/include/asm/vdso.h
@@ -0,0 +1,49 @@
1/*
2 * Copyright 2012 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef __TILE_VDSO_H__
16#define __TILE_VDSO_H__
17
18#include <linux/types.h>
19
20/*
21 * Note about the vdso_data structure:
22 *
23 * NEVER USE THEM IN USERSPACE CODE DIRECTLY. The layout of the
24 * structure is supposed to be known only to the function in the vdso
25 * itself and may change without notice.
26 */
27
28struct vdso_data {
29 __u64 tz_update_count; /* Timezone atomicity ctr */
30 __u64 tb_update_count; /* Timebase atomicity ctr */
31 __u64 xtime_tod_stamp; /* TOD clock for xtime */
32 __u64 xtime_clock_sec; /* Kernel time second */
33 __u64 xtime_clock_nsec; /* Kernel time nanosecond */
34 __u64 wtom_clock_sec; /* Wall to monotonic clock second */
35 __u64 wtom_clock_nsec; /* Wall to monotonic clock nanosecond */
36 __u32 mult; /* Cycle to nanosecond multiplier */
37 __u32 shift; /* Cycle to nanosecond divisor (power of two) */
38 __u32 tz_minuteswest; /* Minutes west of Greenwich */
39 __u32 tz_dsttime; /* Type of dst correction */
40};
41
42extern struct vdso_data *vdso_data;
43
44/* __vdso_rt_sigreturn is defined with the addresses in the vdso page. */
45extern void __vdso_rt_sigreturn(void);
46
47extern int setup_vdso_pages(void);
48
49#endif /* __TILE_VDSO_H__ */
diff --git a/arch/tile/include/gxio/iorpc_mpipe.h b/arch/tile/include/gxio/iorpc_mpipe.h
index 9d50fce1b1a7..4cda03de734f 100644
--- a/arch/tile/include/gxio/iorpc_mpipe.h
+++ b/arch/tile/include/gxio/iorpc_mpipe.h
@@ -44,93 +44,101 @@
44#define GXIO_MPIPE_OP_REGISTER_CLIENT_MEMORY IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x1210) 44#define GXIO_MPIPE_OP_REGISTER_CLIENT_MEMORY IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x1210)
45#define GXIO_MPIPE_OP_LINK_OPEN_AUX IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1211) 45#define GXIO_MPIPE_OP_LINK_OPEN_AUX IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1211)
46#define GXIO_MPIPE_OP_LINK_CLOSE_AUX IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1212) 46#define GXIO_MPIPE_OP_LINK_CLOSE_AUX IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1212)
47#define GXIO_MPIPE_OP_LINK_SET_ATTR_AUX IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1213)
47 48
48#define GXIO_MPIPE_OP_GET_TIMESTAMP_AUX IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x121e) 49#define GXIO_MPIPE_OP_GET_TIMESTAMP_AUX IORPC_OPCODE(IORPC_FORMAT_NONE, 0x121e)
49#define GXIO_MPIPE_OP_SET_TIMESTAMP_AUX IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x121f) 50#define GXIO_MPIPE_OP_SET_TIMESTAMP_AUX IORPC_OPCODE(IORPC_FORMAT_NONE, 0x121f)
50#define GXIO_MPIPE_OP_ADJUST_TIMESTAMP_AUX IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x1220) 51#define GXIO_MPIPE_OP_ADJUST_TIMESTAMP_AUX IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1220)
52#define GXIO_MPIPE_OP_CONFIG_EDMA_RING_BLKS IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1221)
53#define GXIO_MPIPE_OP_ADJUST_TIMESTAMP_FREQ IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1222)
51#define GXIO_MPIPE_OP_ARM_POLLFD IORPC_OPCODE(IORPC_FORMAT_KERNEL_POLLFD, 0x9000) 54#define GXIO_MPIPE_OP_ARM_POLLFD IORPC_OPCODE(IORPC_FORMAT_KERNEL_POLLFD, 0x9000)
52#define GXIO_MPIPE_OP_CLOSE_POLLFD IORPC_OPCODE(IORPC_FORMAT_KERNEL_POLLFD, 0x9001) 55#define GXIO_MPIPE_OP_CLOSE_POLLFD IORPC_OPCODE(IORPC_FORMAT_KERNEL_POLLFD, 0x9001)
53#define GXIO_MPIPE_OP_GET_MMIO_BASE IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x8000) 56#define GXIO_MPIPE_OP_GET_MMIO_BASE IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x8000)
54#define GXIO_MPIPE_OP_CHECK_MMIO_OFFSET IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x8001) 57#define GXIO_MPIPE_OP_CHECK_MMIO_OFFSET IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x8001)
55 58
56int gxio_mpipe_alloc_buffer_stacks(gxio_mpipe_context_t * context, 59int gxio_mpipe_alloc_buffer_stacks(gxio_mpipe_context_t *context,
57 unsigned int count, unsigned int first, 60 unsigned int count, unsigned int first,
58 unsigned int flags); 61 unsigned int flags);
59 62
60int gxio_mpipe_init_buffer_stack_aux(gxio_mpipe_context_t * context, 63int gxio_mpipe_init_buffer_stack_aux(gxio_mpipe_context_t *context,
61 void *mem_va, size_t mem_size, 64 void *mem_va, size_t mem_size,
62 unsigned int mem_flags, unsigned int stack, 65 unsigned int mem_flags, unsigned int stack,
63 unsigned int buffer_size_enum); 66 unsigned int buffer_size_enum);
64 67
65 68
66int gxio_mpipe_alloc_notif_rings(gxio_mpipe_context_t * context, 69int gxio_mpipe_alloc_notif_rings(gxio_mpipe_context_t *context,
67 unsigned int count, unsigned int first, 70 unsigned int count, unsigned int first,
68 unsigned int flags); 71 unsigned int flags);
69 72
70int gxio_mpipe_init_notif_ring_aux(gxio_mpipe_context_t * context, void *mem_va, 73int gxio_mpipe_init_notif_ring_aux(gxio_mpipe_context_t *context, void *mem_va,
71 size_t mem_size, unsigned int mem_flags, 74 size_t mem_size, unsigned int mem_flags,
72 unsigned int ring); 75 unsigned int ring);
73 76
74int gxio_mpipe_request_notif_ring_interrupt(gxio_mpipe_context_t * context, 77int gxio_mpipe_request_notif_ring_interrupt(gxio_mpipe_context_t *context,
75 int inter_x, int inter_y, 78 int inter_x, int inter_y,
76 int inter_ipi, int inter_event, 79 int inter_ipi, int inter_event,
77 unsigned int ring); 80 unsigned int ring);
78 81
79int gxio_mpipe_enable_notif_ring_interrupt(gxio_mpipe_context_t * context, 82int gxio_mpipe_enable_notif_ring_interrupt(gxio_mpipe_context_t *context,
80 unsigned int ring); 83 unsigned int ring);
81 84
82int gxio_mpipe_alloc_notif_groups(gxio_mpipe_context_t * context, 85int gxio_mpipe_alloc_notif_groups(gxio_mpipe_context_t *context,
83 unsigned int count, unsigned int first, 86 unsigned int count, unsigned int first,
84 unsigned int flags); 87 unsigned int flags);
85 88
86int gxio_mpipe_init_notif_group(gxio_mpipe_context_t * context, 89int gxio_mpipe_init_notif_group(gxio_mpipe_context_t *context,
87 unsigned int group, 90 unsigned int group,
88 gxio_mpipe_notif_group_bits_t bits); 91 gxio_mpipe_notif_group_bits_t bits);
89 92
90int gxio_mpipe_alloc_buckets(gxio_mpipe_context_t * context, unsigned int count, 93int gxio_mpipe_alloc_buckets(gxio_mpipe_context_t *context, unsigned int count,
91 unsigned int first, unsigned int flags); 94 unsigned int first, unsigned int flags);
92 95
93int gxio_mpipe_init_bucket(gxio_mpipe_context_t * context, unsigned int bucket, 96int gxio_mpipe_init_bucket(gxio_mpipe_context_t *context, unsigned int bucket,
94 MPIPE_LBL_INIT_DAT_BSTS_TBL_t bucket_info); 97 MPIPE_LBL_INIT_DAT_BSTS_TBL_t bucket_info);
95 98
96int gxio_mpipe_alloc_edma_rings(gxio_mpipe_context_t * context, 99int gxio_mpipe_alloc_edma_rings(gxio_mpipe_context_t *context,
97 unsigned int count, unsigned int first, 100 unsigned int count, unsigned int first,
98 unsigned int flags); 101 unsigned int flags);
99 102
100int gxio_mpipe_init_edma_ring_aux(gxio_mpipe_context_t * context, void *mem_va, 103int gxio_mpipe_init_edma_ring_aux(gxio_mpipe_context_t *context, void *mem_va,
101 size_t mem_size, unsigned int mem_flags, 104 size_t mem_size, unsigned int mem_flags,
102 unsigned int ring, unsigned int channel); 105 unsigned int ring, unsigned int channel);
103 106
104 107
105int gxio_mpipe_commit_rules(gxio_mpipe_context_t * context, const void *blob, 108int gxio_mpipe_commit_rules(gxio_mpipe_context_t *context, const void *blob,
106 size_t blob_size); 109 size_t blob_size);
107 110
108int gxio_mpipe_register_client_memory(gxio_mpipe_context_t * context, 111int gxio_mpipe_register_client_memory(gxio_mpipe_context_t *context,
109 unsigned int iotlb, HV_PTE pte, 112 unsigned int iotlb, HV_PTE pte,
110 unsigned int flags); 113 unsigned int flags);
111 114
112int gxio_mpipe_link_open_aux(gxio_mpipe_context_t * context, 115int gxio_mpipe_link_open_aux(gxio_mpipe_context_t *context,
113 _gxio_mpipe_link_name_t name, unsigned int flags); 116 _gxio_mpipe_link_name_t name, unsigned int flags);
114 117
115int gxio_mpipe_link_close_aux(gxio_mpipe_context_t * context, int mac); 118int gxio_mpipe_link_close_aux(gxio_mpipe_context_t *context, int mac);
116 119
120int gxio_mpipe_link_set_attr_aux(gxio_mpipe_context_t *context, int mac,
121 uint32_t attr, int64_t val);
117 122
118int gxio_mpipe_get_timestamp_aux(gxio_mpipe_context_t * context, uint64_t * sec, 123int gxio_mpipe_get_timestamp_aux(gxio_mpipe_context_t *context, uint64_t *sec,
119 uint64_t * nsec, uint64_t * cycles); 124 uint64_t *nsec, uint64_t *cycles);
120 125
121int gxio_mpipe_set_timestamp_aux(gxio_mpipe_context_t * context, uint64_t sec, 126int gxio_mpipe_set_timestamp_aux(gxio_mpipe_context_t *context, uint64_t sec,
122 uint64_t nsec, uint64_t cycles); 127 uint64_t nsec, uint64_t cycles);
123 128
124int gxio_mpipe_adjust_timestamp_aux(gxio_mpipe_context_t * context, 129int gxio_mpipe_adjust_timestamp_aux(gxio_mpipe_context_t *context,
125 int64_t nsec); 130 int64_t nsec);
126 131
127int gxio_mpipe_arm_pollfd(gxio_mpipe_context_t * context, int pollfd_cookie); 132int gxio_mpipe_adjust_timestamp_freq(gxio_mpipe_context_t *context,
133 int32_t ppb);
128 134
129int gxio_mpipe_close_pollfd(gxio_mpipe_context_t * context, int pollfd_cookie); 135int gxio_mpipe_arm_pollfd(gxio_mpipe_context_t *context, int pollfd_cookie);
130 136
131int gxio_mpipe_get_mmio_base(gxio_mpipe_context_t * context, HV_PTE *base); 137int gxio_mpipe_close_pollfd(gxio_mpipe_context_t *context, int pollfd_cookie);
132 138
133int gxio_mpipe_check_mmio_offset(gxio_mpipe_context_t * context, 139int gxio_mpipe_get_mmio_base(gxio_mpipe_context_t *context, HV_PTE *base);
140
141int gxio_mpipe_check_mmio_offset(gxio_mpipe_context_t *context,
134 unsigned long offset, unsigned long size); 142 unsigned long offset, unsigned long size);
135 143
136#endif /* !__GXIO_MPIPE_LINUX_RPC_H__ */ 144#endif /* !__GXIO_MPIPE_LINUX_RPC_H__ */
diff --git a/arch/tile/include/gxio/iorpc_mpipe_info.h b/arch/tile/include/gxio/iorpc_mpipe_info.h
index 0bcf3f71ce8b..f0b04284468b 100644
--- a/arch/tile/include/gxio/iorpc_mpipe_info.h
+++ b/arch/tile/include/gxio/iorpc_mpipe_info.h
@@ -27,20 +27,24 @@
27#include <asm/pgtable.h> 27#include <asm/pgtable.h>
28 28
29 29
30#define GXIO_MPIPE_INFO_OP_INSTANCE_AUX IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1250)
30#define GXIO_MPIPE_INFO_OP_ENUMERATE_AUX IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1251) 31#define GXIO_MPIPE_INFO_OP_ENUMERATE_AUX IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1251)
31#define GXIO_MPIPE_INFO_OP_GET_MMIO_BASE IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x8000) 32#define GXIO_MPIPE_INFO_OP_GET_MMIO_BASE IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x8000)
32#define GXIO_MPIPE_INFO_OP_CHECK_MMIO_OFFSET IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x8001) 33#define GXIO_MPIPE_INFO_OP_CHECK_MMIO_OFFSET IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x8001)
33 34
34 35
35int gxio_mpipe_info_enumerate_aux(gxio_mpipe_info_context_t * context, 36int gxio_mpipe_info_instance_aux(gxio_mpipe_info_context_t *context,
37 _gxio_mpipe_link_name_t name);
38
39int gxio_mpipe_info_enumerate_aux(gxio_mpipe_info_context_t *context,
36 unsigned int idx, 40 unsigned int idx,
37 _gxio_mpipe_link_name_t * name, 41 _gxio_mpipe_link_name_t *name,
38 _gxio_mpipe_link_mac_t * mac); 42 _gxio_mpipe_link_mac_t *mac);
39 43
40int gxio_mpipe_info_get_mmio_base(gxio_mpipe_info_context_t * context, 44int gxio_mpipe_info_get_mmio_base(gxio_mpipe_info_context_t *context,
41 HV_PTE *base); 45 HV_PTE *base);
42 46
43int gxio_mpipe_info_check_mmio_offset(gxio_mpipe_info_context_t * context, 47int gxio_mpipe_info_check_mmio_offset(gxio_mpipe_info_context_t *context,
44 unsigned long offset, unsigned long size); 48 unsigned long offset, unsigned long size);
45 49
46#endif /* !__GXIO_MPIPE_INFO_LINUX_RPC_H__ */ 50#endif /* !__GXIO_MPIPE_INFO_LINUX_RPC_H__ */
diff --git a/arch/tile/include/gxio/iorpc_trio.h b/arch/tile/include/gxio/iorpc_trio.h
index 58105c31228b..376a4f771167 100644
--- a/arch/tile/include/gxio/iorpc_trio.h
+++ b/arch/tile/include/gxio/iorpc_trio.h
@@ -30,6 +30,7 @@
30 30
31#define GXIO_TRIO_OP_ALLOC_MEMORY_MAPS IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1404) 31#define GXIO_TRIO_OP_ALLOC_MEMORY_MAPS IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1404)
32 32
33#define GXIO_TRIO_OP_ALLOC_SCATTER_QUEUES IORPC_OPCODE(IORPC_FORMAT_NONE, 0x140e)
33#define GXIO_TRIO_OP_ALLOC_PIO_REGIONS IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1412) 34#define GXIO_TRIO_OP_ALLOC_PIO_REGIONS IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1412)
34 35
35#define GXIO_TRIO_OP_INIT_PIO_REGION_AUX IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1414) 36#define GXIO_TRIO_OP_INIT_PIO_REGION_AUX IORPC_OPCODE(IORPC_FORMAT_NONE, 0x1414)
@@ -45,55 +46,59 @@
45#define GXIO_TRIO_OP_GET_MMIO_BASE IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x8000) 46#define GXIO_TRIO_OP_GET_MMIO_BASE IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x8000)
46#define GXIO_TRIO_OP_CHECK_MMIO_OFFSET IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x8001) 47#define GXIO_TRIO_OP_CHECK_MMIO_OFFSET IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x8001)
47 48
48int gxio_trio_alloc_asids(gxio_trio_context_t * context, unsigned int count, 49int gxio_trio_alloc_asids(gxio_trio_context_t *context, unsigned int count,
49 unsigned int first, unsigned int flags); 50 unsigned int first, unsigned int flags);
50 51
51 52
52int gxio_trio_alloc_memory_maps(gxio_trio_context_t * context, 53int gxio_trio_alloc_memory_maps(gxio_trio_context_t *context,
53 unsigned int count, unsigned int first, 54 unsigned int count, unsigned int first,
54 unsigned int flags); 55 unsigned int flags);
55 56
56 57
57int gxio_trio_alloc_pio_regions(gxio_trio_context_t * context, 58int gxio_trio_alloc_scatter_queues(gxio_trio_context_t *context,
59 unsigned int count, unsigned int first,
60 unsigned int flags);
61
62int gxio_trio_alloc_pio_regions(gxio_trio_context_t *context,
58 unsigned int count, unsigned int first, 63 unsigned int count, unsigned int first,
59 unsigned int flags); 64 unsigned int flags);
60 65
61int gxio_trio_init_pio_region_aux(gxio_trio_context_t * context, 66int gxio_trio_init_pio_region_aux(gxio_trio_context_t *context,
62 unsigned int pio_region, unsigned int mac, 67 unsigned int pio_region, unsigned int mac,
63 uint32_t bus_address_hi, unsigned int flags); 68 uint32_t bus_address_hi, unsigned int flags);
64 69
65 70
66int gxio_trio_init_memory_map_mmu_aux(gxio_trio_context_t * context, 71int gxio_trio_init_memory_map_mmu_aux(gxio_trio_context_t *context,
67 unsigned int map, unsigned long va, 72 unsigned int map, unsigned long va,
68 uint64_t size, unsigned int asid, 73 uint64_t size, unsigned int asid,
69 unsigned int mac, uint64_t bus_address, 74 unsigned int mac, uint64_t bus_address,
70 unsigned int node, 75 unsigned int node,
71 unsigned int order_mode); 76 unsigned int order_mode);
72 77
73int gxio_trio_get_port_property(gxio_trio_context_t * context, 78int gxio_trio_get_port_property(gxio_trio_context_t *context,
74 struct pcie_trio_ports_property *trio_ports); 79 struct pcie_trio_ports_property *trio_ports);
75 80
76int gxio_trio_config_legacy_intr(gxio_trio_context_t * context, int inter_x, 81int gxio_trio_config_legacy_intr(gxio_trio_context_t *context, int inter_x,
77 int inter_y, int inter_ipi, int inter_event, 82 int inter_y, int inter_ipi, int inter_event,
78 unsigned int mac, unsigned int intx); 83 unsigned int mac, unsigned int intx);
79 84
80int gxio_trio_config_msi_intr(gxio_trio_context_t * context, int inter_x, 85int gxio_trio_config_msi_intr(gxio_trio_context_t *context, int inter_x,
81 int inter_y, int inter_ipi, int inter_event, 86 int inter_y, int inter_ipi, int inter_event,
82 unsigned int mac, unsigned int mem_map, 87 unsigned int mac, unsigned int mem_map,
83 uint64_t mem_map_base, uint64_t mem_map_limit, 88 uint64_t mem_map_base, uint64_t mem_map_limit,
84 unsigned int asid); 89 unsigned int asid);
85 90
86 91
87int gxio_trio_set_mps_mrs(gxio_trio_context_t * context, uint16_t mps, 92int gxio_trio_set_mps_mrs(gxio_trio_context_t *context, uint16_t mps,
88 uint16_t mrs, unsigned int mac); 93 uint16_t mrs, unsigned int mac);
89 94
90int gxio_trio_force_rc_link_up(gxio_trio_context_t * context, unsigned int mac); 95int gxio_trio_force_rc_link_up(gxio_trio_context_t *context, unsigned int mac);
91 96
92int gxio_trio_force_ep_link_up(gxio_trio_context_t * context, unsigned int mac); 97int gxio_trio_force_ep_link_up(gxio_trio_context_t *context, unsigned int mac);
93 98
94int gxio_trio_get_mmio_base(gxio_trio_context_t * context, HV_PTE *base); 99int gxio_trio_get_mmio_base(gxio_trio_context_t *context, HV_PTE *base);
95 100
96int gxio_trio_check_mmio_offset(gxio_trio_context_t * context, 101int gxio_trio_check_mmio_offset(gxio_trio_context_t *context,
97 unsigned long offset, unsigned long size); 102 unsigned long offset, unsigned long size);
98 103
99#endif /* !__GXIO_TRIO_LINUX_RPC_H__ */ 104#endif /* !__GXIO_TRIO_LINUX_RPC_H__ */
diff --git a/arch/tile/include/gxio/iorpc_uart.h b/arch/tile/include/gxio/iorpc_uart.h
new file mode 100644
index 000000000000..55429d48ea56
--- /dev/null
+++ b/arch/tile/include/gxio/iorpc_uart.h
@@ -0,0 +1,40 @@
1/*
2 * Copyright 2013 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15/* This file is machine-generated; DO NOT EDIT! */
16#ifndef __GXIO_UART_LINUX_RPC_H__
17#define __GXIO_UART_LINUX_RPC_H__
18
19#include <hv/iorpc.h>
20
21#include <hv/drv_uart_intf.h>
22#include <gxio/uart.h>
23#include <gxio/kiorpc.h>
24#include <linux/string.h>
25#include <linux/module.h>
26#include <asm/pgtable.h>
27
28#define GXIO_UART_OP_CFG_INTERRUPT IORPC_OPCODE(IORPC_FORMAT_KERNEL_INTERRUPT, 0x1900)
29#define GXIO_UART_OP_GET_MMIO_BASE IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x8000)
30#define GXIO_UART_OP_CHECK_MMIO_OFFSET IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x8001)
31
32int gxio_uart_cfg_interrupt(gxio_uart_context_t *context, int inter_x,
33 int inter_y, int inter_ipi, int inter_event);
34
35int gxio_uart_get_mmio_base(gxio_uart_context_t *context, HV_PTE *base);
36
37int gxio_uart_check_mmio_offset(gxio_uart_context_t *context,
38 unsigned long offset, unsigned long size);
39
40#endif /* !__GXIO_UART_LINUX_RPC_H__ */
diff --git a/arch/tile/include/gxio/iorpc_usb_host.h b/arch/tile/include/gxio/iorpc_usb_host.h
index 8622e7d126ad..79962a97de8e 100644
--- a/arch/tile/include/gxio/iorpc_usb_host.h
+++ b/arch/tile/include/gxio/iorpc_usb_host.h
@@ -31,16 +31,16 @@
31#define GXIO_USB_HOST_OP_GET_MMIO_BASE IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x8000) 31#define GXIO_USB_HOST_OP_GET_MMIO_BASE IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x8000)
32#define GXIO_USB_HOST_OP_CHECK_MMIO_OFFSET IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x8001) 32#define GXIO_USB_HOST_OP_CHECK_MMIO_OFFSET IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x8001)
33 33
34int gxio_usb_host_cfg_interrupt(gxio_usb_host_context_t * context, int inter_x, 34int gxio_usb_host_cfg_interrupt(gxio_usb_host_context_t *context, int inter_x,
35 int inter_y, int inter_ipi, int inter_event); 35 int inter_y, int inter_ipi, int inter_event);
36 36
37int gxio_usb_host_register_client_memory(gxio_usb_host_context_t * context, 37int gxio_usb_host_register_client_memory(gxio_usb_host_context_t *context,
38 HV_PTE pte, unsigned int flags); 38 HV_PTE pte, unsigned int flags);
39 39
40int gxio_usb_host_get_mmio_base(gxio_usb_host_context_t * context, 40int gxio_usb_host_get_mmio_base(gxio_usb_host_context_t *context,
41 HV_PTE *base); 41 HV_PTE *base);
42 42
43int gxio_usb_host_check_mmio_offset(gxio_usb_host_context_t * context, 43int gxio_usb_host_check_mmio_offset(gxio_usb_host_context_t *context,
44 unsigned long offset, unsigned long size); 44 unsigned long offset, unsigned long size);
45 45
46#endif /* !__GXIO_USB_HOST_LINUX_RPC_H__ */ 46#endif /* !__GXIO_USB_HOST_LINUX_RPC_H__ */
diff --git a/arch/tile/include/gxio/mpipe.h b/arch/tile/include/gxio/mpipe.h
index b74f470ed11e..e37cf4f0cffd 100644
--- a/arch/tile/include/gxio/mpipe.h
+++ b/arch/tile/include/gxio/mpipe.h
@@ -220,6 +220,13 @@ typedef MPIPE_PDESC_t gxio_mpipe_idesc_t;
220 */ 220 */
221typedef MPIPE_EDMA_DESC_t gxio_mpipe_edesc_t; 221typedef MPIPE_EDMA_DESC_t gxio_mpipe_edesc_t;
222 222
223/*
224 * Max # of mpipe instances. 2 currently.
225 */
226#define GXIO_MPIPE_INSTANCE_MAX HV_MPIPE_INSTANCE_MAX
227
228#define NR_MPIPE_MAX GXIO_MPIPE_INSTANCE_MAX
229
223/* Get the "va" field from an "idesc". 230/* Get the "va" field from an "idesc".
224 * 231 *
225 * This is the address at which the ingress hardware copied the first 232 * This is the address at which the ingress hardware copied the first
@@ -311,6 +318,9 @@ typedef struct {
311 /* File descriptor for calling up to Linux (and thus the HV). */ 318 /* File descriptor for calling up to Linux (and thus the HV). */
312 int fd; 319 int fd;
313 320
321 /* Corresponding mpipe instance #. */
322 int instance;
323
314 /* The VA at which configuration registers are mapped. */ 324 /* The VA at which configuration registers are mapped. */
315 char *mmio_cfg_base; 325 char *mmio_cfg_base;
316 326
@@ -810,7 +820,7 @@ extern int gxio_mpipe_alloc_edma_rings(gxio_mpipe_context_t *context,
810/* Initialize an eDMA ring, using the given memory and size. 820/* Initialize an eDMA ring, using the given memory and size.
811 * 821 *
812 * @param context An initialized mPIPE context. 822 * @param context An initialized mPIPE context.
813 * @param ring The eDMA ring index. 823 * @param ering The eDMA ring index.
814 * @param channel The channel to use. This must be one of the channels 824 * @param channel The channel to use. This must be one of the channels
815 * associated with the context's set of open links. 825 * associated with the context's set of open links.
816 * @param mem A physically contiguous region of memory to be filled 826 * @param mem A physically contiguous region of memory to be filled
@@ -823,10 +833,37 @@ extern int gxio_mpipe_alloc_edma_rings(gxio_mpipe_context_t *context,
823 * ::GXIO_ERR_INVAL_MEMORY_SIZE on failure. 833 * ::GXIO_ERR_INVAL_MEMORY_SIZE on failure.
824 */ 834 */
825extern int gxio_mpipe_init_edma_ring(gxio_mpipe_context_t *context, 835extern int gxio_mpipe_init_edma_ring(gxio_mpipe_context_t *context,
826 unsigned int ring, unsigned int channel, 836 unsigned int ering, unsigned int channel,
827 void *mem, size_t mem_size, 837 void *mem, size_t mem_size,
828 unsigned int mem_flags); 838 unsigned int mem_flags);
829 839
840/* Set the "max_blks", "min_snf_blks", and "db" fields of
841 * ::MPIPE_EDMA_RG_INIT_DAT_THRESH_t for a given edma ring.
842 *
843 * The global pool of dynamic blocks will be automatically adjusted.
844 *
845 * This function should not be called after any egress has been done
846 * on the edma ring.
847 *
848 * Most applications should just use gxio_mpipe_equeue_set_snf_size().
849 *
850 * @param context An initialized mPIPE context.
851 * @param ering The eDMA ring index.
852 * @param max_blks The number of blocks to dedicate to the ring
853 * (normally min_snf_blks + 1). Must be greater than min_snf_blocks.
854 * @param min_snf_blks The number of blocks which must be stored
855 * prior to starting to send the packet (normally 12).
856 * @param db Whether to allow use of dynamic blocks by the ring
857 * (normally 1).
858 *
859 * @return 0 on success, negative on error.
860 */
861extern int gxio_mpipe_config_edma_ring_blks(gxio_mpipe_context_t *context,
862 unsigned int ering,
863 unsigned int max_blks,
864 unsigned int min_snf_blks,
865 unsigned int db);
866
830/***************************************************************** 867/*****************************************************************
831 * Classifier Program * 868 * Classifier Program *
832 ******************************************************************/ 869 ******************************************************************/
@@ -1288,15 +1325,39 @@ typedef struct {
1288 /* The log2() of the number of entries. */ 1325 /* The log2() of the number of entries. */
1289 unsigned long log2_num_entries; 1326 unsigned long log2_num_entries;
1290 1327
1328 /* The context. */
1329 gxio_mpipe_context_t *context;
1330
1331 /* The ering. */
1332 unsigned int ering;
1333
1334 /* The channel. */
1335 unsigned int channel;
1336
1291} gxio_mpipe_equeue_t; 1337} gxio_mpipe_equeue_t;
1292 1338
1293/* Initialize an "equeue". 1339/* Initialize an "equeue".
1294 * 1340 *
1295 * Takes the equeue plus the same args as gxio_mpipe_init_edma_ring(). 1341 * This function uses gxio_mpipe_init_edma_ring() to initialize the
1342 * underlying edma_ring using the provided arguments.
1343 *
1344 * @param equeue An egress queue to be initialized.
1345 * @param context An initialized mPIPE context.
1346 * @param ering The eDMA ring index.
1347 * @param channel The channel to use. This must be one of the channels
1348 * associated with the context's set of open links.
1349 * @param mem A physically contiguous region of memory to be filled
1350 * with a ring of ::gxio_mpipe_edesc_t structures.
1351 * @param mem_size Number of bytes in the ring. Must be 512, 2048,
1352 * 8192 or 65536, times 16 (i.e. sizeof(gxio_mpipe_edesc_t)).
1353 * @param mem_flags ::gxio_mpipe_mem_flags_e memory flags.
1354 *
1355 * @return 0 on success, ::GXIO_MPIPE_ERR_BAD_EDMA_RING or
1356 * ::GXIO_ERR_INVAL_MEMORY_SIZE on failure.
1296 */ 1357 */
1297extern int gxio_mpipe_equeue_init(gxio_mpipe_equeue_t *equeue, 1358extern int gxio_mpipe_equeue_init(gxio_mpipe_equeue_t *equeue,
1298 gxio_mpipe_context_t *context, 1359 gxio_mpipe_context_t *context,
1299 unsigned int edma_ring_id, 1360 unsigned int ering,
1300 unsigned int channel, 1361 unsigned int channel,
1301 void *mem, unsigned int mem_size, 1362 void *mem, unsigned int mem_size,
1302 unsigned int mem_flags); 1363 unsigned int mem_flags);
@@ -1494,6 +1555,37 @@ static inline int gxio_mpipe_equeue_is_complete(gxio_mpipe_equeue_t *equeue,
1494 completion_slot, update); 1555 completion_slot, update);
1495} 1556}
1496 1557
1558/* Set the snf (store and forward) size for an equeue.
1559 *
1560 * The snf size for an equeue defaults to 1536, and encodes the size
1561 * of the largest packet for which egress is guaranteed to avoid
1562 * transmission underruns and/or corrupt checksums under heavy load.
1563 *
1564 * The snf size affects a global resource pool which cannot support,
1565 * for example, all 24 equeues each requesting an snf size of 8K.
1566 *
1567 * To ensure that jumbo packets can be egressed properly, the snf size
1568 * should be set to the size of the largest possible packet, which
1569 * will usually be limited by the size of the app's largest buffer.
1570 *
1571 * This is a convenience wrapper around
1572 * gxio_mpipe_config_edma_ring_blks().
1573 *
1574 * This function should not be called after any egress has been done
1575 * on the equeue.
1576 *
1577 * @param equeue An egress queue initialized via gxio_mpipe_equeue_init().
1578 * @param size The snf size, in bytes.
1579 * @return Zero on success, negative error otherwise.
1580 */
1581static inline int gxio_mpipe_equeue_set_snf_size(gxio_mpipe_equeue_t *equeue,
1582 size_t size)
1583{
1584 int blks = (size + 127) / 128;
1585 return gxio_mpipe_config_edma_ring_blks(equeue->context, equeue->ering,
1586 blks + 1, blks, 1);
1587}
1588
1497/***************************************************************** 1589/*****************************************************************
1498 * Link Management * 1590 * Link Management *
1499 ******************************************************************/ 1591 ******************************************************************/
@@ -1634,6 +1726,24 @@ typedef struct {
1634 uint8_t mac; 1726 uint8_t mac;
1635} gxio_mpipe_link_t; 1727} gxio_mpipe_link_t;
1636 1728
1729/* Translate a link name to the instance number of the mPIPE shim which is
1730 * connected to that link. This call does not verify whether the link is
1731 * currently available, and does not reserve any link resources;
1732 * gxio_mpipe_link_open() must be called to perform those functions.
1733 *
1734 * Typically applications will call this function to translate a link name
1735 * to an mPIPE instance number; call gxio_mpipe_init(), passing it that
1736 * instance number, to initialize the mPIPE shim; and then call
1737 * gxio_mpipe_link_open(), passing it the same link name plus the mPIPE
1738 * context, to configure the link.
1739 *
1740 * @param link_name Name of the link; see @ref gxio_mpipe_link_names.
1741 * @return The mPIPE instance number which is associated with the named
1742 * link, or a negative error code (::GXIO_ERR_NO_DEVICE) if the link does
1743 * not exist.
1744 */
1745extern int gxio_mpipe_link_instance(const char *link_name);
1746
1637/* Retrieve one of this system's legal link names, and its MAC address. 1747/* Retrieve one of this system's legal link names, and its MAC address.
1638 * 1748 *
1639 * @param index Link name index. If a system supports N legal link names, 1749 * @param index Link name index. If a system supports N legal link names,
@@ -1697,6 +1807,17 @@ static inline int gxio_mpipe_link_channel(gxio_mpipe_link_t *link)
1697 return link->channel; 1807 return link->channel;
1698} 1808}
1699 1809
1810/* Set a link attribute.
1811 *
1812 * @param link A properly initialized link state object.
1813 * @param attr An attribute from the set of @ref gxio_mpipe_link_attrs.
1814 * @param val New value of the attribute.
1815 * @return 0 if the attribute was successfully set, or a negative error
1816 * code.
1817 */
1818extern int gxio_mpipe_link_set_attr(gxio_mpipe_link_t *link, uint32_t attr,
1819 int64_t val);
1820
1700/////////////////////////////////////////////////////////////////// 1821///////////////////////////////////////////////////////////////////
1701// Timestamp // 1822// Timestamp //
1702/////////////////////////////////////////////////////////////////// 1823///////////////////////////////////////////////////////////////////
@@ -1733,4 +1854,18 @@ extern int gxio_mpipe_set_timestamp(gxio_mpipe_context_t *context,
1733extern int gxio_mpipe_adjust_timestamp(gxio_mpipe_context_t *context, 1854extern int gxio_mpipe_adjust_timestamp(gxio_mpipe_context_t *context,
1734 int64_t delta); 1855 int64_t delta);
1735 1856
1857/** Adjust the mPIPE timestamp clock frequency.
1858 *
1859 * @param context An initialized mPIPE context.
1860 * @param ppb A 32-bit signed PPB (Parts Per Billion) value to adjust.
1861 * The absolute value of ppb must be less than or equal to 1000000000.
1862 * Values less than about 30000 will generally cause a GXIO_ERR_INVAL
1863 * return due to the granularity of the hardware that converts reference
1864 * clock cycles into seconds and nanoseconds.
1865 * @return If the call was successful, zero; otherwise, a negative error
1866 * code.
1867 */
1868extern int gxio_mpipe_adjust_timestamp_freq(gxio_mpipe_context_t* context,
1869 int32_t ppb);
1870
1736#endif /* !_GXIO_MPIPE_H_ */ 1871#endif /* !_GXIO_MPIPE_H_ */
diff --git a/arch/tile/include/gxio/uart.h b/arch/tile/include/gxio/uart.h
new file mode 100644
index 000000000000..438ee7e46c7b
--- /dev/null
+++ b/arch/tile/include/gxio/uart.h
@@ -0,0 +1,105 @@
1/*
2 * Copyright 2013 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _GXIO_UART_H_
16#define _GXIO_UART_H_
17
18#include "common.h"
19
20#include <hv/drv_uart_intf.h>
21#include <hv/iorpc.h>
22
23/*
24 *
25 * An API for manipulating UART interface.
26 */
27
28/*
29 *
30 * The Rshim allows access to the processor's UART interface.
31 */
32
33/* A context object used to manage UART resources. */
34typedef struct {
35
36 /* File descriptor for calling up to the hypervisor. */
37 int fd;
38
39 /* The VA at which our MMIO registers are mapped. */
40 char *mmio_base;
41
42} gxio_uart_context_t;
43
44/* Request UART interrupts.
45 *
46 * Request that interrupts be delivered to a tile when the UART's
47 * Receive FIFO is written, or the Write FIFO is read.
48 *
49 * @param context Pointer to a properly initialized gxio_uart_context_t.
50 * @param bind_cpu_x X coordinate of CPU to which interrupt will be delivered.
51 * @param bind_cpu_y Y coordinate of CPU to which interrupt will be delivered.
52 * @param bind_interrupt IPI interrupt number.
53 * @param bind_event Sub-interrupt event bit number; a negative value can
54 * disable the interrupt.
55 * @return Zero if all of the requested UART events were successfully
56 * configured to interrupt.
57 */
58extern int gxio_uart_cfg_interrupt(gxio_uart_context_t *context,
59 int bind_cpu_x,
60 int bind_cpu_y,
61 int bind_interrupt, int bind_event);
62
63/* Initialize a UART context.
64 *
65 * A properly initialized context must be obtained before any of the other
66 * gxio_uart routines may be used.
67 *
68 * @param context Pointer to a gxio_uart_context_t, which will be initialized
69 * by this routine, if it succeeds.
70 * @param uart_index Index of the UART to use.
71 * @return Zero if the context was successfully initialized, else a
72 * GXIO_ERR_xxx error code.
73 */
74extern int gxio_uart_init(gxio_uart_context_t *context, int uart_index);
75
76/* Destroy a UART context.
77 *
78 * Once destroyed, a context may not be used with any gxio_uart routines
79 * other than gxio_uart_init(). After this routine returns, no further
80 * interrupts requested on this context will be delivered. The state and
81 * configuration of the pins which had been attached to this context are
82 * unchanged by this operation.
83 *
84 * @param context Pointer to a gxio_uart_context_t.
85 * @return Zero if the context was successfully destroyed, else a
86 * GXIO_ERR_xxx error code.
87 */
88extern int gxio_uart_destroy(gxio_uart_context_t *context);
89
90/* Write UART register.
91 * @param context Pointer to a gxio_uart_context_t.
92 * @param offset UART register offset.
93 * @param word Data will be wrote to UART reigister.
94 */
95extern void gxio_uart_write(gxio_uart_context_t *context, uint64_t offset,
96 uint64_t word);
97
98/* Read UART register.
99 * @param context Pointer to a gxio_uart_context_t.
100 * @param offset UART register offset.
101 * @return Data read from UART register.
102 */
103extern uint64_t gxio_uart_read(gxio_uart_context_t *context, uint64_t offset);
104
105#endif /* _GXIO_UART_H_ */
diff --git a/arch/tile/include/gxio/usb_host.h b/arch/tile/include/gxio/usb_host.h
index 5eedec0e988e..93c9636d2dd7 100644
--- a/arch/tile/include/gxio/usb_host.h
+++ b/arch/tile/include/gxio/usb_host.h
@@ -53,7 +53,7 @@ typedef struct {
53 * @return Zero if the context was successfully initialized, else a 53 * @return Zero if the context was successfully initialized, else a
54 * GXIO_ERR_xxx error code. 54 * GXIO_ERR_xxx error code.
55 */ 55 */
56extern int gxio_usb_host_init(gxio_usb_host_context_t * context, int usb_index, 56extern int gxio_usb_host_init(gxio_usb_host_context_t *context, int usb_index,
57 int is_ehci); 57 int is_ehci);
58 58
59/* Destroy a USB context. 59/* Destroy a USB context.
@@ -68,20 +68,20 @@ extern int gxio_usb_host_init(gxio_usb_host_context_t * context, int usb_index,
68 * @return Zero if the context was successfully destroyed, else a 68 * @return Zero if the context was successfully destroyed, else a
69 * GXIO_ERR_xxx error code. 69 * GXIO_ERR_xxx error code.
70 */ 70 */
71extern int gxio_usb_host_destroy(gxio_usb_host_context_t * context); 71extern int gxio_usb_host_destroy(gxio_usb_host_context_t *context);
72 72
73/* Retrieve the address of the shim's MMIO registers. 73/* Retrieve the address of the shim's MMIO registers.
74 * 74 *
75 * @param context Pointer to a properly initialized gxio_usb_host_context_t. 75 * @param context Pointer to a properly initialized gxio_usb_host_context_t.
76 * @return The address of the shim's MMIO registers. 76 * @return The address of the shim's MMIO registers.
77 */ 77 */
78extern void *gxio_usb_host_get_reg_start(gxio_usb_host_context_t * context); 78extern void *gxio_usb_host_get_reg_start(gxio_usb_host_context_t *context);
79 79
80/* Retrieve the length of the shim's MMIO registers. 80/* Retrieve the length of the shim's MMIO registers.
81 * 81 *
82 * @param context Pointer to a properly initialized gxio_usb_host_context_t. 82 * @param context Pointer to a properly initialized gxio_usb_host_context_t.
83 * @return The length of the shim's MMIO registers. 83 * @return The length of the shim's MMIO registers.
84 */ 84 */
85extern size_t gxio_usb_host_get_reg_len(gxio_usb_host_context_t * context); 85extern size_t gxio_usb_host_get_reg_len(gxio_usb_host_context_t *context);
86 86
87#endif /* _GXIO_USB_H_ */ 87#endif /* _GXIO_USB_H_ */
diff --git a/arch/tile/include/hv/drv_mpipe_intf.h b/arch/tile/include/hv/drv_mpipe_intf.h
index 6cdae3bf046e..c97e416dd963 100644
--- a/arch/tile/include/hv/drv_mpipe_intf.h
+++ b/arch/tile/include/hv/drv_mpipe_intf.h
@@ -23,6 +23,9 @@
23#include <arch/mpipe_constants.h> 23#include <arch/mpipe_constants.h>
24 24
25 25
26/** Number of mPIPE instances supported */
27#define HV_MPIPE_INSTANCE_MAX (2)
28
26/** Number of buffer stacks (32). */ 29/** Number of buffer stacks (32). */
27#define HV_MPIPE_NUM_BUFFER_STACKS \ 30#define HV_MPIPE_NUM_BUFFER_STACKS \
28 (MPIPE_MMIO_INIT_DAT_GX36_1__BUFFER_STACK_MASK_WIDTH) 31 (MPIPE_MMIO_INIT_DAT_GX36_1__BUFFER_STACK_MASK_WIDTH)
diff --git a/arch/tile/include/hv/drv_trio_intf.h b/arch/tile/include/hv/drv_trio_intf.h
index ef9f3f52ee27..237e04dee66c 100644
--- a/arch/tile/include/hv/drv_trio_intf.h
+++ b/arch/tile/include/hv/drv_trio_intf.h
@@ -64,8 +64,9 @@ struct pcie_port_property
64 * will not consider it an error if the link comes up as a x8 link. */ 64 * will not consider it an error if the link comes up as a x8 link. */
65 uint8_t allow_x8: 1; 65 uint8_t allow_x8: 1;
66 66
67 /** Reserved. */ 67 /** If true, this link is connected to a device which may or may not
68 uint8_t reserved: 1; 68 * be present. */
69 uint8_t removable: 1;
69 70
70}; 71};
71 72
@@ -167,6 +168,9 @@ pcie_stream_intr_config_sel_t;
167struct pcie_trio_ports_property 168struct pcie_trio_ports_property
168{ 169{
169 struct pcie_port_property ports[TILEGX_TRIO_PCIES]; 170 struct pcie_port_property ports[TILEGX_TRIO_PCIES];
171
172 /** Set if this TRIO belongs to a Gx72 device. */
173 uint8_t is_gx72;
170}; 174};
171 175
172/* Flags indicating traffic class. */ 176/* Flags indicating traffic class. */
diff --git a/arch/tile/include/hv/drv_uart_intf.h b/arch/tile/include/hv/drv_uart_intf.h
new file mode 100644
index 000000000000..f5379e2404fd
--- /dev/null
+++ b/arch/tile/include/hv/drv_uart_intf.h
@@ -0,0 +1,33 @@
1/*
2 * Copyright 2013 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15/**
16 * Interface definitions for the UART driver.
17 */
18
19#ifndef _SYS_HV_DRV_UART_INTF_H
20#define _SYS_HV_DRV_UART_INTF_H
21
22#include <arch/uart.h>
23
24/** Number of UART ports supported. */
25#define TILEGX_UART_NR 2
26
27/** The mmap file offset (PA) of the UART MMIO region. */
28#define HV_UART_MMIO_OFFSET 0
29
30/** The maximum size of the UARTs MMIO region (64K Bytes). */
31#define HV_UART_MMIO_SIZE (1UL << 16)
32
33#endif /* _SYS_HV_DRV_UART_INTF_H */
diff --git a/arch/tile/include/hv/hypervisor.h b/arch/tile/include/hv/hypervisor.h
index 837dca5328c2..dfcdeb61ba34 100644
--- a/arch/tile/include/hv/hypervisor.h
+++ b/arch/tile/include/hv/hypervisor.h
@@ -318,8 +318,11 @@
318/** hv_set_pte_super_shift */ 318/** hv_set_pte_super_shift */
319#define HV_DISPATCH_SET_PTE_SUPER_SHIFT 57 319#define HV_DISPATCH_SET_PTE_SUPER_SHIFT 57
320 320
321/** hv_console_set_ipi */
322#define HV_DISPATCH_CONSOLE_SET_IPI 63
323
321/** One more than the largest dispatch value */ 324/** One more than the largest dispatch value */
322#define _HV_DISPATCH_END 58 325#define _HV_DISPATCH_END 64
323 326
324 327
325#ifndef __ASSEMBLER__ 328#ifndef __ASSEMBLER__
@@ -541,14 +544,24 @@ typedef enum {
541 HV_CONFSTR_CPUMOD_REV = 18, 544 HV_CONFSTR_CPUMOD_REV = 18,
542 545
543 /** Human-readable CPU module description. */ 546 /** Human-readable CPU module description. */
544 HV_CONFSTR_CPUMOD_DESC = 19 547 HV_CONFSTR_CPUMOD_DESC = 19,
548
549 /** Per-tile hypervisor statistics. When this identifier is specified,
550 * the hv_confstr call takes two extra arguments. The first is the
551 * HV_XY_TO_LOTAR of the target tile's coordinates. The second is
552 * a flag word. The only current flag is the lowest bit, which means
553 * "zero out the stats instead of retrieving them"; in this case the
554 * buffer and buffer length are ignored. */
555 HV_CONFSTR_HV_STATS = 20
545 556
546} HV_ConfstrQuery; 557} HV_ConfstrQuery;
547 558
548/** Query a configuration string from the hypervisor. 559/** Query a configuration string from the hypervisor.
549 * 560 *
550 * @param query Identifier for the specific string to be retrieved 561 * @param query Identifier for the specific string to be retrieved
551 * (HV_CONFSTR_xxx). 562 * (HV_CONFSTR_xxx). Some strings may require or permit extra
563 * arguments to be appended which select specific objects to be
564 * described; see the string descriptions above.
552 * @param buf Buffer in which to place the string. 565 * @param buf Buffer in which to place the string.
553 * @param len Length of the buffer. 566 * @param len Length of the buffer.
554 * @return If query is valid, then the length of the corresponding string, 567 * @return If query is valid, then the length of the corresponding string,
@@ -556,21 +569,16 @@ typedef enum {
556 * was truncated. If query is invalid, HV_EINVAL. If the specified 569 * was truncated. If query is invalid, HV_EINVAL. If the specified
557 * buffer is not writable by the client, HV_EFAULT. 570 * buffer is not writable by the client, HV_EFAULT.
558 */ 571 */
559int hv_confstr(HV_ConfstrQuery query, HV_VirtAddr buf, int len); 572int hv_confstr(HV_ConfstrQuery query, HV_VirtAddr buf, int len, ...);
560 573
561/** Tile coordinate */ 574/** Tile coordinate */
562typedef struct 575typedef struct
563{ 576{
564#ifndef __BIG_ENDIAN__
565 /** X coordinate, relative to supervisor's top-left coordinate */ 577 /** X coordinate, relative to supervisor's top-left coordinate */
566 int x; 578 int x;
567 579
568 /** Y coordinate, relative to supervisor's top-left coordinate */ 580 /** Y coordinate, relative to supervisor's top-left coordinate */
569 int y; 581 int y;
570#else
571 int y;
572 int x;
573#endif
574} HV_Coord; 582} HV_Coord;
575 583
576 584
@@ -585,6 +593,30 @@ typedef struct
585 */ 593 */
586int hv_get_ipi_pte(HV_Coord tile, int pl, HV_PTE* pte); 594int hv_get_ipi_pte(HV_Coord tile, int pl, HV_PTE* pte);
587 595
596/** Configure the console interrupt.
597 *
598 * When the console client interrupt is enabled, the hypervisor will
599 * deliver the specified IPI to the client in the following situations:
600 *
601 * - The console has at least one character available for input.
602 *
603 * - The console can accept new characters for output, and the last call
604 * to hv_console_write() did not write all of the characters requested
605 * by the client.
606 *
607 * Note that in some system configurations, console interrupt will not
608 * be available; clients should be prepared for this routine to fail and
609 * to fall back to periodic console polling in that case.
610 *
611 * @param ipi Index of the IPI register which will receive the interrupt.
612 * @param event IPI event number for console interrupt. If less than 0,
613 * disable the console IPI interrupt.
614 * @param coord Tile to be targeted for console interrupt.
615 * @return 0 on success, otherwise, HV_EINVAL if illegal parameter,
616 * HV_ENOTSUP if console interrupt are not available.
617 */
618int hv_console_set_ipi(int ipi, int event, HV_Coord coord);
619
588#else /* !CHIP_HAS_IPI() */ 620#else /* !CHIP_HAS_IPI() */
589 621
590/** A set of interrupts. */ 622/** A set of interrupts. */
@@ -1092,13 +1124,8 @@ HV_VirtAddrRange hv_inquire_virtual(int idx);
1092/** A range of ASID values. */ 1124/** A range of ASID values. */
1093typedef struct 1125typedef struct
1094{ 1126{
1095#ifndef __BIG_ENDIAN__
1096 HV_ASID start; /**< First ASID in the range. */ 1127 HV_ASID start; /**< First ASID in the range. */
1097 unsigned int size; /**< Number of ASIDs. Zero for an invalid range. */ 1128 unsigned int size; /**< Number of ASIDs. Zero for an invalid range. */
1098#else
1099 unsigned int size; /**< Number of ASIDs. Zero for an invalid range. */
1100 HV_ASID start; /**< First ASID in the range. */
1101#endif
1102} HV_ASIDRange; 1129} HV_ASIDRange;
1103 1130
1104/** Returns information about a range of ASIDs. 1131/** Returns information about a range of ASIDs.
@@ -1422,7 +1449,6 @@ typedef enum
1422/** Message recipient. */ 1449/** Message recipient. */
1423typedef struct 1450typedef struct
1424{ 1451{
1425#ifndef __BIG_ENDIAN__
1426 /** X coordinate, relative to supervisor's top-left coordinate */ 1452 /** X coordinate, relative to supervisor's top-left coordinate */
1427 unsigned int x:11; 1453 unsigned int x:11;
1428 1454
@@ -1431,11 +1457,6 @@ typedef struct
1431 1457
1432 /** Status of this recipient */ 1458 /** Status of this recipient */
1433 HV_Recip_State state:10; 1459 HV_Recip_State state:10;
1434#else //__BIG_ENDIAN__
1435 HV_Recip_State state:10;
1436 unsigned int y:11;
1437 unsigned int x:11;
1438#endif
1439} HV_Recipient; 1460} HV_Recipient;
1440 1461
1441/** Send a message to a set of recipients. 1462/** Send a message to a set of recipients.
diff --git a/arch/tile/include/uapi/arch/Kbuild b/arch/tile/include/uapi/arch/Kbuild
index 4ebc34f4768d..97dfbecec6b6 100644
--- a/arch/tile/include/uapi/arch/Kbuild
+++ b/arch/tile/include/uapi/arch/Kbuild
@@ -1,7 +1,6 @@
1# UAPI Header export list 1# UAPI Header export list
2header-y += abi.h 2header-y += abi.h
3header-y += chip.h 3header-y += chip.h
4header-y += chip_tile64.h
5header-y += chip_tilegx.h 4header-y += chip_tilegx.h
6header-y += chip_tilepro.h 5header-y += chip_tilepro.h
7header-y += icache.h 6header-y += icache.h
diff --git a/arch/tile/include/uapi/arch/chip.h b/arch/tile/include/uapi/arch/chip.h
index 926d3db0e91e..4c91f90b9369 100644
--- a/arch/tile/include/uapi/arch/chip.h
+++ b/arch/tile/include/uapi/arch/chip.h
@@ -12,9 +12,7 @@
12 * more details. 12 * more details.
13 */ 13 */
14 14
15#if __tile_chip__ == 0 15#if __tile_chip__ == 1
16#include <arch/chip_tile64.h>
17#elif __tile_chip__ == 1
18#include <arch/chip_tilepro.h> 16#include <arch/chip_tilepro.h>
19#elif defined(__tilegx__) 17#elif defined(__tilegx__)
20#include <arch/chip_tilegx.h> 18#include <arch/chip_tilegx.h>
diff --git a/arch/tile/include/uapi/arch/chip_tile64.h b/arch/tile/include/uapi/arch/chip_tile64.h
deleted file mode 100644
index 261aaba092d4..000000000000
--- a/arch/tile/include/uapi/arch/chip_tile64.h
+++ /dev/null
@@ -1,258 +0,0 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15/*
16 * @file
17 * Global header file.
18 * This header file specifies defines for TILE64.
19 */
20
21#ifndef __ARCH_CHIP_H__
22#define __ARCH_CHIP_H__
23
24/** Specify chip version.
25 * When possible, prefer the CHIP_xxx symbols below for future-proofing.
26 * This is intended for cross-compiling; native compilation should
27 * use the predefined __tile_chip__ symbol.
28 */
29#define TILE_CHIP 0
30
31/** Specify chip revision.
32 * This provides for the case of a respin of a particular chip type;
33 * the normal value for this symbol is "0".
34 * This is intended for cross-compiling; native compilation should
35 * use the predefined __tile_chip_rev__ symbol.
36 */
37#define TILE_CHIP_REV 0
38
39/** The name of this architecture. */
40#define CHIP_ARCH_NAME "tile64"
41
42/** The ELF e_machine type for binaries for this chip. */
43#define CHIP_ELF_TYPE() EM_TILE64
44
45/** The alternate ELF e_machine type for binaries for this chip. */
46#define CHIP_COMPAT_ELF_TYPE() 0x2506
47
48/** What is the native word size of the machine? */
49#define CHIP_WORD_SIZE() 32
50
51/** How many bits of a virtual address are used. Extra bits must be
52 * the sign extension of the low bits.
53 */
54#define CHIP_VA_WIDTH() 32
55
56/** How many bits are in a physical address? */
57#define CHIP_PA_WIDTH() 36
58
59/** Size of the L2 cache, in bytes. */
60#define CHIP_L2_CACHE_SIZE() 65536
61
62/** Log size of an L2 cache line in bytes. */
63#define CHIP_L2_LOG_LINE_SIZE() 6
64
65/** Size of an L2 cache line, in bytes. */
66#define CHIP_L2_LINE_SIZE() (1 << CHIP_L2_LOG_LINE_SIZE())
67
68/** Associativity of the L2 cache. */
69#define CHIP_L2_ASSOC() 2
70
71/** Size of the L1 data cache, in bytes. */
72#define CHIP_L1D_CACHE_SIZE() 8192
73
74/** Log size of an L1 data cache line in bytes. */
75#define CHIP_L1D_LOG_LINE_SIZE() 4
76
77/** Size of an L1 data cache line, in bytes. */
78#define CHIP_L1D_LINE_SIZE() (1 << CHIP_L1D_LOG_LINE_SIZE())
79
80/** Associativity of the L1 data cache. */
81#define CHIP_L1D_ASSOC() 2
82
83/** Size of the L1 instruction cache, in bytes. */
84#define CHIP_L1I_CACHE_SIZE() 8192
85
86/** Log size of an L1 instruction cache line in bytes. */
87#define CHIP_L1I_LOG_LINE_SIZE() 6
88
89/** Size of an L1 instruction cache line, in bytes. */
90#define CHIP_L1I_LINE_SIZE() (1 << CHIP_L1I_LOG_LINE_SIZE())
91
92/** Associativity of the L1 instruction cache. */
93#define CHIP_L1I_ASSOC() 1
94
95/** Stride with which flush instructions must be issued. */
96#define CHIP_FLUSH_STRIDE() CHIP_L2_LINE_SIZE()
97
98/** Stride with which inv instructions must be issued. */
99#define CHIP_INV_STRIDE() CHIP_L1D_LINE_SIZE()
100
101/** Stride with which finv instructions must be issued. */
102#define CHIP_FINV_STRIDE() CHIP_L1D_LINE_SIZE()
103
104/** Can the local cache coherently cache data that is homed elsewhere? */
105#define CHIP_HAS_COHERENT_LOCAL_CACHE() 0
106
107/** How many simultaneous outstanding victims can the L2 cache have? */
108#define CHIP_MAX_OUTSTANDING_VICTIMS() 2
109
110/** Does the TLB support the NC and NOALLOC bits? */
111#define CHIP_HAS_NC_AND_NOALLOC_BITS() 0
112
113/** Does the chip support hash-for-home caching? */
114#define CHIP_HAS_CBOX_HOME_MAP() 0
115
116/** Number of entries in the chip's home map tables. */
117/* #define CHIP_CBOX_HOME_MAP_SIZE() -- does not apply to chip 0 */
118
119/** Do uncacheable requests miss in the cache regardless of whether
120 * there is matching data? */
121#define CHIP_HAS_ENFORCED_UNCACHEABLE_REQUESTS() 0
122
123/** Does the mf instruction wait for victims? */
124#define CHIP_HAS_MF_WAITS_FOR_VICTIMS() 1
125
126/** Does the chip have an "inv" instruction that doesn't also flush? */
127#define CHIP_HAS_INV() 0
128
129/** Does the chip have a "wh64" instruction? */
130#define CHIP_HAS_WH64() 0
131
132/** Does this chip have a 'dword_align' instruction? */
133#define CHIP_HAS_DWORD_ALIGN() 0
134
135/** Number of performance counters. */
136#define CHIP_PERFORMANCE_COUNTERS() 2
137
138/** Does this chip have auxiliary performance counters? */
139#define CHIP_HAS_AUX_PERF_COUNTERS() 0
140
141/** Is the CBOX_MSR1 SPR supported? */
142#define CHIP_HAS_CBOX_MSR1() 0
143
144/** Is the TILE_RTF_HWM SPR supported? */
145#define CHIP_HAS_TILE_RTF_HWM() 0
146
147/** Is the TILE_WRITE_PENDING SPR supported? */
148#define CHIP_HAS_TILE_WRITE_PENDING() 0
149
150/** Is the PROC_STATUS SPR supported? */
151#define CHIP_HAS_PROC_STATUS_SPR() 0
152
153/** Is the DSTREAM_PF SPR supported? */
154#define CHIP_HAS_DSTREAM_PF() 0
155
156/** Log of the number of mshims we have. */
157#define CHIP_LOG_NUM_MSHIMS() 2
158
159/** Are the bases of the interrupt vector areas fixed? */
160#define CHIP_HAS_FIXED_INTVEC_BASE() 1
161
162/** Are the interrupt masks split up into 2 SPRs? */
163#define CHIP_HAS_SPLIT_INTR_MASK() 1
164
165/** Is the cycle count split up into 2 SPRs? */
166#define CHIP_HAS_SPLIT_CYCLE() 1
167
168/** Does the chip have a static network? */
169#define CHIP_HAS_SN() 1
170
171/** Does the chip have a static network processor? */
172#define CHIP_HAS_SN_PROC() 1
173
174/** Size of the L1 static network processor instruction cache, in bytes. */
175#define CHIP_L1SNI_CACHE_SIZE() 2048
176
177/** Does the chip have DMA support in each tile? */
178#define CHIP_HAS_TILE_DMA() 1
179
180/** Does the chip have the second revision of the directly accessible
181 * dynamic networks? This encapsulates a number of characteristics,
182 * including the absence of the catch-all, the absence of inline message
183 * tags, the absence of support for network context-switching, and so on.
184 */
185#define CHIP_HAS_REV1_XDN() 0
186
187/** Does the chip have cmpexch and similar (fetchadd, exch, etc.)? */
188#define CHIP_HAS_CMPEXCH() 0
189
190/** Does the chip have memory-mapped I/O support? */
191#define CHIP_HAS_MMIO() 0
192
193/** Does the chip have post-completion interrupts? */
194#define CHIP_HAS_POST_COMPLETION_INTERRUPTS() 0
195
196/** Does the chip have native single step support? */
197#define CHIP_HAS_SINGLE_STEP() 0
198
199#ifndef __OPEN_SOURCE__ /* features only relevant to hypervisor-level code */
200
201/** How many entries are present in the instruction TLB? */
202#define CHIP_ITLB_ENTRIES() 8
203
204/** How many entries are present in the data TLB? */
205#define CHIP_DTLB_ENTRIES() 16
206
207/** How many MAF entries does the XAUI shim have? */
208#define CHIP_XAUI_MAF_ENTRIES() 16
209
210/** Does the memory shim have a source-id table? */
211#define CHIP_HAS_MSHIM_SRCID_TABLE() 1
212
213/** Does the L1 instruction cache clear on reset? */
214#define CHIP_HAS_L1I_CLEAR_ON_RESET() 0
215
216/** Does the chip come out of reset with valid coordinates on all tiles?
217 * Note that if defined, this also implies that the upper left is 1,1.
218 */
219#define CHIP_HAS_VALID_TILE_COORD_RESET() 0
220
221/** Does the chip have unified packet formats? */
222#define CHIP_HAS_UNIFIED_PACKET_FORMATS() 0
223
224/** Does the chip support write reordering? */
225#define CHIP_HAS_WRITE_REORDERING() 0
226
227/** Does the chip support Y-X routing as well as X-Y? */
228#define CHIP_HAS_Y_X_ROUTING() 0
229
230/** Is INTCTRL_3 managed with the correct MPL? */
231#define CHIP_HAS_INTCTRL_3_STATUS_FIX() 0
232
233/** Is it possible to configure the chip to be big-endian? */
234#define CHIP_HAS_BIG_ENDIAN_CONFIG() 0
235
236/** Is the CACHE_RED_WAY_OVERRIDDEN SPR supported? */
237#define CHIP_HAS_CACHE_RED_WAY_OVERRIDDEN() 0
238
239/** Is the DIAG_TRACE_WAY SPR supported? */
240#define CHIP_HAS_DIAG_TRACE_WAY() 0
241
242/** Is the MEM_STRIPE_CONFIG SPR supported? */
243#define CHIP_HAS_MEM_STRIPE_CONFIG() 0
244
245/** Are the TLB_PERF SPRs supported? */
246#define CHIP_HAS_TLB_PERF() 0
247
248/** Is the VDN_SNOOP_SHIM_CTL SPR supported? */
249#define CHIP_HAS_VDN_SNOOP_SHIM_CTL() 0
250
251/** Does the chip support rev1 DMA packets? */
252#define CHIP_HAS_REV1_DMA_PACKETS() 0
253
254/** Does the chip have an IPI shim? */
255#define CHIP_HAS_IPI() 0
256
257#endif /* !__OPEN_SOURCE__ */
258#endif /* __ARCH_CHIP_H__ */
diff --git a/arch/tile/include/uapi/arch/opcode_tilegx.h b/arch/tile/include/uapi/arch/opcode_tilegx.h
index c14d02c81600..d76ff2db745e 100644
--- a/arch/tile/include/uapi/arch/opcode_tilegx.h
+++ b/arch/tile/include/uapi/arch/opcode_tilegx.h
@@ -61,6 +61,7 @@ typedef tilegx_bundle_bits tile_bundle_bits;
61#define TILE_BUNDLE_ALIGNMENT_IN_BYTES TILEGX_BUNDLE_ALIGNMENT_IN_BYTES 61#define TILE_BUNDLE_ALIGNMENT_IN_BYTES TILEGX_BUNDLE_ALIGNMENT_IN_BYTES
62#define TILE_LOG2_BUNDLE_ALIGNMENT_IN_BYTES \ 62#define TILE_LOG2_BUNDLE_ALIGNMENT_IN_BYTES \
63 TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES 63 TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES
64#define TILE_BPT_BUNDLE TILEGX_BPT_BUNDLE
64 65
65/* 64-bit pattern for a { bpt ; nop } bundle. */ 66/* 64-bit pattern for a { bpt ; nop } bundle. */
66#define TILEGX_BPT_BUNDLE 0x286a44ae51485000ULL 67#define TILEGX_BPT_BUNDLE 0x286a44ae51485000ULL
diff --git a/arch/tile/include/uapi/arch/opcode_tilepro.h b/arch/tile/include/uapi/arch/opcode_tilepro.h
index 71b763b8ce83..4451cff1a861 100644
--- a/arch/tile/include/uapi/arch/opcode_tilepro.h
+++ b/arch/tile/include/uapi/arch/opcode_tilepro.h
@@ -71,6 +71,7 @@ typedef tilepro_bundle_bits tile_bundle_bits;
71#define TILE_BUNDLE_ALIGNMENT_IN_BYTES TILEPRO_BUNDLE_ALIGNMENT_IN_BYTES 71#define TILE_BUNDLE_ALIGNMENT_IN_BYTES TILEPRO_BUNDLE_ALIGNMENT_IN_BYTES
72#define TILE_LOG2_BUNDLE_ALIGNMENT_IN_BYTES \ 72#define TILE_LOG2_BUNDLE_ALIGNMENT_IN_BYTES \
73 TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES 73 TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES
74#define TILE_BPT_BUNDLE TILEPRO_BPT_BUNDLE
74 75
75/* 64-bit pattern for a { bpt ; nop } bundle. */ 76/* 64-bit pattern for a { bpt ; nop } bundle. */
76#define TILEPRO_BPT_BUNDLE 0x400b3cae70166000ULL 77#define TILEPRO_BPT_BUNDLE 0x400b3cae70166000ULL
diff --git a/arch/tile/include/uapi/arch/spr_def_32.h b/arch/tile/include/uapi/arch/spr_def_32.h
index c689446e6284..78daa3146d25 100644
--- a/arch/tile/include/uapi/arch/spr_def_32.h
+++ b/arch/tile/include/uapi/arch/spr_def_32.h
@@ -200,8 +200,6 @@
200#define SPR_SIM_CONTROL 0x4e0c 200#define SPR_SIM_CONTROL 0x4e0c
201#define SPR_SNCTL 0x0805 201#define SPR_SNCTL 0x0805
202#define SPR_SNCTL__FRZFABRIC_MASK 0x1 202#define SPR_SNCTL__FRZFABRIC_MASK 0x1
203#define SPR_SNCTL__FRZPROC_MASK 0x2
204#define SPR_SNPC 0x080b
205#define SPR_SNSTATIC 0x080c 203#define SPR_SNSTATIC 0x080c
206#define SPR_SYSTEM_SAVE_0_0 0x4b00 204#define SPR_SYSTEM_SAVE_0_0 0x4b00
207#define SPR_SYSTEM_SAVE_0_1 0x4b01 205#define SPR_SYSTEM_SAVE_0_1 0x4b01
diff --git a/arch/tile/include/uapi/asm/auxvec.h b/arch/tile/include/uapi/asm/auxvec.h
index 1d393edb0641..c93e92709f14 100644
--- a/arch/tile/include/uapi/asm/auxvec.h
+++ b/arch/tile/include/uapi/asm/auxvec.h
@@ -15,6 +15,7 @@
15#ifndef _ASM_TILE_AUXVEC_H 15#ifndef _ASM_TILE_AUXVEC_H
16#define _ASM_TILE_AUXVEC_H 16#define _ASM_TILE_AUXVEC_H
17 17
18/* No extensions to auxvec */ 18/* The vDSO location. */
19#define AT_SYSINFO_EHDR 33
19 20
20#endif /* _ASM_TILE_AUXVEC_H */ 21#endif /* _ASM_TILE_AUXVEC_H */
diff --git a/arch/tile/include/uapi/asm/cachectl.h b/arch/tile/include/uapi/asm/cachectl.h
index af4c9f9154d1..572ddcad2090 100644
--- a/arch/tile/include/uapi/asm/cachectl.h
+++ b/arch/tile/include/uapi/asm/cachectl.h
@@ -29,8 +29,8 @@
29 * to honor the arguments at some point.) 29 * to honor the arguments at some point.)
30 * 30 *
31 * Flush and invalidation of memory can normally be performed with the 31 * Flush and invalidation of memory can normally be performed with the
32 * __insn_flush(), __insn_inv(), and __insn_finv() instructions from 32 * __insn_flush() and __insn_finv() instructions from userspace.
33 * userspace. The DCACHE option to the system call allows userspace 33 * The DCACHE option to the system call allows userspace
34 * to flush the entire L1+L2 data cache from the core. In this case, 34 * to flush the entire L1+L2 data cache from the core. In this case,
35 * the address and length arguments are not used. The DCACHE flush is 35 * the address and length arguments are not used. The DCACHE flush is
36 * restricted to the current core, not all cores in the address space. 36 * restricted to the current core, not all cores in the address space.
diff --git a/arch/tile/kernel/Makefile b/arch/tile/kernel/Makefile
index 5334be8e2538..27a2bf39dae8 100644
--- a/arch/tile/kernel/Makefile
+++ b/arch/tile/kernel/Makefile
@@ -3,11 +3,17 @@
3# 3#
4 4
5extra-y := vmlinux.lds head_$(BITS).o 5extra-y := vmlinux.lds head_$(BITS).o
6obj-y := backtrace.o entry.o irq.o messaging.o \ 6obj-y := backtrace.o entry.o hvglue.o irq.o messaging.o \
7 pci-dma.o proc.o process.o ptrace.o reboot.o \ 7 pci-dma.o proc.o process.o ptrace.o reboot.o \
8 setup.o signal.o single_step.o stack.o sys.o sysfs.o time.o traps.o \ 8 setup.o signal.o single_step.o stack.o sys.o \
9 sysfs.o time.o traps.o unaligned.o vdso.o \
9 intvec_$(BITS).o regs_$(BITS).o tile-desc_$(BITS).o 10 intvec_$(BITS).o regs_$(BITS).o tile-desc_$(BITS).o
10 11
12ifdef CONFIG_FUNCTION_TRACER
13CFLAGS_REMOVE_ftrace.o = -pg
14CFLAGS_REMOVE_early_printk.o = -pg
15endif
16
11obj-$(CONFIG_HARDWALL) += hardwall.o 17obj-$(CONFIG_HARDWALL) += hardwall.o
12obj-$(CONFIG_COMPAT) += compat.o compat_signal.o 18obj-$(CONFIG_COMPAT) += compat.o compat_signal.o
13obj-$(CONFIG_SMP) += smpboot.o smp.o tlb.o 19obj-$(CONFIG_SMP) += smpboot.o smp.o tlb.o
@@ -20,3 +26,9 @@ else
20obj-$(CONFIG_PCI) += pci.o 26obj-$(CONFIG_PCI) += pci.o
21endif 27endif
22obj-$(CONFIG_TILE_USB) += usb.o 28obj-$(CONFIG_TILE_USB) += usb.o
29obj-$(CONFIG_TILE_HVGLUE_TRACE) += hvglue_trace.o
30obj-$(CONFIG_FUNCTION_TRACER) += ftrace.o mcount_64.o
31obj-$(CONFIG_KPROBES) += kprobes.o
32obj-$(CONFIG_KGDB) += kgdb.o
33
34obj-y += vdso/
diff --git a/arch/tile/kernel/asm-offsets.c b/arch/tile/kernel/asm-offsets.c
index 01ddf19cc36d..375e7c321eef 100644
--- a/arch/tile/kernel/asm-offsets.c
+++ b/arch/tile/kernel/asm-offsets.c
@@ -14,13 +14,6 @@
14 * Generates definitions from c-type structures used by assembly sources. 14 * Generates definitions from c-type structures used by assembly sources.
15 */ 15 */
16 16
17#include <linux/kbuild.h>
18#include <linux/thread_info.h>
19#include <linux/sched.h>
20#include <linux/hardirq.h>
21#include <linux/ptrace.h>
22#include <hv/hypervisor.h>
23
24/* Check for compatible compiler early in the build. */ 17/* Check for compatible compiler early in the build. */
25#ifdef CONFIG_TILEGX 18#ifdef CONFIG_TILEGX
26# ifndef __tilegx__ 19# ifndef __tilegx__
@@ -31,46 +24,61 @@
31# endif 24# endif
32#else 25#else
33# ifdef __tilegx__ 26# ifdef __tilegx__
34# error Can not build TILEPro/TILE64 configurations with tilegx compiler 27# error Can not build TILEPro configurations with tilegx compiler
35# endif 28# endif
36#endif 29#endif
37 30
31#include <linux/kbuild.h>
32#include <linux/thread_info.h>
33#include <linux/sched.h>
34#include <linux/hardirq.h>
35#include <linux/ptrace.h>
36#include <hv/hypervisor.h>
37
38void foo(void) 38void foo(void)
39{ 39{
40 DEFINE(SINGLESTEP_STATE_BUFFER_OFFSET, \ 40 DEFINE(SINGLESTEP_STATE_BUFFER_OFFSET,
41 offsetof(struct single_step_state, buffer)); 41 offsetof(struct single_step_state, buffer));
42 DEFINE(SINGLESTEP_STATE_FLAGS_OFFSET, \ 42 DEFINE(SINGLESTEP_STATE_FLAGS_OFFSET,
43 offsetof(struct single_step_state, flags)); 43 offsetof(struct single_step_state, flags));
44 DEFINE(SINGLESTEP_STATE_ORIG_PC_OFFSET, \ 44 DEFINE(SINGLESTEP_STATE_ORIG_PC_OFFSET,
45 offsetof(struct single_step_state, orig_pc)); 45 offsetof(struct single_step_state, orig_pc));
46 DEFINE(SINGLESTEP_STATE_NEXT_PC_OFFSET, \ 46 DEFINE(SINGLESTEP_STATE_NEXT_PC_OFFSET,
47 offsetof(struct single_step_state, next_pc)); 47 offsetof(struct single_step_state, next_pc));
48 DEFINE(SINGLESTEP_STATE_BRANCH_NEXT_PC_OFFSET, \ 48 DEFINE(SINGLESTEP_STATE_BRANCH_NEXT_PC_OFFSET,
49 offsetof(struct single_step_state, branch_next_pc)); 49 offsetof(struct single_step_state, branch_next_pc));
50 DEFINE(SINGLESTEP_STATE_UPDATE_VALUE_OFFSET, \ 50 DEFINE(SINGLESTEP_STATE_UPDATE_VALUE_OFFSET,
51 offsetof(struct single_step_state, update_value)); 51 offsetof(struct single_step_state, update_value));
52 52
53 DEFINE(THREAD_INFO_TASK_OFFSET, \ 53 DEFINE(THREAD_INFO_TASK_OFFSET,
54 offsetof(struct thread_info, task)); 54 offsetof(struct thread_info, task));
55 DEFINE(THREAD_INFO_FLAGS_OFFSET, \ 55 DEFINE(THREAD_INFO_FLAGS_OFFSET,
56 offsetof(struct thread_info, flags)); 56 offsetof(struct thread_info, flags));
57 DEFINE(THREAD_INFO_STATUS_OFFSET, \ 57 DEFINE(THREAD_INFO_STATUS_OFFSET,
58 offsetof(struct thread_info, status)); 58 offsetof(struct thread_info, status));
59 DEFINE(THREAD_INFO_HOMECACHE_CPU_OFFSET, \ 59 DEFINE(THREAD_INFO_HOMECACHE_CPU_OFFSET,
60 offsetof(struct thread_info, homecache_cpu)); 60 offsetof(struct thread_info, homecache_cpu));
61 DEFINE(THREAD_INFO_STEP_STATE_OFFSET, \ 61 DEFINE(THREAD_INFO_PREEMPT_COUNT_OFFSET,
62 offsetof(struct thread_info, preempt_count));
63 DEFINE(THREAD_INFO_STEP_STATE_OFFSET,
62 offsetof(struct thread_info, step_state)); 64 offsetof(struct thread_info, step_state));
65#ifdef __tilegx__
66 DEFINE(THREAD_INFO_UNALIGN_JIT_BASE_OFFSET,
67 offsetof(struct thread_info, unalign_jit_base));
68 DEFINE(THREAD_INFO_UNALIGN_JIT_TMP_OFFSET,
69 offsetof(struct thread_info, unalign_jit_tmp));
70#endif
63 71
64 DEFINE(TASK_STRUCT_THREAD_KSP_OFFSET, 72 DEFINE(TASK_STRUCT_THREAD_KSP_OFFSET,
65 offsetof(struct task_struct, thread.ksp)); 73 offsetof(struct task_struct, thread.ksp));
66 DEFINE(TASK_STRUCT_THREAD_PC_OFFSET, 74 DEFINE(TASK_STRUCT_THREAD_PC_OFFSET,
67 offsetof(struct task_struct, thread.pc)); 75 offsetof(struct task_struct, thread.pc));
68 76
69 DEFINE(HV_TOPOLOGY_WIDTH_OFFSET, \ 77 DEFINE(HV_TOPOLOGY_WIDTH_OFFSET,
70 offsetof(HV_Topology, width)); 78 offsetof(HV_Topology, width));
71 DEFINE(HV_TOPOLOGY_HEIGHT_OFFSET, \ 79 DEFINE(HV_TOPOLOGY_HEIGHT_OFFSET,
72 offsetof(HV_Topology, height)); 80 offsetof(HV_Topology, height));
73 81
74 DEFINE(IRQ_CPUSTAT_SYSCALL_COUNT_OFFSET, \ 82 DEFINE(IRQ_CPUSTAT_SYSCALL_COUNT_OFFSET,
75 offsetof(irq_cpustat_t, irq_syscall_count)); 83 offsetof(irq_cpustat_t, irq_syscall_count));
76} 84}
diff --git a/arch/tile/kernel/compat.c b/arch/tile/kernel/compat.c
index ed378416b86a..49120843ff96 100644
--- a/arch/tile/kernel/compat.c
+++ b/arch/tile/kernel/compat.c
@@ -84,7 +84,7 @@ COMPAT_SYSCALL_DEFINE5(llseek, unsigned int, fd, unsigned int, offset_high,
84{ 84{
85 return sys_llseek(fd, offset_high, offset_low, result, origin); 85 return sys_llseek(fd, offset_high, offset_low, result, origin);
86} 86}
87 87
88/* Provide the compat syscall number to call mapping. */ 88/* Provide the compat syscall number to call mapping. */
89#undef __SYSCALL 89#undef __SYSCALL
90#define __SYSCALL(nr, call) [nr] = (call), 90#define __SYSCALL(nr, call) [nr] = (call),
diff --git a/arch/tile/kernel/compat_signal.c b/arch/tile/kernel/compat_signal.c
index d0a052e725be..85e00b2f39bf 100644
--- a/arch/tile/kernel/compat_signal.c
+++ b/arch/tile/kernel/compat_signal.c
@@ -32,6 +32,7 @@
32#include <asm/ucontext.h> 32#include <asm/ucontext.h>
33#include <asm/sigframe.h> 33#include <asm/sigframe.h>
34#include <asm/syscalls.h> 34#include <asm/syscalls.h>
35#include <asm/vdso.h>
35#include <arch/interrupts.h> 36#include <arch/interrupts.h>
36 37
37struct compat_ucontext { 38struct compat_ucontext {
@@ -227,7 +228,7 @@ int compat_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
227 if (err) 228 if (err)
228 goto give_sigsegv; 229 goto give_sigsegv;
229 230
230 restorer = VDSO_BASE; 231 restorer = VDSO_SYM(&__vdso_rt_sigreturn);
231 if (ka->sa.sa_flags & SA_RESTORER) 232 if (ka->sa.sa_flags & SA_RESTORER)
232 restorer = ptr_to_compat_reg(ka->sa.sa_restorer); 233 restorer = ptr_to_compat_reg(ka->sa.sa_restorer);
233 234
diff --git a/arch/tile/kernel/early_printk.c b/arch/tile/kernel/early_printk.c
index 34d72a151bf3..b608e00e7f6d 100644
--- a/arch/tile/kernel/early_printk.c
+++ b/arch/tile/kernel/early_printk.c
@@ -23,19 +23,24 @@
23 23
24static void early_hv_write(struct console *con, const char *s, unsigned n) 24static void early_hv_write(struct console *con, const char *s, unsigned n)
25{ 25{
26 hv_console_write((HV_VirtAddr) s, n); 26 tile_console_write(s, n);
27
28 /*
29 * Convert NL to NLCR (close enough to CRNL) during early boot.
30 * We assume newlines are at the ends of strings, which turns out
31 * to be good enough for early boot console output.
32 */
33 if (n && s[n-1] == '\n')
34 tile_console_write("\r", 1);
27} 35}
28 36
29static struct console early_hv_console = { 37static struct console early_hv_console = {
30 .name = "earlyhv", 38 .name = "earlyhv",
31 .write = early_hv_write, 39 .write = early_hv_write,
32 .flags = CON_PRINTBUFFER, 40 .flags = CON_PRINTBUFFER | CON_BOOT,
33 .index = -1, 41 .index = -1,
34}; 42};
35 43
36/* Direct interface for emergencies */
37static int early_console_complete;
38
39void early_panic(const char *fmt, ...) 44void early_panic(const char *fmt, ...)
40{ 45{
41 va_list ap; 46 va_list ap;
@@ -43,51 +48,21 @@ void early_panic(const char *fmt, ...)
43 va_start(ap, fmt); 48 va_start(ap, fmt);
44 early_printk("Kernel panic - not syncing: "); 49 early_printk("Kernel panic - not syncing: ");
45 early_vprintk(fmt, ap); 50 early_vprintk(fmt, ap);
46 early_console->write(early_console, "\n", 1); 51 early_printk("\n");
47 va_end(ap); 52 va_end(ap);
48 dump_stack(); 53 dump_stack();
49 hv_halt(); 54 hv_halt();
50} 55}
51 56
52static int __initdata keep_early;
53
54static int __init setup_early_printk(char *str) 57static int __init setup_early_printk(char *str)
55{ 58{
56 if (early_console) 59 if (early_console)
57 return 1; 60 return 1;
58 61
59 if (str != NULL && strncmp(str, "keep", 4) == 0)
60 keep_early = 1;
61
62 early_console = &early_hv_console; 62 early_console = &early_hv_console;
63 register_console(early_console); 63 register_console(early_console);
64 64
65 return 0; 65 return 0;
66} 66}
67 67
68void __init disable_early_printk(void)
69{
70 early_console_complete = 1;
71 if (!early_console)
72 return;
73 if (!keep_early) {
74 early_printk("disabling early console\n");
75 unregister_console(early_console);
76 early_console = NULL;
77 } else {
78 early_printk("keeping early console\n");
79 }
80}
81
82void warn_early_printk(void)
83{
84 if (early_console_complete || early_console)
85 return;
86 early_printk("\
87Machine shutting down before console output is fully initialized.\n\
88You may wish to reboot and add the option 'earlyprintk' to your\n\
89boot command line to see any diagnostic early console output.\n\
90");
91}
92
93early_param("earlyprintk", setup_early_printk); 68early_param("earlyprintk", setup_early_printk);
diff --git a/arch/tile/kernel/entry.S b/arch/tile/kernel/entry.S
index f116cb0bce20..3d9175992a20 100644
--- a/arch/tile/kernel/entry.S
+++ b/arch/tile/kernel/entry.S
@@ -27,22 +27,6 @@ STD_ENTRY(current_text_addr)
27 { move r0, lr; jrp lr } 27 { move r0, lr; jrp lr }
28 STD_ENDPROC(current_text_addr) 28 STD_ENDPROC(current_text_addr)
29 29
30/*
31 * We don't run this function directly, but instead copy it to a page
32 * we map into every user process. See vdso_setup().
33 *
34 * Note that libc has a copy of this function that it uses to compare
35 * against the PC when a stack backtrace ends, so if this code is
36 * changed, the libc implementation(s) should also be updated.
37 */
38 .pushsection .data
39ENTRY(__rt_sigreturn)
40 moveli TREG_SYSCALL_NR_NAME,__NR_rt_sigreturn
41 swint1
42 ENDPROC(__rt_sigreturn)
43 ENTRY(__rt_sigreturn_end)
44 .popsection
45
46STD_ENTRY(dump_stack) 30STD_ENTRY(dump_stack)
47 { move r2, lr; lnk r1 } 31 { move r2, lr; lnk r1 }
48 { move r4, r52; addli r1, r1, dump_stack - . } 32 { move r4, r52; addli r1, r1, dump_stack - . }
diff --git a/arch/tile/kernel/ftrace.c b/arch/tile/kernel/ftrace.c
new file mode 100644
index 000000000000..f1c452092eeb
--- /dev/null
+++ b/arch/tile/kernel/ftrace.c
@@ -0,0 +1,246 @@
1/*
2 * Copyright 2012 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 *
14 * TILE-Gx specific ftrace support
15 */
16
17#include <linux/ftrace.h>
18#include <linux/uaccess.h>
19
20#include <asm/cacheflush.h>
21#include <asm/ftrace.h>
22#include <asm/sections.h>
23
24#include <arch/opcode.h>
25
26#ifdef CONFIG_DYNAMIC_FTRACE
27
28static inline tilegx_bundle_bits NOP(void)
29{
30 return create_UnaryOpcodeExtension_X0(FNOP_UNARY_OPCODE_X0) |
31 create_RRROpcodeExtension_X0(UNARY_RRR_0_OPCODE_X0) |
32 create_Opcode_X0(RRR_0_OPCODE_X0) |
33 create_UnaryOpcodeExtension_X1(NOP_UNARY_OPCODE_X1) |
34 create_RRROpcodeExtension_X1(UNARY_RRR_0_OPCODE_X1) |
35 create_Opcode_X1(RRR_0_OPCODE_X1);
36}
37
38static int machine_stopped __read_mostly;
39
40int ftrace_arch_code_modify_prepare(void)
41{
42 machine_stopped = 1;
43 return 0;
44}
45
46int ftrace_arch_code_modify_post_process(void)
47{
48 flush_icache_range(0, CHIP_L1I_CACHE_SIZE());
49 machine_stopped = 0;
50 return 0;
51}
52
53/*
54 * Put { move r10, lr; jal ftrace_caller } in a bundle, this lets dynamic
55 * tracer just add one cycle overhead to every kernel function when disabled.
56 */
57static unsigned long ftrace_gen_branch(unsigned long pc, unsigned long addr,
58 bool link)
59{
60 tilegx_bundle_bits opcode_x0, opcode_x1;
61 long pcrel_by_instr = (addr - pc) >> TILEGX_LOG2_BUNDLE_SIZE_IN_BYTES;
62
63 if (link) {
64 /* opcode: jal addr */
65 opcode_x1 =
66 create_Opcode_X1(JUMP_OPCODE_X1) |
67 create_JumpOpcodeExtension_X1(JAL_JUMP_OPCODE_X1) |
68 create_JumpOff_X1(pcrel_by_instr);
69 } else {
70 /* opcode: j addr */
71 opcode_x1 =
72 create_Opcode_X1(JUMP_OPCODE_X1) |
73 create_JumpOpcodeExtension_X1(J_JUMP_OPCODE_X1) |
74 create_JumpOff_X1(pcrel_by_instr);
75 }
76
77 if (addr == FTRACE_ADDR) {
78 /* opcode: or r10, lr, zero */
79 opcode_x0 =
80 create_Dest_X0(10) |
81 create_SrcA_X0(TREG_LR) |
82 create_SrcB_X0(TREG_ZERO) |
83 create_RRROpcodeExtension_X0(OR_RRR_0_OPCODE_X0) |
84 create_Opcode_X0(RRR_0_OPCODE_X0);
85 } else {
86 /* opcode: fnop */
87 opcode_x0 =
88 create_UnaryOpcodeExtension_X0(FNOP_UNARY_OPCODE_X0) |
89 create_RRROpcodeExtension_X0(UNARY_RRR_0_OPCODE_X0) |
90 create_Opcode_X0(RRR_0_OPCODE_X0);
91 }
92
93 return opcode_x1 | opcode_x0;
94}
95
96static unsigned long ftrace_nop_replace(struct dyn_ftrace *rec)
97{
98 return NOP();
99}
100
101static unsigned long ftrace_call_replace(unsigned long pc, unsigned long addr)
102{
103 return ftrace_gen_branch(pc, addr, true);
104}
105
106static int ftrace_modify_code(unsigned long pc, unsigned long old,
107 unsigned long new)
108{
109 unsigned long pc_wr;
110
111 /* Check if the address is in kernel text space and module space. */
112 if (!kernel_text_address(pc))
113 return -EINVAL;
114
115 /* Operate on writable kernel text mapping. */
116 pc_wr = pc - MEM_SV_START + PAGE_OFFSET;
117
118 if (probe_kernel_write((void *)pc_wr, &new, MCOUNT_INSN_SIZE))
119 return -EPERM;
120
121 smp_wmb();
122
123 if (!machine_stopped && num_online_cpus() > 1)
124 flush_icache_range(pc, pc + MCOUNT_INSN_SIZE);
125
126 return 0;
127}
128
129int ftrace_update_ftrace_func(ftrace_func_t func)
130{
131 unsigned long pc, old;
132 unsigned long new;
133 int ret;
134
135 pc = (unsigned long)&ftrace_call;
136 memcpy(&old, &ftrace_call, MCOUNT_INSN_SIZE);
137 new = ftrace_call_replace(pc, (unsigned long)func);
138
139 ret = ftrace_modify_code(pc, old, new);
140
141 return ret;
142}
143
144int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
145{
146 unsigned long new, old;
147 unsigned long ip = rec->ip;
148
149 old = ftrace_nop_replace(rec);
150 new = ftrace_call_replace(ip, addr);
151
152 return ftrace_modify_code(rec->ip, old, new);
153}
154
155int ftrace_make_nop(struct module *mod,
156 struct dyn_ftrace *rec, unsigned long addr)
157{
158 unsigned long ip = rec->ip;
159 unsigned long old;
160 unsigned long new;
161 int ret;
162
163 old = ftrace_call_replace(ip, addr);
164 new = ftrace_nop_replace(rec);
165 ret = ftrace_modify_code(ip, old, new);
166
167 return ret;
168}
169
170int __init ftrace_dyn_arch_init(void *data)
171{
172 *(unsigned long *)data = 0;
173
174 return 0;
175}
176#endif /* CONFIG_DYNAMIC_FTRACE */
177
178#ifdef CONFIG_FUNCTION_GRAPH_TRACER
179void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr,
180 unsigned long frame_pointer)
181{
182 unsigned long return_hooker = (unsigned long) &return_to_handler;
183 struct ftrace_graph_ent trace;
184 unsigned long old;
185 int err;
186
187 if (unlikely(atomic_read(&current->tracing_graph_pause)))
188 return;
189
190 old = *parent;
191 *parent = return_hooker;
192
193 err = ftrace_push_return_trace(old, self_addr, &trace.depth,
194 frame_pointer);
195 if (err == -EBUSY) {
196 *parent = old;
197 return;
198 }
199
200 trace.func = self_addr;
201
202 /* Only trace if the calling function expects to */
203 if (!ftrace_graph_entry(&trace)) {
204 current->curr_ret_stack--;
205 *parent = old;
206 }
207}
208
209#ifdef CONFIG_DYNAMIC_FTRACE
210extern unsigned long ftrace_graph_call;
211
212static int __ftrace_modify_caller(unsigned long *callsite,
213 void (*func) (void), bool enable)
214{
215 unsigned long caller_fn = (unsigned long) func;
216 unsigned long pc = (unsigned long) callsite;
217 unsigned long branch = ftrace_gen_branch(pc, caller_fn, false);
218 unsigned long nop = NOP();
219 unsigned long old = enable ? nop : branch;
220 unsigned long new = enable ? branch : nop;
221
222 return ftrace_modify_code(pc, old, new);
223}
224
225static int ftrace_modify_graph_caller(bool enable)
226{
227 int ret;
228
229 ret = __ftrace_modify_caller(&ftrace_graph_call,
230 ftrace_graph_caller,
231 enable);
232
233 return ret;
234}
235
236int ftrace_enable_ftrace_graph_caller(void)
237{
238 return ftrace_modify_graph_caller(true);
239}
240
241int ftrace_disable_ftrace_graph_caller(void)
242{
243 return ftrace_modify_graph_caller(false);
244}
245#endif /* CONFIG_DYNAMIC_FTRACE */
246#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
diff --git a/arch/tile/kernel/futex_64.S b/arch/tile/kernel/futex_64.S
deleted file mode 100644
index f465d1eda20f..000000000000
--- a/arch/tile/kernel/futex_64.S
+++ /dev/null
@@ -1,55 +0,0 @@
1/*
2 * Copyright 2011 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 *
14 * Atomically access user memory, but use MMU to avoid propagating
15 * kernel exceptions.
16 */
17
18#include <linux/linkage.h>
19#include <asm/errno.h>
20#include <asm/futex.h>
21#include <asm/page.h>
22#include <asm/processor.h>
23
24/*
25 * Provide a set of atomic memory operations supporting <asm/futex.h>.
26 *
27 * r0: user address to manipulate
28 * r1: new value to write, or for cmpxchg, old value to compare against
29 * r2: (cmpxchg only) new value to write
30 *
31 * Return __get_user struct, r0 with value, r1 with error.
32 */
33#define FUTEX_OP(name, ...) \
34STD_ENTRY(futex_##name) \
35 __VA_ARGS__; \
36 { \
37 move r1, zero; \
38 jrp lr \
39 }; \
40 STD_ENDPROC(futex_##name); \
41 .pushsection __ex_table,"a"; \
42 .quad 1b, get_user_fault; \
43 .popsection
44
45 .pushsection .fixup,"ax"
46get_user_fault:
47 { movei r1, -EFAULT; jrp lr }
48 ENDPROC(get_user_fault)
49 .popsection
50
51FUTEX_OP(cmpxchg, mtspr CMPEXCH_VALUE, r1; 1: cmpexch4 r0, r0, r2)
52FUTEX_OP(set, 1: exch4 r0, r0, r1)
53FUTEX_OP(add, 1: fetchadd4 r0, r0, r1)
54FUTEX_OP(or, 1: fetchor4 r0, r0, r1)
55FUTEX_OP(andn, nor r1, r1, zero; 1: fetchand4 r0, r0, r1)
diff --git a/arch/tile/kernel/hardwall.c b/arch/tile/kernel/hardwall.c
index 38ac189d9575..df27a1fd94a3 100644
--- a/arch/tile/kernel/hardwall.c
+++ b/arch/tile/kernel/hardwall.c
@@ -272,9 +272,9 @@ static void hardwall_setup_func(void *info)
272 struct hardwall_info *r = info; 272 struct hardwall_info *r = info;
273 struct hardwall_type *hwt = r->type; 273 struct hardwall_type *hwt = r->type;
274 274
275 int cpu = smp_processor_id(); 275 int cpu = smp_processor_id(); /* on_each_cpu disables preemption */
276 int x = cpu % smp_width; 276 int x = cpu_x(cpu);
277 int y = cpu / smp_width; 277 int y = cpu_y(cpu);
278 int bits = 0; 278 int bits = 0;
279 if (x == r->ulhc_x) 279 if (x == r->ulhc_x)
280 bits |= W_PROTECT; 280 bits |= W_PROTECT;
@@ -317,6 +317,7 @@ static void hardwall_protect_rectangle(struct hardwall_info *r)
317 on_each_cpu_mask(&rect_cpus, hardwall_setup_func, r, 1); 317 on_each_cpu_mask(&rect_cpus, hardwall_setup_func, r, 1);
318} 318}
319 319
320/* Entered from INT_xDN_FIREWALL interrupt vector with irqs disabled. */
320void __kprobes do_hardwall_trap(struct pt_regs* regs, int fault_num) 321void __kprobes do_hardwall_trap(struct pt_regs* regs, int fault_num)
321{ 322{
322 struct hardwall_info *rect; 323 struct hardwall_info *rect;
@@ -325,7 +326,6 @@ void __kprobes do_hardwall_trap(struct pt_regs* regs, int fault_num)
325 struct siginfo info; 326 struct siginfo info;
326 int cpu = smp_processor_id(); 327 int cpu = smp_processor_id();
327 int found_processes; 328 int found_processes;
328 unsigned long flags;
329 struct pt_regs *old_regs = set_irq_regs(regs); 329 struct pt_regs *old_regs = set_irq_regs(regs);
330 330
331 irq_enter(); 331 irq_enter();
@@ -346,7 +346,7 @@ void __kprobes do_hardwall_trap(struct pt_regs* regs, int fault_num)
346 BUG_ON(hwt->disabled); 346 BUG_ON(hwt->disabled);
347 347
348 /* This tile trapped a network access; find the rectangle. */ 348 /* This tile trapped a network access; find the rectangle. */
349 spin_lock_irqsave(&hwt->lock, flags); 349 spin_lock(&hwt->lock);
350 list_for_each_entry(rect, &hwt->list, list) { 350 list_for_each_entry(rect, &hwt->list, list) {
351 if (cpumask_test_cpu(cpu, &rect->cpumask)) 351 if (cpumask_test_cpu(cpu, &rect->cpumask))
352 break; 352 break;
@@ -401,7 +401,7 @@ void __kprobes do_hardwall_trap(struct pt_regs* regs, int fault_num)
401 pr_notice("hardwall: no associated processes!\n"); 401 pr_notice("hardwall: no associated processes!\n");
402 402
403 done: 403 done:
404 spin_unlock_irqrestore(&hwt->lock, flags); 404 spin_unlock(&hwt->lock);
405 405
406 /* 406 /*
407 * We have to disable firewall interrupts now, or else when we 407 * We have to disable firewall interrupts now, or else when we
@@ -540,6 +540,14 @@ static struct hardwall_info *hardwall_create(struct hardwall_type *hwt,
540 } 540 }
541 } 541 }
542 542
543 /*
544 * Eliminate cpus that are not part of this Linux client.
545 * Note that this allows for configurations that we might not want to
546 * support, such as one client on every even cpu, another client on
547 * every odd cpu.
548 */
549 cpumask_and(&info->cpumask, &info->cpumask, cpu_online_mask);
550
543 /* Confirm it doesn't overlap and add it to the list. */ 551 /* Confirm it doesn't overlap and add it to the list. */
544 spin_lock_irqsave(&hwt->lock, flags); 552 spin_lock_irqsave(&hwt->lock, flags);
545 list_for_each_entry(iter, &hwt->list, list) { 553 list_for_each_entry(iter, &hwt->list, list) {
@@ -612,7 +620,7 @@ static int hardwall_activate(struct hardwall_info *info)
612 620
613/* 621/*
614 * Deactivate a task's hardwall. Must hold lock for hardwall_type. 622 * Deactivate a task's hardwall. Must hold lock for hardwall_type.
615 * This method may be called from free_task(), so we don't want to 623 * This method may be called from exit_thread(), so we don't want to
616 * rely on too many fields of struct task_struct still being valid. 624 * rely on too many fields of struct task_struct still being valid.
617 * We assume the cpus_allowed, pid, and comm fields are still valid. 625 * We assume the cpus_allowed, pid, and comm fields are still valid.
618 */ 626 */
@@ -653,7 +661,7 @@ static int hardwall_deactivate(struct hardwall_type *hwt,
653 return -EINVAL; 661 return -EINVAL;
654 662
655 printk(KERN_DEBUG "Pid %d (%s) deactivated for %s hardwall: cpu %d\n", 663 printk(KERN_DEBUG "Pid %d (%s) deactivated for %s hardwall: cpu %d\n",
656 task->pid, task->comm, hwt->name, smp_processor_id()); 664 task->pid, task->comm, hwt->name, raw_smp_processor_id());
657 return 0; 665 return 0;
658} 666}
659 667
@@ -795,8 +803,8 @@ static void reset_xdn_network_state(struct hardwall_type *hwt)
795 /* Reset UDN coordinates to their standard value */ 803 /* Reset UDN coordinates to their standard value */
796 { 804 {
797 unsigned int cpu = smp_processor_id(); 805 unsigned int cpu = smp_processor_id();
798 unsigned int x = cpu % smp_width; 806 unsigned int x = cpu_x(cpu);
799 unsigned int y = cpu / smp_width; 807 unsigned int y = cpu_y(cpu);
800 __insn_mtspr(SPR_UDN_TILE_COORD, (x << 18) | (y << 7)); 808 __insn_mtspr(SPR_UDN_TILE_COORD, (x << 18) | (y << 7));
801 } 809 }
802 810
diff --git a/arch/tile/kernel/head_32.S b/arch/tile/kernel/head_32.S
index ac115307e5e4..8d5b40ff2922 100644
--- a/arch/tile/kernel/head_32.S
+++ b/arch/tile/kernel/head_32.S
@@ -39,12 +39,12 @@ ENTRY(_start)
39 } 39 }
40 { 40 {
41 moveli r0, _HV_VERSION_OLD_HV_INIT 41 moveli r0, _HV_VERSION_OLD_HV_INIT
42 jal hv_init 42 jal _hv_init
43 } 43 }
44 /* Get a reasonable default ASID in r0 */ 44 /* Get a reasonable default ASID in r0 */
45 { 45 {
46 move r0, zero 46 move r0, zero
47 jal hv_inquire_asid 47 jal _hv_inquire_asid
48 } 48 }
49 /* Install the default page table */ 49 /* Install the default page table */
50 { 50 {
@@ -64,7 +64,7 @@ ENTRY(_start)
64 auli r0, r0, ha16(swapper_pg_dir - PAGE_OFFSET) 64 auli r0, r0, ha16(swapper_pg_dir - PAGE_OFFSET)
65 } 65 }
66 { 66 {
67 inv r6 67 finv r6
68 move r1, zero /* high 32 bits of CPA is zero */ 68 move r1, zero /* high 32 bits of CPA is zero */
69 } 69 }
70 { 70 {
@@ -73,12 +73,12 @@ ENTRY(_start)
73 } 73 }
74 { 74 {
75 auli lr, lr, ha16(1f) 75 auli lr, lr, ha16(1f)
76 j hv_install_context 76 j _hv_install_context
77 } 77 }
781: 781:
79 79
80 /* Get our processor number and save it away in SAVE_K_0. */ 80 /* Get our processor number and save it away in SAVE_K_0. */
81 jal hv_inquire_topology 81 jal _hv_inquire_topology
82 mulll_uu r4, r1, r2 /* r1 == y, r2 == width */ 82 mulll_uu r4, r1, r2 /* r1 == y, r2 == width */
83 add r4, r4, r0 /* r0 == x, so r4 == cpu == y*width + x */ 83 add r4, r4, r0 /* r0 == x, so r4 == cpu == y*width + x */
84 84
@@ -86,7 +86,7 @@ ENTRY(_start)
86 /* 86 /*
87 * Load up our per-cpu offset. When the first (master) tile 87 * Load up our per-cpu offset. When the first (master) tile
88 * boots, this value is still zero, so we will load boot_pc 88 * boots, this value is still zero, so we will load boot_pc
89 * with start_kernel, and boot_sp with init_stack + THREAD_SIZE. 89 * with start_kernel, and boot_sp at the top of init_stack.
90 * The master tile initializes the per-cpu offset array, so that 90 * The master tile initializes the per-cpu offset array, so that
91 * when subsequent (secondary) tiles boot, they will instead load 91 * when subsequent (secondary) tiles boot, they will instead load
92 * from their per-cpu versions of boot_sp and boot_pc. 92 * from their per-cpu versions of boot_sp and boot_pc.
@@ -126,7 +126,6 @@ ENTRY(_start)
126 lw sp, r1 126 lw sp, r1
127 or r4, sp, r4 127 or r4, sp, r4
128 mtspr SPR_SYSTEM_SAVE_K_0, r4 /* save ksp0 + cpu */ 128 mtspr SPR_SYSTEM_SAVE_K_0, r4 /* save ksp0 + cpu */
129 addi sp, sp, -STACK_TOP_DELTA
130 { 129 {
131 move lr, zero /* stop backtraces in the called function */ 130 move lr, zero /* stop backtraces in the called function */
132 jr r0 131 jr r0
@@ -163,8 +162,8 @@ ENTRY(swapper_pg_dir)
163 .set addr, addr + PGDIR_SIZE 162 .set addr, addr + PGDIR_SIZE
164 .endr 163 .endr
165 164
166 /* The true text VAs are mapped as VA = PA + MEM_SV_INTRPT */ 165 /* The true text VAs are mapped as VA = PA + MEM_SV_START */
167 PTE MEM_SV_INTRPT, 0, (1 << (HV_PTE_INDEX_READABLE - 32)) | \ 166 PTE MEM_SV_START, 0, (1 << (HV_PTE_INDEX_READABLE - 32)) | \
168 (1 << (HV_PTE_INDEX_EXECUTABLE - 32)) 167 (1 << (HV_PTE_INDEX_EXECUTABLE - 32))
169 .org swapper_pg_dir + PGDIR_SIZE 168 .org swapper_pg_dir + PGDIR_SIZE
170 END(swapper_pg_dir) 169 END(swapper_pg_dir)
diff --git a/arch/tile/kernel/head_64.S b/arch/tile/kernel/head_64.S
index 6093964fa5c7..bd0e12f283f3 100644
--- a/arch/tile/kernel/head_64.S
+++ b/arch/tile/kernel/head_64.S
@@ -25,6 +25,15 @@
25#include <arch/chip.h> 25#include <arch/chip.h>
26#include <arch/spr_def.h> 26#include <arch/spr_def.h>
27 27
28/* Extract two 32-bit bit values that were read into one register. */
29#ifdef __BIG_ENDIAN__
30#define GET_FIRST_INT(rd, rs) shrsi rd, rs, 32
31#define GET_SECOND_INT(rd, rs) addxi rd, rs, 0
32#else
33#define GET_FIRST_INT(rd, rs) addxi rd, rs, 0
34#define GET_SECOND_INT(rd, rs) shrsi rd, rs, 32
35#endif
36
28/* 37/*
29 * This module contains the entry code for kernel images. It performs the 38 * This module contains the entry code for kernel images. It performs the
30 * minimal setup needed to call the generic C routines. 39 * minimal setup needed to call the generic C routines.
@@ -46,11 +55,11 @@ ENTRY(_start)
46 movei r2, TILE_CHIP_REV 55 movei r2, TILE_CHIP_REV
47 movei r3, KERNEL_PL 56 movei r3, KERNEL_PL
48 } 57 }
49 jal hv_init 58 jal _hv_init
50 /* Get a reasonable default ASID in r0 */ 59 /* Get a reasonable default ASID in r0 */
51 { 60 {
52 move r0, zero 61 move r0, zero
53 jal hv_inquire_asid 62 jal _hv_inquire_asid
54 } 63 }
55 64
56 /* 65 /*
@@ -61,7 +70,7 @@ ENTRY(_start)
61 * other CPUs should see a properly-constructed page table. 70 * other CPUs should see a properly-constructed page table.
62 */ 71 */
63 { 72 {
64 v4int_l r2, zero, r0 /* ASID for hv_install_context */ 73 GET_FIRST_INT(r2, r0) /* ASID for hv_install_context */
65 moveli r4, hw1_last(swapper_pgprot - PAGE_OFFSET) 74 moveli r4, hw1_last(swapper_pgprot - PAGE_OFFSET)
66 } 75 }
67 { 76 {
@@ -77,7 +86,7 @@ ENTRY(_start)
77 { 86 {
78 /* After initializing swapper_pgprot, HV_PTE_GLOBAL is set. */ 87 /* After initializing swapper_pgprot, HV_PTE_GLOBAL is set. */
79 bfextu r7, r1, HV_PTE_INDEX_GLOBAL, HV_PTE_INDEX_GLOBAL 88 bfextu r7, r1, HV_PTE_INDEX_GLOBAL, HV_PTE_INDEX_GLOBAL
80 inv r4 89 finv r4
81 } 90 }
82 bnez r7, .Lno_write 91 bnez r7, .Lno_write
83 { 92 {
@@ -121,29 +130,24 @@ ENTRY(_start)
121 } 130 }
122 { 131 {
123 moveli r3, CTX_PAGE_FLAG 132 moveli r3, CTX_PAGE_FLAG
124 j hv_install_context 133 j _hv_install_context
125 } 134 }
1261: 1351:
127 136
128 /* Install the interrupt base. */ 137 /* Install the interrupt base. */
129 moveli r0, hw2_last(MEM_SV_START) 138 moveli r0, hw2_last(intrpt_start)
130 shl16insli r0, r0, hw1(MEM_SV_START) 139 shl16insli r0, r0, hw1(intrpt_start)
131 shl16insli r0, r0, hw0(MEM_SV_START) 140 shl16insli r0, r0, hw0(intrpt_start)
132 mtspr SPR_INTERRUPT_VECTOR_BASE_K, r0 141 mtspr SPR_INTERRUPT_VECTOR_BASE_K, r0
133 142
134 /* 143 /* Get our processor number and save it away in SAVE_K_0. */
135 * Get our processor number and save it away in SAVE_K_0. 144 jal _hv_inquire_topology
136 * Extract stuff from the topology structure: r4 = y, r6 = x,
137 * r5 = width. FIXME: consider whether we want to just make these
138 * 64-bit values (and if so fix smp_topology write below, too).
139 */
140 jal hv_inquire_topology
141 { 145 {
142 v4int_l r5, zero, r1 /* r5 = width */ 146 GET_FIRST_INT(r5, r1) /* r5 = width */
143 shrui r4, r0, 32 /* r4 = y */ 147 GET_SECOND_INT(r4, r0) /* r4 = y */
144 } 148 }
145 { 149 {
146 v4int_l r6, zero, r0 /* r6 = x */ 150 GET_FIRST_INT(r6, r0) /* r6 = x */
147 mul_lu_lu r4, r4, r5 151 mul_lu_lu r4, r4, r5
148 } 152 }
149 { 153 {
@@ -154,7 +158,7 @@ ENTRY(_start)
154 /* 158 /*
155 * Load up our per-cpu offset. When the first (master) tile 159 * Load up our per-cpu offset. When the first (master) tile
156 * boots, this value is still zero, so we will load boot_pc 160 * boots, this value is still zero, so we will load boot_pc
157 * with start_kernel, and boot_sp with init_stack + THREAD_SIZE. 161 * with start_kernel, and boot_sp with at the top of init_stack.
158 * The master tile initializes the per-cpu offset array, so that 162 * The master tile initializes the per-cpu offset array, so that
159 * when subsequent (secondary) tiles boot, they will instead load 163 * when subsequent (secondary) tiles boot, they will instead load
160 * from their per-cpu versions of boot_sp and boot_pc. 164 * from their per-cpu versions of boot_sp and boot_pc.
@@ -198,9 +202,9 @@ ENTRY(_start)
198 } 202 }
199 ld r0, r0 203 ld r0, r0
200 ld sp, r1 204 ld sp, r1
201 or r4, sp, r4 205 shli r4, r4, CPU_SHIFT
206 bfins r4, sp, 0, CPU_SHIFT-1
202 mtspr SPR_SYSTEM_SAVE_K_0, r4 /* save ksp0 + cpu */ 207 mtspr SPR_SYSTEM_SAVE_K_0, r4 /* save ksp0 + cpu */
203 addi sp, sp, -STACK_TOP_DELTA
204 { 208 {
205 move lr, zero /* stop backtraces in the called function */ 209 move lr, zero /* stop backtraces in the called function */
206 jr r0 210 jr r0
diff --git a/arch/tile/kernel/hvglue.S b/arch/tile/kernel/hvglue.S
new file mode 100644
index 000000000000..2ab456622391
--- /dev/null
+++ b/arch/tile/kernel/hvglue.S
@@ -0,0 +1,74 @@
1/* Hypervisor call vector addresses; see <hv/hypervisor.h> */
2.macro gensym sym, val, size
3.org \val
4.global _\sym
5.type _\sym,function
6_\sym:
7.size _\sym,\size
8#ifndef CONFIG_TILE_HVGLUE_TRACE
9.globl \sym
10.set \sym,_\sym
11#endif
12.endm
13
14.section .hvglue,"x",@nobits
15.align 8
16gensym hv_init, 0x20, 32
17gensym hv_install_context, 0x40, 32
18gensym hv_sysconf, 0x60, 32
19gensym hv_get_rtc, 0x80, 32
20gensym hv_set_rtc, 0xa0, 32
21gensym hv_flush_asid, 0xc0, 32
22gensym hv_flush_page, 0xe0, 32
23gensym hv_flush_pages, 0x100, 32
24gensym hv_restart, 0x120, 32
25gensym hv_halt, 0x140, 32
26gensym hv_power_off, 0x160, 32
27gensym hv_inquire_physical, 0x180, 32
28gensym hv_inquire_memory_controller, 0x1a0, 32
29gensym hv_inquire_virtual, 0x1c0, 32
30gensym hv_inquire_asid, 0x1e0, 32
31gensym hv_nanosleep, 0x200, 32
32gensym hv_console_read_if_ready, 0x220, 32
33gensym hv_console_write, 0x240, 32
34gensym hv_downcall_dispatch, 0x260, 32
35gensym hv_inquire_topology, 0x280, 32
36gensym hv_fs_findfile, 0x2a0, 32
37gensym hv_fs_fstat, 0x2c0, 32
38gensym hv_fs_pread, 0x2e0, 32
39gensym hv_physaddr_read64, 0x300, 32
40gensym hv_physaddr_write64, 0x320, 32
41gensym hv_get_command_line, 0x340, 32
42gensym hv_set_caching, 0x360, 32
43gensym hv_bzero_page, 0x380, 32
44gensym hv_register_message_state, 0x3a0, 32
45gensym hv_send_message, 0x3c0, 32
46gensym hv_receive_message, 0x3e0, 32
47gensym hv_inquire_context, 0x400, 32
48gensym hv_start_all_tiles, 0x420, 32
49gensym hv_dev_open, 0x440, 32
50gensym hv_dev_close, 0x460, 32
51gensym hv_dev_pread, 0x480, 32
52gensym hv_dev_pwrite, 0x4a0, 32
53gensym hv_dev_poll, 0x4c0, 32
54gensym hv_dev_poll_cancel, 0x4e0, 32
55gensym hv_dev_preada, 0x500, 32
56gensym hv_dev_pwritea, 0x520, 32
57gensym hv_flush_remote, 0x540, 32
58gensym hv_console_putc, 0x560, 32
59gensym hv_inquire_tiles, 0x580, 32
60gensym hv_confstr, 0x5a0, 32
61gensym hv_reexec, 0x5c0, 32
62gensym hv_set_command_line, 0x5e0, 32
63gensym hv_clear_intr, 0x600, 32
64gensym hv_enable_intr, 0x620, 32
65gensym hv_disable_intr, 0x640, 32
66gensym hv_raise_intr, 0x660, 32
67gensym hv_trigger_ipi, 0x680, 32
68gensym hv_store_mapping, 0x6a0, 32
69gensym hv_inquire_realpa, 0x6c0, 32
70gensym hv_flush_all, 0x6e0, 32
71gensym hv_get_ipi_pte, 0x700, 32
72gensym hv_set_pte_super_shift, 0x720, 32
73gensym hv_console_set_ipi, 0x7e0, 32
74gensym hv_glue_internals, 0x800, 30720
diff --git a/arch/tile/kernel/hvglue.lds b/arch/tile/kernel/hvglue.lds
deleted file mode 100644
index d44c5a67a1ed..000000000000
--- a/arch/tile/kernel/hvglue.lds
+++ /dev/null
@@ -1,59 +0,0 @@
1/* Hypervisor call vector addresses; see <hv/hypervisor.h> */
2hv_init = TEXT_OFFSET + 0x10020;
3hv_install_context = TEXT_OFFSET + 0x10040;
4hv_sysconf = TEXT_OFFSET + 0x10060;
5hv_get_rtc = TEXT_OFFSET + 0x10080;
6hv_set_rtc = TEXT_OFFSET + 0x100a0;
7hv_flush_asid = TEXT_OFFSET + 0x100c0;
8hv_flush_page = TEXT_OFFSET + 0x100e0;
9hv_flush_pages = TEXT_OFFSET + 0x10100;
10hv_restart = TEXT_OFFSET + 0x10120;
11hv_halt = TEXT_OFFSET + 0x10140;
12hv_power_off = TEXT_OFFSET + 0x10160;
13hv_inquire_physical = TEXT_OFFSET + 0x10180;
14hv_inquire_memory_controller = TEXT_OFFSET + 0x101a0;
15hv_inquire_virtual = TEXT_OFFSET + 0x101c0;
16hv_inquire_asid = TEXT_OFFSET + 0x101e0;
17hv_nanosleep = TEXT_OFFSET + 0x10200;
18hv_console_read_if_ready = TEXT_OFFSET + 0x10220;
19hv_console_write = TEXT_OFFSET + 0x10240;
20hv_downcall_dispatch = TEXT_OFFSET + 0x10260;
21hv_inquire_topology = TEXT_OFFSET + 0x10280;
22hv_fs_findfile = TEXT_OFFSET + 0x102a0;
23hv_fs_fstat = TEXT_OFFSET + 0x102c0;
24hv_fs_pread = TEXT_OFFSET + 0x102e0;
25hv_physaddr_read64 = TEXT_OFFSET + 0x10300;
26hv_physaddr_write64 = TEXT_OFFSET + 0x10320;
27hv_get_command_line = TEXT_OFFSET + 0x10340;
28hv_set_caching = TEXT_OFFSET + 0x10360;
29hv_bzero_page = TEXT_OFFSET + 0x10380;
30hv_register_message_state = TEXT_OFFSET + 0x103a0;
31hv_send_message = TEXT_OFFSET + 0x103c0;
32hv_receive_message = TEXT_OFFSET + 0x103e0;
33hv_inquire_context = TEXT_OFFSET + 0x10400;
34hv_start_all_tiles = TEXT_OFFSET + 0x10420;
35hv_dev_open = TEXT_OFFSET + 0x10440;
36hv_dev_close = TEXT_OFFSET + 0x10460;
37hv_dev_pread = TEXT_OFFSET + 0x10480;
38hv_dev_pwrite = TEXT_OFFSET + 0x104a0;
39hv_dev_poll = TEXT_OFFSET + 0x104c0;
40hv_dev_poll_cancel = TEXT_OFFSET + 0x104e0;
41hv_dev_preada = TEXT_OFFSET + 0x10500;
42hv_dev_pwritea = TEXT_OFFSET + 0x10520;
43hv_flush_remote = TEXT_OFFSET + 0x10540;
44hv_console_putc = TEXT_OFFSET + 0x10560;
45hv_inquire_tiles = TEXT_OFFSET + 0x10580;
46hv_confstr = TEXT_OFFSET + 0x105a0;
47hv_reexec = TEXT_OFFSET + 0x105c0;
48hv_set_command_line = TEXT_OFFSET + 0x105e0;
49hv_clear_intr = TEXT_OFFSET + 0x10600;
50hv_enable_intr = TEXT_OFFSET + 0x10620;
51hv_disable_intr = TEXT_OFFSET + 0x10640;
52hv_raise_intr = TEXT_OFFSET + 0x10660;
53hv_trigger_ipi = TEXT_OFFSET + 0x10680;
54hv_store_mapping = TEXT_OFFSET + 0x106a0;
55hv_inquire_realpa = TEXT_OFFSET + 0x106c0;
56hv_flush_all = TEXT_OFFSET + 0x106e0;
57hv_get_ipi_pte = TEXT_OFFSET + 0x10700;
58hv_set_pte_super_shift = TEXT_OFFSET + 0x10720;
59hv_glue_internals = TEXT_OFFSET + 0x10740;
diff --git a/arch/tile/kernel/hvglue_trace.c b/arch/tile/kernel/hvglue_trace.c
new file mode 100644
index 000000000000..85c74ad29312
--- /dev/null
+++ b/arch/tile/kernel/hvglue_trace.c
@@ -0,0 +1,266 @@
1/*
2 * Copyright 2013 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15/*
16 * Pull in the hypervisor header so we declare all the ABI functions
17 * with the underscore versions, then undef the names so that we can
18 * provide our own wrapper versions.
19 */
20#define hv_init _hv_init
21#define hv_install_context _hv_install_context
22#define hv_sysconf _hv_sysconf
23#define hv_get_rtc _hv_get_rtc
24#define hv_set_rtc _hv_set_rtc
25#define hv_flush_asid _hv_flush_asid
26#define hv_flush_page _hv_flush_page
27#define hv_flush_pages _hv_flush_pages
28#define hv_restart _hv_restart
29#define hv_halt _hv_halt
30#define hv_power_off _hv_power_off
31#define hv_inquire_physical _hv_inquire_physical
32#define hv_inquire_memory_controller _hv_inquire_memory_controller
33#define hv_inquire_virtual _hv_inquire_virtual
34#define hv_inquire_asid _hv_inquire_asid
35#define hv_nanosleep _hv_nanosleep
36#define hv_console_read_if_ready _hv_console_read_if_ready
37#define hv_console_write _hv_console_write
38#define hv_downcall_dispatch _hv_downcall_dispatch
39#define hv_inquire_topology _hv_inquire_topology
40#define hv_fs_findfile _hv_fs_findfile
41#define hv_fs_fstat _hv_fs_fstat
42#define hv_fs_pread _hv_fs_pread
43#define hv_physaddr_read64 _hv_physaddr_read64
44#define hv_physaddr_write64 _hv_physaddr_write64
45#define hv_get_command_line _hv_get_command_line
46#define hv_set_caching _hv_set_caching
47#define hv_bzero_page _hv_bzero_page
48#define hv_register_message_state _hv_register_message_state
49#define hv_send_message _hv_send_message
50#define hv_receive_message _hv_receive_message
51#define hv_inquire_context _hv_inquire_context
52#define hv_start_all_tiles _hv_start_all_tiles
53#define hv_dev_open _hv_dev_open
54#define hv_dev_close _hv_dev_close
55#define hv_dev_pread _hv_dev_pread
56#define hv_dev_pwrite _hv_dev_pwrite
57#define hv_dev_poll _hv_dev_poll
58#define hv_dev_poll_cancel _hv_dev_poll_cancel
59#define hv_dev_preada _hv_dev_preada
60#define hv_dev_pwritea _hv_dev_pwritea
61#define hv_flush_remote _hv_flush_remote
62#define hv_console_putc _hv_console_putc
63#define hv_inquire_tiles _hv_inquire_tiles
64#define hv_confstr _hv_confstr
65#define hv_reexec _hv_reexec
66#define hv_set_command_line _hv_set_command_line
67#define hv_clear_intr _hv_clear_intr
68#define hv_enable_intr _hv_enable_intr
69#define hv_disable_intr _hv_disable_intr
70#define hv_raise_intr _hv_raise_intr
71#define hv_trigger_ipi _hv_trigger_ipi
72#define hv_store_mapping _hv_store_mapping
73#define hv_inquire_realpa _hv_inquire_realpa
74#define hv_flush_all _hv_flush_all
75#define hv_get_ipi_pte _hv_get_ipi_pte
76#define hv_set_pte_super_shift _hv_set_pte_super_shift
77#define hv_console_set_ipi _hv_console_set_ipi
78#include <hv/hypervisor.h>
79#undef hv_init
80#undef hv_install_context
81#undef hv_sysconf
82#undef hv_get_rtc
83#undef hv_set_rtc
84#undef hv_flush_asid
85#undef hv_flush_page
86#undef hv_flush_pages
87#undef hv_restart
88#undef hv_halt
89#undef hv_power_off
90#undef hv_inquire_physical
91#undef hv_inquire_memory_controller
92#undef hv_inquire_virtual
93#undef hv_inquire_asid
94#undef hv_nanosleep
95#undef hv_console_read_if_ready
96#undef hv_console_write
97#undef hv_downcall_dispatch
98#undef hv_inquire_topology
99#undef hv_fs_findfile
100#undef hv_fs_fstat
101#undef hv_fs_pread
102#undef hv_physaddr_read64
103#undef hv_physaddr_write64
104#undef hv_get_command_line
105#undef hv_set_caching
106#undef hv_bzero_page
107#undef hv_register_message_state
108#undef hv_send_message
109#undef hv_receive_message
110#undef hv_inquire_context
111#undef hv_start_all_tiles
112#undef hv_dev_open
113#undef hv_dev_close
114#undef hv_dev_pread
115#undef hv_dev_pwrite
116#undef hv_dev_poll
117#undef hv_dev_poll_cancel
118#undef hv_dev_preada
119#undef hv_dev_pwritea
120#undef hv_flush_remote
121#undef hv_console_putc
122#undef hv_inquire_tiles
123#undef hv_confstr
124#undef hv_reexec
125#undef hv_set_command_line
126#undef hv_clear_intr
127#undef hv_enable_intr
128#undef hv_disable_intr
129#undef hv_raise_intr
130#undef hv_trigger_ipi
131#undef hv_store_mapping
132#undef hv_inquire_realpa
133#undef hv_flush_all
134#undef hv_get_ipi_pte
135#undef hv_set_pte_super_shift
136#undef hv_console_set_ipi
137
138/*
139 * Provide macros based on <linux/syscalls.h> to provide a wrapper
140 * function that invokes the same function with an underscore prefix.
141 * We can't use the existing __SC_xxx macros because we need to
142 * support up to nine arguments rather than up to six, and also this
143 * way the file stands alone from possible changes in the
144 * implementation of <linux/syscalls.h>.
145 */
146#define HV_WRAP0(type, name) \
147 type name(void); \
148 type name(void) \
149 { \
150 return _##name(); \
151 }
152#define __HV_DECL1(t1, a1) t1 a1
153#define __HV_DECL2(t2, a2, ...) t2 a2, __HV_DECL1(__VA_ARGS__)
154#define __HV_DECL3(t3, a3, ...) t3 a3, __HV_DECL2(__VA_ARGS__)
155#define __HV_DECL4(t4, a4, ...) t4 a4, __HV_DECL3(__VA_ARGS__)
156#define __HV_DECL5(t5, a5, ...) t5 a5, __HV_DECL4(__VA_ARGS__)
157#define __HV_DECL6(t6, a6, ...) t6 a6, __HV_DECL5(__VA_ARGS__)
158#define __HV_DECL7(t7, a7, ...) t7 a7, __HV_DECL6(__VA_ARGS__)
159#define __HV_DECL8(t8, a8, ...) t8 a8, __HV_DECL7(__VA_ARGS__)
160#define __HV_DECL9(t9, a9, ...) t9 a9, __HV_DECL8(__VA_ARGS__)
161#define __HV_PASS1(t1, a1) a1
162#define __HV_PASS2(t2, a2, ...) a2, __HV_PASS1(__VA_ARGS__)
163#define __HV_PASS3(t3, a3, ...) a3, __HV_PASS2(__VA_ARGS__)
164#define __HV_PASS4(t4, a4, ...) a4, __HV_PASS3(__VA_ARGS__)
165#define __HV_PASS5(t5, a5, ...) a5, __HV_PASS4(__VA_ARGS__)
166#define __HV_PASS6(t6, a6, ...) a6, __HV_PASS5(__VA_ARGS__)
167#define __HV_PASS7(t7, a7, ...) a7, __HV_PASS6(__VA_ARGS__)
168#define __HV_PASS8(t8, a8, ...) a8, __HV_PASS7(__VA_ARGS__)
169#define __HV_PASS9(t9, a9, ...) a9, __HV_PASS8(__VA_ARGS__)
170#define HV_WRAPx(x, type, name, ...) \
171 type name(__HV_DECL##x(__VA_ARGS__)); \
172 type name(__HV_DECL##x(__VA_ARGS__)) \
173 { \
174 return _##name(__HV_PASS##x(__VA_ARGS__)); \
175 }
176#define HV_WRAP1(type, name, ...) HV_WRAPx(1, type, name, __VA_ARGS__)
177#define HV_WRAP2(type, name, ...) HV_WRAPx(2, type, name, __VA_ARGS__)
178#define HV_WRAP3(type, name, ...) HV_WRAPx(3, type, name, __VA_ARGS__)
179#define HV_WRAP4(type, name, ...) HV_WRAPx(4, type, name, __VA_ARGS__)
180#define HV_WRAP5(type, name, ...) HV_WRAPx(5, type, name, __VA_ARGS__)
181#define HV_WRAP6(type, name, ...) HV_WRAPx(6, type, name, __VA_ARGS__)
182#define HV_WRAP7(type, name, ...) HV_WRAPx(7, type, name, __VA_ARGS__)
183#define HV_WRAP8(type, name, ...) HV_WRAPx(8, type, name, __VA_ARGS__)
184#define HV_WRAP9(type, name, ...) HV_WRAPx(9, type, name, __VA_ARGS__)
185
186/* List all the hypervisor API functions. */
187HV_WRAP4(void, hv_init, HV_VersionNumber, interface_version_number,
188 int, chip_num, int, chip_rev_num, int, client_pl)
189HV_WRAP1(long, hv_sysconf, HV_SysconfQuery, query)
190HV_WRAP3(int, hv_confstr, HV_ConfstrQuery, query, HV_VirtAddr, buf, int, len)
191#if CHIP_HAS_IPI()
192HV_WRAP3(int, hv_get_ipi_pte, HV_Coord, tile, int, pl, HV_PTE*, pte)
193HV_WRAP3(int, hv_console_set_ipi, int, ipi, int, event, HV_Coord, coord);
194#else
195HV_WRAP1(void, hv_enable_intr, HV_IntrMask, enab_mask)
196HV_WRAP1(void, hv_disable_intr, HV_IntrMask, disab_mask)
197HV_WRAP1(void, hv_clear_intr, HV_IntrMask, clear_mask)
198HV_WRAP1(void, hv_raise_intr, HV_IntrMask, raise_mask)
199HV_WRAP2(HV_Errno, hv_trigger_ipi, HV_Coord, tile, int, interrupt)
200#endif /* !CHIP_HAS_IPI() */
201HV_WRAP3(int, hv_store_mapping, HV_VirtAddr, va, unsigned int, len,
202 HV_PhysAddr, pa)
203HV_WRAP2(HV_PhysAddr, hv_inquire_realpa, HV_PhysAddr, cpa, unsigned int, len)
204HV_WRAP0(HV_RTCTime, hv_get_rtc)
205HV_WRAP1(void, hv_set_rtc, HV_RTCTime, time)
206HV_WRAP4(int, hv_install_context, HV_PhysAddr, page_table, HV_PTE, access,
207 HV_ASID, asid, __hv32, flags)
208HV_WRAP2(int, hv_set_pte_super_shift, int, level, int, log2_count)
209HV_WRAP0(HV_Context, hv_inquire_context)
210HV_WRAP1(int, hv_flush_asid, HV_ASID, asid)
211HV_WRAP2(int, hv_flush_page, HV_VirtAddr, address, HV_PageSize, page_size)
212HV_WRAP3(int, hv_flush_pages, HV_VirtAddr, start, HV_PageSize, page_size,
213 unsigned long, size)
214HV_WRAP1(int, hv_flush_all, int, preserve_global)
215HV_WRAP2(void, hv_restart, HV_VirtAddr, cmd, HV_VirtAddr, args)
216HV_WRAP0(void, hv_halt)
217HV_WRAP0(void, hv_power_off)
218HV_WRAP1(int, hv_reexec, HV_PhysAddr, entry)
219HV_WRAP0(HV_Topology, hv_inquire_topology)
220HV_WRAP3(HV_Errno, hv_inquire_tiles, HV_InqTileSet, set, HV_VirtAddr, cpumask,
221 int, length)
222HV_WRAP1(HV_PhysAddrRange, hv_inquire_physical, int, idx)
223HV_WRAP2(HV_MemoryControllerInfo, hv_inquire_memory_controller, HV_Coord, coord,
224 int, controller)
225HV_WRAP1(HV_VirtAddrRange, hv_inquire_virtual, int, idx)
226HV_WRAP1(HV_ASIDRange, hv_inquire_asid, int, idx)
227HV_WRAP1(void, hv_nanosleep, int, nanosecs)
228HV_WRAP0(int, hv_console_read_if_ready)
229HV_WRAP1(void, hv_console_putc, int, byte)
230HV_WRAP2(int, hv_console_write, HV_VirtAddr, bytes, int, len)
231HV_WRAP0(void, hv_downcall_dispatch)
232HV_WRAP1(int, hv_fs_findfile, HV_VirtAddr, filename)
233HV_WRAP1(HV_FS_StatInfo, hv_fs_fstat, int, inode)
234HV_WRAP4(int, hv_fs_pread, int, inode, HV_VirtAddr, buf,
235 int, length, int, offset)
236HV_WRAP2(unsigned long long, hv_physaddr_read64, HV_PhysAddr, addr,
237 HV_PTE, access)
238HV_WRAP3(void, hv_physaddr_write64, HV_PhysAddr, addr, HV_PTE, access,
239 unsigned long long, val)
240HV_WRAP2(int, hv_get_command_line, HV_VirtAddr, buf, int, length)
241HV_WRAP2(HV_Errno, hv_set_command_line, HV_VirtAddr, buf, int, length)
242HV_WRAP1(void, hv_set_caching, unsigned long, bitmask)
243HV_WRAP2(void, hv_bzero_page, HV_VirtAddr, va, unsigned int, size)
244HV_WRAP1(HV_Errno, hv_register_message_state, HV_MsgState*, msgstate)
245HV_WRAP4(int, hv_send_message, HV_Recipient *, recips, int, nrecip,
246 HV_VirtAddr, buf, int, buflen)
247HV_WRAP3(HV_RcvMsgInfo, hv_receive_message, HV_MsgState, msgstate,
248 HV_VirtAddr, buf, int, buflen)
249HV_WRAP0(void, hv_start_all_tiles)
250HV_WRAP2(int, hv_dev_open, HV_VirtAddr, name, __hv32, flags)
251HV_WRAP1(int, hv_dev_close, int, devhdl)
252HV_WRAP5(int, hv_dev_pread, int, devhdl, __hv32, flags, HV_VirtAddr, va,
253 __hv32, len, __hv64, offset)
254HV_WRAP5(int, hv_dev_pwrite, int, devhdl, __hv32, flags, HV_VirtAddr, va,
255 __hv32, len, __hv64, offset)
256HV_WRAP3(int, hv_dev_poll, int, devhdl, __hv32, events, HV_IntArg, intarg)
257HV_WRAP1(int, hv_dev_poll_cancel, int, devhdl)
258HV_WRAP6(int, hv_dev_preada, int, devhdl, __hv32, flags, __hv32, sgl_len,
259 HV_SGL *, sglp, __hv64, offset, HV_IntArg, intarg)
260HV_WRAP6(int, hv_dev_pwritea, int, devhdl, __hv32, flags, __hv32, sgl_len,
261 HV_SGL *, sglp, __hv64, offset, HV_IntArg, intarg)
262HV_WRAP9(int, hv_flush_remote, HV_PhysAddr, cache_pa,
263 unsigned long, cache_control, unsigned long*, cache_cpumask,
264 HV_VirtAddr, tlb_va, unsigned long, tlb_length,
265 unsigned long, tlb_pgsize, unsigned long*, tlb_cpumask,
266 HV_Remote_ASID*, asids, int, asidcount)
diff --git a/arch/tile/kernel/intvec_32.S b/arch/tile/kernel/intvec_32.S
index cb52d66343ed..088d5c141e68 100644
--- a/arch/tile/kernel/intvec_32.S
+++ b/arch/tile/kernel/intvec_32.S
@@ -28,20 +28,10 @@
28#include <arch/interrupts.h> 28#include <arch/interrupts.h>
29#include <arch/spr_def.h> 29#include <arch/spr_def.h>
30 30
31#ifdef CONFIG_PREEMPT
32# error "No support for kernel preemption currently"
33#endif
34
35#define PTREGS_PTR(reg, ptreg) addli reg, sp, C_ABI_SAVE_AREA_SIZE + (ptreg) 31#define PTREGS_PTR(reg, ptreg) addli reg, sp, C_ABI_SAVE_AREA_SIZE + (ptreg)
36 32
37#define PTREGS_OFFSET_SYSCALL PTREGS_OFFSET_REG(TREG_SYSCALL_NR) 33#define PTREGS_OFFSET_SYSCALL PTREGS_OFFSET_REG(TREG_SYSCALL_NR)
38 34
39#if !CHIP_HAS_WH64()
40 /* By making this an empty macro, we can use wh64 in the code. */
41 .macro wh64 reg
42 .endm
43#endif
44
45 .macro push_reg reg, ptr=sp, delta=-4 35 .macro push_reg reg, ptr=sp, delta=-4
46 { 36 {
47 sw \ptr, \reg 37 sw \ptr, \reg
@@ -189,7 +179,7 @@ intvec_\vecname:
189 * point sp at the top aligned address on the actual stack page. 179 * point sp at the top aligned address on the actual stack page.
190 */ 180 */
191 mfspr r0, SPR_SYSTEM_SAVE_K_0 181 mfspr r0, SPR_SYSTEM_SAVE_K_0
192 mm r0, r0, zero, LOG2_THREAD_SIZE, 31 182 mm r0, r0, zero, LOG2_NR_CPU_IDS, 31
193 183
1940: 1840:
195 /* 185 /*
@@ -207,6 +197,9 @@ intvec_\vecname:
207 * cache line 1: r14...r29 197 * cache line 1: r14...r29
208 * cache line 0: 2 x frame, r0..r13 198 * cache line 0: 2 x frame, r0..r13
209 */ 199 */
200#if STACK_TOP_DELTA != 64
201#error STACK_TOP_DELTA must be 64 for assumptions here and in task_pt_regs()
202#endif
210 andi r0, r0, -64 203 andi r0, r0, -64
211 204
212 /* 205 /*
@@ -326,18 +319,14 @@ intvec_\vecname:
326 movei r3, -1 /* not used, but set for consistency */ 319 movei r3, -1 /* not used, but set for consistency */
327 } 320 }
328 .else 321 .else
329#if CHIP_HAS_AUX_PERF_COUNTERS()
330 .ifc \c_routine, op_handle_aux_perf_interrupt 322 .ifc \c_routine, op_handle_aux_perf_interrupt
331 { 323 {
332 mfspr r2, AUX_PERF_COUNT_STS 324 mfspr r2, AUX_PERF_COUNT_STS
333 movei r3, -1 /* not used, but set for consistency */ 325 movei r3, -1 /* not used, but set for consistency */
334 } 326 }
335 .else 327 .else
336#endif
337 movei r3, 0 328 movei r3, 0
338#if CHIP_HAS_AUX_PERF_COUNTERS()
339 .endif 329 .endif
340#endif
341 .endif 330 .endif
342 .endif 331 .endif
343 .endif 332 .endif
@@ -354,7 +343,7 @@ intvec_\vecname:
354#ifdef __COLLECT_LINKER_FEEDBACK__ 343#ifdef __COLLECT_LINKER_FEEDBACK__
355 .pushsection .text.intvec_feedback,"ax" 344 .pushsection .text.intvec_feedback,"ax"
356 .org (\vecnum << 5) 345 .org (\vecnum << 5)
357 FEEDBACK_ENTER_EXPLICIT(intvec_\vecname, .intrpt1, 1 << 8) 346 FEEDBACK_ENTER_EXPLICIT(intvec_\vecname, .intrpt, 1 << 8)
358 jrp lr 347 jrp lr
359 .popsection 348 .popsection
360#endif 349#endif
@@ -468,7 +457,7 @@ intvec_\vecname:
468 } 457 }
469 { 458 {
470 auli r21, r21, ha16(__per_cpu_offset) 459 auli r21, r21, ha16(__per_cpu_offset)
471 mm r20, r20, zero, 0, LOG2_THREAD_SIZE-1 460 mm r20, r20, zero, 0, LOG2_NR_CPU_IDS-1
472 } 461 }
473 s2a r20, r20, r21 462 s2a r20, r20, r21
474 lw tp, r20 463 lw tp, r20
@@ -562,7 +551,6 @@ intvec_\vecname:
562 .endif 551 .endif
563 mtspr INTERRUPT_CRITICAL_SECTION, zero 552 mtspr INTERRUPT_CRITICAL_SECTION, zero
564 553
565#if CHIP_HAS_WH64()
566 /* 554 /*
567 * Prepare the first 256 stack bytes to be rapidly accessible 555 * Prepare the first 256 stack bytes to be rapidly accessible
568 * without having to fetch the background data. We don't really 556 * without having to fetch the background data. We don't really
@@ -583,7 +571,6 @@ intvec_\vecname:
583 addi r52, r52, -64 571 addi r52, r52, -64
584 } 572 }
585 wh64 r52 573 wh64 r52
586#endif
587 574
588#ifdef CONFIG_TRACE_IRQFLAGS 575#ifdef CONFIG_TRACE_IRQFLAGS
589 .ifnc \function,handle_nmi 576 .ifnc \function,handle_nmi
@@ -762,7 +749,7 @@ intvec_\vecname:
762 .macro dc_dispatch vecnum, vecname 749 .macro dc_dispatch vecnum, vecname
763 .org (\vecnum << 8) 750 .org (\vecnum << 8)
764intvec_\vecname: 751intvec_\vecname:
765 j hv_downcall_dispatch 752 j _hv_downcall_dispatch
766 ENDPROC(intvec_\vecname) 753 ENDPROC(intvec_\vecname)
767 .endm 754 .endm
768 755
@@ -812,17 +799,34 @@ STD_ENTRY(interrupt_return)
812 } 799 }
813 lw r29, r29 800 lw r29, r29
814 andi r29, r29, SPR_EX_CONTEXT_1_1__PL_MASK /* mask off ICS */ 801 andi r29, r29, SPR_EX_CONTEXT_1_1__PL_MASK /* mask off ICS */
802 bzt r29, .Lresume_userspace
803
804#ifdef CONFIG_PREEMPT
805 /* Returning to kernel space. Check if we need preemption. */
806 GET_THREAD_INFO(r29)
807 addli r28, r29, THREAD_INFO_FLAGS_OFFSET
815 { 808 {
816 bzt r29, .Lresume_userspace 809 lw r28, r28
817 PTREGS_PTR(r29, PTREGS_OFFSET_PC) 810 addli r29, r29, THREAD_INFO_PREEMPT_COUNT_OFFSET
818 } 811 }
812 {
813 andi r28, r28, _TIF_NEED_RESCHED
814 lw r29, r29
815 }
816 bzt r28, 1f
817 bnz r29, 1f
818 jal preempt_schedule_irq
819 FEEDBACK_REENTER(interrupt_return)
8201:
821#endif
819 822
820 /* If we're resuming to _cpu_idle_nap, bump PC forward by 8. */ 823 /* If we're resuming to _cpu_idle_nap, bump PC forward by 8. */
821 { 824 {
822 lw r28, r29 825 PTREGS_PTR(r29, PTREGS_OFFSET_PC)
823 moveli r27, lo16(_cpu_idle_nap) 826 moveli r27, lo16(_cpu_idle_nap)
824 } 827 }
825 { 828 {
829 lw r28, r29
826 auli r27, r27, ha16(_cpu_idle_nap) 830 auli r27, r27, ha16(_cpu_idle_nap)
827 } 831 }
828 { 832 {
@@ -1420,7 +1424,6 @@ handle_ill:
1420 { 1424 {
1421 lw r0, r0 /* indirect thru thread_info to get task_info*/ 1425 lw r0, r0 /* indirect thru thread_info to get task_info*/
1422 addi r1, sp, C_ABI_SAVE_AREA_SIZE /* put ptregs pointer into r1 */ 1426 addi r1, sp, C_ABI_SAVE_AREA_SIZE /* put ptregs pointer into r1 */
1423 move r2, zero /* load error code into r2 */
1424 } 1427 }
1425 1428
1426 jal send_sigtrap /* issue a SIGTRAP */ 1429 jal send_sigtrap /* issue a SIGTRAP */
@@ -1518,12 +1521,10 @@ STD_ENTRY(_sys_clone)
1518 __HEAD 1521 __HEAD
1519 .align 64 1522 .align 64
1520 /* Align much later jump on the start of a cache line. */ 1523 /* Align much later jump on the start of a cache line. */
1521#if !ATOMIC_LOCKS_FOUND_VIA_TABLE()
1522 nop 1524 nop
1523#if PAGE_SIZE >= 0x10000 1525#if PAGE_SIZE >= 0x10000
1524 nop 1526 nop
1525#endif 1527#endif
1526#endif
1527ENTRY(sys_cmpxchg) 1528ENTRY(sys_cmpxchg)
1528 1529
1529 /* 1530 /*
@@ -1557,45 +1558,6 @@ ENTRY(sys_cmpxchg)
1557# error Code here assumes PAGE_OFFSET can be loaded with just hi16() 1558# error Code here assumes PAGE_OFFSET can be loaded with just hi16()
1558#endif 1559#endif
1559 1560
1560#if ATOMIC_LOCKS_FOUND_VIA_TABLE()
1561 {
1562 /* Check for unaligned input. */
1563 bnz sp, .Lcmpxchg_badaddr
1564 mm r25, r0, zero, 3, PAGE_SHIFT-1
1565 }
1566 {
1567 crc32_32 r25, zero, r25
1568 moveli r21, lo16(atomic_lock_ptr)
1569 }
1570 {
1571 auli r21, r21, ha16(atomic_lock_ptr)
1572 auli r23, zero, hi16(PAGE_OFFSET) /* hugepage-aligned */
1573 }
1574 {
1575 shri r20, r25, 32 - ATOMIC_HASH_L1_SHIFT
1576 slt_u r23, r0, r23
1577 lw r26, r0 /* see comment in the "#else" for the "lw r26". */
1578 }
1579 {
1580 s2a r21, r20, r21
1581 bbns r23, .Lcmpxchg_badaddr
1582 }
1583 {
1584 lw r21, r21
1585 seqi r23, TREG_SYSCALL_NR_NAME, __NR_FAST_cmpxchg64
1586 andi r25, r25, ATOMIC_HASH_L2_SIZE - 1
1587 }
1588 {
1589 /* Branch away at this point if we're doing a 64-bit cmpxchg. */
1590 bbs r23, .Lcmpxchg64
1591 andi r23, r0, 7 /* Precompute alignment for cmpxchg64. */
1592 }
1593 {
1594 s2a ATOMIC_LOCK_REG_NAME, r25, r21
1595 j .Lcmpxchg32_tns /* see comment in the #else for the jump. */
1596 }
1597
1598#else /* ATOMIC_LOCKS_FOUND_VIA_TABLE() */
1599 { 1561 {
1600 /* Check for unaligned input. */ 1562 /* Check for unaligned input. */
1601 bnz sp, .Lcmpxchg_badaddr 1563 bnz sp, .Lcmpxchg_badaddr
@@ -1609,7 +1571,7 @@ ENTRY(sys_cmpxchg)
1609 * Because of C pointer arithmetic, we want to compute this: 1571 * Because of C pointer arithmetic, we want to compute this:
1610 * 1572 *
1611 * ((char*)atomic_locks + 1573 * ((char*)atomic_locks +
1612 * (((r0 >> 3) & (1 << (ATOMIC_HASH_SIZE - 1))) << 2)) 1574 * (((r0 >> 3) & ((1 << ATOMIC_HASH_SHIFT) - 1)) << 2))
1613 * 1575 *
1614 * Instead of two shifts we just ">> 1", and use 'mm' 1576 * Instead of two shifts we just ">> 1", and use 'mm'
1615 * to ignore the low and high bits we don't want. 1577 * to ignore the low and high bits we don't want.
@@ -1620,12 +1582,9 @@ ENTRY(sys_cmpxchg)
1620 1582
1621 /* 1583 /*
1622 * Ensure that the TLB is loaded before we take out the lock. 1584 * Ensure that the TLB is loaded before we take out the lock.
1623 * On tilepro, this will start fetching the value all the way 1585 * This will start fetching the value all the way into our L1
1624 * into our L1 as well (and if it gets modified before we 1586 * as well (and if it gets modified before we grab the lock,
1625 * grab the lock, it will be invalidated from our cache 1587 * it will be invalidated from our cache before we reload it).
1626 * before we reload it). On tile64, we'll start fetching it
1627 * into our L1 if we're the home, and if we're not, we'll
1628 * still at least start fetching it into the home's L2.
1629 */ 1588 */
1630 lw r26, r0 1589 lw r26, r0
1631 } 1590 }
@@ -1668,8 +1627,6 @@ ENTRY(sys_cmpxchg)
1668 j .Lcmpxchg32_tns 1627 j .Lcmpxchg32_tns
1669 } 1628 }
1670 1629
1671#endif /* ATOMIC_LOCKS_FOUND_VIA_TABLE() */
1672
1673/* Symbol for do_page_fault_ics() to use to compare against the PC. */ 1630/* Symbol for do_page_fault_ics() to use to compare against the PC. */
1674.global __sys_cmpxchg_grab_lock 1631.global __sys_cmpxchg_grab_lock
1675__sys_cmpxchg_grab_lock: 1632__sys_cmpxchg_grab_lock:
@@ -1807,9 +1764,6 @@ __sys_cmpxchg_grab_lock:
1807 .align 64 1764 .align 64
1808.Lcmpxchg64: 1765.Lcmpxchg64:
1809 { 1766 {
1810#if ATOMIC_LOCKS_FOUND_VIA_TABLE()
1811 s2a ATOMIC_LOCK_REG_NAME, r25, r21
1812#endif
1813 bzt r23, .Lcmpxchg64_tns 1767 bzt r23, .Lcmpxchg64_tns
1814 } 1768 }
1815 j .Lcmpxchg_badaddr 1769 j .Lcmpxchg_badaddr
@@ -1875,8 +1829,8 @@ int_unalign:
1875 push_extra_callee_saves r0 1829 push_extra_callee_saves r0
1876 j do_trap 1830 j do_trap
1877 1831
1878/* Include .intrpt1 array of interrupt vectors */ 1832/* Include .intrpt array of interrupt vectors */
1879 .section ".intrpt1", "ax" 1833 .section ".intrpt", "ax"
1880 1834
1881#define op_handle_perf_interrupt bad_intr 1835#define op_handle_perf_interrupt bad_intr
1882#define op_handle_aux_perf_interrupt bad_intr 1836#define op_handle_aux_perf_interrupt bad_intr
@@ -1944,10 +1898,8 @@ int_unalign:
1944 do_page_fault 1898 do_page_fault
1945 int_hand INT_SN_CPL, SN_CPL, bad_intr 1899 int_hand INT_SN_CPL, SN_CPL, bad_intr
1946 int_hand INT_DOUBLE_FAULT, DOUBLE_FAULT, do_trap 1900 int_hand INT_DOUBLE_FAULT, DOUBLE_FAULT, do_trap
1947#if CHIP_HAS_AUX_PERF_COUNTERS()
1948 int_hand INT_AUX_PERF_COUNT, AUX_PERF_COUNT, \ 1901 int_hand INT_AUX_PERF_COUNT, AUX_PERF_COUNT, \
1949 op_handle_aux_perf_interrupt, handle_nmi 1902 op_handle_aux_perf_interrupt, handle_nmi
1950#endif
1951 1903
1952 /* Synthetic interrupt delivered only by the simulator */ 1904 /* Synthetic interrupt delivered only by the simulator */
1953 int_hand INT_BREAKPOINT, BREAKPOINT, do_breakpoint 1905 int_hand INT_BREAKPOINT, BREAKPOINT, do_breakpoint
diff --git a/arch/tile/kernel/intvec_64.S b/arch/tile/kernel/intvec_64.S
index 85d483957027..ec755d3f3734 100644
--- a/arch/tile/kernel/intvec_64.S
+++ b/arch/tile/kernel/intvec_64.S
@@ -17,25 +17,33 @@
17#include <linux/linkage.h> 17#include <linux/linkage.h>
18#include <linux/errno.h> 18#include <linux/errno.h>
19#include <linux/unistd.h> 19#include <linux/unistd.h>
20#include <linux/init.h>
20#include <asm/ptrace.h> 21#include <asm/ptrace.h>
21#include <asm/thread_info.h> 22#include <asm/thread_info.h>
22#include <asm/irqflags.h> 23#include <asm/irqflags.h>
23#include <asm/asm-offsets.h> 24#include <asm/asm-offsets.h>
24#include <asm/types.h> 25#include <asm/types.h>
26#include <asm/traps.h>
25#include <asm/signal.h> 27#include <asm/signal.h>
26#include <hv/hypervisor.h> 28#include <hv/hypervisor.h>
27#include <arch/abi.h> 29#include <arch/abi.h>
28#include <arch/interrupts.h> 30#include <arch/interrupts.h>
29#include <arch/spr_def.h> 31#include <arch/spr_def.h>
30 32
31#ifdef CONFIG_PREEMPT
32# error "No support for kernel preemption currently"
33#endif
34
35#define PTREGS_PTR(reg, ptreg) addli reg, sp, C_ABI_SAVE_AREA_SIZE + (ptreg) 33#define PTREGS_PTR(reg, ptreg) addli reg, sp, C_ABI_SAVE_AREA_SIZE + (ptreg)
36 34
37#define PTREGS_OFFSET_SYSCALL PTREGS_OFFSET_REG(TREG_SYSCALL_NR) 35#define PTREGS_OFFSET_SYSCALL PTREGS_OFFSET_REG(TREG_SYSCALL_NR)
38 36
37#if CONFIG_KERNEL_PL == 1 || CONFIG_KERNEL_PL == 2
38/*
39 * Set "result" non-zero if ex1 holds the PL of the kernel
40 * (with or without ICS being set). Note this works only
41 * because we never find the PL at level 3.
42 */
43# define IS_KERNEL_EX1(result, ex1) andi result, ex1, CONFIG_KERNEL_PL
44#else
45# error Recode IS_KERNEL_EX1 for CONFIG_KERNEL_PL
46#endif
39 47
40 .macro push_reg reg, ptr=sp, delta=-8 48 .macro push_reg reg, ptr=sp, delta=-8
41 { 49 {
@@ -98,6 +106,185 @@
98 } 106 }
99 .endm 107 .endm
100 108
109 /*
110 * Unalign data exception fast handling: In order to handle
111 * unaligned data access, a fast JIT version is generated and stored
112 * in a specific area in user space. We first need to do a quick poke
113 * to see if the JIT is available. We use certain bits in the fault
114 * PC (3 to 9 is used for 16KB page size) as index to address the JIT
115 * code area. The first 64bit word is the fault PC, and the 2nd one is
116 * the fault bundle itself. If these 2 words both match, then we
117 * directly "iret" to JIT code. If not, a slow path is invoked to
118 * generate new JIT code. Note: the current JIT code WILL be
119 * overwritten if it existed. So, ideally we can handle 128 unalign
120 * fixups via JIT. For lookup efficiency and to effectively support
121 * tight loops with multiple unaligned reference, a simple
122 * direct-mapped cache is used.
123 *
124 * SPR_EX_CONTEXT_K_0 is modified to return to JIT code.
125 * SPR_EX_CONTEXT_K_1 has ICS set.
126 * SPR_EX_CONTEXT_0_0 is setup to user program's next PC.
127 * SPR_EX_CONTEXT_0_1 = 0.
128 */
129 .macro int_hand_unalign_fast vecnum, vecname
130 .org (\vecnum << 8)
131intvec_\vecname:
132 /* Put r3 in SPR_SYSTEM_SAVE_K_1. */
133 mtspr SPR_SYSTEM_SAVE_K_1, r3
134
135 mfspr r3, SPR_EX_CONTEXT_K_1
136 /*
137 * Examine if exception comes from user without ICS set.
138 * If not, just go directly to the slow path.
139 */
140 bnez r3, hand_unalign_slow_nonuser
141
142 mfspr r3, SPR_SYSTEM_SAVE_K_0
143
144 /* Get &thread_info->unalign_jit_tmp[0] in r3. */
145 bfexts r3, r3, 0, CPU_SHIFT-1
146 mm r3, zero, LOG2_THREAD_SIZE, 63
147 addli r3, r3, THREAD_INFO_UNALIGN_JIT_TMP_OFFSET
148
149 /*
150 * Save r0, r1, r2 into thread_info array r3 points to
151 * from low to high memory in order.
152 */
153 st_add r3, r0, 8
154 st_add r3, r1, 8
155 {
156 st_add r3, r2, 8
157 andi r2, sp, 7
158 }
159
160 /* Save stored r3 value so we can revert it on a page fault. */
161 mfspr r1, SPR_SYSTEM_SAVE_K_1
162 st r3, r1
163
164 {
165 /* Generate a SIGBUS if sp is not 8-byte aligned. */
166 bnez r2, hand_unalign_slow_badsp
167 }
168
169 /*
170 * Get the thread_info in r0; load r1 with pc. Set the low bit of sp
171 * as an indicator to the page fault code in case we fault.
172 */
173 {
174 ori sp, sp, 1
175 mfspr r1, SPR_EX_CONTEXT_K_0
176 }
177
178 /* Add the jit_info offset in thread_info; extract r1 [3:9] into r2. */
179 {
180 addli r0, r3, THREAD_INFO_UNALIGN_JIT_BASE_OFFSET - \
181 (THREAD_INFO_UNALIGN_JIT_TMP_OFFSET + (3 * 8))
182 bfextu r2, r1, 3, (2 + PAGE_SHIFT - UNALIGN_JIT_SHIFT)
183 }
184
185 /* Load the jit_info; multiply r2 by 128. */
186 {
187 ld r0, r0
188 shli r2, r2, UNALIGN_JIT_SHIFT
189 }
190
191 /*
192 * If r0 is NULL, the JIT page is not mapped, so go to slow path;
193 * add offset r2 to r0 at the same time.
194 */
195 {
196 beqz r0, hand_unalign_slow
197 add r2, r0, r2
198 }
199
200 /*
201 * We are loading from userspace (both the JIT info PC and
202 * instruction word, and the instruction word we executed)
203 * and since either could fault while holding the interrupt
204 * critical section, we must tag this region and check it in
205 * do_page_fault() to handle it properly.
206 */
207ENTRY(__start_unalign_asm_code)
208
209 /* Load first word of JIT in r0 and increment r2 by 8. */
210 ld_add r0, r2, 8
211
212 /*
213 * Compare the PC with the 1st word in JIT; load the fault bundle
214 * into r1.
215 */
216 {
217 cmpeq r0, r0, r1
218 ld r1, r1
219 }
220
221 /* Go to slow path if PC doesn't match. */
222 beqz r0, hand_unalign_slow
223
224 /*
225 * Load the 2nd word of JIT, which is supposed to be the fault
226 * bundle for a cache hit. Increment r2; after this bundle r2 will
227 * point to the potential start of the JIT code we want to run.
228 */
229 ld_add r0, r2, 8
230
231 /* No further accesses to userspace are done after this point. */
232ENTRY(__end_unalign_asm_code)
233
234 /* Compare the real bundle with what is saved in the JIT area. */
235 {
236 cmpeq r0, r1, r0
237 mtspr SPR_EX_CONTEXT_0_1, zero
238 }
239
240 /* Go to slow path if the fault bundle does not match. */
241 beqz r0, hand_unalign_slow
242
243 /*
244 * A cache hit is found.
245 * r2 points to start of JIT code (3rd word).
246 * r0 is the fault pc.
247 * r1 is the fault bundle.
248 * Reset the low bit of sp.
249 */
250 {
251 mfspr r0, SPR_EX_CONTEXT_K_0
252 andi sp, sp, ~1
253 }
254
255 /* Write r2 into EX_CONTEXT_K_0 and increment PC. */
256 {
257 mtspr SPR_EX_CONTEXT_K_0, r2
258 addi r0, r0, 8
259 }
260
261 /*
262 * Set ICS on kernel EX_CONTEXT_K_1 in order to "iret" to
263 * user with ICS set. This way, if the JIT fixup causes another
264 * unalign exception (which shouldn't be possible) the user
265 * process will be terminated with SIGBUS. Also, our fixup will
266 * run without interleaving with external interrupts.
267 * Each fixup is at most 14 bundles, so it won't hold ICS for long.
268 */
269 {
270 movei r1, PL_ICS_EX1(USER_PL, 1)
271 mtspr SPR_EX_CONTEXT_0_0, r0
272 }
273
274 {
275 mtspr SPR_EX_CONTEXT_K_1, r1
276 addi r3, r3, -(3 * 8)
277 }
278
279 /* Restore r0..r3. */
280 ld_add r0, r3, 8
281 ld_add r1, r3, 8
282 ld_add r2, r3, 8
283 ld r3, r3
284
285 iret
286 ENDPROC(intvec_\vecname)
287 .endm
101 288
102#ifdef __COLLECT_LINKER_FEEDBACK__ 289#ifdef __COLLECT_LINKER_FEEDBACK__
103 .pushsection .text.intvec_feedback,"ax" 290 .pushsection .text.intvec_feedback,"ax"
@@ -118,15 +305,21 @@ intvec_feedback:
118 * The "processing" argument specifies the code for processing 305 * The "processing" argument specifies the code for processing
119 * the interrupt. Defaults to "handle_interrupt". 306 * the interrupt. Defaults to "handle_interrupt".
120 */ 307 */
121 .macro int_hand vecnum, vecname, c_routine, processing=handle_interrupt 308 .macro __int_hand vecnum, vecname, c_routine,processing=handle_interrupt
122 .org (\vecnum << 8)
123intvec_\vecname: 309intvec_\vecname:
124 /* Temporarily save a register so we have somewhere to work. */ 310 /* Temporarily save a register so we have somewhere to work. */
125 311
126 mtspr SPR_SYSTEM_SAVE_K_1, r0 312 mtspr SPR_SYSTEM_SAVE_K_1, r0
127 mfspr r0, SPR_EX_CONTEXT_K_1 313 mfspr r0, SPR_EX_CONTEXT_K_1
128 314
129 andi r0, r0, SPR_EX_CONTEXT_1_1__PL_MASK /* mask off ICS */ 315 /*
316 * The unalign data fastpath code sets the low bit in sp to
317 * force us to reset it here on fault.
318 */
319 {
320 blbs sp, 2f
321 IS_KERNEL_EX1(r0, r0)
322 }
130 323
131 .ifc \vecnum, INT_DOUBLE_FAULT 324 .ifc \vecnum, INT_DOUBLE_FAULT
132 /* 325 /*
@@ -176,15 +369,15 @@ intvec_\vecname:
176 } 369 }
177 .endif 370 .endif
178 371
179 3722:
180 /* 373 /*
181 * SYSTEM_SAVE_K_0 holds the cpu number in the low bits, and 374 * SYSTEM_SAVE_K_0 holds the cpu number in the high bits, and
182 * the current stack top in the higher bits. So we recover 375 * the current stack top in the lower bits. So we recover
183 * our stack top by just masking off the low bits, then 376 * our starting stack value by sign-extending the low bits, then
184 * point sp at the top aligned address on the actual stack page. 377 * point sp at the top aligned address on the actual stack page.
185 */ 378 */
186 mfspr r0, SPR_SYSTEM_SAVE_K_0 379 mfspr r0, SPR_SYSTEM_SAVE_K_0
187 mm r0, zero, LOG2_THREAD_SIZE, 63 380 bfexts r0, r0, 0, CPU_SHIFT-1
188 381
1890: 3820:
190 /* 383 /*
@@ -206,6 +399,9 @@ intvec_\vecname:
206 * cache line 1: r6...r13 399 * cache line 1: r6...r13
207 * cache line 0: 2 x frame, r0..r5 400 * cache line 0: 2 x frame, r0..r5
208 */ 401 */
402#if STACK_TOP_DELTA != 64
403#error STACK_TOP_DELTA must be 64 for assumptions here and in task_pt_regs()
404#endif
209 andi r0, r0, -64 405 andi r0, r0, -64
210 406
211 /* 407 /*
@@ -305,7 +501,7 @@ intvec_\vecname:
305 mfspr r3, SPR_SYSTEM_SAVE_K_2 /* info about page fault */ 501 mfspr r3, SPR_SYSTEM_SAVE_K_2 /* info about page fault */
306 .else 502 .else
307 .ifc \vecnum, INT_ILL_TRANS 503 .ifc \vecnum, INT_ILL_TRANS
308 mfspr r2, ILL_TRANS_REASON 504 mfspr r2, ILL_VA_PC
309 .else 505 .else
310 .ifc \vecnum, INT_DOUBLE_FAULT 506 .ifc \vecnum, INT_DOUBLE_FAULT
311 mfspr r2, SPR_SYSTEM_SAVE_K_2 /* double fault info from HV */ 507 mfspr r2, SPR_SYSTEM_SAVE_K_2 /* double fault info from HV */
@@ -315,12 +511,10 @@ intvec_\vecname:
315 .else 511 .else
316 .ifc \c_routine, op_handle_perf_interrupt 512 .ifc \c_routine, op_handle_perf_interrupt
317 mfspr r2, PERF_COUNT_STS 513 mfspr r2, PERF_COUNT_STS
318#if CHIP_HAS_AUX_PERF_COUNTERS()
319 .else 514 .else
320 .ifc \c_routine, op_handle_aux_perf_interrupt 515 .ifc \c_routine, op_handle_aux_perf_interrupt
321 mfspr r2, AUX_PERF_COUNT_STS 516 mfspr r2, AUX_PERF_COUNT_STS
322 .endif 517 .endif
323#endif
324 .endif 518 .endif
325 .endif 519 .endif
326 .endif 520 .endif
@@ -339,7 +533,7 @@ intvec_\vecname:
339#ifdef __COLLECT_LINKER_FEEDBACK__ 533#ifdef __COLLECT_LINKER_FEEDBACK__
340 .pushsection .text.intvec_feedback,"ax" 534 .pushsection .text.intvec_feedback,"ax"
341 .org (\vecnum << 5) 535 .org (\vecnum << 5)
342 FEEDBACK_ENTER_EXPLICIT(intvec_\vecname, .intrpt1, 1 << 8) 536 FEEDBACK_ENTER_EXPLICIT(intvec_\vecname, .intrpt, 1 << 8)
343 jrp lr 537 jrp lr
344 .popsection 538 .popsection
345#endif 539#endif
@@ -455,11 +649,12 @@ intvec_\vecname:
455 /* 649 /*
456 * If we will be returning to the kernel, we will need to 650 * If we will be returning to the kernel, we will need to
457 * reset the interrupt masks to the state they had before. 651 * reset the interrupt masks to the state they had before.
458 * Set DISABLE_IRQ in flags iff we came from PL1 with irqs disabled. 652 * Set DISABLE_IRQ in flags iff we came from kernel pl with
653 * irqs disabled.
459 */ 654 */
460 mfspr r32, SPR_EX_CONTEXT_K_1 655 mfspr r32, SPR_EX_CONTEXT_K_1
461 { 656 {
462 andi r32, r32, SPR_EX_CONTEXT_1_1__PL_MASK /* mask off ICS */ 657 IS_KERNEL_EX1(r22, r22)
463 PTREGS_PTR(r21, PTREGS_OFFSET_FLAGS) 658 PTREGS_PTR(r21, PTREGS_OFFSET_FLAGS)
464 } 659 }
465 beqzt r32, 1f /* zero if from user space */ 660 beqzt r32, 1f /* zero if from user space */
@@ -503,7 +698,7 @@ intvec_\vecname:
503 } 698 }
504 { 699 {
505 shl16insli r21, r21, hw1(__per_cpu_offset) 700 shl16insli r21, r21, hw1(__per_cpu_offset)
506 bfextu r20, r20, 0, LOG2_THREAD_SIZE-1 701 bfextu r20, r20, CPU_SHIFT, 63
507 } 702 }
508 shl16insli r21, r21, hw0(__per_cpu_offset) 703 shl16insli r21, r21, hw0(__per_cpu_offset)
509 shl3add r20, r20, r21 704 shl3add r20, r20, r21
@@ -585,7 +780,7 @@ intvec_\vecname:
585 .macro dc_dispatch vecnum, vecname 780 .macro dc_dispatch vecnum, vecname
586 .org (\vecnum << 8) 781 .org (\vecnum << 8)
587intvec_\vecname: 782intvec_\vecname:
588 j hv_downcall_dispatch 783 j _hv_downcall_dispatch
589 ENDPROC(intvec_\vecname) 784 ENDPROC(intvec_\vecname)
590 .endm 785 .endm
591 786
@@ -626,14 +821,36 @@ STD_ENTRY(interrupt_return)
626 PTREGS_PTR(r29, PTREGS_OFFSET_EX1) 821 PTREGS_PTR(r29, PTREGS_OFFSET_EX1)
627 } 822 }
628 ld r29, r29 823 ld r29, r29
629 andi r29, r29, SPR_EX_CONTEXT_1_1__PL_MASK /* mask off ICS */ 824 IS_KERNEL_EX1(r29, r29)
630 { 825 {
631 beqzt r29, .Lresume_userspace 826 beqzt r29, .Lresume_userspace
632 PTREGS_PTR(r29, PTREGS_OFFSET_PC) 827 move r29, sp
828 }
829
830#ifdef CONFIG_PREEMPT
831 /* Returning to kernel space. Check if we need preemption. */
832 EXTRACT_THREAD_INFO(r29)
833 addli r28, r29, THREAD_INFO_FLAGS_OFFSET
834 {
835 ld r28, r28
836 addli r29, r29, THREAD_INFO_PREEMPT_COUNT_OFFSET
837 }
838 {
839 andi r28, r28, _TIF_NEED_RESCHED
840 ld4s r29, r29
633 } 841 }
842 beqzt r28, 1f
843 bnez r29, 1f
844 jal preempt_schedule_irq
845 FEEDBACK_REENTER(interrupt_return)
8461:
847#endif
634 848
635 /* If we're resuming to _cpu_idle_nap, bump PC forward by 8. */ 849 /* If we're resuming to _cpu_idle_nap, bump PC forward by 8. */
636 moveli r27, hw2_last(_cpu_idle_nap) 850 {
851 moveli r27, hw2_last(_cpu_idle_nap)
852 PTREGS_PTR(r29, PTREGS_OFFSET_PC)
853 }
637 { 854 {
638 ld r28, r29 855 ld r28, r29
639 shl16insli r27, r27, hw1(_cpu_idle_nap) 856 shl16insli r27, r27, hw1(_cpu_idle_nap)
@@ -728,7 +945,7 @@ STD_ENTRY(interrupt_return)
728 PTREGS_PTR(r32, PTREGS_OFFSET_FLAGS) 945 PTREGS_PTR(r32, PTREGS_OFFSET_FLAGS)
729 } 946 }
730 { 947 {
731 andi r0, r0, SPR_EX_CONTEXT_1_1__PL_MASK 948 IS_KERNEL_EX1(r0, r0)
732 ld r32, r32 949 ld r32, r32
733 } 950 }
734 bnez r0, 1f 951 bnez r0, 1f
@@ -799,7 +1016,7 @@ STD_ENTRY(interrupt_return)
799 pop_reg r21, sp, PTREGS_OFFSET_REG(31) - PTREGS_OFFSET_PC 1016 pop_reg r21, sp, PTREGS_OFFSET_REG(31) - PTREGS_OFFSET_PC
800 { 1017 {
801 mtspr SPR_EX_CONTEXT_K_1, lr 1018 mtspr SPR_EX_CONTEXT_K_1, lr
802 andi lr, lr, SPR_EX_CONTEXT_1_1__PL_MASK /* mask off ICS */ 1019 IS_KERNEL_EX1(lr, lr)
803 } 1020 }
804 { 1021 {
805 mtspr SPR_EX_CONTEXT_K_0, r21 1022 mtspr SPR_EX_CONTEXT_K_0, r21
@@ -1223,10 +1440,31 @@ STD_ENTRY(_sys_clone)
1223 j sys_clone 1440 j sys_clone
1224 STD_ENDPROC(_sys_clone) 1441 STD_ENDPROC(_sys_clone)
1225 1442
1226/* The single-step support may need to read all the registers. */ 1443 /*
1444 * Recover r3, r2, r1 and r0 here saved by unalign fast vector.
1445 * The vector area limit is 32 bundles, so we handle the reload here.
1446 * r0, r1, r2 are in thread_info from low to high memory in order.
1447 * r3 points to location the original r3 was saved.
1448 * We put this code in the __HEAD section so it can be reached
1449 * via a conditional branch from the fast path.
1450 */
1451 __HEAD
1452hand_unalign_slow:
1453 andi sp, sp, ~1
1454hand_unalign_slow_badsp:
1455 addi r3, r3, -(3 * 8)
1456 ld_add r0, r3, 8
1457 ld_add r1, r3, 8
1458 ld r2, r3
1459hand_unalign_slow_nonuser:
1460 mfspr r3, SPR_SYSTEM_SAVE_K_1
1461 __int_hand INT_UNALIGN_DATA, UNALIGN_DATA_SLOW, int_unalign
1462
1463/* The unaligned data support needs to read all the registers. */
1227int_unalign: 1464int_unalign:
1228 push_extra_callee_saves r0 1465 push_extra_callee_saves r0
1229 j do_trap 1466 j do_unaligned
1467ENDPROC(hand_unalign_slow)
1230 1468
1231/* Fill the return address stack with nonzero entries. */ 1469/* Fill the return address stack with nonzero entries. */
1232STD_ENTRY(fill_ra_stack) 1470STD_ENTRY(fill_ra_stack)
@@ -1240,8 +1478,15 @@ STD_ENTRY(fill_ra_stack)
12404: jrp r0 14784: jrp r0
1241 STD_ENDPROC(fill_ra_stack) 1479 STD_ENDPROC(fill_ra_stack)
1242 1480
1243/* Include .intrpt1 array of interrupt vectors */ 1481 .macro int_hand vecnum, vecname, c_routine, processing=handle_interrupt
1244 .section ".intrpt1", "ax" 1482 .org (\vecnum << 8)
1483 __int_hand \vecnum, \vecname, \c_routine, \processing
1484 .endm
1485
1486/* Include .intrpt array of interrupt vectors */
1487 .section ".intrpt", "ax"
1488 .global intrpt_start
1489intrpt_start:
1245 1490
1246#define op_handle_perf_interrupt bad_intr 1491#define op_handle_perf_interrupt bad_intr
1247#define op_handle_aux_perf_interrupt bad_intr 1492#define op_handle_aux_perf_interrupt bad_intr
@@ -1272,7 +1517,7 @@ STD_ENTRY(fill_ra_stack)
1272 int_hand INT_SWINT_1, SWINT_1, SYSCALL, handle_syscall 1517 int_hand INT_SWINT_1, SWINT_1, SYSCALL, handle_syscall
1273 int_hand INT_SWINT_0, SWINT_0, do_trap 1518 int_hand INT_SWINT_0, SWINT_0, do_trap
1274 int_hand INT_ILL_TRANS, ILL_TRANS, do_trap 1519 int_hand INT_ILL_TRANS, ILL_TRANS, do_trap
1275 int_hand INT_UNALIGN_DATA, UNALIGN_DATA, int_unalign 1520 int_hand_unalign_fast INT_UNALIGN_DATA, UNALIGN_DATA
1276 int_hand INT_DTLB_MISS, DTLB_MISS, do_page_fault 1521 int_hand INT_DTLB_MISS, DTLB_MISS, do_page_fault
1277 int_hand INT_DTLB_ACCESS, DTLB_ACCESS, do_page_fault 1522 int_hand INT_DTLB_ACCESS, DTLB_ACCESS, do_page_fault
1278 int_hand INT_IDN_FIREWALL, IDN_FIREWALL, do_hardwall_trap 1523 int_hand INT_IDN_FIREWALL, IDN_FIREWALL, do_hardwall_trap
diff --git a/arch/tile/kernel/irq.c b/arch/tile/kernel/irq.c
index 3ccf2cd7182e..0586fdb9352d 100644
--- a/arch/tile/kernel/irq.c
+++ b/arch/tile/kernel/irq.c
@@ -55,7 +55,8 @@ static DEFINE_PER_CPU(int, irq_depth);
55 55
56/* State for allocating IRQs on Gx. */ 56/* State for allocating IRQs on Gx. */
57#if CHIP_HAS_IPI() 57#if CHIP_HAS_IPI()
58static unsigned long available_irqs = ~(1UL << IRQ_RESCHEDULE); 58static unsigned long available_irqs = ((1UL << NR_IRQS) - 1) &
59 (~(1UL << IRQ_RESCHEDULE));
59static DEFINE_SPINLOCK(available_irqs_lock); 60static DEFINE_SPINLOCK(available_irqs_lock);
60#endif 61#endif
61 62
@@ -73,7 +74,8 @@ static DEFINE_SPINLOCK(available_irqs_lock);
73 74
74/* 75/*
75 * The interrupt handling path, implemented in terms of HV interrupt 76 * The interrupt handling path, implemented in terms of HV interrupt
76 * emulation on TILE64 and TILEPro, and IPI hardware on TILE-Gx. 77 * emulation on TILEPro, and IPI hardware on TILE-Gx.
78 * Entered with interrupts disabled.
77 */ 79 */
78void tile_dev_intr(struct pt_regs *regs, int intnum) 80void tile_dev_intr(struct pt_regs *regs, int intnum)
79{ 81{
@@ -233,7 +235,7 @@ void tile_irq_activate(unsigned int irq, int tile_irq_type)
233{ 235{
234 /* 236 /*
235 * We use handle_level_irq() by default because the pending 237 * We use handle_level_irq() by default because the pending
236 * interrupt vector (whether modeled by the HV on TILE64 and 238 * interrupt vector (whether modeled by the HV on
237 * TILEPro or implemented in hardware on TILE-Gx) has 239 * TILEPro or implemented in hardware on TILE-Gx) has
238 * level-style semantics for each bit. An interrupt fires 240 * level-style semantics for each bit. An interrupt fires
239 * whenever a bit is high, not just at edges. 241 * whenever a bit is high, not just at edges.
diff --git a/arch/tile/kernel/kgdb.c b/arch/tile/kernel/kgdb.c
new file mode 100644
index 000000000000..4cd88381a83e
--- /dev/null
+++ b/arch/tile/kernel/kgdb.c
@@ -0,0 +1,499 @@
1/*
2 * Copyright 2013 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 *
14 * TILE-Gx KGDB support.
15 */
16
17#include <linux/ptrace.h>
18#include <linux/kgdb.h>
19#include <linux/kdebug.h>
20#include <linux/uaccess.h>
21#include <linux/module.h>
22#include <asm/cacheflush.h>
23
24static tile_bundle_bits singlestep_insn = TILEGX_BPT_BUNDLE | DIE_SSTEPBP;
25static unsigned long stepped_addr;
26static tile_bundle_bits stepped_instr;
27
28struct dbg_reg_def_t dbg_reg_def[DBG_MAX_REG_NUM] = {
29 { "r0", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[0])},
30 { "r1", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[1])},
31 { "r2", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[2])},
32 { "r3", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[3])},
33 { "r4", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[4])},
34 { "r5", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[5])},
35 { "r6", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[6])},
36 { "r7", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[7])},
37 { "r8", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[8])},
38 { "r9", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[9])},
39 { "r10", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[10])},
40 { "r11", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[11])},
41 { "r12", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[12])},
42 { "r13", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[13])},
43 { "r14", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[14])},
44 { "r15", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[15])},
45 { "r16", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[16])},
46 { "r17", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[17])},
47 { "r18", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[18])},
48 { "r19", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[19])},
49 { "r20", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[20])},
50 { "r21", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[21])},
51 { "r22", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[22])},
52 { "r23", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[23])},
53 { "r24", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[24])},
54 { "r25", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[25])},
55 { "r26", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[26])},
56 { "r27", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[27])},
57 { "r28", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[28])},
58 { "r29", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[29])},
59 { "r30", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[30])},
60 { "r31", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[31])},
61 { "r32", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[32])},
62 { "r33", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[33])},
63 { "r34", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[34])},
64 { "r35", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[35])},
65 { "r36", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[36])},
66 { "r37", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[37])},
67 { "r38", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[38])},
68 { "r39", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[39])},
69 { "r40", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[40])},
70 { "r41", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[41])},
71 { "r42", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[42])},
72 { "r43", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[43])},
73 { "r44", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[44])},
74 { "r45", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[45])},
75 { "r46", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[46])},
76 { "r47", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[47])},
77 { "r48", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[48])},
78 { "r49", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[49])},
79 { "r50", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[50])},
80 { "r51", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[51])},
81 { "r52", GDB_SIZEOF_REG, offsetof(struct pt_regs, regs[52])},
82 { "tp", GDB_SIZEOF_REG, offsetof(struct pt_regs, tp)},
83 { "sp", GDB_SIZEOF_REG, offsetof(struct pt_regs, sp)},
84 { "lr", GDB_SIZEOF_REG, offsetof(struct pt_regs, lr)},
85 { "sn", GDB_SIZEOF_REG, -1},
86 { "idn0", GDB_SIZEOF_REG, -1},
87 { "idn1", GDB_SIZEOF_REG, -1},
88 { "udn0", GDB_SIZEOF_REG, -1},
89 { "udn1", GDB_SIZEOF_REG, -1},
90 { "udn2", GDB_SIZEOF_REG, -1},
91 { "udn3", GDB_SIZEOF_REG, -1},
92 { "zero", GDB_SIZEOF_REG, -1},
93 { "pc", GDB_SIZEOF_REG, offsetof(struct pt_regs, pc)},
94 { "faultnum", GDB_SIZEOF_REG, offsetof(struct pt_regs, faultnum)},
95};
96
97char *dbg_get_reg(int regno, void *mem, struct pt_regs *regs)
98{
99 if (regno >= DBG_MAX_REG_NUM || regno < 0)
100 return NULL;
101
102 if (dbg_reg_def[regno].offset != -1)
103 memcpy(mem, (void *)regs + dbg_reg_def[regno].offset,
104 dbg_reg_def[regno].size);
105 else
106 memset(mem, 0, dbg_reg_def[regno].size);
107 return dbg_reg_def[regno].name;
108}
109
110int dbg_set_reg(int regno, void *mem, struct pt_regs *regs)
111{
112 if (regno >= DBG_MAX_REG_NUM || regno < 0)
113 return -EINVAL;
114
115 if (dbg_reg_def[regno].offset != -1)
116 memcpy((void *)regs + dbg_reg_def[regno].offset, mem,
117 dbg_reg_def[regno].size);
118 return 0;
119}
120
121/*
122 * Similar to pt_regs_to_gdb_regs() except that process is sleeping and so
123 * we may not be able to get all the info.
124 */
125void
126sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, struct task_struct *task)
127{
128 int reg;
129 struct pt_regs *thread_regs;
130 unsigned long *ptr = gdb_regs;
131
132 if (task == NULL)
133 return;
134
135 /* Initialize to zero. */
136 memset(gdb_regs, 0, NUMREGBYTES);
137
138 thread_regs = task_pt_regs(task);
139 for (reg = 0; reg <= TREG_LAST_GPR; reg++)
140 *(ptr++) = thread_regs->regs[reg];
141
142 gdb_regs[TILEGX_PC_REGNUM] = thread_regs->pc;
143 gdb_regs[TILEGX_FAULTNUM_REGNUM] = thread_regs->faultnum;
144}
145
146void kgdb_arch_set_pc(struct pt_regs *regs, unsigned long pc)
147{
148 regs->pc = pc;
149}
150
151static void kgdb_call_nmi_hook(void *ignored)
152{
153 kgdb_nmicallback(raw_smp_processor_id(), NULL);
154}
155
156void kgdb_roundup_cpus(unsigned long flags)
157{
158 local_irq_enable();
159 smp_call_function(kgdb_call_nmi_hook, NULL, 0);
160 local_irq_disable();
161}
162
163/*
164 * Convert a kernel address to the writable kernel text mapping.
165 */
166static unsigned long writable_address(unsigned long addr)
167{
168 unsigned long ret = 0;
169
170 if (core_kernel_text(addr))
171 ret = addr - MEM_SV_START + PAGE_OFFSET;
172 else if (is_module_text_address(addr))
173 ret = addr;
174 else
175 pr_err("Unknown virtual address 0x%lx\n", addr);
176
177 return ret;
178}
179
180/*
181 * Calculate the new address for after a step.
182 */
183static unsigned long get_step_address(struct pt_regs *regs)
184{
185 int src_reg;
186 int jump_off;
187 int br_off;
188 unsigned long addr;
189 unsigned int opcode;
190 tile_bundle_bits bundle;
191
192 /* Move to the next instruction by default. */
193 addr = regs->pc + TILEGX_BUNDLE_SIZE_IN_BYTES;
194 bundle = *(unsigned long *)instruction_pointer(regs);
195
196 /* 0: X mode, Otherwise: Y mode. */
197 if (bundle & TILEGX_BUNDLE_MODE_MASK) {
198 if (get_Opcode_Y1(bundle) == RRR_1_OPCODE_Y1 &&
199 get_RRROpcodeExtension_Y1(bundle) ==
200 UNARY_RRR_1_OPCODE_Y1) {
201 opcode = get_UnaryOpcodeExtension_Y1(bundle);
202
203 switch (opcode) {
204 case JALR_UNARY_OPCODE_Y1:
205 case JALRP_UNARY_OPCODE_Y1:
206 case JR_UNARY_OPCODE_Y1:
207 case JRP_UNARY_OPCODE_Y1:
208 src_reg = get_SrcA_Y1(bundle);
209 dbg_get_reg(src_reg, &addr, regs);
210 break;
211 }
212 }
213 } else if (get_Opcode_X1(bundle) == RRR_0_OPCODE_X1) {
214 if (get_RRROpcodeExtension_X1(bundle) ==
215 UNARY_RRR_0_OPCODE_X1) {
216 opcode = get_UnaryOpcodeExtension_X1(bundle);
217
218 switch (opcode) {
219 case JALR_UNARY_OPCODE_X1:
220 case JALRP_UNARY_OPCODE_X1:
221 case JR_UNARY_OPCODE_X1:
222 case JRP_UNARY_OPCODE_X1:
223 src_reg = get_SrcA_X1(bundle);
224 dbg_get_reg(src_reg, &addr, regs);
225 break;
226 }
227 }
228 } else if (get_Opcode_X1(bundle) == JUMP_OPCODE_X1) {
229 opcode = get_JumpOpcodeExtension_X1(bundle);
230
231 switch (opcode) {
232 case JAL_JUMP_OPCODE_X1:
233 case J_JUMP_OPCODE_X1:
234 jump_off = sign_extend(get_JumpOff_X1(bundle), 27);
235 addr = regs->pc +
236 (jump_off << TILEGX_LOG2_BUNDLE_SIZE_IN_BYTES);
237 break;
238 }
239 } else if (get_Opcode_X1(bundle) == BRANCH_OPCODE_X1) {
240 br_off = 0;
241 opcode = get_BrType_X1(bundle);
242
243 switch (opcode) {
244 case BEQZT_BRANCH_OPCODE_X1:
245 case BEQZ_BRANCH_OPCODE_X1:
246 if (get_SrcA_X1(bundle) == 0)
247 br_off = get_BrOff_X1(bundle);
248 break;
249 case BGEZT_BRANCH_OPCODE_X1:
250 case BGEZ_BRANCH_OPCODE_X1:
251 if (get_SrcA_X1(bundle) >= 0)
252 br_off = get_BrOff_X1(bundle);
253 break;
254 case BGTZT_BRANCH_OPCODE_X1:
255 case BGTZ_BRANCH_OPCODE_X1:
256 if (get_SrcA_X1(bundle) > 0)
257 br_off = get_BrOff_X1(bundle);
258 break;
259 case BLBCT_BRANCH_OPCODE_X1:
260 case BLBC_BRANCH_OPCODE_X1:
261 if (!(get_SrcA_X1(bundle) & 1))
262 br_off = get_BrOff_X1(bundle);
263 break;
264 case BLBST_BRANCH_OPCODE_X1:
265 case BLBS_BRANCH_OPCODE_X1:
266 if (get_SrcA_X1(bundle) & 1)
267 br_off = get_BrOff_X1(bundle);
268 break;
269 case BLEZT_BRANCH_OPCODE_X1:
270 case BLEZ_BRANCH_OPCODE_X1:
271 if (get_SrcA_X1(bundle) <= 0)
272 br_off = get_BrOff_X1(bundle);
273 break;
274 case BLTZT_BRANCH_OPCODE_X1:
275 case BLTZ_BRANCH_OPCODE_X1:
276 if (get_SrcA_X1(bundle) < 0)
277 br_off = get_BrOff_X1(bundle);
278 break;
279 case BNEZT_BRANCH_OPCODE_X1:
280 case BNEZ_BRANCH_OPCODE_X1:
281 if (get_SrcA_X1(bundle) != 0)
282 br_off = get_BrOff_X1(bundle);
283 break;
284 }
285
286 if (br_off != 0) {
287 br_off = sign_extend(br_off, 17);
288 addr = regs->pc +
289 (br_off << TILEGX_LOG2_BUNDLE_SIZE_IN_BYTES);
290 }
291 }
292
293 return addr;
294}
295
296/*
297 * Replace the next instruction after the current instruction with a
298 * breakpoint instruction.
299 */
300static void do_single_step(struct pt_regs *regs)
301{
302 unsigned long addr_wr;
303
304 /* Determine where the target instruction will send us to. */
305 stepped_addr = get_step_address(regs);
306 probe_kernel_read((char *)&stepped_instr, (char *)stepped_addr,
307 BREAK_INSTR_SIZE);
308
309 addr_wr = writable_address(stepped_addr);
310 probe_kernel_write((char *)addr_wr, (char *)&singlestep_insn,
311 BREAK_INSTR_SIZE);
312 smp_wmb();
313 flush_icache_range(stepped_addr, stepped_addr + BREAK_INSTR_SIZE);
314}
315
316static void undo_single_step(struct pt_regs *regs)
317{
318 unsigned long addr_wr;
319
320 if (stepped_instr == 0)
321 return;
322
323 addr_wr = writable_address(stepped_addr);
324 probe_kernel_write((char *)addr_wr, (char *)&stepped_instr,
325 BREAK_INSTR_SIZE);
326 stepped_instr = 0;
327 smp_wmb();
328 flush_icache_range(stepped_addr, stepped_addr + BREAK_INSTR_SIZE);
329}
330
331/*
332 * Calls linux_debug_hook before the kernel dies. If KGDB is enabled,
333 * then try to fall into the debugger.
334 */
335static int
336kgdb_notify(struct notifier_block *self, unsigned long cmd, void *ptr)
337{
338 int ret;
339 unsigned long flags;
340 struct die_args *args = (struct die_args *)ptr;
341 struct pt_regs *regs = args->regs;
342
343#ifdef CONFIG_KPROBES
344 /*
345 * Return immediately if the kprobes fault notifier has set
346 * DIE_PAGE_FAULT.
347 */
348 if (cmd == DIE_PAGE_FAULT)
349 return NOTIFY_DONE;
350#endif /* CONFIG_KPROBES */
351
352 switch (cmd) {
353 case DIE_BREAK:
354 case DIE_COMPILED_BPT:
355 break;
356 case DIE_SSTEPBP:
357 local_irq_save(flags);
358 kgdb_handle_exception(0, SIGTRAP, 0, regs);
359 local_irq_restore(flags);
360 return NOTIFY_STOP;
361 default:
362 /* Userspace events, ignore. */
363 if (user_mode(regs))
364 return NOTIFY_DONE;
365 }
366
367 local_irq_save(flags);
368 ret = kgdb_handle_exception(args->trapnr, args->signr, args->err, regs);
369 local_irq_restore(flags);
370 if (ret)
371 return NOTIFY_DONE;
372
373 return NOTIFY_STOP;
374}
375
376static struct notifier_block kgdb_notifier = {
377 .notifier_call = kgdb_notify,
378};
379
380/*
381 * kgdb_arch_handle_exception - Handle architecture specific GDB packets.
382 * @vector: The error vector of the exception that happened.
383 * @signo: The signal number of the exception that happened.
384 * @err_code: The error code of the exception that happened.
385 * @remcom_in_buffer: The buffer of the packet we have read.
386 * @remcom_out_buffer: The buffer of %BUFMAX bytes to write a packet into.
387 * @regs: The &struct pt_regs of the current process.
388 *
389 * This function MUST handle the 'c' and 's' command packets,
390 * as well packets to set / remove a hardware breakpoint, if used.
391 * If there are additional packets which the hardware needs to handle,
392 * they are handled here. The code should return -1 if it wants to
393 * process more packets, and a %0 or %1 if it wants to exit from the
394 * kgdb callback.
395 */
396int kgdb_arch_handle_exception(int vector, int signo, int err_code,
397 char *remcom_in_buffer, char *remcom_out_buffer,
398 struct pt_regs *regs)
399{
400 char *ptr;
401 unsigned long address;
402
403 /* Undo any stepping we may have done. */
404 undo_single_step(regs);
405
406 switch (remcom_in_buffer[0]) {
407 case 'c':
408 case 's':
409 case 'D':
410 case 'k':
411 /*
412 * Try to read optional parameter, pc unchanged if no parm.
413 * If this was a compiled-in breakpoint, we need to move
414 * to the next instruction or we will just breakpoint
415 * over and over again.
416 */
417 ptr = &remcom_in_buffer[1];
418 if (kgdb_hex2long(&ptr, &address))
419 regs->pc = address;
420 else if (*(unsigned long *)regs->pc == compiled_bpt)
421 regs->pc += BREAK_INSTR_SIZE;
422
423 if (remcom_in_buffer[0] == 's') {
424 do_single_step(regs);
425 kgdb_single_step = 1;
426 atomic_set(&kgdb_cpu_doing_single_step,
427 raw_smp_processor_id());
428 } else
429 atomic_set(&kgdb_cpu_doing_single_step, -1);
430
431 return 0;
432 }
433
434 return -1; /* this means that we do not want to exit from the handler */
435}
436
437struct kgdb_arch arch_kgdb_ops;
438
439/*
440 * kgdb_arch_init - Perform any architecture specific initalization.
441 *
442 * This function will handle the initalization of any architecture
443 * specific callbacks.
444 */
445int kgdb_arch_init(void)
446{
447 tile_bundle_bits bundle = TILEGX_BPT_BUNDLE;
448
449 memcpy(arch_kgdb_ops.gdb_bpt_instr, &bundle, BREAK_INSTR_SIZE);
450 return register_die_notifier(&kgdb_notifier);
451}
452
453/*
454 * kgdb_arch_exit - Perform any architecture specific uninitalization.
455 *
456 * This function will handle the uninitalization of any architecture
457 * specific callbacks, for dynamic registration and unregistration.
458 */
459void kgdb_arch_exit(void)
460{
461 unregister_die_notifier(&kgdb_notifier);
462}
463
464int kgdb_arch_set_breakpoint(struct kgdb_bkpt *bpt)
465{
466 int err;
467 unsigned long addr_wr = writable_address(bpt->bpt_addr);
468
469 if (addr_wr == 0)
470 return -1;
471
472 err = probe_kernel_read(bpt->saved_instr, (char *)bpt->bpt_addr,
473 BREAK_INSTR_SIZE);
474 if (err)
475 return err;
476
477 err = probe_kernel_write((char *)addr_wr, arch_kgdb_ops.gdb_bpt_instr,
478 BREAK_INSTR_SIZE);
479 smp_wmb();
480 flush_icache_range((unsigned long)bpt->bpt_addr,
481 (unsigned long)bpt->bpt_addr + BREAK_INSTR_SIZE);
482 return err;
483}
484
485int kgdb_arch_remove_breakpoint(struct kgdb_bkpt *bpt)
486{
487 int err;
488 unsigned long addr_wr = writable_address(bpt->bpt_addr);
489
490 if (addr_wr == 0)
491 return -1;
492
493 err = probe_kernel_write((char *)addr_wr, (char *)bpt->saved_instr,
494 BREAK_INSTR_SIZE);
495 smp_wmb();
496 flush_icache_range((unsigned long)bpt->bpt_addr,
497 (unsigned long)bpt->bpt_addr + BREAK_INSTR_SIZE);
498 return err;
499}
diff --git a/arch/tile/kernel/kprobes.c b/arch/tile/kernel/kprobes.c
new file mode 100644
index 000000000000..27cdcacbe81d
--- /dev/null
+++ b/arch/tile/kernel/kprobes.c
@@ -0,0 +1,528 @@
1/*
2 * arch/tile/kernel/kprobes.c
3 * Kprobes on TILE-Gx
4 *
5 * Some portions copied from the MIPS version.
6 *
7 * Copyright (C) IBM Corporation, 2002, 2004
8 * Copyright 2006 Sony Corp.
9 * Copyright 2010 Cavium Networks
10 *
11 * Copyright 2012 Tilera Corporation. All Rights Reserved.
12 *
13 * This program is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU General Public License
15 * as published by the Free Software Foundation, version 2.
16 *
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
20 * NON INFRINGEMENT. See the GNU General Public License for
21 * more details.
22 */
23
24#include <linux/kprobes.h>
25#include <linux/kdebug.h>
26#include <linux/module.h>
27#include <linux/slab.h>
28#include <linux/uaccess.h>
29#include <asm/cacheflush.h>
30
31#include <arch/opcode.h>
32
33DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL;
34DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
35
36tile_bundle_bits breakpoint_insn = TILEGX_BPT_BUNDLE;
37tile_bundle_bits breakpoint2_insn = TILEGX_BPT_BUNDLE | DIE_SSTEPBP;
38
39/*
40 * Check whether instruction is branch or jump, or if executing it
41 * has different results depending on where it is executed (e.g. lnk).
42 */
43static int __kprobes insn_has_control(kprobe_opcode_t insn)
44{
45 if (get_Mode(insn) != 0) { /* Y-format bundle */
46 if (get_Opcode_Y1(insn) != RRR_1_OPCODE_Y1 ||
47 get_RRROpcodeExtension_Y1(insn) != UNARY_RRR_1_OPCODE_Y1)
48 return 0;
49
50 switch (get_UnaryOpcodeExtension_Y1(insn)) {
51 case JALRP_UNARY_OPCODE_Y1:
52 case JALR_UNARY_OPCODE_Y1:
53 case JRP_UNARY_OPCODE_Y1:
54 case JR_UNARY_OPCODE_Y1:
55 case LNK_UNARY_OPCODE_Y1:
56 return 1;
57 default:
58 return 0;
59 }
60 }
61
62 switch (get_Opcode_X1(insn)) {
63 case BRANCH_OPCODE_X1: /* branch instructions */
64 case JUMP_OPCODE_X1: /* jump instructions: j and jal */
65 return 1;
66
67 case RRR_0_OPCODE_X1: /* other jump instructions */
68 if (get_RRROpcodeExtension_X1(insn) != UNARY_RRR_0_OPCODE_X1)
69 return 0;
70 switch (get_UnaryOpcodeExtension_X1(insn)) {
71 case JALRP_UNARY_OPCODE_X1:
72 case JALR_UNARY_OPCODE_X1:
73 case JRP_UNARY_OPCODE_X1:
74 case JR_UNARY_OPCODE_X1:
75 case LNK_UNARY_OPCODE_X1:
76 return 1;
77 default:
78 return 0;
79 }
80 default:
81 return 0;
82 }
83}
84
85int __kprobes arch_prepare_kprobe(struct kprobe *p)
86{
87 unsigned long addr = (unsigned long)p->addr;
88
89 if (addr & (sizeof(kprobe_opcode_t) - 1))
90 return -EINVAL;
91
92 if (insn_has_control(*p->addr)) {
93 pr_notice("Kprobes for control instructions are not "
94 "supported\n");
95 return -EINVAL;
96 }
97
98 /* insn: must be on special executable page on tile. */
99 p->ainsn.insn = get_insn_slot();
100 if (!p->ainsn.insn)
101 return -ENOMEM;
102
103 /*
104 * In the kprobe->ainsn.insn[] array we store the original
105 * instruction at index zero and a break trap instruction at
106 * index one.
107 */
108 memcpy(&p->ainsn.insn[0], p->addr, sizeof(kprobe_opcode_t));
109 p->ainsn.insn[1] = breakpoint2_insn;
110 p->opcode = *p->addr;
111
112 return 0;
113}
114
115void __kprobes arch_arm_kprobe(struct kprobe *p)
116{
117 unsigned long addr_wr;
118
119 /* Operate on writable kernel text mapping. */
120 addr_wr = (unsigned long)p->addr - MEM_SV_START + PAGE_OFFSET;
121
122 if (probe_kernel_write((void *)addr_wr, &breakpoint_insn,
123 sizeof(breakpoint_insn)))
124 pr_err("%s: failed to enable kprobe\n", __func__);
125
126 smp_wmb();
127 flush_insn_slot(p);
128}
129
130void __kprobes arch_disarm_kprobe(struct kprobe *kp)
131{
132 unsigned long addr_wr;
133
134 /* Operate on writable kernel text mapping. */
135 addr_wr = (unsigned long)kp->addr - MEM_SV_START + PAGE_OFFSET;
136
137 if (probe_kernel_write((void *)addr_wr, &kp->opcode,
138 sizeof(kp->opcode)))
139 pr_err("%s: failed to enable kprobe\n", __func__);
140
141 smp_wmb();
142 flush_insn_slot(kp);
143}
144
145void __kprobes arch_remove_kprobe(struct kprobe *p)
146{
147 if (p->ainsn.insn) {
148 free_insn_slot(p->ainsn.insn, 0);
149 p->ainsn.insn = NULL;
150 }
151}
152
153static void __kprobes save_previous_kprobe(struct kprobe_ctlblk *kcb)
154{
155 kcb->prev_kprobe.kp = kprobe_running();
156 kcb->prev_kprobe.status = kcb->kprobe_status;
157 kcb->prev_kprobe.saved_pc = kcb->kprobe_saved_pc;
158}
159
160static void __kprobes restore_previous_kprobe(struct kprobe_ctlblk *kcb)
161{
162 __this_cpu_write(current_kprobe, kcb->prev_kprobe.kp);
163 kcb->kprobe_status = kcb->prev_kprobe.status;
164 kcb->kprobe_saved_pc = kcb->prev_kprobe.saved_pc;
165}
166
167static void __kprobes set_current_kprobe(struct kprobe *p, struct pt_regs *regs,
168 struct kprobe_ctlblk *kcb)
169{
170 __this_cpu_write(current_kprobe, p);
171 kcb->kprobe_saved_pc = regs->pc;
172}
173
174static void __kprobes prepare_singlestep(struct kprobe *p, struct pt_regs *regs)
175{
176 /* Single step inline if the instruction is a break. */
177 if (p->opcode == breakpoint_insn ||
178 p->opcode == breakpoint2_insn)
179 regs->pc = (unsigned long)p->addr;
180 else
181 regs->pc = (unsigned long)&p->ainsn.insn[0];
182}
183
184static int __kprobes kprobe_handler(struct pt_regs *regs)
185{
186 struct kprobe *p;
187 int ret = 0;
188 kprobe_opcode_t *addr;
189 struct kprobe_ctlblk *kcb;
190
191 addr = (kprobe_opcode_t *)regs->pc;
192
193 /*
194 * We don't want to be preempted for the entire
195 * duration of kprobe processing.
196 */
197 preempt_disable();
198 kcb = get_kprobe_ctlblk();
199
200 /* Check we're not actually recursing. */
201 if (kprobe_running()) {
202 p = get_kprobe(addr);
203 if (p) {
204 if (kcb->kprobe_status == KPROBE_HIT_SS &&
205 p->ainsn.insn[0] == breakpoint_insn) {
206 goto no_kprobe;
207 }
208 /*
209 * We have reentered the kprobe_handler(), since
210 * another probe was hit while within the handler.
211 * We here save the original kprobes variables and
212 * just single step on the instruction of the new probe
213 * without calling any user handlers.
214 */
215 save_previous_kprobe(kcb);
216 set_current_kprobe(p, regs, kcb);
217 kprobes_inc_nmissed_count(p);
218 prepare_singlestep(p, regs);
219 kcb->kprobe_status = KPROBE_REENTER;
220 return 1;
221 } else {
222 if (*addr != breakpoint_insn) {
223 /*
224 * The breakpoint instruction was removed by
225 * another cpu right after we hit, no further
226 * handling of this interrupt is appropriate.
227 */
228 ret = 1;
229 goto no_kprobe;
230 }
231 p = __this_cpu_read(current_kprobe);
232 if (p->break_handler && p->break_handler(p, regs))
233 goto ss_probe;
234 }
235 goto no_kprobe;
236 }
237
238 p = get_kprobe(addr);
239 if (!p) {
240 if (*addr != breakpoint_insn) {
241 /*
242 * The breakpoint instruction was removed right
243 * after we hit it. Another cpu has removed
244 * either a probepoint or a debugger breakpoint
245 * at this address. In either case, no further
246 * handling of this interrupt is appropriate.
247 */
248 ret = 1;
249 }
250 /* Not one of ours: let kernel handle it. */
251 goto no_kprobe;
252 }
253
254 set_current_kprobe(p, regs, kcb);
255 kcb->kprobe_status = KPROBE_HIT_ACTIVE;
256
257 if (p->pre_handler && p->pre_handler(p, regs)) {
258 /* Handler has already set things up, so skip ss setup. */
259 return 1;
260 }
261
262ss_probe:
263 prepare_singlestep(p, regs);
264 kcb->kprobe_status = KPROBE_HIT_SS;
265 return 1;
266
267no_kprobe:
268 preempt_enable_no_resched();
269 return ret;
270}
271
272/*
273 * Called after single-stepping. p->addr is the address of the
274 * instruction that has been replaced by the breakpoint. To avoid the
275 * SMP problems that can occur when we temporarily put back the
276 * original opcode to single-step, we single-stepped a copy of the
277 * instruction. The address of this copy is p->ainsn.insn.
278 *
279 * This function prepares to return from the post-single-step
280 * breakpoint trap.
281 */
282static void __kprobes resume_execution(struct kprobe *p,
283 struct pt_regs *regs,
284 struct kprobe_ctlblk *kcb)
285{
286 unsigned long orig_pc = kcb->kprobe_saved_pc;
287 regs->pc = orig_pc + 8;
288}
289
290static inline int post_kprobe_handler(struct pt_regs *regs)
291{
292 struct kprobe *cur = kprobe_running();
293 struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
294
295 if (!cur)
296 return 0;
297
298 if ((kcb->kprobe_status != KPROBE_REENTER) && cur->post_handler) {
299 kcb->kprobe_status = KPROBE_HIT_SSDONE;
300 cur->post_handler(cur, regs, 0);
301 }
302
303 resume_execution(cur, regs, kcb);
304
305 /* Restore back the original saved kprobes variables and continue. */
306 if (kcb->kprobe_status == KPROBE_REENTER) {
307 restore_previous_kprobe(kcb);
308 goto out;
309 }
310 reset_current_kprobe();
311out:
312 preempt_enable_no_resched();
313
314 return 1;
315}
316
317static inline int kprobe_fault_handler(struct pt_regs *regs, int trapnr)
318{
319 struct kprobe *cur = kprobe_running();
320 struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
321
322 if (cur->fault_handler && cur->fault_handler(cur, regs, trapnr))
323 return 1;
324
325 if (kcb->kprobe_status & KPROBE_HIT_SS) {
326 /*
327 * We are here because the instruction being single
328 * stepped caused a page fault. We reset the current
329 * kprobe and the ip points back to the probe address
330 * and allow the page fault handler to continue as a
331 * normal page fault.
332 */
333 resume_execution(cur, regs, kcb);
334 reset_current_kprobe();
335 preempt_enable_no_resched();
336 }
337 return 0;
338}
339
340/*
341 * Wrapper routine for handling exceptions.
342 */
343int __kprobes kprobe_exceptions_notify(struct notifier_block *self,
344 unsigned long val, void *data)
345{
346 struct die_args *args = (struct die_args *)data;
347 int ret = NOTIFY_DONE;
348
349 switch (val) {
350 case DIE_BREAK:
351 if (kprobe_handler(args->regs))
352 ret = NOTIFY_STOP;
353 break;
354 case DIE_SSTEPBP:
355 if (post_kprobe_handler(args->regs))
356 ret = NOTIFY_STOP;
357 break;
358 case DIE_PAGE_FAULT:
359 /* kprobe_running() needs smp_processor_id(). */
360 preempt_disable();
361
362 if (kprobe_running()
363 && kprobe_fault_handler(args->regs, args->trapnr))
364 ret = NOTIFY_STOP;
365 preempt_enable();
366 break;
367 default:
368 break;
369 }
370 return ret;
371}
372
373int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
374{
375 struct jprobe *jp = container_of(p, struct jprobe, kp);
376 struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
377
378 kcb->jprobe_saved_regs = *regs;
379 kcb->jprobe_saved_sp = regs->sp;
380
381 memcpy(kcb->jprobes_stack, (void *)kcb->jprobe_saved_sp,
382 MIN_JPROBES_STACK_SIZE(kcb->jprobe_saved_sp));
383
384 regs->pc = (unsigned long)(jp->entry);
385
386 return 1;
387}
388
389/* Defined in the inline asm below. */
390void jprobe_return_end(void);
391
392void __kprobes jprobe_return(void)
393{
394 asm volatile(
395 "bpt\n\t"
396 ".globl jprobe_return_end\n"
397 "jprobe_return_end:\n");
398}
399
400int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
401{
402 struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
403
404 if (regs->pc >= (unsigned long)jprobe_return &&
405 regs->pc <= (unsigned long)jprobe_return_end) {
406 *regs = kcb->jprobe_saved_regs;
407 memcpy((void *)kcb->jprobe_saved_sp, kcb->jprobes_stack,
408 MIN_JPROBES_STACK_SIZE(kcb->jprobe_saved_sp));
409 preempt_enable_no_resched();
410
411 return 1;
412 }
413 return 0;
414}
415
416/*
417 * Function return probe trampoline:
418 * - init_kprobes() establishes a probepoint here
419 * - When the probed function returns, this probe causes the
420 * handlers to fire
421 */
422static void __used kretprobe_trampoline_holder(void)
423{
424 asm volatile(
425 "nop\n\t"
426 ".global kretprobe_trampoline\n"
427 "kretprobe_trampoline:\n\t"
428 "nop\n\t"
429 : : : "memory");
430}
431
432void kretprobe_trampoline(void);
433
434void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri,
435 struct pt_regs *regs)
436{
437 ri->ret_addr = (kprobe_opcode_t *) regs->lr;
438
439 /* Replace the return addr with trampoline addr */
440 regs->lr = (unsigned long)kretprobe_trampoline;
441}
442
443/*
444 * Called when the probe at kretprobe trampoline is hit.
445 */
446static int __kprobes trampoline_probe_handler(struct kprobe *p,
447 struct pt_regs *regs)
448{
449 struct kretprobe_instance *ri = NULL;
450 struct hlist_head *head, empty_rp;
451 struct hlist_node *tmp;
452 unsigned long flags, orig_ret_address = 0;
453 unsigned long trampoline_address = (unsigned long)kretprobe_trampoline;
454
455 INIT_HLIST_HEAD(&empty_rp);
456 kretprobe_hash_lock(current, &head, &flags);
457
458 /*
459 * It is possible to have multiple instances associated with a given
460 * task either because multiple functions in the call path have
461 * a return probe installed on them, and/or more than one return
462 * return probe was registered for a target function.
463 *
464 * We can handle this because:
465 * - instances are always inserted at the head of the list
466 * - when multiple return probes are registered for the same
467 * function, the first instance's ret_addr will point to the
468 * real return address, and all the rest will point to
469 * kretprobe_trampoline
470 */
471 hlist_for_each_entry_safe(ri, tmp, head, hlist) {
472 if (ri->task != current)
473 /* another task is sharing our hash bucket */
474 continue;
475
476 if (ri->rp && ri->rp->handler)
477 ri->rp->handler(ri, regs);
478
479 orig_ret_address = (unsigned long)ri->ret_addr;
480 recycle_rp_inst(ri, &empty_rp);
481
482 if (orig_ret_address != trampoline_address) {
483 /*
484 * This is the real return address. Any other
485 * instances associated with this task are for
486 * other calls deeper on the call stack
487 */
488 break;
489 }
490 }
491
492 kretprobe_assert(ri, orig_ret_address, trampoline_address);
493 instruction_pointer(regs) = orig_ret_address;
494
495 reset_current_kprobe();
496 kretprobe_hash_unlock(current, &flags);
497 preempt_enable_no_resched();
498
499 hlist_for_each_entry_safe(ri, tmp, &empty_rp, hlist) {
500 hlist_del(&ri->hlist);
501 kfree(ri);
502 }
503 /*
504 * By returning a non-zero value, we are telling
505 * kprobe_handler() that we don't want the post_handler
506 * to run (and have re-enabled preemption)
507 */
508 return 1;
509}
510
511int __kprobes arch_trampoline_kprobe(struct kprobe *p)
512{
513 if (p->addr == (kprobe_opcode_t *)kretprobe_trampoline)
514 return 1;
515
516 return 0;
517}
518
519static struct kprobe trampoline_p = {
520 .addr = (kprobe_opcode_t *)kretprobe_trampoline,
521 .pre_handler = trampoline_probe_handler
522};
523
524int __init arch_init_kprobes(void)
525{
526 register_kprobe(&trampoline_p);
527 return 0;
528}
diff --git a/arch/tile/kernel/mcount_64.S b/arch/tile/kernel/mcount_64.S
new file mode 100644
index 000000000000..70d7bb0c4d8f
--- /dev/null
+++ b/arch/tile/kernel/mcount_64.S
@@ -0,0 +1,224 @@
1/*
2 * Copyright 2012 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 *
14 * TILE-Gx specific __mcount support
15 */
16
17#include <linux/linkage.h>
18#include <asm/ftrace.h>
19
20#define REGSIZE 8
21
22 .text
23 .global __mcount
24
25 .macro MCOUNT_SAVE_REGS
26 addli sp, sp, -REGSIZE
27 {
28 st sp, lr
29 addli r29, sp, - (12 * REGSIZE)
30 }
31 {
32 addli sp, sp, - (13 * REGSIZE)
33 st r29, sp
34 }
35 addli r29, r29, REGSIZE
36 { st r29, r0; addli r29, r29, REGSIZE }
37 { st r29, r1; addli r29, r29, REGSIZE }
38 { st r29, r2; addli r29, r29, REGSIZE }
39 { st r29, r3; addli r29, r29, REGSIZE }
40 { st r29, r4; addli r29, r29, REGSIZE }
41 { st r29, r5; addli r29, r29, REGSIZE }
42 { st r29, r6; addli r29, r29, REGSIZE }
43 { st r29, r7; addli r29, r29, REGSIZE }
44 { st r29, r8; addli r29, r29, REGSIZE }
45 { st r29, r9; addli r29, r29, REGSIZE }
46 { st r29, r10; addli r29, r29, REGSIZE }
47 .endm
48
49 .macro MCOUNT_RESTORE_REGS
50 addli r29, sp, (2 * REGSIZE)
51 { ld r0, r29; addli r29, r29, REGSIZE }
52 { ld r1, r29; addli r29, r29, REGSIZE }
53 { ld r2, r29; addli r29, r29, REGSIZE }
54 { ld r3, r29; addli r29, r29, REGSIZE }
55 { ld r4, r29; addli r29, r29, REGSIZE }
56 { ld r5, r29; addli r29, r29, REGSIZE }
57 { ld r6, r29; addli r29, r29, REGSIZE }
58 { ld r7, r29; addli r29, r29, REGSIZE }
59 { ld r8, r29; addli r29, r29, REGSIZE }
60 { ld r9, r29; addli r29, r29, REGSIZE }
61 { ld r10, r29; addli lr, sp, (13 * REGSIZE) }
62 { ld lr, lr; addli sp, sp, (14 * REGSIZE) }
63 .endm
64
65 .macro RETURN_BACK
66 { move r12, lr; move lr, r10 }
67 jrp r12
68 .endm
69
70#ifdef CONFIG_DYNAMIC_FTRACE
71
72 .align 64
73STD_ENTRY(__mcount)
74__mcount:
75 j ftrace_stub
76STD_ENDPROC(__mcount)
77
78 .align 64
79STD_ENTRY(ftrace_caller)
80 moveli r11, hw2_last(function_trace_stop)
81 { shl16insli r11, r11, hw1(function_trace_stop); move r12, lr }
82 { shl16insli r11, r11, hw0(function_trace_stop); move lr, r10 }
83 ld r11, r11
84 beqz r11, 1f
85 jrp r12
86
871:
88 { move r10, lr; move lr, r12 }
89 MCOUNT_SAVE_REGS
90
91 /* arg1: self return address */
92 /* arg2: parent's return address */
93 { move r0, lr; move r1, r10 }
94
95 .global ftrace_call
96ftrace_call:
97 /*
98 * a placeholder for the call to a real tracing function, i.e.
99 * ftrace_trace_function()
100 */
101 nop
102
103#ifdef CONFIG_FUNCTION_GRAPH_TRACER
104 .global ftrace_graph_call
105ftrace_graph_call:
106 /*
107 * a placeholder for the call to a real tracing function, i.e.
108 * ftrace_graph_caller()
109 */
110 nop
111#endif
112 MCOUNT_RESTORE_REGS
113 .global ftrace_stub
114ftrace_stub:
115 RETURN_BACK
116STD_ENDPROC(ftrace_caller)
117
118#else /* ! CONFIG_DYNAMIC_FTRACE */
119
120 .align 64
121STD_ENTRY(__mcount)
122 moveli r11, hw2_last(function_trace_stop)
123 { shl16insli r11, r11, hw1(function_trace_stop); move r12, lr }
124 { shl16insli r11, r11, hw0(function_trace_stop); move lr, r10 }
125 ld r11, r11
126 beqz r11, 1f
127 jrp r12
128
1291:
130 { move r10, lr; move lr, r12 }
131 {
132 moveli r11, hw2_last(ftrace_trace_function)
133 moveli r13, hw2_last(ftrace_stub)
134 }
135 {
136 shl16insli r11, r11, hw1(ftrace_trace_function)
137 shl16insli r13, r13, hw1(ftrace_stub)
138 }
139 {
140 shl16insli r11, r11, hw0(ftrace_trace_function)
141 shl16insli r13, r13, hw0(ftrace_stub)
142 }
143
144 ld r11, r11
145 sub r14, r13, r11
146 bnez r14, static_trace
147
148#ifdef CONFIG_FUNCTION_GRAPH_TRACER
149 moveli r15, hw2_last(ftrace_graph_return)
150 shl16insli r15, r15, hw1(ftrace_graph_return)
151 shl16insli r15, r15, hw0(ftrace_graph_return)
152 ld r15, r15
153 sub r15, r15, r13
154 bnez r15, ftrace_graph_caller
155
156 {
157 moveli r16, hw2_last(ftrace_graph_entry)
158 moveli r17, hw2_last(ftrace_graph_entry_stub)
159 }
160 {
161 shl16insli r16, r16, hw1(ftrace_graph_entry)
162 shl16insli r17, r17, hw1(ftrace_graph_entry_stub)
163 }
164 {
165 shl16insli r16, r16, hw0(ftrace_graph_entry)
166 shl16insli r17, r17, hw0(ftrace_graph_entry_stub)
167 }
168 ld r16, r16
169 sub r17, r16, r17
170 bnez r17, ftrace_graph_caller
171
172#endif
173 RETURN_BACK
174
175static_trace:
176 MCOUNT_SAVE_REGS
177
178 /* arg1: self return address */
179 /* arg2: parent's return address */
180 { move r0, lr; move r1, r10 }
181
182 /* call ftrace_trace_function() */
183 jalr r11
184
185 MCOUNT_RESTORE_REGS
186
187 .global ftrace_stub
188ftrace_stub:
189 RETURN_BACK
190STD_ENDPROC(__mcount)
191
192#endif /* ! CONFIG_DYNAMIC_FTRACE */
193
194#ifdef CONFIG_FUNCTION_GRAPH_TRACER
195
196STD_ENTRY(ftrace_graph_caller)
197ftrace_graph_caller:
198#ifndef CONFIG_DYNAMIC_FTRACE
199 MCOUNT_SAVE_REGS
200#endif
201
202 /* arg1: Get the location of the parent's return address */
203 addi r0, sp, 12 * REGSIZE
204 /* arg2: Get self return address */
205 move r1, lr
206
207 jal prepare_ftrace_return
208
209 MCOUNT_RESTORE_REGS
210 RETURN_BACK
211STD_ENDPROC(ftrace_graph_caller)
212
213 .global return_to_handler
214return_to_handler:
215 MCOUNT_SAVE_REGS
216
217 jal ftrace_return_to_handler
218 /* restore the real parent address */
219 move r11, r0
220
221 MCOUNT_RESTORE_REGS
222 jr r11
223
224#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
diff --git a/arch/tile/kernel/pci-dma.c b/arch/tile/kernel/pci-dma.c
index b9fe80ec1089..09b58703ac26 100644
--- a/arch/tile/kernel/pci-dma.c
+++ b/arch/tile/kernel/pci-dma.c
@@ -36,8 +36,9 @@ static void *tile_dma_alloc_coherent(struct device *dev, size_t size,
36 dma_addr_t *dma_handle, gfp_t gfp, 36 dma_addr_t *dma_handle, gfp_t gfp,
37 struct dma_attrs *attrs) 37 struct dma_attrs *attrs)
38{ 38{
39 u64 dma_mask = dev->coherent_dma_mask ?: DMA_BIT_MASK(32); 39 u64 dma_mask = (dev && dev->coherent_dma_mask) ?
40 int node = dev_to_node(dev); 40 dev->coherent_dma_mask : DMA_BIT_MASK(32);
41 int node = dev ? dev_to_node(dev) : 0;
41 int order = get_order(size); 42 int order = get_order(size);
42 struct page *pg; 43 struct page *pg;
43 dma_addr_t addr; 44 dma_addr_t addr;
@@ -256,7 +257,7 @@ static void tile_dma_unmap_page(struct device *dev, dma_addr_t dma_address,
256 BUG_ON(!valid_dma_direction(direction)); 257 BUG_ON(!valid_dma_direction(direction));
257 258
258 __dma_complete_page(pfn_to_page(PFN_DOWN(dma_address)), 259 __dma_complete_page(pfn_to_page(PFN_DOWN(dma_address)),
259 dma_address & PAGE_OFFSET, size, direction); 260 dma_address & (PAGE_SIZE - 1), size, direction);
260} 261}
261 262
262static void tile_dma_sync_single_for_cpu(struct device *dev, 263static void tile_dma_sync_single_for_cpu(struct device *dev,
@@ -357,7 +358,7 @@ static void *tile_pci_dma_alloc_coherent(struct device *dev, size_t size,
357 358
358 addr = page_to_phys(pg); 359 addr = page_to_phys(pg);
359 360
360 *dma_handle = phys_to_dma(dev, addr); 361 *dma_handle = addr + get_dma_offset(dev);
361 362
362 return page_address(pg); 363 return page_address(pg);
363} 364}
@@ -387,7 +388,7 @@ static int tile_pci_dma_map_sg(struct device *dev, struct scatterlist *sglist,
387 sg->dma_address = sg_phys(sg); 388 sg->dma_address = sg_phys(sg);
388 __dma_prep_pa_range(sg->dma_address, sg->length, direction); 389 __dma_prep_pa_range(sg->dma_address, sg->length, direction);
389 390
390 sg->dma_address = phys_to_dma(dev, sg->dma_address); 391 sg->dma_address = sg->dma_address + get_dma_offset(dev);
391#ifdef CONFIG_NEED_SG_DMA_LENGTH 392#ifdef CONFIG_NEED_SG_DMA_LENGTH
392 sg->dma_length = sg->length; 393 sg->dma_length = sg->length;
393#endif 394#endif
@@ -422,7 +423,7 @@ static dma_addr_t tile_pci_dma_map_page(struct device *dev, struct page *page,
422 BUG_ON(offset + size > PAGE_SIZE); 423 BUG_ON(offset + size > PAGE_SIZE);
423 __dma_prep_page(page, offset, size, direction); 424 __dma_prep_page(page, offset, size, direction);
424 425
425 return phys_to_dma(dev, page_to_pa(page) + offset); 426 return page_to_pa(page) + offset + get_dma_offset(dev);
426} 427}
427 428
428static void tile_pci_dma_unmap_page(struct device *dev, dma_addr_t dma_address, 429static void tile_pci_dma_unmap_page(struct device *dev, dma_addr_t dma_address,
@@ -432,10 +433,10 @@ static void tile_pci_dma_unmap_page(struct device *dev, dma_addr_t dma_address,
432{ 433{
433 BUG_ON(!valid_dma_direction(direction)); 434 BUG_ON(!valid_dma_direction(direction));
434 435
435 dma_address = dma_to_phys(dev, dma_address); 436 dma_address -= get_dma_offset(dev);
436 437
437 __dma_complete_page(pfn_to_page(PFN_DOWN(dma_address)), 438 __dma_complete_page(pfn_to_page(PFN_DOWN(dma_address)),
438 dma_address & PAGE_OFFSET, size, direction); 439 dma_address & (PAGE_SIZE - 1), size, direction);
439} 440}
440 441
441static void tile_pci_dma_sync_single_for_cpu(struct device *dev, 442static void tile_pci_dma_sync_single_for_cpu(struct device *dev,
@@ -445,7 +446,7 @@ static void tile_pci_dma_sync_single_for_cpu(struct device *dev,
445{ 446{
446 BUG_ON(!valid_dma_direction(direction)); 447 BUG_ON(!valid_dma_direction(direction));
447 448
448 dma_handle = dma_to_phys(dev, dma_handle); 449 dma_handle -= get_dma_offset(dev);
449 450
450 __dma_complete_pa_range(dma_handle, size, direction); 451 __dma_complete_pa_range(dma_handle, size, direction);
451} 452}
@@ -456,7 +457,7 @@ static void tile_pci_dma_sync_single_for_device(struct device *dev,
456 enum dma_data_direction 457 enum dma_data_direction
457 direction) 458 direction)
458{ 459{
459 dma_handle = dma_to_phys(dev, dma_handle); 460 dma_handle -= get_dma_offset(dev);
460 461
461 __dma_prep_pa_range(dma_handle, size, direction); 462 __dma_prep_pa_range(dma_handle, size, direction);
462} 463}
@@ -558,22 +559,47 @@ static struct dma_map_ops pci_swiotlb_dma_ops = {
558 .mapping_error = swiotlb_dma_mapping_error, 559 .mapping_error = swiotlb_dma_mapping_error,
559}; 560};
560 561
562static struct dma_map_ops pci_hybrid_dma_ops = {
563 .alloc = tile_swiotlb_alloc_coherent,
564 .free = tile_swiotlb_free_coherent,
565 .map_page = tile_pci_dma_map_page,
566 .unmap_page = tile_pci_dma_unmap_page,
567 .map_sg = tile_pci_dma_map_sg,
568 .unmap_sg = tile_pci_dma_unmap_sg,
569 .sync_single_for_cpu = tile_pci_dma_sync_single_for_cpu,
570 .sync_single_for_device = tile_pci_dma_sync_single_for_device,
571 .sync_sg_for_cpu = tile_pci_dma_sync_sg_for_cpu,
572 .sync_sg_for_device = tile_pci_dma_sync_sg_for_device,
573 .mapping_error = tile_pci_dma_mapping_error,
574 .dma_supported = tile_pci_dma_supported
575};
576
561struct dma_map_ops *gx_legacy_pci_dma_map_ops = &pci_swiotlb_dma_ops; 577struct dma_map_ops *gx_legacy_pci_dma_map_ops = &pci_swiotlb_dma_ops;
578struct dma_map_ops *gx_hybrid_pci_dma_map_ops = &pci_hybrid_dma_ops;
562#else 579#else
563struct dma_map_ops *gx_legacy_pci_dma_map_ops; 580struct dma_map_ops *gx_legacy_pci_dma_map_ops;
581struct dma_map_ops *gx_hybrid_pci_dma_map_ops;
564#endif 582#endif
565EXPORT_SYMBOL(gx_legacy_pci_dma_map_ops); 583EXPORT_SYMBOL(gx_legacy_pci_dma_map_ops);
584EXPORT_SYMBOL(gx_hybrid_pci_dma_map_ops);
566 585
567#ifdef CONFIG_ARCH_HAS_DMA_SET_COHERENT_MASK 586#ifdef CONFIG_ARCH_HAS_DMA_SET_COHERENT_MASK
568int dma_set_coherent_mask(struct device *dev, u64 mask) 587int dma_set_coherent_mask(struct device *dev, u64 mask)
569{ 588{
570 struct dma_map_ops *dma_ops = get_dma_ops(dev); 589 struct dma_map_ops *dma_ops = get_dma_ops(dev);
571 590
572 /* Handle legacy PCI devices with limited memory addressability. */ 591 /*
573 if (((dma_ops == gx_pci_dma_map_ops) || 592 * For PCI devices with 64-bit DMA addressing capability, promote
574 (dma_ops == gx_legacy_pci_dma_map_ops)) && 593 * the dma_ops to full capability for both streams and consistent
575 (mask <= DMA_BIT_MASK(32))) { 594 * memory access. For 32-bit capable devices, limit the consistent
576 if (mask > dev->archdata.max_direct_dma_addr) 595 * memory DMA range to max_direct_dma_addr.
596 */
597 if (dma_ops == gx_pci_dma_map_ops ||
598 dma_ops == gx_hybrid_pci_dma_map_ops ||
599 dma_ops == gx_legacy_pci_dma_map_ops) {
600 if (mask == DMA_BIT_MASK(64))
601 set_dma_ops(dev, gx_pci_dma_map_ops);
602 else if (mask > dev->archdata.max_direct_dma_addr)
577 mask = dev->archdata.max_direct_dma_addr; 603 mask = dev->archdata.max_direct_dma_addr;
578 } 604 }
579 605
@@ -584,3 +610,21 @@ int dma_set_coherent_mask(struct device *dev, u64 mask)
584} 610}
585EXPORT_SYMBOL(dma_set_coherent_mask); 611EXPORT_SYMBOL(dma_set_coherent_mask);
586#endif 612#endif
613
614#ifdef ARCH_HAS_DMA_GET_REQUIRED_MASK
615/*
616 * The generic dma_get_required_mask() uses the highest physical address
617 * (max_pfn) to provide the hint to the PCI drivers regarding 32-bit or
618 * 64-bit DMA configuration. Since TILEGx has I/O TLB/MMU, allowing the
619 * DMAs to use the full 64-bit PCI address space and not limited by
620 * the physical memory space, we always let the PCI devices use
621 * 64-bit DMA if they have that capability, by returning the 64-bit
622 * DMA mask here. The device driver has the option to use 32-bit DMA if
623 * the device is not capable of 64-bit DMA.
624 */
625u64 dma_get_required_mask(struct device *dev)
626{
627 return DMA_BIT_MASK(64);
628}
629EXPORT_SYMBOL_GPL(dma_get_required_mask);
630#endif
diff --git a/arch/tile/kernel/pci.c b/arch/tile/kernel/pci.c
index 67237d34c2e2..b7180e6e900d 100644
--- a/arch/tile/kernel/pci.c
+++ b/arch/tile/kernel/pci.c
@@ -20,7 +20,6 @@
20#include <linux/capability.h> 20#include <linux/capability.h>
21#include <linux/sched.h> 21#include <linux/sched.h>
22#include <linux/errno.h> 22#include <linux/errno.h>
23#include <linux/bootmem.h>
24#include <linux/irq.h> 23#include <linux/irq.h>
25#include <linux/io.h> 24#include <linux/io.h>
26#include <linux/uaccess.h> 25#include <linux/uaccess.h>
@@ -52,6 +51,8 @@
52 * 51 *
53 */ 52 */
54 53
54static int pci_probe = 1;
55
55/* 56/*
56 * This flag tells if the platform is TILEmpower that needs 57 * This flag tells if the platform is TILEmpower that needs
57 * special configuration for the PLX switch chip. 58 * special configuration for the PLX switch chip.
@@ -144,6 +145,11 @@ int __init tile_pci_init(void)
144{ 145{
145 int i; 146 int i;
146 147
148 if (!pci_probe) {
149 pr_info("PCI: disabled by boot argument\n");
150 return 0;
151 }
152
147 pr_info("PCI: Searching for controllers...\n"); 153 pr_info("PCI: Searching for controllers...\n");
148 154
149 /* Re-init number of PCIe controllers to support hot-plug feature. */ 155 /* Re-init number of PCIe controllers to support hot-plug feature. */
@@ -192,7 +198,6 @@ int __init tile_pci_init(void)
192 controller->hv_cfg_fd[0] = hv_cfg_fd0; 198 controller->hv_cfg_fd[0] = hv_cfg_fd0;
193 controller->hv_cfg_fd[1] = hv_cfg_fd1; 199 controller->hv_cfg_fd[1] = hv_cfg_fd1;
194 controller->hv_mem_fd = hv_mem_fd; 200 controller->hv_mem_fd = hv_mem_fd;
195 controller->first_busno = 0;
196 controller->last_busno = 0xff; 201 controller->last_busno = 0xff;
197 controller->ops = &tile_cfg_ops; 202 controller->ops = &tile_cfg_ops;
198 203
@@ -283,7 +288,7 @@ int __init pcibios_init(void)
283 * known to require at least 20ms here, but we use a more 288 * known to require at least 20ms here, but we use a more
284 * conservative value. 289 * conservative value.
285 */ 290 */
286 mdelay(250); 291 msleep(250);
287 292
288 /* Scan all of the recorded PCI controllers. */ 293 /* Scan all of the recorded PCI controllers. */
289 for (i = 0; i < TILE_NUM_PCIE; i++) { 294 for (i = 0; i < TILE_NUM_PCIE; i++) {
@@ -304,18 +309,10 @@ int __init pcibios_init(void)
304 309
305 pr_info("PCI: initializing controller #%d\n", i); 310 pr_info("PCI: initializing controller #%d\n", i);
306 311
307 /*
308 * This comes from the generic Linux PCI driver.
309 *
310 * It reads the PCI tree for this bus into the Linux
311 * data structures.
312 *
313 * This is inlined in linux/pci.h and calls into
314 * pci_scan_bus_parented() in probe.c.
315 */
316 pci_add_resource(&resources, &ioport_resource); 312 pci_add_resource(&resources, &ioport_resource);
317 pci_add_resource(&resources, &iomem_resource); 313 pci_add_resource(&resources, &iomem_resource);
318 bus = pci_scan_root_bus(NULL, 0, controller->ops, controller, &resources); 314 bus = pci_scan_root_bus(NULL, 0, controller->ops,
315 controller, &resources);
319 controller->root_bus = bus; 316 controller->root_bus = bus;
320 controller->last_busno = bus->busn_res.end; 317 controller->last_busno = bus->busn_res.end;
321 } 318 }
@@ -388,6 +385,16 @@ void pcibios_set_master(struct pci_dev *dev)
388 /* No special bus mastering setup handling. */ 385 /* No special bus mastering setup handling. */
389} 386}
390 387
388/* Process any "pci=" kernel boot arguments. */
389char *__init pcibios_setup(char *str)
390{
391 if (!strcmp(str, "off")) {
392 pci_probe = 0;
393 return NULL;
394 }
395 return str;
396}
397
391/* 398/*
392 * Enable memory and/or address decoding, as appropriate, for the 399 * Enable memory and/or address decoding, as appropriate, for the
393 * device described by the 'dev' struct. 400 * device described by the 'dev' struct.
diff --git a/arch/tile/kernel/pci_gx.c b/arch/tile/kernel/pci_gx.c
index 11425633b2d7..a97a6452b812 100644
--- a/arch/tile/kernel/pci_gx.c
+++ b/arch/tile/kernel/pci_gx.c
@@ -69,19 +69,32 @@ static int pcie_rc[TILEGX_NUM_TRIO][TILEGX_TRIO_PCIES];
69 * a HW PCIe link-training bug. The exact delay is specified with 69 * a HW PCIe link-training bug. The exact delay is specified with
70 * a kernel boot argument in the form of "pcie_rc_delay=T,P,S", 70 * a kernel boot argument in the form of "pcie_rc_delay=T,P,S",
71 * where T is the TRIO instance number, P is the port number and S is 71 * where T is the TRIO instance number, P is the port number and S is
72 * the delay in seconds. If the delay is not provided, the value 72 * the delay in seconds. If the argument is specified, but the delay is
73 * will be DEFAULT_RC_DELAY. 73 * not provided, the value will be DEFAULT_RC_DELAY.
74 */ 74 */
75static int rc_delay[TILEGX_NUM_TRIO][TILEGX_TRIO_PCIES]; 75static int rc_delay[TILEGX_NUM_TRIO][TILEGX_TRIO_PCIES];
76 76
77/* Default number of seconds that the PCIe RC port probe can be delayed. */ 77/* Default number of seconds that the PCIe RC port probe can be delayed. */
78#define DEFAULT_RC_DELAY 10 78#define DEFAULT_RC_DELAY 10
79 79
80/* Max number of seconds that the PCIe RC port probe can be delayed. */ 80/* The PCI I/O space size in each PCI domain. */
81#define MAX_RC_DELAY 20 81#define IO_SPACE_SIZE 0x10000
82
83/* Provide shorter versions of some very long constant names. */
84#define AUTO_CONFIG_RC \
85 TRIO_PCIE_INTFC_PORT_CONFIG__STRAP_STATE_VAL_AUTO_CONFIG_RC
86#define AUTO_CONFIG_RC_G1 \
87 TRIO_PCIE_INTFC_PORT_CONFIG__STRAP_STATE_VAL_AUTO_CONFIG_RC_G1
88#define AUTO_CONFIG_EP \
89 TRIO_PCIE_INTFC_PORT_CONFIG__STRAP_STATE_VAL_AUTO_CONFIG_ENDPOINT
90#define AUTO_CONFIG_EP_G1 \
91 TRIO_PCIE_INTFC_PORT_CONFIG__STRAP_STATE_VAL_AUTO_CONFIG_ENDPOINT_G1
82 92
83/* Array of the PCIe ports configuration info obtained from the BIB. */ 93/* Array of the PCIe ports configuration info obtained from the BIB. */
84struct pcie_port_property pcie_ports[TILEGX_NUM_TRIO][TILEGX_TRIO_PCIES]; 94struct pcie_trio_ports_property pcie_ports[TILEGX_NUM_TRIO];
95
96/* Number of configured TRIO instances. */
97int num_trio_shims;
85 98
86/* All drivers share the TRIO contexts defined here. */ 99/* All drivers share the TRIO contexts defined here. */
87gxio_trio_context_t trio_contexts[TILEGX_NUM_TRIO]; 100gxio_trio_context_t trio_contexts[TILEGX_NUM_TRIO];
@@ -89,24 +102,21 @@ gxio_trio_context_t trio_contexts[TILEGX_NUM_TRIO];
89/* Pointer to an array of PCIe RC controllers. */ 102/* Pointer to an array of PCIe RC controllers. */
90struct pci_controller pci_controllers[TILEGX_NUM_TRIO * TILEGX_TRIO_PCIES]; 103struct pci_controller pci_controllers[TILEGX_NUM_TRIO * TILEGX_TRIO_PCIES];
91int num_rc_controllers; 104int num_rc_controllers;
92static int num_ep_controllers;
93 105
94static struct pci_ops tile_cfg_ops; 106static struct pci_ops tile_cfg_ops;
95 107
96/* Mask of CPUs that should receive PCIe interrupts. */ 108/* Mask of CPUs that should receive PCIe interrupts. */
97static struct cpumask intr_cpus_map; 109static struct cpumask intr_cpus_map;
98 110
99/* 111/* We don't need to worry about the alignment of resources. */
100 * We don't need to worry about the alignment of resources.
101 */
102resource_size_t pcibios_align_resource(void *data, const struct resource *res, 112resource_size_t pcibios_align_resource(void *data, const struct resource *res,
103 resource_size_t size, resource_size_t align) 113 resource_size_t size,
114 resource_size_t align)
104{ 115{
105 return res->start; 116 return res->start;
106} 117}
107EXPORT_SYMBOL(pcibios_align_resource); 118EXPORT_SYMBOL(pcibios_align_resource);
108 119
109
110/* 120/*
111 * Pick a CPU to receive and handle the PCIe interrupts, based on the IRQ #. 121 * Pick a CPU to receive and handle the PCIe interrupts, based on the IRQ #.
112 * For now, we simply send interrupts to non-dataplane CPUs. 122 * For now, we simply send interrupts to non-dataplane CPUs.
@@ -134,24 +144,19 @@ static int tile_irq_cpu(int irq)
134 return cpu; 144 return cpu;
135} 145}
136 146
137/* 147/* Open a file descriptor to the TRIO shim. */
138 * Open a file descriptor to the TRIO shim.
139 */
140static int tile_pcie_open(int trio_index) 148static int tile_pcie_open(int trio_index)
141{ 149{
142 gxio_trio_context_t *context = &trio_contexts[trio_index]; 150 gxio_trio_context_t *context = &trio_contexts[trio_index];
143 int ret; 151 int ret;
152 int mac;
144 153
145 /* 154 /* This opens a file descriptor to the TRIO shim. */
146 * This opens a file descriptor to the TRIO shim.
147 */
148 ret = gxio_trio_init(context, trio_index); 155 ret = gxio_trio_init(context, trio_index);
149 if (ret < 0) 156 if (ret < 0)
150 return ret; 157 goto gxio_trio_init_failure;
151 158
152 /* 159 /* Allocate an ASID for the kernel. */
153 * Allocate an ASID for the kernel.
154 */
155 ret = gxio_trio_alloc_asids(context, 1, 0, 0); 160 ret = gxio_trio_alloc_asids(context, 1, 0, 0);
156 if (ret < 0) { 161 if (ret < 0) {
157 pr_err("PCI: ASID alloc failure on TRIO %d, give up\n", 162 pr_err("PCI: ASID alloc failure on TRIO %d, give up\n",
@@ -189,31 +194,97 @@ static int tile_pcie_open(int trio_index)
189 } 194 }
190#endif 195#endif
191 196
197 /* Get the properties of the PCIe ports on this TRIO instance. */
198 ret = gxio_trio_get_port_property(context, &pcie_ports[trio_index]);
199 if (ret < 0) {
200 pr_err("PCI: PCIE_GET_PORT_PROPERTY failure, error %d,"
201 " on TRIO %d\n", ret, trio_index);
202 goto get_port_property_failure;
203 }
204
205 context->mmio_base_mac =
206 iorpc_ioremap(context->fd, 0, HV_TRIO_CONFIG_IOREMAP_SIZE);
207 if (context->mmio_base_mac == NULL) {
208 pr_err("PCI: TRIO config space mapping failure, error %d,"
209 " on TRIO %d\n", ret, trio_index);
210 ret = -ENOMEM;
211
212 goto trio_mmio_mapping_failure;
213 }
214
215 /* Check the port strap state which will override the BIB setting. */
216 for (mac = 0; mac < TILEGX_TRIO_PCIES; mac++) {
217 TRIO_PCIE_INTFC_PORT_CONFIG_t port_config;
218 unsigned int reg_offset;
219
220 /* Ignore ports that are not specified in the BIB. */
221 if (!pcie_ports[trio_index].ports[mac].allow_rc &&
222 !pcie_ports[trio_index].ports[mac].allow_ep)
223 continue;
224
225 reg_offset =
226 (TRIO_PCIE_INTFC_PORT_CONFIG <<
227 TRIO_CFG_REGION_ADDR__REG_SHIFT) |
228 (TRIO_CFG_REGION_ADDR__INTFC_VAL_MAC_INTERFACE <<
229 TRIO_CFG_REGION_ADDR__INTFC_SHIFT) |
230 (mac << TRIO_CFG_REGION_ADDR__MAC_SEL_SHIFT);
231
232 port_config.word =
233 __gxio_mmio_read(context->mmio_base_mac + reg_offset);
234
235 if (port_config.strap_state != AUTO_CONFIG_RC &&
236 port_config.strap_state != AUTO_CONFIG_RC_G1) {
237 /*
238 * If this is really intended to be an EP port, record
239 * it so that the endpoint driver will know about it.
240 */
241 if (port_config.strap_state == AUTO_CONFIG_EP ||
242 port_config.strap_state == AUTO_CONFIG_EP_G1)
243 pcie_ports[trio_index].ports[mac].allow_ep = 1;
244 }
245 }
246
192 return ret; 247 return ret;
193 248
249trio_mmio_mapping_failure:
250get_port_property_failure:
194asid_alloc_failure: 251asid_alloc_failure:
195#ifdef USE_SHARED_PCIE_CONFIG_REGION 252#ifdef USE_SHARED_PCIE_CONFIG_REGION
196pio_alloc_failure: 253pio_alloc_failure:
197#endif 254#endif
198 hv_dev_close(context->fd); 255 hv_dev_close(context->fd);
256gxio_trio_init_failure:
257 context->fd = -1;
199 258
200 return ret; 259 return ret;
201} 260}
202 261
203static void 262static int __init tile_trio_init(void)
204tilegx_legacy_irq_ack(struct irq_data *d) 263{
264 int i;
265
266 /* We loop over all the TRIO shims. */
267 for (i = 0; i < TILEGX_NUM_TRIO; i++) {
268 if (tile_pcie_open(i) < 0)
269 continue;
270 num_trio_shims++;
271 }
272
273 return 0;
274}
275postcore_initcall(tile_trio_init);
276
277static void tilegx_legacy_irq_ack(struct irq_data *d)
205{ 278{
206 __insn_mtspr(SPR_IPI_EVENT_RESET_K, 1UL << d->irq); 279 __insn_mtspr(SPR_IPI_EVENT_RESET_K, 1UL << d->irq);
207} 280}
208 281
209static void 282static void tilegx_legacy_irq_mask(struct irq_data *d)
210tilegx_legacy_irq_mask(struct irq_data *d)
211{ 283{
212 __insn_mtspr(SPR_IPI_MASK_SET_K, 1UL << d->irq); 284 __insn_mtspr(SPR_IPI_MASK_SET_K, 1UL << d->irq);
213} 285}
214 286
215static void 287static void tilegx_legacy_irq_unmask(struct irq_data *d)
216tilegx_legacy_irq_unmask(struct irq_data *d)
217{ 288{
218 __insn_mtspr(SPR_IPI_MASK_RESET_K, 1UL << d->irq); 289 __insn_mtspr(SPR_IPI_MASK_RESET_K, 1UL << d->irq);
219} 290}
@@ -234,8 +305,7 @@ static struct irq_chip tilegx_legacy_irq_chip = {
234 * to Linux which just calls handle_level_irq() after clearing the 305 * to Linux which just calls handle_level_irq() after clearing the
235 * MAC INTx Assert status bit associated with this interrupt. 306 * MAC INTx Assert status bit associated with this interrupt.
236 */ 307 */
237static void 308static void trio_handle_level_irq(unsigned int irq, struct irq_desc *desc)
238trio_handle_level_irq(unsigned int irq, struct irq_desc *desc)
239{ 309{
240 struct pci_controller *controller = irq_desc_get_handler_data(desc); 310 struct pci_controller *controller = irq_desc_get_handler_data(desc);
241 gxio_trio_context_t *trio_context = controller->trio; 311 gxio_trio_context_t *trio_context = controller->trio;
@@ -301,9 +371,7 @@ static int tile_init_irqs(struct pci_controller *controller)
301 goto free_irqs; 371 goto free_irqs;
302 } 372 }
303 373
304 /* 374 /* Register the IRQ handler with the kernel. */
305 * Register the IRQ handler with the kernel.
306 */
307 irq_set_chip_and_handler(irq, &tilegx_legacy_irq_chip, 375 irq_set_chip_and_handler(irq, &tilegx_legacy_irq_chip,
308 trio_handle_level_irq); 376 trio_handle_level_irq);
309 irq_set_chip_data(irq, (void *)(uint64_t)i); 377 irq_set_chip_data(irq, (void *)(uint64_t)i);
@@ -320,14 +388,39 @@ free_irqs:
320} 388}
321 389
322/* 390/*
391 * Return 1 if the port is strapped to operate in RC mode.
392 */
393static int
394strapped_for_rc(gxio_trio_context_t *trio_context, int mac)
395{
396 TRIO_PCIE_INTFC_PORT_CONFIG_t port_config;
397 unsigned int reg_offset;
398
399 /* Check the port configuration. */
400 reg_offset =
401 (TRIO_PCIE_INTFC_PORT_CONFIG <<
402 TRIO_CFG_REGION_ADDR__REG_SHIFT) |
403 (TRIO_CFG_REGION_ADDR__INTFC_VAL_MAC_INTERFACE <<
404 TRIO_CFG_REGION_ADDR__INTFC_SHIFT) |
405 (mac << TRIO_CFG_REGION_ADDR__MAC_SEL_SHIFT);
406 port_config.word =
407 __gxio_mmio_read(trio_context->mmio_base_mac + reg_offset);
408
409 if (port_config.strap_state == AUTO_CONFIG_RC ||
410 port_config.strap_state == AUTO_CONFIG_RC_G1)
411 return 1;
412 else
413 return 0;
414}
415
416/*
323 * Find valid controllers and fill in pci_controller structs for each 417 * Find valid controllers and fill in pci_controller structs for each
324 * of them. 418 * of them.
325 * 419 *
326 * Returns the number of controllers discovered. 420 * Return the number of controllers discovered.
327 */ 421 */
328int __init tile_pci_init(void) 422int __init tile_pci_init(void)
329{ 423{
330 int num_trio_shims = 0;
331 int ctl_index = 0; 424 int ctl_index = 0;
332 int i, j; 425 int i, j;
333 426
@@ -338,64 +431,62 @@ int __init tile_pci_init(void)
338 431
339 pr_info("PCI: Searching for controllers...\n"); 432 pr_info("PCI: Searching for controllers...\n");
340 433
341 /*
342 * We loop over all the TRIO shims.
343 */
344 for (i = 0; i < TILEGX_NUM_TRIO; i++) {
345 int ret;
346
347 ret = tile_pcie_open(i);
348 if (ret < 0)
349 continue;
350
351 num_trio_shims++;
352 }
353
354 if (num_trio_shims == 0 || sim_is_simulator()) 434 if (num_trio_shims == 0 || sim_is_simulator())
355 return 0; 435 return 0;
356 436
357 /* 437 /*
358 * Now determine which PCIe ports are configured to operate in RC mode. 438 * Now determine which PCIe ports are configured to operate in RC
359 * We look at the Board Information Block first and then see if there 439 * mode. There is a differece in the port configuration capability
360 * are any overriding configuration by the HW strapping pin. 440 * between the Gx36 and Gx72 devices.
441 *
442 * The Gx36 has configuration capability for each of the 3 PCIe
443 * interfaces (disable, auto endpoint, auto RC, etc.).
444 * On the Gx72, you can only select one of the 3 PCIe interfaces per
445 * TRIO to train automatically. Further, the allowable training modes
446 * are reduced to four options (auto endpoint, auto RC, stream x1,
447 * stream x4).
448 *
449 * For Gx36 ports, it must be allowed to be in RC mode by the
450 * Board Information Block, and the hardware strapping pins must be
451 * set to RC mode.
452 *
453 * For Gx72 ports, the port will operate in RC mode if either of the
454 * following is true:
455 * 1. It is allowed to be in RC mode by the Board Information Block,
456 * and the BIB doesn't allow the EP mode.
457 * 2. It is allowed to be in either the RC or the EP mode by the BIB,
458 * and the hardware strapping pin is set to RC mode.
361 */ 459 */
362 for (i = 0; i < TILEGX_NUM_TRIO; i++) { 460 for (i = 0; i < TILEGX_NUM_TRIO; i++) {
363 gxio_trio_context_t *context = &trio_contexts[i]; 461 gxio_trio_context_t *context = &trio_contexts[i];
364 int ret;
365 462
366 if (context->fd < 0) 463 if (context->fd < 0)
367 continue; 464 continue;
368 465
369 ret = hv_dev_pread(context->fd, 0,
370 (HV_VirtAddr)&pcie_ports[i][0],
371 sizeof(struct pcie_port_property) * TILEGX_TRIO_PCIES,
372 GXIO_TRIO_OP_GET_PORT_PROPERTY);
373 if (ret < 0) {
374 pr_err("PCI: PCIE_GET_PORT_PROPERTY failure, error %d,"
375 " on TRIO %d\n", ret, i);
376 continue;
377 }
378
379 for (j = 0; j < TILEGX_TRIO_PCIES; j++) { 466 for (j = 0; j < TILEGX_TRIO_PCIES; j++) {
380 if (pcie_ports[i][j].allow_rc) { 467 int is_rc = 0;
468
469 if (pcie_ports[i].is_gx72 &&
470 pcie_ports[i].ports[j].allow_rc) {
471 if (!pcie_ports[i].ports[j].allow_ep ||
472 strapped_for_rc(context, j))
473 is_rc = 1;
474 } else if (pcie_ports[i].ports[j].allow_rc &&
475 strapped_for_rc(context, j)) {
476 is_rc = 1;
477 }
478 if (is_rc) {
381 pcie_rc[i][j] = 1; 479 pcie_rc[i][j] = 1;
382 num_rc_controllers++; 480 num_rc_controllers++;
383 } 481 }
384 else if (pcie_ports[i][j].allow_ep) {
385 num_ep_controllers++;
386 }
387 } 482 }
388 } 483 }
389 484
390 /* 485 /* Return if no PCIe ports are configured to operate in RC mode. */
391 * Return if no PCIe ports are configured to operate in RC mode.
392 */
393 if (num_rc_controllers == 0) 486 if (num_rc_controllers == 0)
394 return 0; 487 return 0;
395 488
396 /* 489 /* Set the TRIO pointer and MAC index for each PCIe RC port. */
397 * Set the TRIO pointer and MAC index for each PCIe RC port.
398 */
399 for (i = 0; i < TILEGX_NUM_TRIO; i++) { 490 for (i = 0; i < TILEGX_NUM_TRIO; i++) {
400 for (j = 0; j < TILEGX_TRIO_PCIES; j++) { 491 for (j = 0; j < TILEGX_TRIO_PCIES; j++) {
401 if (pcie_rc[i][j]) { 492 if (pcie_rc[i][j]) {
@@ -411,26 +502,32 @@ int __init tile_pci_init(void)
411 } 502 }
412 503
413out: 504out:
414 /* 505 /* Configure each PCIe RC port. */
415 * Configure each PCIe RC port.
416 */
417 for (i = 0; i < num_rc_controllers; i++) { 506 for (i = 0; i < num_rc_controllers; i++) {
418 /*
419 * Configure the PCIe MAC to run in RC mode.
420 */
421 507
508 /* Configure the PCIe MAC to run in RC mode. */
422 struct pci_controller *controller = &pci_controllers[i]; 509 struct pci_controller *controller = &pci_controllers[i];
423 510
424 controller->index = i; 511 controller->index = i;
425 controller->ops = &tile_cfg_ops; 512 controller->ops = &tile_cfg_ops;
426 513
514 controller->io_space.start = PCIBIOS_MIN_IO +
515 (i * IO_SPACE_SIZE);
516 controller->io_space.end = controller->io_space.start +
517 IO_SPACE_SIZE - 1;
518 BUG_ON(controller->io_space.end > IO_SPACE_LIMIT);
519 controller->io_space.flags = IORESOURCE_IO;
520 snprintf(controller->io_space_name,
521 sizeof(controller->io_space_name),
522 "PCI I/O domain %d", i);
523 controller->io_space.name = controller->io_space_name;
524
427 /* 525 /*
428 * The PCI memory resource is located above the PA space. 526 * The PCI memory resource is located above the PA space.
429 * For every host bridge, the BAR window or the MMIO aperture 527 * For every host bridge, the BAR window or the MMIO aperture
430 * is in range [3GB, 4GB - 1] of a 4GB space beyond the 528 * is in range [3GB, 4GB - 1] of a 4GB space beyond the
431 * PA space. 529 * PA space.
432 */ 530 */
433
434 controller->mem_offset = TILE_PCI_MEM_START + 531 controller->mem_offset = TILE_PCI_MEM_START +
435 (i * TILE_PCI_BAR_WINDOW_TOP); 532 (i * TILE_PCI_BAR_WINDOW_TOP);
436 controller->mem_space.start = controller->mem_offset + 533 controller->mem_space.start = controller->mem_offset +
@@ -458,7 +555,6 @@ static int tile_map_irq(const struct pci_dev *dev, u8 device, u8 pin)
458 return controller->irq_intx_table[pin - 1]; 555 return controller->irq_intx_table[pin - 1];
459} 556}
460 557
461
462static void fixup_read_and_payload_sizes(struct pci_controller *controller) 558static void fixup_read_and_payload_sizes(struct pci_controller *controller)
463{ 559{
464 gxio_trio_context_t *trio_context = controller->trio; 560 gxio_trio_context_t *trio_context = controller->trio;
@@ -472,9 +568,7 @@ static void fixup_read_and_payload_sizes(struct pci_controller *controller)
472 568
473 mac = controller->mac; 569 mac = controller->mac;
474 570
475 /* 571 /* Set our max read request size to be 4KB. */
476 * Set our max read request size to be 4KB.
477 */
478 reg_offset = 572 reg_offset =
479 (TRIO_PCIE_RC_DEVICE_CONTROL << 573 (TRIO_PCIE_RC_DEVICE_CONTROL <<
480 TRIO_CFG_REGION_ADDR__REG_SHIFT) | 574 TRIO_CFG_REGION_ADDR__REG_SHIFT) |
@@ -483,10 +577,10 @@ static void fixup_read_and_payload_sizes(struct pci_controller *controller)
483 (mac << TRIO_CFG_REGION_ADDR__MAC_SEL_SHIFT); 577 (mac << TRIO_CFG_REGION_ADDR__MAC_SEL_SHIFT);
484 578
485 dev_control.word = __gxio_mmio_read32(trio_context->mmio_base_mac + 579 dev_control.word = __gxio_mmio_read32(trio_context->mmio_base_mac +
486 reg_offset); 580 reg_offset);
487 dev_control.max_read_req_sz = 5; 581 dev_control.max_read_req_sz = 5;
488 __gxio_mmio_write32(trio_context->mmio_base_mac + reg_offset, 582 __gxio_mmio_write32(trio_context->mmio_base_mac + reg_offset,
489 dev_control.word); 583 dev_control.word);
490 584
491 /* 585 /*
492 * Set the max payload size supported by this Gx PCIe MAC. 586 * Set the max payload size supported by this Gx PCIe MAC.
@@ -502,19 +596,14 @@ static void fixup_read_and_payload_sizes(struct pci_controller *controller)
502 (mac << TRIO_CFG_REGION_ADDR__MAC_SEL_SHIFT); 596 (mac << TRIO_CFG_REGION_ADDR__MAC_SEL_SHIFT);
503 597
504 rc_dev_cap.word = __gxio_mmio_read32(trio_context->mmio_base_mac + 598 rc_dev_cap.word = __gxio_mmio_read32(trio_context->mmio_base_mac +
505 reg_offset); 599 reg_offset);
506 rc_dev_cap.mps_sup = 1; 600 rc_dev_cap.mps_sup = 1;
507 __gxio_mmio_write32(trio_context->mmio_base_mac + reg_offset, 601 __gxio_mmio_write32(trio_context->mmio_base_mac + reg_offset,
508 rc_dev_cap.word); 602 rc_dev_cap.word);
509 603
510 /* Configure PCI Express MPS setting. */ 604 /* Configure PCI Express MPS setting. */
511 list_for_each_entry(child, &root_bus->children, node) { 605 list_for_each_entry(child, &root_bus->children, node)
512 struct pci_dev *self = child->self; 606 pcie_bus_configure_settings(child);
513 if (!self)
514 continue;
515
516 pcie_bus_configure_settings(child, self->pcie_mpss);
517 }
518 607
519 /* 608 /*
520 * Set the mac_config register in trio based on the MPS/MRS of the link. 609 * Set the mac_config register in trio based on the MPS/MRS of the link.
@@ -533,7 +622,7 @@ static void fixup_read_and_payload_sizes(struct pci_controller *controller)
533 dev_control.max_payload_size, 622 dev_control.max_payload_size,
534 dev_control.max_read_req_sz, 623 dev_control.max_read_req_sz,
535 mac); 624 mac);
536 if (err < 0) { 625 if (err < 0) {
537 pr_err("PCI: PCIE_CONFIGURE_MAC_MPS_MRS failure, " 626 pr_err("PCI: PCIE_CONFIGURE_MAC_MPS_MRS failure, "
538 "MAC %d on TRIO %d\n", 627 "MAC %d on TRIO %d\n",
539 mac, controller->trio_index); 628 mac, controller->trio_index);
@@ -570,21 +659,14 @@ static int setup_pcie_rc_delay(char *str)
570 if (!isdigit(*str)) 659 if (!isdigit(*str))
571 return -EINVAL; 660 return -EINVAL;
572 delay = simple_strtoul(str, (char **)&str, 10); 661 delay = simple_strtoul(str, (char **)&str, 10);
573 if (delay > MAX_RC_DELAY)
574 return -EINVAL;
575 } 662 }
576 663
577 rc_delay[trio_index][mac] = delay ? : DEFAULT_RC_DELAY; 664 rc_delay[trio_index][mac] = delay ? : DEFAULT_RC_DELAY;
578 pr_info("Delaying PCIe RC link training for %u sec"
579 " on MAC %lu on TRIO %lu\n", rc_delay[trio_index][mac],
580 mac, trio_index);
581 return 0; 665 return 0;
582} 666}
583early_param("pcie_rc_delay", setup_pcie_rc_delay); 667early_param("pcie_rc_delay", setup_pcie_rc_delay);
584 668
585/* 669/* PCI initialization entry point, called by subsys_initcall. */
586 * PCI initialization entry point, called by subsys_initcall.
587 */
588int __init pcibios_init(void) 670int __init pcibios_init(void)
589{ 671{
590 resource_size_t offset; 672 resource_size_t offset;
@@ -594,35 +676,10 @@ int __init pcibios_init(void)
594 676
595 tile_pci_init(); 677 tile_pci_init();
596 678
597 if (num_rc_controllers == 0 && num_ep_controllers == 0) 679 if (num_rc_controllers == 0)
598 return 0; 680 return 0;
599 681
600 /* 682 /*
601 * We loop over all the TRIO shims and set up the MMIO mappings.
602 */
603 for (i = 0; i < TILEGX_NUM_TRIO; i++) {
604 gxio_trio_context_t *context = &trio_contexts[i];
605
606 if (context->fd < 0)
607 continue;
608
609 /*
610 * Map in the MMIO space for the MAC.
611 */
612 offset = 0;
613 context->mmio_base_mac =
614 iorpc_ioremap(context->fd, offset,
615 HV_TRIO_CONFIG_IOREMAP_SIZE);
616 if (context->mmio_base_mac == NULL) {
617 pr_err("PCI: MAC map failure on TRIO %d\n", i);
618
619 hv_dev_close(context->fd);
620 context->fd = -1;
621 continue;
622 }
623 }
624
625 /*
626 * Delay a bit in case devices aren't ready. Some devices are 683 * Delay a bit in case devices aren't ready. Some devices are
627 * known to require at least 20ms here, but we use a more 684 * known to require at least 20ms here, but we use a more
628 * conservative value. 685 * conservative value.
@@ -633,7 +690,6 @@ int __init pcibios_init(void)
633 for (next_busno = 0, i = 0; i < num_rc_controllers; i++) { 690 for (next_busno = 0, i = 0; i < num_rc_controllers; i++) {
634 struct pci_controller *controller = &pci_controllers[i]; 691 struct pci_controller *controller = &pci_controllers[i];
635 gxio_trio_context_t *trio_context = controller->trio; 692 gxio_trio_context_t *trio_context = controller->trio;
636 TRIO_PCIE_INTFC_PORT_CONFIG_t port_config;
637 TRIO_PCIE_INTFC_PORT_STATUS_t port_status; 693 TRIO_PCIE_INTFC_PORT_STATUS_t port_status;
638 TRIO_PCIE_INTFC_TX_FIFO_CTL_t tx_fifo_ctl; 694 TRIO_PCIE_INTFC_TX_FIFO_CTL_t tx_fifo_ctl;
639 struct pci_bus *bus; 695 struct pci_bus *bus;
@@ -650,75 +706,64 @@ int __init pcibios_init(void)
650 mac = controller->mac; 706 mac = controller->mac;
651 707
652 /* 708 /*
653 * Check the port strap state which will override the BIB 709 * Check for PCIe link-up status to decide if we need
654 * setting. 710 * to force the link to come up.
655 */ 711 */
656
657 reg_offset = 712 reg_offset =
658 (TRIO_PCIE_INTFC_PORT_CONFIG << 713 (TRIO_PCIE_INTFC_PORT_STATUS <<
659 TRIO_CFG_REGION_ADDR__REG_SHIFT) | 714 TRIO_CFG_REGION_ADDR__REG_SHIFT) |
660 (TRIO_CFG_REGION_ADDR__INTFC_VAL_MAC_INTERFACE << 715 (TRIO_CFG_REGION_ADDR__INTFC_VAL_MAC_INTERFACE <<
661 TRIO_CFG_REGION_ADDR__INTFC_SHIFT ) | 716 TRIO_CFG_REGION_ADDR__INTFC_SHIFT) |
662 (mac << TRIO_CFG_REGION_ADDR__MAC_SEL_SHIFT); 717 (mac << TRIO_CFG_REGION_ADDR__MAC_SEL_SHIFT);
663 718
664 port_config.word = 719 port_status.word =
665 __gxio_mmio_read(trio_context->mmio_base_mac + 720 __gxio_mmio_read(trio_context->mmio_base_mac +
666 reg_offset); 721 reg_offset);
667 722 if (!port_status.dl_up) {
668 if ((port_config.strap_state != 723 if (rc_delay[trio_index][mac]) {
669 TRIO_PCIE_INTFC_PORT_CONFIG__STRAP_STATE_VAL_AUTO_CONFIG_RC) && 724 pr_info("Delaying PCIe RC TRIO init %d sec"
670 (port_config.strap_state != 725 " on MAC %d on TRIO %d\n",
671 TRIO_PCIE_INTFC_PORT_CONFIG__STRAP_STATE_VAL_AUTO_CONFIG_RC_G1)) { 726 rc_delay[trio_index][mac], mac,
672 /* 727 trio_index);
673 * If this is really intended to be an EP port, 728 msleep(rc_delay[trio_index][mac] * 1000);
674 * record it so that the endpoint driver will know about it. 729 }
675 */ 730 ret = gxio_trio_force_rc_link_up(trio_context, mac);
676 if (port_config.strap_state == 731 if (ret < 0)
677 TRIO_PCIE_INTFC_PORT_CONFIG__STRAP_STATE_VAL_AUTO_CONFIG_ENDPOINT || 732 pr_err("PCI: PCIE_FORCE_LINK_UP failure, "
678 port_config.strap_state == 733 "MAC %d on TRIO %d\n", mac, trio_index);
679 TRIO_PCIE_INTFC_PORT_CONFIG__STRAP_STATE_VAL_AUTO_CONFIG_ENDPOINT_G1)
680 pcie_ports[trio_index][mac].allow_ep = 1;
681
682 continue;
683 } 734 }
684 735
685 /*
686 * Delay the RC link training if needed.
687 */
688 if (rc_delay[trio_index][mac])
689 msleep(rc_delay[trio_index][mac] * 1000);
690
691 ret = gxio_trio_force_rc_link_up(trio_context, mac);
692 if (ret < 0)
693 pr_err("PCI: PCIE_FORCE_LINK_UP failure, "
694 "MAC %d on TRIO %d\n", mac, trio_index);
695
696 pr_info("PCI: Found PCI controller #%d on TRIO %d MAC %d\n", i, 736 pr_info("PCI: Found PCI controller #%d on TRIO %d MAC %d\n", i,
697 trio_index, controller->mac); 737 trio_index, controller->mac);
698 738
699 /* 739 /* Delay the bus probe if needed. */
700 * Wait a bit here because some EP devices take longer 740 if (rc_delay[trio_index][mac]) {
701 * to come up. 741 pr_info("Delaying PCIe RC bus enumerating %d sec"
702 */ 742 " on MAC %d on TRIO %d\n",
703 msleep(1000); 743 rc_delay[trio_index][mac], mac,
704 744 trio_index);
705 /* 745 msleep(rc_delay[trio_index][mac] * 1000);
706 * Check for PCIe link-up status. 746 } else {
707 */ 747 /*
708 748 * Wait a bit here because some EP devices
709 reg_offset = 749 * take longer to come up.
710 (TRIO_PCIE_INTFC_PORT_STATUS << 750 */
711 TRIO_CFG_REGION_ADDR__REG_SHIFT) | 751 msleep(1000);
712 (TRIO_CFG_REGION_ADDR__INTFC_VAL_MAC_INTERFACE << 752 }
713 TRIO_CFG_REGION_ADDR__INTFC_SHIFT ) |
714 (mac << TRIO_CFG_REGION_ADDR__MAC_SEL_SHIFT);
715 753
754 /* Check for PCIe link-up status again. */
716 port_status.word = 755 port_status.word =
717 __gxio_mmio_read(trio_context->mmio_base_mac + 756 __gxio_mmio_read(trio_context->mmio_base_mac +
718 reg_offset); 757 reg_offset);
719 if (!port_status.dl_up) { 758 if (!port_status.dl_up) {
720 pr_err("PCI: link is down, MAC %d on TRIO %d\n", 759 if (pcie_ports[trio_index].ports[mac].removable) {
721 mac, trio_index); 760 pr_info("PCI: link is down, MAC %d on TRIO %d\n",
761 mac, trio_index);
762 pr_info("This is expected if no PCIe card"
763 " is connected to this link\n");
764 } else
765 pr_err("PCI: link is down, MAC %d on TRIO %d\n",
766 mac, trio_index);
722 continue; 767 continue;
723 } 768 }
724 769
@@ -744,7 +789,6 @@ int __init pcibios_init(void)
744 * Change the device ID so that Linux bus crawl doesn't confuse 789 * Change the device ID so that Linux bus crawl doesn't confuse
745 * the internal bridge with any Tilera endpoints. 790 * the internal bridge with any Tilera endpoints.
746 */ 791 */
747
748 reg_offset = 792 reg_offset =
749 (TRIO_PCIE_RC_DEVICE_ID_VEN_ID << 793 (TRIO_PCIE_RC_DEVICE_ID_VEN_ID <<
750 TRIO_CFG_REGION_ADDR__REG_SHIFT) | 794 TRIO_CFG_REGION_ADDR__REG_SHIFT) |
@@ -757,10 +801,7 @@ int __init pcibios_init(void)
757 TRIO_PCIE_RC_DEVICE_ID_VEN_ID__DEV_ID_SHIFT) | 801 TRIO_PCIE_RC_DEVICE_ID_VEN_ID__DEV_ID_SHIFT) |
758 TILERA_VENDOR_ID); 802 TILERA_VENDOR_ID);
759 803
760 /* 804 /* Set the internal P2P bridge class code. */
761 * Set the internal P2P bridge class code.
762 */
763
764 reg_offset = 805 reg_offset =
765 (TRIO_PCIE_RC_REVISION_ID << 806 (TRIO_PCIE_RC_REVISION_ID <<
766 TRIO_CFG_REGION_ADDR__REG_SHIFT) | 807 TRIO_CFG_REGION_ADDR__REG_SHIFT) |
@@ -771,26 +812,22 @@ int __init pcibios_init(void)
771 class_code_revision = 812 class_code_revision =
772 __gxio_mmio_read32(trio_context->mmio_base_mac + 813 __gxio_mmio_read32(trio_context->mmio_base_mac +
773 reg_offset); 814 reg_offset);
774 class_code_revision = (class_code_revision & 0xff ) | 815 class_code_revision = (class_code_revision & 0xff) |
775 (PCI_CLASS_BRIDGE_PCI << 16); 816 (PCI_CLASS_BRIDGE_PCI << 16);
776 817
777 __gxio_mmio_write32(trio_context->mmio_base_mac + 818 __gxio_mmio_write32(trio_context->mmio_base_mac +
778 reg_offset, class_code_revision); 819 reg_offset, class_code_revision);
779 820
780#ifdef USE_SHARED_PCIE_CONFIG_REGION 821#ifdef USE_SHARED_PCIE_CONFIG_REGION
781 822
782 /* 823 /* Map in the MMIO space for the PIO region. */
783 * Map in the MMIO space for the PIO region.
784 */
785 offset = HV_TRIO_PIO_OFFSET(trio_context->pio_cfg_index) | 824 offset = HV_TRIO_PIO_OFFSET(trio_context->pio_cfg_index) |
786 (((unsigned long long)mac) << 825 (((unsigned long long)mac) <<
787 TRIO_TILE_PIO_REGION_SETUP_CFG_ADDR__MAC_SHIFT); 826 TRIO_TILE_PIO_REGION_SETUP_CFG_ADDR__MAC_SHIFT);
788 827
789#else 828#else
790 829
791 /* 830 /* Alloc a PIO region for PCI config access per MAC. */
792 * Alloc a PIO region for PCI config access per MAC.
793 */
794 ret = gxio_trio_alloc_pio_regions(trio_context, 1, 0, 0); 831 ret = gxio_trio_alloc_pio_regions(trio_context, 1, 0, 0);
795 if (ret < 0) { 832 if (ret < 0) {
796 pr_err("PCI: PCI CFG PIO alloc failure for mac %d " 833 pr_err("PCI: PCI CFG PIO alloc failure for mac %d "
@@ -801,9 +838,7 @@ int __init pcibios_init(void)
801 838
802 trio_context->pio_cfg_index[mac] = ret; 839 trio_context->pio_cfg_index[mac] = ret;
803 840
804 /* 841 /* For PIO CFG, the bus_address_hi parameter is 0. */
805 * For PIO CFG, the bus_address_hi parameter is 0.
806 */
807 ret = gxio_trio_init_pio_region_aux(trio_context, 842 ret = gxio_trio_init_pio_region_aux(trio_context,
808 trio_context->pio_cfg_index[mac], 843 trio_context->pio_cfg_index[mac],
809 mac, 0, HV_TRIO_PIO_FLAG_CONFIG_SPACE); 844 mac, 0, HV_TRIO_PIO_FLAG_CONFIG_SPACE);
@@ -820,9 +855,15 @@ int __init pcibios_init(void)
820 855
821#endif 856#endif
822 857
858 /*
859 * To save VMALLOC space, we take advantage of the fact that
860 * bit 29 in the PIO CFG address format is reserved 0. With
861 * TRIO_TILE_PIO_REGION_SETUP_CFG_ADDR__MAC_SHIFT being 30,
862 * this cuts VMALLOC space usage from 1GB to 512MB per mac.
863 */
823 trio_context->mmio_base_pio_cfg[mac] = 864 trio_context->mmio_base_pio_cfg[mac] =
824 iorpc_ioremap(trio_context->fd, offset, 865 iorpc_ioremap(trio_context->fd, offset, (1UL <<
825 (1 << TRIO_TILE_PIO_REGION_SETUP_CFG_ADDR__MAC_SHIFT)); 866 (TRIO_TILE_PIO_REGION_SETUP_CFG_ADDR__MAC_SHIFT - 1)));
826 if (trio_context->mmio_base_pio_cfg[mac] == NULL) { 867 if (trio_context->mmio_base_pio_cfg[mac] == NULL) {
827 pr_err("PCI: PIO map failure for mac %d on TRIO %d\n", 868 pr_err("PCI: PIO map failure for mac %d on TRIO %d\n",
828 mac, trio_index); 869 mac, trio_index);
@@ -830,9 +871,7 @@ int __init pcibios_init(void)
830 continue; 871 continue;
831 } 872 }
832 873
833 /* 874 /* Initialize the PCIe interrupts. */
834 * Initialize the PCIe interrupts.
835 */
836 if (tile_init_irqs(controller)) { 875 if (tile_init_irqs(controller)) {
837 pr_err("PCI: IRQs init failure for mac %d on TRIO %d\n", 876 pr_err("PCI: IRQs init failure for mac %d on TRIO %d\n",
838 mac, trio_index); 877 mac, trio_index);
@@ -843,17 +882,16 @@ int __init pcibios_init(void)
843 /* 882 /*
844 * The PCI memory resource is located above the PA space. 883 * The PCI memory resource is located above the PA space.
845 * The memory range for the PCI root bus should not overlap 884 * The memory range for the PCI root bus should not overlap
846 * with the physical RAM 885 * with the physical RAM.
847 */ 886 */
848 pci_add_resource_offset(&resources, &controller->mem_space, 887 pci_add_resource_offset(&resources, &controller->mem_space,
849 controller->mem_offset); 888 controller->mem_offset);
850 889 pci_add_resource(&resources, &controller->io_space);
851 controller->first_busno = next_busno; 890 controller->first_busno = next_busno;
852 bus = pci_scan_root_bus(NULL, next_busno, controller->ops, 891 bus = pci_scan_root_bus(NULL, next_busno, controller->ops,
853 controller, &resources); 892 controller, &resources);
854 controller->root_bus = bus; 893 controller->root_bus = bus;
855 next_busno = bus->busn_res.end + 1; 894 next_busno = bus->busn_res.end + 1;
856
857 } 895 }
858 896
859 /* Do machine dependent PCI interrupt routing */ 897 /* Do machine dependent PCI interrupt routing */
@@ -865,7 +903,6 @@ int __init pcibios_init(void)
865 * It allocates all of the resources (I/O memory, etc) 903 * It allocates all of the resources (I/O memory, etc)
866 * associated with the devices read in above. 904 * associated with the devices read in above.
867 */ 905 */
868
869 pci_assign_unassigned_resources(); 906 pci_assign_unassigned_resources();
870 907
871 /* Record the I/O resources in the PCI controller structure. */ 908 /* Record the I/O resources in the PCI controller structure. */
@@ -873,9 +910,6 @@ int __init pcibios_init(void)
873 struct pci_controller *controller = &pci_controllers[i]; 910 struct pci_controller *controller = &pci_controllers[i];
874 gxio_trio_context_t *trio_context = controller->trio; 911 gxio_trio_context_t *trio_context = controller->trio;
875 struct pci_bus *root_bus = pci_controllers[i].root_bus; 912 struct pci_bus *root_bus = pci_controllers[i].root_bus;
876 struct pci_bus *next_bus;
877 uint32_t bus_address_hi;
878 struct pci_dev *dev;
879 int ret; 913 int ret;
880 int j; 914 int j;
881 915
@@ -889,43 +923,12 @@ int __init pcibios_init(void)
889 /* Configure the max_payload_size values for this domain. */ 923 /* Configure the max_payload_size values for this domain. */
890 fixup_read_and_payload_sizes(controller); 924 fixup_read_and_payload_sizes(controller);
891 925
892 list_for_each_entry(dev, &root_bus->devices, bus_list) { 926 /* Alloc a PIO region for PCI memory access for each RC port. */
893 /* Find the PCI host controller, ie. the 1st bridge. */
894 if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI &&
895 (PCI_SLOT(dev->devfn) == 0)) {
896 next_bus = dev->subordinate;
897 pci_controllers[i].mem_resources[0] =
898 *next_bus->resource[0];
899 pci_controllers[i].mem_resources[1] =
900 *next_bus->resource[1];
901 pci_controllers[i].mem_resources[2] =
902 *next_bus->resource[2];
903
904 break;
905 }
906 }
907
908 if (pci_controllers[i].mem_resources[1].flags & IORESOURCE_MEM)
909 bus_address_hi =
910 pci_controllers[i].mem_resources[1].start >> 32;
911 else if (pci_controllers[i].mem_resources[2].flags & IORESOURCE_PREFETCH)
912 bus_address_hi =
913 pci_controllers[i].mem_resources[2].start >> 32;
914 else {
915 /* This is unlikely. */
916 pr_err("PCI: no memory resources on TRIO %d mac %d\n",
917 controller->trio_index, controller->mac);
918 continue;
919 }
920
921 /*
922 * Alloc a PIO region for PCI memory access for each RC port.
923 */
924 ret = gxio_trio_alloc_pio_regions(trio_context, 1, 0, 0); 927 ret = gxio_trio_alloc_pio_regions(trio_context, 1, 0, 0);
925 if (ret < 0) { 928 if (ret < 0) {
926 pr_err("PCI: MEM PIO alloc failure on TRIO %d mac %d, " 929 pr_err("PCI: MEM PIO alloc failure on TRIO %d mac %d, "
927 "give up\n", controller->trio_index, 930 "give up\n", controller->trio_index,
928 controller->mac); 931 controller->mac);
929 932
930 continue; 933 continue;
931 } 934 }
@@ -943,12 +946,45 @@ int __init pcibios_init(void)
943 0); 946 0);
944 if (ret < 0) { 947 if (ret < 0) {
945 pr_err("PCI: MEM PIO init failure on TRIO %d mac %d, " 948 pr_err("PCI: MEM PIO init failure on TRIO %d mac %d, "
946 "give up\n", controller->trio_index, 949 "give up\n", controller->trio_index,
947 controller->mac); 950 controller->mac);
951
952 continue;
953 }
954
955#ifdef CONFIG_TILE_PCI_IO
956 /*
957 * Alloc a PIO region for PCI I/O space access for each RC port.
958 */
959 ret = gxio_trio_alloc_pio_regions(trio_context, 1, 0, 0);
960 if (ret < 0) {
961 pr_err("PCI: I/O PIO alloc failure on TRIO %d mac %d, "
962 "give up\n", controller->trio_index,
963 controller->mac);
948 964
949 continue; 965 continue;
950 } 966 }
951 967
968 controller->pio_io_index = ret;
969
970 /*
971 * For PIO IO, the bus_address_hi parameter is hard-coded 0
972 * because PCI I/O address space is 32-bit.
973 */
974 ret = gxio_trio_init_pio_region_aux(trio_context,
975 controller->pio_io_index,
976 controller->mac,
977 0,
978 HV_TRIO_PIO_FLAG_IO_SPACE);
979 if (ret < 0) {
980 pr_err("PCI: I/O PIO init failure on TRIO %d mac %d, "
981 "give up\n", controller->trio_index,
982 controller->mac);
983
984 continue;
985 }
986#endif
987
952 /* 988 /*
953 * Configure a Mem-Map region for each memory controller so 989 * Configure a Mem-Map region for each memory controller so
954 * that Linux can map all of its PA space to the PCI bus. 990 * that Linux can map all of its PA space to the PCI bus.
@@ -963,9 +999,9 @@ int __init pcibios_init(void)
963 0); 999 0);
964 if (ret < 0) { 1000 if (ret < 0) {
965 pr_err("PCI: Mem-Map alloc failure on TRIO %d " 1001 pr_err("PCI: Mem-Map alloc failure on TRIO %d "
966 "mac %d for MC %d, give up\n", 1002 "mac %d for MC %d, give up\n",
967 controller->trio_index, 1003 controller->trio_index,
968 controller->mac, j); 1004 controller->mac, j);
969 1005
970 goto alloc_mem_map_failed; 1006 goto alloc_mem_map_failed;
971 } 1007 }
@@ -996,9 +1032,9 @@ int __init pcibios_init(void)
996 GXIO_TRIO_ORDER_MODE_UNORDERED); 1032 GXIO_TRIO_ORDER_MODE_UNORDERED);
997 if (ret < 0) { 1033 if (ret < 0) {
998 pr_err("PCI: Mem-Map init failure on TRIO %d " 1034 pr_err("PCI: Mem-Map init failure on TRIO %d "
999 "mac %d for MC %d, give up\n", 1035 "mac %d for MC %d, give up\n",
1000 controller->trio_index, 1036 controller->trio_index,
1001 controller->mac, j); 1037 controller->mac, j);
1002 1038
1003 goto alloc_mem_map_failed; 1039 goto alloc_mem_map_failed;
1004 } 1040 }
@@ -1007,23 +1043,19 @@ int __init pcibios_init(void)
1007alloc_mem_map_failed: 1043alloc_mem_map_failed:
1008 break; 1044 break;
1009 } 1045 }
1010
1011 } 1046 }
1012 1047
1013 return 0; 1048 return 0;
1014} 1049}
1015subsys_initcall(pcibios_init); 1050subsys_initcall(pcibios_init);
1016 1051
1017/* Note: to be deleted after Linux 3.6 merge. */ 1052/* No bus fixups needed. */
1018void pcibios_fixup_bus(struct pci_bus *bus) 1053void pcibios_fixup_bus(struct pci_bus *bus)
1019{ 1054{
1020} 1055}
1021 1056
1022/* 1057/* Process any "pci=" kernel boot arguments. */
1023 * This can be called from the generic PCI layer, but doesn't need to 1058char *__init pcibios_setup(char *str)
1024 * do anything.
1025 */
1026char *pcibios_setup(char *str)
1027{ 1059{
1028 if (!strcmp(str, "off")) { 1060 if (!strcmp(str, "off")) {
1029 pci_probe = 0; 1061 pci_probe = 0;
@@ -1034,8 +1066,7 @@ char *pcibios_setup(char *str)
1034 1066
1035/* 1067/*
1036 * Enable memory address decoding, as appropriate, for the 1068 * Enable memory address decoding, as appropriate, for the
1037 * device described by the 'dev' struct. The I/O decoding 1069 * device described by the 'dev' struct.
1038 * is disabled, though the TILE-Gx supports I/O addressing.
1039 * 1070 *
1040 * This is called from the generic PCI layer, and can be called 1071 * This is called from the generic PCI layer, and can be called
1041 * for bridges or endpoints. 1072 * for bridges or endpoints.
@@ -1045,13 +1076,24 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)
1045 return pci_enable_resources(dev, mask); 1076 return pci_enable_resources(dev, mask);
1046} 1077}
1047 1078
1048/* Called for each device after PCI setup is done. */ 1079/*
1080 * Called for each device after PCI setup is done.
1081 * We initialize the PCI device capabilities conservatively, assuming that
1082 * all devices can only address the 32-bit DMA space. The exception here is
1083 * that the device dma_offset is set to the value that matches the 64-bit
1084 * capable devices. This is OK because dma_offset is not used by legacy
1085 * dma_ops, nor by the hybrid dma_ops's streaming DMAs, which are 64-bit ops.
1086 * This implementation matches the kernel design of setting PCI devices'
1087 * coherent_dma_mask to 0xffffffffull by default, allowing the device drivers
1088 * to skip calling pci_set_consistent_dma_mask(DMA_BIT_MASK(32)).
1089 */
1049static void pcibios_fixup_final(struct pci_dev *pdev) 1090static void pcibios_fixup_final(struct pci_dev *pdev)
1050{ 1091{
1051 set_dma_ops(&pdev->dev, gx_pci_dma_map_ops); 1092 set_dma_ops(&pdev->dev, gx_legacy_pci_dma_map_ops);
1052 set_dma_offset(&pdev->dev, TILE_PCI_MEM_MAP_BASE_OFFSET); 1093 set_dma_offset(&pdev->dev, TILE_PCI_MEM_MAP_BASE_OFFSET);
1053 pdev->dev.archdata.max_direct_dma_addr = 1094 pdev->dev.archdata.max_direct_dma_addr =
1054 TILE_PCI_MAX_DIRECT_DMA_ADDRESS; 1095 TILE_PCI_MAX_DIRECT_DMA_ADDRESS;
1096 pdev->dev.coherent_dma_mask = TILE_PCI_MAX_DIRECT_DMA_ADDRESS;
1055} 1097}
1056DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_final); 1098DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_final);
1057 1099
@@ -1065,19 +1107,15 @@ void __iomem *ioremap(resource_size_t phys_addr, unsigned long size)
1065 resource_size_t start; 1107 resource_size_t start;
1066 resource_size_t end; 1108 resource_size_t end;
1067 int trio_fd; 1109 int trio_fd;
1068 int i, j; 1110 int i;
1069 1111
1070 start = phys_addr; 1112 start = phys_addr;
1071 end = phys_addr + size - 1; 1113 end = phys_addr + size - 1;
1072 1114
1073 /* 1115 /*
1074 * In the following, each PCI controller's mem_resources[1] 1116 * By searching phys_addr in each controller's mem_space, we can
1075 * represents its (non-prefetchable) PCI memory resource and
1076 * mem_resources[2] refers to its prefetchable PCI memory resource.
1077 * By searching phys_addr in each controller's mem_resources[], we can
1078 * determine the controller that should accept the PCI memory access. 1117 * determine the controller that should accept the PCI memory access.
1079 */ 1118 */
1080
1081 for (i = 0; i < num_rc_controllers; i++) { 1119 for (i = 0; i < num_rc_controllers; i++) {
1082 /* 1120 /*
1083 * Skip controllers that are not properly initialized or 1121 * Skip controllers that are not properly initialized or
@@ -1086,25 +1124,18 @@ void __iomem *ioremap(resource_size_t phys_addr, unsigned long size)
1086 if (pci_controllers[i].root_bus == NULL) 1124 if (pci_controllers[i].root_bus == NULL)
1087 continue; 1125 continue;
1088 1126
1089 for (j = 1; j < 3; j++) { 1127 bar_start = pci_controllers[i].mem_space.start;
1090 bar_start = 1128 bar_end = pci_controllers[i].mem_space.end;
1091 pci_controllers[i].mem_resources[j].start;
1092 bar_end =
1093 pci_controllers[i].mem_resources[j].end;
1094 1129
1095 if ((start >= bar_start) && (end <= bar_end)) { 1130 if ((start >= bar_start) && (end <= bar_end)) {
1096 1131 controller = &pci_controllers[i];
1097 controller = &pci_controllers[i]; 1132 break;
1098
1099 goto got_it;
1100 }
1101 } 1133 }
1102 } 1134 }
1103 1135
1104 if (controller == NULL) 1136 if (controller == NULL)
1105 return NULL; 1137 return NULL;
1106 1138
1107got_it:
1108 trio_fd = controller->trio->fd; 1139 trio_fd = controller->trio->fd;
1109 1140
1110 /* Convert the resource start to the bus address offset. */ 1141 /* Convert the resource start to the bus address offset. */
@@ -1112,14 +1143,71 @@ got_it:
1112 1143
1113 offset = HV_TRIO_PIO_OFFSET(controller->pio_mem_index) + start; 1144 offset = HV_TRIO_PIO_OFFSET(controller->pio_mem_index) + start;
1114 1145
1115 /* 1146 /* We need to keep the PCI bus address's in-page offset in the VA. */
1116 * We need to keep the PCI bus address's in-page offset in the VA.
1117 */
1118 return iorpc_ioremap(trio_fd, offset, size) + 1147 return iorpc_ioremap(trio_fd, offset, size) +
1119 (phys_addr & (PAGE_SIZE - 1)); 1148 (start & (PAGE_SIZE - 1));
1120} 1149}
1121EXPORT_SYMBOL(ioremap); 1150EXPORT_SYMBOL(ioremap);
1122 1151
1152#ifdef CONFIG_TILE_PCI_IO
1153/* Map a PCI I/O address into VA space. */
1154void __iomem *ioport_map(unsigned long port, unsigned int size)
1155{
1156 struct pci_controller *controller = NULL;
1157 resource_size_t bar_start;
1158 resource_size_t bar_end;
1159 resource_size_t offset;
1160 resource_size_t start;
1161 resource_size_t end;
1162 int trio_fd;
1163 int i;
1164
1165 start = port;
1166 end = port + size - 1;
1167
1168 /*
1169 * By searching the port in each controller's io_space, we can
1170 * determine the controller that should accept the PCI I/O access.
1171 */
1172 for (i = 0; i < num_rc_controllers; i++) {
1173 /*
1174 * Skip controllers that are not properly initialized or
1175 * have down links.
1176 */
1177 if (pci_controllers[i].root_bus == NULL)
1178 continue;
1179
1180 bar_start = pci_controllers[i].io_space.start;
1181 bar_end = pci_controllers[i].io_space.end;
1182
1183 if ((start >= bar_start) && (end <= bar_end)) {
1184 controller = &pci_controllers[i];
1185 break;
1186 }
1187 }
1188
1189 if (controller == NULL)
1190 return NULL;
1191
1192 trio_fd = controller->trio->fd;
1193
1194 /* Convert the resource start to the bus address offset. */
1195 port -= controller->io_space.start;
1196
1197 offset = HV_TRIO_PIO_OFFSET(controller->pio_io_index) + port;
1198
1199 /* We need to keep the PCI bus address's in-page offset in the VA. */
1200 return iorpc_ioremap(trio_fd, offset, size) + (port & (PAGE_SIZE - 1));
1201}
1202EXPORT_SYMBOL(ioport_map);
1203
1204void ioport_unmap(void __iomem *addr)
1205{
1206 iounmap(addr);
1207}
1208EXPORT_SYMBOL(ioport_unmap);
1209#endif
1210
1123void pci_iounmap(struct pci_dev *dev, void __iomem *addr) 1211void pci_iounmap(struct pci_dev *dev, void __iomem *addr)
1124{ 1212{
1125 iounmap(addr); 1213 iounmap(addr);
@@ -1141,7 +1229,6 @@ EXPORT_SYMBOL(pci_iounmap);
1141 * offset is in bytes, from the start of config space for the 1229 * offset is in bytes, from the start of config space for the
1142 * specified bus & device. 1230 * specified bus & device.
1143 */ 1231 */
1144
1145static int tile_cfg_read(struct pci_bus *bus, unsigned int devfn, int offset, 1232static int tile_cfg_read(struct pci_bus *bus, unsigned int devfn, int offset,
1146 int size, u32 *val) 1233 int size, u32 *val)
1147{ 1234{
@@ -1191,7 +1278,6 @@ static int tile_cfg_read(struct pci_bus *bus, unsigned int devfn, int offset,
1191 * Accesses to the directly attached device have to be 1278 * Accesses to the directly attached device have to be
1192 * sent as type-0 configs. 1279 * sent as type-0 configs.
1193 */ 1280 */
1194
1195 if (busnum == (controller->first_busno + 1)) { 1281 if (busnum == (controller->first_busno + 1)) {
1196 /* 1282 /*
1197 * There is only one device off of our built-in P2P bridge. 1283 * There is only one device off of our built-in P2P bridge.
@@ -1213,9 +1299,8 @@ static int tile_cfg_read(struct pci_bus *bus, unsigned int devfn, int offset,
1213 * Note that we don't set the mac field in cfg_addr because the 1299 * Note that we don't set the mac field in cfg_addr because the
1214 * mapping is per port. 1300 * mapping is per port.
1215 */ 1301 */
1216
1217 mmio_addr = trio_context->mmio_base_pio_cfg[controller->mac] + 1302 mmio_addr = trio_context->mmio_base_pio_cfg[controller->mac] +
1218 cfg_addr.word; 1303 cfg_addr.word;
1219 1304
1220valid_device: 1305valid_device:
1221 1306
@@ -1319,7 +1404,6 @@ static int tile_cfg_write(struct pci_bus *bus, unsigned int devfn, int offset,
1319 * Accesses to the directly attached device have to be 1404 * Accesses to the directly attached device have to be
1320 * sent as type-0 configs. 1405 * sent as type-0 configs.
1321 */ 1406 */
1322
1323 if (busnum == (controller->first_busno + 1)) { 1407 if (busnum == (controller->first_busno + 1)) {
1324 /* 1408 /*
1325 * There is only one device off of our built-in P2P bridge. 1409 * There is only one device off of our built-in P2P bridge.
@@ -1341,7 +1425,6 @@ static int tile_cfg_write(struct pci_bus *bus, unsigned int devfn, int offset,
1341 * Note that we don't set the mac field in cfg_addr because the 1425 * Note that we don't set the mac field in cfg_addr because the
1342 * mapping is per port. 1426 * mapping is per port.
1343 */ 1427 */
1344
1345 mmio_addr = trio_context->mmio_base_pio_cfg[controller->mac] + 1428 mmio_addr = trio_context->mmio_base_pio_cfg[controller->mac] +
1346 cfg_addr.word; 1429 cfg_addr.word;
1347 1430
@@ -1379,11 +1462,8 @@ static struct pci_ops tile_cfg_ops = {
1379}; 1462};
1380 1463
1381 1464
1382/* 1465/* MSI support starts here. */
1383 * MSI support starts here. 1466static unsigned int tilegx_msi_startup(struct irq_data *d)
1384 */
1385static unsigned int
1386tilegx_msi_startup(struct irq_data *d)
1387{ 1467{
1388 if (d->msi_desc) 1468 if (d->msi_desc)
1389 unmask_msi_irq(d); 1469 unmask_msi_irq(d);
@@ -1391,21 +1471,18 @@ tilegx_msi_startup(struct irq_data *d)
1391 return 0; 1471 return 0;
1392} 1472}
1393 1473
1394static void 1474static void tilegx_msi_ack(struct irq_data *d)
1395tilegx_msi_ack(struct irq_data *d)
1396{ 1475{
1397 __insn_mtspr(SPR_IPI_EVENT_RESET_K, 1UL << d->irq); 1476 __insn_mtspr(SPR_IPI_EVENT_RESET_K, 1UL << d->irq);
1398} 1477}
1399 1478
1400static void 1479static void tilegx_msi_mask(struct irq_data *d)
1401tilegx_msi_mask(struct irq_data *d)
1402{ 1480{
1403 mask_msi_irq(d); 1481 mask_msi_irq(d);
1404 __insn_mtspr(SPR_IPI_MASK_SET_K, 1UL << d->irq); 1482 __insn_mtspr(SPR_IPI_MASK_SET_K, 1UL << d->irq);
1405} 1483}
1406 1484
1407static void 1485static void tilegx_msi_unmask(struct irq_data *d)
1408tilegx_msi_unmask(struct irq_data *d)
1409{ 1486{
1410 __insn_mtspr(SPR_IPI_MASK_RESET_K, 1UL << d->irq); 1487 __insn_mtspr(SPR_IPI_MASK_RESET_K, 1UL << d->irq);
1411 unmask_msi_irq(d); 1488 unmask_msi_irq(d);
@@ -1462,32 +1539,55 @@ int arch_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *desc)
1462 trio_context = controller->trio; 1539 trio_context = controller->trio;
1463 1540
1464 /* 1541 /*
1465 * Allocate the Mem-Map that will accept the MSI write and 1542 * Allocate a scatter-queue that will accept the MSI write and
1466 * trigger the TILE-side interrupts. 1543 * trigger the TILE-side interrupts. We use the scatter-queue regions
1544 * before the mem map regions, because the latter are needed by more
1545 * applications.
1467 */ 1546 */
1468 mem_map = gxio_trio_alloc_memory_maps(trio_context, 1, 0, 0); 1547 mem_map = gxio_trio_alloc_scatter_queues(trio_context, 1, 0, 0);
1469 if (mem_map < 0) { 1548 if (mem_map >= 0) {
1470 dev_printk(KERN_INFO, &pdev->dev, 1549 TRIO_MAP_SQ_DOORBELL_FMT_t doorbell_template = {{
1471 "%s Mem-Map alloc failure. " 1550 .pop = 0,
1472 "Failed to initialize MSI interrupts. " 1551 .doorbell = 1,
1473 "Falling back to legacy interrupts.\n", 1552 }};
1474 desc->msi_attrib.is_msix ? "MSI-X" : "MSI"); 1553
1554 mem_map += TRIO_NUM_MAP_MEM_REGIONS;
1555 mem_map_base = MEM_MAP_INTR_REGIONS_BASE +
1556 mem_map * MEM_MAP_INTR_REGION_SIZE;
1557 mem_map_limit = mem_map_base + MEM_MAP_INTR_REGION_SIZE - 1;
1558
1559 msi_addr = mem_map_base + MEM_MAP_INTR_REGION_SIZE - 8;
1560 msg.data = (unsigned int)doorbell_template.word;
1561 } else {
1562 /* SQ regions are out, allocate from map mem regions. */
1563 mem_map = gxio_trio_alloc_memory_maps(trio_context, 1, 0, 0);
1564 if (mem_map < 0) {
1565 dev_printk(KERN_INFO, &pdev->dev,
1566 "%s Mem-Map alloc failure. "
1567 "Failed to initialize MSI interrupts. "
1568 "Falling back to legacy interrupts.\n",
1569 desc->msi_attrib.is_msix ? "MSI-X" : "MSI");
1570 ret = -ENOMEM;
1571 goto msi_mem_map_alloc_failure;
1572 }
1475 1573
1476 ret = -ENOMEM; 1574 mem_map_base = MEM_MAP_INTR_REGIONS_BASE +
1477 goto msi_mem_map_alloc_failure; 1575 mem_map * MEM_MAP_INTR_REGION_SIZE;
1576 mem_map_limit = mem_map_base + MEM_MAP_INTR_REGION_SIZE - 1;
1577
1578 msi_addr = mem_map_base + TRIO_MAP_MEM_REG_INT3 -
1579 TRIO_MAP_MEM_REG_INT0;
1580
1581 msg.data = mem_map;
1478 } 1582 }
1479 1583
1480 /* We try to distribute different IRQs to different tiles. */ 1584 /* We try to distribute different IRQs to different tiles. */
1481 cpu = tile_irq_cpu(irq); 1585 cpu = tile_irq_cpu(irq);
1482 1586
1483 /* 1587 /*
1484 * Now call up to the HV to configure the Mem-Map interrupt and 1588 * Now call up to the HV to configure the MSI interrupt and
1485 * set up the IPI binding. 1589 * set up the IPI binding.
1486 */ 1590 */
1487 mem_map_base = MEM_MAP_INTR_REGIONS_BASE +
1488 mem_map * MEM_MAP_INTR_REGION_SIZE;
1489 mem_map_limit = mem_map_base + MEM_MAP_INTR_REGION_SIZE - 1;
1490
1491 ret = gxio_trio_config_msi_intr(trio_context, cpu_x(cpu), cpu_y(cpu), 1591 ret = gxio_trio_config_msi_intr(trio_context, cpu_x(cpu), cpu_y(cpu),
1492 KERNEL_PL, irq, controller->mac, 1592 KERNEL_PL, irq, controller->mac,
1493 mem_map, mem_map_base, mem_map_limit, 1593 mem_map, mem_map_base, mem_map_limit,
@@ -1500,13 +1600,9 @@ int arch_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *desc)
1500 1600
1501 irq_set_msi_desc(irq, desc); 1601 irq_set_msi_desc(irq, desc);
1502 1602
1503 msi_addr = mem_map_base + TRIO_MAP_MEM_REG_INT3 - TRIO_MAP_MEM_REG_INT0;
1504
1505 msg.address_hi = msi_addr >> 32; 1603 msg.address_hi = msi_addr >> 32;
1506 msg.address_lo = msi_addr & 0xffffffff; 1604 msg.address_lo = msi_addr & 0xffffffff;
1507 1605
1508 msg.data = mem_map;
1509
1510 write_msi_msg(irq, &msg); 1606 write_msi_msg(irq, &msg);
1511 irq_set_chip_and_handler(irq, &tilegx_msi_chip, handle_level_irq); 1607 irq_set_chip_and_handler(irq, &tilegx_msi_chip, handle_level_irq);
1512 irq_set_handler_data(irq, controller); 1608 irq_set_handler_data(irq, controller);
diff --git a/arch/tile/kernel/proc.c b/arch/tile/kernel/proc.c
index dafc447b5125..681100c59fda 100644
--- a/arch/tile/kernel/proc.c
+++ b/arch/tile/kernel/proc.c
@@ -113,7 +113,6 @@ arch_initcall(proc_tile_init);
113 * Support /proc/sys/tile directory 113 * Support /proc/sys/tile directory
114 */ 114 */
115 115
116#ifndef __tilegx__ /* FIXME: GX: no support for unaligned access yet */
117static ctl_table unaligned_subtable[] = { 116static ctl_table unaligned_subtable[] = {
118 { 117 {
119 .procname = "enabled", 118 .procname = "enabled",
@@ -160,4 +159,3 @@ static int __init proc_sys_tile_init(void)
160} 159}
161 160
162arch_initcall(proc_sys_tile_init); 161arch_initcall(proc_sys_tile_init);
163#endif
diff --git a/arch/tile/kernel/process.c b/arch/tile/kernel/process.c
index 8ac304484f98..16ed58948757 100644
--- a/arch/tile/kernel/process.c
+++ b/arch/tile/kernel/process.c
@@ -33,6 +33,7 @@
33#include <asm/syscalls.h> 33#include <asm/syscalls.h>
34#include <asm/traps.h> 34#include <asm/traps.h>
35#include <asm/setup.h> 35#include <asm/setup.h>
36#include <asm/uaccess.h>
36#ifdef CONFIG_HARDWALL 37#ifdef CONFIG_HARDWALL
37#include <asm/hardwall.h> 38#include <asm/hardwall.h>
38#endif 39#endif
@@ -74,19 +75,6 @@ void arch_release_thread_info(struct thread_info *info)
74{ 75{
75 struct single_step_state *step_state = info->step_state; 76 struct single_step_state *step_state = info->step_state;
76 77
77#ifdef CONFIG_HARDWALL
78 /*
79 * We free a thread_info from the context of the task that has
80 * been scheduled next, so the original task is already dead.
81 * Calling deactivate here just frees up the data structures.
82 * If the task we're freeing held the last reference to a
83 * hardwall fd, it would have been released prior to this point
84 * anyway via exit_files(), and the hardwall_task.info pointers
85 * would be NULL by now.
86 */
87 hardwall_deactivate_all(info->task);
88#endif
89
90 if (step_state) { 78 if (step_state) {
91 79
92 /* 80 /*
@@ -160,6 +148,14 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,
160 */ 148 */
161 task_thread_info(p)->step_state = NULL; 149 task_thread_info(p)->step_state = NULL;
162 150
151#ifdef __tilegx__
152 /*
153 * Do not clone unalign jit fixup from the parent; each thread
154 * must allocate its own on demand.
155 */
156 task_thread_info(p)->unalign_jit_base = NULL;
157#endif
158
163 /* 159 /*
164 * Copy the registers onto the kernel stack so the 160 * Copy the registers onto the kernel stack so the
165 * return-from-interrupt code will reload it into registers. 161 * return-from-interrupt code will reload it into registers.
@@ -191,16 +187,8 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,
191 memset(&p->thread.dma_async_tlb, 0, sizeof(struct async_tlb)); 187 memset(&p->thread.dma_async_tlb, 0, sizeof(struct async_tlb));
192#endif 188#endif
193 189
194#if CHIP_HAS_SN_PROC()
195 /* Likewise, the new thread is not running static processor code. */
196 p->thread.sn_proc_running = 0;
197 memset(&p->thread.sn_async_tlb, 0, sizeof(struct async_tlb));
198#endif
199
200#if CHIP_HAS_PROC_STATUS_SPR()
201 /* New thread has its miscellaneous processor state bits clear. */ 190 /* New thread has its miscellaneous processor state bits clear. */
202 p->thread.proc_status = 0; 191 p->thread.proc_status = 0;
203#endif
204 192
205#ifdef CONFIG_HARDWALL 193#ifdef CONFIG_HARDWALL
206 /* New thread does not own any networks. */ 194 /* New thread does not own any networks. */
@@ -218,19 +206,32 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,
218 return 0; 206 return 0;
219} 207}
220 208
209int set_unalign_ctl(struct task_struct *tsk, unsigned int val)
210{
211 task_thread_info(tsk)->align_ctl = val;
212 return 0;
213}
214
215int get_unalign_ctl(struct task_struct *tsk, unsigned long adr)
216{
217 return put_user(task_thread_info(tsk)->align_ctl,
218 (unsigned int __user *)adr);
219}
220
221static struct task_struct corrupt_current = { .comm = "<corrupt>" };
222
221/* 223/*
222 * Return "current" if it looks plausible, or else a pointer to a dummy. 224 * Return "current" if it looks plausible, or else a pointer to a dummy.
223 * This can be helpful if we are just trying to emit a clean panic. 225 * This can be helpful if we are just trying to emit a clean panic.
224 */ 226 */
225struct task_struct *validate_current(void) 227struct task_struct *validate_current(void)
226{ 228{
227 static struct task_struct corrupt = { .comm = "<corrupt>" };
228 struct task_struct *tsk = current; 229 struct task_struct *tsk = current;
229 if (unlikely((unsigned long)tsk < PAGE_OFFSET || 230 if (unlikely((unsigned long)tsk < PAGE_OFFSET ||
230 (high_memory && (void *)tsk > high_memory) || 231 (high_memory && (void *)tsk > high_memory) ||
231 ((unsigned long)tsk & (__alignof__(*tsk) - 1)) != 0)) { 232 ((unsigned long)tsk & (__alignof__(*tsk) - 1)) != 0)) {
232 pr_err("Corrupt 'current' %p (sp %#lx)\n", tsk, stack_pointer); 233 pr_err("Corrupt 'current' %p (sp %#lx)\n", tsk, stack_pointer);
233 tsk = &corrupt; 234 tsk = &corrupt_current;
234 } 235 }
235 return tsk; 236 return tsk;
236} 237}
@@ -369,15 +370,11 @@ static void save_arch_state(struct thread_struct *t)
369 t->system_save[2] = __insn_mfspr(SPR_SYSTEM_SAVE_0_2); 370 t->system_save[2] = __insn_mfspr(SPR_SYSTEM_SAVE_0_2);
370 t->system_save[3] = __insn_mfspr(SPR_SYSTEM_SAVE_0_3); 371 t->system_save[3] = __insn_mfspr(SPR_SYSTEM_SAVE_0_3);
371 t->intctrl_0 = __insn_mfspr(SPR_INTCTRL_0_STATUS); 372 t->intctrl_0 = __insn_mfspr(SPR_INTCTRL_0_STATUS);
372#if CHIP_HAS_PROC_STATUS_SPR()
373 t->proc_status = __insn_mfspr(SPR_PROC_STATUS); 373 t->proc_status = __insn_mfspr(SPR_PROC_STATUS);
374#endif
375#if !CHIP_HAS_FIXED_INTVEC_BASE() 374#if !CHIP_HAS_FIXED_INTVEC_BASE()
376 t->interrupt_vector_base = __insn_mfspr(SPR_INTERRUPT_VECTOR_BASE_0); 375 t->interrupt_vector_base = __insn_mfspr(SPR_INTERRUPT_VECTOR_BASE_0);
377#endif 376#endif
378#if CHIP_HAS_TILE_RTF_HWM()
379 t->tile_rtf_hwm = __insn_mfspr(SPR_TILE_RTF_HWM); 377 t->tile_rtf_hwm = __insn_mfspr(SPR_TILE_RTF_HWM);
380#endif
381#if CHIP_HAS_DSTREAM_PF() 378#if CHIP_HAS_DSTREAM_PF()
382 t->dstream_pf = __insn_mfspr(SPR_DSTREAM_PF); 379 t->dstream_pf = __insn_mfspr(SPR_DSTREAM_PF);
383#endif 380#endif
@@ -398,15 +395,11 @@ static void restore_arch_state(const struct thread_struct *t)
398 __insn_mtspr(SPR_SYSTEM_SAVE_0_2, t->system_save[2]); 395 __insn_mtspr(SPR_SYSTEM_SAVE_0_2, t->system_save[2]);
399 __insn_mtspr(SPR_SYSTEM_SAVE_0_3, t->system_save[3]); 396 __insn_mtspr(SPR_SYSTEM_SAVE_0_3, t->system_save[3]);
400 __insn_mtspr(SPR_INTCTRL_0_STATUS, t->intctrl_0); 397 __insn_mtspr(SPR_INTCTRL_0_STATUS, t->intctrl_0);
401#if CHIP_HAS_PROC_STATUS_SPR()
402 __insn_mtspr(SPR_PROC_STATUS, t->proc_status); 398 __insn_mtspr(SPR_PROC_STATUS, t->proc_status);
403#endif
404#if !CHIP_HAS_FIXED_INTVEC_BASE() 399#if !CHIP_HAS_FIXED_INTVEC_BASE()
405 __insn_mtspr(SPR_INTERRUPT_VECTOR_BASE_0, t->interrupt_vector_base); 400 __insn_mtspr(SPR_INTERRUPT_VECTOR_BASE_0, t->interrupt_vector_base);
406#endif 401#endif
407#if CHIP_HAS_TILE_RTF_HWM()
408 __insn_mtspr(SPR_TILE_RTF_HWM, t->tile_rtf_hwm); 402 __insn_mtspr(SPR_TILE_RTF_HWM, t->tile_rtf_hwm);
409#endif
410#if CHIP_HAS_DSTREAM_PF() 403#if CHIP_HAS_DSTREAM_PF()
411 __insn_mtspr(SPR_DSTREAM_PF, t->dstream_pf); 404 __insn_mtspr(SPR_DSTREAM_PF, t->dstream_pf);
412#endif 405#endif
@@ -415,26 +408,11 @@ static void restore_arch_state(const struct thread_struct *t)
415 408
416void _prepare_arch_switch(struct task_struct *next) 409void _prepare_arch_switch(struct task_struct *next)
417{ 410{
418#if CHIP_HAS_SN_PROC()
419 int snctl;
420#endif
421#if CHIP_HAS_TILE_DMA() 411#if CHIP_HAS_TILE_DMA()
422 struct tile_dma_state *dma = &current->thread.tile_dma_state; 412 struct tile_dma_state *dma = &current->thread.tile_dma_state;
423 if (dma->enabled) 413 if (dma->enabled)
424 save_tile_dma_state(dma); 414 save_tile_dma_state(dma);
425#endif 415#endif
426#if CHIP_HAS_SN_PROC()
427 /*
428 * Suspend the static network processor if it was running.
429 * We do not suspend the fabric itself, just like we don't
430 * try to suspend the UDN.
431 */
432 snctl = __insn_mfspr(SPR_SNCTL);
433 current->thread.sn_proc_running =
434 (snctl & SPR_SNCTL__FRZPROC_MASK) == 0;
435 if (current->thread.sn_proc_running)
436 __insn_mtspr(SPR_SNCTL, snctl | SPR_SNCTL__FRZPROC_MASK);
437#endif
438} 416}
439 417
440 418
@@ -462,17 +440,6 @@ struct task_struct *__sched _switch_to(struct task_struct *prev,
462 /* Restore other arch state. */ 440 /* Restore other arch state. */
463 restore_arch_state(&next->thread); 441 restore_arch_state(&next->thread);
464 442
465#if CHIP_HAS_SN_PROC()
466 /*
467 * Restart static network processor in the new process
468 * if it was running before.
469 */
470 if (next->thread.sn_proc_running) {
471 int snctl = __insn_mfspr(SPR_SNCTL);
472 __insn_mtspr(SPR_SNCTL, snctl & ~SPR_SNCTL__FRZPROC_MASK);
473 }
474#endif
475
476#ifdef CONFIG_HARDWALL 443#ifdef CONFIG_HARDWALL
477 /* Enable or disable access to the network registers appropriately. */ 444 /* Enable or disable access to the network registers appropriately. */
478 hardwall_switch_tasks(prev, next); 445 hardwall_switch_tasks(prev, next);
@@ -514,7 +481,7 @@ int do_work_pending(struct pt_regs *regs, u32 thread_info_flags)
514 schedule(); 481 schedule();
515 return 1; 482 return 1;
516 } 483 }
517#if CHIP_HAS_TILE_DMA() || CHIP_HAS_SN_PROC() 484#if CHIP_HAS_TILE_DMA()
518 if (thread_info_flags & _TIF_ASYNC_TLB) { 485 if (thread_info_flags & _TIF_ASYNC_TLB) {
519 do_async_page_fault(regs); 486 do_async_page_fault(regs);
520 return 1; 487 return 1;
@@ -564,7 +531,15 @@ void flush_thread(void)
564 */ 531 */
565void exit_thread(void) 532void exit_thread(void)
566{ 533{
567 /* Nothing */ 534#ifdef CONFIG_HARDWALL
535 /*
536 * Remove the task from the list of tasks that are associated
537 * with any live hardwalls. (If the task that is exiting held
538 * the last reference to a hardwall fd, it would already have
539 * been released and deactivated at this point.)
540 */
541 hardwall_deactivate_all(current);
542#endif
568} 543}
569 544
570void show_regs(struct pt_regs *regs) 545void show_regs(struct pt_regs *regs)
@@ -573,23 +548,24 @@ void show_regs(struct pt_regs *regs)
573 int i; 548 int i;
574 549
575 pr_err("\n"); 550 pr_err("\n");
576 show_regs_print_info(KERN_ERR); 551 if (tsk != &corrupt_current)
552 show_regs_print_info(KERN_ERR);
577#ifdef __tilegx__ 553#ifdef __tilegx__
578 for (i = 0; i < 51; i += 3) 554 for (i = 0; i < 17; i++)
579 pr_err(" r%-2d: "REGFMT" r%-2d: "REGFMT" r%-2d: "REGFMT"\n", 555 pr_err(" r%-2d: "REGFMT" r%-2d: "REGFMT" r%-2d: "REGFMT"\n",
580 i, regs->regs[i], i+1, regs->regs[i+1], 556 i, regs->regs[i], i+18, regs->regs[i+18],
581 i+2, regs->regs[i+2]); 557 i+36, regs->regs[i+36]);
582 pr_err(" r51: "REGFMT" r52: "REGFMT" tp : "REGFMT"\n", 558 pr_err(" r17: "REGFMT" r35: "REGFMT" tp : "REGFMT"\n",
583 regs->regs[51], regs->regs[52], regs->tp); 559 regs->regs[17], regs->regs[35], regs->tp);
584 pr_err(" sp : "REGFMT" lr : "REGFMT"\n", regs->sp, regs->lr); 560 pr_err(" sp : "REGFMT" lr : "REGFMT"\n", regs->sp, regs->lr);
585#else 561#else
586 for (i = 0; i < 52; i += 4) 562 for (i = 0; i < 13; i++)
587 pr_err(" r%-2d: "REGFMT" r%-2d: "REGFMT 563 pr_err(" r%-2d: "REGFMT" r%-2d: "REGFMT
588 " r%-2d: "REGFMT" r%-2d: "REGFMT"\n", 564 " r%-2d: "REGFMT" r%-2d: "REGFMT"\n",
589 i, regs->regs[i], i+1, regs->regs[i+1], 565 i, regs->regs[i], i+14, regs->regs[i+14],
590 i+2, regs->regs[i+2], i+3, regs->regs[i+3]); 566 i+27, regs->regs[i+27], i+40, regs->regs[i+40]);
591 pr_err(" r52: "REGFMT" tp : "REGFMT" sp : "REGFMT" lr : "REGFMT"\n", 567 pr_err(" r13: "REGFMT" tp : "REGFMT" sp : "REGFMT" lr : "REGFMT"\n",
592 regs->regs[52], regs->tp, regs->sp, regs->lr); 568 regs->regs[13], regs->tp, regs->sp, regs->lr);
593#endif 569#endif
594 pr_err(" pc : "REGFMT" ex1: %ld faultnum: %ld\n", 570 pr_err(" pc : "REGFMT" ex1: %ld faultnum: %ld\n",
595 regs->pc, regs->ex1, regs->faultnum); 571 regs->pc, regs->ex1, regs->faultnum);
diff --git a/arch/tile/kernel/ptrace.c b/arch/tile/kernel/ptrace.c
index 0f83ed4602b2..de98c6ddf136 100644
--- a/arch/tile/kernel/ptrace.c
+++ b/arch/tile/kernel/ptrace.c
@@ -265,6 +265,21 @@ int do_syscall_trace_enter(struct pt_regs *regs)
265 265
266void do_syscall_trace_exit(struct pt_regs *regs) 266void do_syscall_trace_exit(struct pt_regs *regs)
267{ 267{
268 long errno;
269
270 /*
271 * The standard tile calling convention returns the value (or negative
272 * errno) in r0, and zero (or positive errno) in r1.
273 * It saves a couple of cycles on the hot path to do this work in
274 * registers only as we return, rather than updating the in-memory
275 * struct ptregs.
276 */
277 errno = (long) regs->regs[0];
278 if (errno < 0 && errno > -4096)
279 regs->regs[1] = -errno;
280 else
281 regs->regs[1] = 0;
282
268 if (test_thread_flag(TIF_SYSCALL_TRACE)) 283 if (test_thread_flag(TIF_SYSCALL_TRACE))
269 tracehook_report_syscall_exit(regs, 0); 284 tracehook_report_syscall_exit(regs, 0);
270 285
@@ -272,7 +287,7 @@ void do_syscall_trace_exit(struct pt_regs *regs)
272 trace_sys_exit(regs, regs->regs[0]); 287 trace_sys_exit(regs, regs->regs[0]);
273} 288}
274 289
275void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, int error_code) 290void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs)
276{ 291{
277 struct siginfo info; 292 struct siginfo info;
278 293
@@ -288,5 +303,5 @@ void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, int error_code)
288/* Handle synthetic interrupt delivered only by the simulator. */ 303/* Handle synthetic interrupt delivered only by the simulator. */
289void __kprobes do_breakpoint(struct pt_regs* regs, int fault_num) 304void __kprobes do_breakpoint(struct pt_regs* regs, int fault_num)
290{ 305{
291 send_sigtrap(current, regs, fault_num); 306 send_sigtrap(current, regs);
292} 307}
diff --git a/arch/tile/kernel/reboot.c b/arch/tile/kernel/reboot.c
index d1b5c913ae72..6c5d2c070a12 100644
--- a/arch/tile/kernel/reboot.c
+++ b/arch/tile/kernel/reboot.c
@@ -27,7 +27,6 @@
27 27
28void machine_halt(void) 28void machine_halt(void)
29{ 29{
30 warn_early_printk();
31 arch_local_irq_disable_all(); 30 arch_local_irq_disable_all();
32 smp_send_stop(); 31 smp_send_stop();
33 hv_halt(); 32 hv_halt();
@@ -35,7 +34,6 @@ void machine_halt(void)
35 34
36void machine_power_off(void) 35void machine_power_off(void)
37{ 36{
38 warn_early_printk();
39 arch_local_irq_disable_all(); 37 arch_local_irq_disable_all();
40 smp_send_stop(); 38 smp_send_stop();
41 hv_power_off(); 39 hv_power_off();
diff --git a/arch/tile/kernel/regs_32.S b/arch/tile/kernel/regs_32.S
index c12280c2d904..542cae17a93a 100644
--- a/arch/tile/kernel/regs_32.S
+++ b/arch/tile/kernel/regs_32.S
@@ -20,7 +20,7 @@
20#include <asm/switch_to.h> 20#include <asm/switch_to.h>
21 21
22/* 22/*
23 * See <asm/system.h>; called with prev and next task_struct pointers. 23 * See <asm/switch_to.h>; called with prev and next task_struct pointers.
24 * "prev" is returned in r0 for _switch_to and also for ret_from_fork. 24 * "prev" is returned in r0 for _switch_to and also for ret_from_fork.
25 * 25 *
26 * We want to save pc/sp in "prev", and get the new pc/sp from "next". 26 * We want to save pc/sp in "prev", and get the new pc/sp from "next".
@@ -39,7 +39,7 @@
39 */ 39 */
40 40
41#if CALLEE_SAVED_REGS_COUNT != 24 41#if CALLEE_SAVED_REGS_COUNT != 24
42# error Mismatch between <asm/system.h> and kernel/entry.S 42# error Mismatch between <asm/switch_to.h> and kernel/entry.S
43#endif 43#endif
44#define FRAME_SIZE ((2 + CALLEE_SAVED_REGS_COUNT) * 4) 44#define FRAME_SIZE ((2 + CALLEE_SAVED_REGS_COUNT) * 4)
45 45
diff --git a/arch/tile/kernel/regs_64.S b/arch/tile/kernel/regs_64.S
index 0829fd01fa30..bbffcc6f340f 100644
--- a/arch/tile/kernel/regs_64.S
+++ b/arch/tile/kernel/regs_64.S
@@ -20,7 +20,7 @@
20#include <asm/switch_to.h> 20#include <asm/switch_to.h>
21 21
22/* 22/*
23 * See <asm/system.h>; called with prev and next task_struct pointers. 23 * See <asm/switch_to.h>; called with prev and next task_struct pointers.
24 * "prev" is returned in r0 for _switch_to and also for ret_from_fork. 24 * "prev" is returned in r0 for _switch_to and also for ret_from_fork.
25 * 25 *
26 * We want to save pc/sp in "prev", and get the new pc/sp from "next". 26 * We want to save pc/sp in "prev", and get the new pc/sp from "next".
@@ -39,7 +39,7 @@
39 */ 39 */
40 40
41#if CALLEE_SAVED_REGS_COUNT != 24 41#if CALLEE_SAVED_REGS_COUNT != 24
42# error Mismatch between <asm/system.h> and kernel/entry.S 42# error Mismatch between <asm/switch_to.h> and kernel/entry.S
43#endif 43#endif
44#define FRAME_SIZE ((2 + CALLEE_SAVED_REGS_COUNT) * 8) 44#define FRAME_SIZE ((2 + CALLEE_SAVED_REGS_COUNT) * 8)
45 45
diff --git a/arch/tile/kernel/relocate_kernel_32.S b/arch/tile/kernel/relocate_kernel_32.S
index 010b418515f8..e44fbcf8cbd5 100644
--- a/arch/tile/kernel/relocate_kernel_32.S
+++ b/arch/tile/kernel/relocate_kernel_32.S
@@ -20,15 +20,6 @@
20#include <asm/page.h> 20#include <asm/page.h>
21#include <hv/hypervisor.h> 21#include <hv/hypervisor.h>
22 22
23#define ___hvb MEM_SV_INTRPT + HV_GLUE_START_CPA
24
25#define ___hv_dispatch(f) (___hvb + (HV_DISPATCH_ENTRY_SIZE * f))
26
27#define ___hv_console_putc ___hv_dispatch(HV_DISPATCH_CONSOLE_PUTC)
28#define ___hv_halt ___hv_dispatch(HV_DISPATCH_HALT)
29#define ___hv_reexec ___hv_dispatch(HV_DISPATCH_REEXEC)
30#define ___hv_flush_remote ___hv_dispatch(HV_DISPATCH_FLUSH_REMOTE)
31
32#undef RELOCATE_NEW_KERNEL_VERBOSE 23#undef RELOCATE_NEW_KERNEL_VERBOSE
33 24
34STD_ENTRY(relocate_new_kernel) 25STD_ENTRY(relocate_new_kernel)
@@ -43,8 +34,8 @@ STD_ENTRY(relocate_new_kernel)
43 addi sp, sp, -8 34 addi sp, sp, -8
44 /* we now have a stack (whether we need one or not) */ 35 /* we now have a stack (whether we need one or not) */
45 36
46 moveli r40, lo16(___hv_console_putc) 37 moveli r40, lo16(hv_console_putc)
47 auli r40, r40, ha16(___hv_console_putc) 38 auli r40, r40, ha16(hv_console_putc)
48 39
49#ifdef RELOCATE_NEW_KERNEL_VERBOSE 40#ifdef RELOCATE_NEW_KERNEL_VERBOSE
50 moveli r0, 'r' 41 moveli r0, 'r'
@@ -86,7 +77,6 @@ STD_ENTRY(relocate_new_kernel)
86 move r30, sp 77 move r30, sp
87 addi sp, sp, -8 78 addi sp, sp, -8
88 79
89#if CHIP_HAS_CBOX_HOME_MAP()
90 /* 80 /*
91 * On TILEPro, we need to flush all tiles' caches, since we may 81 * On TILEPro, we need to flush all tiles' caches, since we may
92 * have been doing hash-for-home caching there. Note that we 82 * have been doing hash-for-home caching there. Note that we
@@ -114,15 +104,14 @@ STD_ENTRY(relocate_new_kernel)
114 } 104 }
115 { 105 {
116 move r8, zero /* asids */ 106 move r8, zero /* asids */
117 moveli r20, lo16(___hv_flush_remote) 107 moveli r20, lo16(hv_flush_remote)
118 } 108 }
119 { 109 {
120 move r9, zero /* asidcount */ 110 move r9, zero /* asidcount */
121 auli r20, r20, ha16(___hv_flush_remote) 111 auli r20, r20, ha16(hv_flush_remote)
122 } 112 }
123 113
124 jalr r20 114 jalr r20
125#endif
126 115
127 /* r33 is destination pointer, default to zero */ 116 /* r33 is destination pointer, default to zero */
128 117
@@ -175,8 +164,8 @@ STD_ENTRY(relocate_new_kernel)
175 move r0, r32 164 move r0, r32
176 moveli r1, 0 /* arg to hv_reexec is 64 bits */ 165 moveli r1, 0 /* arg to hv_reexec is 64 bits */
177 166
178 moveli r41, lo16(___hv_reexec) 167 moveli r41, lo16(hv_reexec)
179 auli r41, r41, ha16(___hv_reexec) 168 auli r41, r41, ha16(hv_reexec)
180 169
181 jalr r41 170 jalr r41
182 171
@@ -267,8 +256,8 @@ STD_ENTRY(relocate_new_kernel)
267 moveli r0, '\n' 256 moveli r0, '\n'
268 jalr r40 257 jalr r40
269.Lhalt: 258.Lhalt:
270 moveli r41, lo16(___hv_halt) 259 moveli r41, lo16(hv_halt)
271 auli r41, r41, ha16(___hv_halt) 260 auli r41, r41, ha16(hv_halt)
272 261
273 jalr r41 262 jalr r41
274 STD_ENDPROC(relocate_new_kernel) 263 STD_ENDPROC(relocate_new_kernel)
diff --git a/arch/tile/kernel/relocate_kernel_64.S b/arch/tile/kernel/relocate_kernel_64.S
index 1c09a4f5a4ea..d9d8cf6176e8 100644
--- a/arch/tile/kernel/relocate_kernel_64.S
+++ b/arch/tile/kernel/relocate_kernel_64.S
@@ -34,11 +34,11 @@ STD_ENTRY(relocate_new_kernel)
34 addi sp, sp, -8 34 addi sp, sp, -8
35 /* we now have a stack (whether we need one or not) */ 35 /* we now have a stack (whether we need one or not) */
36 36
37#ifdef RELOCATE_NEW_KERNEL_VERBOSE
37 moveli r40, hw2_last(hv_console_putc) 38 moveli r40, hw2_last(hv_console_putc)
38 shl16insli r40, r40, hw1(hv_console_putc) 39 shl16insli r40, r40, hw1(hv_console_putc)
39 shl16insli r40, r40, hw0(hv_console_putc) 40 shl16insli r40, r40, hw0(hv_console_putc)
40 41
41#ifdef RELOCATE_NEW_KERNEL_VERBOSE
42 moveli r0, 'r' 42 moveli r0, 'r'
43 jalr r40 43 jalr r40
44 44
@@ -78,7 +78,6 @@ STD_ENTRY(relocate_new_kernel)
78 move r30, sp 78 move r30, sp
79 addi sp, sp, -16 79 addi sp, sp, -16
80 80
81#if CHIP_HAS_CBOX_HOME_MAP()
82 /* 81 /*
83 * On TILE-GX, we need to flush all tiles' caches, since we may 82 * On TILE-GX, we need to flush all tiles' caches, since we may
84 * have been doing hash-for-home caching there. Note that we 83 * have been doing hash-for-home caching there. Note that we
@@ -116,7 +115,6 @@ STD_ENTRY(relocate_new_kernel)
116 shl16insli r20, r20, hw0(hv_flush_remote) 115 shl16insli r20, r20, hw0(hv_flush_remote)
117 116
118 jalr r20 117 jalr r20
119#endif
120 118
121 /* r33 is destination pointer, default to zero */ 119 /* r33 is destination pointer, default to zero */
122 120
@@ -176,10 +174,12 @@ STD_ENTRY(relocate_new_kernel)
176 174
177 /* we should not get here */ 175 /* we should not get here */
178 176
177#ifdef RELOCATE_NEW_KERNEL_VERBOSE
179 moveli r0, '?' 178 moveli r0, '?'
180 jalr r40 179 jalr r40
181 moveli r0, '\n' 180 moveli r0, '\n'
182 jalr r40 181 jalr r40
182#endif
183 183
184 j .Lhalt 184 j .Lhalt
185 185
@@ -237,7 +237,9 @@ STD_ENTRY(relocate_new_kernel)
237 j .Lloop 237 j .Lloop
238 238
239 239
240.Lerr: moveli r0, 'e' 240.Lerr:
241#ifdef RELOCATE_NEW_KERNEL_VERBOSE
242 moveli r0, 'e'
241 jalr r40 243 jalr r40
242 moveli r0, 'r' 244 moveli r0, 'r'
243 jalr r40 245 jalr r40
@@ -245,6 +247,7 @@ STD_ENTRY(relocate_new_kernel)
245 jalr r40 247 jalr r40
246 moveli r0, '\n' 248 moveli r0, '\n'
247 jalr r40 249 jalr r40
250#endif
248.Lhalt: 251.Lhalt:
249 moveli r41, hw2_last(hv_halt) 252 moveli r41, hw2_last(hv_halt)
250 shl16insli r41, r41, hw1(hv_halt) 253 shl16insli r41, r41, hw1(hv_halt)
diff --git a/arch/tile/kernel/setup.c b/arch/tile/kernel/setup.c
index eceb8344280f..74c91729a62a 100644
--- a/arch/tile/kernel/setup.c
+++ b/arch/tile/kernel/setup.c
@@ -154,6 +154,65 @@ static int __init setup_maxnodemem(char *str)
154} 154}
155early_param("maxnodemem", setup_maxnodemem); 155early_param("maxnodemem", setup_maxnodemem);
156 156
157struct memmap_entry {
158 u64 addr; /* start of memory segment */
159 u64 size; /* size of memory segment */
160};
161static struct memmap_entry memmap_map[64];
162static int memmap_nr;
163
164static void add_memmap_region(u64 addr, u64 size)
165{
166 if (memmap_nr >= ARRAY_SIZE(memmap_map)) {
167 pr_err("Ooops! Too many entries in the memory map!\n");
168 return;
169 }
170 memmap_map[memmap_nr].addr = addr;
171 memmap_map[memmap_nr].size = size;
172 memmap_nr++;
173}
174
175static int __init setup_memmap(char *p)
176{
177 char *oldp;
178 u64 start_at, mem_size;
179
180 if (!p)
181 return -EINVAL;
182
183 if (!strncmp(p, "exactmap", 8)) {
184 pr_err("\"memmap=exactmap\" not valid on tile\n");
185 return 0;
186 }
187
188 oldp = p;
189 mem_size = memparse(p, &p);
190 if (p == oldp)
191 return -EINVAL;
192
193 if (*p == '@') {
194 pr_err("\"memmap=nn@ss\" (force RAM) invalid on tile\n");
195 } else if (*p == '#') {
196 pr_err("\"memmap=nn#ss\" (force ACPI data) invalid on tile\n");
197 } else if (*p == '$') {
198 start_at = memparse(p+1, &p);
199 add_memmap_region(start_at, mem_size);
200 } else {
201 if (mem_size == 0)
202 return -EINVAL;
203 maxmem_pfn = (mem_size >> HPAGE_SHIFT) <<
204 (HPAGE_SHIFT - PAGE_SHIFT);
205 }
206 return *p == '\0' ? 0 : -EINVAL;
207}
208early_param("memmap", setup_memmap);
209
210static int __init setup_mem(char *str)
211{
212 return setup_maxmem(str);
213}
214early_param("mem", setup_mem); /* compatibility with x86 */
215
157static int __init setup_isolnodes(char *str) 216static int __init setup_isolnodes(char *str)
158{ 217{
159 char buf[MAX_NUMNODES * 5]; 218 char buf[MAX_NUMNODES * 5];
@@ -209,7 +268,7 @@ early_param("vmalloc", parse_vmalloc);
209/* 268/*
210 * Determine for each controller where its lowmem is mapped and how much of 269 * Determine for each controller where its lowmem is mapped and how much of
211 * it is mapped there. On controller zero, the first few megabytes are 270 * it is mapped there. On controller zero, the first few megabytes are
212 * already mapped in as code at MEM_SV_INTRPT, so in principle we could 271 * already mapped in as code at MEM_SV_START, so in principle we could
213 * start our data mappings higher up, but for now we don't bother, to avoid 272 * start our data mappings higher up, but for now we don't bother, to avoid
214 * additional confusion. 273 * additional confusion.
215 * 274 *
@@ -614,11 +673,12 @@ static void __init setup_bootmem_allocator_node(int i)
614 /* 673 /*
615 * Throw away any memory aliased by the PCI region. 674 * Throw away any memory aliased by the PCI region.
616 */ 675 */
617 if (pci_reserve_start_pfn < end && pci_reserve_end_pfn > start) 676 if (pci_reserve_start_pfn < end && pci_reserve_end_pfn > start) {
618 reserve_bootmem(PFN_PHYS(pci_reserve_start_pfn), 677 start = max(pci_reserve_start_pfn, start);
619 PFN_PHYS(pci_reserve_end_pfn - 678 end = min(pci_reserve_end_pfn, end);
620 pci_reserve_start_pfn), 679 reserve_bootmem(PFN_PHYS(start), PFN_PHYS(end - start),
621 BOOTMEM_EXCLUSIVE); 680 BOOTMEM_EXCLUSIVE);
681 }
622#endif 682#endif
623} 683}
624 684
@@ -628,6 +688,31 @@ static void __init setup_bootmem_allocator(void)
628 for (i = 0; i < MAX_NUMNODES; ++i) 688 for (i = 0; i < MAX_NUMNODES; ++i)
629 setup_bootmem_allocator_node(i); 689 setup_bootmem_allocator_node(i);
630 690
691 /* Reserve any memory excluded by "memmap" arguments. */
692 for (i = 0; i < memmap_nr; ++i) {
693 struct memmap_entry *m = &memmap_map[i];
694 reserve_bootmem(m->addr, m->size, 0);
695 }
696
697#ifdef CONFIG_BLK_DEV_INITRD
698 if (initrd_start) {
699 /* Make sure the initrd memory region is not modified. */
700 if (reserve_bootmem(initrd_start, initrd_end - initrd_start,
701 BOOTMEM_EXCLUSIVE)) {
702 pr_crit("The initrd memory region has been polluted. Disabling it.\n");
703 initrd_start = 0;
704 initrd_end = 0;
705 } else {
706 /*
707 * Translate initrd_start & initrd_end from PA to VA for
708 * future access.
709 */
710 initrd_start += PAGE_OFFSET;
711 initrd_end += PAGE_OFFSET;
712 }
713 }
714#endif
715
631#ifdef CONFIG_KEXEC 716#ifdef CONFIG_KEXEC
632 if (crashk_res.start != crashk_res.end) 717 if (crashk_res.start != crashk_res.end)
633 reserve_bootmem(crashk_res.start, resource_size(&crashk_res), 0); 718 reserve_bootmem(crashk_res.start, resource_size(&crashk_res), 0);
@@ -961,9 +1046,6 @@ void setup_cpu(int boot)
961 arch_local_irq_unmask(INT_DMATLB_MISS); 1046 arch_local_irq_unmask(INT_DMATLB_MISS);
962 arch_local_irq_unmask(INT_DMATLB_ACCESS); 1047 arch_local_irq_unmask(INT_DMATLB_ACCESS);
963#endif 1048#endif
964#if CHIP_HAS_SN_PROC()
965 arch_local_irq_unmask(INT_SNITLB_MISS);
966#endif
967#ifdef __tilegx__ 1049#ifdef __tilegx__
968 arch_local_irq_unmask(INT_SINGLE_STEP_K); 1050 arch_local_irq_unmask(INT_SINGLE_STEP_K);
969#endif 1051#endif
@@ -978,10 +1060,6 @@ void setup_cpu(int boot)
978 /* Static network is not restricted. */ 1060 /* Static network is not restricted. */
979 __insn_mtspr(SPR_MPL_SN_ACCESS_SET_0, 1); 1061 __insn_mtspr(SPR_MPL_SN_ACCESS_SET_0, 1);
980#endif 1062#endif
981#if CHIP_HAS_SN_PROC()
982 __insn_mtspr(SPR_MPL_SN_NOTIFY_SET_0, 1);
983 __insn_mtspr(SPR_MPL_SN_CPL_SET_0, 1);
984#endif
985 1063
986 /* 1064 /*
987 * Set the MPL for interrupt control 0 & 1 to the corresponding 1065 * Set the MPL for interrupt control 0 & 1 to the corresponding
@@ -1029,6 +1107,10 @@ static void __init load_hv_initrd(void)
1029 int fd, rc; 1107 int fd, rc;
1030 void *initrd; 1108 void *initrd;
1031 1109
1110 /* If initrd has already been set, skip initramfs file in hvfs. */
1111 if (initrd_start)
1112 return;
1113
1032 fd = hv_fs_findfile((HV_VirtAddr) initramfs_file); 1114 fd = hv_fs_findfile((HV_VirtAddr) initramfs_file);
1033 if (fd == HV_ENOENT) { 1115 if (fd == HV_ENOENT) {
1034 if (set_initramfs_file) { 1116 if (set_initramfs_file) {
@@ -1067,6 +1149,25 @@ void __init free_initrd_mem(unsigned long begin, unsigned long end)
1067 free_bootmem(__pa(begin), end - begin); 1149 free_bootmem(__pa(begin), end - begin);
1068} 1150}
1069 1151
1152static int __init setup_initrd(char *str)
1153{
1154 char *endp;
1155 unsigned long initrd_size;
1156
1157 initrd_size = str ? simple_strtoul(str, &endp, 0) : 0;
1158 if (initrd_size == 0 || *endp != '@')
1159 return -EINVAL;
1160
1161 initrd_start = simple_strtoul(endp+1, &endp, 0);
1162 if (initrd_start == 0)
1163 return -EINVAL;
1164
1165 initrd_end = initrd_start + initrd_size;
1166
1167 return 0;
1168}
1169early_param("initrd", setup_initrd);
1170
1070#else 1171#else
1071static inline void load_hv_initrd(void) {} 1172static inline void load_hv_initrd(void) {}
1072#endif /* CONFIG_BLK_DEV_INITRD */ 1173#endif /* CONFIG_BLK_DEV_INITRD */
@@ -1134,7 +1235,7 @@ static void __init validate_va(void)
1134#ifndef __tilegx__ /* FIXME: GX: probably some validation relevant here */ 1235#ifndef __tilegx__ /* FIXME: GX: probably some validation relevant here */
1135 /* 1236 /*
1136 * Similarly, make sure we're only using allowed VAs. 1237 * Similarly, make sure we're only using allowed VAs.
1137 * We assume we can contiguously use MEM_USER_INTRPT .. MEM_HV_INTRPT, 1238 * We assume we can contiguously use MEM_USER_INTRPT .. MEM_HV_START,
1138 * and 0 .. KERNEL_HIGH_VADDR. 1239 * and 0 .. KERNEL_HIGH_VADDR.
1139 * In addition, make sure we CAN'T use the end of memory, since 1240 * In addition, make sure we CAN'T use the end of memory, since
1140 * we use the last chunk of each pgd for the pgd_list. 1241 * we use the last chunk of each pgd for the pgd_list.
@@ -1149,7 +1250,7 @@ static void __init validate_va(void)
1149 if (range.size == 0) 1250 if (range.size == 0)
1150 break; 1251 break;
1151 if (range.start <= MEM_USER_INTRPT && 1252 if (range.start <= MEM_USER_INTRPT &&
1152 range.start + range.size >= MEM_HV_INTRPT) 1253 range.start + range.size >= MEM_HV_START)
1153 user_kernel_ok = 1; 1254 user_kernel_ok = 1;
1154 if (range.start == 0) 1255 if (range.start == 0)
1155 max_va = range.size; 1256 max_va = range.size;
@@ -1167,8 +1268,7 @@ static void __init validate_va(void)
1167 if ((long)VMALLOC_START >= 0) 1268 if ((long)VMALLOC_START >= 0)
1168 early_panic( 1269 early_panic(
1169 "Linux VMALLOC region below the 2GB line (%#lx)!\n" 1270 "Linux VMALLOC region below the 2GB line (%#lx)!\n"
1170 "Reconfigure the kernel with fewer NR_HUGE_VMAPS\n" 1271 "Reconfigure the kernel with smaller VMALLOC_RESERVE.\n",
1171 "or smaller VMALLOC_RESERVE.\n",
1172 VMALLOC_START); 1272 VMALLOC_START);
1173#endif 1273#endif
1174} 1274}
@@ -1183,7 +1283,6 @@ static void __init validate_va(void)
1183struct cpumask __write_once cpu_lotar_map; 1283struct cpumask __write_once cpu_lotar_map;
1184EXPORT_SYMBOL(cpu_lotar_map); 1284EXPORT_SYMBOL(cpu_lotar_map);
1185 1285
1186#if CHIP_HAS_CBOX_HOME_MAP()
1187/* 1286/*
1188 * hash_for_home_map lists all the tiles that hash-for-home data 1287 * hash_for_home_map lists all the tiles that hash-for-home data
1189 * will be cached on. Note that this may includes tiles that are not 1288 * will be cached on. Note that this may includes tiles that are not
@@ -1193,7 +1292,6 @@ EXPORT_SYMBOL(cpu_lotar_map);
1193 */ 1292 */
1194struct cpumask hash_for_home_map; 1293struct cpumask hash_for_home_map;
1195EXPORT_SYMBOL(hash_for_home_map); 1294EXPORT_SYMBOL(hash_for_home_map);
1196#endif
1197 1295
1198/* 1296/*
1199 * cpu_cacheable_map lists all the cpus whose caches the hypervisor can 1297 * cpu_cacheable_map lists all the cpus whose caches the hypervisor can
@@ -1286,7 +1384,6 @@ static void __init setup_cpu_maps(void)
1286 cpu_lotar_map = *cpu_possible_mask; 1384 cpu_lotar_map = *cpu_possible_mask;
1287 } 1385 }
1288 1386
1289#if CHIP_HAS_CBOX_HOME_MAP()
1290 /* Retrieve set of CPUs used for hash-for-home caching */ 1387 /* Retrieve set of CPUs used for hash-for-home caching */
1291 rc = hv_inquire_tiles(HV_INQ_TILES_HFH_CACHE, 1388 rc = hv_inquire_tiles(HV_INQ_TILES_HFH_CACHE,
1292 (HV_VirtAddr) hash_for_home_map.bits, 1389 (HV_VirtAddr) hash_for_home_map.bits,
@@ -1294,9 +1391,6 @@ static void __init setup_cpu_maps(void)
1294 if (rc < 0) 1391 if (rc < 0)
1295 early_panic("hv_inquire_tiles(HFH_CACHE) failed: rc %d\n", rc); 1392 early_panic("hv_inquire_tiles(HFH_CACHE) failed: rc %d\n", rc);
1296 cpumask_or(&cpu_cacheable_map, cpu_possible_mask, &hash_for_home_map); 1393 cpumask_or(&cpu_cacheable_map, cpu_possible_mask, &hash_for_home_map);
1297#else
1298 cpu_cacheable_map = *cpu_possible_mask;
1299#endif
1300} 1394}
1301 1395
1302 1396
@@ -1492,7 +1586,7 @@ void __init setup_per_cpu_areas(void)
1492 1586
1493 /* Update the vmalloc mapping and page home. */ 1587 /* Update the vmalloc mapping and page home. */
1494 unsigned long addr = (unsigned long)ptr + i; 1588 unsigned long addr = (unsigned long)ptr + i;
1495 pte_t *ptep = virt_to_pte(NULL, addr); 1589 pte_t *ptep = virt_to_kpte(addr);
1496 pte_t pte = *ptep; 1590 pte_t pte = *ptep;
1497 BUG_ON(pfn != pte_pfn(pte)); 1591 BUG_ON(pfn != pte_pfn(pte));
1498 pte = hv_pte_set_mode(pte, HV_PTE_MODE_CACHE_TILE_L3); 1592 pte = hv_pte_set_mode(pte, HV_PTE_MODE_CACHE_TILE_L3);
@@ -1501,12 +1595,12 @@ void __init setup_per_cpu_areas(void)
1501 1595
1502 /* Update the lowmem mapping for consistency. */ 1596 /* Update the lowmem mapping for consistency. */
1503 lowmem_va = (unsigned long)pfn_to_kaddr(pfn); 1597 lowmem_va = (unsigned long)pfn_to_kaddr(pfn);
1504 ptep = virt_to_pte(NULL, lowmem_va); 1598 ptep = virt_to_kpte(lowmem_va);
1505 if (pte_huge(*ptep)) { 1599 if (pte_huge(*ptep)) {
1506 printk(KERN_DEBUG "early shatter of huge page" 1600 printk(KERN_DEBUG "early shatter of huge page"
1507 " at %#lx\n", lowmem_va); 1601 " at %#lx\n", lowmem_va);
1508 shatter_pmd((pmd_t *)ptep); 1602 shatter_pmd((pmd_t *)ptep);
1509 ptep = virt_to_pte(NULL, lowmem_va); 1603 ptep = virt_to_kpte(lowmem_va);
1510 BUG_ON(pte_huge(*ptep)); 1604 BUG_ON(pte_huge(*ptep));
1511 } 1605 }
1512 BUG_ON(pfn != pte_pfn(*ptep)); 1606 BUG_ON(pfn != pte_pfn(*ptep));
@@ -1548,6 +1642,8 @@ insert_non_bus_resource(void)
1548{ 1642{
1549 struct resource *res = 1643 struct resource *res =
1550 kzalloc(sizeof(struct resource), GFP_ATOMIC); 1644 kzalloc(sizeof(struct resource), GFP_ATOMIC);
1645 if (!res)
1646 return NULL;
1551 res->name = "Non-Bus Physical Address Space"; 1647 res->name = "Non-Bus Physical Address Space";
1552 res->start = (1ULL << 32); 1648 res->start = (1ULL << 32);
1553 res->end = -1LL; 1649 res->end = -1LL;
@@ -1561,11 +1657,13 @@ insert_non_bus_resource(void)
1561#endif 1657#endif
1562 1658
1563static struct resource* __init 1659static struct resource* __init
1564insert_ram_resource(u64 start_pfn, u64 end_pfn) 1660insert_ram_resource(u64 start_pfn, u64 end_pfn, bool reserved)
1565{ 1661{
1566 struct resource *res = 1662 struct resource *res =
1567 kzalloc(sizeof(struct resource), GFP_ATOMIC); 1663 kzalloc(sizeof(struct resource), GFP_ATOMIC);
1568 res->name = "System RAM"; 1664 if (!res)
1665 return NULL;
1666 res->name = reserved ? "Reserved" : "System RAM";
1569 res->start = start_pfn << PAGE_SHIFT; 1667 res->start = start_pfn << PAGE_SHIFT;
1570 res->end = (end_pfn << PAGE_SHIFT) - 1; 1668 res->end = (end_pfn << PAGE_SHIFT) - 1;
1571 res->flags = IORESOURCE_BUSY | IORESOURCE_MEM; 1669 res->flags = IORESOURCE_BUSY | IORESOURCE_MEM;
@@ -1585,7 +1683,7 @@ insert_ram_resource(u64 start_pfn, u64 end_pfn)
1585static int __init request_standard_resources(void) 1683static int __init request_standard_resources(void)
1586{ 1684{
1587 int i; 1685 int i;
1588 enum { CODE_DELTA = MEM_SV_INTRPT - PAGE_OFFSET }; 1686 enum { CODE_DELTA = MEM_SV_START - PAGE_OFFSET };
1589 1687
1590#if defined(CONFIG_PCI) && !defined(__tilegx__) 1688#if defined(CONFIG_PCI) && !defined(__tilegx__)
1591 insert_non_bus_resource(); 1689 insert_non_bus_resource();
@@ -1600,11 +1698,11 @@ static int __init request_standard_resources(void)
1600 end_pfn > pci_reserve_start_pfn) { 1698 end_pfn > pci_reserve_start_pfn) {
1601 if (end_pfn > pci_reserve_end_pfn) 1699 if (end_pfn > pci_reserve_end_pfn)
1602 insert_ram_resource(pci_reserve_end_pfn, 1700 insert_ram_resource(pci_reserve_end_pfn,
1603 end_pfn); 1701 end_pfn, 0);
1604 end_pfn = pci_reserve_start_pfn; 1702 end_pfn = pci_reserve_start_pfn;
1605 } 1703 }
1606#endif 1704#endif
1607 insert_ram_resource(start_pfn, end_pfn); 1705 insert_ram_resource(start_pfn, end_pfn, 0);
1608 } 1706 }
1609 1707
1610 code_resource.start = __pa(_text - CODE_DELTA); 1708 code_resource.start = __pa(_text - CODE_DELTA);
@@ -1615,6 +1713,13 @@ static int __init request_standard_resources(void)
1615 insert_resource(&iomem_resource, &code_resource); 1713 insert_resource(&iomem_resource, &code_resource);
1616 insert_resource(&iomem_resource, &data_resource); 1714 insert_resource(&iomem_resource, &data_resource);
1617 1715
1716 /* Mark any "memmap" regions busy for the resource manager. */
1717 for (i = 0; i < memmap_nr; ++i) {
1718 struct memmap_entry *m = &memmap_map[i];
1719 insert_ram_resource(PFN_DOWN(m->addr),
1720 PFN_UP(m->addr + m->size - 1), 1);
1721 }
1722
1618#ifdef CONFIG_KEXEC 1723#ifdef CONFIG_KEXEC
1619 insert_resource(&iomem_resource, &crashk_res); 1724 insert_resource(&iomem_resource, &crashk_res);
1620#endif 1725#endif
diff --git a/arch/tile/kernel/signal.c b/arch/tile/kernel/signal.c
index 9531845bf661..2d1dbf38a9ab 100644
--- a/arch/tile/kernel/signal.c
+++ b/arch/tile/kernel/signal.c
@@ -33,6 +33,7 @@
33#include <asm/ucontext.h> 33#include <asm/ucontext.h>
34#include <asm/sigframe.h> 34#include <asm/sigframe.h>
35#include <asm/syscalls.h> 35#include <asm/syscalls.h>
36#include <asm/vdso.h>
36#include <arch/interrupts.h> 37#include <arch/interrupts.h>
37 38
38#define DEBUG_SIG 0 39#define DEBUG_SIG 0
@@ -190,7 +191,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
190 if (err) 191 if (err)
191 goto give_sigsegv; 192 goto give_sigsegv;
192 193
193 restorer = VDSO_BASE; 194 restorer = VDSO_SYM(&__vdso_rt_sigreturn);
194 if (ka->sa.sa_flags & SA_RESTORER) 195 if (ka->sa.sa_flags & SA_RESTORER)
195 restorer = (unsigned long) ka->sa.sa_restorer; 196 restorer = (unsigned long) ka->sa.sa_restorer;
196 197
diff --git a/arch/tile/kernel/single_step.c b/arch/tile/kernel/single_step.c
index 27742e87e255..de07fa7d1315 100644
--- a/arch/tile/kernel/single_step.c
+++ b/arch/tile/kernel/single_step.c
@@ -12,41 +12,30 @@
12 * more details. 12 * more details.
13 * 13 *
14 * A code-rewriter that enables instruction single-stepping. 14 * A code-rewriter that enables instruction single-stepping.
15 * Derived from iLib's single-stepping code.
16 */ 15 */
17 16
18#ifndef __tilegx__ /* Hardware support for single step unavailable. */ 17#include <linux/smp.h>
19 18#include <linux/ptrace.h>
20/* These functions are only used on the TILE platform */
21#include <linux/slab.h> 19#include <linux/slab.h>
22#include <linux/thread_info.h> 20#include <linux/thread_info.h>
23#include <linux/uaccess.h> 21#include <linux/uaccess.h>
24#include <linux/mman.h> 22#include <linux/mman.h>
25#include <linux/types.h> 23#include <linux/types.h>
26#include <linux/err.h> 24#include <linux/err.h>
25#include <linux/prctl.h>
27#include <asm/cacheflush.h> 26#include <asm/cacheflush.h>
27#include <asm/traps.h>
28#include <asm/uaccess.h>
28#include <asm/unaligned.h> 29#include <asm/unaligned.h>
29#include <arch/abi.h> 30#include <arch/abi.h>
31#include <arch/spr_def.h>
30#include <arch/opcode.h> 32#include <arch/opcode.h>
31 33
32#define signExtend17(val) sign_extend((val), 17)
33#define TILE_X1_MASK (0xffffffffULL << 31)
34
35int unaligned_printk;
36 34
37static int __init setup_unaligned_printk(char *str) 35#ifndef __tilegx__ /* Hardware support for single step unavailable. */
38{
39 long val;
40 if (strict_strtol(str, 0, &val) != 0)
41 return 0;
42 unaligned_printk = val;
43 pr_info("Printk for each unaligned data accesses is %s\n",
44 unaligned_printk ? "enabled" : "disabled");
45 return 1;
46}
47__setup("unaligned_printk=", setup_unaligned_printk);
48 36
49unsigned int unaligned_fixup_count; 37#define signExtend17(val) sign_extend((val), 17)
38#define TILE_X1_MASK (0xffffffffULL << 31)
50 39
51enum mem_op { 40enum mem_op {
52 MEMOP_NONE, 41 MEMOP_NONE,
@@ -56,12 +45,13 @@ enum mem_op {
56 MEMOP_STORE_POSTINCR 45 MEMOP_STORE_POSTINCR
57}; 46};
58 47
59static inline tile_bundle_bits set_BrOff_X1(tile_bundle_bits n, s32 offset) 48static inline tilepro_bundle_bits set_BrOff_X1(tilepro_bundle_bits n,
49 s32 offset)
60{ 50{
61 tile_bundle_bits result; 51 tilepro_bundle_bits result;
62 52
63 /* mask out the old offset */ 53 /* mask out the old offset */
64 tile_bundle_bits mask = create_BrOff_X1(-1); 54 tilepro_bundle_bits mask = create_BrOff_X1(-1);
65 result = n & (~mask); 55 result = n & (~mask);
66 56
67 /* or in the new offset */ 57 /* or in the new offset */
@@ -70,10 +60,11 @@ static inline tile_bundle_bits set_BrOff_X1(tile_bundle_bits n, s32 offset)
70 return result; 60 return result;
71} 61}
72 62
73static inline tile_bundle_bits move_X1(tile_bundle_bits n, int dest, int src) 63static inline tilepro_bundle_bits move_X1(tilepro_bundle_bits n, int dest,
64 int src)
74{ 65{
75 tile_bundle_bits result; 66 tilepro_bundle_bits result;
76 tile_bundle_bits op; 67 tilepro_bundle_bits op;
77 68
78 result = n & (~TILE_X1_MASK); 69 result = n & (~TILE_X1_MASK);
79 70
@@ -87,13 +78,13 @@ static inline tile_bundle_bits move_X1(tile_bundle_bits n, int dest, int src)
87 return result; 78 return result;
88} 79}
89 80
90static inline tile_bundle_bits nop_X1(tile_bundle_bits n) 81static inline tilepro_bundle_bits nop_X1(tilepro_bundle_bits n)
91{ 82{
92 return move_X1(n, TREG_ZERO, TREG_ZERO); 83 return move_X1(n, TREG_ZERO, TREG_ZERO);
93} 84}
94 85
95static inline tile_bundle_bits addi_X1( 86static inline tilepro_bundle_bits addi_X1(
96 tile_bundle_bits n, int dest, int src, int imm) 87 tilepro_bundle_bits n, int dest, int src, int imm)
97{ 88{
98 n &= ~TILE_X1_MASK; 89 n &= ~TILE_X1_MASK;
99 90
@@ -107,15 +98,26 @@ static inline tile_bundle_bits addi_X1(
107 return n; 98 return n;
108} 99}
109 100
110static tile_bundle_bits rewrite_load_store_unaligned( 101static tilepro_bundle_bits rewrite_load_store_unaligned(
111 struct single_step_state *state, 102 struct single_step_state *state,
112 tile_bundle_bits bundle, 103 tilepro_bundle_bits bundle,
113 struct pt_regs *regs, 104 struct pt_regs *regs,
114 enum mem_op mem_op, 105 enum mem_op mem_op,
115 int size, int sign_ext) 106 int size, int sign_ext)
116{ 107{
117 unsigned char __user *addr; 108 unsigned char __user *addr;
118 int val_reg, addr_reg, err, val; 109 int val_reg, addr_reg, err, val;
110 int align_ctl;
111
112 align_ctl = unaligned_fixup;
113 switch (task_thread_info(current)->align_ctl) {
114 case PR_UNALIGN_NOPRINT:
115 align_ctl = 1;
116 break;
117 case PR_UNALIGN_SIGBUS:
118 align_ctl = 0;
119 break;
120 }
119 121
120 /* Get address and value registers */ 122 /* Get address and value registers */
121 if (bundle & TILEPRO_BUNDLE_Y_ENCODING_MASK) { 123 if (bundle & TILEPRO_BUNDLE_Y_ENCODING_MASK) {
@@ -160,7 +162,7 @@ static tile_bundle_bits rewrite_load_store_unaligned(
160 * tilepro hardware would be doing, if it could provide us with the 162 * tilepro hardware would be doing, if it could provide us with the
161 * actual bad address in an SPR, which it doesn't. 163 * actual bad address in an SPR, which it doesn't.
162 */ 164 */
163 if (unaligned_fixup == 0) { 165 if (align_ctl == 0) {
164 siginfo_t info = { 166 siginfo_t info = {
165 .si_signo = SIGBUS, 167 .si_signo = SIGBUS,
166 .si_code = BUS_ADRALN, 168 .si_code = BUS_ADRALN,
@@ -209,14 +211,14 @@ static tile_bundle_bits rewrite_load_store_unaligned(
209 211
210 if (err) { 212 if (err) {
211 siginfo_t info = { 213 siginfo_t info = {
212 .si_signo = SIGSEGV, 214 .si_signo = SIGBUS,
213 .si_code = SEGV_MAPERR, 215 .si_code = BUS_ADRALN,
214 .si_addr = addr 216 .si_addr = addr
215 }; 217 };
216 trace_unhandled_signal("segfault", regs, 218 trace_unhandled_signal("bad address for unaligned fixup", regs,
217 (unsigned long)addr, SIGSEGV); 219 (unsigned long)addr, SIGBUS);
218 force_sig_info(info.si_signo, &info, current); 220 force_sig_info(info.si_signo, &info, current);
219 return (tile_bundle_bits) 0; 221 return (tilepro_bundle_bits) 0;
220 } 222 }
221 223
222 if (unaligned_printk || unaligned_fixup_count == 0) { 224 if (unaligned_printk || unaligned_fixup_count == 0) {
@@ -285,7 +287,7 @@ void single_step_execve(void)
285 ti->step_state = NULL; 287 ti->step_state = NULL;
286} 288}
287 289
288/** 290/*
289 * single_step_once() - entry point when single stepping has been triggered. 291 * single_step_once() - entry point when single stepping has been triggered.
290 * @regs: The machine register state 292 * @regs: The machine register state
291 * 293 *
@@ -304,20 +306,31 @@ void single_step_execve(void)
304 */ 306 */
305void single_step_once(struct pt_regs *regs) 307void single_step_once(struct pt_regs *regs)
306{ 308{
307 extern tile_bundle_bits __single_step_ill_insn; 309 extern tilepro_bundle_bits __single_step_ill_insn;
308 extern tile_bundle_bits __single_step_j_insn; 310 extern tilepro_bundle_bits __single_step_j_insn;
309 extern tile_bundle_bits __single_step_addli_insn; 311 extern tilepro_bundle_bits __single_step_addli_insn;
310 extern tile_bundle_bits __single_step_auli_insn; 312 extern tilepro_bundle_bits __single_step_auli_insn;
311 struct thread_info *info = (void *)current_thread_info(); 313 struct thread_info *info = (void *)current_thread_info();
312 struct single_step_state *state = info->step_state; 314 struct single_step_state *state = info->step_state;
313 int is_single_step = test_ti_thread_flag(info, TIF_SINGLESTEP); 315 int is_single_step = test_ti_thread_flag(info, TIF_SINGLESTEP);
314 tile_bundle_bits __user *buffer, *pc; 316 tilepro_bundle_bits __user *buffer, *pc;
315 tile_bundle_bits bundle; 317 tilepro_bundle_bits bundle;
316 int temp_reg; 318 int temp_reg;
317 int target_reg = TREG_LR; 319 int target_reg = TREG_LR;
318 int err; 320 int err;
319 enum mem_op mem_op = MEMOP_NONE; 321 enum mem_op mem_op = MEMOP_NONE;
320 int size = 0, sign_ext = 0; /* happy compiler */ 322 int size = 0, sign_ext = 0; /* happy compiler */
323 int align_ctl;
324
325 align_ctl = unaligned_fixup;
326 switch (task_thread_info(current)->align_ctl) {
327 case PR_UNALIGN_NOPRINT:
328 align_ctl = 1;
329 break;
330 case PR_UNALIGN_SIGBUS:
331 align_ctl = 0;
332 break;
333 }
321 334
322 asm( 335 asm(
323" .pushsection .rodata.single_step\n" 336" .pushsection .rodata.single_step\n"
@@ -390,7 +403,7 @@ void single_step_once(struct pt_regs *regs)
390 if (regs->faultnum == INT_SWINT_1) 403 if (regs->faultnum == INT_SWINT_1)
391 regs->pc -= 8; 404 regs->pc -= 8;
392 405
393 pc = (tile_bundle_bits __user *)(regs->pc); 406 pc = (tilepro_bundle_bits __user *)(regs->pc);
394 if (get_user(bundle, pc) != 0) { 407 if (get_user(bundle, pc) != 0) {
395 pr_err("Couldn't read instruction at %p trying to step\n", pc); 408 pr_err("Couldn't read instruction at %p trying to step\n", pc);
396 return; 409 return;
@@ -533,7 +546,6 @@ void single_step_once(struct pt_regs *regs)
533 } 546 }
534 break; 547 break;
535 548
536#if CHIP_HAS_WH64()
537 /* postincrement operations */ 549 /* postincrement operations */
538 case IMM_0_OPCODE_X1: 550 case IMM_0_OPCODE_X1:
539 switch (get_ImmOpcodeExtension_X1(bundle)) { 551 switch (get_ImmOpcodeExtension_X1(bundle)) {
@@ -568,7 +580,6 @@ void single_step_once(struct pt_regs *regs)
568 break; 580 break;
569 } 581 }
570 break; 582 break;
571#endif /* CHIP_HAS_WH64() */
572 } 583 }
573 584
574 if (state->update) { 585 if (state->update) {
@@ -627,9 +638,9 @@ void single_step_once(struct pt_regs *regs)
627 638
628 /* 639 /*
629 * Check if we need to rewrite an unaligned load/store. 640 * Check if we need to rewrite an unaligned load/store.
630 * Returning zero is a special value meaning we need to SIGSEGV. 641 * Returning zero is a special value meaning we generated a signal.
631 */ 642 */
632 if (mem_op != MEMOP_NONE && unaligned_fixup >= 0) { 643 if (mem_op != MEMOP_NONE && align_ctl >= 0) {
633 bundle = rewrite_load_store_unaligned(state, bundle, regs, 644 bundle = rewrite_load_store_unaligned(state, bundle, regs,
634 mem_op, size, sign_ext); 645 mem_op, size, sign_ext);
635 if (bundle == 0) 646 if (bundle == 0)
@@ -668,9 +679,9 @@ void single_step_once(struct pt_regs *regs)
668 } 679 }
669 680
670 /* End with a jump back to the next instruction */ 681 /* End with a jump back to the next instruction */
671 delta = ((regs->pc + TILE_BUNDLE_SIZE_IN_BYTES) - 682 delta = ((regs->pc + TILEPRO_BUNDLE_SIZE_IN_BYTES) -
672 (unsigned long)buffer) >> 683 (unsigned long)buffer) >>
673 TILE_LOG2_BUNDLE_ALIGNMENT_IN_BYTES; 684 TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES;
674 bundle = __single_step_j_insn; 685 bundle = __single_step_j_insn;
675 bundle |= create_JOffLong_X1(delta); 686 bundle |= create_JOffLong_X1(delta);
676 err |= __put_user(bundle, buffer++); 687 err |= __put_user(bundle, buffer++);
@@ -698,9 +709,6 @@ void single_step_once(struct pt_regs *regs)
698} 709}
699 710
700#else 711#else
701#include <linux/smp.h>
702#include <linux/ptrace.h>
703#include <arch/spr_def.h>
704 712
705static DEFINE_PER_CPU(unsigned long, ss_saved_pc); 713static DEFINE_PER_CPU(unsigned long, ss_saved_pc);
706 714
@@ -743,10 +751,10 @@ void gx_singlestep_handle(struct pt_regs *regs, int fault_num)
743 } else if ((*ss_pc != regs->pc) || 751 } else if ((*ss_pc != regs->pc) ||
744 (!(control & SPR_SINGLE_STEP_CONTROL_1__CANCELED_MASK))) { 752 (!(control & SPR_SINGLE_STEP_CONTROL_1__CANCELED_MASK))) {
745 753
746 ptrace_notify(SIGTRAP);
747 control |= SPR_SINGLE_STEP_CONTROL_1__CANCELED_MASK; 754 control |= SPR_SINGLE_STEP_CONTROL_1__CANCELED_MASK;
748 control |= SPR_SINGLE_STEP_CONTROL_1__INHIBIT_MASK; 755 control |= SPR_SINGLE_STEP_CONTROL_1__INHIBIT_MASK;
749 __insn_mtspr(SPR_SINGLE_STEP_CONTROL_K, control); 756 __insn_mtspr(SPR_SINGLE_STEP_CONTROL_K, control);
757 send_sigtrap(current, regs);
750 } 758 }
751} 759}
752 760
diff --git a/arch/tile/kernel/smp.c b/arch/tile/kernel/smp.c
index cbc73a8b8fe1..01e8ab29f43a 100644
--- a/arch/tile/kernel/smp.c
+++ b/arch/tile/kernel/smp.c
@@ -20,8 +20,13 @@
20#include <linux/irq.h> 20#include <linux/irq.h>
21#include <linux/module.h> 21#include <linux/module.h>
22#include <asm/cacheflush.h> 22#include <asm/cacheflush.h>
23#include <asm/homecache.h>
23 24
24HV_Topology smp_topology __write_once; 25/*
26 * We write to width and height with a single store in head_NN.S,
27 * so make the variable aligned to "long".
28 */
29HV_Topology smp_topology __write_once __aligned(sizeof(long));
25EXPORT_SYMBOL(smp_topology); 30EXPORT_SYMBOL(smp_topology);
26 31
27#if CHIP_HAS_IPI() 32#if CHIP_HAS_IPI()
@@ -100,8 +105,8 @@ static void smp_start_cpu_interrupt(void)
100/* Handler to stop the current cpu. */ 105/* Handler to stop the current cpu. */
101static void smp_stop_cpu_interrupt(void) 106static void smp_stop_cpu_interrupt(void)
102{ 107{
103 set_cpu_online(smp_processor_id(), 0);
104 arch_local_irq_disable_all(); 108 arch_local_irq_disable_all();
109 set_cpu_online(smp_processor_id(), 0);
105 for (;;) 110 for (;;)
106 asm("nap; nop"); 111 asm("nap; nop");
107} 112}
@@ -167,9 +172,16 @@ static void ipi_flush_icache_range(void *info)
167void flush_icache_range(unsigned long start, unsigned long end) 172void flush_icache_range(unsigned long start, unsigned long end)
168{ 173{
169 struct ipi_flush flush = { start, end }; 174 struct ipi_flush flush = { start, end };
170 preempt_disable(); 175
171 on_each_cpu(ipi_flush_icache_range, &flush, 1); 176 /* If invoked with irqs disabled, we can not issue IPIs. */
172 preempt_enable(); 177 if (irqs_disabled())
178 flush_remote(0, HV_FLUSH_EVICT_L1I, NULL, 0, 0, 0,
179 NULL, NULL, 0);
180 else {
181 preempt_disable();
182 on_each_cpu(ipi_flush_icache_range, &flush, 1);
183 preempt_enable();
184 }
173} 185}
174 186
175 187
diff --git a/arch/tile/kernel/smpboot.c b/arch/tile/kernel/smpboot.c
index a535655b7089..732e9d138661 100644
--- a/arch/tile/kernel/smpboot.c
+++ b/arch/tile/kernel/smpboot.c
@@ -142,13 +142,15 @@ static struct cpumask cpu_started;
142 */ 142 */
143static void start_secondary(void) 143static void start_secondary(void)
144{ 144{
145 int cpuid = smp_processor_id(); 145 int cpuid;
146
147 preempt_disable();
148
149 cpuid = smp_processor_id();
146 150
147 /* Set our thread pointer appropriately. */ 151 /* Set our thread pointer appropriately. */
148 set_my_cpu_offset(__per_cpu_offset[cpuid]); 152 set_my_cpu_offset(__per_cpu_offset[cpuid]);
149 153
150 preempt_disable();
151
152 /* 154 /*
153 * In large machines even this will slow us down, since we 155 * In large machines even this will slow us down, since we
154 * will be contending for for the printk spinlock. 156 * will be contending for for the printk spinlock.
diff --git a/arch/tile/kernel/stack.c b/arch/tile/kernel/stack.c
index af8dfc9665f6..362284af3afd 100644
--- a/arch/tile/kernel/stack.c
+++ b/arch/tile/kernel/stack.c
@@ -29,6 +29,7 @@
29#include <asm/switch_to.h> 29#include <asm/switch_to.h>
30#include <asm/sigframe.h> 30#include <asm/sigframe.h>
31#include <asm/stack.h> 31#include <asm/stack.h>
32#include <asm/vdso.h>
32#include <arch/abi.h> 33#include <arch/abi.h>
33#include <arch/interrupts.h> 34#include <arch/interrupts.h>
34 35
@@ -102,9 +103,8 @@ static struct pt_regs *valid_fault_handler(struct KBacktraceIterator* kbt)
102 p->sp >= sp) { 103 p->sp >= sp) {
103 if (kbt->verbose) 104 if (kbt->verbose)
104 pr_err(" <%s while in kernel mode>\n", fault); 105 pr_err(" <%s while in kernel mode>\n", fault);
105 } else if (EX1_PL(p->ex1) == USER_PL && 106 } else if (user_mode(p) &&
106 p->pc < PAGE_OFFSET && 107 p->sp < PAGE_OFFSET && p->sp != 0) {
107 p->sp < PAGE_OFFSET) {
108 if (kbt->verbose) 108 if (kbt->verbose)
109 pr_err(" <%s while in user mode>\n", fault); 109 pr_err(" <%s while in user mode>\n", fault);
110 } else if (kbt->verbose) { 110 } else if (kbt->verbose) {
@@ -120,7 +120,7 @@ static struct pt_regs *valid_fault_handler(struct KBacktraceIterator* kbt)
120/* Is the pc pointing to a sigreturn trampoline? */ 120/* Is the pc pointing to a sigreturn trampoline? */
121static int is_sigreturn(unsigned long pc) 121static int is_sigreturn(unsigned long pc)
122{ 122{
123 return (pc == VDSO_BASE); 123 return current->mm && (pc == VDSO_SYM(&__vdso_rt_sigreturn));
124} 124}
125 125
126/* Return a pt_regs pointer for a valid signal handler frame */ 126/* Return a pt_regs pointer for a valid signal handler frame */
@@ -129,7 +129,7 @@ static struct pt_regs *valid_sigframe(struct KBacktraceIterator* kbt,
129{ 129{
130 BacktraceIterator *b = &kbt->it; 130 BacktraceIterator *b = &kbt->it;
131 131
132 if (b->pc == VDSO_BASE && b->sp < PAGE_OFFSET && 132 if (is_sigreturn(b->pc) && b->sp < PAGE_OFFSET &&
133 b->sp % sizeof(long) == 0) { 133 b->sp % sizeof(long) == 0) {
134 int retval; 134 int retval;
135 pagefault_disable(); 135 pagefault_disable();
@@ -195,21 +195,21 @@ static int KBacktraceIterator_next_item_inclusive(
195 */ 195 */
196static void validate_stack(struct pt_regs *regs) 196static void validate_stack(struct pt_regs *regs)
197{ 197{
198 int cpu = smp_processor_id(); 198 int cpu = raw_smp_processor_id();
199 unsigned long ksp0 = get_current_ksp0(); 199 unsigned long ksp0 = get_current_ksp0();
200 unsigned long ksp0_base = ksp0 - THREAD_SIZE; 200 unsigned long ksp0_base = ksp0 & -THREAD_SIZE;
201 unsigned long sp = stack_pointer; 201 unsigned long sp = stack_pointer;
202 202
203 if (EX1_PL(regs->ex1) == KERNEL_PL && regs->sp >= ksp0) { 203 if (EX1_PL(regs->ex1) == KERNEL_PL && regs->sp >= ksp0) {
204 pr_err("WARNING: cpu %d: kernel stack page %#lx underrun!\n" 204 pr_err("WARNING: cpu %d: kernel stack %#lx..%#lx underrun!\n"
205 " sp %#lx (%#lx in caller), caller pc %#lx, lr %#lx\n", 205 " sp %#lx (%#lx in caller), caller pc %#lx, lr %#lx\n",
206 cpu, ksp0_base, sp, regs->sp, regs->pc, regs->lr); 206 cpu, ksp0_base, ksp0, sp, regs->sp, regs->pc, regs->lr);
207 } 207 }
208 208
209 else if (sp < ksp0_base + sizeof(struct thread_info)) { 209 else if (sp < ksp0_base + sizeof(struct thread_info)) {
210 pr_err("WARNING: cpu %d: kernel stack page %#lx overrun!\n" 210 pr_err("WARNING: cpu %d: kernel stack %#lx..%#lx overrun!\n"
211 " sp %#lx (%#lx in caller), caller pc %#lx, lr %#lx\n", 211 " sp %#lx (%#lx in caller), caller pc %#lx, lr %#lx\n",
212 cpu, ksp0_base, sp, regs->sp, regs->pc, regs->lr); 212 cpu, ksp0_base, ksp0, sp, regs->sp, regs->pc, regs->lr);
213 } 213 }
214} 214}
215 215
@@ -352,6 +352,26 @@ static void describe_addr(struct KBacktraceIterator *kbt,
352} 352}
353 353
354/* 354/*
355 * Avoid possible crash recursion during backtrace. If it happens, it
356 * makes it easy to lose the actual root cause of the failure, so we
357 * put a simple guard on all the backtrace loops.
358 */
359static bool start_backtrace(void)
360{
361 if (current->thread.in_backtrace) {
362 pr_err("Backtrace requested while in backtrace!\n");
363 return false;
364 }
365 current->thread.in_backtrace = true;
366 return true;
367}
368
369static void end_backtrace(void)
370{
371 current->thread.in_backtrace = false;
372}
373
374/*
355 * This method wraps the backtracer's more generic support. 375 * This method wraps the backtracer's more generic support.
356 * It is only invoked from the architecture-specific code; show_stack() 376 * It is only invoked from the architecture-specific code; show_stack()
357 * and dump_stack() (in entry.S) are architecture-independent entry points. 377 * and dump_stack() (in entry.S) are architecture-independent entry points.
@@ -361,6 +381,8 @@ void tile_show_stack(struct KBacktraceIterator *kbt, int headers)
361 int i; 381 int i;
362 int have_mmap_sem = 0; 382 int have_mmap_sem = 0;
363 383
384 if (!start_backtrace())
385 return;
364 if (headers) { 386 if (headers) {
365 /* 387 /*
366 * Add a blank line since if we are called from panic(), 388 * Add a blank line since if we are called from panic(),
@@ -371,7 +393,7 @@ void tile_show_stack(struct KBacktraceIterator *kbt, int headers)
371 pr_err("Starting stack dump of tid %d, pid %d (%s)" 393 pr_err("Starting stack dump of tid %d, pid %d (%s)"
372 " on cpu %d at cycle %lld\n", 394 " on cpu %d at cycle %lld\n",
373 kbt->task->pid, kbt->task->tgid, kbt->task->comm, 395 kbt->task->pid, kbt->task->tgid, kbt->task->comm,
374 smp_processor_id(), get_cycles()); 396 raw_smp_processor_id(), get_cycles());
375 } 397 }
376 kbt->verbose = 1; 398 kbt->verbose = 1;
377 i = 0; 399 i = 0;
@@ -402,6 +424,7 @@ void tile_show_stack(struct KBacktraceIterator *kbt, int headers)
402 pr_err("Stack dump complete\n"); 424 pr_err("Stack dump complete\n");
403 if (have_mmap_sem) 425 if (have_mmap_sem)
404 up_read(&kbt->task->mm->mmap_sem); 426 up_read(&kbt->task->mm->mmap_sem);
427 end_backtrace();
405} 428}
406EXPORT_SYMBOL(tile_show_stack); 429EXPORT_SYMBOL(tile_show_stack);
407 430
@@ -463,6 +486,8 @@ void save_stack_trace_tsk(struct task_struct *task, struct stack_trace *trace)
463 int skip = trace->skip; 486 int skip = trace->skip;
464 int i = 0; 487 int i = 0;
465 488
489 if (!start_backtrace())
490 goto done;
466 if (task == NULL || task == current) 491 if (task == NULL || task == current)
467 KBacktraceIterator_init_current(&kbt); 492 KBacktraceIterator_init_current(&kbt);
468 else 493 else
@@ -476,6 +501,8 @@ void save_stack_trace_tsk(struct task_struct *task, struct stack_trace *trace)
476 break; 501 break;
477 trace->entries[i++] = kbt.it.pc; 502 trace->entries[i++] = kbt.it.pc;
478 } 503 }
504 end_backtrace();
505done:
479 trace->nr_entries = i; 506 trace->nr_entries = i;
480} 507}
481EXPORT_SYMBOL(save_stack_trace_tsk); 508EXPORT_SYMBOL(save_stack_trace_tsk);
diff --git a/arch/tile/kernel/sys.c b/arch/tile/kernel/sys.c
index b881a7be24bd..38debe706061 100644
--- a/arch/tile/kernel/sys.c
+++ b/arch/tile/kernel/sys.c
@@ -38,8 +38,10 @@
38SYSCALL_DEFINE3(cacheflush, unsigned long, addr, unsigned long, len, 38SYSCALL_DEFINE3(cacheflush, unsigned long, addr, unsigned long, len,
39 unsigned long, flags) 39 unsigned long, flags)
40{ 40{
41 /* DCACHE is not particularly effective if not bound to one cpu. */
41 if (flags & DCACHE) 42 if (flags & DCACHE)
42 homecache_evict(cpumask_of(smp_processor_id())); 43 homecache_evict(cpumask_of(raw_smp_processor_id()));
44
43 if (flags & ICACHE) 45 if (flags & ICACHE)
44 flush_remote(0, HV_FLUSH_EVICT_L1I, mm_cpumask(current->mm), 46 flush_remote(0, HV_FLUSH_EVICT_L1I, mm_cpumask(current->mm),
45 0, 0, 0, NULL, NULL, 0); 47 0, 0, 0, NULL, NULL, 0);
diff --git a/arch/tile/kernel/sysfs.c b/arch/tile/kernel/sysfs.c
index e25b0a89c18f..a3ed12f8f83b 100644
--- a/arch/tile/kernel/sysfs.c
+++ b/arch/tile/kernel/sysfs.c
@@ -157,6 +157,67 @@ hvconfig_bin_read(struct file *filp, struct kobject *kobj,
157 return count; 157 return count;
158} 158}
159 159
160static ssize_t hv_stats_show(struct device *dev,
161 struct device_attribute *attr,
162 char *page)
163{
164 int cpu = dev->id;
165 long lotar = HV_XY_TO_LOTAR(cpu_x(cpu), cpu_y(cpu));
166
167 ssize_t n = hv_confstr(HV_CONFSTR_HV_STATS,
168 (unsigned long)page, PAGE_SIZE - 1,
169 lotar, 0);
170 n = n < 0 ? 0 : min(n, (ssize_t)PAGE_SIZE - 1);
171 page[n] = '\0';
172 return n;
173}
174
175static ssize_t hv_stats_store(struct device *dev,
176 struct device_attribute *attr,
177 const char *page,
178 size_t count)
179{
180 int cpu = dev->id;
181 long lotar = HV_XY_TO_LOTAR(cpu_x(cpu), cpu_y(cpu));
182
183 ssize_t n = hv_confstr(HV_CONFSTR_HV_STATS, 0, 0, lotar, 1);
184 return n < 0 ? n : count;
185}
186
187static DEVICE_ATTR(hv_stats, 0644, hv_stats_show, hv_stats_store);
188
189static int hv_stats_device_add(struct device *dev, struct subsys_interface *sif)
190{
191 int err, cpu = dev->id;
192
193 if (!cpu_online(cpu))
194 return 0;
195
196 err = sysfs_create_file(&dev->kobj, &dev_attr_hv_stats.attr);
197
198 return err;
199}
200
201static int hv_stats_device_remove(struct device *dev,
202 struct subsys_interface *sif)
203{
204 int cpu = dev->id;
205
206 if (!cpu_online(cpu))
207 return 0;
208
209 sysfs_remove_file(&dev->kobj, &dev_attr_hv_stats.attr);
210 return 0;
211}
212
213
214static struct subsys_interface hv_stats_interface = {
215 .name = "hv_stats",
216 .subsys = &cpu_subsys,
217 .add_dev = hv_stats_device_add,
218 .remove_dev = hv_stats_device_remove,
219};
220
160static int __init create_sysfs_entries(void) 221static int __init create_sysfs_entries(void)
161{ 222{
162 int err = 0; 223 int err = 0;
@@ -188,6 +249,21 @@ static int __init create_sysfs_entries(void)
188 err = sysfs_create_bin_file(hypervisor_kobj, &hvconfig_bin); 249 err = sysfs_create_bin_file(hypervisor_kobj, &hvconfig_bin);
189 } 250 }
190 251
252 if (!err) {
253 /*
254 * Don't bother adding the hv_stats files on each CPU if
255 * our hypervisor doesn't supply statistics.
256 */
257 int cpu = raw_smp_processor_id();
258 long lotar = HV_XY_TO_LOTAR(cpu_x(cpu), cpu_y(cpu));
259 char dummy;
260 ssize_t n = hv_confstr(HV_CONFSTR_HV_STATS,
261 (unsigned long) &dummy, 1,
262 lotar, 0);
263 if (n >= 0)
264 err = subsys_interface_register(&hv_stats_interface);
265 }
266
191 return err; 267 return err;
192} 268}
193subsys_initcall(create_sysfs_entries); 269subsys_initcall(create_sysfs_entries);
diff --git a/arch/tile/kernel/time.c b/arch/tile/kernel/time.c
index 7c353d8c2da9..5d10642db63e 100644
--- a/arch/tile/kernel/time.c
+++ b/arch/tile/kernel/time.c
@@ -23,8 +23,10 @@
23#include <linux/smp.h> 23#include <linux/smp.h>
24#include <linux/delay.h> 24#include <linux/delay.h>
25#include <linux/module.h> 25#include <linux/module.h>
26#include <linux/timekeeper_internal.h>
26#include <asm/irq_regs.h> 27#include <asm/irq_regs.h>
27#include <asm/traps.h> 28#include <asm/traps.h>
29#include <asm/vdso.h>
28#include <hv/hypervisor.h> 30#include <hv/hypervisor.h>
29#include <arch/interrupts.h> 31#include <arch/interrupts.h>
30#include <arch/spr_def.h> 32#include <arch/spr_def.h>
@@ -110,7 +112,6 @@ void __init time_init(void)
110 setup_tile_timer(); 112 setup_tile_timer();
111} 113}
112 114
113
114/* 115/*
115 * Define the tile timer clock event device. The timer is driven by 116 * Define the tile timer clock event device. The timer is driven by
116 * the TILE_TIMER_CONTROL register, which consists of a 31-bit down 117 * the TILE_TIMER_CONTROL register, which consists of a 31-bit down
@@ -237,3 +238,37 @@ cycles_t ns2cycles(unsigned long nsecs)
237 struct clock_event_device *dev = &__raw_get_cpu_var(tile_timer); 238 struct clock_event_device *dev = &__raw_get_cpu_var(tile_timer);
238 return ((u64)nsecs * dev->mult) >> dev->shift; 239 return ((u64)nsecs * dev->mult) >> dev->shift;
239} 240}
241
242void update_vsyscall_tz(void)
243{
244 /* Userspace gettimeofday will spin while this value is odd. */
245 ++vdso_data->tz_update_count;
246 smp_wmb();
247 vdso_data->tz_minuteswest = sys_tz.tz_minuteswest;
248 vdso_data->tz_dsttime = sys_tz.tz_dsttime;
249 smp_wmb();
250 ++vdso_data->tz_update_count;
251}
252
253void update_vsyscall(struct timekeeper *tk)
254{
255 struct timespec wall_time = tk_xtime(tk);
256 struct timespec *wtm = &tk->wall_to_monotonic;
257 struct clocksource *clock = tk->clock;
258
259 if (clock != &cycle_counter_cs)
260 return;
261
262 /* Userspace gettimeofday will spin while this value is odd. */
263 ++vdso_data->tb_update_count;
264 smp_wmb();
265 vdso_data->xtime_tod_stamp = clock->cycle_last;
266 vdso_data->xtime_clock_sec = wall_time.tv_sec;
267 vdso_data->xtime_clock_nsec = wall_time.tv_nsec;
268 vdso_data->wtom_clock_sec = wtm->tv_sec;
269 vdso_data->wtom_clock_nsec = wtm->tv_nsec;
270 vdso_data->mult = clock->mult;
271 vdso_data->shift = clock->shift;
272 smp_wmb();
273 ++vdso_data->tb_update_count;
274}
diff --git a/arch/tile/kernel/tlb.c b/arch/tile/kernel/tlb.c
index 3fd54d5bbd4c..f23b53515671 100644
--- a/arch/tile/kernel/tlb.c
+++ b/arch/tile/kernel/tlb.c
@@ -91,8 +91,14 @@ void flush_tlb_all(void)
91 } 91 }
92} 92}
93 93
94/*
95 * Callers need to flush the L1I themselves if necessary, e.g. for
96 * kernel module unload. Otherwise we assume callers are not using
97 * executable pgprot_t's. Using EVICT_L1I means that dataplane cpus
98 * will get an unnecessary interrupt otherwise.
99 */
94void flush_tlb_kernel_range(unsigned long start, unsigned long end) 100void flush_tlb_kernel_range(unsigned long start, unsigned long end)
95{ 101{
96 flush_remote(0, HV_FLUSH_EVICT_L1I, cpu_online_mask, 102 flush_remote(0, 0, NULL,
97 start, end - start, PAGE_SIZE, cpu_online_mask, NULL, 0); 103 start, end - start, PAGE_SIZE, cpu_online_mask, NULL, 0);
98} 104}
diff --git a/arch/tile/kernel/traps.c b/arch/tile/kernel/traps.c
index 5b19a23c8908..6b603d556ca6 100644
--- a/arch/tile/kernel/traps.c
+++ b/arch/tile/kernel/traps.c
@@ -15,6 +15,7 @@
15#include <linux/sched.h> 15#include <linux/sched.h>
16#include <linux/kernel.h> 16#include <linux/kernel.h>
17#include <linux/kprobes.h> 17#include <linux/kprobes.h>
18#include <linux/kdebug.h>
18#include <linux/module.h> 19#include <linux/module.h>
19#include <linux/reboot.h> 20#include <linux/reboot.h>
20#include <linux/uaccess.h> 21#include <linux/uaccess.h>
@@ -29,7 +30,7 @@
29 30
30void __init trap_init(void) 31void __init trap_init(void)
31{ 32{
32 /* Nothing needed here since we link code at .intrpt1 */ 33 /* Nothing needed here since we link code at .intrpt */
33} 34}
34 35
35int unaligned_fixup = 1; 36int unaligned_fixup = 1;
@@ -100,13 +101,7 @@ static int retry_gpv(unsigned int gpv_reason)
100 101
101#endif /* CHIP_HAS_TILE_DMA() */ 102#endif /* CHIP_HAS_TILE_DMA() */
102 103
103#ifdef __tilegx__ 104extern tile_bundle_bits bpt_code;
104#define bundle_bits tilegx_bundle_bits
105#else
106#define bundle_bits tile_bundle_bits
107#endif
108
109extern bundle_bits bpt_code;
110 105
111asm(".pushsection .rodata.bpt_code,\"a\";" 106asm(".pushsection .rodata.bpt_code,\"a\";"
112 ".align 8;" 107 ".align 8;"
@@ -114,7 +109,7 @@ asm(".pushsection .rodata.bpt_code,\"a\";"
114 ".size bpt_code,.-bpt_code;" 109 ".size bpt_code,.-bpt_code;"
115 ".popsection"); 110 ".popsection");
116 111
117static int special_ill(bundle_bits bundle, int *sigp, int *codep) 112static int special_ill(tile_bundle_bits bundle, int *sigp, int *codep)
118{ 113{
119 int sig, code, maxcode; 114 int sig, code, maxcode;
120 115
@@ -214,24 +209,73 @@ static const char *const int_name[] = {
214#endif 209#endif
215}; 210};
216 211
212static int do_bpt(struct pt_regs *regs)
213{
214 unsigned long bundle, bcode, bpt;
215
216 bundle = *(unsigned long *)instruction_pointer(regs);
217
218 /*
219 * bpt shoule be { bpt; nop }, which is 0x286a44ae51485000ULL.
220 * we encode the unused least significant bits for other purpose.
221 */
222 bpt = bundle & ~((1ULL << 12) - 1);
223 if (bpt != TILE_BPT_BUNDLE)
224 return 0;
225
226 bcode = bundle & ((1ULL << 12) - 1);
227 /*
228 * notify the kprobe handlers, if instruction is likely to
229 * pertain to them.
230 */
231 switch (bcode) {
232 /* breakpoint_insn */
233 case 0:
234 notify_die(DIE_BREAK, "debug", regs, bundle,
235 INT_ILL, SIGTRAP);
236 break;
237 /* compiled_bpt */
238 case DIE_COMPILED_BPT:
239 notify_die(DIE_COMPILED_BPT, "debug", regs, bundle,
240 INT_ILL, SIGTRAP);
241 break;
242 /* breakpoint2_insn */
243 case DIE_SSTEPBP:
244 notify_die(DIE_SSTEPBP, "single_step", regs, bundle,
245 INT_ILL, SIGTRAP);
246 break;
247 default:
248 return 0;
249 }
250
251 return 1;
252}
253
217void __kprobes do_trap(struct pt_regs *regs, int fault_num, 254void __kprobes do_trap(struct pt_regs *regs, int fault_num,
218 unsigned long reason) 255 unsigned long reason)
219{ 256{
220 siginfo_t info = { 0 }; 257 siginfo_t info = { 0 };
221 int signo, code; 258 int signo, code;
222 unsigned long address = 0; 259 unsigned long address = 0;
223 bundle_bits instr; 260 tile_bundle_bits instr;
261 int is_kernel = !user_mode(regs);
262
263 /* Handle breakpoints, etc. */
264 if (is_kernel && fault_num == INT_ILL && do_bpt(regs))
265 return;
224 266
225 /* Re-enable interrupts. */ 267 /* Re-enable interrupts, if they were previously enabled. */
226 local_irq_enable(); 268 if (!(regs->flags & PT_FLAGS_DISABLE_IRQ))
269 local_irq_enable();
227 270
228 /* 271 /*
229 * If it hits in kernel mode and we can't fix it up, just exit the 272 * If it hits in kernel mode and we can't fix it up, just exit the
230 * current process and hope for the best. 273 * current process and hope for the best.
231 */ 274 */
232 if (!user_mode(regs)) { 275 if (is_kernel) {
233 const char *name; 276 const char *name;
234 if (fixup_exception(regs)) /* only UNALIGN_DATA in practice */ 277 char buf[100];
278 if (fixup_exception(regs)) /* ILL_TRANS or UNALIGN_DATA */
235 return; 279 return;
236 if (fault_num >= 0 && 280 if (fault_num >= 0 &&
237 fault_num < sizeof(int_name)/sizeof(int_name[0]) && 281 fault_num < sizeof(int_name)/sizeof(int_name[0]) &&
@@ -239,10 +283,16 @@ void __kprobes do_trap(struct pt_regs *regs, int fault_num,
239 name = int_name[fault_num]; 283 name = int_name[fault_num];
240 else 284 else
241 name = "Unknown interrupt"; 285 name = "Unknown interrupt";
242 pr_alert("Kernel took bad trap %d (%s) at PC %#lx\n",
243 fault_num, name, regs->pc);
244 if (fault_num == INT_GPV) 286 if (fault_num == INT_GPV)
245 pr_alert("GPV_REASON is %#lx\n", reason); 287 snprintf(buf, sizeof(buf), "; GPV_REASON %#lx", reason);
288#ifdef __tilegx__
289 else if (fault_num == INT_ILL_TRANS)
290 snprintf(buf, sizeof(buf), "; address %#lx", reason);
291#endif
292 else
293 buf[0] = '\0';
294 pr_alert("Kernel took bad trap %d (%s) at PC %#lx%s\n",
295 fault_num, name, regs->pc, buf);
246 show_regs(regs); 296 show_regs(regs);
247 do_exit(SIGKILL); /* FIXME: implement i386 die() */ 297 do_exit(SIGKILL); /* FIXME: implement i386 die() */
248 return; 298 return;
@@ -324,11 +374,8 @@ void __kprobes do_trap(struct pt_regs *regs, int fault_num,
324 fill_ra_stack(); 374 fill_ra_stack();
325 375
326 signo = SIGSEGV; 376 signo = SIGSEGV;
377 address = reason;
327 code = SEGV_MAPERR; 378 code = SEGV_MAPERR;
328 if (reason & SPR_ILL_TRANS_REASON__I_STREAM_VA_RMASK)
329 address = regs->pc;
330 else
331 address = 0; /* FIXME: GX: single-step for address */
332 break; 379 break;
333 } 380 }
334#endif 381#endif
diff --git a/arch/tile/kernel/unaligned.c b/arch/tile/kernel/unaligned.c
new file mode 100644
index 000000000000..b030b4e78845
--- /dev/null
+++ b/arch/tile/kernel/unaligned.c
@@ -0,0 +1,1609 @@
1/*
2 * Copyright 2013 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 *
14 * A code-rewriter that handles unaligned exception.
15 */
16
17#include <linux/smp.h>
18#include <linux/ptrace.h>
19#include <linux/slab.h>
20#include <linux/thread_info.h>
21#include <linux/uaccess.h>
22#include <linux/mman.h>
23#include <linux/types.h>
24#include <linux/err.h>
25#include <linux/module.h>
26#include <linux/compat.h>
27#include <linux/prctl.h>
28#include <asm/cacheflush.h>
29#include <asm/traps.h>
30#include <asm/uaccess.h>
31#include <asm/unaligned.h>
32#include <arch/abi.h>
33#include <arch/spr_def.h>
34#include <arch/opcode.h>
35
36
37/*
38 * This file handles unaligned exception for tile-Gx. The tilepro's unaligned
39 * exception is supported out of single_step.c
40 */
41
42int unaligned_printk;
43
44static int __init setup_unaligned_printk(char *str)
45{
46 long val;
47 if (kstrtol(str, 0, &val) != 0)
48 return 0;
49 unaligned_printk = val;
50 pr_info("Printk for each unaligned data accesses is %s\n",
51 unaligned_printk ? "enabled" : "disabled");
52 return 1;
53}
54__setup("unaligned_printk=", setup_unaligned_printk);
55
56unsigned int unaligned_fixup_count;
57
58#ifdef __tilegx__
59
60/*
61 * Unalign data jit fixup code fragement. Reserved space is 128 bytes.
62 * The 1st 64-bit word saves fault PC address, 2nd word is the fault
63 * instruction bundle followed by 14 JIT bundles.
64 */
65
66struct unaligned_jit_fragment {
67 unsigned long pc;
68 tilegx_bundle_bits bundle;
69 tilegx_bundle_bits insn[14];
70};
71
72/*
73 * Check if a nop or fnop at bundle's pipeline X0.
74 */
75
76static bool is_bundle_x0_nop(tilegx_bundle_bits bundle)
77{
78 return (((get_UnaryOpcodeExtension_X0(bundle) ==
79 NOP_UNARY_OPCODE_X0) &&
80 (get_RRROpcodeExtension_X0(bundle) ==
81 UNARY_RRR_0_OPCODE_X0) &&
82 (get_Opcode_X0(bundle) ==
83 RRR_0_OPCODE_X0)) ||
84 ((get_UnaryOpcodeExtension_X0(bundle) ==
85 FNOP_UNARY_OPCODE_X0) &&
86 (get_RRROpcodeExtension_X0(bundle) ==
87 UNARY_RRR_0_OPCODE_X0) &&
88 (get_Opcode_X0(bundle) ==
89 RRR_0_OPCODE_X0)));
90}
91
92/*
93 * Check if nop or fnop at bundle's pipeline X1.
94 */
95
96static bool is_bundle_x1_nop(tilegx_bundle_bits bundle)
97{
98 return (((get_UnaryOpcodeExtension_X1(bundle) ==
99 NOP_UNARY_OPCODE_X1) &&
100 (get_RRROpcodeExtension_X1(bundle) ==
101 UNARY_RRR_0_OPCODE_X1) &&
102 (get_Opcode_X1(bundle) ==
103 RRR_0_OPCODE_X1)) ||
104 ((get_UnaryOpcodeExtension_X1(bundle) ==
105 FNOP_UNARY_OPCODE_X1) &&
106 (get_RRROpcodeExtension_X1(bundle) ==
107 UNARY_RRR_0_OPCODE_X1) &&
108 (get_Opcode_X1(bundle) ==
109 RRR_0_OPCODE_X1)));
110}
111
112/*
113 * Check if nop or fnop at bundle's Y0 pipeline.
114 */
115
116static bool is_bundle_y0_nop(tilegx_bundle_bits bundle)
117{
118 return (((get_UnaryOpcodeExtension_Y0(bundle) ==
119 NOP_UNARY_OPCODE_Y0) &&
120 (get_RRROpcodeExtension_Y0(bundle) ==
121 UNARY_RRR_1_OPCODE_Y0) &&
122 (get_Opcode_Y0(bundle) ==
123 RRR_1_OPCODE_Y0)) ||
124 ((get_UnaryOpcodeExtension_Y0(bundle) ==
125 FNOP_UNARY_OPCODE_Y0) &&
126 (get_RRROpcodeExtension_Y0(bundle) ==
127 UNARY_RRR_1_OPCODE_Y0) &&
128 (get_Opcode_Y0(bundle) ==
129 RRR_1_OPCODE_Y0)));
130}
131
132/*
133 * Check if nop or fnop at bundle's pipeline Y1.
134 */
135
136static bool is_bundle_y1_nop(tilegx_bundle_bits bundle)
137{
138 return (((get_UnaryOpcodeExtension_Y1(bundle) ==
139 NOP_UNARY_OPCODE_Y1) &&
140 (get_RRROpcodeExtension_Y1(bundle) ==
141 UNARY_RRR_1_OPCODE_Y1) &&
142 (get_Opcode_Y1(bundle) ==
143 RRR_1_OPCODE_Y1)) ||
144 ((get_UnaryOpcodeExtension_Y1(bundle) ==
145 FNOP_UNARY_OPCODE_Y1) &&
146 (get_RRROpcodeExtension_Y1(bundle) ==
147 UNARY_RRR_1_OPCODE_Y1) &&
148 (get_Opcode_Y1(bundle) ==
149 RRR_1_OPCODE_Y1)));
150}
151
152/*
153 * Test if a bundle's y0 and y1 pipelines are both nop or fnop.
154 */
155
156static bool is_y0_y1_nop(tilegx_bundle_bits bundle)
157{
158 return is_bundle_y0_nop(bundle) && is_bundle_y1_nop(bundle);
159}
160
161/*
162 * Test if a bundle's x0 and x1 pipelines are both nop or fnop.
163 */
164
165static bool is_x0_x1_nop(tilegx_bundle_bits bundle)
166{
167 return is_bundle_x0_nop(bundle) && is_bundle_x1_nop(bundle);
168}
169
170/*
171 * Find the destination, source registers of fault unalign access instruction
172 * at X1 or Y2. Also, allocate up to 3 scratch registers clob1, clob2 and
173 * clob3, which are guaranteed different from any register used in the fault
174 * bundle. r_alias is used to return if the other instructions other than the
175 * unalign load/store shares same register with ra, rb and rd.
176 */
177
178static void find_regs(tilegx_bundle_bits bundle, uint64_t *rd, uint64_t *ra,
179 uint64_t *rb, uint64_t *clob1, uint64_t *clob2,
180 uint64_t *clob3, bool *r_alias)
181{
182 int i;
183 uint64_t reg;
184 uint64_t reg_map = 0, alias_reg_map = 0, map;
185 bool alias;
186
187 *ra = -1;
188 *rb = -1;
189
190 if (rd)
191 *rd = -1;
192
193 *clob1 = -1;
194 *clob2 = -1;
195 *clob3 = -1;
196 alias = false;
197
198 /*
199 * Parse fault bundle, find potential used registers and mark
200 * corresponding bits in reg_map and alias_map. These 2 bit maps
201 * are used to find the scratch registers and determine if there
202 * is register alais.
203 */
204 if (bundle & TILEGX_BUNDLE_MODE_MASK) { /* Y Mode Bundle. */
205
206 reg = get_SrcA_Y2(bundle);
207 reg_map |= 1ULL << reg;
208 *ra = reg;
209 reg = get_SrcBDest_Y2(bundle);
210 reg_map |= 1ULL << reg;
211
212 if (rd) {
213 /* Load. */
214 *rd = reg;
215 alias_reg_map = (1ULL << *rd) | (1ULL << *ra);
216 } else {
217 /* Store. */
218 *rb = reg;
219 alias_reg_map = (1ULL << *ra) | (1ULL << *rb);
220 }
221
222 if (!is_bundle_y1_nop(bundle)) {
223 reg = get_SrcA_Y1(bundle);
224 reg_map |= (1ULL << reg);
225 map = (1ULL << reg);
226
227 reg = get_SrcB_Y1(bundle);
228 reg_map |= (1ULL << reg);
229 map |= (1ULL << reg);
230
231 reg = get_Dest_Y1(bundle);
232 reg_map |= (1ULL << reg);
233 map |= (1ULL << reg);
234
235 if (map & alias_reg_map)
236 alias = true;
237 }
238
239 if (!is_bundle_y0_nop(bundle)) {
240 reg = get_SrcA_Y0(bundle);
241 reg_map |= (1ULL << reg);
242 map = (1ULL << reg);
243
244 reg = get_SrcB_Y0(bundle);
245 reg_map |= (1ULL << reg);
246 map |= (1ULL << reg);
247
248 reg = get_Dest_Y0(bundle);
249 reg_map |= (1ULL << reg);
250 map |= (1ULL << reg);
251
252 if (map & alias_reg_map)
253 alias = true;
254 }
255 } else { /* X Mode Bundle. */
256
257 reg = get_SrcA_X1(bundle);
258 reg_map |= (1ULL << reg);
259 *ra = reg;
260 if (rd) {
261 /* Load. */
262 reg = get_Dest_X1(bundle);
263 reg_map |= (1ULL << reg);
264 *rd = reg;
265 alias_reg_map = (1ULL << *rd) | (1ULL << *ra);
266 } else {
267 /* Store. */
268 reg = get_SrcB_X1(bundle);
269 reg_map |= (1ULL << reg);
270 *rb = reg;
271 alias_reg_map = (1ULL << *ra) | (1ULL << *rb);
272 }
273
274 if (!is_bundle_x0_nop(bundle)) {
275 reg = get_SrcA_X0(bundle);
276 reg_map |= (1ULL << reg);
277 map = (1ULL << reg);
278
279 reg = get_SrcB_X0(bundle);
280 reg_map |= (1ULL << reg);
281 map |= (1ULL << reg);
282
283 reg = get_Dest_X0(bundle);
284 reg_map |= (1ULL << reg);
285 map |= (1ULL << reg);
286
287 if (map & alias_reg_map)
288 alias = true;
289 }
290 }
291
292 /*
293 * "alias" indicates if the unalign access registers have collision
294 * with others in the same bundle. We jsut simply test all register
295 * operands case (RRR), ignored the case with immidate. If a bundle
296 * has no register alias, we may do fixup in a simple or fast manner.
297 * So if an immidata field happens to hit with a register, we may end
298 * up fall back to the generic handling.
299 */
300
301 *r_alias = alias;
302
303 /* Flip bits on reg_map. */
304 reg_map ^= -1ULL;
305
306 /* Scan reg_map lower 54(TREG_SP) bits to find 3 set bits. */
307 for (i = 0; i < TREG_SP; i++) {
308 if (reg_map & (0x1ULL << i)) {
309 if (*clob1 == -1) {
310 *clob1 = i;
311 } else if (*clob2 == -1) {
312 *clob2 = i;
313 } else if (*clob3 == -1) {
314 *clob3 = i;
315 return;
316 }
317 }
318 }
319}
320
321/*
322 * Sanity check for register ra, rb, rd, clob1/2/3. Return true if any of them
323 * is unexpected.
324 */
325
326static bool check_regs(uint64_t rd, uint64_t ra, uint64_t rb,
327 uint64_t clob1, uint64_t clob2, uint64_t clob3)
328{
329 bool unexpected = false;
330 if ((ra >= 56) && (ra != TREG_ZERO))
331 unexpected = true;
332
333 if ((clob1 >= 56) || (clob2 >= 56) || (clob3 >= 56))
334 unexpected = true;
335
336 if (rd != -1) {
337 if ((rd >= 56) && (rd != TREG_ZERO))
338 unexpected = true;
339 } else {
340 if ((rb >= 56) && (rb != TREG_ZERO))
341 unexpected = true;
342 }
343 return unexpected;
344}
345
346
347#define GX_INSN_X0_MASK ((1ULL << 31) - 1)
348#define GX_INSN_X1_MASK (((1ULL << 31) - 1) << 31)
349#define GX_INSN_Y0_MASK ((0xFULL << 27) | (0xFFFFFULL))
350#define GX_INSN_Y1_MASK (GX_INSN_Y0_MASK << 31)
351#define GX_INSN_Y2_MASK ((0x7FULL << 51) | (0x7FULL << 20))
352
353#ifdef __LITTLE_ENDIAN
354#define GX_INSN_BSWAP(_bundle_) (_bundle_)
355#else
356#define GX_INSN_BSWAP(_bundle_) swab64(_bundle_)
357#endif /* __LITTLE_ENDIAN */
358
359/*
360 * __JIT_CODE(.) creates template bundles in .rodata.unalign_data section.
361 * The corresponding static function jix_x#_###(.) generates partial or
362 * whole bundle based on the template and given arguments.
363 */
364
365#define __JIT_CODE(_X_) \
366 asm (".pushsection .rodata.unalign_data, \"a\"\n" \
367 _X_"\n" \
368 ".popsection\n")
369
370__JIT_CODE("__unalign_jit_x1_mtspr: {mtspr 0, r0}");
371static tilegx_bundle_bits jit_x1_mtspr(int spr, int reg)
372{
373 extern tilegx_bundle_bits __unalign_jit_x1_mtspr;
374 return (GX_INSN_BSWAP(__unalign_jit_x1_mtspr) & GX_INSN_X1_MASK) |
375 create_MT_Imm14_X1(spr) | create_SrcA_X1(reg);
376}
377
378__JIT_CODE("__unalign_jit_x1_mfspr: {mfspr r0, 0}");
379static tilegx_bundle_bits jit_x1_mfspr(int reg, int spr)
380{
381 extern tilegx_bundle_bits __unalign_jit_x1_mfspr;
382 return (GX_INSN_BSWAP(__unalign_jit_x1_mfspr) & GX_INSN_X1_MASK) |
383 create_MF_Imm14_X1(spr) | create_Dest_X1(reg);
384}
385
386__JIT_CODE("__unalign_jit_x0_addi: {addi r0, r0, 0; iret}");
387static tilegx_bundle_bits jit_x0_addi(int rd, int ra, int imm8)
388{
389 extern tilegx_bundle_bits __unalign_jit_x0_addi;
390 return (GX_INSN_BSWAP(__unalign_jit_x0_addi) & GX_INSN_X0_MASK) |
391 create_Dest_X0(rd) | create_SrcA_X0(ra) |
392 create_Imm8_X0(imm8);
393}
394
395__JIT_CODE("__unalign_jit_x1_ldna: {ldna r0, r0}");
396static tilegx_bundle_bits jit_x1_ldna(int rd, int ra)
397{
398 extern tilegx_bundle_bits __unalign_jit_x1_ldna;
399 return (GX_INSN_BSWAP(__unalign_jit_x1_ldna) & GX_INSN_X1_MASK) |
400 create_Dest_X1(rd) | create_SrcA_X1(ra);
401}
402
403__JIT_CODE("__unalign_jit_x0_dblalign: {dblalign r0, r0 ,r0}");
404static tilegx_bundle_bits jit_x0_dblalign(int rd, int ra, int rb)
405{
406 extern tilegx_bundle_bits __unalign_jit_x0_dblalign;
407 return (GX_INSN_BSWAP(__unalign_jit_x0_dblalign) & GX_INSN_X0_MASK) |
408 create_Dest_X0(rd) | create_SrcA_X0(ra) |
409 create_SrcB_X0(rb);
410}
411
412__JIT_CODE("__unalign_jit_x1_iret: {iret}");
413static tilegx_bundle_bits jit_x1_iret(void)
414{
415 extern tilegx_bundle_bits __unalign_jit_x1_iret;
416 return GX_INSN_BSWAP(__unalign_jit_x1_iret) & GX_INSN_X1_MASK;
417}
418
419__JIT_CODE("__unalign_jit_x01_fnop: {fnop;fnop}");
420static tilegx_bundle_bits jit_x0_fnop(void)
421{
422 extern tilegx_bundle_bits __unalign_jit_x01_fnop;
423 return GX_INSN_BSWAP(__unalign_jit_x01_fnop) & GX_INSN_X0_MASK;
424}
425
426static tilegx_bundle_bits jit_x1_fnop(void)
427{
428 extern tilegx_bundle_bits __unalign_jit_x01_fnop;
429 return GX_INSN_BSWAP(__unalign_jit_x01_fnop) & GX_INSN_X1_MASK;
430}
431
432__JIT_CODE("__unalign_jit_y2_dummy: {fnop; fnop; ld zero, sp}");
433static tilegx_bundle_bits jit_y2_dummy(void)
434{
435 extern tilegx_bundle_bits __unalign_jit_y2_dummy;
436 return GX_INSN_BSWAP(__unalign_jit_y2_dummy) & GX_INSN_Y2_MASK;
437}
438
439static tilegx_bundle_bits jit_y1_fnop(void)
440{
441 extern tilegx_bundle_bits __unalign_jit_y2_dummy;
442 return GX_INSN_BSWAP(__unalign_jit_y2_dummy) & GX_INSN_Y1_MASK;
443}
444
445__JIT_CODE("__unalign_jit_x1_st1_add: {st1_add r1, r0, 0}");
446static tilegx_bundle_bits jit_x1_st1_add(int ra, int rb, int imm8)
447{
448 extern tilegx_bundle_bits __unalign_jit_x1_st1_add;
449 return (GX_INSN_BSWAP(__unalign_jit_x1_st1_add) &
450 (~create_SrcA_X1(-1)) &
451 GX_INSN_X1_MASK) | create_SrcA_X1(ra) |
452 create_SrcB_X1(rb) | create_Dest_Imm8_X1(imm8);
453}
454
455__JIT_CODE("__unalign_jit_x1_st: {crc32_8 r1, r0, r0; st r0, r0}");
456static tilegx_bundle_bits jit_x1_st(int ra, int rb)
457{
458 extern tilegx_bundle_bits __unalign_jit_x1_st;
459 return (GX_INSN_BSWAP(__unalign_jit_x1_st) & GX_INSN_X1_MASK) |
460 create_SrcA_X1(ra) | create_SrcB_X1(rb);
461}
462
463__JIT_CODE("__unalign_jit_x1_st_add: {st_add r1, r0, 0}");
464static tilegx_bundle_bits jit_x1_st_add(int ra, int rb, int imm8)
465{
466 extern tilegx_bundle_bits __unalign_jit_x1_st_add;
467 return (GX_INSN_BSWAP(__unalign_jit_x1_st_add) &
468 (~create_SrcA_X1(-1)) &
469 GX_INSN_X1_MASK) | create_SrcA_X1(ra) |
470 create_SrcB_X1(rb) | create_Dest_Imm8_X1(imm8);
471}
472
473__JIT_CODE("__unalign_jit_x1_ld: {crc32_8 r1, r0, r0; ld r0, r0}");
474static tilegx_bundle_bits jit_x1_ld(int rd, int ra)
475{
476 extern tilegx_bundle_bits __unalign_jit_x1_ld;
477 return (GX_INSN_BSWAP(__unalign_jit_x1_ld) & GX_INSN_X1_MASK) |
478 create_Dest_X1(rd) | create_SrcA_X1(ra);
479}
480
481__JIT_CODE("__unalign_jit_x1_ld_add: {ld_add r1, r0, 0}");
482static tilegx_bundle_bits jit_x1_ld_add(int rd, int ra, int imm8)
483{
484 extern tilegx_bundle_bits __unalign_jit_x1_ld_add;
485 return (GX_INSN_BSWAP(__unalign_jit_x1_ld_add) &
486 (~create_Dest_X1(-1)) &
487 GX_INSN_X1_MASK) | create_Dest_X1(rd) |
488 create_SrcA_X1(ra) | create_Imm8_X1(imm8);
489}
490
491__JIT_CODE("__unalign_jit_x0_bfexts: {bfexts r0, r0, 0, 0}");
492static tilegx_bundle_bits jit_x0_bfexts(int rd, int ra, int bfs, int bfe)
493{
494 extern tilegx_bundle_bits __unalign_jit_x0_bfexts;
495 return (GX_INSN_BSWAP(__unalign_jit_x0_bfexts) &
496 GX_INSN_X0_MASK) |
497 create_Dest_X0(rd) | create_SrcA_X0(ra) |
498 create_BFStart_X0(bfs) | create_BFEnd_X0(bfe);
499}
500
501__JIT_CODE("__unalign_jit_x0_bfextu: {bfextu r0, r0, 0, 0}");
502static tilegx_bundle_bits jit_x0_bfextu(int rd, int ra, int bfs, int bfe)
503{
504 extern tilegx_bundle_bits __unalign_jit_x0_bfextu;
505 return (GX_INSN_BSWAP(__unalign_jit_x0_bfextu) &
506 GX_INSN_X0_MASK) |
507 create_Dest_X0(rd) | create_SrcA_X0(ra) |
508 create_BFStart_X0(bfs) | create_BFEnd_X0(bfe);
509}
510
511__JIT_CODE("__unalign_jit_x1_addi: {bfextu r1, r1, 0, 0; addi r0, r0, 0}");
512static tilegx_bundle_bits jit_x1_addi(int rd, int ra, int imm8)
513{
514 extern tilegx_bundle_bits __unalign_jit_x1_addi;
515 return (GX_INSN_BSWAP(__unalign_jit_x1_addi) & GX_INSN_X1_MASK) |
516 create_Dest_X1(rd) | create_SrcA_X1(ra) |
517 create_Imm8_X1(imm8);
518}
519
520__JIT_CODE("__unalign_jit_x0_shrui: {shrui r0, r0, 0; iret}");
521static tilegx_bundle_bits jit_x0_shrui(int rd, int ra, int imm6)
522{
523 extern tilegx_bundle_bits __unalign_jit_x0_shrui;
524 return (GX_INSN_BSWAP(__unalign_jit_x0_shrui) &
525 GX_INSN_X0_MASK) |
526 create_Dest_X0(rd) | create_SrcA_X0(ra) |
527 create_ShAmt_X0(imm6);
528}
529
530__JIT_CODE("__unalign_jit_x0_rotli: {rotli r0, r0, 0; iret}");
531static tilegx_bundle_bits jit_x0_rotli(int rd, int ra, int imm6)
532{
533 extern tilegx_bundle_bits __unalign_jit_x0_rotli;
534 return (GX_INSN_BSWAP(__unalign_jit_x0_rotli) &
535 GX_INSN_X0_MASK) |
536 create_Dest_X0(rd) | create_SrcA_X0(ra) |
537 create_ShAmt_X0(imm6);
538}
539
540__JIT_CODE("__unalign_jit_x1_bnezt: {bnezt r0, __unalign_jit_x1_bnezt}");
541static tilegx_bundle_bits jit_x1_bnezt(int ra, int broff)
542{
543 extern tilegx_bundle_bits __unalign_jit_x1_bnezt;
544 return (GX_INSN_BSWAP(__unalign_jit_x1_bnezt) &
545 GX_INSN_X1_MASK) |
546 create_SrcA_X1(ra) | create_BrOff_X1(broff);
547}
548
549#undef __JIT_CODE
550
551/*
552 * This function generates unalign fixup JIT.
553 *
554 * We first find unalign load/store instruction's destination, source
555 * registers: ra, rb and rd. and 3 scratch registers by calling
556 * find_regs(...). 3 scratch clobbers should not alias with any register
557 * used in the fault bundle. Then analyze the fault bundle to determine
558 * if it's a load or store, operand width, branch or address increment etc.
559 * At last generated JIT is copied into JIT code area in user space.
560 */
561
562static
563void jit_bundle_gen(struct pt_regs *regs, tilegx_bundle_bits bundle,
564 int align_ctl)
565{
566 struct thread_info *info = current_thread_info();
567 struct unaligned_jit_fragment frag;
568 struct unaligned_jit_fragment *jit_code_area;
569 tilegx_bundle_bits bundle_2 = 0;
570 /* If bundle_2_enable = false, bundle_2 is fnop/nop operation. */
571 bool bundle_2_enable = true;
572 uint64_t ra, rb, rd = -1, clob1, clob2, clob3;
573 /*
574 * Indicate if the unalign access
575 * instruction's registers hit with
576 * others in the same bundle.
577 */
578 bool alias = false;
579 bool load_n_store = true;
580 bool load_store_signed = false;
581 unsigned int load_store_size = 8;
582 bool y1_br = false; /* True, for a branch in same bundle at Y1.*/
583 int y1_br_reg = 0;
584 /* True for link operation. i.e. jalr or lnk at Y1 */
585 bool y1_lr = false;
586 int y1_lr_reg = 0;
587 bool x1_add = false;/* True, for load/store ADD instruction at X1*/
588 int x1_add_imm8 = 0;
589 bool unexpected = false;
590 int n = 0, k;
591
592 jit_code_area =
593 (struct unaligned_jit_fragment *)(info->unalign_jit_base);
594
595 memset((void *)&frag, 0, sizeof(frag));
596
597 /* 0: X mode, Otherwise: Y mode. */
598 if (bundle & TILEGX_BUNDLE_MODE_MASK) {
599 unsigned int mod, opcode;
600
601 if (get_Opcode_Y1(bundle) == RRR_1_OPCODE_Y1 &&
602 get_RRROpcodeExtension_Y1(bundle) ==
603 UNARY_RRR_1_OPCODE_Y1) {
604
605 opcode = get_UnaryOpcodeExtension_Y1(bundle);
606
607 /*
608 * Test "jalr", "jalrp", "jr", "jrp" instruction at Y1
609 * pipeline.
610 */
611 switch (opcode) {
612 case JALR_UNARY_OPCODE_Y1:
613 case JALRP_UNARY_OPCODE_Y1:
614 y1_lr = true;
615 y1_lr_reg = 55; /* Link register. */
616 /* FALLTHROUGH */
617 case JR_UNARY_OPCODE_Y1:
618 case JRP_UNARY_OPCODE_Y1:
619 y1_br = true;
620 y1_br_reg = get_SrcA_Y1(bundle);
621 break;
622 case LNK_UNARY_OPCODE_Y1:
623 /* "lnk" at Y1 pipeline. */
624 y1_lr = true;
625 y1_lr_reg = get_Dest_Y1(bundle);
626 break;
627 }
628 }
629
630 opcode = get_Opcode_Y2(bundle);
631 mod = get_Mode(bundle);
632
633 /*
634 * bundle_2 is bundle after making Y2 as a dummy operation
635 * - ld zero, sp
636 */
637 bundle_2 = (bundle & (~GX_INSN_Y2_MASK)) | jit_y2_dummy();
638
639 /* Make Y1 as fnop if Y1 is a branch or lnk operation. */
640 if (y1_br || y1_lr) {
641 bundle_2 &= ~(GX_INSN_Y1_MASK);
642 bundle_2 |= jit_y1_fnop();
643 }
644
645 if (is_y0_y1_nop(bundle_2))
646 bundle_2_enable = false;
647
648 if (mod == MODE_OPCODE_YC2) {
649 /* Store. */
650 load_n_store = false;
651 load_store_size = 1 << opcode;
652 load_store_signed = false;
653 find_regs(bundle, 0, &ra, &rb, &clob1, &clob2,
654 &clob3, &alias);
655 if (load_store_size > 8)
656 unexpected = true;
657 } else {
658 /* Load. */
659 load_n_store = true;
660 if (mod == MODE_OPCODE_YB2) {
661 switch (opcode) {
662 case LD_OPCODE_Y2:
663 load_store_signed = false;
664 load_store_size = 8;
665 break;
666 case LD4S_OPCODE_Y2:
667 load_store_signed = true;
668 load_store_size = 4;
669 break;
670 case LD4U_OPCODE_Y2:
671 load_store_signed = false;
672 load_store_size = 4;
673 break;
674 default:
675 unexpected = true;
676 }
677 } else if (mod == MODE_OPCODE_YA2) {
678 if (opcode == LD2S_OPCODE_Y2) {
679 load_store_signed = true;
680 load_store_size = 2;
681 } else if (opcode == LD2U_OPCODE_Y2) {
682 load_store_signed = false;
683 load_store_size = 2;
684 } else
685 unexpected = true;
686 } else
687 unexpected = true;
688 find_regs(bundle, &rd, &ra, &rb, &clob1, &clob2,
689 &clob3, &alias);
690 }
691 } else {
692 unsigned int opcode;
693
694 /* bundle_2 is bundle after making X1 as "fnop". */
695 bundle_2 = (bundle & (~GX_INSN_X1_MASK)) | jit_x1_fnop();
696
697 if (is_x0_x1_nop(bundle_2))
698 bundle_2_enable = false;
699
700 if (get_Opcode_X1(bundle) == RRR_0_OPCODE_X1) {
701 opcode = get_UnaryOpcodeExtension_X1(bundle);
702
703 if (get_RRROpcodeExtension_X1(bundle) ==
704 UNARY_RRR_0_OPCODE_X1) {
705 load_n_store = true;
706 find_regs(bundle, &rd, &ra, &rb, &clob1,
707 &clob2, &clob3, &alias);
708
709 switch (opcode) {
710 case LD_UNARY_OPCODE_X1:
711 load_store_signed = false;
712 load_store_size = 8;
713 break;
714 case LD4S_UNARY_OPCODE_X1:
715 load_store_signed = true;
716 /* FALLTHROUGH */
717 case LD4U_UNARY_OPCODE_X1:
718 load_store_size = 4;
719 break;
720
721 case LD2S_UNARY_OPCODE_X1:
722 load_store_signed = true;
723 /* FALLTHROUGH */
724 case LD2U_UNARY_OPCODE_X1:
725 load_store_size = 2;
726 break;
727 default:
728 unexpected = true;
729 }
730 } else {
731 load_n_store = false;
732 load_store_signed = false;
733 find_regs(bundle, 0, &ra, &rb,
734 &clob1, &clob2, &clob3,
735 &alias);
736
737 opcode = get_RRROpcodeExtension_X1(bundle);
738 switch (opcode) {
739 case ST_RRR_0_OPCODE_X1:
740 load_store_size = 8;
741 break;
742 case ST4_RRR_0_OPCODE_X1:
743 load_store_size = 4;
744 break;
745 case ST2_RRR_0_OPCODE_X1:
746 load_store_size = 2;
747 break;
748 default:
749 unexpected = true;
750 }
751 }
752 } else if (get_Opcode_X1(bundle) == IMM8_OPCODE_X1) {
753 load_n_store = true;
754 opcode = get_Imm8OpcodeExtension_X1(bundle);
755 switch (opcode) {
756 case LD_ADD_IMM8_OPCODE_X1:
757 load_store_size = 8;
758 break;
759
760 case LD4S_ADD_IMM8_OPCODE_X1:
761 load_store_signed = true;
762 /* FALLTHROUGH */
763 case LD4U_ADD_IMM8_OPCODE_X1:
764 load_store_size = 4;
765 break;
766
767 case LD2S_ADD_IMM8_OPCODE_X1:
768 load_store_signed = true;
769 /* FALLTHROUGH */
770 case LD2U_ADD_IMM8_OPCODE_X1:
771 load_store_size = 2;
772 break;
773
774 case ST_ADD_IMM8_OPCODE_X1:
775 load_n_store = false;
776 load_store_size = 8;
777 break;
778 case ST4_ADD_IMM8_OPCODE_X1:
779 load_n_store = false;
780 load_store_size = 4;
781 break;
782 case ST2_ADD_IMM8_OPCODE_X1:
783 load_n_store = false;
784 load_store_size = 2;
785 break;
786 default:
787 unexpected = true;
788 }
789
790 if (!unexpected) {
791 x1_add = true;
792 if (load_n_store)
793 x1_add_imm8 = get_Imm8_X1(bundle);
794 else
795 x1_add_imm8 = get_Dest_Imm8_X1(bundle);
796 }
797
798 find_regs(bundle, load_n_store ? (&rd) : NULL,
799 &ra, &rb, &clob1, &clob2, &clob3, &alias);
800 } else
801 unexpected = true;
802 }
803
804 /*
805 * Some sanity check for register numbers extracted from fault bundle.
806 */
807 if (check_regs(rd, ra, rb, clob1, clob2, clob3) == true)
808 unexpected = true;
809
810 /* Give warning if register ra has an aligned address. */
811 if (!unexpected)
812 WARN_ON(!((load_store_size - 1) & (regs->regs[ra])));
813
814
815 /*
816 * Fault came from kernel space, here we only need take care of
817 * unaligned "get_user/put_user" macros defined in "uaccess.h".
818 * Basically, we will handle bundle like this:
819 * {ld/2u/4s rd, ra; movei rx, 0} or {st/2/4 ra, rb; movei rx, 0}
820 * (Refer to file "arch/tile/include/asm/uaccess.h" for details).
821 * For either load or store, byte-wise operation is performed by calling
822 * get_user() or put_user(). If the macro returns non-zero value,
823 * set the value to rx, otherwise set zero to rx. Finally make pc point
824 * to next bundle and return.
825 */
826
827 if (EX1_PL(regs->ex1) != USER_PL) {
828
829 unsigned long rx = 0;
830 unsigned long x = 0, ret = 0;
831
832 if (y1_br || y1_lr || x1_add ||
833 (load_store_signed !=
834 (load_n_store && load_store_size == 4))) {
835 /* No branch, link, wrong sign-ext or load/store add. */
836 unexpected = true;
837 } else if (!unexpected) {
838 if (bundle & TILEGX_BUNDLE_MODE_MASK) {
839 /*
840 * Fault bundle is Y mode.
841 * Check if the Y1 and Y0 is the form of
842 * { movei rx, 0; nop/fnop }, if yes,
843 * find the rx.
844 */
845
846 if ((get_Opcode_Y1(bundle) == ADDI_OPCODE_Y1)
847 && (get_SrcA_Y1(bundle) == TREG_ZERO) &&
848 (get_Imm8_Y1(bundle) == 0) &&
849 is_bundle_y0_nop(bundle)) {
850 rx = get_Dest_Y1(bundle);
851 } else if ((get_Opcode_Y0(bundle) ==
852 ADDI_OPCODE_Y0) &&
853 (get_SrcA_Y0(bundle) == TREG_ZERO) &&
854 (get_Imm8_Y0(bundle) == 0) &&
855 is_bundle_y1_nop(bundle)) {
856 rx = get_Dest_Y0(bundle);
857 } else {
858 unexpected = true;
859 }
860 } else {
861 /*
862 * Fault bundle is X mode.
863 * Check if the X0 is 'movei rx, 0',
864 * if yes, find the rx.
865 */
866
867 if ((get_Opcode_X0(bundle) == IMM8_OPCODE_X0)
868 && (get_Imm8OpcodeExtension_X0(bundle) ==
869 ADDI_IMM8_OPCODE_X0) &&
870 (get_SrcA_X0(bundle) == TREG_ZERO) &&
871 (get_Imm8_X0(bundle) == 0)) {
872 rx = get_Dest_X0(bundle);
873 } else {
874 unexpected = true;
875 }
876 }
877
878 /* rx should be less than 56. */
879 if (!unexpected && (rx >= 56))
880 unexpected = true;
881 }
882
883 if (!search_exception_tables(regs->pc)) {
884 /* No fixup in the exception tables for the pc. */
885 unexpected = true;
886 }
887
888 if (unexpected) {
889 /* Unexpected unalign kernel fault. */
890 struct task_struct *tsk = validate_current();
891
892 bust_spinlocks(1);
893
894 show_regs(regs);
895
896 if (unlikely(tsk->pid < 2)) {
897 panic("Kernel unalign fault running %s!",
898 tsk->pid ? "init" : "the idle task");
899 }
900#ifdef SUPPORT_DIE
901 die("Oops", regs);
902#endif
903 bust_spinlocks(1);
904
905 do_group_exit(SIGKILL);
906
907 } else {
908 unsigned long i, b = 0;
909 unsigned char *ptr =
910 (unsigned char *)regs->regs[ra];
911 if (load_n_store) {
912 /* handle get_user(x, ptr) */
913 for (i = 0; i < load_store_size; i++) {
914 ret = get_user(b, ptr++);
915 if (!ret) {
916 /* Success! update x. */
917#ifdef __LITTLE_ENDIAN
918 x |= (b << (8 * i));
919#else
920 x <<= 8;
921 x |= b;
922#endif /* __LITTLE_ENDIAN */
923 } else {
924 x = 0;
925 break;
926 }
927 }
928
929 /* Sign-extend 4-byte loads. */
930 if (load_store_size == 4)
931 x = (long)(int)x;
932
933 /* Set register rd. */
934 regs->regs[rd] = x;
935
936 /* Set register rx. */
937 regs->regs[rx] = ret;
938
939 /* Bump pc. */
940 regs->pc += 8;
941
942 } else {
943 /* Handle put_user(x, ptr) */
944 x = regs->regs[rb];
945#ifdef __LITTLE_ENDIAN
946 b = x;
947#else
948 /*
949 * Swap x in order to store x from low
950 * to high memory same as the
951 * little-endian case.
952 */
953 switch (load_store_size) {
954 case 8:
955 b = swab64(x);
956 break;
957 case 4:
958 b = swab32(x);
959 break;
960 case 2:
961 b = swab16(x);
962 break;
963 }
964#endif /* __LITTLE_ENDIAN */
965 for (i = 0; i < load_store_size; i++) {
966 ret = put_user(b, ptr++);
967 if (ret)
968 break;
969 /* Success! shift 1 byte. */
970 b >>= 8;
971 }
972 /* Set register rx. */
973 regs->regs[rx] = ret;
974
975 /* Bump pc. */
976 regs->pc += 8;
977 }
978 }
979
980 unaligned_fixup_count++;
981
982 if (unaligned_printk) {
983 pr_info("%s/%d. Unalign fixup for kernel access "
984 "to userspace %lx.",
985 current->comm, current->pid, regs->regs[ra]);
986 }
987
988 /* Done! Return to the exception handler. */
989 return;
990 }
991
992 if ((align_ctl == 0) || unexpected) {
993 siginfo_t info = {
994 .si_signo = SIGBUS,
995 .si_code = BUS_ADRALN,
996 .si_addr = (unsigned char __user *)0
997 };
998 if (unaligned_printk)
999 pr_info("Unalign bundle: unexp @%llx, %llx",
1000 (unsigned long long)regs->pc,
1001 (unsigned long long)bundle);
1002
1003 if (ra < 56) {
1004 unsigned long uaa = (unsigned long)regs->regs[ra];
1005 /* Set bus Address. */
1006 info.si_addr = (unsigned char __user *)uaa;
1007 }
1008
1009 unaligned_fixup_count++;
1010
1011 trace_unhandled_signal("unaligned fixup trap", regs,
1012 (unsigned long)info.si_addr, SIGBUS);
1013 force_sig_info(info.si_signo, &info, current);
1014 return;
1015 }
1016
1017#ifdef __LITTLE_ENDIAN
1018#define UA_FIXUP_ADDR_DELTA 1
1019#define UA_FIXUP_BFEXT_START(_B_) 0
1020#define UA_FIXUP_BFEXT_END(_B_) (8 * (_B_) - 1)
1021#else /* __BIG_ENDIAN */
1022#define UA_FIXUP_ADDR_DELTA -1
1023#define UA_FIXUP_BFEXT_START(_B_) (64 - 8 * (_B_))
1024#define UA_FIXUP_BFEXT_END(_B_) 63
1025#endif /* __LITTLE_ENDIAN */
1026
1027
1028
1029 if ((ra != rb) && (rd != TREG_SP) && !alias &&
1030 !y1_br && !y1_lr && !x1_add) {
1031 /*
1032 * Simple case: ra != rb and no register alias found,
1033 * and no branch or link. This will be the majority.
1034 * We can do a little better for simplae case than the
1035 * generic scheme below.
1036 */
1037 if (!load_n_store) {
1038 /*
1039 * Simple store: ra != rb, no need for scratch register.
1040 * Just store and rotate to right bytewise.
1041 */
1042#ifdef __BIG_ENDIAN
1043 frag.insn[n++] =
1044 jit_x0_addi(ra, ra, load_store_size - 1) |
1045 jit_x1_fnop();
1046#endif /* __BIG_ENDIAN */
1047 for (k = 0; k < load_store_size; k++) {
1048 /* Store a byte. */
1049 frag.insn[n++] =
1050 jit_x0_rotli(rb, rb, 56) |
1051 jit_x1_st1_add(ra, rb,
1052 UA_FIXUP_ADDR_DELTA);
1053 }
1054#ifdef __BIG_ENDIAN
1055 frag.insn[n] = jit_x1_addi(ra, ra, 1);
1056#else
1057 frag.insn[n] = jit_x1_addi(ra, ra,
1058 -1 * load_store_size);
1059#endif /* __LITTLE_ENDIAN */
1060
1061 if (load_store_size == 8) {
1062 frag.insn[n] |= jit_x0_fnop();
1063 } else if (load_store_size == 4) {
1064 frag.insn[n] |= jit_x0_rotli(rb, rb, 32);
1065 } else { /* = 2 */
1066 frag.insn[n] |= jit_x0_rotli(rb, rb, 16);
1067 }
1068 n++;
1069 if (bundle_2_enable)
1070 frag.insn[n++] = bundle_2;
1071 frag.insn[n++] = jit_x0_fnop() | jit_x1_iret();
1072 } else {
1073 if (rd == ra) {
1074 /* Use two clobber registers: clob1/2. */
1075 frag.insn[n++] =
1076 jit_x0_addi(TREG_SP, TREG_SP, -16) |
1077 jit_x1_fnop();
1078 frag.insn[n++] =
1079 jit_x0_addi(clob1, ra, 7) |
1080 jit_x1_st_add(TREG_SP, clob1, -8);
1081 frag.insn[n++] =
1082 jit_x0_addi(clob2, ra, 0) |
1083 jit_x1_st(TREG_SP, clob2);
1084 frag.insn[n++] =
1085 jit_x0_fnop() |
1086 jit_x1_ldna(rd, ra);
1087 frag.insn[n++] =
1088 jit_x0_fnop() |
1089 jit_x1_ldna(clob1, clob1);
1090 /*
1091 * Note: we must make sure that rd must not
1092 * be sp. Recover clob1/2 from stack.
1093 */
1094 frag.insn[n++] =
1095 jit_x0_dblalign(rd, clob1, clob2) |
1096 jit_x1_ld_add(clob2, TREG_SP, 8);
1097 frag.insn[n++] =
1098 jit_x0_fnop() |
1099 jit_x1_ld_add(clob1, TREG_SP, 16);
1100 } else {
1101 /* Use one clobber register: clob1 only. */
1102 frag.insn[n++] =
1103 jit_x0_addi(TREG_SP, TREG_SP, -16) |
1104 jit_x1_fnop();
1105 frag.insn[n++] =
1106 jit_x0_addi(clob1, ra, 7) |
1107 jit_x1_st(TREG_SP, clob1);
1108 frag.insn[n++] =
1109 jit_x0_fnop() |
1110 jit_x1_ldna(rd, ra);
1111 frag.insn[n++] =
1112 jit_x0_fnop() |
1113 jit_x1_ldna(clob1, clob1);
1114 /*
1115 * Note: we must make sure that rd must not
1116 * be sp. Recover clob1 from stack.
1117 */
1118 frag.insn[n++] =
1119 jit_x0_dblalign(rd, clob1, ra) |
1120 jit_x1_ld_add(clob1, TREG_SP, 16);
1121 }
1122
1123 if (bundle_2_enable)
1124 frag.insn[n++] = bundle_2;
1125 /*
1126 * For non 8-byte load, extract corresponding bytes and
1127 * signed extension.
1128 */
1129 if (load_store_size == 4) {
1130 if (load_store_signed)
1131 frag.insn[n++] =
1132 jit_x0_bfexts(
1133 rd, rd,
1134 UA_FIXUP_BFEXT_START(4),
1135 UA_FIXUP_BFEXT_END(4)) |
1136 jit_x1_fnop();
1137 else
1138 frag.insn[n++] =
1139 jit_x0_bfextu(
1140 rd, rd,
1141 UA_FIXUP_BFEXT_START(4),
1142 UA_FIXUP_BFEXT_END(4)) |
1143 jit_x1_fnop();
1144 } else if (load_store_size == 2) {
1145 if (load_store_signed)
1146 frag.insn[n++] =
1147 jit_x0_bfexts(
1148 rd, rd,
1149 UA_FIXUP_BFEXT_START(2),
1150 UA_FIXUP_BFEXT_END(2)) |
1151 jit_x1_fnop();
1152 else
1153 frag.insn[n++] =
1154 jit_x0_bfextu(
1155 rd, rd,
1156 UA_FIXUP_BFEXT_START(2),
1157 UA_FIXUP_BFEXT_END(2)) |
1158 jit_x1_fnop();
1159 }
1160
1161 frag.insn[n++] =
1162 jit_x0_fnop() |
1163 jit_x1_iret();
1164 }
1165 } else if (!load_n_store) {
1166
1167 /*
1168 * Generic memory store cases: use 3 clobber registers.
1169 *
1170 * Alloc space for saveing clob2,1,3 on user's stack.
1171 * register clob3 points to where clob2 saved, followed by
1172 * clob1 and 3 from high to low memory.
1173 */
1174 frag.insn[n++] =
1175 jit_x0_addi(TREG_SP, TREG_SP, -32) |
1176 jit_x1_fnop();
1177 frag.insn[n++] =
1178 jit_x0_addi(clob3, TREG_SP, 16) |
1179 jit_x1_st_add(TREG_SP, clob3, 8);
1180#ifdef __LITTLE_ENDIAN
1181 frag.insn[n++] =
1182 jit_x0_addi(clob1, ra, 0) |
1183 jit_x1_st_add(TREG_SP, clob1, 8);
1184#else
1185 frag.insn[n++] =
1186 jit_x0_addi(clob1, ra, load_store_size - 1) |
1187 jit_x1_st_add(TREG_SP, clob1, 8);
1188#endif
1189 if (load_store_size == 8) {
1190 /*
1191 * We save one byte a time, not for fast, but compact
1192 * code. After each store, data source register shift
1193 * right one byte. unchanged after 8 stores.
1194 */
1195 frag.insn[n++] =
1196 jit_x0_addi(clob2, TREG_ZERO, 7) |
1197 jit_x1_st_add(TREG_SP, clob2, 16);
1198 frag.insn[n++] =
1199 jit_x0_rotli(rb, rb, 56) |
1200 jit_x1_st1_add(clob1, rb, UA_FIXUP_ADDR_DELTA);
1201 frag.insn[n++] =
1202 jit_x0_addi(clob2, clob2, -1) |
1203 jit_x1_bnezt(clob2, -1);
1204 frag.insn[n++] =
1205 jit_x0_fnop() |
1206 jit_x1_addi(clob2, y1_br_reg, 0);
1207 } else if (load_store_size == 4) {
1208 frag.insn[n++] =
1209 jit_x0_addi(clob2, TREG_ZERO, 3) |
1210 jit_x1_st_add(TREG_SP, clob2, 16);
1211 frag.insn[n++] =
1212 jit_x0_rotli(rb, rb, 56) |
1213 jit_x1_st1_add(clob1, rb, UA_FIXUP_ADDR_DELTA);
1214 frag.insn[n++] =
1215 jit_x0_addi(clob2, clob2, -1) |
1216 jit_x1_bnezt(clob2, -1);
1217 /*
1218 * same as 8-byte case, but need shift another 4
1219 * byte to recover rb for 4-byte store.
1220 */
1221 frag.insn[n++] = jit_x0_rotli(rb, rb, 32) |
1222 jit_x1_addi(clob2, y1_br_reg, 0);
1223 } else { /* =2 */
1224 frag.insn[n++] =
1225 jit_x0_addi(clob2, rb, 0) |
1226 jit_x1_st_add(TREG_SP, clob2, 16);
1227 for (k = 0; k < 2; k++) {
1228 frag.insn[n++] =
1229 jit_x0_shrui(rb, rb, 8) |
1230 jit_x1_st1_add(clob1, rb,
1231 UA_FIXUP_ADDR_DELTA);
1232 }
1233 frag.insn[n++] =
1234 jit_x0_addi(rb, clob2, 0) |
1235 jit_x1_addi(clob2, y1_br_reg, 0);
1236 }
1237
1238 if (bundle_2_enable)
1239 frag.insn[n++] = bundle_2;
1240
1241 if (y1_lr) {
1242 frag.insn[n++] =
1243 jit_x0_fnop() |
1244 jit_x1_mfspr(y1_lr_reg,
1245 SPR_EX_CONTEXT_0_0);
1246 }
1247 if (y1_br) {
1248 frag.insn[n++] =
1249 jit_x0_fnop() |
1250 jit_x1_mtspr(SPR_EX_CONTEXT_0_0,
1251 clob2);
1252 }
1253 if (x1_add) {
1254 frag.insn[n++] =
1255 jit_x0_addi(ra, ra, x1_add_imm8) |
1256 jit_x1_ld_add(clob2, clob3, -8);
1257 } else {
1258 frag.insn[n++] =
1259 jit_x0_fnop() |
1260 jit_x1_ld_add(clob2, clob3, -8);
1261 }
1262 frag.insn[n++] =
1263 jit_x0_fnop() |
1264 jit_x1_ld_add(clob1, clob3, -8);
1265 frag.insn[n++] = jit_x0_fnop() | jit_x1_ld(clob3, clob3);
1266 frag.insn[n++] = jit_x0_fnop() | jit_x1_iret();
1267
1268 } else {
1269 /*
1270 * Generic memory load cases.
1271 *
1272 * Alloc space for saveing clob1,2,3 on user's stack.
1273 * register clob3 points to where clob1 saved, followed
1274 * by clob2 and 3 from high to low memory.
1275 */
1276
1277 frag.insn[n++] =
1278 jit_x0_addi(TREG_SP, TREG_SP, -32) |
1279 jit_x1_fnop();
1280 frag.insn[n++] =
1281 jit_x0_addi(clob3, TREG_SP, 16) |
1282 jit_x1_st_add(TREG_SP, clob3, 8);
1283 frag.insn[n++] =
1284 jit_x0_addi(clob2, ra, 0) |
1285 jit_x1_st_add(TREG_SP, clob2, 8);
1286
1287 if (y1_br) {
1288 frag.insn[n++] =
1289 jit_x0_addi(clob1, y1_br_reg, 0) |
1290 jit_x1_st_add(TREG_SP, clob1, 16);
1291 } else {
1292 frag.insn[n++] =
1293 jit_x0_fnop() |
1294 jit_x1_st_add(TREG_SP, clob1, 16);
1295 }
1296
1297 if (bundle_2_enable)
1298 frag.insn[n++] = bundle_2;
1299
1300 if (y1_lr) {
1301 frag.insn[n++] =
1302 jit_x0_fnop() |
1303 jit_x1_mfspr(y1_lr_reg,
1304 SPR_EX_CONTEXT_0_0);
1305 }
1306
1307 if (y1_br) {
1308 frag.insn[n++] =
1309 jit_x0_fnop() |
1310 jit_x1_mtspr(SPR_EX_CONTEXT_0_0,
1311 clob1);
1312 }
1313
1314 frag.insn[n++] =
1315 jit_x0_addi(clob1, clob2, 7) |
1316 jit_x1_ldna(rd, clob2);
1317 frag.insn[n++] =
1318 jit_x0_fnop() |
1319 jit_x1_ldna(clob1, clob1);
1320 frag.insn[n++] =
1321 jit_x0_dblalign(rd, clob1, clob2) |
1322 jit_x1_ld_add(clob1, clob3, -8);
1323 if (x1_add) {
1324 frag.insn[n++] =
1325 jit_x0_addi(ra, ra, x1_add_imm8) |
1326 jit_x1_ld_add(clob2, clob3, -8);
1327 } else {
1328 frag.insn[n++] =
1329 jit_x0_fnop() |
1330 jit_x1_ld_add(clob2, clob3, -8);
1331 }
1332
1333 frag.insn[n++] =
1334 jit_x0_fnop() |
1335 jit_x1_ld(clob3, clob3);
1336
1337 if (load_store_size == 4) {
1338 if (load_store_signed)
1339 frag.insn[n++] =
1340 jit_x0_bfexts(
1341 rd, rd,
1342 UA_FIXUP_BFEXT_START(4),
1343 UA_FIXUP_BFEXT_END(4)) |
1344 jit_x1_fnop();
1345 else
1346 frag.insn[n++] =
1347 jit_x0_bfextu(
1348 rd, rd,
1349 UA_FIXUP_BFEXT_START(4),
1350 UA_FIXUP_BFEXT_END(4)) |
1351 jit_x1_fnop();
1352 } else if (load_store_size == 2) {
1353 if (load_store_signed)
1354 frag.insn[n++] =
1355 jit_x0_bfexts(
1356 rd, rd,
1357 UA_FIXUP_BFEXT_START(2),
1358 UA_FIXUP_BFEXT_END(2)) |
1359 jit_x1_fnop();
1360 else
1361 frag.insn[n++] =
1362 jit_x0_bfextu(
1363 rd, rd,
1364 UA_FIXUP_BFEXT_START(2),
1365 UA_FIXUP_BFEXT_END(2)) |
1366 jit_x1_fnop();
1367 }
1368
1369 frag.insn[n++] = jit_x0_fnop() | jit_x1_iret();
1370 }
1371
1372 /* Max JIT bundle count is 14. */
1373 WARN_ON(n > 14);
1374
1375 if (!unexpected) {
1376 int status = 0;
1377 int idx = (regs->pc >> 3) &
1378 ((1ULL << (PAGE_SHIFT - UNALIGN_JIT_SHIFT)) - 1);
1379
1380 frag.pc = regs->pc;
1381 frag.bundle = bundle;
1382
1383 if (unaligned_printk) {
1384 pr_info("%s/%d, Unalign fixup: pc=%lx "
1385 "bundle=%lx %d %d %d %d %d %d %d %d.",
1386 current->comm, current->pid,
1387 (unsigned long)frag.pc,
1388 (unsigned long)frag.bundle,
1389 (int)alias, (int)rd, (int)ra,
1390 (int)rb, (int)bundle_2_enable,
1391 (int)y1_lr, (int)y1_br, (int)x1_add);
1392
1393 for (k = 0; k < n; k += 2)
1394 pr_info("[%d] %016llx %016llx", k,
1395 (unsigned long long)frag.insn[k],
1396 (unsigned long long)frag.insn[k+1]);
1397 }
1398
1399 /* Swap bundle byte order for big endian sys. */
1400#ifdef __BIG_ENDIAN
1401 frag.bundle = GX_INSN_BSWAP(frag.bundle);
1402 for (k = 0; k < n; k++)
1403 frag.insn[k] = GX_INSN_BSWAP(frag.insn[k]);
1404#endif /* __BIG_ENDIAN */
1405
1406 status = copy_to_user((void __user *)&jit_code_area[idx],
1407 &frag, sizeof(frag));
1408 if (status) {
1409 /* Fail to copy JIT into user land. send SIGSEGV. */
1410 siginfo_t info = {
1411 .si_signo = SIGSEGV,
1412 .si_code = SEGV_MAPERR,
1413 .si_addr = (void __user *)&jit_code_area[idx]
1414 };
1415
1416 pr_warn("Unalign fixup: pid=%d %s jit_code_area=%llx",
1417 current->pid, current->comm,
1418 (unsigned long long)&jit_code_area[idx]);
1419
1420 trace_unhandled_signal("segfault in unalign fixup",
1421 regs,
1422 (unsigned long)info.si_addr,
1423 SIGSEGV);
1424 force_sig_info(info.si_signo, &info, current);
1425 return;
1426 }
1427
1428
1429 /* Do a cheaper increment, not accurate. */
1430 unaligned_fixup_count++;
1431 __flush_icache_range((unsigned long)&jit_code_area[idx],
1432 (unsigned long)&jit_code_area[idx] +
1433 sizeof(frag));
1434
1435 /* Setup SPR_EX_CONTEXT_0_0/1 for returning to user program.*/
1436 __insn_mtspr(SPR_EX_CONTEXT_0_0, regs->pc + 8);
1437 __insn_mtspr(SPR_EX_CONTEXT_0_1, PL_ICS_EX1(USER_PL, 0));
1438
1439 /* Modify pc at the start of new JIT. */
1440 regs->pc = (unsigned long)&jit_code_area[idx].insn[0];
1441 /* Set ICS in SPR_EX_CONTEXT_K_1. */
1442 regs->ex1 = PL_ICS_EX1(USER_PL, 1);
1443 }
1444}
1445
1446
1447/*
1448 * C function to generate unalign data JIT. Called from unalign data
1449 * interrupt handler.
1450 *
1451 * First check if unalign fix is disabled or exception did not not come from
1452 * user space or sp register points to unalign address, if true, generate a
1453 * SIGBUS. Then map a page into user space as JIT area if it is not mapped
1454 * yet. Genenerate JIT code by calling jit_bundle_gen(). After that return
1455 * back to exception handler.
1456 *
1457 * The exception handler will "iret" to new generated JIT code after
1458 * restoring caller saved registers. In theory, the JIT code will perform
1459 * another "iret" to resume user's program.
1460 */
1461
1462void do_unaligned(struct pt_regs *regs, int vecnum)
1463{
1464 tilegx_bundle_bits __user *pc;
1465 tilegx_bundle_bits bundle;
1466 struct thread_info *info = current_thread_info();
1467 int align_ctl;
1468
1469 /* Checks the per-process unaligned JIT flags */
1470 align_ctl = unaligned_fixup;
1471 switch (task_thread_info(current)->align_ctl) {
1472 case PR_UNALIGN_NOPRINT:
1473 align_ctl = 1;
1474 break;
1475 case PR_UNALIGN_SIGBUS:
1476 align_ctl = 0;
1477 break;
1478 }
1479
1480 /* Enable iterrupt in order to access user land. */
1481 local_irq_enable();
1482
1483 /*
1484 * The fault came from kernel space. Two choices:
1485 * (a) unaligned_fixup < 1, we will first call get/put_user fixup
1486 * to return -EFAULT. If no fixup, simply panic the kernel.
1487 * (b) unaligned_fixup >=1, we will try to fix the unaligned access
1488 * if it was triggered by get_user/put_user() macros. Panic the
1489 * kernel if it is not fixable.
1490 */
1491
1492 if (EX1_PL(regs->ex1) != USER_PL) {
1493
1494 if (align_ctl < 1) {
1495 unaligned_fixup_count++;
1496 /* If exception came from kernel, try fix it up. */
1497 if (fixup_exception(regs)) {
1498 if (unaligned_printk)
1499 pr_info("Unalign fixup: %d %llx @%llx",
1500 (int)unaligned_fixup,
1501 (unsigned long long)regs->ex1,
1502 (unsigned long long)regs->pc);
1503 return;
1504 }
1505 /* Not fixable. Go panic. */
1506 panic("Unalign exception in Kernel. pc=%lx",
1507 regs->pc);
1508 return;
1509 } else {
1510 /*
1511 * Try to fix the exception. If we can't, panic the
1512 * kernel.
1513 */
1514 bundle = GX_INSN_BSWAP(
1515 *((tilegx_bundle_bits *)(regs->pc)));
1516 jit_bundle_gen(regs, bundle, align_ctl);
1517 return;
1518 }
1519 }
1520
1521 /*
1522 * Fault came from user with ICS or stack is not aligned.
1523 * If so, we will trigger SIGBUS.
1524 */
1525 if ((regs->sp & 0x7) || (regs->ex1) || (align_ctl < 0)) {
1526 siginfo_t info = {
1527 .si_signo = SIGBUS,
1528 .si_code = BUS_ADRALN,
1529 .si_addr = (unsigned char __user *)0
1530 };
1531
1532 if (unaligned_printk)
1533 pr_info("Unalign fixup: %d %llx @%llx",
1534 (int)unaligned_fixup,
1535 (unsigned long long)regs->ex1,
1536 (unsigned long long)regs->pc);
1537
1538 unaligned_fixup_count++;
1539
1540 trace_unhandled_signal("unaligned fixup trap", regs, 0, SIGBUS);
1541 force_sig_info(info.si_signo, &info, current);
1542 return;
1543 }
1544
1545
1546 /* Read the bundle casued the exception! */
1547 pc = (tilegx_bundle_bits __user *)(regs->pc);
1548 if (get_user(bundle, pc) != 0) {
1549 /* Probably never be here since pc is valid user address.*/
1550 siginfo_t info = {
1551 .si_signo = SIGSEGV,
1552 .si_code = SEGV_MAPERR,
1553 .si_addr = (void __user *)pc
1554 };
1555 pr_err("Couldn't read instruction at %p trying to step\n", pc);
1556 trace_unhandled_signal("segfault in unalign fixup", regs,
1557 (unsigned long)info.si_addr, SIGSEGV);
1558 force_sig_info(info.si_signo, &info, current);
1559 return;
1560 }
1561
1562 if (!info->unalign_jit_base) {
1563 void __user *user_page;
1564
1565 /*
1566 * Allocate a page in userland.
1567 * For 64-bit processes we try to place the mapping far
1568 * from anything else that might be going on (specifically
1569 * 64 GB below the top of the user address space). If it
1570 * happens not to be possible to put it there, it's OK;
1571 * the kernel will choose another location and we'll
1572 * remember it for later.
1573 */
1574 if (is_compat_task())
1575 user_page = NULL;
1576 else
1577 user_page = (void __user *)(TASK_SIZE - (1UL << 36)) +
1578 (current->pid << PAGE_SHIFT);
1579
1580 user_page = (void __user *) vm_mmap(NULL,
1581 (unsigned long)user_page,
1582 PAGE_SIZE,
1583 PROT_EXEC | PROT_READ |
1584 PROT_WRITE,
1585#ifdef CONFIG_HOMECACHE
1586 MAP_CACHE_HOME_TASK |
1587#endif
1588 MAP_PRIVATE |
1589 MAP_ANONYMOUS,
1590 0);
1591
1592 if (IS_ERR((void __force *)user_page)) {
1593 pr_err("Out of kernel pages trying do_mmap.\n");
1594 return;
1595 }
1596
1597 /* Save the address in the thread_info struct */
1598 info->unalign_jit_base = user_page;
1599 if (unaligned_printk)
1600 pr_info("Unalign bundle: %d:%d, allocate page @%llx",
1601 raw_smp_processor_id(), current->pid,
1602 (unsigned long long)user_page);
1603 }
1604
1605 /* Generate unalign JIT */
1606 jit_bundle_gen(regs, GX_INSN_BSWAP(bundle), align_ctl);
1607}
1608
1609#endif /* __tilegx__ */
diff --git a/arch/tile/kernel/vdso.c b/arch/tile/kernel/vdso.c
new file mode 100644
index 000000000000..1533af24106e
--- /dev/null
+++ b/arch/tile/kernel/vdso.c
@@ -0,0 +1,212 @@
1/*
2 * Copyright 2012 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#include <linux/binfmts.h>
16#include <linux/compat.h>
17#include <linux/elf.h>
18#include <linux/mm.h>
19#include <linux/pagemap.h>
20
21#include <asm/vdso.h>
22#include <asm/mman.h>
23#include <asm/sections.h>
24
25#include <arch/sim.h>
26
27/* The alignment of the vDSO. */
28#define VDSO_ALIGNMENT PAGE_SIZE
29
30
31static unsigned int vdso_pages;
32static struct page **vdso_pagelist;
33
34#ifdef CONFIG_COMPAT
35static unsigned int vdso32_pages;
36static struct page **vdso32_pagelist;
37#endif
38static int vdso_ready;
39
40/*
41 * The vdso data page.
42 */
43static union {
44 struct vdso_data data;
45 u8 page[PAGE_SIZE];
46} vdso_data_store __page_aligned_data;
47
48struct vdso_data *vdso_data = &vdso_data_store.data;
49
50static unsigned int __read_mostly vdso_enabled = 1;
51
52static struct page **vdso_setup(void *vdso_kbase, unsigned int pages)
53{
54 int i;
55 struct page **pagelist;
56
57 pagelist = kzalloc(sizeof(struct page *) * (pages + 1), GFP_KERNEL);
58 BUG_ON(pagelist == NULL);
59 for (i = 0; i < pages - 1; i++) {
60 struct page *pg = virt_to_page(vdso_kbase + i*PAGE_SIZE);
61 ClearPageReserved(pg);
62 pagelist[i] = pg;
63 }
64 pagelist[pages - 1] = virt_to_page(vdso_data);
65 pagelist[pages] = NULL;
66
67 return pagelist;
68}
69
70static int __init vdso_init(void)
71{
72 int data_pages = sizeof(vdso_data_store) >> PAGE_SHIFT;
73
74 /*
75 * We can disable vDSO support generally, but we need to retain
76 * one page to support the two-bundle (16-byte) rt_sigreturn path.
77 */
78 if (!vdso_enabled) {
79 size_t offset = (unsigned long)&__vdso_rt_sigreturn;
80 static struct page *sigret_page;
81 sigret_page = alloc_page(GFP_KERNEL | __GFP_ZERO);
82 BUG_ON(sigret_page == NULL);
83 vdso_pagelist = &sigret_page;
84 vdso_pages = 1;
85 BUG_ON(offset >= PAGE_SIZE);
86 memcpy(page_address(sigret_page) + offset,
87 vdso_start + offset, 16);
88#ifdef CONFIG_COMPAT
89 vdso32_pages = vdso_pages;
90 vdso32_pagelist = vdso_pagelist;
91#endif
92 vdso_ready = 1;
93 return 0;
94 }
95
96 vdso_pages = (vdso_end - vdso_start) >> PAGE_SHIFT;
97 vdso_pages += data_pages;
98 vdso_pagelist = vdso_setup(vdso_start, vdso_pages);
99
100#ifdef CONFIG_COMPAT
101 vdso32_pages = (vdso32_end - vdso32_start) >> PAGE_SHIFT;
102 vdso32_pages += data_pages;
103 vdso32_pagelist = vdso_setup(vdso32_start, vdso32_pages);
104#endif
105
106 smp_wmb();
107 vdso_ready = 1;
108
109 return 0;
110}
111arch_initcall(vdso_init);
112
113const char *arch_vma_name(struct vm_area_struct *vma)
114{
115 if (vma->vm_mm && vma->vm_start == VDSO_BASE)
116 return "[vdso]";
117#ifndef __tilegx__
118 if (vma->vm_start == MEM_USER_INTRPT)
119 return "[intrpt]";
120#endif
121 return NULL;
122}
123
124struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
125{
126 return NULL;
127}
128
129int in_gate_area(struct mm_struct *mm, unsigned long address)
130{
131 return 0;
132}
133
134int in_gate_area_no_mm(unsigned long address)
135{
136 return 0;
137}
138
139int setup_vdso_pages(void)
140{
141 struct page **pagelist;
142 unsigned long pages;
143 struct mm_struct *mm = current->mm;
144 unsigned long vdso_base = 0;
145 int retval = 0;
146
147 if (!vdso_ready)
148 return 0;
149
150 mm->context.vdso_base = 0;
151
152 pagelist = vdso_pagelist;
153 pages = vdso_pages;
154#ifdef CONFIG_COMPAT
155 if (is_compat_task()) {
156 pagelist = vdso32_pagelist;
157 pages = vdso32_pages;
158 }
159#endif
160
161 /*
162 * vDSO has a problem and was disabled, just don't "enable" it for the
163 * process.
164 */
165 if (pages == 0)
166 return 0;
167
168 vdso_base = get_unmapped_area(NULL, vdso_base,
169 (pages << PAGE_SHIFT) +
170 ((VDSO_ALIGNMENT - 1) & PAGE_MASK),
171 0, 0);
172 if (IS_ERR_VALUE(vdso_base)) {
173 retval = vdso_base;
174 return retval;
175 }
176
177 /* Add required alignment. */
178 vdso_base = ALIGN(vdso_base, VDSO_ALIGNMENT);
179
180 /*
181 * Put vDSO base into mm struct. We need to do this before calling
182 * install_special_mapping or the perf counter mmap tracking code
183 * will fail to recognise it as a vDSO (since arch_vma_name fails).
184 */
185 mm->context.vdso_base = vdso_base;
186
187 /*
188 * our vma flags don't have VM_WRITE so by default, the process isn't
189 * allowed to write those pages.
190 * gdb can break that with ptrace interface, and thus trigger COW on
191 * those pages but it's then your responsibility to never do that on
192 * the "data" page of the vDSO or you'll stop getting kernel updates
193 * and your nice userland gettimeofday will be totally dead.
194 * It's fine to use that for setting breakpoints in the vDSO code
195 * pages though
196 */
197 retval = install_special_mapping(mm, vdso_base,
198 pages << PAGE_SHIFT,
199 VM_READ|VM_EXEC |
200 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC,
201 pagelist);
202 if (retval)
203 mm->context.vdso_base = 0;
204
205 return retval;
206}
207
208static __init int vdso_func(char *s)
209{
210 return kstrtouint(s, 0, &vdso_enabled);
211}
212__setup("vdso=", vdso_func);
diff --git a/arch/tile/kernel/vdso/Makefile b/arch/tile/kernel/vdso/Makefile
new file mode 100644
index 000000000000..e2b7a2f4ee41
--- /dev/null
+++ b/arch/tile/kernel/vdso/Makefile
@@ -0,0 +1,118 @@
1# Symbols present in the vdso
2vdso-syms = rt_sigreturn gettimeofday
3
4# Files to link into the vdso
5obj-vdso = $(patsubst %, v%.o, $(vdso-syms))
6
7# Build rules
8targets := $(obj-vdso) vdso.so vdso.so.dbg vdso.lds
9obj-vdso := $(addprefix $(obj)/, $(obj-vdso))
10
11# vdso32 is only for tilegx -m32 compat task.
12VDSO32-$(CONFIG_COMPAT) := y
13
14obj-y += vdso.o
15obj-$(VDSO32-y) += vdso32.o
16extra-y += vdso.lds
17CPPFLAGS_vdso.lds += -P -C -U$(ARCH)
18
19# vDSO code runs in userspace and -pg doesn't help with profiling anyway.
20CFLAGS_REMOVE_vdso.o = -pg
21CFLAGS_REMOVE_vdso32.o = -pg
22CFLAGS_REMOVE_vrt_sigreturn.o = -pg
23CFLAGS_REMOVE_vrt_sigreturn32.o = -pg
24CFLAGS_REMOVE_vgettimeofday.o = -pg
25CFLAGS_REMOVE_vgettimeofday32.o = -pg
26
27ifdef CONFIG_FEEDBACK_COLLECT
28# vDSO code runs in userspace, not collecting feedback data.
29CFLAGS_REMOVE_vdso.o = -ffeedback-generate
30CFLAGS_REMOVE_vdso32.o = -ffeedback-generate
31CFLAGS_REMOVE_vrt_sigreturn.o = -ffeedback-generate
32CFLAGS_REMOVE_vrt_sigreturn32.o = -ffeedback-generate
33CFLAGS_REMOVE_vgettimeofday.o = -ffeedback-generate
34CFLAGS_REMOVE_vgettimeofday32.o = -ffeedback-generate
35endif
36
37# Disable gcov profiling for VDSO code
38GCOV_PROFILE := n
39
40# Force dependency
41$(obj)/vdso.o: $(obj)/vdso.so
42
43# link rule for the .so file, .lds has to be first
44SYSCFLAGS_vdso.so.dbg = $(c_flags)
45$(obj)/vdso.so.dbg: $(src)/vdso.lds $(obj-vdso)
46 $(call if_changed,vdsold)
47
48
49# We also create a special relocatable object that should mirror the symbol
50# table and layout of the linked DSO. With ld -R we can then refer to
51# these symbols in the kernel code rather than hand-coded addresses.
52extra-y += vdso-syms.o
53$(obj)/built-in.o: $(obj)/vdso-syms.o
54$(obj)/built-in.o: ld_flags += -R $(obj)/vdso-syms.o
55
56SYSCFLAGS_vdso.so.dbg = -shared -s -Wl,-soname=linux-vdso.so.1 \
57 $(call cc-ldoption, -Wl$(comma)--hash-style=sysv)
58SYSCFLAGS_vdso_syms.o = -r
59$(obj)/vdso-syms.o: $(src)/vdso.lds $(obj)/vrt_sigreturn.o FORCE
60 $(call if_changed,vdsold)
61
62
63# strip rule for the .so file
64$(obj)/%.so: OBJCOPYFLAGS := -S
65$(obj)/%.so: $(obj)/%.so.dbg FORCE
66 $(call if_changed,objcopy)
67
68# actual build commands
69# The DSO images are built using a special linker script
70# Add -lgcc so tilepro gets static muldi3 and lshrdi3 definitions.
71# Make sure only to export the intended __vdso_xxx symbol offsets.
72quiet_cmd_vdsold = VDSOLD $@
73 cmd_vdsold = $(CC) $(KCFLAGS) -nostdlib $(SYSCFLAGS_$(@F)) \
74 -Wl,-T,$(filter-out FORCE,$^) -o $@.tmp -lgcc && \
75 $(CROSS_COMPILE)objcopy \
76 $(patsubst %, -G __vdso_%, $(vdso-syms)) $@.tmp $@
77
78# install commands for the unstripped file
79quiet_cmd_vdso_install = INSTALL $@
80 cmd_vdso_install = cp $(obj)/$@.dbg $(MODLIB)/vdso/$@
81
82vdso.so: $(obj)/vdso.so.dbg
83 @mkdir -p $(MODLIB)/vdso
84 $(call cmd,vdso_install)
85
86vdso32.so: $(obj)/vdso32.so.dbg
87 $(call cmd,vdso_install)
88
89vdso_install: vdso.so
90vdso32_install: vdso32.so
91
92
93KBUILD_AFLAGS_32 := $(filter-out -m64,$(KBUILD_AFLAGS))
94KBUILD_AFLAGS_32 += -m32 -s
95KBUILD_CFLAGS_32 := $(filter-out -m64,$(KBUILD_CFLAGS))
96KBUILD_CFLAGS_32 += -m32 -fPIC -shared
97
98obj-vdso32 = $(patsubst %, v%32.o, $(vdso-syms))
99obj-vdso32 := $(addprefix $(obj)/, $(obj-vdso32))
100
101targets += $(obj-vdso32) vdso32.so vdso32.so.dbg
102
103$(obj-vdso32:%=%): KBUILD_AFLAGS = $(KBUILD_AFLAGS_32)
104$(obj-vdso32:%=%): KBUILD_CFLAGS = $(KBUILD_CFLAGS_32)
105
106$(obj)/vgettimeofday32.o: $(obj)/vgettimeofday.c
107 $(call if_changed,cc_o_c)
108
109$(obj)/vrt_sigreturn32.o: $(obj)/vrt_sigreturn.S
110 $(call if_changed,as_o_S)
111
112# Force dependency
113$(obj)/vdso32.o: $(obj)/vdso32.so
114
115SYSCFLAGS_vdso32.so.dbg = -m32 -shared -s -Wl,-soname=linux-vdso32.so.1 \
116 $(call cc-ldoption, -Wl$(comma)--hash-style=sysv)
117$(obj)/vdso32.so.dbg: $(src)/vdso.lds $(obj-vdso32)
118 $(call if_changed,vdsold)
diff --git a/arch/tile/kernel/vdso/vdso.S b/arch/tile/kernel/vdso/vdso.S
new file mode 100644
index 000000000000..3467adb41630
--- /dev/null
+++ b/arch/tile/kernel/vdso/vdso.S
@@ -0,0 +1,28 @@
1/*
2 * Copyright 2012 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#include <linux/init.h>
16#include <linux/linkage.h>
17#include <asm/page.h>
18
19 __PAGE_ALIGNED_DATA
20
21 .global vdso_start, vdso_end
22 .align PAGE_SIZE
23vdso_start:
24 .incbin "arch/tile/kernel/vdso/vdso.so"
25 .align PAGE_SIZE
26vdso_end:
27
28 .previous
diff --git a/arch/tile/kernel/vdso/vdso.lds.S b/arch/tile/kernel/vdso/vdso.lds.S
new file mode 100644
index 000000000000..041cd6c39c83
--- /dev/null
+++ b/arch/tile/kernel/vdso/vdso.lds.S
@@ -0,0 +1,87 @@
1/*
2 * Copyright 2012 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#define VDSO_VERSION_STRING LINUX_2.6
16
17
18OUTPUT_ARCH(tile)
19
20/* The ELF entry point can be used to set the AT_SYSINFO value. */
21ENTRY(__vdso_rt_sigreturn);
22
23
24SECTIONS
25{
26 . = SIZEOF_HEADERS;
27
28 .hash : { *(.hash) } :text
29 .gnu.hash : { *(.gnu.hash) }
30 .dynsym : { *(.dynsym) }
31 .dynstr : { *(.dynstr) }
32 .gnu.version : { *(.gnu.version) }
33 .gnu.version_d : { *(.gnu.version_d) }
34 .gnu.version_r : { *(.gnu.version_r) }
35
36 .note : { *(.note.*) } :text :note
37 .dynamic : { *(.dynamic) } :text :dynamic
38
39 .eh_frame_hdr : { *(.eh_frame_hdr) } :text :eh_frame_hdr
40 .eh_frame : { KEEP (*(.eh_frame)) } :text
41
42 .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
43
44 /*
45 * This linker script is used both with -r and with -shared.
46 * For the layouts to match, we need to skip more than enough
47 * space for the dynamic symbol table et al. If this amount
48 * is insufficient, ld -shared will barf. Just increase it here.
49 */
50 . = 0x1000;
51 .text : { *(.text .text.*) } :text
52
53 .data : {
54 *(.got.plt) *(.got)
55 *(.data .data.* .gnu.linkonce.d.*)
56 *(.dynbss)
57 *(.bss .bss.* .gnu.linkonce.b.*)
58 }
59}
60
61
62/*
63 * We must supply the ELF program headers explicitly to get just one
64 * PT_LOAD segment, and set the flags explicitly to make segments read-only.
65 */
66PHDRS
67{
68 text PT_LOAD FLAGS(5) FILEHDR PHDRS; /* PF_R|PF_X */
69 dynamic PT_DYNAMIC FLAGS(4); /* PF_R */
70 note PT_NOTE FLAGS(4); /* PF_R */
71 eh_frame_hdr PT_GNU_EH_FRAME;
72}
73
74
75/*
76 * This controls what userland symbols we export from the vDSO.
77 */
78VERSION
79{
80 VDSO_VERSION_STRING {
81 global:
82 __vdso_rt_sigreturn;
83 __vdso_gettimeofday;
84 gettimeofday;
85 local:*;
86 };
87}
diff --git a/arch/tile/kernel/vdso/vdso32.S b/arch/tile/kernel/vdso/vdso32.S
new file mode 100644
index 000000000000..1d1ac3257e11
--- /dev/null
+++ b/arch/tile/kernel/vdso/vdso32.S
@@ -0,0 +1,28 @@
1/*
2 * Copyright 2013 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#include <linux/init.h>
16#include <linux/linkage.h>
17#include <asm/page.h>
18
19 __PAGE_ALIGNED_DATA
20
21 .global vdso32_start, vdso32_end
22 .align PAGE_SIZE
23vdso32_start:
24 .incbin "arch/tile/kernel/vdso/vdso32.so"
25 .align PAGE_SIZE
26vdso32_end:
27
28 .previous
diff --git a/arch/tile/kernel/vdso/vgettimeofday.c b/arch/tile/kernel/vdso/vgettimeofday.c
new file mode 100644
index 000000000000..51ec8e46f5f9
--- /dev/null
+++ b/arch/tile/kernel/vdso/vgettimeofday.c
@@ -0,0 +1,107 @@
1/*
2 * Copyright 2012 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#define VDSO_BUILD /* avoid some shift warnings for -m32 in <asm/page.h> */
16#include <linux/time.h>
17#include <asm/timex.h>
18#include <asm/vdso.h>
19
20#if CHIP_HAS_SPLIT_CYCLE()
21static inline cycles_t get_cycles_inline(void)
22{
23 unsigned int high = __insn_mfspr(SPR_CYCLE_HIGH);
24 unsigned int low = __insn_mfspr(SPR_CYCLE_LOW);
25 unsigned int high2 = __insn_mfspr(SPR_CYCLE_HIGH);
26
27 while (unlikely(high != high2)) {
28 low = __insn_mfspr(SPR_CYCLE_LOW);
29 high = high2;
30 high2 = __insn_mfspr(SPR_CYCLE_HIGH);
31 }
32
33 return (((cycles_t)high) << 32) | low;
34}
35#define get_cycles get_cycles_inline
36#endif
37
38/*
39 * Find out the vDSO data page address in the process address space.
40 */
41inline unsigned long get_datapage(void)
42{
43 unsigned long ret;
44
45 /* vdso data page located in the 2nd vDSO page. */
46 asm volatile ("lnk %0" : "=r"(ret));
47 ret &= ~(PAGE_SIZE - 1);
48 ret += PAGE_SIZE;
49
50 return ret;
51}
52
53int __vdso_gettimeofday(struct timeval *tv, struct timezone *tz)
54{
55 cycles_t cycles;
56 unsigned long count, sec, ns;
57 volatile struct vdso_data *vdso_data;
58
59 vdso_data = (struct vdso_data *)get_datapage();
60 /* The use of the timezone is obsolete, normally tz is NULL. */
61 if (unlikely(tz != NULL)) {
62 while (1) {
63 /* Spin until the update finish. */
64 count = vdso_data->tz_update_count;
65 if (count & 1)
66 continue;
67
68 tz->tz_minuteswest = vdso_data->tz_minuteswest;
69 tz->tz_dsttime = vdso_data->tz_dsttime;
70
71 /* Check whether updated, read again if so. */
72 if (count == vdso_data->tz_update_count)
73 break;
74 }
75 }
76
77 if (unlikely(tv == NULL))
78 return 0;
79
80 while (1) {
81 /* Spin until the update finish. */
82 count = vdso_data->tb_update_count;
83 if (count & 1)
84 continue;
85
86 cycles = (get_cycles() - vdso_data->xtime_tod_stamp);
87 ns = (cycles * vdso_data->mult) >> vdso_data->shift;
88 sec = vdso_data->xtime_clock_sec;
89 ns += vdso_data->xtime_clock_nsec;
90 if (ns >= NSEC_PER_SEC) {
91 ns -= NSEC_PER_SEC;
92 sec += 1;
93 }
94
95 /* Check whether updated, read again if so. */
96 if (count == vdso_data->tb_update_count)
97 break;
98 }
99
100 tv->tv_sec = sec;
101 tv->tv_usec = ns / 1000;
102
103 return 0;
104}
105
106int gettimeofday(struct timeval *tv, struct timezone *tz)
107 __attribute__((weak, alias("__vdso_gettimeofday")));
diff --git a/arch/tile/kernel/vdso/vrt_sigreturn.S b/arch/tile/kernel/vdso/vrt_sigreturn.S
new file mode 100644
index 000000000000..6326caf4a039
--- /dev/null
+++ b/arch/tile/kernel/vdso/vrt_sigreturn.S
@@ -0,0 +1,30 @@
1/*
2 * Copyright 2012 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#include <linux/linkage.h>
16#include <arch/abi.h>
17#include <asm/unistd.h>
18
19/*
20 * Note that libc has a copy of this function that it uses to compare
21 * against the PC when a stack backtrace ends, so if this code is
22 * changed, the libc implementation(s) should also be updated.
23 */
24ENTRY(__vdso_rt_sigreturn)
25 moveli TREG_SYSCALL_NR_NAME, __NR_rt_sigreturn
26 swint1
27 /* We don't use ENDPROC to avoid tagging this symbol as FUNC,
28 * which confuses the perf tool.
29 */
30 END(__vdso_rt_sigreturn)
diff --git a/arch/tile/kernel/vmlinux.lds.S b/arch/tile/kernel/vmlinux.lds.S
index a13ed902afbb..f1819423ffc9 100644
--- a/arch/tile/kernel/vmlinux.lds.S
+++ b/arch/tile/kernel/vmlinux.lds.S
@@ -5,7 +5,7 @@
5#include <hv/hypervisor.h> 5#include <hv/hypervisor.h>
6 6
7/* Text loads starting from the supervisor interrupt vector address. */ 7/* Text loads starting from the supervisor interrupt vector address. */
8#define TEXT_OFFSET MEM_SV_INTRPT 8#define TEXT_OFFSET MEM_SV_START
9 9
10OUTPUT_ARCH(tile) 10OUTPUT_ARCH(tile)
11ENTRY(_start) 11ENTRY(_start)
@@ -13,7 +13,7 @@ jiffies = jiffies_64;
13 13
14PHDRS 14PHDRS
15{ 15{
16 intrpt1 PT_LOAD ; 16 intrpt PT_LOAD ;
17 text PT_LOAD ; 17 text PT_LOAD ;
18 data PT_LOAD ; 18 data PT_LOAD ;
19} 19}
@@ -24,14 +24,17 @@ SECTIONS
24 #define LOAD_OFFSET TEXT_OFFSET 24 #define LOAD_OFFSET TEXT_OFFSET
25 25
26 /* Interrupt vectors */ 26 /* Interrupt vectors */
27 .intrpt1 (LOAD_OFFSET) : AT ( 0 ) /* put at the start of physical memory */ 27 .intrpt (LOAD_OFFSET) : AT ( 0 ) /* put at the start of physical memory */
28 { 28 {
29 _text = .; 29 _text = .;
30 *(.intrpt1) 30 *(.intrpt)
31 } :intrpt1 =0 31 } :intrpt =0
32 32
33 /* Hypervisor call vectors */ 33 /* Hypervisor call vectors */
34 #include "hvglue.lds" 34 . = ALIGN(0x10000);
35 .hvglue : AT (ADDR(.hvglue) - LOAD_OFFSET) {
36 *(.hvglue)
37 } :NONE
35 38
36 /* Now the real code */ 39 /* Now the real code */
37 . = ALIGN(0x20000); 40 . = ALIGN(0x20000);
@@ -40,7 +43,11 @@ SECTIONS
40 HEAD_TEXT 43 HEAD_TEXT
41 SCHED_TEXT 44 SCHED_TEXT
42 LOCK_TEXT 45 LOCK_TEXT
46 KPROBES_TEXT
47 IRQENTRY_TEXT
43 __fix_text_end = .; /* tile-cpack won't rearrange before this */ 48 __fix_text_end = .; /* tile-cpack won't rearrange before this */
49 ALIGN_FUNCTION();
50 *(.hottext*)
44 TEXT_TEXT 51 TEXT_TEXT
45 *(.text.*) 52 *(.text.*)
46 *(.coldtext*) 53 *(.coldtext*)
@@ -67,20 +74,8 @@ SECTIONS
67 __init_end = .; 74 __init_end = .;
68 75
69 _sdata = .; /* Start of data section */ 76 _sdata = .; /* Start of data section */
70
71 RO_DATA_SECTION(PAGE_SIZE) 77 RO_DATA_SECTION(PAGE_SIZE)
72
73 /* initially writeable, then read-only */
74 . = ALIGN(PAGE_SIZE);
75 __w1data_begin = .;
76 .w1data : AT(ADDR(.w1data) - LOAD_OFFSET) {
77 VMLINUX_SYMBOL(__w1data_begin) = .;
78 *(.w1data)
79 VMLINUX_SYMBOL(__w1data_end) = .;
80 }
81
82 RW_DATA_SECTION(L2_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE) 78 RW_DATA_SECTION(L2_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE)
83
84 _edata = .; 79 _edata = .;
85 80
86 EXCEPTION_TABLE(L2_CACHE_BYTES) 81 EXCEPTION_TABLE(L2_CACHE_BYTES)
diff --git a/arch/tile/lib/Makefile b/arch/tile/lib/Makefile
index 985f59858234..c4211cbb2021 100644
--- a/arch/tile/lib/Makefile
+++ b/arch/tile/lib/Makefile
@@ -4,15 +4,15 @@
4 4
5lib-y = cacheflush.o checksum.o cpumask.o delay.o uaccess.o \ 5lib-y = cacheflush.o checksum.o cpumask.o delay.o uaccess.o \
6 memmove.o memcpy_$(BITS).o memchr_$(BITS).o memset_$(BITS).o \ 6 memmove.o memcpy_$(BITS).o memchr_$(BITS).o memset_$(BITS).o \
7 strchr_$(BITS).o strlen_$(BITS).o 7 strchr_$(BITS).o strlen_$(BITS).o strnlen_$(BITS).o
8
9ifeq ($(CONFIG_TILEGX),y)
10CFLAGS_REMOVE_memcpy_user_64.o = -fno-omit-frame-pointer
11lib-y += memcpy_user_64.o
12else
13lib-y += atomic_32.o atomic_asm_32.o memcpy_tile64.o
14endif
15 8
9lib-$(CONFIG_TILEGX) += memcpy_user_64.o
10lib-$(CONFIG_TILEPRO) += atomic_32.o atomic_asm_32.o
16lib-$(CONFIG_SMP) += spinlock_$(BITS).o usercopy_$(BITS).o 11lib-$(CONFIG_SMP) += spinlock_$(BITS).o usercopy_$(BITS).o
17 12
18obj-$(CONFIG_MODULES) += exports.o 13obj-$(CONFIG_MODULES) += exports.o
14
15# The finv_buffer_remote() and copy_{to,from}_user() routines can't
16# have -pg added, since they both rely on being leaf functions.
17CFLAGS_REMOVE_cacheflush.o = -pg
18CFLAGS_REMOVE_memcpy_user_64.o = -pg
diff --git a/arch/tile/lib/atomic_32.c b/arch/tile/lib/atomic_32.c
index f5cada70c3c8..759efa337be8 100644
--- a/arch/tile/lib/atomic_32.c
+++ b/arch/tile/lib/atomic_32.c
@@ -20,50 +20,12 @@
20#include <linux/atomic.h> 20#include <linux/atomic.h>
21#include <arch/chip.h> 21#include <arch/chip.h>
22 22
23/* See <asm/atomic_32.h> */
24#if ATOMIC_LOCKS_FOUND_VIA_TABLE()
25
26/*
27 * A block of memory containing locks for atomic ops. Each instance of this
28 * struct will be homed on a different CPU.
29 */
30struct atomic_locks_on_cpu {
31 int lock[ATOMIC_HASH_L2_SIZE];
32} __attribute__((aligned(ATOMIC_HASH_L2_SIZE * 4)));
33
34static DEFINE_PER_CPU(struct atomic_locks_on_cpu, atomic_lock_pool);
35
36/* The locks we'll use until __init_atomic_per_cpu is called. */
37static struct atomic_locks_on_cpu __initdata initial_atomic_locks;
38
39/* Hash into this vector to get a pointer to lock for the given atomic. */
40struct atomic_locks_on_cpu *atomic_lock_ptr[ATOMIC_HASH_L1_SIZE]
41 __write_once = {
42 [0 ... ATOMIC_HASH_L1_SIZE-1] (&initial_atomic_locks)
43};
44
45#else /* ATOMIC_LOCKS_FOUND_VIA_TABLE() */
46
47/* This page is remapped on startup to be hash-for-home. */ 23/* This page is remapped on startup to be hash-for-home. */
48int atomic_locks[PAGE_SIZE / sizeof(int)] __page_aligned_bss; 24int atomic_locks[PAGE_SIZE / sizeof(int)] __page_aligned_bss;
49 25
50#endif /* ATOMIC_LOCKS_FOUND_VIA_TABLE() */
51
52int *__atomic_hashed_lock(volatile void *v) 26int *__atomic_hashed_lock(volatile void *v)
53{ 27{
54 /* NOTE: this code must match "sys_cmpxchg" in kernel/intvec_32.S */ 28 /* NOTE: this code must match "sys_cmpxchg" in kernel/intvec_32.S */
55#if ATOMIC_LOCKS_FOUND_VIA_TABLE()
56 unsigned long i =
57 (unsigned long) v & ((PAGE_SIZE-1) & -sizeof(long long));
58 unsigned long n = __insn_crc32_32(0, i);
59
60 /* Grab high bits for L1 index. */
61 unsigned long l1_index = n >> ((sizeof(n) * 8) - ATOMIC_HASH_L1_SHIFT);
62 /* Grab low bits for L2 index. */
63 unsigned long l2_index = n & (ATOMIC_HASH_L2_SIZE - 1);
64
65 return &atomic_lock_ptr[l1_index]->lock[l2_index];
66#else
67 /* 29 /*
68 * Use bits [3, 3 + ATOMIC_HASH_SHIFT) as the lock index. 30 * Use bits [3, 3 + ATOMIC_HASH_SHIFT) as the lock index.
69 * Using mm works here because atomic_locks is page aligned. 31 * Using mm works here because atomic_locks is page aligned.
@@ -72,26 +34,13 @@ int *__atomic_hashed_lock(volatile void *v)
72 (unsigned long)atomic_locks, 34 (unsigned long)atomic_locks,
73 2, (ATOMIC_HASH_SHIFT + 2) - 1); 35 2, (ATOMIC_HASH_SHIFT + 2) - 1);
74 return (int *)ptr; 36 return (int *)ptr;
75#endif
76} 37}
77 38
78#ifdef CONFIG_SMP 39#ifdef CONFIG_SMP
79/* Return whether the passed pointer is a valid atomic lock pointer. */ 40/* Return whether the passed pointer is a valid atomic lock pointer. */
80static int is_atomic_lock(int *p) 41static int is_atomic_lock(int *p)
81{ 42{
82#if ATOMIC_LOCKS_FOUND_VIA_TABLE()
83 int i;
84 for (i = 0; i < ATOMIC_HASH_L1_SIZE; ++i) {
85
86 if (p >= &atomic_lock_ptr[i]->lock[0] &&
87 p < &atomic_lock_ptr[i]->lock[ATOMIC_HASH_L2_SIZE]) {
88 return 1;
89 }
90 }
91 return 0;
92#else
93 return p >= &atomic_locks[0] && p < &atomic_locks[ATOMIC_HASH_SIZE]; 43 return p >= &atomic_locks[0] && p < &atomic_locks[ATOMIC_HASH_SIZE];
94#endif
95} 44}
96 45
97void __atomic_fault_unlock(int *irqlock_word) 46void __atomic_fault_unlock(int *irqlock_word)
@@ -110,33 +59,32 @@ static inline int *__atomic_setup(volatile void *v)
110 return __atomic_hashed_lock(v); 59 return __atomic_hashed_lock(v);
111} 60}
112 61
113int _atomic_xchg(atomic_t *v, int n) 62int _atomic_xchg(int *v, int n)
114{ 63{
115 return __atomic_xchg(&v->counter, __atomic_setup(v), n).val; 64 return __atomic_xchg(v, __atomic_setup(v), n).val;
116} 65}
117EXPORT_SYMBOL(_atomic_xchg); 66EXPORT_SYMBOL(_atomic_xchg);
118 67
119int _atomic_xchg_add(atomic_t *v, int i) 68int _atomic_xchg_add(int *v, int i)
120{ 69{
121 return __atomic_xchg_add(&v->counter, __atomic_setup(v), i).val; 70 return __atomic_xchg_add(v, __atomic_setup(v), i).val;
122} 71}
123EXPORT_SYMBOL(_atomic_xchg_add); 72EXPORT_SYMBOL(_atomic_xchg_add);
124 73
125int _atomic_xchg_add_unless(atomic_t *v, int a, int u) 74int _atomic_xchg_add_unless(int *v, int a, int u)
126{ 75{
127 /* 76 /*
128 * Note: argument order is switched here since it is easier 77 * Note: argument order is switched here since it is easier
129 * to use the first argument consistently as the "old value" 78 * to use the first argument consistently as the "old value"
130 * in the assembly, as is done for _atomic_cmpxchg(). 79 * in the assembly, as is done for _atomic_cmpxchg().
131 */ 80 */
132 return __atomic_xchg_add_unless(&v->counter, __atomic_setup(v), u, a) 81 return __atomic_xchg_add_unless(v, __atomic_setup(v), u, a).val;
133 .val;
134} 82}
135EXPORT_SYMBOL(_atomic_xchg_add_unless); 83EXPORT_SYMBOL(_atomic_xchg_add_unless);
136 84
137int _atomic_cmpxchg(atomic_t *v, int o, int n) 85int _atomic_cmpxchg(int *v, int o, int n)
138{ 86{
139 return __atomic_cmpxchg(&v->counter, __atomic_setup(v), o, n).val; 87 return __atomic_cmpxchg(v, __atomic_setup(v), o, n).val;
140} 88}
141EXPORT_SYMBOL(_atomic_cmpxchg); 89EXPORT_SYMBOL(_atomic_cmpxchg);
142 90
@@ -159,33 +107,32 @@ unsigned long _atomic_xor(volatile unsigned long *p, unsigned long mask)
159EXPORT_SYMBOL(_atomic_xor); 107EXPORT_SYMBOL(_atomic_xor);
160 108
161 109
162u64 _atomic64_xchg(atomic64_t *v, u64 n) 110u64 _atomic64_xchg(u64 *v, u64 n)
163{ 111{
164 return __atomic64_xchg(&v->counter, __atomic_setup(v), n); 112 return __atomic64_xchg(v, __atomic_setup(v), n);
165} 113}
166EXPORT_SYMBOL(_atomic64_xchg); 114EXPORT_SYMBOL(_atomic64_xchg);
167 115
168u64 _atomic64_xchg_add(atomic64_t *v, u64 i) 116u64 _atomic64_xchg_add(u64 *v, u64 i)
169{ 117{
170 return __atomic64_xchg_add(&v->counter, __atomic_setup(v), i); 118 return __atomic64_xchg_add(v, __atomic_setup(v), i);
171} 119}
172EXPORT_SYMBOL(_atomic64_xchg_add); 120EXPORT_SYMBOL(_atomic64_xchg_add);
173 121
174u64 _atomic64_xchg_add_unless(atomic64_t *v, u64 a, u64 u) 122u64 _atomic64_xchg_add_unless(u64 *v, u64 a, u64 u)
175{ 123{
176 /* 124 /*
177 * Note: argument order is switched here since it is easier 125 * Note: argument order is switched here since it is easier
178 * to use the first argument consistently as the "old value" 126 * to use the first argument consistently as the "old value"
179 * in the assembly, as is done for _atomic_cmpxchg(). 127 * in the assembly, as is done for _atomic_cmpxchg().
180 */ 128 */
181 return __atomic64_xchg_add_unless(&v->counter, __atomic_setup(v), 129 return __atomic64_xchg_add_unless(v, __atomic_setup(v), u, a);
182 u, a);
183} 130}
184EXPORT_SYMBOL(_atomic64_xchg_add_unless); 131EXPORT_SYMBOL(_atomic64_xchg_add_unless);
185 132
186u64 _atomic64_cmpxchg(atomic64_t *v, u64 o, u64 n) 133u64 _atomic64_cmpxchg(u64 *v, u64 o, u64 n)
187{ 134{
188 return __atomic64_cmpxchg(&v->counter, __atomic_setup(v), o, n); 135 return __atomic64_cmpxchg(v, __atomic_setup(v), o, n);
189} 136}
190EXPORT_SYMBOL(_atomic64_cmpxchg); 137EXPORT_SYMBOL(_atomic64_cmpxchg);
191 138
@@ -208,54 +155,8 @@ struct __get_user __atomic_bad_address(int __user *addr)
208} 155}
209 156
210 157
211#if CHIP_HAS_CBOX_HOME_MAP()
212static int __init noatomichash(char *str)
213{
214 pr_warning("noatomichash is deprecated.\n");
215 return 1;
216}
217__setup("noatomichash", noatomichash);
218#endif
219
220void __init __init_atomic_per_cpu(void) 158void __init __init_atomic_per_cpu(void)
221{ 159{
222#if ATOMIC_LOCKS_FOUND_VIA_TABLE()
223
224 unsigned int i;
225 int actual_cpu;
226
227 /*
228 * Before this is called from setup, we just have one lock for
229 * all atomic objects/operations. Here we replace the
230 * elements of atomic_lock_ptr so that they point at per_cpu
231 * integers. This seemingly over-complex approach stems from
232 * the fact that DEFINE_PER_CPU defines an entry for each cpu
233 * in the grid, not each cpu from 0..ATOMIC_HASH_SIZE-1. But
234 * for efficient hashing of atomics to their locks we want a
235 * compile time constant power of 2 for the size of this
236 * table, so we use ATOMIC_HASH_SIZE.
237 *
238 * Here we populate atomic_lock_ptr from the per cpu
239 * atomic_lock_pool, interspersing by actual cpu so that
240 * subsequent elements are homed on consecutive cpus.
241 */
242
243 actual_cpu = cpumask_first(cpu_possible_mask);
244
245 for (i = 0; i < ATOMIC_HASH_L1_SIZE; ++i) {
246 /*
247 * Preincrement to slightly bias against using cpu 0,
248 * which has plenty of stuff homed on it already.
249 */
250 actual_cpu = cpumask_next(actual_cpu, cpu_possible_mask);
251 if (actual_cpu >= nr_cpu_ids)
252 actual_cpu = cpumask_first(cpu_possible_mask);
253
254 atomic_lock_ptr[i] = &per_cpu(atomic_lock_pool, actual_cpu);
255 }
256
257#else /* ATOMIC_LOCKS_FOUND_VIA_TABLE() */
258
259 /* Validate power-of-two and "bigger than cpus" assumption */ 160 /* Validate power-of-two and "bigger than cpus" assumption */
260 BUILD_BUG_ON(ATOMIC_HASH_SIZE & (ATOMIC_HASH_SIZE-1)); 161 BUILD_BUG_ON(ATOMIC_HASH_SIZE & (ATOMIC_HASH_SIZE-1));
261 BUG_ON(ATOMIC_HASH_SIZE < nr_cpu_ids); 162 BUG_ON(ATOMIC_HASH_SIZE < nr_cpu_ids);
@@ -279,6 +180,4 @@ void __init __init_atomic_per_cpu(void)
279 * That should not produce more indices than ATOMIC_HASH_SIZE. 180 * That should not produce more indices than ATOMIC_HASH_SIZE.
280 */ 181 */
281 BUILD_BUG_ON((PAGE_SIZE >> 3) > ATOMIC_HASH_SIZE); 182 BUILD_BUG_ON((PAGE_SIZE >> 3) > ATOMIC_HASH_SIZE);
282
283#endif /* ATOMIC_LOCKS_FOUND_VIA_TABLE() */
284} 183}
diff --git a/arch/tile/lib/atomic_asm_32.S b/arch/tile/lib/atomic_asm_32.S
index 30638042691d..6bda3132cd61 100644
--- a/arch/tile/lib/atomic_asm_32.S
+++ b/arch/tile/lib/atomic_asm_32.S
@@ -164,6 +164,7 @@ STD_ENTRY_SECTION(__atomic\name, .text.atomic)
164 STD_ENDPROC(__atomic\name) 164 STD_ENDPROC(__atomic\name)
165 .ifc \bitwidth,32 165 .ifc \bitwidth,32
166 .pushsection __ex_table,"a" 166 .pushsection __ex_table,"a"
167 .align 4
167 .word 1b, __atomic\name 168 .word 1b, __atomic\name
168 .word 2b, __atomic\name 169 .word 2b, __atomic\name
169 .word __atomic\name, __atomic_bad_address 170 .word __atomic\name, __atomic_bad_address
diff --git a/arch/tile/lib/cacheflush.c b/arch/tile/lib/cacheflush.c
index 8f8ad814b139..9c0ec22009a5 100644
--- a/arch/tile/lib/cacheflush.c
+++ b/arch/tile/lib/cacheflush.c
@@ -36,7 +36,8 @@ static inline void force_load(char *p)
36 * core (if "!hfh") or homed via hash-for-home (if "hfh"), waiting 36 * core (if "!hfh") or homed via hash-for-home (if "hfh"), waiting
37 * until the memory controller holds the flushed values. 37 * until the memory controller holds the flushed values.
38 */ 38 */
39void finv_buffer_remote(void *buffer, size_t size, int hfh) 39void __attribute__((optimize("omit-frame-pointer")))
40finv_buffer_remote(void *buffer, size_t size, int hfh)
40{ 41{
41 char *p, *base; 42 char *p, *base;
42 size_t step_size, load_count; 43 size_t step_size, load_count;
@@ -147,18 +148,21 @@ void finv_buffer_remote(void *buffer, size_t size, int hfh)
147 force_load(p); 148 force_load(p);
148 149
149 /* 150 /*
150 * Repeat, but with inv's instead of loads, to get rid of the 151 * Repeat, but with finv's instead of loads, to get rid of the
151 * data we just loaded into our own cache and the old home L3. 152 * data we just loaded into our own cache and the old home L3.
152 * No need to unroll since inv's don't target a register. 153 * No need to unroll since finv's don't target a register.
154 * The finv's are guaranteed not to actually flush the data in
155 * the buffer back to their home, since we just read it, so the
156 * lines are clean in cache; we will only invalidate those lines.
153 */ 157 */
154 p = (char *)buffer + size - 1; 158 p = (char *)buffer + size - 1;
155 __insn_inv(p); 159 __insn_finv(p);
156 p -= step_size; 160 p -= step_size;
157 p = (char *)((unsigned long)p | (step_size - 1)); 161 p = (char *)((unsigned long)p | (step_size - 1));
158 for (; p >= base; p -= step_size) 162 for (; p >= base; p -= step_size)
159 __insn_inv(p); 163 __insn_finv(p);
160 164
161 /* Wait for the load+inv's (and thus finvs) to have completed. */ 165 /* Wait for these finv's (and thus the first finvs) to be done. */
162 __insn_mf(); 166 __insn_mf();
163 167
164#ifdef __tilegx__ 168#ifdef __tilegx__
diff --git a/arch/tile/lib/exports.c b/arch/tile/lib/exports.c
index a93b02a25222..82733c87d67e 100644
--- a/arch/tile/lib/exports.c
+++ b/arch/tile/lib/exports.c
@@ -22,7 +22,6 @@ EXPORT_SYMBOL(strnlen_user_asm);
22EXPORT_SYMBOL(strncpy_from_user_asm); 22EXPORT_SYMBOL(strncpy_from_user_asm);
23EXPORT_SYMBOL(clear_user_asm); 23EXPORT_SYMBOL(clear_user_asm);
24EXPORT_SYMBOL(flush_user_asm); 24EXPORT_SYMBOL(flush_user_asm);
25EXPORT_SYMBOL(inv_user_asm);
26EXPORT_SYMBOL(finv_user_asm); 25EXPORT_SYMBOL(finv_user_asm);
27 26
28/* arch/tile/kernel/entry.S */ 27/* arch/tile/kernel/entry.S */
@@ -34,6 +33,12 @@ EXPORT_SYMBOL(dump_stack);
34/* arch/tile/kernel/head.S */ 33/* arch/tile/kernel/head.S */
35EXPORT_SYMBOL(empty_zero_page); 34EXPORT_SYMBOL(empty_zero_page);
36 35
36#ifdef CONFIG_FUNCTION_TRACER
37/* arch/tile/kernel/mcount_64.S */
38#include <asm/ftrace.h>
39EXPORT_SYMBOL(__mcount);
40#endif /* CONFIG_FUNCTION_TRACER */
41
37/* arch/tile/lib/, various memcpy files */ 42/* arch/tile/lib/, various memcpy files */
38EXPORT_SYMBOL(memcpy); 43EXPORT_SYMBOL(memcpy);
39EXPORT_SYMBOL(__copy_to_user_inatomic); 44EXPORT_SYMBOL(__copy_to_user_inatomic);
diff --git a/arch/tile/lib/memchr_64.c b/arch/tile/lib/memchr_64.c
index 6f867dbf7c56..f8196b3a950e 100644
--- a/arch/tile/lib/memchr_64.c
+++ b/arch/tile/lib/memchr_64.c
@@ -36,7 +36,7 @@ void *memchr(const void *s, int c, size_t n)
36 p = (const uint64_t *)(s_int & -8); 36 p = (const uint64_t *)(s_int & -8);
37 37
38 /* Create eight copies of the byte for which we are looking. */ 38 /* Create eight copies of the byte for which we are looking. */
39 goal = 0x0101010101010101ULL * (uint8_t) c; 39 goal = copy_byte(c);
40 40
41 /* Read the first word, but munge it so that bytes before the array 41 /* Read the first word, but munge it so that bytes before the array
42 * will not match goal. 42 * will not match goal.
diff --git a/arch/tile/lib/memcpy_32.S b/arch/tile/lib/memcpy_32.S
index 2a419a6122db..a2771ae5da53 100644
--- a/arch/tile/lib/memcpy_32.S
+++ b/arch/tile/lib/memcpy_32.S
@@ -22,14 +22,6 @@
22 22
23#include <linux/linkage.h> 23#include <linux/linkage.h>
24 24
25/* On TILE64, we wrap these functions via arch/tile/lib/memcpy_tile64.c */
26#if !CHIP_HAS_COHERENT_LOCAL_CACHE()
27#define memcpy __memcpy_asm
28#define __copy_to_user_inatomic __copy_to_user_inatomic_asm
29#define __copy_from_user_inatomic __copy_from_user_inatomic_asm
30#define __copy_from_user_zeroing __copy_from_user_zeroing_asm
31#endif
32
33#define IS_MEMCPY 0 25#define IS_MEMCPY 0
34#define IS_COPY_FROM_USER 1 26#define IS_COPY_FROM_USER 1
35#define IS_COPY_FROM_USER_ZEROING 2 27#define IS_COPY_FROM_USER_ZEROING 2
@@ -44,6 +36,7 @@
44 */ 36 */
45#define EX \ 37#define EX \
46 .pushsection __ex_table, "a"; \ 38 .pushsection __ex_table, "a"; \
39 .align 4; \
47 .word 9f, memcpy_common_fixup; \ 40 .word 9f, memcpy_common_fixup; \
48 .popsection; \ 41 .popsection; \
49 9 42 9
@@ -158,12 +151,9 @@ EX: { sw r0, r3; addi r0, r0, 4; addi r2, r2, -4 }
158 151
159 { addi r3, r1, 60; andi r9, r9, -64 } 152 { addi r3, r1, 60; andi r9, r9, -64 }
160 153
161#if CHIP_HAS_WH64()
162 /* No need to prefetch dst, we'll just do the wh64 154 /* No need to prefetch dst, we'll just do the wh64
163 * right before we copy a line. 155 * right before we copy a line.
164 */ 156 */
165#endif
166
167EX: { lw r5, r3; addi r3, r3, 64; movei r4, 1 } 157EX: { lw r5, r3; addi r3, r3, 64; movei r4, 1 }
168 /* Intentionally stall for a few cycles to leave L2 cache alone. */ 158 /* Intentionally stall for a few cycles to leave L2 cache alone. */
169 { bnzt zero, .; move r27, lr } 159 { bnzt zero, .; move r27, lr }
@@ -171,21 +161,6 @@ EX: { lw r6, r3; addi r3, r3, 64 }
171 /* Intentionally stall for a few cycles to leave L2 cache alone. */ 161 /* Intentionally stall for a few cycles to leave L2 cache alone. */
172 { bnzt zero, . } 162 { bnzt zero, . }
173EX: { lw r7, r3; addi r3, r3, 64 } 163EX: { lw r7, r3; addi r3, r3, 64 }
174#if !CHIP_HAS_WH64()
175 /* Prefetch the dest */
176 /* Intentionally stall for a few cycles to leave L2 cache alone. */
177 { bnzt zero, . }
178 /* Use a real load to cause a TLB miss if necessary. We aren't using
179 * r28, so this should be fine.
180 */
181EX: { lw r28, r9; addi r9, r9, 64 }
182 /* Intentionally stall for a few cycles to leave L2 cache alone. */
183 { bnzt zero, . }
184 { prefetch r9; addi r9, r9, 64 }
185 /* Intentionally stall for a few cycles to leave L2 cache alone. */
186 { bnzt zero, . }
187 { prefetch r9; addi r9, r9, 64 }
188#endif
189 /* Intentionally stall for a few cycles to leave L2 cache alone. */ 164 /* Intentionally stall for a few cycles to leave L2 cache alone. */
190 { bz zero, .Lbig_loop2 } 165 { bz zero, .Lbig_loop2 }
191 166
@@ -286,13 +261,8 @@ EX: { lw r7, r3; addi r3, r3, 64 }
286 /* Fill second L1D line. */ 261 /* Fill second L1D line. */
287EX: { lw r17, r17; addi r1, r1, 48; mvz r3, r13, r1 } /* r17 = WORD_4 */ 262EX: { lw r17, r17; addi r1, r1, 48; mvz r3, r13, r1 } /* r17 = WORD_4 */
288 263
289#if CHIP_HAS_WH64()
290 /* Prepare destination line for writing. */ 264 /* Prepare destination line for writing. */
291EX: { wh64 r9; addi r9, r9, 64 } 265EX: { wh64 r9; addi r9, r9, 64 }
292#else
293 /* Prefetch dest line */
294 { prefetch r9; addi r9, r9, 64 }
295#endif
296 /* Load seven words that are L1D hits to cover wh64 L2 usage. */ 266 /* Load seven words that are L1D hits to cover wh64 L2 usage. */
297 267
298 /* Load the three remaining words from the last L1D line, which 268 /* Load the three remaining words from the last L1D line, which
@@ -330,16 +300,7 @@ EX: { lw r18, r1; addi r1, r1, 4 } /* r18 = WORD_8 */
330EX: { sw r0, r16; addi r0, r0, 4; add r16, r0, r2 } /* store(WORD_0) */ 300EX: { sw r0, r16; addi r0, r0, 4; add r16, r0, r2 } /* store(WORD_0) */
331EX: { sw r0, r13; addi r0, r0, 4; andi r16, r16, -64 } /* store(WORD_1) */ 301EX: { sw r0, r13; addi r0, r0, 4; andi r16, r16, -64 } /* store(WORD_1) */
332EX: { sw r0, r14; addi r0, r0, 4; slt_u r16, r9, r16 } /* store(WORD_2) */ 302EX: { sw r0, r14; addi r0, r0, 4; slt_u r16, r9, r16 } /* store(WORD_2) */
333#if CHIP_HAS_WH64()
334EX: { sw r0, r15; addi r0, r0, 4; addi r13, sp, -64 } /* store(WORD_3) */ 303EX: { sw r0, r15; addi r0, r0, 4; addi r13, sp, -64 } /* store(WORD_3) */
335#else
336 /* Back up the r9 to a cache line we are already storing to
337 * if it gets past the end of the dest vector. Strictly speaking,
338 * we don't need to back up to the start of a cache line, but it's free
339 * and tidy, so why not?
340 */
341EX: { sw r0, r15; addi r0, r0, 4; andi r13, r0, -64 } /* store(WORD_3) */
342#endif
343 /* Store second L1D line. */ 304 /* Store second L1D line. */
344EX: { sw r0, r17; addi r0, r0, 4; mvz r9, r16, r13 }/* store(WORD_4) */ 305EX: { sw r0, r17; addi r0, r0, 4; mvz r9, r16, r13 }/* store(WORD_4) */
345EX: { sw r0, r19; addi r0, r0, 4 } /* store(WORD_5) */ 306EX: { sw r0, r19; addi r0, r0, 4 } /* store(WORD_5) */
@@ -403,7 +364,6 @@ EX: { sb r0, r3; addi r0, r0, 1; addi r2, r2, -1 }
403 364
404.Ldest_is_word_aligned: 365.Ldest_is_word_aligned:
405 366
406#if CHIP_HAS_DWORD_ALIGN()
407EX: { andi r8, r0, 63; lwadd_na r6, r1, 4} 367EX: { andi r8, r0, 63; lwadd_na r6, r1, 4}
408 { slti_u r9, r2, 64; bz r8, .Ldest_is_L2_line_aligned } 368 { slti_u r9, r2, 64; bz r8, .Ldest_is_L2_line_aligned }
409 369
@@ -511,26 +471,6 @@ EX: { swadd r0, r13, 4; addi r2, r2, -32 }
511 /* Move r1 back to the point where it corresponds to r0. */ 471 /* Move r1 back to the point where it corresponds to r0. */
512 { addi r1, r1, -4 } 472 { addi r1, r1, -4 }
513 473
514#else /* !CHIP_HAS_DWORD_ALIGN() */
515
516 /* Compute right/left shift counts and load initial source words. */
517 { andi r5, r1, -4; andi r3, r1, 3 }
518EX: { lw r6, r5; addi r5, r5, 4; shli r3, r3, 3 }
519EX: { lw r7, r5; addi r5, r5, 4; sub r4, zero, r3 }
520
521 /* Load and store one word at a time, using shifts and ORs
522 * to correct for the misaligned src.
523 */
524.Lcopy_unaligned_src_loop:
525 { shr r6, r6, r3; shl r8, r7, r4 }
526EX: { lw r7, r5; or r8, r8, r6; move r6, r7 }
527EX: { sw r0, r8; addi r0, r0, 4; addi r2, r2, -4 }
528 { addi r5, r5, 4; slti_u r8, r2, 8 }
529 { bzt r8, .Lcopy_unaligned_src_loop; addi r1, r1, 4 }
530
531 { bz r2, .Lcopy_unaligned_done }
532#endif /* !CHIP_HAS_DWORD_ALIGN() */
533
534 /* Fall through */ 474 /* Fall through */
535 475
536/* 476/*
@@ -614,5 +554,6 @@ memcpy_fixup_loop:
614 .size memcpy_common_fixup, . - memcpy_common_fixup 554 .size memcpy_common_fixup, . - memcpy_common_fixup
615 555
616 .section __ex_table,"a" 556 .section __ex_table,"a"
557 .align 4
617 .word .Lcfu, .Lcopy_from_user_fixup_zero_remainder 558 .word .Lcfu, .Lcopy_from_user_fixup_zero_remainder
618 .word .Lctu, .Lcopy_to_user_fixup_done 559 .word .Lctu, .Lcopy_to_user_fixup_done
diff --git a/arch/tile/lib/memcpy_64.c b/arch/tile/lib/memcpy_64.c
index c79b8e7c6828..4815354b8cd2 100644
--- a/arch/tile/lib/memcpy_64.c
+++ b/arch/tile/lib/memcpy_64.c
@@ -18,14 +18,17 @@
18/* EXPORT_SYMBOL() is in arch/tile/lib/exports.c since this should be asm. */ 18/* EXPORT_SYMBOL() is in arch/tile/lib/exports.c since this should be asm. */
19 19
20/* Must be 8 bytes in size. */ 20/* Must be 8 bytes in size. */
21#define word_t uint64_t 21#define op_t uint64_t
22 22
23#if CHIP_L2_LINE_SIZE() != 64 && CHIP_L2_LINE_SIZE() != 128 23/* Threshold value for when to enter the unrolled loops. */
24#error "Assumes 64 or 128 byte line size" 24#define OP_T_THRES 16
25
26#if CHIP_L2_LINE_SIZE() != 64
27#error "Assumes 64 byte line size"
25#endif 28#endif
26 29
27/* How many cache lines ahead should we prefetch? */ 30/* How many cache lines ahead should we prefetch? */
28#define PREFETCH_LINES_AHEAD 3 31#define PREFETCH_LINES_AHEAD 4
29 32
30/* 33/*
31 * Provide "base versions" of load and store for the normal code path. 34 * Provide "base versions" of load and store for the normal code path.
@@ -51,15 +54,16 @@ void *memcpy(void *__restrict dstv, const void *__restrict srcv, size_t n)
51 * macros to return a count of uncopied bytes due to mm fault. 54 * macros to return a count of uncopied bytes due to mm fault.
52 */ 55 */
53#define RETVAL 0 56#define RETVAL 0
54int USERCOPY_FUNC(void *__restrict dstv, const void *__restrict srcv, size_t n) 57int __attribute__((optimize("omit-frame-pointer")))
58USERCOPY_FUNC(void *__restrict dstv, const void *__restrict srcv, size_t n)
55#endif 59#endif
56{ 60{
57 char *__restrict dst1 = (char *)dstv; 61 char *__restrict dst1 = (char *)dstv;
58 const char *__restrict src1 = (const char *)srcv; 62 const char *__restrict src1 = (const char *)srcv;
59 const char *__restrict src1_end; 63 const char *__restrict src1_end;
60 const char *__restrict prefetch; 64 const char *__restrict prefetch;
61 word_t *__restrict dst8; /* 8-byte pointer to destination memory. */ 65 op_t *__restrict dst8; /* 8-byte pointer to destination memory. */
62 word_t final; /* Final bytes to write to trailing word, if any */ 66 op_t final; /* Final bytes to write to trailing word, if any */
63 long i; 67 long i;
64 68
65 if (n < 16) { 69 if (n < 16) {
@@ -79,104 +83,228 @@ int USERCOPY_FUNC(void *__restrict dstv, const void *__restrict srcv, size_t n)
79 for (i = 0; i < PREFETCH_LINES_AHEAD; i++) { 83 for (i = 0; i < PREFETCH_LINES_AHEAD; i++) {
80 __insn_prefetch(prefetch); 84 __insn_prefetch(prefetch);
81 prefetch += CHIP_L2_LINE_SIZE(); 85 prefetch += CHIP_L2_LINE_SIZE();
82 prefetch = (prefetch > src1_end) ? prefetch : src1; 86 prefetch = (prefetch < src1_end) ? prefetch : src1;
83 } 87 }
84 88
85 /* Copy bytes until dst is word-aligned. */ 89 /* Copy bytes until dst is word-aligned. */
86 for (; (uintptr_t)dst1 & (sizeof(word_t) - 1); n--) 90 for (; (uintptr_t)dst1 & (sizeof(op_t) - 1); n--)
87 ST1(dst1++, LD1(src1++)); 91 ST1(dst1++, LD1(src1++));
88 92
89 /* 8-byte pointer to destination memory. */ 93 /* 8-byte pointer to destination memory. */
90 dst8 = (word_t *)dst1; 94 dst8 = (op_t *)dst1;
91 95
92 if (__builtin_expect((uintptr_t)src1 & (sizeof(word_t) - 1), 0)) { 96 if (__builtin_expect((uintptr_t)src1 & (sizeof(op_t) - 1), 0)) {
93 /* 97 /* Unaligned copy. */
94 * Misaligned copy. Copy 8 bytes at a time, but don't 98
95 * bother with other fanciness. 99 op_t tmp0 = 0, tmp1 = 0, tmp2, tmp3;
96 * 100 const op_t *src8 = (const op_t *) ((uintptr_t)src1 &
97 * TODO: Consider prefetching and using wh64 as well. 101 -sizeof(op_t));
98 */ 102 const void *srci = (void *)src1;
99 103 int m;
100 /* Create an aligned src8. */ 104
101 const word_t *__restrict src8 = 105 m = (CHIP_L2_LINE_SIZE() << 2) -
102 (const word_t *)((uintptr_t)src1 & -sizeof(word_t)); 106 (((uintptr_t)dst8) & ((CHIP_L2_LINE_SIZE() << 2) - 1));
103 word_t b; 107 m = (n < m) ? n : m;
104 108 m /= sizeof(op_t);
105 word_t a = LD8(src8++); 109
106 for (; n >= sizeof(word_t); n -= sizeof(word_t)) { 110 /* Copy until 'dst' is cache-line-aligned. */
107 b = LD8(src8++); 111 n -= (sizeof(op_t) * m);
108 a = __insn_dblalign(a, b, src1); 112
109 ST8(dst8++, a); 113 switch (m % 4) {
110 a = b; 114 case 0:
115 if (__builtin_expect(!m, 0))
116 goto _M0;
117 tmp1 = LD8(src8++);
118 tmp2 = LD8(src8++);
119 goto _8B3;
120 case 2:
121 m += 2;
122 tmp3 = LD8(src8++);
123 tmp0 = LD8(src8++);
124 goto _8B1;
125 case 3:
126 m += 1;
127 tmp2 = LD8(src8++);
128 tmp3 = LD8(src8++);
129 goto _8B2;
130 case 1:
131 m--;
132 tmp0 = LD8(src8++);
133 tmp1 = LD8(src8++);
134 if (__builtin_expect(!m, 0))
135 goto _8B0;
136 }
137
138 do {
139 tmp2 = LD8(src8++);
140 tmp0 = __insn_dblalign(tmp0, tmp1, srci);
141 ST8(dst8++, tmp0);
142_8B3:
143 tmp3 = LD8(src8++);
144 tmp1 = __insn_dblalign(tmp1, tmp2, srci);
145 ST8(dst8++, tmp1);
146_8B2:
147 tmp0 = LD8(src8++);
148 tmp2 = __insn_dblalign(tmp2, tmp3, srci);
149 ST8(dst8++, tmp2);
150_8B1:
151 tmp1 = LD8(src8++);
152 tmp3 = __insn_dblalign(tmp3, tmp0, srci);
153 ST8(dst8++, tmp3);
154 m -= 4;
155 } while (m);
156
157_8B0:
158 tmp0 = __insn_dblalign(tmp0, tmp1, srci);
159 ST8(dst8++, tmp0);
160 src8--;
161
162_M0:
163 if (__builtin_expect(n >= CHIP_L2_LINE_SIZE(), 0)) {
164 op_t tmp4, tmp5, tmp6, tmp7, tmp8;
165
166 prefetch = ((const char *)src8) +
167 CHIP_L2_LINE_SIZE() * PREFETCH_LINES_AHEAD;
168
169 for (tmp0 = LD8(src8++); n >= CHIP_L2_LINE_SIZE();
170 n -= CHIP_L2_LINE_SIZE()) {
171 /* Prefetch and advance to next line to
172 prefetch, but don't go past the end. */
173 __insn_prefetch(prefetch);
174
175 /* Make sure prefetch got scheduled
176 earlier. */
177 __asm__ ("" : : : "memory");
178
179 prefetch += CHIP_L2_LINE_SIZE();
180 prefetch = (prefetch < src1_end) ? prefetch :
181 (const char *) src8;
182
183 tmp1 = LD8(src8++);
184 tmp2 = LD8(src8++);
185 tmp3 = LD8(src8++);
186 tmp4 = LD8(src8++);
187 tmp5 = LD8(src8++);
188 tmp6 = LD8(src8++);
189 tmp7 = LD8(src8++);
190 tmp8 = LD8(src8++);
191
192 tmp0 = __insn_dblalign(tmp0, tmp1, srci);
193 tmp1 = __insn_dblalign(tmp1, tmp2, srci);
194 tmp2 = __insn_dblalign(tmp2, tmp3, srci);
195 tmp3 = __insn_dblalign(tmp3, tmp4, srci);
196 tmp4 = __insn_dblalign(tmp4, tmp5, srci);
197 tmp5 = __insn_dblalign(tmp5, tmp6, srci);
198 tmp6 = __insn_dblalign(tmp6, tmp7, srci);
199 tmp7 = __insn_dblalign(tmp7, tmp8, srci);
200
201 __insn_wh64(dst8);
202
203 ST8(dst8++, tmp0);
204 ST8(dst8++, tmp1);
205 ST8(dst8++, tmp2);
206 ST8(dst8++, tmp3);
207 ST8(dst8++, tmp4);
208 ST8(dst8++, tmp5);
209 ST8(dst8++, tmp6);
210 ST8(dst8++, tmp7);
211
212 tmp0 = tmp8;
213 }
214 src8--;
215 }
216
217 /* Copy the rest 8-byte chunks. */
218 if (n >= sizeof(op_t)) {
219 tmp0 = LD8(src8++);
220 for (; n >= sizeof(op_t); n -= sizeof(op_t)) {
221 tmp1 = LD8(src8++);
222 tmp0 = __insn_dblalign(tmp0, tmp1, srci);
223 ST8(dst8++, tmp0);
224 tmp0 = tmp1;
225 }
226 src8--;
111 } 227 }
112 228
113 if (n == 0) 229 if (n == 0)
114 return RETVAL; 230 return RETVAL;
115 231
116 b = ((const char *)src8 <= src1_end) ? *src8 : 0; 232 tmp0 = LD8(src8++);
233 tmp1 = ((const char *)src8 <= src1_end)
234 ? LD8((op_t *)src8) : 0;
235 final = __insn_dblalign(tmp0, tmp1, srci);
117 236
118 /*
119 * Final source bytes to write to trailing partial
120 * word, if any.
121 */
122 final = __insn_dblalign(a, b, src1);
123 } else { 237 } else {
124 /* Aligned copy. */ 238 /* Aligned copy. */
125 239
126 const word_t* __restrict src8 = (const word_t *)src1; 240 const op_t *__restrict src8 = (const op_t *)src1;
127 241
128 /* src8 and dst8 are both word-aligned. */ 242 /* src8 and dst8 are both word-aligned. */
129 if (n >= CHIP_L2_LINE_SIZE()) { 243 if (n >= CHIP_L2_LINE_SIZE()) {
130 /* Copy until 'dst' is cache-line-aligned. */ 244 /* Copy until 'dst' is cache-line-aligned. */
131 for (; (uintptr_t)dst8 & (CHIP_L2_LINE_SIZE() - 1); 245 for (; (uintptr_t)dst8 & (CHIP_L2_LINE_SIZE() - 1);
132 n -= sizeof(word_t)) 246 n -= sizeof(op_t))
133 ST8(dst8++, LD8(src8++)); 247 ST8(dst8++, LD8(src8++));
134 248
135 for (; n >= CHIP_L2_LINE_SIZE(); ) { 249 for (; n >= CHIP_L2_LINE_SIZE(); ) {
136 __insn_wh64(dst8); 250 op_t tmp0, tmp1, tmp2, tmp3;
251 op_t tmp4, tmp5, tmp6, tmp7;
137 252
138 /* 253 /*
139 * Prefetch and advance to next line 254 * Prefetch and advance to next line
140 * to prefetch, but don't go past the end 255 * to prefetch, but don't go past the
256 * end.
141 */ 257 */
142 __insn_prefetch(prefetch); 258 __insn_prefetch(prefetch);
259
260 /* Make sure prefetch got scheduled
261 earlier. */
262 __asm__ ("" : : : "memory");
263
143 prefetch += CHIP_L2_LINE_SIZE(); 264 prefetch += CHIP_L2_LINE_SIZE();
144 prefetch = (prefetch > src1_end) ? prefetch : 265 prefetch = (prefetch < src1_end) ? prefetch :
145 (const char *)src8; 266 (const char *)src8;
146 267
147 /* 268 /*
148 * Copy an entire cache line. Manually 269 * Do all the loads before wh64. This
149 * unrolled to avoid idiosyncracies of 270 * is necessary if [src8, src8+7] and
150 * compiler unrolling. 271 * [dst8, dst8+7] share the same cache
272 * line and dst8 <= src8, as can be
273 * the case when called from memmove,
274 * or with code tested on x86 whose
275 * memcpy always works with forward
276 * copies.
151 */ 277 */
152#define COPY_WORD(offset) ({ ST8(dst8+offset, LD8(src8+offset)); n -= 8; }) 278 tmp0 = LD8(src8++);
153 COPY_WORD(0); 279 tmp1 = LD8(src8++);
154 COPY_WORD(1); 280 tmp2 = LD8(src8++);
155 COPY_WORD(2); 281 tmp3 = LD8(src8++);
156 COPY_WORD(3); 282 tmp4 = LD8(src8++);
157 COPY_WORD(4); 283 tmp5 = LD8(src8++);
158 COPY_WORD(5); 284 tmp6 = LD8(src8++);
159 COPY_WORD(6); 285 tmp7 = LD8(src8++);
160 COPY_WORD(7); 286
161#if CHIP_L2_LINE_SIZE() == 128 287 /* wh64 and wait for tmp7 load completion. */
162 COPY_WORD(8); 288 __asm__ ("move %0, %0; wh64 %1\n"
163 COPY_WORD(9); 289 : : "r"(tmp7), "r"(dst8));
164 COPY_WORD(10);
165 COPY_WORD(11);
166 COPY_WORD(12);
167 COPY_WORD(13);
168 COPY_WORD(14);
169 COPY_WORD(15);
170#elif CHIP_L2_LINE_SIZE() != 64
171# error Fix code that assumes particular L2 cache line sizes
172#endif
173 290
174 dst8 += CHIP_L2_LINE_SIZE() / sizeof(word_t); 291 ST8(dst8++, tmp0);
175 src8 += CHIP_L2_LINE_SIZE() / sizeof(word_t); 292 ST8(dst8++, tmp1);
293 ST8(dst8++, tmp2);
294 ST8(dst8++, tmp3);
295 ST8(dst8++, tmp4);
296 ST8(dst8++, tmp5);
297 ST8(dst8++, tmp6);
298 ST8(dst8++, tmp7);
299
300 n -= CHIP_L2_LINE_SIZE();
176 } 301 }
302#if CHIP_L2_LINE_SIZE() != 64
303# error "Fix code that assumes particular L2 cache line size."
304#endif
177 } 305 }
178 306
179 for (; n >= sizeof(word_t); n -= sizeof(word_t)) 307 for (; n >= sizeof(op_t); n -= sizeof(op_t))
180 ST8(dst8++, LD8(src8++)); 308 ST8(dst8++, LD8(src8++));
181 309
182 if (__builtin_expect(n == 0, 1)) 310 if (__builtin_expect(n == 0, 1))
diff --git a/arch/tile/lib/memcpy_tile64.c b/arch/tile/lib/memcpy_tile64.c
deleted file mode 100644
index 3bc4b4e40d93..000000000000
--- a/arch/tile/lib/memcpy_tile64.c
+++ /dev/null
@@ -1,276 +0,0 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#include <linux/string.h>
16#include <linux/smp.h>
17#include <linux/module.h>
18#include <linux/uaccess.h>
19#include <asm/fixmap.h>
20#include <asm/kmap_types.h>
21#include <asm/tlbflush.h>
22#include <hv/hypervisor.h>
23#include <arch/chip.h>
24
25
26#if !CHIP_HAS_COHERENT_LOCAL_CACHE()
27
28/* Defined in memcpy.S */
29extern unsigned long __memcpy_asm(void *to, const void *from, unsigned long n);
30extern unsigned long __copy_to_user_inatomic_asm(
31 void __user *to, const void *from, unsigned long n);
32extern unsigned long __copy_from_user_inatomic_asm(
33 void *to, const void __user *from, unsigned long n);
34extern unsigned long __copy_from_user_zeroing_asm(
35 void *to, const void __user *from, unsigned long n);
36
37typedef unsigned long (*memcpy_t)(void *, const void *, unsigned long);
38
39/* Size above which to consider TLB games for performance */
40#define LARGE_COPY_CUTOFF 2048
41
42/* Communicate to the simulator what we are trying to do. */
43#define sim_allow_multiple_caching(b) \
44 __insn_mtspr(SPR_SIM_CONTROL, \
45 SIM_CONTROL_ALLOW_MULTIPLE_CACHING | ((b) << _SIM_CONTROL_OPERATOR_BITS))
46
47/*
48 * Copy memory by briefly enabling incoherent cacheline-at-a-time mode.
49 *
50 * We set up our own source and destination PTEs that we fully control.
51 * This is the only way to guarantee that we don't race with another
52 * thread that is modifying the PTE; we can't afford to try the
53 * copy_{to,from}_user() technique of catching the interrupt, since
54 * we must run with interrupts disabled to avoid the risk of some
55 * other code seeing the incoherent data in our cache. (Recall that
56 * our cache is indexed by PA, so even if the other code doesn't use
57 * our kmap_atomic virtual addresses, they'll still hit in cache using
58 * the normal VAs that aren't supposed to hit in cache.)
59 */
60static void memcpy_multicache(void *dest, const void *source,
61 pte_t dst_pte, pte_t src_pte, int len)
62{
63 int idx;
64 unsigned long flags, newsrc, newdst;
65 pmd_t *pmdp;
66 pte_t *ptep;
67 int type0, type1;
68 int cpu = get_cpu();
69
70 /*
71 * Disable interrupts so that we don't recurse into memcpy()
72 * in an interrupt handler, nor accidentally reference
73 * the PA of the source from an interrupt routine. Also
74 * notify the simulator that we're playing games so we don't
75 * generate spurious coherency warnings.
76 */
77 local_irq_save(flags);
78 sim_allow_multiple_caching(1);
79
80 /* Set up the new dest mapping */
81 type0 = kmap_atomic_idx_push();
82 idx = FIX_KMAP_BEGIN + (KM_TYPE_NR * cpu) + type0;
83 newdst = __fix_to_virt(idx) + ((unsigned long)dest & (PAGE_SIZE-1));
84 pmdp = pmd_offset(pud_offset(pgd_offset_k(newdst), newdst), newdst);
85 ptep = pte_offset_kernel(pmdp, newdst);
86 if (pte_val(*ptep) != pte_val(dst_pte)) {
87 set_pte(ptep, dst_pte);
88 local_flush_tlb_page(NULL, newdst, PAGE_SIZE);
89 }
90
91 /* Set up the new source mapping */
92 type1 = kmap_atomic_idx_push();
93 idx += (type0 - type1);
94 src_pte = hv_pte_set_nc(src_pte);
95 src_pte = hv_pte_clear_writable(src_pte); /* be paranoid */
96 newsrc = __fix_to_virt(idx) + ((unsigned long)source & (PAGE_SIZE-1));
97 pmdp = pmd_offset(pud_offset(pgd_offset_k(newsrc), newsrc), newsrc);
98 ptep = pte_offset_kernel(pmdp, newsrc);
99 __set_pte(ptep, src_pte); /* set_pte() would be confused by this */
100 local_flush_tlb_page(NULL, newsrc, PAGE_SIZE);
101
102 /* Actually move the data. */
103 __memcpy_asm((void *)newdst, (const void *)newsrc, len);
104
105 /*
106 * Remap the source as locally-cached and not OLOC'ed so that
107 * we can inval without also invaling the remote cpu's cache.
108 * This also avoids known errata with inv'ing cacheable oloc data.
109 */
110 src_pte = hv_pte_set_mode(src_pte, HV_PTE_MODE_CACHE_NO_L3);
111 src_pte = hv_pte_set_writable(src_pte); /* need write access for inv */
112 __set_pte(ptep, src_pte); /* set_pte() would be confused by this */
113 local_flush_tlb_page(NULL, newsrc, PAGE_SIZE);
114
115 /*
116 * Do the actual invalidation, covering the full L2 cache line
117 * at the end since __memcpy_asm() is somewhat aggressive.
118 */
119 __inv_buffer((void *)newsrc, len);
120
121 /*
122 * We're done: notify the simulator that all is back to normal,
123 * and re-enable interrupts and pre-emption.
124 */
125 kmap_atomic_idx_pop();
126 kmap_atomic_idx_pop();
127 sim_allow_multiple_caching(0);
128 local_irq_restore(flags);
129 put_cpu();
130}
131
132/*
133 * Identify large copies from remotely-cached memory, and copy them
134 * via memcpy_multicache() if they look good, otherwise fall back
135 * to the particular kind of copying passed as the memcpy_t function.
136 */
137static unsigned long fast_copy(void *dest, const void *source, int len,
138 memcpy_t func)
139{
140 /*
141 * Check if it's big enough to bother with. We may end up doing a
142 * small copy via TLB manipulation if we're near a page boundary,
143 * but presumably we'll make it up when we hit the second page.
144 */
145 while (len >= LARGE_COPY_CUTOFF) {
146 int copy_size, bytes_left_on_page;
147 pte_t *src_ptep, *dst_ptep;
148 pte_t src_pte, dst_pte;
149 struct page *src_page, *dst_page;
150
151 /* Is the source page oloc'ed to a remote cpu? */
152retry_source:
153 src_ptep = virt_to_pte(current->mm, (unsigned long)source);
154 if (src_ptep == NULL)
155 break;
156 src_pte = *src_ptep;
157 if (!hv_pte_get_present(src_pte) ||
158 !hv_pte_get_readable(src_pte) ||
159 hv_pte_get_mode(src_pte) != HV_PTE_MODE_CACHE_TILE_L3)
160 break;
161 if (get_remote_cache_cpu(src_pte) == smp_processor_id())
162 break;
163 src_page = pfn_to_page(pte_pfn(src_pte));
164 get_page(src_page);
165 if (pte_val(src_pte) != pte_val(*src_ptep)) {
166 put_page(src_page);
167 goto retry_source;
168 }
169 if (pte_huge(src_pte)) {
170 /* Adjust the PTE to correspond to a small page */
171 int pfn = pte_pfn(src_pte);
172 pfn += (((unsigned long)source & (HPAGE_SIZE-1))
173 >> PAGE_SHIFT);
174 src_pte = pfn_pte(pfn, src_pte);
175 src_pte = pte_mksmall(src_pte);
176 }
177
178 /* Is the destination page writable? */
179retry_dest:
180 dst_ptep = virt_to_pte(current->mm, (unsigned long)dest);
181 if (dst_ptep == NULL) {
182 put_page(src_page);
183 break;
184 }
185 dst_pte = *dst_ptep;
186 if (!hv_pte_get_present(dst_pte) ||
187 !hv_pte_get_writable(dst_pte)) {
188 put_page(src_page);
189 break;
190 }
191 dst_page = pfn_to_page(pte_pfn(dst_pte));
192 if (dst_page == src_page) {
193 /*
194 * Source and dest are on the same page; this
195 * potentially exposes us to incoherence if any
196 * part of src and dest overlap on a cache line.
197 * Just give up rather than trying to be precise.
198 */
199 put_page(src_page);
200 break;
201 }
202 get_page(dst_page);
203 if (pte_val(dst_pte) != pte_val(*dst_ptep)) {
204 put_page(dst_page);
205 goto retry_dest;
206 }
207 if (pte_huge(dst_pte)) {
208 /* Adjust the PTE to correspond to a small page */
209 int pfn = pte_pfn(dst_pte);
210 pfn += (((unsigned long)dest & (HPAGE_SIZE-1))
211 >> PAGE_SHIFT);
212 dst_pte = pfn_pte(pfn, dst_pte);
213 dst_pte = pte_mksmall(dst_pte);
214 }
215
216 /* All looks good: create a cachable PTE and copy from it */
217 copy_size = len;
218 bytes_left_on_page =
219 PAGE_SIZE - (((int)source) & (PAGE_SIZE-1));
220 if (copy_size > bytes_left_on_page)
221 copy_size = bytes_left_on_page;
222 bytes_left_on_page =
223 PAGE_SIZE - (((int)dest) & (PAGE_SIZE-1));
224 if (copy_size > bytes_left_on_page)
225 copy_size = bytes_left_on_page;
226 memcpy_multicache(dest, source, dst_pte, src_pte, copy_size);
227
228 /* Release the pages */
229 put_page(dst_page);
230 put_page(src_page);
231
232 /* Continue on the next page */
233 dest += copy_size;
234 source += copy_size;
235 len -= copy_size;
236 }
237
238 return func(dest, source, len);
239}
240
241void *memcpy(void *to, const void *from, __kernel_size_t n)
242{
243 if (n < LARGE_COPY_CUTOFF)
244 return (void *)__memcpy_asm(to, from, n);
245 else
246 return (void *)fast_copy(to, from, n, __memcpy_asm);
247}
248
249unsigned long __copy_to_user_inatomic(void __user *to, const void *from,
250 unsigned long n)
251{
252 if (n < LARGE_COPY_CUTOFF)
253 return __copy_to_user_inatomic_asm(to, from, n);
254 else
255 return fast_copy(to, from, n, __copy_to_user_inatomic_asm);
256}
257
258unsigned long __copy_from_user_inatomic(void *to, const void __user *from,
259 unsigned long n)
260{
261 if (n < LARGE_COPY_CUTOFF)
262 return __copy_from_user_inatomic_asm(to, from, n);
263 else
264 return fast_copy(to, from, n, __copy_from_user_inatomic_asm);
265}
266
267unsigned long __copy_from_user_zeroing(void *to, const void __user *from,
268 unsigned long n)
269{
270 if (n < LARGE_COPY_CUTOFF)
271 return __copy_from_user_zeroing_asm(to, from, n);
272 else
273 return fast_copy(to, from, n, __copy_from_user_zeroing_asm);
274}
275
276#endif /* !CHIP_HAS_COHERENT_LOCAL_CACHE() */
diff --git a/arch/tile/lib/memcpy_user_64.c b/arch/tile/lib/memcpy_user_64.c
index 37440caa7370..88c7016492c4 100644
--- a/arch/tile/lib/memcpy_user_64.c
+++ b/arch/tile/lib/memcpy_user_64.c
@@ -31,6 +31,7 @@
31 ".pushsection .coldtext.memcpy,\"ax\";" \ 31 ".pushsection .coldtext.memcpy,\"ax\";" \
32 "2: { move r0, %2; jrp lr };" \ 32 "2: { move r0, %2; jrp lr };" \
33 ".section __ex_table,\"a\";" \ 33 ".section __ex_table,\"a\";" \
34 ".align 8;" \
34 ".quad 1b, 2b;" \ 35 ".quad 1b, 2b;" \
35 ".popsection" \ 36 ".popsection" \
36 : "=m" (*(p)) : "r" (v), "r" (n)); \ 37 : "=m" (*(p)) : "r" (v), "r" (n)); \
@@ -43,6 +44,7 @@
43 ".pushsection .coldtext.memcpy,\"ax\";" \ 44 ".pushsection .coldtext.memcpy,\"ax\";" \
44 "2: { move r0, %2; jrp lr };" \ 45 "2: { move r0, %2; jrp lr };" \
45 ".section __ex_table,\"a\";" \ 46 ".section __ex_table,\"a\";" \
47 ".align 8;" \
46 ".quad 1b, 2b;" \ 48 ".quad 1b, 2b;" \
47 ".popsection" \ 49 ".popsection" \
48 : "=r" (__v) : "m" (*(p)), "r" (n)); \ 50 : "=r" (__v) : "m" (*(p)), "r" (n)); \
diff --git a/arch/tile/lib/memset_32.c b/arch/tile/lib/memset_32.c
index 57dbb3a5bff8..2042bfe6595f 100644
--- a/arch/tile/lib/memset_32.c
+++ b/arch/tile/lib/memset_32.c
@@ -12,13 +12,10 @@
12 * more details. 12 * more details.
13 */ 13 */
14 14
15#include <arch/chip.h>
16
17#include <linux/types.h> 15#include <linux/types.h>
18#include <linux/string.h> 16#include <linux/string.h>
19#include <linux/module.h> 17#include <linux/module.h>
20 18#include <arch/chip.h>
21#undef memset
22 19
23void *memset(void *s, int c, size_t n) 20void *memset(void *s, int c, size_t n)
24{ 21{
@@ -26,11 +23,7 @@ void *memset(void *s, int c, size_t n)
26 int n32; 23 int n32;
27 uint32_t v16, v32; 24 uint32_t v16, v32;
28 uint8_t *out8 = s; 25 uint8_t *out8 = s;
29#if !CHIP_HAS_WH64()
30 int ahead32;
31#else
32 int to_align32; 26 int to_align32;
33#endif
34 27
35 /* Experimentation shows that a trivial tight loop is a win up until 28 /* Experimentation shows that a trivial tight loop is a win up until
36 * around a size of 20, where writing a word at a time starts to win. 29 * around a size of 20, where writing a word at a time starts to win.
@@ -61,21 +54,6 @@ void *memset(void *s, int c, size_t n)
61 return s; 54 return s;
62 } 55 }
63 56
64#if !CHIP_HAS_WH64()
65 /* Use a spare issue slot to start prefetching the first cache
66 * line early. This instruction is free as the store can be buried
67 * in otherwise idle issue slots doing ALU ops.
68 */
69 __insn_prefetch(out8);
70
71 /* We prefetch the end so that a short memset that spans two cache
72 * lines gets some prefetching benefit. Again we believe this is free
73 * to issue.
74 */
75 __insn_prefetch(&out8[n - 1]);
76#endif /* !CHIP_HAS_WH64() */
77
78
79 /* Align 'out8'. We know n >= 3 so this won't write past the end. */ 57 /* Align 'out8'. We know n >= 3 so this won't write past the end. */
80 while (((uintptr_t) out8 & 3) != 0) { 58 while (((uintptr_t) out8 & 3) != 0) {
81 *out8++ = c; 59 *out8++ = c;
@@ -96,90 +74,6 @@ void *memset(void *s, int c, size_t n)
96 /* This must be at least 8 or the following loop doesn't work. */ 74 /* This must be at least 8 or the following loop doesn't work. */
97#define CACHE_LINE_SIZE_IN_WORDS (CHIP_L2_LINE_SIZE() / 4) 75#define CACHE_LINE_SIZE_IN_WORDS (CHIP_L2_LINE_SIZE() / 4)
98 76
99#if !CHIP_HAS_WH64()
100
101 ahead32 = CACHE_LINE_SIZE_IN_WORDS;
102
103 /* We already prefetched the first and last cache lines, so
104 * we only need to do more prefetching if we are storing
105 * to more than two cache lines.
106 */
107 if (n32 > CACHE_LINE_SIZE_IN_WORDS * 2) {
108 int i;
109
110 /* Prefetch the next several cache lines.
111 * This is the setup code for the software-pipelined
112 * loop below.
113 */
114#define MAX_PREFETCH 5
115 ahead32 = n32 & -CACHE_LINE_SIZE_IN_WORDS;
116 if (ahead32 > MAX_PREFETCH * CACHE_LINE_SIZE_IN_WORDS)
117 ahead32 = MAX_PREFETCH * CACHE_LINE_SIZE_IN_WORDS;
118
119 for (i = CACHE_LINE_SIZE_IN_WORDS;
120 i < ahead32; i += CACHE_LINE_SIZE_IN_WORDS)
121 __insn_prefetch(&out32[i]);
122 }
123
124 if (n32 > ahead32) {
125 while (1) {
126 int j;
127
128 /* Prefetch by reading one word several cache lines
129 * ahead. Since loads are non-blocking this will
130 * cause the full cache line to be read while we are
131 * finishing earlier cache lines. Using a store
132 * here causes microarchitectural performance
133 * problems where a victimizing store miss goes to
134 * the head of the retry FIFO and locks the pipe for
135 * a few cycles. So a few subsequent stores in this
136 * loop go into the retry FIFO, and then later
137 * stores see other stores to the same cache line
138 * are already in the retry FIFO and themselves go
139 * into the retry FIFO, filling it up and grinding
140 * to a halt waiting for the original miss to be
141 * satisfied.
142 */
143 __insn_prefetch(&out32[ahead32]);
144
145#if CACHE_LINE_SIZE_IN_WORDS % 4 != 0
146#error "Unhandled CACHE_LINE_SIZE_IN_WORDS"
147#endif
148
149 n32 -= CACHE_LINE_SIZE_IN_WORDS;
150
151 /* Save icache space by only partially unrolling
152 * this loop.
153 */
154 for (j = CACHE_LINE_SIZE_IN_WORDS / 4; j > 0; j--) {
155 *out32++ = v32;
156 *out32++ = v32;
157 *out32++ = v32;
158 *out32++ = v32;
159 }
160
161 /* To save compiled code size, reuse this loop even
162 * when we run out of prefetching to do by dropping
163 * ahead32 down.
164 */
165 if (n32 <= ahead32) {
166 /* Not even a full cache line left,
167 * so stop now.
168 */
169 if (n32 < CACHE_LINE_SIZE_IN_WORDS)
170 break;
171
172 /* Choose a small enough value that we don't
173 * prefetch past the end. There's no sense
174 * in touching cache lines we don't have to.
175 */
176 ahead32 = CACHE_LINE_SIZE_IN_WORDS - 1;
177 }
178 }
179 }
180
181#else /* CHIP_HAS_WH64() */
182
183 /* Determine how many words we need to emit before the 'out32' 77 /* Determine how many words we need to emit before the 'out32'
184 * pointer becomes aligned modulo the cache line size. 78 * pointer becomes aligned modulo the cache line size.
185 */ 79 */
@@ -236,8 +130,6 @@ void *memset(void *s, int c, size_t n)
236 n32 &= CACHE_LINE_SIZE_IN_WORDS - 1; 130 n32 &= CACHE_LINE_SIZE_IN_WORDS - 1;
237 } 131 }
238 132
239#endif /* CHIP_HAS_WH64() */
240
241 /* Now handle any leftover values. */ 133 /* Now handle any leftover values. */
242 if (n32 != 0) { 134 if (n32 != 0) {
243 do { 135 do {
diff --git a/arch/tile/lib/memset_64.c b/arch/tile/lib/memset_64.c
index 3873085711d5..03ef69cd73de 100644
--- a/arch/tile/lib/memset_64.c
+++ b/arch/tile/lib/memset_64.c
@@ -12,13 +12,11 @@
12 * more details. 12 * more details.
13 */ 13 */
14 14
15#include <arch/chip.h>
16
17#include <linux/types.h> 15#include <linux/types.h>
18#include <linux/string.h> 16#include <linux/string.h>
19#include <linux/module.h> 17#include <linux/module.h>
20 18#include <arch/chip.h>
21#undef memset 19#include "string-endian.h"
22 20
23void *memset(void *s, int c, size_t n) 21void *memset(void *s, int c, size_t n)
24{ 22{
@@ -70,8 +68,7 @@ void *memset(void *s, int c, size_t n)
70 n64 = n >> 3; 68 n64 = n >> 3;
71 69
72 /* Tile input byte out to 64 bits. */ 70 /* Tile input byte out to 64 bits. */
73 /* KLUDGE */ 71 v64 = copy_byte(c);
74 v64 = 0x0101010101010101ULL * (uint8_t)c;
75 72
76 /* This must be at least 8 or the following loop doesn't work. */ 73 /* This must be at least 8 or the following loop doesn't work. */
77#define CACHE_LINE_SIZE_IN_DOUBLEWORDS (CHIP_L2_LINE_SIZE() / 8) 74#define CACHE_LINE_SIZE_IN_DOUBLEWORDS (CHIP_L2_LINE_SIZE() / 8)
diff --git a/arch/tile/lib/strchr_32.c b/arch/tile/lib/strchr_32.c
index c94e6f7ae7b5..841fe6963019 100644
--- a/arch/tile/lib/strchr_32.c
+++ b/arch/tile/lib/strchr_32.c
@@ -16,8 +16,6 @@
16#include <linux/string.h> 16#include <linux/string.h>
17#include <linux/module.h> 17#include <linux/module.h>
18 18
19#undef strchr
20
21char *strchr(const char *s, int c) 19char *strchr(const char *s, int c)
22{ 20{
23 int z, g; 21 int z, g;
diff --git a/arch/tile/lib/strchr_64.c b/arch/tile/lib/strchr_64.c
index f39f9dc422b0..fe6e31c06f8d 100644
--- a/arch/tile/lib/strchr_64.c
+++ b/arch/tile/lib/strchr_64.c
@@ -26,7 +26,7 @@ char *strchr(const char *s, int c)
26 const uint64_t *p = (const uint64_t *)(s_int & -8); 26 const uint64_t *p = (const uint64_t *)(s_int & -8);
27 27
28 /* Create eight copies of the byte for which we are looking. */ 28 /* Create eight copies of the byte for which we are looking. */
29 const uint64_t goal = 0x0101010101010101ULL * (uint8_t) c; 29 const uint64_t goal = copy_byte(c);
30 30
31 /* Read the first aligned word, but force bytes before the string to 31 /* Read the first aligned word, but force bytes before the string to
32 * match neither zero nor goal (we make sure the high bit of each 32 * match neither zero nor goal (we make sure the high bit of each
diff --git a/arch/tile/lib/string-endian.h b/arch/tile/lib/string-endian.h
index c0eed7ce69c3..2e49cbfe9371 100644
--- a/arch/tile/lib/string-endian.h
+++ b/arch/tile/lib/string-endian.h
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright 2011 Tilera Corporation. All Rights Reserved. 2 * Copyright 2013 Tilera Corporation. All Rights Reserved.
3 * 3 *
4 * This program is free software; you can redistribute it and/or 4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License 5 * modify it under the terms of the GNU General Public License
@@ -31,3 +31,14 @@
31#define CFZ(x) __insn_clz(x) 31#define CFZ(x) __insn_clz(x)
32#define REVCZ(x) __insn_ctz(x) 32#define REVCZ(x) __insn_ctz(x)
33#endif 33#endif
34
35/*
36 * Create eight copies of the byte in a uint64_t. Byte Shuffle uses
37 * the bytes of srcB as the index into the dest vector to select a
38 * byte. With all indices of zero, the first byte is copied into all
39 * the other bytes.
40 */
41static inline uint64_t copy_byte(uint8_t byte)
42{
43 return __insn_shufflebytes(byte, 0, 0);
44}
diff --git a/arch/tile/lib/strlen_32.c b/arch/tile/lib/strlen_32.c
index 4974292a5534..f26f88e11e4a 100644
--- a/arch/tile/lib/strlen_32.c
+++ b/arch/tile/lib/strlen_32.c
@@ -16,8 +16,6 @@
16#include <linux/string.h> 16#include <linux/string.h>
17#include <linux/module.h> 17#include <linux/module.h>
18 18
19#undef strlen
20
21size_t strlen(const char *s) 19size_t strlen(const char *s)
22{ 20{
23 /* Get an aligned pointer. */ 21 /* Get an aligned pointer. */
diff --git a/arch/tile/lib/strnlen_32.c b/arch/tile/lib/strnlen_32.c
new file mode 100644
index 000000000000..1434141d9e01
--- /dev/null
+++ b/arch/tile/lib/strnlen_32.c
@@ -0,0 +1,47 @@
1/*
2 * Copyright 2013 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#include <linux/types.h>
16#include <linux/string.h>
17#include <linux/module.h>
18
19size_t strnlen(const char *s, size_t count)
20{
21 /* Get an aligned pointer. */
22 const uintptr_t s_int = (uintptr_t) s;
23 const uint32_t *p = (const uint32_t *)(s_int & -4);
24 size_t bytes_read = sizeof(*p) - (s_int & (sizeof(*p) - 1));
25 size_t len;
26 uint32_t v, bits;
27
28 /* Avoid page fault risk by not reading any bytes when count is 0. */
29 if (count == 0)
30 return 0;
31
32 /* Read first word, but force bytes before the string to be nonzero. */
33 v = *p | ((1 << ((s_int << 3) & 31)) - 1);
34
35 while ((bits = __insn_seqb(v, 0)) == 0) {
36 if (bytes_read >= count) {
37 /* Read COUNT bytes and didn't find the terminator. */
38 return count;
39 }
40 v = *++p;
41 bytes_read += sizeof(v);
42 }
43
44 len = ((const char *) p) + (__insn_ctz(bits) >> 3) - s;
45 return (len < count ? len : count);
46}
47EXPORT_SYMBOL(strnlen);
diff --git a/arch/tile/lib/strnlen_64.c b/arch/tile/lib/strnlen_64.c
new file mode 100644
index 000000000000..2e8de6a5136f
--- /dev/null
+++ b/arch/tile/lib/strnlen_64.c
@@ -0,0 +1,48 @@
1/*
2 * Copyright 2013 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#include <linux/types.h>
16#include <linux/string.h>
17#include <linux/module.h>
18#include "string-endian.h"
19
20size_t strnlen(const char *s, size_t count)
21{
22 /* Get an aligned pointer. */
23 const uintptr_t s_int = (uintptr_t) s;
24 const uint64_t *p = (const uint64_t *)(s_int & -8);
25 size_t bytes_read = sizeof(*p) - (s_int & (sizeof(*p) - 1));
26 size_t len;
27 uint64_t v, bits;
28
29 /* Avoid page fault risk by not reading any bytes when count is 0. */
30 if (count == 0)
31 return 0;
32
33 /* Read and MASK the first word. */
34 v = *p | MASK(s_int);
35
36 while ((bits = __insn_v1cmpeqi(v, 0)) == 0) {
37 if (bytes_read >= count) {
38 /* Read COUNT bytes and didn't find the terminator. */
39 return count;
40 }
41 v = *++p;
42 bytes_read += sizeof(v);
43 }
44
45 len = ((const char *) p) + (CFZ(bits) >> 3) - s;
46 return (len < count ? len : count);
47}
48EXPORT_SYMBOL(strnlen);
diff --git a/arch/tile/lib/usercopy_32.S b/arch/tile/lib/usercopy_32.S
index b62d002af009..1bc162224638 100644
--- a/arch/tile/lib/usercopy_32.S
+++ b/arch/tile/lib/usercopy_32.S
@@ -36,6 +36,7 @@ strnlen_user_fault:
36 { move r0, zero; jrp lr } 36 { move r0, zero; jrp lr }
37 ENDPROC(strnlen_user_fault) 37 ENDPROC(strnlen_user_fault)
38 .section __ex_table,"a" 38 .section __ex_table,"a"
39 .align 4
39 .word 1b, strnlen_user_fault 40 .word 1b, strnlen_user_fault
40 .popsection 41 .popsection
41 42
@@ -47,18 +48,20 @@ strnlen_user_fault:
47 */ 48 */
48STD_ENTRY(strncpy_from_user_asm) 49STD_ENTRY(strncpy_from_user_asm)
49 { bz r2, 2f; move r3, r0 } 50 { bz r2, 2f; move r3, r0 }
501: { lb_u r4, r1; addi r1, r1, 1; addi r2, r2, -1 } 511: { lb_u r4, r1; addi r1, r1, 1; addi r2, r2, -1 }
51 { sb r0, r4; addi r0, r0, 1 } 52 { sb r0, r4; addi r0, r0, 1 }
52 bz r2, 2f 53 bz r4, 2f
53 bnzt r4, 1b 54 bnzt r2, 1b
54 addi r0, r0, -1 /* don't count the trailing NUL */ 55 { sub r0, r0, r3; jrp lr }
552: { sub r0, r0, r3; jrp lr } 562: addi r0, r0, -1 /* don't count the trailing NUL */
57 { sub r0, r0, r3; jrp lr }
56 STD_ENDPROC(strncpy_from_user_asm) 58 STD_ENDPROC(strncpy_from_user_asm)
57 .pushsection .fixup,"ax" 59 .pushsection .fixup,"ax"
58strncpy_from_user_fault: 60strncpy_from_user_fault:
59 { movei r0, -EFAULT; jrp lr } 61 { movei r0, -EFAULT; jrp lr }
60 ENDPROC(strncpy_from_user_fault) 62 ENDPROC(strncpy_from_user_fault)
61 .section __ex_table,"a" 63 .section __ex_table,"a"
64 .align 4
62 .word 1b, strncpy_from_user_fault 65 .word 1b, strncpy_from_user_fault
63 .popsection 66 .popsection
64 67
@@ -77,6 +80,7 @@ STD_ENTRY(clear_user_asm)
77 bnzt r1, 1b 80 bnzt r1, 1b
782: { move r0, r1; jrp lr } 812: { move r0, r1; jrp lr }
79 .pushsection __ex_table,"a" 82 .pushsection __ex_table,"a"
83 .align 4
80 .word 1b, 2b 84 .word 1b, 2b
81 .popsection 85 .popsection
82 86
@@ -86,6 +90,7 @@ STD_ENTRY(clear_user_asm)
862: { move r0, r1; jrp lr } 902: { move r0, r1; jrp lr }
87 STD_ENDPROC(clear_user_asm) 91 STD_ENDPROC(clear_user_asm)
88 .pushsection __ex_table,"a" 92 .pushsection __ex_table,"a"
93 .align 4
89 .word 1b, 2b 94 .word 1b, 2b
90 .popsection 95 .popsection
91 96
@@ -105,25 +110,7 @@ STD_ENTRY(flush_user_asm)
1052: { move r0, r1; jrp lr } 1102: { move r0, r1; jrp lr }
106 STD_ENDPROC(flush_user_asm) 111 STD_ENDPROC(flush_user_asm)
107 .pushsection __ex_table,"a" 112 .pushsection __ex_table,"a"
108 .word 1b, 2b 113 .align 4
109 .popsection
110
111/*
112 * inv_user_asm takes the user target address in r0 and the
113 * number of bytes to invalidate in r1.
114 * It returns the number of not inv'able bytes (hopefully zero) in r0.
115 */
116STD_ENTRY(inv_user_asm)
117 bz r1, 2f
118 { movei r2, L2_CACHE_BYTES; add r1, r0, r1 }
119 { sub r2, zero, r2; addi r1, r1, L2_CACHE_BYTES-1 }
120 { and r0, r0, r2; and r1, r1, r2 }
121 { sub r1, r1, r0 }
1221: { inv r0; addi r1, r1, -CHIP_INV_STRIDE() }
123 { addi r0, r0, CHIP_INV_STRIDE(); bnzt r1, 1b }
1242: { move r0, r1; jrp lr }
125 STD_ENDPROC(inv_user_asm)
126 .pushsection __ex_table,"a"
127 .word 1b, 2b 114 .word 1b, 2b
128 .popsection 115 .popsection
129 116
@@ -143,5 +130,6 @@ STD_ENTRY(finv_user_asm)
1432: { move r0, r1; jrp lr } 1302: { move r0, r1; jrp lr }
144 STD_ENDPROC(finv_user_asm) 131 STD_ENDPROC(finv_user_asm)
145 .pushsection __ex_table,"a" 132 .pushsection __ex_table,"a"
133 .align 4
146 .word 1b, 2b 134 .word 1b, 2b
147 .popsection 135 .popsection
diff --git a/arch/tile/lib/usercopy_64.S b/arch/tile/lib/usercopy_64.S
index adb2dbbc70cd..b3b31a3306f8 100644
--- a/arch/tile/lib/usercopy_64.S
+++ b/arch/tile/lib/usercopy_64.S
@@ -36,6 +36,7 @@ strnlen_user_fault:
36 { move r0, zero; jrp lr } 36 { move r0, zero; jrp lr }
37 ENDPROC(strnlen_user_fault) 37 ENDPROC(strnlen_user_fault)
38 .section __ex_table,"a" 38 .section __ex_table,"a"
39 .align 8
39 .quad 1b, strnlen_user_fault 40 .quad 1b, strnlen_user_fault
40 .popsection 41 .popsection
41 42
@@ -47,18 +48,20 @@ strnlen_user_fault:
47 */ 48 */
48STD_ENTRY(strncpy_from_user_asm) 49STD_ENTRY(strncpy_from_user_asm)
49 { beqz r2, 2f; move r3, r0 } 50 { beqz r2, 2f; move r3, r0 }
501: { ld1u r4, r1; addi r1, r1, 1; addi r2, r2, -1 } 511: { ld1u r4, r1; addi r1, r1, 1; addi r2, r2, -1 }
51 { st1 r0, r4; addi r0, r0, 1 } 52 { st1 r0, r4; addi r0, r0, 1 }
52 beqz r2, 2f 53 beqz r4, 2f
53 bnezt r4, 1b 54 bnezt r2, 1b
54 addi r0, r0, -1 /* don't count the trailing NUL */ 55 { sub r0, r0, r3; jrp lr }
552: { sub r0, r0, r3; jrp lr } 562: addi r0, r0, -1 /* don't count the trailing NUL */
57 { sub r0, r0, r3; jrp lr }
56 STD_ENDPROC(strncpy_from_user_asm) 58 STD_ENDPROC(strncpy_from_user_asm)
57 .pushsection .fixup,"ax" 59 .pushsection .fixup,"ax"
58strncpy_from_user_fault: 60strncpy_from_user_fault:
59 { movei r0, -EFAULT; jrp lr } 61 { movei r0, -EFAULT; jrp lr }
60 ENDPROC(strncpy_from_user_fault) 62 ENDPROC(strncpy_from_user_fault)
61 .section __ex_table,"a" 63 .section __ex_table,"a"
64 .align 8
62 .quad 1b, strncpy_from_user_fault 65 .quad 1b, strncpy_from_user_fault
63 .popsection 66 .popsection
64 67
@@ -77,6 +80,7 @@ STD_ENTRY(clear_user_asm)
77 bnezt r1, 1b 80 bnezt r1, 1b
782: { move r0, r1; jrp lr } 812: { move r0, r1; jrp lr }
79 .pushsection __ex_table,"a" 82 .pushsection __ex_table,"a"
83 .align 8
80 .quad 1b, 2b 84 .quad 1b, 2b
81 .popsection 85 .popsection
82 86
@@ -86,6 +90,7 @@ STD_ENTRY(clear_user_asm)
862: { move r0, r1; jrp lr } 902: { move r0, r1; jrp lr }
87 STD_ENDPROC(clear_user_asm) 91 STD_ENDPROC(clear_user_asm)
88 .pushsection __ex_table,"a" 92 .pushsection __ex_table,"a"
93 .align 8
89 .quad 1b, 2b 94 .quad 1b, 2b
90 .popsection 95 .popsection
91 96
@@ -105,25 +110,7 @@ STD_ENTRY(flush_user_asm)
1052: { move r0, r1; jrp lr } 1102: { move r0, r1; jrp lr }
106 STD_ENDPROC(flush_user_asm) 111 STD_ENDPROC(flush_user_asm)
107 .pushsection __ex_table,"a" 112 .pushsection __ex_table,"a"
108 .quad 1b, 2b 113 .align 8
109 .popsection
110
111/*
112 * inv_user_asm takes the user target address in r0 and the
113 * number of bytes to invalidate in r1.
114 * It returns the number of not inv'able bytes (hopefully zero) in r0.
115 */
116STD_ENTRY(inv_user_asm)
117 beqz r1, 2f
118 { movei r2, L2_CACHE_BYTES; add r1, r0, r1 }
119 { sub r2, zero, r2; addi r1, r1, L2_CACHE_BYTES-1 }
120 { and r0, r0, r2; and r1, r1, r2 }
121 { sub r1, r1, r0 }
1221: { inv r0; addi r1, r1, -CHIP_INV_STRIDE() }
123 { addi r0, r0, CHIP_INV_STRIDE(); bnezt r1, 1b }
1242: { move r0, r1; jrp lr }
125 STD_ENDPROC(inv_user_asm)
126 .pushsection __ex_table,"a"
127 .quad 1b, 2b 114 .quad 1b, 2b
128 .popsection 115 .popsection
129 116
@@ -143,5 +130,6 @@ STD_ENTRY(finv_user_asm)
1432: { move r0, r1; jrp lr } 1302: { move r0, r1; jrp lr }
144 STD_ENDPROC(finv_user_asm) 131 STD_ENDPROC(finv_user_asm)
145 .pushsection __ex_table,"a" 132 .pushsection __ex_table,"a"
133 .align 8
146 .quad 1b, 2b 134 .quad 1b, 2b
147 .popsection 135 .popsection
diff --git a/arch/tile/mm/elf.c b/arch/tile/mm/elf.c
index 743c951c61b0..23f044e8a7ab 100644
--- a/arch/tile/mm/elf.c
+++ b/arch/tile/mm/elf.c
@@ -21,7 +21,8 @@
21#include <asm/pgtable.h> 21#include <asm/pgtable.h>
22#include <asm/pgalloc.h> 22#include <asm/pgalloc.h>
23#include <asm/sections.h> 23#include <asm/sections.h>
24#include <arch/sim_def.h> 24#include <asm/vdso.h>
25#include <arch/sim.h>
25 26
26/* Notify a running simulator, if any, that an exec just occurred. */ 27/* Notify a running simulator, if any, that an exec just occurred. */
27static void sim_notify_exec(const char *binary_name) 28static void sim_notify_exec(const char *binary_name)
@@ -38,21 +39,55 @@ static void sim_notify_exec(const char *binary_name)
38 39
39static int notify_exec(struct mm_struct *mm) 40static int notify_exec(struct mm_struct *mm)
40{ 41{
41 int retval = 0; /* failure */ 42 char *buf, *path;
42 43 struct vm_area_struct *vma;
43 if (mm->exe_file) { 44
44 char *buf = (char *) __get_free_page(GFP_KERNEL); 45 if (!sim_is_simulator())
45 if (buf) { 46 return 1;
46 char *path = d_path(&mm->exe_file->f_path, 47
47 buf, PAGE_SIZE); 48 if (mm->exe_file == NULL)
48 if (!IS_ERR(path)) { 49 return 0;
49 sim_notify_exec(path); 50
50 retval = 1; 51 for (vma = current->mm->mmap; ; vma = vma->vm_next) {
51 } 52 if (vma == NULL)
52 free_page((unsigned long)buf); 53 return 0;
54 if (vma->vm_file == mm->exe_file)
55 break;
56 }
57
58 buf = (char *) __get_free_page(GFP_KERNEL);
59 if (buf == NULL)
60 return 0;
61
62 path = d_path(&mm->exe_file->f_path, buf, PAGE_SIZE);
63 if (IS_ERR(path)) {
64 free_page((unsigned long)buf);
65 return 0;
66 }
67
68 /*
69 * Notify simulator of an ET_DYN object so we know the load address.
70 * The somewhat cryptic overuse of SIM_CONTROL_DLOPEN allows us
71 * to be backward-compatible with older simulator releases.
72 */
73 if (vma->vm_start == (ELF_ET_DYN_BASE & PAGE_MASK)) {
74 char buf[64];
75 int i;
76
77 snprintf(buf, sizeof(buf), "0x%lx:@", vma->vm_start);
78 for (i = 0; ; ++i) {
79 char c = buf[i];
80 __insn_mtspr(SPR_SIM_CONTROL,
81 (SIM_CONTROL_DLOPEN
82 | (c << _SIM_CONTROL_OPERATOR_BITS)));
83 if (c == '\0')
84 break;
53 } 85 }
54 } 86 }
55 return retval; 87
88 sim_notify_exec(path);
89 free_page((unsigned long)buf);
90 return 1;
56} 91}
57 92
58/* Notify a running simulator, if any, that we loaded an interpreter. */ 93/* Notify a running simulator, if any, that we loaded an interpreter. */
@@ -68,37 +103,10 @@ static void sim_notify_interp(unsigned long load_addr)
68} 103}
69 104
70 105
71/* Kernel address of page used to map read-only kernel data into userspace. */
72static void *vdso_page;
73
74/* One-entry array used for install_special_mapping. */
75static struct page *vdso_pages[1];
76
77static int __init vdso_setup(void)
78{
79 vdso_page = (void *)get_zeroed_page(GFP_ATOMIC);
80 memcpy(vdso_page, __rt_sigreturn, __rt_sigreturn_end - __rt_sigreturn);
81 vdso_pages[0] = virt_to_page(vdso_page);
82 return 0;
83}
84device_initcall(vdso_setup);
85
86const char *arch_vma_name(struct vm_area_struct *vma)
87{
88 if (vma->vm_private_data == vdso_pages)
89 return "[vdso]";
90#ifndef __tilegx__
91 if (vma->vm_start == MEM_USER_INTRPT)
92 return "[intrpt]";
93#endif
94 return NULL;
95}
96
97int arch_setup_additional_pages(struct linux_binprm *bprm, 106int arch_setup_additional_pages(struct linux_binprm *bprm,
98 int executable_stack) 107 int executable_stack)
99{ 108{
100 struct mm_struct *mm = current->mm; 109 struct mm_struct *mm = current->mm;
101 unsigned long vdso_base;
102 int retval = 0; 110 int retval = 0;
103 111
104 down_write(&mm->mmap_sem); 112 down_write(&mm->mmap_sem);
@@ -111,14 +119,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm,
111 if (!notify_exec(mm)) 119 if (!notify_exec(mm))
112 sim_notify_exec(bprm->filename); 120 sim_notify_exec(bprm->filename);
113 121
114 /* 122 retval = setup_vdso_pages();
115 * MAYWRITE to allow gdb to COW and set breakpoints
116 */
117 vdso_base = VDSO_BASE;
118 retval = install_special_mapping(mm, vdso_base, PAGE_SIZE,
119 VM_READ|VM_EXEC|
120 VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC,
121 vdso_pages);
122 123
123#ifndef __tilegx__ 124#ifndef __tilegx__
124 /* 125 /*
diff --git a/arch/tile/mm/fault.c b/arch/tile/mm/fault.c
index f7f99f90cbe0..6c0571216a9d 100644
--- a/arch/tile/mm/fault.c
+++ b/arch/tile/mm/fault.c
@@ -34,6 +34,7 @@
34#include <linux/hugetlb.h> 34#include <linux/hugetlb.h>
35#include <linux/syscalls.h> 35#include <linux/syscalls.h>
36#include <linux/uaccess.h> 36#include <linux/uaccess.h>
37#include <linux/kdebug.h>
37 38
38#include <asm/pgalloc.h> 39#include <asm/pgalloc.h>
39#include <asm/sections.h> 40#include <asm/sections.h>
@@ -122,10 +123,9 @@ static inline pmd_t *vmalloc_sync_one(pgd_t *pgd, unsigned long address)
122 pmd_k = pmd_offset(pud_k, address); 123 pmd_k = pmd_offset(pud_k, address);
123 if (!pmd_present(*pmd_k)) 124 if (!pmd_present(*pmd_k))
124 return NULL; 125 return NULL;
125 if (!pmd_present(*pmd)) { 126 if (!pmd_present(*pmd))
126 set_pmd(pmd, *pmd_k); 127 set_pmd(pmd, *pmd_k);
127 arch_flush_lazy_mmu_mode(); 128 else
128 } else
129 BUG_ON(pmd_ptfn(*pmd) != pmd_ptfn(*pmd_k)); 129 BUG_ON(pmd_ptfn(*pmd) != pmd_ptfn(*pmd_k));
130 return pmd_k; 130 return pmd_k;
131} 131}
@@ -149,8 +149,6 @@ static inline int vmalloc_fault(pgd_t *pgd, unsigned long address)
149 pmd_k = vmalloc_sync_one(pgd, address); 149 pmd_k = vmalloc_sync_one(pgd, address);
150 if (!pmd_k) 150 if (!pmd_k)
151 return -1; 151 return -1;
152 if (pmd_huge(*pmd_k))
153 return 0; /* support TILE huge_vmap() API */
154 pte_k = pte_offset_kernel(pmd_k, address); 152 pte_k = pte_offset_kernel(pmd_k, address);
155 if (!pte_present(*pte_k)) 153 if (!pte_present(*pte_k))
156 return -1; 154 return -1;
@@ -280,10 +278,9 @@ static int handle_page_fault(struct pt_regs *regs,
280 if (!is_page_fault) 278 if (!is_page_fault)
281 write = 1; 279 write = 1;
282 280
283 flags = (FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE | 281 flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
284 (write ? FAULT_FLAG_WRITE : 0));
285 282
286 is_kernel_mode = (EX1_PL(regs->ex1) != USER_PL); 283 is_kernel_mode = !user_mode(regs);
287 284
288 tsk = validate_current(); 285 tsk = validate_current();
289 286
@@ -365,6 +362,9 @@ static int handle_page_fault(struct pt_regs *regs,
365 goto bad_area_nosemaphore; 362 goto bad_area_nosemaphore;
366 } 363 }
367 364
365 if (!is_kernel_mode)
366 flags |= FAULT_FLAG_USER;
367
368 /* 368 /*
369 * When running in the kernel we expect faults to occur only to 369 * When running in the kernel we expect faults to occur only to
370 * addresses in user space. All other faults represent errors in the 370 * addresses in user space. All other faults represent errors in the
@@ -425,12 +425,12 @@ good_area:
425#endif 425#endif
426 if (!(vma->vm_flags & VM_WRITE)) 426 if (!(vma->vm_flags & VM_WRITE))
427 goto bad_area; 427 goto bad_area;
428 flags |= FAULT_FLAG_WRITE;
428 } else { 429 } else {
429 if (!is_page_fault || !(vma->vm_flags & VM_READ)) 430 if (!is_page_fault || !(vma->vm_flags & VM_READ))
430 goto bad_area; 431 goto bad_area;
431 } 432 }
432 433
433 survive:
434 /* 434 /*
435 * If for any reason at all we couldn't handle the fault, 435 * If for any reason at all we couldn't handle the fault,
436 * make sure we exit gracefully rather than endlessly redo 436 * make sure we exit gracefully rather than endlessly redo
@@ -466,28 +466,15 @@ good_area:
466 } 466 }
467 } 467 }
468 468
469#if CHIP_HAS_TILE_DMA() || CHIP_HAS_SN_PROC()
470 /*
471 * If this was an asynchronous fault,
472 * restart the appropriate engine.
473 */
474 switch (fault_num) {
475#if CHIP_HAS_TILE_DMA() 469#if CHIP_HAS_TILE_DMA()
470 /* If this was a DMA TLB fault, restart the DMA engine. */
471 switch (fault_num) {
476 case INT_DMATLB_MISS: 472 case INT_DMATLB_MISS:
477 case INT_DMATLB_MISS_DWNCL: 473 case INT_DMATLB_MISS_DWNCL:
478 case INT_DMATLB_ACCESS: 474 case INT_DMATLB_ACCESS:
479 case INT_DMATLB_ACCESS_DWNCL: 475 case INT_DMATLB_ACCESS_DWNCL:
480 __insn_mtspr(SPR_DMA_CTR, SPR_DMA_CTR__REQUEST_MASK); 476 __insn_mtspr(SPR_DMA_CTR, SPR_DMA_CTR__REQUEST_MASK);
481 break; 477 break;
482#endif
483#if CHIP_HAS_SN_PROC()
484 case INT_SNITLB_MISS:
485 case INT_SNITLB_MISS_DWNCL:
486 __insn_mtspr(SPR_SNCTL,
487 __insn_mfspr(SPR_SNCTL) &
488 ~SPR_SNCTL__FRZPROC_MASK);
489 break;
490#endif
491 } 478 }
492#endif 479#endif
493 480
@@ -568,11 +555,6 @@ no_context:
568 */ 555 */
569out_of_memory: 556out_of_memory:
570 up_read(&mm->mmap_sem); 557 up_read(&mm->mmap_sem);
571 if (is_global_init(tsk)) {
572 yield();
573 down_read(&mm->mmap_sem);
574 goto survive;
575 }
576 if (is_kernel_mode) 558 if (is_kernel_mode)
577 goto no_context; 559 goto no_context;
578 pagefault_out_of_memory(); 560 pagefault_out_of_memory();
@@ -722,8 +704,60 @@ void do_page_fault(struct pt_regs *regs, int fault_num,
722{ 704{
723 int is_page_fault; 705 int is_page_fault;
724 706
707#ifdef CONFIG_KPROBES
708 /*
709 * This is to notify the fault handler of the kprobes. The
710 * exception code is redundant as it is also carried in REGS,
711 * but we pass it anyhow.
712 */
713 if (notify_die(DIE_PAGE_FAULT, "page fault", regs, -1,
714 regs->faultnum, SIGSEGV) == NOTIFY_STOP)
715 return;
716#endif
717
718#ifdef __tilegx__
719 /*
720 * We don't need early do_page_fault_ics() support, since unlike
721 * Pro we don't need to worry about unlocking the atomic locks.
722 * There is only one current case in GX where we touch any memory
723 * under ICS other than our own kernel stack, and we handle that
724 * here. (If we crash due to trying to touch our own stack,
725 * we're in too much trouble for C code to help out anyway.)
726 */
727 if (write & ~1) {
728 unsigned long pc = write & ~1;
729 if (pc >= (unsigned long) __start_unalign_asm_code &&
730 pc < (unsigned long) __end_unalign_asm_code) {
731 struct thread_info *ti = current_thread_info();
732 /*
733 * Our EX_CONTEXT is still what it was from the
734 * initial unalign exception, but now we've faulted
735 * on the JIT page. We would like to complete the
736 * page fault however is appropriate, and then retry
737 * the instruction that caused the unalign exception.
738 * Our state has been "corrupted" by setting the low
739 * bit in "sp", and stashing r0..r3 in the
740 * thread_info area, so we revert all of that, then
741 * continue as if this were a normal page fault.
742 */
743 regs->sp &= ~1UL;
744 regs->regs[0] = ti->unalign_jit_tmp[0];
745 regs->regs[1] = ti->unalign_jit_tmp[1];
746 regs->regs[2] = ti->unalign_jit_tmp[2];
747 regs->regs[3] = ti->unalign_jit_tmp[3];
748 write &= 1;
749 } else {
750 pr_alert("%s/%d: ICS set at page fault at %#lx: %#lx\n",
751 current->comm, current->pid, pc, address);
752 show_regs(regs);
753 do_group_exit(SIGKILL);
754 return;
755 }
756 }
757#else
725 /* This case should have been handled by do_page_fault_ics(). */ 758 /* This case should have been handled by do_page_fault_ics(). */
726 BUG_ON(write & ~1); 759 BUG_ON(write & ~1);
760#endif
727 761
728#if CHIP_HAS_TILE_DMA() 762#if CHIP_HAS_TILE_DMA()
729 /* 763 /*
@@ -752,10 +786,6 @@ void do_page_fault(struct pt_regs *regs, int fault_num,
752 case INT_DMATLB_MISS: 786 case INT_DMATLB_MISS:
753 case INT_DMATLB_MISS_DWNCL: 787 case INT_DMATLB_MISS_DWNCL:
754#endif 788#endif
755#if CHIP_HAS_SN_PROC()
756 case INT_SNITLB_MISS:
757 case INT_SNITLB_MISS_DWNCL:
758#endif
759 is_page_fault = 1; 789 is_page_fault = 1;
760 break; 790 break;
761 791
@@ -771,8 +801,8 @@ void do_page_fault(struct pt_regs *regs, int fault_num,
771 panic("Bad fault number %d in do_page_fault", fault_num); 801 panic("Bad fault number %d in do_page_fault", fault_num);
772 } 802 }
773 803
774#if CHIP_HAS_TILE_DMA() || CHIP_HAS_SN_PROC() 804#if CHIP_HAS_TILE_DMA()
775 if (EX1_PL(regs->ex1) != USER_PL) { 805 if (!user_mode(regs)) {
776 struct async_tlb *async; 806 struct async_tlb *async;
777 switch (fault_num) { 807 switch (fault_num) {
778#if CHIP_HAS_TILE_DMA() 808#if CHIP_HAS_TILE_DMA()
@@ -783,12 +813,6 @@ void do_page_fault(struct pt_regs *regs, int fault_num,
783 async = &current->thread.dma_async_tlb; 813 async = &current->thread.dma_async_tlb;
784 break; 814 break;
785#endif 815#endif
786#if CHIP_HAS_SN_PROC()
787 case INT_SNITLB_MISS:
788 case INT_SNITLB_MISS_DWNCL:
789 async = &current->thread.sn_async_tlb;
790 break;
791#endif
792 default: 816 default:
793 async = NULL; 817 async = NULL;
794 } 818 }
@@ -821,14 +845,22 @@ void do_page_fault(struct pt_regs *regs, int fault_num,
821} 845}
822 846
823 847
824#if CHIP_HAS_TILE_DMA() || CHIP_HAS_SN_PROC() 848#if CHIP_HAS_TILE_DMA()
825/* 849/*
826 * Check an async_tlb structure to see if a deferred fault is waiting, 850 * This routine effectively re-issues asynchronous page faults
827 * and if so pass it to the page-fault code. 851 * when we are returning to user space.
828 */ 852 */
829static void handle_async_page_fault(struct pt_regs *regs, 853void do_async_page_fault(struct pt_regs *regs)
830 struct async_tlb *async)
831{ 854{
855 struct async_tlb *async = &current->thread.dma_async_tlb;
856
857 /*
858 * Clear thread flag early. If we re-interrupt while processing
859 * code here, we will reset it and recall this routine before
860 * returning to user space.
861 */
862 clear_thread_flag(TIF_ASYNC_TLB);
863
832 if (async->fault_num) { 864 if (async->fault_num) {
833 /* 865 /*
834 * Clear async->fault_num before calling the page-fault 866 * Clear async->fault_num before calling the page-fault
@@ -842,35 +874,15 @@ static void handle_async_page_fault(struct pt_regs *regs,
842 async->address, async->is_write); 874 async->address, async->is_write);
843 } 875 }
844} 876}
845 877#endif /* CHIP_HAS_TILE_DMA() */
846/*
847 * This routine effectively re-issues asynchronous page faults
848 * when we are returning to user space.
849 */
850void do_async_page_fault(struct pt_regs *regs)
851{
852 /*
853 * Clear thread flag early. If we re-interrupt while processing
854 * code here, we will reset it and recall this routine before
855 * returning to user space.
856 */
857 clear_thread_flag(TIF_ASYNC_TLB);
858
859#if CHIP_HAS_TILE_DMA()
860 handle_async_page_fault(regs, &current->thread.dma_async_tlb);
861#endif
862#if CHIP_HAS_SN_PROC()
863 handle_async_page_fault(regs, &current->thread.sn_async_tlb);
864#endif
865}
866#endif /* CHIP_HAS_TILE_DMA() || CHIP_HAS_SN_PROC() */
867 878
868 879
869void vmalloc_sync_all(void) 880void vmalloc_sync_all(void)
870{ 881{
871#ifdef __tilegx__ 882#ifdef __tilegx__
872 /* Currently all L1 kernel pmd's are static and shared. */ 883 /* Currently all L1 kernel pmd's are static and shared. */
873 BUG_ON(pgd_index(VMALLOC_END) != pgd_index(VMALLOC_START)); 884 BUILD_BUG_ON(pgd_index(VMALLOC_END - PAGE_SIZE) !=
885 pgd_index(VMALLOC_START));
874#else 886#else
875 /* 887 /*
876 * Note that races in the updates of insync and start aren't 888 * Note that races in the updates of insync and start aren't
diff --git a/arch/tile/mm/highmem.c b/arch/tile/mm/highmem.c
index 347d123b14be..0dc218294770 100644
--- a/arch/tile/mm/highmem.c
+++ b/arch/tile/mm/highmem.c
@@ -114,7 +114,6 @@ static void kmap_atomic_register(struct page *page, int type,
114 114
115 list_add(&amp->list, &amp_list); 115 list_add(&amp->list, &amp_list);
116 set_pte(ptep, pteval); 116 set_pte(ptep, pteval);
117 arch_flush_lazy_mmu_mode();
118 117
119 spin_unlock(&amp_lock); 118 spin_unlock(&amp_lock);
120 homecache_kpte_unlock(flags); 119 homecache_kpte_unlock(flags);
@@ -259,7 +258,6 @@ void __kunmap_atomic(void *kvaddr)
259 BUG_ON(vaddr >= (unsigned long)high_memory); 258 BUG_ON(vaddr >= (unsigned long)high_memory);
260 } 259 }
261 260
262 arch_flush_lazy_mmu_mode();
263 pagefault_enable(); 261 pagefault_enable();
264} 262}
265EXPORT_SYMBOL(__kunmap_atomic); 263EXPORT_SYMBOL(__kunmap_atomic);
diff --git a/arch/tile/mm/homecache.c b/arch/tile/mm/homecache.c
index 1ae911939a18..004ba568d93f 100644
--- a/arch/tile/mm/homecache.c
+++ b/arch/tile/mm/homecache.c
@@ -43,12 +43,9 @@
43#include "migrate.h" 43#include "migrate.h"
44 44
45 45
46#if CHIP_HAS_COHERENT_LOCAL_CACHE()
47
48/* 46/*
49 * The noallocl2 option suppresses all use of the L2 cache to cache 47 * The noallocl2 option suppresses all use of the L2 cache to cache
50 * locally from a remote home. There's no point in using it if we 48 * locally from a remote home.
51 * don't have coherent local caching, though.
52 */ 49 */
53static int __write_once noallocl2; 50static int __write_once noallocl2;
54static int __init set_noallocl2(char *str) 51static int __init set_noallocl2(char *str)
@@ -58,12 +55,6 @@ static int __init set_noallocl2(char *str)
58} 55}
59early_param("noallocl2", set_noallocl2); 56early_param("noallocl2", set_noallocl2);
60 57
61#else
62
63#define noallocl2 0
64
65#endif
66
67 58
68/* 59/*
69 * Update the irq_stat for cpus that we are going to interrupt 60 * Update the irq_stat for cpus that we are going to interrupt
@@ -172,7 +163,8 @@ void flush_remote(unsigned long cache_pfn, unsigned long cache_control,
172 163
173static void homecache_finv_page_va(void* va, int home) 164static void homecache_finv_page_va(void* va, int home)
174{ 165{
175 if (home == smp_processor_id()) { 166 int cpu = get_cpu();
167 if (home == cpu) {
176 finv_buffer_local(va, PAGE_SIZE); 168 finv_buffer_local(va, PAGE_SIZE);
177 } else if (home == PAGE_HOME_HASH) { 169 } else if (home == PAGE_HOME_HASH) {
178 finv_buffer_remote(va, PAGE_SIZE, 1); 170 finv_buffer_remote(va, PAGE_SIZE, 1);
@@ -180,6 +172,7 @@ static void homecache_finv_page_va(void* va, int home)
180 BUG_ON(home < 0 || home >= NR_CPUS); 172 BUG_ON(home < 0 || home >= NR_CPUS);
181 finv_buffer_remote(va, PAGE_SIZE, 0); 173 finv_buffer_remote(va, PAGE_SIZE, 0);
182 } 174 }
175 put_cpu();
183} 176}
184 177
185void homecache_finv_map_page(struct page *page, int home) 178void homecache_finv_map_page(struct page *page, int home)
@@ -198,7 +191,7 @@ void homecache_finv_map_page(struct page *page, int home)
198#else 191#else
199 va = __fix_to_virt(FIX_HOMECACHE_BEGIN + smp_processor_id()); 192 va = __fix_to_virt(FIX_HOMECACHE_BEGIN + smp_processor_id());
200#endif 193#endif
201 ptep = virt_to_pte(NULL, (unsigned long)va); 194 ptep = virt_to_kpte(va);
202 pte = pfn_pte(page_to_pfn(page), PAGE_KERNEL); 195 pte = pfn_pte(page_to_pfn(page), PAGE_KERNEL);
203 __set_pte(ptep, pte_set_home(pte, home)); 196 __set_pte(ptep, pte_set_home(pte, home));
204 homecache_finv_page_va((void *)va, home); 197 homecache_finv_page_va((void *)va, home);
@@ -263,10 +256,8 @@ static int pte_to_home(pte_t pte)
263 return PAGE_HOME_INCOHERENT; 256 return PAGE_HOME_INCOHERENT;
264 case HV_PTE_MODE_UNCACHED: 257 case HV_PTE_MODE_UNCACHED:
265 return PAGE_HOME_UNCACHED; 258 return PAGE_HOME_UNCACHED;
266#if CHIP_HAS_CBOX_HOME_MAP()
267 case HV_PTE_MODE_CACHE_HASH_L3: 259 case HV_PTE_MODE_CACHE_HASH_L3:
268 return PAGE_HOME_HASH; 260 return PAGE_HOME_HASH;
269#endif
270 } 261 }
271 panic("Bad PTE %#llx\n", pte.val); 262 panic("Bad PTE %#llx\n", pte.val);
272} 263}
@@ -323,20 +314,16 @@ pte_t pte_set_home(pte_t pte, int home)
323 HV_PTE_MODE_CACHE_NO_L3); 314 HV_PTE_MODE_CACHE_NO_L3);
324 } 315 }
325 } else 316 } else
326#if CHIP_HAS_CBOX_HOME_MAP()
327 if (hash_default) 317 if (hash_default)
328 pte = hv_pte_set_mode(pte, HV_PTE_MODE_CACHE_HASH_L3); 318 pte = hv_pte_set_mode(pte, HV_PTE_MODE_CACHE_HASH_L3);
329 else 319 else
330#endif
331 pte = hv_pte_set_mode(pte, HV_PTE_MODE_CACHE_NO_L3); 320 pte = hv_pte_set_mode(pte, HV_PTE_MODE_CACHE_NO_L3);
332 pte = hv_pte_set_nc(pte); 321 pte = hv_pte_set_nc(pte);
333 break; 322 break;
334 323
335#if CHIP_HAS_CBOX_HOME_MAP()
336 case PAGE_HOME_HASH: 324 case PAGE_HOME_HASH:
337 pte = hv_pte_set_mode(pte, HV_PTE_MODE_CACHE_HASH_L3); 325 pte = hv_pte_set_mode(pte, HV_PTE_MODE_CACHE_HASH_L3);
338 break; 326 break;
339#endif
340 327
341 default: 328 default:
342 BUG_ON(home < 0 || home >= NR_CPUS || 329 BUG_ON(home < 0 || home >= NR_CPUS ||
@@ -346,7 +333,6 @@ pte_t pte_set_home(pte_t pte, int home)
346 break; 333 break;
347 } 334 }
348 335
349#if CHIP_HAS_NC_AND_NOALLOC_BITS()
350 if (noallocl2) 336 if (noallocl2)
351 pte = hv_pte_set_no_alloc_l2(pte); 337 pte = hv_pte_set_no_alloc_l2(pte);
352 338
@@ -355,7 +341,6 @@ pte_t pte_set_home(pte_t pte, int home)
355 hv_pte_get_mode(pte) == HV_PTE_MODE_CACHE_NO_L3) { 341 hv_pte_get_mode(pte) == HV_PTE_MODE_CACHE_NO_L3) {
356 pte = hv_pte_set_mode(pte, HV_PTE_MODE_UNCACHED); 342 pte = hv_pte_set_mode(pte, HV_PTE_MODE_UNCACHED);
357 } 343 }
358#endif
359 344
360 /* Checking this case here gives a better panic than from the hv. */ 345 /* Checking this case here gives a better panic than from the hv. */
361 BUG_ON(hv_pte_get_mode(pte) == 0); 346 BUG_ON(hv_pte_get_mode(pte) == 0);
@@ -371,19 +356,13 @@ EXPORT_SYMBOL(pte_set_home);
371 * so they're not suitable for anything but infrequent use. 356 * so they're not suitable for anything but infrequent use.
372 */ 357 */
373 358
374#if CHIP_HAS_CBOX_HOME_MAP()
375static inline int initial_page_home(void) { return PAGE_HOME_HASH; }
376#else
377static inline int initial_page_home(void) { return 0; }
378#endif
379
380int page_home(struct page *page) 359int page_home(struct page *page)
381{ 360{
382 if (PageHighMem(page)) { 361 if (PageHighMem(page)) {
383 return initial_page_home(); 362 return PAGE_HOME_HASH;
384 } else { 363 } else {
385 unsigned long kva = (unsigned long)page_address(page); 364 unsigned long kva = (unsigned long)page_address(page);
386 return pte_to_home(*virt_to_pte(NULL, kva)); 365 return pte_to_home(*virt_to_kpte(kva));
387 } 366 }
388} 367}
389EXPORT_SYMBOL(page_home); 368EXPORT_SYMBOL(page_home);
@@ -402,7 +381,7 @@ void homecache_change_page_home(struct page *page, int order, int home)
402 NULL, 0); 381 NULL, 0);
403 382
404 for (i = 0; i < pages; ++i, kva += PAGE_SIZE) { 383 for (i = 0; i < pages; ++i, kva += PAGE_SIZE) {
405 pte_t *ptep = virt_to_pte(NULL, kva); 384 pte_t *ptep = virt_to_kpte(kva);
406 pte_t pteval = *ptep; 385 pte_t pteval = *ptep;
407 BUG_ON(!pte_present(pteval) || pte_huge(pteval)); 386 BUG_ON(!pte_present(pteval) || pte_huge(pteval));
408 __set_pte(ptep, pte_set_home(pteval, home)); 387 __set_pte(ptep, pte_set_home(pteval, home));
@@ -436,7 +415,7 @@ struct page *homecache_alloc_pages_node(int nid, gfp_t gfp_mask,
436void __homecache_free_pages(struct page *page, unsigned int order) 415void __homecache_free_pages(struct page *page, unsigned int order)
437{ 416{
438 if (put_page_testzero(page)) { 417 if (put_page_testzero(page)) {
439 homecache_change_page_home(page, order, initial_page_home()); 418 homecache_change_page_home(page, order, PAGE_HOME_HASH);
440 if (order == 0) { 419 if (order == 0) {
441 free_hot_cold_page(page, 0); 420 free_hot_cold_page(page, 0);
442 } else { 421 } else {
diff --git a/arch/tile/mm/hugetlbpage.c b/arch/tile/mm/hugetlbpage.c
index 650ccff8378c..0cb3bbaa580c 100644
--- a/arch/tile/mm/hugetlbpage.c
+++ b/arch/tile/mm/hugetlbpage.c
@@ -49,38 +49,6 @@ int huge_shift[HUGE_SHIFT_ENTRIES] = {
49#endif 49#endif
50}; 50};
51 51
52/*
53 * This routine is a hybrid of pte_alloc_map() and pte_alloc_kernel().
54 * It assumes that L2 PTEs are never in HIGHMEM (we don't support that).
55 * It locks the user pagetable, and bumps up the mm->nr_ptes field,
56 * but otherwise allocate the page table using the kernel versions.
57 */
58static pte_t *pte_alloc_hugetlb(struct mm_struct *mm, pmd_t *pmd,
59 unsigned long address)
60{
61 pte_t *new;
62
63 if (pmd_none(*pmd)) {
64 new = pte_alloc_one_kernel(mm, address);
65 if (!new)
66 return NULL;
67
68 smp_wmb(); /* See comment in __pte_alloc */
69
70 spin_lock(&mm->page_table_lock);
71 if (likely(pmd_none(*pmd))) { /* Has another populated it ? */
72 mm->nr_ptes++;
73 pmd_populate_kernel(mm, pmd, new);
74 new = NULL;
75 } else
76 VM_BUG_ON(pmd_trans_splitting(*pmd));
77 spin_unlock(&mm->page_table_lock);
78 if (new)
79 pte_free_kernel(mm, new);
80 }
81
82 return pte_offset_kernel(pmd, address);
83}
84#endif 52#endif
85 53
86pte_t *huge_pte_alloc(struct mm_struct *mm, 54pte_t *huge_pte_alloc(struct mm_struct *mm,
@@ -109,7 +77,7 @@ pte_t *huge_pte_alloc(struct mm_struct *mm,
109 else { 77 else {
110 if (sz != PAGE_SIZE << huge_shift[HUGE_SHIFT_PAGE]) 78 if (sz != PAGE_SIZE << huge_shift[HUGE_SHIFT_PAGE])
111 panic("Unexpected page size %#lx\n", sz); 79 panic("Unexpected page size %#lx\n", sz);
112 return pte_alloc_hugetlb(mm, pmd, addr); 80 return pte_alloc_map(mm, NULL, pmd, addr);
113 } 81 }
114 } 82 }
115#else 83#else
@@ -144,14 +112,14 @@ pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
144 112
145 /* Get the top-level page table entry. */ 113 /* Get the top-level page table entry. */
146 pgd = (pgd_t *)get_pte((pte_t *)mm->pgd, pgd_index(addr), 0); 114 pgd = (pgd_t *)get_pte((pte_t *)mm->pgd, pgd_index(addr), 0);
147 if (!pgd_present(*pgd))
148 return NULL;
149 115
150 /* We don't have four levels. */ 116 /* We don't have four levels. */
151 pud = pud_offset(pgd, addr); 117 pud = pud_offset(pgd, addr);
152#ifndef __PAGETABLE_PUD_FOLDED 118#ifndef __PAGETABLE_PUD_FOLDED
153# error support fourth page table level 119# error support fourth page table level
154#endif 120#endif
121 if (!pud_present(*pud))
122 return NULL;
155 123
156 /* Check for an L0 huge PTE, if we have three levels. */ 124 /* Check for an L0 huge PTE, if we have three levels. */
157#ifndef __PAGETABLE_PMD_FOLDED 125#ifndef __PAGETABLE_PMD_FOLDED
@@ -198,6 +166,11 @@ int pud_huge(pud_t pud)
198 return !!(pud_val(pud) & _PAGE_HUGE_PAGE); 166 return !!(pud_val(pud) & _PAGE_HUGE_PAGE);
199} 167}
200 168
169int pmd_huge_support(void)
170{
171 return 1;
172}
173
201struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address, 174struct page *follow_huge_pmd(struct mm_struct *mm, unsigned long address,
202 pmd_t *pmd, int write) 175 pmd_t *pmd, int write)
203{ 176{
diff --git a/arch/tile/mm/init.c b/arch/tile/mm/init.c
index e182958c707d..0fa1acfac79a 100644
--- a/arch/tile/mm/init.c
+++ b/arch/tile/mm/init.c
@@ -106,10 +106,8 @@ pte_t *get_prealloc_pte(unsigned long pfn)
106 */ 106 */
107static int initial_heap_home(void) 107static int initial_heap_home(void)
108{ 108{
109#if CHIP_HAS_CBOX_HOME_MAP()
110 if (hash_default) 109 if (hash_default)
111 return PAGE_HOME_HASH; 110 return PAGE_HOME_HASH;
112#endif
113 return smp_processor_id(); 111 return smp_processor_id();
114} 112}
115 113
@@ -190,14 +188,11 @@ static void __init page_table_range_init(unsigned long start,
190} 188}
191 189
192 190
193#if CHIP_HAS_CBOX_HOME_MAP()
194
195static int __initdata ktext_hash = 1; /* .text pages */ 191static int __initdata ktext_hash = 1; /* .text pages */
196static int __initdata kdata_hash = 1; /* .data and .bss pages */ 192static int __initdata kdata_hash = 1; /* .data and .bss pages */
197int __write_once hash_default = 1; /* kernel allocator pages */ 193int __write_once hash_default = 1; /* kernel allocator pages */
198EXPORT_SYMBOL(hash_default); 194EXPORT_SYMBOL(hash_default);
199int __write_once kstack_hash = 1; /* if no homecaching, use h4h */ 195int __write_once kstack_hash = 1; /* if no homecaching, use h4h */
200#endif /* CHIP_HAS_CBOX_HOME_MAP */
201 196
202/* 197/*
203 * CPUs to use to for striping the pages of kernel data. If hash-for-home 198 * CPUs to use to for striping the pages of kernel data. If hash-for-home
@@ -215,14 +210,12 @@ int __write_once kdata_huge; /* if no homecaching, small pages */
215static pgprot_t __init construct_pgprot(pgprot_t prot, int home) 210static pgprot_t __init construct_pgprot(pgprot_t prot, int home)
216{ 211{
217 prot = pte_set_home(prot, home); 212 prot = pte_set_home(prot, home);
218#if CHIP_HAS_CBOX_HOME_MAP()
219 if (home == PAGE_HOME_IMMUTABLE) { 213 if (home == PAGE_HOME_IMMUTABLE) {
220 if (ktext_hash) 214 if (ktext_hash)
221 prot = hv_pte_set_mode(prot, HV_PTE_MODE_CACHE_HASH_L3); 215 prot = hv_pte_set_mode(prot, HV_PTE_MODE_CACHE_HASH_L3);
222 else 216 else
223 prot = hv_pte_set_mode(prot, HV_PTE_MODE_CACHE_NO_L3); 217 prot = hv_pte_set_mode(prot, HV_PTE_MODE_CACHE_NO_L3);
224 } 218 }
225#endif
226 return prot; 219 return prot;
227} 220}
228 221
@@ -234,22 +227,17 @@ static pgprot_t __init init_pgprot(ulong address)
234{ 227{
235 int cpu; 228 int cpu;
236 unsigned long page; 229 unsigned long page;
237 enum { CODE_DELTA = MEM_SV_INTRPT - PAGE_OFFSET }; 230 enum { CODE_DELTA = MEM_SV_START - PAGE_OFFSET };
238 231
239#if CHIP_HAS_CBOX_HOME_MAP()
240 /* For kdata=huge, everything is just hash-for-home. */ 232 /* For kdata=huge, everything is just hash-for-home. */
241 if (kdata_huge) 233 if (kdata_huge)
242 return construct_pgprot(PAGE_KERNEL, PAGE_HOME_HASH); 234 return construct_pgprot(PAGE_KERNEL, PAGE_HOME_HASH);
243#endif
244 235
245 /* We map the aliased pages of permanent text inaccessible. */ 236 /* We map the aliased pages of permanent text inaccessible. */
246 if (address < (ulong) _sinittext - CODE_DELTA) 237 if (address < (ulong) _sinittext - CODE_DELTA)
247 return PAGE_NONE; 238 return PAGE_NONE;
248 239
249 /* 240 /* We map read-only data non-coherent for performance. */
250 * We map read-only data non-coherent for performance. We could
251 * use neighborhood caching on TILE64, but it's not clear it's a win.
252 */
253 if ((address >= (ulong) __start_rodata && 241 if ((address >= (ulong) __start_rodata &&
254 address < (ulong) __end_rodata) || 242 address < (ulong) __end_rodata) ||
255 address == (ulong) empty_zero_page) { 243 address == (ulong) empty_zero_page) {
@@ -257,12 +245,10 @@ static pgprot_t __init init_pgprot(ulong address)
257 } 245 }
258 246
259#ifndef __tilegx__ 247#ifndef __tilegx__
260#if !ATOMIC_LOCKS_FOUND_VIA_TABLE()
261 /* Force the atomic_locks[] array page to be hash-for-home. */ 248 /* Force the atomic_locks[] array page to be hash-for-home. */
262 if (address == (ulong) atomic_locks) 249 if (address == (ulong) atomic_locks)
263 return construct_pgprot(PAGE_KERNEL, PAGE_HOME_HASH); 250 return construct_pgprot(PAGE_KERNEL, PAGE_HOME_HASH);
264#endif 251#endif
265#endif
266 252
267 /* 253 /*
268 * Everything else that isn't data or bss is heap, so mark it 254 * Everything else that isn't data or bss is heap, so mark it
@@ -280,19 +266,9 @@ static pgprot_t __init init_pgprot(ulong address)
280 if (address >= (ulong) _end || address < (ulong) _einitdata) 266 if (address >= (ulong) _end || address < (ulong) _einitdata)
281 return construct_pgprot(PAGE_KERNEL, initial_heap_home()); 267 return construct_pgprot(PAGE_KERNEL, initial_heap_home());
282 268
283#if CHIP_HAS_CBOX_HOME_MAP()
284 /* Use hash-for-home if requested for data/bss. */ 269 /* Use hash-for-home if requested for data/bss. */
285 if (kdata_hash) 270 if (kdata_hash)
286 return construct_pgprot(PAGE_KERNEL, PAGE_HOME_HASH); 271 return construct_pgprot(PAGE_KERNEL, PAGE_HOME_HASH);
287#endif
288
289 /*
290 * Make the w1data homed like heap to start with, to avoid
291 * making it part of the page-striped data area when we're just
292 * going to convert it to read-only soon anyway.
293 */
294 if (address >= (ulong)__w1data_begin && address < (ulong)__w1data_end)
295 return construct_pgprot(PAGE_KERNEL, initial_heap_home());
296 272
297 /* 273 /*
298 * Otherwise we just hand out consecutive cpus. To avoid 274 * Otherwise we just hand out consecutive cpus. To avoid
@@ -301,7 +277,7 @@ static pgprot_t __init init_pgprot(ulong address)
301 * the requested address, while walking cpu home around kdata_mask. 277 * the requested address, while walking cpu home around kdata_mask.
302 * This is typically no more than a dozen or so iterations. 278 * This is typically no more than a dozen or so iterations.
303 */ 279 */
304 page = (((ulong)__w1data_end) + PAGE_SIZE - 1) & PAGE_MASK; 280 page = (((ulong)__end_rodata) + PAGE_SIZE - 1) & PAGE_MASK;
305 BUG_ON(address < page || address >= (ulong)_end); 281 BUG_ON(address < page || address >= (ulong)_end);
306 cpu = cpumask_first(&kdata_mask); 282 cpu = cpumask_first(&kdata_mask);
307 for (; page < address; page += PAGE_SIZE) { 283 for (; page < address; page += PAGE_SIZE) {
@@ -311,11 +287,9 @@ static pgprot_t __init init_pgprot(ulong address)
311 if (page == (ulong)empty_zero_page) 287 if (page == (ulong)empty_zero_page)
312 continue; 288 continue;
313#ifndef __tilegx__ 289#ifndef __tilegx__
314#if !ATOMIC_LOCKS_FOUND_VIA_TABLE()
315 if (page == (ulong)atomic_locks) 290 if (page == (ulong)atomic_locks)
316 continue; 291 continue;
317#endif 292#endif
318#endif
319 cpu = cpumask_next(cpu, &kdata_mask); 293 cpu = cpumask_next(cpu, &kdata_mask);
320 if (cpu == NR_CPUS) 294 if (cpu == NR_CPUS)
321 cpu = cpumask_first(&kdata_mask); 295 cpu = cpumask_first(&kdata_mask);
@@ -358,7 +332,7 @@ static int __init setup_ktext(char *str)
358 332
359 ktext_arg_seen = 1; 333 ktext_arg_seen = 1;
360 334
361 /* Default setting on Tile64: use a huge page */ 335 /* Default setting: use a huge page */
362 if (strcmp(str, "huge") == 0) 336 if (strcmp(str, "huge") == 0)
363 pr_info("ktext: using one huge locally cached page\n"); 337 pr_info("ktext: using one huge locally cached page\n");
364 338
@@ -404,10 +378,8 @@ static inline pgprot_t ktext_set_nocache(pgprot_t prot)
404{ 378{
405 if (!ktext_nocache) 379 if (!ktext_nocache)
406 prot = hv_pte_set_nc(prot); 380 prot = hv_pte_set_nc(prot);
407#if CHIP_HAS_NC_AND_NOALLOC_BITS()
408 else 381 else
409 prot = hv_pte_set_no_alloc_l2(prot); 382 prot = hv_pte_set_no_alloc_l2(prot);
410#endif
411 return prot; 383 return prot;
412} 384}
413 385
@@ -440,7 +412,6 @@ static void __init kernel_physical_mapping_init(pgd_t *pgd_base)
440 struct cpumask kstripe_mask; 412 struct cpumask kstripe_mask;
441 int rc, i; 413 int rc, i;
442 414
443#if CHIP_HAS_CBOX_HOME_MAP()
444 if (ktext_arg_seen && ktext_hash) { 415 if (ktext_arg_seen && ktext_hash) {
445 pr_warning("warning: \"ktext\" boot argument ignored" 416 pr_warning("warning: \"ktext\" boot argument ignored"
446 " if \"kcache_hash\" sets up text hash-for-home\n"); 417 " if \"kcache_hash\" sets up text hash-for-home\n");
@@ -457,7 +428,6 @@ static void __init kernel_physical_mapping_init(pgd_t *pgd_base)
457 " kcache_hash=all or =allbutstack\n"); 428 " kcache_hash=all or =allbutstack\n");
458 kdata_huge = 0; 429 kdata_huge = 0;
459 } 430 }
460#endif
461 431
462 /* 432 /*
463 * Set up a mask for cpus to use for kernel striping. 433 * Set up a mask for cpus to use for kernel striping.
@@ -538,7 +508,7 @@ static void __init kernel_physical_mapping_init(pgd_t *pgd_base)
538 } 508 }
539 } 509 }
540 510
541 address = MEM_SV_INTRPT; 511 address = MEM_SV_START;
542 pmd = get_pmd(pgtables, address); 512 pmd = get_pmd(pgtables, address);
543 pfn = 0; /* code starts at PA 0 */ 513 pfn = 0; /* code starts at PA 0 */
544 if (ktext_small) { 514 if (ktext_small) {
@@ -585,13 +555,11 @@ static void __init kernel_physical_mapping_init(pgd_t *pgd_base)
585 } else { 555 } else {
586 pte_t pteval = pfn_pte(0, PAGE_KERNEL_EXEC); 556 pte_t pteval = pfn_pte(0, PAGE_KERNEL_EXEC);
587 pteval = pte_mkhuge(pteval); 557 pteval = pte_mkhuge(pteval);
588#if CHIP_HAS_CBOX_HOME_MAP()
589 if (ktext_hash) { 558 if (ktext_hash) {
590 pteval = hv_pte_set_mode(pteval, 559 pteval = hv_pte_set_mode(pteval,
591 HV_PTE_MODE_CACHE_HASH_L3); 560 HV_PTE_MODE_CACHE_HASH_L3);
592 pteval = ktext_set_nocache(pteval); 561 pteval = ktext_set_nocache(pteval);
593 } else 562 } else
594#endif /* CHIP_HAS_CBOX_HOME_MAP() */
595 if (cpumask_weight(&ktext_mask) == 1) { 563 if (cpumask_weight(&ktext_mask) == 1) {
596 pteval = set_remote_cache_cpu(pteval, 564 pteval = set_remote_cache_cpu(pteval,
597 cpumask_first(&ktext_mask)); 565 cpumask_first(&ktext_mask));
@@ -777,10 +745,7 @@ void __init paging_init(void)
777 745
778 kernel_physical_mapping_init(pgd_base); 746 kernel_physical_mapping_init(pgd_base);
779 747
780 /* 748 /* Fixed mappings, only the page table structure has to be created. */
781 * Fixed mappings, only the page table structure has to be
782 * created - mappings will be set by set_fixmap():
783 */
784 page_table_range_init(fix_to_virt(__end_of_fixed_addresses - 1), 749 page_table_range_init(fix_to_virt(__end_of_fixed_addresses - 1),
785 FIXADDR_TOP, pgd_base); 750 FIXADDR_TOP, pgd_base);
786 751
@@ -863,10 +828,6 @@ void __init mem_init(void)
863 printk(KERN_DEBUG " PKMAP %#lx - %#lx\n", 828 printk(KERN_DEBUG " PKMAP %#lx - %#lx\n",
864 PKMAP_BASE, PKMAP_ADDR(LAST_PKMAP) - 1); 829 PKMAP_BASE, PKMAP_ADDR(LAST_PKMAP) - 1);
865#endif 830#endif
866#ifdef CONFIG_HUGEVMAP
867 printk(KERN_DEBUG " HUGEMAP %#lx - %#lx\n",
868 HUGE_VMAP_BASE, HUGE_VMAP_END - 1);
869#endif
870 printk(KERN_DEBUG " VMALLOC %#lx - %#lx\n", 831 printk(KERN_DEBUG " VMALLOC %#lx - %#lx\n",
871 _VMALLOC_START, _VMALLOC_END - 1); 832 _VMALLOC_START, _VMALLOC_END - 1);
872#ifdef __tilegx__ 833#ifdef __tilegx__
@@ -941,26 +902,6 @@ void __init pgtable_cache_init(void)
941 panic("pgtable_cache_init(): Cannot create pgd cache"); 902 panic("pgtable_cache_init(): Cannot create pgd cache");
942} 903}
943 904
944#if !CHIP_HAS_COHERENT_LOCAL_CACHE()
945/*
946 * The __w1data area holds data that is only written during initialization,
947 * and is read-only and thus freely cacheable thereafter. Fix the page
948 * table entries that cover that region accordingly.
949 */
950static void mark_w1data_ro(void)
951{
952 /* Loop over page table entries */
953 unsigned long addr = (unsigned long)__w1data_begin;
954 BUG_ON((addr & (PAGE_SIZE-1)) != 0);
955 for (; addr <= (unsigned long)__w1data_end - 1; addr += PAGE_SIZE) {
956 unsigned long pfn = kaddr_to_pfn((void *)addr);
957 pte_t *ptep = virt_to_pte(NULL, addr);
958 BUG_ON(pte_huge(*ptep)); /* not relevant for kdata_huge */
959 set_pte_at(&init_mm, addr, ptep, pfn_pte(pfn, PAGE_KERNEL_RO));
960 }
961}
962#endif
963
964#ifdef CONFIG_DEBUG_PAGEALLOC 905#ifdef CONFIG_DEBUG_PAGEALLOC
965static long __write_once initfree; 906static long __write_once initfree;
966#else 907#else
@@ -1000,7 +941,7 @@ static void free_init_pages(char *what, unsigned long begin, unsigned long end)
1000 */ 941 */
1001 int pfn = kaddr_to_pfn((void *)addr); 942 int pfn = kaddr_to_pfn((void *)addr);
1002 struct page *page = pfn_to_page(pfn); 943 struct page *page = pfn_to_page(pfn);
1003 pte_t *ptep = virt_to_pte(NULL, addr); 944 pte_t *ptep = virt_to_kpte(addr);
1004 if (!initfree) { 945 if (!initfree) {
1005 /* 946 /*
1006 * If debugging page accesses then do not free 947 * If debugging page accesses then do not free
@@ -1024,15 +965,11 @@ static void free_init_pages(char *what, unsigned long begin, unsigned long end)
1024 965
1025void free_initmem(void) 966void free_initmem(void)
1026{ 967{
1027 const unsigned long text_delta = MEM_SV_INTRPT - PAGE_OFFSET; 968 const unsigned long text_delta = MEM_SV_START - PAGE_OFFSET;
1028 969
1029 /* 970 /*
1030 * Evict the dirty initdata on the boot cpu, evict the w1data 971 * Evict the cache on all cores to avoid incoherence.
1031 * wherever it's homed, and evict all the init code everywhere. 972 * We are guaranteed that no one will touch the init pages any more.
1032 * We are guaranteed that no one will touch the init pages any
1033 * more, and although other cpus may be touching the w1data,
1034 * we only actually change the caching on tile64, which won't
1035 * be keeping local copies in the other tiles' caches anyway.
1036 */ 973 */
1037 homecache_evict(&cpu_cacheable_map); 974 homecache_evict(&cpu_cacheable_map);
1038 975
@@ -1043,26 +980,11 @@ void free_initmem(void)
1043 980
1044 /* 981 /*
1045 * Free the pages mapped from 0xc0000000 that correspond to code 982 * Free the pages mapped from 0xc0000000 that correspond to code
1046 * pages from MEM_SV_INTRPT that we won't use again after init. 983 * pages from MEM_SV_START that we won't use again after init.
1047 */ 984 */
1048 free_init_pages("unused kernel text", 985 free_init_pages("unused kernel text",
1049 (unsigned long)_sinittext - text_delta, 986 (unsigned long)_sinittext - text_delta,
1050 (unsigned long)_einittext - text_delta); 987 (unsigned long)_einittext - text_delta);
1051
1052#if !CHIP_HAS_COHERENT_LOCAL_CACHE()
1053 /*
1054 * Upgrade the .w1data section to globally cached.
1055 * We don't do this on tilepro, since the cache architecture
1056 * pretty much makes it irrelevant, and in any case we end
1057 * up having racing issues with other tiles that may touch
1058 * the data after we flush the cache but before we update
1059 * the PTEs and flush the TLBs, causing sharer shootdowns
1060 * later. Even though this is to clean data, it seems like
1061 * an unnecessary complication.
1062 */
1063 mark_w1data_ro();
1064#endif
1065
1066 /* Do a global TLB flush so everyone sees the changes. */ 988 /* Do a global TLB flush so everyone sees the changes. */
1067 flush_tlb_all(); 989 flush_tlb_all();
1068} 990}
diff --git a/arch/tile/mm/migrate_32.S b/arch/tile/mm/migrate_32.S
index 5305814bf187..772085491bf9 100644
--- a/arch/tile/mm/migrate_32.S
+++ b/arch/tile/mm/migrate_32.S
@@ -136,7 +136,7 @@ STD_ENTRY(flush_and_install_context)
136 move r8, zero /* asids */ 136 move r8, zero /* asids */
137 move r9, zero /* asidcount */ 137 move r9, zero /* asidcount */
138 } 138 }
139 jal hv_flush_remote 139 jal _hv_flush_remote
140 bnz r0, .Ldone 140 bnz r0, .Ldone
141 141
142 /* Now install the new page table. */ 142 /* Now install the new page table. */
@@ -152,7 +152,7 @@ STD_ENTRY(flush_and_install_context)
152 move r4, r_asid 152 move r4, r_asid
153 moveli r5, HV_CTX_DIRECTIO | CTX_PAGE_FLAG 153 moveli r5, HV_CTX_DIRECTIO | CTX_PAGE_FLAG
154 } 154 }
155 jal hv_install_context 155 jal _hv_install_context
156 bnz r0, .Ldone 156 bnz r0, .Ldone
157 157
158 /* Finally, flush the TLB. */ 158 /* Finally, flush the TLB. */
diff --git a/arch/tile/mm/migrate_64.S b/arch/tile/mm/migrate_64.S
index 1d15b10833d1..a49eee38f872 100644
--- a/arch/tile/mm/migrate_64.S
+++ b/arch/tile/mm/migrate_64.S
@@ -123,7 +123,7 @@ STD_ENTRY(flush_and_install_context)
123 } 123 }
124 { 124 {
125 move r8, zero /* asidcount */ 125 move r8, zero /* asidcount */
126 jal hv_flush_remote 126 jal _hv_flush_remote
127 } 127 }
128 bnez r0, 1f 128 bnez r0, 1f
129 129
@@ -136,7 +136,7 @@ STD_ENTRY(flush_and_install_context)
136 move r2, r_asid 136 move r2, r_asid
137 moveli r3, HV_CTX_DIRECTIO | CTX_PAGE_FLAG 137 moveli r3, HV_CTX_DIRECTIO | CTX_PAGE_FLAG
138 } 138 }
139 jal hv_install_context 139 jal _hv_install_context
140 bnez r0, 1f 140 bnez r0, 1f
141 141
142 /* Finally, flush the TLB. */ 142 /* Finally, flush the TLB. */
diff --git a/arch/tile/mm/mmap.c b/arch/tile/mm/mmap.c
index d67d91ebf63e..851a94e6ae58 100644
--- a/arch/tile/mm/mmap.c
+++ b/arch/tile/mm/mmap.c
@@ -58,16 +58,36 @@ void arch_pick_mmap_layout(struct mm_struct *mm)
58#else 58#else
59 int is_32bit = 0; 59 int is_32bit = 0;
60#endif 60#endif
61 unsigned long random_factor = 0UL;
62
63 /*
64 * 8 bits of randomness in 32bit mmaps, 24 address space bits
65 * 12 bits of randomness in 64bit mmaps, 28 address space bits
66 */
67 if (current->flags & PF_RANDOMIZE) {
68 if (is_32bit)
69 random_factor = get_random_int() % (1<<8);
70 else
71 random_factor = get_random_int() % (1<<12);
72
73 random_factor <<= PAGE_SHIFT;
74 }
61 75
62 /* 76 /*
63 * Use standard layout if the expected stack growth is unlimited 77 * Use standard layout if the expected stack growth is unlimited
64 * or we are running native 64 bits. 78 * or we are running native 64 bits.
65 */ 79 */
66 if (!is_32bit || rlimit(RLIMIT_STACK) == RLIM_INFINITY) { 80 if (rlimit(RLIMIT_STACK) == RLIM_INFINITY) {
67 mm->mmap_base = TASK_UNMAPPED_BASE; 81 mm->mmap_base = TASK_UNMAPPED_BASE + random_factor;
68 mm->get_unmapped_area = arch_get_unmapped_area; 82 mm->get_unmapped_area = arch_get_unmapped_area;
69 } else { 83 } else {
70 mm->mmap_base = mmap_base(mm); 84 mm->mmap_base = mmap_base(mm);
71 mm->get_unmapped_area = arch_get_unmapped_area_topdown; 85 mm->get_unmapped_area = arch_get_unmapped_area_topdown;
72 } 86 }
73} 87}
88
89unsigned long arch_randomize_brk(struct mm_struct *mm)
90{
91 unsigned long range_end = mm->brk + 0x02000000;
92 return randomize_range(mm->brk, range_end, 0) ? : mm->brk;
93}
diff --git a/arch/tile/mm/pgtable.c b/arch/tile/mm/pgtable.c
index dfd63ce87327..4fd9ec0b58ed 100644
--- a/arch/tile/mm/pgtable.c
+++ b/arch/tile/mm/pgtable.c
@@ -83,55 +83,6 @@ void show_mem(unsigned int filter)
83 } 83 }
84} 84}
85 85
86/*
87 * Associate a virtual page frame with a given physical page frame
88 * and protection flags for that frame.
89 */
90static void set_pte_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags)
91{
92 pgd_t *pgd;
93 pud_t *pud;
94 pmd_t *pmd;
95 pte_t *pte;
96
97 pgd = swapper_pg_dir + pgd_index(vaddr);
98 if (pgd_none(*pgd)) {
99 BUG();
100 return;
101 }
102 pud = pud_offset(pgd, vaddr);
103 if (pud_none(*pud)) {
104 BUG();
105 return;
106 }
107 pmd = pmd_offset(pud, vaddr);
108 if (pmd_none(*pmd)) {
109 BUG();
110 return;
111 }
112 pte = pte_offset_kernel(pmd, vaddr);
113 /* <pfn,flags> stored as-is, to permit clearing entries */
114 set_pte(pte, pfn_pte(pfn, flags));
115
116 /*
117 * It's enough to flush this one mapping.
118 * This appears conservative since it is only called
119 * from __set_fixmap.
120 */
121 local_flush_tlb_page(NULL, vaddr, PAGE_SIZE);
122}
123
124void __set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t flags)
125{
126 unsigned long address = __fix_to_virt(idx);
127
128 if (idx >= __end_of_fixed_addresses) {
129 BUG();
130 return;
131 }
132 set_pte_pfn(address, phys >> PAGE_SHIFT, flags);
133}
134
135/** 86/**
136 * shatter_huge_page() - ensure a given address is mapped by a small page. 87 * shatter_huge_page() - ensure a given address is mapped by a small page.
137 * 88 *
@@ -176,8 +127,7 @@ void shatter_huge_page(unsigned long addr)
176 } 127 }
177 128
178 /* Shatter the huge page into the preallocated L2 page table. */ 129 /* Shatter the huge page into the preallocated L2 page table. */
179 pmd_populate_kernel(&init_mm, pmd, 130 pmd_populate_kernel(&init_mm, pmd, get_prealloc_pte(pmd_pfn(*pmd)));
180 get_prealloc_pte(pte_pfn(*(pte_t *)pmd)));
181 131
182#ifdef __PAGETABLE_PMD_FOLDED 132#ifdef __PAGETABLE_PMD_FOLDED
183 /* Walk every pgd on the system and update the pmd there. */ 133 /* Walk every pgd on the system and update the pmd there. */
@@ -374,6 +324,17 @@ void ptep_set_wrprotect(struct mm_struct *mm,
374 324
375#endif 325#endif
376 326
327/*
328 * Return a pointer to the PTE that corresponds to the given
329 * address in the given page table. A NULL page table just uses
330 * the standard kernel page table; the preferred API in this case
331 * is virt_to_kpte().
332 *
333 * The returned pointer can point to a huge page in other levels
334 * of the page table than the bottom, if the huge page is present
335 * in the page table. For bottom-level PTEs, the returned pointer
336 * can point to a PTE that is either present or not.
337 */
377pte_t *virt_to_pte(struct mm_struct* mm, unsigned long addr) 338pte_t *virt_to_pte(struct mm_struct* mm, unsigned long addr)
378{ 339{
379 pgd_t *pgd; 340 pgd_t *pgd;
@@ -387,13 +348,23 @@ pte_t *virt_to_pte(struct mm_struct* mm, unsigned long addr)
387 pud = pud_offset(pgd, addr); 348 pud = pud_offset(pgd, addr);
388 if (!pud_present(*pud)) 349 if (!pud_present(*pud))
389 return NULL; 350 return NULL;
351 if (pud_huge_page(*pud))
352 return (pte_t *)pud;
390 pmd = pmd_offset(pud, addr); 353 pmd = pmd_offset(pud, addr);
391 if (pmd_huge_page(*pmd))
392 return (pte_t *)pmd;
393 if (!pmd_present(*pmd)) 354 if (!pmd_present(*pmd))
394 return NULL; 355 return NULL;
356 if (pmd_huge_page(*pmd))
357 return (pte_t *)pmd;
395 return pte_offset_kernel(pmd, addr); 358 return pte_offset_kernel(pmd, addr);
396} 359}
360EXPORT_SYMBOL(virt_to_pte);
361
362pte_t *virt_to_kpte(unsigned long kaddr)
363{
364 BUG_ON(kaddr < PAGE_OFFSET);
365 return virt_to_pte(NULL, kaddr);
366}
367EXPORT_SYMBOL(virt_to_kpte);
397 368
398pgprot_t set_remote_cache_cpu(pgprot_t prot, int cpu) 369pgprot_t set_remote_cache_cpu(pgprot_t prot, int cpu)
399{ 370{
@@ -568,7 +539,7 @@ void __iomem *ioremap_prot(resource_size_t phys_addr, unsigned long size,
568 addr = area->addr; 539 addr = area->addr;
569 if (ioremap_page_range((unsigned long)addr, (unsigned long)addr + size, 540 if (ioremap_page_range((unsigned long)addr, (unsigned long)addr + size,
570 phys_addr, pgprot)) { 541 phys_addr, pgprot)) {
571 remove_vm_area((void *)(PAGE_MASK & (unsigned long) addr)); 542 free_vm_area(area);
572 return NULL; 543 return NULL;
573 } 544 }
574 return (__force void __iomem *) (offset + (char *)addr); 545 return (__force void __iomem *) (offset + (char *)addr);
diff --git a/arch/um/Kconfig.common b/arch/um/Kconfig.common
index bceee6623b00..8ddea1f8006a 100644
--- a/arch/um/Kconfig.common
+++ b/arch/um/Kconfig.common
@@ -6,7 +6,6 @@ config DEFCONFIG_LIST
6config UML 6config UML
7 bool 7 bool
8 default y 8 default y
9 select HAVE_GENERIC_HARDIRQS
10 select HAVE_UID16 9 select HAVE_UID16
11 select GENERIC_IRQ_SHOW 10 select GENERIC_IRQ_SHOW
12 select GENERIC_CPU_DEVICES 11 select GENERIC_CPU_DEVICES
diff --git a/arch/um/defconfig b/arch/um/defconfig
index 08107a795062..2665e6b683f5 100644
--- a/arch/um/defconfig
+++ b/arch/um/defconfig
@@ -129,12 +129,10 @@ CONFIG_BSD_PROCESS_ACCT=y
129# CONFIG_FHANDLE is not set 129# CONFIG_FHANDLE is not set
130# CONFIG_TASKSTATS is not set 130# CONFIG_TASKSTATS is not set
131# CONFIG_AUDIT is not set 131# CONFIG_AUDIT is not set
132CONFIG_HAVE_GENERIC_HARDIRQS=y
133 132
134# 133#
135# IRQ subsystem 134# IRQ subsystem
136# 135#
137CONFIG_GENERIC_HARDIRQS=y
138CONFIG_GENERIC_IRQ_SHOW=y 136CONFIG_GENERIC_IRQ_SHOW=y
139 137
140# 138#
diff --git a/arch/um/drivers/ubd.h b/arch/um/drivers/ubd.h
index 3845051f1b10..3b48cd2081ee 100644
--- a/arch/um/drivers/ubd.h
+++ b/arch/um/drivers/ubd.h
@@ -7,7 +7,6 @@
7#ifndef __UM_UBD_USER_H 7#ifndef __UM_UBD_USER_H
8#define __UM_UBD_USER_H 8#define __UM_UBD_USER_H
9 9
10extern void ignore_sigwinch_sig(void);
11extern int start_io_thread(unsigned long sp, int *fds_out); 10extern int start_io_thread(unsigned long sp, int *fds_out);
12extern int io_thread(void *arg); 11extern int io_thread(void *arg);
13extern int kernel_fd; 12extern int kernel_fd;
diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c
index 879990cb66c6..3716e6952554 100644
--- a/arch/um/drivers/ubd_kern.c
+++ b/arch/um/drivers/ubd_kern.c
@@ -41,7 +41,7 @@
41#include <os.h> 41#include <os.h>
42#include "cow.h" 42#include "cow.h"
43 43
44enum ubd_req { UBD_READ, UBD_WRITE }; 44enum ubd_req { UBD_READ, UBD_WRITE, UBD_FLUSH };
45 45
46struct io_thread_req { 46struct io_thread_req {
47 struct request *req; 47 struct request *req;
@@ -866,6 +866,7 @@ static int ubd_add(int n, char **error_out)
866 goto out; 866 goto out;
867 } 867 }
868 ubd_dev->queue->queuedata = ubd_dev; 868 ubd_dev->queue->queuedata = ubd_dev;
869 blk_queue_flush(ubd_dev->queue, REQ_FLUSH);
869 870
870 blk_queue_max_segments(ubd_dev->queue, MAX_SG); 871 blk_queue_max_segments(ubd_dev->queue, MAX_SG);
871 err = ubd_disk_register(UBD_MAJOR, ubd_dev->size, n, &ubd_gendisk[n]); 872 err = ubd_disk_register(UBD_MAJOR, ubd_dev->size, n, &ubd_gendisk[n]);
@@ -1239,11 +1240,40 @@ static void prepare_request(struct request *req, struct io_thread_req *io_req,
1239} 1240}
1240 1241
1241/* Called with dev->lock held */ 1242/* Called with dev->lock held */
1243static void prepare_flush_request(struct request *req,
1244 struct io_thread_req *io_req)
1245{
1246 struct gendisk *disk = req->rq_disk;
1247 struct ubd *ubd_dev = disk->private_data;
1248
1249 io_req->req = req;
1250 io_req->fds[0] = (ubd_dev->cow.file != NULL) ? ubd_dev->cow.fd :
1251 ubd_dev->fd;
1252 io_req->op = UBD_FLUSH;
1253}
1254
1255static bool submit_request(struct io_thread_req *io_req, struct ubd *dev)
1256{
1257 int n = os_write_file(thread_fd, &io_req,
1258 sizeof(io_req));
1259 if (n != sizeof(io_req)) {
1260 if (n != -EAGAIN)
1261 printk("write to io thread failed, "
1262 "errno = %d\n", -n);
1263 else if (list_empty(&dev->restart))
1264 list_add(&dev->restart, &restart);
1265
1266 kfree(io_req);
1267 return false;
1268 }
1269 return true;
1270}
1271
1272/* Called with dev->lock held */
1242static void do_ubd_request(struct request_queue *q) 1273static void do_ubd_request(struct request_queue *q)
1243{ 1274{
1244 struct io_thread_req *io_req; 1275 struct io_thread_req *io_req;
1245 struct request *req; 1276 struct request *req;
1246 int n;
1247 1277
1248 while(1){ 1278 while(1){
1249 struct ubd *dev = q->queuedata; 1279 struct ubd *dev = q->queuedata;
@@ -1259,6 +1289,19 @@ static void do_ubd_request(struct request_queue *q)
1259 } 1289 }
1260 1290
1261 req = dev->request; 1291 req = dev->request;
1292
1293 if (req->cmd_flags & REQ_FLUSH) {
1294 io_req = kmalloc(sizeof(struct io_thread_req),
1295 GFP_ATOMIC);
1296 if (io_req == NULL) {
1297 if (list_empty(&dev->restart))
1298 list_add(&dev->restart, &restart);
1299 return;
1300 }
1301 prepare_flush_request(req, io_req);
1302 submit_request(io_req, dev);
1303 }
1304
1262 while(dev->start_sg < dev->end_sg){ 1305 while(dev->start_sg < dev->end_sg){
1263 struct scatterlist *sg = &dev->sg[dev->start_sg]; 1306 struct scatterlist *sg = &dev->sg[dev->start_sg];
1264 1307
@@ -1273,17 +1316,8 @@ static void do_ubd_request(struct request_queue *q)
1273 (unsigned long long)dev->rq_pos << 9, 1316 (unsigned long long)dev->rq_pos << 9,
1274 sg->offset, sg->length, sg_page(sg)); 1317 sg->offset, sg->length, sg_page(sg));
1275 1318
1276 n = os_write_file(thread_fd, &io_req, 1319 if (submit_request(io_req, dev) == false)
1277 sizeof(struct io_thread_req *));
1278 if(n != sizeof(struct io_thread_req *)){
1279 if(n != -EAGAIN)
1280 printk("write to io thread failed, "
1281 "errno = %d\n", -n);
1282 else if(list_empty(&dev->restart))
1283 list_add(&dev->restart, &restart);
1284 kfree(io_req);
1285 return; 1320 return;
1286 }
1287 1321
1288 dev->rq_pos += sg->length >> 9; 1322 dev->rq_pos += sg->length >> 9;
1289 dev->start_sg++; 1323 dev->start_sg++;
@@ -1367,6 +1401,17 @@ static void do_io(struct io_thread_req *req)
1367 int err; 1401 int err;
1368 __u64 off; 1402 __u64 off;
1369 1403
1404 if (req->op == UBD_FLUSH) {
1405 /* fds[0] is always either the rw image or our cow file */
1406 n = os_sync_file(req->fds[0]);
1407 if (n != 0) {
1408 printk("do_io - sync failed err = %d "
1409 "fd = %d\n", -n, req->fds[0]);
1410 req->error = 1;
1411 }
1412 return;
1413 }
1414
1370 nsectors = req->length / req->sectorsize; 1415 nsectors = req->length / req->sectorsize;
1371 start = 0; 1416 start = 0;
1372 do { 1417 do {
@@ -1431,7 +1476,8 @@ int io_thread(void *arg)
1431 struct io_thread_req *req; 1476 struct io_thread_req *req;
1432 int n; 1477 int n;
1433 1478
1434 ignore_sigwinch_sig(); 1479 os_fix_helper_signals();
1480
1435 while(1){ 1481 while(1){
1436 n = os_read_file(kernel_fd, &req, 1482 n = os_read_file(kernel_fd, &req,
1437 sizeof(struct io_thread_req *)); 1483 sizeof(struct io_thread_req *));
diff --git a/arch/um/drivers/ubd_user.c b/arch/um/drivers/ubd_user.c
index a703e45d8aac..e376f9b9c68d 100644
--- a/arch/um/drivers/ubd_user.c
+++ b/arch/um/drivers/ubd_user.c
@@ -21,11 +21,6 @@
21#include "ubd.h" 21#include "ubd.h"
22#include <os.h> 22#include <os.h>
23 23
24void ignore_sigwinch_sig(void)
25{
26 signal(SIGWINCH, SIG_IGN);
27}
28
29int start_io_thread(unsigned long sp, int *fd_out) 24int start_io_thread(unsigned long sp, int *fd_out)
30{ 25{
31 int pid, fds[2], err; 26 int pid, fds[2], err;
diff --git a/arch/um/include/shared/os.h b/arch/um/include/shared/os.h
index 95feaa47a2fb..021104d98cb3 100644
--- a/arch/um/include/shared/os.h
+++ b/arch/um/include/shared/os.h
@@ -141,6 +141,7 @@ extern int os_seek_file(int fd, unsigned long long offset);
141extern int os_open_file(const char *file, struct openflags flags, int mode); 141extern int os_open_file(const char *file, struct openflags flags, int mode);
142extern int os_read_file(int fd, void *buf, int len); 142extern int os_read_file(int fd, void *buf, int len);
143extern int os_write_file(int fd, const void *buf, int count); 143extern int os_write_file(int fd, const void *buf, int count);
144extern int os_sync_file(int fd);
144extern int os_file_size(const char *file, unsigned long long *size_out); 145extern int os_file_size(const char *file, unsigned long long *size_out);
145extern int os_file_modtime(const char *file, unsigned long *modtime); 146extern int os_file_modtime(const char *file, unsigned long *modtime);
146extern int os_pipe(int *fd, int stream, int close_on_exec); 147extern int os_pipe(int *fd, int stream, int close_on_exec);
@@ -200,6 +201,7 @@ extern int os_unmap_memory(void *addr, int len);
200extern int os_drop_memory(void *addr, int length); 201extern int os_drop_memory(void *addr, int length);
201extern int can_drop_memory(void); 202extern int can_drop_memory(void);
202extern void os_flush_stdout(void); 203extern void os_flush_stdout(void);
204extern int os_mincore(void *addr, unsigned long len);
203 205
204/* execvp.c */ 206/* execvp.c */
205extern int execvp_noalloc(char *buf, const char *file, char *const argv[]); 207extern int execvp_noalloc(char *buf, const char *file, char *const argv[]);
@@ -233,6 +235,7 @@ extern void setup_machinename(char *machine_out);
233extern void setup_hostinfo(char *buf, int len); 235extern void setup_hostinfo(char *buf, int len);
234extern void os_dump_core(void) __attribute__ ((noreturn)); 236extern void os_dump_core(void) __attribute__ ((noreturn));
235extern void um_early_printk(const char *s, unsigned int n); 237extern void um_early_printk(const char *s, unsigned int n);
238extern void os_fix_helper_signals(void);
236 239
237/* time.c */ 240/* time.c */
238extern void idle_sleep(unsigned long long nsecs); 241extern void idle_sleep(unsigned long long nsecs);
diff --git a/arch/um/kernel/Makefile b/arch/um/kernel/Makefile
index babe21826e3e..d8b78a03855c 100644
--- a/arch/um/kernel/Makefile
+++ b/arch/um/kernel/Makefile
@@ -13,7 +13,7 @@ clean-files :=
13obj-y = config.o exec.o exitcode.o irq.o ksyms.o mem.o \ 13obj-y = config.o exec.o exitcode.o irq.o ksyms.o mem.o \
14 physmem.o process.o ptrace.o reboot.o sigio.o \ 14 physmem.o process.o ptrace.o reboot.o sigio.o \
15 signal.o smp.o syscall.o sysrq.o time.o tlb.o trap.o \ 15 signal.o smp.o syscall.o sysrq.o time.o tlb.o trap.o \
16 um_arch.o umid.o skas/ 16 um_arch.o umid.o maccess.o skas/
17 17
18obj-$(CONFIG_BLK_DEV_INITRD) += initrd.o 18obj-$(CONFIG_BLK_DEV_INITRD) += initrd.o
19obj-$(CONFIG_GPROF) += gprof_syms.o 19obj-$(CONFIG_GPROF) += gprof_syms.o
diff --git a/arch/um/kernel/irq.c b/arch/um/kernel/irq.c
index 36e12f0cefd5..1d8505b1e290 100644
--- a/arch/um/kernel/irq.c
+++ b/arch/um/kernel/irq.c
@@ -337,6 +337,8 @@ static struct irq_chip normal_irq_type = {
337 .irq_disable = dummy, 337 .irq_disable = dummy,
338 .irq_enable = dummy, 338 .irq_enable = dummy,
339 .irq_ack = dummy, 339 .irq_ack = dummy,
340 .irq_mask = dummy,
341 .irq_unmask = dummy,
340}; 342};
341 343
342static struct irq_chip SIGVTALRM_irq_type = { 344static struct irq_chip SIGVTALRM_irq_type = {
@@ -344,6 +346,8 @@ static struct irq_chip SIGVTALRM_irq_type = {
344 .irq_disable = dummy, 346 .irq_disable = dummy,
345 .irq_enable = dummy, 347 .irq_enable = dummy,
346 .irq_ack = dummy, 348 .irq_ack = dummy,
349 .irq_mask = dummy,
350 .irq_unmask = dummy,
347}; 351};
348 352
349void __init init_IRQ(void) 353void __init init_IRQ(void)
diff --git a/arch/um/kernel/maccess.c b/arch/um/kernel/maccess.c
new file mode 100644
index 000000000000..1f3d5c4910d1
--- /dev/null
+++ b/arch/um/kernel/maccess.c
@@ -0,0 +1,24 @@
1/*
2 * Copyright (C) 2013 Richard Weinberger <richrd@nod.at>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
8
9#include <linux/uaccess.h>
10#include <linux/kernel.h>
11#include <os.h>
12
13long probe_kernel_read(void *dst, const void *src, size_t size)
14{
15 void *psrc = (void *)rounddown((unsigned long)src, PAGE_SIZE);
16
17 if ((unsigned long)src < PAGE_SIZE || size <= 0)
18 return -EFAULT;
19
20 if (os_mincore(psrc, size + src - psrc) <= 0)
21 return -EFAULT;
22
23 return __probe_kernel_read(dst, src, size);
24}
diff --git a/arch/um/kernel/trap.c b/arch/um/kernel/trap.c
index 089f3987e273..5c3aef74237f 100644
--- a/arch/um/kernel/trap.c
+++ b/arch/um/kernel/trap.c
@@ -30,8 +30,7 @@ int handle_page_fault(unsigned long address, unsigned long ip,
30 pmd_t *pmd; 30 pmd_t *pmd;
31 pte_t *pte; 31 pte_t *pte;
32 int err = -EFAULT; 32 int err = -EFAULT;
33 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE | 33 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
34 (is_write ? FAULT_FLAG_WRITE : 0);
35 34
36 *code_out = SEGV_MAPERR; 35 *code_out = SEGV_MAPERR;
37 36
@@ -42,6 +41,8 @@ int handle_page_fault(unsigned long address, unsigned long ip,
42 if (in_atomic()) 41 if (in_atomic())
43 goto out_nosemaphore; 42 goto out_nosemaphore;
44 43
44 if (is_user)
45 flags |= FAULT_FLAG_USER;
45retry: 46retry:
46 down_read(&mm->mmap_sem); 47 down_read(&mm->mmap_sem);
47 vma = find_vma(mm, address); 48 vma = find_vma(mm, address);
@@ -58,12 +59,15 @@ retry:
58 59
59good_area: 60good_area:
60 *code_out = SEGV_ACCERR; 61 *code_out = SEGV_ACCERR;
61 if (is_write && !(vma->vm_flags & VM_WRITE)) 62 if (is_write) {
62 goto out; 63 if (!(vma->vm_flags & VM_WRITE))
63 64 goto out;
64 /* Don't require VM_READ|VM_EXEC for write faults! */ 65 flags |= FAULT_FLAG_WRITE;
65 if (!is_write && !(vma->vm_flags & (VM_READ | VM_EXEC))) 66 } else {
66 goto out; 67 /* Don't require VM_READ|VM_EXEC for write faults! */
68 if (!(vma->vm_flags & (VM_READ | VM_EXEC)))
69 goto out;
70 }
67 71
68 do { 72 do {
69 int fault; 73 int fault;
@@ -124,6 +128,8 @@ out_of_memory:
124 * (which will retry the fault, or kill us if we got oom-killed). 128 * (which will retry the fault, or kill us if we got oom-killed).
125 */ 129 */
126 up_read(&mm->mmap_sem); 130 up_read(&mm->mmap_sem);
131 if (!is_user)
132 goto out_nosemaphore;
127 pagefault_out_of_memory(); 133 pagefault_out_of_memory();
128 return 0; 134 return 0;
129} 135}
diff --git a/arch/um/os-Linux/aio.c b/arch/um/os-Linux/aio.c
index 3a6bc2af0961..014eb35fd13b 100644
--- a/arch/um/os-Linux/aio.c
+++ b/arch/um/os-Linux/aio.c
@@ -104,8 +104,7 @@ static int aio_thread(void *arg)
104 struct io_event event; 104 struct io_event event;
105 int err, n, reply_fd; 105 int err, n, reply_fd;
106 106
107 signal(SIGWINCH, SIG_IGN); 107 os_fix_helper_signals();
108
109 while (1) { 108 while (1) {
110 n = io_getevents(ctx, 1, 1, &event, NULL); 109 n = io_getevents(ctx, 1, 1, &event, NULL);
111 if (n < 0) { 110 if (n < 0) {
@@ -173,7 +172,7 @@ static int not_aio_thread(void *arg)
173 struct aio_thread_reply reply; 172 struct aio_thread_reply reply;
174 int err; 173 int err;
175 174
176 signal(SIGWINCH, SIG_IGN); 175 os_fix_helper_signals();
177 while (1) { 176 while (1) {
178 err = read(aio_req_fd_r, &req, sizeof(req)); 177 err = read(aio_req_fd_r, &req, sizeof(req));
179 if (err != sizeof(req)) { 178 if (err != sizeof(req)) {
diff --git a/arch/um/os-Linux/file.c b/arch/um/os-Linux/file.c
index c17bd6f7d674..07a750197bb0 100644
--- a/arch/um/os-Linux/file.c
+++ b/arch/um/os-Linux/file.c
@@ -266,6 +266,15 @@ int os_write_file(int fd, const void *buf, int len)
266 return n; 266 return n;
267} 267}
268 268
269int os_sync_file(int fd)
270{
271 int n = fsync(fd);
272
273 if (n < 0)
274 return -errno;
275 return n;
276}
277
269int os_file_size(const char *file, unsigned long long *size_out) 278int os_file_size(const char *file, unsigned long long *size_out)
270{ 279{
271 struct uml_stat buf; 280 struct uml_stat buf;
diff --git a/arch/um/os-Linux/main.c b/arch/um/os-Linux/main.c
index 749c96da7b99..e1704ff600ff 100644
--- a/arch/um/os-Linux/main.c
+++ b/arch/um/os-Linux/main.c
@@ -123,6 +123,8 @@ int __init main(int argc, char **argv, char **envp)
123 123
124 setup_env_path(); 124 setup_env_path();
125 125
126 setsid();
127
126 new_argv = malloc((argc + 1) * sizeof(char *)); 128 new_argv = malloc((argc + 1) * sizeof(char *));
127 if (new_argv == NULL) { 129 if (new_argv == NULL) {
128 perror("Mallocing argv"); 130 perror("Mallocing argv");
diff --git a/arch/um/os-Linux/process.c b/arch/um/os-Linux/process.c
index b8f34c9e53ae..33496fe2bb52 100644
--- a/arch/um/os-Linux/process.c
+++ b/arch/um/os-Linux/process.c
@@ -4,6 +4,7 @@
4 */ 4 */
5 5
6#include <stdio.h> 6#include <stdio.h>
7#include <stdlib.h>
7#include <unistd.h> 8#include <unistd.h>
8#include <errno.h> 9#include <errno.h>
9#include <signal.h> 10#include <signal.h>
@@ -232,6 +233,57 @@ out:
232 return ok; 233 return ok;
233} 234}
234 235
236static int os_page_mincore(void *addr)
237{
238 char vec[2];
239 int ret;
240
241 ret = mincore(addr, UM_KERN_PAGE_SIZE, vec);
242 if (ret < 0) {
243 if (errno == ENOMEM || errno == EINVAL)
244 return 0;
245 else
246 return -errno;
247 }
248
249 return vec[0] & 1;
250}
251
252int os_mincore(void *addr, unsigned long len)
253{
254 char *vec;
255 int ret, i;
256
257 if (len <= UM_KERN_PAGE_SIZE)
258 return os_page_mincore(addr);
259
260 vec = calloc(1, (len + UM_KERN_PAGE_SIZE - 1) / UM_KERN_PAGE_SIZE);
261 if (!vec)
262 return -ENOMEM;
263
264 ret = mincore(addr, UM_KERN_PAGE_SIZE, vec);
265 if (ret < 0) {
266 if (errno == ENOMEM || errno == EINVAL)
267 ret = 0;
268 else
269 ret = -errno;
270
271 goto out;
272 }
273
274 for (i = 0; i < ((len + UM_KERN_PAGE_SIZE - 1) / UM_KERN_PAGE_SIZE); i++) {
275 if (!(vec[i] & 1)) {
276 ret = 0;
277 goto out;
278 }
279 }
280
281 ret = 1;
282out:
283 free(vec);
284 return ret;
285}
286
235void init_new_thread_signals(void) 287void init_new_thread_signals(void)
236{ 288{
237 set_handler(SIGSEGV); 289 set_handler(SIGSEGV);
@@ -242,5 +294,4 @@ void init_new_thread_signals(void)
242 signal(SIGHUP, SIG_IGN); 294 signal(SIGHUP, SIG_IGN);
243 set_handler(SIGIO); 295 set_handler(SIGIO);
244 signal(SIGWINCH, SIG_IGN); 296 signal(SIGWINCH, SIG_IGN);
245 signal(SIGTERM, SIG_DFL);
246} 297}
diff --git a/arch/um/os-Linux/sigio.c b/arch/um/os-Linux/sigio.c
index 8b61cc0e82c8..46e762f926eb 100644
--- a/arch/um/os-Linux/sigio.c
+++ b/arch/um/os-Linux/sigio.c
@@ -55,7 +55,7 @@ static int write_sigio_thread(void *unused)
55 int i, n, respond_fd; 55 int i, n, respond_fd;
56 char c; 56 char c;
57 57
58 signal(SIGWINCH, SIG_IGN); 58 os_fix_helper_signals();
59 fds = &current_poll; 59 fds = &current_poll;
60 while (1) { 60 while (1) {
61 n = poll(fds->poll, fds->used, -1); 61 n = poll(fds->poll, fds->used, -1);
diff --git a/arch/um/os-Linux/util.c b/arch/um/os-Linux/util.c
index 492ef5e6e166..faee55ef6d2f 100644
--- a/arch/um/os-Linux/util.c
+++ b/arch/um/os-Linux/util.c
@@ -94,6 +94,16 @@ static inline void __attribute__ ((noreturn)) uml_abort(void)
94 exit(127); 94 exit(127);
95} 95}
96 96
97/*
98 * UML helper threads must not handle SIGWINCH/INT/TERM
99 */
100void os_fix_helper_signals(void)
101{
102 signal(SIGWINCH, SIG_IGN);
103 signal(SIGINT, SIG_DFL);
104 signal(SIGTERM, SIG_DFL);
105}
106
97void os_dump_core(void) 107void os_dump_core(void)
98{ 108{
99 int pid; 109 int pid;
diff --git a/arch/unicore32/Kconfig b/arch/unicore32/Kconfig
index 41bcc0013442..82cdd8906f3d 100644
--- a/arch/unicore32/Kconfig
+++ b/arch/unicore32/Kconfig
@@ -2,7 +2,6 @@ config UNICORE32
2 def_bool y 2 def_bool y
3 select HAVE_MEMBLOCK 3 select HAVE_MEMBLOCK
4 select HAVE_GENERIC_DMA_COHERENT 4 select HAVE_GENERIC_DMA_COHERENT
5 select HAVE_GENERIC_HARDIRQS
6 select HAVE_DMA_ATTRS 5 select HAVE_DMA_ATTRS
7 select HAVE_KERNEL_GZIP 6 select HAVE_KERNEL_GZIP
8 select HAVE_KERNEL_BZIP2 7 select HAVE_KERNEL_BZIP2
diff --git a/arch/unicore32/mm/fault.c b/arch/unicore32/mm/fault.c
index f9b5c10bccee..0dc922dba915 100644
--- a/arch/unicore32/mm/fault.c
+++ b/arch/unicore32/mm/fault.c
@@ -209,8 +209,7 @@ static int do_pf(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
209 struct task_struct *tsk; 209 struct task_struct *tsk;
210 struct mm_struct *mm; 210 struct mm_struct *mm;
211 int fault, sig, code; 211 int fault, sig, code;
212 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE | 212 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
213 ((!(fsr ^ 0x12)) ? FAULT_FLAG_WRITE : 0);
214 213
215 tsk = current; 214 tsk = current;
216 mm = tsk->mm; 215 mm = tsk->mm;
@@ -222,6 +221,11 @@ static int do_pf(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
222 if (in_atomic() || !mm) 221 if (in_atomic() || !mm)
223 goto no_context; 222 goto no_context;
224 223
224 if (user_mode(regs))
225 flags |= FAULT_FLAG_USER;
226 if (!(fsr ^ 0x12))
227 flags |= FAULT_FLAG_WRITE;
228
225 /* 229 /*
226 * As per x86, we may deadlock here. However, since the kernel only 230 * As per x86, we may deadlock here. However, since the kernel only
227 * validly references user space from well defined areas of the code, 231 * validly references user space from well defined areas of the code,
@@ -278,6 +282,13 @@ retry:
278 (VM_FAULT_ERROR | VM_FAULT_BADMAP | VM_FAULT_BADACCESS)))) 282 (VM_FAULT_ERROR | VM_FAULT_BADMAP | VM_FAULT_BADACCESS))))
279 return 0; 283 return 0;
280 284
285 /*
286 * If we are in kernel mode at this point, we
287 * have no context to handle this fault with.
288 */
289 if (!user_mode(regs))
290 goto no_context;
291
281 if (fault & VM_FAULT_OOM) { 292 if (fault & VM_FAULT_OOM) {
282 /* 293 /*
283 * We ran out of memory, call the OOM killer, and return to 294 * We ran out of memory, call the OOM killer, and return to
@@ -288,13 +299,6 @@ retry:
288 return 0; 299 return 0;
289 } 300 }
290 301
291 /*
292 * If we are in kernel mode at this point, we
293 * have no context to handle this fault with.
294 */
295 if (!user_mode(regs))
296 goto no_context;
297
298 if (fault & VM_FAULT_SIGBUS) { 302 if (fault & VM_FAULT_SIGBUS) {
299 /* 303 /*
300 * We had some memory, but were unable to 304 * We had some memory, but were unable to
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index b1fb846e6dac..ee2fb9d37745 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -16,6 +16,7 @@ config X86_64
16 def_bool y 16 def_bool y
17 depends on 64BIT 17 depends on 64BIT
18 select X86_DEV_DMA_OPS 18 select X86_DEV_DMA_OPS
19 select ARCH_USE_CMPXCHG_LOCKREF
19 20
20### Arch settings 21### Arch settings
21config X86 22config X86
@@ -81,8 +82,6 @@ config X86
81 select HAVE_USER_RETURN_NOTIFIER 82 select HAVE_USER_RETURN_NOTIFIER
82 select ARCH_BINFMT_ELF_RANDOMIZE_PIE 83 select ARCH_BINFMT_ELF_RANDOMIZE_PIE
83 select HAVE_ARCH_JUMP_LABEL 84 select HAVE_ARCH_JUMP_LABEL
84 select HAVE_TEXT_POKE_SMP
85 select HAVE_GENERIC_HARDIRQS
86 select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE 85 select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
87 select SPARSE_IRQ 86 select SPARSE_IRQ
88 select GENERIC_FIND_FIRST_BIT 87 select GENERIC_FIND_FIRST_BIT
@@ -482,11 +481,12 @@ config X86_INTEL_LPSS
482 bool "Intel Low Power Subsystem Support" 481 bool "Intel Low Power Subsystem Support"
483 depends on ACPI 482 depends on ACPI
484 select COMMON_CLK 483 select COMMON_CLK
484 select PINCTRL
485 ---help--- 485 ---help---
486 Select to build support for Intel Low Power Subsystem such as 486 Select to build support for Intel Low Power Subsystem such as
487 found on Intel Lynxpoint PCH. Selecting this option enables 487 found on Intel Lynxpoint PCH. Selecting this option enables
488 things like clock tree (common clock framework) which are needed 488 things like clock tree (common clock framework) and pincontrol
489 by the LPSS peripheral drivers. 489 which are needed by the LPSS peripheral drivers.
490 490
491config X86_RDC321X 491config X86_RDC321X
492 bool "RDC R-321x SoC" 492 bool "RDC R-321x SoC"
@@ -1354,8 +1354,12 @@ config ARCH_SELECT_MEMORY_MODEL
1354 depends on ARCH_SPARSEMEM_ENABLE 1354 depends on ARCH_SPARSEMEM_ENABLE
1355 1355
1356config ARCH_MEMORY_PROBE 1356config ARCH_MEMORY_PROBE
1357 def_bool y 1357 bool "Enable sysfs memory/probe interface"
1358 depends on X86_64 && MEMORY_HOTPLUG 1358 depends on X86_64 && MEMORY_HOTPLUG
1359 help
1360 This option enables a sysfs memory/probe interface for testing.
1361 See Documentation/memory-hotplug.txt for more information.
1362 If you are unsure how to answer this question, answer N.
1359 1363
1360config ARCH_PROC_KCORE_TEXT 1364config ARCH_PROC_KCORE_TEXT
1361 def_bool y 1365 def_bool y
@@ -1637,9 +1641,9 @@ config KEXEC
1637 1641
1638 It is an ongoing process to be certain the hardware in a machine 1642 It is an ongoing process to be certain the hardware in a machine
1639 is properly shutdown, so do not be surprised if this code does not 1643 is properly shutdown, so do not be surprised if this code does not
1640 initially work for you. It may help to enable device hotplugging 1644 initially work for you. As of this writing the exact hardware
1641 support. As of this writing the exact hardware interface is 1645 interface is strongly in flux, so no good recommendation can be
1642 strongly in flux, so no good recommendation can be made. 1646 made.
1643 1647
1644config CRASH_DUMP 1648config CRASH_DUMP
1645 bool "kernel crash dumps" 1649 bool "kernel crash dumps"
@@ -1726,9 +1730,10 @@ config X86_NEED_RELOCS
1726 depends on X86_32 && RELOCATABLE 1730 depends on X86_32 && RELOCATABLE
1727 1731
1728config PHYSICAL_ALIGN 1732config PHYSICAL_ALIGN
1729 hex "Alignment value to which kernel should be aligned" if X86_32 1733 hex "Alignment value to which kernel should be aligned"
1730 default "0x1000000" 1734 default "0x1000000"
1731 range 0x2000 0x1000000 1735 range 0x2000 0x1000000 if X86_32
1736 range 0x200000 0x1000000 if X86_64
1732 ---help--- 1737 ---help---
1733 This value puts the alignment restrictions on physical address 1738 This value puts the alignment restrictions on physical address
1734 where kernel is loaded and run from. Kernel is compiled for an 1739 where kernel is loaded and run from. Kernel is compiled for an
@@ -1746,6 +1751,9 @@ config PHYSICAL_ALIGN
1746 end result is that kernel runs from a physical address meeting 1751 end result is that kernel runs from a physical address meeting
1747 above alignment restrictions. 1752 above alignment restrictions.
1748 1753
1754 On 32-bit this value must be a multiple of 0x2000. On 64-bit
1755 this value must be a multiple of 0x200000.
1756
1749 Don't change this unless you know what you are doing. 1757 Don't change this unless you know what you are doing.
1750 1758
1751config HOTPLUG_CPU 1759config HOTPLUG_CPU
@@ -2024,7 +2032,6 @@ menu "Bus options (PCI etc.)"
2024config PCI 2032config PCI
2025 bool "PCI support" 2033 bool "PCI support"
2026 default y 2034 default y
2027 select ARCH_SUPPORTS_MSI if (X86_LOCAL_APIC && X86_IO_APIC)
2028 ---help--- 2035 ---help---
2029 Find out whether you have a PCI motherboard. PCI is the name of a 2036 Find out whether you have a PCI motherboard. PCI is the name of a
2030 bus system, i.e. the way the CPU talks to the other stuff inside 2037 bus system, i.e. the way the CPU talks to the other stuff inside
@@ -2280,6 +2287,32 @@ config RAPIDIO
2280 2287
2281source "drivers/rapidio/Kconfig" 2288source "drivers/rapidio/Kconfig"
2282 2289
2290config X86_SYSFB
2291 bool "Mark VGA/VBE/EFI FB as generic system framebuffer"
2292 help
2293 Firmwares often provide initial graphics framebuffers so the BIOS,
2294 bootloader or kernel can show basic video-output during boot for
2295 user-guidance and debugging. Historically, x86 used the VESA BIOS
2296 Extensions and EFI-framebuffers for this, which are mostly limited
2297 to x86.
2298 This option, if enabled, marks VGA/VBE/EFI framebuffers as generic
2299 framebuffers so the new generic system-framebuffer drivers can be
2300 used on x86. If the framebuffer is not compatible with the generic
2301 modes, it is adverticed as fallback platform framebuffer so legacy
2302 drivers like efifb, vesafb and uvesafb can pick it up.
2303 If this option is not selected, all system framebuffers are always
2304 marked as fallback platform framebuffers as usual.
2305
2306 Note: Legacy fbdev drivers, including vesafb, efifb, uvesafb, will
2307 not be able to pick up generic system framebuffers if this option
2308 is selected. You are highly encouraged to enable simplefb as
2309 replacement if you select this option. simplefb can correctly deal
2310 with generic system framebuffers. But you should still keep vesafb
2311 and others enabled as fallback if a system framebuffer is
2312 incompatible with simplefb.
2313
2314 If unsure, say Y.
2315
2283endmenu 2316endmenu
2284 2317
2285 2318
@@ -2342,10 +2375,6 @@ config HAVE_ATOMIC_IOMAP
2342 def_bool y 2375 def_bool y
2343 depends on X86_32 2376 depends on X86_32
2344 2377
2345config HAVE_TEXT_POKE_SMP
2346 bool
2347 select STOP_MACHINE if SMP
2348
2349config X86_DEV_DMA_OPS 2378config X86_DEV_DMA_OPS
2350 bool 2379 bool
2351 depends on X86_64 || STA2X11 2380 depends on X86_64 || STA2X11
diff --git a/arch/x86/Makefile b/arch/x86/Makefile
index 07639c656fcd..41250fb33985 100644
--- a/arch/x86/Makefile
+++ b/arch/x86/Makefile
@@ -16,6 +16,10 @@ endif
16# e.g.: obj-y += foo_$(BITS).o 16# e.g.: obj-y += foo_$(BITS).o
17export BITS 17export BITS
18 18
19ifdef CONFIG_X86_NEED_RELOCS
20 LDFLAGS_vmlinux := --emit-relocs
21endif
22
19ifeq ($(CONFIG_X86_32),y) 23ifeq ($(CONFIG_X86_32),y)
20 BITS := 32 24 BITS := 32
21 UTS_MACHINE := i386 25 UTS_MACHINE := i386
@@ -25,10 +29,6 @@ ifeq ($(CONFIG_X86_32),y)
25 KBUILD_AFLAGS += $(biarch) 29 KBUILD_AFLAGS += $(biarch)
26 KBUILD_CFLAGS += $(biarch) 30 KBUILD_CFLAGS += $(biarch)
27 31
28 ifdef CONFIG_RELOCATABLE
29 LDFLAGS_vmlinux := --emit-relocs
30 endif
31
32 KBUILD_CFLAGS += -msoft-float -mregparm=3 -freg-struct-return 32 KBUILD_CFLAGS += -msoft-float -mregparm=3 -freg-struct-return
33 33
34 # Never want PIC in a 32-bit kernel, prevent breakage with GCC built 34 # Never want PIC in a 32-bit kernel, prevent breakage with GCC built
diff --git a/arch/x86/boot/boot.h b/arch/x86/boot/boot.h
index 5b7531966b84..ef72baeff484 100644
--- a/arch/x86/boot/boot.h
+++ b/arch/x86/boot/boot.h
@@ -355,6 +355,7 @@ int strncmp(const char *cs, const char *ct, size_t count);
355size_t strnlen(const char *s, size_t maxlen); 355size_t strnlen(const char *s, size_t maxlen);
356unsigned int atou(const char *s); 356unsigned int atou(const char *s);
357unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base); 357unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base);
358size_t strlen(const char *s);
358 359
359/* tty.c */ 360/* tty.c */
360void puts(const char *); 361void puts(const char *);
diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S
index 1e3184f6072f..5d6f6891b188 100644
--- a/arch/x86/boot/compressed/head_32.S
+++ b/arch/x86/boot/compressed/head_32.S
@@ -181,8 +181,9 @@ relocated:
181/* 181/*
182 * Do the decompression, and jump to the new kernel.. 182 * Do the decompression, and jump to the new kernel..
183 */ 183 */
184 leal z_extract_offset_negative(%ebx), %ebp
185 /* push arguments for decompress_kernel: */ 184 /* push arguments for decompress_kernel: */
185 pushl $z_output_len /* decompressed length */
186 leal z_extract_offset_negative(%ebx), %ebp
186 pushl %ebp /* output address */ 187 pushl %ebp /* output address */
187 pushl $z_input_len /* input_len */ 188 pushl $z_input_len /* input_len */
188 leal input_data(%ebx), %eax 189 leal input_data(%ebx), %eax
@@ -191,33 +192,7 @@ relocated:
191 pushl %eax /* heap area */ 192 pushl %eax /* heap area */
192 pushl %esi /* real mode pointer */ 193 pushl %esi /* real mode pointer */
193 call decompress_kernel 194 call decompress_kernel
194 addl $20, %esp 195 addl $24, %esp
195
196#if CONFIG_RELOCATABLE
197/*
198 * Find the address of the relocations.
199 */
200 leal z_output_len(%ebp), %edi
201
202/*
203 * Calculate the delta between where vmlinux was compiled to run
204 * and where it was actually loaded.
205 */
206 movl %ebp, %ebx
207 subl $LOAD_PHYSICAL_ADDR, %ebx
208 jz 2f /* Nothing to be done if loaded at compiled addr. */
209/*
210 * Process relocations.
211 */
212
2131: subl $4, %edi
214 movl (%edi), %ecx
215 testl %ecx, %ecx
216 jz 2f
217 addl %ebx, -__PAGE_OFFSET(%ebx, %ecx)
218 jmp 1b
2192:
220#endif
221 196
222/* 197/*
223 * Jump to the decompressed kernel. 198 * Jump to the decompressed kernel.
diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S
index 06e71c2c16bf..c337422b575d 100644
--- a/arch/x86/boot/compressed/head_64.S
+++ b/arch/x86/boot/compressed/head_64.S
@@ -338,6 +338,7 @@ relocated:
338 leaq input_data(%rip), %rdx /* input_data */ 338 leaq input_data(%rip), %rdx /* input_data */
339 movl $z_input_len, %ecx /* input_len */ 339 movl $z_input_len, %ecx /* input_len */
340 movq %rbp, %r8 /* output target address */ 340 movq %rbp, %r8 /* output target address */
341 movq $z_output_len, %r9 /* decompressed length */
341 call decompress_kernel 342 call decompress_kernel
342 popq %rsi 343 popq %rsi
343 344
diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c
index 0319c88290a5..434f077d2c4d 100644
--- a/arch/x86/boot/compressed/misc.c
+++ b/arch/x86/boot/compressed/misc.c
@@ -271,6 +271,79 @@ static void error(char *x)
271 asm("hlt"); 271 asm("hlt");
272} 272}
273 273
274#if CONFIG_X86_NEED_RELOCS
275static void handle_relocations(void *output, unsigned long output_len)
276{
277 int *reloc;
278 unsigned long delta, map, ptr;
279 unsigned long min_addr = (unsigned long)output;
280 unsigned long max_addr = min_addr + output_len;
281
282 /*
283 * Calculate the delta between where vmlinux was linked to load
284 * and where it was actually loaded.
285 */
286 delta = min_addr - LOAD_PHYSICAL_ADDR;
287 if (!delta) {
288 debug_putstr("No relocation needed... ");
289 return;
290 }
291 debug_putstr("Performing relocations... ");
292
293 /*
294 * The kernel contains a table of relocation addresses. Those
295 * addresses have the final load address of the kernel in virtual
296 * memory. We are currently working in the self map. So we need to
297 * create an adjustment for kernel memory addresses to the self map.
298 * This will involve subtracting out the base address of the kernel.
299 */
300 map = delta - __START_KERNEL_map;
301
302 /*
303 * Process relocations: 32 bit relocations first then 64 bit after.
304 * Two sets of binary relocations are added to the end of the kernel
305 * before compression. Each relocation table entry is the kernel
306 * address of the location which needs to be updated stored as a
307 * 32-bit value which is sign extended to 64 bits.
308 *
309 * Format is:
310 *
311 * kernel bits...
312 * 0 - zero terminator for 64 bit relocations
313 * 64 bit relocation repeated
314 * 0 - zero terminator for 32 bit relocations
315 * 32 bit relocation repeated
316 *
317 * So we work backwards from the end of the decompressed image.
318 */
319 for (reloc = output + output_len - sizeof(*reloc); *reloc; reloc--) {
320 int extended = *reloc;
321 extended += map;
322
323 ptr = (unsigned long)extended;
324 if (ptr < min_addr || ptr > max_addr)
325 error("32-bit relocation outside of kernel!\n");
326
327 *(uint32_t *)ptr += delta;
328 }
329#ifdef CONFIG_X86_64
330 for (reloc--; *reloc; reloc--) {
331 long extended = *reloc;
332 extended += map;
333
334 ptr = (unsigned long)extended;
335 if (ptr < min_addr || ptr > max_addr)
336 error("64-bit relocation outside of kernel!\n");
337
338 *(uint64_t *)ptr += delta;
339 }
340#endif
341}
342#else
343static inline void handle_relocations(void *output, unsigned long output_len)
344{ }
345#endif
346
274static void parse_elf(void *output) 347static void parse_elf(void *output)
275{ 348{
276#ifdef CONFIG_X86_64 349#ifdef CONFIG_X86_64
@@ -325,7 +398,8 @@ static void parse_elf(void *output)
325asmlinkage void decompress_kernel(void *rmode, memptr heap, 398asmlinkage void decompress_kernel(void *rmode, memptr heap,
326 unsigned char *input_data, 399 unsigned char *input_data,
327 unsigned long input_len, 400 unsigned long input_len,
328 unsigned char *output) 401 unsigned char *output,
402 unsigned long output_len)
329{ 403{
330 real_mode = rmode; 404 real_mode = rmode;
331 405
@@ -365,6 +439,7 @@ asmlinkage void decompress_kernel(void *rmode, memptr heap,
365 debug_putstr("\nDecompressing Linux... "); 439 debug_putstr("\nDecompressing Linux... ");
366 decompress(input_data, input_len, NULL, NULL, output, NULL, error); 440 decompress(input_data, input_len, NULL, NULL, output, NULL, error);
367 parse_elf(output); 441 parse_elf(output);
442 handle_relocations(output, output_len);
368 debug_putstr("done.\nBooting the kernel.\n"); 443 debug_putstr("done.\nBooting the kernel.\n");
369 return; 444 return;
370} 445}
diff --git a/arch/x86/boot/printf.c b/arch/x86/boot/printf.c
index cdac91ca55d3..565083c16e5c 100644
--- a/arch/x86/boot/printf.c
+++ b/arch/x86/boot/printf.c
@@ -55,7 +55,7 @@ static char *number(char *str, long num, int base, int size, int precision,
55 locase = (type & SMALL); 55 locase = (type & SMALL);
56 if (type & LEFT) 56 if (type & LEFT)
57 type &= ~ZEROPAD; 57 type &= ~ZEROPAD;
58 if (base < 2 || base > 36) 58 if (base < 2 || base > 16)
59 return NULL; 59 return NULL;
60 c = (type & ZEROPAD) ? '0' : ' '; 60 c = (type & ZEROPAD) ? '0' : ' ';
61 sign = 0; 61 sign = 0;
diff --git a/arch/x86/crypto/Makefile b/arch/x86/crypto/Makefile
index 6c63c358a7e6..7d6ba9db1be9 100644
--- a/arch/x86/crypto/Makefile
+++ b/arch/x86/crypto/Makefile
@@ -27,6 +27,7 @@ obj-$(CONFIG_CRYPTO_SHA1_SSSE3) += sha1-ssse3.o
27obj-$(CONFIG_CRYPTO_CRC32_PCLMUL) += crc32-pclmul.o 27obj-$(CONFIG_CRYPTO_CRC32_PCLMUL) += crc32-pclmul.o
28obj-$(CONFIG_CRYPTO_SHA256_SSSE3) += sha256-ssse3.o 28obj-$(CONFIG_CRYPTO_SHA256_SSSE3) += sha256-ssse3.o
29obj-$(CONFIG_CRYPTO_SHA512_SSSE3) += sha512-ssse3.o 29obj-$(CONFIG_CRYPTO_SHA512_SSSE3) += sha512-ssse3.o
30obj-$(CONFIG_CRYPTO_CRCT10DIF_PCLMUL) += crct10dif-pclmul.o
30 31
31# These modules require assembler to support AVX. 32# These modules require assembler to support AVX.
32ifeq ($(avx_supported),yes) 33ifeq ($(avx_supported),yes)
@@ -81,3 +82,4 @@ crc32c-intel-$(CONFIG_64BIT) += crc32c-pcl-intel-asm_64.o
81crc32-pclmul-y := crc32-pclmul_asm.o crc32-pclmul_glue.o 82crc32-pclmul-y := crc32-pclmul_asm.o crc32-pclmul_glue.o
82sha256-ssse3-y := sha256-ssse3-asm.o sha256-avx-asm.o sha256-avx2-asm.o sha256_ssse3_glue.o 83sha256-ssse3-y := sha256-ssse3-asm.o sha256-avx-asm.o sha256-avx2-asm.o sha256_ssse3_glue.o
83sha512-ssse3-y := sha512-ssse3-asm.o sha512-avx-asm.o sha512-avx2-asm.o sha512_ssse3_glue.o 84sha512-ssse3-y := sha512-ssse3-asm.o sha512-avx-asm.o sha512-avx2-asm.o sha512_ssse3_glue.o
85crct10dif-pclmul-y := crct10dif-pcl-asm_64.o crct10dif-pclmul_glue.o
diff --git a/arch/x86/crypto/camellia_glue.c b/arch/x86/crypto/camellia_glue.c
index 5cb86ccd4acb..c171dcbf192d 100644
--- a/arch/x86/crypto/camellia_glue.c
+++ b/arch/x86/crypto/camellia_glue.c
@@ -62,7 +62,7 @@ static void camellia_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
62} 62}
63 63
64/* camellia sboxes */ 64/* camellia sboxes */
65const u64 camellia_sp10011110[256] = { 65__visible const u64 camellia_sp10011110[256] = {
66 0x7000007070707000ULL, 0x8200008282828200ULL, 0x2c00002c2c2c2c00ULL, 66 0x7000007070707000ULL, 0x8200008282828200ULL, 0x2c00002c2c2c2c00ULL,
67 0xec0000ecececec00ULL, 0xb30000b3b3b3b300ULL, 0x2700002727272700ULL, 67 0xec0000ecececec00ULL, 0xb30000b3b3b3b300ULL, 0x2700002727272700ULL,
68 0xc00000c0c0c0c000ULL, 0xe50000e5e5e5e500ULL, 0xe40000e4e4e4e400ULL, 68 0xc00000c0c0c0c000ULL, 0xe50000e5e5e5e500ULL, 0xe40000e4e4e4e400ULL,
@@ -151,7 +151,7 @@ const u64 camellia_sp10011110[256] = {
151 0x9e00009e9e9e9e00ULL, 151 0x9e00009e9e9e9e00ULL,
152}; 152};
153 153
154const u64 camellia_sp22000222[256] = { 154__visible const u64 camellia_sp22000222[256] = {
155 0xe0e0000000e0e0e0ULL, 0x0505000000050505ULL, 0x5858000000585858ULL, 155 0xe0e0000000e0e0e0ULL, 0x0505000000050505ULL, 0x5858000000585858ULL,
156 0xd9d9000000d9d9d9ULL, 0x6767000000676767ULL, 0x4e4e0000004e4e4eULL, 156 0xd9d9000000d9d9d9ULL, 0x6767000000676767ULL, 0x4e4e0000004e4e4eULL,
157 0x8181000000818181ULL, 0xcbcb000000cbcbcbULL, 0xc9c9000000c9c9c9ULL, 157 0x8181000000818181ULL, 0xcbcb000000cbcbcbULL, 0xc9c9000000c9c9c9ULL,
@@ -240,7 +240,7 @@ const u64 camellia_sp22000222[256] = {
240 0x3d3d0000003d3d3dULL, 240 0x3d3d0000003d3d3dULL,
241}; 241};
242 242
243const u64 camellia_sp03303033[256] = { 243__visible const u64 camellia_sp03303033[256] = {
244 0x0038380038003838ULL, 0x0041410041004141ULL, 0x0016160016001616ULL, 244 0x0038380038003838ULL, 0x0041410041004141ULL, 0x0016160016001616ULL,
245 0x0076760076007676ULL, 0x00d9d900d900d9d9ULL, 0x0093930093009393ULL, 245 0x0076760076007676ULL, 0x00d9d900d900d9d9ULL, 0x0093930093009393ULL,
246 0x0060600060006060ULL, 0x00f2f200f200f2f2ULL, 0x0072720072007272ULL, 246 0x0060600060006060ULL, 0x00f2f200f200f2f2ULL, 0x0072720072007272ULL,
@@ -329,7 +329,7 @@ const u64 camellia_sp03303033[256] = {
329 0x004f4f004f004f4fULL, 329 0x004f4f004f004f4fULL,
330}; 330};
331 331
332const u64 camellia_sp00444404[256] = { 332__visible const u64 camellia_sp00444404[256] = {
333 0x0000707070700070ULL, 0x00002c2c2c2c002cULL, 0x0000b3b3b3b300b3ULL, 333 0x0000707070700070ULL, 0x00002c2c2c2c002cULL, 0x0000b3b3b3b300b3ULL,
334 0x0000c0c0c0c000c0ULL, 0x0000e4e4e4e400e4ULL, 0x0000575757570057ULL, 334 0x0000c0c0c0c000c0ULL, 0x0000e4e4e4e400e4ULL, 0x0000575757570057ULL,
335 0x0000eaeaeaea00eaULL, 0x0000aeaeaeae00aeULL, 0x0000232323230023ULL, 335 0x0000eaeaeaea00eaULL, 0x0000aeaeaeae00aeULL, 0x0000232323230023ULL,
@@ -418,7 +418,7 @@ const u64 camellia_sp00444404[256] = {
418 0x00009e9e9e9e009eULL, 418 0x00009e9e9e9e009eULL,
419}; 419};
420 420
421const u64 camellia_sp02220222[256] = { 421__visible const u64 camellia_sp02220222[256] = {
422 0x00e0e0e000e0e0e0ULL, 0x0005050500050505ULL, 0x0058585800585858ULL, 422 0x00e0e0e000e0e0e0ULL, 0x0005050500050505ULL, 0x0058585800585858ULL,
423 0x00d9d9d900d9d9d9ULL, 0x0067676700676767ULL, 0x004e4e4e004e4e4eULL, 423 0x00d9d9d900d9d9d9ULL, 0x0067676700676767ULL, 0x004e4e4e004e4e4eULL,
424 0x0081818100818181ULL, 0x00cbcbcb00cbcbcbULL, 0x00c9c9c900c9c9c9ULL, 424 0x0081818100818181ULL, 0x00cbcbcb00cbcbcbULL, 0x00c9c9c900c9c9c9ULL,
@@ -507,7 +507,7 @@ const u64 camellia_sp02220222[256] = {
507 0x003d3d3d003d3d3dULL, 507 0x003d3d3d003d3d3dULL,
508}; 508};
509 509
510const u64 camellia_sp30333033[256] = { 510__visible const u64 camellia_sp30333033[256] = {
511 0x3800383838003838ULL, 0x4100414141004141ULL, 0x1600161616001616ULL, 511 0x3800383838003838ULL, 0x4100414141004141ULL, 0x1600161616001616ULL,
512 0x7600767676007676ULL, 0xd900d9d9d900d9d9ULL, 0x9300939393009393ULL, 512 0x7600767676007676ULL, 0xd900d9d9d900d9d9ULL, 0x9300939393009393ULL,
513 0x6000606060006060ULL, 0xf200f2f2f200f2f2ULL, 0x7200727272007272ULL, 513 0x6000606060006060ULL, 0xf200f2f2f200f2f2ULL, 0x7200727272007272ULL,
@@ -596,7 +596,7 @@ const u64 camellia_sp30333033[256] = {
596 0x4f004f4f4f004f4fULL, 596 0x4f004f4f4f004f4fULL,
597}; 597};
598 598
599const u64 camellia_sp44044404[256] = { 599__visible const u64 camellia_sp44044404[256] = {
600 0x7070007070700070ULL, 0x2c2c002c2c2c002cULL, 0xb3b300b3b3b300b3ULL, 600 0x7070007070700070ULL, 0x2c2c002c2c2c002cULL, 0xb3b300b3b3b300b3ULL,
601 0xc0c000c0c0c000c0ULL, 0xe4e400e4e4e400e4ULL, 0x5757005757570057ULL, 601 0xc0c000c0c0c000c0ULL, 0xe4e400e4e4e400e4ULL, 0x5757005757570057ULL,
602 0xeaea00eaeaea00eaULL, 0xaeae00aeaeae00aeULL, 0x2323002323230023ULL, 602 0xeaea00eaeaea00eaULL, 0xaeae00aeaeae00aeULL, 0x2323002323230023ULL,
@@ -685,7 +685,7 @@ const u64 camellia_sp44044404[256] = {
685 0x9e9e009e9e9e009eULL, 685 0x9e9e009e9e9e009eULL,
686}; 686};
687 687
688const u64 camellia_sp11101110[256] = { 688__visible const u64 camellia_sp11101110[256] = {
689 0x7070700070707000ULL, 0x8282820082828200ULL, 0x2c2c2c002c2c2c00ULL, 689 0x7070700070707000ULL, 0x8282820082828200ULL, 0x2c2c2c002c2c2c00ULL,
690 0xececec00ececec00ULL, 0xb3b3b300b3b3b300ULL, 0x2727270027272700ULL, 690 0xececec00ececec00ULL, 0xb3b3b300b3b3b300ULL, 0x2727270027272700ULL,
691 0xc0c0c000c0c0c000ULL, 0xe5e5e500e5e5e500ULL, 0xe4e4e400e4e4e400ULL, 691 0xc0c0c000c0c0c000ULL, 0xe5e5e500e5e5e500ULL, 0xe4e4e400e4e4e400ULL,
@@ -828,8 +828,8 @@ static void camellia_setup_tail(u64 *subkey, u64 *subRL, int max)
828 828
829 subRL[1] ^= (subRL[1] & ~subRL[9]) << 32; 829 subRL[1] ^= (subRL[1] & ~subRL[9]) << 32;
830 /* modified for FLinv(kl2) */ 830 /* modified for FLinv(kl2) */
831 dw = (subRL[1] & subRL[9]) >> 32, 831 dw = (subRL[1] & subRL[9]) >> 32;
832 subRL[1] ^= rol32(dw, 1); 832 subRL[1] ^= rol32(dw, 1);
833 833
834 /* round 8 */ 834 /* round 8 */
835 subRL[11] ^= subRL[1]; 835 subRL[11] ^= subRL[1];
@@ -840,8 +840,8 @@ static void camellia_setup_tail(u64 *subkey, u64 *subRL, int max)
840 840
841 subRL[1] ^= (subRL[1] & ~subRL[17]) << 32; 841 subRL[1] ^= (subRL[1] & ~subRL[17]) << 32;
842 /* modified for FLinv(kl4) */ 842 /* modified for FLinv(kl4) */
843 dw = (subRL[1] & subRL[17]) >> 32, 843 dw = (subRL[1] & subRL[17]) >> 32;
844 subRL[1] ^= rol32(dw, 1); 844 subRL[1] ^= rol32(dw, 1);
845 845
846 /* round 14 */ 846 /* round 14 */
847 subRL[19] ^= subRL[1]; 847 subRL[19] ^= subRL[1];
@@ -859,8 +859,8 @@ static void camellia_setup_tail(u64 *subkey, u64 *subRL, int max)
859 } else { 859 } else {
860 subRL[1] ^= (subRL[1] & ~subRL[25]) << 32; 860 subRL[1] ^= (subRL[1] & ~subRL[25]) << 32;
861 /* modified for FLinv(kl6) */ 861 /* modified for FLinv(kl6) */
862 dw = (subRL[1] & subRL[25]) >> 32, 862 dw = (subRL[1] & subRL[25]) >> 32;
863 subRL[1] ^= rol32(dw, 1); 863 subRL[1] ^= rol32(dw, 1);
864 864
865 /* round 20 */ 865 /* round 20 */
866 subRL[27] ^= subRL[1]; 866 subRL[27] ^= subRL[1];
@@ -882,8 +882,8 @@ static void camellia_setup_tail(u64 *subkey, u64 *subRL, int max)
882 882
883 kw4 ^= (kw4 & ~subRL[24]) << 32; 883 kw4 ^= (kw4 & ~subRL[24]) << 32;
884 /* modified for FL(kl5) */ 884 /* modified for FL(kl5) */
885 dw = (kw4 & subRL[24]) >> 32, 885 dw = (kw4 & subRL[24]) >> 32;
886 kw4 ^= rol32(dw, 1); 886 kw4 ^= rol32(dw, 1);
887 } 887 }
888 888
889 /* round 17 */ 889 /* round 17 */
@@ -895,8 +895,8 @@ static void camellia_setup_tail(u64 *subkey, u64 *subRL, int max)
895 895
896 kw4 ^= (kw4 & ~subRL[16]) << 32; 896 kw4 ^= (kw4 & ~subRL[16]) << 32;
897 /* modified for FL(kl3) */ 897 /* modified for FL(kl3) */
898 dw = (kw4 & subRL[16]) >> 32, 898 dw = (kw4 & subRL[16]) >> 32;
899 kw4 ^= rol32(dw, 1); 899 kw4 ^= rol32(dw, 1);
900 900
901 /* round 11 */ 901 /* round 11 */
902 subRL[14] ^= kw4; 902 subRL[14] ^= kw4;
@@ -907,8 +907,8 @@ static void camellia_setup_tail(u64 *subkey, u64 *subRL, int max)
907 907
908 kw4 ^= (kw4 & ~subRL[8]) << 32; 908 kw4 ^= (kw4 & ~subRL[8]) << 32;
909 /* modified for FL(kl1) */ 909 /* modified for FL(kl1) */
910 dw = (kw4 & subRL[8]) >> 32, 910 dw = (kw4 & subRL[8]) >> 32;
911 kw4 ^= rol32(dw, 1); 911 kw4 ^= rol32(dw, 1);
912 912
913 /* round 5 */ 913 /* round 5 */
914 subRL[6] ^= kw4; 914 subRL[6] ^= kw4;
@@ -928,8 +928,8 @@ static void camellia_setup_tail(u64 *subkey, u64 *subRL, int max)
928 SET_SUBKEY_LR(6, subRL[5] ^ subRL[7]); /* round 5 */ 928 SET_SUBKEY_LR(6, subRL[5] ^ subRL[7]); /* round 5 */
929 929
930 tl = (subRL[10] >> 32) ^ (subRL[10] & ~subRL[8]); 930 tl = (subRL[10] >> 32) ^ (subRL[10] & ~subRL[8]);
931 dw = tl & (subRL[8] >> 32), /* FL(kl1) */ 931 dw = tl & (subRL[8] >> 32); /* FL(kl1) */
932 tr = subRL[10] ^ rol32(dw, 1); 932 tr = subRL[10] ^ rol32(dw, 1);
933 tt = (tr | ((u64)tl << 32)); 933 tt = (tr | ((u64)tl << 32));
934 934
935 SET_SUBKEY_LR(7, subRL[6] ^ tt); /* round 6 */ 935 SET_SUBKEY_LR(7, subRL[6] ^ tt); /* round 6 */
@@ -937,8 +937,8 @@ static void camellia_setup_tail(u64 *subkey, u64 *subRL, int max)
937 SET_SUBKEY_LR(9, subRL[9]); /* FLinv(kl2) */ 937 SET_SUBKEY_LR(9, subRL[9]); /* FLinv(kl2) */
938 938
939 tl = (subRL[7] >> 32) ^ (subRL[7] & ~subRL[9]); 939 tl = (subRL[7] >> 32) ^ (subRL[7] & ~subRL[9]);
940 dw = tl & (subRL[9] >> 32), /* FLinv(kl2) */ 940 dw = tl & (subRL[9] >> 32); /* FLinv(kl2) */
941 tr = subRL[7] ^ rol32(dw, 1); 941 tr = subRL[7] ^ rol32(dw, 1);
942 tt = (tr | ((u64)tl << 32)); 942 tt = (tr | ((u64)tl << 32));
943 943
944 SET_SUBKEY_LR(10, subRL[11] ^ tt); /* round 7 */ 944 SET_SUBKEY_LR(10, subRL[11] ^ tt); /* round 7 */
@@ -948,8 +948,8 @@ static void camellia_setup_tail(u64 *subkey, u64 *subRL, int max)
948 SET_SUBKEY_LR(14, subRL[13] ^ subRL[15]); /* round 11 */ 948 SET_SUBKEY_LR(14, subRL[13] ^ subRL[15]); /* round 11 */
949 949
950 tl = (subRL[18] >> 32) ^ (subRL[18] & ~subRL[16]); 950 tl = (subRL[18] >> 32) ^ (subRL[18] & ~subRL[16]);
951 dw = tl & (subRL[16] >> 32), /* FL(kl3) */ 951 dw = tl & (subRL[16] >> 32); /* FL(kl3) */
952 tr = subRL[18] ^ rol32(dw, 1); 952 tr = subRL[18] ^ rol32(dw, 1);
953 tt = (tr | ((u64)tl << 32)); 953 tt = (tr | ((u64)tl << 32));
954 954
955 SET_SUBKEY_LR(15, subRL[14] ^ tt); /* round 12 */ 955 SET_SUBKEY_LR(15, subRL[14] ^ tt); /* round 12 */
@@ -957,8 +957,8 @@ static void camellia_setup_tail(u64 *subkey, u64 *subRL, int max)
957 SET_SUBKEY_LR(17, subRL[17]); /* FLinv(kl4) */ 957 SET_SUBKEY_LR(17, subRL[17]); /* FLinv(kl4) */
958 958
959 tl = (subRL[15] >> 32) ^ (subRL[15] & ~subRL[17]); 959 tl = (subRL[15] >> 32) ^ (subRL[15] & ~subRL[17]);
960 dw = tl & (subRL[17] >> 32), /* FLinv(kl4) */ 960 dw = tl & (subRL[17] >> 32); /* FLinv(kl4) */
961 tr = subRL[15] ^ rol32(dw, 1); 961 tr = subRL[15] ^ rol32(dw, 1);
962 tt = (tr | ((u64)tl << 32)); 962 tt = (tr | ((u64)tl << 32));
963 963
964 SET_SUBKEY_LR(18, subRL[19] ^ tt); /* round 13 */ 964 SET_SUBKEY_LR(18, subRL[19] ^ tt); /* round 13 */
@@ -972,8 +972,8 @@ static void camellia_setup_tail(u64 *subkey, u64 *subRL, int max)
972 SET_SUBKEY_LR(24, subRL[24] ^ subRL[23]); /* kw3 */ 972 SET_SUBKEY_LR(24, subRL[24] ^ subRL[23]); /* kw3 */
973 } else { 973 } else {
974 tl = (subRL[26] >> 32) ^ (subRL[26] & ~subRL[24]); 974 tl = (subRL[26] >> 32) ^ (subRL[26] & ~subRL[24]);
975 dw = tl & (subRL[24] >> 32), /* FL(kl5) */ 975 dw = tl & (subRL[24] >> 32); /* FL(kl5) */
976 tr = subRL[26] ^ rol32(dw, 1); 976 tr = subRL[26] ^ rol32(dw, 1);
977 tt = (tr | ((u64)tl << 32)); 977 tt = (tr | ((u64)tl << 32));
978 978
979 SET_SUBKEY_LR(23, subRL[22] ^ tt); /* round 18 */ 979 SET_SUBKEY_LR(23, subRL[22] ^ tt); /* round 18 */
@@ -981,8 +981,8 @@ static void camellia_setup_tail(u64 *subkey, u64 *subRL, int max)
981 SET_SUBKEY_LR(25, subRL[25]); /* FLinv(kl6) */ 981 SET_SUBKEY_LR(25, subRL[25]); /* FLinv(kl6) */
982 982
983 tl = (subRL[23] >> 32) ^ (subRL[23] & ~subRL[25]); 983 tl = (subRL[23] >> 32) ^ (subRL[23] & ~subRL[25]);
984 dw = tl & (subRL[25] >> 32), /* FLinv(kl6) */ 984 dw = tl & (subRL[25] >> 32); /* FLinv(kl6) */
985 tr = subRL[23] ^ rol32(dw, 1); 985 tr = subRL[23] ^ rol32(dw, 1);
986 tt = (tr | ((u64)tl << 32)); 986 tt = (tr | ((u64)tl << 32));
987 987
988 SET_SUBKEY_LR(26, subRL[27] ^ tt); /* round 19 */ 988 SET_SUBKEY_LR(26, subRL[27] ^ tt); /* round 19 */
diff --git a/arch/x86/crypto/crct10dif-pcl-asm_64.S b/arch/x86/crypto/crct10dif-pcl-asm_64.S
new file mode 100644
index 000000000000..35e97569d05f
--- /dev/null
+++ b/arch/x86/crypto/crct10dif-pcl-asm_64.S
@@ -0,0 +1,643 @@
1########################################################################
2# Implement fast CRC-T10DIF computation with SSE and PCLMULQDQ instructions
3#
4# Copyright (c) 2013, Intel Corporation
5#
6# Authors:
7# Erdinc Ozturk <erdinc.ozturk@intel.com>
8# Vinodh Gopal <vinodh.gopal@intel.com>
9# James Guilford <james.guilford@intel.com>
10# Tim Chen <tim.c.chen@linux.intel.com>
11#
12# This software is available to you under a choice of one of two
13# licenses. You may choose to be licensed under the terms of the GNU
14# General Public License (GPL) Version 2, available from the file
15# COPYING in the main directory of this source tree, or the
16# OpenIB.org BSD license below:
17#
18# Redistribution and use in source and binary forms, with or without
19# modification, are permitted provided that the following conditions are
20# met:
21#
22# * Redistributions of source code must retain the above copyright
23# notice, this list of conditions and the following disclaimer.
24#
25# * Redistributions in binary form must reproduce the above copyright
26# notice, this list of conditions and the following disclaimer in the
27# documentation and/or other materials provided with the
28# distribution.
29#
30# * Neither the name of the Intel Corporation nor the names of its
31# contributors may be used to endorse or promote products derived from
32# this software without specific prior written permission.
33#
34#
35# THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION ""AS IS"" AND ANY
36# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
38# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION OR
39# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
40# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
41# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
42# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
43# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
44# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
45# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
46########################################################################
47# Function API:
48# UINT16 crc_t10dif_pcl(
49# UINT16 init_crc, //initial CRC value, 16 bits
50# const unsigned char *buf, //buffer pointer to calculate CRC on
51# UINT64 len //buffer length in bytes (64-bit data)
52# );
53#
54# Reference paper titled "Fast CRC Computation for Generic
55# Polynomials Using PCLMULQDQ Instruction"
56# URL: http://www.intel.com/content/dam/www/public/us/en/documents
57# /white-papers/fast-crc-computation-generic-polynomials-pclmulqdq-paper.pdf
58#
59#
60
61#include <linux/linkage.h>
62
63.text
64
65#define arg1 %rdi
66#define arg2 %rsi
67#define arg3 %rdx
68
69#define arg1_low32 %edi
70
71ENTRY(crc_t10dif_pcl)
72.align 16
73
74 # adjust the 16-bit initial_crc value, scale it to 32 bits
75 shl $16, arg1_low32
76
77 # Allocate Stack Space
78 mov %rsp, %rcx
79 sub $16*2, %rsp
80 # align stack to 16 byte boundary
81 and $~(0x10 - 1), %rsp
82
83 # check if smaller than 256
84 cmp $256, arg3
85
86 # for sizes less than 128, we can't fold 64B at a time...
87 jl _less_than_128
88
89
90 # load the initial crc value
91 movd arg1_low32, %xmm10 # initial crc
92
93 # crc value does not need to be byte-reflected, but it needs
94 # to be moved to the high part of the register.
95 # because data will be byte-reflected and will align with
96 # initial crc at correct place.
97 pslldq $12, %xmm10
98
99 movdqa SHUF_MASK(%rip), %xmm11
100 # receive the initial 64B data, xor the initial crc value
101 movdqu 16*0(arg2), %xmm0
102 movdqu 16*1(arg2), %xmm1
103 movdqu 16*2(arg2), %xmm2
104 movdqu 16*3(arg2), %xmm3
105 movdqu 16*4(arg2), %xmm4
106 movdqu 16*5(arg2), %xmm5
107 movdqu 16*6(arg2), %xmm6
108 movdqu 16*7(arg2), %xmm7
109
110 pshufb %xmm11, %xmm0
111 # XOR the initial_crc value
112 pxor %xmm10, %xmm0
113 pshufb %xmm11, %xmm1
114 pshufb %xmm11, %xmm2
115 pshufb %xmm11, %xmm3
116 pshufb %xmm11, %xmm4
117 pshufb %xmm11, %xmm5
118 pshufb %xmm11, %xmm6
119 pshufb %xmm11, %xmm7
120
121 movdqa rk3(%rip), %xmm10 #xmm10 has rk3 and rk4
122 #imm value of pclmulqdq instruction
123 #will determine which constant to use
124
125 #################################################################
126 # we subtract 256 instead of 128 to save one instruction from the loop
127 sub $256, arg3
128
129 # at this section of the code, there is 64*x+y (0<=y<64) bytes of
130 # buffer. The _fold_64_B_loop will fold 64B at a time
131 # until we have 64+y Bytes of buffer
132
133
134 # fold 64B at a time. This section of the code folds 4 xmm
135 # registers in parallel
136_fold_64_B_loop:
137
138 # update the buffer pointer
139 add $128, arg2 # buf += 64#
140
141 movdqu 16*0(arg2), %xmm9
142 movdqu 16*1(arg2), %xmm12
143 pshufb %xmm11, %xmm9
144 pshufb %xmm11, %xmm12
145 movdqa %xmm0, %xmm8
146 movdqa %xmm1, %xmm13
147 pclmulqdq $0x0 , %xmm10, %xmm0
148 pclmulqdq $0x11, %xmm10, %xmm8
149 pclmulqdq $0x0 , %xmm10, %xmm1
150 pclmulqdq $0x11, %xmm10, %xmm13
151 pxor %xmm9 , %xmm0
152 xorps %xmm8 , %xmm0
153 pxor %xmm12, %xmm1
154 xorps %xmm13, %xmm1
155
156 movdqu 16*2(arg2), %xmm9
157 movdqu 16*3(arg2), %xmm12
158 pshufb %xmm11, %xmm9
159 pshufb %xmm11, %xmm12
160 movdqa %xmm2, %xmm8
161 movdqa %xmm3, %xmm13
162 pclmulqdq $0x0, %xmm10, %xmm2
163 pclmulqdq $0x11, %xmm10, %xmm8
164 pclmulqdq $0x0, %xmm10, %xmm3
165 pclmulqdq $0x11, %xmm10, %xmm13
166 pxor %xmm9 , %xmm2
167 xorps %xmm8 , %xmm2
168 pxor %xmm12, %xmm3
169 xorps %xmm13, %xmm3
170
171 movdqu 16*4(arg2), %xmm9
172 movdqu 16*5(arg2), %xmm12
173 pshufb %xmm11, %xmm9
174 pshufb %xmm11, %xmm12
175 movdqa %xmm4, %xmm8
176 movdqa %xmm5, %xmm13
177 pclmulqdq $0x0, %xmm10, %xmm4
178 pclmulqdq $0x11, %xmm10, %xmm8
179 pclmulqdq $0x0, %xmm10, %xmm5
180 pclmulqdq $0x11, %xmm10, %xmm13
181 pxor %xmm9 , %xmm4
182 xorps %xmm8 , %xmm4
183 pxor %xmm12, %xmm5
184 xorps %xmm13, %xmm5
185
186 movdqu 16*6(arg2), %xmm9
187 movdqu 16*7(arg2), %xmm12
188 pshufb %xmm11, %xmm9
189 pshufb %xmm11, %xmm12
190 movdqa %xmm6 , %xmm8
191 movdqa %xmm7 , %xmm13
192 pclmulqdq $0x0 , %xmm10, %xmm6
193 pclmulqdq $0x11, %xmm10, %xmm8
194 pclmulqdq $0x0 , %xmm10, %xmm7
195 pclmulqdq $0x11, %xmm10, %xmm13
196 pxor %xmm9 , %xmm6
197 xorps %xmm8 , %xmm6
198 pxor %xmm12, %xmm7
199 xorps %xmm13, %xmm7
200
201 sub $128, arg3
202
203 # check if there is another 64B in the buffer to be able to fold
204 jge _fold_64_B_loop
205 ##################################################################
206
207
208 add $128, arg2
209 # at this point, the buffer pointer is pointing at the last y Bytes
210 # of the buffer the 64B of folded data is in 4 of the xmm
211 # registers: xmm0, xmm1, xmm2, xmm3
212
213
214 # fold the 8 xmm registers to 1 xmm register with different constants
215
216 movdqa rk9(%rip), %xmm10
217 movdqa %xmm0, %xmm8
218 pclmulqdq $0x11, %xmm10, %xmm0
219 pclmulqdq $0x0 , %xmm10, %xmm8
220 pxor %xmm8, %xmm7
221 xorps %xmm0, %xmm7
222
223 movdqa rk11(%rip), %xmm10
224 movdqa %xmm1, %xmm8
225 pclmulqdq $0x11, %xmm10, %xmm1
226 pclmulqdq $0x0 , %xmm10, %xmm8
227 pxor %xmm8, %xmm7
228 xorps %xmm1, %xmm7
229
230 movdqa rk13(%rip), %xmm10
231 movdqa %xmm2, %xmm8
232 pclmulqdq $0x11, %xmm10, %xmm2
233 pclmulqdq $0x0 , %xmm10, %xmm8
234 pxor %xmm8, %xmm7
235 pxor %xmm2, %xmm7
236
237 movdqa rk15(%rip), %xmm10
238 movdqa %xmm3, %xmm8
239 pclmulqdq $0x11, %xmm10, %xmm3
240 pclmulqdq $0x0 , %xmm10, %xmm8
241 pxor %xmm8, %xmm7
242 xorps %xmm3, %xmm7
243
244 movdqa rk17(%rip), %xmm10
245 movdqa %xmm4, %xmm8
246 pclmulqdq $0x11, %xmm10, %xmm4
247 pclmulqdq $0x0 , %xmm10, %xmm8
248 pxor %xmm8, %xmm7
249 pxor %xmm4, %xmm7
250
251 movdqa rk19(%rip), %xmm10
252 movdqa %xmm5, %xmm8
253 pclmulqdq $0x11, %xmm10, %xmm5
254 pclmulqdq $0x0 , %xmm10, %xmm8
255 pxor %xmm8, %xmm7
256 xorps %xmm5, %xmm7
257
258 movdqa rk1(%rip), %xmm10 #xmm10 has rk1 and rk2
259 #imm value of pclmulqdq instruction
260 #will determine which constant to use
261 movdqa %xmm6, %xmm8
262 pclmulqdq $0x11, %xmm10, %xmm6
263 pclmulqdq $0x0 , %xmm10, %xmm8
264 pxor %xmm8, %xmm7
265 pxor %xmm6, %xmm7
266
267
268 # instead of 64, we add 48 to the loop counter to save 1 instruction
269 # from the loop instead of a cmp instruction, we use the negative
270 # flag with the jl instruction
271 add $128-16, arg3
272 jl _final_reduction_for_128
273
274 # now we have 16+y bytes left to reduce. 16 Bytes is in register xmm7
275 # and the rest is in memory. We can fold 16 bytes at a time if y>=16
276 # continue folding 16B at a time
277
278_16B_reduction_loop:
279 movdqa %xmm7, %xmm8
280 pclmulqdq $0x11, %xmm10, %xmm7
281 pclmulqdq $0x0 , %xmm10, %xmm8
282 pxor %xmm8, %xmm7
283 movdqu (arg2), %xmm0
284 pshufb %xmm11, %xmm0
285 pxor %xmm0 , %xmm7
286 add $16, arg2
287 sub $16, arg3
288 # instead of a cmp instruction, we utilize the flags with the
289 # jge instruction equivalent of: cmp arg3, 16-16
290 # check if there is any more 16B in the buffer to be able to fold
291 jge _16B_reduction_loop
292
293 #now we have 16+z bytes left to reduce, where 0<= z < 16.
294 #first, we reduce the data in the xmm7 register
295
296
297_final_reduction_for_128:
298 # check if any more data to fold. If not, compute the CRC of
299 # the final 128 bits
300 add $16, arg3
301 je _128_done
302
303 # here we are getting data that is less than 16 bytes.
304 # since we know that there was data before the pointer, we can
305 # offset the input pointer before the actual point, to receive
306 # exactly 16 bytes. after that the registers need to be adjusted.
307_get_last_two_xmms:
308 movdqa %xmm7, %xmm2
309
310 movdqu -16(arg2, arg3), %xmm1
311 pshufb %xmm11, %xmm1
312
313 # get rid of the extra data that was loaded before
314 # load the shift constant
315 lea pshufb_shf_table+16(%rip), %rax
316 sub arg3, %rax
317 movdqu (%rax), %xmm0
318
319 # shift xmm2 to the left by arg3 bytes
320 pshufb %xmm0, %xmm2
321
322 # shift xmm7 to the right by 16-arg3 bytes
323 pxor mask1(%rip), %xmm0
324 pshufb %xmm0, %xmm7
325 pblendvb %xmm2, %xmm1 #xmm0 is implicit
326
327 # fold 16 Bytes
328 movdqa %xmm1, %xmm2
329 movdqa %xmm7, %xmm8
330 pclmulqdq $0x11, %xmm10, %xmm7
331 pclmulqdq $0x0 , %xmm10, %xmm8
332 pxor %xmm8, %xmm7
333 pxor %xmm2, %xmm7
334
335_128_done:
336 # compute crc of a 128-bit value
337 movdqa rk5(%rip), %xmm10 # rk5 and rk6 in xmm10
338 movdqa %xmm7, %xmm0
339
340 #64b fold
341 pclmulqdq $0x1, %xmm10, %xmm7
342 pslldq $8 , %xmm0
343 pxor %xmm0, %xmm7
344
345 #32b fold
346 movdqa %xmm7, %xmm0
347
348 pand mask2(%rip), %xmm0
349
350 psrldq $12, %xmm7
351 pclmulqdq $0x10, %xmm10, %xmm7
352 pxor %xmm0, %xmm7
353
354 #barrett reduction
355_barrett:
356 movdqa rk7(%rip), %xmm10 # rk7 and rk8 in xmm10
357 movdqa %xmm7, %xmm0
358 pclmulqdq $0x01, %xmm10, %xmm7
359 pslldq $4, %xmm7
360 pclmulqdq $0x11, %xmm10, %xmm7
361
362 pslldq $4, %xmm7
363 pxor %xmm0, %xmm7
364 pextrd $1, %xmm7, %eax
365
366_cleanup:
367 # scale the result back to 16 bits
368 shr $16, %eax
369 mov %rcx, %rsp
370 ret
371
372########################################################################
373
374.align 16
375_less_than_128:
376
377 # check if there is enough buffer to be able to fold 16B at a time
378 cmp $32, arg3
379 jl _less_than_32
380 movdqa SHUF_MASK(%rip), %xmm11
381
382 # now if there is, load the constants
383 movdqa rk1(%rip), %xmm10 # rk1 and rk2 in xmm10
384
385 movd arg1_low32, %xmm0 # get the initial crc value
386 pslldq $12, %xmm0 # align it to its correct place
387 movdqu (arg2), %xmm7 # load the plaintext
388 pshufb %xmm11, %xmm7 # byte-reflect the plaintext
389 pxor %xmm0, %xmm7
390
391
392 # update the buffer pointer
393 add $16, arg2
394
395 # update the counter. subtract 32 instead of 16 to save one
396 # instruction from the loop
397 sub $32, arg3
398
399 jmp _16B_reduction_loop
400
401
402.align 16
403_less_than_32:
404 # mov initial crc to the return value. this is necessary for
405 # zero-length buffers.
406 mov arg1_low32, %eax
407 test arg3, arg3
408 je _cleanup
409
410 movdqa SHUF_MASK(%rip), %xmm11
411
412 movd arg1_low32, %xmm0 # get the initial crc value
413 pslldq $12, %xmm0 # align it to its correct place
414
415 cmp $16, arg3
416 je _exact_16_left
417 jl _less_than_16_left
418
419 movdqu (arg2), %xmm7 # load the plaintext
420 pshufb %xmm11, %xmm7 # byte-reflect the plaintext
421 pxor %xmm0 , %xmm7 # xor the initial crc value
422 add $16, arg2
423 sub $16, arg3
424 movdqa rk1(%rip), %xmm10 # rk1 and rk2 in xmm10
425 jmp _get_last_two_xmms
426
427
428.align 16
429_less_than_16_left:
430 # use stack space to load data less than 16 bytes, zero-out
431 # the 16B in memory first.
432
433 pxor %xmm1, %xmm1
434 mov %rsp, %r11
435 movdqa %xmm1, (%r11)
436
437 cmp $4, arg3
438 jl _only_less_than_4
439
440 # backup the counter value
441 mov arg3, %r9
442 cmp $8, arg3
443 jl _less_than_8_left
444
445 # load 8 Bytes
446 mov (arg2), %rax
447 mov %rax, (%r11)
448 add $8, %r11
449 sub $8, arg3
450 add $8, arg2
451_less_than_8_left:
452
453 cmp $4, arg3
454 jl _less_than_4_left
455
456 # load 4 Bytes
457 mov (arg2), %eax
458 mov %eax, (%r11)
459 add $4, %r11
460 sub $4, arg3
461 add $4, arg2
462_less_than_4_left:
463
464 cmp $2, arg3
465 jl _less_than_2_left
466
467 # load 2 Bytes
468 mov (arg2), %ax
469 mov %ax, (%r11)
470 add $2, %r11
471 sub $2, arg3
472 add $2, arg2
473_less_than_2_left:
474 cmp $1, arg3
475 jl _zero_left
476
477 # load 1 Byte
478 mov (arg2), %al
479 mov %al, (%r11)
480_zero_left:
481 movdqa (%rsp), %xmm7
482 pshufb %xmm11, %xmm7
483 pxor %xmm0 , %xmm7 # xor the initial crc value
484
485 # shl r9, 4
486 lea pshufb_shf_table+16(%rip), %rax
487 sub %r9, %rax
488 movdqu (%rax), %xmm0
489 pxor mask1(%rip), %xmm0
490
491 pshufb %xmm0, %xmm7
492 jmp _128_done
493
494.align 16
495_exact_16_left:
496 movdqu (arg2), %xmm7
497 pshufb %xmm11, %xmm7
498 pxor %xmm0 , %xmm7 # xor the initial crc value
499
500 jmp _128_done
501
502_only_less_than_4:
503 cmp $3, arg3
504 jl _only_less_than_3
505
506 # load 3 Bytes
507 mov (arg2), %al
508 mov %al, (%r11)
509
510 mov 1(arg2), %al
511 mov %al, 1(%r11)
512
513 mov 2(arg2), %al
514 mov %al, 2(%r11)
515
516 movdqa (%rsp), %xmm7
517 pshufb %xmm11, %xmm7
518 pxor %xmm0 , %xmm7 # xor the initial crc value
519
520 psrldq $5, %xmm7
521
522 jmp _barrett
523_only_less_than_3:
524 cmp $2, arg3
525 jl _only_less_than_2
526
527 # load 2 Bytes
528 mov (arg2), %al
529 mov %al, (%r11)
530
531 mov 1(arg2), %al
532 mov %al, 1(%r11)
533
534 movdqa (%rsp), %xmm7
535 pshufb %xmm11, %xmm7
536 pxor %xmm0 , %xmm7 # xor the initial crc value
537
538 psrldq $6, %xmm7
539
540 jmp _barrett
541_only_less_than_2:
542
543 # load 1 Byte
544 mov (arg2), %al
545 mov %al, (%r11)
546
547 movdqa (%rsp), %xmm7
548 pshufb %xmm11, %xmm7
549 pxor %xmm0 , %xmm7 # xor the initial crc value
550
551 psrldq $7, %xmm7
552
553 jmp _barrett
554
555ENDPROC(crc_t10dif_pcl)
556
557.data
558
559# precomputed constants
560# these constants are precomputed from the poly:
561# 0x8bb70000 (0x8bb7 scaled to 32 bits)
562.align 16
563# Q = 0x18BB70000
564# rk1 = 2^(32*3) mod Q << 32
565# rk2 = 2^(32*5) mod Q << 32
566# rk3 = 2^(32*15) mod Q << 32
567# rk4 = 2^(32*17) mod Q << 32
568# rk5 = 2^(32*3) mod Q << 32
569# rk6 = 2^(32*2) mod Q << 32
570# rk7 = floor(2^64/Q)
571# rk8 = Q
572rk1:
573.quad 0x2d56000000000000
574rk2:
575.quad 0x06df000000000000
576rk3:
577.quad 0x9d9d000000000000
578rk4:
579.quad 0x7cf5000000000000
580rk5:
581.quad 0x2d56000000000000
582rk6:
583.quad 0x1368000000000000
584rk7:
585.quad 0x00000001f65a57f8
586rk8:
587.quad 0x000000018bb70000
588
589rk9:
590.quad 0xceae000000000000
591rk10:
592.quad 0xbfd6000000000000
593rk11:
594.quad 0x1e16000000000000
595rk12:
596.quad 0x713c000000000000
597rk13:
598.quad 0xf7f9000000000000
599rk14:
600.quad 0x80a6000000000000
601rk15:
602.quad 0x044c000000000000
603rk16:
604.quad 0xe658000000000000
605rk17:
606.quad 0xad18000000000000
607rk18:
608.quad 0xa497000000000000
609rk19:
610.quad 0x6ee3000000000000
611rk20:
612.quad 0xe7b5000000000000
613
614
615
616mask1:
617.octa 0x80808080808080808080808080808080
618mask2:
619.octa 0x00000000FFFFFFFFFFFFFFFFFFFFFFFF
620
621SHUF_MASK:
622.octa 0x000102030405060708090A0B0C0D0E0F
623
624pshufb_shf_table:
625# use these values for shift constants for the pshufb instruction
626# different alignments result in values as shown:
627# DDQ 0x008f8e8d8c8b8a898887868584838281 # shl 15 (16-1) / shr1
628# DDQ 0x01008f8e8d8c8b8a8988878685848382 # shl 14 (16-3) / shr2
629# DDQ 0x0201008f8e8d8c8b8a89888786858483 # shl 13 (16-4) / shr3
630# DDQ 0x030201008f8e8d8c8b8a898887868584 # shl 12 (16-4) / shr4
631# DDQ 0x04030201008f8e8d8c8b8a8988878685 # shl 11 (16-5) / shr5
632# DDQ 0x0504030201008f8e8d8c8b8a89888786 # shl 10 (16-6) / shr6
633# DDQ 0x060504030201008f8e8d8c8b8a898887 # shl 9 (16-7) / shr7
634# DDQ 0x07060504030201008f8e8d8c8b8a8988 # shl 8 (16-8) / shr8
635# DDQ 0x0807060504030201008f8e8d8c8b8a89 # shl 7 (16-9) / shr9
636# DDQ 0x090807060504030201008f8e8d8c8b8a # shl 6 (16-10) / shr10
637# DDQ 0x0a090807060504030201008f8e8d8c8b # shl 5 (16-11) / shr11
638# DDQ 0x0b0a090807060504030201008f8e8d8c # shl 4 (16-12) / shr12
639# DDQ 0x0c0b0a090807060504030201008f8e8d # shl 3 (16-13) / shr13
640# DDQ 0x0d0c0b0a090807060504030201008f8e # shl 2 (16-14) / shr14
641# DDQ 0x0e0d0c0b0a090807060504030201008f # shl 1 (16-15) / shr15
642.octa 0x8f8e8d8c8b8a89888786858483828100
643.octa 0x000e0d0c0b0a09080706050403020100
diff --git a/arch/x86/crypto/crct10dif-pclmul_glue.c b/arch/x86/crypto/crct10dif-pclmul_glue.c
new file mode 100644
index 000000000000..7845d7fd54c0
--- /dev/null
+++ b/arch/x86/crypto/crct10dif-pclmul_glue.c
@@ -0,0 +1,151 @@
1/*
2 * Cryptographic API.
3 *
4 * T10 Data Integrity Field CRC16 Crypto Transform using PCLMULQDQ Instructions
5 *
6 * Copyright (C) 2013 Intel Corporation
7 * Author: Tim Chen <tim.c.chen@linux.intel.com>
8 *
9 * This program is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU General Public License as published by the Free
11 * Software Foundation; either version 2 of the License, or (at your option)
12 * any later version.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
18 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
19 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 * SOFTWARE.
22 *
23 */
24
25#include <linux/types.h>
26#include <linux/module.h>
27#include <linux/crc-t10dif.h>
28#include <crypto/internal/hash.h>
29#include <linux/init.h>
30#include <linux/string.h>
31#include <linux/kernel.h>
32#include <asm/i387.h>
33#include <asm/cpufeature.h>
34#include <asm/cpu_device_id.h>
35
36asmlinkage __u16 crc_t10dif_pcl(__u16 crc, const unsigned char *buf,
37 size_t len);
38
39struct chksum_desc_ctx {
40 __u16 crc;
41};
42
43/*
44 * Steps through buffer one byte at at time, calculates reflected
45 * crc using table.
46 */
47
48static int chksum_init(struct shash_desc *desc)
49{
50 struct chksum_desc_ctx *ctx = shash_desc_ctx(desc);
51
52 ctx->crc = 0;
53
54 return 0;
55}
56
57static int chksum_update(struct shash_desc *desc, const u8 *data,
58 unsigned int length)
59{
60 struct chksum_desc_ctx *ctx = shash_desc_ctx(desc);
61
62 if (irq_fpu_usable()) {
63 kernel_fpu_begin();
64 ctx->crc = crc_t10dif_pcl(ctx->crc, data, length);
65 kernel_fpu_end();
66 } else
67 ctx->crc = crc_t10dif_generic(ctx->crc, data, length);
68 return 0;
69}
70
71static int chksum_final(struct shash_desc *desc, u8 *out)
72{
73 struct chksum_desc_ctx *ctx = shash_desc_ctx(desc);
74
75 *(__u16 *)out = ctx->crc;
76 return 0;
77}
78
79static int __chksum_finup(__u16 *crcp, const u8 *data, unsigned int len,
80 u8 *out)
81{
82 if (irq_fpu_usable()) {
83 kernel_fpu_begin();
84 *(__u16 *)out = crc_t10dif_pcl(*crcp, data, len);
85 kernel_fpu_end();
86 } else
87 *(__u16 *)out = crc_t10dif_generic(*crcp, data, len);
88 return 0;
89}
90
91static int chksum_finup(struct shash_desc *desc, const u8 *data,
92 unsigned int len, u8 *out)
93{
94 struct chksum_desc_ctx *ctx = shash_desc_ctx(desc);
95
96 return __chksum_finup(&ctx->crc, data, len, out);
97}
98
99static int chksum_digest(struct shash_desc *desc, const u8 *data,
100 unsigned int length, u8 *out)
101{
102 struct chksum_desc_ctx *ctx = shash_desc_ctx(desc);
103
104 return __chksum_finup(&ctx->crc, data, length, out);
105}
106
107static struct shash_alg alg = {
108 .digestsize = CRC_T10DIF_DIGEST_SIZE,
109 .init = chksum_init,
110 .update = chksum_update,
111 .final = chksum_final,
112 .finup = chksum_finup,
113 .digest = chksum_digest,
114 .descsize = sizeof(struct chksum_desc_ctx),
115 .base = {
116 .cra_name = "crct10dif",
117 .cra_driver_name = "crct10dif-pclmul",
118 .cra_priority = 200,
119 .cra_blocksize = CRC_T10DIF_BLOCK_SIZE,
120 .cra_module = THIS_MODULE,
121 }
122};
123
124static const struct x86_cpu_id crct10dif_cpu_id[] = {
125 X86_FEATURE_MATCH(X86_FEATURE_PCLMULQDQ),
126 {}
127};
128MODULE_DEVICE_TABLE(x86cpu, crct10dif_cpu_id);
129
130static int __init crct10dif_intel_mod_init(void)
131{
132 if (!x86_match_cpu(crct10dif_cpu_id))
133 return -ENODEV;
134
135 return crypto_register_shash(&alg);
136}
137
138static void __exit crct10dif_intel_mod_fini(void)
139{
140 crypto_unregister_shash(&alg);
141}
142
143module_init(crct10dif_intel_mod_init);
144module_exit(crct10dif_intel_mod_fini);
145
146MODULE_AUTHOR("Tim Chen <tim.c.chen@linux.intel.com>");
147MODULE_DESCRIPTION("T10 DIF CRC calculation accelerated with PCLMULQDQ.");
148MODULE_LICENSE("GPL");
149
150MODULE_ALIAS("crct10dif");
151MODULE_ALIAS("crct10dif-pclmul");
diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c
index bccfca68430e..665a730307f2 100644
--- a/arch/x86/ia32/ia32_signal.c
+++ b/arch/x86/ia32/ia32_signal.c
@@ -457,7 +457,7 @@ int ia32_setup_rt_frame(int sig, struct ksignal *ksig,
457 else 457 else
458 put_user_ex(0, &frame->uc.uc_flags); 458 put_user_ex(0, &frame->uc.uc_flags);
459 put_user_ex(0, &frame->uc.uc_link); 459 put_user_ex(0, &frame->uc.uc_link);
460 err |= __compat_save_altstack(&frame->uc.uc_stack, regs->sp); 460 compat_save_altstack_ex(&frame->uc.uc_stack, regs->sp);
461 461
462 if (ksig->ka.sa.sa_flags & SA_RESTORER) 462 if (ksig->ka.sa.sa_flags & SA_RESTORER)
463 restorer = ksig->ka.sa.sa_restorer; 463 restorer = ksig->ka.sa.sa_restorer;
diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S
index 474dc1b59f72..4299eb05023c 100644
--- a/arch/x86/ia32/ia32entry.S
+++ b/arch/x86/ia32/ia32entry.S
@@ -452,7 +452,7 @@ ia32_badsys:
452 452
453 CFI_ENDPROC 453 CFI_ENDPROC
454 454
455 .macro PTREGSCALL label, func, arg 455 .macro PTREGSCALL label, func
456 ALIGN 456 ALIGN
457GLOBAL(\label) 457GLOBAL(\label)
458 leaq \func(%rip),%rax 458 leaq \func(%rip),%rax
diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h
index 2dfac58f3b11..b1977bad5435 100644
--- a/arch/x86/include/asm/acpi.h
+++ b/arch/x86/include/asm/acpi.h
@@ -86,6 +86,7 @@ extern int acpi_pci_disabled;
86extern int acpi_skip_timer_override; 86extern int acpi_skip_timer_override;
87extern int acpi_use_timer_override; 87extern int acpi_use_timer_override;
88extern int acpi_fix_pin2_polarity; 88extern int acpi_fix_pin2_polarity;
89extern int acpi_disable_cmcff;
89 90
90extern u8 acpi_sci_flags; 91extern u8 acpi_sci_flags;
91extern int acpi_sci_override_gsi; 92extern int acpi_sci_override_gsi;
@@ -168,6 +169,7 @@ static inline void arch_acpi_set_pdc_bits(u32 *buf)
168 169
169#define acpi_lapic 0 170#define acpi_lapic 0
170#define acpi_ioapic 0 171#define acpi_ioapic 0
172#define acpi_disable_cmcff 0
171static inline void acpi_noirq_set(void) { } 173static inline void acpi_noirq_set(void) { }
172static inline void acpi_disable_pci(void) { } 174static inline void acpi_disable_pci(void) { }
173static inline void disable_acpi(void) { } 175static inline void disable_acpi(void) { }
diff --git a/arch/x86/include/asm/alternative.h b/arch/x86/include/asm/alternative.h
index 58ed6d96a6ac..0a3f9c9f98d5 100644
--- a/arch/x86/include/asm/alternative.h
+++ b/arch/x86/include/asm/alternative.h
@@ -5,6 +5,7 @@
5#include <linux/stddef.h> 5#include <linux/stddef.h>
6#include <linux/stringify.h> 6#include <linux/stringify.h>
7#include <asm/asm.h> 7#include <asm/asm.h>
8#include <asm/ptrace.h>
8 9
9/* 10/*
10 * Alternative inline assembly for SMP. 11 * Alternative inline assembly for SMP.
@@ -220,20 +221,11 @@ extern void *text_poke_early(void *addr, const void *opcode, size_t len);
220 * no thread can be preempted in the instructions being modified (no iret to an 221 * no thread can be preempted in the instructions being modified (no iret to an
221 * invalid instruction possible) or if the instructions are changed from a 222 * invalid instruction possible) or if the instructions are changed from a
222 * consistent state to another consistent state atomically. 223 * consistent state to another consistent state atomically.
223 * More care must be taken when modifying code in the SMP case because of
224 * Intel's errata. text_poke_smp() takes care that errata, but still
225 * doesn't support NMI/MCE handler code modifying.
226 * On the local CPU you need to be protected again NMI or MCE handlers seeing an 224 * On the local CPU you need to be protected again NMI or MCE handlers seeing an
227 * inconsistent instruction while you patch. 225 * inconsistent instruction while you patch.
228 */ 226 */
229struct text_poke_param {
230 void *addr;
231 const void *opcode;
232 size_t len;
233};
234
235extern void *text_poke(void *addr, const void *opcode, size_t len); 227extern void *text_poke(void *addr, const void *opcode, size_t len);
236extern void *text_poke_smp(void *addr, const void *opcode, size_t len); 228extern int poke_int3_handler(struct pt_regs *regs);
237extern void text_poke_smp_batch(struct text_poke_param *params, int n); 229extern void *text_poke_bp(void *addr, const void *opcode, size_t len, void *handler);
238 230
239#endif /* _ASM_X86_ALTERNATIVE_H */ 231#endif /* _ASM_X86_ALTERNATIVE_H */
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
index f8119b582c3c..1d2091a226bc 100644
--- a/arch/x86/include/asm/apic.h
+++ b/arch/x86/include/asm/apic.h
@@ -715,4 +715,6 @@ static inline void exiting_ack_irq(void)
715 ack_APIC_irq(); 715 ack_APIC_irq();
716} 716}
717 717
718extern void ioapic_zap_locks(void);
719
718#endif /* _ASM_X86_APIC_H */ 720#endif /* _ASM_X86_APIC_H */
diff --git a/arch/x86/include/asm/asm.h b/arch/x86/include/asm/asm.h
index 1c2d247f65ce..4582e8e1cd1a 100644
--- a/arch/x86/include/asm/asm.h
+++ b/arch/x86/include/asm/asm.h
@@ -3,21 +3,25 @@
3 3
4#ifdef __ASSEMBLY__ 4#ifdef __ASSEMBLY__
5# define __ASM_FORM(x) x 5# define __ASM_FORM(x) x
6# define __ASM_FORM_RAW(x) x
6# define __ASM_FORM_COMMA(x) x, 7# define __ASM_FORM_COMMA(x) x,
7#else 8#else
8# define __ASM_FORM(x) " " #x " " 9# define __ASM_FORM(x) " " #x " "
10# define __ASM_FORM_RAW(x) #x
9# define __ASM_FORM_COMMA(x) " " #x "," 11# define __ASM_FORM_COMMA(x) " " #x ","
10#endif 12#endif
11 13
12#ifdef CONFIG_X86_32 14#ifdef CONFIG_X86_32
13# define __ASM_SEL(a,b) __ASM_FORM(a) 15# define __ASM_SEL(a,b) __ASM_FORM(a)
16# define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(a)
14#else 17#else
15# define __ASM_SEL(a,b) __ASM_FORM(b) 18# define __ASM_SEL(a,b) __ASM_FORM(b)
19# define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(b)
16#endif 20#endif
17 21
18#define __ASM_SIZE(inst, ...) __ASM_SEL(inst##l##__VA_ARGS__, \ 22#define __ASM_SIZE(inst, ...) __ASM_SEL(inst##l##__VA_ARGS__, \
19 inst##q##__VA_ARGS__) 23 inst##q##__VA_ARGS__)
20#define __ASM_REG(reg) __ASM_SEL(e##reg, r##reg) 24#define __ASM_REG(reg) __ASM_SEL_RAW(e##reg, r##reg)
21 25
22#define _ASM_PTR __ASM_SEL(.long, .quad) 26#define _ASM_PTR __ASM_SEL(.long, .quad)
23#define _ASM_ALIGN __ASM_SEL(.balign 4, .balign 8) 27#define _ASM_ALIGN __ASM_SEL(.balign 4, .balign 8)
diff --git a/arch/x86/include/asm/bitops.h b/arch/x86/include/asm/bitops.h
index 6dfd0195bb55..41639ce8fd63 100644
--- a/arch/x86/include/asm/bitops.h
+++ b/arch/x86/include/asm/bitops.h
@@ -15,6 +15,14 @@
15#include <linux/compiler.h> 15#include <linux/compiler.h>
16#include <asm/alternative.h> 16#include <asm/alternative.h>
17 17
18#if BITS_PER_LONG == 32
19# define _BITOPS_LONG_SHIFT 5
20#elif BITS_PER_LONG == 64
21# define _BITOPS_LONG_SHIFT 6
22#else
23# error "Unexpected BITS_PER_LONG"
24#endif
25
18#define BIT_64(n) (U64_C(1) << (n)) 26#define BIT_64(n) (U64_C(1) << (n))
19 27
20/* 28/*
@@ -59,7 +67,7 @@
59 * restricted to acting on a single-word quantity. 67 * restricted to acting on a single-word quantity.
60 */ 68 */
61static __always_inline void 69static __always_inline void
62set_bit(unsigned int nr, volatile unsigned long *addr) 70set_bit(long nr, volatile unsigned long *addr)
63{ 71{
64 if (IS_IMMEDIATE(nr)) { 72 if (IS_IMMEDIATE(nr)) {
65 asm volatile(LOCK_PREFIX "orb %1,%0" 73 asm volatile(LOCK_PREFIX "orb %1,%0"
@@ -81,7 +89,7 @@ set_bit(unsigned int nr, volatile unsigned long *addr)
81 * If it's called on the same region of memory simultaneously, the effect 89 * If it's called on the same region of memory simultaneously, the effect
82 * may be that only one operation succeeds. 90 * may be that only one operation succeeds.
83 */ 91 */
84static inline void __set_bit(int nr, volatile unsigned long *addr) 92static inline void __set_bit(long nr, volatile unsigned long *addr)
85{ 93{
86 asm volatile("bts %1,%0" : ADDR : "Ir" (nr) : "memory"); 94 asm volatile("bts %1,%0" : ADDR : "Ir" (nr) : "memory");
87} 95}
@@ -97,7 +105,7 @@ static inline void __set_bit(int nr, volatile unsigned long *addr)
97 * in order to ensure changes are visible on other processors. 105 * in order to ensure changes are visible on other processors.
98 */ 106 */
99static __always_inline void 107static __always_inline void
100clear_bit(int nr, volatile unsigned long *addr) 108clear_bit(long nr, volatile unsigned long *addr)
101{ 109{
102 if (IS_IMMEDIATE(nr)) { 110 if (IS_IMMEDIATE(nr)) {
103 asm volatile(LOCK_PREFIX "andb %1,%0" 111 asm volatile(LOCK_PREFIX "andb %1,%0"
@@ -118,13 +126,13 @@ clear_bit(int nr, volatile unsigned long *addr)
118 * clear_bit() is atomic and implies release semantics before the memory 126 * clear_bit() is atomic and implies release semantics before the memory
119 * operation. It can be used for an unlock. 127 * operation. It can be used for an unlock.
120 */ 128 */
121static inline void clear_bit_unlock(unsigned nr, volatile unsigned long *addr) 129static inline void clear_bit_unlock(long nr, volatile unsigned long *addr)
122{ 130{
123 barrier(); 131 barrier();
124 clear_bit(nr, addr); 132 clear_bit(nr, addr);
125} 133}
126 134
127static inline void __clear_bit(int nr, volatile unsigned long *addr) 135static inline void __clear_bit(long nr, volatile unsigned long *addr)
128{ 136{
129 asm volatile("btr %1,%0" : ADDR : "Ir" (nr)); 137 asm volatile("btr %1,%0" : ADDR : "Ir" (nr));
130} 138}
@@ -141,7 +149,7 @@ static inline void __clear_bit(int nr, volatile unsigned long *addr)
141 * No memory barrier is required here, because x86 cannot reorder stores past 149 * No memory barrier is required here, because x86 cannot reorder stores past
142 * older loads. Same principle as spin_unlock. 150 * older loads. Same principle as spin_unlock.
143 */ 151 */
144static inline void __clear_bit_unlock(unsigned nr, volatile unsigned long *addr) 152static inline void __clear_bit_unlock(long nr, volatile unsigned long *addr)
145{ 153{
146 barrier(); 154 barrier();
147 __clear_bit(nr, addr); 155 __clear_bit(nr, addr);
@@ -159,7 +167,7 @@ static inline void __clear_bit_unlock(unsigned nr, volatile unsigned long *addr)
159 * If it's called on the same region of memory simultaneously, the effect 167 * If it's called on the same region of memory simultaneously, the effect
160 * may be that only one operation succeeds. 168 * may be that only one operation succeeds.
161 */ 169 */
162static inline void __change_bit(int nr, volatile unsigned long *addr) 170static inline void __change_bit(long nr, volatile unsigned long *addr)
163{ 171{
164 asm volatile("btc %1,%0" : ADDR : "Ir" (nr)); 172 asm volatile("btc %1,%0" : ADDR : "Ir" (nr));
165} 173}
@@ -173,7 +181,7 @@ static inline void __change_bit(int nr, volatile unsigned long *addr)
173 * Note that @nr may be almost arbitrarily large; this function is not 181 * Note that @nr may be almost arbitrarily large; this function is not
174 * restricted to acting on a single-word quantity. 182 * restricted to acting on a single-word quantity.
175 */ 183 */
176static inline void change_bit(int nr, volatile unsigned long *addr) 184static inline void change_bit(long nr, volatile unsigned long *addr)
177{ 185{
178 if (IS_IMMEDIATE(nr)) { 186 if (IS_IMMEDIATE(nr)) {
179 asm volatile(LOCK_PREFIX "xorb %1,%0" 187 asm volatile(LOCK_PREFIX "xorb %1,%0"
@@ -194,7 +202,7 @@ static inline void change_bit(int nr, volatile unsigned long *addr)
194 * This operation is atomic and cannot be reordered. 202 * This operation is atomic and cannot be reordered.
195 * It also implies a memory barrier. 203 * It also implies a memory barrier.
196 */ 204 */
197static inline int test_and_set_bit(int nr, volatile unsigned long *addr) 205static inline int test_and_set_bit(long nr, volatile unsigned long *addr)
198{ 206{
199 int oldbit; 207 int oldbit;
200 208
@@ -212,7 +220,7 @@ static inline int test_and_set_bit(int nr, volatile unsigned long *addr)
212 * This is the same as test_and_set_bit on x86. 220 * This is the same as test_and_set_bit on x86.
213 */ 221 */
214static __always_inline int 222static __always_inline int
215test_and_set_bit_lock(int nr, volatile unsigned long *addr) 223test_and_set_bit_lock(long nr, volatile unsigned long *addr)
216{ 224{
217 return test_and_set_bit(nr, addr); 225 return test_and_set_bit(nr, addr);
218} 226}
@@ -226,7 +234,7 @@ test_and_set_bit_lock(int nr, volatile unsigned long *addr)
226 * If two examples of this operation race, one can appear to succeed 234 * If two examples of this operation race, one can appear to succeed
227 * but actually fail. You must protect multiple accesses with a lock. 235 * but actually fail. You must protect multiple accesses with a lock.
228 */ 236 */
229static inline int __test_and_set_bit(int nr, volatile unsigned long *addr) 237static inline int __test_and_set_bit(long nr, volatile unsigned long *addr)
230{ 238{
231 int oldbit; 239 int oldbit;
232 240
@@ -245,7 +253,7 @@ static inline int __test_and_set_bit(int nr, volatile unsigned long *addr)
245 * This operation is atomic and cannot be reordered. 253 * This operation is atomic and cannot be reordered.
246 * It also implies a memory barrier. 254 * It also implies a memory barrier.
247 */ 255 */
248static inline int test_and_clear_bit(int nr, volatile unsigned long *addr) 256static inline int test_and_clear_bit(long nr, volatile unsigned long *addr)
249{ 257{
250 int oldbit; 258 int oldbit;
251 259
@@ -272,7 +280,7 @@ static inline int test_and_clear_bit(int nr, volatile unsigned long *addr)
272 * accessed from a hypervisor on the same CPU if running in a VM: don't change 280 * accessed from a hypervisor on the same CPU if running in a VM: don't change
273 * this without also updating arch/x86/kernel/kvm.c 281 * this without also updating arch/x86/kernel/kvm.c
274 */ 282 */
275static inline int __test_and_clear_bit(int nr, volatile unsigned long *addr) 283static inline int __test_and_clear_bit(long nr, volatile unsigned long *addr)
276{ 284{
277 int oldbit; 285 int oldbit;
278 286
@@ -284,7 +292,7 @@ static inline int __test_and_clear_bit(int nr, volatile unsigned long *addr)
284} 292}
285 293
286/* WARNING: non atomic and it can be reordered! */ 294/* WARNING: non atomic and it can be reordered! */
287static inline int __test_and_change_bit(int nr, volatile unsigned long *addr) 295static inline int __test_and_change_bit(long nr, volatile unsigned long *addr)
288{ 296{
289 int oldbit; 297 int oldbit;
290 298
@@ -304,7 +312,7 @@ static inline int __test_and_change_bit(int nr, volatile unsigned long *addr)
304 * This operation is atomic and cannot be reordered. 312 * This operation is atomic and cannot be reordered.
305 * It also implies a memory barrier. 313 * It also implies a memory barrier.
306 */ 314 */
307static inline int test_and_change_bit(int nr, volatile unsigned long *addr) 315static inline int test_and_change_bit(long nr, volatile unsigned long *addr)
308{ 316{
309 int oldbit; 317 int oldbit;
310 318
@@ -315,13 +323,13 @@ static inline int test_and_change_bit(int nr, volatile unsigned long *addr)
315 return oldbit; 323 return oldbit;
316} 324}
317 325
318static __always_inline int constant_test_bit(unsigned int nr, const volatile unsigned long *addr) 326static __always_inline int constant_test_bit(long nr, const volatile unsigned long *addr)
319{ 327{
320 return ((1UL << (nr % BITS_PER_LONG)) & 328 return ((1UL << (nr & (BITS_PER_LONG-1))) &
321 (addr[nr / BITS_PER_LONG])) != 0; 329 (addr[nr >> _BITOPS_LONG_SHIFT])) != 0;
322} 330}
323 331
324static inline int variable_test_bit(int nr, volatile const unsigned long *addr) 332static inline int variable_test_bit(long nr, volatile const unsigned long *addr)
325{ 333{
326 int oldbit; 334 int oldbit;
327 335
diff --git a/arch/x86/include/asm/checksum_32.h b/arch/x86/include/asm/checksum_32.h
index 46fc474fd819..f50de6951738 100644
--- a/arch/x86/include/asm/checksum_32.h
+++ b/arch/x86/include/asm/checksum_32.h
@@ -49,9 +49,15 @@ static inline __wsum csum_partial_copy_from_user(const void __user *src,
49 int len, __wsum sum, 49 int len, __wsum sum,
50 int *err_ptr) 50 int *err_ptr)
51{ 51{
52 __wsum ret;
53
52 might_sleep(); 54 might_sleep();
53 return csum_partial_copy_generic((__force void *)src, dst, 55 stac();
54 len, sum, err_ptr, NULL); 56 ret = csum_partial_copy_generic((__force void *)src, dst,
57 len, sum, err_ptr, NULL);
58 clac();
59
60 return ret;
55} 61}
56 62
57/* 63/*
@@ -176,10 +182,16 @@ static inline __wsum csum_and_copy_to_user(const void *src,
176 int len, __wsum sum, 182 int len, __wsum sum,
177 int *err_ptr) 183 int *err_ptr)
178{ 184{
185 __wsum ret;
186
179 might_sleep(); 187 might_sleep();
180 if (access_ok(VERIFY_WRITE, dst, len)) 188 if (access_ok(VERIFY_WRITE, dst, len)) {
181 return csum_partial_copy_generic(src, (__force void *)dst, 189 stac();
182 len, sum, NULL, err_ptr); 190 ret = csum_partial_copy_generic(src, (__force void *)dst,
191 len, sum, NULL, err_ptr);
192 clac();
193 return ret;
194 }
183 195
184 if (len) 196 if (len)
185 *err_ptr = -EFAULT; 197 *err_ptr = -EFAULT;
diff --git a/arch/x86/include/asm/checksum_64.h b/arch/x86/include/asm/checksum_64.h
index 9bfdc41629ec..e6fd8a026c7b 100644
--- a/arch/x86/include/asm/checksum_64.h
+++ b/arch/x86/include/asm/checksum_64.h
@@ -133,7 +133,7 @@ extern __wsum csum_partial(const void *buff, int len, __wsum sum);
133 133
134 134
135/* Do not call this directly. Use the wrappers below */ 135/* Do not call this directly. Use the wrappers below */
136extern __wsum csum_partial_copy_generic(const void *src, const void *dst, 136extern __visible __wsum csum_partial_copy_generic(const void *src, const void *dst,
137 int len, __wsum sum, 137 int len, __wsum sum,
138 int *src_err_ptr, int *dst_err_ptr); 138 int *src_err_ptr, int *dst_err_ptr);
139 139
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h
index 47538a61c91b..d3f5c63078d8 100644
--- a/arch/x86/include/asm/cpufeature.h
+++ b/arch/x86/include/asm/cpufeature.h
@@ -366,9 +366,10 @@ extern bool __static_cpu_has_safe(u16 bit);
366 */ 366 */
367static __always_inline __pure bool __static_cpu_has(u16 bit) 367static __always_inline __pure bool __static_cpu_has(u16 bit)
368{ 368{
369#if __GNUC__ > 4 || __GNUC_MINOR__ >= 5 369#ifdef CC_HAVE_ASM_GOTO
370 370
371#ifdef CONFIG_X86_DEBUG_STATIC_CPU_HAS 371#ifdef CONFIG_X86_DEBUG_STATIC_CPU_HAS
372
372 /* 373 /*
373 * Catch too early usage of this before alternatives 374 * Catch too early usage of this before alternatives
374 * have run. 375 * have run.
@@ -384,6 +385,7 @@ static __always_inline __pure bool __static_cpu_has(u16 bit)
384 ".previous\n" 385 ".previous\n"
385 /* skipping size check since replacement size = 0 */ 386 /* skipping size check since replacement size = 0 */
386 : : "i" (X86_FEATURE_ALWAYS) : : t_warn); 387 : : "i" (X86_FEATURE_ALWAYS) : : t_warn);
388
387#endif 389#endif
388 390
389 asm goto("1: jmp %l[t_no]\n" 391 asm goto("1: jmp %l[t_no]\n"
@@ -406,7 +408,9 @@ static __always_inline __pure bool __static_cpu_has(u16 bit)
406 warn_pre_alternatives(); 408 warn_pre_alternatives();
407 return false; 409 return false;
408#endif 410#endif
409#else /* GCC_VERSION >= 40500 */ 411
412#else /* CC_HAVE_ASM_GOTO */
413
410 u8 flag; 414 u8 flag;
411 /* Open-coded due to __stringify() in ALTERNATIVE() */ 415 /* Open-coded due to __stringify() in ALTERNATIVE() */
412 asm volatile("1: movb $0,%0\n" 416 asm volatile("1: movb $0,%0\n"
@@ -427,7 +431,8 @@ static __always_inline __pure bool __static_cpu_has(u16 bit)
427 ".previous\n" 431 ".previous\n"
428 : "=qm" (flag) : "i" (bit)); 432 : "=qm" (flag) : "i" (bit));
429 return flag; 433 return flag;
430#endif 434
435#endif /* CC_HAVE_ASM_GOTO */
431} 436}
432 437
433#define static_cpu_has(bit) \ 438#define static_cpu_has(bit) \
@@ -441,7 +446,7 @@ static __always_inline __pure bool __static_cpu_has(u16 bit)
441 446
442static __always_inline __pure bool _static_cpu_has_safe(u16 bit) 447static __always_inline __pure bool _static_cpu_has_safe(u16 bit)
443{ 448{
444#if __GNUC__ > 4 || __GNUC_MINOR__ >= 5 449#ifdef CC_HAVE_ASM_GOTO
445/* 450/*
446 * We need to spell the jumps to the compiler because, depending on the offset, 451 * We need to spell the jumps to the compiler because, depending on the offset,
447 * the replacement jump can be bigger than the original jump, and this we cannot 452 * the replacement jump can be bigger than the original jump, and this we cannot
@@ -475,7 +480,7 @@ static __always_inline __pure bool _static_cpu_has_safe(u16 bit)
475 return false; 480 return false;
476 t_dynamic: 481 t_dynamic:
477 return __static_cpu_has_safe(bit); 482 return __static_cpu_has_safe(bit);
478#else /* GCC_VERSION >= 40500 */ 483#else
479 u8 flag; 484 u8 flag;
480 /* Open-coded due to __stringify() in ALTERNATIVE() */ 485 /* Open-coded due to __stringify() in ALTERNATIVE() */
481 asm volatile("1: movb $2,%0\n" 486 asm volatile("1: movb $2,%0\n"
@@ -511,7 +516,7 @@ static __always_inline __pure bool _static_cpu_has_safe(u16 bit)
511 : "=qm" (flag) 516 : "=qm" (flag)
512 : "i" (bit), "i" (X86_FEATURE_ALWAYS)); 517 : "i" (bit), "i" (X86_FEATURE_ALWAYS));
513 return (flag == 2 ? __static_cpu_has_safe(bit) : flag); 518 return (flag == 2 ? __static_cpu_has_safe(bit) : flag);
514#endif 519#endif /* CC_HAVE_ASM_GOTO */
515} 520}
516 521
517#define static_cpu_has_safe(bit) \ 522#define static_cpu_has_safe(bit) \
diff --git a/arch/x86/include/asm/dma-contiguous.h b/arch/x86/include/asm/dma-contiguous.h
index c09241659971..b4b38bacb404 100644
--- a/arch/x86/include/asm/dma-contiguous.h
+++ b/arch/x86/include/asm/dma-contiguous.h
@@ -4,7 +4,6 @@
4#ifdef __KERNEL__ 4#ifdef __KERNEL__
5 5
6#include <linux/types.h> 6#include <linux/types.h>
7#include <asm-generic/dma-contiguous.h>
8 7
9static inline void 8static inline void
10dma_contiguous_early_fixup(phys_addr_t base, unsigned long size) { } 9dma_contiguous_early_fixup(phys_addr_t base, unsigned long size) { }
diff --git a/arch/x86/include/asm/e820.h b/arch/x86/include/asm/e820.h
index cccd07fa5e3a..779c2efe2e97 100644
--- a/arch/x86/include/asm/e820.h
+++ b/arch/x86/include/asm/e820.h
@@ -29,7 +29,7 @@ extern void e820_setup_gap(void);
29extern int e820_search_gap(unsigned long *gapstart, unsigned long *gapsize, 29extern int e820_search_gap(unsigned long *gapstart, unsigned long *gapsize,
30 unsigned long start_addr, unsigned long long end_addr); 30 unsigned long start_addr, unsigned long long end_addr);
31struct setup_data; 31struct setup_data;
32extern void parse_e820_ext(struct setup_data *data); 32extern void parse_e820_ext(u64 phys_addr, u32 data_len);
33 33
34#if defined(CONFIG_X86_64) || \ 34#if defined(CONFIG_X86_64) || \
35 (defined(CONFIG_X86_32) && defined(CONFIG_HIBERNATION)) 35 (defined(CONFIG_X86_32) && defined(CONFIG_HIBERNATION))
diff --git a/arch/x86/include/asm/hw_irq.h b/arch/x86/include/asm/hw_irq.h
index e4ac559c4a24..92b3bae08b74 100644
--- a/arch/x86/include/asm/hw_irq.h
+++ b/arch/x86/include/asm/hw_irq.h
@@ -26,56 +26,56 @@
26#include <asm/sections.h> 26#include <asm/sections.h>
27 27
28/* Interrupt handlers registered during init_IRQ */ 28/* Interrupt handlers registered during init_IRQ */
29extern void apic_timer_interrupt(void); 29extern asmlinkage void apic_timer_interrupt(void);
30extern void x86_platform_ipi(void); 30extern asmlinkage void x86_platform_ipi(void);
31extern void kvm_posted_intr_ipi(void); 31extern asmlinkage void kvm_posted_intr_ipi(void);
32extern void error_interrupt(void); 32extern asmlinkage void error_interrupt(void);
33extern void irq_work_interrupt(void); 33extern asmlinkage void irq_work_interrupt(void);
34 34
35extern void spurious_interrupt(void); 35extern asmlinkage void spurious_interrupt(void);
36extern void thermal_interrupt(void); 36extern asmlinkage void thermal_interrupt(void);
37extern void reschedule_interrupt(void); 37extern asmlinkage void reschedule_interrupt(void);
38 38
39extern void invalidate_interrupt(void); 39extern asmlinkage void invalidate_interrupt(void);
40extern void invalidate_interrupt0(void); 40extern asmlinkage void invalidate_interrupt0(void);
41extern void invalidate_interrupt1(void); 41extern asmlinkage void invalidate_interrupt1(void);
42extern void invalidate_interrupt2(void); 42extern asmlinkage void invalidate_interrupt2(void);
43extern void invalidate_interrupt3(void); 43extern asmlinkage void invalidate_interrupt3(void);
44extern void invalidate_interrupt4(void); 44extern asmlinkage void invalidate_interrupt4(void);
45extern void invalidate_interrupt5(void); 45extern asmlinkage void invalidate_interrupt5(void);
46extern void invalidate_interrupt6(void); 46extern asmlinkage void invalidate_interrupt6(void);
47extern void invalidate_interrupt7(void); 47extern asmlinkage void invalidate_interrupt7(void);
48extern void invalidate_interrupt8(void); 48extern asmlinkage void invalidate_interrupt8(void);
49extern void invalidate_interrupt9(void); 49extern asmlinkage void invalidate_interrupt9(void);
50extern void invalidate_interrupt10(void); 50extern asmlinkage void invalidate_interrupt10(void);
51extern void invalidate_interrupt11(void); 51extern asmlinkage void invalidate_interrupt11(void);
52extern void invalidate_interrupt12(void); 52extern asmlinkage void invalidate_interrupt12(void);
53extern void invalidate_interrupt13(void); 53extern asmlinkage void invalidate_interrupt13(void);
54extern void invalidate_interrupt14(void); 54extern asmlinkage void invalidate_interrupt14(void);
55extern void invalidate_interrupt15(void); 55extern asmlinkage void invalidate_interrupt15(void);
56extern void invalidate_interrupt16(void); 56extern asmlinkage void invalidate_interrupt16(void);
57extern void invalidate_interrupt17(void); 57extern asmlinkage void invalidate_interrupt17(void);
58extern void invalidate_interrupt18(void); 58extern asmlinkage void invalidate_interrupt18(void);
59extern void invalidate_interrupt19(void); 59extern asmlinkage void invalidate_interrupt19(void);
60extern void invalidate_interrupt20(void); 60extern asmlinkage void invalidate_interrupt20(void);
61extern void invalidate_interrupt21(void); 61extern asmlinkage void invalidate_interrupt21(void);
62extern void invalidate_interrupt22(void); 62extern asmlinkage void invalidate_interrupt22(void);
63extern void invalidate_interrupt23(void); 63extern asmlinkage void invalidate_interrupt23(void);
64extern void invalidate_interrupt24(void); 64extern asmlinkage void invalidate_interrupt24(void);
65extern void invalidate_interrupt25(void); 65extern asmlinkage void invalidate_interrupt25(void);
66extern void invalidate_interrupt26(void); 66extern asmlinkage void invalidate_interrupt26(void);
67extern void invalidate_interrupt27(void); 67extern asmlinkage void invalidate_interrupt27(void);
68extern void invalidate_interrupt28(void); 68extern asmlinkage void invalidate_interrupt28(void);
69extern void invalidate_interrupt29(void); 69extern asmlinkage void invalidate_interrupt29(void);
70extern void invalidate_interrupt30(void); 70extern asmlinkage void invalidate_interrupt30(void);
71extern void invalidate_interrupt31(void); 71extern asmlinkage void invalidate_interrupt31(void);
72 72
73extern void irq_move_cleanup_interrupt(void); 73extern asmlinkage void irq_move_cleanup_interrupt(void);
74extern void reboot_interrupt(void); 74extern asmlinkage void reboot_interrupt(void);
75extern void threshold_interrupt(void); 75extern asmlinkage void threshold_interrupt(void);
76 76
77extern void call_function_interrupt(void); 77extern asmlinkage void call_function_interrupt(void);
78extern void call_function_single_interrupt(void); 78extern asmlinkage void call_function_single_interrupt(void);
79 79
80#ifdef CONFIG_TRACING 80#ifdef CONFIG_TRACING
81/* Interrupt handlers registered during init_IRQ */ 81/* Interrupt handlers registered during init_IRQ */
@@ -172,22 +172,18 @@ extern atomic_t irq_mis_count;
172extern void eisa_set_level_irq(unsigned int irq); 172extern void eisa_set_level_irq(unsigned int irq);
173 173
174/* SMP */ 174/* SMP */
175extern void smp_apic_timer_interrupt(struct pt_regs *); 175extern __visible void smp_apic_timer_interrupt(struct pt_regs *);
176extern void smp_spurious_interrupt(struct pt_regs *); 176extern __visible void smp_spurious_interrupt(struct pt_regs *);
177extern void smp_x86_platform_ipi(struct pt_regs *); 177extern __visible void smp_x86_platform_ipi(struct pt_regs *);
178extern void smp_error_interrupt(struct pt_regs *); 178extern __visible void smp_error_interrupt(struct pt_regs *);
179#ifdef CONFIG_X86_IO_APIC 179#ifdef CONFIG_X86_IO_APIC
180extern asmlinkage void smp_irq_move_cleanup_interrupt(void); 180extern asmlinkage void smp_irq_move_cleanup_interrupt(void);
181#endif 181#endif
182#ifdef CONFIG_SMP 182#ifdef CONFIG_SMP
183extern void smp_reschedule_interrupt(struct pt_regs *); 183extern __visible void smp_reschedule_interrupt(struct pt_regs *);
184extern void smp_call_function_interrupt(struct pt_regs *); 184extern __visible void smp_call_function_interrupt(struct pt_regs *);
185extern void smp_call_function_single_interrupt(struct pt_regs *); 185extern __visible void smp_call_function_single_interrupt(struct pt_regs *);
186#ifdef CONFIG_X86_32 186extern __visible void smp_invalidate_interrupt(struct pt_regs *);
187extern void smp_invalidate_interrupt(struct pt_regs *);
188#else
189extern asmlinkage void smp_invalidate_interrupt(struct pt_regs *);
190#endif
191#endif 187#endif
192 188
193extern void (*__initconst interrupt[NR_VECTORS-FIRST_EXTERNAL_VECTOR])(void); 189extern void (*__initconst interrupt[NR_VECTORS-FIRST_EXTERNAL_VECTOR])(void);
diff --git a/arch/x86/include/asm/hypervisor.h b/arch/x86/include/asm/hypervisor.h
index 2d4b5e6107cd..e42f758a0fbd 100644
--- a/arch/x86/include/asm/hypervisor.h
+++ b/arch/x86/include/asm/hypervisor.h
@@ -33,7 +33,7 @@ struct hypervisor_x86 {
33 const char *name; 33 const char *name;
34 34
35 /* Detection routine */ 35 /* Detection routine */
36 bool (*detect)(void); 36 uint32_t (*detect)(void);
37 37
38 /* Adjust CPU feature bits (run once per CPU) */ 38 /* Adjust CPU feature bits (run once per CPU) */
39 void (*set_cpu_features)(struct cpuinfo_x86 *); 39 void (*set_cpu_features)(struct cpuinfo_x86 *);
diff --git a/arch/x86/include/asm/irq.h b/arch/x86/include/asm/irq.h
index 57873beb3292..0ea10f27d613 100644
--- a/arch/x86/include/asm/irq.h
+++ b/arch/x86/include/asm/irq.h
@@ -33,7 +33,7 @@ extern void (*x86_platform_ipi_callback)(void);
33extern void native_init_IRQ(void); 33extern void native_init_IRQ(void);
34extern bool handle_irq(unsigned irq, struct pt_regs *regs); 34extern bool handle_irq(unsigned irq, struct pt_regs *regs);
35 35
36extern unsigned int do_IRQ(struct pt_regs *regs); 36extern __visible unsigned int do_IRQ(struct pt_regs *regs);
37 37
38/* Interrupt vector management */ 38/* Interrupt vector management */
39extern DECLARE_BITMAP(used_vectors, NR_VECTORS); 39extern DECLARE_BITMAP(used_vectors, NR_VECTORS);
diff --git a/arch/x86/include/asm/jump_label.h b/arch/x86/include/asm/jump_label.h
index 3a16c1483b45..64507f35800c 100644
--- a/arch/x86/include/asm/jump_label.h
+++ b/arch/x86/include/asm/jump_label.h
@@ -3,18 +3,23 @@
3 3
4#ifdef __KERNEL__ 4#ifdef __KERNEL__
5 5
6#include <linux/stringify.h>
6#include <linux/types.h> 7#include <linux/types.h>
7#include <asm/nops.h> 8#include <asm/nops.h>
8#include <asm/asm.h> 9#include <asm/asm.h>
9 10
10#define JUMP_LABEL_NOP_SIZE 5 11#define JUMP_LABEL_NOP_SIZE 5
11 12
12#define STATIC_KEY_INITIAL_NOP ".byte 0xe9 \n\t .long 0\n\t" 13#ifdef CONFIG_X86_64
14# define STATIC_KEY_INIT_NOP P6_NOP5_ATOMIC
15#else
16# define STATIC_KEY_INIT_NOP GENERIC_NOP5_ATOMIC
17#endif
13 18
14static __always_inline bool arch_static_branch(struct static_key *key) 19static __always_inline bool arch_static_branch(struct static_key *key)
15{ 20{
16 asm goto("1:" 21 asm goto("1:"
17 STATIC_KEY_INITIAL_NOP 22 ".byte " __stringify(STATIC_KEY_INIT_NOP) "\n\t"
18 ".pushsection __jump_table, \"aw\" \n\t" 23 ".pushsection __jump_table, \"aw\" \n\t"
19 _ASM_ALIGN "\n\t" 24 _ASM_ALIGN "\n\t"
20 _ASM_PTR "1b, %l[l_yes], %c0 \n\t" 25 _ASM_PTR "1b, %l[l_yes], %c0 \n\t"
diff --git a/arch/x86/include/asm/kprobes.h b/arch/x86/include/asm/kprobes.h
index 5a6d2873f80e..9454c167629f 100644
--- a/arch/x86/include/asm/kprobes.h
+++ b/arch/x86/include/asm/kprobes.h
@@ -49,10 +49,10 @@ typedef u8 kprobe_opcode_t;
49#define flush_insn_slot(p) do { } while (0) 49#define flush_insn_slot(p) do { } while (0)
50 50
51/* optinsn template addresses */ 51/* optinsn template addresses */
52extern kprobe_opcode_t optprobe_template_entry; 52extern __visible kprobe_opcode_t optprobe_template_entry;
53extern kprobe_opcode_t optprobe_template_val; 53extern __visible kprobe_opcode_t optprobe_template_val;
54extern kprobe_opcode_t optprobe_template_call; 54extern __visible kprobe_opcode_t optprobe_template_call;
55extern kprobe_opcode_t optprobe_template_end; 55extern __visible kprobe_opcode_t optprobe_template_end;
56#define MAX_OPTIMIZED_LENGTH (MAX_INSN_SIZE + RELATIVE_ADDR_SIZE) 56#define MAX_OPTIMIZED_LENGTH (MAX_INSN_SIZE + RELATIVE_ADDR_SIZE)
57#define MAX_OPTINSN_SIZE \ 57#define MAX_OPTINSN_SIZE \
58 (((unsigned long)&optprobe_template_end - \ 58 (((unsigned long)&optprobe_template_end - \
@@ -62,7 +62,7 @@ extern kprobe_opcode_t optprobe_template_end;
62extern const int kretprobe_blacklist_size; 62extern const int kretprobe_blacklist_size;
63 63
64void arch_remove_kprobe(struct kprobe *p); 64void arch_remove_kprobe(struct kprobe *p);
65void kretprobe_trampoline(void); 65asmlinkage void kretprobe_trampoline(void);
66 66
67/* Architecture specific copy of original instruction*/ 67/* Architecture specific copy of original instruction*/
68struct arch_specific_insn { 68struct arch_specific_insn {
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index f87f7fcefa0a..c76ff74a98f2 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -286,6 +286,7 @@ struct kvm_mmu {
286 u64 *pae_root; 286 u64 *pae_root;
287 u64 *lm_root; 287 u64 *lm_root;
288 u64 rsvd_bits_mask[2][4]; 288 u64 rsvd_bits_mask[2][4];
289 u64 bad_mt_xwr;
289 290
290 /* 291 /*
291 * Bitmap: bit set = last pte in walk 292 * Bitmap: bit set = last pte in walk
@@ -323,6 +324,7 @@ struct kvm_pmu {
323 u64 global_ovf_ctrl; 324 u64 global_ovf_ctrl;
324 u64 counter_bitmask[2]; 325 u64 counter_bitmask[2];
325 u64 global_ctrl_mask; 326 u64 global_ctrl_mask;
327 u64 reserved_bits;
326 u8 version; 328 u8 version;
327 struct kvm_pmc gp_counters[INTEL_PMC_MAX_GENERIC]; 329 struct kvm_pmc gp_counters[INTEL_PMC_MAX_GENERIC];
328 struct kvm_pmc fixed_counters[INTEL_PMC_MAX_FIXED]; 330 struct kvm_pmc fixed_counters[INTEL_PMC_MAX_FIXED];
@@ -511,6 +513,14 @@ struct kvm_vcpu_arch {
511 * instruction. 513 * instruction.
512 */ 514 */
513 bool write_fault_to_shadow_pgtable; 515 bool write_fault_to_shadow_pgtable;
516
517 /* set at EPT violation at this point */
518 unsigned long exit_qualification;
519
520 /* pv related host specific info */
521 struct {
522 bool pv_unhalted;
523 } pv;
514}; 524};
515 525
516struct kvm_lpage_info { 526struct kvm_lpage_info {
@@ -802,8 +812,8 @@ extern u32 kvm_min_guest_tsc_khz;
802extern u32 kvm_max_guest_tsc_khz; 812extern u32 kvm_max_guest_tsc_khz;
803 813
804enum emulation_result { 814enum emulation_result {
805 EMULATE_DONE, /* no further processing */ 815 EMULATE_DONE, /* no further processing */
806 EMULATE_DO_MMIO, /* kvm_run filled with mmio request */ 816 EMULATE_USER_EXIT, /* kvm_run ready for userspace exit */
807 EMULATE_FAIL, /* can't emulate this instruction */ 817 EMULATE_FAIL, /* can't emulate this instruction */
808}; 818};
809 819
diff --git a/arch/x86/include/asm/kvm_para.h b/arch/x86/include/asm/kvm_para.h
index 427afcbf3d55..1df115909758 100644
--- a/arch/x86/include/asm/kvm_para.h
+++ b/arch/x86/include/asm/kvm_para.h
@@ -85,26 +85,20 @@ static inline long kvm_hypercall4(unsigned int nr, unsigned long p1,
85 return ret; 85 return ret;
86} 86}
87 87
88static inline bool kvm_para_available(void) 88static inline uint32_t kvm_cpuid_base(void)
89{ 89{
90 unsigned int eax, ebx, ecx, edx;
91 char signature[13];
92
93 if (boot_cpu_data.cpuid_level < 0) 90 if (boot_cpu_data.cpuid_level < 0)
94 return false; /* So we don't blow up on old processors */ 91 return 0; /* So we don't blow up on old processors */
95 92
96 if (cpu_has_hypervisor) { 93 if (cpu_has_hypervisor)
97 cpuid(KVM_CPUID_SIGNATURE, &eax, &ebx, &ecx, &edx); 94 return hypervisor_cpuid_base("KVMKVMKVM\0\0\0", 0);
98 memcpy(signature + 0, &ebx, 4);
99 memcpy(signature + 4, &ecx, 4);
100 memcpy(signature + 8, &edx, 4);
101 signature[12] = 0;
102 95
103 if (strcmp(signature, "KVMKVMKVM") == 0) 96 return 0;
104 return true; 97}
105 }
106 98
107 return false; 99static inline bool kvm_para_available(void)
100{
101 return kvm_cpuid_base() != 0;
108} 102}
109 103
110static inline unsigned int kvm_arch_para_features(void) 104static inline unsigned int kvm_arch_para_features(void)
diff --git a/arch/x86/include/asm/mce.h b/arch/x86/include/asm/mce.h
index 29e3093bbd21..cbe6b9e404ce 100644
--- a/arch/x86/include/asm/mce.h
+++ b/arch/x86/include/asm/mce.h
@@ -32,11 +32,20 @@
32#define MCI_STATUS_PCC (1ULL<<57) /* processor context corrupt */ 32#define MCI_STATUS_PCC (1ULL<<57) /* processor context corrupt */
33#define MCI_STATUS_S (1ULL<<56) /* Signaled machine check */ 33#define MCI_STATUS_S (1ULL<<56) /* Signaled machine check */
34#define MCI_STATUS_AR (1ULL<<55) /* Action required */ 34#define MCI_STATUS_AR (1ULL<<55) /* Action required */
35#define MCACOD 0xffff /* MCA Error Code */ 35
36/*
37 * Note that the full MCACOD field of IA32_MCi_STATUS MSR is
38 * bits 15:0. But bit 12 is the 'F' bit, defined for corrected
39 * errors to indicate that errors are being filtered by hardware.
40 * We should mask out bit 12 when looking for specific signatures
41 * of uncorrected errors - so the F bit is deliberately skipped
42 * in this #define.
43 */
44#define MCACOD 0xefff /* MCA Error Code */
36 45
37/* Architecturally defined codes from SDM Vol. 3B Chapter 15 */ 46/* Architecturally defined codes from SDM Vol. 3B Chapter 15 */
38#define MCACOD_SCRUB 0x00C0 /* 0xC0-0xCF Memory Scrubbing */ 47#define MCACOD_SCRUB 0x00C0 /* 0xC0-0xCF Memory Scrubbing */
39#define MCACOD_SCRUBMSK 0xfff0 48#define MCACOD_SCRUBMSK 0xeff0 /* Skip bit 12 ('F' bit) */
40#define MCACOD_L3WB 0x017A /* L3 Explicit Writeback */ 49#define MCACOD_L3WB 0x017A /* L3 Explicit Writeback */
41#define MCACOD_DATA 0x0134 /* Data Load */ 50#define MCACOD_DATA 0x0134 /* Data Load */
42#define MCACOD_INSTR 0x0150 /* Instruction Fetch */ 51#define MCACOD_INSTR 0x0150 /* Instruction Fetch */
@@ -188,6 +197,9 @@ extern void register_mce_write_callback(ssize_t (*)(struct file *filp,
188 const char __user *ubuf, 197 const char __user *ubuf,
189 size_t usize, loff_t *off)); 198 size_t usize, loff_t *off));
190 199
200/* Disable CMCI/polling for MCA bank claimed by firmware */
201extern void mce_disable_bank(int bank);
202
191/* 203/*
192 * Exception handler 204 * Exception handler
193 */ 205 */
diff --git a/arch/x86/include/asm/mmu_context.h b/arch/x86/include/asm/mmu_context.h
index cdbf36776106..be12c534fd59 100644
--- a/arch/x86/include/asm/mmu_context.h
+++ b/arch/x86/include/asm/mmu_context.h
@@ -45,22 +45,28 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
45 /* Re-load page tables */ 45 /* Re-load page tables */
46 load_cr3(next->pgd); 46 load_cr3(next->pgd);
47 47
48 /* stop flush ipis for the previous mm */ 48 /* Stop flush ipis for the previous mm */
49 cpumask_clear_cpu(cpu, mm_cpumask(prev)); 49 cpumask_clear_cpu(cpu, mm_cpumask(prev));
50 50
51 /* 51 /* Load the LDT, if the LDT is different: */
52 * load the LDT, if the LDT is different:
53 */
54 if (unlikely(prev->context.ldt != next->context.ldt)) 52 if (unlikely(prev->context.ldt != next->context.ldt))
55 load_LDT_nolock(&next->context); 53 load_LDT_nolock(&next->context);
56 } 54 }
57#ifdef CONFIG_SMP 55#ifdef CONFIG_SMP
58 else { 56 else {
59 this_cpu_write(cpu_tlbstate.state, TLBSTATE_OK); 57 this_cpu_write(cpu_tlbstate.state, TLBSTATE_OK);
60 BUG_ON(this_cpu_read(cpu_tlbstate.active_mm) != next); 58 BUG_ON(this_cpu_read(cpu_tlbstate.active_mm) != next);
61 59
62 if (!cpumask_test_and_set_cpu(cpu, mm_cpumask(next))) { 60 if (!cpumask_test_cpu(cpu, mm_cpumask(next))) {
63 /* We were in lazy tlb mode and leave_mm disabled 61 /*
62 * On established mms, the mm_cpumask is only changed
63 * from irq context, from ptep_clear_flush() while in
64 * lazy tlb mode, and here. Irqs are blocked during
65 * schedule, protecting us from simultaneous changes.
66 */
67 cpumask_set_cpu(cpu, mm_cpumask(next));
68 /*
69 * We were in lazy tlb mode and leave_mm disabled
64 * tlb flush IPI delivery. We must reload CR3 70 * tlb flush IPI delivery. We must reload CR3
65 * to make sure to use no freed page tables. 71 * to make sure to use no freed page tables.
66 */ 72 */
diff --git a/arch/x86/include/asm/mutex_64.h b/arch/x86/include/asm/mutex_64.h
index 2c543fff241b..e7e6751648ed 100644
--- a/arch/x86/include/asm/mutex_64.h
+++ b/arch/x86/include/asm/mutex_64.h
@@ -16,6 +16,20 @@
16 * 16 *
17 * Atomically decrements @v and calls <fail_fn> if the result is negative. 17 * Atomically decrements @v and calls <fail_fn> if the result is negative.
18 */ 18 */
19#ifdef CC_HAVE_ASM_GOTO
20static inline void __mutex_fastpath_lock(atomic_t *v,
21 void (*fail_fn)(atomic_t *))
22{
23 asm volatile goto(LOCK_PREFIX " decl %0\n"
24 " jns %l[exit]\n"
25 : : "m" (v->counter)
26 : "memory", "cc"
27 : exit);
28 fail_fn(v);
29exit:
30 return;
31}
32#else
19#define __mutex_fastpath_lock(v, fail_fn) \ 33#define __mutex_fastpath_lock(v, fail_fn) \
20do { \ 34do { \
21 unsigned long dummy; \ 35 unsigned long dummy; \
@@ -32,6 +46,7 @@ do { \
32 : "rax", "rsi", "rdx", "rcx", \ 46 : "rax", "rsi", "rdx", "rcx", \
33 "r8", "r9", "r10", "r11", "memory"); \ 47 "r8", "r9", "r10", "r11", "memory"); \
34} while (0) 48} while (0)
49#endif
35 50
36/** 51/**
37 * __mutex_fastpath_lock_retval - try to take the lock by moving the count 52 * __mutex_fastpath_lock_retval - try to take the lock by moving the count
@@ -56,6 +71,20 @@ static inline int __mutex_fastpath_lock_retval(atomic_t *count)
56 * 71 *
57 * Atomically increments @v and calls <fail_fn> if the result is nonpositive. 72 * Atomically increments @v and calls <fail_fn> if the result is nonpositive.
58 */ 73 */
74#ifdef CC_HAVE_ASM_GOTO
75static inline void __mutex_fastpath_unlock(atomic_t *v,
76 void (*fail_fn)(atomic_t *))
77{
78 asm volatile goto(LOCK_PREFIX " incl %0\n"
79 " jg %l[exit]\n"
80 : : "m" (v->counter)
81 : "memory", "cc"
82 : exit);
83 fail_fn(v);
84exit:
85 return;
86}
87#else
59#define __mutex_fastpath_unlock(v, fail_fn) \ 88#define __mutex_fastpath_unlock(v, fail_fn) \
60do { \ 89do { \
61 unsigned long dummy; \ 90 unsigned long dummy; \
@@ -72,6 +101,7 @@ do { \
72 : "rax", "rsi", "rdx", "rcx", \ 101 : "rax", "rsi", "rdx", "rcx", \
73 "r8", "r9", "r10", "r11", "memory"); \ 102 "r8", "r9", "r10", "r11", "memory"); \
74} while (0) 103} while (0)
104#endif
75 105
76#define __mutex_slowpath_needs_to_unlock() 1 106#define __mutex_slowpath_needs_to_unlock() 1
77 107
diff --git a/arch/x86/include/asm/page_32_types.h b/arch/x86/include/asm/page_32_types.h
index ef17af013475..f48b17df4224 100644
--- a/arch/x86/include/asm/page_32_types.h
+++ b/arch/x86/include/asm/page_32_types.h
@@ -15,6 +15,8 @@
15 */ 15 */
16#define __PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL) 16#define __PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL)
17 17
18#define __START_KERNEL_map __PAGE_OFFSET
19
18#define THREAD_SIZE_ORDER 1 20#define THREAD_SIZE_ORDER 1
19#define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER) 21#define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER)
20 22
diff --git a/arch/x86/include/asm/page_64_types.h b/arch/x86/include/asm/page_64_types.h
index 6c896fbe21db..43dcd804ebd5 100644
--- a/arch/x86/include/asm/page_64_types.h
+++ b/arch/x86/include/asm/page_64_types.h
@@ -32,11 +32,6 @@
32 */ 32 */
33#define __PAGE_OFFSET _AC(0xffff880000000000, UL) 33#define __PAGE_OFFSET _AC(0xffff880000000000, UL)
34 34
35#define __PHYSICAL_START ((CONFIG_PHYSICAL_START + \
36 (CONFIG_PHYSICAL_ALIGN - 1)) & \
37 ~(CONFIG_PHYSICAL_ALIGN - 1))
38
39#define __START_KERNEL (__START_KERNEL_map + __PHYSICAL_START)
40#define __START_KERNEL_map _AC(0xffffffff80000000, UL) 35#define __START_KERNEL_map _AC(0xffffffff80000000, UL)
41 36
42/* See Documentation/x86/x86_64/mm.txt for a description of the memory map. */ 37/* See Documentation/x86/x86_64/mm.txt for a description of the memory map. */
diff --git a/arch/x86/include/asm/page_types.h b/arch/x86/include/asm/page_types.h
index 54c97879195e..f97fbe3abb67 100644
--- a/arch/x86/include/asm/page_types.h
+++ b/arch/x86/include/asm/page_types.h
@@ -33,6 +33,11 @@
33 (((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0 ) | \ 33 (((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0 ) | \
34 VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) 34 VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
35 35
36#define __PHYSICAL_START ALIGN(CONFIG_PHYSICAL_START, \
37 CONFIG_PHYSICAL_ALIGN)
38
39#define __START_KERNEL (__START_KERNEL_map + __PHYSICAL_START)
40
36#ifdef CONFIG_X86_64 41#ifdef CONFIG_X86_64
37#include <asm/page_64_types.h> 42#include <asm/page_64_types.h>
38#else 43#else
diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h
index 04ac40e192eb..aab8f671b523 100644
--- a/arch/x86/include/asm/paravirt_types.h
+++ b/arch/x86/include/asm/paravirt_types.h
@@ -389,7 +389,8 @@ extern struct pv_lock_ops pv_lock_ops;
389 389
390/* Simple instruction patching code. */ 390/* Simple instruction patching code. */
391#define DEF_NATIVE(ops, name, code) \ 391#define DEF_NATIVE(ops, name, code) \
392 extern const char start_##ops##_##name[], end_##ops##_##name[]; \ 392 extern const char start_##ops##_##name[] __visible, \
393 end_##ops##_##name[] __visible; \
393 asm("start_" #ops "_" #name ": " code "; end_" #ops "_" #name ":") 394 asm("start_" #ops "_" #name ": " code "; end_" #ops "_" #name ":")
394 395
395unsigned paravirt_patch_nop(void); 396unsigned paravirt_patch_nop(void);
diff --git a/arch/x86/include/asm/pci.h b/arch/x86/include/asm/pci.h
index d9e9e6c7ed32..7d7443283a9d 100644
--- a/arch/x86/include/asm/pci.h
+++ b/arch/x86/include/asm/pci.h
@@ -100,29 +100,6 @@ static inline void early_quirks(void) { }
100extern void pci_iommu_alloc(void); 100extern void pci_iommu_alloc(void);
101 101
102#ifdef CONFIG_PCI_MSI 102#ifdef CONFIG_PCI_MSI
103/* MSI arch specific hooks */
104static inline int x86_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
105{
106 return x86_msi.setup_msi_irqs(dev, nvec, type);
107}
108
109static inline void x86_teardown_msi_irqs(struct pci_dev *dev)
110{
111 x86_msi.teardown_msi_irqs(dev);
112}
113
114static inline void x86_teardown_msi_irq(unsigned int irq)
115{
116 x86_msi.teardown_msi_irq(irq);
117}
118static inline void x86_restore_msi_irqs(struct pci_dev *dev, int irq)
119{
120 x86_msi.restore_msi_irqs(dev, irq);
121}
122#define arch_setup_msi_irqs x86_setup_msi_irqs
123#define arch_teardown_msi_irqs x86_teardown_msi_irqs
124#define arch_teardown_msi_irq x86_teardown_msi_irq
125#define arch_restore_msi_irqs x86_restore_msi_irqs
126/* implemented in arch/x86/kernel/apic/io_apic. */ 103/* implemented in arch/x86/kernel/apic/io_apic. */
127struct msi_desc; 104struct msi_desc;
128int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type); 105int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
@@ -130,16 +107,9 @@ void native_teardown_msi_irq(unsigned int irq);
130void native_restore_msi_irqs(struct pci_dev *dev, int irq); 107void native_restore_msi_irqs(struct pci_dev *dev, int irq);
131int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, 108int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc,
132 unsigned int irq_base, unsigned int irq_offset); 109 unsigned int irq_base, unsigned int irq_offset);
133/* default to the implementation in drivers/lib/msi.c */
134#define HAVE_DEFAULT_MSI_TEARDOWN_IRQS
135#define HAVE_DEFAULT_MSI_RESTORE_IRQS
136void default_teardown_msi_irqs(struct pci_dev *dev);
137void default_restore_msi_irqs(struct pci_dev *dev, int irq);
138#else 110#else
139#define native_setup_msi_irqs NULL 111#define native_setup_msi_irqs NULL
140#define native_teardown_msi_irq NULL 112#define native_teardown_msi_irq NULL
141#define default_teardown_msi_irqs NULL
142#define default_restore_msi_irqs NULL
143#endif 113#endif
144 114
145#define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys) 115#define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys)
diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h
index 1c00631164c2..3d1999458709 100644
--- a/arch/x86/include/asm/pgtable.h
+++ b/arch/x86/include/asm/pgtable.h
@@ -22,7 +22,8 @@
22 * ZERO_PAGE is a global shared page that is always zero: used 22 * ZERO_PAGE is a global shared page that is always zero: used
23 * for zero-mapped memory areas etc.. 23 * for zero-mapped memory areas etc..
24 */ 24 */
25extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)]; 25extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)]
26 __visible;
26#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page)) 27#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
27 28
28extern spinlock_t pgd_lock; 29extern spinlock_t pgd_lock;
@@ -314,21 +315,6 @@ static inline pmd_t pmd_mksoft_dirty(pmd_t pmd)
314 return pmd_set_flags(pmd, _PAGE_SOFT_DIRTY); 315 return pmd_set_flags(pmd, _PAGE_SOFT_DIRTY);
315} 316}
316 317
317static inline pte_t pte_swp_mksoft_dirty(pte_t pte)
318{
319 return pte_set_flags(pte, _PAGE_SWP_SOFT_DIRTY);
320}
321
322static inline int pte_swp_soft_dirty(pte_t pte)
323{
324 return pte_flags(pte) & _PAGE_SWP_SOFT_DIRTY;
325}
326
327static inline pte_t pte_swp_clear_soft_dirty(pte_t pte)
328{
329 return pte_clear_flags(pte, _PAGE_SWP_SOFT_DIRTY);
330}
331
332static inline pte_t pte_file_clear_soft_dirty(pte_t pte) 318static inline pte_t pte_file_clear_soft_dirty(pte_t pte)
333{ 319{
334 return pte_clear_flags(pte, _PAGE_SOFT_DIRTY); 320 return pte_clear_flags(pte, _PAGE_SOFT_DIRTY);
@@ -445,6 +431,7 @@ pte_t *populate_extra_pte(unsigned long vaddr);
445 431
446#ifndef __ASSEMBLY__ 432#ifndef __ASSEMBLY__
447#include <linux/mm_types.h> 433#include <linux/mm_types.h>
434#include <linux/mmdebug.h>
448#include <linux/log2.h> 435#include <linux/log2.h>
449 436
450static inline int pte_none(pte_t pte) 437static inline int pte_none(pte_t pte)
@@ -863,6 +850,24 @@ static inline void update_mmu_cache_pmd(struct vm_area_struct *vma,
863{ 850{
864} 851}
865 852
853static inline pte_t pte_swp_mksoft_dirty(pte_t pte)
854{
855 VM_BUG_ON(pte_present(pte));
856 return pte_set_flags(pte, _PAGE_SWP_SOFT_DIRTY);
857}
858
859static inline int pte_swp_soft_dirty(pte_t pte)
860{
861 VM_BUG_ON(pte_present(pte));
862 return pte_flags(pte) & _PAGE_SWP_SOFT_DIRTY;
863}
864
865static inline pte_t pte_swp_clear_soft_dirty(pte_t pte)
866{
867 VM_BUG_ON(pte_present(pte));
868 return pte_clear_flags(pte, _PAGE_SWP_SOFT_DIRTY);
869}
870
866#include <asm-generic/pgtable.h> 871#include <asm-generic/pgtable.h>
867#endif /* __ASSEMBLY__ */ 872#endif /* __ASSEMBLY__ */
868 873
diff --git a/arch/x86/include/asm/pgtable_types.h b/arch/x86/include/asm/pgtable_types.h
index f4843e031131..0ecac257fb26 100644
--- a/arch/x86/include/asm/pgtable_types.h
+++ b/arch/x86/include/asm/pgtable_types.h
@@ -75,6 +75,9 @@
75 * with swap entry format. On x86 bits 6 and 7 are *not* involved 75 * with swap entry format. On x86 bits 6 and 7 are *not* involved
76 * into swap entry computation, but bit 6 is used for nonlinear 76 * into swap entry computation, but bit 6 is used for nonlinear
77 * file mapping, so we borrow bit 7 for soft dirty tracking. 77 * file mapping, so we borrow bit 7 for soft dirty tracking.
78 *
79 * Please note that this bit must be treated as swap dirty page
80 * mark if and only if the PTE has present bit clear!
78 */ 81 */
79#ifdef CONFIG_MEM_SOFT_DIRTY 82#ifdef CONFIG_MEM_SOFT_DIRTY
80#define _PAGE_SWP_SOFT_DIRTY _PAGE_PSE 83#define _PAGE_SWP_SOFT_DIRTY _PAGE_PSE
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index 24cf5aefb704..987c75ecc334 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -412,7 +412,7 @@ union irq_stack_union {
412 }; 412 };
413}; 413};
414 414
415DECLARE_PER_CPU_FIRST(union irq_stack_union, irq_stack_union); 415DECLARE_PER_CPU_FIRST(union irq_stack_union, irq_stack_union) __visible;
416DECLARE_INIT_PER_CPU(irq_stack_union); 416DECLARE_INIT_PER_CPU(irq_stack_union);
417 417
418DECLARE_PER_CPU(char *, irq_stack_ptr); 418DECLARE_PER_CPU(char *, irq_stack_ptr);
@@ -942,33 +942,19 @@ extern int set_tsc_mode(unsigned int val);
942 942
943extern u16 amd_get_nb_id(int cpu); 943extern u16 amd_get_nb_id(int cpu);
944 944
945struct aperfmperf { 945static inline uint32_t hypervisor_cpuid_base(const char *sig, uint32_t leaves)
946 u64 aperf, mperf;
947};
948
949static inline void get_aperfmperf(struct aperfmperf *am)
950{ 946{
951 WARN_ON_ONCE(!boot_cpu_has(X86_FEATURE_APERFMPERF)); 947 uint32_t base, eax, signature[3];
952
953 rdmsrl(MSR_IA32_APERF, am->aperf);
954 rdmsrl(MSR_IA32_MPERF, am->mperf);
955}
956 948
957#define APERFMPERF_SHIFT 10 949 for (base = 0x40000000; base < 0x40010000; base += 0x100) {
950 cpuid(base, &eax, &signature[0], &signature[1], &signature[2]);
958 951
959static inline 952 if (!memcmp(sig, signature, 12) &&
960unsigned long calc_aperfmperf_ratio(struct aperfmperf *old, 953 (leaves == 0 || ((eax - base) >= leaves)))
961 struct aperfmperf *new) 954 return base;
962{ 955 }
963 u64 aperf = new->aperf - old->aperf;
964 u64 mperf = new->mperf - old->mperf;
965 unsigned long ratio = aperf;
966
967 mperf >>= APERFMPERF_SHIFT;
968 if (mperf)
969 ratio = div64_u64(aperf, mperf);
970 956
971 return ratio; 957 return 0;
972} 958}
973 959
974extern unsigned long arch_align_stack(unsigned long sp); 960extern unsigned long arch_align_stack(unsigned long sp);
diff --git a/arch/x86/include/asm/pvclock.h b/arch/x86/include/asm/pvclock.h
index 109a9dd5d454..be8269b00e2a 100644
--- a/arch/x86/include/asm/pvclock.h
+++ b/arch/x86/include/asm/pvclock.h
@@ -93,7 +93,6 @@ unsigned __pvclock_read_cycles(const struct pvclock_vcpu_time_info *src,
93 93
94struct pvclock_vsyscall_time_info { 94struct pvclock_vsyscall_time_info {
95 struct pvclock_vcpu_time_info pvti; 95 struct pvclock_vcpu_time_info pvti;
96 u32 migrate_count;
97} __attribute__((__aligned__(SMP_CACHE_BYTES))); 96} __attribute__((__aligned__(SMP_CACHE_BYTES)));
98 97
99#define PVTI_SIZE sizeof(struct pvclock_vsyscall_time_info) 98#define PVTI_SIZE sizeof(struct pvclock_vsyscall_time_info)
diff --git a/arch/x86/include/asm/setup.h b/arch/x86/include/asm/setup.h
index b7bf3505e1ec..347555492dad 100644
--- a/arch/x86/include/asm/setup.h
+++ b/arch/x86/include/asm/setup.h
@@ -6,6 +6,8 @@
6 6
7#define COMMAND_LINE_SIZE 2048 7#define COMMAND_LINE_SIZE 2048
8 8
9#include <linux/linkage.h>
10
9#ifdef __i386__ 11#ifdef __i386__
10 12
11#include <linux/pfn.h> 13#include <linux/pfn.h>
@@ -108,11 +110,11 @@ void *extend_brk(size_t size, size_t align);
108extern void probe_roms(void); 110extern void probe_roms(void);
109#ifdef __i386__ 111#ifdef __i386__
110 112
111void __init i386_start_kernel(void); 113asmlinkage void __init i386_start_kernel(void);
112 114
113#else 115#else
114void __init x86_64_start_kernel(char *real_mode); 116asmlinkage void __init x86_64_start_kernel(char *real_mode);
115void __init x86_64_start_reservations(char *real_mode_data); 117asmlinkage void __init x86_64_start_reservations(char *real_mode_data);
116 118
117#endif /* __i386__ */ 119#endif /* __i386__ */
118#endif /* _SETUP */ 120#endif /* _SETUP */
diff --git a/arch/x86/include/asm/special_insns.h b/arch/x86/include/asm/special_insns.h
index 2f4d924fe6c9..645cad2c95ff 100644
--- a/arch/x86/include/asm/special_insns.h
+++ b/arch/x86/include/asm/special_insns.h
@@ -101,7 +101,7 @@ static inline void native_wbinvd(void)
101 asm volatile("wbinvd": : :"memory"); 101 asm volatile("wbinvd": : :"memory");
102} 102}
103 103
104extern void native_load_gs_index(unsigned); 104extern asmlinkage void native_load_gs_index(unsigned);
105 105
106#ifdef CONFIG_PARAVIRT 106#ifdef CONFIG_PARAVIRT
107#include <asm/paravirt.h> 107#include <asm/paravirt.h>
diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h
index 8963bfeea82a..bf156ded74b5 100644
--- a/arch/x86/include/asm/spinlock.h
+++ b/arch/x86/include/asm/spinlock.h
@@ -62,6 +62,11 @@ static inline void __ticket_unlock_kick(arch_spinlock_t *lock,
62 62
63#endif /* CONFIG_PARAVIRT_SPINLOCKS */ 63#endif /* CONFIG_PARAVIRT_SPINLOCKS */
64 64
65static __always_inline int arch_spin_value_unlocked(arch_spinlock_t lock)
66{
67 return lock.tickets.head == lock.tickets.tail;
68}
69
65/* 70/*
66 * Ticket locks are conceptually two parts, one indicating the current head of 71 * Ticket locks are conceptually two parts, one indicating the current head of
67 * the queue, and the other indicating the current tail. The lock is acquired 72 * the queue, and the other indicating the current tail. The lock is acquired
diff --git a/arch/x86/include/asm/switch_to.h b/arch/x86/include/asm/switch_to.h
index 4ec45b3abba1..d7f3b3b78ac3 100644
--- a/arch/x86/include/asm/switch_to.h
+++ b/arch/x86/include/asm/switch_to.h
@@ -2,8 +2,8 @@
2#define _ASM_X86_SWITCH_TO_H 2#define _ASM_X86_SWITCH_TO_H
3 3
4struct task_struct; /* one of the stranger aspects of C forward declarations */ 4struct task_struct; /* one of the stranger aspects of C forward declarations */
5struct task_struct *__switch_to(struct task_struct *prev, 5__visible struct task_struct *__switch_to(struct task_struct *prev,
6 struct task_struct *next); 6 struct task_struct *next);
7struct tss_struct; 7struct tss_struct;
8void __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p, 8void __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p,
9 struct tss_struct *tss); 9 struct tss_struct *tss);
diff --git a/arch/x86/include/asm/sync_bitops.h b/arch/x86/include/asm/sync_bitops.h
index 9d09b4073b60..05af3b31d522 100644
--- a/arch/x86/include/asm/sync_bitops.h
+++ b/arch/x86/include/asm/sync_bitops.h
@@ -26,9 +26,9 @@
26 * Note that @nr may be almost arbitrarily large; this function is not 26 * Note that @nr may be almost arbitrarily large; this function is not
27 * restricted to acting on a single-word quantity. 27 * restricted to acting on a single-word quantity.
28 */ 28 */
29static inline void sync_set_bit(int nr, volatile unsigned long *addr) 29static inline void sync_set_bit(long nr, volatile unsigned long *addr)
30{ 30{
31 asm volatile("lock; btsl %1,%0" 31 asm volatile("lock; bts %1,%0"
32 : "+m" (ADDR) 32 : "+m" (ADDR)
33 : "Ir" (nr) 33 : "Ir" (nr)
34 : "memory"); 34 : "memory");
@@ -44,9 +44,9 @@ static inline void sync_set_bit(int nr, volatile unsigned long *addr)
44 * you should call smp_mb__before_clear_bit() and/or smp_mb__after_clear_bit() 44 * you should call smp_mb__before_clear_bit() and/or smp_mb__after_clear_bit()
45 * in order to ensure changes are visible on other processors. 45 * in order to ensure changes are visible on other processors.
46 */ 46 */
47static inline void sync_clear_bit(int nr, volatile unsigned long *addr) 47static inline void sync_clear_bit(long nr, volatile unsigned long *addr)
48{ 48{
49 asm volatile("lock; btrl %1,%0" 49 asm volatile("lock; btr %1,%0"
50 : "+m" (ADDR) 50 : "+m" (ADDR)
51 : "Ir" (nr) 51 : "Ir" (nr)
52 : "memory"); 52 : "memory");
@@ -61,9 +61,9 @@ static inline void sync_clear_bit(int nr, volatile unsigned long *addr)
61 * Note that @nr may be almost arbitrarily large; this function is not 61 * Note that @nr may be almost arbitrarily large; this function is not
62 * restricted to acting on a single-word quantity. 62 * restricted to acting on a single-word quantity.
63 */ 63 */
64static inline void sync_change_bit(int nr, volatile unsigned long *addr) 64static inline void sync_change_bit(long nr, volatile unsigned long *addr)
65{ 65{
66 asm volatile("lock; btcl %1,%0" 66 asm volatile("lock; btc %1,%0"
67 : "+m" (ADDR) 67 : "+m" (ADDR)
68 : "Ir" (nr) 68 : "Ir" (nr)
69 : "memory"); 69 : "memory");
@@ -77,11 +77,11 @@ static inline void sync_change_bit(int nr, volatile unsigned long *addr)
77 * This operation is atomic and cannot be reordered. 77 * This operation is atomic and cannot be reordered.
78 * It also implies a memory barrier. 78 * It also implies a memory barrier.
79 */ 79 */
80static inline int sync_test_and_set_bit(int nr, volatile unsigned long *addr) 80static inline int sync_test_and_set_bit(long nr, volatile unsigned long *addr)
81{ 81{
82 int oldbit; 82 int oldbit;
83 83
84 asm volatile("lock; btsl %2,%1\n\tsbbl %0,%0" 84 asm volatile("lock; bts %2,%1\n\tsbbl %0,%0"
85 : "=r" (oldbit), "+m" (ADDR) 85 : "=r" (oldbit), "+m" (ADDR)
86 : "Ir" (nr) : "memory"); 86 : "Ir" (nr) : "memory");
87 return oldbit; 87 return oldbit;
@@ -95,11 +95,11 @@ static inline int sync_test_and_set_bit(int nr, volatile unsigned long *addr)
95 * This operation is atomic and cannot be reordered. 95 * This operation is atomic and cannot be reordered.
96 * It also implies a memory barrier. 96 * It also implies a memory barrier.
97 */ 97 */
98static inline int sync_test_and_clear_bit(int nr, volatile unsigned long *addr) 98static inline int sync_test_and_clear_bit(long nr, volatile unsigned long *addr)
99{ 99{
100 int oldbit; 100 int oldbit;
101 101
102 asm volatile("lock; btrl %2,%1\n\tsbbl %0,%0" 102 asm volatile("lock; btr %2,%1\n\tsbbl %0,%0"
103 : "=r" (oldbit), "+m" (ADDR) 103 : "=r" (oldbit), "+m" (ADDR)
104 : "Ir" (nr) : "memory"); 104 : "Ir" (nr) : "memory");
105 return oldbit; 105 return oldbit;
@@ -113,11 +113,11 @@ static inline int sync_test_and_clear_bit(int nr, volatile unsigned long *addr)
113 * This operation is atomic and cannot be reordered. 113 * This operation is atomic and cannot be reordered.
114 * It also implies a memory barrier. 114 * It also implies a memory barrier.
115 */ 115 */
116static inline int sync_test_and_change_bit(int nr, volatile unsigned long *addr) 116static inline int sync_test_and_change_bit(long nr, volatile unsigned long *addr)
117{ 117{
118 int oldbit; 118 int oldbit;
119 119
120 asm volatile("lock; btcl %2,%1\n\tsbbl %0,%0" 120 asm volatile("lock; btc %2,%1\n\tsbbl %0,%0"
121 : "=r" (oldbit), "+m" (ADDR) 121 : "=r" (oldbit), "+m" (ADDR)
122 : "Ir" (nr) : "memory"); 122 : "Ir" (nr) : "memory");
123 return oldbit; 123 return oldbit;
diff --git a/arch/x86/include/asm/syscall.h b/arch/x86/include/asm/syscall.h
index 2e188d68397c..aea284b41312 100644
--- a/arch/x86/include/asm/syscall.h
+++ b/arch/x86/include/asm/syscall.h
@@ -20,7 +20,8 @@
20#include <asm/thread_info.h> /* for TS_COMPAT */ 20#include <asm/thread_info.h> /* for TS_COMPAT */
21#include <asm/unistd.h> 21#include <asm/unistd.h>
22 22
23extern const unsigned long sys_call_table[]; 23typedef void (*sys_call_ptr_t)(void);
24extern const sys_call_ptr_t sys_call_table[];
24 25
25/* 26/*
26 * Only the low 32 bits of orig_ax are meaningful, so we return int. 27 * Only the low 32 bits of orig_ax are meaningful, so we return int.
diff --git a/arch/x86/include/asm/syscalls.h b/arch/x86/include/asm/syscalls.h
index 2917a6452c49..592a6a672e07 100644
--- a/arch/x86/include/asm/syscalls.h
+++ b/arch/x86/include/asm/syscalls.h
@@ -24,7 +24,7 @@ asmlinkage long sys_iopl(unsigned int);
24asmlinkage int sys_modify_ldt(int, void __user *, unsigned long); 24asmlinkage int sys_modify_ldt(int, void __user *, unsigned long);
25 25
26/* kernel/signal.c */ 26/* kernel/signal.c */
27long sys_rt_sigreturn(void); 27asmlinkage long sys_rt_sigreturn(void);
28 28
29/* kernel/tls.c */ 29/* kernel/tls.c */
30asmlinkage long sys_set_thread_area(struct user_desc __user *); 30asmlinkage long sys_set_thread_area(struct user_desc __user *);
@@ -34,7 +34,7 @@ asmlinkage long sys_get_thread_area(struct user_desc __user *);
34#ifdef CONFIG_X86_32 34#ifdef CONFIG_X86_32
35 35
36/* kernel/signal.c */ 36/* kernel/signal.c */
37unsigned long sys_sigreturn(void); 37asmlinkage unsigned long sys_sigreturn(void);
38 38
39/* kernel/vm86_32.c */ 39/* kernel/vm86_32.c */
40asmlinkage long sys_vm86old(struct vm86_struct __user *); 40asmlinkage long sys_vm86old(struct vm86_struct __user *);
@@ -44,7 +44,7 @@ asmlinkage long sys_vm86(unsigned long, unsigned long);
44 44
45/* X86_64 only */ 45/* X86_64 only */
46/* kernel/process_64.c */ 46/* kernel/process_64.c */
47long sys_arch_prctl(int, unsigned long); 47asmlinkage long sys_arch_prctl(int, unsigned long);
48 48
49/* kernel/sys_x86_64.c */ 49/* kernel/sys_x86_64.c */
50asmlinkage long sys_mmap(unsigned long, unsigned long, unsigned long, 50asmlinkage long sys_mmap(unsigned long, unsigned long, unsigned long,
diff --git a/arch/x86/include/asm/sysfb.h b/arch/x86/include/asm/sysfb.h
new file mode 100644
index 000000000000..2aeb3e25579c
--- /dev/null
+++ b/arch/x86/include/asm/sysfb.h
@@ -0,0 +1,98 @@
1#ifndef _ARCH_X86_KERNEL_SYSFB_H
2#define _ARCH_X86_KERNEL_SYSFB_H
3
4/*
5 * Generic System Framebuffers on x86
6 * Copyright (c) 2012-2013 David Herrmann <dh.herrmann@gmail.com>
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the Free
10 * Software Foundation; either version 2 of the License, or (at your option)
11 * any later version.
12 */
13
14#include <linux/kernel.h>
15#include <linux/platform_data/simplefb.h>
16#include <linux/screen_info.h>
17
18enum {
19 M_I17, /* 17-Inch iMac */
20 M_I20, /* 20-Inch iMac */
21 M_I20_SR, /* 20-Inch iMac (Santa Rosa) */
22 M_I24, /* 24-Inch iMac */
23 M_I24_8_1, /* 24-Inch iMac, 8,1th gen */
24 M_I24_10_1, /* 24-Inch iMac, 10,1th gen */
25 M_I27_11_1, /* 27-Inch iMac, 11,1th gen */
26 M_MINI, /* Mac Mini */
27 M_MINI_3_1, /* Mac Mini, 3,1th gen */
28 M_MINI_4_1, /* Mac Mini, 4,1th gen */
29 M_MB, /* MacBook */
30 M_MB_2, /* MacBook, 2nd rev. */
31 M_MB_3, /* MacBook, 3rd rev. */
32 M_MB_5_1, /* MacBook, 5th rev. */
33 M_MB_6_1, /* MacBook, 6th rev. */
34 M_MB_7_1, /* MacBook, 7th rev. */
35 M_MB_SR, /* MacBook, 2nd gen, (Santa Rosa) */
36 M_MBA, /* MacBook Air */
37 M_MBA_3, /* Macbook Air, 3rd rev */
38 M_MBP, /* MacBook Pro */
39 M_MBP_2, /* MacBook Pro 2nd gen */
40 M_MBP_2_2, /* MacBook Pro 2,2nd gen */
41 M_MBP_SR, /* MacBook Pro (Santa Rosa) */
42 M_MBP_4, /* MacBook Pro, 4th gen */
43 M_MBP_5_1, /* MacBook Pro, 5,1th gen */
44 M_MBP_5_2, /* MacBook Pro, 5,2th gen */
45 M_MBP_5_3, /* MacBook Pro, 5,3rd gen */
46 M_MBP_6_1, /* MacBook Pro, 6,1th gen */
47 M_MBP_6_2, /* MacBook Pro, 6,2th gen */
48 M_MBP_7_1, /* MacBook Pro, 7,1th gen */
49 M_MBP_8_2, /* MacBook Pro, 8,2nd gen */
50 M_UNKNOWN /* placeholder */
51};
52
53struct efifb_dmi_info {
54 char *optname;
55 unsigned long base;
56 int stride;
57 int width;
58 int height;
59 int flags;
60};
61
62#ifdef CONFIG_EFI
63
64extern struct efifb_dmi_info efifb_dmi_list[];
65void sysfb_apply_efi_quirks(void);
66
67#else /* CONFIG_EFI */
68
69static inline void sysfb_apply_efi_quirks(void)
70{
71}
72
73#endif /* CONFIG_EFI */
74
75#ifdef CONFIG_X86_SYSFB
76
77bool parse_mode(const struct screen_info *si,
78 struct simplefb_platform_data *mode);
79int create_simplefb(const struct screen_info *si,
80 const struct simplefb_platform_data *mode);
81
82#else /* CONFIG_X86_SYSFB */
83
84static inline bool parse_mode(const struct screen_info *si,
85 struct simplefb_platform_data *mode)
86{
87 return false;
88}
89
90static inline int create_simplefb(const struct screen_info *si,
91 const struct simplefb_platform_data *mode)
92{
93 return -EINVAL;
94}
95
96#endif /* CONFIG_X86_SYSFB */
97
98#endif /* _ARCH_X86_KERNEL_SYSFB_H */
diff --git a/arch/x86/include/asm/tlbflush.h b/arch/x86/include/asm/tlbflush.h
index cf512003e663..e6d90babc245 100644
--- a/arch/x86/include/asm/tlbflush.h
+++ b/arch/x86/include/asm/tlbflush.h
@@ -62,6 +62,7 @@ static inline void __flush_tlb_all(void)
62 62
63static inline void __flush_tlb_one(unsigned long addr) 63static inline void __flush_tlb_one(unsigned long addr)
64{ 64{
65 count_vm_event(NR_TLB_LOCAL_FLUSH_ONE);
65 __flush_tlb_single(addr); 66 __flush_tlb_single(addr);
66} 67}
67 68
@@ -84,14 +85,38 @@ static inline void __flush_tlb_one(unsigned long addr)
84 85
85#ifndef CONFIG_SMP 86#ifndef CONFIG_SMP
86 87
87#define flush_tlb() __flush_tlb() 88/* "_up" is for UniProcessor.
88#define flush_tlb_all() __flush_tlb_all() 89 *
89#define local_flush_tlb() __flush_tlb() 90 * This is a helper for other header functions. *Not* intended to be called
91 * directly. All global TLB flushes need to either call this, or to bump the
92 * vm statistics themselves.
93 */
94static inline void __flush_tlb_up(void)
95{
96 count_vm_event(NR_TLB_LOCAL_FLUSH_ALL);
97 __flush_tlb();
98}
99
100static inline void flush_tlb_all(void)
101{
102 count_vm_event(NR_TLB_LOCAL_FLUSH_ALL);
103 __flush_tlb_all();
104}
105
106static inline void flush_tlb(void)
107{
108 __flush_tlb_up();
109}
110
111static inline void local_flush_tlb(void)
112{
113 __flush_tlb_up();
114}
90 115
91static inline void flush_tlb_mm(struct mm_struct *mm) 116static inline void flush_tlb_mm(struct mm_struct *mm)
92{ 117{
93 if (mm == current->active_mm) 118 if (mm == current->active_mm)
94 __flush_tlb(); 119 __flush_tlb_up();
95} 120}
96 121
97static inline void flush_tlb_page(struct vm_area_struct *vma, 122static inline void flush_tlb_page(struct vm_area_struct *vma,
@@ -105,14 +130,14 @@ static inline void flush_tlb_range(struct vm_area_struct *vma,
105 unsigned long start, unsigned long end) 130 unsigned long start, unsigned long end)
106{ 131{
107 if (vma->vm_mm == current->active_mm) 132 if (vma->vm_mm == current->active_mm)
108 __flush_tlb(); 133 __flush_tlb_up();
109} 134}
110 135
111static inline void flush_tlb_mm_range(struct mm_struct *mm, 136static inline void flush_tlb_mm_range(struct mm_struct *mm,
112 unsigned long start, unsigned long end, unsigned long vmflag) 137 unsigned long start, unsigned long end, unsigned long vmflag)
113{ 138{
114 if (mm == current->active_mm) 139 if (mm == current->active_mm)
115 __flush_tlb(); 140 __flush_tlb_up();
116} 141}
117 142
118static inline void native_flush_tlb_others(const struct cpumask *cpumask, 143static inline void native_flush_tlb_others(const struct cpumask *cpumask,
diff --git a/arch/x86/include/asm/topology.h b/arch/x86/include/asm/topology.h
index 095b21507b6a..d35f24e231cd 100644
--- a/arch/x86/include/asm/topology.h
+++ b/arch/x86/include/asm/topology.h
@@ -124,9 +124,6 @@ extern const struct cpumask *cpu_coregroup_mask(int cpu);
124#define topology_core_id(cpu) (cpu_data(cpu).cpu_core_id) 124#define topology_core_id(cpu) (cpu_data(cpu).cpu_core_id)
125#define topology_core_cpumask(cpu) (per_cpu(cpu_core_map, cpu)) 125#define topology_core_cpumask(cpu) (per_cpu(cpu_core_map, cpu))
126#define topology_thread_cpumask(cpu) (per_cpu(cpu_sibling_map, cpu)) 126#define topology_thread_cpumask(cpu) (per_cpu(cpu_sibling_map, cpu))
127
128/* indicates that pointers to the topology cpumask_t maps are valid */
129#define arch_provides_topology_pointers yes
130#endif 127#endif
131 128
132static inline void arch_fix_phys_package_id(int num, u32 slot) 129static inline void arch_fix_phys_package_id(int num, u32 slot)
diff --git a/arch/x86/include/asm/traps.h b/arch/x86/include/asm/traps.h
index 88eae2aec619..7036cb60cd87 100644
--- a/arch/x86/include/asm/traps.h
+++ b/arch/x86/include/asm/traps.h
@@ -6,11 +6,7 @@
6#include <asm/debugreg.h> 6#include <asm/debugreg.h>
7#include <asm/siginfo.h> /* TRAP_TRACE, ... */ 7#include <asm/siginfo.h> /* TRAP_TRACE, ... */
8 8
9#ifdef CONFIG_X86_32 9#define dotraplinkage __visible
10#define dotraplinkage
11#else
12#define dotraplinkage asmlinkage
13#endif
14 10
15asmlinkage void divide_error(void); 11asmlinkage void divide_error(void);
16asmlinkage void debug(void); 12asmlinkage void debug(void);
diff --git a/arch/x86/include/asm/tsc.h b/arch/x86/include/asm/tsc.h
index c91e8b9d588b..235be70d5bb4 100644
--- a/arch/x86/include/asm/tsc.h
+++ b/arch/x86/include/asm/tsc.h
@@ -49,6 +49,7 @@ extern void tsc_init(void);
49extern void mark_tsc_unstable(char *reason); 49extern void mark_tsc_unstable(char *reason);
50extern int unsynchronized_tsc(void); 50extern int unsynchronized_tsc(void);
51extern int check_tsc_unstable(void); 51extern int check_tsc_unstable(void);
52extern int check_tsc_disabled(void);
52extern unsigned long native_calibrate_tsc(void); 53extern unsigned long native_calibrate_tsc(void);
53 54
54extern int tsc_clocksource_reliable; 55extern int tsc_clocksource_reliable;
diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h
index 5ee26875baea..5838fa911aa0 100644
--- a/arch/x86/include/asm/uaccess.h
+++ b/arch/x86/include/asm/uaccess.h
@@ -153,16 +153,19 @@ __typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0UL), 0ULL, 0UL))
153 * Careful: we have to cast the result to the type of the pointer 153 * Careful: we have to cast the result to the type of the pointer
154 * for sign reasons. 154 * for sign reasons.
155 * 155 *
156 * The use of %edx as the register specifier is a bit of a 156 * The use of _ASM_DX as the register specifier is a bit of a
157 * simplification, as gcc only cares about it as the starting point 157 * simplification, as gcc only cares about it as the starting point
158 * and not size: for a 64-bit value it will use %ecx:%edx on 32 bits 158 * and not size: for a 64-bit value it will use %ecx:%edx on 32 bits
159 * (%ecx being the next register in gcc's x86 register sequence), and 159 * (%ecx being the next register in gcc's x86 register sequence), and
160 * %rdx on 64 bits. 160 * %rdx on 64 bits.
161 *
162 * Clang/LLVM cares about the size of the register, but still wants
163 * the base register for something that ends up being a pair.
161 */ 164 */
162#define get_user(x, ptr) \ 165#define get_user(x, ptr) \
163({ \ 166({ \
164 int __ret_gu; \ 167 int __ret_gu; \
165 register __inttype(*(ptr)) __val_gu asm("%edx"); \ 168 register __inttype(*(ptr)) __val_gu asm("%"_ASM_DX); \
166 __chk_user_ptr(ptr); \ 169 __chk_user_ptr(ptr); \
167 might_fault(); \ 170 might_fault(); \
168 asm volatile("call __get_user_%P3" \ 171 asm volatile("call __get_user_%P3" \
diff --git a/arch/x86/include/asm/vmx.h b/arch/x86/include/asm/vmx.h
index f3e01a2cbaa1..966502d4682e 100644
--- a/arch/x86/include/asm/vmx.h
+++ b/arch/x86/include/asm/vmx.h
@@ -387,6 +387,7 @@ enum vmcs_field {
387#define VMX_EPT_EXTENT_INDIVIDUAL_ADDR 0 387#define VMX_EPT_EXTENT_INDIVIDUAL_ADDR 0
388#define VMX_EPT_EXTENT_CONTEXT 1 388#define VMX_EPT_EXTENT_CONTEXT 1
389#define VMX_EPT_EXTENT_GLOBAL 2 389#define VMX_EPT_EXTENT_GLOBAL 2
390#define VMX_EPT_EXTENT_SHIFT 24
390 391
391#define VMX_EPT_EXECUTE_ONLY_BIT (1ull) 392#define VMX_EPT_EXECUTE_ONLY_BIT (1ull)
392#define VMX_EPT_PAGE_WALK_4_BIT (1ull << 6) 393#define VMX_EPT_PAGE_WALK_4_BIT (1ull << 6)
@@ -394,6 +395,7 @@ enum vmcs_field {
394#define VMX_EPTP_WB_BIT (1ull << 14) 395#define VMX_EPTP_WB_BIT (1ull << 14)
395#define VMX_EPT_2MB_PAGE_BIT (1ull << 16) 396#define VMX_EPT_2MB_PAGE_BIT (1ull << 16)
396#define VMX_EPT_1GB_PAGE_BIT (1ull << 17) 397#define VMX_EPT_1GB_PAGE_BIT (1ull << 17)
398#define VMX_EPT_INVEPT_BIT (1ull << 20)
397#define VMX_EPT_AD_BIT (1ull << 21) 399#define VMX_EPT_AD_BIT (1ull << 21)
398#define VMX_EPT_EXTENT_CONTEXT_BIT (1ull << 25) 400#define VMX_EPT_EXTENT_CONTEXT_BIT (1ull << 25)
399#define VMX_EPT_EXTENT_GLOBAL_BIT (1ull << 26) 401#define VMX_EPT_EXTENT_GLOBAL_BIT (1ull << 26)
diff --git a/arch/x86/include/asm/vvar.h b/arch/x86/include/asm/vvar.h
index de656ac2af41..d76ac40da206 100644
--- a/arch/x86/include/asm/vvar.h
+++ b/arch/x86/include/asm/vvar.h
@@ -35,7 +35,7 @@
35 35
36#define DEFINE_VVAR(type, name) \ 36#define DEFINE_VVAR(type, name) \
37 type name \ 37 type name \
38 __attribute__((section(".vvar_" #name), aligned(16))) 38 __attribute__((section(".vvar_" #name), aligned(16))) __visible
39 39
40#define VVAR(name) (*vvaraddr_ ## name) 40#define VVAR(name) (*vvaraddr_ ## name)
41 41
diff --git a/arch/x86/include/asm/xen/hypervisor.h b/arch/x86/include/asm/xen/hypervisor.h
index 125f344f06a9..d866959e5685 100644
--- a/arch/x86/include/asm/xen/hypervisor.h
+++ b/arch/x86/include/asm/xen/hypervisor.h
@@ -40,21 +40,7 @@ extern struct start_info *xen_start_info;
40 40
41static inline uint32_t xen_cpuid_base(void) 41static inline uint32_t xen_cpuid_base(void)
42{ 42{
43 uint32_t base, eax, ebx, ecx, edx; 43 return hypervisor_cpuid_base("XenVMMXenVMM", 2);
44 char signature[13];
45
46 for (base = 0x40000000; base < 0x40010000; base += 0x100) {
47 cpuid(base, &eax, &ebx, &ecx, &edx);
48 *(uint32_t *)(signature + 0) = ebx;
49 *(uint32_t *)(signature + 4) = ecx;
50 *(uint32_t *)(signature + 8) = edx;
51 signature[12] = 0;
52
53 if (!strcmp("XenVMMXenVMM", signature) && ((eax - base) >= 2))
54 return base;
55 }
56
57 return 0;
58} 44}
59 45
60#ifdef CONFIG_XEN 46#ifdef CONFIG_XEN
diff --git a/arch/x86/include/asm/xor_avx.h b/arch/x86/include/asm/xor_avx.h
index 7ea79c5fa1f2..492b29802f57 100644
--- a/arch/x86/include/asm/xor_avx.h
+++ b/arch/x86/include/asm/xor_avx.h
@@ -167,12 +167,12 @@ static struct xor_block_template xor_block_avx = {
167 167
168#define AVX_XOR_SPEED \ 168#define AVX_XOR_SPEED \
169do { \ 169do { \
170 if (cpu_has_avx) \ 170 if (cpu_has_avx && cpu_has_osxsave) \
171 xor_speed(&xor_block_avx); \ 171 xor_speed(&xor_block_avx); \
172} while (0) 172} while (0)
173 173
174#define AVX_SELECT(FASTEST) \ 174#define AVX_SELECT(FASTEST) \
175 (cpu_has_avx ? &xor_block_avx : FASTEST) 175 (cpu_has_avx && cpu_has_osxsave ? &xor_block_avx : FASTEST)
176 176
177#else 177#else
178 178
diff --git a/arch/x86/include/uapi/asm/vmx.h b/arch/x86/include/uapi/asm/vmx.h
index d651082c7cf7..0e79420376eb 100644
--- a/arch/x86/include/uapi/asm/vmx.h
+++ b/arch/x86/include/uapi/asm/vmx.h
@@ -65,6 +65,7 @@
65#define EXIT_REASON_EOI_INDUCED 45 65#define EXIT_REASON_EOI_INDUCED 45
66#define EXIT_REASON_EPT_VIOLATION 48 66#define EXIT_REASON_EPT_VIOLATION 48
67#define EXIT_REASON_EPT_MISCONFIG 49 67#define EXIT_REASON_EPT_MISCONFIG 49
68#define EXIT_REASON_INVEPT 50
68#define EXIT_REASON_PREEMPTION_TIMER 52 69#define EXIT_REASON_PREEMPTION_TIMER 52
69#define EXIT_REASON_WBINVD 54 70#define EXIT_REASON_WBINVD 54
70#define EXIT_REASON_XSETBV 55 71#define EXIT_REASON_XSETBV 55
@@ -106,12 +107,13 @@
106 { EXIT_REASON_APIC_ACCESS, "APIC_ACCESS" }, \ 107 { EXIT_REASON_APIC_ACCESS, "APIC_ACCESS" }, \
107 { EXIT_REASON_EPT_VIOLATION, "EPT_VIOLATION" }, \ 108 { EXIT_REASON_EPT_VIOLATION, "EPT_VIOLATION" }, \
108 { EXIT_REASON_EPT_MISCONFIG, "EPT_MISCONFIG" }, \ 109 { EXIT_REASON_EPT_MISCONFIG, "EPT_MISCONFIG" }, \
110 { EXIT_REASON_INVEPT, "INVEPT" }, \
111 { EXIT_REASON_PREEMPTION_TIMER, "PREEMPTION_TIMER" }, \
109 { EXIT_REASON_WBINVD, "WBINVD" }, \ 112 { EXIT_REASON_WBINVD, "WBINVD" }, \
110 { EXIT_REASON_APIC_WRITE, "APIC_WRITE" }, \ 113 { EXIT_REASON_APIC_WRITE, "APIC_WRITE" }, \
111 { EXIT_REASON_EOI_INDUCED, "EOI_INDUCED" }, \ 114 { EXIT_REASON_EOI_INDUCED, "EOI_INDUCED" }, \
112 { EXIT_REASON_INVALID_STATE, "INVALID_STATE" }, \ 115 { EXIT_REASON_INVALID_STATE, "INVALID_STATE" }, \
113 { EXIT_REASON_INVD, "INVD" }, \ 116 { EXIT_REASON_INVD, "INVD" }, \
114 { EXIT_REASON_INVPCID, "INVPCID" }, \ 117 { EXIT_REASON_INVPCID, "INVPCID" }
115 { EXIT_REASON_PREEMPTION_TIMER, "PREEMPTION_TIMER" }
116 118
117#endif /* _UAPIVMX_H */ 119#endif /* _UAPIVMX_H */
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
index 88d99ea77723..a5408b965c9d 100644
--- a/arch/x86/kernel/Makefile
+++ b/arch/x86/kernel/Makefile
@@ -103,6 +103,9 @@ obj-$(CONFIG_X86_CHECK_BIOS_CORRUPTION) += check.o
103obj-$(CONFIG_SWIOTLB) += pci-swiotlb.o 103obj-$(CONFIG_SWIOTLB) += pci-swiotlb.o
104obj-$(CONFIG_OF) += devicetree.o 104obj-$(CONFIG_OF) += devicetree.o
105obj-$(CONFIG_UPROBES) += uprobes.o 105obj-$(CONFIG_UPROBES) += uprobes.o
106obj-y += sysfb.o
107obj-$(CONFIG_X86_SYSFB) += sysfb_simplefb.o
108obj-$(CONFIG_EFI) += sysfb_efi.o
106 109
107obj-$(CONFIG_PERF_EVENTS) += perf_regs.o 110obj-$(CONFIG_PERF_EVENTS) += perf_regs.o
108obj-$(CONFIG_TRACING) += tracepoint.o 111obj-$(CONFIG_TRACING) += tracepoint.o
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 2627a81253ee..40c76604199f 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -67,6 +67,7 @@ EXPORT_SYMBOL(acpi_pci_disabled);
67int acpi_lapic; 67int acpi_lapic;
68int acpi_ioapic; 68int acpi_ioapic;
69int acpi_strict; 69int acpi_strict;
70int acpi_disable_cmcff;
70 71
71u8 acpi_sci_flags __initdata; 72u8 acpi_sci_flags __initdata;
72int acpi_sci_override_gsi __initdata; 73int acpi_sci_override_gsi __initdata;
@@ -141,16 +142,8 @@ static u32 irq_to_gsi(int irq)
141} 142}
142 143
143/* 144/*
144 * Temporarily use the virtual area starting from FIX_IO_APIC_BASE_END, 145 * This is just a simple wrapper around early_ioremap(),
145 * to map the target physical address. The problem is that set_fixmap() 146 * with sanity checks for phys == 0 and size == 0.
146 * provides a single page, and it is possible that the page is not
147 * sufficient.
148 * By using this area, we can map up to MAX_IO_APICS pages temporarily,
149 * i.e. until the next __va_range() call.
150 *
151 * Important Safety Note: The fixed I/O APIC page numbers are *subtracted*
152 * from the fixed base. That's why we start at FIX_IO_APIC_BASE_END and
153 * count idx down while incrementing the phys address.
154 */ 147 */
155char *__init __acpi_map_table(unsigned long phys, unsigned long size) 148char *__init __acpi_map_table(unsigned long phys, unsigned long size)
156{ 149{
@@ -160,6 +153,7 @@ char *__init __acpi_map_table(unsigned long phys, unsigned long size)
160 153
161 return early_ioremap(phys, size); 154 return early_ioremap(phys, size);
162} 155}
156
163void __init __acpi_unmap_table(char *map, unsigned long size) 157void __init __acpi_unmap_table(char *map, unsigned long size)
164{ 158{
165 if (!map || !size) 159 if (!map || !size)
@@ -199,7 +193,7 @@ static void acpi_register_lapic(int id, u8 enabled)
199{ 193{
200 unsigned int ver = 0; 194 unsigned int ver = 0;
201 195
202 if (id >= (MAX_LOCAL_APIC-1)) { 196 if (id >= MAX_LOCAL_APIC) {
203 printk(KERN_INFO PREFIX "skipped apicid that is too big\n"); 197 printk(KERN_INFO PREFIX "skipped apicid that is too big\n");
204 return; 198 return;
205 } 199 }
@@ -1120,6 +1114,7 @@ int mp_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity)
1120 int ioapic; 1114 int ioapic;
1121 int ioapic_pin; 1115 int ioapic_pin;
1122 struct io_apic_irq_attr irq_attr; 1116 struct io_apic_irq_attr irq_attr;
1117 int ret;
1123 1118
1124 if (acpi_irq_model != ACPI_IRQ_MODEL_IOAPIC) 1119 if (acpi_irq_model != ACPI_IRQ_MODEL_IOAPIC)
1125 return gsi; 1120 return gsi;
@@ -1149,7 +1144,9 @@ int mp_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity)
1149 set_io_apic_irq_attr(&irq_attr, ioapic, ioapic_pin, 1144 set_io_apic_irq_attr(&irq_attr, ioapic, ioapic_pin,
1150 trigger == ACPI_EDGE_SENSITIVE ? 0 : 1, 1145 trigger == ACPI_EDGE_SENSITIVE ? 0 : 1,
1151 polarity == ACPI_ACTIVE_HIGH ? 0 : 1); 1146 polarity == ACPI_ACTIVE_HIGH ? 0 : 1);
1152 io_apic_set_pci_routing(dev, gsi_to_irq(gsi), &irq_attr); 1147 ret = io_apic_set_pci_routing(dev, gsi_to_irq(gsi), &irq_attr);
1148 if (ret < 0)
1149 gsi = INT_MIN;
1153 1150
1154 return gsi; 1151 return gsi;
1155} 1152}
@@ -1626,6 +1623,10 @@ static int __init parse_acpi(char *arg)
1626 /* "acpi=copy_dsdt" copys DSDT */ 1623 /* "acpi=copy_dsdt" copys DSDT */
1627 else if (strcmp(arg, "copy_dsdt") == 0) { 1624 else if (strcmp(arg, "copy_dsdt") == 0) {
1628 acpi_gbl_copy_dsdt_locally = 1; 1625 acpi_gbl_copy_dsdt_locally = 1;
1626 }
1627 /* "acpi=nocmcff" disables FF mode for corrected errors */
1628 else if (strcmp(arg, "nocmcff") == 0) {
1629 acpi_disable_cmcff = 1;
1629 } else { 1630 } else {
1630 /* Core will printk when we return error. */ 1631 /* Core will printk when we return error. */
1631 return -EINVAL; 1632 return -EINVAL;
diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c
index c15cf9a25e27..15e8563e5c24 100644
--- a/arch/x86/kernel/alternative.c
+++ b/arch/x86/kernel/alternative.c
@@ -11,6 +11,7 @@
11#include <linux/memory.h> 11#include <linux/memory.h>
12#include <linux/stop_machine.h> 12#include <linux/stop_machine.h>
13#include <linux/slab.h> 13#include <linux/slab.h>
14#include <linux/kdebug.h>
14#include <asm/alternative.h> 15#include <asm/alternative.h>
15#include <asm/sections.h> 16#include <asm/sections.h>
16#include <asm/pgtable.h> 17#include <asm/pgtable.h>
@@ -596,97 +597,93 @@ void *__kprobes text_poke(void *addr, const void *opcode, size_t len)
596 return addr; 597 return addr;
597} 598}
598 599
599/* 600static void do_sync_core(void *info)
600 * Cross-modifying kernel text with stop_machine(). 601{
601 * This code originally comes from immediate value. 602 sync_core();
602 */ 603}
603static atomic_t stop_machine_first;
604static int wrote_text;
605 604
606struct text_poke_params { 605static bool bp_patching_in_progress;
607 struct text_poke_param *params; 606static void *bp_int3_handler, *bp_int3_addr;
608 int nparams;
609};
610 607
611static int __kprobes stop_machine_text_poke(void *data) 608int poke_int3_handler(struct pt_regs *regs)
612{ 609{
613 struct text_poke_params *tpp = data; 610 /* bp_patching_in_progress */
614 struct text_poke_param *p; 611 smp_rmb();
615 int i;
616 612
617 if (atomic_xchg(&stop_machine_first, 0)) { 613 if (likely(!bp_patching_in_progress))
618 for (i = 0; i < tpp->nparams; i++) { 614 return 0;
619 p = &tpp->params[i];
620 text_poke(p->addr, p->opcode, p->len);
621 }
622 smp_wmb(); /* Make sure other cpus see that this has run */
623 wrote_text = 1;
624 } else {
625 while (!wrote_text)
626 cpu_relax();
627 smp_mb(); /* Load wrote_text before following execution */
628 }
629 615
630 for (i = 0; i < tpp->nparams; i++) { 616 if (user_mode_vm(regs) || regs->ip != (unsigned long)bp_int3_addr)
631 p = &tpp->params[i]; 617 return 0;
632 flush_icache_range((unsigned long)p->addr, 618
633 (unsigned long)p->addr + p->len); 619 /* set up the specified breakpoint handler */
634 } 620 regs->ip = (unsigned long) bp_int3_handler;
635 /* 621
636 * Intel Archiecture Software Developer's Manual section 7.1.3 specifies 622 return 1;
637 * that a core serializing instruction such as "cpuid" should be
638 * executed on _each_ core before the new instruction is made visible.
639 */
640 sync_core();
641 return 0;
642}
643 623
644/**
645 * text_poke_smp - Update instructions on a live kernel on SMP
646 * @addr: address to modify
647 * @opcode: source of the copy
648 * @len: length to copy
649 *
650 * Modify multi-byte instruction by using stop_machine() on SMP. This allows
651 * user to poke/set multi-byte text on SMP. Only non-NMI/MCE code modifying
652 * should be allowed, since stop_machine() does _not_ protect code against
653 * NMI and MCE.
654 *
655 * Note: Must be called under get_online_cpus() and text_mutex.
656 */
657void *__kprobes text_poke_smp(void *addr, const void *opcode, size_t len)
658{
659 struct text_poke_params tpp;
660 struct text_poke_param p;
661
662 p.addr = addr;
663 p.opcode = opcode;
664 p.len = len;
665 tpp.params = &p;
666 tpp.nparams = 1;
667 atomic_set(&stop_machine_first, 1);
668 wrote_text = 0;
669 /* Use __stop_machine() because the caller already got online_cpus. */
670 __stop_machine(stop_machine_text_poke, (void *)&tpp, cpu_online_mask);
671 return addr;
672} 624}
673 625
674/** 626/**
675 * text_poke_smp_batch - Update instructions on a live kernel on SMP 627 * text_poke_bp() -- update instructions on live kernel on SMP
676 * @params: an array of text_poke parameters 628 * @addr: address to patch
677 * @n: the number of elements in params. 629 * @opcode: opcode of new instruction
630 * @len: length to copy
631 * @handler: address to jump to when the temporary breakpoint is hit
678 * 632 *
679 * Modify multi-byte instruction by using stop_machine() on SMP. Since the 633 * Modify multi-byte instruction by using int3 breakpoint on SMP.
680 * stop_machine() is heavy task, it is better to aggregate text_poke requests 634 * We completely avoid stop_machine() here, and achieve the
681 * and do it once if possible. 635 * synchronization using int3 breakpoint.
682 * 636 *
683 * Note: Must be called under get_online_cpus() and text_mutex. 637 * The way it is done:
638 * - add a int3 trap to the address that will be patched
639 * - sync cores
640 * - update all but the first byte of the patched range
641 * - sync cores
642 * - replace the first byte (int3) by the first byte of
643 * replacing opcode
644 * - sync cores
645 *
646 * Note: must be called under text_mutex.
684 */ 647 */
685void __kprobes text_poke_smp_batch(struct text_poke_param *params, int n) 648void *text_poke_bp(void *addr, const void *opcode, size_t len, void *handler)
686{ 649{
687 struct text_poke_params tpp = {.params = params, .nparams = n}; 650 unsigned char int3 = 0xcc;
651
652 bp_int3_handler = handler;
653 bp_int3_addr = (u8 *)addr + sizeof(int3);
654 bp_patching_in_progress = true;
655 /*
656 * Corresponding read barrier in int3 notifier for
657 * making sure the in_progress flags is correctly ordered wrt.
658 * patching
659 */
660 smp_wmb();
661
662 text_poke(addr, &int3, sizeof(int3));
688 663
689 atomic_set(&stop_machine_first, 1); 664 on_each_cpu(do_sync_core, NULL, 1);
690 wrote_text = 0; 665
691 __stop_machine(stop_machine_text_poke, (void *)&tpp, cpu_online_mask); 666 if (len - sizeof(int3) > 0) {
667 /* patch all but the first byte */
668 text_poke((char *)addr + sizeof(int3),
669 (const char *) opcode + sizeof(int3),
670 len - sizeof(int3));
671 /*
672 * According to Intel, this core syncing is very likely
673 * not necessary and we'd be safe even without it. But
674 * better safe than sorry (plus there's not only Intel).
675 */
676 on_each_cpu(do_sync_core, NULL, 1);
677 }
678
679 /* patch the first byte */
680 text_poke(addr, opcode, sizeof(int3));
681
682 on_each_cpu(do_sync_core, NULL, 1);
683
684 bp_patching_in_progress = false;
685 smp_wmb();
686
687 return addr;
692} 688}
689
diff --git a/arch/x86/kernel/amd_nb.c b/arch/x86/kernel/amd_nb.c
index 3048ded1b598..59554dca96ec 100644
--- a/arch/x86/kernel/amd_nb.c
+++ b/arch/x86/kernel/amd_nb.c
@@ -20,6 +20,7 @@ const struct pci_device_id amd_nb_misc_ids[] = {
20 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_10H_NB_MISC) }, 20 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_10H_NB_MISC) },
21 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F3) }, 21 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F3) },
22 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_M10H_F3) }, 22 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_M10H_F3) },
23 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_M30H_NB_F3) },
23 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_16H_NB_F3) }, 24 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_16H_NB_F3) },
24 {} 25 {}
25}; 26};
@@ -27,6 +28,7 @@ EXPORT_SYMBOL(amd_nb_misc_ids);
27 28
28static const struct pci_device_id amd_nb_link_ids[] = { 29static const struct pci_device_id amd_nb_link_ids[] = {
29 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F4) }, 30 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F4) },
31 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_M30H_NB_F4) },
30 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_16H_NB_F4) }, 32 { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_16H_NB_F4) },
31 {} 33 {}
32}; 34};
@@ -81,13 +83,20 @@ int amd_cache_northbridges(void)
81 next_northbridge(misc, amd_nb_misc_ids); 83 next_northbridge(misc, amd_nb_misc_ids);
82 node_to_amd_nb(i)->link = link = 84 node_to_amd_nb(i)->link = link =
83 next_northbridge(link, amd_nb_link_ids); 85 next_northbridge(link, amd_nb_link_ids);
84 } 86 }
85 87
88 /* GART present only on Fam15h upto model 0fh */
86 if (boot_cpu_data.x86 == 0xf || boot_cpu_data.x86 == 0x10 || 89 if (boot_cpu_data.x86 == 0xf || boot_cpu_data.x86 == 0x10 ||
87 boot_cpu_data.x86 == 0x15) 90 (boot_cpu_data.x86 == 0x15 && boot_cpu_data.x86_model < 0x10))
88 amd_northbridges.flags |= AMD_NB_GART; 91 amd_northbridges.flags |= AMD_NB_GART;
89 92
90 /* 93 /*
94 * Check for L3 cache presence.
95 */
96 if (!cpuid_edx(0x80000006))
97 return 0;
98
99 /*
91 * Some CPU families support L3 Cache Index Disable. There are some 100 * Some CPU families support L3 Cache Index Disable. There are some
92 * limitations because of E382 and E388 on family 0x10. 101 * limitations because of E382 and E388 on family 0x10.
93 */ 102 */
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
index eca89c53a7f5..a7eb82d9b012 100644
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -913,7 +913,7 @@ static void local_apic_timer_interrupt(void)
913 * [ if a single-CPU system runs an SMP kernel then we call the local 913 * [ if a single-CPU system runs an SMP kernel then we call the local
914 * interrupt as well. Thus we cannot inline the local irq ... ] 914 * interrupt as well. Thus we cannot inline the local irq ... ]
915 */ 915 */
916void __irq_entry smp_apic_timer_interrupt(struct pt_regs *regs) 916__visible void __irq_entry smp_apic_timer_interrupt(struct pt_regs *regs)
917{ 917{
918 struct pt_regs *old_regs = set_irq_regs(regs); 918 struct pt_regs *old_regs = set_irq_regs(regs);
919 919
@@ -932,7 +932,7 @@ void __irq_entry smp_apic_timer_interrupt(struct pt_regs *regs)
932 set_irq_regs(old_regs); 932 set_irq_regs(old_regs);
933} 933}
934 934
935void __irq_entry smp_trace_apic_timer_interrupt(struct pt_regs *regs) 935__visible void __irq_entry smp_trace_apic_timer_interrupt(struct pt_regs *regs)
936{ 936{
937 struct pt_regs *old_regs = set_irq_regs(regs); 937 struct pt_regs *old_regs = set_irq_regs(regs);
938 938
@@ -1946,14 +1946,14 @@ static inline void __smp_spurious_interrupt(void)
1946 "should never happen.\n", smp_processor_id()); 1946 "should never happen.\n", smp_processor_id());
1947} 1947}
1948 1948
1949void smp_spurious_interrupt(struct pt_regs *regs) 1949__visible void smp_spurious_interrupt(struct pt_regs *regs)
1950{ 1950{
1951 entering_irq(); 1951 entering_irq();
1952 __smp_spurious_interrupt(); 1952 __smp_spurious_interrupt();
1953 exiting_irq(); 1953 exiting_irq();
1954} 1954}
1955 1955
1956void smp_trace_spurious_interrupt(struct pt_regs *regs) 1956__visible void smp_trace_spurious_interrupt(struct pt_regs *regs)
1957{ 1957{
1958 entering_irq(); 1958 entering_irq();
1959 trace_spurious_apic_entry(SPURIOUS_APIC_VECTOR); 1959 trace_spurious_apic_entry(SPURIOUS_APIC_VECTOR);
@@ -2002,14 +2002,14 @@ static inline void __smp_error_interrupt(struct pt_regs *regs)
2002 2002
2003} 2003}
2004 2004
2005void smp_error_interrupt(struct pt_regs *regs) 2005__visible void smp_error_interrupt(struct pt_regs *regs)
2006{ 2006{
2007 entering_irq(); 2007 entering_irq();
2008 __smp_error_interrupt(regs); 2008 __smp_error_interrupt(regs);
2009 exiting_irq(); 2009 exiting_irq();
2010} 2010}
2011 2011
2012void smp_trace_error_interrupt(struct pt_regs *regs) 2012__visible void smp_trace_error_interrupt(struct pt_regs *regs)
2013{ 2013{
2014 entering_irq(); 2014 entering_irq();
2015 trace_error_apic_entry(ERROR_APIC_VECTOR); 2015 trace_error_apic_entry(ERROR_APIC_VECTOR);
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index 9ed796ccc32c..e63a5bd2a78f 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -1534,6 +1534,11 @@ void intel_ir_io_apic_print_entries(unsigned int apic,
1534 } 1534 }
1535} 1535}
1536 1536
1537void ioapic_zap_locks(void)
1538{
1539 raw_spin_lock_init(&ioapic_lock);
1540}
1541
1537__apicdebuginit(void) print_IO_APIC(int ioapic_idx) 1542__apicdebuginit(void) print_IO_APIC(int ioapic_idx)
1538{ 1543{
1539 union IO_APIC_reg_00 reg_00; 1544 union IO_APIC_reg_00 reg_00;
@@ -3375,12 +3380,15 @@ int io_apic_setup_irq_pin_once(unsigned int irq, int node,
3375{ 3380{
3376 unsigned int ioapic_idx = attr->ioapic, pin = attr->ioapic_pin; 3381 unsigned int ioapic_idx = attr->ioapic, pin = attr->ioapic_pin;
3377 int ret; 3382 int ret;
3383 struct IO_APIC_route_entry orig_entry;
3378 3384
3379 /* Avoid redundant programming */ 3385 /* Avoid redundant programming */
3380 if (test_bit(pin, ioapics[ioapic_idx].pin_programmed)) { 3386 if (test_bit(pin, ioapics[ioapic_idx].pin_programmed)) {
3381 pr_debug("Pin %d-%d already programmed\n", 3387 pr_debug("Pin %d-%d already programmed\n", mpc_ioapic_id(ioapic_idx), pin);
3382 mpc_ioapic_id(ioapic_idx), pin); 3388 orig_entry = ioapic_read_entry(attr->ioapic, pin);
3383 return 0; 3389 if (attr->trigger == orig_entry.trigger && attr->polarity == orig_entry.polarity)
3390 return 0;
3391 return -EBUSY;
3384 } 3392 }
3385 ret = io_apic_setup_irq_pin(irq, node, attr); 3393 ret = io_apic_setup_irq_pin(irq, node, attr);
3386 if (!ret) 3394 if (!ret)
diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c
index 53a4e2744846..3ab03430211d 100644
--- a/arch/x86/kernel/apm_32.c
+++ b/arch/x86/kernel/apm_32.c
@@ -392,7 +392,7 @@ static struct cpuidle_device apm_cpuidle_device;
392/* 392/*
393 * Local variables 393 * Local variables
394 */ 394 */
395static struct { 395__visible struct {
396 unsigned long offset; 396 unsigned long offset;
397 unsigned short segment; 397 unsigned short segment;
398} apm_bios_entry; 398} apm_bios_entry;
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
index 08a089043ccf..903a264af981 100644
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@ -66,8 +66,8 @@ static inline int wrmsrl_amd_safe(unsigned msr, unsigned long long val)
66 * performance at the same time.. 66 * performance at the same time..
67 */ 67 */
68 68
69extern void vide(void); 69extern __visible void vide(void);
70__asm__(".align 4\nvide: ret"); 70__asm__(".globl vide\n\t.align 4\nvide: ret");
71 71
72static void init_amd_k5(struct cpuinfo_x86 *c) 72static void init_amd_k5(struct cpuinfo_x86 *c)
73{ 73{
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index 25eb2747b063..2793d1f095a2 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -1076,7 +1076,7 @@ struct desc_ptr debug_idt_descr = { NR_VECTORS * 16 - 1,
1076 (unsigned long) debug_idt_table }; 1076 (unsigned long) debug_idt_table };
1077 1077
1078DEFINE_PER_CPU_FIRST(union irq_stack_union, 1078DEFINE_PER_CPU_FIRST(union irq_stack_union,
1079 irq_stack_union) __aligned(PAGE_SIZE); 1079 irq_stack_union) __aligned(PAGE_SIZE) __visible;
1080 1080
1081/* 1081/*
1082 * The following four percpu variables are hot. Align current_task to 1082 * The following four percpu variables are hot. Align current_task to
@@ -1093,7 +1093,7 @@ EXPORT_PER_CPU_SYMBOL(kernel_stack);
1093DEFINE_PER_CPU(char *, irq_stack_ptr) = 1093DEFINE_PER_CPU(char *, irq_stack_ptr) =
1094 init_per_cpu_var(irq_stack_union.irq_stack) + IRQ_STACK_SIZE - 64; 1094 init_per_cpu_var(irq_stack_union.irq_stack) + IRQ_STACK_SIZE - 64;
1095 1095
1096DEFINE_PER_CPU(unsigned int, irq_count) = -1; 1096DEFINE_PER_CPU(unsigned int, irq_count) __visible = -1;
1097 1097
1098DEFINE_PER_CPU(struct task_struct *, fpu_owner_task); 1098DEFINE_PER_CPU(struct task_struct *, fpu_owner_task);
1099 1099
diff --git a/arch/x86/kernel/cpu/hypervisor.c b/arch/x86/kernel/cpu/hypervisor.c
index 87279212d318..36ce402a3fa5 100644
--- a/arch/x86/kernel/cpu/hypervisor.c
+++ b/arch/x86/kernel/cpu/hypervisor.c
@@ -25,11 +25,6 @@
25#include <asm/processor.h> 25#include <asm/processor.h>
26#include <asm/hypervisor.h> 26#include <asm/hypervisor.h>
27 27
28/*
29 * Hypervisor detect order. This is specified explicitly here because
30 * some hypervisors might implement compatibility modes for other
31 * hypervisors and therefore need to be detected in specific sequence.
32 */
33static const __initconst struct hypervisor_x86 * const hypervisors[] = 28static const __initconst struct hypervisor_x86 * const hypervisors[] =
34{ 29{
35#ifdef CONFIG_XEN_PVHVM 30#ifdef CONFIG_XEN_PVHVM
@@ -49,15 +44,19 @@ static inline void __init
49detect_hypervisor_vendor(void) 44detect_hypervisor_vendor(void)
50{ 45{
51 const struct hypervisor_x86 *h, * const *p; 46 const struct hypervisor_x86 *h, * const *p;
47 uint32_t pri, max_pri = 0;
52 48
53 for (p = hypervisors; p < hypervisors + ARRAY_SIZE(hypervisors); p++) { 49 for (p = hypervisors; p < hypervisors + ARRAY_SIZE(hypervisors); p++) {
54 h = *p; 50 h = *p;
55 if (h->detect()) { 51 pri = h->detect();
52 if (pri != 0 && pri > max_pri) {
53 max_pri = pri;
56 x86_hyper = h; 54 x86_hyper = h;
57 printk(KERN_INFO "Hypervisor detected: %s\n", h->name);
58 break;
59 } 55 }
60 } 56 }
57
58 if (max_pri)
59 printk(KERN_INFO "Hypervisor detected: %s\n", x86_hyper->name);
61} 60}
62 61
63void init_hypervisor(struct cpuinfo_x86 *c) 62void init_hypervisor(struct cpuinfo_x86 *c)
diff --git a/arch/x86/kernel/cpu/mcheck/mce-internal.h b/arch/x86/kernel/cpu/mcheck/mce-internal.h
index 5b7d4fa5d3b7..09edd0b65fef 100644
--- a/arch/x86/kernel/cpu/mcheck/mce-internal.h
+++ b/arch/x86/kernel/cpu/mcheck/mce-internal.h
@@ -25,15 +25,18 @@ int mce_severity(struct mce *a, int tolerant, char **msg);
25struct dentry *mce_get_debugfs_dir(void); 25struct dentry *mce_get_debugfs_dir(void);
26 26
27extern struct mce_bank *mce_banks; 27extern struct mce_bank *mce_banks;
28extern mce_banks_t mce_banks_ce_disabled;
28 29
29#ifdef CONFIG_X86_MCE_INTEL 30#ifdef CONFIG_X86_MCE_INTEL
30unsigned long mce_intel_adjust_timer(unsigned long interval); 31unsigned long mce_intel_adjust_timer(unsigned long interval);
31void mce_intel_cmci_poll(void); 32void mce_intel_cmci_poll(void);
32void mce_intel_hcpu_update(unsigned long cpu); 33void mce_intel_hcpu_update(unsigned long cpu);
34void cmci_disable_bank(int bank);
33#else 35#else
34# define mce_intel_adjust_timer mce_adjust_timer_default 36# define mce_intel_adjust_timer mce_adjust_timer_default
35static inline void mce_intel_cmci_poll(void) { } 37static inline void mce_intel_cmci_poll(void) { }
36static inline void mce_intel_hcpu_update(unsigned long cpu) { } 38static inline void mce_intel_hcpu_update(unsigned long cpu) { }
39static inline void cmci_disable_bank(int bank) { }
37#endif 40#endif
38 41
39void mce_timer_kick(unsigned long interval); 42void mce_timer_kick(unsigned long interval);
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c
index 87a65c939bcd..b3218cdee95f 100644
--- a/arch/x86/kernel/cpu/mcheck/mce.c
+++ b/arch/x86/kernel/cpu/mcheck/mce.c
@@ -97,6 +97,15 @@ DEFINE_PER_CPU(mce_banks_t, mce_poll_banks) = {
97 [0 ... BITS_TO_LONGS(MAX_NR_BANKS)-1] = ~0UL 97 [0 ... BITS_TO_LONGS(MAX_NR_BANKS)-1] = ~0UL
98}; 98};
99 99
100/*
101 * MCA banks controlled through firmware first for corrected errors.
102 * This is a global list of banks for which we won't enable CMCI and we
103 * won't poll. Firmware controls these banks and is responsible for
104 * reporting corrected errors through GHES. Uncorrected/recoverable
105 * errors are still notified through a machine check.
106 */
107mce_banks_t mce_banks_ce_disabled;
108
100static DEFINE_PER_CPU(struct work_struct, mce_work); 109static DEFINE_PER_CPU(struct work_struct, mce_work);
101 110
102static void (*quirk_no_way_out)(int bank, struct mce *m, struct pt_regs *regs); 111static void (*quirk_no_way_out)(int bank, struct mce *m, struct pt_regs *regs);
@@ -1935,6 +1944,25 @@ static struct miscdevice mce_chrdev_device = {
1935 &mce_chrdev_ops, 1944 &mce_chrdev_ops,
1936}; 1945};
1937 1946
1947static void __mce_disable_bank(void *arg)
1948{
1949 int bank = *((int *)arg);
1950 __clear_bit(bank, __get_cpu_var(mce_poll_banks));
1951 cmci_disable_bank(bank);
1952}
1953
1954void mce_disable_bank(int bank)
1955{
1956 if (bank >= mca_cfg.banks) {
1957 pr_warn(FW_BUG
1958 "Ignoring request to disable invalid MCA bank %d.\n",
1959 bank);
1960 return;
1961 }
1962 set_bit(bank, mce_banks_ce_disabled);
1963 on_each_cpu(__mce_disable_bank, &bank, 1);
1964}
1965
1938/* 1966/*
1939 * mce=off Disables machine check 1967 * mce=off Disables machine check
1940 * mce=no_cmci Disables CMCI 1968 * mce=no_cmci Disables CMCI
diff --git a/arch/x86/kernel/cpu/mcheck/mce_intel.c b/arch/x86/kernel/cpu/mcheck/mce_intel.c
index d56405309dc1..4cfe0458ca66 100644
--- a/arch/x86/kernel/cpu/mcheck/mce_intel.c
+++ b/arch/x86/kernel/cpu/mcheck/mce_intel.c
@@ -203,6 +203,10 @@ static void cmci_discover(int banks)
203 if (test_bit(i, owned)) 203 if (test_bit(i, owned))
204 continue; 204 continue;
205 205
206 /* Skip banks in firmware first mode */
207 if (test_bit(i, mce_banks_ce_disabled))
208 continue;
209
206 rdmsrl(MSR_IA32_MCx_CTL2(i), val); 210 rdmsrl(MSR_IA32_MCx_CTL2(i), val);
207 211
208 /* Already owned by someone else? */ 212 /* Already owned by someone else? */
@@ -271,6 +275,19 @@ void cmci_recheck(void)
271 local_irq_restore(flags); 275 local_irq_restore(flags);
272} 276}
273 277
278/* Caller must hold the lock on cmci_discover_lock */
279static void __cmci_disable_bank(int bank)
280{
281 u64 val;
282
283 if (!test_bit(bank, __get_cpu_var(mce_banks_owned)))
284 return;
285 rdmsrl(MSR_IA32_MCx_CTL2(bank), val);
286 val &= ~MCI_CTL2_CMCI_EN;
287 wrmsrl(MSR_IA32_MCx_CTL2(bank), val);
288 __clear_bit(bank, __get_cpu_var(mce_banks_owned));
289}
290
274/* 291/*
275 * Disable CMCI on this CPU for all banks it owns when it goes down. 292 * Disable CMCI on this CPU for all banks it owns when it goes down.
276 * This allows other CPUs to claim the banks on rediscovery. 293 * This allows other CPUs to claim the banks on rediscovery.
@@ -280,20 +297,12 @@ void cmci_clear(void)
280 unsigned long flags; 297 unsigned long flags;
281 int i; 298 int i;
282 int banks; 299 int banks;
283 u64 val;
284 300
285 if (!cmci_supported(&banks)) 301 if (!cmci_supported(&banks))
286 return; 302 return;
287 raw_spin_lock_irqsave(&cmci_discover_lock, flags); 303 raw_spin_lock_irqsave(&cmci_discover_lock, flags);
288 for (i = 0; i < banks; i++) { 304 for (i = 0; i < banks; i++)
289 if (!test_bit(i, __get_cpu_var(mce_banks_owned))) 305 __cmci_disable_bank(i);
290 continue;
291 /* Disable CMCI */
292 rdmsrl(MSR_IA32_MCx_CTL2(i), val);
293 val &= ~MCI_CTL2_CMCI_EN;
294 wrmsrl(MSR_IA32_MCx_CTL2(i), val);
295 __clear_bit(i, __get_cpu_var(mce_banks_owned));
296 }
297 raw_spin_unlock_irqrestore(&cmci_discover_lock, flags); 306 raw_spin_unlock_irqrestore(&cmci_discover_lock, flags);
298} 307}
299 308
@@ -327,6 +336,19 @@ void cmci_reenable(void)
327 cmci_discover(banks); 336 cmci_discover(banks);
328} 337}
329 338
339void cmci_disable_bank(int bank)
340{
341 int banks;
342 unsigned long flags;
343
344 if (!cmci_supported(&banks))
345 return;
346
347 raw_spin_lock_irqsave(&cmci_discover_lock, flags);
348 __cmci_disable_bank(bank);
349 raw_spin_unlock_irqrestore(&cmci_discover_lock, flags);
350}
351
330static void intel_init_cmci(void) 352static void intel_init_cmci(void)
331{ 353{
332 int banks; 354 int banks;
diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c
index 8f4be53ea04b..71a39f3621ba 100644
--- a/arch/x86/kernel/cpu/mshyperv.c
+++ b/arch/x86/kernel/cpu/mshyperv.c
@@ -27,20 +27,23 @@
27struct ms_hyperv_info ms_hyperv; 27struct ms_hyperv_info ms_hyperv;
28EXPORT_SYMBOL_GPL(ms_hyperv); 28EXPORT_SYMBOL_GPL(ms_hyperv);
29 29
30static bool __init ms_hyperv_platform(void) 30static uint32_t __init ms_hyperv_platform(void)
31{ 31{
32 u32 eax; 32 u32 eax;
33 u32 hyp_signature[3]; 33 u32 hyp_signature[3];
34 34
35 if (!boot_cpu_has(X86_FEATURE_HYPERVISOR)) 35 if (!boot_cpu_has(X86_FEATURE_HYPERVISOR))
36 return false; 36 return 0;
37 37
38 cpuid(HYPERV_CPUID_VENDOR_AND_MAX_FUNCTIONS, 38 cpuid(HYPERV_CPUID_VENDOR_AND_MAX_FUNCTIONS,
39 &eax, &hyp_signature[0], &hyp_signature[1], &hyp_signature[2]); 39 &eax, &hyp_signature[0], &hyp_signature[1], &hyp_signature[2]);
40 40
41 return eax >= HYPERV_CPUID_MIN && 41 if (eax >= HYPERV_CPUID_MIN &&
42 eax <= HYPERV_CPUID_MAX && 42 eax <= HYPERV_CPUID_MAX &&
43 !memcmp("Microsoft Hv", hyp_signature, 12); 43 !memcmp("Microsoft Hv", hyp_signature, 12))
44 return HYPERV_CPUID_VENDOR_AND_MAX_FUNCTIONS;
45
46 return 0;
44} 47}
45 48
46static cycle_t read_hv_clock(struct clocksource *arg) 49static cycle_t read_hv_clock(struct clocksource *arg)
diff --git a/arch/x86/kernel/cpu/mtrr/generic.c b/arch/x86/kernel/cpu/mtrr/generic.c
index d4cdfa67509e..ce2d0a2c3e4f 100644
--- a/arch/x86/kernel/cpu/mtrr/generic.c
+++ b/arch/x86/kernel/cpu/mtrr/generic.c
@@ -683,6 +683,7 @@ static void prepare_set(void) __acquires(set_atomicity_lock)
683 } 683 }
684 684
685 /* Flush all TLBs via a mov %cr3, %reg; mov %reg, %cr3 */ 685 /* Flush all TLBs via a mov %cr3, %reg; mov %reg, %cr3 */
686 count_vm_event(NR_TLB_LOCAL_FLUSH_ALL);
686 __flush_tlb(); 687 __flush_tlb();
687 688
688 /* Save MTRR state */ 689 /* Save MTRR state */
@@ -696,6 +697,7 @@ static void prepare_set(void) __acquires(set_atomicity_lock)
696static void post_set(void) __releases(set_atomicity_lock) 697static void post_set(void) __releases(set_atomicity_lock)
697{ 698{
698 /* Flush TLBs (no need to flush caches - they are disabled) */ 699 /* Flush TLBs (no need to flush caches - they are disabled) */
700 count_vm_event(NR_TLB_LOCAL_FLUSH_ALL);
699 __flush_tlb(); 701 __flush_tlb();
700 702
701 /* Intel (P6) standard MTRRs */ 703 /* Intel (P6) standard MTRRs */
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c
index a7c7305030cc..a9c606bb4945 100644
--- a/arch/x86/kernel/cpu/perf_event.c
+++ b/arch/x86/kernel/cpu/perf_event.c
@@ -1883,8 +1883,9 @@ static struct pmu pmu = {
1883 1883
1884void arch_perf_update_userpage(struct perf_event_mmap_page *userpg, u64 now) 1884void arch_perf_update_userpage(struct perf_event_mmap_page *userpg, u64 now)
1885{ 1885{
1886 userpg->cap_usr_time = 0; 1886 userpg->cap_user_time = 0;
1887 userpg->cap_usr_rdpmc = x86_pmu.attr_rdpmc; 1887 userpg->cap_user_time_zero = 0;
1888 userpg->cap_user_rdpmc = x86_pmu.attr_rdpmc;
1888 userpg->pmc_width = x86_pmu.cntval_bits; 1889 userpg->pmc_width = x86_pmu.cntval_bits;
1889 1890
1890 if (!boot_cpu_has(X86_FEATURE_CONSTANT_TSC)) 1891 if (!boot_cpu_has(X86_FEATURE_CONSTANT_TSC))
@@ -1893,10 +1894,15 @@ void arch_perf_update_userpage(struct perf_event_mmap_page *userpg, u64 now)
1893 if (!boot_cpu_has(X86_FEATURE_NONSTOP_TSC)) 1894 if (!boot_cpu_has(X86_FEATURE_NONSTOP_TSC))
1894 return; 1895 return;
1895 1896
1896 userpg->cap_usr_time = 1; 1897 userpg->cap_user_time = 1;
1897 userpg->time_mult = this_cpu_read(cyc2ns); 1898 userpg->time_mult = this_cpu_read(cyc2ns);
1898 userpg->time_shift = CYC2NS_SCALE_FACTOR; 1899 userpg->time_shift = CYC2NS_SCALE_FACTOR;
1899 userpg->time_offset = this_cpu_read(cyc2ns_offset) - now; 1900 userpg->time_offset = this_cpu_read(cyc2ns_offset) - now;
1901
1902 if (sched_clock_stable && !check_tsc_disabled()) {
1903 userpg->cap_user_time_zero = 1;
1904 userpg->time_zero = this_cpu_read(cyc2ns_offset);
1905 }
1900} 1906}
1901 1907
1902/* 1908/*
diff --git a/arch/x86/kernel/cpu/perf_event.h b/arch/x86/kernel/cpu/perf_event.h
index 97e557bc4c91..cc16faae0538 100644
--- a/arch/x86/kernel/cpu/perf_event.h
+++ b/arch/x86/kernel/cpu/perf_event.h
@@ -641,6 +641,8 @@ extern struct event_constraint intel_core2_pebs_event_constraints[];
641 641
642extern struct event_constraint intel_atom_pebs_event_constraints[]; 642extern struct event_constraint intel_atom_pebs_event_constraints[];
643 643
644extern struct event_constraint intel_slm_pebs_event_constraints[];
645
644extern struct event_constraint intel_nehalem_pebs_event_constraints[]; 646extern struct event_constraint intel_nehalem_pebs_event_constraints[];
645 647
646extern struct event_constraint intel_westmere_pebs_event_constraints[]; 648extern struct event_constraint intel_westmere_pebs_event_constraints[];
diff --git a/arch/x86/kernel/cpu/perf_event_amd.c b/arch/x86/kernel/cpu/perf_event_amd.c
index 4cbe03287b08..beeb7cc07044 100644
--- a/arch/x86/kernel/cpu/perf_event_amd.c
+++ b/arch/x86/kernel/cpu/perf_event_amd.c
@@ -347,8 +347,7 @@ static struct amd_nb *amd_alloc_nb(int cpu)
347 struct amd_nb *nb; 347 struct amd_nb *nb;
348 int i; 348 int i;
349 349
350 nb = kmalloc_node(sizeof(struct amd_nb), GFP_KERNEL | __GFP_ZERO, 350 nb = kzalloc_node(sizeof(struct amd_nb), GFP_KERNEL, cpu_to_node(cpu));
351 cpu_to_node(cpu));
352 if (!nb) 351 if (!nb)
353 return NULL; 352 return NULL;
354 353
diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c
index a45d8d4ace10..f31a1655d1ff 100644
--- a/arch/x86/kernel/cpu/perf_event_intel.c
+++ b/arch/x86/kernel/cpu/perf_event_intel.c
@@ -81,7 +81,8 @@ static struct event_constraint intel_nehalem_event_constraints[] __read_mostly =
81 81
82static struct extra_reg intel_nehalem_extra_regs[] __read_mostly = 82static struct extra_reg intel_nehalem_extra_regs[] __read_mostly =
83{ 83{
84 INTEL_EVENT_EXTRA_REG(0xb7, MSR_OFFCORE_RSP_0, 0xffff, RSP_0), 84 /* must define OFFCORE_RSP_X first, see intel_fixup_er() */
85 INTEL_UEVENT_EXTRA_REG(0x01b7, MSR_OFFCORE_RSP_0, 0xffff, RSP_0),
85 INTEL_UEVENT_PEBS_LDLAT_EXTRA_REG(0x100b), 86 INTEL_UEVENT_PEBS_LDLAT_EXTRA_REG(0x100b),
86 EVENT_EXTRA_END 87 EVENT_EXTRA_END
87}; 88};
@@ -123,6 +124,7 @@ static struct event_constraint intel_ivb_event_constraints[] __read_mostly =
123 INTEL_UEVENT_CONSTRAINT(0x0148, 0x4), /* L1D_PEND_MISS.PENDING */ 124 INTEL_UEVENT_CONSTRAINT(0x0148, 0x4), /* L1D_PEND_MISS.PENDING */
124 INTEL_UEVENT_CONSTRAINT(0x0279, 0xf), /* IDQ.EMTPY */ 125 INTEL_UEVENT_CONSTRAINT(0x0279, 0xf), /* IDQ.EMTPY */
125 INTEL_UEVENT_CONSTRAINT(0x019c, 0xf), /* IDQ_UOPS_NOT_DELIVERED.CORE */ 126 INTEL_UEVENT_CONSTRAINT(0x019c, 0xf), /* IDQ_UOPS_NOT_DELIVERED.CORE */
127 INTEL_UEVENT_CONSTRAINT(0x02a3, 0xf), /* CYCLE_ACTIVITY.CYCLES_LDM_PENDING */
126 INTEL_UEVENT_CONSTRAINT(0x04a3, 0xf), /* CYCLE_ACTIVITY.CYCLES_NO_EXECUTE */ 128 INTEL_UEVENT_CONSTRAINT(0x04a3, 0xf), /* CYCLE_ACTIVITY.CYCLES_NO_EXECUTE */
127 INTEL_UEVENT_CONSTRAINT(0x05a3, 0xf), /* CYCLE_ACTIVITY.STALLS_L2_PENDING */ 129 INTEL_UEVENT_CONSTRAINT(0x05a3, 0xf), /* CYCLE_ACTIVITY.STALLS_L2_PENDING */
128 INTEL_UEVENT_CONSTRAINT(0x06a3, 0xf), /* CYCLE_ACTIVITY.STALLS_LDM_PENDING */ 130 INTEL_UEVENT_CONSTRAINT(0x06a3, 0xf), /* CYCLE_ACTIVITY.STALLS_LDM_PENDING */
@@ -143,8 +145,9 @@ static struct event_constraint intel_ivb_event_constraints[] __read_mostly =
143 145
144static struct extra_reg intel_westmere_extra_regs[] __read_mostly = 146static struct extra_reg intel_westmere_extra_regs[] __read_mostly =
145{ 147{
146 INTEL_EVENT_EXTRA_REG(0xb7, MSR_OFFCORE_RSP_0, 0xffff, RSP_0), 148 /* must define OFFCORE_RSP_X first, see intel_fixup_er() */
147 INTEL_EVENT_EXTRA_REG(0xbb, MSR_OFFCORE_RSP_1, 0xffff, RSP_1), 149 INTEL_UEVENT_EXTRA_REG(0x01b7, MSR_OFFCORE_RSP_0, 0xffff, RSP_0),
150 INTEL_UEVENT_EXTRA_REG(0x01bb, MSR_OFFCORE_RSP_1, 0xffff, RSP_1),
148 INTEL_UEVENT_PEBS_LDLAT_EXTRA_REG(0x100b), 151 INTEL_UEVENT_PEBS_LDLAT_EXTRA_REG(0x100b),
149 EVENT_EXTRA_END 152 EVENT_EXTRA_END
150}; 153};
@@ -162,16 +165,27 @@ static struct event_constraint intel_gen_event_constraints[] __read_mostly =
162 EVENT_CONSTRAINT_END 165 EVENT_CONSTRAINT_END
163}; 166};
164 167
168static struct event_constraint intel_slm_event_constraints[] __read_mostly =
169{
170 FIXED_EVENT_CONSTRAINT(0x00c0, 0), /* INST_RETIRED.ANY */
171 FIXED_EVENT_CONSTRAINT(0x003c, 1), /* CPU_CLK_UNHALTED.CORE */
172 FIXED_EVENT_CONSTRAINT(0x013c, 2), /* CPU_CLK_UNHALTED.REF */
173 FIXED_EVENT_CONSTRAINT(0x0300, 2), /* pseudo CPU_CLK_UNHALTED.REF */
174 EVENT_CONSTRAINT_END
175};
176
165static struct extra_reg intel_snb_extra_regs[] __read_mostly = { 177static struct extra_reg intel_snb_extra_regs[] __read_mostly = {
166 INTEL_EVENT_EXTRA_REG(0xb7, MSR_OFFCORE_RSP_0, 0x3f807f8fffull, RSP_0), 178 /* must define OFFCORE_RSP_X first, see intel_fixup_er() */
167 INTEL_EVENT_EXTRA_REG(0xbb, MSR_OFFCORE_RSP_1, 0x3f807f8fffull, RSP_1), 179 INTEL_UEVENT_EXTRA_REG(0x01b7, MSR_OFFCORE_RSP_0, 0x3f807f8fffull, RSP_0),
180 INTEL_UEVENT_EXTRA_REG(0x01bb, MSR_OFFCORE_RSP_1, 0x3f807f8fffull, RSP_1),
168 INTEL_UEVENT_PEBS_LDLAT_EXTRA_REG(0x01cd), 181 INTEL_UEVENT_PEBS_LDLAT_EXTRA_REG(0x01cd),
169 EVENT_EXTRA_END 182 EVENT_EXTRA_END
170}; 183};
171 184
172static struct extra_reg intel_snbep_extra_regs[] __read_mostly = { 185static struct extra_reg intel_snbep_extra_regs[] __read_mostly = {
173 INTEL_EVENT_EXTRA_REG(0xb7, MSR_OFFCORE_RSP_0, 0x3fffff8fffull, RSP_0), 186 /* must define OFFCORE_RSP_X first, see intel_fixup_er() */
174 INTEL_EVENT_EXTRA_REG(0xbb, MSR_OFFCORE_RSP_1, 0x3fffff8fffull, RSP_1), 187 INTEL_UEVENT_EXTRA_REG(0x01b7, MSR_OFFCORE_RSP_0, 0x3fffff8fffull, RSP_0),
188 INTEL_UEVENT_EXTRA_REG(0x01bb, MSR_OFFCORE_RSP_1, 0x3fffff8fffull, RSP_1),
175 INTEL_UEVENT_PEBS_LDLAT_EXTRA_REG(0x01cd), 189 INTEL_UEVENT_PEBS_LDLAT_EXTRA_REG(0x01cd),
176 EVENT_EXTRA_END 190 EVENT_EXTRA_END
177}; 191};
@@ -882,6 +896,140 @@ static __initconst const u64 atom_hw_cache_event_ids
882 }, 896 },
883}; 897};
884 898
899static struct extra_reg intel_slm_extra_regs[] __read_mostly =
900{
901 /* must define OFFCORE_RSP_X first, see intel_fixup_er() */
902 INTEL_UEVENT_EXTRA_REG(0x01b7, MSR_OFFCORE_RSP_0, 0x768005ffffull, RSP_0),
903 INTEL_UEVENT_EXTRA_REG(0x02b7, MSR_OFFCORE_RSP_1, 0x768005ffffull, RSP_1),
904 EVENT_EXTRA_END
905};
906
907#define SLM_DMND_READ SNB_DMND_DATA_RD
908#define SLM_DMND_WRITE SNB_DMND_RFO
909#define SLM_DMND_PREFETCH (SNB_PF_DATA_RD|SNB_PF_RFO)
910
911#define SLM_SNP_ANY (SNB_SNP_NONE|SNB_SNP_MISS|SNB_NO_FWD|SNB_HITM)
912#define SLM_LLC_ACCESS SNB_RESP_ANY
913#define SLM_LLC_MISS (SLM_SNP_ANY|SNB_NON_DRAM)
914
915static __initconst const u64 slm_hw_cache_extra_regs
916 [PERF_COUNT_HW_CACHE_MAX]
917 [PERF_COUNT_HW_CACHE_OP_MAX]
918 [PERF_COUNT_HW_CACHE_RESULT_MAX] =
919{
920 [ C(LL ) ] = {
921 [ C(OP_READ) ] = {
922 [ C(RESULT_ACCESS) ] = SLM_DMND_READ|SLM_LLC_ACCESS,
923 [ C(RESULT_MISS) ] = SLM_DMND_READ|SLM_LLC_MISS,
924 },
925 [ C(OP_WRITE) ] = {
926 [ C(RESULT_ACCESS) ] = SLM_DMND_WRITE|SLM_LLC_ACCESS,
927 [ C(RESULT_MISS) ] = SLM_DMND_WRITE|SLM_LLC_MISS,
928 },
929 [ C(OP_PREFETCH) ] = {
930 [ C(RESULT_ACCESS) ] = SLM_DMND_PREFETCH|SLM_LLC_ACCESS,
931 [ C(RESULT_MISS) ] = SLM_DMND_PREFETCH|SLM_LLC_MISS,
932 },
933 },
934};
935
936static __initconst const u64 slm_hw_cache_event_ids
937 [PERF_COUNT_HW_CACHE_MAX]
938 [PERF_COUNT_HW_CACHE_OP_MAX]
939 [PERF_COUNT_HW_CACHE_RESULT_MAX] =
940{
941 [ C(L1D) ] = {
942 [ C(OP_READ) ] = {
943 [ C(RESULT_ACCESS) ] = 0,
944 [ C(RESULT_MISS) ] = 0x0104, /* LD_DCU_MISS */
945 },
946 [ C(OP_WRITE) ] = {
947 [ C(RESULT_ACCESS) ] = 0,
948 [ C(RESULT_MISS) ] = 0,
949 },
950 [ C(OP_PREFETCH) ] = {
951 [ C(RESULT_ACCESS) ] = 0,
952 [ C(RESULT_MISS) ] = 0,
953 },
954 },
955 [ C(L1I ) ] = {
956 [ C(OP_READ) ] = {
957 [ C(RESULT_ACCESS) ] = 0x0380, /* ICACHE.ACCESSES */
958 [ C(RESULT_MISS) ] = 0x0280, /* ICACGE.MISSES */
959 },
960 [ C(OP_WRITE) ] = {
961 [ C(RESULT_ACCESS) ] = -1,
962 [ C(RESULT_MISS) ] = -1,
963 },
964 [ C(OP_PREFETCH) ] = {
965 [ C(RESULT_ACCESS) ] = 0,
966 [ C(RESULT_MISS) ] = 0,
967 },
968 },
969 [ C(LL ) ] = {
970 [ C(OP_READ) ] = {
971 /* OFFCORE_RESPONSE.ANY_DATA.LOCAL_CACHE */
972 [ C(RESULT_ACCESS) ] = 0x01b7,
973 /* OFFCORE_RESPONSE.ANY_DATA.ANY_LLC_MISS */
974 [ C(RESULT_MISS) ] = 0x01b7,
975 },
976 [ C(OP_WRITE) ] = {
977 /* OFFCORE_RESPONSE.ANY_RFO.LOCAL_CACHE */
978 [ C(RESULT_ACCESS) ] = 0x01b7,
979 /* OFFCORE_RESPONSE.ANY_RFO.ANY_LLC_MISS */
980 [ C(RESULT_MISS) ] = 0x01b7,
981 },
982 [ C(OP_PREFETCH) ] = {
983 /* OFFCORE_RESPONSE.PREFETCH.LOCAL_CACHE */
984 [ C(RESULT_ACCESS) ] = 0x01b7,
985 /* OFFCORE_RESPONSE.PREFETCH.ANY_LLC_MISS */
986 [ C(RESULT_MISS) ] = 0x01b7,
987 },
988 },
989 [ C(DTLB) ] = {
990 [ C(OP_READ) ] = {
991 [ C(RESULT_ACCESS) ] = 0,
992 [ C(RESULT_MISS) ] = 0x0804, /* LD_DTLB_MISS */
993 },
994 [ C(OP_WRITE) ] = {
995 [ C(RESULT_ACCESS) ] = 0,
996 [ C(RESULT_MISS) ] = 0,
997 },
998 [ C(OP_PREFETCH) ] = {
999 [ C(RESULT_ACCESS) ] = 0,
1000 [ C(RESULT_MISS) ] = 0,
1001 },
1002 },
1003 [ C(ITLB) ] = {
1004 [ C(OP_READ) ] = {
1005 [ C(RESULT_ACCESS) ] = 0x00c0, /* INST_RETIRED.ANY_P */
1006 [ C(RESULT_MISS) ] = 0x0282, /* ITLB.MISSES */
1007 },
1008 [ C(OP_WRITE) ] = {
1009 [ C(RESULT_ACCESS) ] = -1,
1010 [ C(RESULT_MISS) ] = -1,
1011 },
1012 [ C(OP_PREFETCH) ] = {
1013 [ C(RESULT_ACCESS) ] = -1,
1014 [ C(RESULT_MISS) ] = -1,
1015 },
1016 },
1017 [ C(BPU ) ] = {
1018 [ C(OP_READ) ] = {
1019 [ C(RESULT_ACCESS) ] = 0x00c4, /* BR_INST_RETIRED.ANY */
1020 [ C(RESULT_MISS) ] = 0x00c5, /* BP_INST_RETIRED.MISPRED */
1021 },
1022 [ C(OP_WRITE) ] = {
1023 [ C(RESULT_ACCESS) ] = -1,
1024 [ C(RESULT_MISS) ] = -1,
1025 },
1026 [ C(OP_PREFETCH) ] = {
1027 [ C(RESULT_ACCESS) ] = -1,
1028 [ C(RESULT_MISS) ] = -1,
1029 },
1030 },
1031};
1032
885static inline bool intel_pmu_needs_lbr_smpl(struct perf_event *event) 1033static inline bool intel_pmu_needs_lbr_smpl(struct perf_event *event)
886{ 1034{
887 /* user explicitly requested branch sampling */ 1035 /* user explicitly requested branch sampling */
@@ -1301,11 +1449,11 @@ static void intel_fixup_er(struct perf_event *event, int idx)
1301 1449
1302 if (idx == EXTRA_REG_RSP_0) { 1450 if (idx == EXTRA_REG_RSP_0) {
1303 event->hw.config &= ~INTEL_ARCH_EVENT_MASK; 1451 event->hw.config &= ~INTEL_ARCH_EVENT_MASK;
1304 event->hw.config |= 0x01b7; 1452 event->hw.config |= x86_pmu.extra_regs[EXTRA_REG_RSP_0].event;
1305 event->hw.extra_reg.reg = MSR_OFFCORE_RSP_0; 1453 event->hw.extra_reg.reg = MSR_OFFCORE_RSP_0;
1306 } else if (idx == EXTRA_REG_RSP_1) { 1454 } else if (idx == EXTRA_REG_RSP_1) {
1307 event->hw.config &= ~INTEL_ARCH_EVENT_MASK; 1455 event->hw.config &= ~INTEL_ARCH_EVENT_MASK;
1308 event->hw.config |= 0x01bb; 1456 event->hw.config |= x86_pmu.extra_regs[EXTRA_REG_RSP_1].event;
1309 event->hw.extra_reg.reg = MSR_OFFCORE_RSP_1; 1457 event->hw.extra_reg.reg = MSR_OFFCORE_RSP_1;
1310 } 1458 }
1311} 1459}
@@ -2176,6 +2324,22 @@ __init int intel_pmu_init(void)
2176 pr_cont("Atom events, "); 2324 pr_cont("Atom events, ");
2177 break; 2325 break;
2178 2326
2327 case 55: /* Atom 22nm "Silvermont" */
2328 case 77: /* Avoton "Silvermont" */
2329 memcpy(hw_cache_event_ids, slm_hw_cache_event_ids,
2330 sizeof(hw_cache_event_ids));
2331 memcpy(hw_cache_extra_regs, slm_hw_cache_extra_regs,
2332 sizeof(hw_cache_extra_regs));
2333
2334 intel_pmu_lbr_init_atom();
2335
2336 x86_pmu.event_constraints = intel_slm_event_constraints;
2337 x86_pmu.pebs_constraints = intel_slm_pebs_event_constraints;
2338 x86_pmu.extra_regs = intel_slm_extra_regs;
2339 x86_pmu.er_flags |= ERF_HAS_RSP_1;
2340 pr_cont("Silvermont events, ");
2341 break;
2342
2179 case 37: /* 32 nm nehalem, "Clarkdale" */ 2343 case 37: /* 32 nm nehalem, "Clarkdale" */
2180 case 44: /* 32 nm nehalem, "Gulftown" */ 2344 case 44: /* 32 nm nehalem, "Gulftown" */
2181 case 47: /* 32 nm Xeon E7 */ 2345 case 47: /* 32 nm Xeon E7 */
diff --git a/arch/x86/kernel/cpu/perf_event_intel_ds.c b/arch/x86/kernel/cpu/perf_event_intel_ds.c
index 3065c57a63c1..ab3ba1c1b7dd 100644
--- a/arch/x86/kernel/cpu/perf_event_intel_ds.c
+++ b/arch/x86/kernel/cpu/perf_event_intel_ds.c
@@ -224,7 +224,7 @@ static int alloc_pebs_buffer(int cpu)
224 if (!x86_pmu.pebs) 224 if (!x86_pmu.pebs)
225 return 0; 225 return 0;
226 226
227 buffer = kmalloc_node(PEBS_BUFFER_SIZE, GFP_KERNEL | __GFP_ZERO, node); 227 buffer = kzalloc_node(PEBS_BUFFER_SIZE, GFP_KERNEL, node);
228 if (unlikely(!buffer)) 228 if (unlikely(!buffer))
229 return -ENOMEM; 229 return -ENOMEM;
230 230
@@ -262,7 +262,7 @@ static int alloc_bts_buffer(int cpu)
262 if (!x86_pmu.bts) 262 if (!x86_pmu.bts)
263 return 0; 263 return 0;
264 264
265 buffer = kmalloc_node(BTS_BUFFER_SIZE, GFP_KERNEL | __GFP_ZERO, node); 265 buffer = kzalloc_node(BTS_BUFFER_SIZE, GFP_KERNEL, node);
266 if (unlikely(!buffer)) 266 if (unlikely(!buffer))
267 return -ENOMEM; 267 return -ENOMEM;
268 268
@@ -295,7 +295,7 @@ static int alloc_ds_buffer(int cpu)
295 int node = cpu_to_node(cpu); 295 int node = cpu_to_node(cpu);
296 struct debug_store *ds; 296 struct debug_store *ds;
297 297
298 ds = kmalloc_node(sizeof(*ds), GFP_KERNEL | __GFP_ZERO, node); 298 ds = kzalloc_node(sizeof(*ds), GFP_KERNEL, node);
299 if (unlikely(!ds)) 299 if (unlikely(!ds))
300 return -ENOMEM; 300 return -ENOMEM;
301 301
@@ -517,6 +517,32 @@ struct event_constraint intel_atom_pebs_event_constraints[] = {
517 EVENT_CONSTRAINT_END 517 EVENT_CONSTRAINT_END
518}; 518};
519 519
520struct event_constraint intel_slm_pebs_event_constraints[] = {
521 INTEL_UEVENT_CONSTRAINT(0x0103, 0x1), /* REHABQ.LD_BLOCK_ST_FORWARD_PS */
522 INTEL_UEVENT_CONSTRAINT(0x0803, 0x1), /* REHABQ.LD_SPLITS_PS */
523 INTEL_UEVENT_CONSTRAINT(0x0204, 0x1), /* MEM_UOPS_RETIRED.L2_HIT_LOADS_PS */
524 INTEL_UEVENT_CONSTRAINT(0x0404, 0x1), /* MEM_UOPS_RETIRED.L2_MISS_LOADS_PS */
525 INTEL_UEVENT_CONSTRAINT(0x0804, 0x1), /* MEM_UOPS_RETIRED.DTLB_MISS_LOADS_PS */
526 INTEL_UEVENT_CONSTRAINT(0x2004, 0x1), /* MEM_UOPS_RETIRED.HITM_PS */
527 INTEL_UEVENT_CONSTRAINT(0x00c0, 0x1), /* INST_RETIRED.ANY_PS */
528 INTEL_UEVENT_CONSTRAINT(0x00c4, 0x1), /* BR_INST_RETIRED.ALL_BRANCHES_PS */
529 INTEL_UEVENT_CONSTRAINT(0x7ec4, 0x1), /* BR_INST_RETIRED.JCC_PS */
530 INTEL_UEVENT_CONSTRAINT(0xbfc4, 0x1), /* BR_INST_RETIRED.FAR_BRANCH_PS */
531 INTEL_UEVENT_CONSTRAINT(0xebc4, 0x1), /* BR_INST_RETIRED.NON_RETURN_IND_PS */
532 INTEL_UEVENT_CONSTRAINT(0xf7c4, 0x1), /* BR_INST_RETIRED.RETURN_PS */
533 INTEL_UEVENT_CONSTRAINT(0xf9c4, 0x1), /* BR_INST_RETIRED.CALL_PS */
534 INTEL_UEVENT_CONSTRAINT(0xfbc4, 0x1), /* BR_INST_RETIRED.IND_CALL_PS */
535 INTEL_UEVENT_CONSTRAINT(0xfdc4, 0x1), /* BR_INST_RETIRED.REL_CALL_PS */
536 INTEL_UEVENT_CONSTRAINT(0xfec4, 0x1), /* BR_INST_RETIRED.TAKEN_JCC_PS */
537 INTEL_UEVENT_CONSTRAINT(0x00c5, 0x1), /* BR_INST_MISP_RETIRED.ALL_BRANCHES_PS */
538 INTEL_UEVENT_CONSTRAINT(0x7ec5, 0x1), /* BR_INST_MISP_RETIRED.JCC_PS */
539 INTEL_UEVENT_CONSTRAINT(0xebc5, 0x1), /* BR_INST_MISP_RETIRED.NON_RETURN_IND_PS */
540 INTEL_UEVENT_CONSTRAINT(0xf7c5, 0x1), /* BR_INST_MISP_RETIRED.RETURN_PS */
541 INTEL_UEVENT_CONSTRAINT(0xfbc5, 0x1), /* BR_INST_MISP_RETIRED.IND_CALL_PS */
542 INTEL_UEVENT_CONSTRAINT(0xfec5, 0x1), /* BR_INST_MISP_RETIRED.TAKEN_JCC_PS */
543 EVENT_CONSTRAINT_END
544};
545
520struct event_constraint intel_nehalem_pebs_event_constraints[] = { 546struct event_constraint intel_nehalem_pebs_event_constraints[] = {
521 INTEL_PLD_CONSTRAINT(0x100b, 0xf), /* MEM_INST_RETIRED.* */ 547 INTEL_PLD_CONSTRAINT(0x100b, 0xf), /* MEM_INST_RETIRED.* */
522 INTEL_EVENT_CONSTRAINT(0x0f, 0xf), /* MEM_UNCORE_RETIRED.* */ 548 INTEL_EVENT_CONSTRAINT(0x0f, 0xf), /* MEM_UNCORE_RETIRED.* */
@@ -558,6 +584,7 @@ struct event_constraint intel_snb_pebs_event_constraints[] = {
558 INTEL_EVENT_CONSTRAINT(0xd0, 0xf), /* MEM_UOP_RETIRED.* */ 584 INTEL_EVENT_CONSTRAINT(0xd0, 0xf), /* MEM_UOP_RETIRED.* */
559 INTEL_EVENT_CONSTRAINT(0xd1, 0xf), /* MEM_LOAD_UOPS_RETIRED.* */ 585 INTEL_EVENT_CONSTRAINT(0xd1, 0xf), /* MEM_LOAD_UOPS_RETIRED.* */
560 INTEL_EVENT_CONSTRAINT(0xd2, 0xf), /* MEM_LOAD_UOPS_LLC_HIT_RETIRED.* */ 586 INTEL_EVENT_CONSTRAINT(0xd2, 0xf), /* MEM_LOAD_UOPS_LLC_HIT_RETIRED.* */
587 INTEL_EVENT_CONSTRAINT(0xd3, 0xf), /* MEM_LOAD_UOPS_LLC_MISS_RETIRED.* */
561 INTEL_UEVENT_CONSTRAINT(0x02d4, 0xf), /* MEM_LOAD_UOPS_MISC_RETIRED.LLC_MISS */ 588 INTEL_UEVENT_CONSTRAINT(0x02d4, 0xf), /* MEM_LOAD_UOPS_MISC_RETIRED.LLC_MISS */
562 EVENT_CONSTRAINT_END 589 EVENT_CONSTRAINT_END
563}; 590};
diff --git a/arch/x86/kernel/cpu/perf_event_intel_uncore.c b/arch/x86/kernel/cpu/perf_event_intel_uncore.c
index 1fb6c72717bd..4118f9f68315 100644
--- a/arch/x86/kernel/cpu/perf_event_intel_uncore.c
+++ b/arch/x86/kernel/cpu/perf_event_intel_uncore.c
@@ -6,6 +6,8 @@ static struct intel_uncore_type **pci_uncores = empty_uncore;
6/* pci bus to socket mapping */ 6/* pci bus to socket mapping */
7static int pcibus_to_physid[256] = { [0 ... 255] = -1, }; 7static int pcibus_to_physid[256] = { [0 ... 255] = -1, };
8 8
9static struct pci_dev *extra_pci_dev[UNCORE_SOCKET_MAX][UNCORE_EXTRA_PCI_DEV_MAX];
10
9static DEFINE_RAW_SPINLOCK(uncore_box_lock); 11static DEFINE_RAW_SPINLOCK(uncore_box_lock);
10 12
11/* mask of cpus that collect uncore events */ 13/* mask of cpus that collect uncore events */
@@ -45,6 +47,24 @@ DEFINE_UNCORE_FORMAT_ATTR(filter_band0, filter_band0, "config1:0-7");
45DEFINE_UNCORE_FORMAT_ATTR(filter_band1, filter_band1, "config1:8-15"); 47DEFINE_UNCORE_FORMAT_ATTR(filter_band1, filter_band1, "config1:8-15");
46DEFINE_UNCORE_FORMAT_ATTR(filter_band2, filter_band2, "config1:16-23"); 48DEFINE_UNCORE_FORMAT_ATTR(filter_band2, filter_band2, "config1:16-23");
47DEFINE_UNCORE_FORMAT_ATTR(filter_band3, filter_band3, "config1:24-31"); 49DEFINE_UNCORE_FORMAT_ATTR(filter_band3, filter_band3, "config1:24-31");
50DEFINE_UNCORE_FORMAT_ATTR(match_rds, match_rds, "config1:48-51");
51DEFINE_UNCORE_FORMAT_ATTR(match_rnid30, match_rnid30, "config1:32-35");
52DEFINE_UNCORE_FORMAT_ATTR(match_rnid4, match_rnid4, "config1:31");
53DEFINE_UNCORE_FORMAT_ATTR(match_dnid, match_dnid, "config1:13-17");
54DEFINE_UNCORE_FORMAT_ATTR(match_mc, match_mc, "config1:9-12");
55DEFINE_UNCORE_FORMAT_ATTR(match_opc, match_opc, "config1:5-8");
56DEFINE_UNCORE_FORMAT_ATTR(match_vnw, match_vnw, "config1:3-4");
57DEFINE_UNCORE_FORMAT_ATTR(match0, match0, "config1:0-31");
58DEFINE_UNCORE_FORMAT_ATTR(match1, match1, "config1:32-63");
59DEFINE_UNCORE_FORMAT_ATTR(mask_rds, mask_rds, "config2:48-51");
60DEFINE_UNCORE_FORMAT_ATTR(mask_rnid30, mask_rnid30, "config2:32-35");
61DEFINE_UNCORE_FORMAT_ATTR(mask_rnid4, mask_rnid4, "config2:31");
62DEFINE_UNCORE_FORMAT_ATTR(mask_dnid, mask_dnid, "config2:13-17");
63DEFINE_UNCORE_FORMAT_ATTR(mask_mc, mask_mc, "config2:9-12");
64DEFINE_UNCORE_FORMAT_ATTR(mask_opc, mask_opc, "config2:5-8");
65DEFINE_UNCORE_FORMAT_ATTR(mask_vnw, mask_vnw, "config2:3-4");
66DEFINE_UNCORE_FORMAT_ATTR(mask0, mask0, "config2:0-31");
67DEFINE_UNCORE_FORMAT_ATTR(mask1, mask1, "config2:32-63");
48 68
49static u64 uncore_msr_read_counter(struct intel_uncore_box *box, struct perf_event *event) 69static u64 uncore_msr_read_counter(struct intel_uncore_box *box, struct perf_event *event)
50{ 70{
@@ -281,7 +301,7 @@ static struct attribute *snbep_uncore_cbox_formats_attr[] = {
281}; 301};
282 302
283static struct attribute *snbep_uncore_pcu_formats_attr[] = { 303static struct attribute *snbep_uncore_pcu_formats_attr[] = {
284 &format_attr_event.attr, 304 &format_attr_event_ext.attr,
285 &format_attr_occ_sel.attr, 305 &format_attr_occ_sel.attr,
286 &format_attr_edge.attr, 306 &format_attr_edge.attr,
287 &format_attr_inv.attr, 307 &format_attr_inv.attr,
@@ -301,6 +321,24 @@ static struct attribute *snbep_uncore_qpi_formats_attr[] = {
301 &format_attr_edge.attr, 321 &format_attr_edge.attr,
302 &format_attr_inv.attr, 322 &format_attr_inv.attr,
303 &format_attr_thresh8.attr, 323 &format_attr_thresh8.attr,
324 &format_attr_match_rds.attr,
325 &format_attr_match_rnid30.attr,
326 &format_attr_match_rnid4.attr,
327 &format_attr_match_dnid.attr,
328 &format_attr_match_mc.attr,
329 &format_attr_match_opc.attr,
330 &format_attr_match_vnw.attr,
331 &format_attr_match0.attr,
332 &format_attr_match1.attr,
333 &format_attr_mask_rds.attr,
334 &format_attr_mask_rnid30.attr,
335 &format_attr_mask_rnid4.attr,
336 &format_attr_mask_dnid.attr,
337 &format_attr_mask_mc.attr,
338 &format_attr_mask_opc.attr,
339 &format_attr_mask_vnw.attr,
340 &format_attr_mask0.attr,
341 &format_attr_mask1.attr,
304 NULL, 342 NULL,
305}; 343};
306 344
@@ -356,13 +394,16 @@ static struct intel_uncore_ops snbep_uncore_msr_ops = {
356 SNBEP_UNCORE_MSR_OPS_COMMON_INIT(), 394 SNBEP_UNCORE_MSR_OPS_COMMON_INIT(),
357}; 395};
358 396
397#define SNBEP_UNCORE_PCI_OPS_COMMON_INIT() \
398 .init_box = snbep_uncore_pci_init_box, \
399 .disable_box = snbep_uncore_pci_disable_box, \
400 .enable_box = snbep_uncore_pci_enable_box, \
401 .disable_event = snbep_uncore_pci_disable_event, \
402 .read_counter = snbep_uncore_pci_read_counter
403
359static struct intel_uncore_ops snbep_uncore_pci_ops = { 404static struct intel_uncore_ops snbep_uncore_pci_ops = {
360 .init_box = snbep_uncore_pci_init_box, 405 SNBEP_UNCORE_PCI_OPS_COMMON_INIT(),
361 .disable_box = snbep_uncore_pci_disable_box, 406 .enable_event = snbep_uncore_pci_enable_event, \
362 .enable_box = snbep_uncore_pci_enable_box,
363 .disable_event = snbep_uncore_pci_disable_event,
364 .enable_event = snbep_uncore_pci_enable_event,
365 .read_counter = snbep_uncore_pci_read_counter,
366}; 407};
367 408
368static struct event_constraint snbep_uncore_cbox_constraints[] = { 409static struct event_constraint snbep_uncore_cbox_constraints[] = {
@@ -726,6 +767,61 @@ static struct intel_uncore_type *snbep_msr_uncores[] = {
726 NULL, 767 NULL,
727}; 768};
728 769
770enum {
771 SNBEP_PCI_QPI_PORT0_FILTER,
772 SNBEP_PCI_QPI_PORT1_FILTER,
773};
774
775static int snbep_qpi_hw_config(struct intel_uncore_box *box, struct perf_event *event)
776{
777 struct hw_perf_event *hwc = &event->hw;
778 struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
779 struct hw_perf_event_extra *reg2 = &hwc->branch_reg;
780
781 if ((hwc->config & SNBEP_PMON_CTL_EV_SEL_MASK) == 0x38) {
782 reg1->idx = 0;
783 reg1->reg = SNBEP_Q_Py_PCI_PMON_PKT_MATCH0;
784 reg1->config = event->attr.config1;
785 reg2->reg = SNBEP_Q_Py_PCI_PMON_PKT_MASK0;
786 reg2->config = event->attr.config2;
787 }
788 return 0;
789}
790
791static void snbep_qpi_enable_event(struct intel_uncore_box *box, struct perf_event *event)
792{
793 struct pci_dev *pdev = box->pci_dev;
794 struct hw_perf_event *hwc = &event->hw;
795 struct hw_perf_event_extra *reg1 = &hwc->extra_reg;
796 struct hw_perf_event_extra *reg2 = &hwc->branch_reg;
797
798 if (reg1->idx != EXTRA_REG_NONE) {
799 int idx = box->pmu->pmu_idx + SNBEP_PCI_QPI_PORT0_FILTER;
800 struct pci_dev *filter_pdev = extra_pci_dev[box->phys_id][idx];
801 WARN_ON_ONCE(!filter_pdev);
802 if (filter_pdev) {
803 pci_write_config_dword(filter_pdev, reg1->reg,
804 (u32)reg1->config);
805 pci_write_config_dword(filter_pdev, reg1->reg + 4,
806 (u32)(reg1->config >> 32));
807 pci_write_config_dword(filter_pdev, reg2->reg,
808 (u32)reg2->config);
809 pci_write_config_dword(filter_pdev, reg2->reg + 4,
810 (u32)(reg2->config >> 32));
811 }
812 }
813
814 pci_write_config_dword(pdev, hwc->config_base, hwc->config | SNBEP_PMON_CTL_EN);
815}
816
817static struct intel_uncore_ops snbep_uncore_qpi_ops = {
818 SNBEP_UNCORE_PCI_OPS_COMMON_INIT(),
819 .enable_event = snbep_qpi_enable_event,
820 .hw_config = snbep_qpi_hw_config,
821 .get_constraint = uncore_get_constraint,
822 .put_constraint = uncore_put_constraint,
823};
824
729#define SNBEP_UNCORE_PCI_COMMON_INIT() \ 825#define SNBEP_UNCORE_PCI_COMMON_INIT() \
730 .perf_ctr = SNBEP_PCI_PMON_CTR0, \ 826 .perf_ctr = SNBEP_PCI_PMON_CTR0, \
731 .event_ctl = SNBEP_PCI_PMON_CTL0, \ 827 .event_ctl = SNBEP_PCI_PMON_CTL0, \
@@ -755,17 +851,18 @@ static struct intel_uncore_type snbep_uncore_imc = {
755}; 851};
756 852
757static struct intel_uncore_type snbep_uncore_qpi = { 853static struct intel_uncore_type snbep_uncore_qpi = {
758 .name = "qpi", 854 .name = "qpi",
759 .num_counters = 4, 855 .num_counters = 4,
760 .num_boxes = 2, 856 .num_boxes = 2,
761 .perf_ctr_bits = 48, 857 .perf_ctr_bits = 48,
762 .perf_ctr = SNBEP_PCI_PMON_CTR0, 858 .perf_ctr = SNBEP_PCI_PMON_CTR0,
763 .event_ctl = SNBEP_PCI_PMON_CTL0, 859 .event_ctl = SNBEP_PCI_PMON_CTL0,
764 .event_mask = SNBEP_QPI_PCI_PMON_RAW_EVENT_MASK, 860 .event_mask = SNBEP_QPI_PCI_PMON_RAW_EVENT_MASK,
765 .box_ctl = SNBEP_PCI_PMON_BOX_CTL, 861 .box_ctl = SNBEP_PCI_PMON_BOX_CTL,
766 .ops = &snbep_uncore_pci_ops, 862 .num_shared_regs = 1,
767 .event_descs = snbep_uncore_qpi_events, 863 .ops = &snbep_uncore_qpi_ops,
768 .format_group = &snbep_uncore_qpi_format_group, 864 .event_descs = snbep_uncore_qpi_events,
865 .format_group = &snbep_uncore_qpi_format_group,
769}; 866};
770 867
771 868
@@ -807,43 +904,53 @@ static struct intel_uncore_type *snbep_pci_uncores[] = {
807static DEFINE_PCI_DEVICE_TABLE(snbep_uncore_pci_ids) = { 904static DEFINE_PCI_DEVICE_TABLE(snbep_uncore_pci_ids) = {
808 { /* Home Agent */ 905 { /* Home Agent */
809 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_HA), 906 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_HA),
810 .driver_data = SNBEP_PCI_UNCORE_HA, 907 .driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_HA, 0),
811 }, 908 },
812 { /* MC Channel 0 */ 909 { /* MC Channel 0 */
813 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_IMC0), 910 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_IMC0),
814 .driver_data = SNBEP_PCI_UNCORE_IMC, 911 .driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_IMC, 0),
815 }, 912 },
816 { /* MC Channel 1 */ 913 { /* MC Channel 1 */
817 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_IMC1), 914 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_IMC1),
818 .driver_data = SNBEP_PCI_UNCORE_IMC, 915 .driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_IMC, 1),
819 }, 916 },
820 { /* MC Channel 2 */ 917 { /* MC Channel 2 */
821 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_IMC2), 918 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_IMC2),
822 .driver_data = SNBEP_PCI_UNCORE_IMC, 919 .driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_IMC, 2),
823 }, 920 },
824 { /* MC Channel 3 */ 921 { /* MC Channel 3 */
825 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_IMC3), 922 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_IMC3),
826 .driver_data = SNBEP_PCI_UNCORE_IMC, 923 .driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_IMC, 3),
827 }, 924 },
828 { /* QPI Port 0 */ 925 { /* QPI Port 0 */
829 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_QPI0), 926 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_QPI0),
830 .driver_data = SNBEP_PCI_UNCORE_QPI, 927 .driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_QPI, 0),
831 }, 928 },
832 { /* QPI Port 1 */ 929 { /* QPI Port 1 */
833 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_QPI1), 930 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_QPI1),
834 .driver_data = SNBEP_PCI_UNCORE_QPI, 931 .driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_QPI, 1),
835 }, 932 },
836 { /* R2PCIe */ 933 { /* R2PCIe */
837 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_R2PCIE), 934 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_R2PCIE),
838 .driver_data = SNBEP_PCI_UNCORE_R2PCIE, 935 .driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_R2PCIE, 0),
839 }, 936 },
840 { /* R3QPI Link 0 */ 937 { /* R3QPI Link 0 */
841 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_R3QPI0), 938 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_R3QPI0),
842 .driver_data = SNBEP_PCI_UNCORE_R3QPI, 939 .driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_R3QPI, 0),
843 }, 940 },
844 { /* R3QPI Link 1 */ 941 { /* R3QPI Link 1 */
845 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_R3QPI1), 942 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_UNC_R3QPI1),
846 .driver_data = SNBEP_PCI_UNCORE_R3QPI, 943 .driver_data = UNCORE_PCI_DEV_DATA(SNBEP_PCI_UNCORE_R3QPI, 1),
944 },
945 { /* QPI Port 0 filter */
946 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3c86),
947 .driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV,
948 SNBEP_PCI_QPI_PORT0_FILTER),
949 },
950 { /* QPI Port 0 filter */
951 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3c96),
952 .driver_data = UNCORE_PCI_DEV_DATA(UNCORE_EXTRA_PCI_DEV,
953 SNBEP_PCI_QPI_PORT1_FILTER),
847 }, 954 },
848 { /* end: all zeroes */ } 955 { /* end: all zeroes */ }
849}; 956};
@@ -1256,71 +1363,71 @@ static struct intel_uncore_type *ivt_pci_uncores[] = {
1256static DEFINE_PCI_DEVICE_TABLE(ivt_uncore_pci_ids) = { 1363static DEFINE_PCI_DEVICE_TABLE(ivt_uncore_pci_ids) = {
1257 { /* Home Agent 0 */ 1364 { /* Home Agent 0 */
1258 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe30), 1365 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe30),
1259 .driver_data = IVT_PCI_UNCORE_HA, 1366 .driver_data = UNCORE_PCI_DEV_DATA(IVT_PCI_UNCORE_HA, 0),
1260 }, 1367 },
1261 { /* Home Agent 1 */ 1368 { /* Home Agent 1 */
1262 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe38), 1369 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe38),
1263 .driver_data = IVT_PCI_UNCORE_HA, 1370 .driver_data = UNCORE_PCI_DEV_DATA(IVT_PCI_UNCORE_HA, 1),
1264 }, 1371 },
1265 { /* MC0 Channel 0 */ 1372 { /* MC0 Channel 0 */
1266 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xeb4), 1373 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xeb4),
1267 .driver_data = IVT_PCI_UNCORE_IMC, 1374 .driver_data = UNCORE_PCI_DEV_DATA(IVT_PCI_UNCORE_IMC, 0),
1268 }, 1375 },
1269 { /* MC0 Channel 1 */ 1376 { /* MC0 Channel 1 */
1270 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xeb5), 1377 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xeb5),
1271 .driver_data = IVT_PCI_UNCORE_IMC, 1378 .driver_data = UNCORE_PCI_DEV_DATA(IVT_PCI_UNCORE_IMC, 1),
1272 }, 1379 },
1273 { /* MC0 Channel 3 */ 1380 { /* MC0 Channel 3 */
1274 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xeb0), 1381 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xeb0),
1275 .driver_data = IVT_PCI_UNCORE_IMC, 1382 .driver_data = UNCORE_PCI_DEV_DATA(IVT_PCI_UNCORE_IMC, 2),
1276 }, 1383 },
1277 { /* MC0 Channel 4 */ 1384 { /* MC0 Channel 4 */
1278 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xeb1), 1385 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xeb1),
1279 .driver_data = IVT_PCI_UNCORE_IMC, 1386 .driver_data = UNCORE_PCI_DEV_DATA(IVT_PCI_UNCORE_IMC, 3),
1280 }, 1387 },
1281 { /* MC1 Channel 0 */ 1388 { /* MC1 Channel 0 */
1282 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xef4), 1389 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xef4),
1283 .driver_data = IVT_PCI_UNCORE_IMC, 1390 .driver_data = UNCORE_PCI_DEV_DATA(IVT_PCI_UNCORE_IMC, 4),
1284 }, 1391 },
1285 { /* MC1 Channel 1 */ 1392 { /* MC1 Channel 1 */
1286 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xef5), 1393 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xef5),
1287 .driver_data = IVT_PCI_UNCORE_IMC, 1394 .driver_data = UNCORE_PCI_DEV_DATA(IVT_PCI_UNCORE_IMC, 5),
1288 }, 1395 },
1289 { /* MC1 Channel 3 */ 1396 { /* MC1 Channel 3 */
1290 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xef0), 1397 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xef0),
1291 .driver_data = IVT_PCI_UNCORE_IMC, 1398 .driver_data = UNCORE_PCI_DEV_DATA(IVT_PCI_UNCORE_IMC, 6),
1292 }, 1399 },
1293 { /* MC1 Channel 4 */ 1400 { /* MC1 Channel 4 */
1294 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xef1), 1401 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xef1),
1295 .driver_data = IVT_PCI_UNCORE_IMC, 1402 .driver_data = UNCORE_PCI_DEV_DATA(IVT_PCI_UNCORE_IMC, 7),
1296 }, 1403 },
1297 { /* QPI0 Port 0 */ 1404 { /* QPI0 Port 0 */
1298 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe32), 1405 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe32),
1299 .driver_data = IVT_PCI_UNCORE_QPI, 1406 .driver_data = UNCORE_PCI_DEV_DATA(IVT_PCI_UNCORE_QPI, 0),
1300 }, 1407 },
1301 { /* QPI0 Port 1 */ 1408 { /* QPI0 Port 1 */
1302 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe33), 1409 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe33),
1303 .driver_data = IVT_PCI_UNCORE_QPI, 1410 .driver_data = UNCORE_PCI_DEV_DATA(IVT_PCI_UNCORE_QPI, 1),
1304 }, 1411 },
1305 { /* QPI1 Port 2 */ 1412 { /* QPI1 Port 2 */
1306 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe3a), 1413 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe3a),
1307 .driver_data = IVT_PCI_UNCORE_QPI, 1414 .driver_data = UNCORE_PCI_DEV_DATA(IVT_PCI_UNCORE_QPI, 2),
1308 }, 1415 },
1309 { /* R2PCIe */ 1416 { /* R2PCIe */
1310 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe34), 1417 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe34),
1311 .driver_data = IVT_PCI_UNCORE_R2PCIE, 1418 .driver_data = UNCORE_PCI_DEV_DATA(IVT_PCI_UNCORE_R2PCIE, 0),
1312 }, 1419 },
1313 { /* R3QPI0 Link 0 */ 1420 { /* R3QPI0 Link 0 */
1314 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe36), 1421 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe36),
1315 .driver_data = IVT_PCI_UNCORE_R3QPI, 1422 .driver_data = UNCORE_PCI_DEV_DATA(IVT_PCI_UNCORE_R3QPI, 0),
1316 }, 1423 },
1317 { /* R3QPI0 Link 1 */ 1424 { /* R3QPI0 Link 1 */
1318 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe37), 1425 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe37),
1319 .driver_data = IVT_PCI_UNCORE_R3QPI, 1426 .driver_data = UNCORE_PCI_DEV_DATA(IVT_PCI_UNCORE_R3QPI, 1),
1320 }, 1427 },
1321 { /* R3QPI1 Link 2 */ 1428 { /* R3QPI1 Link 2 */
1322 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe3e), 1429 PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xe3e),
1323 .driver_data = IVT_PCI_UNCORE_R3QPI, 1430 .driver_data = UNCORE_PCI_DEV_DATA(IVT_PCI_UNCORE_R3QPI, 2),
1324 }, 1431 },
1325 { /* end: all zeroes */ } 1432 { /* end: all zeroes */ }
1326}; 1433};
@@ -2599,14 +2706,14 @@ static void uncore_pmu_init_hrtimer(struct intel_uncore_box *box)
2599 box->hrtimer.function = uncore_pmu_hrtimer; 2706 box->hrtimer.function = uncore_pmu_hrtimer;
2600} 2707}
2601 2708
2602struct intel_uncore_box *uncore_alloc_box(struct intel_uncore_type *type, int cpu) 2709static struct intel_uncore_box *uncore_alloc_box(struct intel_uncore_type *type, int node)
2603{ 2710{
2604 struct intel_uncore_box *box; 2711 struct intel_uncore_box *box;
2605 int i, size; 2712 int i, size;
2606 2713
2607 size = sizeof(*box) + type->num_shared_regs * sizeof(struct intel_uncore_extra_reg); 2714 size = sizeof(*box) + type->num_shared_regs * sizeof(struct intel_uncore_extra_reg);
2608 2715
2609 box = kmalloc_node(size, GFP_KERNEL | __GFP_ZERO, cpu_to_node(cpu)); 2716 box = kzalloc_node(size, GFP_KERNEL, node);
2610 if (!box) 2717 if (!box)
2611 return NULL; 2718 return NULL;
2612 2719
@@ -2701,7 +2808,7 @@ uncore_get_event_constraint(struct intel_uncore_box *box, struct perf_event *eve
2701 return c; 2808 return c;
2702 } 2809 }
2703 2810
2704 if (event->hw.config == ~0ULL) 2811 if (event->attr.config == UNCORE_FIXED_EVENT)
2705 return &constraint_fixed; 2812 return &constraint_fixed;
2706 2813
2707 if (type->constraints) { 2814 if (type->constraints) {
@@ -2924,7 +3031,7 @@ static int uncore_validate_group(struct intel_uncore_pmu *pmu,
2924 struct intel_uncore_box *fake_box; 3031 struct intel_uncore_box *fake_box;
2925 int ret = -EINVAL, n; 3032 int ret = -EINVAL, n;
2926 3033
2927 fake_box = uncore_alloc_box(pmu->type, smp_processor_id()); 3034 fake_box = uncore_alloc_box(pmu->type, NUMA_NO_NODE);
2928 if (!fake_box) 3035 if (!fake_box)
2929 return -ENOMEM; 3036 return -ENOMEM;
2930 3037
@@ -3005,7 +3112,9 @@ static int uncore_pmu_event_init(struct perf_event *event)
3005 */ 3112 */
3006 if (pmu->type->single_fixed && pmu->pmu_idx > 0) 3113 if (pmu->type->single_fixed && pmu->pmu_idx > 0)
3007 return -EINVAL; 3114 return -EINVAL;
3008 hwc->config = ~0ULL; 3115
3116 /* fixed counters have event field hardcoded to zero */
3117 hwc->config = 0ULL;
3009 } else { 3118 } else {
3010 hwc->config = event->attr.config & pmu->type->event_mask; 3119 hwc->config = event->attr.config & pmu->type->event_mask;
3011 if (pmu->type->ops->hw_config) { 3120 if (pmu->type->ops->hw_config) {
@@ -3167,17 +3276,25 @@ static bool pcidrv_registered;
3167/* 3276/*
3168 * add a pci uncore device 3277 * add a pci uncore device
3169 */ 3278 */
3170static int uncore_pci_add(struct intel_uncore_type *type, struct pci_dev *pdev) 3279static int uncore_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
3171{ 3280{
3172 struct intel_uncore_pmu *pmu; 3281 struct intel_uncore_pmu *pmu;
3173 struct intel_uncore_box *box; 3282 struct intel_uncore_box *box;
3174 int i, phys_id; 3283 struct intel_uncore_type *type;
3284 int phys_id;
3175 3285
3176 phys_id = pcibus_to_physid[pdev->bus->number]; 3286 phys_id = pcibus_to_physid[pdev->bus->number];
3177 if (phys_id < 0) 3287 if (phys_id < 0)
3178 return -ENODEV; 3288 return -ENODEV;
3179 3289
3180 box = uncore_alloc_box(type, 0); 3290 if (UNCORE_PCI_DEV_TYPE(id->driver_data) == UNCORE_EXTRA_PCI_DEV) {
3291 extra_pci_dev[phys_id][UNCORE_PCI_DEV_IDX(id->driver_data)] = pdev;
3292 pci_set_drvdata(pdev, NULL);
3293 return 0;
3294 }
3295
3296 type = pci_uncores[UNCORE_PCI_DEV_TYPE(id->driver_data)];
3297 box = uncore_alloc_box(type, NUMA_NO_NODE);
3181 if (!box) 3298 if (!box)
3182 return -ENOMEM; 3299 return -ENOMEM;
3183 3300
@@ -3185,21 +3302,11 @@ static int uncore_pci_add(struct intel_uncore_type *type, struct pci_dev *pdev)
3185 * for performance monitoring unit with multiple boxes, 3302 * for performance monitoring unit with multiple boxes,
3186 * each box has a different function id. 3303 * each box has a different function id.
3187 */ 3304 */
3188 for (i = 0; i < type->num_boxes; i++) { 3305 pmu = &type->pmus[UNCORE_PCI_DEV_IDX(id->driver_data)];
3189 pmu = &type->pmus[i]; 3306 if (pmu->func_id < 0)
3190 if (pmu->func_id == pdev->devfn) 3307 pmu->func_id = pdev->devfn;
3191 break; 3308 else
3192 if (pmu->func_id < 0) { 3309 WARN_ON_ONCE(pmu->func_id != pdev->devfn);
3193 pmu->func_id = pdev->devfn;
3194 break;
3195 }
3196 pmu = NULL;
3197 }
3198
3199 if (!pmu) {
3200 kfree(box);
3201 return -EINVAL;
3202 }
3203 3310
3204 box->phys_id = phys_id; 3311 box->phys_id = phys_id;
3205 box->pci_dev = pdev; 3312 box->pci_dev = pdev;
@@ -3217,9 +3324,22 @@ static int uncore_pci_add(struct intel_uncore_type *type, struct pci_dev *pdev)
3217static void uncore_pci_remove(struct pci_dev *pdev) 3324static void uncore_pci_remove(struct pci_dev *pdev)
3218{ 3325{
3219 struct intel_uncore_box *box = pci_get_drvdata(pdev); 3326 struct intel_uncore_box *box = pci_get_drvdata(pdev);
3220 struct intel_uncore_pmu *pmu = box->pmu; 3327 struct intel_uncore_pmu *pmu;
3221 int cpu, phys_id = pcibus_to_physid[pdev->bus->number]; 3328 int i, cpu, phys_id = pcibus_to_physid[pdev->bus->number];
3329
3330 box = pci_get_drvdata(pdev);
3331 if (!box) {
3332 for (i = 0; i < UNCORE_EXTRA_PCI_DEV_MAX; i++) {
3333 if (extra_pci_dev[phys_id][i] == pdev) {
3334 extra_pci_dev[phys_id][i] = NULL;
3335 break;
3336 }
3337 }
3338 WARN_ON_ONCE(i >= UNCORE_EXTRA_PCI_DEV_MAX);
3339 return;
3340 }
3222 3341
3342 pmu = box->pmu;
3223 if (WARN_ON_ONCE(phys_id != box->phys_id)) 3343 if (WARN_ON_ONCE(phys_id != box->phys_id))
3224 return; 3344 return;
3225 3345
@@ -3240,12 +3360,6 @@ static void uncore_pci_remove(struct pci_dev *pdev)
3240 kfree(box); 3360 kfree(box);
3241} 3361}
3242 3362
3243static int uncore_pci_probe(struct pci_dev *pdev,
3244 const struct pci_device_id *id)
3245{
3246 return uncore_pci_add(pci_uncores[id->driver_data], pdev);
3247}
3248
3249static int __init uncore_pci_init(void) 3363static int __init uncore_pci_init(void)
3250{ 3364{
3251 int ret; 3365 int ret;
@@ -3385,7 +3499,7 @@ static int uncore_cpu_prepare(int cpu, int phys_id)
3385 if (pmu->func_id < 0) 3499 if (pmu->func_id < 0)
3386 pmu->func_id = j; 3500 pmu->func_id = j;
3387 3501
3388 box = uncore_alloc_box(type, cpu); 3502 box = uncore_alloc_box(type, cpu_to_node(cpu));
3389 if (!box) 3503 if (!box)
3390 return -ENOMEM; 3504 return -ENOMEM;
3391 3505
diff --git a/arch/x86/kernel/cpu/perf_event_intel_uncore.h b/arch/x86/kernel/cpu/perf_event_intel_uncore.h
index 47b3d00c9d89..a80ab71a883d 100644
--- a/arch/x86/kernel/cpu/perf_event_intel_uncore.h
+++ b/arch/x86/kernel/cpu/perf_event_intel_uncore.h
@@ -12,6 +12,15 @@
12#define UNCORE_PMC_IDX_FIXED UNCORE_PMC_IDX_MAX_GENERIC 12#define UNCORE_PMC_IDX_FIXED UNCORE_PMC_IDX_MAX_GENERIC
13#define UNCORE_PMC_IDX_MAX (UNCORE_PMC_IDX_FIXED + 1) 13#define UNCORE_PMC_IDX_MAX (UNCORE_PMC_IDX_FIXED + 1)
14 14
15#define UNCORE_PCI_DEV_DATA(type, idx) ((type << 8) | idx)
16#define UNCORE_PCI_DEV_TYPE(data) ((data >> 8) & 0xff)
17#define UNCORE_PCI_DEV_IDX(data) (data & 0xff)
18#define UNCORE_EXTRA_PCI_DEV 0xff
19#define UNCORE_EXTRA_PCI_DEV_MAX 2
20
21/* support up to 8 sockets */
22#define UNCORE_SOCKET_MAX 8
23
15#define UNCORE_EVENT_CONSTRAINT(c, n) EVENT_CONSTRAINT(c, n, 0xff) 24#define UNCORE_EVENT_CONSTRAINT(c, n) EVENT_CONSTRAINT(c, n, 0xff)
16 25
17/* SNB event control */ 26/* SNB event control */
@@ -108,6 +117,7 @@
108 (SNBEP_PMON_CTL_EV_SEL_MASK | \ 117 (SNBEP_PMON_CTL_EV_SEL_MASK | \
109 SNBEP_PCU_MSR_PMON_CTL_OCC_SEL_MASK | \ 118 SNBEP_PCU_MSR_PMON_CTL_OCC_SEL_MASK | \
110 SNBEP_PMON_CTL_EDGE_DET | \ 119 SNBEP_PMON_CTL_EDGE_DET | \
120 SNBEP_PMON_CTL_EV_SEL_EXT | \
111 SNBEP_PMON_CTL_INVERT | \ 121 SNBEP_PMON_CTL_INVERT | \
112 SNBEP_PCU_MSR_PMON_CTL_TRESH_MASK | \ 122 SNBEP_PCU_MSR_PMON_CTL_TRESH_MASK | \
113 SNBEP_PCU_MSR_PMON_CTL_OCC_INVERT | \ 123 SNBEP_PCU_MSR_PMON_CTL_OCC_INVERT | \
diff --git a/arch/x86/kernel/cpu/vmware.c b/arch/x86/kernel/cpu/vmware.c
index 7076878404ec..628a059a9a06 100644
--- a/arch/x86/kernel/cpu/vmware.c
+++ b/arch/x86/kernel/cpu/vmware.c
@@ -93,7 +93,7 @@ static void __init vmware_platform_setup(void)
93 * serial key should be enough, as this will always have a VMware 93 * serial key should be enough, as this will always have a VMware
94 * specific string when running under VMware hypervisor. 94 * specific string when running under VMware hypervisor.
95 */ 95 */
96static bool __init vmware_platform(void) 96static uint32_t __init vmware_platform(void)
97{ 97{
98 if (cpu_has_hypervisor) { 98 if (cpu_has_hypervisor) {
99 unsigned int eax; 99 unsigned int eax;
@@ -102,12 +102,12 @@ static bool __init vmware_platform(void)
102 cpuid(CPUID_VMWARE_INFO_LEAF, &eax, &hyper_vendor_id[0], 102 cpuid(CPUID_VMWARE_INFO_LEAF, &eax, &hyper_vendor_id[0],
103 &hyper_vendor_id[1], &hyper_vendor_id[2]); 103 &hyper_vendor_id[1], &hyper_vendor_id[2]);
104 if (!memcmp(hyper_vendor_id, "VMwareVMware", 12)) 104 if (!memcmp(hyper_vendor_id, "VMwareVMware", 12))
105 return true; 105 return CPUID_VMWARE_INFO_LEAF;
106 } else if (dmi_available && dmi_name_in_serial("VMware") && 106 } else if (dmi_available && dmi_name_in_serial("VMware") &&
107 __vmware_platform()) 107 __vmware_platform())
108 return true; 108 return 1;
109 109
110 return false; 110 return 0;
111} 111}
112 112
113/* 113/*
diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c
index 74467feb4dc5..e0e0841eef45 100644
--- a/arch/x86/kernel/crash.c
+++ b/arch/x86/kernel/crash.c
@@ -128,7 +128,9 @@ void native_machine_crash_shutdown(struct pt_regs *regs)
128 cpu_emergency_svm_disable(); 128 cpu_emergency_svm_disable();
129 129
130 lapic_shutdown(); 130 lapic_shutdown();
131#if defined(CONFIG_X86_IO_APIC) 131#ifdef CONFIG_X86_IO_APIC
132 /* Prevent crash_kexec() from deadlocking on ioapic_lock. */
133 ioapic_zap_locks();
132 disable_IO_APIC(); 134 disable_IO_APIC();
133#endif 135#endif
134#ifdef CONFIG_HPET_TIMER 136#ifdef CONFIG_HPET_TIMER
diff --git a/arch/x86/kernel/devicetree.c b/arch/x86/kernel/devicetree.c
index 69eb2fa25494..376dc7873447 100644
--- a/arch/x86/kernel/devicetree.c
+++ b/arch/x86/kernel/devicetree.c
@@ -52,8 +52,7 @@ void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align)
52} 52}
53 53
54#ifdef CONFIG_BLK_DEV_INITRD 54#ifdef CONFIG_BLK_DEV_INITRD
55void __init early_init_dt_setup_initrd_arch(unsigned long start, 55void __init early_init_dt_setup_initrd_arch(u64 start, u64 end)
56 unsigned long end)
57{ 56{
58 initrd_start = (unsigned long)__va(start); 57 initrd_start = (unsigned long)__va(start);
59 initrd_end = (unsigned long)__va(end); 58 initrd_end = (unsigned long)__va(end);
diff --git a/arch/x86/kernel/e820.c b/arch/x86/kernel/e820.c
index d32abeabbda5..174da5fc5a7b 100644
--- a/arch/x86/kernel/e820.c
+++ b/arch/x86/kernel/e820.c
@@ -658,15 +658,18 @@ __init void e820_setup_gap(void)
658 * boot_params.e820_map, others are passed via SETUP_E820_EXT node of 658 * boot_params.e820_map, others are passed via SETUP_E820_EXT node of
659 * linked list of struct setup_data, which is parsed here. 659 * linked list of struct setup_data, which is parsed here.
660 */ 660 */
661void __init parse_e820_ext(struct setup_data *sdata) 661void __init parse_e820_ext(u64 phys_addr, u32 data_len)
662{ 662{
663 int entries; 663 int entries;
664 struct e820entry *extmap; 664 struct e820entry *extmap;
665 struct setup_data *sdata;
665 666
667 sdata = early_memremap(phys_addr, data_len);
666 entries = sdata->len / sizeof(struct e820entry); 668 entries = sdata->len / sizeof(struct e820entry);
667 extmap = (struct e820entry *)(sdata->data); 669 extmap = (struct e820entry *)(sdata->data);
668 __append_e820_map(extmap, entries); 670 __append_e820_map(extmap, entries);
669 sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map); 671 sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
672 early_iounmap(sdata, data_len);
670 printk(KERN_INFO "e820: extended physical RAM map:\n"); 673 printk(KERN_INFO "e820: extended physical RAM map:\n");
671 e820_print_map("extended"); 674 e820_print_map("extended");
672} 675}
diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c
index 63bdb29b2549..b3cd3ebae077 100644
--- a/arch/x86/kernel/early-quirks.c
+++ b/arch/x86/kernel/early-quirks.c
@@ -12,6 +12,7 @@
12#include <linux/pci.h> 12#include <linux/pci.h>
13#include <linux/acpi.h> 13#include <linux/acpi.h>
14#include <linux/pci_ids.h> 14#include <linux/pci_ids.h>
15#include <drm/i915_drm.h>
15#include <asm/pci-direct.h> 16#include <asm/pci-direct.h>
16#include <asm/dma.h> 17#include <asm/dma.h>
17#include <asm/io_apic.h> 18#include <asm/io_apic.h>
@@ -216,6 +217,157 @@ static void __init intel_remapping_check(int num, int slot, int func)
216 217
217} 218}
218 219
220/*
221 * Systems with Intel graphics controllers set aside memory exclusively
222 * for gfx driver use. This memory is not marked in the E820 as reserved
223 * or as RAM, and so is subject to overlap from E820 manipulation later
224 * in the boot process. On some systems, MMIO space is allocated on top,
225 * despite the efforts of the "RAM buffer" approach, which simply rounds
226 * memory boundaries up to 64M to try to catch space that may decode
227 * as RAM and so is not suitable for MMIO.
228 *
229 * And yes, so far on current devices the base addr is always under 4G.
230 */
231static u32 __init intel_stolen_base(int num, int slot, int func)
232{
233 u32 base;
234
235 /*
236 * For the PCI IDs in this quirk, the stolen base is always
237 * in 0x5c, aka the BDSM register (yes that's really what
238 * it's called).
239 */
240 base = read_pci_config(num, slot, func, 0x5c);
241 base &= ~((1<<20) - 1);
242
243 return base;
244}
245
246#define KB(x) ((x) * 1024)
247#define MB(x) (KB (KB (x)))
248#define GB(x) (MB (KB (x)))
249
250static size_t __init gen3_stolen_size(int num, int slot, int func)
251{
252 size_t stolen_size;
253 u16 gmch_ctrl;
254
255 gmch_ctrl = read_pci_config_16(0, 0, 0, I830_GMCH_CTRL);
256
257 switch (gmch_ctrl & I855_GMCH_GMS_MASK) {
258 case I855_GMCH_GMS_STOLEN_1M:
259 stolen_size = MB(1);
260 break;
261 case I855_GMCH_GMS_STOLEN_4M:
262 stolen_size = MB(4);
263 break;
264 case I855_GMCH_GMS_STOLEN_8M:
265 stolen_size = MB(8);
266 break;
267 case I855_GMCH_GMS_STOLEN_16M:
268 stolen_size = MB(16);
269 break;
270 case I855_GMCH_GMS_STOLEN_32M:
271 stolen_size = MB(32);
272 break;
273 case I915_GMCH_GMS_STOLEN_48M:
274 stolen_size = MB(48);
275 break;
276 case I915_GMCH_GMS_STOLEN_64M:
277 stolen_size = MB(64);
278 break;
279 case G33_GMCH_GMS_STOLEN_128M:
280 stolen_size = MB(128);
281 break;
282 case G33_GMCH_GMS_STOLEN_256M:
283 stolen_size = MB(256);
284 break;
285 case INTEL_GMCH_GMS_STOLEN_96M:
286 stolen_size = MB(96);
287 break;
288 case INTEL_GMCH_GMS_STOLEN_160M:
289 stolen_size = MB(160);
290 break;
291 case INTEL_GMCH_GMS_STOLEN_224M:
292 stolen_size = MB(224);
293 break;
294 case INTEL_GMCH_GMS_STOLEN_352M:
295 stolen_size = MB(352);
296 break;
297 default:
298 stolen_size = 0;
299 break;
300 }
301
302 return stolen_size;
303}
304
305static size_t __init gen6_stolen_size(int num, int slot, int func)
306{
307 u16 gmch_ctrl;
308
309 gmch_ctrl = read_pci_config_16(num, slot, func, SNB_GMCH_CTRL);
310 gmch_ctrl >>= SNB_GMCH_GMS_SHIFT;
311 gmch_ctrl &= SNB_GMCH_GMS_MASK;
312
313 return gmch_ctrl << 25; /* 32 MB units */
314}
315
316typedef size_t (*stolen_size_fn)(int num, int slot, int func);
317
318static struct pci_device_id intel_stolen_ids[] __initdata = {
319 INTEL_I915G_IDS(gen3_stolen_size),
320 INTEL_I915GM_IDS(gen3_stolen_size),
321 INTEL_I945G_IDS(gen3_stolen_size),
322 INTEL_I945GM_IDS(gen3_stolen_size),
323 INTEL_VLV_M_IDS(gen3_stolen_size),
324 INTEL_VLV_D_IDS(gen3_stolen_size),
325 INTEL_PINEVIEW_IDS(gen3_stolen_size),
326 INTEL_I965G_IDS(gen3_stolen_size),
327 INTEL_G33_IDS(gen3_stolen_size),
328 INTEL_I965GM_IDS(gen3_stolen_size),
329 INTEL_GM45_IDS(gen3_stolen_size),
330 INTEL_G45_IDS(gen3_stolen_size),
331 INTEL_IRONLAKE_D_IDS(gen3_stolen_size),
332 INTEL_IRONLAKE_M_IDS(gen3_stolen_size),
333 INTEL_SNB_D_IDS(gen6_stolen_size),
334 INTEL_SNB_M_IDS(gen6_stolen_size),
335 INTEL_IVB_M_IDS(gen6_stolen_size),
336 INTEL_IVB_D_IDS(gen6_stolen_size),
337 INTEL_HSW_D_IDS(gen6_stolen_size),
338 INTEL_HSW_M_IDS(gen6_stolen_size),
339};
340
341static void __init intel_graphics_stolen(int num, int slot, int func)
342{
343 size_t size;
344 int i;
345 u32 start;
346 u16 device, subvendor, subdevice;
347
348 device = read_pci_config_16(num, slot, func, PCI_DEVICE_ID);
349 subvendor = read_pci_config_16(num, slot, func,
350 PCI_SUBSYSTEM_VENDOR_ID);
351 subdevice = read_pci_config_16(num, slot, func, PCI_SUBSYSTEM_ID);
352
353 for (i = 0; i < ARRAY_SIZE(intel_stolen_ids); i++) {
354 if (intel_stolen_ids[i].device == device) {
355 stolen_size_fn stolen_size =
356 (stolen_size_fn)intel_stolen_ids[i].driver_data;
357 size = stolen_size(num, slot, func);
358 start = intel_stolen_base(num, slot, func);
359 if (size && start) {
360 /* Mark this space as reserved */
361 e820_add_region(start, size, E820_RESERVED);
362 sanitize_e820_map(e820.map,
363 ARRAY_SIZE(e820.map),
364 &e820.nr_map);
365 }
366 return;
367 }
368 }
369}
370
219#define QFLAG_APPLY_ONCE 0x1 371#define QFLAG_APPLY_ONCE 0x1
220#define QFLAG_APPLIED 0x2 372#define QFLAG_APPLIED 0x2
221#define QFLAG_DONE (QFLAG_APPLY_ONCE|QFLAG_APPLIED) 373#define QFLAG_DONE (QFLAG_APPLY_ONCE|QFLAG_APPLIED)
@@ -251,6 +403,8 @@ static struct chipset early_qrk[] __initdata = {
251 PCI_BASE_CLASS_BRIDGE, 0, intel_remapping_check }, 403 PCI_BASE_CLASS_BRIDGE, 0, intel_remapping_check },
252 { PCI_VENDOR_ID_INTEL, 0x3406, PCI_CLASS_BRIDGE_HOST, 404 { PCI_VENDOR_ID_INTEL, 0x3406, PCI_CLASS_BRIDGE_HOST,
253 PCI_BASE_CLASS_BRIDGE, 0, intel_remapping_check }, 405 PCI_BASE_CLASS_BRIDGE, 0, intel_remapping_check },
406 { PCI_VENDOR_ID_INTEL, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA, PCI_ANY_ID,
407 QFLAG_APPLY_ONCE, intel_graphics_stolen },
254 {} 408 {}
255}; 409};
256 410
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S
index 2cfbc3a3a2dd..f0dcb0ceb6a2 100644
--- a/arch/x86/kernel/entry_32.S
+++ b/arch/x86/kernel/entry_32.S
@@ -1176,6 +1176,9 @@ ftrace_restore_flags:
1176#else /* ! CONFIG_DYNAMIC_FTRACE */ 1176#else /* ! CONFIG_DYNAMIC_FTRACE */
1177 1177
1178ENTRY(mcount) 1178ENTRY(mcount)
1179 cmpl $__PAGE_OFFSET, %esp
1180 jb ftrace_stub /* Paging not enabled yet? */
1181
1179 cmpl $0, function_trace_stop 1182 cmpl $0, function_trace_stop
1180 jne ftrace_stub 1183 jne ftrace_stub
1181 1184
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S
index 1b69951a81e2..b077f4cc225a 100644
--- a/arch/x86/kernel/entry_64.S
+++ b/arch/x86/kernel/entry_64.S
@@ -487,21 +487,6 @@ ENDPROC(native_usergs_sysret64)
487 TRACE_IRQS_OFF 487 TRACE_IRQS_OFF
488 .endm 488 .endm
489 489
490ENTRY(save_rest)
491 PARTIAL_FRAME 1 (REST_SKIP+8)
492 movq 5*8+16(%rsp), %r11 /* save return address */
493 movq_cfi rbx, RBX+16
494 movq_cfi rbp, RBP+16
495 movq_cfi r12, R12+16
496 movq_cfi r13, R13+16
497 movq_cfi r14, R14+16
498 movq_cfi r15, R15+16
499 movq %r11, 8(%rsp) /* return address */
500 FIXUP_TOP_OF_STACK %r11, 16
501 ret
502 CFI_ENDPROC
503END(save_rest)
504
505/* save complete stack frame */ 490/* save complete stack frame */
506 .pushsection .kprobes.text, "ax" 491 .pushsection .kprobes.text, "ax"
507ENTRY(save_paranoid) 492ENTRY(save_paranoid)
diff --git a/arch/x86/kernel/head32.c b/arch/x86/kernel/head32.c
index 138463a24877..06f87bece92a 100644
--- a/arch/x86/kernel/head32.c
+++ b/arch/x86/kernel/head32.c
@@ -29,7 +29,7 @@ static void __init i386_default_early_setup(void)
29 reserve_ebda_region(); 29 reserve_ebda_region();
30} 30}
31 31
32void __init i386_start_kernel(void) 32asmlinkage void __init i386_start_kernel(void)
33{ 33{
34 sanitize_boot_params(&boot_params); 34 sanitize_boot_params(&boot_params);
35 35
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
index 55b67614ed94..1be8e43b669e 100644
--- a/arch/x86/kernel/head64.c
+++ b/arch/x86/kernel/head64.c
@@ -137,7 +137,7 @@ static void __init copy_bootdata(char *real_mode_data)
137 } 137 }
138} 138}
139 139
140void __init x86_64_start_kernel(char * real_mode_data) 140asmlinkage void __init x86_64_start_kernel(char * real_mode_data)
141{ 141{
142 int i; 142 int i;
143 143
diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S
index 5dd87a89f011..81ba27679f18 100644
--- a/arch/x86/kernel/head_32.S
+++ b/arch/x86/kernel/head_32.S
@@ -409,6 +409,7 @@ enable_paging:
409/* 409/*
410 * Check if it is 486 410 * Check if it is 486
411 */ 411 */
412 movb $4,X86 # at least 486
412 cmpl $-1,X86_CPUID 413 cmpl $-1,X86_CPUID
413 je is486 414 je is486
414 415
@@ -436,7 +437,6 @@ enable_paging:
436 movl %edx,X86_CAPABILITY 437 movl %edx,X86_CAPABILITY
437 438
438is486: 439is486:
439 movb $4,X86
440 movl $0x50022,%ecx # set AM, WP, NE and MP 440 movl $0x50022,%ecx # set AM, WP, NE and MP
441 movl %cr0,%eax 441 movl %cr0,%eax
442 andl $0x80000011,%eax # Save PG,PE,ET 442 andl $0x80000011,%eax # Save PG,PE,ET
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c
index 3a8185c042a2..22d0687e7fda 100644
--- a/arch/x86/kernel/irq.c
+++ b/arch/x86/kernel/irq.c
@@ -177,7 +177,7 @@ u64 arch_irq_stat(void)
177 * SMP cross-CPU interrupts have their own specific 177 * SMP cross-CPU interrupts have their own specific
178 * handlers). 178 * handlers).
179 */ 179 */
180unsigned int __irq_entry do_IRQ(struct pt_regs *regs) 180__visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs)
181{ 181{
182 struct pt_regs *old_regs = set_irq_regs(regs); 182 struct pt_regs *old_regs = set_irq_regs(regs);
183 183
@@ -215,7 +215,7 @@ void __smp_x86_platform_ipi(void)
215 x86_platform_ipi_callback(); 215 x86_platform_ipi_callback();
216} 216}
217 217
218void smp_x86_platform_ipi(struct pt_regs *regs) 218__visible void smp_x86_platform_ipi(struct pt_regs *regs)
219{ 219{
220 struct pt_regs *old_regs = set_irq_regs(regs); 220 struct pt_regs *old_regs = set_irq_regs(regs);
221 221
@@ -229,7 +229,7 @@ void smp_x86_platform_ipi(struct pt_regs *regs)
229/* 229/*
230 * Handler for POSTED_INTERRUPT_VECTOR. 230 * Handler for POSTED_INTERRUPT_VECTOR.
231 */ 231 */
232void smp_kvm_posted_intr_ipi(struct pt_regs *regs) 232__visible void smp_kvm_posted_intr_ipi(struct pt_regs *regs)
233{ 233{
234 struct pt_regs *old_regs = set_irq_regs(regs); 234 struct pt_regs *old_regs = set_irq_regs(regs);
235 235
@@ -247,7 +247,7 @@ void smp_kvm_posted_intr_ipi(struct pt_regs *regs)
247} 247}
248#endif 248#endif
249 249
250void smp_trace_x86_platform_ipi(struct pt_regs *regs) 250__visible void smp_trace_x86_platform_ipi(struct pt_regs *regs)
251{ 251{
252 struct pt_regs *old_regs = set_irq_regs(regs); 252 struct pt_regs *old_regs = set_irq_regs(regs);
253 253
diff --git a/arch/x86/kernel/irq_work.c b/arch/x86/kernel/irq_work.c
index 636a55e4a13c..1de84e3ab4e0 100644
--- a/arch/x86/kernel/irq_work.c
+++ b/arch/x86/kernel/irq_work.c
@@ -22,14 +22,14 @@ static inline void __smp_irq_work_interrupt(void)
22 irq_work_run(); 22 irq_work_run();
23} 23}
24 24
25void smp_irq_work_interrupt(struct pt_regs *regs) 25__visible void smp_irq_work_interrupt(struct pt_regs *regs)
26{ 26{
27 irq_work_entering_irq(); 27 irq_work_entering_irq();
28 __smp_irq_work_interrupt(); 28 __smp_irq_work_interrupt();
29 exiting_irq(); 29 exiting_irq();
30} 30}
31 31
32void smp_trace_irq_work_interrupt(struct pt_regs *regs) 32__visible void smp_trace_irq_work_interrupt(struct pt_regs *regs)
33{ 33{
34 irq_work_entering_irq(); 34 irq_work_entering_irq();
35 trace_irq_work_entry(IRQ_WORK_VECTOR); 35 trace_irq_work_entry(IRQ_WORK_VECTOR);
diff --git a/arch/x86/kernel/jump_label.c b/arch/x86/kernel/jump_label.c
index 2889b3d43882..ee11b7dfbfbb 100644
--- a/arch/x86/kernel/jump_label.c
+++ b/arch/x86/kernel/jump_label.c
@@ -24,20 +24,71 @@ union jump_code_union {
24 } __attribute__((packed)); 24 } __attribute__((packed));
25}; 25};
26 26
27static void bug_at(unsigned char *ip, int line)
28{
29 /*
30 * The location is not an op that we were expecting.
31 * Something went wrong. Crash the box, as something could be
32 * corrupting the kernel.
33 */
34 pr_warning("Unexpected op at %pS [%p] (%02x %02x %02x %02x %02x) %s:%d\n",
35 ip, ip, ip[0], ip[1], ip[2], ip[3], ip[4], __FILE__, line);
36 BUG();
37}
38
27static void __jump_label_transform(struct jump_entry *entry, 39static void __jump_label_transform(struct jump_entry *entry,
28 enum jump_label_type type, 40 enum jump_label_type type,
29 void *(*poker)(void *, const void *, size_t)) 41 void *(*poker)(void *, const void *, size_t),
42 int init)
30{ 43{
31 union jump_code_union code; 44 union jump_code_union code;
45 const unsigned char *ideal_nop = ideal_nops[NOP_ATOMIC5];
32 46
33 if (type == JUMP_LABEL_ENABLE) { 47 if (type == JUMP_LABEL_ENABLE) {
48 /*
49 * We are enabling this jump label. If it is not a nop
50 * then something must have gone wrong.
51 */
52 if (unlikely(memcmp((void *)entry->code, ideal_nop, 5) != 0))
53 bug_at((void *)entry->code, __LINE__);
54
34 code.jump = 0xe9; 55 code.jump = 0xe9;
35 code.offset = entry->target - 56 code.offset = entry->target -
36 (entry->code + JUMP_LABEL_NOP_SIZE); 57 (entry->code + JUMP_LABEL_NOP_SIZE);
37 } else 58 } else {
59 /*
60 * We are disabling this jump label. If it is not what
61 * we think it is, then something must have gone wrong.
62 * If this is the first initialization call, then we
63 * are converting the default nop to the ideal nop.
64 */
65 if (init) {
66 const unsigned char default_nop[] = { STATIC_KEY_INIT_NOP };
67 if (unlikely(memcmp((void *)entry->code, default_nop, 5) != 0))
68 bug_at((void *)entry->code, __LINE__);
69 } else {
70 code.jump = 0xe9;
71 code.offset = entry->target -
72 (entry->code + JUMP_LABEL_NOP_SIZE);
73 if (unlikely(memcmp((void *)entry->code, &code, 5) != 0))
74 bug_at((void *)entry->code, __LINE__);
75 }
38 memcpy(&code, ideal_nops[NOP_ATOMIC5], JUMP_LABEL_NOP_SIZE); 76 memcpy(&code, ideal_nops[NOP_ATOMIC5], JUMP_LABEL_NOP_SIZE);
77 }
39 78
40 (*poker)((void *)entry->code, &code, JUMP_LABEL_NOP_SIZE); 79 /*
80 * Make text_poke_bp() a default fallback poker.
81 *
82 * At the time the change is being done, just ignore whether we
83 * are doing nop -> jump or jump -> nop transition, and assume
84 * always nop being the 'currently valid' instruction
85 *
86 */
87 if (poker)
88 (*poker)((void *)entry->code, &code, JUMP_LABEL_NOP_SIZE);
89 else
90 text_poke_bp((void *)entry->code, &code, JUMP_LABEL_NOP_SIZE,
91 (void *)entry->code + JUMP_LABEL_NOP_SIZE);
41} 92}
42 93
43void arch_jump_label_transform(struct jump_entry *entry, 94void arch_jump_label_transform(struct jump_entry *entry,
@@ -45,15 +96,38 @@ void arch_jump_label_transform(struct jump_entry *entry,
45{ 96{
46 get_online_cpus(); 97 get_online_cpus();
47 mutex_lock(&text_mutex); 98 mutex_lock(&text_mutex);
48 __jump_label_transform(entry, type, text_poke_smp); 99 __jump_label_transform(entry, type, NULL, 0);
49 mutex_unlock(&text_mutex); 100 mutex_unlock(&text_mutex);
50 put_online_cpus(); 101 put_online_cpus();
51} 102}
52 103
104static enum {
105 JL_STATE_START,
106 JL_STATE_NO_UPDATE,
107 JL_STATE_UPDATE,
108} jlstate __initdata_or_module = JL_STATE_START;
109
53__init_or_module void arch_jump_label_transform_static(struct jump_entry *entry, 110__init_or_module void arch_jump_label_transform_static(struct jump_entry *entry,
54 enum jump_label_type type) 111 enum jump_label_type type)
55{ 112{
56 __jump_label_transform(entry, type, text_poke_early); 113 /*
114 * This function is called at boot up and when modules are
115 * first loaded. Check if the default nop, the one that is
116 * inserted at compile time, is the ideal nop. If it is, then
117 * we do not need to update the nop, and we can leave it as is.
118 * If it is not, then we need to update the nop to the ideal nop.
119 */
120 if (jlstate == JL_STATE_START) {
121 const unsigned char default_nop[] = { STATIC_KEY_INIT_NOP };
122 const unsigned char *ideal_nop = ideal_nops[NOP_ATOMIC5];
123
124 if (memcmp(ideal_nop, default_nop, 5) != 0)
125 jlstate = JL_STATE_UPDATE;
126 else
127 jlstate = JL_STATE_NO_UPDATE;
128 }
129 if (jlstate == JL_STATE_UPDATE)
130 __jump_label_transform(entry, type, text_poke_early, 1);
57} 131}
58 132
59#endif 133#endif
diff --git a/arch/x86/kernel/kprobes/common.h b/arch/x86/kernel/kprobes/common.h
index 2e9d4b5af036..c6ee63f927ab 100644
--- a/arch/x86/kernel/kprobes/common.h
+++ b/arch/x86/kernel/kprobes/common.h
@@ -82,14 +82,9 @@ extern void synthesize_reljump(void *from, void *to);
82extern void synthesize_relcall(void *from, void *to); 82extern void synthesize_relcall(void *from, void *to);
83 83
84#ifdef CONFIG_OPTPROBES 84#ifdef CONFIG_OPTPROBES
85extern int arch_init_optprobes(void);
86extern int setup_detour_execution(struct kprobe *p, struct pt_regs *regs, int reenter); 85extern int setup_detour_execution(struct kprobe *p, struct pt_regs *regs, int reenter);
87extern unsigned long __recover_optprobed_insn(kprobe_opcode_t *buf, unsigned long addr); 86extern unsigned long __recover_optprobed_insn(kprobe_opcode_t *buf, unsigned long addr);
88#else /* !CONFIG_OPTPROBES */ 87#else /* !CONFIG_OPTPROBES */
89static inline int arch_init_optprobes(void)
90{
91 return 0;
92}
93static inline int setup_detour_execution(struct kprobe *p, struct pt_regs *regs, int reenter) 88static inline int setup_detour_execution(struct kprobe *p, struct pt_regs *regs, int reenter)
94{ 89{
95 return 0; 90 return 0;
diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c
index 211bce445522..79a3f9682871 100644
--- a/arch/x86/kernel/kprobes/core.c
+++ b/arch/x86/kernel/kprobes/core.c
@@ -661,7 +661,7 @@ static void __used __kprobes kretprobe_trampoline_holder(void)
661/* 661/*
662 * Called from kretprobe_trampoline 662 * Called from kretprobe_trampoline
663 */ 663 */
664static __used __kprobes void *trampoline_handler(struct pt_regs *regs) 664__visible __used __kprobes void *trampoline_handler(struct pt_regs *regs)
665{ 665{
666 struct kretprobe_instance *ri = NULL; 666 struct kretprobe_instance *ri = NULL;
667 struct hlist_head *head, empty_rp; 667 struct hlist_head *head, empty_rp;
@@ -1068,7 +1068,7 @@ int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
1068 1068
1069int __init arch_init_kprobes(void) 1069int __init arch_init_kprobes(void)
1070{ 1070{
1071 return arch_init_optprobes(); 1071 return 0;
1072} 1072}
1073 1073
1074int __kprobes arch_trampoline_kprobe(struct kprobe *p) 1074int __kprobes arch_trampoline_kprobe(struct kprobe *p)
diff --git a/arch/x86/kernel/kprobes/opt.c b/arch/x86/kernel/kprobes/opt.c
index 76dc6f095724..898160b42e43 100644
--- a/arch/x86/kernel/kprobes/opt.c
+++ b/arch/x86/kernel/kprobes/opt.c
@@ -88,9 +88,7 @@ static void __kprobes synthesize_set_arg1(kprobe_opcode_t *addr, unsigned long v
88 *(unsigned long *)addr = val; 88 *(unsigned long *)addr = val;
89} 89}
90 90
91static void __used __kprobes kprobes_optinsn_template_holder(void) 91asm (
92{
93 asm volatile (
94 ".global optprobe_template_entry\n" 92 ".global optprobe_template_entry\n"
95 "optprobe_template_entry:\n" 93 "optprobe_template_entry:\n"
96#ifdef CONFIG_X86_64 94#ifdef CONFIG_X86_64
@@ -129,7 +127,6 @@ static void __used __kprobes kprobes_optinsn_template_holder(void)
129#endif 127#endif
130 ".global optprobe_template_end\n" 128 ".global optprobe_template_end\n"
131 "optprobe_template_end:\n"); 129 "optprobe_template_end:\n");
132}
133 130
134#define TMPL_MOVE_IDX \ 131#define TMPL_MOVE_IDX \
135 ((long)&optprobe_template_val - (long)&optprobe_template_entry) 132 ((long)&optprobe_template_val - (long)&optprobe_template_entry)
@@ -371,31 +368,6 @@ int __kprobes arch_prepare_optimized_kprobe(struct optimized_kprobe *op)
371 return 0; 368 return 0;
372} 369}
373 370
374#define MAX_OPTIMIZE_PROBES 256
375static struct text_poke_param *jump_poke_params;
376static struct jump_poke_buffer {
377 u8 buf[RELATIVEJUMP_SIZE];
378} *jump_poke_bufs;
379
380static void __kprobes setup_optimize_kprobe(struct text_poke_param *tprm,
381 u8 *insn_buf,
382 struct optimized_kprobe *op)
383{
384 s32 rel = (s32)((long)op->optinsn.insn -
385 ((long)op->kp.addr + RELATIVEJUMP_SIZE));
386
387 /* Backup instructions which will be replaced by jump address */
388 memcpy(op->optinsn.copied_insn, op->kp.addr + INT3_SIZE,
389 RELATIVE_ADDR_SIZE);
390
391 insn_buf[0] = RELATIVEJUMP_OPCODE;
392 *(s32 *)(&insn_buf[1]) = rel;
393
394 tprm->addr = op->kp.addr;
395 tprm->opcode = insn_buf;
396 tprm->len = RELATIVEJUMP_SIZE;
397}
398
399/* 371/*
400 * Replace breakpoints (int3) with relative jumps. 372 * Replace breakpoints (int3) with relative jumps.
401 * Caller must call with locking kprobe_mutex and text_mutex. 373 * Caller must call with locking kprobe_mutex and text_mutex.
@@ -403,37 +375,38 @@ static void __kprobes setup_optimize_kprobe(struct text_poke_param *tprm,
403void __kprobes arch_optimize_kprobes(struct list_head *oplist) 375void __kprobes arch_optimize_kprobes(struct list_head *oplist)
404{ 376{
405 struct optimized_kprobe *op, *tmp; 377 struct optimized_kprobe *op, *tmp;
406 int c = 0; 378 u8 insn_buf[RELATIVEJUMP_SIZE];
407 379
408 list_for_each_entry_safe(op, tmp, oplist, list) { 380 list_for_each_entry_safe(op, tmp, oplist, list) {
381 s32 rel = (s32)((long)op->optinsn.insn -
382 ((long)op->kp.addr + RELATIVEJUMP_SIZE));
383
409 WARN_ON(kprobe_disabled(&op->kp)); 384 WARN_ON(kprobe_disabled(&op->kp));
410 /* Setup param */ 385
411 setup_optimize_kprobe(&jump_poke_params[c], 386 /* Backup instructions which will be replaced by jump address */
412 jump_poke_bufs[c].buf, op); 387 memcpy(op->optinsn.copied_insn, op->kp.addr + INT3_SIZE,
388 RELATIVE_ADDR_SIZE);
389
390 insn_buf[0] = RELATIVEJUMP_OPCODE;
391 *(s32 *)(&insn_buf[1]) = rel;
392
393 text_poke_bp(op->kp.addr, insn_buf, RELATIVEJUMP_SIZE,
394 op->optinsn.insn);
395
413 list_del_init(&op->list); 396 list_del_init(&op->list);
414 if (++c >= MAX_OPTIMIZE_PROBES)
415 break;
416 } 397 }
417
418 /*
419 * text_poke_smp doesn't support NMI/MCE code modifying.
420 * However, since kprobes itself also doesn't support NMI/MCE
421 * code probing, it's not a problem.
422 */
423 text_poke_smp_batch(jump_poke_params, c);
424} 398}
425 399
426static void __kprobes setup_unoptimize_kprobe(struct text_poke_param *tprm, 400/* Replace a relative jump with a breakpoint (int3). */
427 u8 *insn_buf, 401void __kprobes arch_unoptimize_kprobe(struct optimized_kprobe *op)
428 struct optimized_kprobe *op)
429{ 402{
403 u8 insn_buf[RELATIVEJUMP_SIZE];
404
430 /* Set int3 to first byte for kprobes */ 405 /* Set int3 to first byte for kprobes */
431 insn_buf[0] = BREAKPOINT_INSTRUCTION; 406 insn_buf[0] = BREAKPOINT_INSTRUCTION;
432 memcpy(insn_buf + 1, op->optinsn.copied_insn, RELATIVE_ADDR_SIZE); 407 memcpy(insn_buf + 1, op->optinsn.copied_insn, RELATIVE_ADDR_SIZE);
433 408 text_poke_bp(op->kp.addr, insn_buf, RELATIVEJUMP_SIZE,
434 tprm->addr = op->kp.addr; 409 op->optinsn.insn);
435 tprm->opcode = insn_buf;
436 tprm->len = RELATIVEJUMP_SIZE;
437} 410}
438 411
439/* 412/*
@@ -444,34 +417,11 @@ extern void arch_unoptimize_kprobes(struct list_head *oplist,
444 struct list_head *done_list) 417 struct list_head *done_list)
445{ 418{
446 struct optimized_kprobe *op, *tmp; 419 struct optimized_kprobe *op, *tmp;
447 int c = 0;
448 420
449 list_for_each_entry_safe(op, tmp, oplist, list) { 421 list_for_each_entry_safe(op, tmp, oplist, list) {
450 /* Setup param */ 422 arch_unoptimize_kprobe(op);
451 setup_unoptimize_kprobe(&jump_poke_params[c],
452 jump_poke_bufs[c].buf, op);
453 list_move(&op->list, done_list); 423 list_move(&op->list, done_list);
454 if (++c >= MAX_OPTIMIZE_PROBES)
455 break;
456 } 424 }
457
458 /*
459 * text_poke_smp doesn't support NMI/MCE code modifying.
460 * However, since kprobes itself also doesn't support NMI/MCE
461 * code probing, it's not a problem.
462 */
463 text_poke_smp_batch(jump_poke_params, c);
464}
465
466/* Replace a relative jump with a breakpoint (int3). */
467void __kprobes arch_unoptimize_kprobe(struct optimized_kprobe *op)
468{
469 u8 buf[RELATIVEJUMP_SIZE];
470
471 /* Set int3 to first byte for kprobes */
472 buf[0] = BREAKPOINT_INSTRUCTION;
473 memcpy(buf + 1, op->optinsn.copied_insn, RELATIVE_ADDR_SIZE);
474 text_poke_smp(op->kp.addr, buf, RELATIVEJUMP_SIZE);
475} 425}
476 426
477int __kprobes 427int __kprobes
@@ -491,22 +441,3 @@ setup_detour_execution(struct kprobe *p, struct pt_regs *regs, int reenter)
491 } 441 }
492 return 0; 442 return 0;
493} 443}
494
495int __kprobes arch_init_optprobes(void)
496{
497 /* Allocate code buffer and parameter array */
498 jump_poke_bufs = kmalloc(sizeof(struct jump_poke_buffer) *
499 MAX_OPTIMIZE_PROBES, GFP_KERNEL);
500 if (!jump_poke_bufs)
501 return -ENOMEM;
502
503 jump_poke_params = kmalloc(sizeof(struct text_poke_param) *
504 MAX_OPTIMIZE_PROBES, GFP_KERNEL);
505 if (!jump_poke_params) {
506 kfree(jump_poke_bufs);
507 jump_poke_bufs = NULL;
508 return -ENOMEM;
509 }
510
511 return 0;
512}
diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
index 56e2fa4a8b13..697b93af02dd 100644
--- a/arch/x86/kernel/kvm.c
+++ b/arch/x86/kernel/kvm.c
@@ -500,11 +500,9 @@ void __init kvm_guest_init(void)
500#endif 500#endif
501} 501}
502 502
503static bool __init kvm_detect(void) 503static uint32_t __init kvm_detect(void)
504{ 504{
505 if (!kvm_para_available()) 505 return kvm_cpuid_base();
506 return false;
507 return true;
508} 506}
509 507
510const struct hypervisor_x86 x86_hyper_kvm __refconst = { 508const struct hypervisor_x86 x86_hyper_kvm __refconst = {
diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c
index cd6de64cc480..1b10af835c31 100644
--- a/arch/x86/kernel/paravirt.c
+++ b/arch/x86/kernel/paravirt.c
@@ -62,11 +62,6 @@ void __init default_banner(void)
62 pv_info.name); 62 pv_info.name);
63} 63}
64 64
65/* Simple instruction patching code. */
66#define DEF_NATIVE(ops, name, code) \
67 extern const char start_##ops##_##name[], end_##ops##_##name[]; \
68 asm("start_" #ops "_" #name ": " code "; end_" #ops "_" #name ":")
69
70/* Undefined instruction for dealing with missing ops pointers. */ 65/* Undefined instruction for dealing with missing ops pointers. */
71static const unsigned char ud2a[] = { 0x0f, 0x0b }; 66static const unsigned char ud2a[] = { 0x0f, 0x0b };
72 67
@@ -324,7 +319,7 @@ struct pv_time_ops pv_time_ops = {
324 .steal_clock = native_steal_clock, 319 .steal_clock = native_steal_clock,
325}; 320};
326 321
327struct pv_irq_ops pv_irq_ops = { 322__visible struct pv_irq_ops pv_irq_ops = {
328 .save_fl = __PV_IS_CALLEE_SAVE(native_save_fl), 323 .save_fl = __PV_IS_CALLEE_SAVE(native_save_fl),
329 .restore_fl = __PV_IS_CALLEE_SAVE(native_restore_fl), 324 .restore_fl = __PV_IS_CALLEE_SAVE(native_restore_fl),
330 .irq_disable = __PV_IS_CALLEE_SAVE(native_irq_disable), 325 .irq_disable = __PV_IS_CALLEE_SAVE(native_irq_disable),
@@ -336,7 +331,7 @@ struct pv_irq_ops pv_irq_ops = {
336#endif 331#endif
337}; 332};
338 333
339struct pv_cpu_ops pv_cpu_ops = { 334__visible struct pv_cpu_ops pv_cpu_ops = {
340 .cpuid = native_cpuid, 335 .cpuid = native_cpuid,
341 .get_debugreg = native_get_debugreg, 336 .get_debugreg = native_get_debugreg,
342 .set_debugreg = native_set_debugreg, 337 .set_debugreg = native_set_debugreg,
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
index 83369e5a1d27..c83516be1052 100644
--- a/arch/x86/kernel/process.c
+++ b/arch/x86/kernel/process.c
@@ -36,7 +36,7 @@
36 * section. Since TSS's are completely CPU-local, we want them 36 * section. Since TSS's are completely CPU-local, we want them
37 * on exact cacheline boundaries, to eliminate cacheline ping-pong. 37 * on exact cacheline boundaries, to eliminate cacheline ping-pong.
38 */ 38 */
39DEFINE_PER_CPU_SHARED_ALIGNED(struct tss_struct, init_tss) = INIT_TSS; 39__visible DEFINE_PER_CPU_SHARED_ALIGNED(struct tss_struct, init_tss) = INIT_TSS;
40 40
41#ifdef CONFIG_X86_64 41#ifdef CONFIG_X86_64
42static DEFINE_PER_CPU(unsigned char, is_idle); 42static DEFINE_PER_CPU(unsigned char, is_idle);
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c
index f8adefca71dc..884f98f69354 100644
--- a/arch/x86/kernel/process_32.c
+++ b/arch/x86/kernel/process_32.c
@@ -247,7 +247,7 @@ EXPORT_SYMBOL_GPL(start_thread);
247 * the task-switch, and shows up in ret_from_fork in entry.S, 247 * the task-switch, and shows up in ret_from_fork in entry.S,
248 * for example. 248 * for example.
249 */ 249 */
250__notrace_funcgraph struct task_struct * 250__visible __notrace_funcgraph struct task_struct *
251__switch_to(struct task_struct *prev_p, struct task_struct *next_p) 251__switch_to(struct task_struct *prev_p, struct task_struct *next_p)
252{ 252{
253 struct thread_struct *prev = &prev_p->thread, 253 struct thread_struct *prev = &prev_p->thread,
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
index 05646bab4ca6..bb1dc51bab05 100644
--- a/arch/x86/kernel/process_64.c
+++ b/arch/x86/kernel/process_64.c
@@ -52,7 +52,7 @@
52 52
53asmlinkage extern void ret_from_fork(void); 53asmlinkage extern void ret_from_fork(void);
54 54
55DEFINE_PER_CPU(unsigned long, old_rsp); 55asmlinkage DEFINE_PER_CPU(unsigned long, old_rsp);
56 56
57/* Prints also some state that isn't saved in the pt_regs */ 57/* Prints also some state that isn't saved in the pt_regs */
58void __show_regs(struct pt_regs *regs, int all) 58void __show_regs(struct pt_regs *regs, int all)
@@ -274,7 +274,7 @@ void start_thread_ia32(struct pt_regs *regs, u32 new_ip, u32 new_sp)
274 * Kprobes not supported here. Set the probe on schedule instead. 274 * Kprobes not supported here. Set the probe on schedule instead.
275 * Function graph tracer not supported too. 275 * Function graph tracer not supported too.
276 */ 276 */
277__notrace_funcgraph struct task_struct * 277__visible __notrace_funcgraph struct task_struct *
278__switch_to(struct task_struct *prev_p, struct task_struct *next_p) 278__switch_to(struct task_struct *prev_p, struct task_struct *next_p)
279{ 279{
280 struct thread_struct *prev = &prev_p->thread; 280 struct thread_struct *prev = &prev_p->thread;
diff --git a/arch/x86/kernel/pvclock.c b/arch/x86/kernel/pvclock.c
index 2cb9470ea85b..a16bae3f83b3 100644
--- a/arch/x86/kernel/pvclock.c
+++ b/arch/x86/kernel/pvclock.c
@@ -128,46 +128,7 @@ void pvclock_read_wallclock(struct pvclock_wall_clock *wall_clock,
128 set_normalized_timespec(ts, now.tv_sec, now.tv_nsec); 128 set_normalized_timespec(ts, now.tv_sec, now.tv_nsec);
129} 129}
130 130
131static struct pvclock_vsyscall_time_info *pvclock_vdso_info;
132
133static struct pvclock_vsyscall_time_info *
134pvclock_get_vsyscall_user_time_info(int cpu)
135{
136 if (!pvclock_vdso_info) {
137 BUG();
138 return NULL;
139 }
140
141 return &pvclock_vdso_info[cpu];
142}
143
144struct pvclock_vcpu_time_info *pvclock_get_vsyscall_time_info(int cpu)
145{
146 return &pvclock_get_vsyscall_user_time_info(cpu)->pvti;
147}
148
149#ifdef CONFIG_X86_64 131#ifdef CONFIG_X86_64
150static int pvclock_task_migrate(struct notifier_block *nb, unsigned long l,
151 void *v)
152{
153 struct task_migration_notifier *mn = v;
154 struct pvclock_vsyscall_time_info *pvti;
155
156 pvti = pvclock_get_vsyscall_user_time_info(mn->from_cpu);
157
158 /* this is NULL when pvclock vsyscall is not initialized */
159 if (unlikely(pvti == NULL))
160 return NOTIFY_DONE;
161
162 pvti->migrate_count++;
163
164 return NOTIFY_DONE;
165}
166
167static struct notifier_block pvclock_migrate = {
168 .notifier_call = pvclock_task_migrate,
169};
170
171/* 132/*
172 * Initialize the generic pvclock vsyscall state. This will allocate 133 * Initialize the generic pvclock vsyscall state. This will allocate
173 * a/some page(s) for the per-vcpu pvclock information, set up a 134 * a/some page(s) for the per-vcpu pvclock information, set up a
@@ -181,17 +142,12 @@ int __init pvclock_init_vsyscall(struct pvclock_vsyscall_time_info *i,
181 142
182 WARN_ON (size != PVCLOCK_VSYSCALL_NR_PAGES*PAGE_SIZE); 143 WARN_ON (size != PVCLOCK_VSYSCALL_NR_PAGES*PAGE_SIZE);
183 144
184 pvclock_vdso_info = i;
185
186 for (idx = 0; idx <= (PVCLOCK_FIXMAP_END-PVCLOCK_FIXMAP_BEGIN); idx++) { 145 for (idx = 0; idx <= (PVCLOCK_FIXMAP_END-PVCLOCK_FIXMAP_BEGIN); idx++) {
187 __set_fixmap(PVCLOCK_FIXMAP_BEGIN + idx, 146 __set_fixmap(PVCLOCK_FIXMAP_BEGIN + idx,
188 __pa(i) + (idx*PAGE_SIZE), 147 __pa(i) + (idx*PAGE_SIZE),
189 PAGE_KERNEL_VVAR); 148 PAGE_KERNEL_VVAR);
190 } 149 }
191 150
192
193 register_task_migration_notifier(&pvclock_migrate);
194
195 return 0; 151 return 0;
196} 152}
197#endif 153#endif
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
index 563ed91e6faa..e643e744e4d8 100644
--- a/arch/x86/kernel/reboot.c
+++ b/arch/x86/kernel/reboot.c
@@ -352,12 +352,28 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
352 }, 352 },
353 { /* Handle problems with rebooting on the Precision M6600. */ 353 { /* Handle problems with rebooting on the Precision M6600. */
354 .callback = set_pci_reboot, 354 .callback = set_pci_reboot,
355 .ident = "Dell OptiPlex 990", 355 .ident = "Dell Precision M6600",
356 .matches = { 356 .matches = {
357 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 357 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
358 DMI_MATCH(DMI_PRODUCT_NAME, "Precision M6600"), 358 DMI_MATCH(DMI_PRODUCT_NAME, "Precision M6600"),
359 }, 359 },
360 }, 360 },
361 { /* Handle problems with rebooting on the Dell PowerEdge C6100. */
362 .callback = set_pci_reboot,
363 .ident = "Dell PowerEdge C6100",
364 .matches = {
365 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
366 DMI_MATCH(DMI_PRODUCT_NAME, "C6100"),
367 },
368 },
369 { /* Some C6100 machines were shipped with vendor being 'Dell'. */
370 .callback = set_pci_reboot,
371 .ident = "Dell PowerEdge C6100",
372 .matches = {
373 DMI_MATCH(DMI_SYS_VENDOR, "Dell"),
374 DMI_MATCH(DMI_PRODUCT_NAME, "C6100"),
375 },
376 },
361 { } 377 { }
362}; 378};
363 379
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index f8ec57815c05..f0de6294b955 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -206,9 +206,9 @@ EXPORT_SYMBOL(boot_cpu_data);
206 206
207 207
208#if !defined(CONFIG_X86_PAE) || defined(CONFIG_X86_64) 208#if !defined(CONFIG_X86_PAE) || defined(CONFIG_X86_64)
209unsigned long mmu_cr4_features; 209__visible unsigned long mmu_cr4_features;
210#else 210#else
211unsigned long mmu_cr4_features = X86_CR4_PAE; 211__visible unsigned long mmu_cr4_features = X86_CR4_PAE;
212#endif 212#endif
213 213
214/* Boot loader ID and version as integers, for the benefit of proc_dointvec */ 214/* Boot loader ID and version as integers, for the benefit of proc_dointvec */
@@ -426,25 +426,23 @@ static void __init reserve_initrd(void)
426static void __init parse_setup_data(void) 426static void __init parse_setup_data(void)
427{ 427{
428 struct setup_data *data; 428 struct setup_data *data;
429 u64 pa_data; 429 u64 pa_data, pa_next;
430 430
431 pa_data = boot_params.hdr.setup_data; 431 pa_data = boot_params.hdr.setup_data;
432 while (pa_data) { 432 while (pa_data) {
433 u32 data_len, map_len; 433 u32 data_len, map_len, data_type;
434 434
435 map_len = max(PAGE_SIZE - (pa_data & ~PAGE_MASK), 435 map_len = max(PAGE_SIZE - (pa_data & ~PAGE_MASK),
436 (u64)sizeof(struct setup_data)); 436 (u64)sizeof(struct setup_data));
437 data = early_memremap(pa_data, map_len); 437 data = early_memremap(pa_data, map_len);
438 data_len = data->len + sizeof(struct setup_data); 438 data_len = data->len + sizeof(struct setup_data);
439 if (data_len > map_len) { 439 data_type = data->type;
440 early_iounmap(data, map_len); 440 pa_next = data->next;
441 data = early_memremap(pa_data, data_len); 441 early_iounmap(data, map_len);
442 map_len = data_len;
443 }
444 442
445 switch (data->type) { 443 switch (data_type) {
446 case SETUP_E820_EXT: 444 case SETUP_E820_EXT:
447 parse_e820_ext(data); 445 parse_e820_ext(pa_data, data_len);
448 break; 446 break;
449 case SETUP_DTB: 447 case SETUP_DTB:
450 add_dtb(pa_data); 448 add_dtb(pa_data);
@@ -452,8 +450,7 @@ static void __init parse_setup_data(void)
452 default: 450 default:
453 break; 451 break;
454 } 452 }
455 pa_data = data->next; 453 pa_data = pa_next;
456 early_iounmap(data, map_len);
457 } 454 }
458} 455}
459 456
@@ -1070,7 +1067,7 @@ void __init setup_arch(char **cmdline_p)
1070 1067
1071 cleanup_highmap(); 1068 cleanup_highmap();
1072 1069
1073 memblock.current_limit = ISA_END_ADDRESS; 1070 memblock_set_current_limit(ISA_END_ADDRESS);
1074 memblock_x86_fill(); 1071 memblock_x86_fill();
1075 1072
1076 /* 1073 /*
@@ -1103,7 +1100,7 @@ void __init setup_arch(char **cmdline_p)
1103 1100
1104 setup_real_mode(); 1101 setup_real_mode();
1105 1102
1106 memblock.current_limit = get_max_mapped(); 1103 memblock_set_current_limit(get_max_mapped());
1107 dma_contiguous_reserve(0); 1104 dma_contiguous_reserve(0);
1108 1105
1109 /* 1106 /*
diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c
index cf913587d4dd..9e5de6813e1f 100644
--- a/arch/x86/kernel/signal.c
+++ b/arch/x86/kernel/signal.c
@@ -358,7 +358,7 @@ static int __setup_rt_frame(int sig, struct ksignal *ksig,
358 else 358 else
359 put_user_ex(0, &frame->uc.uc_flags); 359 put_user_ex(0, &frame->uc.uc_flags);
360 put_user_ex(0, &frame->uc.uc_link); 360 put_user_ex(0, &frame->uc.uc_link);
361 err |= __save_altstack(&frame->uc.uc_stack, regs->sp); 361 save_altstack_ex(&frame->uc.uc_stack, regs->sp);
362 362
363 /* Set up to return from userspace. */ 363 /* Set up to return from userspace. */
364 restorer = VDSO32_SYMBOL(current->mm->context.vdso, rt_sigreturn); 364 restorer = VDSO32_SYMBOL(current->mm->context.vdso, rt_sigreturn);
@@ -423,7 +423,7 @@ static int __setup_rt_frame(int sig, struct ksignal *ksig,
423 else 423 else
424 put_user_ex(0, &frame->uc.uc_flags); 424 put_user_ex(0, &frame->uc.uc_flags);
425 put_user_ex(0, &frame->uc.uc_link); 425 put_user_ex(0, &frame->uc.uc_link);
426 err |= __save_altstack(&frame->uc.uc_stack, regs->sp); 426 save_altstack_ex(&frame->uc.uc_stack, regs->sp);
427 427
428 /* Set up to return from userspace. If provided, use a stub 428 /* Set up to return from userspace. If provided, use a stub
429 already in userspace. */ 429 already in userspace. */
@@ -490,7 +490,7 @@ static int x32_setup_rt_frame(struct ksignal *ksig,
490 else 490 else
491 put_user_ex(0, &frame->uc.uc_flags); 491 put_user_ex(0, &frame->uc.uc_flags);
492 put_user_ex(0, &frame->uc.uc_link); 492 put_user_ex(0, &frame->uc.uc_link);
493 err |= __compat_save_altstack(&frame->uc.uc_stack, regs->sp); 493 compat_save_altstack_ex(&frame->uc.uc_stack, regs->sp);
494 put_user_ex(0, &frame->uc.uc__pad0); 494 put_user_ex(0, &frame->uc.uc__pad0);
495 495
496 if (ksig->ka.sa.sa_flags & SA_RESTORER) { 496 if (ksig->ka.sa.sa_flags & SA_RESTORER) {
@@ -533,7 +533,7 @@ static int x32_setup_rt_frame(struct ksignal *ksig,
533 * Do a signal return; undo the signal stack. 533 * Do a signal return; undo the signal stack.
534 */ 534 */
535#ifdef CONFIG_X86_32 535#ifdef CONFIG_X86_32
536unsigned long sys_sigreturn(void) 536asmlinkage unsigned long sys_sigreturn(void)
537{ 537{
538 struct pt_regs *regs = current_pt_regs(); 538 struct pt_regs *regs = current_pt_regs();
539 struct sigframe __user *frame; 539 struct sigframe __user *frame;
@@ -562,7 +562,7 @@ badframe:
562} 562}
563#endif /* CONFIG_X86_32 */ 563#endif /* CONFIG_X86_32 */
564 564
565long sys_rt_sigreturn(void) 565asmlinkage long sys_rt_sigreturn(void)
566{ 566{
567 struct pt_regs *regs = current_pt_regs(); 567 struct pt_regs *regs = current_pt_regs();
568 struct rt_sigframe __user *frame; 568 struct rt_sigframe __user *frame;
@@ -728,7 +728,7 @@ static void do_signal(struct pt_regs *regs)
728 * notification of userspace execution resumption 728 * notification of userspace execution resumption
729 * - triggered by the TIF_WORK_MASK flags 729 * - triggered by the TIF_WORK_MASK flags
730 */ 730 */
731void 731__visible void
732do_notify_resume(struct pt_regs *regs, void *unused, __u32 thread_info_flags) 732do_notify_resume(struct pt_regs *regs, void *unused, __u32 thread_info_flags)
733{ 733{
734 user_exit(); 734 user_exit();
diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c
index cdaa347dfcad..7c3a5a61f2e4 100644
--- a/arch/x86/kernel/smp.c
+++ b/arch/x86/kernel/smp.c
@@ -256,7 +256,7 @@ static inline void __smp_reschedule_interrupt(void)
256 scheduler_ipi(); 256 scheduler_ipi();
257} 257}
258 258
259void smp_reschedule_interrupt(struct pt_regs *regs) 259__visible void smp_reschedule_interrupt(struct pt_regs *regs)
260{ 260{
261 ack_APIC_irq(); 261 ack_APIC_irq();
262 __smp_reschedule_interrupt(); 262 __smp_reschedule_interrupt();
@@ -271,7 +271,7 @@ static inline void smp_entering_irq(void)
271 irq_enter(); 271 irq_enter();
272} 272}
273 273
274void smp_trace_reschedule_interrupt(struct pt_regs *regs) 274__visible void smp_trace_reschedule_interrupt(struct pt_regs *regs)
275{ 275{
276 /* 276 /*
277 * Need to call irq_enter() before calling the trace point. 277 * Need to call irq_enter() before calling the trace point.
@@ -295,14 +295,14 @@ static inline void __smp_call_function_interrupt(void)
295 inc_irq_stat(irq_call_count); 295 inc_irq_stat(irq_call_count);
296} 296}
297 297
298void smp_call_function_interrupt(struct pt_regs *regs) 298__visible void smp_call_function_interrupt(struct pt_regs *regs)
299{ 299{
300 smp_entering_irq(); 300 smp_entering_irq();
301 __smp_call_function_interrupt(); 301 __smp_call_function_interrupt();
302 exiting_irq(); 302 exiting_irq();
303} 303}
304 304
305void smp_trace_call_function_interrupt(struct pt_regs *regs) 305__visible void smp_trace_call_function_interrupt(struct pt_regs *regs)
306{ 306{
307 smp_entering_irq(); 307 smp_entering_irq();
308 trace_call_function_entry(CALL_FUNCTION_VECTOR); 308 trace_call_function_entry(CALL_FUNCTION_VECTOR);
@@ -317,14 +317,14 @@ static inline void __smp_call_function_single_interrupt(void)
317 inc_irq_stat(irq_call_count); 317 inc_irq_stat(irq_call_count);
318} 318}
319 319
320void smp_call_function_single_interrupt(struct pt_regs *regs) 320__visible void smp_call_function_single_interrupt(struct pt_regs *regs)
321{ 321{
322 smp_entering_irq(); 322 smp_entering_irq();
323 __smp_call_function_single_interrupt(); 323 __smp_call_function_single_interrupt();
324 exiting_irq(); 324 exiting_irq();
325} 325}
326 326
327void smp_trace_call_function_single_interrupt(struct pt_regs *regs) 327__visible void smp_trace_call_function_single_interrupt(struct pt_regs *regs)
328{ 328{
329 smp_entering_irq(); 329 smp_entering_irq();
330 trace_call_function_single_entry(CALL_FUNCTION_SINGLE_VECTOR); 330 trace_call_function_single_entry(CALL_FUNCTION_SINGLE_VECTOR);
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index aecc98a93d1b..6cacab671f9b 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -653,6 +653,7 @@ static void announce_cpu(int cpu, int apicid)
653{ 653{
654 static int current_node = -1; 654 static int current_node = -1;
655 int node = early_cpu_to_node(cpu); 655 int node = early_cpu_to_node(cpu);
656 int max_cpu_present = find_last_bit(cpumask_bits(cpu_present_mask), NR_CPUS);
656 657
657 if (system_state == SYSTEM_BOOTING) { 658 if (system_state == SYSTEM_BOOTING) {
658 if (node != current_node) { 659 if (node != current_node) {
@@ -661,7 +662,7 @@ static void announce_cpu(int cpu, int apicid)
661 current_node = node; 662 current_node = node;
662 pr_info("Booting Node %3d, Processors ", node); 663 pr_info("Booting Node %3d, Processors ", node);
663 } 664 }
664 pr_cont(" #%d%s", cpu, cpu == (nr_cpu_ids - 1) ? " OK\n" : ""); 665 pr_cont(" #%4d%s", cpu, cpu == max_cpu_present ? " OK\n" : "");
665 return; 666 return;
666 } else 667 } else
667 pr_info("Booting Node %d Processor %d APIC 0x%x\n", 668 pr_info("Booting Node %d Processor %d APIC 0x%x\n",
diff --git a/arch/x86/kernel/syscall_32.c b/arch/x86/kernel/syscall_32.c
index 147fcd4941c4..e9bcd57d8a9e 100644
--- a/arch/x86/kernel/syscall_32.c
+++ b/arch/x86/kernel/syscall_32.c
@@ -15,7 +15,7 @@ typedef asmlinkage void (*sys_call_ptr_t)(void);
15 15
16extern asmlinkage void sys_ni_syscall(void); 16extern asmlinkage void sys_ni_syscall(void);
17 17
18const sys_call_ptr_t sys_call_table[__NR_syscall_max+1] = { 18__visible const sys_call_ptr_t sys_call_table[__NR_syscall_max+1] = {
19 /* 19 /*
20 * Smells like a compiler bug -- it doesn't work 20 * Smells like a compiler bug -- it doesn't work
21 * when the & below is removed. 21 * when the & below is removed.
diff --git a/arch/x86/kernel/syscall_64.c b/arch/x86/kernel/syscall_64.c
index 5c7f8c20da74..4ac730b37f0b 100644
--- a/arch/x86/kernel/syscall_64.c
+++ b/arch/x86/kernel/syscall_64.c
@@ -4,6 +4,7 @@
4#include <linux/sys.h> 4#include <linux/sys.h>
5#include <linux/cache.h> 5#include <linux/cache.h>
6#include <asm/asm-offsets.h> 6#include <asm/asm-offsets.h>
7#include <asm/syscall.h>
7 8
8#define __SYSCALL_COMMON(nr, sym, compat) __SYSCALL_64(nr, sym, compat) 9#define __SYSCALL_COMMON(nr, sym, compat) __SYSCALL_64(nr, sym, compat)
9 10
@@ -19,11 +20,9 @@
19 20
20#define __SYSCALL_64(nr, sym, compat) [nr] = sym, 21#define __SYSCALL_64(nr, sym, compat) [nr] = sym,
21 22
22typedef void (*sys_call_ptr_t)(void);
23
24extern void sys_ni_syscall(void); 23extern void sys_ni_syscall(void);
25 24
26const sys_call_ptr_t sys_call_table[__NR_syscall_max+1] = { 25asmlinkage const sys_call_ptr_t sys_call_table[__NR_syscall_max+1] = {
27 /* 26 /*
28 * Smells like a compiler bug -- it doesn't work 27 * Smells like a compiler bug -- it doesn't work
29 * when the & below is removed. 28 * when the & below is removed.
diff --git a/arch/x86/kernel/sysfb.c b/arch/x86/kernel/sysfb.c
new file mode 100644
index 000000000000..193ec2ce46c7
--- /dev/null
+++ b/arch/x86/kernel/sysfb.c
@@ -0,0 +1,74 @@
1/*
2 * Generic System Framebuffers on x86
3 * Copyright (c) 2012-2013 David Herrmann <dh.herrmann@gmail.com>
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the Free
7 * Software Foundation; either version 2 of the License, or (at your option)
8 * any later version.
9 */
10
11/*
12 * Simple-Framebuffer support for x86 systems
13 * Create a platform-device for any available boot framebuffer. The
14 * simple-framebuffer platform device is already available on DT systems, so
15 * this module parses the global "screen_info" object and creates a suitable
16 * platform device compatible with the "simple-framebuffer" DT object. If
17 * the framebuffer is incompatible, we instead create a legacy
18 * "vesa-framebuffer", "efi-framebuffer" or "platform-framebuffer" device and
19 * pass the screen_info as platform_data. This allows legacy drivers
20 * to pick these devices up without messing with simple-framebuffer drivers.
21 * The global "screen_info" is still valid at all times.
22 *
23 * If CONFIG_X86_SYSFB is not selected, we never register "simple-framebuffer"
24 * platform devices, but only use legacy framebuffer devices for
25 * backwards compatibility.
26 *
27 * TODO: We set the dev_id field of all platform-devices to 0. This allows
28 * other x86 OF/DT parsers to create such devices, too. However, they must
29 * start at offset 1 for this to work.
30 */
31
32#include <linux/err.h>
33#include <linux/init.h>
34#include <linux/kernel.h>
35#include <linux/mm.h>
36#include <linux/platform_data/simplefb.h>
37#include <linux/platform_device.h>
38#include <linux/screen_info.h>
39#include <asm/sysfb.h>
40
41static __init int sysfb_init(void)
42{
43 struct screen_info *si = &screen_info;
44 struct simplefb_platform_data mode;
45 struct platform_device *pd;
46 const char *name;
47 bool compatible;
48 int ret;
49
50 sysfb_apply_efi_quirks();
51
52 /* try to create a simple-framebuffer device */
53 compatible = parse_mode(si, &mode);
54 if (compatible) {
55 ret = create_simplefb(si, &mode);
56 if (!ret)
57 return 0;
58 }
59
60 /* if the FB is incompatible, create a legacy framebuffer device */
61 if (si->orig_video_isVGA == VIDEO_TYPE_EFI)
62 name = "efi-framebuffer";
63 else if (si->orig_video_isVGA == VIDEO_TYPE_VLFB)
64 name = "vesa-framebuffer";
65 else
66 name = "platform-framebuffer";
67
68 pd = platform_device_register_resndata(NULL, name, 0,
69 NULL, 0, si, sizeof(*si));
70 return IS_ERR(pd) ? PTR_ERR(pd) : 0;
71}
72
73/* must execute after PCI subsystem for EFI quirks */
74device_initcall(sysfb_init);
diff --git a/arch/x86/kernel/sysfb_efi.c b/arch/x86/kernel/sysfb_efi.c
new file mode 100644
index 000000000000..b285d4e8c68e
--- /dev/null
+++ b/arch/x86/kernel/sysfb_efi.c
@@ -0,0 +1,214 @@
1/*
2 * Generic System Framebuffers on x86
3 * Copyright (c) 2012-2013 David Herrmann <dh.herrmann@gmail.com>
4 *
5 * EFI Quirks Copyright (c) 2006 Edgar Hucek <gimli@dark-green.com>
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the Free
9 * Software Foundation; either version 2 of the License, or (at your option)
10 * any later version.
11 */
12
13/*
14 * EFI Quirks
15 * Several EFI systems do not correctly advertise their boot framebuffers.
16 * Hence, we use this static table of known broken machines and fix up the
17 * information so framebuffer drivers can load corectly.
18 */
19
20#include <linux/dmi.h>
21#include <linux/err.h>
22#include <linux/init.h>
23#include <linux/kernel.h>
24#include <linux/mm.h>
25#include <linux/pci.h>
26#include <linux/screen_info.h>
27#include <video/vga.h>
28#include <asm/sysfb.h>
29
30enum {
31 OVERRIDE_NONE = 0x0,
32 OVERRIDE_BASE = 0x1,
33 OVERRIDE_STRIDE = 0x2,
34 OVERRIDE_HEIGHT = 0x4,
35 OVERRIDE_WIDTH = 0x8,
36};
37
38struct efifb_dmi_info efifb_dmi_list[] = {
39 [M_I17] = { "i17", 0x80010000, 1472 * 4, 1440, 900, OVERRIDE_NONE },
40 [M_I20] = { "i20", 0x80010000, 1728 * 4, 1680, 1050, OVERRIDE_NONE }, /* guess */
41 [M_I20_SR] = { "imac7", 0x40010000, 1728 * 4, 1680, 1050, OVERRIDE_NONE },
42 [M_I24] = { "i24", 0x80010000, 2048 * 4, 1920, 1200, OVERRIDE_NONE }, /* guess */
43 [M_I24_8_1] = { "imac8", 0xc0060000, 2048 * 4, 1920, 1200, OVERRIDE_NONE },
44 [M_I24_10_1] = { "imac10", 0xc0010000, 2048 * 4, 1920, 1080, OVERRIDE_NONE },
45 [M_I27_11_1] = { "imac11", 0xc0010000, 2560 * 4, 2560, 1440, OVERRIDE_NONE },
46 [M_MINI]= { "mini", 0x80000000, 2048 * 4, 1024, 768, OVERRIDE_NONE },
47 [M_MINI_3_1] = { "mini31", 0x40010000, 1024 * 4, 1024, 768, OVERRIDE_NONE },
48 [M_MINI_4_1] = { "mini41", 0xc0010000, 2048 * 4, 1920, 1200, OVERRIDE_NONE },
49 [M_MB] = { "macbook", 0x80000000, 2048 * 4, 1280, 800, OVERRIDE_NONE },
50 [M_MB_5_1] = { "macbook51", 0x80010000, 2048 * 4, 1280, 800, OVERRIDE_NONE },
51 [M_MB_6_1] = { "macbook61", 0x80010000, 2048 * 4, 1280, 800, OVERRIDE_NONE },
52 [M_MB_7_1] = { "macbook71", 0x80010000, 2048 * 4, 1280, 800, OVERRIDE_NONE },
53 [M_MBA] = { "mba", 0x80000000, 2048 * 4, 1280, 800, OVERRIDE_NONE },
54 /* 11" Macbook Air 3,1 passes the wrong stride */
55 [M_MBA_3] = { "mba3", 0, 2048 * 4, 0, 0, OVERRIDE_STRIDE },
56 [M_MBP] = { "mbp", 0x80010000, 1472 * 4, 1440, 900, OVERRIDE_NONE },
57 [M_MBP_2] = { "mbp2", 0, 0, 0, 0, OVERRIDE_NONE }, /* placeholder */
58 [M_MBP_2_2] = { "mbp22", 0x80010000, 1472 * 4, 1440, 900, OVERRIDE_NONE },
59 [M_MBP_SR] = { "mbp3", 0x80030000, 2048 * 4, 1440, 900, OVERRIDE_NONE },
60 [M_MBP_4] = { "mbp4", 0xc0060000, 2048 * 4, 1920, 1200, OVERRIDE_NONE },
61 [M_MBP_5_1] = { "mbp51", 0xc0010000, 2048 * 4, 1440, 900, OVERRIDE_NONE },
62 [M_MBP_5_2] = { "mbp52", 0xc0010000, 2048 * 4, 1920, 1200, OVERRIDE_NONE },
63 [M_MBP_5_3] = { "mbp53", 0xd0010000, 2048 * 4, 1440, 900, OVERRIDE_NONE },
64 [M_MBP_6_1] = { "mbp61", 0x90030000, 2048 * 4, 1920, 1200, OVERRIDE_NONE },
65 [M_MBP_6_2] = { "mbp62", 0x90030000, 2048 * 4, 1680, 1050, OVERRIDE_NONE },
66 [M_MBP_7_1] = { "mbp71", 0xc0010000, 2048 * 4, 1280, 800, OVERRIDE_NONE },
67 [M_MBP_8_2] = { "mbp82", 0x90010000, 1472 * 4, 1440, 900, OVERRIDE_NONE },
68 [M_UNKNOWN] = { NULL, 0, 0, 0, 0, OVERRIDE_NONE }
69};
70
71#define choose_value(dmivalue, fwvalue, field, flags) ({ \
72 typeof(fwvalue) _ret_ = fwvalue; \
73 if ((flags) & (field)) \
74 _ret_ = dmivalue; \
75 else if ((fwvalue) == 0) \
76 _ret_ = dmivalue; \
77 _ret_; \
78 })
79
80static int __init efifb_set_system(const struct dmi_system_id *id)
81{
82 struct efifb_dmi_info *info = id->driver_data;
83
84 if (info->base == 0 && info->height == 0 && info->width == 0 &&
85 info->stride == 0)
86 return 0;
87
88 /* Trust the bootloader over the DMI tables */
89 if (screen_info.lfb_base == 0) {
90#if defined(CONFIG_PCI)
91 struct pci_dev *dev = NULL;
92 int found_bar = 0;
93#endif
94 if (info->base) {
95 screen_info.lfb_base = choose_value(info->base,
96 screen_info.lfb_base, OVERRIDE_BASE,
97 info->flags);
98
99#if defined(CONFIG_PCI)
100 /* make sure that the address in the table is actually
101 * on a VGA device's PCI BAR */
102
103 for_each_pci_dev(dev) {
104 int i;
105 if ((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA)
106 continue;
107 for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
108 resource_size_t start, end;
109
110 start = pci_resource_start(dev, i);
111 if (start == 0)
112 break;
113 end = pci_resource_end(dev, i);
114 if (screen_info.lfb_base >= start &&
115 screen_info.lfb_base < end) {
116 found_bar = 1;
117 }
118 }
119 }
120 if (!found_bar)
121 screen_info.lfb_base = 0;
122#endif
123 }
124 }
125 if (screen_info.lfb_base) {
126 screen_info.lfb_linelength = choose_value(info->stride,
127 screen_info.lfb_linelength, OVERRIDE_STRIDE,
128 info->flags);
129 screen_info.lfb_width = choose_value(info->width,
130 screen_info.lfb_width, OVERRIDE_WIDTH,
131 info->flags);
132 screen_info.lfb_height = choose_value(info->height,
133 screen_info.lfb_height, OVERRIDE_HEIGHT,
134 info->flags);
135 if (screen_info.orig_video_isVGA == 0)
136 screen_info.orig_video_isVGA = VIDEO_TYPE_EFI;
137 } else {
138 screen_info.lfb_linelength = 0;
139 screen_info.lfb_width = 0;
140 screen_info.lfb_height = 0;
141 screen_info.orig_video_isVGA = 0;
142 return 0;
143 }
144
145 printk(KERN_INFO "efifb: dmi detected %s - framebuffer at 0x%08x "
146 "(%dx%d, stride %d)\n", id->ident,
147 screen_info.lfb_base, screen_info.lfb_width,
148 screen_info.lfb_height, screen_info.lfb_linelength);
149
150 return 1;
151}
152
153#define EFIFB_DMI_SYSTEM_ID(vendor, name, enumid) \
154 { \
155 efifb_set_system, \
156 name, \
157 { \
158 DMI_MATCH(DMI_BIOS_VENDOR, vendor), \
159 DMI_MATCH(DMI_PRODUCT_NAME, name) \
160 }, \
161 &efifb_dmi_list[enumid] \
162 }
163
164static const struct dmi_system_id efifb_dmi_system_table[] __initconst = {
165 EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "iMac4,1", M_I17),
166 /* At least one of these two will be right; maybe both? */
167 EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "iMac5,1", M_I20),
168 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "iMac5,1", M_I20),
169 /* At least one of these two will be right; maybe both? */
170 EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "iMac6,1", M_I24),
171 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "iMac6,1", M_I24),
172 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "iMac7,1", M_I20_SR),
173 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "iMac8,1", M_I24_8_1),
174 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "iMac10,1", M_I24_10_1),
175 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "iMac11,1", M_I27_11_1),
176 EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "Macmini1,1", M_MINI),
177 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "Macmini3,1", M_MINI_3_1),
178 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "Macmini4,1", M_MINI_4_1),
179 EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBook1,1", M_MB),
180 /* At least one of these two will be right; maybe both? */
181 EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBook2,1", M_MB),
182 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBook2,1", M_MB),
183 /* At least one of these two will be right; maybe both? */
184 EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBook3,1", M_MB),
185 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBook3,1", M_MB),
186 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBook4,1", M_MB),
187 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBook5,1", M_MB_5_1),
188 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBook6,1", M_MB_6_1),
189 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBook7,1", M_MB_7_1),
190 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookAir1,1", M_MBA),
191 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookAir3,1", M_MBA_3),
192 EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBookPro1,1", M_MBP),
193 EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBookPro2,1", M_MBP_2),
194 EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBookPro2,2", M_MBP_2_2),
195 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro2,1", M_MBP_2),
196 EFIFB_DMI_SYSTEM_ID("Apple Computer, Inc.", "MacBookPro3,1", M_MBP_SR),
197 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro3,1", M_MBP_SR),
198 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro4,1", M_MBP_4),
199 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro5,1", M_MBP_5_1),
200 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro5,2", M_MBP_5_2),
201 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro5,3", M_MBP_5_3),
202 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro6,1", M_MBP_6_1),
203 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro6,2", M_MBP_6_2),
204 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro7,1", M_MBP_7_1),
205 EFIFB_DMI_SYSTEM_ID("Apple Inc.", "MacBookPro8,2", M_MBP_8_2),
206 {},
207};
208
209__init void sysfb_apply_efi_quirks(void)
210{
211 if (screen_info.orig_video_isVGA != VIDEO_TYPE_EFI ||
212 !(screen_info.capabilities & VIDEO_CAPABILITY_SKIP_QUIRKS))
213 dmi_check_system(efifb_dmi_system_table);
214}
diff --git a/arch/x86/kernel/sysfb_simplefb.c b/arch/x86/kernel/sysfb_simplefb.c
new file mode 100644
index 000000000000..22513e96b012
--- /dev/null
+++ b/arch/x86/kernel/sysfb_simplefb.c
@@ -0,0 +1,95 @@
1/*
2 * Generic System Framebuffers on x86
3 * Copyright (c) 2012-2013 David Herrmann <dh.herrmann@gmail.com>
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the Free
7 * Software Foundation; either version 2 of the License, or (at your option)
8 * any later version.
9 */
10
11/*
12 * simple-framebuffer probing
13 * Try to convert "screen_info" into a "simple-framebuffer" compatible mode.
14 * If the mode is incompatible, we return "false" and let the caller create
15 * legacy nodes instead.
16 */
17
18#include <linux/err.h>
19#include <linux/init.h>
20#include <linux/kernel.h>
21#include <linux/mm.h>
22#include <linux/platform_data/simplefb.h>
23#include <linux/platform_device.h>
24#include <linux/screen_info.h>
25#include <asm/sysfb.h>
26
27static const char simplefb_resname[] = "BOOTFB";
28static const struct simplefb_format formats[] = SIMPLEFB_FORMATS;
29
30/* try parsing x86 screen_info into a simple-framebuffer mode struct */
31__init bool parse_mode(const struct screen_info *si,
32 struct simplefb_platform_data *mode)
33{
34 const struct simplefb_format *f;
35 __u8 type;
36 unsigned int i;
37
38 type = si->orig_video_isVGA;
39 if (type != VIDEO_TYPE_VLFB && type != VIDEO_TYPE_EFI)
40 return false;
41
42 for (i = 0; i < ARRAY_SIZE(formats); ++i) {
43 f = &formats[i];
44 if (si->lfb_depth == f->bits_per_pixel &&
45 si->red_size == f->red.length &&
46 si->red_pos == f->red.offset &&
47 si->green_size == f->green.length &&
48 si->green_pos == f->green.offset &&
49 si->blue_size == f->blue.length &&
50 si->blue_pos == f->blue.offset &&
51 si->rsvd_size == f->transp.length &&
52 si->rsvd_pos == f->transp.offset) {
53 mode->format = f->name;
54 mode->width = si->lfb_width;
55 mode->height = si->lfb_height;
56 mode->stride = si->lfb_linelength;
57 return true;
58 }
59 }
60
61 return false;
62}
63
64__init int create_simplefb(const struct screen_info *si,
65 const struct simplefb_platform_data *mode)
66{
67 struct platform_device *pd;
68 struct resource res;
69 unsigned long len;
70
71 /* don't use lfb_size as it may contain the whole VMEM instead of only
72 * the part that is occupied by the framebuffer */
73 len = mode->height * mode->stride;
74 len = PAGE_ALIGN(len);
75 if (len > si->lfb_size << 16) {
76 printk(KERN_WARNING "sysfb: VRAM smaller than advertised\n");
77 return -EINVAL;
78 }
79
80 /* setup IORESOURCE_MEM as framebuffer memory */
81 memset(&res, 0, sizeof(res));
82 res.flags = IORESOURCE_MEM;
83 res.name = simplefb_resname;
84 res.start = si->lfb_base;
85 res.end = si->lfb_base + len - 1;
86 if (res.end <= res.start)
87 return -EINVAL;
88
89 pd = platform_device_register_resndata(NULL, "simple-framebuffer", 0,
90 &res, 1, mode, sizeof(*mode));
91 if (IS_ERR(pd))
92 return PTR_ERR(pd);
93
94 return 0;
95}
diff --git a/arch/x86/kernel/tboot.c b/arch/x86/kernel/tboot.c
index addf7b58f4e8..91a4496db434 100644
--- a/arch/x86/kernel/tboot.c
+++ b/arch/x86/kernel/tboot.c
@@ -301,6 +301,15 @@ static int tboot_sleep(u8 sleep_state, u32 pm1a_control, u32 pm1b_control)
301 return 0; 301 return 0;
302} 302}
303 303
304static int tboot_extended_sleep(u8 sleep_state, u32 val_a, u32 val_b)
305{
306 if (!tboot_enabled())
307 return 0;
308
309 pr_warning("tboot is not able to suspend on platforms with reduced hardware sleep (ACPIv5)");
310 return -ENODEV;
311}
312
304static atomic_t ap_wfs_count; 313static atomic_t ap_wfs_count;
305 314
306static int tboot_wait_for_aps(int num_aps) 315static int tboot_wait_for_aps(int num_aps)
@@ -422,6 +431,7 @@ static __init int tboot_late_init(void)
422#endif 431#endif
423 432
424 acpi_os_set_prepare_sleep(&tboot_sleep); 433 acpi_os_set_prepare_sleep(&tboot_sleep);
434 acpi_os_set_prepare_extended_sleep(&tboot_extended_sleep);
425 return 0; 435 return 0;
426} 436}
427 437
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index 1b23a1c92746..8c8093b146ca 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -58,6 +58,7 @@
58#include <asm/mce.h> 58#include <asm/mce.h>
59#include <asm/fixmap.h> 59#include <asm/fixmap.h>
60#include <asm/mach_traps.h> 60#include <asm/mach_traps.h>
61#include <asm/alternative.h>
61 62
62#ifdef CONFIG_X86_64 63#ifdef CONFIG_X86_64
63#include <asm/x86_init.h> 64#include <asm/x86_init.h>
@@ -327,6 +328,9 @@ dotraplinkage void __kprobes notrace do_int3(struct pt_regs *regs, long error_co
327 ftrace_int3_handler(regs)) 328 ftrace_int3_handler(regs))
328 return; 329 return;
329#endif 330#endif
331 if (poke_int3_handler(regs))
332 return;
333
330 prev_state = exception_enter(); 334 prev_state = exception_enter();
331#ifdef CONFIG_KGDB_LOW_LEVEL_TRAP 335#ifdef CONFIG_KGDB_LOW_LEVEL_TRAP
332 if (kgdb_ll_trap(DIE_INT3, "int3", regs, error_code, X86_TRAP_BP, 336 if (kgdb_ll_trap(DIE_INT3, "int3", regs, error_code, X86_TRAP_BP,
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c
index 6ff49247edf8..930e5d48f560 100644
--- a/arch/x86/kernel/tsc.c
+++ b/arch/x86/kernel/tsc.c
@@ -89,6 +89,12 @@ int check_tsc_unstable(void)
89} 89}
90EXPORT_SYMBOL_GPL(check_tsc_unstable); 90EXPORT_SYMBOL_GPL(check_tsc_unstable);
91 91
92int check_tsc_disabled(void)
93{
94 return tsc_disabled;
95}
96EXPORT_SYMBOL_GPL(check_tsc_disabled);
97
92#ifdef CONFIG_X86_TSC 98#ifdef CONFIG_X86_TSC
93int __init notsc_setup(char *str) 99int __init notsc_setup(char *str)
94{ 100{
diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c
index 5f24c71accaa..8ce0072cd700 100644
--- a/arch/x86/kernel/x86_init.c
+++ b/arch/x86/kernel/x86_init.c
@@ -107,6 +107,8 @@ struct x86_platform_ops x86_platform = {
107}; 107};
108 108
109EXPORT_SYMBOL_GPL(x86_platform); 109EXPORT_SYMBOL_GPL(x86_platform);
110
111#if defined(CONFIG_PCI_MSI)
110struct x86_msi_ops x86_msi = { 112struct x86_msi_ops x86_msi = {
111 .setup_msi_irqs = native_setup_msi_irqs, 113 .setup_msi_irqs = native_setup_msi_irqs,
112 .compose_msi_msg = native_compose_msi_msg, 114 .compose_msi_msg = native_compose_msi_msg,
@@ -116,6 +118,28 @@ struct x86_msi_ops x86_msi = {
116 .setup_hpet_msi = default_setup_hpet_msi, 118 .setup_hpet_msi = default_setup_hpet_msi,
117}; 119};
118 120
121/* MSI arch specific hooks */
122int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
123{
124 return x86_msi.setup_msi_irqs(dev, nvec, type);
125}
126
127void arch_teardown_msi_irqs(struct pci_dev *dev)
128{
129 x86_msi.teardown_msi_irqs(dev);
130}
131
132void arch_teardown_msi_irq(unsigned int irq)
133{
134 x86_msi.teardown_msi_irq(irq);
135}
136
137void arch_restore_msi_irqs(struct pci_dev *dev, int irq)
138{
139 x86_msi.restore_msi_irqs(dev, irq);
140}
141#endif
142
119struct x86_io_apic_ops x86_io_apic_ops = { 143struct x86_io_apic_ops x86_io_apic_ops = {
120 .init = native_io_apic_init_mappings, 144 .init = native_io_apic_init_mappings,
121 .read = native_io_apic_read, 145 .read = native_io_apic_read,
diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
index a20ecb5b6cbf..b110fe6c03d4 100644
--- a/arch/x86/kvm/cpuid.c
+++ b/arch/x86/kvm/cpuid.c
@@ -413,7 +413,8 @@ static int do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
413 (1 << KVM_FEATURE_CLOCKSOURCE2) | 413 (1 << KVM_FEATURE_CLOCKSOURCE2) |
414 (1 << KVM_FEATURE_ASYNC_PF) | 414 (1 << KVM_FEATURE_ASYNC_PF) |
415 (1 << KVM_FEATURE_PV_EOI) | 415 (1 << KVM_FEATURE_PV_EOI) |
416 (1 << KVM_FEATURE_CLOCKSOURCE_STABLE_BIT); 416 (1 << KVM_FEATURE_CLOCKSOURCE_STABLE_BIT) |
417 (1 << KVM_FEATURE_PV_UNHALT);
417 418
418 if (sched_info_on()) 419 if (sched_info_on())
419 entry->eax |= (1 << KVM_FEATURE_STEAL_TIME); 420 entry->eax |= (1 << KVM_FEATURE_STEAL_TIME);
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 2bc1e81045b0..ddc3f3d2afdb 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -2025,6 +2025,17 @@ static int em_ret_far(struct x86_emulate_ctxt *ctxt)
2025 return rc; 2025 return rc;
2026} 2026}
2027 2027
2028static int em_ret_far_imm(struct x86_emulate_ctxt *ctxt)
2029{
2030 int rc;
2031
2032 rc = em_ret_far(ctxt);
2033 if (rc != X86EMUL_CONTINUE)
2034 return rc;
2035 rsp_increment(ctxt, ctxt->src.val);
2036 return X86EMUL_CONTINUE;
2037}
2038
2028static int em_cmpxchg(struct x86_emulate_ctxt *ctxt) 2039static int em_cmpxchg(struct x86_emulate_ctxt *ctxt)
2029{ 2040{
2030 /* Save real source value, then compare EAX against destination. */ 2041 /* Save real source value, then compare EAX against destination. */
@@ -3763,7 +3774,8 @@ static const struct opcode opcode_table[256] = {
3763 G(ByteOp, group11), G(0, group11), 3774 G(ByteOp, group11), G(0, group11),
3764 /* 0xC8 - 0xCF */ 3775 /* 0xC8 - 0xCF */
3765 I(Stack | SrcImmU16 | Src2ImmByte, em_enter), I(Stack, em_leave), 3776 I(Stack | SrcImmU16 | Src2ImmByte, em_enter), I(Stack, em_leave),
3766 N, I(ImplicitOps | Stack, em_ret_far), 3777 I(ImplicitOps | Stack | SrcImmU16, em_ret_far_imm),
3778 I(ImplicitOps | Stack, em_ret_far),
3767 D(ImplicitOps), DI(SrcImmByte, intn), 3779 D(ImplicitOps), DI(SrcImmByte, intn),
3768 D(ImplicitOps | No64), II(ImplicitOps, em_iret, iret), 3780 D(ImplicitOps | No64), II(ImplicitOps, em_iret, iret),
3769 /* 0xD0 - 0xD7 */ 3781 /* 0xD0 - 0xD7 */
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
index afc11245827c..5439117d5c4c 100644
--- a/arch/x86/kvm/lapic.c
+++ b/arch/x86/kvm/lapic.c
@@ -79,16 +79,6 @@ static inline void apic_set_reg(struct kvm_lapic *apic, int reg_off, u32 val)
79 *((u32 *) (apic->regs + reg_off)) = val; 79 *((u32 *) (apic->regs + reg_off)) = val;
80} 80}
81 81
82static inline int apic_test_and_set_vector(int vec, void *bitmap)
83{
84 return test_and_set_bit(VEC_POS(vec), (bitmap) + REG_POS(vec));
85}
86
87static inline int apic_test_and_clear_vector(int vec, void *bitmap)
88{
89 return test_and_clear_bit(VEC_POS(vec), (bitmap) + REG_POS(vec));
90}
91
92static inline int apic_test_vector(int vec, void *bitmap) 82static inline int apic_test_vector(int vec, void *bitmap)
93{ 83{
94 return test_bit(VEC_POS(vec), (bitmap) + REG_POS(vec)); 84 return test_bit(VEC_POS(vec), (bitmap) + REG_POS(vec));
@@ -331,10 +321,10 @@ void kvm_apic_update_irr(struct kvm_vcpu *vcpu, u32 *pir)
331} 321}
332EXPORT_SYMBOL_GPL(kvm_apic_update_irr); 322EXPORT_SYMBOL_GPL(kvm_apic_update_irr);
333 323
334static inline int apic_test_and_set_irr(int vec, struct kvm_lapic *apic) 324static inline void apic_set_irr(int vec, struct kvm_lapic *apic)
335{ 325{
336 apic->irr_pending = true; 326 apic->irr_pending = true;
337 return apic_test_and_set_vector(vec, apic->regs + APIC_IRR); 327 apic_set_vector(vec, apic->regs + APIC_IRR);
338} 328}
339 329
340static inline int apic_search_irr(struct kvm_lapic *apic) 330static inline int apic_search_irr(struct kvm_lapic *apic)
@@ -681,32 +671,28 @@ static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode,
681 if (unlikely(!apic_enabled(apic))) 671 if (unlikely(!apic_enabled(apic)))
682 break; 672 break;
683 673
674 result = 1;
675
684 if (dest_map) 676 if (dest_map)
685 __set_bit(vcpu->vcpu_id, dest_map); 677 __set_bit(vcpu->vcpu_id, dest_map);
686 678
687 if (kvm_x86_ops->deliver_posted_interrupt) { 679 if (kvm_x86_ops->deliver_posted_interrupt)
688 result = 1;
689 kvm_x86_ops->deliver_posted_interrupt(vcpu, vector); 680 kvm_x86_ops->deliver_posted_interrupt(vcpu, vector);
690 } else { 681 else {
691 result = !apic_test_and_set_irr(vector, apic); 682 apic_set_irr(vector, apic);
692
693 if (!result) {
694 if (trig_mode)
695 apic_debug("level trig mode repeatedly "
696 "for vector %d", vector);
697 goto out;
698 }
699 683
700 kvm_make_request(KVM_REQ_EVENT, vcpu); 684 kvm_make_request(KVM_REQ_EVENT, vcpu);
701 kvm_vcpu_kick(vcpu); 685 kvm_vcpu_kick(vcpu);
702 } 686 }
703out:
704 trace_kvm_apic_accept_irq(vcpu->vcpu_id, delivery_mode, 687 trace_kvm_apic_accept_irq(vcpu->vcpu_id, delivery_mode,
705 trig_mode, vector, !result); 688 trig_mode, vector, false);
706 break; 689 break;
707 690
708 case APIC_DM_REMRD: 691 case APIC_DM_REMRD:
709 apic_debug("Ignoring delivery mode 3\n"); 692 result = 1;
693 vcpu->arch.pv.pv_unhalted = 1;
694 kvm_make_request(KVM_REQ_EVENT, vcpu);
695 kvm_vcpu_kick(vcpu);
710 break; 696 break;
711 697
712 case APIC_DM_SMI: 698 case APIC_DM_SMI:
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index 9e9285ae9b94..dce0df8150df 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -132,8 +132,8 @@ module_param(dbg, bool, 0644);
132 (PAGE_MASK & ~((1ULL << (PAGE_SHIFT + (((level) - 1) \ 132 (PAGE_MASK & ~((1ULL << (PAGE_SHIFT + (((level) - 1) \
133 * PT32_LEVEL_BITS))) - 1)) 133 * PT32_LEVEL_BITS))) - 1))
134 134
135#define PT64_PERM_MASK (PT_PRESENT_MASK | PT_WRITABLE_MASK | PT_USER_MASK \ 135#define PT64_PERM_MASK (PT_PRESENT_MASK | PT_WRITABLE_MASK | shadow_user_mask \
136 | PT64_NX_MASK) 136 | shadow_x_mask | shadow_nx_mask)
137 137
138#define ACC_EXEC_MASK 1 138#define ACC_EXEC_MASK 1
139#define ACC_WRITE_MASK PT_WRITABLE_MASK 139#define ACC_WRITE_MASK PT_WRITABLE_MASK
@@ -331,11 +331,6 @@ static int is_large_pte(u64 pte)
331 return pte & PT_PAGE_SIZE_MASK; 331 return pte & PT_PAGE_SIZE_MASK;
332} 332}
333 333
334static int is_dirty_gpte(unsigned long pte)
335{
336 return pte & PT_DIRTY_MASK;
337}
338
339static int is_rmap_spte(u64 pte) 334static int is_rmap_spte(u64 pte)
340{ 335{
341 return is_shadow_present_pte(pte); 336 return is_shadow_present_pte(pte);
@@ -2052,12 +2047,18 @@ static void shadow_walk_next(struct kvm_shadow_walk_iterator *iterator)
2052 return __shadow_walk_next(iterator, *iterator->sptep); 2047 return __shadow_walk_next(iterator, *iterator->sptep);
2053} 2048}
2054 2049
2055static void link_shadow_page(u64 *sptep, struct kvm_mmu_page *sp) 2050static void link_shadow_page(u64 *sptep, struct kvm_mmu_page *sp, bool accessed)
2056{ 2051{
2057 u64 spte; 2052 u64 spte;
2058 2053
2054 BUILD_BUG_ON(VMX_EPT_READABLE_MASK != PT_PRESENT_MASK ||
2055 VMX_EPT_WRITABLE_MASK != PT_WRITABLE_MASK);
2056
2059 spte = __pa(sp->spt) | PT_PRESENT_MASK | PT_WRITABLE_MASK | 2057 spte = __pa(sp->spt) | PT_PRESENT_MASK | PT_WRITABLE_MASK |
2060 shadow_user_mask | shadow_x_mask | shadow_accessed_mask; 2058 shadow_user_mask | shadow_x_mask;
2059
2060 if (accessed)
2061 spte |= shadow_accessed_mask;
2061 2062
2062 mmu_spte_set(sptep, spte); 2063 mmu_spte_set(sptep, spte);
2063} 2064}
@@ -2574,14 +2575,6 @@ static void nonpaging_new_cr3(struct kvm_vcpu *vcpu)
2574 mmu_free_roots(vcpu); 2575 mmu_free_roots(vcpu);
2575} 2576}
2576 2577
2577static bool is_rsvd_bits_set(struct kvm_mmu *mmu, u64 gpte, int level)
2578{
2579 int bit7;
2580
2581 bit7 = (gpte >> 7) & 1;
2582 return (gpte & mmu->rsvd_bits_mask[bit7][level-1]) != 0;
2583}
2584
2585static pfn_t pte_prefetch_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn, 2578static pfn_t pte_prefetch_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn,
2586 bool no_dirty_log) 2579 bool no_dirty_log)
2587{ 2580{
@@ -2594,26 +2587,6 @@ static pfn_t pte_prefetch_gfn_to_pfn(struct kvm_vcpu *vcpu, gfn_t gfn,
2594 return gfn_to_pfn_memslot_atomic(slot, gfn); 2587 return gfn_to_pfn_memslot_atomic(slot, gfn);
2595} 2588}
2596 2589
2597static bool prefetch_invalid_gpte(struct kvm_vcpu *vcpu,
2598 struct kvm_mmu_page *sp, u64 *spte,
2599 u64 gpte)
2600{
2601 if (is_rsvd_bits_set(&vcpu->arch.mmu, gpte, PT_PAGE_TABLE_LEVEL))
2602 goto no_present;
2603
2604 if (!is_present_gpte(gpte))
2605 goto no_present;
2606
2607 if (!(gpte & PT_ACCESSED_MASK))
2608 goto no_present;
2609
2610 return false;
2611
2612no_present:
2613 drop_spte(vcpu->kvm, spte);
2614 return true;
2615}
2616
2617static int direct_pte_prefetch_many(struct kvm_vcpu *vcpu, 2590static int direct_pte_prefetch_many(struct kvm_vcpu *vcpu,
2618 struct kvm_mmu_page *sp, 2591 struct kvm_mmu_page *sp,
2619 u64 *start, u64 *end) 2592 u64 *start, u64 *end)
@@ -2710,7 +2683,7 @@ static int __direct_map(struct kvm_vcpu *vcpu, gpa_t v, int write,
2710 iterator.level - 1, 2683 iterator.level - 1,
2711 1, ACC_ALL, iterator.sptep); 2684 1, ACC_ALL, iterator.sptep);
2712 2685
2713 link_shadow_page(iterator.sptep, sp); 2686 link_shadow_page(iterator.sptep, sp, true);
2714 } 2687 }
2715 } 2688 }
2716 return emulate; 2689 return emulate;
@@ -2808,7 +2781,7 @@ exit:
2808 return ret; 2781 return ret;
2809} 2782}
2810 2783
2811static bool page_fault_can_be_fast(struct kvm_vcpu *vcpu, u32 error_code) 2784static bool page_fault_can_be_fast(u32 error_code)
2812{ 2785{
2813 /* 2786 /*
2814 * Do not fix the mmio spte with invalid generation number which 2787 * Do not fix the mmio spte with invalid generation number which
@@ -2861,7 +2834,7 @@ static bool fast_page_fault(struct kvm_vcpu *vcpu, gva_t gva, int level,
2861 bool ret = false; 2834 bool ret = false;
2862 u64 spte = 0ull; 2835 u64 spte = 0ull;
2863 2836
2864 if (!page_fault_can_be_fast(vcpu, error_code)) 2837 if (!page_fault_can_be_fast(error_code))
2865 return false; 2838 return false;
2866 2839
2867 walk_shadow_page_lockless_begin(vcpu); 2840 walk_shadow_page_lockless_begin(vcpu);
@@ -3209,6 +3182,7 @@ void kvm_mmu_sync_roots(struct kvm_vcpu *vcpu)
3209 mmu_sync_roots(vcpu); 3182 mmu_sync_roots(vcpu);
3210 spin_unlock(&vcpu->kvm->mmu_lock); 3183 spin_unlock(&vcpu->kvm->mmu_lock);
3211} 3184}
3185EXPORT_SYMBOL_GPL(kvm_mmu_sync_roots);
3212 3186
3213static gpa_t nonpaging_gva_to_gpa(struct kvm_vcpu *vcpu, gva_t vaddr, 3187static gpa_t nonpaging_gva_to_gpa(struct kvm_vcpu *vcpu, gva_t vaddr,
3214 u32 access, struct x86_exception *exception) 3188 u32 access, struct x86_exception *exception)
@@ -3478,6 +3452,7 @@ void kvm_mmu_flush_tlb(struct kvm_vcpu *vcpu)
3478 ++vcpu->stat.tlb_flush; 3452 ++vcpu->stat.tlb_flush;
3479 kvm_make_request(KVM_REQ_TLB_FLUSH, vcpu); 3453 kvm_make_request(KVM_REQ_TLB_FLUSH, vcpu);
3480} 3454}
3455EXPORT_SYMBOL_GPL(kvm_mmu_flush_tlb);
3481 3456
3482static void paging_new_cr3(struct kvm_vcpu *vcpu) 3457static void paging_new_cr3(struct kvm_vcpu *vcpu)
3483{ 3458{
@@ -3501,18 +3476,6 @@ static void paging_free(struct kvm_vcpu *vcpu)
3501 nonpaging_free(vcpu); 3476 nonpaging_free(vcpu);
3502} 3477}
3503 3478
3504static inline void protect_clean_gpte(unsigned *access, unsigned gpte)
3505{
3506 unsigned mask;
3507
3508 BUILD_BUG_ON(PT_WRITABLE_MASK != ACC_WRITE_MASK);
3509
3510 mask = (unsigned)~ACC_WRITE_MASK;
3511 /* Allow write access to dirty gptes */
3512 mask |= (gpte >> (PT_DIRTY_SHIFT - PT_WRITABLE_SHIFT)) & PT_WRITABLE_MASK;
3513 *access &= mask;
3514}
3515
3516static bool sync_mmio_spte(struct kvm *kvm, u64 *sptep, gfn_t gfn, 3479static bool sync_mmio_spte(struct kvm *kvm, u64 *sptep, gfn_t gfn,
3517 unsigned access, int *nr_present) 3480 unsigned access, int *nr_present)
3518{ 3481{
@@ -3530,16 +3493,6 @@ static bool sync_mmio_spte(struct kvm *kvm, u64 *sptep, gfn_t gfn,
3530 return false; 3493 return false;
3531} 3494}
3532 3495
3533static inline unsigned gpte_access(struct kvm_vcpu *vcpu, u64 gpte)
3534{
3535 unsigned access;
3536
3537 access = (gpte & (PT_WRITABLE_MASK | PT_USER_MASK)) | ACC_EXEC_MASK;
3538 access &= ~(gpte >> PT64_NX_SHIFT);
3539
3540 return access;
3541}
3542
3543static inline bool is_last_gpte(struct kvm_mmu *mmu, unsigned level, unsigned gpte) 3496static inline bool is_last_gpte(struct kvm_mmu *mmu, unsigned level, unsigned gpte)
3544{ 3497{
3545 unsigned index; 3498 unsigned index;
@@ -3549,6 +3502,11 @@ static inline bool is_last_gpte(struct kvm_mmu *mmu, unsigned level, unsigned gp
3549 return mmu->last_pte_bitmap & (1 << index); 3502 return mmu->last_pte_bitmap & (1 << index);
3550} 3503}
3551 3504
3505#define PTTYPE_EPT 18 /* arbitrary */
3506#define PTTYPE PTTYPE_EPT
3507#include "paging_tmpl.h"
3508#undef PTTYPE
3509
3552#define PTTYPE 64 3510#define PTTYPE 64
3553#include "paging_tmpl.h" 3511#include "paging_tmpl.h"
3554#undef PTTYPE 3512#undef PTTYPE
@@ -3563,6 +3521,8 @@ static void reset_rsvds_bits_mask(struct kvm_vcpu *vcpu,
3563 int maxphyaddr = cpuid_maxphyaddr(vcpu); 3521 int maxphyaddr = cpuid_maxphyaddr(vcpu);
3564 u64 exb_bit_rsvd = 0; 3522 u64 exb_bit_rsvd = 0;
3565 3523
3524 context->bad_mt_xwr = 0;
3525
3566 if (!context->nx) 3526 if (!context->nx)
3567 exb_bit_rsvd = rsvd_bits(63, 63); 3527 exb_bit_rsvd = rsvd_bits(63, 63);
3568 switch (context->root_level) { 3528 switch (context->root_level) {
@@ -3618,7 +3578,40 @@ static void reset_rsvds_bits_mask(struct kvm_vcpu *vcpu,
3618 } 3578 }
3619} 3579}
3620 3580
3621static void update_permission_bitmask(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu) 3581static void reset_rsvds_bits_mask_ept(struct kvm_vcpu *vcpu,
3582 struct kvm_mmu *context, bool execonly)
3583{
3584 int maxphyaddr = cpuid_maxphyaddr(vcpu);
3585 int pte;
3586
3587 context->rsvd_bits_mask[0][3] =
3588 rsvd_bits(maxphyaddr, 51) | rsvd_bits(3, 7);
3589 context->rsvd_bits_mask[0][2] =
3590 rsvd_bits(maxphyaddr, 51) | rsvd_bits(3, 6);
3591 context->rsvd_bits_mask[0][1] =
3592 rsvd_bits(maxphyaddr, 51) | rsvd_bits(3, 6);
3593 context->rsvd_bits_mask[0][0] = rsvd_bits(maxphyaddr, 51);
3594
3595 /* large page */
3596 context->rsvd_bits_mask[1][3] = context->rsvd_bits_mask[0][3];
3597 context->rsvd_bits_mask[1][2] =
3598 rsvd_bits(maxphyaddr, 51) | rsvd_bits(12, 29);
3599 context->rsvd_bits_mask[1][1] =
3600 rsvd_bits(maxphyaddr, 51) | rsvd_bits(12, 20);
3601 context->rsvd_bits_mask[1][0] = context->rsvd_bits_mask[0][0];
3602
3603 for (pte = 0; pte < 64; pte++) {
3604 int rwx_bits = pte & 7;
3605 int mt = pte >> 3;
3606 if (mt == 0x2 || mt == 0x3 || mt == 0x7 ||
3607 rwx_bits == 0x2 || rwx_bits == 0x6 ||
3608 (rwx_bits == 0x4 && !execonly))
3609 context->bad_mt_xwr |= (1ull << pte);
3610 }
3611}
3612
3613static void update_permission_bitmask(struct kvm_vcpu *vcpu,
3614 struct kvm_mmu *mmu, bool ept)
3622{ 3615{
3623 unsigned bit, byte, pfec; 3616 unsigned bit, byte, pfec;
3624 u8 map; 3617 u8 map;
@@ -3636,12 +3629,16 @@ static void update_permission_bitmask(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu
3636 w = bit & ACC_WRITE_MASK; 3629 w = bit & ACC_WRITE_MASK;
3637 u = bit & ACC_USER_MASK; 3630 u = bit & ACC_USER_MASK;
3638 3631
3639 /* Not really needed: !nx will cause pte.nx to fault */ 3632 if (!ept) {
3640 x |= !mmu->nx; 3633 /* Not really needed: !nx will cause pte.nx to fault */
3641 /* Allow supervisor writes if !cr0.wp */ 3634 x |= !mmu->nx;
3642 w |= !is_write_protection(vcpu) && !uf; 3635 /* Allow supervisor writes if !cr0.wp */
3643 /* Disallow supervisor fetches of user code if cr4.smep */ 3636 w |= !is_write_protection(vcpu) && !uf;
3644 x &= !(smep && u && !uf); 3637 /* Disallow supervisor fetches of user code if cr4.smep */
3638 x &= !(smep && u && !uf);
3639 } else
3640 /* Not really needed: no U/S accesses on ept */
3641 u = 1;
3645 3642
3646 fault = (ff && !x) || (uf && !u) || (wf && !w); 3643 fault = (ff && !x) || (uf && !u) || (wf && !w);
3647 map |= fault << bit; 3644 map |= fault << bit;
@@ -3676,7 +3673,7 @@ static int paging64_init_context_common(struct kvm_vcpu *vcpu,
3676 context->root_level = level; 3673 context->root_level = level;
3677 3674
3678 reset_rsvds_bits_mask(vcpu, context); 3675 reset_rsvds_bits_mask(vcpu, context);
3679 update_permission_bitmask(vcpu, context); 3676 update_permission_bitmask(vcpu, context, false);
3680 update_last_pte_bitmap(vcpu, context); 3677 update_last_pte_bitmap(vcpu, context);
3681 3678
3682 ASSERT(is_pae(vcpu)); 3679 ASSERT(is_pae(vcpu));
@@ -3706,7 +3703,7 @@ static int paging32_init_context(struct kvm_vcpu *vcpu,
3706 context->root_level = PT32_ROOT_LEVEL; 3703 context->root_level = PT32_ROOT_LEVEL;
3707 3704
3708 reset_rsvds_bits_mask(vcpu, context); 3705 reset_rsvds_bits_mask(vcpu, context);
3709 update_permission_bitmask(vcpu, context); 3706 update_permission_bitmask(vcpu, context, false);
3710 update_last_pte_bitmap(vcpu, context); 3707 update_last_pte_bitmap(vcpu, context);
3711 3708
3712 context->new_cr3 = paging_new_cr3; 3709 context->new_cr3 = paging_new_cr3;
@@ -3768,7 +3765,7 @@ static int init_kvm_tdp_mmu(struct kvm_vcpu *vcpu)
3768 context->gva_to_gpa = paging32_gva_to_gpa; 3765 context->gva_to_gpa = paging32_gva_to_gpa;
3769 } 3766 }
3770 3767
3771 update_permission_bitmask(vcpu, context); 3768 update_permission_bitmask(vcpu, context, false);
3772 update_last_pte_bitmap(vcpu, context); 3769 update_last_pte_bitmap(vcpu, context);
3773 3770
3774 return 0; 3771 return 0;
@@ -3800,6 +3797,33 @@ int kvm_init_shadow_mmu(struct kvm_vcpu *vcpu, struct kvm_mmu *context)
3800} 3797}
3801EXPORT_SYMBOL_GPL(kvm_init_shadow_mmu); 3798EXPORT_SYMBOL_GPL(kvm_init_shadow_mmu);
3802 3799
3800int kvm_init_shadow_ept_mmu(struct kvm_vcpu *vcpu, struct kvm_mmu *context,
3801 bool execonly)
3802{
3803 ASSERT(vcpu);
3804 ASSERT(!VALID_PAGE(vcpu->arch.mmu.root_hpa));
3805
3806 context->shadow_root_level = kvm_x86_ops->get_tdp_level();
3807
3808 context->nx = true;
3809 context->new_cr3 = paging_new_cr3;
3810 context->page_fault = ept_page_fault;
3811 context->gva_to_gpa = ept_gva_to_gpa;
3812 context->sync_page = ept_sync_page;
3813 context->invlpg = ept_invlpg;
3814 context->update_pte = ept_update_pte;
3815 context->free = paging_free;
3816 context->root_level = context->shadow_root_level;
3817 context->root_hpa = INVALID_PAGE;
3818 context->direct_map = false;
3819
3820 update_permission_bitmask(vcpu, context, true);
3821 reset_rsvds_bits_mask_ept(vcpu, context, execonly);
3822
3823 return 0;
3824}
3825EXPORT_SYMBOL_GPL(kvm_init_shadow_ept_mmu);
3826
3803static int init_kvm_softmmu(struct kvm_vcpu *vcpu) 3827static int init_kvm_softmmu(struct kvm_vcpu *vcpu)
3804{ 3828{
3805 int r = kvm_init_shadow_mmu(vcpu, vcpu->arch.walk_mmu); 3829 int r = kvm_init_shadow_mmu(vcpu, vcpu->arch.walk_mmu);
@@ -3847,7 +3871,7 @@ static int init_kvm_nested_mmu(struct kvm_vcpu *vcpu)
3847 g_context->gva_to_gpa = paging32_gva_to_gpa_nested; 3871 g_context->gva_to_gpa = paging32_gva_to_gpa_nested;
3848 } 3872 }
3849 3873
3850 update_permission_bitmask(vcpu, g_context); 3874 update_permission_bitmask(vcpu, g_context, false);
3851 update_last_pte_bitmap(vcpu, g_context); 3875 update_last_pte_bitmap(vcpu, g_context);
3852 3876
3853 return 0; 3877 return 0;
@@ -3923,8 +3947,8 @@ static bool need_remote_flush(u64 old, u64 new)
3923 return true; 3947 return true;
3924 if ((old ^ new) & PT64_BASE_ADDR_MASK) 3948 if ((old ^ new) & PT64_BASE_ADDR_MASK)
3925 return true; 3949 return true;
3926 old ^= PT64_NX_MASK; 3950 old ^= shadow_nx_mask;
3927 new ^= PT64_NX_MASK; 3951 new ^= shadow_nx_mask;
3928 return (old & ~new & PT64_PERM_MASK) != 0; 3952 return (old & ~new & PT64_PERM_MASK) != 0;
3929} 3953}
3930 3954
@@ -4182,7 +4206,7 @@ int kvm_mmu_page_fault(struct kvm_vcpu *vcpu, gva_t cr2, u32 error_code,
4182 switch (er) { 4206 switch (er) {
4183 case EMULATE_DONE: 4207 case EMULATE_DONE:
4184 return 1; 4208 return 1;
4185 case EMULATE_DO_MMIO: 4209 case EMULATE_USER_EXIT:
4186 ++vcpu->stat.mmio_exits; 4210 ++vcpu->stat.mmio_exits;
4187 /* fall through */ 4211 /* fall through */
4188 case EMULATE_FAIL: 4212 case EMULATE_FAIL:
@@ -4390,23 +4414,19 @@ void kvm_mmu_invalidate_mmio_sptes(struct kvm *kvm)
4390 /* 4414 /*
4391 * The very rare case: if the generation-number is round, 4415 * The very rare case: if the generation-number is round,
4392 * zap all shadow pages. 4416 * zap all shadow pages.
4393 *
4394 * The max value is MMIO_MAX_GEN - 1 since it is not called
4395 * when mark memslot invalid.
4396 */ 4417 */
4397 if (unlikely(kvm_current_mmio_generation(kvm) >= (MMIO_MAX_GEN - 1))) { 4418 if (unlikely(kvm_current_mmio_generation(kvm) >= MMIO_MAX_GEN)) {
4398 printk_ratelimited(KERN_INFO "kvm: zapping shadow pages for mmio generation wraparound\n"); 4419 printk_ratelimited(KERN_INFO "kvm: zapping shadow pages for mmio generation wraparound\n");
4399 kvm_mmu_invalidate_zap_all_pages(kvm); 4420 kvm_mmu_invalidate_zap_all_pages(kvm);
4400 } 4421 }
4401} 4422}
4402 4423
4403static int mmu_shrink(struct shrinker *shrink, struct shrink_control *sc) 4424static unsigned long
4425mmu_shrink_scan(struct shrinker *shrink, struct shrink_control *sc)
4404{ 4426{
4405 struct kvm *kvm; 4427 struct kvm *kvm;
4406 int nr_to_scan = sc->nr_to_scan; 4428 int nr_to_scan = sc->nr_to_scan;
4407 4429 unsigned long freed = 0;
4408 if (nr_to_scan == 0)
4409 goto out;
4410 4430
4411 raw_spin_lock(&kvm_lock); 4431 raw_spin_lock(&kvm_lock);
4412 4432
@@ -4441,25 +4461,37 @@ static int mmu_shrink(struct shrinker *shrink, struct shrink_control *sc)
4441 goto unlock; 4461 goto unlock;
4442 } 4462 }
4443 4463
4444 prepare_zap_oldest_mmu_page(kvm, &invalid_list); 4464 if (prepare_zap_oldest_mmu_page(kvm, &invalid_list))
4465 freed++;
4445 kvm_mmu_commit_zap_page(kvm, &invalid_list); 4466 kvm_mmu_commit_zap_page(kvm, &invalid_list);
4446 4467
4447unlock: 4468unlock:
4448 spin_unlock(&kvm->mmu_lock); 4469 spin_unlock(&kvm->mmu_lock);
4449 srcu_read_unlock(&kvm->srcu, idx); 4470 srcu_read_unlock(&kvm->srcu, idx);
4450 4471
4472 /*
4473 * unfair on small ones
4474 * per-vm shrinkers cry out
4475 * sadness comes quickly
4476 */
4451 list_move_tail(&kvm->vm_list, &vm_list); 4477 list_move_tail(&kvm->vm_list, &vm_list);
4452 break; 4478 break;
4453 } 4479 }
4454 4480
4455 raw_spin_unlock(&kvm_lock); 4481 raw_spin_unlock(&kvm_lock);
4482 return freed;
4456 4483
4457out: 4484}
4485
4486static unsigned long
4487mmu_shrink_count(struct shrinker *shrink, struct shrink_control *sc)
4488{
4458 return percpu_counter_read_positive(&kvm_total_used_mmu_pages); 4489 return percpu_counter_read_positive(&kvm_total_used_mmu_pages);
4459} 4490}
4460 4491
4461static struct shrinker mmu_shrinker = { 4492static struct shrinker mmu_shrinker = {
4462 .shrink = mmu_shrink, 4493 .count_objects = mmu_shrink_count,
4494 .scan_objects = mmu_shrink_scan,
4463 .seeks = DEFAULT_SEEKS * 10, 4495 .seeks = DEFAULT_SEEKS * 10,
4464}; 4496};
4465 4497
diff --git a/arch/x86/kvm/mmu.h b/arch/x86/kvm/mmu.h
index 5b59c573aba7..77e044a0f5f7 100644
--- a/arch/x86/kvm/mmu.h
+++ b/arch/x86/kvm/mmu.h
@@ -71,6 +71,8 @@ enum {
71 71
72int handle_mmio_page_fault_common(struct kvm_vcpu *vcpu, u64 addr, bool direct); 72int handle_mmio_page_fault_common(struct kvm_vcpu *vcpu, u64 addr, bool direct);
73int kvm_init_shadow_mmu(struct kvm_vcpu *vcpu, struct kvm_mmu *context); 73int kvm_init_shadow_mmu(struct kvm_vcpu *vcpu, struct kvm_mmu *context);
74int kvm_init_shadow_ept_mmu(struct kvm_vcpu *vcpu, struct kvm_mmu *context,
75 bool execonly);
74 76
75static inline unsigned int kvm_mmu_available_pages(struct kvm *kvm) 77static inline unsigned int kvm_mmu_available_pages(struct kvm *kvm)
76{ 78{
diff --git a/arch/x86/kvm/paging_tmpl.h b/arch/x86/kvm/paging_tmpl.h
index 7769699d48a8..ad75d77999d0 100644
--- a/arch/x86/kvm/paging_tmpl.h
+++ b/arch/x86/kvm/paging_tmpl.h
@@ -23,6 +23,13 @@
23 * so the code in this file is compiled twice, once per pte size. 23 * so the code in this file is compiled twice, once per pte size.
24 */ 24 */
25 25
26/*
27 * This is used to catch non optimized PT_GUEST_(DIRTY|ACCESS)_SHIFT macro
28 * uses for EPT without A/D paging type.
29 */
30extern u64 __pure __using_nonexistent_pte_bit(void)
31 __compiletime_error("wrong use of PT_GUEST_(DIRTY|ACCESS)_SHIFT");
32
26#if PTTYPE == 64 33#if PTTYPE == 64
27 #define pt_element_t u64 34 #define pt_element_t u64
28 #define guest_walker guest_walker64 35 #define guest_walker guest_walker64
@@ -32,6 +39,10 @@
32 #define PT_LVL_OFFSET_MASK(lvl) PT64_LVL_OFFSET_MASK(lvl) 39 #define PT_LVL_OFFSET_MASK(lvl) PT64_LVL_OFFSET_MASK(lvl)
33 #define PT_INDEX(addr, level) PT64_INDEX(addr, level) 40 #define PT_INDEX(addr, level) PT64_INDEX(addr, level)
34 #define PT_LEVEL_BITS PT64_LEVEL_BITS 41 #define PT_LEVEL_BITS PT64_LEVEL_BITS
42 #define PT_GUEST_ACCESSED_MASK PT_ACCESSED_MASK
43 #define PT_GUEST_DIRTY_MASK PT_DIRTY_MASK
44 #define PT_GUEST_DIRTY_SHIFT PT_DIRTY_SHIFT
45 #define PT_GUEST_ACCESSED_SHIFT PT_ACCESSED_SHIFT
35 #ifdef CONFIG_X86_64 46 #ifdef CONFIG_X86_64
36 #define PT_MAX_FULL_LEVELS 4 47 #define PT_MAX_FULL_LEVELS 4
37 #define CMPXCHG cmpxchg 48 #define CMPXCHG cmpxchg
@@ -49,7 +60,26 @@
49 #define PT_INDEX(addr, level) PT32_INDEX(addr, level) 60 #define PT_INDEX(addr, level) PT32_INDEX(addr, level)
50 #define PT_LEVEL_BITS PT32_LEVEL_BITS 61 #define PT_LEVEL_BITS PT32_LEVEL_BITS
51 #define PT_MAX_FULL_LEVELS 2 62 #define PT_MAX_FULL_LEVELS 2
63 #define PT_GUEST_ACCESSED_MASK PT_ACCESSED_MASK
64 #define PT_GUEST_DIRTY_MASK PT_DIRTY_MASK
65 #define PT_GUEST_DIRTY_SHIFT PT_DIRTY_SHIFT
66 #define PT_GUEST_ACCESSED_SHIFT PT_ACCESSED_SHIFT
52 #define CMPXCHG cmpxchg 67 #define CMPXCHG cmpxchg
68#elif PTTYPE == PTTYPE_EPT
69 #define pt_element_t u64
70 #define guest_walker guest_walkerEPT
71 #define FNAME(name) ept_##name
72 #define PT_BASE_ADDR_MASK PT64_BASE_ADDR_MASK
73 #define PT_LVL_ADDR_MASK(lvl) PT64_LVL_ADDR_MASK(lvl)
74 #define PT_LVL_OFFSET_MASK(lvl) PT64_LVL_OFFSET_MASK(lvl)
75 #define PT_INDEX(addr, level) PT64_INDEX(addr, level)
76 #define PT_LEVEL_BITS PT64_LEVEL_BITS
77 #define PT_GUEST_ACCESSED_MASK 0
78 #define PT_GUEST_DIRTY_MASK 0
79 #define PT_GUEST_DIRTY_SHIFT __using_nonexistent_pte_bit()
80 #define PT_GUEST_ACCESSED_SHIFT __using_nonexistent_pte_bit()
81 #define CMPXCHG cmpxchg64
82 #define PT_MAX_FULL_LEVELS 4
53#else 83#else
54 #error Invalid PTTYPE value 84 #error Invalid PTTYPE value
55#endif 85#endif
@@ -69,6 +99,7 @@ struct guest_walker {
69 pt_element_t prefetch_ptes[PTE_PREFETCH_NUM]; 99 pt_element_t prefetch_ptes[PTE_PREFETCH_NUM];
70 gpa_t pte_gpa[PT_MAX_FULL_LEVELS]; 100 gpa_t pte_gpa[PT_MAX_FULL_LEVELS];
71 pt_element_t __user *ptep_user[PT_MAX_FULL_LEVELS]; 101 pt_element_t __user *ptep_user[PT_MAX_FULL_LEVELS];
102 bool pte_writable[PT_MAX_FULL_LEVELS];
72 unsigned pt_access; 103 unsigned pt_access;
73 unsigned pte_access; 104 unsigned pte_access;
74 gfn_t gfn; 105 gfn_t gfn;
@@ -80,6 +111,40 @@ static gfn_t gpte_to_gfn_lvl(pt_element_t gpte, int lvl)
80 return (gpte & PT_LVL_ADDR_MASK(lvl)) >> PAGE_SHIFT; 111 return (gpte & PT_LVL_ADDR_MASK(lvl)) >> PAGE_SHIFT;
81} 112}
82 113
114static inline void FNAME(protect_clean_gpte)(unsigned *access, unsigned gpte)
115{
116 unsigned mask;
117
118 /* dirty bit is not supported, so no need to track it */
119 if (!PT_GUEST_DIRTY_MASK)
120 return;
121
122 BUILD_BUG_ON(PT_WRITABLE_MASK != ACC_WRITE_MASK);
123
124 mask = (unsigned)~ACC_WRITE_MASK;
125 /* Allow write access to dirty gptes */
126 mask |= (gpte >> (PT_GUEST_DIRTY_SHIFT - PT_WRITABLE_SHIFT)) &
127 PT_WRITABLE_MASK;
128 *access &= mask;
129}
130
131static bool FNAME(is_rsvd_bits_set)(struct kvm_mmu *mmu, u64 gpte, int level)
132{
133 int bit7 = (gpte >> 7) & 1, low6 = gpte & 0x3f;
134
135 return (gpte & mmu->rsvd_bits_mask[bit7][level-1]) |
136 ((mmu->bad_mt_xwr & (1ull << low6)) != 0);
137}
138
139static inline int FNAME(is_present_gpte)(unsigned long pte)
140{
141#if PTTYPE != PTTYPE_EPT
142 return is_present_gpte(pte);
143#else
144 return pte & 7;
145#endif
146}
147
83static int FNAME(cmpxchg_gpte)(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, 148static int FNAME(cmpxchg_gpte)(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
84 pt_element_t __user *ptep_user, unsigned index, 149 pt_element_t __user *ptep_user, unsigned index,
85 pt_element_t orig_pte, pt_element_t new_pte) 150 pt_element_t orig_pte, pt_element_t new_pte)
@@ -103,6 +168,42 @@ static int FNAME(cmpxchg_gpte)(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
103 return (ret != orig_pte); 168 return (ret != orig_pte);
104} 169}
105 170
171static bool FNAME(prefetch_invalid_gpte)(struct kvm_vcpu *vcpu,
172 struct kvm_mmu_page *sp, u64 *spte,
173 u64 gpte)
174{
175 if (FNAME(is_rsvd_bits_set)(&vcpu->arch.mmu, gpte, PT_PAGE_TABLE_LEVEL))
176 goto no_present;
177
178 if (!FNAME(is_present_gpte)(gpte))
179 goto no_present;
180
181 /* if accessed bit is not supported prefetch non accessed gpte */
182 if (PT_GUEST_ACCESSED_MASK && !(gpte & PT_GUEST_ACCESSED_MASK))
183 goto no_present;
184
185 return false;
186
187no_present:
188 drop_spte(vcpu->kvm, spte);
189 return true;
190}
191
192static inline unsigned FNAME(gpte_access)(struct kvm_vcpu *vcpu, u64 gpte)
193{
194 unsigned access;
195#if PTTYPE == PTTYPE_EPT
196 access = ((gpte & VMX_EPT_WRITABLE_MASK) ? ACC_WRITE_MASK : 0) |
197 ((gpte & VMX_EPT_EXECUTABLE_MASK) ? ACC_EXEC_MASK : 0) |
198 ACC_USER_MASK;
199#else
200 access = (gpte & (PT_WRITABLE_MASK | PT_USER_MASK)) | ACC_EXEC_MASK;
201 access &= ~(gpte >> PT64_NX_SHIFT);
202#endif
203
204 return access;
205}
206
106static int FNAME(update_accessed_dirty_bits)(struct kvm_vcpu *vcpu, 207static int FNAME(update_accessed_dirty_bits)(struct kvm_vcpu *vcpu,
107 struct kvm_mmu *mmu, 208 struct kvm_mmu *mmu,
108 struct guest_walker *walker, 209 struct guest_walker *walker,
@@ -114,22 +215,43 @@ static int FNAME(update_accessed_dirty_bits)(struct kvm_vcpu *vcpu,
114 gfn_t table_gfn; 215 gfn_t table_gfn;
115 int ret; 216 int ret;
116 217
218 /* dirty/accessed bits are not supported, so no need to update them */
219 if (!PT_GUEST_DIRTY_MASK)
220 return 0;
221
117 for (level = walker->max_level; level >= walker->level; --level) { 222 for (level = walker->max_level; level >= walker->level; --level) {
118 pte = orig_pte = walker->ptes[level - 1]; 223 pte = orig_pte = walker->ptes[level - 1];
119 table_gfn = walker->table_gfn[level - 1]; 224 table_gfn = walker->table_gfn[level - 1];
120 ptep_user = walker->ptep_user[level - 1]; 225 ptep_user = walker->ptep_user[level - 1];
121 index = offset_in_page(ptep_user) / sizeof(pt_element_t); 226 index = offset_in_page(ptep_user) / sizeof(pt_element_t);
122 if (!(pte & PT_ACCESSED_MASK)) { 227 if (!(pte & PT_GUEST_ACCESSED_MASK)) {
123 trace_kvm_mmu_set_accessed_bit(table_gfn, index, sizeof(pte)); 228 trace_kvm_mmu_set_accessed_bit(table_gfn, index, sizeof(pte));
124 pte |= PT_ACCESSED_MASK; 229 pte |= PT_GUEST_ACCESSED_MASK;
125 } 230 }
126 if (level == walker->level && write_fault && !is_dirty_gpte(pte)) { 231 if (level == walker->level && write_fault &&
232 !(pte & PT_GUEST_DIRTY_MASK)) {
127 trace_kvm_mmu_set_dirty_bit(table_gfn, index, sizeof(pte)); 233 trace_kvm_mmu_set_dirty_bit(table_gfn, index, sizeof(pte));
128 pte |= PT_DIRTY_MASK; 234 pte |= PT_GUEST_DIRTY_MASK;
129 } 235 }
130 if (pte == orig_pte) 236 if (pte == orig_pte)
131 continue; 237 continue;
132 238
239 /*
240 * If the slot is read-only, simply do not process the accessed
241 * and dirty bits. This is the correct thing to do if the slot
242 * is ROM, and page tables in read-as-ROM/write-as-MMIO slots
243 * are only supported if the accessed and dirty bits are already
244 * set in the ROM (so that MMIO writes are never needed).
245 *
246 * Note that NPT does not allow this at all and faults, since
247 * it always wants nested page table entries for the guest
248 * page tables to be writable. And EPT works but will simply
249 * overwrite the read-only memory to set the accessed and dirty
250 * bits.
251 */
252 if (unlikely(!walker->pte_writable[level - 1]))
253 continue;
254
133 ret = FNAME(cmpxchg_gpte)(vcpu, mmu, ptep_user, index, orig_pte, pte); 255 ret = FNAME(cmpxchg_gpte)(vcpu, mmu, ptep_user, index, orig_pte, pte);
134 if (ret) 256 if (ret)
135 return ret; 257 return ret;
@@ -170,7 +292,7 @@ retry_walk:
170 if (walker->level == PT32E_ROOT_LEVEL) { 292 if (walker->level == PT32E_ROOT_LEVEL) {
171 pte = mmu->get_pdptr(vcpu, (addr >> 30) & 3); 293 pte = mmu->get_pdptr(vcpu, (addr >> 30) & 3);
172 trace_kvm_mmu_paging_element(pte, walker->level); 294 trace_kvm_mmu_paging_element(pte, walker->level);
173 if (!is_present_gpte(pte)) 295 if (!FNAME(is_present_gpte)(pte))
174 goto error; 296 goto error;
175 --walker->level; 297 --walker->level;
176 } 298 }
@@ -179,7 +301,7 @@ retry_walk:
179 ASSERT((!is_long_mode(vcpu) && is_pae(vcpu)) || 301 ASSERT((!is_long_mode(vcpu) && is_pae(vcpu)) ||
180 (mmu->get_cr3(vcpu) & CR3_NONPAE_RESERVED_BITS) == 0); 302 (mmu->get_cr3(vcpu) & CR3_NONPAE_RESERVED_BITS) == 0);
181 303
182 accessed_dirty = PT_ACCESSED_MASK; 304 accessed_dirty = PT_GUEST_ACCESSED_MASK;
183 pt_access = pte_access = ACC_ALL; 305 pt_access = pte_access = ACC_ALL;
184 ++walker->level; 306 ++walker->level;
185 307
@@ -204,7 +326,8 @@ retry_walk:
204 goto error; 326 goto error;
205 real_gfn = gpa_to_gfn(real_gfn); 327 real_gfn = gpa_to_gfn(real_gfn);
206 328
207 host_addr = gfn_to_hva(vcpu->kvm, real_gfn); 329 host_addr = gfn_to_hva_prot(vcpu->kvm, real_gfn,
330 &walker->pte_writable[walker->level - 1]);
208 if (unlikely(kvm_is_error_hva(host_addr))) 331 if (unlikely(kvm_is_error_hva(host_addr)))
209 goto error; 332 goto error;
210 333
@@ -215,17 +338,17 @@ retry_walk:
215 338
216 trace_kvm_mmu_paging_element(pte, walker->level); 339 trace_kvm_mmu_paging_element(pte, walker->level);
217 340
218 if (unlikely(!is_present_gpte(pte))) 341 if (unlikely(!FNAME(is_present_gpte)(pte)))
219 goto error; 342 goto error;
220 343
221 if (unlikely(is_rsvd_bits_set(&vcpu->arch.mmu, pte, 344 if (unlikely(FNAME(is_rsvd_bits_set)(mmu, pte,
222 walker->level))) { 345 walker->level))) {
223 errcode |= PFERR_RSVD_MASK | PFERR_PRESENT_MASK; 346 errcode |= PFERR_RSVD_MASK | PFERR_PRESENT_MASK;
224 goto error; 347 goto error;
225 } 348 }
226 349
227 accessed_dirty &= pte; 350 accessed_dirty &= pte;
228 pte_access = pt_access & gpte_access(vcpu, pte); 351 pte_access = pt_access & FNAME(gpte_access)(vcpu, pte);
229 352
230 walker->ptes[walker->level - 1] = pte; 353 walker->ptes[walker->level - 1] = pte;
231 } while (!is_last_gpte(mmu, walker->level, pte)); 354 } while (!is_last_gpte(mmu, walker->level, pte));
@@ -248,13 +371,15 @@ retry_walk:
248 walker->gfn = real_gpa >> PAGE_SHIFT; 371 walker->gfn = real_gpa >> PAGE_SHIFT;
249 372
250 if (!write_fault) 373 if (!write_fault)
251 protect_clean_gpte(&pte_access, pte); 374 FNAME(protect_clean_gpte)(&pte_access, pte);
252 else 375 else
253 /* 376 /*
254 * On a write fault, fold the dirty bit into accessed_dirty by 377 * On a write fault, fold the dirty bit into accessed_dirty.
255 * shifting it one place right. 378 * For modes without A/D bits support accessed_dirty will be
379 * always clear.
256 */ 380 */
257 accessed_dirty &= pte >> (PT_DIRTY_SHIFT - PT_ACCESSED_SHIFT); 381 accessed_dirty &= pte >>
382 (PT_GUEST_DIRTY_SHIFT - PT_GUEST_ACCESSED_SHIFT);
258 383
259 if (unlikely(!accessed_dirty)) { 384 if (unlikely(!accessed_dirty)) {
260 ret = FNAME(update_accessed_dirty_bits)(vcpu, mmu, walker, write_fault); 385 ret = FNAME(update_accessed_dirty_bits)(vcpu, mmu, walker, write_fault);
@@ -279,6 +404,25 @@ error:
279 walker->fault.vector = PF_VECTOR; 404 walker->fault.vector = PF_VECTOR;
280 walker->fault.error_code_valid = true; 405 walker->fault.error_code_valid = true;
281 walker->fault.error_code = errcode; 406 walker->fault.error_code = errcode;
407
408#if PTTYPE == PTTYPE_EPT
409 /*
410 * Use PFERR_RSVD_MASK in error_code to to tell if EPT
411 * misconfiguration requires to be injected. The detection is
412 * done by is_rsvd_bits_set() above.
413 *
414 * We set up the value of exit_qualification to inject:
415 * [2:0] - Derive from [2:0] of real exit_qualification at EPT violation
416 * [5:3] - Calculated by the page walk of the guest EPT page tables
417 * [7:8] - Derived from [7:8] of real exit_qualification
418 *
419 * The other bits are set to 0.
420 */
421 if (!(errcode & PFERR_RSVD_MASK)) {
422 vcpu->arch.exit_qualification &= 0x187;
423 vcpu->arch.exit_qualification |= ((pt_access & pte) & 0x7) << 3;
424 }
425#endif
282 walker->fault.address = addr; 426 walker->fault.address = addr;
283 walker->fault.nested_page_fault = mmu != vcpu->arch.walk_mmu; 427 walker->fault.nested_page_fault = mmu != vcpu->arch.walk_mmu;
284 428
@@ -293,6 +437,7 @@ static int FNAME(walk_addr)(struct guest_walker *walker,
293 access); 437 access);
294} 438}
295 439
440#if PTTYPE != PTTYPE_EPT
296static int FNAME(walk_addr_nested)(struct guest_walker *walker, 441static int FNAME(walk_addr_nested)(struct guest_walker *walker,
297 struct kvm_vcpu *vcpu, gva_t addr, 442 struct kvm_vcpu *vcpu, gva_t addr,
298 u32 access) 443 u32 access)
@@ -300,6 +445,7 @@ static int FNAME(walk_addr_nested)(struct guest_walker *walker,
300 return FNAME(walk_addr_generic)(walker, vcpu, &vcpu->arch.nested_mmu, 445 return FNAME(walk_addr_generic)(walker, vcpu, &vcpu->arch.nested_mmu,
301 addr, access); 446 addr, access);
302} 447}
448#endif
303 449
304static bool 450static bool
305FNAME(prefetch_gpte)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp, 451FNAME(prefetch_gpte)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,
@@ -309,14 +455,14 @@ FNAME(prefetch_gpte)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp,
309 gfn_t gfn; 455 gfn_t gfn;
310 pfn_t pfn; 456 pfn_t pfn;
311 457
312 if (prefetch_invalid_gpte(vcpu, sp, spte, gpte)) 458 if (FNAME(prefetch_invalid_gpte)(vcpu, sp, spte, gpte))
313 return false; 459 return false;
314 460
315 pgprintk("%s: gpte %llx spte %p\n", __func__, (u64)gpte, spte); 461 pgprintk("%s: gpte %llx spte %p\n", __func__, (u64)gpte, spte);
316 462
317 gfn = gpte_to_gfn(gpte); 463 gfn = gpte_to_gfn(gpte);
318 pte_access = sp->role.access & gpte_access(vcpu, gpte); 464 pte_access = sp->role.access & FNAME(gpte_access)(vcpu, gpte);
319 protect_clean_gpte(&pte_access, gpte); 465 FNAME(protect_clean_gpte)(&pte_access, gpte);
320 pfn = pte_prefetch_gfn_to_pfn(vcpu, gfn, 466 pfn = pte_prefetch_gfn_to_pfn(vcpu, gfn,
321 no_dirty_log && (pte_access & ACC_WRITE_MASK)); 467 no_dirty_log && (pte_access & ACC_WRITE_MASK));
322 if (is_error_pfn(pfn)) 468 if (is_error_pfn(pfn))
@@ -446,7 +592,7 @@ static int FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr,
446 goto out_gpte_changed; 592 goto out_gpte_changed;
447 593
448 if (sp) 594 if (sp)
449 link_shadow_page(it.sptep, sp); 595 link_shadow_page(it.sptep, sp, PT_GUEST_ACCESSED_MASK);
450 } 596 }
451 597
452 for (; 598 for (;
@@ -466,7 +612,7 @@ static int FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr,
466 612
467 sp = kvm_mmu_get_page(vcpu, direct_gfn, addr, it.level-1, 613 sp = kvm_mmu_get_page(vcpu, direct_gfn, addr, it.level-1,
468 true, direct_access, it.sptep); 614 true, direct_access, it.sptep);
469 link_shadow_page(it.sptep, sp); 615 link_shadow_page(it.sptep, sp, PT_GUEST_ACCESSED_MASK);
470 } 616 }
471 617
472 clear_sp_write_flooding_count(it.sptep); 618 clear_sp_write_flooding_count(it.sptep);
@@ -727,6 +873,7 @@ static gpa_t FNAME(gva_to_gpa)(struct kvm_vcpu *vcpu, gva_t vaddr, u32 access,
727 return gpa; 873 return gpa;
728} 874}
729 875
876#if PTTYPE != PTTYPE_EPT
730static gpa_t FNAME(gva_to_gpa_nested)(struct kvm_vcpu *vcpu, gva_t vaddr, 877static gpa_t FNAME(gva_to_gpa_nested)(struct kvm_vcpu *vcpu, gva_t vaddr,
731 u32 access, 878 u32 access,
732 struct x86_exception *exception) 879 struct x86_exception *exception)
@@ -745,6 +892,7 @@ static gpa_t FNAME(gva_to_gpa_nested)(struct kvm_vcpu *vcpu, gva_t vaddr,
745 892
746 return gpa; 893 return gpa;
747} 894}
895#endif
748 896
749/* 897/*
750 * Using the cached information from sp->gfns is safe because: 898 * Using the cached information from sp->gfns is safe because:
@@ -785,15 +933,15 @@ static int FNAME(sync_page)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp)
785 sizeof(pt_element_t))) 933 sizeof(pt_element_t)))
786 return -EINVAL; 934 return -EINVAL;
787 935
788 if (prefetch_invalid_gpte(vcpu, sp, &sp->spt[i], gpte)) { 936 if (FNAME(prefetch_invalid_gpte)(vcpu, sp, &sp->spt[i], gpte)) {
789 vcpu->kvm->tlbs_dirty++; 937 vcpu->kvm->tlbs_dirty++;
790 continue; 938 continue;
791 } 939 }
792 940
793 gfn = gpte_to_gfn(gpte); 941 gfn = gpte_to_gfn(gpte);
794 pte_access = sp->role.access; 942 pte_access = sp->role.access;
795 pte_access &= gpte_access(vcpu, gpte); 943 pte_access &= FNAME(gpte_access)(vcpu, gpte);
796 protect_clean_gpte(&pte_access, gpte); 944 FNAME(protect_clean_gpte)(&pte_access, gpte);
797 945
798 if (sync_mmio_spte(vcpu->kvm, &sp->spt[i], gfn, pte_access, 946 if (sync_mmio_spte(vcpu->kvm, &sp->spt[i], gfn, pte_access,
799 &nr_present)) 947 &nr_present))
@@ -830,3 +978,7 @@ static int FNAME(sync_page)(struct kvm_vcpu *vcpu, struct kvm_mmu_page *sp)
830#undef gpte_to_gfn 978#undef gpte_to_gfn
831#undef gpte_to_gfn_lvl 979#undef gpte_to_gfn_lvl
832#undef CMPXCHG 980#undef CMPXCHG
981#undef PT_GUEST_ACCESSED_MASK
982#undef PT_GUEST_DIRTY_MASK
983#undef PT_GUEST_DIRTY_SHIFT
984#undef PT_GUEST_ACCESSED_SHIFT
diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c
index c53e797e7369..5c4f63151b4d 100644
--- a/arch/x86/kvm/pmu.c
+++ b/arch/x86/kvm/pmu.c
@@ -160,7 +160,7 @@ static void stop_counter(struct kvm_pmc *pmc)
160 160
161static void reprogram_counter(struct kvm_pmc *pmc, u32 type, 161static void reprogram_counter(struct kvm_pmc *pmc, u32 type,
162 unsigned config, bool exclude_user, bool exclude_kernel, 162 unsigned config, bool exclude_user, bool exclude_kernel,
163 bool intr) 163 bool intr, bool in_tx, bool in_tx_cp)
164{ 164{
165 struct perf_event *event; 165 struct perf_event *event;
166 struct perf_event_attr attr = { 166 struct perf_event_attr attr = {
@@ -173,6 +173,10 @@ static void reprogram_counter(struct kvm_pmc *pmc, u32 type,
173 .exclude_kernel = exclude_kernel, 173 .exclude_kernel = exclude_kernel,
174 .config = config, 174 .config = config,
175 }; 175 };
176 if (in_tx)
177 attr.config |= HSW_IN_TX;
178 if (in_tx_cp)
179 attr.config |= HSW_IN_TX_CHECKPOINTED;
176 180
177 attr.sample_period = (-pmc->counter) & pmc_bitmask(pmc); 181 attr.sample_period = (-pmc->counter) & pmc_bitmask(pmc);
178 182
@@ -226,7 +230,9 @@ static void reprogram_gp_counter(struct kvm_pmc *pmc, u64 eventsel)
226 230
227 if (!(eventsel & (ARCH_PERFMON_EVENTSEL_EDGE | 231 if (!(eventsel & (ARCH_PERFMON_EVENTSEL_EDGE |
228 ARCH_PERFMON_EVENTSEL_INV | 232 ARCH_PERFMON_EVENTSEL_INV |
229 ARCH_PERFMON_EVENTSEL_CMASK))) { 233 ARCH_PERFMON_EVENTSEL_CMASK |
234 HSW_IN_TX |
235 HSW_IN_TX_CHECKPOINTED))) {
230 config = find_arch_event(&pmc->vcpu->arch.pmu, event_select, 236 config = find_arch_event(&pmc->vcpu->arch.pmu, event_select,
231 unit_mask); 237 unit_mask);
232 if (config != PERF_COUNT_HW_MAX) 238 if (config != PERF_COUNT_HW_MAX)
@@ -239,7 +245,9 @@ static void reprogram_gp_counter(struct kvm_pmc *pmc, u64 eventsel)
239 reprogram_counter(pmc, type, config, 245 reprogram_counter(pmc, type, config,
240 !(eventsel & ARCH_PERFMON_EVENTSEL_USR), 246 !(eventsel & ARCH_PERFMON_EVENTSEL_USR),
241 !(eventsel & ARCH_PERFMON_EVENTSEL_OS), 247 !(eventsel & ARCH_PERFMON_EVENTSEL_OS),
242 eventsel & ARCH_PERFMON_EVENTSEL_INT); 248 eventsel & ARCH_PERFMON_EVENTSEL_INT,
249 (eventsel & HSW_IN_TX),
250 (eventsel & HSW_IN_TX_CHECKPOINTED));
243} 251}
244 252
245static void reprogram_fixed_counter(struct kvm_pmc *pmc, u8 en_pmi, int idx) 253static void reprogram_fixed_counter(struct kvm_pmc *pmc, u8 en_pmi, int idx)
@@ -256,7 +264,7 @@ static void reprogram_fixed_counter(struct kvm_pmc *pmc, u8 en_pmi, int idx)
256 arch_events[fixed_pmc_events[idx]].event_type, 264 arch_events[fixed_pmc_events[idx]].event_type,
257 !(en & 0x2), /* exclude user */ 265 !(en & 0x2), /* exclude user */
258 !(en & 0x1), /* exclude kernel */ 266 !(en & 0x1), /* exclude kernel */
259 pmi); 267 pmi, false, false);
260} 268}
261 269
262static inline u8 fixed_en_pmi(u64 ctrl, int idx) 270static inline u8 fixed_en_pmi(u64 ctrl, int idx)
@@ -408,7 +416,7 @@ int kvm_pmu_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
408 } else if ((pmc = get_gp_pmc(pmu, index, MSR_P6_EVNTSEL0))) { 416 } else if ((pmc = get_gp_pmc(pmu, index, MSR_P6_EVNTSEL0))) {
409 if (data == pmc->eventsel) 417 if (data == pmc->eventsel)
410 return 0; 418 return 0;
411 if (!(data & 0xffffffff00200000ull)) { 419 if (!(data & pmu->reserved_bits)) {
412 reprogram_gp_counter(pmc, data); 420 reprogram_gp_counter(pmc, data);
413 return 0; 421 return 0;
414 } 422 }
@@ -450,6 +458,7 @@ void kvm_pmu_cpuid_update(struct kvm_vcpu *vcpu)
450 pmu->counter_bitmask[KVM_PMC_GP] = 0; 458 pmu->counter_bitmask[KVM_PMC_GP] = 0;
451 pmu->counter_bitmask[KVM_PMC_FIXED] = 0; 459 pmu->counter_bitmask[KVM_PMC_FIXED] = 0;
452 pmu->version = 0; 460 pmu->version = 0;
461 pmu->reserved_bits = 0xffffffff00200000ull;
453 462
454 entry = kvm_find_cpuid_entry(vcpu, 0xa, 0); 463 entry = kvm_find_cpuid_entry(vcpu, 0xa, 0);
455 if (!entry) 464 if (!entry)
@@ -478,6 +487,12 @@ void kvm_pmu_cpuid_update(struct kvm_vcpu *vcpu)
478 pmu->global_ctrl = ((1 << pmu->nr_arch_gp_counters) - 1) | 487 pmu->global_ctrl = ((1 << pmu->nr_arch_gp_counters) - 1) |
479 (((1ull << pmu->nr_arch_fixed_counters) - 1) << INTEL_PMC_IDX_FIXED); 488 (((1ull << pmu->nr_arch_fixed_counters) - 1) << INTEL_PMC_IDX_FIXED);
480 pmu->global_ctrl_mask = ~pmu->global_ctrl; 489 pmu->global_ctrl_mask = ~pmu->global_ctrl;
490
491 entry = kvm_find_cpuid_entry(vcpu, 7, 0);
492 if (entry &&
493 (boot_cpu_has(X86_FEATURE_HLE) || boot_cpu_has(X86_FEATURE_RTM)) &&
494 (entry->ebx & (X86_FEATURE_HLE|X86_FEATURE_RTM)))
495 pmu->reserved_bits ^= HSW_IN_TX|HSW_IN_TX_CHECKPOINTED;
481} 496}
482 497
483void kvm_pmu_init(struct kvm_vcpu *vcpu) 498void kvm_pmu_init(struct kvm_vcpu *vcpu)
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 064d0be67ecc..a1216de9ffda 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -373,6 +373,7 @@ struct nested_vmx {
373 * we must keep them pinned while L2 runs. 373 * we must keep them pinned while L2 runs.
374 */ 374 */
375 struct page *apic_access_page; 375 struct page *apic_access_page;
376 u64 msr_ia32_feature_control;
376}; 377};
377 378
378#define POSTED_INTR_ON 0 379#define POSTED_INTR_ON 0
@@ -711,10 +712,10 @@ static void nested_release_page_clean(struct page *page)
711 kvm_release_page_clean(page); 712 kvm_release_page_clean(page);
712} 713}
713 714
715static unsigned long nested_ept_get_cr3(struct kvm_vcpu *vcpu);
714static u64 construct_eptp(unsigned long root_hpa); 716static u64 construct_eptp(unsigned long root_hpa);
715static void kvm_cpu_vmxon(u64 addr); 717static void kvm_cpu_vmxon(u64 addr);
716static void kvm_cpu_vmxoff(void); 718static void kvm_cpu_vmxoff(void);
717static void vmx_set_cr3(struct kvm_vcpu *vcpu, unsigned long cr3);
718static int vmx_set_tss_addr(struct kvm *kvm, unsigned int addr); 719static int vmx_set_tss_addr(struct kvm *kvm, unsigned int addr);
719static void vmx_set_segment(struct kvm_vcpu *vcpu, 720static void vmx_set_segment(struct kvm_vcpu *vcpu,
720 struct kvm_segment *var, int seg); 721 struct kvm_segment *var, int seg);
@@ -1039,12 +1040,16 @@ static inline bool nested_cpu_has2(struct vmcs12 *vmcs12, u32 bit)
1039 (vmcs12->secondary_vm_exec_control & bit); 1040 (vmcs12->secondary_vm_exec_control & bit);
1040} 1041}
1041 1042
1042static inline bool nested_cpu_has_virtual_nmis(struct vmcs12 *vmcs12, 1043static inline bool nested_cpu_has_virtual_nmis(struct vmcs12 *vmcs12)
1043 struct kvm_vcpu *vcpu)
1044{ 1044{
1045 return vmcs12->pin_based_vm_exec_control & PIN_BASED_VIRTUAL_NMIS; 1045 return vmcs12->pin_based_vm_exec_control & PIN_BASED_VIRTUAL_NMIS;
1046} 1046}
1047 1047
1048static inline int nested_cpu_has_ept(struct vmcs12 *vmcs12)
1049{
1050 return nested_cpu_has2(vmcs12, SECONDARY_EXEC_ENABLE_EPT);
1051}
1052
1048static inline bool is_exception(u32 intr_info) 1053static inline bool is_exception(u32 intr_info)
1049{ 1054{
1050 return (intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VALID_MASK)) 1055 return (intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VALID_MASK))
@@ -2155,6 +2160,7 @@ static u32 nested_vmx_pinbased_ctls_low, nested_vmx_pinbased_ctls_high;
2155static u32 nested_vmx_exit_ctls_low, nested_vmx_exit_ctls_high; 2160static u32 nested_vmx_exit_ctls_low, nested_vmx_exit_ctls_high;
2156static u32 nested_vmx_entry_ctls_low, nested_vmx_entry_ctls_high; 2161static u32 nested_vmx_entry_ctls_low, nested_vmx_entry_ctls_high;
2157static u32 nested_vmx_misc_low, nested_vmx_misc_high; 2162static u32 nested_vmx_misc_low, nested_vmx_misc_high;
2163static u32 nested_vmx_ept_caps;
2158static __init void nested_vmx_setup_ctls_msrs(void) 2164static __init void nested_vmx_setup_ctls_msrs(void)
2159{ 2165{
2160 /* 2166 /*
@@ -2190,14 +2196,17 @@ static __init void nested_vmx_setup_ctls_msrs(void)
2190 * If bit 55 of VMX_BASIC is off, bits 0-8 and 10, 11, 13, 14, 16 and 2196 * If bit 55 of VMX_BASIC is off, bits 0-8 and 10, 11, 13, 14, 16 and
2191 * 17 must be 1. 2197 * 17 must be 1.
2192 */ 2198 */
2199 rdmsr(MSR_IA32_VMX_EXIT_CTLS,
2200 nested_vmx_exit_ctls_low, nested_vmx_exit_ctls_high);
2193 nested_vmx_exit_ctls_low = VM_EXIT_ALWAYSON_WITHOUT_TRUE_MSR; 2201 nested_vmx_exit_ctls_low = VM_EXIT_ALWAYSON_WITHOUT_TRUE_MSR;
2194 /* Note that guest use of VM_EXIT_ACK_INTR_ON_EXIT is not supported. */ 2202 /* Note that guest use of VM_EXIT_ACK_INTR_ON_EXIT is not supported. */
2203 nested_vmx_exit_ctls_high &=
2195#ifdef CONFIG_X86_64 2204#ifdef CONFIG_X86_64
2196 nested_vmx_exit_ctls_high = VM_EXIT_HOST_ADDR_SPACE_SIZE; 2205 VM_EXIT_HOST_ADDR_SPACE_SIZE |
2197#else
2198 nested_vmx_exit_ctls_high = 0;
2199#endif 2206#endif
2200 nested_vmx_exit_ctls_high |= VM_EXIT_ALWAYSON_WITHOUT_TRUE_MSR; 2207 VM_EXIT_LOAD_IA32_PAT | VM_EXIT_SAVE_IA32_PAT;
2208 nested_vmx_exit_ctls_high |= (VM_EXIT_ALWAYSON_WITHOUT_TRUE_MSR |
2209 VM_EXIT_LOAD_IA32_EFER);
2201 2210
2202 /* entry controls */ 2211 /* entry controls */
2203 rdmsr(MSR_IA32_VMX_ENTRY_CTLS, 2212 rdmsr(MSR_IA32_VMX_ENTRY_CTLS,
@@ -2205,8 +2214,12 @@ static __init void nested_vmx_setup_ctls_msrs(void)
2205 /* If bit 55 of VMX_BASIC is off, bits 0-8 and 12 must be 1. */ 2214 /* If bit 55 of VMX_BASIC is off, bits 0-8 and 12 must be 1. */
2206 nested_vmx_entry_ctls_low = VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR; 2215 nested_vmx_entry_ctls_low = VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR;
2207 nested_vmx_entry_ctls_high &= 2216 nested_vmx_entry_ctls_high &=
2208 VM_ENTRY_LOAD_IA32_PAT | VM_ENTRY_IA32E_MODE; 2217#ifdef CONFIG_X86_64
2209 nested_vmx_entry_ctls_high |= VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR; 2218 VM_ENTRY_IA32E_MODE |
2219#endif
2220 VM_ENTRY_LOAD_IA32_PAT;
2221 nested_vmx_entry_ctls_high |= (VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR |
2222 VM_ENTRY_LOAD_IA32_EFER);
2210 2223
2211 /* cpu-based controls */ 2224 /* cpu-based controls */
2212 rdmsr(MSR_IA32_VMX_PROCBASED_CTLS, 2225 rdmsr(MSR_IA32_VMX_PROCBASED_CTLS,
@@ -2241,6 +2254,22 @@ static __init void nested_vmx_setup_ctls_msrs(void)
2241 SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES | 2254 SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
2242 SECONDARY_EXEC_WBINVD_EXITING; 2255 SECONDARY_EXEC_WBINVD_EXITING;
2243 2256
2257 if (enable_ept) {
2258 /* nested EPT: emulate EPT also to L1 */
2259 nested_vmx_secondary_ctls_high |= SECONDARY_EXEC_ENABLE_EPT;
2260 nested_vmx_ept_caps = VMX_EPT_PAGE_WALK_4_BIT |
2261 VMX_EPTP_WB_BIT | VMX_EPT_INVEPT_BIT;
2262 nested_vmx_ept_caps &= vmx_capability.ept;
2263 /*
2264 * Since invept is completely emulated we support both global
2265 * and context invalidation independent of what host cpu
2266 * supports
2267 */
2268 nested_vmx_ept_caps |= VMX_EPT_EXTENT_GLOBAL_BIT |
2269 VMX_EPT_EXTENT_CONTEXT_BIT;
2270 } else
2271 nested_vmx_ept_caps = 0;
2272
2244 /* miscellaneous data */ 2273 /* miscellaneous data */
2245 rdmsr(MSR_IA32_VMX_MISC, nested_vmx_misc_low, nested_vmx_misc_high); 2274 rdmsr(MSR_IA32_VMX_MISC, nested_vmx_misc_low, nested_vmx_misc_high);
2246 nested_vmx_misc_low &= VMX_MISC_PREEMPTION_TIMER_RATE_MASK | 2275 nested_vmx_misc_low &= VMX_MISC_PREEMPTION_TIMER_RATE_MASK |
@@ -2282,8 +2311,11 @@ static int vmx_get_vmx_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata)
2282 2311
2283 switch (msr_index) { 2312 switch (msr_index) {
2284 case MSR_IA32_FEATURE_CONTROL: 2313 case MSR_IA32_FEATURE_CONTROL:
2285 *pdata = 0; 2314 if (nested_vmx_allowed(vcpu)) {
2286 break; 2315 *pdata = to_vmx(vcpu)->nested.msr_ia32_feature_control;
2316 break;
2317 }
2318 return 0;
2287 case MSR_IA32_VMX_BASIC: 2319 case MSR_IA32_VMX_BASIC:
2288 /* 2320 /*
2289 * This MSR reports some information about VMX support. We 2321 * This MSR reports some information about VMX support. We
@@ -2346,8 +2378,8 @@ static int vmx_get_vmx_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata)
2346 nested_vmx_secondary_ctls_high); 2378 nested_vmx_secondary_ctls_high);
2347 break; 2379 break;
2348 case MSR_IA32_VMX_EPT_VPID_CAP: 2380 case MSR_IA32_VMX_EPT_VPID_CAP:
2349 /* Currently, no nested ept or nested vpid */ 2381 /* Currently, no nested vpid support */
2350 *pdata = 0; 2382 *pdata = nested_vmx_ept_caps;
2351 break; 2383 break;
2352 default: 2384 default:
2353 return 0; 2385 return 0;
@@ -2356,14 +2388,24 @@ static int vmx_get_vmx_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata)
2356 return 1; 2388 return 1;
2357} 2389}
2358 2390
2359static int vmx_set_vmx_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 data) 2391static int vmx_set_vmx_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
2360{ 2392{
2393 u32 msr_index = msr_info->index;
2394 u64 data = msr_info->data;
2395 bool host_initialized = msr_info->host_initiated;
2396
2361 if (!nested_vmx_allowed(vcpu)) 2397 if (!nested_vmx_allowed(vcpu))
2362 return 0; 2398 return 0;
2363 2399
2364 if (msr_index == MSR_IA32_FEATURE_CONTROL) 2400 if (msr_index == MSR_IA32_FEATURE_CONTROL) {
2365 /* TODO: the right thing. */ 2401 if (!host_initialized &&
2402 to_vmx(vcpu)->nested.msr_ia32_feature_control
2403 & FEATURE_CONTROL_LOCKED)
2404 return 0;
2405 to_vmx(vcpu)->nested.msr_ia32_feature_control = data;
2366 return 1; 2406 return 1;
2407 }
2408
2367 /* 2409 /*
2368 * No need to treat VMX capability MSRs specially: If we don't handle 2410 * No need to treat VMX capability MSRs specially: If we don't handle
2369 * them, handle_wrmsr will #GP(0), which is correct (they are readonly) 2411 * them, handle_wrmsr will #GP(0), which is correct (they are readonly)
@@ -2494,7 +2536,7 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
2494 return 1; 2536 return 1;
2495 /* Otherwise falls through */ 2537 /* Otherwise falls through */
2496 default: 2538 default:
2497 if (vmx_set_vmx_msr(vcpu, msr_index, data)) 2539 if (vmx_set_vmx_msr(vcpu, msr_info))
2498 break; 2540 break;
2499 msr = find_msr_entry(vmx, msr_index); 2541 msr = find_msr_entry(vmx, msr_index);
2500 if (msr) { 2542 if (msr) {
@@ -5297,14 +5339,27 @@ static int handle_ept_violation(struct kvm_vcpu *vcpu)
5297 return 0; 5339 return 0;
5298 } 5340 }
5299 5341
5342 /*
5343 * EPT violation happened while executing iret from NMI,
5344 * "blocked by NMI" bit has to be set before next VM entry.
5345 * There are errata that may cause this bit to not be set:
5346 * AAK134, BY25.
5347 */
5348 if (exit_qualification & INTR_INFO_UNBLOCK_NMI)
5349 vmcs_set_bits(GUEST_INTERRUPTIBILITY_INFO, GUEST_INTR_STATE_NMI);
5350
5300 gpa = vmcs_read64(GUEST_PHYSICAL_ADDRESS); 5351 gpa = vmcs_read64(GUEST_PHYSICAL_ADDRESS);
5301 trace_kvm_page_fault(gpa, exit_qualification); 5352 trace_kvm_page_fault(gpa, exit_qualification);
5302 5353
5303 /* It is a write fault? */ 5354 /* It is a write fault? */
5304 error_code = exit_qualification & (1U << 1); 5355 error_code = exit_qualification & (1U << 1);
5356 /* It is a fetch fault? */
5357 error_code |= (exit_qualification & (1U << 2)) << 2;
5305 /* ept page table is present? */ 5358 /* ept page table is present? */
5306 error_code |= (exit_qualification >> 3) & 0x1; 5359 error_code |= (exit_qualification >> 3) & 0x1;
5307 5360
5361 vcpu->arch.exit_qualification = exit_qualification;
5362
5308 return kvm_mmu_page_fault(vcpu, gpa, error_code, NULL, 0); 5363 return kvm_mmu_page_fault(vcpu, gpa, error_code, NULL, 0);
5309} 5364}
5310 5365
@@ -5438,7 +5493,8 @@ static int handle_invalid_guest_state(struct kvm_vcpu *vcpu)
5438 5493
5439 err = emulate_instruction(vcpu, EMULTYPE_NO_REEXECUTE); 5494 err = emulate_instruction(vcpu, EMULTYPE_NO_REEXECUTE);
5440 5495
5441 if (err == EMULATE_DO_MMIO) { 5496 if (err == EMULATE_USER_EXIT) {
5497 ++vcpu->stat.mmio_exits;
5442 ret = 0; 5498 ret = 0;
5443 goto out; 5499 goto out;
5444 } 5500 }
@@ -5567,8 +5623,47 @@ static void nested_free_all_saved_vmcss(struct vcpu_vmx *vmx)
5567 free_loaded_vmcs(&vmx->vmcs01); 5623 free_loaded_vmcs(&vmx->vmcs01);
5568} 5624}
5569 5625
5626/*
5627 * The following 3 functions, nested_vmx_succeed()/failValid()/failInvalid(),
5628 * set the success or error code of an emulated VMX instruction, as specified
5629 * by Vol 2B, VMX Instruction Reference, "Conventions".
5630 */
5631static void nested_vmx_succeed(struct kvm_vcpu *vcpu)
5632{
5633 vmx_set_rflags(vcpu, vmx_get_rflags(vcpu)
5634 & ~(X86_EFLAGS_CF | X86_EFLAGS_PF | X86_EFLAGS_AF |
5635 X86_EFLAGS_ZF | X86_EFLAGS_SF | X86_EFLAGS_OF));
5636}
5637
5638static void nested_vmx_failInvalid(struct kvm_vcpu *vcpu)
5639{
5640 vmx_set_rflags(vcpu, (vmx_get_rflags(vcpu)
5641 & ~(X86_EFLAGS_PF | X86_EFLAGS_AF | X86_EFLAGS_ZF |
5642 X86_EFLAGS_SF | X86_EFLAGS_OF))
5643 | X86_EFLAGS_CF);
5644}
5645
5570static void nested_vmx_failValid(struct kvm_vcpu *vcpu, 5646static void nested_vmx_failValid(struct kvm_vcpu *vcpu,
5571 u32 vm_instruction_error); 5647 u32 vm_instruction_error)
5648{
5649 if (to_vmx(vcpu)->nested.current_vmptr == -1ull) {
5650 /*
5651 * failValid writes the error number to the current VMCS, which
5652 * can't be done there isn't a current VMCS.
5653 */
5654 nested_vmx_failInvalid(vcpu);
5655 return;
5656 }
5657 vmx_set_rflags(vcpu, (vmx_get_rflags(vcpu)
5658 & ~(X86_EFLAGS_CF | X86_EFLAGS_PF | X86_EFLAGS_AF |
5659 X86_EFLAGS_SF | X86_EFLAGS_OF))
5660 | X86_EFLAGS_ZF);
5661 get_vmcs12(vcpu)->vm_instruction_error = vm_instruction_error;
5662 /*
5663 * We don't need to force a shadow sync because
5664 * VM_INSTRUCTION_ERROR is not shadowed
5665 */
5666}
5572 5667
5573/* 5668/*
5574 * Emulate the VMXON instruction. 5669 * Emulate the VMXON instruction.
@@ -5583,6 +5678,8 @@ static int handle_vmon(struct kvm_vcpu *vcpu)
5583 struct kvm_segment cs; 5678 struct kvm_segment cs;
5584 struct vcpu_vmx *vmx = to_vmx(vcpu); 5679 struct vcpu_vmx *vmx = to_vmx(vcpu);
5585 struct vmcs *shadow_vmcs; 5680 struct vmcs *shadow_vmcs;
5681 const u64 VMXON_NEEDED_FEATURES = FEATURE_CONTROL_LOCKED
5682 | FEATURE_CONTROL_VMXON_ENABLED_OUTSIDE_SMX;
5586 5683
5587 /* The Intel VMX Instruction Reference lists a bunch of bits that 5684 /* The Intel VMX Instruction Reference lists a bunch of bits that
5588 * are prerequisite to running VMXON, most notably cr4.VMXE must be 5685 * are prerequisite to running VMXON, most notably cr4.VMXE must be
@@ -5611,6 +5708,13 @@ static int handle_vmon(struct kvm_vcpu *vcpu)
5611 skip_emulated_instruction(vcpu); 5708 skip_emulated_instruction(vcpu);
5612 return 1; 5709 return 1;
5613 } 5710 }
5711
5712 if ((vmx->nested.msr_ia32_feature_control & VMXON_NEEDED_FEATURES)
5713 != VMXON_NEEDED_FEATURES) {
5714 kvm_inject_gp(vcpu, 0);
5715 return 1;
5716 }
5717
5614 if (enable_shadow_vmcs) { 5718 if (enable_shadow_vmcs) {
5615 shadow_vmcs = alloc_vmcs(); 5719 shadow_vmcs = alloc_vmcs();
5616 if (!shadow_vmcs) 5720 if (!shadow_vmcs)
@@ -5628,6 +5732,7 @@ static int handle_vmon(struct kvm_vcpu *vcpu)
5628 vmx->nested.vmxon = true; 5732 vmx->nested.vmxon = true;
5629 5733
5630 skip_emulated_instruction(vcpu); 5734 skip_emulated_instruction(vcpu);
5735 nested_vmx_succeed(vcpu);
5631 return 1; 5736 return 1;
5632} 5737}
5633 5738
@@ -5712,6 +5817,7 @@ static int handle_vmoff(struct kvm_vcpu *vcpu)
5712 return 1; 5817 return 1;
5713 free_nested(to_vmx(vcpu)); 5818 free_nested(to_vmx(vcpu));
5714 skip_emulated_instruction(vcpu); 5819 skip_emulated_instruction(vcpu);
5820 nested_vmx_succeed(vcpu);
5715 return 1; 5821 return 1;
5716} 5822}
5717 5823
@@ -5768,48 +5874,6 @@ static int get_vmx_mem_address(struct kvm_vcpu *vcpu,
5768 return 0; 5874 return 0;
5769} 5875}
5770 5876
5771/*
5772 * The following 3 functions, nested_vmx_succeed()/failValid()/failInvalid(),
5773 * set the success or error code of an emulated VMX instruction, as specified
5774 * by Vol 2B, VMX Instruction Reference, "Conventions".
5775 */
5776static void nested_vmx_succeed(struct kvm_vcpu *vcpu)
5777{
5778 vmx_set_rflags(vcpu, vmx_get_rflags(vcpu)
5779 & ~(X86_EFLAGS_CF | X86_EFLAGS_PF | X86_EFLAGS_AF |
5780 X86_EFLAGS_ZF | X86_EFLAGS_SF | X86_EFLAGS_OF));
5781}
5782
5783static void nested_vmx_failInvalid(struct kvm_vcpu *vcpu)
5784{
5785 vmx_set_rflags(vcpu, (vmx_get_rflags(vcpu)
5786 & ~(X86_EFLAGS_PF | X86_EFLAGS_AF | X86_EFLAGS_ZF |
5787 X86_EFLAGS_SF | X86_EFLAGS_OF))
5788 | X86_EFLAGS_CF);
5789}
5790
5791static void nested_vmx_failValid(struct kvm_vcpu *vcpu,
5792 u32 vm_instruction_error)
5793{
5794 if (to_vmx(vcpu)->nested.current_vmptr == -1ull) {
5795 /*
5796 * failValid writes the error number to the current VMCS, which
5797 * can't be done there isn't a current VMCS.
5798 */
5799 nested_vmx_failInvalid(vcpu);
5800 return;
5801 }
5802 vmx_set_rflags(vcpu, (vmx_get_rflags(vcpu)
5803 & ~(X86_EFLAGS_CF | X86_EFLAGS_PF | X86_EFLAGS_AF |
5804 X86_EFLAGS_SF | X86_EFLAGS_OF))
5805 | X86_EFLAGS_ZF);
5806 get_vmcs12(vcpu)->vm_instruction_error = vm_instruction_error;
5807 /*
5808 * We don't need to force a shadow sync because
5809 * VM_INSTRUCTION_ERROR is not shadowed
5810 */
5811}
5812
5813/* Emulate the VMCLEAR instruction */ 5877/* Emulate the VMCLEAR instruction */
5814static int handle_vmclear(struct kvm_vcpu *vcpu) 5878static int handle_vmclear(struct kvm_vcpu *vcpu)
5815{ 5879{
@@ -5972,8 +6036,8 @@ static void copy_shadow_to_vmcs12(struct vcpu_vmx *vmx)
5972 unsigned long field; 6036 unsigned long field;
5973 u64 field_value; 6037 u64 field_value;
5974 struct vmcs *shadow_vmcs = vmx->nested.current_shadow_vmcs; 6038 struct vmcs *shadow_vmcs = vmx->nested.current_shadow_vmcs;
5975 unsigned long *fields = (unsigned long *)shadow_read_write_fields; 6039 const unsigned long *fields = shadow_read_write_fields;
5976 int num_fields = max_shadow_read_write_fields; 6040 const int num_fields = max_shadow_read_write_fields;
5977 6041
5978 vmcs_load(shadow_vmcs); 6042 vmcs_load(shadow_vmcs);
5979 6043
@@ -6002,12 +6066,11 @@ static void copy_shadow_to_vmcs12(struct vcpu_vmx *vmx)
6002 6066
6003static void copy_vmcs12_to_shadow(struct vcpu_vmx *vmx) 6067static void copy_vmcs12_to_shadow(struct vcpu_vmx *vmx)
6004{ 6068{
6005 unsigned long *fields[] = { 6069 const unsigned long *fields[] = {
6006 (unsigned long *)shadow_read_write_fields, 6070 shadow_read_write_fields,
6007 (unsigned long *)shadow_read_only_fields 6071 shadow_read_only_fields
6008 }; 6072 };
6009 int num_lists = ARRAY_SIZE(fields); 6073 const int max_fields[] = {
6010 int max_fields[] = {
6011 max_shadow_read_write_fields, 6074 max_shadow_read_write_fields,
6012 max_shadow_read_only_fields 6075 max_shadow_read_only_fields
6013 }; 6076 };
@@ -6018,7 +6081,7 @@ static void copy_vmcs12_to_shadow(struct vcpu_vmx *vmx)
6018 6081
6019 vmcs_load(shadow_vmcs); 6082 vmcs_load(shadow_vmcs);
6020 6083
6021 for (q = 0; q < num_lists; q++) { 6084 for (q = 0; q < ARRAY_SIZE(fields); q++) {
6022 for (i = 0; i < max_fields[q]; i++) { 6085 for (i = 0; i < max_fields[q]; i++) {
6023 field = fields[q][i]; 6086 field = fields[q][i];
6024 vmcs12_read_any(&vmx->vcpu, field, &field_value); 6087 vmcs12_read_any(&vmx->vcpu, field, &field_value);
@@ -6248,6 +6311,74 @@ static int handle_vmptrst(struct kvm_vcpu *vcpu)
6248 return 1; 6311 return 1;
6249} 6312}
6250 6313
6314/* Emulate the INVEPT instruction */
6315static int handle_invept(struct kvm_vcpu *vcpu)
6316{
6317 u32 vmx_instruction_info, types;
6318 unsigned long type;
6319 gva_t gva;
6320 struct x86_exception e;
6321 struct {
6322 u64 eptp, gpa;
6323 } operand;
6324 u64 eptp_mask = ((1ull << 51) - 1) & PAGE_MASK;
6325
6326 if (!(nested_vmx_secondary_ctls_high & SECONDARY_EXEC_ENABLE_EPT) ||
6327 !(nested_vmx_ept_caps & VMX_EPT_INVEPT_BIT)) {
6328 kvm_queue_exception(vcpu, UD_VECTOR);
6329 return 1;
6330 }
6331
6332 if (!nested_vmx_check_permission(vcpu))
6333 return 1;
6334
6335 if (!kvm_read_cr0_bits(vcpu, X86_CR0_PE)) {
6336 kvm_queue_exception(vcpu, UD_VECTOR);
6337 return 1;
6338 }
6339
6340 vmx_instruction_info = vmcs_read32(VMX_INSTRUCTION_INFO);
6341 type = kvm_register_read(vcpu, (vmx_instruction_info >> 28) & 0xf);
6342
6343 types = (nested_vmx_ept_caps >> VMX_EPT_EXTENT_SHIFT) & 6;
6344
6345 if (!(types & (1UL << type))) {
6346 nested_vmx_failValid(vcpu,
6347 VMXERR_INVALID_OPERAND_TO_INVEPT_INVVPID);
6348 return 1;
6349 }
6350
6351 /* According to the Intel VMX instruction reference, the memory
6352 * operand is read even if it isn't needed (e.g., for type==global)
6353 */
6354 if (get_vmx_mem_address(vcpu, vmcs_readl(EXIT_QUALIFICATION),
6355 vmx_instruction_info, &gva))
6356 return 1;
6357 if (kvm_read_guest_virt(&vcpu->arch.emulate_ctxt, gva, &operand,
6358 sizeof(operand), &e)) {
6359 kvm_inject_page_fault(vcpu, &e);
6360 return 1;
6361 }
6362
6363 switch (type) {
6364 case VMX_EPT_EXTENT_CONTEXT:
6365 if ((operand.eptp & eptp_mask) !=
6366 (nested_ept_get_cr3(vcpu) & eptp_mask))
6367 break;
6368 case VMX_EPT_EXTENT_GLOBAL:
6369 kvm_mmu_sync_roots(vcpu);
6370 kvm_mmu_flush_tlb(vcpu);
6371 nested_vmx_succeed(vcpu);
6372 break;
6373 default:
6374 BUG_ON(1);
6375 break;
6376 }
6377
6378 skip_emulated_instruction(vcpu);
6379 return 1;
6380}
6381
6251/* 6382/*
6252 * The exit handlers return 1 if the exit was handled fully and guest execution 6383 * The exit handlers return 1 if the exit was handled fully and guest execution
6253 * may resume. Otherwise they set the kvm_run parameter to indicate what needs 6384 * may resume. Otherwise they set the kvm_run parameter to indicate what needs
@@ -6292,6 +6423,7 @@ static int (*const kvm_vmx_exit_handlers[])(struct kvm_vcpu *vcpu) = {
6292 [EXIT_REASON_PAUSE_INSTRUCTION] = handle_pause, 6423 [EXIT_REASON_PAUSE_INSTRUCTION] = handle_pause,
6293 [EXIT_REASON_MWAIT_INSTRUCTION] = handle_invalid_op, 6424 [EXIT_REASON_MWAIT_INSTRUCTION] = handle_invalid_op,
6294 [EXIT_REASON_MONITOR_INSTRUCTION] = handle_invalid_op, 6425 [EXIT_REASON_MONITOR_INSTRUCTION] = handle_invalid_op,
6426 [EXIT_REASON_INVEPT] = handle_invept,
6295}; 6427};
6296 6428
6297static const int kvm_vmx_max_exit_handlers = 6429static const int kvm_vmx_max_exit_handlers =
@@ -6518,6 +6650,7 @@ static bool nested_vmx_exit_handled(struct kvm_vcpu *vcpu)
6518 case EXIT_REASON_VMPTRST: case EXIT_REASON_VMREAD: 6650 case EXIT_REASON_VMPTRST: case EXIT_REASON_VMREAD:
6519 case EXIT_REASON_VMRESUME: case EXIT_REASON_VMWRITE: 6651 case EXIT_REASON_VMRESUME: case EXIT_REASON_VMWRITE:
6520 case EXIT_REASON_VMOFF: case EXIT_REASON_VMON: 6652 case EXIT_REASON_VMOFF: case EXIT_REASON_VMON:
6653 case EXIT_REASON_INVEPT:
6521 /* 6654 /*
6522 * VMX instructions trap unconditionally. This allows L1 to 6655 * VMX instructions trap unconditionally. This allows L1 to
6523 * emulate them for its L2 guest, i.e., allows 3-level nesting! 6656 * emulate them for its L2 guest, i.e., allows 3-level nesting!
@@ -6550,7 +6683,20 @@ static bool nested_vmx_exit_handled(struct kvm_vcpu *vcpu)
6550 return nested_cpu_has2(vmcs12, 6683 return nested_cpu_has2(vmcs12,
6551 SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES); 6684 SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES);
6552 case EXIT_REASON_EPT_VIOLATION: 6685 case EXIT_REASON_EPT_VIOLATION:
6686 /*
6687 * L0 always deals with the EPT violation. If nested EPT is
6688 * used, and the nested mmu code discovers that the address is
6689 * missing in the guest EPT table (EPT12), the EPT violation
6690 * will be injected with nested_ept_inject_page_fault()
6691 */
6692 return 0;
6553 case EXIT_REASON_EPT_MISCONFIG: 6693 case EXIT_REASON_EPT_MISCONFIG:
6694 /*
6695 * L2 never uses directly L1's EPT, but rather L0's own EPT
6696 * table (shadow on EPT) or a merged EPT table that L0 built
6697 * (EPT on EPT). So any problems with the structure of the
6698 * table is L0's fault.
6699 */
6554 return 0; 6700 return 0;
6555 case EXIT_REASON_PREEMPTION_TIMER: 6701 case EXIT_REASON_PREEMPTION_TIMER:
6556 return vmcs12->pin_based_vm_exec_control & 6702 return vmcs12->pin_based_vm_exec_control &
@@ -6638,7 +6784,7 @@ static int vmx_handle_exit(struct kvm_vcpu *vcpu)
6638 6784
6639 if (unlikely(!cpu_has_virtual_nmis() && vmx->soft_vnmi_blocked && 6785 if (unlikely(!cpu_has_virtual_nmis() && vmx->soft_vnmi_blocked &&
6640 !(is_guest_mode(vcpu) && nested_cpu_has_virtual_nmis( 6786 !(is_guest_mode(vcpu) && nested_cpu_has_virtual_nmis(
6641 get_vmcs12(vcpu), vcpu)))) { 6787 get_vmcs12(vcpu))))) {
6642 if (vmx_interrupt_allowed(vcpu)) { 6788 if (vmx_interrupt_allowed(vcpu)) {
6643 vmx->soft_vnmi_blocked = 0; 6789 vmx->soft_vnmi_blocked = 0;
6644 } else if (vmx->vnmi_blocked_time > 1000000000LL && 6790 } else if (vmx->vnmi_blocked_time > 1000000000LL &&
@@ -7326,6 +7472,48 @@ static void vmx_set_supported_cpuid(u32 func, struct kvm_cpuid_entry2 *entry)
7326 entry->ecx |= bit(X86_FEATURE_VMX); 7472 entry->ecx |= bit(X86_FEATURE_VMX);
7327} 7473}
7328 7474
7475static void nested_ept_inject_page_fault(struct kvm_vcpu *vcpu,
7476 struct x86_exception *fault)
7477{
7478 struct vmcs12 *vmcs12;
7479 nested_vmx_vmexit(vcpu);
7480 vmcs12 = get_vmcs12(vcpu);
7481
7482 if (fault->error_code & PFERR_RSVD_MASK)
7483 vmcs12->vm_exit_reason = EXIT_REASON_EPT_MISCONFIG;
7484 else
7485 vmcs12->vm_exit_reason = EXIT_REASON_EPT_VIOLATION;
7486 vmcs12->exit_qualification = vcpu->arch.exit_qualification;
7487 vmcs12->guest_physical_address = fault->address;
7488}
7489
7490/* Callbacks for nested_ept_init_mmu_context: */
7491
7492static unsigned long nested_ept_get_cr3(struct kvm_vcpu *vcpu)
7493{
7494 /* return the page table to be shadowed - in our case, EPT12 */
7495 return get_vmcs12(vcpu)->ept_pointer;
7496}
7497
7498static int nested_ept_init_mmu_context(struct kvm_vcpu *vcpu)
7499{
7500 int r = kvm_init_shadow_ept_mmu(vcpu, &vcpu->arch.mmu,
7501 nested_vmx_ept_caps & VMX_EPT_EXECUTE_ONLY_BIT);
7502
7503 vcpu->arch.mmu.set_cr3 = vmx_set_cr3;
7504 vcpu->arch.mmu.get_cr3 = nested_ept_get_cr3;
7505 vcpu->arch.mmu.inject_page_fault = nested_ept_inject_page_fault;
7506
7507 vcpu->arch.walk_mmu = &vcpu->arch.nested_mmu;
7508
7509 return r;
7510}
7511
7512static void nested_ept_uninit_mmu_context(struct kvm_vcpu *vcpu)
7513{
7514 vcpu->arch.walk_mmu = &vcpu->arch.mmu;
7515}
7516
7329/* 7517/*
7330 * prepare_vmcs02 is called when the L1 guest hypervisor runs its nested 7518 * prepare_vmcs02 is called when the L1 guest hypervisor runs its nested
7331 * L2 guest. L1 has a vmcs for L2 (vmcs12), and this function "merges" it 7519 * L2 guest. L1 has a vmcs for L2 (vmcs12), and this function "merges" it
@@ -7388,7 +7576,7 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12)
7388 vmcs12->guest_interruptibility_info); 7576 vmcs12->guest_interruptibility_info);
7389 vmcs_write32(GUEST_SYSENTER_CS, vmcs12->guest_sysenter_cs); 7577 vmcs_write32(GUEST_SYSENTER_CS, vmcs12->guest_sysenter_cs);
7390 kvm_set_dr(vcpu, 7, vmcs12->guest_dr7); 7578 kvm_set_dr(vcpu, 7, vmcs12->guest_dr7);
7391 vmcs_writel(GUEST_RFLAGS, vmcs12->guest_rflags); 7579 vmx_set_rflags(vcpu, vmcs12->guest_rflags);
7392 vmcs_writel(GUEST_PENDING_DBG_EXCEPTIONS, 7580 vmcs_writel(GUEST_PENDING_DBG_EXCEPTIONS,
7393 vmcs12->guest_pending_dbg_exceptions); 7581 vmcs12->guest_pending_dbg_exceptions);
7394 vmcs_writel(GUEST_SYSENTER_ESP, vmcs12->guest_sysenter_esp); 7582 vmcs_writel(GUEST_SYSENTER_ESP, vmcs12->guest_sysenter_esp);
@@ -7508,15 +7696,24 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12)
7508 vcpu->arch.cr0_guest_owned_bits &= ~vmcs12->cr0_guest_host_mask; 7696 vcpu->arch.cr0_guest_owned_bits &= ~vmcs12->cr0_guest_host_mask;
7509 vmcs_writel(CR0_GUEST_HOST_MASK, ~vcpu->arch.cr0_guest_owned_bits); 7697 vmcs_writel(CR0_GUEST_HOST_MASK, ~vcpu->arch.cr0_guest_owned_bits);
7510 7698
7511 /* Note: IA32_MODE, LOAD_IA32_EFER are modified by vmx_set_efer below */ 7699 /* L2->L1 exit controls are emulated - the hardware exit is to L0 so
7512 vmcs_write32(VM_EXIT_CONTROLS, 7700 * we should use its exit controls. Note that VM_EXIT_LOAD_IA32_EFER
7513 vmcs12->vm_exit_controls | vmcs_config.vmexit_ctrl); 7701 * bits are further modified by vmx_set_efer() below.
7514 vmcs_write32(VM_ENTRY_CONTROLS, vmcs12->vm_entry_controls | 7702 */
7703 vmcs_write32(VM_EXIT_CONTROLS, vmcs_config.vmexit_ctrl);
7704
7705 /* vmcs12's VM_ENTRY_LOAD_IA32_EFER and VM_ENTRY_IA32E_MODE are
7706 * emulated by vmx_set_efer(), below.
7707 */
7708 vmcs_write32(VM_ENTRY_CONTROLS,
7709 (vmcs12->vm_entry_controls & ~VM_ENTRY_LOAD_IA32_EFER &
7710 ~VM_ENTRY_IA32E_MODE) |
7515 (vmcs_config.vmentry_ctrl & ~VM_ENTRY_IA32E_MODE)); 7711 (vmcs_config.vmentry_ctrl & ~VM_ENTRY_IA32E_MODE));
7516 7712
7517 if (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_IA32_PAT) 7713 if (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_IA32_PAT) {
7518 vmcs_write64(GUEST_IA32_PAT, vmcs12->guest_ia32_pat); 7714 vmcs_write64(GUEST_IA32_PAT, vmcs12->guest_ia32_pat);
7519 else if (vmcs_config.vmentry_ctrl & VM_ENTRY_LOAD_IA32_PAT) 7715 vcpu->arch.pat = vmcs12->guest_ia32_pat;
7716 } else if (vmcs_config.vmentry_ctrl & VM_ENTRY_LOAD_IA32_PAT)
7520 vmcs_write64(GUEST_IA32_PAT, vmx->vcpu.arch.pat); 7717 vmcs_write64(GUEST_IA32_PAT, vmx->vcpu.arch.pat);
7521 7718
7522 7719
@@ -7538,6 +7735,11 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12)
7538 vmx_flush_tlb(vcpu); 7735 vmx_flush_tlb(vcpu);
7539 } 7736 }
7540 7737
7738 if (nested_cpu_has_ept(vmcs12)) {
7739 kvm_mmu_unload(vcpu);
7740 nested_ept_init_mmu_context(vcpu);
7741 }
7742
7541 if (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_IA32_EFER) 7743 if (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_IA32_EFER)
7542 vcpu->arch.efer = vmcs12->guest_ia32_efer; 7744 vcpu->arch.efer = vmcs12->guest_ia32_efer;
7543 else if (vmcs12->vm_entry_controls & VM_ENTRY_IA32E_MODE) 7745 else if (vmcs12->vm_entry_controls & VM_ENTRY_IA32E_MODE)
@@ -7565,6 +7767,20 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12)
7565 kvm_set_cr3(vcpu, vmcs12->guest_cr3); 7767 kvm_set_cr3(vcpu, vmcs12->guest_cr3);
7566 kvm_mmu_reset_context(vcpu); 7768 kvm_mmu_reset_context(vcpu);
7567 7769
7770 /*
7771 * L1 may access the L2's PDPTR, so save them to construct vmcs12
7772 */
7773 if (enable_ept) {
7774 vmcs_write64(GUEST_PDPTR0, vmcs12->guest_pdptr0);
7775 vmcs_write64(GUEST_PDPTR1, vmcs12->guest_pdptr1);
7776 vmcs_write64(GUEST_PDPTR2, vmcs12->guest_pdptr2);
7777 vmcs_write64(GUEST_PDPTR3, vmcs12->guest_pdptr3);
7778 __clear_bit(VCPU_EXREG_PDPTR,
7779 (unsigned long *)&vcpu->arch.regs_avail);
7780 __clear_bit(VCPU_EXREG_PDPTR,
7781 (unsigned long *)&vcpu->arch.regs_dirty);
7782 }
7783
7568 kvm_register_write(vcpu, VCPU_REGS_RSP, vmcs12->guest_rsp); 7784 kvm_register_write(vcpu, VCPU_REGS_RSP, vmcs12->guest_rsp);
7569 kvm_register_write(vcpu, VCPU_REGS_RIP, vmcs12->guest_rip); 7785 kvm_register_write(vcpu, VCPU_REGS_RIP, vmcs12->guest_rip);
7570} 7786}
@@ -7887,6 +8103,22 @@ static void prepare_vmcs12(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12)
7887 vmcs12->guest_pending_dbg_exceptions = 8103 vmcs12->guest_pending_dbg_exceptions =
7888 vmcs_readl(GUEST_PENDING_DBG_EXCEPTIONS); 8104 vmcs_readl(GUEST_PENDING_DBG_EXCEPTIONS);
7889 8105
8106 /*
8107 * In some cases (usually, nested EPT), L2 is allowed to change its
8108 * own CR3 without exiting. If it has changed it, we must keep it.
8109 * Of course, if L0 is using shadow page tables, GUEST_CR3 was defined
8110 * by L0, not L1 or L2, so we mustn't unconditionally copy it to vmcs12.
8111 *
8112 * Additionally, restore L2's PDPTR to vmcs12.
8113 */
8114 if (enable_ept) {
8115 vmcs12->guest_cr3 = vmcs_read64(GUEST_CR3);
8116 vmcs12->guest_pdptr0 = vmcs_read64(GUEST_PDPTR0);
8117 vmcs12->guest_pdptr1 = vmcs_read64(GUEST_PDPTR1);
8118 vmcs12->guest_pdptr2 = vmcs_read64(GUEST_PDPTR2);
8119 vmcs12->guest_pdptr3 = vmcs_read64(GUEST_PDPTR3);
8120 }
8121
7890 vmcs12->vm_entry_controls = 8122 vmcs12->vm_entry_controls =
7891 (vmcs12->vm_entry_controls & ~VM_ENTRY_IA32E_MODE) | 8123 (vmcs12->vm_entry_controls & ~VM_ENTRY_IA32E_MODE) |
7892 (vmcs_read32(VM_ENTRY_CONTROLS) & VM_ENTRY_IA32E_MODE); 8124 (vmcs_read32(VM_ENTRY_CONTROLS) & VM_ENTRY_IA32E_MODE);
@@ -7948,6 +8180,8 @@ static void prepare_vmcs12(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12)
7948static void load_vmcs12_host_state(struct kvm_vcpu *vcpu, 8180static void load_vmcs12_host_state(struct kvm_vcpu *vcpu,
7949 struct vmcs12 *vmcs12) 8181 struct vmcs12 *vmcs12)
7950{ 8182{
8183 struct kvm_segment seg;
8184
7951 if (vmcs12->vm_exit_controls & VM_EXIT_LOAD_IA32_EFER) 8185 if (vmcs12->vm_exit_controls & VM_EXIT_LOAD_IA32_EFER)
7952 vcpu->arch.efer = vmcs12->host_ia32_efer; 8186 vcpu->arch.efer = vmcs12->host_ia32_efer;
7953 else if (vmcs12->vm_exit_controls & VM_EXIT_HOST_ADDR_SPACE_SIZE) 8187 else if (vmcs12->vm_exit_controls & VM_EXIT_HOST_ADDR_SPACE_SIZE)
@@ -7982,7 +8216,9 @@ static void load_vmcs12_host_state(struct kvm_vcpu *vcpu,
7982 vcpu->arch.cr4_guest_owned_bits = ~vmcs_readl(CR4_GUEST_HOST_MASK); 8216 vcpu->arch.cr4_guest_owned_bits = ~vmcs_readl(CR4_GUEST_HOST_MASK);
7983 kvm_set_cr4(vcpu, vmcs12->host_cr4); 8217 kvm_set_cr4(vcpu, vmcs12->host_cr4);
7984 8218
7985 /* shadow page tables on either EPT or shadow page tables */ 8219 if (nested_cpu_has_ept(vmcs12))
8220 nested_ept_uninit_mmu_context(vcpu);
8221
7986 kvm_set_cr3(vcpu, vmcs12->host_cr3); 8222 kvm_set_cr3(vcpu, vmcs12->host_cr3);
7987 kvm_mmu_reset_context(vcpu); 8223 kvm_mmu_reset_context(vcpu);
7988 8224
@@ -8001,23 +8237,61 @@ static void load_vmcs12_host_state(struct kvm_vcpu *vcpu,
8001 vmcs_writel(GUEST_SYSENTER_EIP, vmcs12->host_ia32_sysenter_eip); 8237 vmcs_writel(GUEST_SYSENTER_EIP, vmcs12->host_ia32_sysenter_eip);
8002 vmcs_writel(GUEST_IDTR_BASE, vmcs12->host_idtr_base); 8238 vmcs_writel(GUEST_IDTR_BASE, vmcs12->host_idtr_base);
8003 vmcs_writel(GUEST_GDTR_BASE, vmcs12->host_gdtr_base); 8239 vmcs_writel(GUEST_GDTR_BASE, vmcs12->host_gdtr_base);
8004 vmcs_writel(GUEST_TR_BASE, vmcs12->host_tr_base); 8240
8005 vmcs_writel(GUEST_GS_BASE, vmcs12->host_gs_base); 8241 if (vmcs12->vm_exit_controls & VM_EXIT_LOAD_IA32_PAT) {
8006 vmcs_writel(GUEST_FS_BASE, vmcs12->host_fs_base);
8007 vmcs_write16(GUEST_ES_SELECTOR, vmcs12->host_es_selector);
8008 vmcs_write16(GUEST_CS_SELECTOR, vmcs12->host_cs_selector);
8009 vmcs_write16(GUEST_SS_SELECTOR, vmcs12->host_ss_selector);
8010 vmcs_write16(GUEST_DS_SELECTOR, vmcs12->host_ds_selector);
8011 vmcs_write16(GUEST_FS_SELECTOR, vmcs12->host_fs_selector);
8012 vmcs_write16(GUEST_GS_SELECTOR, vmcs12->host_gs_selector);
8013 vmcs_write16(GUEST_TR_SELECTOR, vmcs12->host_tr_selector);
8014
8015 if (vmcs12->vm_exit_controls & VM_EXIT_LOAD_IA32_PAT)
8016 vmcs_write64(GUEST_IA32_PAT, vmcs12->host_ia32_pat); 8242 vmcs_write64(GUEST_IA32_PAT, vmcs12->host_ia32_pat);
8243 vcpu->arch.pat = vmcs12->host_ia32_pat;
8244 }
8017 if (vmcs12->vm_exit_controls & VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL) 8245 if (vmcs12->vm_exit_controls & VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL)
8018 vmcs_write64(GUEST_IA32_PERF_GLOBAL_CTRL, 8246 vmcs_write64(GUEST_IA32_PERF_GLOBAL_CTRL,
8019 vmcs12->host_ia32_perf_global_ctrl); 8247 vmcs12->host_ia32_perf_global_ctrl);
8020 8248
8249 /* Set L1 segment info according to Intel SDM
8250 27.5.2 Loading Host Segment and Descriptor-Table Registers */
8251 seg = (struct kvm_segment) {
8252 .base = 0,
8253 .limit = 0xFFFFFFFF,
8254 .selector = vmcs12->host_cs_selector,
8255 .type = 11,
8256 .present = 1,
8257 .s = 1,
8258 .g = 1
8259 };
8260 if (vmcs12->vm_exit_controls & VM_EXIT_HOST_ADDR_SPACE_SIZE)
8261 seg.l = 1;
8262 else
8263 seg.db = 1;
8264 vmx_set_segment(vcpu, &seg, VCPU_SREG_CS);
8265 seg = (struct kvm_segment) {
8266 .base = 0,
8267 .limit = 0xFFFFFFFF,
8268 .type = 3,
8269 .present = 1,
8270 .s = 1,
8271 .db = 1,
8272 .g = 1
8273 };
8274 seg.selector = vmcs12->host_ds_selector;
8275 vmx_set_segment(vcpu, &seg, VCPU_SREG_DS);
8276 seg.selector = vmcs12->host_es_selector;
8277 vmx_set_segment(vcpu, &seg, VCPU_SREG_ES);
8278 seg.selector = vmcs12->host_ss_selector;
8279 vmx_set_segment(vcpu, &seg, VCPU_SREG_SS);
8280 seg.selector = vmcs12->host_fs_selector;
8281 seg.base = vmcs12->host_fs_base;
8282 vmx_set_segment(vcpu, &seg, VCPU_SREG_FS);
8283 seg.selector = vmcs12->host_gs_selector;
8284 seg.base = vmcs12->host_gs_base;
8285 vmx_set_segment(vcpu, &seg, VCPU_SREG_GS);
8286 seg = (struct kvm_segment) {
8287 .base = vmcs12->host_tr_base,
8288 .limit = 0x67,
8289 .selector = vmcs12->host_tr_selector,
8290 .type = 11,
8291 .present = 1
8292 };
8293 vmx_set_segment(vcpu, &seg, VCPU_SREG_TR);
8294
8021 kvm_set_dr(vcpu, 7, 0x400); 8295 kvm_set_dr(vcpu, 7, 0x400);
8022 vmcs_write64(GUEST_IA32_DEBUGCTL, 0); 8296 vmcs_write64(GUEST_IA32_DEBUGCTL, 0);
8023} 8297}
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index d21bce505315..e5ca72a5cdb6 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -682,17 +682,6 @@ int kvm_set_cr3(struct kvm_vcpu *vcpu, unsigned long cr3)
682 */ 682 */
683 } 683 }
684 684
685 /*
686 * Does the new cr3 value map to physical memory? (Note, we
687 * catch an invalid cr3 even in real-mode, because it would
688 * cause trouble later on when we turn on paging anyway.)
689 *
690 * A real CPU would silently accept an invalid cr3 and would
691 * attempt to use it - with largely undefined (and often hard
692 * to debug) behavior on the guest side.
693 */
694 if (unlikely(!gfn_to_memslot(vcpu->kvm, cr3 >> PAGE_SHIFT)))
695 return 1;
696 vcpu->arch.cr3 = cr3; 685 vcpu->arch.cr3 = cr3;
697 __set_bit(VCPU_EXREG_CR3, (ulong *)&vcpu->arch.regs_avail); 686 __set_bit(VCPU_EXREG_CR3, (ulong *)&vcpu->arch.regs_avail);
698 vcpu->arch.mmu.new_cr3(vcpu); 687 vcpu->arch.mmu.new_cr3(vcpu);
@@ -850,7 +839,8 @@ static u32 msrs_to_save[] = {
850#ifdef CONFIG_X86_64 839#ifdef CONFIG_X86_64
851 MSR_CSTAR, MSR_KERNEL_GS_BASE, MSR_SYSCALL_MASK, MSR_LSTAR, 840 MSR_CSTAR, MSR_KERNEL_GS_BASE, MSR_SYSCALL_MASK, MSR_LSTAR,
852#endif 841#endif
853 MSR_IA32_TSC, MSR_IA32_CR_PAT, MSR_VM_HSAVE_PA 842 MSR_IA32_TSC, MSR_IA32_CR_PAT, MSR_VM_HSAVE_PA,
843 MSR_IA32_FEATURE_CONTROL
854}; 844};
855 845
856static unsigned num_msrs_to_save; 846static unsigned num_msrs_to_save;
@@ -1457,6 +1447,29 @@ static void pvclock_update_vm_gtod_copy(struct kvm *kvm)
1457#endif 1447#endif
1458} 1448}
1459 1449
1450static void kvm_gen_update_masterclock(struct kvm *kvm)
1451{
1452#ifdef CONFIG_X86_64
1453 int i;
1454 struct kvm_vcpu *vcpu;
1455 struct kvm_arch *ka = &kvm->arch;
1456
1457 spin_lock(&ka->pvclock_gtod_sync_lock);
1458 kvm_make_mclock_inprogress_request(kvm);
1459 /* no guest entries from this point */
1460 pvclock_update_vm_gtod_copy(kvm);
1461
1462 kvm_for_each_vcpu(i, vcpu, kvm)
1463 set_bit(KVM_REQ_CLOCK_UPDATE, &vcpu->requests);
1464
1465 /* guest entries allowed */
1466 kvm_for_each_vcpu(i, vcpu, kvm)
1467 clear_bit(KVM_REQ_MCLOCK_INPROGRESS, &vcpu->requests);
1468
1469 spin_unlock(&ka->pvclock_gtod_sync_lock);
1470#endif
1471}
1472
1460static int kvm_guest_time_update(struct kvm_vcpu *v) 1473static int kvm_guest_time_update(struct kvm_vcpu *v)
1461{ 1474{
1462 unsigned long flags, this_tsc_khz; 1475 unsigned long flags, this_tsc_khz;
@@ -3806,6 +3819,7 @@ long kvm_arch_vm_ioctl(struct file *filp,
3806 delta = user_ns.clock - now_ns; 3819 delta = user_ns.clock - now_ns;
3807 local_irq_enable(); 3820 local_irq_enable();
3808 kvm->arch.kvmclock_offset = delta; 3821 kvm->arch.kvmclock_offset = delta;
3822 kvm_gen_update_masterclock(kvm);
3809 break; 3823 break;
3810 } 3824 }
3811 case KVM_GET_CLOCK: { 3825 case KVM_GET_CLOCK: {
@@ -4955,6 +4969,97 @@ static bool retry_instruction(struct x86_emulate_ctxt *ctxt,
4955static int complete_emulated_mmio(struct kvm_vcpu *vcpu); 4969static int complete_emulated_mmio(struct kvm_vcpu *vcpu);
4956static int complete_emulated_pio(struct kvm_vcpu *vcpu); 4970static int complete_emulated_pio(struct kvm_vcpu *vcpu);
4957 4971
4972static int kvm_vcpu_check_hw_bp(unsigned long addr, u32 type, u32 dr7,
4973 unsigned long *db)
4974{
4975 u32 dr6 = 0;
4976 int i;
4977 u32 enable, rwlen;
4978
4979 enable = dr7;
4980 rwlen = dr7 >> 16;
4981 for (i = 0; i < 4; i++, enable >>= 2, rwlen >>= 4)
4982 if ((enable & 3) && (rwlen & 15) == type && db[i] == addr)
4983 dr6 |= (1 << i);
4984 return dr6;
4985}
4986
4987static void kvm_vcpu_check_singlestep(struct kvm_vcpu *vcpu, int *r)
4988{
4989 struct kvm_run *kvm_run = vcpu->run;
4990
4991 /*
4992 * Use the "raw" value to see if TF was passed to the processor.
4993 * Note that the new value of the flags has not been saved yet.
4994 *
4995 * This is correct even for TF set by the guest, because "the
4996 * processor will not generate this exception after the instruction
4997 * that sets the TF flag".
4998 */
4999 unsigned long rflags = kvm_x86_ops->get_rflags(vcpu);
5000
5001 if (unlikely(rflags & X86_EFLAGS_TF)) {
5002 if (vcpu->guest_debug & KVM_GUESTDBG_SINGLESTEP) {
5003 kvm_run->debug.arch.dr6 = DR6_BS | DR6_FIXED_1;
5004 kvm_run->debug.arch.pc = vcpu->arch.singlestep_rip;
5005 kvm_run->debug.arch.exception = DB_VECTOR;
5006 kvm_run->exit_reason = KVM_EXIT_DEBUG;
5007 *r = EMULATE_USER_EXIT;
5008 } else {
5009 vcpu->arch.emulate_ctxt.eflags &= ~X86_EFLAGS_TF;
5010 /*
5011 * "Certain debug exceptions may clear bit 0-3. The
5012 * remaining contents of the DR6 register are never
5013 * cleared by the processor".
5014 */
5015 vcpu->arch.dr6 &= ~15;
5016 vcpu->arch.dr6 |= DR6_BS;
5017 kvm_queue_exception(vcpu, DB_VECTOR);
5018 }
5019 }
5020}
5021
5022static bool kvm_vcpu_check_breakpoint(struct kvm_vcpu *vcpu, int *r)
5023{
5024 struct kvm_run *kvm_run = vcpu->run;
5025 unsigned long eip = vcpu->arch.emulate_ctxt.eip;
5026 u32 dr6 = 0;
5027
5028 if (unlikely(vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP) &&
5029 (vcpu->arch.guest_debug_dr7 & DR7_BP_EN_MASK)) {
5030 dr6 = kvm_vcpu_check_hw_bp(eip, 0,
5031 vcpu->arch.guest_debug_dr7,
5032 vcpu->arch.eff_db);
5033
5034 if (dr6 != 0) {
5035 kvm_run->debug.arch.dr6 = dr6 | DR6_FIXED_1;
5036 kvm_run->debug.arch.pc = kvm_rip_read(vcpu) +
5037 get_segment_base(vcpu, VCPU_SREG_CS);
5038
5039 kvm_run->debug.arch.exception = DB_VECTOR;
5040 kvm_run->exit_reason = KVM_EXIT_DEBUG;
5041 *r = EMULATE_USER_EXIT;
5042 return true;
5043 }
5044 }
5045
5046 if (unlikely(vcpu->arch.dr7 & DR7_BP_EN_MASK)) {
5047 dr6 = kvm_vcpu_check_hw_bp(eip, 0,
5048 vcpu->arch.dr7,
5049 vcpu->arch.db);
5050
5051 if (dr6 != 0) {
5052 vcpu->arch.dr6 &= ~15;
5053 vcpu->arch.dr6 |= dr6;
5054 kvm_queue_exception(vcpu, DB_VECTOR);
5055 *r = EMULATE_DONE;
5056 return true;
5057 }
5058 }
5059
5060 return false;
5061}
5062
4958int x86_emulate_instruction(struct kvm_vcpu *vcpu, 5063int x86_emulate_instruction(struct kvm_vcpu *vcpu,
4959 unsigned long cr2, 5064 unsigned long cr2,
4960 int emulation_type, 5065 int emulation_type,
@@ -4975,6 +5080,16 @@ int x86_emulate_instruction(struct kvm_vcpu *vcpu,
4975 5080
4976 if (!(emulation_type & EMULTYPE_NO_DECODE)) { 5081 if (!(emulation_type & EMULTYPE_NO_DECODE)) {
4977 init_emulate_ctxt(vcpu); 5082 init_emulate_ctxt(vcpu);
5083
5084 /*
5085 * We will reenter on the same instruction since
5086 * we do not set complete_userspace_io. This does not
5087 * handle watchpoints yet, those would be handled in
5088 * the emulate_ops.
5089 */
5090 if (kvm_vcpu_check_breakpoint(vcpu, &r))
5091 return r;
5092
4978 ctxt->interruptibility = 0; 5093 ctxt->interruptibility = 0;
4979 ctxt->have_exception = false; 5094 ctxt->have_exception = false;
4980 ctxt->perm_ok = false; 5095 ctxt->perm_ok = false;
@@ -5031,17 +5146,18 @@ restart:
5031 inject_emulated_exception(vcpu); 5146 inject_emulated_exception(vcpu);
5032 r = EMULATE_DONE; 5147 r = EMULATE_DONE;
5033 } else if (vcpu->arch.pio.count) { 5148 } else if (vcpu->arch.pio.count) {
5034 if (!vcpu->arch.pio.in) 5149 if (!vcpu->arch.pio.in) {
5150 /* FIXME: return into emulator if single-stepping. */
5035 vcpu->arch.pio.count = 0; 5151 vcpu->arch.pio.count = 0;
5036 else { 5152 } else {
5037 writeback = false; 5153 writeback = false;
5038 vcpu->arch.complete_userspace_io = complete_emulated_pio; 5154 vcpu->arch.complete_userspace_io = complete_emulated_pio;
5039 } 5155 }
5040 r = EMULATE_DO_MMIO; 5156 r = EMULATE_USER_EXIT;
5041 } else if (vcpu->mmio_needed) { 5157 } else if (vcpu->mmio_needed) {
5042 if (!vcpu->mmio_is_write) 5158 if (!vcpu->mmio_is_write)
5043 writeback = false; 5159 writeback = false;
5044 r = EMULATE_DO_MMIO; 5160 r = EMULATE_USER_EXIT;
5045 vcpu->arch.complete_userspace_io = complete_emulated_mmio; 5161 vcpu->arch.complete_userspace_io = complete_emulated_mmio;
5046 } else if (r == EMULATION_RESTART) 5162 } else if (r == EMULATION_RESTART)
5047 goto restart; 5163 goto restart;
@@ -5050,10 +5166,12 @@ restart:
5050 5166
5051 if (writeback) { 5167 if (writeback) {
5052 toggle_interruptibility(vcpu, ctxt->interruptibility); 5168 toggle_interruptibility(vcpu, ctxt->interruptibility);
5053 kvm_set_rflags(vcpu, ctxt->eflags);
5054 kvm_make_request(KVM_REQ_EVENT, vcpu); 5169 kvm_make_request(KVM_REQ_EVENT, vcpu);
5055 vcpu->arch.emulate_regs_need_sync_to_vcpu = false; 5170 vcpu->arch.emulate_regs_need_sync_to_vcpu = false;
5056 kvm_rip_write(vcpu, ctxt->eip); 5171 kvm_rip_write(vcpu, ctxt->eip);
5172 if (r == EMULATE_DONE)
5173 kvm_vcpu_check_singlestep(vcpu, &r);
5174 kvm_set_rflags(vcpu, ctxt->eflags);
5057 } else 5175 } else
5058 vcpu->arch.emulate_regs_need_sync_to_vcpu = true; 5176 vcpu->arch.emulate_regs_need_sync_to_vcpu = true;
5059 5177
@@ -5347,7 +5465,7 @@ static struct notifier_block pvclock_gtod_notifier = {
5347int kvm_arch_init(void *opaque) 5465int kvm_arch_init(void *opaque)
5348{ 5466{
5349 int r; 5467 int r;
5350 struct kvm_x86_ops *ops = (struct kvm_x86_ops *)opaque; 5468 struct kvm_x86_ops *ops = opaque;
5351 5469
5352 if (kvm_x86_ops) { 5470 if (kvm_x86_ops) {
5353 printk(KERN_ERR "kvm: already loaded the other module\n"); 5471 printk(KERN_ERR "kvm: already loaded the other module\n");
@@ -5495,6 +5613,23 @@ int kvm_hv_hypercall(struct kvm_vcpu *vcpu)
5495 return 1; 5613 return 1;
5496} 5614}
5497 5615
5616/*
5617 * kvm_pv_kick_cpu_op: Kick a vcpu.
5618 *
5619 * @apicid - apicid of vcpu to be kicked.
5620 */
5621static void kvm_pv_kick_cpu_op(struct kvm *kvm, unsigned long flags, int apicid)
5622{
5623 struct kvm_lapic_irq lapic_irq;
5624
5625 lapic_irq.shorthand = 0;
5626 lapic_irq.dest_mode = 0;
5627 lapic_irq.dest_id = apicid;
5628
5629 lapic_irq.delivery_mode = APIC_DM_REMRD;
5630 kvm_irq_delivery_to_apic(kvm, 0, &lapic_irq, NULL);
5631}
5632
5498int kvm_emulate_hypercall(struct kvm_vcpu *vcpu) 5633int kvm_emulate_hypercall(struct kvm_vcpu *vcpu)
5499{ 5634{
5500 unsigned long nr, a0, a1, a2, a3, ret; 5635 unsigned long nr, a0, a1, a2, a3, ret;
@@ -5528,6 +5663,10 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu)
5528 case KVM_HC_VAPIC_POLL_IRQ: 5663 case KVM_HC_VAPIC_POLL_IRQ:
5529 ret = 0; 5664 ret = 0;
5530 break; 5665 break;
5666 case KVM_HC_KICK_CPU:
5667 kvm_pv_kick_cpu_op(vcpu->kvm, a0, a1);
5668 ret = 0;
5669 break;
5531 default: 5670 default:
5532 ret = -KVM_ENOSYS; 5671 ret = -KVM_ENOSYS;
5533 break; 5672 break;
@@ -5689,29 +5828,6 @@ static void process_nmi(struct kvm_vcpu *vcpu)
5689 kvm_make_request(KVM_REQ_EVENT, vcpu); 5828 kvm_make_request(KVM_REQ_EVENT, vcpu);
5690} 5829}
5691 5830
5692static void kvm_gen_update_masterclock(struct kvm *kvm)
5693{
5694#ifdef CONFIG_X86_64
5695 int i;
5696 struct kvm_vcpu *vcpu;
5697 struct kvm_arch *ka = &kvm->arch;
5698
5699 spin_lock(&ka->pvclock_gtod_sync_lock);
5700 kvm_make_mclock_inprogress_request(kvm);
5701 /* no guest entries from this point */
5702 pvclock_update_vm_gtod_copy(kvm);
5703
5704 kvm_for_each_vcpu(i, vcpu, kvm)
5705 set_bit(KVM_REQ_CLOCK_UPDATE, &vcpu->requests);
5706
5707 /* guest entries allowed */
5708 kvm_for_each_vcpu(i, vcpu, kvm)
5709 clear_bit(KVM_REQ_MCLOCK_INPROGRESS, &vcpu->requests);
5710
5711 spin_unlock(&ka->pvclock_gtod_sync_lock);
5712#endif
5713}
5714
5715static void vcpu_scan_ioapic(struct kvm_vcpu *vcpu) 5831static void vcpu_scan_ioapic(struct kvm_vcpu *vcpu)
5716{ 5832{
5717 u64 eoi_exit_bitmap[4]; 5833 u64 eoi_exit_bitmap[4];
@@ -5950,6 +6066,7 @@ static int __vcpu_run(struct kvm_vcpu *vcpu)
5950 kvm_apic_accept_events(vcpu); 6066 kvm_apic_accept_events(vcpu);
5951 switch(vcpu->arch.mp_state) { 6067 switch(vcpu->arch.mp_state) {
5952 case KVM_MP_STATE_HALTED: 6068 case KVM_MP_STATE_HALTED:
6069 vcpu->arch.pv.pv_unhalted = false;
5953 vcpu->arch.mp_state = 6070 vcpu->arch.mp_state =
5954 KVM_MP_STATE_RUNNABLE; 6071 KVM_MP_STATE_RUNNABLE;
5955 case KVM_MP_STATE_RUNNABLE: 6072 case KVM_MP_STATE_RUNNABLE:
@@ -6061,6 +6178,8 @@ static int complete_emulated_mmio(struct kvm_vcpu *vcpu)
6061 6178
6062 if (vcpu->mmio_cur_fragment == vcpu->mmio_nr_fragments) { 6179 if (vcpu->mmio_cur_fragment == vcpu->mmio_nr_fragments) {
6063 vcpu->mmio_needed = 0; 6180 vcpu->mmio_needed = 0;
6181
6182 /* FIXME: return into emulator if single-stepping. */
6064 if (vcpu->mmio_is_write) 6183 if (vcpu->mmio_is_write)
6065 return 1; 6184 return 1;
6066 vcpu->mmio_read_completed = 1; 6185 vcpu->mmio_read_completed = 1;
@@ -6249,7 +6368,12 @@ int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu,
6249 struct kvm_mp_state *mp_state) 6368 struct kvm_mp_state *mp_state)
6250{ 6369{
6251 kvm_apic_accept_events(vcpu); 6370 kvm_apic_accept_events(vcpu);
6252 mp_state->mp_state = vcpu->arch.mp_state; 6371 if (vcpu->arch.mp_state == KVM_MP_STATE_HALTED &&
6372 vcpu->arch.pv.pv_unhalted)
6373 mp_state->mp_state = KVM_MP_STATE_RUNNABLE;
6374 else
6375 mp_state->mp_state = vcpu->arch.mp_state;
6376
6253 return 0; 6377 return 0;
6254} 6378}
6255 6379
@@ -6770,6 +6894,7 @@ int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu)
6770 BUG_ON(vcpu->kvm == NULL); 6894 BUG_ON(vcpu->kvm == NULL);
6771 kvm = vcpu->kvm; 6895 kvm = vcpu->kvm;
6772 6896
6897 vcpu->arch.pv.pv_unhalted = false;
6773 vcpu->arch.emulate_ctxt.ops = &emulate_ops; 6898 vcpu->arch.emulate_ctxt.ops = &emulate_ops;
6774 if (!irqchip_in_kernel(kvm) || kvm_vcpu_is_bsp(vcpu)) 6899 if (!irqchip_in_kernel(kvm) || kvm_vcpu_is_bsp(vcpu))
6775 vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE; 6900 vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE;
@@ -7019,6 +7144,15 @@ out_free:
7019 return -ENOMEM; 7144 return -ENOMEM;
7020} 7145}
7021 7146
7147void kvm_arch_memslots_updated(struct kvm *kvm)
7148{
7149 /*
7150 * memslots->generation has been incremented.
7151 * mmio generation may have reached its maximum value.
7152 */
7153 kvm_mmu_invalidate_mmio_sptes(kvm);
7154}
7155
7022int kvm_arch_prepare_memory_region(struct kvm *kvm, 7156int kvm_arch_prepare_memory_region(struct kvm *kvm,
7023 struct kvm_memory_slot *memslot, 7157 struct kvm_memory_slot *memslot,
7024 struct kvm_userspace_memory_region *mem, 7158 struct kvm_userspace_memory_region *mem,
@@ -7079,11 +7213,6 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
7079 */ 7213 */
7080 if ((change != KVM_MR_DELETE) && (mem->flags & KVM_MEM_LOG_DIRTY_PAGES)) 7214 if ((change != KVM_MR_DELETE) && (mem->flags & KVM_MEM_LOG_DIRTY_PAGES))
7081 kvm_mmu_slot_remove_write_access(kvm, mem->slot); 7215 kvm_mmu_slot_remove_write_access(kvm, mem->slot);
7082 /*
7083 * If memory slot is created, or moved, we need to clear all
7084 * mmio sptes.
7085 */
7086 kvm_mmu_invalidate_mmio_sptes(kvm);
7087} 7216}
7088 7217
7089void kvm_arch_flush_shadow_all(struct kvm *kvm) 7218void kvm_arch_flush_shadow_all(struct kvm *kvm)
@@ -7103,6 +7232,7 @@ int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu)
7103 !vcpu->arch.apf.halted) 7232 !vcpu->arch.apf.halted)
7104 || !list_empty_careful(&vcpu->async_pf.done) 7233 || !list_empty_careful(&vcpu->async_pf.done)
7105 || kvm_apic_has_events(vcpu) 7234 || kvm_apic_has_events(vcpu)
7235 || vcpu->arch.pv.pv_unhalted
7106 || atomic_read(&vcpu->arch.nmi_queued) || 7236 || atomic_read(&vcpu->arch.nmi_queued) ||
7107 (kvm_arch_interrupt_allowed(vcpu) && 7237 (kvm_arch_interrupt_allowed(vcpu) &&
7108 kvm_cpu_has_interrupt(vcpu)); 7238 kvm_cpu_has_interrupt(vcpu));
diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c
index 6a22c19da663..bdf8532494fe 100644
--- a/arch/x86/lguest/boot.c
+++ b/arch/x86/lguest/boot.c
@@ -7,8 +7,7 @@
7 * kernel and insert a module (lg.ko) which allows us to run other Linux 7 * kernel and insert a module (lg.ko) which allows us to run other Linux
8 * kernels the same way we'd run processes. We call the first kernel the Host, 8 * kernels the same way we'd run processes. We call the first kernel the Host,
9 * and the others the Guests. The program which sets up and configures Guests 9 * and the others the Guests. The program which sets up and configures Guests
10 * (such as the example in Documentation/virtual/lguest/lguest.c) is called the 10 * (such as the example in tools/lguest/lguest.c) is called the Launcher.
11 * Launcher.
12 * 11 *
13 * Secondly, we only run specially modified Guests, not normal kernels: setting 12 * Secondly, we only run specially modified Guests, not normal kernels: setting
14 * CONFIG_LGUEST_GUEST to "y" compiles this file into the kernel so it knows 13 * CONFIG_LGUEST_GUEST to "y" compiles this file into the kernel so it knows
@@ -1057,6 +1056,12 @@ static void lguest_load_sp0(struct tss_struct *tss,
1057} 1056}
1058 1057
1059/* Let's just say, I wouldn't do debugging under a Guest. */ 1058/* Let's just say, I wouldn't do debugging under a Guest. */
1059static unsigned long lguest_get_debugreg(int regno)
1060{
1061 /* FIXME: Implement */
1062 return 0;
1063}
1064
1060static void lguest_set_debugreg(int regno, unsigned long value) 1065static void lguest_set_debugreg(int regno, unsigned long value)
1061{ 1066{
1062 /* FIXME: Implement */ 1067 /* FIXME: Implement */
@@ -1304,6 +1309,7 @@ __init void lguest_init(void)
1304 pv_cpu_ops.load_tr_desc = lguest_load_tr_desc; 1309 pv_cpu_ops.load_tr_desc = lguest_load_tr_desc;
1305 pv_cpu_ops.set_ldt = lguest_set_ldt; 1310 pv_cpu_ops.set_ldt = lguest_set_ldt;
1306 pv_cpu_ops.load_tls = lguest_load_tls; 1311 pv_cpu_ops.load_tls = lguest_load_tls;
1312 pv_cpu_ops.get_debugreg = lguest_get_debugreg;
1307 pv_cpu_ops.set_debugreg = lguest_set_debugreg; 1313 pv_cpu_ops.set_debugreg = lguest_set_debugreg;
1308 pv_cpu_ops.clts = lguest_clts; 1314 pv_cpu_ops.clts = lguest_clts;
1309 pv_cpu_ops.read_cr0 = lguest_read_cr0; 1315 pv_cpu_ops.read_cr0 = lguest_read_cr0;
diff --git a/arch/x86/lib/csum-wrappers_64.c b/arch/x86/lib/csum-wrappers_64.c
index 25b7ae8d058a..7609e0e421ec 100644
--- a/arch/x86/lib/csum-wrappers_64.c
+++ b/arch/x86/lib/csum-wrappers_64.c
@@ -6,6 +6,7 @@
6 */ 6 */
7#include <asm/checksum.h> 7#include <asm/checksum.h>
8#include <linux/module.h> 8#include <linux/module.h>
9#include <asm/smap.h>
9 10
10/** 11/**
11 * csum_partial_copy_from_user - Copy and checksum from user space. 12 * csum_partial_copy_from_user - Copy and checksum from user space.
@@ -52,8 +53,10 @@ csum_partial_copy_from_user(const void __user *src, void *dst,
52 len -= 2; 53 len -= 2;
53 } 54 }
54 } 55 }
56 stac();
55 isum = csum_partial_copy_generic((__force const void *)src, 57 isum = csum_partial_copy_generic((__force const void *)src,
56 dst, len, isum, errp, NULL); 58 dst, len, isum, errp, NULL);
59 clac();
57 if (unlikely(*errp)) 60 if (unlikely(*errp))
58 goto out_err; 61 goto out_err;
59 62
@@ -82,6 +85,8 @@ __wsum
82csum_partial_copy_to_user(const void *src, void __user *dst, 85csum_partial_copy_to_user(const void *src, void __user *dst,
83 int len, __wsum isum, int *errp) 86 int len, __wsum isum, int *errp)
84{ 87{
88 __wsum ret;
89
85 might_sleep(); 90 might_sleep();
86 91
87 if (unlikely(!access_ok(VERIFY_WRITE, dst, len))) { 92 if (unlikely(!access_ok(VERIFY_WRITE, dst, len))) {
@@ -105,8 +110,11 @@ csum_partial_copy_to_user(const void *src, void __user *dst,
105 } 110 }
106 111
107 *errp = 0; 112 *errp = 0;
108 return csum_partial_copy_generic(src, (void __force *)dst, 113 stac();
109 len, isum, NULL, errp); 114 ret = csum_partial_copy_generic(src, (void __force *)dst,
115 len, isum, NULL, errp);
116 clac();
117 return ret;
110} 118}
111EXPORT_SYMBOL(csum_partial_copy_to_user); 119EXPORT_SYMBOL(csum_partial_copy_to_user);
112 120
diff --git a/arch/x86/lib/usercopy_64.c b/arch/x86/lib/usercopy_64.c
index 906fea315791..c905e89e19fe 100644
--- a/arch/x86/lib/usercopy_64.c
+++ b/arch/x86/lib/usercopy_64.c
@@ -68,7 +68,7 @@ EXPORT_SYMBOL(copy_in_user);
68 * Since protection fault in copy_from/to_user is not a normal situation, 68 * Since protection fault in copy_from/to_user is not a normal situation,
69 * it is not necessary to optimize tail handling. 69 * it is not necessary to optimize tail handling.
70 */ 70 */
71unsigned long 71__visible unsigned long
72copy_user_handle_tail(char *to, char *from, unsigned len, unsigned zerorest) 72copy_user_handle_tail(char *to, char *from, unsigned len, unsigned zerorest)
73{ 73{
74 char c; 74 char c;
diff --git a/arch/x86/lib/x86-opcode-map.txt b/arch/x86/lib/x86-opcode-map.txt
index 5d7e51f3fd28..533a85e3a07e 100644
--- a/arch/x86/lib/x86-opcode-map.txt
+++ b/arch/x86/lib/x86-opcode-map.txt
@@ -1,10 +1,8 @@
1# x86 Opcode Maps 1# x86 Opcode Maps
2# 2#
3# This is (mostly) based on following documentations. 3# This is (mostly) based on following documentations.
4# - Intel(R) 64 and IA-32 Architectures Software Developer's Manual Vol.2 4# - Intel(R) 64 and IA-32 Architectures Software Developer's Manual Vol.2C
5# (#325383-040US, October 2011) 5# (#326018-047US, June 2013)
6# - Intel(R) Advanced Vector Extensions Programming Reference
7# (#319433-011,JUNE 2011).
8# 6#
9#<Opcode maps> 7#<Opcode maps>
10# Table: table-name 8# Table: table-name
@@ -29,6 +27,7 @@
29# - (F3): the last prefix is 0xF3 27# - (F3): the last prefix is 0xF3
30# - (F2): the last prefix is 0xF2 28# - (F2): the last prefix is 0xF2
31# - (!F3) : the last prefix is not 0xF3 (including non-last prefix case) 29# - (!F3) : the last prefix is not 0xF3 (including non-last prefix case)
30# - (66&F2): Both 0x66 and 0xF2 prefixes are specified.
32 31
33Table: one byte opcode 32Table: one byte opcode
34Referrer: 33Referrer:
@@ -246,8 +245,8 @@ c2: RETN Iw (f64)
246c3: RETN 245c3: RETN
247c4: LES Gz,Mp (i64) | VEX+2byte (Prefix) 246c4: LES Gz,Mp (i64) | VEX+2byte (Prefix)
248c5: LDS Gz,Mp (i64) | VEX+1byte (Prefix) 247c5: LDS Gz,Mp (i64) | VEX+1byte (Prefix)
249c6: Grp11 Eb,Ib (1A) 248c6: Grp11A Eb,Ib (1A)
250c7: Grp11 Ev,Iz (1A) 249c7: Grp11B Ev,Iz (1A)
251c8: ENTER Iw,Ib 250c8: ENTER Iw,Ib
252c9: LEAVE (d64) 251c9: LEAVE (d64)
253ca: RETF Iw 252ca: RETF Iw
@@ -293,8 +292,8 @@ ef: OUT DX,eAX
293# 0xf0 - 0xff 292# 0xf0 - 0xff
294f0: LOCK (Prefix) 293f0: LOCK (Prefix)
295f1: 294f1:
296f2: REPNE (Prefix) 295f2: REPNE (Prefix) | XACQUIRE (Prefix)
297f3: REP/REPE (Prefix) 296f3: REP/REPE (Prefix) | XRELEASE (Prefix)
298f4: HLT 297f4: HLT
299f5: CMC 298f5: CMC
300f6: Grp3_1 Eb (1A) 299f6: Grp3_1 Eb (1A)
@@ -326,7 +325,8 @@ AVXcode: 1
3260a: 3250a:
3270b: UD2 (1B) 3260b: UD2 (1B)
3280c: 3270c:
3290d: NOP Ev | GrpP 328# AMD's prefetch group. Intel supports prefetchw(/1) only.
3290d: GrpP
3300e: FEMMS 3300e: FEMMS
331# 3DNow! uses the last imm byte as opcode extension. 331# 3DNow! uses the last imm byte as opcode extension.
3320f: 3DNow! Pq,Qq,Ib 3320f: 3DNow! Pq,Qq,Ib
@@ -729,12 +729,12 @@ dc: VAESENC Vdq,Hdq,Wdq (66),(v1)
729dd: VAESENCLAST Vdq,Hdq,Wdq (66),(v1) 729dd: VAESENCLAST Vdq,Hdq,Wdq (66),(v1)
730de: VAESDEC Vdq,Hdq,Wdq (66),(v1) 730de: VAESDEC Vdq,Hdq,Wdq (66),(v1)
731df: VAESDECLAST Vdq,Hdq,Wdq (66),(v1) 731df: VAESDECLAST Vdq,Hdq,Wdq (66),(v1)
732f0: MOVBE Gy,My | MOVBE Gw,Mw (66) | CRC32 Gd,Eb (F2) 732f0: MOVBE Gy,My | MOVBE Gw,Mw (66) | CRC32 Gd,Eb (F2) | CRC32 Gd,Eb (66&F2)
733f1: MOVBE My,Gy | MOVBE Mw,Gw (66) | CRC32 Gd,Ey (F2) 733f1: MOVBE My,Gy | MOVBE Mw,Gw (66) | CRC32 Gd,Ey (F2) | CRC32 Gd,Ew (66&F2)
734f2: ANDN Gy,By,Ey (v) 734f2: ANDN Gy,By,Ey (v)
735f3: Grp17 (1A) 735f3: Grp17 (1A)
736f5: BZHI Gy,Ey,By (v) | PEXT Gy,By,Ey (F3),(v) | PDEP Gy,By,Ey (F2),(v) 736f5: BZHI Gy,Ey,By (v) | PEXT Gy,By,Ey (F3),(v) | PDEP Gy,By,Ey (F2),(v)
737f6: MULX By,Gy,rDX,Ey (F2),(v) 737f6: ADCX Gy,Ey (66) | ADOX Gy,Ey (F3) | MULX By,Gy,rDX,Ey (F2),(v)
738f7: BEXTR Gy,Ey,By (v) | SHLX Gy,Ey,By (66),(v) | SARX Gy,Ey,By (F3),(v) | SHRX Gy,Ey,By (F2),(v) 738f7: BEXTR Gy,Ey,By (v) | SHLX Gy,Ey,By (66),(v) | SARX Gy,Ey,By (F3),(v) | SHRX Gy,Ey,By (F2),(v)
739EndTable 739EndTable
740 740
@@ -861,8 +861,8 @@ EndTable
861 861
862GrpTable: Grp7 862GrpTable: Grp7
8630: SGDT Ms | VMCALL (001),(11B) | VMLAUNCH (010),(11B) | VMRESUME (011),(11B) | VMXOFF (100),(11B) 8630: SGDT Ms | VMCALL (001),(11B) | VMLAUNCH (010),(11B) | VMRESUME (011),(11B) | VMXOFF (100),(11B)
8641: SIDT Ms | MONITOR (000),(11B) | MWAIT (001) 8641: SIDT Ms | MONITOR (000),(11B) | MWAIT (001),(11B) | CLAC (010),(11B) | STAC (011),(11B)
8652: LGDT Ms | XGETBV (000),(11B) | XSETBV (001),(11B) | VMFUNC (100),(11B) 8652: LGDT Ms | XGETBV (000),(11B) | XSETBV (001),(11B) | VMFUNC (100),(11B) | XEND (101)(11B) | XTEST (110)(11B)
8663: LIDT Ms 8663: LIDT Ms
8674: SMSW Mw/Rv 8674: SMSW Mw/Rv
8685: 8685:
@@ -880,15 +880,21 @@ EndTable
880GrpTable: Grp9 880GrpTable: Grp9
8811: CMPXCHG8B/16B Mq/Mdq 8811: CMPXCHG8B/16B Mq/Mdq
8826: VMPTRLD Mq | VMCLEAR Mq (66) | VMXON Mq (F3) | RDRAND Rv (11B) 8826: VMPTRLD Mq | VMCLEAR Mq (66) | VMXON Mq (F3) | RDRAND Rv (11B)
8837: VMPTRST Mq | VMPTRST Mq (F3) 8837: VMPTRST Mq | VMPTRST Mq (F3) | RDSEED Rv (11B)
884EndTable 884EndTable
885 885
886GrpTable: Grp10 886GrpTable: Grp10
887EndTable 887EndTable
888 888
889GrpTable: Grp11 889# Grp11A and Grp11B are expressed as Grp11 in Intel SDM
890# Note: the operands are given by group opcode 890GrpTable: Grp11A
8910: MOV 8910: MOV Eb,Ib
8927: XABORT Ib (000),(11B)
893EndTable
894
895GrpTable: Grp11B
8960: MOV Eb,Iz
8977: XBEGIN Jz (000),(11B)
892EndTable 898EndTable
893 899
894GrpTable: Grp12 900GrpTable: Grp12
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
index 654be4ae3047..3aaeffcfd67a 100644
--- a/arch/x86/mm/fault.c
+++ b/arch/x86/mm/fault.c
@@ -842,23 +842,15 @@ do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address,
842 force_sig_info_fault(SIGBUS, code, address, tsk, fault); 842 force_sig_info_fault(SIGBUS, code, address, tsk, fault);
843} 843}
844 844
845static noinline int 845static noinline void
846mm_fault_error(struct pt_regs *regs, unsigned long error_code, 846mm_fault_error(struct pt_regs *regs, unsigned long error_code,
847 unsigned long address, unsigned int fault) 847 unsigned long address, unsigned int fault)
848{ 848{
849 /* 849 if (fatal_signal_pending(current) && !(error_code & PF_USER)) {
850 * Pagefault was interrupted by SIGKILL. We have no reason to 850 up_read(&current->mm->mmap_sem);
851 * continue pagefault. 851 no_context(regs, error_code, address, 0, 0);
852 */ 852 return;
853 if (fatal_signal_pending(current)) {
854 if (!(fault & VM_FAULT_RETRY))
855 up_read(&current->mm->mmap_sem);
856 if (!(error_code & PF_USER))
857 no_context(regs, error_code, address, 0, 0);
858 return 1;
859 } 853 }
860 if (!(fault & VM_FAULT_ERROR))
861 return 0;
862 854
863 if (fault & VM_FAULT_OOM) { 855 if (fault & VM_FAULT_OOM) {
864 /* Kernel mode? Handle exceptions or die: */ 856 /* Kernel mode? Handle exceptions or die: */
@@ -866,7 +858,7 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code,
866 up_read(&current->mm->mmap_sem); 858 up_read(&current->mm->mmap_sem);
867 no_context(regs, error_code, address, 859 no_context(regs, error_code, address,
868 SIGSEGV, SEGV_MAPERR); 860 SIGSEGV, SEGV_MAPERR);
869 return 1; 861 return;
870 } 862 }
871 863
872 up_read(&current->mm->mmap_sem); 864 up_read(&current->mm->mmap_sem);
@@ -884,7 +876,6 @@ mm_fault_error(struct pt_regs *regs, unsigned long error_code,
884 else 876 else
885 BUG(); 877 BUG();
886 } 878 }
887 return 1;
888} 879}
889 880
890static int spurious_fault_check(unsigned long error_code, pte_t *pte) 881static int spurious_fault_check(unsigned long error_code, pte_t *pte)
@@ -1011,9 +1002,7 @@ __do_page_fault(struct pt_regs *regs, unsigned long error_code)
1011 unsigned long address; 1002 unsigned long address;
1012 struct mm_struct *mm; 1003 struct mm_struct *mm;
1013 int fault; 1004 int fault;
1014 int write = error_code & PF_WRITE; 1005 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
1015 unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE |
1016 (write ? FAULT_FLAG_WRITE : 0);
1017 1006
1018 tsk = current; 1007 tsk = current;
1019 mm = tsk->mm; 1008 mm = tsk->mm;
@@ -1083,6 +1072,7 @@ __do_page_fault(struct pt_regs *regs, unsigned long error_code)
1083 if (user_mode_vm(regs)) { 1072 if (user_mode_vm(regs)) {
1084 local_irq_enable(); 1073 local_irq_enable();
1085 error_code |= PF_USER; 1074 error_code |= PF_USER;
1075 flags |= FAULT_FLAG_USER;
1086 } else { 1076 } else {
1087 if (regs->flags & X86_EFLAGS_IF) 1077 if (regs->flags & X86_EFLAGS_IF)
1088 local_irq_enable(); 1078 local_irq_enable();
@@ -1109,6 +1099,9 @@ __do_page_fault(struct pt_regs *regs, unsigned long error_code)
1109 return; 1099 return;
1110 } 1100 }
1111 1101
1102 if (error_code & PF_WRITE)
1103 flags |= FAULT_FLAG_WRITE;
1104
1112 /* 1105 /*
1113 * When running in the kernel we expect faults to occur only to 1106 * When running in the kernel we expect faults to occur only to
1114 * addresses in user space. All other faults represent errors in 1107 * addresses in user space. All other faults represent errors in
@@ -1187,9 +1180,17 @@ good_area:
1187 */ 1180 */
1188 fault = handle_mm_fault(mm, vma, address, flags); 1181 fault = handle_mm_fault(mm, vma, address, flags);
1189 1182
1190 if (unlikely(fault & (VM_FAULT_RETRY|VM_FAULT_ERROR))) { 1183 /*
1191 if (mm_fault_error(regs, error_code, address, fault)) 1184 * If we need to retry but a fatal signal is pending, handle the
1192 return; 1185 * signal first. We do not need to release the mmap_sem because it
1186 * would already be released in __lock_page_or_retry in mm/filemap.c.
1187 */
1188 if (unlikely((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)))
1189 return;
1190
1191 if (unlikely(fault & VM_FAULT_ERROR)) {
1192 mm_fault_error(regs, error_code, address, fault);
1193 return;
1193 } 1194 }
1194 1195
1195 /* 1196 /*
diff --git a/arch/x86/mm/hugetlbpage.c b/arch/x86/mm/hugetlbpage.c
index 7e73e8c69096..9d980d88b747 100644
--- a/arch/x86/mm/hugetlbpage.c
+++ b/arch/x86/mm/hugetlbpage.c
@@ -59,6 +59,10 @@ follow_huge_pmd(struct mm_struct *mm, unsigned long address,
59 return NULL; 59 return NULL;
60} 60}
61 61
62int pmd_huge_support(void)
63{
64 return 0;
65}
62#else 66#else
63 67
64struct page * 68struct page *
@@ -77,6 +81,10 @@ int pud_huge(pud_t pud)
77 return !!(pud_val(pud) & _PAGE_PSE); 81 return !!(pud_val(pud) & _PAGE_PSE);
78} 82}
79 83
84int pmd_huge_support(void)
85{
86 return 1;
87}
80#endif 88#endif
81 89
82/* x86_64 also uses this file */ 90/* x86_64 also uses this file */
diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c
index 2ec29ac78ae6..04664cdb7fda 100644
--- a/arch/x86/mm/init.c
+++ b/arch/x86/mm/init.c
@@ -78,8 +78,8 @@ __ref void *alloc_low_pages(unsigned int num)
78 return __va(pfn << PAGE_SHIFT); 78 return __va(pfn << PAGE_SHIFT);
79} 79}
80 80
81/* need 4 4k for initial PMD_SIZE, 4k for 0-ISA_END_ADDRESS */ 81/* need 3 4k for initial PMD_SIZE, 3 4k for 0-ISA_END_ADDRESS */
82#define INIT_PGT_BUF_SIZE (5 * PAGE_SIZE) 82#define INIT_PGT_BUF_SIZE (6 * PAGE_SIZE)
83RESERVE_BRK(early_pgt_alloc, INIT_PGT_BUF_SIZE); 83RESERVE_BRK(early_pgt_alloc, INIT_PGT_BUF_SIZE);
84void __init early_alloc_pgt_buf(void) 84void __init early_alloc_pgt_buf(void)
85{ 85{
diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
index 0215e2c563ef..799580cabc78 100644
--- a/arch/x86/mm/ioremap.c
+++ b/arch/x86/mm/ioremap.c
@@ -487,7 +487,7 @@ __early_ioremap(resource_size_t phys_addr, unsigned long size, pgprot_t prot)
487 unsigned long offset; 487 unsigned long offset;
488 resource_size_t last_addr; 488 resource_size_t last_addr;
489 unsigned int nrpages; 489 unsigned int nrpages;
490 enum fixed_addresses idx0, idx; 490 enum fixed_addresses idx;
491 int i, slot; 491 int i, slot;
492 492
493 WARN_ON(system_state != SYSTEM_BOOTING); 493 WARN_ON(system_state != SYSTEM_BOOTING);
@@ -540,8 +540,7 @@ __early_ioremap(resource_size_t phys_addr, unsigned long size, pgprot_t prot)
540 /* 540 /*
541 * Ok, go for it.. 541 * Ok, go for it..
542 */ 542 */
543 idx0 = FIX_BTMAP_BEGIN - NR_FIX_BTMAPS*slot; 543 idx = FIX_BTMAP_BEGIN - NR_FIX_BTMAPS*slot;
544 idx = idx0;
545 while (nrpages > 0) { 544 while (nrpages > 0) {
546 early_set_fixmap(idx, phys_addr, prot); 545 early_set_fixmap(idx, phys_addr, prot);
547 phys_addr += PAGE_SIZE; 546 phys_addr += PAGE_SIZE;
diff --git a/arch/x86/mm/srat.c b/arch/x86/mm/srat.c
index cdd0da9dd530..266ca912f62e 100644
--- a/arch/x86/mm/srat.c
+++ b/arch/x86/mm/srat.c
@@ -146,6 +146,7 @@ int __init
146acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma) 146acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)
147{ 147{
148 u64 start, end; 148 u64 start, end;
149 u32 hotpluggable;
149 int node, pxm; 150 int node, pxm;
150 151
151 if (srat_disabled()) 152 if (srat_disabled())
@@ -154,7 +155,8 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)
154 goto out_err_bad_srat; 155 goto out_err_bad_srat;
155 if ((ma->flags & ACPI_SRAT_MEM_ENABLED) == 0) 156 if ((ma->flags & ACPI_SRAT_MEM_ENABLED) == 0)
156 goto out_err; 157 goto out_err;
157 if ((ma->flags & ACPI_SRAT_MEM_HOT_PLUGGABLE) && !save_add_info()) 158 hotpluggable = ma->flags & ACPI_SRAT_MEM_HOT_PLUGGABLE;
159 if (hotpluggable && !save_add_info())
158 goto out_err; 160 goto out_err;
159 161
160 start = ma->base_address; 162 start = ma->base_address;
@@ -174,9 +176,10 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)
174 176
175 node_set(node, numa_nodes_parsed); 177 node_set(node, numa_nodes_parsed);
176 178
177 printk(KERN_INFO "SRAT: Node %u PXM %u [mem %#010Lx-%#010Lx]\n", 179 pr_info("SRAT: Node %u PXM %u [mem %#010Lx-%#010Lx]%s\n",
178 node, pxm, 180 node, pxm,
179 (unsigned long long) start, (unsigned long long) end - 1); 181 (unsigned long long) start, (unsigned long long) end - 1,
182 hotpluggable ? " hotplug" : "");
180 183
181 return 0; 184 return 0;
182out_err_bad_srat: 185out_err_bad_srat:
diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c
index 282375f13c7e..ae699b3bbac8 100644
--- a/arch/x86/mm/tlb.c
+++ b/arch/x86/mm/tlb.c
@@ -103,6 +103,7 @@ static void flush_tlb_func(void *info)
103 if (f->flush_mm != this_cpu_read(cpu_tlbstate.active_mm)) 103 if (f->flush_mm != this_cpu_read(cpu_tlbstate.active_mm))
104 return; 104 return;
105 105
106 count_vm_event(NR_TLB_REMOTE_FLUSH_RECEIVED);
106 if (this_cpu_read(cpu_tlbstate.state) == TLBSTATE_OK) { 107 if (this_cpu_read(cpu_tlbstate.state) == TLBSTATE_OK) {
107 if (f->flush_end == TLB_FLUSH_ALL) 108 if (f->flush_end == TLB_FLUSH_ALL)
108 local_flush_tlb(); 109 local_flush_tlb();
@@ -130,6 +131,7 @@ void native_flush_tlb_others(const struct cpumask *cpumask,
130 info.flush_start = start; 131 info.flush_start = start;
131 info.flush_end = end; 132 info.flush_end = end;
132 133
134 count_vm_event(NR_TLB_REMOTE_FLUSH);
133 if (is_uv_system()) { 135 if (is_uv_system()) {
134 unsigned int cpu; 136 unsigned int cpu;
135 137
@@ -149,6 +151,7 @@ void flush_tlb_current_task(void)
149 151
150 preempt_disable(); 152 preempt_disable();
151 153
154 count_vm_event(NR_TLB_LOCAL_FLUSH_ALL);
152 local_flush_tlb(); 155 local_flush_tlb();
153 if (cpumask_any_but(mm_cpumask(mm), smp_processor_id()) < nr_cpu_ids) 156 if (cpumask_any_but(mm_cpumask(mm), smp_processor_id()) < nr_cpu_ids)
154 flush_tlb_others(mm_cpumask(mm), mm, 0UL, TLB_FLUSH_ALL); 157 flush_tlb_others(mm_cpumask(mm), mm, 0UL, TLB_FLUSH_ALL);
@@ -211,16 +214,19 @@ void flush_tlb_mm_range(struct mm_struct *mm, unsigned long start,
211 act_entries = mm->total_vm > tlb_entries ? tlb_entries : mm->total_vm; 214 act_entries = mm->total_vm > tlb_entries ? tlb_entries : mm->total_vm;
212 215
213 /* tlb_flushall_shift is on balance point, details in commit log */ 216 /* tlb_flushall_shift is on balance point, details in commit log */
214 if ((end - start) >> PAGE_SHIFT > act_entries >> tlb_flushall_shift) 217 if ((end - start) >> PAGE_SHIFT > act_entries >> tlb_flushall_shift) {
218 count_vm_event(NR_TLB_LOCAL_FLUSH_ALL);
215 local_flush_tlb(); 219 local_flush_tlb();
216 else { 220 } else {
217 if (has_large_page(mm, start, end)) { 221 if (has_large_page(mm, start, end)) {
218 local_flush_tlb(); 222 local_flush_tlb();
219 goto flush_all; 223 goto flush_all;
220 } 224 }
221 /* flush range by one by one 'invlpg' */ 225 /* flush range by one by one 'invlpg' */
222 for (addr = start; addr < end; addr += PAGE_SIZE) 226 for (addr = start; addr < end; addr += PAGE_SIZE) {
227 count_vm_event(NR_TLB_LOCAL_FLUSH_ONE);
223 __flush_tlb_single(addr); 228 __flush_tlb_single(addr);
229 }
224 230
225 if (cpumask_any_but(mm_cpumask(mm), 231 if (cpumask_any_but(mm_cpumask(mm),
226 smp_processor_id()) < nr_cpu_ids) 232 smp_processor_id()) < nr_cpu_ids)
@@ -256,6 +262,7 @@ void flush_tlb_page(struct vm_area_struct *vma, unsigned long start)
256 262
257static void do_flush_tlb_all(void *info) 263static void do_flush_tlb_all(void *info)
258{ 264{
265 count_vm_event(NR_TLB_REMOTE_FLUSH_RECEIVED);
259 __flush_tlb_all(); 266 __flush_tlb_all();
260 if (this_cpu_read(cpu_tlbstate.state) == TLBSTATE_LAZY) 267 if (this_cpu_read(cpu_tlbstate.state) == TLBSTATE_LAZY)
261 leave_mm(smp_processor_id()); 268 leave_mm(smp_processor_id());
@@ -263,6 +270,7 @@ static void do_flush_tlb_all(void *info)
263 270
264void flush_tlb_all(void) 271void flush_tlb_all(void)
265{ 272{
273 count_vm_event(NR_TLB_REMOTE_FLUSH);
266 on_each_cpu(do_flush_tlb_all, NULL, 1); 274 on_each_cpu(do_flush_tlb_all, NULL, 1);
267} 275}
268 276
diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c
index 48768df2471a..6890d8498e0b 100644
--- a/arch/x86/oprofile/nmi_int.c
+++ b/arch/x86/oprofile/nmi_int.c
@@ -403,7 +403,7 @@ static void nmi_cpu_down(void *dummy)
403 nmi_cpu_shutdown(dummy); 403 nmi_cpu_shutdown(dummy);
404} 404}
405 405
406static int nmi_create_files(struct super_block *sb, struct dentry *root) 406static int nmi_create_files(struct dentry *root)
407{ 407{
408 unsigned int i; 408 unsigned int i;
409 409
@@ -420,14 +420,14 @@ static int nmi_create_files(struct super_block *sb, struct dentry *root)
420 continue; 420 continue;
421 421
422 snprintf(buf, sizeof(buf), "%d", i); 422 snprintf(buf, sizeof(buf), "%d", i);
423 dir = oprofilefs_mkdir(sb, root, buf); 423 dir = oprofilefs_mkdir(root, buf);
424 oprofilefs_create_ulong(sb, dir, "enabled", &counter_config[i].enabled); 424 oprofilefs_create_ulong(dir, "enabled", &counter_config[i].enabled);
425 oprofilefs_create_ulong(sb, dir, "event", &counter_config[i].event); 425 oprofilefs_create_ulong(dir, "event", &counter_config[i].event);
426 oprofilefs_create_ulong(sb, dir, "count", &counter_config[i].count); 426 oprofilefs_create_ulong(dir, "count", &counter_config[i].count);
427 oprofilefs_create_ulong(sb, dir, "unit_mask", &counter_config[i].unit_mask); 427 oprofilefs_create_ulong(dir, "unit_mask", &counter_config[i].unit_mask);
428 oprofilefs_create_ulong(sb, dir, "kernel", &counter_config[i].kernel); 428 oprofilefs_create_ulong(dir, "kernel", &counter_config[i].kernel);
429 oprofilefs_create_ulong(sb, dir, "user", &counter_config[i].user); 429 oprofilefs_create_ulong(dir, "user", &counter_config[i].user);
430 oprofilefs_create_ulong(sb, dir, "extra", &counter_config[i].extra); 430 oprofilefs_create_ulong(dir, "extra", &counter_config[i].extra);
431 } 431 }
432 432
433 return 0; 433 return 0;
diff --git a/arch/x86/oprofile/op_model_amd.c b/arch/x86/oprofile/op_model_amd.c
index b2b94438ff05..50d86c0e9ba4 100644
--- a/arch/x86/oprofile/op_model_amd.c
+++ b/arch/x86/oprofile/op_model_amd.c
@@ -454,16 +454,16 @@ static void init_ibs(void)
454 printk(KERN_INFO "oprofile: AMD IBS detected (0x%08x)\n", ibs_caps); 454 printk(KERN_INFO "oprofile: AMD IBS detected (0x%08x)\n", ibs_caps);
455} 455}
456 456
457static int (*create_arch_files)(struct super_block *sb, struct dentry *root); 457static int (*create_arch_files)(struct dentry *root);
458 458
459static int setup_ibs_files(struct super_block *sb, struct dentry *root) 459static int setup_ibs_files(struct dentry *root)
460{ 460{
461 struct dentry *dir; 461 struct dentry *dir;
462 int ret = 0; 462 int ret = 0;
463 463
464 /* architecture specific files */ 464 /* architecture specific files */
465 if (create_arch_files) 465 if (create_arch_files)
466 ret = create_arch_files(sb, root); 466 ret = create_arch_files(root);
467 467
468 if (ret) 468 if (ret)
469 return ret; 469 return ret;
@@ -479,26 +479,26 @@ static int setup_ibs_files(struct super_block *sb, struct dentry *root)
479 ibs_config.max_cnt_op = 250000; 479 ibs_config.max_cnt_op = 250000;
480 480
481 if (ibs_caps & IBS_CAPS_FETCHSAM) { 481 if (ibs_caps & IBS_CAPS_FETCHSAM) {
482 dir = oprofilefs_mkdir(sb, root, "ibs_fetch"); 482 dir = oprofilefs_mkdir(root, "ibs_fetch");
483 oprofilefs_create_ulong(sb, dir, "enable", 483 oprofilefs_create_ulong(dir, "enable",
484 &ibs_config.fetch_enabled); 484 &ibs_config.fetch_enabled);
485 oprofilefs_create_ulong(sb, dir, "max_count", 485 oprofilefs_create_ulong(dir, "max_count",
486 &ibs_config.max_cnt_fetch); 486 &ibs_config.max_cnt_fetch);
487 oprofilefs_create_ulong(sb, dir, "rand_enable", 487 oprofilefs_create_ulong(dir, "rand_enable",
488 &ibs_config.rand_en); 488 &ibs_config.rand_en);
489 } 489 }
490 490
491 if (ibs_caps & IBS_CAPS_OPSAM) { 491 if (ibs_caps & IBS_CAPS_OPSAM) {
492 dir = oprofilefs_mkdir(sb, root, "ibs_op"); 492 dir = oprofilefs_mkdir(root, "ibs_op");
493 oprofilefs_create_ulong(sb, dir, "enable", 493 oprofilefs_create_ulong(dir, "enable",
494 &ibs_config.op_enabled); 494 &ibs_config.op_enabled);
495 oprofilefs_create_ulong(sb, dir, "max_count", 495 oprofilefs_create_ulong(dir, "max_count",
496 &ibs_config.max_cnt_op); 496 &ibs_config.max_cnt_op);
497 if (ibs_caps & IBS_CAPS_OPCNT) 497 if (ibs_caps & IBS_CAPS_OPCNT)
498 oprofilefs_create_ulong(sb, dir, "dispatched_ops", 498 oprofilefs_create_ulong(dir, "dispatched_ops",
499 &ibs_config.dispatched_ops); 499 &ibs_config.dispatched_ops);
500 if (ibs_caps & IBS_CAPS_BRNTRGT) 500 if (ibs_caps & IBS_CAPS_BRNTRGT)
501 oprofilefs_create_ulong(sb, dir, "branch_target", 501 oprofilefs_create_ulong(dir, "branch_target",
502 &ibs_config.branch_target); 502 &ibs_config.branch_target);
503 } 503 }
504 504
diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c
index d641897a1f4e..b30e937689d6 100644
--- a/arch/x86/pci/acpi.c
+++ b/arch/x86/pci/acpi.c
@@ -568,13 +568,8 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
568 */ 568 */
569 if (bus) { 569 if (bus) {
570 struct pci_bus *child; 570 struct pci_bus *child;
571 list_for_each_entry(child, &bus->children, node) { 571 list_for_each_entry(child, &bus->children, node)
572 struct pci_dev *self = child->self; 572 pcie_bus_configure_settings(child);
573 if (!self)
574 continue;
575
576 pcie_bus_configure_settings(child, self->pcie_mpss);
577 }
578 } 573 }
579 574
580 if (bus && node != -1) { 575 if (bus && node != -1) {
diff --git a/arch/x86/pci/i386.c b/arch/x86/pci/i386.c
index 94919e307f8e..db6b1ab43255 100644
--- a/arch/x86/pci/i386.c
+++ b/arch/x86/pci/i386.c
@@ -210,6 +210,8 @@ static void pcibios_allocate_bridge_resources(struct pci_dev *dev)
210 r = &dev->resource[idx]; 210 r = &dev->resource[idx];
211 if (!r->flags) 211 if (!r->flags)
212 continue; 212 continue;
213 if (r->parent) /* Already allocated */
214 continue;
213 if (!r->start || pci_claim_resource(dev, idx) < 0) { 215 if (!r->start || pci_claim_resource(dev, idx) < 0) {
214 /* 216 /*
215 * Something is wrong with the region. 217 * Something is wrong with the region.
@@ -318,6 +320,8 @@ static void pcibios_allocate_dev_rom_resource(struct pci_dev *dev)
318 r = &dev->resource[PCI_ROM_RESOURCE]; 320 r = &dev->resource[PCI_ROM_RESOURCE];
319 if (!r->flags || !r->start) 321 if (!r->flags || !r->start)
320 return; 322 return;
323 if (r->parent) /* Already allocated */
324 return;
321 325
322 if (pci_claim_resource(dev, PCI_ROM_RESOURCE) < 0) { 326 if (pci_claim_resource(dev, PCI_ROM_RESOURCE) < 0) {
323 r->end -= r->start; 327 r->end -= r->start;
diff --git a/arch/x86/pci/mmconfig-shared.c b/arch/x86/pci/mmconfig-shared.c
index 082e88129712..5596c7bdd327 100644
--- a/arch/x86/pci/mmconfig-shared.c
+++ b/arch/x86/pci/mmconfig-shared.c
@@ -700,7 +700,7 @@ int pci_mmconfig_insert(struct device *dev, u16 seg, u8 start, u8 end,
700 if (!(pci_probe & PCI_PROBE_MMCONF) || pci_mmcfg_arch_init_failed) 700 if (!(pci_probe & PCI_PROBE_MMCONF) || pci_mmcfg_arch_init_failed)
701 return -ENODEV; 701 return -ENODEV;
702 702
703 if (start > end) 703 if (start > end || !addr)
704 return -EINVAL; 704 return -EINVAL;
705 705
706 mutex_lock(&pci_mmcfg_lock); 706 mutex_lock(&pci_mmcfg_lock);
@@ -716,11 +716,6 @@ int pci_mmconfig_insert(struct device *dev, u16 seg, u8 start, u8 end,
716 return -EEXIST; 716 return -EEXIST;
717 } 717 }
718 718
719 if (!addr) {
720 mutex_unlock(&pci_mmcfg_lock);
721 return -EINVAL;
722 }
723
724 rc = -EBUSY; 719 rc = -EBUSY;
725 cfg = pci_mmconfig_alloc(seg, start, end, addr); 720 cfg = pci_mmconfig_alloc(seg, start, end, addr);
726 if (cfg == NULL) { 721 if (cfg == NULL) {
diff --git a/arch/x86/pci/mrst.c b/arch/x86/pci/mrst.c
index 6eb18c42a28a..903fded50786 100644
--- a/arch/x86/pci/mrst.c
+++ b/arch/x86/pci/mrst.c
@@ -23,11 +23,11 @@
23#include <linux/ioport.h> 23#include <linux/ioport.h>
24#include <linux/init.h> 24#include <linux/init.h>
25#include <linux/dmi.h> 25#include <linux/dmi.h>
26#include <linux/acpi.h>
27#include <linux/io.h>
28#include <linux/smp.h>
26 29
27#include <asm/acpi.h>
28#include <asm/segment.h> 30#include <asm/segment.h>
29#include <asm/io.h>
30#include <asm/smp.h>
31#include <asm/pci_x86.h> 31#include <asm/pci_x86.h>
32#include <asm/hw_irq.h> 32#include <asm/hw_irq.h>
33#include <asm/io_apic.h> 33#include <asm/io_apic.h>
@@ -43,7 +43,7 @@
43#define PCI_FIXED_BAR_4_SIZE 0x14 43#define PCI_FIXED_BAR_4_SIZE 0x14
44#define PCI_FIXED_BAR_5_SIZE 0x1c 44#define PCI_FIXED_BAR_5_SIZE 0x1c
45 45
46static int pci_soc_mode = 0; 46static int pci_soc_mode;
47 47
48/** 48/**
49 * fixed_bar_cap - return the offset of the fixed BAR cap if found 49 * fixed_bar_cap - return the offset of the fixed BAR cap if found
@@ -141,7 +141,8 @@ static int pci_device_update_fixed(struct pci_bus *bus, unsigned int devfn,
141 */ 141 */
142static bool type1_access_ok(unsigned int bus, unsigned int devfn, int reg) 142static bool type1_access_ok(unsigned int bus, unsigned int devfn, int reg)
143{ 143{
144 /* This is a workaround for A0 LNC bug where PCI status register does 144 /*
145 * This is a workaround for A0 LNC bug where PCI status register does
145 * not have new CAP bit set. can not be written by SW either. 146 * not have new CAP bit set. can not be written by SW either.
146 * 147 *
147 * PCI header type in real LNC indicates a single function device, this 148 * PCI header type in real LNC indicates a single function device, this
@@ -154,7 +155,7 @@ static bool type1_access_ok(unsigned int bus, unsigned int devfn, int reg)
154 || devfn == PCI_DEVFN(0, 0) 155 || devfn == PCI_DEVFN(0, 0)
155 || devfn == PCI_DEVFN(3, 0))) 156 || devfn == PCI_DEVFN(3, 0)))
156 return 1; 157 return 1;
157 return 0; /* langwell on others */ 158 return 0; /* Langwell on others */
158} 159}
159 160
160static int pci_read(struct pci_bus *bus, unsigned int devfn, int where, 161static int pci_read(struct pci_bus *bus, unsigned int devfn, int where,
@@ -172,7 +173,8 @@ static int pci_write(struct pci_bus *bus, unsigned int devfn, int where,
172{ 173{
173 int offset; 174 int offset;
174 175
175 /* On MRST, there is no PCI ROM BAR, this will cause a subsequent read 176 /*
177 * On MRST, there is no PCI ROM BAR, this will cause a subsequent read
176 * to ROM BAR return 0 then being ignored. 178 * to ROM BAR return 0 then being ignored.
177 */ 179 */
178 if (where == PCI_ROM_ADDRESS) 180 if (where == PCI_ROM_ADDRESS)
@@ -210,7 +212,8 @@ static int mrst_pci_irq_enable(struct pci_dev *dev)
210 212
211 pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); 213 pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
212 214
213 /* MRST only have IOAPIC, the PCI irq lines are 1:1 mapped to 215 /*
216 * MRST only have IOAPIC, the PCI irq lines are 1:1 mapped to
214 * IOAPIC RTE entries, so we just enable RTE for the device. 217 * IOAPIC RTE entries, so we just enable RTE for the device.
215 */ 218 */
216 irq_attr.ioapic = mp_find_ioapic(dev->irq); 219 irq_attr.ioapic = mp_find_ioapic(dev->irq);
@@ -235,7 +238,7 @@ struct pci_ops pci_mrst_ops = {
235 */ 238 */
236int __init pci_mrst_init(void) 239int __init pci_mrst_init(void)
237{ 240{
238 printk(KERN_INFO "Intel MID platform detected, using MID PCI ops\n"); 241 pr_info("Intel MID platform detected, using MID PCI ops\n");
239 pci_mmcfg_late_init(); 242 pci_mmcfg_late_init();
240 pcibios_enable_irq = mrst_pci_irq_enable; 243 pcibios_enable_irq = mrst_pci_irq_enable;
241 pci_root_ops = pci_mrst_ops; 244 pci_root_ops = pci_mrst_ops;
@@ -244,17 +247,21 @@ int __init pci_mrst_init(void)
244 return 1; 247 return 1;
245} 248}
246 249
247/* Langwell devices are not true pci devices, they are not subject to 10 ms 250/*
248 * d3 to d0 delay required by pci spec. 251 * Langwell devices are not true PCI devices; they are not subject to 10 ms
252 * d3 to d0 delay required by PCI spec.
249 */ 253 */
250static void pci_d3delay_fixup(struct pci_dev *dev) 254static void pci_d3delay_fixup(struct pci_dev *dev)
251{ 255{
252 /* PCI fixups are effectively decided compile time. If we have a dual 256 /*
253 SoC/non-SoC kernel we don't want to mangle d3 on non SoC devices */ 257 * PCI fixups are effectively decided compile time. If we have a dual
254 if (!pci_soc_mode) 258 * SoC/non-SoC kernel we don't want to mangle d3 on non-SoC devices.
255 return; 259 */
256 /* true pci devices in lincroft should allow type 1 access, the rest 260 if (!pci_soc_mode)
257 * are langwell fake pci devices. 261 return;
262 /*
263 * True PCI devices in Lincroft should allow type 1 access, the rest
264 * are Langwell fake PCI devices.
258 */ 265 */
259 if (type1_access_ok(dev->bus->number, dev->devfn, PCI_DEVICE_ID)) 266 if (type1_access_ok(dev->bus->number, dev->devfn, PCI_DEVICE_ID))
260 return; 267 return;
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c
index 90f6ed127096..c7e22ab29a5a 100644
--- a/arch/x86/platform/efi/efi.c
+++ b/arch/x86/platform/efi/efi.c
@@ -912,10 +912,13 @@ void __init efi_enter_virtual_mode(void)
912 912
913 for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { 913 for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
914 md = p; 914 md = p;
915 if (!(md->attribute & EFI_MEMORY_RUNTIME) && 915 if (!(md->attribute & EFI_MEMORY_RUNTIME)) {
916 md->type != EFI_BOOT_SERVICES_CODE && 916#ifdef CONFIG_X86_64
917 md->type != EFI_BOOT_SERVICES_DATA) 917 if (md->type != EFI_BOOT_SERVICES_CODE &&
918 continue; 918 md->type != EFI_BOOT_SERVICES_DATA)
919#endif
920 continue;
921 }
919 922
920 size = md->num_pages << EFI_PAGE_SHIFT; 923 size = md->num_pages << EFI_PAGE_SHIFT;
921 end = md->phys_addr + size; 924 end = md->phys_addr + size;
diff --git a/arch/x86/platform/mrst/mrst.c b/arch/x86/platform/mrst/mrst.c
index 47fe66fe61f1..3ca5957b7a34 100644
--- a/arch/x86/platform/mrst/mrst.c
+++ b/arch/x86/platform/mrst/mrst.c
@@ -20,7 +20,7 @@
20#include <linux/intel_pmic_gpio.h> 20#include <linux/intel_pmic_gpio.h>
21#include <linux/spi/spi.h> 21#include <linux/spi/spi.h>
22#include <linux/i2c.h> 22#include <linux/i2c.h>
23#include <linux/i2c/pca953x.h> 23#include <linux/platform_data/pca953x.h>
24#include <linux/gpio_keys.h> 24#include <linux/gpio_keys.h>
25#include <linux/input.h> 25#include <linux/input.h>
26#include <linux/platform_device.h> 26#include <linux/platform_device.h>
diff --git a/arch/x86/power/cpu.c b/arch/x86/power/cpu.c
index 1cf5b300305e..424f4c97a44d 100644
--- a/arch/x86/power/cpu.c
+++ b/arch/x86/power/cpu.c
@@ -25,10 +25,10 @@
25#include <asm/cpu.h> 25#include <asm/cpu.h>
26 26
27#ifdef CONFIG_X86_32 27#ifdef CONFIG_X86_32
28unsigned long saved_context_ebx; 28__visible unsigned long saved_context_ebx;
29unsigned long saved_context_esp, saved_context_ebp; 29__visible unsigned long saved_context_esp, saved_context_ebp;
30unsigned long saved_context_esi, saved_context_edi; 30__visible unsigned long saved_context_esi, saved_context_edi;
31unsigned long saved_context_eflags; 31__visible unsigned long saved_context_eflags;
32#endif 32#endif
33struct saved_context saved_context; 33struct saved_context saved_context;
34 34
diff --git a/arch/x86/power/hibernate_64.c b/arch/x86/power/hibernate_64.c
index a0fde91c16cf..304fca20d96e 100644
--- a/arch/x86/power/hibernate_64.c
+++ b/arch/x86/power/hibernate_64.c
@@ -20,26 +20,26 @@
20#include <asm/suspend.h> 20#include <asm/suspend.h>
21 21
22/* References to section boundaries */ 22/* References to section boundaries */
23extern const void __nosave_begin, __nosave_end; 23extern __visible const void __nosave_begin, __nosave_end;
24 24
25/* Defined in hibernate_asm_64.S */ 25/* Defined in hibernate_asm_64.S */
26extern int restore_image(void); 26extern asmlinkage int restore_image(void);
27 27
28/* 28/*
29 * Address to jump to in the last phase of restore in order to get to the image 29 * Address to jump to in the last phase of restore in order to get to the image
30 * kernel's text (this value is passed in the image header). 30 * kernel's text (this value is passed in the image header).
31 */ 31 */
32unsigned long restore_jump_address; 32unsigned long restore_jump_address __visible;
33 33
34/* 34/*
35 * Value of the cr3 register from before the hibernation (this value is passed 35 * Value of the cr3 register from before the hibernation (this value is passed
36 * in the image header). 36 * in the image header).
37 */ 37 */
38unsigned long restore_cr3; 38unsigned long restore_cr3 __visible;
39 39
40pgd_t *temp_level4_pgt; 40pgd_t *temp_level4_pgt __visible;
41 41
42void *relocated_restore_code; 42void *relocated_restore_code __visible;
43 43
44static void *alloc_pgt_page(void *context) 44static void *alloc_pgt_page(void *context)
45{ 45{
diff --git a/arch/x86/tools/gen-insn-attr-x86.awk b/arch/x86/tools/gen-insn-attr-x86.awk
index e6773dc8ac41..093a892026f9 100644
--- a/arch/x86/tools/gen-insn-attr-x86.awk
+++ b/arch/x86/tools/gen-insn-attr-x86.awk
@@ -68,7 +68,7 @@ BEGIN {
68 68
69 lprefix1_expr = "\\((66|!F3)\\)" 69 lprefix1_expr = "\\((66|!F3)\\)"
70 lprefix2_expr = "\\(F3\\)" 70 lprefix2_expr = "\\(F3\\)"
71 lprefix3_expr = "\\((F2|!F3)\\)" 71 lprefix3_expr = "\\((F2|!F3|66\\&F2)\\)"
72 lprefix_expr = "\\((66|F2|F3)\\)" 72 lprefix_expr = "\\((66|F2|F3)\\)"
73 max_lprefix = 4 73 max_lprefix = 4
74 74
@@ -83,6 +83,8 @@ BEGIN {
83 prefix_num["Operand-Size"] = "INAT_PFX_OPNDSZ" 83 prefix_num["Operand-Size"] = "INAT_PFX_OPNDSZ"
84 prefix_num["REPNE"] = "INAT_PFX_REPNE" 84 prefix_num["REPNE"] = "INAT_PFX_REPNE"
85 prefix_num["REP/REPE"] = "INAT_PFX_REPE" 85 prefix_num["REP/REPE"] = "INAT_PFX_REPE"
86 prefix_num["XACQUIRE"] = "INAT_PFX_REPNE"
87 prefix_num["XRELEASE"] = "INAT_PFX_REPE"
86 prefix_num["LOCK"] = "INAT_PFX_LOCK" 88 prefix_num["LOCK"] = "INAT_PFX_LOCK"
87 prefix_num["SEG=CS"] = "INAT_PFX_CS" 89 prefix_num["SEG=CS"] = "INAT_PFX_CS"
88 prefix_num["SEG=DS"] = "INAT_PFX_DS" 90 prefix_num["SEG=DS"] = "INAT_PFX_DS"
diff --git a/arch/x86/um/os-Linux/prctl.c b/arch/x86/um/os-Linux/prctl.c
index 9d34eddb517f..96eb2bd28832 100644
--- a/arch/x86/um/os-Linux/prctl.c
+++ b/arch/x86/um/os-Linux/prctl.c
@@ -4,7 +4,7 @@
4 */ 4 */
5 5
6#include <sys/ptrace.h> 6#include <sys/ptrace.h>
7#include <linux/ptrace.h> 7#include <asm/ptrace.h>
8 8
9int os_arch_prctl(int pid, int code, unsigned long *addr) 9int os_arch_prctl(int pid, int code, unsigned long *addr)
10{ 10{
diff --git a/arch/x86/vdso/vclock_gettime.c b/arch/x86/vdso/vclock_gettime.c
index c74436e687bf..72074d528400 100644
--- a/arch/x86/vdso/vclock_gettime.c
+++ b/arch/x86/vdso/vclock_gettime.c
@@ -85,15 +85,18 @@ static notrace cycle_t vread_pvclock(int *mode)
85 cycle_t ret; 85 cycle_t ret;
86 u64 last; 86 u64 last;
87 u32 version; 87 u32 version;
88 u32 migrate_count;
89 u8 flags; 88 u8 flags;
90 unsigned cpu, cpu1; 89 unsigned cpu, cpu1;
91 90
92 91
93 /* 92 /*
94 * When looping to get a consistent (time-info, tsc) pair, we 93 * Note: hypervisor must guarantee that:
95 * also need to deal with the possibility we can switch vcpus, 94 * 1. cpu ID number maps 1:1 to per-CPU pvclock time info.
96 * so make sure we always re-fetch time-info for the current vcpu. 95 * 2. that per-CPU pvclock time info is updated if the
96 * underlying CPU changes.
97 * 3. that version is increased whenever underlying CPU
98 * changes.
99 *
97 */ 100 */
98 do { 101 do {
99 cpu = __getcpu() & VGETCPU_CPU_MASK; 102 cpu = __getcpu() & VGETCPU_CPU_MASK;
@@ -104,8 +107,6 @@ static notrace cycle_t vread_pvclock(int *mode)
104 107
105 pvti = get_pvti(cpu); 108 pvti = get_pvti(cpu);
106 109
107 migrate_count = pvti->migrate_count;
108
109 version = __pvclock_read_cycles(&pvti->pvti, &ret, &flags); 110 version = __pvclock_read_cycles(&pvti->pvti, &ret, &flags);
110 111
111 /* 112 /*
@@ -117,8 +118,7 @@ static notrace cycle_t vread_pvclock(int *mode)
117 cpu1 = __getcpu() & VGETCPU_CPU_MASK; 118 cpu1 = __getcpu() & VGETCPU_CPU_MASK;
118 } while (unlikely(cpu != cpu1 || 119 } while (unlikely(cpu != cpu1 ||
119 (pvti->pvti.version & 1) || 120 (pvti->pvti.version & 1) ||
120 pvti->pvti.version != version || 121 pvti->pvti.version != version));
121 pvti->migrate_count != migrate_count));
122 122
123 if (unlikely(!(flags & PVCLOCK_TSC_STABLE_BIT))) 123 if (unlikely(!(flags & PVCLOCK_TSC_STABLE_BIT)))
124 *mode = VCLOCK_NONE; 124 *mode = VCLOCK_NONE;
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index f091c80974c4..fa6ade76ef3f 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -1724,15 +1724,12 @@ static void __init xen_hvm_guest_init(void)
1724 xen_hvm_init_mmu_ops(); 1724 xen_hvm_init_mmu_ops();
1725} 1725}
1726 1726
1727static bool __init xen_hvm_platform(void) 1727static uint32_t __init xen_hvm_platform(void)
1728{ 1728{
1729 if (xen_pv_domain()) 1729 if (xen_pv_domain())
1730 return false; 1730 return 0;
1731
1732 if (!xen_cpuid_base())
1733 return false;
1734 1731
1735 return true; 1732 return xen_cpuid_base();
1736} 1733}
1737 1734
1738bool xen_hvm_need_lapic(void) 1735bool xen_hvm_need_lapic(void)
diff --git a/arch/x86/xen/xen-ops.h b/arch/x86/xen/xen-ops.h
index 86782c5d7e2a..95f8c6142328 100644
--- a/arch/x86/xen/xen-ops.h
+++ b/arch/x86/xen/xen-ops.h
@@ -105,9 +105,9 @@ static inline void __init xen_init_apic(void)
105/* Declare an asm function, along with symbols needed to make it 105/* Declare an asm function, along with symbols needed to make it
106 inlineable */ 106 inlineable */
107#define DECL_ASM(ret, name, ...) \ 107#define DECL_ASM(ret, name, ...) \
108 ret name(__VA_ARGS__); \ 108 __visible ret name(__VA_ARGS__); \
109 extern char name##_end[]; \ 109 extern char name##_end[] __visible; \
110 extern char name##_reloc[] \ 110 extern char name##_reloc[] __visible
111 111
112DECL_ASM(void, xen_irq_enable_direct, void); 112DECL_ASM(void, xen_irq_enable_direct, void);
113DECL_ASM(void, xen_irq_disable_direct, void); 113DECL_ASM(void, xen_irq_disable_direct, void);
@@ -115,11 +115,11 @@ DECL_ASM(unsigned long, xen_save_fl_direct, void);
115DECL_ASM(void, xen_restore_fl_direct, unsigned long); 115DECL_ASM(void, xen_restore_fl_direct, unsigned long);
116 116
117/* These are not functions, and cannot be called normally */ 117/* These are not functions, and cannot be called normally */
118void xen_iret(void); 118__visible void xen_iret(void);
119void xen_sysexit(void); 119__visible void xen_sysexit(void);
120void xen_sysret32(void); 120__visible void xen_sysret32(void);
121void xen_sysret64(void); 121__visible void xen_sysret64(void);
122void xen_adjust_exception_frame(void); 122__visible void xen_adjust_exception_frame(void);
123 123
124extern int xen_panic_handler_init(void); 124extern int xen_panic_handler_init(void);
125 125
diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig
index 7ea6451a3a33..8d24dcb7cdac 100644
--- a/arch/xtensa/Kconfig
+++ b/arch/xtensa/Kconfig
@@ -7,7 +7,6 @@ config XTENSA
7 select HAVE_IDE 7 select HAVE_IDE
8 select GENERIC_ATOMIC64 8 select GENERIC_ATOMIC64
9 select GENERIC_CLOCKEVENTS 9 select GENERIC_CLOCKEVENTS
10 select HAVE_GENERIC_HARDIRQS
11 select VIRT_TO_BUS 10 select VIRT_TO_BUS
12 select GENERIC_IRQ_SHOW 11 select GENERIC_IRQ_SHOW
13 select GENERIC_CPU_DEVICES 12 select GENERIC_CPU_DEVICES
diff --git a/arch/xtensa/Makefile b/arch/xtensa/Makefile
index 136224b74d4f..81250ece3062 100644
--- a/arch/xtensa/Makefile
+++ b/arch/xtensa/Makefile
@@ -55,10 +55,10 @@ ifneq ($(CONFIG_LD_NO_RELAX),)
55LDFLAGS := --no-relax 55LDFLAGS := --no-relax
56endif 56endif
57 57
58ifeq ($(shell echo -e __XTENSA_EB__ | $(CC) -E - | grep -v "\#"),1) 58ifeq ($(shell echo __XTENSA_EB__ | $(CC) -E - | grep -v "\#"),1)
59CHECKFLAGS += -D__XTENSA_EB__ 59CHECKFLAGS += -D__XTENSA_EB__
60endif 60endif
61ifeq ($(shell echo -e __XTENSA_EL__ | $(CC) -E - | grep -v "\#"),1) 61ifeq ($(shell echo __XTENSA_EL__ | $(CC) -E - | grep -v "\#"),1)
62CHECKFLAGS += -D__XTENSA_EL__ 62CHECKFLAGS += -D__XTENSA_EL__
63endif 63endif
64 64
diff --git a/arch/xtensa/boot/Makefile b/arch/xtensa/boot/Makefile
index 64ffc4b53df6..ca20a892021b 100644
--- a/arch/xtensa/boot/Makefile
+++ b/arch/xtensa/boot/Makefile
@@ -12,7 +12,7 @@
12KBUILD_CFLAGS += -fno-builtin -Iarch/$(ARCH)/boot/include 12KBUILD_CFLAGS += -fno-builtin -Iarch/$(ARCH)/boot/include
13HOSTFLAGS += -Iarch/$(ARCH)/boot/include 13HOSTFLAGS += -Iarch/$(ARCH)/boot/include
14 14
15BIG_ENDIAN := $(shell echo -e __XTENSA_EB__ | $(CC) -E - | grep -v "\#") 15BIG_ENDIAN := $(shell echo __XTENSA_EB__ | $(CC) -E - | grep -v "\#")
16 16
17export ccflags-y 17export ccflags-y
18export BIG_ENDIAN 18export BIG_ENDIAN
diff --git a/arch/xtensa/configs/common_defconfig b/arch/xtensa/configs/common_defconfig
index a182a4e6d688..f6000fe05119 100644
--- a/arch/xtensa/configs/common_defconfig
+++ b/arch/xtensa/configs/common_defconfig
@@ -8,7 +8,6 @@ CONFIG_XTENSA=y
8# CONFIG_UID16 is not set 8# CONFIG_UID16 is not set
9CONFIG_RWSEM_XCHGADD_ALGORITHM=y 9CONFIG_RWSEM_XCHGADD_ALGORITHM=y
10CONFIG_HAVE_DEC_LOCK=y 10CONFIG_HAVE_DEC_LOCK=y
11CONFIG_GENERIC_HARDIRQS=y
12 11
13# 12#
14# Code maturity level options 13# Code maturity level options
diff --git a/arch/xtensa/configs/iss_defconfig b/arch/xtensa/configs/iss_defconfig
index 77c52f80187a..4f233204faf9 100644
--- a/arch/xtensa/configs/iss_defconfig
+++ b/arch/xtensa/configs/iss_defconfig
@@ -9,7 +9,6 @@ CONFIG_XTENSA=y
9CONFIG_RWSEM_XCHGADD_ALGORITHM=y 9CONFIG_RWSEM_XCHGADD_ALGORITHM=y
10CONFIG_GENERIC_FIND_NEXT_BIT=y 10CONFIG_GENERIC_FIND_NEXT_BIT=y
11CONFIG_GENERIC_HWEIGHT=y 11CONFIG_GENERIC_HWEIGHT=y
12CONFIG_GENERIC_HARDIRQS=y
13# CONFIG_ARCH_HAS_ILOG2_U32 is not set 12# CONFIG_ARCH_HAS_ILOG2_U32 is not set
14# CONFIG_ARCH_HAS_ILOG2_U64 is not set 13# CONFIG_ARCH_HAS_ILOG2_U64 is not set
15CONFIG_NO_IOPORT=y 14CONFIG_NO_IOPORT=y
diff --git a/arch/xtensa/configs/s6105_defconfig b/arch/xtensa/configs/s6105_defconfig
index 4799c6a526b5..d929f77a0360 100644
--- a/arch/xtensa/configs/s6105_defconfig
+++ b/arch/xtensa/configs/s6105_defconfig
@@ -9,7 +9,6 @@ CONFIG_XTENSA=y
9CONFIG_RWSEM_XCHGADD_ALGORITHM=y 9CONFIG_RWSEM_XCHGADD_ALGORITHM=y
10CONFIG_GENERIC_FIND_NEXT_BIT=y 10CONFIG_GENERIC_FIND_NEXT_BIT=y
11CONFIG_GENERIC_HWEIGHT=y 11CONFIG_GENERIC_HWEIGHT=y
12CONFIG_GENERIC_HARDIRQS=y
13# CONFIG_ARCH_HAS_ILOG2_U32 is not set 12# CONFIG_ARCH_HAS_ILOG2_U32 is not set
14# CONFIG_ARCH_HAS_ILOG2_U64 is not set 13# CONFIG_ARCH_HAS_ILOG2_U64 is not set
15CONFIG_NO_IOPORT=y 14CONFIG_NO_IOPORT=y
diff --git a/arch/xtensa/include/asm/regs.h b/arch/xtensa/include/asm/regs.h
index b24de6717020..4ba9f516b0e2 100644
--- a/arch/xtensa/include/asm/regs.h
+++ b/arch/xtensa/include/asm/regs.h
@@ -82,6 +82,7 @@
82#define PS_CALLINC_SHIFT 16 82#define PS_CALLINC_SHIFT 16
83#define PS_CALLINC_MASK 0x00030000 83#define PS_CALLINC_MASK 0x00030000
84#define PS_OWB_SHIFT 8 84#define PS_OWB_SHIFT 8
85#define PS_OWB_WIDTH 4
85#define PS_OWB_MASK 0x00000F00 86#define PS_OWB_MASK 0x00000F00
86#define PS_RING_SHIFT 6 87#define PS_RING_SHIFT 6
87#define PS_RING_MASK 0x000000C0 88#define PS_RING_MASK 0x000000C0
diff --git a/arch/xtensa/include/asm/timex.h b/arch/xtensa/include/asm/timex.h
index 69f901713fb6..27fa3c170662 100644
--- a/arch/xtensa/include/asm/timex.h
+++ b/arch/xtensa/include/asm/timex.h
@@ -35,13 +35,7 @@
35# error "Bad timer number for Linux configurations!" 35# error "Bad timer number for Linux configurations!"
36#endif 36#endif
37 37
38#ifdef CONFIG_XTENSA_CALIBRATE_CCOUNT
39extern unsigned long ccount_freq; 38extern unsigned long ccount_freq;
40#define CCOUNT_PER_JIFFY (ccount_freq / HZ)
41#else
42#define CCOUNT_PER_JIFFY (CONFIG_XTENSA_CPU_CLOCK*(1000000UL/HZ))
43#endif
44
45 39
46typedef unsigned long long cycles_t; 40typedef unsigned long long cycles_t;
47 41
diff --git a/arch/xtensa/kernel/align.S b/arch/xtensa/kernel/align.S
index aa2e87b8566a..d4cef6039a5c 100644
--- a/arch/xtensa/kernel/align.S
+++ b/arch/xtensa/kernel/align.S
@@ -146,9 +146,9 @@
146 * a0: trashed, original value saved on stack (PT_AREG0) 146 * a0: trashed, original value saved on stack (PT_AREG0)
147 * a1: a1 147 * a1: a1
148 * a2: new stack pointer, original in DEPC 148 * a2: new stack pointer, original in DEPC
149 * a3: dispatch table 149 * a3: a3
150 * depc: a2, original value saved on stack (PT_DEPC) 150 * depc: a2, original value saved on stack (PT_DEPC)
151 * excsave_1: a3 151 * excsave_1: dispatch table
152 * 152 *
153 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC 153 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC
154 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception 154 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception
@@ -171,7 +171,6 @@ ENTRY(fast_unaligned)
171 s32i a8, a2, PT_AREG8 171 s32i a8, a2, PT_AREG8
172 172
173 rsr a0, depc 173 rsr a0, depc
174 xsr a3, excsave1
175 s32i a0, a2, PT_AREG2 174 s32i a0, a2, PT_AREG2
176 s32i a3, a2, PT_AREG3 175 s32i a3, a2, PT_AREG3
177 176
diff --git a/arch/xtensa/kernel/coprocessor.S b/arch/xtensa/kernel/coprocessor.S
index 647657484866..a482df5df2b2 100644
--- a/arch/xtensa/kernel/coprocessor.S
+++ b/arch/xtensa/kernel/coprocessor.S
@@ -32,9 +32,9 @@
32 * a0: trashed, original value saved on stack (PT_AREG0) 32 * a0: trashed, original value saved on stack (PT_AREG0)
33 * a1: a1 33 * a1: a1
34 * a2: new stack pointer, original in DEPC 34 * a2: new stack pointer, original in DEPC
35 * a3: dispatch table 35 * a3: a3
36 * depc: a2, original value saved on stack (PT_DEPC) 36 * depc: a2, original value saved on stack (PT_DEPC)
37 * excsave_1: a3 37 * excsave_1: dispatch table
38 * 38 *
39 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC 39 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC
40 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception 40 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception
@@ -225,9 +225,9 @@ ENDPROC(coprocessor_restore)
225 * a0: trashed, original value saved on stack (PT_AREG0) 225 * a0: trashed, original value saved on stack (PT_AREG0)
226 * a1: a1 226 * a1: a1
227 * a2: new stack pointer, original in DEPC 227 * a2: new stack pointer, original in DEPC
228 * a3: dispatch table 228 * a3: a3
229 * depc: a2, original value saved on stack (PT_DEPC) 229 * depc: a2, original value saved on stack (PT_DEPC)
230 * excsave_1: a3 230 * excsave_1: dispatch table
231 * 231 *
232 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC 232 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC
233 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception 233 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception
@@ -245,7 +245,6 @@ ENTRY(fast_coprocessor)
245 245
246 /* Save remaining registers a1-a3 and SAR */ 246 /* Save remaining registers a1-a3 and SAR */
247 247
248 xsr a3, excsave1
249 s32i a3, a2, PT_AREG3 248 s32i a3, a2, PT_AREG3
250 rsr a3, sar 249 rsr a3, sar
251 s32i a1, a2, PT_AREG1 250 s32i a1, a2, PT_AREG1
diff --git a/arch/xtensa/kernel/entry.S b/arch/xtensa/kernel/entry.S
index 9298742f0fd0..de1dfa18d0a1 100644
--- a/arch/xtensa/kernel/entry.S
+++ b/arch/xtensa/kernel/entry.S
@@ -31,8 +31,6 @@
31/* Unimplemented features. */ 31/* Unimplemented features. */
32 32
33#undef KERNEL_STACK_OVERFLOW_CHECK 33#undef KERNEL_STACK_OVERFLOW_CHECK
34#undef PREEMPTIBLE_KERNEL
35#undef ALLOCA_EXCEPTION_IN_IRAM
36 34
37/* Not well tested. 35/* Not well tested.
38 * 36 *
@@ -92,9 +90,9 @@
92 * a0: trashed, original value saved on stack (PT_AREG0) 90 * a0: trashed, original value saved on stack (PT_AREG0)
93 * a1: a1 91 * a1: a1
94 * a2: new stack pointer, original value in depc 92 * a2: new stack pointer, original value in depc
95 * a3: dispatch table 93 * a3: a3
96 * depc: a2, original value saved on stack (PT_DEPC) 94 * depc: a2, original value saved on stack (PT_DEPC)
97 * excsave1: a3 95 * excsave1: dispatch table
98 * 96 *
99 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC 97 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC
100 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception 98 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception
@@ -110,9 +108,8 @@
110 108
111ENTRY(user_exception) 109ENTRY(user_exception)
112 110
113 /* Save a2, a3, and depc, restore excsave_1 and set SP. */ 111 /* Save a1, a2, a3, and set SP. */
114 112
115 xsr a3, excsave1
116 rsr a0, depc 113 rsr a0, depc
117 s32i a1, a2, PT_AREG1 114 s32i a1, a2, PT_AREG1
118 s32i a0, a2, PT_AREG2 115 s32i a0, a2, PT_AREG2
@@ -238,9 +235,9 @@ ENDPROC(user_exception)
238 * a0: trashed, original value saved on stack (PT_AREG0) 235 * a0: trashed, original value saved on stack (PT_AREG0)
239 * a1: a1 236 * a1: a1
240 * a2: new stack pointer, original in DEPC 237 * a2: new stack pointer, original in DEPC
241 * a3: dispatch table 238 * a3: a3
242 * depc: a2, original value saved on stack (PT_DEPC) 239 * depc: a2, original value saved on stack (PT_DEPC)
243 * excsave_1: a3 240 * excsave_1: dispatch table
244 * 241 *
245 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC 242 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC
246 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception 243 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception
@@ -256,9 +253,8 @@ ENDPROC(user_exception)
256 253
257ENTRY(kernel_exception) 254ENTRY(kernel_exception)
258 255
259 /* Save a0, a2, a3, DEPC and set SP. */ 256 /* Save a1, a2, a3, and set SP. */
260 257
261 xsr a3, excsave1 # restore a3, excsave_1
262 rsr a0, depc # get a2 258 rsr a0, depc # get a2
263 s32i a1, a2, PT_AREG1 259 s32i a1, a2, PT_AREG1
264 s32i a0, a2, PT_AREG2 260 s32i a0, a2, PT_AREG2
@@ -409,7 +405,7 @@ common_exception:
409 * exception handler and call the exception handler. 405 * exception handler and call the exception handler.
410 */ 406 */
411 407
412 movi a4, exc_table 408 rsr a4, excsave1
413 mov a6, a1 # pass stack frame 409 mov a6, a1 # pass stack frame
414 mov a7, a0 # pass EXCCAUSE 410 mov a7, a0 # pass EXCCAUSE
415 addx4 a4, a0, a4 411 addx4 a4, a0, a4
@@ -423,28 +419,15 @@ common_exception:
423 .global common_exception_return 419 .global common_exception_return
424common_exception_return: 420common_exception_return:
425 421
426#ifdef CONFIG_TRACE_IRQFLAGS
427 l32i a4, a1, PT_DEPC
428 /* Double exception means we came here with an exception
429 * while PS.EXCM was set, i.e. interrupts disabled.
430 */
431 bgeui a4, VALID_DOUBLE_EXCEPTION_ADDRESS, 1f
432 l32i a4, a1, PT_EXCCAUSE
433 bnei a4, EXCCAUSE_LEVEL1_INTERRUPT, 1f
434 /* We came here with an interrupt means interrupts were enabled
435 * and we'll reenable them on return.
436 */
437 movi a4, trace_hardirqs_on
438 callx4 a4
4391: 4221:
440#endif 423 rsil a2, LOCKLEVEL
441 424
442 /* Jump if we are returning from kernel exceptions. */ 425 /* Jump if we are returning from kernel exceptions. */
443 426
4441: l32i a3, a1, PT_PS 427 l32i a3, a1, PT_PS
445 _bbci.l a3, PS_UM_BIT, 4f 428 GET_THREAD_INFO(a2, a1)
446 429 l32i a4, a2, TI_FLAGS
447 rsil a2, 0 430 _bbci.l a3, PS_UM_BIT, 6f
448 431
449 /* Specific to a user exception exit: 432 /* Specific to a user exception exit:
450 * We need to check some flags for signal handling and rescheduling, 433 * We need to check some flags for signal handling and rescheduling,
@@ -453,9 +436,6 @@ common_exception_return:
453 * Note that we don't disable interrupts here. 436 * Note that we don't disable interrupts here.
454 */ 437 */
455 438
456 GET_THREAD_INFO(a2,a1)
457 l32i a4, a2, TI_FLAGS
458
459 _bbsi.l a4, TIF_NEED_RESCHED, 3f 439 _bbsi.l a4, TIF_NEED_RESCHED, 3f
460 _bbsi.l a4, TIF_NOTIFY_RESUME, 2f 440 _bbsi.l a4, TIF_NOTIFY_RESUME, 2f
461 _bbci.l a4, TIF_SIGPENDING, 5f 441 _bbci.l a4, TIF_SIGPENDING, 5f
@@ -465,6 +445,7 @@ common_exception_return:
465 445
466 /* Call do_signal() */ 446 /* Call do_signal() */
467 447
448 rsil a2, 0
468 movi a4, do_notify_resume # int do_notify_resume(struct pt_regs*) 449 movi a4, do_notify_resume # int do_notify_resume(struct pt_regs*)
469 mov a6, a1 450 mov a6, a1
470 callx4 a4 451 callx4 a4
@@ -472,10 +453,24 @@ common_exception_return:
472 453
4733: /* Reschedule */ 4543: /* Reschedule */
474 455
456 rsil a2, 0
475 movi a4, schedule # void schedule (void) 457 movi a4, schedule # void schedule (void)
476 callx4 a4 458 callx4 a4
477 j 1b 459 j 1b
478 460
461#ifdef CONFIG_PREEMPT
4626:
463 _bbci.l a4, TIF_NEED_RESCHED, 4f
464
465 /* Check current_thread_info->preempt_count */
466
467 l32i a4, a2, TI_PRE_COUNT
468 bnez a4, 4f
469 movi a4, preempt_schedule_irq
470 callx4 a4
471 j 1b
472#endif
473
4795: 4745:
480#ifdef CONFIG_DEBUG_TLB_SANITY 475#ifdef CONFIG_DEBUG_TLB_SANITY
481 l32i a4, a1, PT_DEPC 476 l32i a4, a1, PT_DEPC
@@ -483,7 +478,24 @@ common_exception_return:
483 movi a4, check_tlb_sanity 478 movi a4, check_tlb_sanity
484 callx4 a4 479 callx4 a4
485#endif 480#endif
4864: /* Restore optional registers. */ 4816:
4824:
483#ifdef CONFIG_TRACE_IRQFLAGS
484 l32i a4, a1, PT_DEPC
485 /* Double exception means we came here with an exception
486 * while PS.EXCM was set, i.e. interrupts disabled.
487 */
488 bgeui a4, VALID_DOUBLE_EXCEPTION_ADDRESS, 1f
489 l32i a4, a1, PT_EXCCAUSE
490 bnei a4, EXCCAUSE_LEVEL1_INTERRUPT, 1f
491 /* We came here with an interrupt means interrupts were enabled
492 * and we'll reenable them on return.
493 */
494 movi a4, trace_hardirqs_on
495 callx4 a4
4961:
497#endif
498 /* Restore optional registers. */
487 499
488 load_xtregs_opt a1 a2 a4 a5 a6 a7 PT_XTREGS_OPT 500 load_xtregs_opt a1 a2 a4 a5 a6 a7 PT_XTREGS_OPT
489 501
@@ -570,29 +582,6 @@ user_exception_exit:
570 582
571kernel_exception_exit: 583kernel_exception_exit:
572 584
573#ifdef PREEMPTIBLE_KERNEL
574
575#ifdef CONFIG_PREEMPT
576
577 /*
578 * Note: We've just returned from a call4, so we have
579 * at least 4 addt'l regs.
580 */
581
582 /* Check current_thread_info->preempt_count */
583
584 GET_THREAD_INFO(a2)
585 l32i a3, a2, TI_PREEMPT
586 bnez a3, 1f
587
588 l32i a2, a2, TI_FLAGS
589
5901:
591
592#endif
593
594#endif
595
596 /* Check if we have to do a movsp. 585 /* Check if we have to do a movsp.
597 * 586 *
598 * We only have to do a movsp if the previous window-frame has 587 * We only have to do a movsp if the previous window-frame has
@@ -829,176 +818,63 @@ ENDPROC(unrecoverable_exception)
829 * 818 *
830 * The ALLOCA handler is entered when user code executes the MOVSP 819 * The ALLOCA handler is entered when user code executes the MOVSP
831 * instruction and the caller's frame is not in the register file. 820 * instruction and the caller's frame is not in the register file.
832 * In this case, the caller frame's a0..a3 are on the stack just
833 * below sp (a1), and this handler moves them.
834 * 821 *
835 * For "MOVSP <ar>,<as>" without destination register a1, this routine 822 * This algorithm was taken from the Ross Morley's RTOS Porting Layer:
836 * simply moves the value from <as> to <ar> without moving the save area. 823 *
824 * /home/ross/rtos/porting/XtensaRTOS-PortingLayer-20090507/xtensa_vectors.S
825 *
826 * It leverages the existing window spill/fill routines and their support for
827 * double exceptions. The 'movsp' instruction will only cause an exception if
828 * the next window needs to be loaded. In fact this ALLOCA exception may be
829 * replaced at some point by changing the hardware to do a underflow exception
830 * of the proper size instead.
831 *
832 * This algorithm simply backs out the register changes started by the user
833 * excpetion handler, makes it appear that we have started a window underflow
834 * by rotating the window back and then setting the old window base (OWB) in
835 * the 'ps' register with the rolled back window base. The 'movsp' instruction
836 * will be re-executed and this time since the next window frames is in the
837 * active AR registers it won't cause an exception.
838 *
839 * If the WindowUnderflow code gets a TLB miss the page will get mapped
840 * the the partial windeowUnderflow will be handeled in the double exception
841 * handler.
837 * 842 *
838 * Entry condition: 843 * Entry condition:
839 * 844 *
840 * a0: trashed, original value saved on stack (PT_AREG0) 845 * a0: trashed, original value saved on stack (PT_AREG0)
841 * a1: a1 846 * a1: a1
842 * a2: new stack pointer, original in DEPC 847 * a2: new stack pointer, original in DEPC
843 * a3: dispatch table 848 * a3: a3
844 * depc: a2, original value saved on stack (PT_DEPC) 849 * depc: a2, original value saved on stack (PT_DEPC)
845 * excsave_1: a3 850 * excsave_1: dispatch table
846 * 851 *
847 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC 852 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC
848 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception 853 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception
849 */ 854 */
850 855
851#if XCHAL_HAVE_BE
852#define _EXTUI_MOVSP_SRC(ar) extui ar, ar, 4, 4
853#define _EXTUI_MOVSP_DST(ar) extui ar, ar, 0, 4
854#else
855#define _EXTUI_MOVSP_SRC(ar) extui ar, ar, 0, 4
856#define _EXTUI_MOVSP_DST(ar) extui ar, ar, 4, 4
857#endif
858
859ENTRY(fast_alloca) 856ENTRY(fast_alloca)
857 rsr a0, windowbase
858 rotw -1
859 rsr a2, ps
860 extui a3, a2, PS_OWB_SHIFT, PS_OWB_WIDTH
861 xor a3, a3, a4
862 l32i a4, a6, PT_AREG0
863 l32i a1, a6, PT_DEPC
864 rsr a6, depc
865 wsr a1, depc
866 slli a3, a3, PS_OWB_SHIFT
867 xor a2, a2, a3
868 wsr a2, ps
869 rsync
860 870
861 /* We shouldn't be in a double exception. */ 871 _bbci.l a4, 31, 4f
862 872 rotw -1
863 l32i a0, a2, PT_DEPC 873 _bbci.l a8, 30, 8f
864 _bgeui a0, VALID_DOUBLE_EXCEPTION_ADDRESS, .Lunhandled_double 874 rotw -1
865 875 j _WindowUnderflow12
866 rsr a0, depc # get a2 8768: j _WindowUnderflow8
867 s32i a4, a2, PT_AREG4 # save a4 and 8774: j _WindowUnderflow4
868 s32i a0, a2, PT_AREG2 # a2 to stack
869
870 /* Exit critical section. */
871
872 movi a0, 0
873 s32i a0, a3, EXC_TABLE_FIXUP
874
875 /* Restore a3, excsave_1 */
876
877 xsr a3, excsave1 # make sure excsave_1 is valid for dbl.
878 rsr a4, epc1 # get exception address
879 s32i a3, a2, PT_AREG3 # save a3 to stack
880
881#ifdef ALLOCA_EXCEPTION_IN_IRAM
882#error iram not supported
883#else
884 /* Note: l8ui not allowed in IRAM/IROM!! */
885 l8ui a0, a4, 1 # read as(src) from MOVSP instruction
886#endif
887 movi a3, .Lmovsp_src
888 _EXTUI_MOVSP_SRC(a0) # extract source register number
889 addx8 a3, a0, a3
890 jx a3
891
892.Lunhandled_double:
893 wsr a0, excsave1
894 movi a0, unrecoverable_exception
895 callx0 a0
896
897 .align 8
898.Lmovsp_src:
899 l32i a3, a2, PT_AREG0; _j 1f; .align 8
900 mov a3, a1; _j 1f; .align 8
901 l32i a3, a2, PT_AREG2; _j 1f; .align 8
902 l32i a3, a2, PT_AREG3; _j 1f; .align 8
903 l32i a3, a2, PT_AREG4; _j 1f; .align 8
904 mov a3, a5; _j 1f; .align 8
905 mov a3, a6; _j 1f; .align 8
906 mov a3, a7; _j 1f; .align 8
907 mov a3, a8; _j 1f; .align 8
908 mov a3, a9; _j 1f; .align 8
909 mov a3, a10; _j 1f; .align 8
910 mov a3, a11; _j 1f; .align 8
911 mov a3, a12; _j 1f; .align 8
912 mov a3, a13; _j 1f; .align 8
913 mov a3, a14; _j 1f; .align 8
914 mov a3, a15; _j 1f; .align 8
915
9161:
917
918#ifdef ALLOCA_EXCEPTION_IN_IRAM
919#error iram not supported
920#else
921 l8ui a0, a4, 0 # read ar(dst) from MOVSP instruction
922#endif
923 addi a4, a4, 3 # step over movsp
924 _EXTUI_MOVSP_DST(a0) # extract destination register
925 wsr a4, epc1 # save new epc_1
926
927 _bnei a0, 1, 1f # no 'movsp a1, ax': jump
928
929 /* Move the save area. This implies the use of the L32E
930 * and S32E instructions, because this move must be done with
931 * the user's PS.RING privilege levels, not with ring 0
932 * (kernel's) privileges currently active with PS.EXCM
933 * set. Note that we have stil registered a fixup routine with the
934 * double exception vector in case a double exception occurs.
935 */
936
937 /* a0,a4:avail a1:old user stack a2:exc. stack a3:new user stack. */
938
939 l32e a0, a1, -16
940 l32e a4, a1, -12
941 s32e a0, a3, -16
942 s32e a4, a3, -12
943 l32e a0, a1, -8
944 l32e a4, a1, -4
945 s32e a0, a3, -8
946 s32e a4, a3, -4
947
948 /* Restore stack-pointer and all the other saved registers. */
949
950 mov a1, a3
951
952 l32i a4, a2, PT_AREG4
953 l32i a3, a2, PT_AREG3
954 l32i a0, a2, PT_AREG0
955 l32i a2, a2, PT_AREG2
956 rfe
957
958 /* MOVSP <at>,<as> was invoked with <at> != a1.
959 * Because the stack pointer is not being modified,
960 * we should be able to just modify the pointer
961 * without moving any save area.
962 * The processor only traps these occurrences if the
963 * caller window isn't live, so unfortunately we can't
964 * use this as an alternate trap mechanism.
965 * So we just do the move. This requires that we
966 * resolve the destination register, not just the source,
967 * so there's some extra work.
968 * (PERHAPS NOT REALLY NEEDED, BUT CLEANER...)
969 */
970
971 /* a0 dst-reg, a1 user-stack, a2 stack, a3 value of src reg. */
972
9731: movi a4, .Lmovsp_dst
974 addx8 a4, a0, a4
975 jx a4
976
977 .align 8
978.Lmovsp_dst:
979 s32i a3, a2, PT_AREG0; _j 1f; .align 8
980 mov a1, a3; _j 1f; .align 8
981 s32i a3, a2, PT_AREG2; _j 1f; .align 8
982 s32i a3, a2, PT_AREG3; _j 1f; .align 8
983 s32i a3, a2, PT_AREG4; _j 1f; .align 8
984 mov a5, a3; _j 1f; .align 8
985 mov a6, a3; _j 1f; .align 8
986 mov a7, a3; _j 1f; .align 8
987 mov a8, a3; _j 1f; .align 8
988 mov a9, a3; _j 1f; .align 8
989 mov a10, a3; _j 1f; .align 8
990 mov a11, a3; _j 1f; .align 8
991 mov a12, a3; _j 1f; .align 8
992 mov a13, a3; _j 1f; .align 8
993 mov a14, a3; _j 1f; .align 8
994 mov a15, a3; _j 1f; .align 8
995
9961: l32i a4, a2, PT_AREG4
997 l32i a3, a2, PT_AREG3
998 l32i a0, a2, PT_AREG0
999 l32i a2, a2, PT_AREG2
1000 rfe
1001
1002ENDPROC(fast_alloca) 878ENDPROC(fast_alloca)
1003 879
1004/* 880/*
@@ -1015,9 +891,9 @@ ENDPROC(fast_alloca)
1015 * a0: trashed, original value saved on stack (PT_AREG0) 891 * a0: trashed, original value saved on stack (PT_AREG0)
1016 * a1: a1 892 * a1: a1
1017 * a2: new stack pointer, original in DEPC 893 * a2: new stack pointer, original in DEPC
1018 * a3: dispatch table 894 * a3: a3
1019 * depc: a2, original value saved on stack (PT_DEPC) 895 * depc: a2, original value saved on stack (PT_DEPC)
1020 * excsave_1: a3 896 * excsave_1: dispatch table
1021 */ 897 */
1022 898
1023ENTRY(fast_syscall_kernel) 899ENTRY(fast_syscall_kernel)
@@ -1064,7 +940,6 @@ ENTRY(fast_syscall_unrecoverable)
1064 940
1065 l32i a0, a2, PT_AREG0 # restore a0 941 l32i a0, a2, PT_AREG0 # restore a0
1066 xsr a2, depc # restore a2, depc 942 xsr a2, depc # restore a2, depc
1067 rsr a3, excsave1
1068 943
1069 wsr a0, excsave1 944 wsr a0, excsave1
1070 movi a0, unrecoverable_exception 945 movi a0, unrecoverable_exception
@@ -1086,10 +961,10 @@ ENDPROC(fast_syscall_unrecoverable)
1086 * a0: a2 (syscall-nr), original value saved on stack (PT_AREG0) 961 * a0: a2 (syscall-nr), original value saved on stack (PT_AREG0)
1087 * a1: a1 962 * a1: a1
1088 * a2: new stack pointer, original in a0 and DEPC 963 * a2: new stack pointer, original in a0 and DEPC
1089 * a3: dispatch table, original in excsave_1 964 * a3: a3
1090 * a4..a15: unchanged 965 * a4..a15: unchanged
1091 * depc: a2, original value saved on stack (PT_DEPC) 966 * depc: a2, original value saved on stack (PT_DEPC)
1092 * excsave_1: a3 967 * excsave_1: dispatch table
1093 * 968 *
1094 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC 969 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC
1095 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception 970 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception
@@ -1122,8 +997,6 @@ ENDPROC(fast_syscall_unrecoverable)
1122 997
1123ENTRY(fast_syscall_xtensa) 998ENTRY(fast_syscall_xtensa)
1124 999
1125 xsr a3, excsave1 # restore a3, excsave1
1126
1127 s32i a7, a2, PT_AREG7 # we need an additional register 1000 s32i a7, a2, PT_AREG7 # we need an additional register
1128 movi a7, 4 # sizeof(unsigned int) 1001 movi a7, 4 # sizeof(unsigned int)
1129 access_ok a3, a7, a0, a2, .Leac # a0: scratch reg, a2: sp 1002 access_ok a3, a7, a0, a2, .Leac # a0: scratch reg, a2: sp
@@ -1186,9 +1059,9 @@ ENDPROC(fast_syscall_xtensa)
1186 * a0: trashed, original value saved on stack (PT_AREG0) 1059 * a0: trashed, original value saved on stack (PT_AREG0)
1187 * a1: a1 1060 * a1: a1
1188 * a2: new stack pointer, original in DEPC 1061 * a2: new stack pointer, original in DEPC
1189 * a3: dispatch table 1062 * a3: a3
1190 * depc: a2, original value saved on stack (PT_DEPC) 1063 * depc: a2, original value saved on stack (PT_DEPC)
1191 * excsave_1: a3 1064 * excsave_1: dispatch table
1192 * 1065 *
1193 * Note: We assume the stack pointer is EXC_TABLE_KSTK in the fixup handler. 1066 * Note: We assume the stack pointer is EXC_TABLE_KSTK in the fixup handler.
1194 */ 1067 */
@@ -1197,15 +1070,16 @@ ENTRY(fast_syscall_spill_registers)
1197 1070
1198 /* Register a FIXUP handler (pass current wb as a parameter) */ 1071 /* Register a FIXUP handler (pass current wb as a parameter) */
1199 1072
1073 xsr a3, excsave1
1200 movi a0, fast_syscall_spill_registers_fixup 1074 movi a0, fast_syscall_spill_registers_fixup
1201 s32i a0, a3, EXC_TABLE_FIXUP 1075 s32i a0, a3, EXC_TABLE_FIXUP
1202 rsr a0, windowbase 1076 rsr a0, windowbase
1203 s32i a0, a3, EXC_TABLE_PARAM 1077 s32i a0, a3, EXC_TABLE_PARAM
1078 xsr a3, excsave1 # restore a3 and excsave_1
1204 1079
1205 /* Save a3 and SAR on stack. */ 1080 /* Save a3, a4 and SAR on stack. */
1206 1081
1207 rsr a0, sar 1082 rsr a0, sar
1208 xsr a3, excsave1 # restore a3 and excsave_1
1209 s32i a3, a2, PT_AREG3 1083 s32i a3, a2, PT_AREG3
1210 s32i a4, a2, PT_AREG4 1084 s32i a4, a2, PT_AREG4
1211 s32i a0, a2, PT_AREG5 # store SAR to PT_AREG5 1085 s32i a0, a2, PT_AREG5 # store SAR to PT_AREG5
@@ -1259,14 +1133,14 @@ fast_syscall_spill_registers_fixup:
1259 * in WS, so that the exception handlers save them to the task stack. 1133 * in WS, so that the exception handlers save them to the task stack.
1260 */ 1134 */
1261 1135
1262 rsr a3, excsave1 # get spill-mask 1136 xsr a3, excsave1 # get spill-mask
1263 slli a2, a3, 1 # shift left by one 1137 slli a2, a3, 1 # shift left by one
1264 1138
1265 slli a3, a2, 32-WSBITS 1139 slli a3, a2, 32-WSBITS
1266 src a2, a2, a3 # a1 = xxwww1yyxxxwww1yy...... 1140 src a2, a2, a3 # a1 = xxwww1yyxxxwww1yy......
1267 wsr a2, windowstart # set corrected windowstart 1141 wsr a2, windowstart # set corrected windowstart
1268 1142
1269 movi a3, exc_table 1143 rsr a3, excsave1
1270 l32i a2, a3, EXC_TABLE_DOUBLE_SAVE # restore a2 1144 l32i a2, a3, EXC_TABLE_DOUBLE_SAVE # restore a2
1271 l32i a3, a3, EXC_TABLE_PARAM # original WB (in user task) 1145 l32i a3, a3, EXC_TABLE_PARAM # original WB (in user task)
1272 1146
@@ -1303,7 +1177,7 @@ fast_syscall_spill_registers_fixup:
1303 1177
1304 /* Jump to the exception handler. */ 1178 /* Jump to the exception handler. */
1305 1179
1306 movi a3, exc_table 1180 rsr a3, excsave1
1307 rsr a0, exccause 1181 rsr a0, exccause
1308 addx4 a0, a0, a3 # find entry in table 1182 addx4 a0, a0, a3 # find entry in table
1309 l32i a0, a0, EXC_TABLE_FAST_USER # load handler 1183 l32i a0, a0, EXC_TABLE_FAST_USER # load handler
@@ -1320,6 +1194,7 @@ fast_syscall_spill_registers_fixup_return:
1320 xsr a3, excsave1 1194 xsr a3, excsave1
1321 movi a2, fast_syscall_spill_registers_fixup 1195 movi a2, fast_syscall_spill_registers_fixup
1322 s32i a2, a3, EXC_TABLE_FIXUP 1196 s32i a2, a3, EXC_TABLE_FIXUP
1197 s32i a0, a3, EXC_TABLE_DOUBLE_SAVE
1323 rsr a2, windowbase 1198 rsr a2, windowbase
1324 s32i a2, a3, EXC_TABLE_PARAM 1199 s32i a2, a3, EXC_TABLE_PARAM
1325 l32i a2, a3, EXC_TABLE_KSTK 1200 l32i a2, a3, EXC_TABLE_KSTK
@@ -1331,11 +1206,6 @@ fast_syscall_spill_registers_fixup_return:
1331 wsr a3, windowbase 1206 wsr a3, windowbase
1332 rsync 1207 rsync
1333 1208
1334 /* Restore a3 and return. */
1335
1336 movi a3, exc_table
1337 xsr a3, excsave1
1338
1339 rfde 1209 rfde
1340 1210
1341 1211
@@ -1522,9 +1392,8 @@ ENTRY(_spill_registers)
1522 1392
1523 movi a0, 0 1393 movi a0, 0
1524 1394
1525 movi a3, exc_table 1395 rsr a3, excsave1
1526 l32i a1, a3, EXC_TABLE_KSTK 1396 l32i a1, a3, EXC_TABLE_KSTK
1527 wsr a3, excsave1
1528 1397
1529 movi a4, (1 << PS_WOE_BIT) | LOCKLEVEL 1398 movi a4, (1 << PS_WOE_BIT) | LOCKLEVEL
1530 wsr a4, ps 1399 wsr a4, ps
@@ -1568,9 +1437,9 @@ ENDPROC(fast_second_level_miss_double_kernel)
1568 * a0: trashed, original value saved on stack (PT_AREG0) 1437 * a0: trashed, original value saved on stack (PT_AREG0)
1569 * a1: a1 1438 * a1: a1
1570 * a2: new stack pointer, original in DEPC 1439 * a2: new stack pointer, original in DEPC
1571 * a3: dispatch table 1440 * a3: a3
1572 * depc: a2, original value saved on stack (PT_DEPC) 1441 * depc: a2, original value saved on stack (PT_DEPC)
1573 * excsave_1: a3 1442 * excsave_1: dispatch table
1574 * 1443 *
1575 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC 1444 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC
1576 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception 1445 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception
@@ -1578,9 +1447,10 @@ ENDPROC(fast_second_level_miss_double_kernel)
1578 1447
1579ENTRY(fast_second_level_miss) 1448ENTRY(fast_second_level_miss)
1580 1449
1581 /* Save a1. Note: we don't expect a double exception. */ 1450 /* Save a1 and a3. Note: we don't expect a double exception. */
1582 1451
1583 s32i a1, a2, PT_AREG1 1452 s32i a1, a2, PT_AREG1
1453 s32i a3, a2, PT_AREG3
1584 1454
1585 /* We need to map the page of PTEs for the user task. Find 1455 /* We need to map the page of PTEs for the user task. Find
1586 * the pointer to that page. Also, it's possible for tsk->mm 1456 * the pointer to that page. Also, it's possible for tsk->mm
@@ -1602,9 +1472,6 @@ ENTRY(fast_second_level_miss)
1602 l32i a0, a1, TASK_MM # tsk->mm 1472 l32i a0, a1, TASK_MM # tsk->mm
1603 beqz a0, 9f 1473 beqz a0, 9f
1604 1474
1605
1606 /* We deliberately destroy a3 that holds the exception table. */
1607
16088: rsr a3, excvaddr # fault address 14758: rsr a3, excvaddr # fault address
1609 _PGD_OFFSET(a0, a3, a1) 1476 _PGD_OFFSET(a0, a3, a1)
1610 l32i a0, a0, 0 # read pmdval 1477 l32i a0, a0, 0 # read pmdval
@@ -1655,7 +1522,7 @@ ENTRY(fast_second_level_miss)
1655 1522
1656 /* Exit critical section. */ 1523 /* Exit critical section. */
1657 1524
16584: movi a3, exc_table # restore a3 15254: rsr a3, excsave1
1659 movi a0, 0 1526 movi a0, 0
1660 s32i a0, a3, EXC_TABLE_FIXUP 1527 s32i a0, a3, EXC_TABLE_FIXUP
1661 1528
@@ -1663,8 +1530,8 @@ ENTRY(fast_second_level_miss)
1663 1530
1664 l32i a0, a2, PT_AREG0 1531 l32i a0, a2, PT_AREG0
1665 l32i a1, a2, PT_AREG1 1532 l32i a1, a2, PT_AREG1
1533 l32i a3, a2, PT_AREG3
1666 l32i a2, a2, PT_DEPC 1534 l32i a2, a2, PT_DEPC
1667 xsr a3, excsave1
1668 1535
1669 bgeui a2, VALID_DOUBLE_EXCEPTION_ADDRESS, 1f 1536 bgeui a2, VALID_DOUBLE_EXCEPTION_ADDRESS, 1f
1670 1537
@@ -1751,11 +1618,8 @@ ENTRY(fast_second_level_miss)
1751 1618
17522: /* Invalid PGD, default exception handling */ 16192: /* Invalid PGD, default exception handling */
1753 1620
1754 movi a3, exc_table
1755 rsr a1, depc 1621 rsr a1, depc
1756 xsr a3, excsave1
1757 s32i a1, a2, PT_AREG2 1622 s32i a1, a2, PT_AREG2
1758 s32i a3, a2, PT_AREG3
1759 mov a1, a2 1623 mov a1, a2
1760 1624
1761 rsr a2, ps 1625 rsr a2, ps
@@ -1775,9 +1639,9 @@ ENDPROC(fast_second_level_miss)
1775 * a0: trashed, original value saved on stack (PT_AREG0) 1639 * a0: trashed, original value saved on stack (PT_AREG0)
1776 * a1: a1 1640 * a1: a1
1777 * a2: new stack pointer, original in DEPC 1641 * a2: new stack pointer, original in DEPC
1778 * a3: dispatch table 1642 * a3: a3
1779 * depc: a2, original value saved on stack (PT_DEPC) 1643 * depc: a2, original value saved on stack (PT_DEPC)
1780 * excsave_1: a3 1644 * excsave_1: dispatch table
1781 * 1645 *
1782 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC 1646 * PT_DEPC >= VALID_DOUBLE_EXCEPTION_ADDRESS: double exception, DEPC
1783 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception 1647 * < VALID_DOUBLE_EXCEPTION_ADDRESS: regular exception
@@ -1785,17 +1649,17 @@ ENDPROC(fast_second_level_miss)
1785 1649
1786ENTRY(fast_store_prohibited) 1650ENTRY(fast_store_prohibited)
1787 1651
1788 /* Save a1 and a4. */ 1652 /* Save a1 and a3. */
1789 1653
1790 s32i a1, a2, PT_AREG1 1654 s32i a1, a2, PT_AREG1
1791 s32i a4, a2, PT_AREG4 1655 s32i a3, a2, PT_AREG3
1792 1656
1793 GET_CURRENT(a1,a2) 1657 GET_CURRENT(a1,a2)
1794 l32i a0, a1, TASK_MM # tsk->mm 1658 l32i a0, a1, TASK_MM # tsk->mm
1795 beqz a0, 9f 1659 beqz a0, 9f
1796 1660
17978: rsr a1, excvaddr # fault address 16618: rsr a1, excvaddr # fault address
1798 _PGD_OFFSET(a0, a1, a4) 1662 _PGD_OFFSET(a0, a1, a3)
1799 l32i a0, a0, 0 1663 l32i a0, a0, 0
1800 beqz a0, 2f 1664 beqz a0, 2f
1801 1665
@@ -1804,39 +1668,37 @@ ENTRY(fast_store_prohibited)
1804 * and is not PAGE_NONE. See pgtable.h for possible PTE layouts. 1668 * and is not PAGE_NONE. See pgtable.h for possible PTE layouts.
1805 */ 1669 */
1806 1670
1807 _PTE_OFFSET(a0, a1, a4) 1671 _PTE_OFFSET(a0, a1, a3)
1808 l32i a4, a0, 0 # read pteval 1672 l32i a3, a0, 0 # read pteval
1809 movi a1, _PAGE_CA_INVALID 1673 movi a1, _PAGE_CA_INVALID
1810 ball a4, a1, 2f 1674 ball a3, a1, 2f
1811 bbci.l a4, _PAGE_WRITABLE_BIT, 2f 1675 bbci.l a3, _PAGE_WRITABLE_BIT, 2f
1812 1676
1813 movi a1, _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_HW_WRITE 1677 movi a1, _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_HW_WRITE
1814 or a4, a4, a1 1678 or a3, a3, a1
1815 rsr a1, excvaddr 1679 rsr a1, excvaddr
1816 s32i a4, a0, 0 1680 s32i a3, a0, 0
1817 1681
1818 /* We need to flush the cache if we have page coloring. */ 1682 /* We need to flush the cache if we have page coloring. */
1819#if (DCACHE_WAY_SIZE > PAGE_SIZE) && XCHAL_DCACHE_IS_WRITEBACK 1683#if (DCACHE_WAY_SIZE > PAGE_SIZE) && XCHAL_DCACHE_IS_WRITEBACK
1820 dhwb a0, 0 1684 dhwb a0, 0
1821#endif 1685#endif
1822 pdtlb a0, a1 1686 pdtlb a0, a1
1823 wdtlb a4, a0 1687 wdtlb a3, a0
1824 1688
1825 /* Exit critical section. */ 1689 /* Exit critical section. */
1826 1690
1827 movi a0, 0 1691 movi a0, 0
1692 rsr a3, excsave1
1828 s32i a0, a3, EXC_TABLE_FIXUP 1693 s32i a0, a3, EXC_TABLE_FIXUP
1829 1694
1830 /* Restore the working registers, and return. */ 1695 /* Restore the working registers, and return. */
1831 1696
1832 l32i a4, a2, PT_AREG4 1697 l32i a3, a2, PT_AREG3
1833 l32i a1, a2, PT_AREG1 1698 l32i a1, a2, PT_AREG1
1834 l32i a0, a2, PT_AREG0 1699 l32i a0, a2, PT_AREG0
1835 l32i a2, a2, PT_DEPC 1700 l32i a2, a2, PT_DEPC
1836 1701
1837 /* Restore excsave1 and a3. */
1838
1839 xsr a3, excsave1
1840 bgeui a2, VALID_DOUBLE_EXCEPTION_ADDRESS, 1f 1702 bgeui a2, VALID_DOUBLE_EXCEPTION_ADDRESS, 1f
1841 1703
1842 rsr a2, depc 1704 rsr a2, depc
@@ -1853,11 +1715,8 @@ ENTRY(fast_store_prohibited)
1853 1715
18542: /* If there was a problem, handle fault in C */ 17162: /* If there was a problem, handle fault in C */
1855 1717
1856 rsr a4, depc # still holds a2 1718 rsr a3, depc # still holds a2
1857 xsr a3, excsave1 1719 s32i a3, a2, PT_AREG2
1858 s32i a4, a2, PT_AREG2
1859 s32i a3, a2, PT_AREG3
1860 l32i a4, a2, PT_AREG4
1861 mov a1, a2 1720 mov a1, a2
1862 1721
1863 rsr a2, ps 1722 rsr a2, ps
diff --git a/arch/xtensa/kernel/setup.c b/arch/xtensa/kernel/setup.c
index 42a8bba0b0ea..946fb8d06c8b 100644
--- a/arch/xtensa/kernel/setup.c
+++ b/arch/xtensa/kernel/setup.c
@@ -170,8 +170,7 @@ static int __init parse_tag_fdt(const bp_tag_t *tag)
170 170
171__tagtable(BP_TAG_FDT, parse_tag_fdt); 171__tagtable(BP_TAG_FDT, parse_tag_fdt);
172 172
173void __init early_init_dt_setup_initrd_arch(unsigned long start, 173void __init early_init_dt_setup_initrd_arch(u64 start, u64 end)
174 unsigned long end)
175{ 174{
176 initrd_start = (void *)__va(start); 175 initrd_start = (void *)__va(start);
177 initrd_end = (void *)__va(end); 176 initrd_end = (void *)__va(end);
@@ -585,8 +584,8 @@ c_show(struct seq_file *f, void *slot)
585 "bogomips\t: %lu.%02lu\n", 584 "bogomips\t: %lu.%02lu\n",
586 XCHAL_BUILD_UNIQUE_ID, 585 XCHAL_BUILD_UNIQUE_ID,
587 XCHAL_HAVE_BE ? "big" : "little", 586 XCHAL_HAVE_BE ? "big" : "little",
588 CCOUNT_PER_JIFFY/(1000000/HZ), 587 ccount_freq/1000000,
589 (CCOUNT_PER_JIFFY/(10000/HZ)) % 100, 588 (ccount_freq/10000) % 100,
590 loops_per_jiffy/(500000/HZ), 589 loops_per_jiffy/(500000/HZ),
591 (loops_per_jiffy/(5000/HZ)) % 100); 590 (loops_per_jiffy/(5000/HZ)) % 100);
592 591
diff --git a/arch/xtensa/kernel/time.c b/arch/xtensa/kernel/time.c
index 24bb0c1776ba..9af3dd88ad7e 100644
--- a/arch/xtensa/kernel/time.c
+++ b/arch/xtensa/kernel/time.c
@@ -29,9 +29,7 @@
29#include <asm/timex.h> 29#include <asm/timex.h>
30#include <asm/platform.h> 30#include <asm/platform.h>
31 31
32#ifdef CONFIG_XTENSA_CALIBRATE_CCOUNT
33unsigned long ccount_freq; /* ccount Hz */ 32unsigned long ccount_freq; /* ccount Hz */
34#endif
35 33
36static cycle_t ccount_read(struct clocksource *cs) 34static cycle_t ccount_read(struct clocksource *cs)
37{ 35{
@@ -129,8 +127,10 @@ void __init time_init(void)
129 platform_calibrate_ccount(); 127 platform_calibrate_ccount();
130 printk("%d.%02d MHz\n", (int)ccount_freq/1000000, 128 printk("%d.%02d MHz\n", (int)ccount_freq/1000000,
131 (int)(ccount_freq/10000)%100); 129 (int)(ccount_freq/10000)%100);
130#else
131 ccount_freq = CONFIG_XTENSA_CPU_CLOCK*1000000UL;
132#endif 132#endif
133 clocksource_register_hz(&ccount_clocksource, CCOUNT_PER_JIFFY * HZ); 133 clocksource_register_hz(&ccount_clocksource, ccount_freq);
134 134
135 ccount_timer.evt.cpumask = cpumask_of(0); 135 ccount_timer.evt.cpumask = cpumask_of(0);
136 ccount_timer.evt.irq = irq_create_mapping(NULL, LINUX_TIMER_INT); 136 ccount_timer.evt.irq = irq_create_mapping(NULL, LINUX_TIMER_INT);
@@ -164,7 +164,7 @@ irqreturn_t timer_interrupt (int irq, void *dev_id)
164#ifndef CONFIG_GENERIC_CALIBRATE_DELAY 164#ifndef CONFIG_GENERIC_CALIBRATE_DELAY
165void calibrate_delay(void) 165void calibrate_delay(void)
166{ 166{
167 loops_per_jiffy = CCOUNT_PER_JIFFY; 167 loops_per_jiffy = ccount_freq / HZ;
168 printk("Calibrating delay loop (skipped)... " 168 printk("Calibrating delay loop (skipped)... "
169 "%lu.%02lu BogoMIPS preset\n", 169 "%lu.%02lu BogoMIPS preset\n",
170 loops_per_jiffy/(1000000/HZ), 170 loops_per_jiffy/(1000000/HZ),
diff --git a/arch/xtensa/kernel/vectors.S b/arch/xtensa/kernel/vectors.S
index f9e175382aa9..cb8fd44caabc 100644
--- a/arch/xtensa/kernel/vectors.S
+++ b/arch/xtensa/kernel/vectors.S
@@ -78,6 +78,7 @@ ENTRY(_UserExceptionVector)
78 s32i a0, a2, PT_DEPC # mark it as a regular exception 78 s32i a0, a2, PT_DEPC # mark it as a regular exception
79 addx4 a0, a0, a3 # find entry in table 79 addx4 a0, a0, a3 # find entry in table
80 l32i a0, a0, EXC_TABLE_FAST_USER # load handler 80 l32i a0, a0, EXC_TABLE_FAST_USER # load handler
81 xsr a3, excsave1 # restore a3 and dispatch table
81 jx a0 82 jx a0
82 83
83ENDPROC(_UserExceptionVector) 84ENDPROC(_UserExceptionVector)
@@ -104,6 +105,7 @@ ENTRY(_KernelExceptionVector)
104 s32i a0, a2, PT_DEPC # mark it as a regular exception 105 s32i a0, a2, PT_DEPC # mark it as a regular exception
105 addx4 a0, a0, a3 # find entry in table 106 addx4 a0, a0, a3 # find entry in table
106 l32i a0, a0, EXC_TABLE_FAST_KERNEL # load handler address 107 l32i a0, a0, EXC_TABLE_FAST_KERNEL # load handler address
108 xsr a3, excsave1 # restore a3 and dispatch table
107 jx a0 109 jx a0
108 110
109ENDPROC(_KernelExceptionVector) 111ENDPROC(_KernelExceptionVector)
@@ -168,7 +170,7 @@ ENDPROC(_KernelExceptionVector)
168 * 170 *
169 * a0: DEPC 171 * a0: DEPC
170 * a1: a1 172 * a1: a1
171 * a2: trashed, original value in EXC_TABLE_DOUBLE_A2 173 * a2: trashed, original value in EXC_TABLE_DOUBLE_SAVE
172 * a3: exctable 174 * a3: exctable
173 * depc: a0 175 * depc: a0
174 * excsave_1: a3 176 * excsave_1: a3
@@ -204,47 +206,46 @@ ENDPROC(_KernelExceptionVector)
204 206
205 .section .DoubleExceptionVector.text, "ax" 207 .section .DoubleExceptionVector.text, "ax"
206 .begin literal_prefix .DoubleExceptionVector 208 .begin literal_prefix .DoubleExceptionVector
209 .globl _DoubleExceptionVector_WindowUnderflow
210 .globl _DoubleExceptionVector_WindowOverflow
207 211
208ENTRY(_DoubleExceptionVector) 212ENTRY(_DoubleExceptionVector)
209 213
210 /* Deliberately destroy excsave (don't assume it's value was valid). */ 214 xsr a3, excsave1
211 215 s32i a2, a3, EXC_TABLE_DOUBLE_SAVE
212 wsr a3, excsave1 # save a3
213 216
214 /* Check for kernel double exception (usually fatal). */ 217 /* Check for kernel double exception (usually fatal). */
215 218
216 rsr a3, ps 219 rsr a2, ps
217 _bbci.l a3, PS_UM_BIT, .Lksp 220 _bbci.l a2, PS_UM_BIT, .Lksp
218 221
219 /* Check if we are currently handling a window exception. */ 222 /* Check if we are currently handling a window exception. */
220 /* Note: We don't need to indicate that we enter a critical section. */ 223 /* Note: We don't need to indicate that we enter a critical section. */
221 224
222 xsr a0, depc # get DEPC, save a0 225 xsr a0, depc # get DEPC, save a0
223 226
224 movi a3, WINDOW_VECTORS_VADDR 227 movi a2, WINDOW_VECTORS_VADDR
225 _bltu a0, a3, .Lfixup 228 _bltu a0, a2, .Lfixup
226 addi a3, a3, WINDOW_VECTORS_SIZE 229 addi a2, a2, WINDOW_VECTORS_SIZE
227 _bgeu a0, a3, .Lfixup 230 _bgeu a0, a2, .Lfixup
228 231
229 /* Window overflow/underflow exception. Get stack pointer. */ 232 /* Window overflow/underflow exception. Get stack pointer. */
230 233
231 mov a3, a2 234 l32i a2, a3, EXC_TABLE_KSTK
232 /* This explicit literal and the following references to it are made
233 * in order to fit DoubleExceptionVector.literals into the available
234 * 16-byte gap before DoubleExceptionVector.text in the absence of
235 * link time relaxation. See kernel/vmlinux.lds.S
236 */
237 .literal .Lexc_table, exc_table
238 l32r a2, .Lexc_table
239 l32i a2, a2, EXC_TABLE_KSTK
240 235
241 /* Check for overflow/underflow exception, jump if overflow. */ 236 /* Check for overflow/underflow exception, jump if overflow. */
242 237
243 _bbci.l a0, 6, .Lovfl 238 _bbci.l a0, 6, _DoubleExceptionVector_WindowOverflow
244
245 /* a0: depc, a1: a1, a2: kstk, a3: a2, depc: a0, excsave: a3 */
246 239
247 /* Restart window underflow exception. 240 /*
241 * Restart window underflow exception.
242 * Currently:
243 * depc = orig a0,
244 * a0 = orig DEPC,
245 * a2 = new sp based on KSTK from exc_table
246 * a3 = excsave_1
247 * excsave_1 = orig a3
248 *
248 * We return to the instruction in user space that caused the window 249 * We return to the instruction in user space that caused the window
249 * underflow exception. Therefore, we change window base to the value 250 * underflow exception. Therefore, we change window base to the value
250 * before we entered the window underflow exception and prepare the 251 * before we entered the window underflow exception and prepare the
@@ -252,10 +253,11 @@ ENTRY(_DoubleExceptionVector)
252 * by changing depc (in a0). 253 * by changing depc (in a0).
253 * Note: We can trash the current window frame (a0...a3) and depc! 254 * Note: We can trash the current window frame (a0...a3) and depc!
254 */ 255 */
255 256_DoubleExceptionVector_WindowUnderflow:
257 xsr a3, excsave1
256 wsr a2, depc # save stack pointer temporarily 258 wsr a2, depc # save stack pointer temporarily
257 rsr a0, ps 259 rsr a0, ps
258 extui a0, a0, PS_OWB_SHIFT, 4 260 extui a0, a0, PS_OWB_SHIFT, PS_OWB_WIDTH
259 wsr a0, windowbase 261 wsr a0, windowbase
260 rsync 262 rsync
261 263
@@ -263,28 +265,57 @@ ENTRY(_DoubleExceptionVector)
263 265
264 xsr a2, depc # save a2 and get stack pointer 266 xsr a2, depc # save a2 and get stack pointer
265 s32i a0, a2, PT_AREG0 267 s32i a0, a2, PT_AREG0
266 268 xsr a3, excsave1
267 wsr a3, excsave1 # save a3
268 l32r a3, .Lexc_table
269
270 rsr a0, exccause 269 rsr a0, exccause
271 s32i a0, a2, PT_DEPC # mark it as a regular exception 270 s32i a0, a2, PT_DEPC # mark it as a regular exception
272 addx4 a0, a0, a3 271 addx4 a0, a0, a3
272 xsr a3, excsave1
273 l32i a0, a0, EXC_TABLE_FAST_USER 273 l32i a0, a0, EXC_TABLE_FAST_USER
274 jx a0 274 jx a0
275 275
276.Lfixup:/* Check for a fixup handler or if we were in a critical section. */ 276 /*
277 * We only allow the ITLB miss exception if we are in kernel space.
278 * All other exceptions are unexpected and thus unrecoverable!
279 */
280
281#ifdef CONFIG_MMU
282 .extern fast_second_level_miss_double_kernel
283
284.Lksp: /* a0: a0, a1: a1, a2: a2, a3: trashed, depc: depc, excsave: a3 */
285
286 rsr a3, exccause
287 beqi a3, EXCCAUSE_ITLB_MISS, 1f
288 addi a3, a3, -EXCCAUSE_DTLB_MISS
289 bnez a3, .Lunrecoverable
2901: movi a3, fast_second_level_miss_double_kernel
291 jx a3
292#else
293.equ .Lksp, .Lunrecoverable
294#endif
295
296 /* Critical! We can't handle this situation. PANIC! */
277 297
278 /* a0: depc, a1: a1, a2: a2, a3: trashed, depc: a0, excsave1: a3 */ 298 .extern unrecoverable_exception
279 299
280 l32r a3, .Lexc_table 300.Lunrecoverable_fixup:
281 s32i a2, a3, EXC_TABLE_DOUBLE_SAVE # temporary variable 301 l32i a2, a3, EXC_TABLE_DOUBLE_SAVE
302 xsr a0, depc
303
304.Lunrecoverable:
305 rsr a3, excsave1
306 wsr a0, excsave1
307 movi a0, unrecoverable_exception
308 callx0 a0
309
310.Lfixup:/* Check for a fixup handler or if we were in a critical section. */
311
312 /* a0: depc, a1: a1, a2: trash, a3: exctable, depc: a0, excsave1: a3 */
282 313
283 /* Enter critical section. */ 314 /* Enter critical section. */
284 315
285 l32i a2, a3, EXC_TABLE_FIXUP 316 l32i a2, a3, EXC_TABLE_FIXUP
286 s32i a3, a3, EXC_TABLE_FIXUP 317 s32i a3, a3, EXC_TABLE_FIXUP
287 beq a2, a3, .Lunrecoverable_fixup # critical! 318 beq a2, a3, .Lunrecoverable_fixup # critical section
288 beqz a2, .Ldflt # no handler was registered 319 beqz a2, .Ldflt # no handler was registered
289 320
290 /* a0: depc, a1: a1, a2: trash, a3: exctable, depc: a0, excsave: a3 */ 321 /* a0: depc, a1: a1, a2: trash, a3: exctable, depc: a0, excsave: a3 */
@@ -293,58 +324,145 @@ ENTRY(_DoubleExceptionVector)
293 324
294.Ldflt: /* Get stack pointer. */ 325.Ldflt: /* Get stack pointer. */
295 326
296 l32i a3, a3, EXC_TABLE_DOUBLE_SAVE 327 l32i a2, a3, EXC_TABLE_DOUBLE_SAVE
297 addi a2, a3, -PT_USER_SIZE 328 addi a2, a2, -PT_USER_SIZE
298
299.Lovfl: /* Jump to default handlers. */
300 329
301 /* a0: depc, a1: a1, a2: kstk, a3: a2, depc: a0, excsave: a3 */ 330 /* a0: depc, a1: a1, a2: kstk, a3: exctable, depc: a0, excsave: a3 */
302 331
303 xsr a3, depc
304 s32i a0, a2, PT_DEPC 332 s32i a0, a2, PT_DEPC
305 s32i a3, a2, PT_AREG0 333 l32i a0, a3, EXC_TABLE_DOUBLE_SAVE
334 xsr a0, depc
335 s32i a0, a2, PT_AREG0
306 336
307 /* a0: avail, a1: a1, a2: kstk, a3: avail, depc: a2, excsave: a3 */ 337 /* a0: avail, a1: a1, a2: kstk, a3: exctable, depc: a2, excsave: a3 */
308 338
309 l32r a3, .Lexc_table
310 rsr a0, exccause 339 rsr a0, exccause
311 addx4 a0, a0, a3 340 addx4 a0, a0, a3
341 xsr a3, excsave1
312 l32i a0, a0, EXC_TABLE_FAST_USER 342 l32i a0, a0, EXC_TABLE_FAST_USER
313 jx a0 343 jx a0
314 344
315 /* 345 /*
316 * We only allow the ITLB miss exception if we are in kernel space. 346 * Restart window OVERFLOW exception.
317 * All other exceptions are unexpected and thus unrecoverable! 347 * Currently:
348 * depc = orig a0,
349 * a0 = orig DEPC,
350 * a2 = new sp based on KSTK from exc_table
351 * a3 = EXCSAVE_1
352 * excsave_1 = orig a3
353 *
354 * We return to the instruction in user space that caused the window
355 * overflow exception. Therefore, we change window base to the value
356 * before we entered the window overflow exception and prepare the
357 * registers to return as if we were coming from a regular exception
358 * by changing DEPC (in a0).
359 *
360 * NOTE: We CANNOT trash the current window frame (a0...a3), but we
361 * can clobber depc.
362 *
363 * The tricky part here is that overflow8 and overflow12 handlers
364 * save a0, then clobber a0. To restart the handler, we have to restore
365 * a0 if the double exception was past the point where a0 was clobbered.
366 *
367 * To keep things simple, we take advantage of the fact all overflow
368 * handlers save a0 in their very first instruction. If DEPC was past
369 * that instruction, we can safely restore a0 from where it was saved
370 * on the stack.
371 *
372 * a0: depc, a1: a1, a2: kstk, a3: exc_table, depc: a0, excsave1: a3
318 */ 373 */
374_DoubleExceptionVector_WindowOverflow:
375 extui a2, a0, 0, 6 # get offset into 64-byte vector handler
376 beqz a2, 1f # if at start of vector, don't restore
319 377
320#ifdef CONFIG_MMU 378 addi a0, a0, -128
321 .extern fast_second_level_miss_double_kernel 379 bbsi a0, 8, 1f # don't restore except for overflow 8 and 12
380 bbsi a0, 7, 2f
322 381
323.Lksp: /* a0: a0, a1: a1, a2: a2, a3: trashed, depc: depc, excsave: a3 */ 382 /*
383 * Restore a0 as saved by _WindowOverflow8().
384 *
385 * FIXME: we really need a fixup handler for this L32E,
386 * for the extremely unlikely case where the overflow handler's
387 * reference thru a0 gets a hardware TLB refill that bumps out
388 * the (distinct, aliasing) TLB entry that mapped its prior
389 * references thru a9, and where our reference now thru a9
390 * gets a 2nd-level miss exception (not hardware TLB refill).
391 */
324 392
325 rsr a3, exccause 393 l32e a2, a9, -16
326 beqi a3, EXCCAUSE_ITLB_MISS, 1f 394 wsr a2, depc # replace the saved a0
327 addi a3, a3, -EXCCAUSE_DTLB_MISS 395 j 1f
328 bnez a3, .Lunrecoverable
3291: movi a3, fast_second_level_miss_double_kernel
330 jx a3
331#else
332.equ .Lksp, .Lunrecoverable
333#endif
334 396
335 /* Critical! We can't handle this situation. PANIC! */ 3972:
398 /*
399 * Restore a0 as saved by _WindowOverflow12().
400 *
401 * FIXME: we really need a fixup handler for this L32E,
402 * for the extremely unlikely case where the overflow handler's
403 * reference thru a0 gets a hardware TLB refill that bumps out
404 * the (distinct, aliasing) TLB entry that mapped its prior
405 * references thru a13, and where our reference now thru a13
406 * gets a 2nd-level miss exception (not hardware TLB refill).
407 */
336 408
337 .extern unrecoverable_exception 409 l32e a2, a13, -16
410 wsr a2, depc # replace the saved a0
4111:
412 /*
413 * Restore WindowBase while leaving all address registers restored.
414 * We have to use ROTW for this, because WSR.WINDOWBASE requires
415 * an address register (which would prevent restore).
416 *
417 * Window Base goes from 0 ... 7 (Module 8)
418 * Window Start is 8 bits; Ex: (0b1010 1010):0x55 from series of call4s
419 */
420
421 rsr a0, ps
422 extui a0, a0, PS_OWB_SHIFT, PS_OWB_WIDTH
423 rsr a2, windowbase
424 sub a0, a2, a0
425 extui a0, a0, 0, 3
338 426
339.Lunrecoverable_fixup:
340 l32i a2, a3, EXC_TABLE_DOUBLE_SAVE 427 l32i a2, a3, EXC_TABLE_DOUBLE_SAVE
341 xsr a0, depc 428 xsr a3, excsave1
429 beqi a0, 1, .L1pane
430 beqi a0, 3, .L3pane
342 431
343.Lunrecoverable: 432 rsr a0, depc
344 rsr a3, excsave1 433 rotw -2
345 wsr a0, excsave1 434
346 movi a0, unrecoverable_exception 435 /*
347 callx0 a0 436 * We are now in the user code's original window frame.
437 * Process the exception as a user exception as if it was
438 * taken by the user code.
439 *
440 * This is similar to the user exception vector,
441 * except that PT_DEPC isn't set to EXCCAUSE.
442 */
4431:
444 xsr a3, excsave1
445 wsr a2, depc
446 l32i a2, a3, EXC_TABLE_KSTK
447 s32i a0, a2, PT_AREG0
448 rsr a0, exccause
449
450 s32i a0, a2, PT_DEPC
451
452 addx4 a0, a0, a3
453 l32i a0, a0, EXC_TABLE_FAST_USER
454 xsr a3, excsave1
455 jx a0
456
457.L1pane:
458 rsr a0, depc
459 rotw -1
460 j 1b
461
462.L3pane:
463 rsr a0, depc
464 rotw -3
465 j 1b
348 466
349 .end literal_prefix 467 .end literal_prefix
350 468
diff --git a/arch/xtensa/kernel/xtensa_ksyms.c b/arch/xtensa/kernel/xtensa_ksyms.c
index d8507f812f46..74a60c7e085e 100644
--- a/arch/xtensa/kernel/xtensa_ksyms.c
+++ b/arch/xtensa/kernel/xtensa_ksyms.c
@@ -25,6 +25,7 @@
25#include <asm/io.h> 25#include <asm/io.h>
26#include <asm/page.h> 26#include <asm/page.h>
27#include <asm/pgalloc.h> 27#include <asm/pgalloc.h>
28#include <asm/ftrace.h>
28#ifdef CONFIG_BLK_DEV_FD 29#ifdef CONFIG_BLK_DEV_FD
29#include <asm/floppy.h> 30#include <asm/floppy.h>
30#endif 31#endif
diff --git a/arch/xtensa/mm/fault.c b/arch/xtensa/mm/fault.c
index 4b7bc8db170f..70fa7bc42b4a 100644
--- a/arch/xtensa/mm/fault.c
+++ b/arch/xtensa/mm/fault.c
@@ -72,6 +72,8 @@ void do_page_fault(struct pt_regs *regs)
72 address, exccause, regs->pc, is_write? "w":"", is_exec? "x":""); 72 address, exccause, regs->pc, is_write? "w":"", is_exec? "x":"");
73#endif 73#endif
74 74
75 if (user_mode(regs))
76 flags |= FAULT_FLAG_USER;
75retry: 77retry:
76 down_read(&mm->mmap_sem); 78 down_read(&mm->mmap_sem);
77 vma = find_vma(mm, address); 79 vma = find_vma(mm, address);